From 39fe23d0f0802afa2023091be0eb27a1f28a4323 Mon Sep 17 00:00:00 2001 From: rafa-rrayes Date: Sun, 26 Oct 2025 07:35:47 -0300 Subject: [PATCH 1/3] init --- browser-use/main.py | 21 + browser-use/tools.py | 13 + gemini-pc-use/main.py | 50 + gemini-pc-use/tools.py | 0 pyproject.toml | 3 + uv.lock | 4248 +++++++++++++++++++++++++++++++++++++++- 6 files changed, 4323 insertions(+), 12 deletions(-) create mode 100644 browser-use/main.py create mode 100644 browser-use/tools.py create mode 100644 gemini-pc-use/main.py create mode 100644 gemini-pc-use/tools.py diff --git a/browser-use/main.py b/browser-use/main.py new file mode 100644 index 0000000..b062c06 --- /dev/null +++ b/browser-use/main.py @@ -0,0 +1,21 @@ +from browser_use import Agent, Browser, ChatBrowserUse +import asyncio + +async def example(): + browser = Browser( + # use_cloud=True, # Uncomment to use a stealth browser on Browser Use Cloud + ) + + llm = ChatBrowserUse() + + agent = Agent( + task="Check Ben Eater's latest video, then check out Core Dumped's channel.", + llm=llm, + browser=browser, + ) + + history = await agent.run() + return history + +if __name__ == "__main__": + history = asyncio.run(example()) \ No newline at end of file diff --git a/browser-use/tools.py b/browser-use/tools.py new file mode 100644 index 0000000..42ac8a8 --- /dev/null +++ b/browser-use/tools.py @@ -0,0 +1,13 @@ +from browser_use.tools import Tool + +@Tool() +def custom_tool(param: str) -> str: + """Description of what this tool does.""" + return f"Result: {param}" + +agent = Agent( + task="Your task", + llm=llm, + browser=browser, + use_custom_tools=[custom_tool], +) \ No newline at end of file diff --git a/gemini-pc-use/main.py b/gemini-pc-use/main.py new file mode 100644 index 0000000..46f4a68 --- /dev/null +++ b/gemini-pc-use/main.py @@ -0,0 +1,50 @@ +from google import genai +from google.genai import types +from google.genai.types import Content, Part +from dotenv import load_dotenv +import os +load_dotenv() + + + +client = genai.Client(api_key=os.getenv("GEMINI_API_KEY")) + +# Specify predefined functions to exclude (optional) +excluded_functions = ["drag_and_drop"] + +generate_content_config = genai.types.GenerateContentConfig( + tools=[ + # 1. Computer Use tool with browser environment + types.Tool( + computer_use=types.ComputerUse( + environment=types.Environment.ENVIRONMENT_BROWSER, + # Optional: Exclude specific predefined functions + excluded_predefined_functions=excluded_functions + ) + ), + # 2. Optional: Custom user-defined functions + #types.Tool( + # function_declarations=custom_functions + # ) + ], + ) + +# Create the content with user message +contents=[ + Content( + role="user", + parts=[ + Part(text="Find the latest Ben Eater video and comment 'Great video!' on it." ), + ], + ) +] + +# Generate content with the configured settings +response = client.models.generate_content( + model='gemini-2.5-computer-use-preview-10-2025', + contents=contents, + config=generate_content_config, +) + +# Print the response output +print(response) \ No newline at end of file diff --git a/gemini-pc-use/tools.py b/gemini-pc-use/tools.py new file mode 100644 index 0000000..e69de29 diff --git a/pyproject.toml b/pyproject.toml index 4d24108..7963ddd 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -3,5 +3,8 @@ name = "hackathon-devsimpacto" version = "0.1.0" requires-python = ">=3.13" dependencies = [ + "browser-use>=0.9.1", + "google>=3.0.0", + "google-genai>=1.46.0", "requests>=2.32.5", ] diff --git a/uv.lock b/uv.lock index 5f545b1..614fbd6 100644 --- a/uv.lock +++ b/uv.lock @@ -1,7 +1,236 @@ version = 1 -revision = 3 +revision = 2 requires-python = ">=3.13" +[[package]] +name = "aiofiles" +version = "25.1.0" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/41/c3/534eac40372d8ee36ef40df62ec129bee4fdb5ad9706e58a29be53b2c970/aiofiles-25.1.0.tar.gz", hash = "sha256:a8d728f0a29de45dc521f18f07297428d56992a742f0cd2701ba86e44d23d5b2", size = 46354, upload-time = "2025-10-09T20:51:04.358Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/bc/8a/340a1555ae33d7354dbca4faa54948d76d89a27ceef032c8c3bc661d003e/aiofiles-25.1.0-py3-none-any.whl", hash = "sha256:abe311e527c862958650f9438e859c1fa7568a141b22abcd015e120e86a85695", size = 14668, upload-time = "2025-10-09T20:51:03.174Z" }, +] + +[[package]] +name = "aiohappyeyeballs" +version = "2.6.1" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/26/30/f84a107a9c4331c14b2b586036f40965c128aa4fee4dda5d3d51cb14ad54/aiohappyeyeballs-2.6.1.tar.gz", hash = "sha256:c3f9d0113123803ccadfdf3f0faa505bc78e6a72d1cc4806cbd719826e943558", size = 22760, upload-time = "2025-03-12T01:42:48.764Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/0f/15/5bf3b99495fb160b63f95972b81750f18f7f4e02ad051373b669d17d44f2/aiohappyeyeballs-2.6.1-py3-none-any.whl", hash = "sha256:f349ba8f4b75cb25c99c5c2d84e997e485204d2902a9597802b0371f09331fb8", size = 15265, upload-time = "2025-03-12T01:42:47.083Z" }, +] + +[[package]] +name = "aiohttp" +version = "3.12.15" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "aiohappyeyeballs" }, + { name = "aiosignal" }, + { name = "attrs" }, + { name = "frozenlist" }, + { name = "multidict" }, + { name = "propcache" }, + { name = "yarl" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/9b/e7/d92a237d8802ca88483906c388f7c201bbe96cd80a165ffd0ac2f6a8d59f/aiohttp-3.12.15.tar.gz", hash = "sha256:4fc61385e9c98d72fcdf47e6dd81833f47b2f77c114c29cd64a361be57a763a2", size = 7823716, upload-time = "2025-07-29T05:52:32.215Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/f2/33/918091abcf102e39d15aba2476ad9e7bd35ddb190dcdd43a854000d3da0d/aiohttp-3.12.15-cp313-cp313-macosx_10_13_universal2.whl", hash = "sha256:9f922ffd05034d439dde1c77a20461cf4a1b0831e6caa26151fe7aa8aaebc315", size = 696741, upload-time = "2025-07-29T05:51:19.021Z" }, + { url = "https://files.pythonhosted.org/packages/b5/2a/7495a81e39a998e400f3ecdd44a62107254803d1681d9189be5c2e4530cd/aiohttp-3.12.15-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:2ee8a8ac39ce45f3e55663891d4b1d15598c157b4d494a4613e704c8b43112cd", size = 474407, upload-time = "2025-07-29T05:51:21.165Z" }, + { url = "https://files.pythonhosted.org/packages/49/fc/a9576ab4be2dcbd0f73ee8675d16c707cfc12d5ee80ccf4015ba543480c9/aiohttp-3.12.15-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:3eae49032c29d356b94eee45a3f39fdf4b0814b397638c2f718e96cfadf4c4e4", size = 466703, upload-time = "2025-07-29T05:51:22.948Z" }, + { url = "https://files.pythonhosted.org/packages/09/2f/d4bcc8448cf536b2b54eed48f19682031ad182faa3a3fee54ebe5b156387/aiohttp-3.12.15-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:b97752ff12cc12f46a9b20327104448042fce5c33a624f88c18f66f9368091c7", size = 1705532, upload-time = "2025-07-29T05:51:25.211Z" }, + { url = "https://files.pythonhosted.org/packages/f1/f3/59406396083f8b489261e3c011aa8aee9df360a96ac8fa5c2e7e1b8f0466/aiohttp-3.12.15-cp313-cp313-manylinux_2_17_armv7l.manylinux2014_armv7l.manylinux_2_31_armv7l.whl", hash = "sha256:894261472691d6fe76ebb7fcf2e5870a2ac284c7406ddc95823c8598a1390f0d", size = 1686794, upload-time = "2025-07-29T05:51:27.145Z" }, + { url = "https://files.pythonhosted.org/packages/dc/71/164d194993a8d114ee5656c3b7ae9c12ceee7040d076bf7b32fb98a8c5c6/aiohttp-3.12.15-cp313-cp313-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:5fa5d9eb82ce98959fc1031c28198b431b4d9396894f385cb63f1e2f3f20ca6b", size = 1738865, upload-time = "2025-07-29T05:51:29.366Z" }, + { url = "https://files.pythonhosted.org/packages/1c/00/d198461b699188a93ead39cb458554d9f0f69879b95078dce416d3209b54/aiohttp-3.12.15-cp313-cp313-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:f0fa751efb11a541f57db59c1dd821bec09031e01452b2b6217319b3a1f34f3d", size = 1788238, upload-time = "2025-07-29T05:51:31.285Z" }, + { url = "https://files.pythonhosted.org/packages/85/b8/9e7175e1fa0ac8e56baa83bf3c214823ce250d0028955dfb23f43d5e61fd/aiohttp-3.12.15-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:5346b93e62ab51ee2a9d68e8f73c7cf96ffb73568a23e683f931e52450e4148d", size = 1710566, upload-time = "2025-07-29T05:51:33.219Z" }, + { url = "https://files.pythonhosted.org/packages/59/e4/16a8eac9df39b48ae102ec030fa9f726d3570732e46ba0c592aeeb507b93/aiohttp-3.12.15-cp313-cp313-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:049ec0360f939cd164ecbfd2873eaa432613d5e77d6b04535e3d1fbae5a9e645", size = 1624270, upload-time = "2025-07-29T05:51:35.195Z" }, + { url = "https://files.pythonhosted.org/packages/1f/f8/cd84dee7b6ace0740908fd0af170f9fab50c2a41ccbc3806aabcb1050141/aiohttp-3.12.15-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:b52dcf013b57464b6d1e51b627adfd69a8053e84b7103a7cd49c030f9ca44461", size = 1677294, upload-time = "2025-07-29T05:51:37.215Z" }, + { url = "https://files.pythonhosted.org/packages/ce/42/d0f1f85e50d401eccd12bf85c46ba84f947a84839c8a1c2c5f6e8ab1eb50/aiohttp-3.12.15-cp313-cp313-musllinux_1_2_armv7l.whl", hash = "sha256:9b2af240143dd2765e0fb661fd0361a1b469cab235039ea57663cda087250ea9", size = 1708958, upload-time = "2025-07-29T05:51:39.328Z" }, + { url = "https://files.pythonhosted.org/packages/d5/6b/f6fa6c5790fb602538483aa5a1b86fcbad66244997e5230d88f9412ef24c/aiohttp-3.12.15-cp313-cp313-musllinux_1_2_i686.whl", hash = "sha256:ac77f709a2cde2cc71257ab2d8c74dd157c67a0558a0d2799d5d571b4c63d44d", size = 1651553, upload-time = "2025-07-29T05:51:41.356Z" }, + { url = "https://files.pythonhosted.org/packages/04/36/a6d36ad545fa12e61d11d1932eef273928b0495e6a576eb2af04297fdd3c/aiohttp-3.12.15-cp313-cp313-musllinux_1_2_ppc64le.whl", hash = "sha256:47f6b962246f0a774fbd3b6b7be25d59b06fdb2f164cf2513097998fc6a29693", size = 1727688, upload-time = "2025-07-29T05:51:43.452Z" }, + { url = "https://files.pythonhosted.org/packages/aa/c8/f195e5e06608a97a4e52c5d41c7927301bf757a8e8bb5bbf8cef6c314961/aiohttp-3.12.15-cp313-cp313-musllinux_1_2_s390x.whl", hash = "sha256:760fb7db442f284996e39cf9915a94492e1896baac44f06ae551974907922b64", size = 1761157, upload-time = "2025-07-29T05:51:45.643Z" }, + { url = "https://files.pythonhosted.org/packages/05/6a/ea199e61b67f25ba688d3ce93f63b49b0a4e3b3d380f03971b4646412fc6/aiohttp-3.12.15-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:ad702e57dc385cae679c39d318def49aef754455f237499d5b99bea4ef582e51", size = 1710050, upload-time = "2025-07-29T05:51:48.203Z" }, + { url = "https://files.pythonhosted.org/packages/b4/2e/ffeb7f6256b33635c29dbed29a22a723ff2dd7401fff42ea60cf2060abfb/aiohttp-3.12.15-cp313-cp313-win32.whl", hash = "sha256:f813c3e9032331024de2eb2e32a88d86afb69291fbc37a3a3ae81cc9917fb3d0", size = 422647, upload-time = "2025-07-29T05:51:50.718Z" }, + { url = "https://files.pythonhosted.org/packages/1b/8e/78ee35774201f38d5e1ba079c9958f7629b1fd079459aea9467441dbfbf5/aiohttp-3.12.15-cp313-cp313-win_amd64.whl", hash = "sha256:1a649001580bdb37c6fdb1bebbd7e3bc688e8ec2b5c6f52edbb664662b17dc84", size = 449067, upload-time = "2025-07-29T05:51:52.549Z" }, +] + +[[package]] +name = "aiosignal" +version = "1.4.0" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "frozenlist" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/61/62/06741b579156360248d1ec624842ad0edf697050bbaf7c3e46394e106ad1/aiosignal-1.4.0.tar.gz", hash = "sha256:f47eecd9468083c2029cc99945502cb7708b082c232f9aca65da147157b251c7", size = 25007, upload-time = "2025-07-03T22:54:43.528Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/fb/76/641ae371508676492379f16e2fa48f4e2c11741bd63c48be4b12a6b09cba/aiosignal-1.4.0-py3-none-any.whl", hash = "sha256:053243f8b92b990551949e63930a839ff0cf0b0ebbe0597b0f3fb19e1a0fe82e", size = 7490, upload-time = "2025-07-03T22:54:42.156Z" }, +] + +[[package]] +name = "annotated-types" +version = "0.7.0" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/ee/67/531ea369ba64dcff5ec9c3402f9f51bf748cec26dde048a2f973a4eea7f5/annotated_types-0.7.0.tar.gz", hash = "sha256:aff07c09a53a08bc8cfccb9c85b05f1aa9a2a6f23728d790723543408344ce89", size = 16081, upload-time = "2024-05-20T21:33:25.928Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/78/b6/6307fbef88d9b5ee7421e68d78a9f162e0da4900bc5f5793f6d3d0e34fb8/annotated_types-0.7.0-py3-none-any.whl", hash = "sha256:1f02e8b43a8fbbc3f3e0d4f0f4bfc8131bcb4eebe8849b8e5c773f3a1c582a53", size = 13643, upload-time = "2024-05-20T21:33:24.1Z" }, +] + +[[package]] +name = "anthropic" +version = "0.71.0" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "anyio" }, + { name = "distro" }, + { name = "docstring-parser" }, + { name = "httpx" }, + { name = "jiter" }, + { name = "pydantic" }, + { name = "sniffio" }, + { name = "typing-extensions" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/82/4f/70682b068d897841f43223df82d96ec1d617435a8b759c4a2d901a50158b/anthropic-0.71.0.tar.gz", hash = "sha256:eb8e6fa86d049061b3ef26eb4cbae0174ebbff21affa6de7b3098da857d8de6a", size = 489102, upload-time = "2025-10-16T15:54:40.08Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/5d/77/073e8ac488f335aec7001952825275582fb8f433737e90f24eeef9d878f6/anthropic-0.71.0-py3-none-any.whl", hash = "sha256:85c5015fcdbdc728390f11b17642a65a4365d03b12b799b18b6cc57e71fdb327", size = 355035, upload-time = "2025-10-16T15:54:38.238Z" }, +] + +[[package]] +name = "anyio" +version = "4.11.0" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "idna" }, + { name = "sniffio" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/c6/78/7d432127c41b50bccba979505f272c16cbcadcc33645d5fa3a738110ae75/anyio-4.11.0.tar.gz", hash = "sha256:82a8d0b81e318cc5ce71a5f1f8b5c4e63619620b63141ef8c995fa0db95a57c4", size = 219094, upload-time = "2025-09-23T09:19:12.58Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/15/b3/9b1a8074496371342ec1e796a96f99c82c945a339cd81a8e73de28b4cf9e/anyio-4.11.0-py3-none-any.whl", hash = "sha256:0287e96f4d26d4149305414d4e3bc32f0dcd0862365a4bddea19d7a1ec38c4fc", size = 109097, upload-time = "2025-09-23T09:19:10.601Z" }, +] + +[[package]] +name = "attrs" +version = "25.4.0" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/6b/5c/685e6633917e101e5dcb62b9dd76946cbb57c26e133bae9e0cd36033c0a9/attrs-25.4.0.tar.gz", hash = "sha256:16d5969b87f0859ef33a48b35d55ac1be6e42ae49d5e853b597db70c35c57e11", size = 934251, upload-time = "2025-10-06T13:54:44.725Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/3a/2a/7cc015f5b9f5db42b7d48157e23356022889fc354a2813c15934b7cb5c0e/attrs-25.4.0-py3-none-any.whl", hash = "sha256:adcf7e2a1fb3b36ac48d97835bb6d8ade15b8dcce26aba8bf1d14847b57a3373", size = 67615, upload-time = "2025-10-06T13:54:43.17Z" }, +] + +[[package]] +name = "authlib" +version = "1.6.5" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "cryptography" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/cd/3f/1d3bbd0bf23bdd99276d4def22f29c27a914067b4cf66f753ff9b8bbd0f3/authlib-1.6.5.tar.gz", hash = "sha256:6aaf9c79b7cc96c900f0b284061691c5d4e61221640a948fe690b556a6d6d10b", size = 164553, upload-time = "2025-10-02T13:36:09.489Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/f8/aa/5082412d1ee302e9e7d80b6949bc4d2a8fa1149aaab610c5fc24709605d6/authlib-1.6.5-py2.py3-none-any.whl", hash = "sha256:3e0e0507807f842b02175507bdee8957a1d5707fd4afb17c32fb43fee90b6e3a", size = 243608, upload-time = "2025-10-02T13:36:07.637Z" }, +] + +[[package]] +name = "backoff" +version = "2.2.1" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/47/d7/5bbeb12c44d7c4f2fb5b56abce497eb5ed9f34d85701de869acedd602619/backoff-2.2.1.tar.gz", hash = "sha256:03f829f5bb1923180821643f8753b0502c3b682293992485b0eef2807afa5cba", size = 17001, upload-time = "2022-10-05T19:19:32.061Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/df/73/b6e24bd22e6720ca8ee9a85a0c4a2971af8497d8f3193fa05390cbd46e09/backoff-2.2.1-py3-none-any.whl", hash = "sha256:63579f9a0628e06278f7e47b7d7d5b6ce20dc65c5e96a6f3ca99a6adca0396e8", size = 15148, upload-time = "2022-10-05T19:19:30.546Z" }, +] + +[[package]] +name = "beautifulsoup4" +version = "4.14.2" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "soupsieve" }, + { name = "typing-extensions" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/77/e9/df2358efd7659577435e2177bfa69cba6c33216681af51a707193dec162a/beautifulsoup4-4.14.2.tar.gz", hash = "sha256:2a98ab9f944a11acee9cc848508ec28d9228abfd522ef0fad6a02a72e0ded69e", size = 625822, upload-time = "2025-09-29T10:05:42.613Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/94/fe/3aed5d0be4d404d12d36ab97e2f1791424d9ca39c2f754a6285d59a3b01d/beautifulsoup4-4.14.2-py3-none-any.whl", hash = "sha256:5ef6fa3a8cbece8488d66985560f97ed091e22bbc4e9c2338508a9d5de6d4515", size = 106392, upload-time = "2025-09-29T10:05:43.771Z" }, +] + +[[package]] +name = "browser-use" +version = "0.9.1" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "aiohttp" }, + { name = "anthropic" }, + { name = "anyio" }, + { name = "authlib" }, + { name = "bubus" }, + { name = "cdp-use" }, + { name = "google-api-core" }, + { name = "google-api-python-client" }, + { name = "google-auth" }, + { name = "google-auth-oauthlib" }, + { name = "google-genai" }, + { name = "groq" }, + { name = "httpx" }, + { name = "markdownify" }, + { name = "mcp" }, + { name = "ollama" }, + { name = "openai" }, + { name = "pillow" }, + { name = "portalocker" }, + { name = "posthog" }, + { name = "psutil" }, + { name = "pydantic" }, + { name = "pyobjc", marker = "platform_system == 'darwin'" }, + { name = "pyotp" }, + { name = "pypdf" }, + { name = "python-dotenv" }, + { name = "reportlab" }, + { name = "requests" }, + { name = "screeninfo", marker = "platform_system != 'darwin'" }, + { name = "typing-extensions" }, + { name = "uuid7" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/52/e4/7a878e36de58d84eef2d1c2cc2dcd67f15efc985d5cb66a0de2c56690b6a/browser_use-0.9.1.tar.gz", hash = "sha256:c1529cfe487e0dc627512eeab0554c4afa771cacf64632ddb484c63985c3bf50", size = 404187, upload-time = "2025-10-24T09:55:47.067Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/34/1a/1b4b8ff7cbc0a002515d5a2bc96ae827b2e481ccbacce147ef443b0ebeb0/browser_use-0.9.1-py3-none-any.whl", hash = "sha256:4700c40a4cf8397f33797ef1b980b13a86f1f1ca4eb66bbe2d58e5d212e7838a", size = 487156, upload-time = "2025-10-24T09:55:45.477Z" }, +] + +[[package]] +name = "bubus" +version = "1.5.6" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "aiofiles" }, + { name = "anyio" }, + { name = "portalocker" }, + { name = "pydantic" }, + { name = "typing-extensions" }, + { name = "uuid7" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/2d/85/aa72d1ffced7402fe41805519dab9935e9ce2bce18a10a55f2273ba8ba59/bubus-1.5.6.tar.gz", hash = "sha256:1a5456f0a576e86613a7bd66e819891b677778320b6e291094e339b0d9df2e0d", size = 60186, upload-time = "2025-08-30T18:20:43.032Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/f5/54/23aae0681500a459fc4498b60754cb8ead8df964d8166e5915edb7e8136c/bubus-1.5.6-py3-none-any.whl", hash = "sha256:254ae37cd9299941f5e9d6afb11f8e3ce069f83e5b9476f88c6b2e32912f237d", size = 52121, upload-time = "2025-08-30T18:20:42.091Z" }, +] + +[[package]] +name = "cachetools" +version = "6.2.1" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/cc/7e/b975b5814bd36faf009faebe22c1072a1fa1168db34d285ef0ba071ad78c/cachetools-6.2.1.tar.gz", hash = "sha256:3f391e4bd8f8bf0931169baf7456cc822705f4e2a31f840d218f445b9a854201", size = 31325, upload-time = "2025-10-12T14:55:30.139Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/96/c5/1e741d26306c42e2bf6ab740b2202872727e0f606033c9dd713f8b93f5a8/cachetools-6.2.1-py3-none-any.whl", hash = "sha256:09868944b6dde876dfd44e1d47e18484541eaf12f26f29b7af91b26cc892d701", size = 11280, upload-time = "2025-10-12T14:55:28.382Z" }, +] + +[[package]] +name = "cdp-use" +version = "1.4.3" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "httpx" }, + { name = "websockets" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/f7/8e/0e541215b7e068f9449a185c1dacf76376949870a1be9f5205a953e9d983/cdp_use-1.4.3.tar.gz", hash = "sha256:9029c04bdc49fbd3939d2bf1988ad8d88e260729c7d5e35c2f6c87591f5a10e9", size = 185671, upload-time = "2025-10-12T00:35:10.217Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/82/e5/654f2789d9db2ad433247c3d02e25a6905962b91dbcb955d88a5f4094935/cdp_use-1.4.3-py3-none-any.whl", hash = "sha256:c48664604470c2579aa1e677c3e3e7e24c4f300c54804c093d935abb50479ecd", size = 340786, upload-time = "2025-10-12T00:35:08.723Z" }, +] + [[package]] name = "certifi" version = "2025.10.5" @@ -11,6 +240,51 @@ wheels = [ { url = "https://files.pythonhosted.org/packages/e4/37/af0d2ef3967ac0d6113837b44a4f0bfe1328c2b9763bd5b1744520e5cfed/certifi-2025.10.5-py3-none-any.whl", hash = "sha256:0f212c2744a9bb6de0c56639a6f68afe01ecd92d91f14ae897c4fe7bbeeef0de", size = 163286, upload-time = "2025-10-05T04:12:14.03Z" }, ] +[[package]] +name = "cffi" +version = "2.0.0" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "pycparser", marker = "implementation_name != 'PyPy'" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/eb/56/b1ba7935a17738ae8453301356628e8147c79dbb825bcbc73dc7401f9846/cffi-2.0.0.tar.gz", hash = "sha256:44d1b5909021139fe36001ae048dbdde8214afa20200eda0f64c068cac5d5529", size = 523588, upload-time = "2025-09-08T23:24:04.541Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/4b/8d/a0a47a0c9e413a658623d014e91e74a50cdd2c423f7ccfd44086ef767f90/cffi-2.0.0-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:00bdf7acc5f795150faa6957054fbbca2439db2f775ce831222b66f192f03beb", size = 185230, upload-time = "2025-09-08T23:23:00.879Z" }, + { url = "https://files.pythonhosted.org/packages/4a/d2/a6c0296814556c68ee32009d9c2ad4f85f2707cdecfd7727951ec228005d/cffi-2.0.0-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:45d5e886156860dc35862657e1494b9bae8dfa63bf56796f2fb56e1679fc0bca", size = 181043, upload-time = "2025-09-08T23:23:02.231Z" }, + { url = "https://files.pythonhosted.org/packages/b0/1e/d22cc63332bd59b06481ceaac49d6c507598642e2230f201649058a7e704/cffi-2.0.0-cp313-cp313-manylinux1_i686.manylinux2014_i686.manylinux_2_17_i686.manylinux_2_5_i686.whl", hash = "sha256:07b271772c100085dd28b74fa0cd81c8fb1a3ba18b21e03d7c27f3436a10606b", size = 212446, upload-time = "2025-09-08T23:23:03.472Z" }, + { url = "https://files.pythonhosted.org/packages/a9/f5/a2c23eb03b61a0b8747f211eb716446c826ad66818ddc7810cc2cc19b3f2/cffi-2.0.0-cp313-cp313-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:d48a880098c96020b02d5a1f7d9251308510ce8858940e6fa99ece33f610838b", size = 220101, upload-time = "2025-09-08T23:23:04.792Z" }, + { url = "https://files.pythonhosted.org/packages/f2/7f/e6647792fc5850d634695bc0e6ab4111ae88e89981d35ac269956605feba/cffi-2.0.0-cp313-cp313-manylinux2014_ppc64le.manylinux_2_17_ppc64le.whl", hash = "sha256:f93fd8e5c8c0a4aa1f424d6173f14a892044054871c771f8566e4008eaa359d2", size = 207948, upload-time = "2025-09-08T23:23:06.127Z" }, + { url = "https://files.pythonhosted.org/packages/cb/1e/a5a1bd6f1fb30f22573f76533de12a00bf274abcdc55c8edab639078abb6/cffi-2.0.0-cp313-cp313-manylinux2014_s390x.manylinux_2_17_s390x.whl", hash = "sha256:dd4f05f54a52fb558f1ba9f528228066954fee3ebe629fc1660d874d040ae5a3", size = 206422, upload-time = "2025-09-08T23:23:07.753Z" }, + { url = "https://files.pythonhosted.org/packages/98/df/0a1755e750013a2081e863e7cd37e0cdd02664372c754e5560099eb7aa44/cffi-2.0.0-cp313-cp313-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:c8d3b5532fc71b7a77c09192b4a5a200ea992702734a2e9279a37f2478236f26", size = 219499, upload-time = "2025-09-08T23:23:09.648Z" }, + { url = "https://files.pythonhosted.org/packages/50/e1/a969e687fcf9ea58e6e2a928ad5e2dd88cc12f6f0ab477e9971f2309b57c/cffi-2.0.0-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:d9b29c1f0ae438d5ee9acb31cadee00a58c46cc9c0b2f9038c6b0b3470877a8c", size = 222928, upload-time = "2025-09-08T23:23:10.928Z" }, + { url = "https://files.pythonhosted.org/packages/36/54/0362578dd2c9e557a28ac77698ed67323ed5b9775ca9d3fe73fe191bb5d8/cffi-2.0.0-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:6d50360be4546678fc1b79ffe7a66265e28667840010348dd69a314145807a1b", size = 221302, upload-time = "2025-09-08T23:23:12.42Z" }, + { url = "https://files.pythonhosted.org/packages/eb/6d/bf9bda840d5f1dfdbf0feca87fbdb64a918a69bca42cfa0ba7b137c48cb8/cffi-2.0.0-cp313-cp313-win32.whl", hash = "sha256:74a03b9698e198d47562765773b4a8309919089150a0bb17d829ad7b44b60d27", size = 172909, upload-time = "2025-09-08T23:23:14.32Z" }, + { url = "https://files.pythonhosted.org/packages/37/18/6519e1ee6f5a1e579e04b9ddb6f1676c17368a7aba48299c3759bbc3c8b3/cffi-2.0.0-cp313-cp313-win_amd64.whl", hash = "sha256:19f705ada2530c1167abacb171925dd886168931e0a7b78f5bffcae5c6b5be75", size = 183402, upload-time = "2025-09-08T23:23:15.535Z" }, + { url = "https://files.pythonhosted.org/packages/cb/0e/02ceeec9a7d6ee63bb596121c2c8e9b3a9e150936f4fbef6ca1943e6137c/cffi-2.0.0-cp313-cp313-win_arm64.whl", hash = "sha256:256f80b80ca3853f90c21b23ee78cd008713787b1b1e93eae9f3d6a7134abd91", size = 177780, upload-time = "2025-09-08T23:23:16.761Z" }, + { url = "https://files.pythonhosted.org/packages/92/c4/3ce07396253a83250ee98564f8d7e9789fab8e58858f35d07a9a2c78de9f/cffi-2.0.0-cp314-cp314-macosx_10_13_x86_64.whl", hash = "sha256:fc33c5141b55ed366cfaad382df24fe7dcbc686de5be719b207bb248e3053dc5", size = 185320, upload-time = "2025-09-08T23:23:18.087Z" }, + { url = "https://files.pythonhosted.org/packages/59/dd/27e9fa567a23931c838c6b02d0764611c62290062a6d4e8ff7863daf9730/cffi-2.0.0-cp314-cp314-macosx_11_0_arm64.whl", hash = "sha256:c654de545946e0db659b3400168c9ad31b5d29593291482c43e3564effbcee13", size = 181487, upload-time = "2025-09-08T23:23:19.622Z" }, + { url = "https://files.pythonhosted.org/packages/d6/43/0e822876f87ea8a4ef95442c3d766a06a51fc5298823f884ef87aaad168c/cffi-2.0.0-cp314-cp314-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:24b6f81f1983e6df8db3adc38562c83f7d4a0c36162885ec7f7b77c7dcbec97b", size = 220049, upload-time = "2025-09-08T23:23:20.853Z" }, + { url = "https://files.pythonhosted.org/packages/b4/89/76799151d9c2d2d1ead63c2429da9ea9d7aac304603de0c6e8764e6e8e70/cffi-2.0.0-cp314-cp314-manylinux2014_ppc64le.manylinux_2_17_ppc64le.whl", hash = "sha256:12873ca6cb9b0f0d3a0da705d6086fe911591737a59f28b7936bdfed27c0d47c", size = 207793, upload-time = "2025-09-08T23:23:22.08Z" }, + { url = "https://files.pythonhosted.org/packages/bb/dd/3465b14bb9e24ee24cb88c9e3730f6de63111fffe513492bf8c808a3547e/cffi-2.0.0-cp314-cp314-manylinux2014_s390x.manylinux_2_17_s390x.whl", hash = "sha256:d9b97165e8aed9272a6bb17c01e3cc5871a594a446ebedc996e2397a1c1ea8ef", size = 206300, upload-time = "2025-09-08T23:23:23.314Z" }, + { url = "https://files.pythonhosted.org/packages/47/d9/d83e293854571c877a92da46fdec39158f8d7e68da75bf73581225d28e90/cffi-2.0.0-cp314-cp314-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:afb8db5439b81cf9c9d0c80404b60c3cc9c3add93e114dcae767f1477cb53775", size = 219244, upload-time = "2025-09-08T23:23:24.541Z" }, + { url = "https://files.pythonhosted.org/packages/2b/0f/1f177e3683aead2bb00f7679a16451d302c436b5cbf2505f0ea8146ef59e/cffi-2.0.0-cp314-cp314-musllinux_1_2_aarch64.whl", hash = "sha256:737fe7d37e1a1bffe70bd5754ea763a62a066dc5913ca57e957824b72a85e205", size = 222828, upload-time = "2025-09-08T23:23:26.143Z" }, + { url = "https://files.pythonhosted.org/packages/c6/0f/cafacebd4b040e3119dcb32fed8bdef8dfe94da653155f9d0b9dc660166e/cffi-2.0.0-cp314-cp314-musllinux_1_2_x86_64.whl", hash = "sha256:38100abb9d1b1435bc4cc340bb4489635dc2f0da7456590877030c9b3d40b0c1", size = 220926, upload-time = "2025-09-08T23:23:27.873Z" }, + { url = "https://files.pythonhosted.org/packages/3e/aa/df335faa45b395396fcbc03de2dfcab242cd61a9900e914fe682a59170b1/cffi-2.0.0-cp314-cp314-win32.whl", hash = "sha256:087067fa8953339c723661eda6b54bc98c5625757ea62e95eb4898ad5e776e9f", size = 175328, upload-time = "2025-09-08T23:23:44.61Z" }, + { url = "https://files.pythonhosted.org/packages/bb/92/882c2d30831744296ce713f0feb4c1cd30f346ef747b530b5318715cc367/cffi-2.0.0-cp314-cp314-win_amd64.whl", hash = "sha256:203a48d1fb583fc7d78a4c6655692963b860a417c0528492a6bc21f1aaefab25", size = 185650, upload-time = "2025-09-08T23:23:45.848Z" }, + { url = "https://files.pythonhosted.org/packages/9f/2c/98ece204b9d35a7366b5b2c6539c350313ca13932143e79dc133ba757104/cffi-2.0.0-cp314-cp314-win_arm64.whl", hash = "sha256:dbd5c7a25a7cb98f5ca55d258b103a2054f859a46ae11aaf23134f9cc0d356ad", size = 180687, upload-time = "2025-09-08T23:23:47.105Z" }, + { url = "https://files.pythonhosted.org/packages/3e/61/c768e4d548bfa607abcda77423448df8c471f25dbe64fb2ef6d555eae006/cffi-2.0.0-cp314-cp314t-macosx_10_13_x86_64.whl", hash = "sha256:9a67fc9e8eb39039280526379fb3a70023d77caec1852002b4da7e8b270c4dd9", size = 188773, upload-time = "2025-09-08T23:23:29.347Z" }, + { url = "https://files.pythonhosted.org/packages/2c/ea/5f76bce7cf6fcd0ab1a1058b5af899bfbef198bea4d5686da88471ea0336/cffi-2.0.0-cp314-cp314t-macosx_11_0_arm64.whl", hash = "sha256:7a66c7204d8869299919db4d5069a82f1561581af12b11b3c9f48c584eb8743d", size = 185013, upload-time = "2025-09-08T23:23:30.63Z" }, + { url = "https://files.pythonhosted.org/packages/be/b4/c56878d0d1755cf9caa54ba71e5d049479c52f9e4afc230f06822162ab2f/cffi-2.0.0-cp314-cp314t-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:7cc09976e8b56f8cebd752f7113ad07752461f48a58cbba644139015ac24954c", size = 221593, upload-time = "2025-09-08T23:23:31.91Z" }, + { url = "https://files.pythonhosted.org/packages/e0/0d/eb704606dfe8033e7128df5e90fee946bbcb64a04fcdaa97321309004000/cffi-2.0.0-cp314-cp314t-manylinux2014_ppc64le.manylinux_2_17_ppc64le.whl", hash = "sha256:92b68146a71df78564e4ef48af17551a5ddd142e5190cdf2c5624d0c3ff5b2e8", size = 209354, upload-time = "2025-09-08T23:23:33.214Z" }, + { url = "https://files.pythonhosted.org/packages/d8/19/3c435d727b368ca475fb8742ab97c9cb13a0de600ce86f62eab7fa3eea60/cffi-2.0.0-cp314-cp314t-manylinux2014_s390x.manylinux_2_17_s390x.whl", hash = "sha256:b1e74d11748e7e98e2f426ab176d4ed720a64412b6a15054378afdb71e0f37dc", size = 208480, upload-time = "2025-09-08T23:23:34.495Z" }, + { url = "https://files.pythonhosted.org/packages/d0/44/681604464ed9541673e486521497406fadcc15b5217c3e326b061696899a/cffi-2.0.0-cp314-cp314t-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:28a3a209b96630bca57cce802da70c266eb08c6e97e5afd61a75611ee6c64592", size = 221584, upload-time = "2025-09-08T23:23:36.096Z" }, + { url = "https://files.pythonhosted.org/packages/25/8e/342a504ff018a2825d395d44d63a767dd8ebc927ebda557fecdaca3ac33a/cffi-2.0.0-cp314-cp314t-musllinux_1_2_aarch64.whl", hash = "sha256:7553fb2090d71822f02c629afe6042c299edf91ba1bf94951165613553984512", size = 224443, upload-time = "2025-09-08T23:23:37.328Z" }, + { url = "https://files.pythonhosted.org/packages/e1/5e/b666bacbbc60fbf415ba9988324a132c9a7a0448a9a8f125074671c0f2c3/cffi-2.0.0-cp314-cp314t-musllinux_1_2_x86_64.whl", hash = "sha256:6c6c373cfc5c83a975506110d17457138c8c63016b563cc9ed6e056a82f13ce4", size = 223437, upload-time = "2025-09-08T23:23:38.945Z" }, + { url = "https://files.pythonhosted.org/packages/a0/1d/ec1a60bd1a10daa292d3cd6bb0b359a81607154fb8165f3ec95fe003b85c/cffi-2.0.0-cp314-cp314t-win32.whl", hash = "sha256:1fc9ea04857caf665289b7a75923f2c6ed559b8298a1b8c49e59f7dd95c8481e", size = 180487, upload-time = "2025-09-08T23:23:40.423Z" }, + { url = "https://files.pythonhosted.org/packages/bf/41/4c1168c74fac325c0c8156f04b6749c8b6a8f405bbf91413ba088359f60d/cffi-2.0.0-cp314-cp314t-win_amd64.whl", hash = "sha256:d68b6cef7827e8641e8ef16f4494edda8b36104d79773a334beaa1e3521430f6", size = 191726, upload-time = "2025-09-08T23:23:41.742Z" }, + { url = "https://files.pythonhosted.org/packages/ae/3a/dbeec9d1ee0844c679f6bb5d6ad4e9f198b1224f4e7a32825f47f6192b0c/cffi-2.0.0-cp314-cp314t-win_arm64.whl", hash = "sha256:0a1527a803f0a659de1af2e1fd700213caba79377e27e4693648c2923da066f9", size = 184195, upload-time = "2025-09-08T23:23:43.004Z" }, +] + [[package]] name = "charset-normalizer" version = "3.4.4" @@ -52,16 +326,395 @@ wheels = [ { url = "https://files.pythonhosted.org/packages/0a/4c/925909008ed5a988ccbb72dcc897407e5d6d3bd72410d69e051fc0c14647/charset_normalizer-3.4.4-py3-none-any.whl", hash = "sha256:7a32c560861a02ff789ad905a2fe94e3f840803362c84fecf1851cb4cf3dc37f", size = 53402, upload-time = "2025-10-14T04:42:31.76Z" }, ] +[[package]] +name = "click" +version = "8.3.0" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "colorama", marker = "sys_platform == 'win32'" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/46/61/de6cd827efad202d7057d93e0fed9294b96952e188f7384832791c7b2254/click-8.3.0.tar.gz", hash = "sha256:e7b8232224eba16f4ebe410c25ced9f7875cb5f3263ffc93cc3e8da705e229c4", size = 276943, upload-time = "2025-09-18T17:32:23.696Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/db/d3/9dcc0f5797f070ec8edf30fbadfb200e71d9db6b84d211e3b2085a7589a0/click-8.3.0-py3-none-any.whl", hash = "sha256:9b9f285302c6e3064f4330c05f05b81945b2a39544279343e6e7c5f27a9baddc", size = 107295, upload-time = "2025-09-18T17:32:22.42Z" }, +] + +[[package]] +name = "colorama" +version = "0.4.6" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/d8/53/6f443c9a4a8358a93a6792e2acffb9d9d5cb0a5cfd8802644b7b1c9a02e4/colorama-0.4.6.tar.gz", hash = "sha256:08695f5cb7ed6e0531a20572697297273c47b8cae5a63ffc6d6ed5c201be6e44", size = 27697, upload-time = "2022-10-25T02:36:22.414Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/d1/d6/3965ed04c63042e047cb6a3e6ed1a63a35087b6a609aa3a15ed8ac56c221/colorama-0.4.6-py2.py3-none-any.whl", hash = "sha256:4f1d9991f5acc0ca119f9d443620b77f9d6b33703e51011c16baf57afb285fc6", size = 25335, upload-time = "2022-10-25T02:36:20.889Z" }, +] + +[[package]] +name = "cryptography" +version = "46.0.3" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "cffi", marker = "platform_python_implementation != 'PyPy'" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/9f/33/c00162f49c0e2fe8064a62cb92b93e50c74a72bc370ab92f86112b33ff62/cryptography-46.0.3.tar.gz", hash = "sha256:a8b17438104fed022ce745b362294d9ce35b4c2e45c1d958ad4a4b019285f4a1", size = 749258, upload-time = "2025-10-15T23:18:31.74Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/1d/42/9c391dd801d6cf0d561b5890549d4b27bafcc53b39c31a817e69d87c625b/cryptography-46.0.3-cp311-abi3-macosx_10_9_universal2.whl", hash = "sha256:109d4ddfadf17e8e7779c39f9b18111a09efb969a301a31e987416a0191ed93a", size = 7225004, upload-time = "2025-10-15T23:16:52.239Z" }, + { url = "https://files.pythonhosted.org/packages/1c/67/38769ca6b65f07461eb200e85fc1639b438bdc667be02cf7f2cd6a64601c/cryptography-46.0.3-cp311-abi3-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:09859af8466b69bc3c27bdf4f5d84a665e0f7ab5088412e9e2ec49758eca5cbc", size = 4296667, upload-time = "2025-10-15T23:16:54.369Z" }, + { url = "https://files.pythonhosted.org/packages/5c/49/498c86566a1d80e978b42f0d702795f69887005548c041636df6ae1ca64c/cryptography-46.0.3-cp311-abi3-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:01ca9ff2885f3acc98c29f1860552e37f6d7c7d013d7334ff2a9de43a449315d", size = 4450807, upload-time = "2025-10-15T23:16:56.414Z" }, + { url = "https://files.pythonhosted.org/packages/4b/0a/863a3604112174c8624a2ac3c038662d9e59970c7f926acdcfaed8d61142/cryptography-46.0.3-cp311-abi3-manylinux_2_28_aarch64.whl", hash = "sha256:6eae65d4c3d33da080cff9c4ab1f711b15c1d9760809dad6ea763f3812d254cb", size = 4299615, upload-time = "2025-10-15T23:16:58.442Z" }, + { url = "https://files.pythonhosted.org/packages/64/02/b73a533f6b64a69f3cd3872acb6ebc12aef924d8d103133bb3ea750dc703/cryptography-46.0.3-cp311-abi3-manylinux_2_28_armv7l.manylinux_2_31_armv7l.whl", hash = "sha256:e5bf0ed4490068a2e72ac03d786693adeb909981cc596425d09032d372bcc849", size = 4016800, upload-time = "2025-10-15T23:17:00.378Z" }, + { url = "https://files.pythonhosted.org/packages/25/d5/16e41afbfa450cde85a3b7ec599bebefaef16b5c6ba4ec49a3532336ed72/cryptography-46.0.3-cp311-abi3-manylinux_2_28_ppc64le.whl", hash = "sha256:5ecfccd2329e37e9b7112a888e76d9feca2347f12f37918facbb893d7bb88ee8", size = 4984707, upload-time = "2025-10-15T23:17:01.98Z" }, + { url = "https://files.pythonhosted.org/packages/c9/56/e7e69b427c3878352c2fb9b450bd0e19ed552753491d39d7d0a2f5226d41/cryptography-46.0.3-cp311-abi3-manylinux_2_28_x86_64.whl", hash = "sha256:a2c0cd47381a3229c403062f764160d57d4d175e022c1df84e168c6251a22eec", size = 4482541, upload-time = "2025-10-15T23:17:04.078Z" }, + { url = "https://files.pythonhosted.org/packages/78/f6/50736d40d97e8483172f1bb6e698895b92a223dba513b0ca6f06b2365339/cryptography-46.0.3-cp311-abi3-manylinux_2_34_aarch64.whl", hash = "sha256:549e234ff32571b1f4076ac269fcce7a808d3bf98b76c8dd560e42dbc66d7d91", size = 4299464, upload-time = "2025-10-15T23:17:05.483Z" }, + { url = "https://files.pythonhosted.org/packages/00/de/d8e26b1a855f19d9994a19c702fa2e93b0456beccbcfe437eda00e0701f2/cryptography-46.0.3-cp311-abi3-manylinux_2_34_ppc64le.whl", hash = "sha256:c0a7bb1a68a5d3471880e264621346c48665b3bf1c3759d682fc0864c540bd9e", size = 4950838, upload-time = "2025-10-15T23:17:07.425Z" }, + { url = "https://files.pythonhosted.org/packages/8f/29/798fc4ec461a1c9e9f735f2fc58741b0daae30688f41b2497dcbc9ed1355/cryptography-46.0.3-cp311-abi3-manylinux_2_34_x86_64.whl", hash = "sha256:10b01676fc208c3e6feeb25a8b83d81767e8059e1fe86e1dc62d10a3018fa926", size = 4481596, upload-time = "2025-10-15T23:17:09.343Z" }, + { url = "https://files.pythonhosted.org/packages/15/8d/03cd48b20a573adfff7652b76271078e3045b9f49387920e7f1f631d125e/cryptography-46.0.3-cp311-abi3-musllinux_1_2_aarch64.whl", hash = "sha256:0abf1ffd6e57c67e92af68330d05760b7b7efb243aab8377e583284dbab72c71", size = 4426782, upload-time = "2025-10-15T23:17:11.22Z" }, + { url = "https://files.pythonhosted.org/packages/fa/b1/ebacbfe53317d55cf33165bda24c86523497a6881f339f9aae5c2e13e57b/cryptography-46.0.3-cp311-abi3-musllinux_1_2_x86_64.whl", hash = "sha256:a04bee9ab6a4da801eb9b51f1b708a1b5b5c9eb48c03f74198464c66f0d344ac", size = 4698381, upload-time = "2025-10-15T23:17:12.829Z" }, + { url = "https://files.pythonhosted.org/packages/96/92/8a6a9525893325fc057a01f654d7efc2c64b9de90413adcf605a85744ff4/cryptography-46.0.3-cp311-abi3-win32.whl", hash = "sha256:f260d0d41e9b4da1ed1e0f1ce571f97fe370b152ab18778e9e8f67d6af432018", size = 3055988, upload-time = "2025-10-15T23:17:14.65Z" }, + { url = "https://files.pythonhosted.org/packages/7e/bf/80fbf45253ea585a1e492a6a17efcb93467701fa79e71550a430c5e60df0/cryptography-46.0.3-cp311-abi3-win_amd64.whl", hash = "sha256:a9a3008438615669153eb86b26b61e09993921ebdd75385ddd748702c5adfddb", size = 3514451, upload-time = "2025-10-15T23:17:16.142Z" }, + { url = "https://files.pythonhosted.org/packages/2e/af/9b302da4c87b0beb9db4e756386a7c6c5b8003cd0e742277888d352ae91d/cryptography-46.0.3-cp311-abi3-win_arm64.whl", hash = "sha256:5d7f93296ee28f68447397bf5198428c9aeeab45705a55d53a6343455dcb2c3c", size = 2928007, upload-time = "2025-10-15T23:17:18.04Z" }, + { url = "https://files.pythonhosted.org/packages/f5/e2/a510aa736755bffa9d2f75029c229111a1d02f8ecd5de03078f4c18d91a3/cryptography-46.0.3-cp314-cp314t-macosx_10_9_universal2.whl", hash = "sha256:00a5e7e87938e5ff9ff5447ab086a5706a957137e6e433841e9d24f38a065217", size = 7158012, upload-time = "2025-10-15T23:17:19.982Z" }, + { url = "https://files.pythonhosted.org/packages/73/dc/9aa866fbdbb95b02e7f9d086f1fccfeebf8953509b87e3f28fff927ff8a0/cryptography-46.0.3-cp314-cp314t-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:c8daeb2d2174beb4575b77482320303f3d39b8e81153da4f0fb08eb5fe86a6c5", size = 4288728, upload-time = "2025-10-15T23:17:21.527Z" }, + { url = "https://files.pythonhosted.org/packages/c5/fd/bc1daf8230eaa075184cbbf5f8cd00ba9db4fd32d63fb83da4671b72ed8a/cryptography-46.0.3-cp314-cp314t-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:39b6755623145ad5eff1dab323f4eae2a32a77a7abef2c5089a04a3d04366715", size = 4435078, upload-time = "2025-10-15T23:17:23.042Z" }, + { url = "https://files.pythonhosted.org/packages/82/98/d3bd5407ce4c60017f8ff9e63ffee4200ab3e23fe05b765cab805a7db008/cryptography-46.0.3-cp314-cp314t-manylinux_2_28_aarch64.whl", hash = "sha256:db391fa7c66df6762ee3f00c95a89e6d428f4d60e7abc8328f4fe155b5ac6e54", size = 4293460, upload-time = "2025-10-15T23:17:24.885Z" }, + { url = "https://files.pythonhosted.org/packages/26/e9/e23e7900983c2b8af7a08098db406cf989d7f09caea7897e347598d4cd5b/cryptography-46.0.3-cp314-cp314t-manylinux_2_28_armv7l.manylinux_2_31_armv7l.whl", hash = "sha256:78a97cf6a8839a48c49271cdcbd5cf37ca2c1d6b7fdd86cc864f302b5e9bf459", size = 3995237, upload-time = "2025-10-15T23:17:26.449Z" }, + { url = "https://files.pythonhosted.org/packages/91/15/af68c509d4a138cfe299d0d7ddb14afba15233223ebd933b4bbdbc7155d3/cryptography-46.0.3-cp314-cp314t-manylinux_2_28_ppc64le.whl", hash = "sha256:dfb781ff7eaa91a6f7fd41776ec37c5853c795d3b358d4896fdbb5df168af422", size = 4967344, upload-time = "2025-10-15T23:17:28.06Z" }, + { url = "https://files.pythonhosted.org/packages/ca/e3/8643d077c53868b681af077edf6b3cb58288b5423610f21c62aadcbe99f4/cryptography-46.0.3-cp314-cp314t-manylinux_2_28_x86_64.whl", hash = "sha256:6f61efb26e76c45c4a227835ddeae96d83624fb0d29eb5df5b96e14ed1a0afb7", size = 4466564, upload-time = "2025-10-15T23:17:29.665Z" }, + { url = "https://files.pythonhosted.org/packages/0e/43/c1e8726fa59c236ff477ff2b5dc071e54b21e5a1e51aa2cee1676f1c986f/cryptography-46.0.3-cp314-cp314t-manylinux_2_34_aarch64.whl", hash = "sha256:23b1a8f26e43f47ceb6d6a43115f33a5a37d57df4ea0ca295b780ae8546e8044", size = 4292415, upload-time = "2025-10-15T23:17:31.686Z" }, + { url = "https://files.pythonhosted.org/packages/42/f9/2f8fefdb1aee8a8e3256a0568cffc4e6d517b256a2fe97a029b3f1b9fe7e/cryptography-46.0.3-cp314-cp314t-manylinux_2_34_ppc64le.whl", hash = "sha256:b419ae593c86b87014b9be7396b385491ad7f320bde96826d0dd174459e54665", size = 4931457, upload-time = "2025-10-15T23:17:33.478Z" }, + { url = "https://files.pythonhosted.org/packages/79/30/9b54127a9a778ccd6d27c3da7563e9f2d341826075ceab89ae3b41bf5be2/cryptography-46.0.3-cp314-cp314t-manylinux_2_34_x86_64.whl", hash = "sha256:50fc3343ac490c6b08c0cf0d704e881d0d660be923fd3076db3e932007e726e3", size = 4466074, upload-time = "2025-10-15T23:17:35.158Z" }, + { url = "https://files.pythonhosted.org/packages/ac/68/b4f4a10928e26c941b1b6a179143af9f4d27d88fe84a6a3c53592d2e76bf/cryptography-46.0.3-cp314-cp314t-musllinux_1_2_aarch64.whl", hash = "sha256:22d7e97932f511d6b0b04f2bfd818d73dcd5928db509460aaf48384778eb6d20", size = 4420569, upload-time = "2025-10-15T23:17:37.188Z" }, + { url = "https://files.pythonhosted.org/packages/a3/49/3746dab4c0d1979888f125226357d3262a6dd40e114ac29e3d2abdf1ec55/cryptography-46.0.3-cp314-cp314t-musllinux_1_2_x86_64.whl", hash = "sha256:d55f3dffadd674514ad19451161118fd010988540cee43d8bc20675e775925de", size = 4681941, upload-time = "2025-10-15T23:17:39.236Z" }, + { url = "https://files.pythonhosted.org/packages/fd/30/27654c1dbaf7e4a3531fa1fc77986d04aefa4d6d78259a62c9dc13d7ad36/cryptography-46.0.3-cp314-cp314t-win32.whl", hash = "sha256:8a6e050cb6164d3f830453754094c086ff2d0b2f3a897a1d9820f6139a1f0914", size = 3022339, upload-time = "2025-10-15T23:17:40.888Z" }, + { url = "https://files.pythonhosted.org/packages/f6/30/640f34ccd4d2a1bc88367b54b926b781b5a018d65f404d409aba76a84b1c/cryptography-46.0.3-cp314-cp314t-win_amd64.whl", hash = "sha256:760f83faa07f8b64e9c33fc963d790a2edb24efb479e3520c14a45741cd9b2db", size = 3494315, upload-time = "2025-10-15T23:17:42.769Z" }, + { url = "https://files.pythonhosted.org/packages/ba/8b/88cc7e3bd0a8e7b861f26981f7b820e1f46aa9d26cc482d0feba0ecb4919/cryptography-46.0.3-cp314-cp314t-win_arm64.whl", hash = "sha256:516ea134e703e9fe26bcd1277a4b59ad30586ea90c365a87781d7887a646fe21", size = 2919331, upload-time = "2025-10-15T23:17:44.468Z" }, + { url = "https://files.pythonhosted.org/packages/fd/23/45fe7f376a7df8daf6da3556603b36f53475a99ce4faacb6ba2cf3d82021/cryptography-46.0.3-cp38-abi3-macosx_10_9_universal2.whl", hash = "sha256:cb3d760a6117f621261d662bccc8ef5bc32ca673e037c83fbe565324f5c46936", size = 7218248, upload-time = "2025-10-15T23:17:46.294Z" }, + { url = "https://files.pythonhosted.org/packages/27/32/b68d27471372737054cbd34c84981f9edbc24fe67ca225d389799614e27f/cryptography-46.0.3-cp38-abi3-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:4b7387121ac7d15e550f5cb4a43aef2559ed759c35df7336c402bb8275ac9683", size = 4294089, upload-time = "2025-10-15T23:17:48.269Z" }, + { url = "https://files.pythonhosted.org/packages/26/42/fa8389d4478368743e24e61eea78846a0006caffaf72ea24a15159215a14/cryptography-46.0.3-cp38-abi3-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:15ab9b093e8f09daab0f2159bb7e47532596075139dd74365da52ecc9cb46c5d", size = 4440029, upload-time = "2025-10-15T23:17:49.837Z" }, + { url = "https://files.pythonhosted.org/packages/5f/eb/f483db0ec5ac040824f269e93dd2bd8a21ecd1027e77ad7bdf6914f2fd80/cryptography-46.0.3-cp38-abi3-manylinux_2_28_aarch64.whl", hash = "sha256:46acf53b40ea38f9c6c229599a4a13f0d46a6c3fa9ef19fc1a124d62e338dfa0", size = 4297222, upload-time = "2025-10-15T23:17:51.357Z" }, + { url = "https://files.pythonhosted.org/packages/fd/cf/da9502c4e1912cb1da3807ea3618a6829bee8207456fbbeebc361ec38ba3/cryptography-46.0.3-cp38-abi3-manylinux_2_28_armv7l.manylinux_2_31_armv7l.whl", hash = "sha256:10ca84c4668d066a9878890047f03546f3ae0a6b8b39b697457b7757aaf18dbc", size = 4012280, upload-time = "2025-10-15T23:17:52.964Z" }, + { url = "https://files.pythonhosted.org/packages/6b/8f/9adb86b93330e0df8b3dcf03eae67c33ba89958fc2e03862ef1ac2b42465/cryptography-46.0.3-cp38-abi3-manylinux_2_28_ppc64le.whl", hash = "sha256:36e627112085bb3b81b19fed209c05ce2a52ee8b15d161b7c643a7d5a88491f3", size = 4978958, upload-time = "2025-10-15T23:17:54.965Z" }, + { url = "https://files.pythonhosted.org/packages/d1/a0/5fa77988289c34bdb9f913f5606ecc9ada1adb5ae870bd0d1054a7021cc4/cryptography-46.0.3-cp38-abi3-manylinux_2_28_x86_64.whl", hash = "sha256:1000713389b75c449a6e979ffc7dcc8ac90b437048766cef052d4d30b8220971", size = 4473714, upload-time = "2025-10-15T23:17:56.754Z" }, + { url = "https://files.pythonhosted.org/packages/14/e5/fc82d72a58d41c393697aa18c9abe5ae1214ff6f2a5c18ac470f92777895/cryptography-46.0.3-cp38-abi3-manylinux_2_34_aarch64.whl", hash = "sha256:b02cf04496f6576afffef5ddd04a0cb7d49cf6be16a9059d793a30b035f6b6ac", size = 4296970, upload-time = "2025-10-15T23:17:58.588Z" }, + { url = "https://files.pythonhosted.org/packages/78/06/5663ed35438d0b09056973994f1aec467492b33bd31da36e468b01ec1097/cryptography-46.0.3-cp38-abi3-manylinux_2_34_ppc64le.whl", hash = "sha256:71e842ec9bc7abf543b47cf86b9a743baa95f4677d22baa4c7d5c69e49e9bc04", size = 4940236, upload-time = "2025-10-15T23:18:00.897Z" }, + { url = "https://files.pythonhosted.org/packages/fc/59/873633f3f2dcd8a053b8dd1d38f783043b5fce589c0f6988bf55ef57e43e/cryptography-46.0.3-cp38-abi3-manylinux_2_34_x86_64.whl", hash = "sha256:402b58fc32614f00980b66d6e56a5b4118e6cb362ae8f3fda141ba4689bd4506", size = 4472642, upload-time = "2025-10-15T23:18:02.749Z" }, + { url = "https://files.pythonhosted.org/packages/3d/39/8e71f3930e40f6877737d6f69248cf74d4e34b886a3967d32f919cc50d3b/cryptography-46.0.3-cp38-abi3-musllinux_1_2_aarch64.whl", hash = "sha256:ef639cb3372f69ec44915fafcd6698b6cc78fbe0c2ea41be867f6ed612811963", size = 4423126, upload-time = "2025-10-15T23:18:04.85Z" }, + { url = "https://files.pythonhosted.org/packages/cd/c7/f65027c2810e14c3e7268353b1681932b87e5a48e65505d8cc17c99e36ae/cryptography-46.0.3-cp38-abi3-musllinux_1_2_x86_64.whl", hash = "sha256:3b51b8ca4f1c6453d8829e1eb7299499ca7f313900dd4d89a24b8b87c0a780d4", size = 4686573, upload-time = "2025-10-15T23:18:06.908Z" }, + { url = "https://files.pythonhosted.org/packages/0a/6e/1c8331ddf91ca4730ab3086a0f1be19c65510a33b5a441cb334e7a2d2560/cryptography-46.0.3-cp38-abi3-win32.whl", hash = "sha256:6276eb85ef938dc035d59b87c8a7dc559a232f954962520137529d77b18ff1df", size = 3036695, upload-time = "2025-10-15T23:18:08.672Z" }, + { url = "https://files.pythonhosted.org/packages/90/45/b0d691df20633eff80955a0fc7695ff9051ffce8b69741444bd9ed7bd0db/cryptography-46.0.3-cp38-abi3-win_amd64.whl", hash = "sha256:416260257577718c05135c55958b674000baef9a1c7d9e8f306ec60d71db850f", size = 3501720, upload-time = "2025-10-15T23:18:10.632Z" }, + { url = "https://files.pythonhosted.org/packages/e8/cb/2da4cc83f5edb9c3257d09e1e7ab7b23f049c7962cae8d842bbef0a9cec9/cryptography-46.0.3-cp38-abi3-win_arm64.whl", hash = "sha256:d89c3468de4cdc4f08a57e214384d0471911a3830fcdaf7a8cc587e42a866372", size = 2918740, upload-time = "2025-10-15T23:18:12.277Z" }, +] + +[[package]] +name = "cython" +version = "3.1.6" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/e3/58/6a8321cc0791876dc2509d7a22fc75535a1a7aa770b3496772f58b0a53a4/cython-3.1.6.tar.gz", hash = "sha256:ff4ccffcf98f30ab5723fc45a39c0548a3f6ab14f01d73930c5bfaea455ff01c", size = 3192329, upload-time = "2025-10-23T12:38:20.786Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/cc/96/22b43125180d9b2814da4271d9450a5cc4623a6c6439b6b1d8faa7675c81/cython-3.1.6-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:14f0d6b9f803eacf48e9e80ea12a03f54e5f5ac48914341b0a6b81554b3b3154", size = 3047517, upload-time = "2025-10-23T12:39:35.641Z" }, + { url = "https://files.pythonhosted.org/packages/db/09/8abf6ccb13d1e2589e60320423f861952cf4c4ec092cd8536e1beb018e9c/cython-3.1.6-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:ec79615d0e29fa29fd4283bc7a2ed9c3d00532086a0031532d64b724db8c3e8e", size = 2954975, upload-time = "2025-10-23T12:39:37.568Z" }, + { url = "https://files.pythonhosted.org/packages/5b/16/e399f6fd33912116aba8bcdfeadd6093ff14996d7b5b72212fe4301e9f96/cython-3.1.6-cp314-cp314-macosx_10_15_x86_64.whl", hash = "sha256:8893619efa77fc83934c1255c619d522711a5cf5933cef0d5c2b9755e8e5fabc", size = 3042822, upload-time = "2025-10-23T12:39:56.081Z" }, + { url = "https://files.pythonhosted.org/packages/94/aa/5500ff58f8972431c0e74783546b8cdc39511493aa44b74a7fde1ec4e654/cython-3.1.6-cp314-cp314-macosx_11_0_arm64.whl", hash = "sha256:bb49c74220af0b098f406701f0b87876b1c7614716d39786306986b9feea774b", size = 2963154, upload-time = "2025-10-23T12:39:57.933Z" }, + { url = "https://files.pythonhosted.org/packages/18/d5/7a04640bf559bb890455ffb28978daf7d44f667c3f04a4d422c655c1ba92/cython-3.1.6-py3-none-any.whl", hash = "sha256:91dcf7eb9b6a089ce4e9e1140e571d84c3bca834afb77ec269be7aa9d31a8157", size = 1223550, upload-time = "2025-10-23T12:38:16.732Z" }, +] + +[[package]] +name = "distro" +version = "1.9.0" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/fc/f8/98eea607f65de6527f8a2e8885fc8015d3e6f5775df186e443e0964a11c3/distro-1.9.0.tar.gz", hash = "sha256:2fa77c6fd8940f116ee1d6b94a2f90b13b5ea8d019b98bc8bafdcabcdd9bdbed", size = 60722, upload-time = "2023-12-24T09:54:32.31Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/12/b3/231ffd4ab1fc9d679809f356cebee130ac7daa00d6d6f3206dd4fd137e9e/distro-1.9.0-py3-none-any.whl", hash = "sha256:7bffd925d65168f85027d8da9af6bddab658135b840670a223589bc0c8ef02b2", size = 20277, upload-time = "2023-12-24T09:54:30.421Z" }, +] + +[[package]] +name = "docstring-parser" +version = "0.17.0" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/b2/9d/c3b43da9515bd270df0f80548d9944e389870713cc1fe2b8fb35fe2bcefd/docstring_parser-0.17.0.tar.gz", hash = "sha256:583de4a309722b3315439bb31d64ba3eebada841f2e2cee23b99df001434c912", size = 27442, upload-time = "2025-07-21T07:35:01.868Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/55/e2/2537ebcff11c1ee1ff17d8d0b6f4db75873e3b0fb32c2d4a2ee31ecb310a/docstring_parser-0.17.0-py3-none-any.whl", hash = "sha256:cf2569abd23dce8099b300f9b4fa8191e9582dda731fd533daf54c4551658708", size = 36896, upload-time = "2025-07-21T07:35:00.684Z" }, +] + +[[package]] +name = "frozenlist" +version = "1.8.0" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/2d/f5/c831fac6cc817d26fd54c7eaccd04ef7e0288806943f7cc5bbf69f3ac1f0/frozenlist-1.8.0.tar.gz", hash = "sha256:3ede829ed8d842f6cd48fc7081d7a41001a56f1f38603f9d49bf3020d59a31ad", size = 45875, upload-time = "2025-10-06T05:38:17.865Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/2d/40/0832c31a37d60f60ed79e9dfb5a92e1e2af4f40a16a29abcc7992af9edff/frozenlist-1.8.0-cp313-cp313-macosx_10_13_universal2.whl", hash = "sha256:8d92f1a84bb12d9e56f818b3a746f3efba93c1b63c8387a73dde655e1e42282a", size = 85717, upload-time = "2025-10-06T05:36:27.341Z" }, + { url = "https://files.pythonhosted.org/packages/30/ba/b0b3de23f40bc55a7057bd38434e25c34fa48e17f20ee273bbde5e0650f3/frozenlist-1.8.0-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:96153e77a591c8adc2ee805756c61f59fef4cf4073a9275ee86fe8cba41241f7", size = 49651, upload-time = "2025-10-06T05:36:28.855Z" }, + { url = "https://files.pythonhosted.org/packages/0c/ab/6e5080ee374f875296c4243c381bbdef97a9ac39c6e3ce1d5f7d42cb78d6/frozenlist-1.8.0-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:f21f00a91358803399890ab167098c131ec2ddd5f8f5fd5fe9c9f2c6fcd91e40", size = 49417, upload-time = "2025-10-06T05:36:29.877Z" }, + { url = "https://files.pythonhosted.org/packages/d5/4e/e4691508f9477ce67da2015d8c00acd751e6287739123113a9fca6f1604e/frozenlist-1.8.0-cp313-cp313-manylinux1_x86_64.manylinux_2_28_x86_64.manylinux_2_5_x86_64.whl", hash = "sha256:fb30f9626572a76dfe4293c7194a09fb1fe93ba94c7d4f720dfae3b646b45027", size = 234391, upload-time = "2025-10-06T05:36:31.301Z" }, + { url = "https://files.pythonhosted.org/packages/40/76/c202df58e3acdf12969a7895fd6f3bc016c642e6726aa63bd3025e0fc71c/frozenlist-1.8.0-cp313-cp313-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:eaa352d7047a31d87dafcacbabe89df0aa506abb5b1b85a2fb91bc3faa02d822", size = 233048, upload-time = "2025-10-06T05:36:32.531Z" }, + { url = "https://files.pythonhosted.org/packages/f9/c0/8746afb90f17b73ca5979c7a3958116e105ff796e718575175319b5bb4ce/frozenlist-1.8.0-cp313-cp313-manylinux2014_armv7l.manylinux_2_17_armv7l.manylinux_2_31_armv7l.whl", hash = "sha256:03ae967b4e297f58f8c774c7eabcce57fe3c2434817d4385c50661845a058121", size = 226549, upload-time = "2025-10-06T05:36:33.706Z" }, + { url = "https://files.pythonhosted.org/packages/7e/eb/4c7eefc718ff72f9b6c4893291abaae5fbc0c82226a32dcd8ef4f7a5dbef/frozenlist-1.8.0-cp313-cp313-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:f6292f1de555ffcc675941d65fffffb0a5bcd992905015f85d0592201793e0e5", size = 239833, upload-time = "2025-10-06T05:36:34.947Z" }, + { url = "https://files.pythonhosted.org/packages/c2/4e/e5c02187cf704224f8b21bee886f3d713ca379535f16893233b9d672ea71/frozenlist-1.8.0-cp313-cp313-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:29548f9b5b5e3460ce7378144c3010363d8035cea44bc0bf02d57f5a685e084e", size = 245363, upload-time = "2025-10-06T05:36:36.534Z" }, + { url = "https://files.pythonhosted.org/packages/1f/96/cb85ec608464472e82ad37a17f844889c36100eed57bea094518bf270692/frozenlist-1.8.0-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:ec3cc8c5d4084591b4237c0a272cc4f50a5b03396a47d9caaf76f5d7b38a4f11", size = 229314, upload-time = "2025-10-06T05:36:38.582Z" }, + { url = "https://files.pythonhosted.org/packages/5d/6f/4ae69c550e4cee66b57887daeebe006fe985917c01d0fff9caab9883f6d0/frozenlist-1.8.0-cp313-cp313-musllinux_1_2_armv7l.whl", hash = "sha256:517279f58009d0b1f2e7c1b130b377a349405da3f7621ed6bfae50b10adf20c1", size = 243365, upload-time = "2025-10-06T05:36:40.152Z" }, + { url = "https://files.pythonhosted.org/packages/7a/58/afd56de246cf11780a40a2c28dc7cbabbf06337cc8ddb1c780a2d97e88d8/frozenlist-1.8.0-cp313-cp313-musllinux_1_2_ppc64le.whl", hash = "sha256:db1e72ede2d0d7ccb213f218df6a078a9c09a7de257c2fe8fcef16d5925230b1", size = 237763, upload-time = "2025-10-06T05:36:41.355Z" }, + { url = "https://files.pythonhosted.org/packages/cb/36/cdfaf6ed42e2644740d4a10452d8e97fa1c062e2a8006e4b09f1b5fd7d63/frozenlist-1.8.0-cp313-cp313-musllinux_1_2_s390x.whl", hash = "sha256:b4dec9482a65c54a5044486847b8a66bf10c9cb4926d42927ec4e8fd5db7fed8", size = 240110, upload-time = "2025-10-06T05:36:42.716Z" }, + { url = "https://files.pythonhosted.org/packages/03/a8/9ea226fbefad669f11b52e864c55f0bd57d3c8d7eb07e9f2e9a0b39502e1/frozenlist-1.8.0-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:21900c48ae04d13d416f0e1e0c4d81f7931f73a9dfa0b7a8746fb2fe7dd970ed", size = 233717, upload-time = "2025-10-06T05:36:44.251Z" }, + { url = "https://files.pythonhosted.org/packages/1e/0b/1b5531611e83ba7d13ccc9988967ea1b51186af64c42b7a7af465dcc9568/frozenlist-1.8.0-cp313-cp313-win32.whl", hash = "sha256:8b7b94a067d1c504ee0b16def57ad5738701e4ba10cec90529f13fa03c833496", size = 39628, upload-time = "2025-10-06T05:36:45.423Z" }, + { url = "https://files.pythonhosted.org/packages/d8/cf/174c91dbc9cc49bc7b7aab74d8b734e974d1faa8f191c74af9b7e80848e6/frozenlist-1.8.0-cp313-cp313-win_amd64.whl", hash = "sha256:878be833caa6a3821caf85eb39c5ba92d28e85df26d57afb06b35b2efd937231", size = 43882, upload-time = "2025-10-06T05:36:46.796Z" }, + { url = "https://files.pythonhosted.org/packages/c1/17/502cd212cbfa96eb1388614fe39a3fc9ab87dbbe042b66f97acb57474834/frozenlist-1.8.0-cp313-cp313-win_arm64.whl", hash = "sha256:44389d135b3ff43ba8cc89ff7f51f5a0bb6b63d829c8300f79a2fe4fe61bcc62", size = 39676, upload-time = "2025-10-06T05:36:47.8Z" }, + { url = "https://files.pythonhosted.org/packages/d2/5c/3bbfaa920dfab09e76946a5d2833a7cbdf7b9b4a91c714666ac4855b88b4/frozenlist-1.8.0-cp313-cp313t-macosx_10_13_universal2.whl", hash = "sha256:e25ac20a2ef37e91c1b39938b591457666a0fa835c7783c3a8f33ea42870db94", size = 89235, upload-time = "2025-10-06T05:36:48.78Z" }, + { url = "https://files.pythonhosted.org/packages/d2/d6/f03961ef72166cec1687e84e8925838442b615bd0b8854b54923ce5b7b8a/frozenlist-1.8.0-cp313-cp313t-macosx_10_13_x86_64.whl", hash = "sha256:07cdca25a91a4386d2e76ad992916a85038a9b97561bf7a3fd12d5d9ce31870c", size = 50742, upload-time = "2025-10-06T05:36:49.837Z" }, + { url = "https://files.pythonhosted.org/packages/1e/bb/a6d12b7ba4c3337667d0e421f7181c82dda448ce4e7ad7ecd249a16fa806/frozenlist-1.8.0-cp313-cp313t-macosx_11_0_arm64.whl", hash = "sha256:4e0c11f2cc6717e0a741f84a527c52616140741cd812a50422f83dc31749fb52", size = 51725, upload-time = "2025-10-06T05:36:50.851Z" }, + { url = "https://files.pythonhosted.org/packages/bc/71/d1fed0ffe2c2ccd70b43714c6cab0f4188f09f8a67a7914a6b46ee30f274/frozenlist-1.8.0-cp313-cp313t-manylinux1_x86_64.manylinux_2_28_x86_64.manylinux_2_5_x86_64.whl", hash = "sha256:b3210649ee28062ea6099cfda39e147fa1bc039583c8ee4481cb7811e2448c51", size = 284533, upload-time = "2025-10-06T05:36:51.898Z" }, + { url = "https://files.pythonhosted.org/packages/c9/1f/fb1685a7b009d89f9bf78a42d94461bc06581f6e718c39344754a5d9bada/frozenlist-1.8.0-cp313-cp313t-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:581ef5194c48035a7de2aefc72ac6539823bb71508189e5de01d60c9dcd5fa65", size = 292506, upload-time = "2025-10-06T05:36:53.101Z" }, + { url = "https://files.pythonhosted.org/packages/e6/3b/b991fe1612703f7e0d05c0cf734c1b77aaf7c7d321df4572e8d36e7048c8/frozenlist-1.8.0-cp313-cp313t-manylinux2014_armv7l.manylinux_2_17_armv7l.manylinux_2_31_armv7l.whl", hash = "sha256:3ef2d026f16a2b1866e1d86fc4e1291e1ed8a387b2c333809419a2f8b3a77b82", size = 274161, upload-time = "2025-10-06T05:36:54.309Z" }, + { url = "https://files.pythonhosted.org/packages/ca/ec/c5c618767bcdf66e88945ec0157d7f6c4a1322f1473392319b7a2501ded7/frozenlist-1.8.0-cp313-cp313t-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:5500ef82073f599ac84d888e3a8c1f77ac831183244bfd7f11eaa0289fb30714", size = 294676, upload-time = "2025-10-06T05:36:55.566Z" }, + { url = "https://files.pythonhosted.org/packages/7c/ce/3934758637d8f8a88d11f0585d6495ef54b2044ed6ec84492a91fa3b27aa/frozenlist-1.8.0-cp313-cp313t-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:50066c3997d0091c411a66e710f4e11752251e6d2d73d70d8d5d4c76442a199d", size = 300638, upload-time = "2025-10-06T05:36:56.758Z" }, + { url = "https://files.pythonhosted.org/packages/fc/4f/a7e4d0d467298f42de4b41cbc7ddaf19d3cfeabaf9ff97c20c6c7ee409f9/frozenlist-1.8.0-cp313-cp313t-musllinux_1_2_aarch64.whl", hash = "sha256:5c1c8e78426e59b3f8005e9b19f6ff46e5845895adbde20ece9218319eca6506", size = 283067, upload-time = "2025-10-06T05:36:57.965Z" }, + { url = "https://files.pythonhosted.org/packages/dc/48/c7b163063d55a83772b268e6d1affb960771b0e203b632cfe09522d67ea5/frozenlist-1.8.0-cp313-cp313t-musllinux_1_2_armv7l.whl", hash = "sha256:eefdba20de0d938cec6a89bd4d70f346a03108a19b9df4248d3cf0d88f1b0f51", size = 292101, upload-time = "2025-10-06T05:36:59.237Z" }, + { url = "https://files.pythonhosted.org/packages/9f/d0/2366d3c4ecdc2fd391e0afa6e11500bfba0ea772764d631bbf82f0136c9d/frozenlist-1.8.0-cp313-cp313t-musllinux_1_2_ppc64le.whl", hash = "sha256:cf253e0e1c3ceb4aaff6df637ce033ff6535fb8c70a764a8f46aafd3d6ab798e", size = 289901, upload-time = "2025-10-06T05:37:00.811Z" }, + { url = "https://files.pythonhosted.org/packages/b8/94/daff920e82c1b70e3618a2ac39fbc01ae3e2ff6124e80739ce5d71c9b920/frozenlist-1.8.0-cp313-cp313t-musllinux_1_2_s390x.whl", hash = "sha256:032efa2674356903cd0261c4317a561a6850f3ac864a63fc1583147fb05a79b0", size = 289395, upload-time = "2025-10-06T05:37:02.115Z" }, + { url = "https://files.pythonhosted.org/packages/e3/20/bba307ab4235a09fdcd3cc5508dbabd17c4634a1af4b96e0f69bfe551ebd/frozenlist-1.8.0-cp313-cp313t-musllinux_1_2_x86_64.whl", hash = "sha256:6da155091429aeba16851ecb10a9104a108bcd32f6c1642867eadaee401c1c41", size = 283659, upload-time = "2025-10-06T05:37:03.711Z" }, + { url = "https://files.pythonhosted.org/packages/fd/00/04ca1c3a7a124b6de4f8a9a17cc2fcad138b4608e7a3fc5877804b8715d7/frozenlist-1.8.0-cp313-cp313t-win32.whl", hash = "sha256:0f96534f8bfebc1a394209427d0f8a63d343c9779cda6fc25e8e121b5fd8555b", size = 43492, upload-time = "2025-10-06T05:37:04.915Z" }, + { url = "https://files.pythonhosted.org/packages/59/5e/c69f733a86a94ab10f68e496dc6b7e8bc078ebb415281d5698313e3af3a1/frozenlist-1.8.0-cp313-cp313t-win_amd64.whl", hash = "sha256:5d63a068f978fc69421fb0e6eb91a9603187527c86b7cd3f534a5b77a592b888", size = 48034, upload-time = "2025-10-06T05:37:06.343Z" }, + { url = "https://files.pythonhosted.org/packages/16/6c/be9d79775d8abe79b05fa6d23da99ad6e7763a1d080fbae7290b286093fd/frozenlist-1.8.0-cp313-cp313t-win_arm64.whl", hash = "sha256:bf0a7e10b077bf5fb9380ad3ae8ce20ef919a6ad93b4552896419ac7e1d8e042", size = 41749, upload-time = "2025-10-06T05:37:07.431Z" }, + { url = "https://files.pythonhosted.org/packages/f1/c8/85da824b7e7b9b6e7f7705b2ecaf9591ba6f79c1177f324c2735e41d36a2/frozenlist-1.8.0-cp314-cp314-macosx_10_13_universal2.whl", hash = "sha256:cee686f1f4cadeb2136007ddedd0aaf928ab95216e7691c63e50a8ec066336d0", size = 86127, upload-time = "2025-10-06T05:37:08.438Z" }, + { url = "https://files.pythonhosted.org/packages/8e/e8/a1185e236ec66c20afd72399522f142c3724c785789255202d27ae992818/frozenlist-1.8.0-cp314-cp314-macosx_10_13_x86_64.whl", hash = "sha256:119fb2a1bd47307e899c2fac7f28e85b9a543864df47aa7ec9d3c1b4545f096f", size = 49698, upload-time = "2025-10-06T05:37:09.48Z" }, + { url = "https://files.pythonhosted.org/packages/a1/93/72b1736d68f03fda5fdf0f2180fb6caaae3894f1b854d006ac61ecc727ee/frozenlist-1.8.0-cp314-cp314-macosx_11_0_arm64.whl", hash = "sha256:4970ece02dbc8c3a92fcc5228e36a3e933a01a999f7094ff7c23fbd2beeaa67c", size = 49749, upload-time = "2025-10-06T05:37:10.569Z" }, + { url = "https://files.pythonhosted.org/packages/a7/b2/fabede9fafd976b991e9f1b9c8c873ed86f202889b864756f240ce6dd855/frozenlist-1.8.0-cp314-cp314-manylinux1_x86_64.manylinux_2_28_x86_64.manylinux_2_5_x86_64.whl", hash = "sha256:cba69cb73723c3f329622e34bdbf5ce1f80c21c290ff04256cff1cd3c2036ed2", size = 231298, upload-time = "2025-10-06T05:37:11.993Z" }, + { url = "https://files.pythonhosted.org/packages/3a/3b/d9b1e0b0eed36e70477ffb8360c49c85c8ca8ef9700a4e6711f39a6e8b45/frozenlist-1.8.0-cp314-cp314-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:778a11b15673f6f1df23d9586f83c4846c471a8af693a22e066508b77d201ec8", size = 232015, upload-time = "2025-10-06T05:37:13.194Z" }, + { url = "https://files.pythonhosted.org/packages/dc/94/be719d2766c1138148564a3960fc2c06eb688da592bdc25adcf856101be7/frozenlist-1.8.0-cp314-cp314-manylinux2014_armv7l.manylinux_2_17_armv7l.manylinux_2_31_armv7l.whl", hash = "sha256:0325024fe97f94c41c08872db482cf8ac4800d80e79222c6b0b7b162d5b13686", size = 225038, upload-time = "2025-10-06T05:37:14.577Z" }, + { url = "https://files.pythonhosted.org/packages/e4/09/6712b6c5465f083f52f50cf74167b92d4ea2f50e46a9eea0523d658454ae/frozenlist-1.8.0-cp314-cp314-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:97260ff46b207a82a7567b581ab4190bd4dfa09f4db8a8b49d1a958f6aa4940e", size = 240130, upload-time = "2025-10-06T05:37:15.781Z" }, + { url = "https://files.pythonhosted.org/packages/f8/d4/cd065cdcf21550b54f3ce6a22e143ac9e4836ca42a0de1022da8498eac89/frozenlist-1.8.0-cp314-cp314-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:54b2077180eb7f83dd52c40b2750d0a9f175e06a42e3213ce047219de902717a", size = 242845, upload-time = "2025-10-06T05:37:17.037Z" }, + { url = "https://files.pythonhosted.org/packages/62/c3/f57a5c8c70cd1ead3d5d5f776f89d33110b1addae0ab010ad774d9a44fb9/frozenlist-1.8.0-cp314-cp314-musllinux_1_2_aarch64.whl", hash = "sha256:2f05983daecab868a31e1da44462873306d3cbfd76d1f0b5b69c473d21dbb128", size = 229131, upload-time = "2025-10-06T05:37:18.221Z" }, + { url = "https://files.pythonhosted.org/packages/6c/52/232476fe9cb64f0742f3fde2b7d26c1dac18b6d62071c74d4ded55e0ef94/frozenlist-1.8.0-cp314-cp314-musllinux_1_2_armv7l.whl", hash = "sha256:33f48f51a446114bc5d251fb2954ab0164d5be02ad3382abcbfe07e2531d650f", size = 240542, upload-time = "2025-10-06T05:37:19.771Z" }, + { url = "https://files.pythonhosted.org/packages/5f/85/07bf3f5d0fb5414aee5f47d33c6f5c77bfe49aac680bfece33d4fdf6a246/frozenlist-1.8.0-cp314-cp314-musllinux_1_2_ppc64le.whl", hash = "sha256:154e55ec0655291b5dd1b8731c637ecdb50975a2ae70c606d100750a540082f7", size = 237308, upload-time = "2025-10-06T05:37:20.969Z" }, + { url = "https://files.pythonhosted.org/packages/11/99/ae3a33d5befd41ac0ca2cc7fd3aa707c9c324de2e89db0e0f45db9a64c26/frozenlist-1.8.0-cp314-cp314-musllinux_1_2_s390x.whl", hash = "sha256:4314debad13beb564b708b4a496020e5306c7333fa9a3ab90374169a20ffab30", size = 238210, upload-time = "2025-10-06T05:37:22.252Z" }, + { url = "https://files.pythonhosted.org/packages/b2/60/b1d2da22f4970e7a155f0adde9b1435712ece01b3cd45ba63702aea33938/frozenlist-1.8.0-cp314-cp314-musllinux_1_2_x86_64.whl", hash = "sha256:073f8bf8becba60aa931eb3bc420b217bb7d5b8f4750e6f8b3be7f3da85d38b7", size = 231972, upload-time = "2025-10-06T05:37:23.5Z" }, + { url = "https://files.pythonhosted.org/packages/3f/ab/945b2f32de889993b9c9133216c068b7fcf257d8595a0ac420ac8677cab0/frozenlist-1.8.0-cp314-cp314-win32.whl", hash = "sha256:bac9c42ba2ac65ddc115d930c78d24ab8d4f465fd3fc473cdedfccadb9429806", size = 40536, upload-time = "2025-10-06T05:37:25.581Z" }, + { url = "https://files.pythonhosted.org/packages/59/ad/9caa9b9c836d9ad6f067157a531ac48b7d36499f5036d4141ce78c230b1b/frozenlist-1.8.0-cp314-cp314-win_amd64.whl", hash = "sha256:3e0761f4d1a44f1d1a47996511752cf3dcec5bbdd9cc2b4fe595caf97754b7a0", size = 44330, upload-time = "2025-10-06T05:37:26.928Z" }, + { url = "https://files.pythonhosted.org/packages/82/13/e6950121764f2676f43534c555249f57030150260aee9dcf7d64efda11dd/frozenlist-1.8.0-cp314-cp314-win_arm64.whl", hash = "sha256:d1eaff1d00c7751b7c6662e9c5ba6eb2c17a2306ba5e2a37f24ddf3cc953402b", size = 40627, upload-time = "2025-10-06T05:37:28.075Z" }, + { url = "https://files.pythonhosted.org/packages/c0/c7/43200656ecc4e02d3f8bc248df68256cd9572b3f0017f0a0c4e93440ae23/frozenlist-1.8.0-cp314-cp314t-macosx_10_13_universal2.whl", hash = "sha256:d3bb933317c52d7ea5004a1c442eef86f426886fba134ef8cf4226ea6ee1821d", size = 89238, upload-time = "2025-10-06T05:37:29.373Z" }, + { url = "https://files.pythonhosted.org/packages/d1/29/55c5f0689b9c0fb765055629f472c0de484dcaf0acee2f7707266ae3583c/frozenlist-1.8.0-cp314-cp314t-macosx_10_13_x86_64.whl", hash = "sha256:8009897cdef112072f93a0efdce29cd819e717fd2f649ee3016efd3cd885a7ed", size = 50738, upload-time = "2025-10-06T05:37:30.792Z" }, + { url = "https://files.pythonhosted.org/packages/ba/7d/b7282a445956506fa11da8c2db7d276adcbf2b17d8bb8407a47685263f90/frozenlist-1.8.0-cp314-cp314t-macosx_11_0_arm64.whl", hash = "sha256:2c5dcbbc55383e5883246d11fd179782a9d07a986c40f49abe89ddf865913930", size = 51739, upload-time = "2025-10-06T05:37:32.127Z" }, + { url = "https://files.pythonhosted.org/packages/62/1c/3d8622e60d0b767a5510d1d3cf21065b9db874696a51ea6d7a43180a259c/frozenlist-1.8.0-cp314-cp314t-manylinux1_x86_64.manylinux_2_28_x86_64.manylinux_2_5_x86_64.whl", hash = "sha256:39ecbc32f1390387d2aa4f5a995e465e9e2f79ba3adcac92d68e3e0afae6657c", size = 284186, upload-time = "2025-10-06T05:37:33.21Z" }, + { url = "https://files.pythonhosted.org/packages/2d/14/aa36d5f85a89679a85a1d44cd7a6657e0b1c75f61e7cad987b203d2daca8/frozenlist-1.8.0-cp314-cp314t-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:92db2bf818d5cc8d9c1f1fc56b897662e24ea5adb36ad1f1d82875bd64e03c24", size = 292196, upload-time = "2025-10-06T05:37:36.107Z" }, + { url = "https://files.pythonhosted.org/packages/05/23/6bde59eb55abd407d34f77d39a5126fb7b4f109a3f611d3929f14b700c66/frozenlist-1.8.0-cp314-cp314t-manylinux2014_armv7l.manylinux_2_17_armv7l.manylinux_2_31_armv7l.whl", hash = "sha256:2dc43a022e555de94c3b68a4ef0b11c4f747d12c024a520c7101709a2144fb37", size = 273830, upload-time = "2025-10-06T05:37:37.663Z" }, + { url = "https://files.pythonhosted.org/packages/d2/3f/22cff331bfad7a8afa616289000ba793347fcd7bc275f3b28ecea2a27909/frozenlist-1.8.0-cp314-cp314t-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:cb89a7f2de3602cfed448095bab3f178399646ab7c61454315089787df07733a", size = 294289, upload-time = "2025-10-06T05:37:39.261Z" }, + { url = "https://files.pythonhosted.org/packages/a4/89/5b057c799de4838b6c69aa82b79705f2027615e01be996d2486a69ca99c4/frozenlist-1.8.0-cp314-cp314t-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:33139dc858c580ea50e7e60a1b0ea003efa1fd42e6ec7fdbad78fff65fad2fd2", size = 300318, upload-time = "2025-10-06T05:37:43.213Z" }, + { url = "https://files.pythonhosted.org/packages/30/de/2c22ab3eb2a8af6d69dc799e48455813bab3690c760de58e1bf43b36da3e/frozenlist-1.8.0-cp314-cp314t-musllinux_1_2_aarch64.whl", hash = "sha256:168c0969a329b416119507ba30b9ea13688fafffac1b7822802537569a1cb0ef", size = 282814, upload-time = "2025-10-06T05:37:45.337Z" }, + { url = "https://files.pythonhosted.org/packages/59/f7/970141a6a8dbd7f556d94977858cfb36fa9b66e0892c6dd780d2219d8cd8/frozenlist-1.8.0-cp314-cp314t-musllinux_1_2_armv7l.whl", hash = "sha256:28bd570e8e189d7f7b001966435f9dac6718324b5be2990ac496cf1ea9ddb7fe", size = 291762, upload-time = "2025-10-06T05:37:46.657Z" }, + { url = "https://files.pythonhosted.org/packages/c1/15/ca1adae83a719f82df9116d66f5bb28bb95557b3951903d39135620ef157/frozenlist-1.8.0-cp314-cp314t-musllinux_1_2_ppc64le.whl", hash = "sha256:b2a095d45c5d46e5e79ba1e5b9cb787f541a8dee0433836cea4b96a2c439dcd8", size = 289470, upload-time = "2025-10-06T05:37:47.946Z" }, + { url = "https://files.pythonhosted.org/packages/ac/83/dca6dc53bf657d371fbc88ddeb21b79891e747189c5de990b9dfff2ccba1/frozenlist-1.8.0-cp314-cp314t-musllinux_1_2_s390x.whl", hash = "sha256:eab8145831a0d56ec9c4139b6c3e594c7a83c2c8be25d5bcf2d86136a532287a", size = 289042, upload-time = "2025-10-06T05:37:49.499Z" }, + { url = "https://files.pythonhosted.org/packages/96/52/abddd34ca99be142f354398700536c5bd315880ed0a213812bc491cff5e4/frozenlist-1.8.0-cp314-cp314t-musllinux_1_2_x86_64.whl", hash = "sha256:974b28cf63cc99dfb2188d8d222bc6843656188164848c4f679e63dae4b0708e", size = 283148, upload-time = "2025-10-06T05:37:50.745Z" }, + { url = "https://files.pythonhosted.org/packages/af/d3/76bd4ed4317e7119c2b7f57c3f6934aba26d277acc6309f873341640e21f/frozenlist-1.8.0-cp314-cp314t-win32.whl", hash = "sha256:342c97bf697ac5480c0a7ec73cd700ecfa5a8a40ac923bd035484616efecc2df", size = 44676, upload-time = "2025-10-06T05:37:52.222Z" }, + { url = "https://files.pythonhosted.org/packages/89/76/c615883b7b521ead2944bb3480398cbb07e12b7b4e4d073d3752eb721558/frozenlist-1.8.0-cp314-cp314t-win_amd64.whl", hash = "sha256:06be8f67f39c8b1dc671f5d83aaefd3358ae5cdcf8314552c57e7ed3e6475bdd", size = 49451, upload-time = "2025-10-06T05:37:53.425Z" }, + { url = "https://files.pythonhosted.org/packages/e0/a3/5982da14e113d07b325230f95060e2169f5311b1017ea8af2a29b374c289/frozenlist-1.8.0-cp314-cp314t-win_arm64.whl", hash = "sha256:102e6314ca4da683dca92e3b1355490fed5f313b768500084fbe6371fddfdb79", size = 42507, upload-time = "2025-10-06T05:37:54.513Z" }, + { url = "https://files.pythonhosted.org/packages/9a/9a/e35b4a917281c0b8419d4207f4334c8e8c5dbf4f3f5f9ada73958d937dcc/frozenlist-1.8.0-py3-none-any.whl", hash = "sha256:0c18a16eab41e82c295618a77502e17b195883241c563b00f0aa5106fc4eaa0d", size = 13409, upload-time = "2025-10-06T05:38:16.721Z" }, +] + +[[package]] +name = "google" +version = "3.0.0" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "beautifulsoup4" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/89/97/b49c69893cddea912c7a660a4b6102c6b02cd268f8c7162dd70b7c16f753/google-3.0.0.tar.gz", hash = "sha256:143530122ee5130509ad5e989f0512f7cb218b2d4eddbafbad40fd10e8d8ccbe", size = 44978, upload-time = "2020-07-11T14:50:45.678Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/ac/35/17c9141c4ae21e9a29a43acdfd848e3e468a810517f862cad07977bf8fe9/google-3.0.0-py2.py3-none-any.whl", hash = "sha256:889cf695f84e4ae2c55fbc0cfdaf4c1e729417fa52ab1db0485202ba173e4935", size = 45258, upload-time = "2020-07-11T14:49:58.287Z" }, +] + +[[package]] +name = "google-api-core" +version = "2.27.0" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "google-auth" }, + { name = "googleapis-common-protos" }, + { name = "proto-plus" }, + { name = "protobuf" }, + { name = "requests" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/da/99/6c8b44ecc28026fd9441d7fcc5434ee1b3976c491f2f810b464c4702c975/google_api_core-2.27.0.tar.gz", hash = "sha256:d32e2f5dd0517e91037169e75bf0a9783b255aff1d11730517c0b2b29e9db06a", size = 168851, upload-time = "2025-10-22T23:54:14.195Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/77/93/ecf9f7caa99c71e969091e9a78789f11b2dea5c684917eab7c54a8d13560/google_api_core-2.27.0-py3-none-any.whl", hash = "sha256:779a380db4e21a4ee3d717cf8efbf324e53900bf37e1ffb273e5348a9916dd42", size = 167110, upload-time = "2025-10-22T23:54:12.805Z" }, +] + +[[package]] +name = "google-api-python-client" +version = "2.185.0" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "google-api-core" }, + { name = "google-auth" }, + { name = "google-auth-httplib2" }, + { name = "httplib2" }, + { name = "uritemplate" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/8e/5a/6f9b49d67ea91376305fdb8bbf2877c746d756e45fd8fb7d2e32d6dad19b/google_api_python_client-2.185.0.tar.gz", hash = "sha256:aa1b338e4bb0f141c2df26743f6b46b11f38705aacd775b61971cbc51da089c3", size = 13885609, upload-time = "2025-10-17T15:00:35.623Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/fa/28/be3b17bd6a190c8c2ec9e4fb65d43e6ecd7b7a1bb19ccc1d9ab4f687a58c/google_api_python_client-2.185.0-py3-none-any.whl", hash = "sha256:00fe173a4b346d2397fbe0d37ac15368170dfbed91a0395a66ef2558e22b93fc", size = 14453595, upload-time = "2025-10-17T15:00:33.176Z" }, +] + +[[package]] +name = "google-auth" +version = "2.41.1" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "cachetools" }, + { name = "pyasn1-modules" }, + { name = "rsa" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/a8/af/5129ce5b2f9688d2fa49b463e544972a7c82b0fdb50980dafee92e121d9f/google_auth-2.41.1.tar.gz", hash = "sha256:b76b7b1f9e61f0cb7e88870d14f6a94aeef248959ef6992670efee37709cbfd2", size = 292284, upload-time = "2025-09-30T22:51:26.363Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/be/a4/7319a2a8add4cc352be9e3efeff5e2aacee917c85ca2fa1647e29089983c/google_auth-2.41.1-py2.py3-none-any.whl", hash = "sha256:754843be95575b9a19c604a848a41be03f7f2afd8c019f716dc1f51ee41c639d", size = 221302, upload-time = "2025-09-30T22:51:24.212Z" }, +] + +[[package]] +name = "google-auth-httplib2" +version = "0.2.0" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "google-auth" }, + { name = "httplib2" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/56/be/217a598a818567b28e859ff087f347475c807a5649296fb5a817c58dacef/google-auth-httplib2-0.2.0.tar.gz", hash = "sha256:38aa7badf48f974f1eb9861794e9c0cb2a0511a4ec0679b1f886d108f5640e05", size = 10842, upload-time = "2023-12-12T17:40:30.722Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/be/8a/fe34d2f3f9470a27b01c9e76226965863f153d5fbe276f83608562e49c04/google_auth_httplib2-0.2.0-py2.py3-none-any.whl", hash = "sha256:b65a0a2123300dd71281a7bf6e64d65a0759287df52729bdd1ae2e47dc311a3d", size = 9253, upload-time = "2023-12-12T17:40:13.055Z" }, +] + +[[package]] +name = "google-auth-oauthlib" +version = "1.2.2" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "google-auth" }, + { name = "requests-oauthlib" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/fb/87/e10bf24f7bcffc1421b84d6f9c3377c30ec305d082cd737ddaa6d8f77f7c/google_auth_oauthlib-1.2.2.tar.gz", hash = "sha256:11046fb8d3348b296302dd939ace8af0a724042e8029c1b872d87fabc9f41684", size = 20955, upload-time = "2025-04-22T16:40:29.172Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/ac/84/40ee070be95771acd2f4418981edb834979424565c3eec3cd88b6aa09d24/google_auth_oauthlib-1.2.2-py3-none-any.whl", hash = "sha256:fd619506f4b3908b5df17b65f39ca8d66ea56986e5472eb5978fd8f3786f00a2", size = 19072, upload-time = "2025-04-22T16:40:28.174Z" }, +] + +[[package]] +name = "google-genai" +version = "1.46.0" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "anyio" }, + { name = "google-auth" }, + { name = "httpx" }, + { name = "pydantic" }, + { name = "requests" }, + { name = "tenacity" }, + { name = "typing-extensions" }, + { name = "websockets" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/c7/2d/d5907af6a46fb0b660291a09bb62f9cbc1365899f7d64a74e7d8d2e056c2/google_genai-1.46.0.tar.gz", hash = "sha256:6824c31149fe3b1c7285b25f79b924c5f89fd52466f62e30f76954f8104fe3a7", size = 239561, upload-time = "2025-10-21T22:55:04.241Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/db/79/8993ec6cbf56e5c8f88c165380e55de34ec74f7b928bc302ff5c370f9c4e/google_genai-1.46.0-py3-none-any.whl", hash = "sha256:879c4a260d630db0dcedb5cc84a9d7b47acd29e43e9dc63541b511b757ea7296", size = 239445, upload-time = "2025-10-21T22:55:03.072Z" }, +] + +[[package]] +name = "googleapis-common-protos" +version = "1.71.0" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "protobuf" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/30/43/b25abe02db2911397819003029bef768f68a974f2ece483e6084d1a5f754/googleapis_common_protos-1.71.0.tar.gz", hash = "sha256:1aec01e574e29da63c80ba9f7bbf1ccfaacf1da877f23609fe236ca7c72a2e2e", size = 146454, upload-time = "2025-10-20T14:58:08.732Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/25/e8/eba9fece11d57a71e3e22ea672742c8f3cf23b35730c9e96db768b295216/googleapis_common_protos-1.71.0-py3-none-any.whl", hash = "sha256:59034a1d849dc4d18971997a72ac56246570afdd17f9369a0ff68218d50ab78c", size = 294576, upload-time = "2025-10-20T14:56:21.295Z" }, +] + +[[package]] +name = "groq" +version = "0.33.0" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "anyio" }, + { name = "distro" }, + { name = "httpx" }, + { name = "pydantic" }, + { name = "sniffio" }, + { name = "typing-extensions" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/eb/51/b85f8100078a4802340e8325af2bfa357e3e8d367f11ee8fd83dc3441523/groq-0.33.0.tar.gz", hash = "sha256:5342158026a1f6bf58653d774696f47ef1d763c401e20f9dbc9598337859523a", size = 142470, upload-time = "2025-10-21T01:38:49.913Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/99/91/5ecd95278f6f1793bccd9ffa0b6db0d8eb71acda9be9dd0668b162fc2986/groq-0.33.0-py3-none-any.whl", hash = "sha256:ed8c33e55872dea3c7a087741af0c36c2a1a6699a24a34f6cada53e502d3ad75", size = 135782, upload-time = "2025-10-21T01:38:48.855Z" }, +] + +[[package]] +name = "h11" +version = "0.16.0" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/01/ee/02a2c011bdab74c6fb3c75474d40b3052059d95df7e73351460c8588d963/h11-0.16.0.tar.gz", hash = "sha256:4e35b956cf45792e4caa5885e69fba00bdbc6ffafbfa020300e549b208ee5ff1", size = 101250, upload-time = "2025-04-24T03:35:25.427Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/04/4b/29cac41a4d98d144bf5f6d33995617b185d14b22401f75ca86f384e87ff1/h11-0.16.0-py3-none-any.whl", hash = "sha256:63cf8bbe7522de3bf65932fda1d9c2772064ffb3dae62d55932da54b31cb6c86", size = 37515, upload-time = "2025-04-24T03:35:24.344Z" }, +] + [[package]] name = "hackathon-devsimpacto" version = "0.1.0" source = { virtual = "." } dependencies = [ + { name = "browser-use" }, + { name = "google" }, + { name = "google-genai" }, { name = "requests" }, ] [package.metadata] -requires-dist = [{ name = "requests", specifier = ">=2.32.5" }] +requires-dist = [ + { name = "browser-use", specifier = ">=0.9.1" }, + { name = "google", specifier = ">=3.0.0" }, + { name = "google-genai", specifier = ">=1.46.0" }, + { name = "requests", specifier = ">=2.32.5" }, +] + +[[package]] +name = "httpcore" +version = "1.0.9" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "certifi" }, + { name = "h11" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/06/94/82699a10bca87a5556c9c59b5963f2d039dbd239f25bc2a63907a05a14cb/httpcore-1.0.9.tar.gz", hash = "sha256:6e34463af53fd2ab5d807f399a9b45ea31c3dfa2276f15a2c3f00afff6e176e8", size = 85484, upload-time = "2025-04-24T22:06:22.219Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/7e/f5/f66802a942d491edb555dd61e3a9961140fd64c90bce1eafd741609d334d/httpcore-1.0.9-py3-none-any.whl", hash = "sha256:2d400746a40668fc9dec9810239072b40b4484b640a8c38fd654a024c7a1bf55", size = 78784, upload-time = "2025-04-24T22:06:20.566Z" }, +] + +[[package]] +name = "httplib2" +version = "0.31.0" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "pyparsing" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/52/77/6653db69c1f7ecfe5e3f9726fdadc981794656fcd7d98c4209fecfea9993/httplib2-0.31.0.tar.gz", hash = "sha256:ac7ab497c50975147d4f7b1ade44becc7df2f8954d42b38b3d69c515f531135c", size = 250759, upload-time = "2025-09-11T12:16:03.403Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/8c/a2/0d269db0f6163be503775dc8b6a6fa15820cc9fdc866f6ba608d86b721f2/httplib2-0.31.0-py3-none-any.whl", hash = "sha256:b9cd78abea9b4e43a7714c6e0f8b6b8561a6fc1e95d5dbd367f5bf0ef35f5d24", size = 91148, upload-time = "2025-09-11T12:16:01.803Z" }, +] + +[[package]] +name = "httpx" +version = "0.28.1" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "anyio" }, + { name = "certifi" }, + { name = "httpcore" }, + { name = "idna" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/b1/df/48c586a5fe32a0f01324ee087459e112ebb7224f646c0b5023f5e79e9956/httpx-0.28.1.tar.gz", hash = "sha256:75e98c5f16b0f35b567856f597f06ff2270a374470a5c2392242528e3e3e42fc", size = 141406, upload-time = "2024-12-06T15:37:23.222Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/2a/39/e50c7c3a983047577ee07d2a9e53faf5a69493943ec3f6a384bdc792deb2/httpx-0.28.1-py3-none-any.whl", hash = "sha256:d909fcccc110f8c7faf814ca82a9a4d816bc5a6dbfea25d6591d6985b8ba59ad", size = 73517, upload-time = "2024-12-06T15:37:21.509Z" }, +] + +[[package]] +name = "httpx-sse" +version = "0.4.3" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/0f/4c/751061ffa58615a32c31b2d82e8482be8dd4a89154f003147acee90f2be9/httpx_sse-0.4.3.tar.gz", hash = "sha256:9b1ed0127459a66014aec3c56bebd93da3c1bc8bb6618c8082039a44889a755d", size = 15943, upload-time = "2025-10-10T21:48:22.271Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/d2/fd/6668e5aec43ab844de6fc74927e155a3b37bf40d7c3790e49fc0406b6578/httpx_sse-0.4.3-py3-none-any.whl", hash = "sha256:0ac1c9fe3c0afad2e0ebb25a934a59f4c7823b60792691f779fad2c5568830fc", size = 8960, upload-time = "2025-10-10T21:48:21.158Z" }, +] [[package]] name = "idna" @@ -73,25 +726,3596 @@ wheels = [ ] [[package]] -name = "requests" -version = "2.32.5" +name = "jiter" +version = "0.11.1" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/a3/68/0357982493a7b20925aece061f7fb7a2678e3b232f8d73a6edb7e5304443/jiter-0.11.1.tar.gz", hash = "sha256:849dcfc76481c0ea0099391235b7ca97d7279e0fa4c86005457ac7c88e8b76dc", size = 168385, upload-time = "2025-10-17T11:31:15.186Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/7c/4b/e4dd3c76424fad02a601d570f4f2a8438daea47ba081201a721a903d3f4c/jiter-0.11.1-cp313-cp313-macosx_10_12_x86_64.whl", hash = "sha256:71b6a920a5550f057d49d0e8bcc60945a8da998019e83f01adf110e226267663", size = 305272, upload-time = "2025-10-17T11:29:39.249Z" }, + { url = "https://files.pythonhosted.org/packages/67/83/2cd3ad5364191130f4de80eacc907f693723beaab11a46c7d155b07a092c/jiter-0.11.1-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:0b3de72e925388453a5171be83379549300db01284f04d2a6f244d1d8de36f94", size = 314038, upload-time = "2025-10-17T11:29:40.563Z" }, + { url = "https://files.pythonhosted.org/packages/d3/3c/8e67d9ba524e97d2f04c8f406f8769a23205026b13b0938d16646d6e2d3e/jiter-0.11.1-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:cc19dd65a2bd3d9c044c5b4ebf657ca1e6003a97c0fc10f555aa4f7fb9821c00", size = 345977, upload-time = "2025-10-17T11:29:42.009Z" }, + { url = "https://files.pythonhosted.org/packages/8d/a5/489ce64d992c29bccbffabb13961bbb0435e890d7f2d266d1f3df5e917d2/jiter-0.11.1-cp313-cp313-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:d58faaa936743cd1464540562f60b7ce4fd927e695e8bc31b3da5b914baa9abd", size = 364503, upload-time = "2025-10-17T11:29:43.459Z" }, + { url = "https://files.pythonhosted.org/packages/d4/c0/e321dd83ee231d05c8fe4b1a12caf1f0e8c7a949bf4724d58397104f10f2/jiter-0.11.1-cp313-cp313-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:902640c3103625317291cb73773413b4d71847cdf9383ba65528745ff89f1d14", size = 487092, upload-time = "2025-10-17T11:29:44.835Z" }, + { url = "https://files.pythonhosted.org/packages/f9/5e/8f24ec49c8d37bd37f34ec0112e0b1a3b4b5a7b456c8efff1df5e189ad43/jiter-0.11.1-cp313-cp313-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:30405f726e4c2ed487b176c09f8b877a957f535d60c1bf194abb8dadedb5836f", size = 376328, upload-time = "2025-10-17T11:29:46.175Z" }, + { url = "https://files.pythonhosted.org/packages/7f/70/ded107620e809327cf7050727e17ccfa79d6385a771b7fe38fb31318ef00/jiter-0.11.1-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:3217f61728b0baadd2551844870f65219ac4a1285d5e1a4abddff3d51fdabe96", size = 356632, upload-time = "2025-10-17T11:29:47.454Z" }, + { url = "https://files.pythonhosted.org/packages/19/53/c26f7251613f6a9079275ee43c89b8a973a95ff27532c421abc2a87afb04/jiter-0.11.1-cp313-cp313-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:b1364cc90c03a8196f35f396f84029f12abe925415049204446db86598c8b72c", size = 384358, upload-time = "2025-10-17T11:29:49.377Z" }, + { url = "https://files.pythonhosted.org/packages/84/16/e0f2cc61e9c4d0b62f6c1bd9b9781d878a427656f88293e2a5335fa8ff07/jiter-0.11.1-cp313-cp313-musllinux_1_1_aarch64.whl", hash = "sha256:53a54bf8e873820ab186b2dca9f6c3303f00d65ae5e7b7d6bda1b95aa472d646", size = 517279, upload-time = "2025-10-17T11:29:50.968Z" }, + { url = "https://files.pythonhosted.org/packages/60/5c/4cd095eaee68961bca3081acbe7c89e12ae24a5dae5fd5d2a13e01ed2542/jiter-0.11.1-cp313-cp313-musllinux_1_1_x86_64.whl", hash = "sha256:7e29aca023627b0e0c2392d4248f6414d566ff3974fa08ff2ac8dbb96dfee92a", size = 508276, upload-time = "2025-10-17T11:29:52.619Z" }, + { url = "https://files.pythonhosted.org/packages/4f/25/f459240e69b0e09a7706d96ce203ad615ca36b0fe832308d2b7123abf2d0/jiter-0.11.1-cp313-cp313-win32.whl", hash = "sha256:f153e31d8bca11363751e875c0a70b3d25160ecbaee7b51e457f14498fb39d8b", size = 205593, upload-time = "2025-10-17T11:29:53.938Z" }, + { url = "https://files.pythonhosted.org/packages/7c/16/461bafe22bae79bab74e217a09c907481a46d520c36b7b9fe71ee8c9e983/jiter-0.11.1-cp313-cp313-win_amd64.whl", hash = "sha256:f773f84080b667c69c4ea0403fc67bb08b07e2b7ce1ef335dea5868451e60fed", size = 203518, upload-time = "2025-10-17T11:29:55.216Z" }, + { url = "https://files.pythonhosted.org/packages/7b/72/c45de6e320edb4fa165b7b1a414193b3cae302dd82da2169d315dcc78b44/jiter-0.11.1-cp313-cp313-win_arm64.whl", hash = "sha256:635ecd45c04e4c340d2187bcb1cea204c7cc9d32c1364d251564bf42e0e39c2d", size = 188062, upload-time = "2025-10-17T11:29:56.631Z" }, + { url = "https://files.pythonhosted.org/packages/65/9b/4a57922437ca8753ef823f434c2dec5028b237d84fa320f06a3ba1aec6e8/jiter-0.11.1-cp313-cp313t-macosx_11_0_arm64.whl", hash = "sha256:d892b184da4d94d94ddb4031296931c74ec8b325513a541ebfd6dfb9ae89904b", size = 313814, upload-time = "2025-10-17T11:29:58.509Z" }, + { url = "https://files.pythonhosted.org/packages/76/50/62a0683dadca25490a4bedc6a88d59de9af2a3406dd5a576009a73a1d392/jiter-0.11.1-cp313-cp313t-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:aa22c223a3041dacb2fcd37c70dfd648b44662b4a48e242592f95bda5ab09d58", size = 344987, upload-time = "2025-10-17T11:30:00.208Z" }, + { url = "https://files.pythonhosted.org/packages/da/00/2355dbfcbf6cdeaddfdca18287f0f38ae49446bb6378e4a5971e9356fc8a/jiter-0.11.1-cp313-cp313t-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:330e8e6a11ad4980cd66a0f4a3e0e2e0f646c911ce047014f984841924729789", size = 356399, upload-time = "2025-10-17T11:30:02.084Z" }, + { url = "https://files.pythonhosted.org/packages/c9/07/c2bd748d578fa933d894a55bff33f983bc27f75fc4e491b354bef7b78012/jiter-0.11.1-cp313-cp313t-win_amd64.whl", hash = "sha256:09e2e386ebf298547ca3a3704b729471f7ec666c2906c5c26c1a915ea24741ec", size = 203289, upload-time = "2025-10-17T11:30:03.656Z" }, + { url = "https://files.pythonhosted.org/packages/e6/ee/ace64a853a1acbd318eb0ca167bad1cf5ee037207504b83a868a5849747b/jiter-0.11.1-cp313-cp313t-win_arm64.whl", hash = "sha256:fe4a431c291157e11cee7c34627990ea75e8d153894365a3bc84b7a959d23ca8", size = 188284, upload-time = "2025-10-17T11:30:05.046Z" }, + { url = "https://files.pythonhosted.org/packages/8d/00/d6006d069e7b076e4c66af90656b63da9481954f290d5eca8c715f4bf125/jiter-0.11.1-cp314-cp314-macosx_10_12_x86_64.whl", hash = "sha256:0fa1f70da7a8a9713ff8e5f75ec3f90c0c870be6d526aa95e7c906f6a1c8c676", size = 304624, upload-time = "2025-10-17T11:30:06.678Z" }, + { url = "https://files.pythonhosted.org/packages/fc/45/4a0e31eb996b9ccfddbae4d3017b46f358a599ccf2e19fbffa5e531bd304/jiter-0.11.1-cp314-cp314-macosx_11_0_arm64.whl", hash = "sha256:569ee559e5046a42feb6828c55307cf20fe43308e3ae0d8e9e4f8d8634d99944", size = 315042, upload-time = "2025-10-17T11:30:08.87Z" }, + { url = "https://files.pythonhosted.org/packages/e7/91/22f5746f5159a28c76acdc0778801f3c1181799aab196dbea2d29e064968/jiter-0.11.1-cp314-cp314-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:f69955fa1d92e81987f092b233f0be49d4c937da107b7f7dcf56306f1d3fcce9", size = 346357, upload-time = "2025-10-17T11:30:10.222Z" }, + { url = "https://files.pythonhosted.org/packages/f5/4f/57620857d4e1dc75c8ff4856c90cb6c135e61bff9b4ebfb5dc86814e82d7/jiter-0.11.1-cp314-cp314-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:090f4c9d4a825e0fcbd0a2647c9a88a0f366b75654d982d95a9590745ff0c48d", size = 365057, upload-time = "2025-10-17T11:30:11.585Z" }, + { url = "https://files.pythonhosted.org/packages/ce/34/caf7f9cc8ae0a5bb25a5440cc76c7452d264d1b36701b90fdadd28fe08ec/jiter-0.11.1-cp314-cp314-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:bbf3d8cedf9e9d825233e0dcac28ff15c47b7c5512fdfe2e25fd5bbb6e6b0cee", size = 487086, upload-time = "2025-10-17T11:30:13.052Z" }, + { url = "https://files.pythonhosted.org/packages/50/17/85b5857c329d533d433fedf98804ebec696004a1f88cabad202b2ddc55cf/jiter-0.11.1-cp314-cp314-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:2aa9b1958f9c30d3d1a558b75f0626733c60eb9b7774a86b34d88060be1e67fe", size = 376083, upload-time = "2025-10-17T11:30:14.416Z" }, + { url = "https://files.pythonhosted.org/packages/85/d3/2d9f973f828226e6faebdef034097a2918077ea776fb4d88489949024787/jiter-0.11.1-cp314-cp314-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:e42d1ca16590b768c5e7d723055acd2633908baacb3628dd430842e2e035aa90", size = 357825, upload-time = "2025-10-17T11:30:15.765Z" }, + { url = "https://files.pythonhosted.org/packages/f4/55/848d4dabf2c2c236a05468c315c2cb9dc736c5915e65449ccecdba22fb6f/jiter-0.11.1-cp314-cp314-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:5db4c2486a023820b701a17aec9c5a6173c5ba4393f26662f032f2de9c848b0f", size = 383933, upload-time = "2025-10-17T11:30:17.34Z" }, + { url = "https://files.pythonhosted.org/packages/0b/6c/204c95a4fbb0e26dfa7776c8ef4a878d0c0b215868011cc904bf44f707e2/jiter-0.11.1-cp314-cp314-musllinux_1_1_aarch64.whl", hash = "sha256:4573b78777ccfac954859a6eff45cbd9d281d80c8af049d0f1a3d9fc323d5c3a", size = 517118, upload-time = "2025-10-17T11:30:18.684Z" }, + { url = "https://files.pythonhosted.org/packages/88/25/09956644ea5a2b1e7a2a0f665cb69a973b28f4621fa61fc0c0f06ff40a31/jiter-0.11.1-cp314-cp314-musllinux_1_1_x86_64.whl", hash = "sha256:7593ac6f40831d7961cb67633c39b9fef6689a211d7919e958f45710504f52d3", size = 508194, upload-time = "2025-10-17T11:30:20.719Z" }, + { url = "https://files.pythonhosted.org/packages/09/49/4d1657355d7f5c9e783083a03a3f07d5858efa6916a7d9634d07db1c23bd/jiter-0.11.1-cp314-cp314-win32.whl", hash = "sha256:87202ec6ff9626ff5f9351507def98fcf0df60e9a146308e8ab221432228f4ea", size = 203961, upload-time = "2025-10-17T11:30:22.073Z" }, + { url = "https://files.pythonhosted.org/packages/76/bd/f063bd5cc2712e7ca3cf6beda50894418fc0cfeb3f6ff45a12d87af25996/jiter-0.11.1-cp314-cp314-win_amd64.whl", hash = "sha256:a5dd268f6531a182c89d0dd9a3f8848e86e92dfff4201b77a18e6b98aa59798c", size = 202804, upload-time = "2025-10-17T11:30:23.452Z" }, + { url = "https://files.pythonhosted.org/packages/52/ca/4d84193dfafef1020bf0bedd5e1a8d0e89cb67c54b8519040effc694964b/jiter-0.11.1-cp314-cp314-win_arm64.whl", hash = "sha256:5d761f863f912a44748a21b5c4979c04252588ded8d1d2760976d2e42cd8d991", size = 188001, upload-time = "2025-10-17T11:30:24.915Z" }, + { url = "https://files.pythonhosted.org/packages/d5/fa/3b05e5c9d32efc770a8510eeb0b071c42ae93a5b576fd91cee9af91689a1/jiter-0.11.1-cp314-cp314t-macosx_11_0_arm64.whl", hash = "sha256:2cc5a3965285ddc33e0cab933e96b640bc9ba5940cea27ebbbf6695e72d6511c", size = 312561, upload-time = "2025-10-17T11:30:26.742Z" }, + { url = "https://files.pythonhosted.org/packages/50/d3/335822eb216154ddb79a130cbdce88fdf5c3e2b43dc5dba1fd95c485aaf5/jiter-0.11.1-cp314-cp314t-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:6b572b3636a784c2768b2342f36a23078c8d3aa6d8a30745398b1bab58a6f1a8", size = 344551, upload-time = "2025-10-17T11:30:28.252Z" }, + { url = "https://files.pythonhosted.org/packages/31/6d/a0bed13676b1398f9b3ba61f32569f20a3ff270291161100956a577b2dd3/jiter-0.11.1-cp314-cp314t-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:ad93e3d67a981f96596d65d2298fe8d1aa649deb5374a2fb6a434410ee11915e", size = 363051, upload-time = "2025-10-17T11:30:30.009Z" }, + { url = "https://files.pythonhosted.org/packages/a4/03/313eda04aa08545a5a04ed5876e52f49ab76a4d98e54578896ca3e16313e/jiter-0.11.1-cp314-cp314t-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:a83097ce379e202dcc3fe3fc71a16d523d1ee9192c8e4e854158f96b3efe3f2f", size = 485897, upload-time = "2025-10-17T11:30:31.429Z" }, + { url = "https://files.pythonhosted.org/packages/5f/13/a1011b9d325e40b53b1b96a17c010b8646013417f3902f97a86325b19299/jiter-0.11.1-cp314-cp314t-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:7042c51e7fbeca65631eb0c332f90c0c082eab04334e7ccc28a8588e8e2804d9", size = 375224, upload-time = "2025-10-17T11:30:33.18Z" }, + { url = "https://files.pythonhosted.org/packages/92/da/1b45026b19dd39b419e917165ff0ea629dbb95f374a3a13d2df95e40a6ac/jiter-0.11.1-cp314-cp314t-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:0a68d679c0e47649a61df591660507608adc2652442de7ec8276538ac46abe08", size = 356606, upload-time = "2025-10-17T11:30:34.572Z" }, + { url = "https://files.pythonhosted.org/packages/7a/0c/9acb0e54d6a8ba59ce923a180ebe824b4e00e80e56cefde86cc8e0a948be/jiter-0.11.1-cp314-cp314t-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:a1b0da75dbf4b6ec0b3c9e604d1ee8beaf15bc046fff7180f7d89e3cdbd3bb51", size = 384003, upload-time = "2025-10-17T11:30:35.987Z" }, + { url = "https://files.pythonhosted.org/packages/3f/2b/e5a5fe09d6da2145e4eed651e2ce37f3c0cf8016e48b1d302e21fb1628b7/jiter-0.11.1-cp314-cp314t-musllinux_1_1_aarch64.whl", hash = "sha256:69dd514bf0fa31c62147d6002e5ca2b3e7ef5894f5ac6f0a19752385f4e89437", size = 516946, upload-time = "2025-10-17T11:30:37.425Z" }, + { url = "https://files.pythonhosted.org/packages/5f/fe/db936e16e0228d48eb81f9934e8327e9fde5185e84f02174fcd22a01be87/jiter-0.11.1-cp314-cp314t-musllinux_1_1_x86_64.whl", hash = "sha256:bb31ac0b339efa24c0ca606febd8b77ef11c58d09af1b5f2be4c99e907b11111", size = 507614, upload-time = "2025-10-17T11:30:38.977Z" }, + { url = "https://files.pythonhosted.org/packages/86/db/c4438e8febfb303486d13c6b72f5eb71cf851e300a0c1f0b4140018dd31f/jiter-0.11.1-cp314-cp314t-win32.whl", hash = "sha256:b2ce0d6156a1d3ad41da3eec63b17e03e296b78b0e0da660876fccfada86d2f7", size = 204043, upload-time = "2025-10-17T11:30:40.308Z" }, + { url = "https://files.pythonhosted.org/packages/36/59/81badb169212f30f47f817dfaabf965bc9b8204fed906fab58104ee541f9/jiter-0.11.1-cp314-cp314t-win_amd64.whl", hash = "sha256:f4db07d127b54c4a2d43b4cf05ff0193e4f73e0dd90c74037e16df0b29f666e1", size = 204046, upload-time = "2025-10-17T11:30:41.692Z" }, + { url = "https://files.pythonhosted.org/packages/dd/01/43f7b4eb61db3e565574c4c5714685d042fb652f9eef7e5a3de6aafa943a/jiter-0.11.1-cp314-cp314t-win_arm64.whl", hash = "sha256:28e4fdf2d7ebfc935523e50d1efa3970043cfaa161674fe66f9642409d001dfe", size = 188069, upload-time = "2025-10-17T11:30:43.23Z" }, +] + +[[package]] +name = "jsonschema" +version = "4.25.1" source = { registry = "https://pypi.org/simple" } dependencies = [ - { name = "certifi" }, - { name = "charset-normalizer" }, - { name = "idna" }, - { name = "urllib3" }, + { name = "attrs" }, + { name = "jsonschema-specifications" }, + { name = "referencing" }, + { name = "rpds-py" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/c9/74/b3ff8e6c8446842c3f5c837e9c3dfcfe2018ea6ecef224c710c85ef728f4/requests-2.32.5.tar.gz", hash = "sha256:dbba0bac56e100853db0ea71b82b4dfd5fe2bf6d3754a8893c3af500cec7d7cf", size = 134517, upload-time = "2025-08-18T20:46:02.573Z" } +sdist = { url = "https://files.pythonhosted.org/packages/74/69/f7185de793a29082a9f3c7728268ffb31cb5095131a9c139a74078e27336/jsonschema-4.25.1.tar.gz", hash = "sha256:e4a9655ce0da0c0b67a085847e00a3a51449e1157f4f75e9fb5aa545e122eb85", size = 357342, upload-time = "2025-08-18T17:03:50.038Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/1e/db/4254e3eabe8020b458f1a747140d32277ec7a271daf1d235b70dc0b4e6e3/requests-2.32.5-py3-none-any.whl", hash = "sha256:2462f94637a34fd532264295e186976db0f5d453d1cdd31473c85a6a161affb6", size = 64738, upload-time = "2025-08-18T20:46:00.542Z" }, + { url = "https://files.pythonhosted.org/packages/bf/9c/8c95d856233c1f82500c2450b8c68576b4cf1c871db3afac5c34ff84e6fd/jsonschema-4.25.1-py3-none-any.whl", hash = "sha256:3fba0169e345c7175110351d456342c364814cfcf3b964ba4587f22915230a63", size = 90040, upload-time = "2025-08-18T17:03:48.373Z" }, ] [[package]] -name = "urllib3" -version = "2.5.0" +name = "jsonschema-specifications" +version = "2025.9.1" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "referencing" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/19/74/a633ee74eb36c44aa6d1095e7cc5569bebf04342ee146178e2d36600708b/jsonschema_specifications-2025.9.1.tar.gz", hash = "sha256:b540987f239e745613c7a9176f3edb72b832a4ac465cf02712288397832b5e8d", size = 32855, upload-time = "2025-09-08T01:34:59.186Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/41/45/1a4ed80516f02155c51f51e8cedb3c1902296743db0bbc66608a0db2814f/jsonschema_specifications-2025.9.1-py3-none-any.whl", hash = "sha256:98802fee3a11ee76ecaca44429fda8a41bff98b00a0f2838151b113f210cc6fe", size = 18437, upload-time = "2025-09-08T01:34:57.871Z" }, +] + +[[package]] +name = "markdownify" +version = "1.2.0" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "beautifulsoup4" }, + { name = "six" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/83/1b/6f2697b51eaca81f08852fd2734745af15718fea10222a1d40f8a239c4ea/markdownify-1.2.0.tar.gz", hash = "sha256:f6c367c54eb24ee953921804dfe6d6575c5e5b42c643955e7242034435de634c", size = 18771, upload-time = "2025-08-09T17:44:15.302Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/6a/e2/7af643acb4cae0741dffffaa7f3f7c9e7ab4046724543ba1777c401d821c/markdownify-1.2.0-py3-none-any.whl", hash = "sha256:48e150a1c4993d4d50f282f725c0111bd9eb25645d41fa2f543708fd44161351", size = 15561, upload-time = "2025-08-09T17:44:14.074Z" }, +] + +[[package]] +name = "mcp" +version = "1.19.0" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "anyio" }, + { name = "httpx" }, + { name = "httpx-sse" }, + { name = "jsonschema" }, + { name = "pydantic" }, + { name = "pydantic-settings" }, + { name = "python-multipart" }, + { name = "pywin32", marker = "sys_platform == 'win32'" }, + { name = "sse-starlette" }, + { name = "starlette" }, + { name = "uvicorn", marker = "sys_platform != 'emscripten'" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/69/2b/916852a5668f45d8787378461eaa1244876d77575ffef024483c94c0649c/mcp-1.19.0.tar.gz", hash = "sha256:213de0d3cd63f71bc08ffe9cc8d4409cc87acffd383f6195d2ce0457c021b5c1", size = 444163, upload-time = "2025-10-24T01:11:15.839Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/ce/a3/3e71a875a08b6a830b88c40bc413bff01f1650f1efe8a054b5e90a9d4f56/mcp-1.19.0-py3-none-any.whl", hash = "sha256:f5907fe1c0167255f916718f376d05f09a830a215327a3ccdd5ec8a519f2e572", size = 170105, upload-time = "2025-10-24T01:11:14.151Z" }, +] + +[[package]] +name = "multidict" +version = "6.7.0" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/80/1e/5492c365f222f907de1039b91f922b93fa4f764c713ee858d235495d8f50/multidict-6.7.0.tar.gz", hash = "sha256:c6e99d9a65ca282e578dfea819cfa9c0a62b2499d8677392e09feaf305e9e6f5", size = 101834, upload-time = "2025-10-06T14:52:30.657Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/d2/86/33272a544eeb36d66e4d9a920602d1a2f57d4ebea4ef3cdfe5a912574c95/multidict-6.7.0-cp313-cp313-macosx_10_13_universal2.whl", hash = "sha256:bee7c0588aa0076ce77c0ea5d19a68d76ad81fcd9fe8501003b9a24f9d4000f6", size = 76135, upload-time = "2025-10-06T14:49:54.26Z" }, + { url = "https://files.pythonhosted.org/packages/91/1c/eb97db117a1ebe46d457a3d235a7b9d2e6dcab174f42d1b67663dd9e5371/multidict-6.7.0-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:7ef6b61cad77091056ce0e7ce69814ef72afacb150b7ac6a3e9470def2198159", size = 45117, upload-time = "2025-10-06T14:49:55.82Z" }, + { url = "https://files.pythonhosted.org/packages/f1/d8/6c3442322e41fb1dd4de8bd67bfd11cd72352ac131f6368315617de752f1/multidict-6.7.0-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:9c0359b1ec12b1d6849c59f9d319610b7f20ef990a6d454ab151aa0e3b9f78ca", size = 43472, upload-time = "2025-10-06T14:49:57.048Z" }, + { url = "https://files.pythonhosted.org/packages/75/3f/e2639e80325af0b6c6febdf8e57cc07043ff15f57fa1ef808f4ccb5ac4cd/multidict-6.7.0-cp313-cp313-manylinux1_i686.manylinux_2_28_i686.manylinux_2_5_i686.whl", hash = "sha256:cd240939f71c64bd658f186330603aac1a9a81bf6273f523fca63673cb7378a8", size = 249342, upload-time = "2025-10-06T14:49:58.368Z" }, + { url = "https://files.pythonhosted.org/packages/5d/cc/84e0585f805cbeaa9cbdaa95f9a3d6aed745b9d25700623ac89a6ecff400/multidict-6.7.0-cp313-cp313-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:a60a4d75718a5efa473ebd5ab685786ba0c67b8381f781d1be14da49f1a2dc60", size = 257082, upload-time = "2025-10-06T14:49:59.89Z" }, + { url = "https://files.pythonhosted.org/packages/b0/9c/ac851c107c92289acbbf5cfb485694084690c1b17e555f44952c26ddc5bd/multidict-6.7.0-cp313-cp313-manylinux2014_armv7l.manylinux_2_17_armv7l.manylinux_2_31_armv7l.whl", hash = "sha256:53a42d364f323275126aff81fb67c5ca1b7a04fda0546245730a55c8c5f24bc4", size = 240704, upload-time = "2025-10-06T14:50:01.485Z" }, + { url = "https://files.pythonhosted.org/packages/50/cc/5f93e99427248c09da95b62d64b25748a5f5c98c7c2ab09825a1d6af0e15/multidict-6.7.0-cp313-cp313-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:3b29b980d0ddbecb736735ee5bef69bb2ddca56eff603c86f3f29a1128299b4f", size = 266355, upload-time = "2025-10-06T14:50:02.955Z" }, + { url = "https://files.pythonhosted.org/packages/ec/0c/2ec1d883ceb79c6f7f6d7ad90c919c898f5d1c6ea96d322751420211e072/multidict-6.7.0-cp313-cp313-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:f8a93b1c0ed2d04b97a5e9336fd2d33371b9a6e29ab7dd6503d63407c20ffbaf", size = 267259, upload-time = "2025-10-06T14:50:04.446Z" }, + { url = "https://files.pythonhosted.org/packages/c6/2d/f0b184fa88d6630aa267680bdb8623fb69cb0d024b8c6f0d23f9a0f406d3/multidict-6.7.0-cp313-cp313-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:9ff96e8815eecacc6645da76c413eb3b3d34cfca256c70b16b286a687d013c32", size = 254903, upload-time = "2025-10-06T14:50:05.98Z" }, + { url = "https://files.pythonhosted.org/packages/06/c9/11ea263ad0df7dfabcad404feb3c0dd40b131bc7f232d5537f2fb1356951/multidict-6.7.0-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:7516c579652f6a6be0e266aec0acd0db80829ca305c3d771ed898538804c2036", size = 252365, upload-time = "2025-10-06T14:50:07.511Z" }, + { url = "https://files.pythonhosted.org/packages/41/88/d714b86ee2c17d6e09850c70c9d310abac3d808ab49dfa16b43aba9d53fd/multidict-6.7.0-cp313-cp313-musllinux_1_2_armv7l.whl", hash = "sha256:040f393368e63fb0f3330e70c26bfd336656bed925e5cbe17c9da839a6ab13ec", size = 250062, upload-time = "2025-10-06T14:50:09.074Z" }, + { url = "https://files.pythonhosted.org/packages/15/fe/ad407bb9e818c2b31383f6131ca19ea7e35ce93cf1310fce69f12e89de75/multidict-6.7.0-cp313-cp313-musllinux_1_2_i686.whl", hash = "sha256:b3bc26a951007b1057a1c543af845f1c7e3e71cc240ed1ace7bf4484aa99196e", size = 249683, upload-time = "2025-10-06T14:50:10.714Z" }, + { url = "https://files.pythonhosted.org/packages/8c/a4/a89abdb0229e533fb925e7c6e5c40201c2873efebc9abaf14046a4536ee6/multidict-6.7.0-cp313-cp313-musllinux_1_2_ppc64le.whl", hash = "sha256:7b022717c748dd1992a83e219587aabe45980d88969f01b316e78683e6285f64", size = 261254, upload-time = "2025-10-06T14:50:12.28Z" }, + { url = "https://files.pythonhosted.org/packages/8d/aa/0e2b27bd88b40a4fb8dc53dd74eecac70edaa4c1dd0707eb2164da3675b3/multidict-6.7.0-cp313-cp313-musllinux_1_2_s390x.whl", hash = "sha256:9600082733859f00d79dee64effc7aef1beb26adb297416a4ad2116fd61374bd", size = 257967, upload-time = "2025-10-06T14:50:14.16Z" }, + { url = "https://files.pythonhosted.org/packages/d0/8e/0c67b7120d5d5f6d874ed85a085f9dc770a7f9d8813e80f44a9fec820bb7/multidict-6.7.0-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:94218fcec4d72bc61df51c198d098ce2b378e0ccbac41ddbed5ef44092913288", size = 250085, upload-time = "2025-10-06T14:50:15.639Z" }, + { url = "https://files.pythonhosted.org/packages/ba/55/b73e1d624ea4b8fd4dd07a3bb70f6e4c7c6c5d9d640a41c6ffe5cdbd2a55/multidict-6.7.0-cp313-cp313-win32.whl", hash = "sha256:a37bd74c3fa9d00be2d7b8eca074dc56bd8077ddd2917a839bd989612671ed17", size = 41713, upload-time = "2025-10-06T14:50:17.066Z" }, + { url = "https://files.pythonhosted.org/packages/32/31/75c59e7d3b4205075b4c183fa4ca398a2daf2303ddf616b04ae6ef55cffe/multidict-6.7.0-cp313-cp313-win_amd64.whl", hash = "sha256:30d193c6cc6d559db42b6bcec8a5d395d34d60c9877a0b71ecd7c204fcf15390", size = 45915, upload-time = "2025-10-06T14:50:18.264Z" }, + { url = "https://files.pythonhosted.org/packages/31/2a/8987831e811f1184c22bc2e45844934385363ee61c0a2dcfa8f71b87e608/multidict-6.7.0-cp313-cp313-win_arm64.whl", hash = "sha256:ea3334cabe4d41b7ccd01e4d349828678794edbc2d3ae97fc162a3312095092e", size = 43077, upload-time = "2025-10-06T14:50:19.853Z" }, + { url = "https://files.pythonhosted.org/packages/e8/68/7b3a5170a382a340147337b300b9eb25a9ddb573bcdfff19c0fa3f31ffba/multidict-6.7.0-cp313-cp313t-macosx_10_13_universal2.whl", hash = "sha256:ad9ce259f50abd98a1ca0aa6e490b58c316a0fce0617f609723e40804add2c00", size = 83114, upload-time = "2025-10-06T14:50:21.223Z" }, + { url = "https://files.pythonhosted.org/packages/55/5c/3fa2d07c84df4e302060f555bbf539310980362236ad49f50eeb0a1c1eb9/multidict-6.7.0-cp313-cp313t-macosx_10_13_x86_64.whl", hash = "sha256:07f5594ac6d084cbb5de2df218d78baf55ef150b91f0ff8a21cc7a2e3a5a58eb", size = 48442, upload-time = "2025-10-06T14:50:22.871Z" }, + { url = "https://files.pythonhosted.org/packages/fc/56/67212d33239797f9bd91962bb899d72bb0f4c35a8652dcdb8ed049bef878/multidict-6.7.0-cp313-cp313t-macosx_11_0_arm64.whl", hash = "sha256:0591b48acf279821a579282444814a2d8d0af624ae0bc600aa4d1b920b6e924b", size = 46885, upload-time = "2025-10-06T14:50:24.258Z" }, + { url = "https://files.pythonhosted.org/packages/46/d1/908f896224290350721597a61a69cd19b89ad8ee0ae1f38b3f5cd12ea2ac/multidict-6.7.0-cp313-cp313t-manylinux1_i686.manylinux_2_28_i686.manylinux_2_5_i686.whl", hash = "sha256:749a72584761531d2b9467cfbdfd29487ee21124c304c4b6cb760d8777b27f9c", size = 242588, upload-time = "2025-10-06T14:50:25.716Z" }, + { url = "https://files.pythonhosted.org/packages/ab/67/8604288bbd68680eee0ab568fdcb56171d8b23a01bcd5cb0c8fedf6e5d99/multidict-6.7.0-cp313-cp313t-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:6b4c3d199f953acd5b446bf7c0de1fe25d94e09e79086f8dc2f48a11a129cdf1", size = 249966, upload-time = "2025-10-06T14:50:28.192Z" }, + { url = "https://files.pythonhosted.org/packages/20/33/9228d76339f1ba51e3efef7da3ebd91964d3006217aae13211653193c3ff/multidict-6.7.0-cp313-cp313t-manylinux2014_armv7l.manylinux_2_17_armv7l.manylinux_2_31_armv7l.whl", hash = "sha256:9fb0211dfc3b51efea2f349ec92c114d7754dd62c01f81c3e32b765b70c45c9b", size = 228618, upload-time = "2025-10-06T14:50:29.82Z" }, + { url = "https://files.pythonhosted.org/packages/f8/2d/25d9b566d10cab1c42b3b9e5b11ef79c9111eaf4463b8c257a3bd89e0ead/multidict-6.7.0-cp313-cp313t-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:a027ec240fe73a8d6281872690b988eed307cd7d91b23998ff35ff577ca688b5", size = 257539, upload-time = "2025-10-06T14:50:31.731Z" }, + { url = "https://files.pythonhosted.org/packages/b6/b1/8d1a965e6637fc33de3c0d8f414485c2b7e4af00f42cab3d84e7b955c222/multidict-6.7.0-cp313-cp313t-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:d1d964afecdf3a8288789df2f5751dc0a8261138c3768d9af117ed384e538fad", size = 256345, upload-time = "2025-10-06T14:50:33.26Z" }, + { url = "https://files.pythonhosted.org/packages/ba/0c/06b5a8adbdeedada6f4fb8d8f193d44a347223b11939b42953eeb6530b6b/multidict-6.7.0-cp313-cp313t-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:caf53b15b1b7df9fbd0709aa01409000a2b4dd03a5f6f5cc548183c7c8f8b63c", size = 247934, upload-time = "2025-10-06T14:50:34.808Z" }, + { url = "https://files.pythonhosted.org/packages/8f/31/b2491b5fe167ca044c6eb4b8f2c9f3b8a00b24c432c365358eadac5d7625/multidict-6.7.0-cp313-cp313t-musllinux_1_2_aarch64.whl", hash = "sha256:654030da3197d927f05a536a66186070e98765aa5142794c9904555d3a9d8fb5", size = 245243, upload-time = "2025-10-06T14:50:36.436Z" }, + { url = "https://files.pythonhosted.org/packages/61/1a/982913957cb90406c8c94f53001abd9eafc271cb3e70ff6371590bec478e/multidict-6.7.0-cp313-cp313t-musllinux_1_2_armv7l.whl", hash = "sha256:2090d3718829d1e484706a2f525e50c892237b2bf9b17a79b059cb98cddc2f10", size = 235878, upload-time = "2025-10-06T14:50:37.953Z" }, + { url = "https://files.pythonhosted.org/packages/be/c0/21435d804c1a1cf7a2608593f4d19bca5bcbd7a81a70b253fdd1c12af9c0/multidict-6.7.0-cp313-cp313t-musllinux_1_2_i686.whl", hash = "sha256:2d2cfeec3f6f45651b3d408c4acec0ebf3daa9bc8a112a084206f5db5d05b754", size = 243452, upload-time = "2025-10-06T14:50:39.574Z" }, + { url = "https://files.pythonhosted.org/packages/54/0a/4349d540d4a883863191be6eb9a928846d4ec0ea007d3dcd36323bb058ac/multidict-6.7.0-cp313-cp313t-musllinux_1_2_ppc64le.whl", hash = "sha256:4ef089f985b8c194d341eb2c24ae6e7408c9a0e2e5658699c92f497437d88c3c", size = 252312, upload-time = "2025-10-06T14:50:41.612Z" }, + { url = "https://files.pythonhosted.org/packages/26/64/d5416038dbda1488daf16b676e4dbfd9674dde10a0cc8f4fc2b502d8125d/multidict-6.7.0-cp313-cp313t-musllinux_1_2_s390x.whl", hash = "sha256:e93a0617cd16998784bf4414c7e40f17a35d2350e5c6f0bd900d3a8e02bd3762", size = 246935, upload-time = "2025-10-06T14:50:43.972Z" }, + { url = "https://files.pythonhosted.org/packages/9f/8c/8290c50d14e49f35e0bd4abc25e1bc7711149ca9588ab7d04f886cdf03d9/multidict-6.7.0-cp313-cp313t-musllinux_1_2_x86_64.whl", hash = "sha256:f0feece2ef8ebc42ed9e2e8c78fc4aa3cf455733b507c09ef7406364c94376c6", size = 243385, upload-time = "2025-10-06T14:50:45.648Z" }, + { url = "https://files.pythonhosted.org/packages/ef/a0/f83ae75e42d694b3fbad3e047670e511c138be747bc713cf1b10d5096416/multidict-6.7.0-cp313-cp313t-win32.whl", hash = "sha256:19a1d55338ec1be74ef62440ca9e04a2f001a04d0cc49a4983dc320ff0f3212d", size = 47777, upload-time = "2025-10-06T14:50:47.154Z" }, + { url = "https://files.pythonhosted.org/packages/dc/80/9b174a92814a3830b7357307a792300f42c9e94664b01dee8e457551fa66/multidict-6.7.0-cp313-cp313t-win_amd64.whl", hash = "sha256:3da4fb467498df97e986af166b12d01f05d2e04f978a9c1c680ea1988e0bc4b6", size = 53104, upload-time = "2025-10-06T14:50:48.851Z" }, + { url = "https://files.pythonhosted.org/packages/cc/28/04baeaf0428d95bb7a7bea0e691ba2f31394338ba424fb0679a9ed0f4c09/multidict-6.7.0-cp313-cp313t-win_arm64.whl", hash = "sha256:b4121773c49a0776461f4a904cdf6264c88e42218aaa8407e803ca8025872792", size = 45503, upload-time = "2025-10-06T14:50:50.16Z" }, + { url = "https://files.pythonhosted.org/packages/e2/b1/3da6934455dd4b261d4c72f897e3a5728eba81db59959f3a639245891baa/multidict-6.7.0-cp314-cp314-macosx_10_13_universal2.whl", hash = "sha256:3bab1e4aff7adaa34410f93b1f8e57c4b36b9af0426a76003f441ee1d3c7e842", size = 75128, upload-time = "2025-10-06T14:50:51.92Z" }, + { url = "https://files.pythonhosted.org/packages/14/2c/f069cab5b51d175a1a2cb4ccdf7a2c2dabd58aa5bd933fa036a8d15e2404/multidict-6.7.0-cp314-cp314-macosx_10_13_x86_64.whl", hash = "sha256:b8512bac933afc3e45fb2b18da8e59b78d4f408399a960339598374d4ae3b56b", size = 44410, upload-time = "2025-10-06T14:50:53.275Z" }, + { url = "https://files.pythonhosted.org/packages/42/e2/64bb41266427af6642b6b128e8774ed84c11b80a90702c13ac0a86bb10cc/multidict-6.7.0-cp314-cp314-macosx_11_0_arm64.whl", hash = "sha256:79dcf9e477bc65414ebfea98ffd013cb39552b5ecd62908752e0e413d6d06e38", size = 43205, upload-time = "2025-10-06T14:50:54.911Z" }, + { url = "https://files.pythonhosted.org/packages/02/68/6b086fef8a3f1a8541b9236c594f0c9245617c29841f2e0395d979485cde/multidict-6.7.0-cp314-cp314-manylinux1_i686.manylinux_2_28_i686.manylinux_2_5_i686.whl", hash = "sha256:31bae522710064b5cbeddaf2e9f32b1abab70ac6ac91d42572502299e9953128", size = 245084, upload-time = "2025-10-06T14:50:56.369Z" }, + { url = "https://files.pythonhosted.org/packages/15/ee/f524093232007cd7a75c1d132df70f235cfd590a7c9eaccd7ff422ef4ae8/multidict-6.7.0-cp314-cp314-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:4a0df7ff02397bb63e2fd22af2c87dfa39e8c7f12947bc524dbdc528282c7e34", size = 252667, upload-time = "2025-10-06T14:50:57.991Z" }, + { url = "https://files.pythonhosted.org/packages/02/a5/eeb3f43ab45878f1895118c3ef157a480db58ede3f248e29b5354139c2c9/multidict-6.7.0-cp314-cp314-manylinux2014_armv7l.manylinux_2_17_armv7l.manylinux_2_31_armv7l.whl", hash = "sha256:7a0222514e8e4c514660e182d5156a415c13ef0aabbd71682fc714e327b95e99", size = 233590, upload-time = "2025-10-06T14:50:59.589Z" }, + { url = "https://files.pythonhosted.org/packages/6a/1e/76d02f8270b97269d7e3dbd45644b1785bda457b474315f8cf999525a193/multidict-6.7.0-cp314-cp314-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:2397ab4daaf2698eb51a76721e98db21ce4f52339e535725de03ea962b5a3202", size = 264112, upload-time = "2025-10-06T14:51:01.183Z" }, + { url = "https://files.pythonhosted.org/packages/76/0b/c28a70ecb58963847c2a8efe334904cd254812b10e535aefb3bcce513918/multidict-6.7.0-cp314-cp314-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:8891681594162635948a636c9fe0ff21746aeb3dd5463f6e25d9bea3a8a39ca1", size = 261194, upload-time = "2025-10-06T14:51:02.794Z" }, + { url = "https://files.pythonhosted.org/packages/b4/63/2ab26e4209773223159b83aa32721b4021ffb08102f8ac7d689c943fded1/multidict-6.7.0-cp314-cp314-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:18706cc31dbf402a7945916dd5cddf160251b6dab8a2c5f3d6d5a55949f676b3", size = 248510, upload-time = "2025-10-06T14:51:04.724Z" }, + { url = "https://files.pythonhosted.org/packages/93/cd/06c1fa8282af1d1c46fd55c10a7930af652afdce43999501d4d68664170c/multidict-6.7.0-cp314-cp314-musllinux_1_2_aarch64.whl", hash = "sha256:f844a1bbf1d207dd311a56f383f7eda2d0e134921d45751842d8235e7778965d", size = 248395, upload-time = "2025-10-06T14:51:06.306Z" }, + { url = "https://files.pythonhosted.org/packages/99/ac/82cb419dd6b04ccf9e7e61befc00c77614fc8134362488b553402ecd55ce/multidict-6.7.0-cp314-cp314-musllinux_1_2_armv7l.whl", hash = "sha256:d4393e3581e84e5645506923816b9cc81f5609a778c7e7534054091acc64d1c6", size = 239520, upload-time = "2025-10-06T14:51:08.091Z" }, + { url = "https://files.pythonhosted.org/packages/fa/f3/a0f9bf09493421bd8716a362e0cd1d244f5a6550f5beffdd6b47e885b331/multidict-6.7.0-cp314-cp314-musllinux_1_2_i686.whl", hash = "sha256:fbd18dc82d7bf274b37aa48d664534330af744e03bccf696d6f4c6042e7d19e7", size = 245479, upload-time = "2025-10-06T14:51:10.365Z" }, + { url = "https://files.pythonhosted.org/packages/8d/01/476d38fc73a212843f43c852b0eee266b6971f0e28329c2184a8df90c376/multidict-6.7.0-cp314-cp314-musllinux_1_2_ppc64le.whl", hash = "sha256:b6234e14f9314731ec45c42fc4554b88133ad53a09092cc48a88e771c125dadb", size = 258903, upload-time = "2025-10-06T14:51:12.466Z" }, + { url = "https://files.pythonhosted.org/packages/49/6d/23faeb0868adba613b817d0e69c5f15531b24d462af8012c4f6de4fa8dc3/multidict-6.7.0-cp314-cp314-musllinux_1_2_s390x.whl", hash = "sha256:08d4379f9744d8f78d98c8673c06e202ffa88296f009c71bbafe8a6bf847d01f", size = 252333, upload-time = "2025-10-06T14:51:14.48Z" }, + { url = "https://files.pythonhosted.org/packages/1e/cc/48d02ac22b30fa247f7dad82866e4b1015431092f4ba6ebc7e77596e0b18/multidict-6.7.0-cp314-cp314-musllinux_1_2_x86_64.whl", hash = "sha256:9fe04da3f79387f450fd0061d4dd2e45a72749d31bf634aecc9e27f24fdc4b3f", size = 243411, upload-time = "2025-10-06T14:51:16.072Z" }, + { url = "https://files.pythonhosted.org/packages/4a/03/29a8bf5a18abf1fe34535c88adbdfa88c9fb869b5a3b120692c64abe8284/multidict-6.7.0-cp314-cp314-win32.whl", hash = "sha256:fbafe31d191dfa7c4c51f7a6149c9fb7e914dcf9ffead27dcfd9f1ae382b3885", size = 40940, upload-time = "2025-10-06T14:51:17.544Z" }, + { url = "https://files.pythonhosted.org/packages/82/16/7ed27b680791b939de138f906d5cf2b4657b0d45ca6f5dd6236fdddafb1a/multidict-6.7.0-cp314-cp314-win_amd64.whl", hash = "sha256:2f67396ec0310764b9222a1728ced1ab638f61aadc6226f17a71dd9324f9a99c", size = 45087, upload-time = "2025-10-06T14:51:18.875Z" }, + { url = "https://files.pythonhosted.org/packages/cd/3c/e3e62eb35a1950292fe39315d3c89941e30a9d07d5d2df42965ab041da43/multidict-6.7.0-cp314-cp314-win_arm64.whl", hash = "sha256:ba672b26069957ee369cfa7fc180dde1fc6f176eaf1e6beaf61fbebbd3d9c000", size = 42368, upload-time = "2025-10-06T14:51:20.225Z" }, + { url = "https://files.pythonhosted.org/packages/8b/40/cd499bd0dbc5f1136726db3153042a735fffd0d77268e2ee20d5f33c010f/multidict-6.7.0-cp314-cp314t-macosx_10_13_universal2.whl", hash = "sha256:c1dcc7524066fa918c6a27d61444d4ee7900ec635779058571f70d042d86ed63", size = 82326, upload-time = "2025-10-06T14:51:21.588Z" }, + { url = "https://files.pythonhosted.org/packages/13/8a/18e031eca251c8df76daf0288e6790561806e439f5ce99a170b4af30676b/multidict-6.7.0-cp314-cp314t-macosx_10_13_x86_64.whl", hash = "sha256:27e0b36c2d388dc7b6ced3406671b401e84ad7eb0656b8f3a2f46ed0ce483718", size = 48065, upload-time = "2025-10-06T14:51:22.93Z" }, + { url = "https://files.pythonhosted.org/packages/40/71/5e6701277470a87d234e433fb0a3a7deaf3bcd92566e421e7ae9776319de/multidict-6.7.0-cp314-cp314t-macosx_11_0_arm64.whl", hash = "sha256:2a7baa46a22e77f0988e3b23d4ede5513ebec1929e34ee9495be535662c0dfe2", size = 46475, upload-time = "2025-10-06T14:51:24.352Z" }, + { url = "https://files.pythonhosted.org/packages/fe/6a/bab00cbab6d9cfb57afe1663318f72ec28289ea03fd4e8236bb78429893a/multidict-6.7.0-cp314-cp314t-manylinux1_i686.manylinux_2_28_i686.manylinux_2_5_i686.whl", hash = "sha256:7bf77f54997a9166a2f5675d1201520586439424c2511723a7312bdb4bcc034e", size = 239324, upload-time = "2025-10-06T14:51:25.822Z" }, + { url = "https://files.pythonhosted.org/packages/2a/5f/8de95f629fc22a7769ade8b41028e3e5a822c1f8904f618d175945a81ad3/multidict-6.7.0-cp314-cp314t-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:e011555abada53f1578d63389610ac8a5400fc70ce71156b0aa30d326f1a5064", size = 246877, upload-time = "2025-10-06T14:51:27.604Z" }, + { url = "https://files.pythonhosted.org/packages/23/b4/38881a960458f25b89e9f4a4fdcb02ac101cfa710190db6e5528841e67de/multidict-6.7.0-cp314-cp314t-manylinux2014_armv7l.manylinux_2_17_armv7l.manylinux_2_31_armv7l.whl", hash = "sha256:28b37063541b897fd6a318007373930a75ca6d6ac7c940dbe14731ffdd8d498e", size = 225824, upload-time = "2025-10-06T14:51:29.664Z" }, + { url = "https://files.pythonhosted.org/packages/1e/39/6566210c83f8a261575f18e7144736059f0c460b362e96e9cf797a24b8e7/multidict-6.7.0-cp314-cp314t-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:05047ada7a2fde2631a0ed706f1fd68b169a681dfe5e4cf0f8e4cb6618bbc2cd", size = 253558, upload-time = "2025-10-06T14:51:31.684Z" }, + { url = "https://files.pythonhosted.org/packages/00/a3/67f18315100f64c269f46e6c0319fa87ba68f0f64f2b8e7fd7c72b913a0b/multidict-6.7.0-cp314-cp314t-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:716133f7d1d946a4e1b91b1756b23c088881e70ff180c24e864c26192ad7534a", size = 252339, upload-time = "2025-10-06T14:51:33.699Z" }, + { url = "https://files.pythonhosted.org/packages/c8/2a/1cb77266afee2458d82f50da41beba02159b1d6b1f7973afc9a1cad1499b/multidict-6.7.0-cp314-cp314t-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:d1bed1b467ef657f2a0ae62844a607909ef1c6889562de5e1d505f74457d0b96", size = 244895, upload-time = "2025-10-06T14:51:36.189Z" }, + { url = "https://files.pythonhosted.org/packages/dd/72/09fa7dd487f119b2eb9524946ddd36e2067c08510576d43ff68469563b3b/multidict-6.7.0-cp314-cp314t-musllinux_1_2_aarch64.whl", hash = "sha256:ca43bdfa5d37bd6aee89d85e1d0831fb86e25541be7e9d376ead1b28974f8e5e", size = 241862, upload-time = "2025-10-06T14:51:41.291Z" }, + { url = "https://files.pythonhosted.org/packages/65/92/bc1f8bd0853d8669300f732c801974dfc3702c3eeadae2f60cef54dc69d7/multidict-6.7.0-cp314-cp314t-musllinux_1_2_armv7l.whl", hash = "sha256:44b546bd3eb645fd26fb949e43c02a25a2e632e2ca21a35e2e132c8105dc8599", size = 232376, upload-time = "2025-10-06T14:51:43.55Z" }, + { url = "https://files.pythonhosted.org/packages/09/86/ac39399e5cb9d0c2ac8ef6e10a768e4d3bc933ac808d49c41f9dc23337eb/multidict-6.7.0-cp314-cp314t-musllinux_1_2_i686.whl", hash = "sha256:a6ef16328011d3f468e7ebc326f24c1445f001ca1dec335b2f8e66bed3006394", size = 240272, upload-time = "2025-10-06T14:51:45.265Z" }, + { url = "https://files.pythonhosted.org/packages/3d/b6/fed5ac6b8563ec72df6cb1ea8dac6d17f0a4a1f65045f66b6d3bf1497c02/multidict-6.7.0-cp314-cp314t-musllinux_1_2_ppc64le.whl", hash = "sha256:5aa873cbc8e593d361ae65c68f85faadd755c3295ea2c12040ee146802f23b38", size = 248774, upload-time = "2025-10-06T14:51:46.836Z" }, + { url = "https://files.pythonhosted.org/packages/6b/8d/b954d8c0dc132b68f760aefd45870978deec6818897389dace00fcde32ff/multidict-6.7.0-cp314-cp314t-musllinux_1_2_s390x.whl", hash = "sha256:3d7b6ccce016e29df4b7ca819659f516f0bc7a4b3efa3bb2012ba06431b044f9", size = 242731, upload-time = "2025-10-06T14:51:48.541Z" }, + { url = "https://files.pythonhosted.org/packages/16/9d/a2dac7009125d3540c2f54e194829ea18ac53716c61b655d8ed300120b0f/multidict-6.7.0-cp314-cp314t-musllinux_1_2_x86_64.whl", hash = "sha256:171b73bd4ee683d307599b66793ac80981b06f069b62eea1c9e29c9241aa66b0", size = 240193, upload-time = "2025-10-06T14:51:50.355Z" }, + { url = "https://files.pythonhosted.org/packages/39/ca/c05f144128ea232ae2178b008d5011d4e2cea86e4ee8c85c2631b1b94802/multidict-6.7.0-cp314-cp314t-win32.whl", hash = "sha256:b2d7f80c4e1fd010b07cb26820aae86b7e73b681ee4889684fb8d2d4537aab13", size = 48023, upload-time = "2025-10-06T14:51:51.883Z" }, + { url = "https://files.pythonhosted.org/packages/ba/8f/0a60e501584145588be1af5cc829265701ba3c35a64aec8e07cbb71d39bb/multidict-6.7.0-cp314-cp314t-win_amd64.whl", hash = "sha256:09929cab6fcb68122776d575e03c6cc64ee0b8fca48d17e135474b042ce515cd", size = 53507, upload-time = "2025-10-06T14:51:53.672Z" }, + { url = "https://files.pythonhosted.org/packages/7f/ae/3148b988a9c6239903e786eac19c889fab607c31d6efa7fb2147e5680f23/multidict-6.7.0-cp314-cp314t-win_arm64.whl", hash = "sha256:cc41db090ed742f32bd2d2c721861725e6109681eddf835d0a82bd3a5c382827", size = 44804, upload-time = "2025-10-06T14:51:55.415Z" }, + { url = "https://files.pythonhosted.org/packages/b7/da/7d22601b625e241d4f23ef1ebff8acfc60da633c9e7e7922e24d10f592b3/multidict-6.7.0-py3-none-any.whl", hash = "sha256:394fc5c42a333c9ffc3e421a4c85e08580d990e08b99f6bf35b4132114c5dcb3", size = 12317, upload-time = "2025-10-06T14:52:29.272Z" }, +] + +[[package]] +name = "oauthlib" +version = "3.3.1" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/0b/5f/19930f824ffeb0ad4372da4812c50edbd1434f678c90c2733e1188edfc63/oauthlib-3.3.1.tar.gz", hash = "sha256:0f0f8aa759826a193cf66c12ea1af1637f87b9b4622d46e866952bb022e538c9", size = 185918, upload-time = "2025-06-19T22:48:08.269Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/be/9c/92789c596b8df838baa98fa71844d84283302f7604ed565dafe5a6b5041a/oauthlib-3.3.1-py3-none-any.whl", hash = "sha256:88119c938d2b8fb88561af5f6ee0eec8cc8d552b7bb1f712743136eb7523b7a1", size = 160065, upload-time = "2025-06-19T22:48:06.508Z" }, +] + +[[package]] +name = "ollama" +version = "0.6.0" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "httpx" }, + { name = "pydantic" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/d6/47/f9ee32467fe92744474a8c72e138113f3b529fc266eea76abfdec9a33f3b/ollama-0.6.0.tar.gz", hash = "sha256:da2b2d846b5944cfbcee1ca1e6ee0585f6c9d45a2fe9467cbcd096a37383da2f", size = 50811, upload-time = "2025-09-24T22:46:02.417Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/b5/c1/edc9f41b425ca40b26b7c104c5f6841a4537bb2552bfa6ca66e81405bb95/ollama-0.6.0-py3-none-any.whl", hash = "sha256:534511b3ccea2dff419ae06c3b58d7f217c55be7897c8ce5868dfb6b219cf7a0", size = 14130, upload-time = "2025-09-24T22:46:01.19Z" }, +] + +[[package]] +name = "openai" +version = "1.109.1" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "anyio" }, + { name = "distro" }, + { name = "httpx" }, + { name = "jiter" }, + { name = "pydantic" }, + { name = "sniffio" }, + { name = "tqdm" }, + { name = "typing-extensions" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/c6/a1/a303104dc55fc546a3f6914c842d3da471c64eec92043aef8f652eb6c524/openai-1.109.1.tar.gz", hash = "sha256:d173ed8dbca665892a6db099b4a2dfac624f94d20a93f46eb0b56aae940ed869", size = 564133, upload-time = "2025-09-24T13:00:53.075Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/1d/2a/7dd3d207ec669cacc1f186fd856a0f61dbc255d24f6fdc1a6715d6051b0f/openai-1.109.1-py3-none-any.whl", hash = "sha256:6bcaf57086cf59159b8e27447e4e7dd019db5d29a438072fbd49c290c7e65315", size = 948627, upload-time = "2025-09-24T13:00:50.754Z" }, +] + +[[package]] +name = "pillow" +version = "12.0.0" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/5a/b0/cace85a1b0c9775a9f8f5d5423c8261c858760e2466c79b2dd184638b056/pillow-12.0.0.tar.gz", hash = "sha256:87d4f8125c9988bfbed67af47dd7a953e2fc7b0cc1e7800ec6d2080d490bb353", size = 47008828, upload-time = "2025-10-15T18:24:14.008Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/62/f2/de993bb2d21b33a98d031ecf6a978e4b61da207bef02f7b43093774c480d/pillow-12.0.0-cp313-cp313-ios_13_0_arm64_iphoneos.whl", hash = "sha256:0869154a2d0546545cde61d1789a6524319fc1897d9ee31218eae7a60ccc5643", size = 4045493, upload-time = "2025-10-15T18:22:25.758Z" }, + { url = "https://files.pythonhosted.org/packages/0e/b6/bc8d0c4c9f6f111a783d045310945deb769b806d7574764234ffd50bc5ea/pillow-12.0.0-cp313-cp313-ios_13_0_arm64_iphonesimulator.whl", hash = "sha256:a7921c5a6d31b3d756ec980f2f47c0cfdbce0fc48c22a39347a895f41f4a6ea4", size = 4120461, upload-time = "2025-10-15T18:22:27.286Z" }, + { url = "https://files.pythonhosted.org/packages/5d/57/d60d343709366a353dc56adb4ee1e7d8a2cc34e3fbc22905f4167cfec119/pillow-12.0.0-cp313-cp313-ios_13_0_x86_64_iphonesimulator.whl", hash = "sha256:1ee80a59f6ce048ae13cda1abf7fbd2a34ab9ee7d401c46be3ca685d1999a399", size = 3576912, upload-time = "2025-10-15T18:22:28.751Z" }, + { url = "https://files.pythonhosted.org/packages/a4/a4/a0a31467e3f83b94d37568294b01d22b43ae3c5d85f2811769b9c66389dd/pillow-12.0.0-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:c50f36a62a22d350c96e49ad02d0da41dbd17ddc2e29750dbdba4323f85eb4a5", size = 5249132, upload-time = "2025-10-15T18:22:30.641Z" }, + { url = "https://files.pythonhosted.org/packages/83/06/48eab21dd561de2914242711434c0c0eb992ed08ff3f6107a5f44527f5e9/pillow-12.0.0-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:5193fde9a5f23c331ea26d0cf171fbf67e3f247585f50c08b3e205c7aeb4589b", size = 4650099, upload-time = "2025-10-15T18:22:32.73Z" }, + { url = "https://files.pythonhosted.org/packages/fc/bd/69ed99fd46a8dba7c1887156d3572fe4484e3f031405fcc5a92e31c04035/pillow-12.0.0-cp313-cp313-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:bde737cff1a975b70652b62d626f7785e0480918dece11e8fef3c0cf057351c3", size = 6230808, upload-time = "2025-10-15T18:22:34.337Z" }, + { url = "https://files.pythonhosted.org/packages/ea/94/8fad659bcdbf86ed70099cb60ae40be6acca434bbc8c4c0d4ef356d7e0de/pillow-12.0.0-cp313-cp313-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:a6597ff2b61d121172f5844b53f21467f7082f5fb385a9a29c01414463f93b07", size = 8037804, upload-time = "2025-10-15T18:22:36.402Z" }, + { url = "https://files.pythonhosted.org/packages/20/39/c685d05c06deecfd4e2d1950e9a908aa2ca8bc4e6c3b12d93b9cafbd7837/pillow-12.0.0-cp313-cp313-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:0b817e7035ea7f6b942c13aa03bb554fc44fea70838ea21f8eb31c638326584e", size = 6345553, upload-time = "2025-10-15T18:22:38.066Z" }, + { url = "https://files.pythonhosted.org/packages/38/57/755dbd06530a27a5ed74f8cb0a7a44a21722ebf318edbe67ddbd7fb28f88/pillow-12.0.0-cp313-cp313-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:f4f1231b7dec408e8670264ce63e9c71409d9583dd21d32c163e25213ee2a344", size = 7037729, upload-time = "2025-10-15T18:22:39.769Z" }, + { url = "https://files.pythonhosted.org/packages/ca/b6/7e94f4c41d238615674d06ed677c14883103dce1c52e4af16f000338cfd7/pillow-12.0.0-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:6e51b71417049ad6ab14c49608b4a24d8fb3fe605e5dfabfe523b58064dc3d27", size = 6459789, upload-time = "2025-10-15T18:22:41.437Z" }, + { url = "https://files.pythonhosted.org/packages/9c/14/4448bb0b5e0f22dd865290536d20ec8a23b64e2d04280b89139f09a36bb6/pillow-12.0.0-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:d120c38a42c234dc9a8c5de7ceaaf899cf33561956acb4941653f8bdc657aa79", size = 7130917, upload-time = "2025-10-15T18:22:43.152Z" }, + { url = "https://files.pythonhosted.org/packages/dd/ca/16c6926cc1c015845745d5c16c9358e24282f1e588237a4c36d2b30f182f/pillow-12.0.0-cp313-cp313-win32.whl", hash = "sha256:4cc6b3b2efff105c6a1656cfe59da4fdde2cda9af1c5e0b58529b24525d0a098", size = 6302391, upload-time = "2025-10-15T18:22:44.753Z" }, + { url = "https://files.pythonhosted.org/packages/6d/2a/dd43dcfd6dae9b6a49ee28a8eedb98c7d5ff2de94a5d834565164667b97b/pillow-12.0.0-cp313-cp313-win_amd64.whl", hash = "sha256:4cf7fed4b4580601c4345ceb5d4cbf5a980d030fd5ad07c4d2ec589f95f09905", size = 7007477, upload-time = "2025-10-15T18:22:46.838Z" }, + { url = "https://files.pythonhosted.org/packages/77/f0/72ea067f4b5ae5ead653053212af05ce3705807906ba3f3e8f58ddf617e6/pillow-12.0.0-cp313-cp313-win_arm64.whl", hash = "sha256:9f0b04c6b8584c2c193babcccc908b38ed29524b29dd464bc8801bf10d746a3a", size = 2435918, upload-time = "2025-10-15T18:22:48.399Z" }, + { url = "https://files.pythonhosted.org/packages/f5/5e/9046b423735c21f0487ea6cb5b10f89ea8f8dfbe32576fe052b5ba9d4e5b/pillow-12.0.0-cp313-cp313t-macosx_10_13_x86_64.whl", hash = "sha256:7fa22993bac7b77b78cae22bad1e2a987ddf0d9015c63358032f84a53f23cdc3", size = 5251406, upload-time = "2025-10-15T18:22:49.905Z" }, + { url = "https://files.pythonhosted.org/packages/12/66/982ceebcdb13c97270ef7a56c3969635b4ee7cd45227fa707c94719229c5/pillow-12.0.0-cp313-cp313t-macosx_11_0_arm64.whl", hash = "sha256:f135c702ac42262573fe9714dfe99c944b4ba307af5eb507abef1667e2cbbced", size = 4653218, upload-time = "2025-10-15T18:22:51.587Z" }, + { url = "https://files.pythonhosted.org/packages/16/b3/81e625524688c31859450119bf12674619429cab3119eec0e30a7a1029cb/pillow-12.0.0-cp313-cp313t-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:c85de1136429c524e55cfa4e033b4a7940ac5c8ee4d9401cc2d1bf48154bbc7b", size = 6266564, upload-time = "2025-10-15T18:22:53.215Z" }, + { url = "https://files.pythonhosted.org/packages/98/59/dfb38f2a41240d2408096e1a76c671d0a105a4a8471b1871c6902719450c/pillow-12.0.0-cp313-cp313t-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:38df9b4bfd3db902c9c2bd369bcacaf9d935b2fff73709429d95cc41554f7b3d", size = 8069260, upload-time = "2025-10-15T18:22:54.933Z" }, + { url = "https://files.pythonhosted.org/packages/dc/3d/378dbea5cd1874b94c312425ca77b0f47776c78e0df2df751b820c8c1d6c/pillow-12.0.0-cp313-cp313t-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:7d87ef5795da03d742bf49439f9ca4d027cde49c82c5371ba52464aee266699a", size = 6379248, upload-time = "2025-10-15T18:22:56.605Z" }, + { url = "https://files.pythonhosted.org/packages/84/b0/d525ef47d71590f1621510327acec75ae58c721dc071b17d8d652ca494d8/pillow-12.0.0-cp313-cp313t-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:aff9e4d82d082ff9513bdd6acd4f5bd359f5b2c870907d2b0a9c5e10d40c88fe", size = 7066043, upload-time = "2025-10-15T18:22:58.53Z" }, + { url = "https://files.pythonhosted.org/packages/61/2c/aced60e9cf9d0cde341d54bf7932c9ffc33ddb4a1595798b3a5150c7ec4e/pillow-12.0.0-cp313-cp313t-musllinux_1_2_aarch64.whl", hash = "sha256:8d8ca2b210ada074d57fcee40c30446c9562e542fc46aedc19baf758a93532ee", size = 6490915, upload-time = "2025-10-15T18:23:00.582Z" }, + { url = "https://files.pythonhosted.org/packages/ef/26/69dcb9b91f4e59f8f34b2332a4a0a951b44f547c4ed39d3e4dcfcff48f89/pillow-12.0.0-cp313-cp313t-musllinux_1_2_x86_64.whl", hash = "sha256:99a7f72fb6249302aa62245680754862a44179b545ded638cf1fef59befb57ef", size = 7157998, upload-time = "2025-10-15T18:23:02.627Z" }, + { url = "https://files.pythonhosted.org/packages/61/2b/726235842220ca95fa441ddf55dd2382b52ab5b8d9c0596fe6b3f23dafe8/pillow-12.0.0-cp313-cp313t-win32.whl", hash = "sha256:4078242472387600b2ce8d93ade8899c12bf33fa89e55ec89fe126e9d6d5d9e9", size = 6306201, upload-time = "2025-10-15T18:23:04.709Z" }, + { url = "https://files.pythonhosted.org/packages/c0/3d/2afaf4e840b2df71344ababf2f8edd75a705ce500e5dc1e7227808312ae1/pillow-12.0.0-cp313-cp313t-win_amd64.whl", hash = "sha256:2c54c1a783d6d60595d3514f0efe9b37c8808746a66920315bfd34a938d7994b", size = 7013165, upload-time = "2025-10-15T18:23:06.46Z" }, + { url = "https://files.pythonhosted.org/packages/6f/75/3fa09aa5cf6ed04bee3fa575798ddf1ce0bace8edb47249c798077a81f7f/pillow-12.0.0-cp313-cp313t-win_arm64.whl", hash = "sha256:26d9f7d2b604cd23aba3e9faf795787456ac25634d82cd060556998e39c6fa47", size = 2437834, upload-time = "2025-10-15T18:23:08.194Z" }, + { url = "https://files.pythonhosted.org/packages/54/2a/9a8c6ba2c2c07b71bec92cf63e03370ca5e5f5c5b119b742bcc0cde3f9c5/pillow-12.0.0-cp314-cp314-ios_13_0_arm64_iphoneos.whl", hash = "sha256:beeae3f27f62308f1ddbcfb0690bf44b10732f2ef43758f169d5e9303165d3f9", size = 4045531, upload-time = "2025-10-15T18:23:10.121Z" }, + { url = "https://files.pythonhosted.org/packages/84/54/836fdbf1bfb3d66a59f0189ff0b9f5f666cee09c6188309300df04ad71fa/pillow-12.0.0-cp314-cp314-ios_13_0_arm64_iphonesimulator.whl", hash = "sha256:d4827615da15cd59784ce39d3388275ec093ae3ee8d7f0c089b76fa87af756c2", size = 4120554, upload-time = "2025-10-15T18:23:12.14Z" }, + { url = "https://files.pythonhosted.org/packages/0d/cd/16aec9f0da4793e98e6b54778a5fbce4f375c6646fe662e80600b8797379/pillow-12.0.0-cp314-cp314-ios_13_0_x86_64_iphonesimulator.whl", hash = "sha256:3e42edad50b6909089750e65c91aa09aaf1e0a71310d383f11321b27c224ed8a", size = 3576812, upload-time = "2025-10-15T18:23:13.962Z" }, + { url = "https://files.pythonhosted.org/packages/f6/b7/13957fda356dc46339298b351cae0d327704986337c3c69bb54628c88155/pillow-12.0.0-cp314-cp314-macosx_10_15_x86_64.whl", hash = "sha256:e5d8efac84c9afcb40914ab49ba063d94f5dbdf5066db4482c66a992f47a3a3b", size = 5252689, upload-time = "2025-10-15T18:23:15.562Z" }, + { url = "https://files.pythonhosted.org/packages/fc/f5/eae31a306341d8f331f43edb2e9122c7661b975433de5e447939ae61c5da/pillow-12.0.0-cp314-cp314-macosx_11_0_arm64.whl", hash = "sha256:266cd5f2b63ff316d5a1bba46268e603c9caf5606d44f38c2873c380950576ad", size = 4650186, upload-time = "2025-10-15T18:23:17.379Z" }, + { url = "https://files.pythonhosted.org/packages/86/62/2a88339aa40c4c77e79108facbd307d6091e2c0eb5b8d3cf4977cfca2fe6/pillow-12.0.0-cp314-cp314-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:58eea5ebe51504057dd95c5b77d21700b77615ab0243d8152793dc00eb4faf01", size = 6230308, upload-time = "2025-10-15T18:23:18.971Z" }, + { url = "https://files.pythonhosted.org/packages/c7/33/5425a8992bcb32d1cb9fa3dd39a89e613d09a22f2c8083b7bf43c455f760/pillow-12.0.0-cp314-cp314-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:f13711b1a5ba512d647a0e4ba79280d3a9a045aaf7e0cc6fbe96b91d4cdf6b0c", size = 8039222, upload-time = "2025-10-15T18:23:20.909Z" }, + { url = "https://files.pythonhosted.org/packages/d8/61/3f5d3b35c5728f37953d3eec5b5f3e77111949523bd2dd7f31a851e50690/pillow-12.0.0-cp314-cp314-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:6846bd2d116ff42cba6b646edf5bf61d37e5cbd256425fa089fee4ff5c07a99e", size = 6346657, upload-time = "2025-10-15T18:23:23.077Z" }, + { url = "https://files.pythonhosted.org/packages/3a/be/ee90a3d79271227e0f0a33c453531efd6ed14b2e708596ba5dd9be948da3/pillow-12.0.0-cp314-cp314-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:c98fa880d695de164b4135a52fd2e9cd7b7c90a9d8ac5e9e443a24a95ef9248e", size = 7038482, upload-time = "2025-10-15T18:23:25.005Z" }, + { url = "https://files.pythonhosted.org/packages/44/34/a16b6a4d1ad727de390e9bd9f19f5f669e079e5826ec0f329010ddea492f/pillow-12.0.0-cp314-cp314-musllinux_1_2_aarch64.whl", hash = "sha256:fa3ed2a29a9e9d2d488b4da81dcb54720ac3104a20bf0bd273f1e4648aff5af9", size = 6461416, upload-time = "2025-10-15T18:23:27.009Z" }, + { url = "https://files.pythonhosted.org/packages/b6/39/1aa5850d2ade7d7ba9f54e4e4c17077244ff7a2d9e25998c38a29749eb3f/pillow-12.0.0-cp314-cp314-musllinux_1_2_x86_64.whl", hash = "sha256:d034140032870024e6b9892c692fe2968493790dd57208b2c37e3fb35f6df3ab", size = 7131584, upload-time = "2025-10-15T18:23:29.752Z" }, + { url = "https://files.pythonhosted.org/packages/bf/db/4fae862f8fad0167073a7733973bfa955f47e2cac3dc3e3e6257d10fab4a/pillow-12.0.0-cp314-cp314-win32.whl", hash = "sha256:1b1b133e6e16105f524a8dec491e0586d072948ce15c9b914e41cdadd209052b", size = 6400621, upload-time = "2025-10-15T18:23:32.06Z" }, + { url = "https://files.pythonhosted.org/packages/2b/24/b350c31543fb0107ab2599464d7e28e6f856027aadda995022e695313d94/pillow-12.0.0-cp314-cp314-win_amd64.whl", hash = "sha256:8dc232e39d409036af549c86f24aed8273a40ffa459981146829a324e0848b4b", size = 7142916, upload-time = "2025-10-15T18:23:34.71Z" }, + { url = "https://files.pythonhosted.org/packages/0f/9b/0ba5a6fd9351793996ef7487c4fdbde8d3f5f75dbedc093bb598648fddf0/pillow-12.0.0-cp314-cp314-win_arm64.whl", hash = "sha256:d52610d51e265a51518692045e372a4c363056130d922a7351429ac9f27e70b0", size = 2523836, upload-time = "2025-10-15T18:23:36.967Z" }, + { url = "https://files.pythonhosted.org/packages/f5/7a/ceee0840aebc579af529b523d530840338ecf63992395842e54edc805987/pillow-12.0.0-cp314-cp314t-macosx_10_15_x86_64.whl", hash = "sha256:1979f4566bb96c1e50a62d9831e2ea2d1211761e5662afc545fa766f996632f6", size = 5255092, upload-time = "2025-10-15T18:23:38.573Z" }, + { url = "https://files.pythonhosted.org/packages/44/76/20776057b4bfd1aef4eeca992ebde0f53a4dce874f3ae693d0ec90a4f79b/pillow-12.0.0-cp314-cp314t-macosx_11_0_arm64.whl", hash = "sha256:b2e4b27a6e15b04832fe9bf292b94b5ca156016bbc1ea9c2c20098a0320d6cf6", size = 4653158, upload-time = "2025-10-15T18:23:40.238Z" }, + { url = "https://files.pythonhosted.org/packages/82/3f/d9ff92ace07be8836b4e7e87e6a4c7a8318d47c2f1463ffcf121fc57d9cb/pillow-12.0.0-cp314-cp314t-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:fb3096c30df99fd01c7bf8e544f392103d0795b9f98ba71a8054bcbf56b255f1", size = 6267882, upload-time = "2025-10-15T18:23:42.434Z" }, + { url = "https://files.pythonhosted.org/packages/9f/7a/4f7ff87f00d3ad33ba21af78bfcd2f032107710baf8280e3722ceec28cda/pillow-12.0.0-cp314-cp314t-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:7438839e9e053ef79f7112c881cef684013855016f928b168b81ed5835f3e75e", size = 8071001, upload-time = "2025-10-15T18:23:44.29Z" }, + { url = "https://files.pythonhosted.org/packages/75/87/fcea108944a52dad8cca0715ae6247e271eb80459364a98518f1e4f480c1/pillow-12.0.0-cp314-cp314t-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:5d5c411a8eaa2299322b647cd932586b1427367fd3184ffbb8f7a219ea2041ca", size = 6380146, upload-time = "2025-10-15T18:23:46.065Z" }, + { url = "https://files.pythonhosted.org/packages/91/52/0d31b5e571ef5fd111d2978b84603fce26aba1b6092f28e941cb46570745/pillow-12.0.0-cp314-cp314t-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:d7e091d464ac59d2c7ad8e7e08105eaf9dafbc3883fd7265ffccc2baad6ac925", size = 7067344, upload-time = "2025-10-15T18:23:47.898Z" }, + { url = "https://files.pythonhosted.org/packages/7b/f4/2dd3d721f875f928d48e83bb30a434dee75a2531bca839bb996bb0aa5a91/pillow-12.0.0-cp314-cp314t-musllinux_1_2_aarch64.whl", hash = "sha256:792a2c0be4dcc18af9d4a2dfd8a11a17d5e25274a1062b0ec1c2d79c76f3e7f8", size = 6491864, upload-time = "2025-10-15T18:23:49.607Z" }, + { url = "https://files.pythonhosted.org/packages/30/4b/667dfcf3d61fc309ba5a15b141845cece5915e39b99c1ceab0f34bf1d124/pillow-12.0.0-cp314-cp314t-musllinux_1_2_x86_64.whl", hash = "sha256:afbefa430092f71a9593a99ab6a4e7538bc9eabbf7bf94f91510d3503943edc4", size = 7158911, upload-time = "2025-10-15T18:23:51.351Z" }, + { url = "https://files.pythonhosted.org/packages/a2/2f/16cabcc6426c32218ace36bf0d55955e813f2958afddbf1d391849fee9d1/pillow-12.0.0-cp314-cp314t-win32.whl", hash = "sha256:3830c769decf88f1289680a59d4f4c46c72573446352e2befec9a8512104fa52", size = 6408045, upload-time = "2025-10-15T18:23:53.177Z" }, + { url = "https://files.pythonhosted.org/packages/35/73/e29aa0c9c666cf787628d3f0dcf379f4791fba79f4936d02f8b37165bdf8/pillow-12.0.0-cp314-cp314t-win_amd64.whl", hash = "sha256:905b0365b210c73afb0ebe9101a32572152dfd1c144c7e28968a331b9217b94a", size = 7148282, upload-time = "2025-10-15T18:23:55.316Z" }, + { url = "https://files.pythonhosted.org/packages/c1/70/6b41bdcddf541b437bbb9f47f94d2db5d9ddef6c37ccab8c9107743748a4/pillow-12.0.0-cp314-cp314t-win_arm64.whl", hash = "sha256:99353a06902c2e43b43e8ff74ee65a7d90307d82370604746738a1e0661ccca7", size = 2525630, upload-time = "2025-10-15T18:23:57.149Z" }, +] + +[[package]] +name = "portalocker" +version = "2.10.1" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "pywin32", marker = "sys_platform == 'win32'" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/ed/d3/c6c64067759e87af98cc668c1cc75171347d0f1577fab7ca3749134e3cd4/portalocker-2.10.1.tar.gz", hash = "sha256:ef1bf844e878ab08aee7e40184156e1151f228f103aa5c6bd0724cc330960f8f", size = 40891, upload-time = "2024-07-13T23:15:34.86Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/9b/fb/a70a4214956182e0d7a9099ab17d50bfcba1056188e9b14f35b9e2b62a0d/portalocker-2.10.1-py3-none-any.whl", hash = "sha256:53a5984ebc86a025552264b459b46a2086e269b21823cb572f8f28ee759e45bf", size = 18423, upload-time = "2024-07-13T23:15:32.602Z" }, +] + +[[package]] +name = "posthog" +version = "6.7.10" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "backoff" }, + { name = "distro" }, + { name = "python-dateutil" }, + { name = "requests" }, + { name = "six" }, + { name = "typing-extensions" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/9f/28/b81f52830efa1eb3e22b7b8c39ef60cf964dfc49b3d64ec060691b0d6df5/posthog-6.7.10.tar.gz", hash = "sha256:212512af756e7641e398bf36131ad589790a08cfa80c267895f46e0ec943e547", size = 120427, upload-time = "2025-10-24T13:50:50.565Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/af/c7/fdcd03a3eb71d968c6e8c20f0e011895086aac5d1502ae30b4c1345f8152/posthog-6.7.10-py3-none-any.whl", hash = "sha256:dc0a8dd8ddfa6f721f0066a4e3fb0062c2e19dce3b3ae8875d2a0984f9fd5d59", size = 138703, upload-time = "2025-10-24T13:50:49.285Z" }, +] + +[[package]] +name = "propcache" +version = "0.4.1" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/9e/da/e9fc233cf63743258bff22b3dfa7ea5baef7b5bc324af47a0ad89b8ffc6f/propcache-0.4.1.tar.gz", hash = "sha256:f48107a8c637e80362555f37ecf49abe20370e557cc4ab374f04ec4423c97c3d", size = 46442, upload-time = "2025-10-08T19:49:02.291Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/bf/df/6d9c1b6ac12b003837dde8a10231a7344512186e87b36e855bef32241942/propcache-0.4.1-cp313-cp313-macosx_10_13_universal2.whl", hash = "sha256:43eedf29202c08550aac1d14e0ee619b0430aaef78f85864c1a892294fbc28cf", size = 77750, upload-time = "2025-10-08T19:47:07.648Z" }, + { url = "https://files.pythonhosted.org/packages/8b/e8/677a0025e8a2acf07d3418a2e7ba529c9c33caf09d3c1f25513023c1db56/propcache-0.4.1-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:d62cdfcfd89ccb8de04e0eda998535c406bf5e060ffd56be6c586cbcc05b3311", size = 44780, upload-time = "2025-10-08T19:47:08.851Z" }, + { url = "https://files.pythonhosted.org/packages/89/a4/92380f7ca60f99ebae761936bc48a72a639e8a47b29050615eef757cb2a7/propcache-0.4.1-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:cae65ad55793da34db5f54e4029b89d3b9b9490d8abe1b4c7ab5d4b8ec7ebf74", size = 46308, upload-time = "2025-10-08T19:47:09.982Z" }, + { url = "https://files.pythonhosted.org/packages/2d/48/c5ac64dee5262044348d1d78a5f85dd1a57464a60d30daee946699963eb3/propcache-0.4.1-cp313-cp313-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:333ddb9031d2704a301ee3e506dc46b1fe5f294ec198ed6435ad5b6a085facfe", size = 208182, upload-time = "2025-10-08T19:47:11.319Z" }, + { url = "https://files.pythonhosted.org/packages/c6/0c/cd762dd011a9287389a6a3eb43aa30207bde253610cca06824aeabfe9653/propcache-0.4.1-cp313-cp313-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:fd0858c20f078a32cf55f7e81473d96dcf3b93fd2ccdb3d40fdf54b8573df3af", size = 211215, upload-time = "2025-10-08T19:47:13.146Z" }, + { url = "https://files.pythonhosted.org/packages/30/3e/49861e90233ba36890ae0ca4c660e95df565b2cd15d4a68556ab5865974e/propcache-0.4.1-cp313-cp313-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:678ae89ebc632c5c204c794f8dab2837c5f159aeb59e6ed0539500400577298c", size = 218112, upload-time = "2025-10-08T19:47:14.913Z" }, + { url = "https://files.pythonhosted.org/packages/f1/8b/544bc867e24e1bd48f3118cecd3b05c694e160a168478fa28770f22fd094/propcache-0.4.1-cp313-cp313-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:d472aeb4fbf9865e0c6d622d7f4d54a4e101a89715d8904282bb5f9a2f476c3f", size = 204442, upload-time = "2025-10-08T19:47:16.277Z" }, + { url = "https://files.pythonhosted.org/packages/50/a6/4282772fd016a76d3e5c0df58380a5ea64900afd836cec2c2f662d1b9bb3/propcache-0.4.1-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:4d3df5fa7e36b3225954fba85589da77a0fe6a53e3976de39caf04a0db4c36f1", size = 199398, upload-time = "2025-10-08T19:47:17.962Z" }, + { url = "https://files.pythonhosted.org/packages/3e/ec/d8a7cd406ee1ddb705db2139f8a10a8a427100347bd698e7014351c7af09/propcache-0.4.1-cp313-cp313-musllinux_1_2_armv7l.whl", hash = "sha256:ee17f18d2498f2673e432faaa71698032b0127ebf23ae5974eeaf806c279df24", size = 196920, upload-time = "2025-10-08T19:47:19.355Z" }, + { url = "https://files.pythonhosted.org/packages/f6/6c/f38ab64af3764f431e359f8baf9e0a21013e24329e8b85d2da32e8ed07ca/propcache-0.4.1-cp313-cp313-musllinux_1_2_ppc64le.whl", hash = "sha256:580e97762b950f993ae618e167e7be9256b8353c2dcd8b99ec100eb50f5286aa", size = 203748, upload-time = "2025-10-08T19:47:21.338Z" }, + { url = "https://files.pythonhosted.org/packages/d6/e3/fa846bd70f6534d647886621388f0a265254d30e3ce47e5c8e6e27dbf153/propcache-0.4.1-cp313-cp313-musllinux_1_2_s390x.whl", hash = "sha256:501d20b891688eb8e7aa903021f0b72d5a55db40ffaab27edefd1027caaafa61", size = 205877, upload-time = "2025-10-08T19:47:23.059Z" }, + { url = "https://files.pythonhosted.org/packages/e2/39/8163fc6f3133fea7b5f2827e8eba2029a0277ab2c5beee6c1db7b10fc23d/propcache-0.4.1-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:9a0bd56e5b100aef69bd8562b74b46254e7c8812918d3baa700c8a8009b0af66", size = 199437, upload-time = "2025-10-08T19:47:24.445Z" }, + { url = "https://files.pythonhosted.org/packages/93/89/caa9089970ca49c7c01662bd0eeedfe85494e863e8043565aeb6472ce8fe/propcache-0.4.1-cp313-cp313-win32.whl", hash = "sha256:bcc9aaa5d80322bc2fb24bb7accb4a30f81e90ab8d6ba187aec0744bc302ad81", size = 37586, upload-time = "2025-10-08T19:47:25.736Z" }, + { url = "https://files.pythonhosted.org/packages/f5/ab/f76ec3c3627c883215b5c8080debb4394ef5a7a29be811f786415fc1e6fd/propcache-0.4.1-cp313-cp313-win_amd64.whl", hash = "sha256:381914df18634f5494334d201e98245c0596067504b9372d8cf93f4bb23e025e", size = 40790, upload-time = "2025-10-08T19:47:26.847Z" }, + { url = "https://files.pythonhosted.org/packages/59/1b/e71ae98235f8e2ba5004d8cb19765a74877abf189bc53fc0c80d799e56c3/propcache-0.4.1-cp313-cp313-win_arm64.whl", hash = "sha256:8873eb4460fd55333ea49b7d189749ecf6e55bf85080f11b1c4530ed3034cba1", size = 37158, upload-time = "2025-10-08T19:47:27.961Z" }, + { url = "https://files.pythonhosted.org/packages/83/ce/a31bbdfc24ee0dcbba458c8175ed26089cf109a55bbe7b7640ed2470cfe9/propcache-0.4.1-cp313-cp313t-macosx_10_13_universal2.whl", hash = "sha256:92d1935ee1f8d7442da9c0c4fa7ac20d07e94064184811b685f5c4fada64553b", size = 81451, upload-time = "2025-10-08T19:47:29.445Z" }, + { url = "https://files.pythonhosted.org/packages/25/9c/442a45a470a68456e710d96cacd3573ef26a1d0a60067e6a7d5e655621ed/propcache-0.4.1-cp313-cp313t-macosx_10_13_x86_64.whl", hash = "sha256:473c61b39e1460d386479b9b2f337da492042447c9b685f28be4f74d3529e566", size = 46374, upload-time = "2025-10-08T19:47:30.579Z" }, + { url = "https://files.pythonhosted.org/packages/f4/bf/b1d5e21dbc3b2e889ea4327044fb16312a736d97640fb8b6aa3f9c7b3b65/propcache-0.4.1-cp313-cp313t-macosx_11_0_arm64.whl", hash = "sha256:c0ef0aaafc66fbd87842a3fe3902fd889825646bc21149eafe47be6072725835", size = 48396, upload-time = "2025-10-08T19:47:31.79Z" }, + { url = "https://files.pythonhosted.org/packages/f4/04/5b4c54a103d480e978d3c8a76073502b18db0c4bc17ab91b3cb5092ad949/propcache-0.4.1-cp313-cp313t-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:f95393b4d66bfae908c3ca8d169d5f79cd65636ae15b5e7a4f6e67af675adb0e", size = 275950, upload-time = "2025-10-08T19:47:33.481Z" }, + { url = "https://files.pythonhosted.org/packages/b4/c1/86f846827fb969c4b78b0af79bba1d1ea2156492e1b83dea8b8a6ae27395/propcache-0.4.1-cp313-cp313t-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:c07fda85708bc48578467e85099645167a955ba093be0a2dcba962195676e859", size = 273856, upload-time = "2025-10-08T19:47:34.906Z" }, + { url = "https://files.pythonhosted.org/packages/36/1d/fc272a63c8d3bbad6878c336c7a7dea15e8f2d23a544bda43205dfa83ada/propcache-0.4.1-cp313-cp313t-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:af223b406d6d000830c6f65f1e6431783fc3f713ba3e6cc8c024d5ee96170a4b", size = 280420, upload-time = "2025-10-08T19:47:36.338Z" }, + { url = "https://files.pythonhosted.org/packages/07/0c/01f2219d39f7e53d52e5173bcb09c976609ba30209912a0680adfb8c593a/propcache-0.4.1-cp313-cp313t-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:a78372c932c90ee474559c5ddfffd718238e8673c340dc21fe45c5b8b54559a0", size = 263254, upload-time = "2025-10-08T19:47:37.692Z" }, + { url = "https://files.pythonhosted.org/packages/2d/18/cd28081658ce597898f0c4d174d4d0f3c5b6d4dc27ffafeef835c95eb359/propcache-0.4.1-cp313-cp313t-musllinux_1_2_aarch64.whl", hash = "sha256:564d9f0d4d9509e1a870c920a89b2fec951b44bf5ba7d537a9e7c1ccec2c18af", size = 261205, upload-time = "2025-10-08T19:47:39.659Z" }, + { url = "https://files.pythonhosted.org/packages/7a/71/1f9e22eb8b8316701c2a19fa1f388c8a3185082607da8e406a803c9b954e/propcache-0.4.1-cp313-cp313t-musllinux_1_2_armv7l.whl", hash = "sha256:17612831fda0138059cc5546f4d12a2aacfb9e47068c06af35c400ba58ba7393", size = 247873, upload-time = "2025-10-08T19:47:41.084Z" }, + { url = "https://files.pythonhosted.org/packages/4a/65/3d4b61f36af2b4eddba9def857959f1016a51066b4f1ce348e0cf7881f58/propcache-0.4.1-cp313-cp313t-musllinux_1_2_ppc64le.whl", hash = "sha256:41a89040cb10bd345b3c1a873b2bf36413d48da1def52f268a055f7398514874", size = 262739, upload-time = "2025-10-08T19:47:42.51Z" }, + { url = "https://files.pythonhosted.org/packages/2a/42/26746ab087faa77c1c68079b228810436ccd9a5ce9ac85e2b7307195fd06/propcache-0.4.1-cp313-cp313t-musllinux_1_2_s390x.whl", hash = "sha256:e35b88984e7fa64aacecea39236cee32dd9bd8c55f57ba8a75cf2399553f9bd7", size = 263514, upload-time = "2025-10-08T19:47:43.927Z" }, + { url = "https://files.pythonhosted.org/packages/94/13/630690fe201f5502d2403dd3cfd451ed8858fe3c738ee88d095ad2ff407b/propcache-0.4.1-cp313-cp313t-musllinux_1_2_x86_64.whl", hash = "sha256:6f8b465489f927b0df505cbe26ffbeed4d6d8a2bbc61ce90eb074ff129ef0ab1", size = 257781, upload-time = "2025-10-08T19:47:45.448Z" }, + { url = "https://files.pythonhosted.org/packages/92/f7/1d4ec5841505f423469efbfc381d64b7b467438cd5a4bbcbb063f3b73d27/propcache-0.4.1-cp313-cp313t-win32.whl", hash = "sha256:2ad890caa1d928c7c2965b48f3a3815c853180831d0e5503d35cf00c472f4717", size = 41396, upload-time = "2025-10-08T19:47:47.202Z" }, + { url = "https://files.pythonhosted.org/packages/48/f0/615c30622316496d2cbbc29f5985f7777d3ada70f23370608c1d3e081c1f/propcache-0.4.1-cp313-cp313t-win_amd64.whl", hash = "sha256:f7ee0e597f495cf415bcbd3da3caa3bd7e816b74d0d52b8145954c5e6fd3ff37", size = 44897, upload-time = "2025-10-08T19:47:48.336Z" }, + { url = "https://files.pythonhosted.org/packages/fd/ca/6002e46eccbe0e33dcd4069ef32f7f1c9e243736e07adca37ae8c4830ec3/propcache-0.4.1-cp313-cp313t-win_arm64.whl", hash = "sha256:929d7cbe1f01bb7baffb33dc14eb5691c95831450a26354cd210a8155170c93a", size = 39789, upload-time = "2025-10-08T19:47:49.876Z" }, + { url = "https://files.pythonhosted.org/packages/8e/5c/bca52d654a896f831b8256683457ceddd490ec18d9ec50e97dfd8fc726a8/propcache-0.4.1-cp314-cp314-macosx_10_13_universal2.whl", hash = "sha256:3f7124c9d820ba5548d431afb4632301acf965db49e666aa21c305cbe8c6de12", size = 78152, upload-time = "2025-10-08T19:47:51.051Z" }, + { url = "https://files.pythonhosted.org/packages/65/9b/03b04e7d82a5f54fb16113d839f5ea1ede58a61e90edf515f6577c66fa8f/propcache-0.4.1-cp314-cp314-macosx_10_13_x86_64.whl", hash = "sha256:c0d4b719b7da33599dfe3b22d3db1ef789210a0597bc650b7cee9c77c2be8c5c", size = 44869, upload-time = "2025-10-08T19:47:52.594Z" }, + { url = "https://files.pythonhosted.org/packages/b2/fa/89a8ef0468d5833a23fff277b143d0573897cf75bd56670a6d28126c7d68/propcache-0.4.1-cp314-cp314-macosx_11_0_arm64.whl", hash = "sha256:9f302f4783709a78240ebc311b793f123328716a60911d667e0c036bc5dcbded", size = 46596, upload-time = "2025-10-08T19:47:54.073Z" }, + { url = "https://files.pythonhosted.org/packages/86/bd/47816020d337f4a746edc42fe8d53669965138f39ee117414c7d7a340cfe/propcache-0.4.1-cp314-cp314-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:c80ee5802e3fb9ea37938e7eecc307fb984837091d5fd262bb37238b1ae97641", size = 206981, upload-time = "2025-10-08T19:47:55.715Z" }, + { url = "https://files.pythonhosted.org/packages/df/f6/c5fa1357cc9748510ee55f37173eb31bfde6d94e98ccd9e6f033f2fc06e1/propcache-0.4.1-cp314-cp314-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:ed5a841e8bb29a55fb8159ed526b26adc5bdd7e8bd7bf793ce647cb08656cdf4", size = 211490, upload-time = "2025-10-08T19:47:57.499Z" }, + { url = "https://files.pythonhosted.org/packages/80/1e/e5889652a7c4a3846683401a48f0f2e5083ce0ec1a8a5221d8058fbd1adf/propcache-0.4.1-cp314-cp314-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:55c72fd6ea2da4c318e74ffdf93c4fe4e926051133657459131a95c846d16d44", size = 215371, upload-time = "2025-10-08T19:47:59.317Z" }, + { url = "https://files.pythonhosted.org/packages/b2/f2/889ad4b2408f72fe1a4f6a19491177b30ea7bf1a0fd5f17050ca08cfc882/propcache-0.4.1-cp314-cp314-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:8326e144341460402713f91df60ade3c999d601e7eb5ff8f6f7862d54de0610d", size = 201424, upload-time = "2025-10-08T19:48:00.67Z" }, + { url = "https://files.pythonhosted.org/packages/27/73/033d63069b57b0812c8bd19f311faebeceb6ba31b8f32b73432d12a0b826/propcache-0.4.1-cp314-cp314-musllinux_1_2_aarch64.whl", hash = "sha256:060b16ae65bc098da7f6d25bf359f1f31f688384858204fe5d652979e0015e5b", size = 197566, upload-time = "2025-10-08T19:48:02.604Z" }, + { url = "https://files.pythonhosted.org/packages/dc/89/ce24f3dc182630b4e07aa6d15f0ff4b14ed4b9955fae95a0b54c58d66c05/propcache-0.4.1-cp314-cp314-musllinux_1_2_armv7l.whl", hash = "sha256:89eb3fa9524f7bec9de6e83cf3faed9d79bffa560672c118a96a171a6f55831e", size = 193130, upload-time = "2025-10-08T19:48:04.499Z" }, + { url = "https://files.pythonhosted.org/packages/a9/24/ef0d5fd1a811fb5c609278d0209c9f10c35f20581fcc16f818da959fc5b4/propcache-0.4.1-cp314-cp314-musllinux_1_2_ppc64le.whl", hash = "sha256:dee69d7015dc235f526fe80a9c90d65eb0039103fe565776250881731f06349f", size = 202625, upload-time = "2025-10-08T19:48:06.213Z" }, + { url = "https://files.pythonhosted.org/packages/f5/02/98ec20ff5546f68d673df2f7a69e8c0d076b5abd05ca882dc7ee3a83653d/propcache-0.4.1-cp314-cp314-musllinux_1_2_s390x.whl", hash = "sha256:5558992a00dfd54ccbc64a32726a3357ec93825a418a401f5cc67df0ac5d9e49", size = 204209, upload-time = "2025-10-08T19:48:08.432Z" }, + { url = "https://files.pythonhosted.org/packages/a0/87/492694f76759b15f0467a2a93ab68d32859672b646aa8a04ce4864e7932d/propcache-0.4.1-cp314-cp314-musllinux_1_2_x86_64.whl", hash = "sha256:c9b822a577f560fbd9554812526831712c1436d2c046cedee4c3796d3543b144", size = 197797, upload-time = "2025-10-08T19:48:09.968Z" }, + { url = "https://files.pythonhosted.org/packages/ee/36/66367de3575db1d2d3f3d177432bd14ee577a39d3f5d1b3d5df8afe3b6e2/propcache-0.4.1-cp314-cp314-win32.whl", hash = "sha256:ab4c29b49d560fe48b696cdcb127dd36e0bc2472548f3bf56cc5cb3da2b2984f", size = 38140, upload-time = "2025-10-08T19:48:11.232Z" }, + { url = "https://files.pythonhosted.org/packages/0c/2a/a758b47de253636e1b8aef181c0b4f4f204bf0dd964914fb2af90a95b49b/propcache-0.4.1-cp314-cp314-win_amd64.whl", hash = "sha256:5a103c3eb905fcea0ab98be99c3a9a5ab2de60228aa5aceedc614c0281cf6153", size = 41257, upload-time = "2025-10-08T19:48:12.707Z" }, + { url = "https://files.pythonhosted.org/packages/34/5e/63bd5896c3fec12edcbd6f12508d4890d23c265df28c74b175e1ef9f4f3b/propcache-0.4.1-cp314-cp314-win_arm64.whl", hash = "sha256:74c1fb26515153e482e00177a1ad654721bf9207da8a494a0c05e797ad27b992", size = 38097, upload-time = "2025-10-08T19:48:13.923Z" }, + { url = "https://files.pythonhosted.org/packages/99/85/9ff785d787ccf9bbb3f3106f79884a130951436f58392000231b4c737c80/propcache-0.4.1-cp314-cp314t-macosx_10_13_universal2.whl", hash = "sha256:824e908bce90fb2743bd6b59db36eb4f45cd350a39637c9f73b1c1ea66f5b75f", size = 81455, upload-time = "2025-10-08T19:48:15.16Z" }, + { url = "https://files.pythonhosted.org/packages/90/85/2431c10c8e7ddb1445c1f7c4b54d886e8ad20e3c6307e7218f05922cad67/propcache-0.4.1-cp314-cp314t-macosx_10_13_x86_64.whl", hash = "sha256:c2b5e7db5328427c57c8e8831abda175421b709672f6cfc3d630c3b7e2146393", size = 46372, upload-time = "2025-10-08T19:48:16.424Z" }, + { url = "https://files.pythonhosted.org/packages/01/20/b0972d902472da9bcb683fa595099911f4d2e86e5683bcc45de60dd05dc3/propcache-0.4.1-cp314-cp314t-macosx_11_0_arm64.whl", hash = "sha256:6f6ff873ed40292cd4969ef5310179afd5db59fdf055897e282485043fc80ad0", size = 48411, upload-time = "2025-10-08T19:48:17.577Z" }, + { url = "https://files.pythonhosted.org/packages/e2/e3/7dc89f4f21e8f99bad3d5ddb3a3389afcf9da4ac69e3deb2dcdc96e74169/propcache-0.4.1-cp314-cp314t-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:49a2dc67c154db2c1463013594c458881a069fcf98940e61a0569016a583020a", size = 275712, upload-time = "2025-10-08T19:48:18.901Z" }, + { url = "https://files.pythonhosted.org/packages/20/67/89800c8352489b21a8047c773067644e3897f02ecbbd610f4d46b7f08612/propcache-0.4.1-cp314-cp314t-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:005f08e6a0529984491e37d8dbc3dd86f84bd78a8ceb5fa9a021f4c48d4984be", size = 273557, upload-time = "2025-10-08T19:48:20.762Z" }, + { url = "https://files.pythonhosted.org/packages/e2/a1/b52b055c766a54ce6d9c16d9aca0cad8059acd9637cdf8aa0222f4a026ef/propcache-0.4.1-cp314-cp314t-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:5c3310452e0d31390da9035c348633b43d7e7feb2e37be252be6da45abd1abcc", size = 280015, upload-time = "2025-10-08T19:48:22.592Z" }, + { url = "https://files.pythonhosted.org/packages/48/c8/33cee30bd890672c63743049f3c9e4be087e6780906bfc3ec58528be59c1/propcache-0.4.1-cp314-cp314t-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:4c3c70630930447f9ef1caac7728c8ad1c56bc5015338b20fed0d08ea2480b3a", size = 262880, upload-time = "2025-10-08T19:48:23.947Z" }, + { url = "https://files.pythonhosted.org/packages/0c/b1/8f08a143b204b418285c88b83d00edbd61afbc2c6415ffafc8905da7038b/propcache-0.4.1-cp314-cp314t-musllinux_1_2_aarch64.whl", hash = "sha256:8e57061305815dfc910a3634dcf584f08168a8836e6999983569f51a8544cd89", size = 260938, upload-time = "2025-10-08T19:48:25.656Z" }, + { url = "https://files.pythonhosted.org/packages/cf/12/96e4664c82ca2f31e1c8dff86afb867348979eb78d3cb8546a680287a1e9/propcache-0.4.1-cp314-cp314t-musllinux_1_2_armv7l.whl", hash = "sha256:521a463429ef54143092c11a77e04056dd00636f72e8c45b70aaa3140d639726", size = 247641, upload-time = "2025-10-08T19:48:27.207Z" }, + { url = "https://files.pythonhosted.org/packages/18/ed/e7a9cfca28133386ba52278136d42209d3125db08d0a6395f0cba0c0285c/propcache-0.4.1-cp314-cp314t-musllinux_1_2_ppc64le.whl", hash = "sha256:120c964da3fdc75e3731aa392527136d4ad35868cc556fd09bb6d09172d9a367", size = 262510, upload-time = "2025-10-08T19:48:28.65Z" }, + { url = "https://files.pythonhosted.org/packages/f5/76/16d8bf65e8845dd62b4e2b57444ab81f07f40caa5652b8969b87ddcf2ef6/propcache-0.4.1-cp314-cp314t-musllinux_1_2_s390x.whl", hash = "sha256:d8f353eb14ee3441ee844ade4277d560cdd68288838673273b978e3d6d2c8f36", size = 263161, upload-time = "2025-10-08T19:48:30.133Z" }, + { url = "https://files.pythonhosted.org/packages/e7/70/c99e9edb5d91d5ad8a49fa3c1e8285ba64f1476782fed10ab251ff413ba1/propcache-0.4.1-cp314-cp314t-musllinux_1_2_x86_64.whl", hash = "sha256:ab2943be7c652f09638800905ee1bab2c544e537edb57d527997a24c13dc1455", size = 257393, upload-time = "2025-10-08T19:48:31.567Z" }, + { url = "https://files.pythonhosted.org/packages/08/02/87b25304249a35c0915d236575bc3574a323f60b47939a2262b77632a3ee/propcache-0.4.1-cp314-cp314t-win32.whl", hash = "sha256:05674a162469f31358c30bcaa8883cb7829fa3110bf9c0991fe27d7896c42d85", size = 42546, upload-time = "2025-10-08T19:48:32.872Z" }, + { url = "https://files.pythonhosted.org/packages/cb/ef/3c6ecf8b317aa982f309835e8f96987466123c6e596646d4e6a1dfcd080f/propcache-0.4.1-cp314-cp314t-win_amd64.whl", hash = "sha256:990f6b3e2a27d683cb7602ed6c86f15ee6b43b1194736f9baaeb93d0016633b1", size = 46259, upload-time = "2025-10-08T19:48:34.226Z" }, + { url = "https://files.pythonhosted.org/packages/c4/2d/346e946d4951f37eca1e4f55be0f0174c52cd70720f84029b02f296f4a38/propcache-0.4.1-cp314-cp314t-win_arm64.whl", hash = "sha256:ecef2343af4cc68e05131e45024ba34f6095821988a9d0a02aa7c73fcc448aa9", size = 40428, upload-time = "2025-10-08T19:48:35.441Z" }, + { url = "https://files.pythonhosted.org/packages/5b/5a/bc7b4a4ef808fa59a816c17b20c4bef6884daebbdf627ff2a161da67da19/propcache-0.4.1-py3-none-any.whl", hash = "sha256:af2a6052aeb6cf17d3e46ee169099044fd8224cbaf75c76a2ef596e8163e2237", size = 13305, upload-time = "2025-10-08T19:49:00.792Z" }, +] + +[[package]] +name = "proto-plus" +version = "1.26.1" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "protobuf" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/f4/ac/87285f15f7cce6d4a008f33f1757fb5a13611ea8914eb58c3d0d26243468/proto_plus-1.26.1.tar.gz", hash = "sha256:21a515a4c4c0088a773899e23c7bbade3d18f9c66c73edd4c7ee3816bc96a012", size = 56142, upload-time = "2025-03-10T15:54:38.843Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/4e/6d/280c4c2ce28b1593a19ad5239c8b826871fc6ec275c21afc8e1820108039/proto_plus-1.26.1-py3-none-any.whl", hash = "sha256:13285478c2dcf2abb829db158e1047e2f1e8d63a077d94263c2b88b043c75a66", size = 50163, upload-time = "2025-03-10T15:54:37.335Z" }, +] + +[[package]] +name = "protobuf" +version = "6.33.0" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/19/ff/64a6c8f420818bb873713988ca5492cba3a7946be57e027ac63495157d97/protobuf-6.33.0.tar.gz", hash = "sha256:140303d5c8d2037730c548f8c7b93b20bb1dc301be280c378b82b8894589c954", size = 443463, upload-time = "2025-10-15T20:39:52.159Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/7e/ee/52b3fa8feb6db4a833dfea4943e175ce645144532e8a90f72571ad85df4e/protobuf-6.33.0-cp310-abi3-win32.whl", hash = "sha256:d6101ded078042a8f17959eccd9236fb7a9ca20d3b0098bbcb91533a5680d035", size = 425593, upload-time = "2025-10-15T20:39:40.29Z" }, + { url = "https://files.pythonhosted.org/packages/7b/c6/7a465f1825872c55e0341ff4a80198743f73b69ce5d43ab18043699d1d81/protobuf-6.33.0-cp310-abi3-win_amd64.whl", hash = "sha256:9a031d10f703f03768f2743a1c403af050b6ae1f3480e9c140f39c45f81b13ee", size = 436882, upload-time = "2025-10-15T20:39:42.841Z" }, + { url = "https://files.pythonhosted.org/packages/e1/a9/b6eee662a6951b9c3640e8e452ab3e09f117d99fc10baa32d1581a0d4099/protobuf-6.33.0-cp39-abi3-macosx_10_9_universal2.whl", hash = "sha256:905b07a65f1a4b72412314082c7dbfae91a9e8b68a0cc1577515f8df58ecf455", size = 427521, upload-time = "2025-10-15T20:39:43.803Z" }, + { url = "https://files.pythonhosted.org/packages/10/35/16d31e0f92c6d2f0e77c2a3ba93185130ea13053dd16200a57434c882f2b/protobuf-6.33.0-cp39-abi3-manylinux2014_aarch64.whl", hash = "sha256:e0697ece353e6239b90ee43a9231318302ad8353c70e6e45499fa52396debf90", size = 324445, upload-time = "2025-10-15T20:39:44.932Z" }, + { url = "https://files.pythonhosted.org/packages/e6/eb/2a981a13e35cda8b75b5585aaffae2eb904f8f351bdd3870769692acbd8a/protobuf-6.33.0-cp39-abi3-manylinux2014_s390x.whl", hash = "sha256:e0a1715e4f27355afd9570f3ea369735afc853a6c3951a6afe1f80d8569ad298", size = 339159, upload-time = "2025-10-15T20:39:46.186Z" }, + { url = "https://files.pythonhosted.org/packages/21/51/0b1cbad62074439b867b4e04cc09b93f6699d78fd191bed2bbb44562e077/protobuf-6.33.0-cp39-abi3-manylinux2014_x86_64.whl", hash = "sha256:35be49fd3f4fefa4e6e2aacc35e8b837d6703c37a2168a55ac21e9b1bc7559ef", size = 323172, upload-time = "2025-10-15T20:39:47.465Z" }, + { url = "https://files.pythonhosted.org/packages/07/d1/0a28c21707807c6aacd5dc9c3704b2aa1effbf37adebd8caeaf68b17a636/protobuf-6.33.0-py3-none-any.whl", hash = "sha256:25c9e1963c6734448ea2d308cfa610e692b801304ba0908d7bfa564ac5132995", size = 170477, upload-time = "2025-10-15T20:39:51.311Z" }, +] + +[[package]] +name = "psutil" +version = "7.1.2" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/cd/ec/7b8e6b9b1d22708138630ef34c53ab2b61032c04f16adfdbb96791c8c70c/psutil-7.1.2.tar.gz", hash = "sha256:aa225cdde1335ff9684708ee8c72650f6598d5ed2114b9a7c5802030b1785018", size = 487424, upload-time = "2025-10-25T10:46:34.931Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/b8/d9/b56cc9f883140ac10021a8c9b0f4e16eed1ba675c22513cdcbce3ba64014/psutil-7.1.2-cp313-cp313t-macosx_10_13_x86_64.whl", hash = "sha256:0cc5c6889b9871f231ed5455a9a02149e388fffcb30b607fb7a8896a6d95f22e", size = 238575, upload-time = "2025-10-25T10:46:38.728Z" }, + { url = "https://files.pythonhosted.org/packages/36/eb/28d22de383888deb252c818622196e709da98816e296ef95afda33f1c0a2/psutil-7.1.2-cp313-cp313t-macosx_11_0_arm64.whl", hash = "sha256:8e9e77a977208d84aa363a4a12e0f72189d58bbf4e46b49aae29a2c6e93ef206", size = 239297, upload-time = "2025-10-25T10:46:41.347Z" }, + { url = "https://files.pythonhosted.org/packages/89/5d/220039e2f28cc129626e54d63892ab05c0d56a29818bfe7268dcb5008932/psutil-7.1.2-cp313-cp313t-manylinux2010_x86_64.manylinux_2_12_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:7d9623a5e4164d2220ecceb071f4b333b3c78866141e8887c072129185f41278", size = 280420, upload-time = "2025-10-25T10:46:44.122Z" }, + { url = "https://files.pythonhosted.org/packages/ba/7a/286f0e1c167445b2ef4a6cbdfc8c59fdb45a5a493788950cf8467201dc73/psutil-7.1.2-cp313-cp313t-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:364b1c10fe4ed59c89ec49e5f1a70da353b27986fa8233b4b999df4742a5ee2f", size = 283049, upload-time = "2025-10-25T10:46:47.095Z" }, + { url = "https://files.pythonhosted.org/packages/aa/cc/7eb93260794a42e39b976f3a4dde89725800b9f573b014fac142002a5c98/psutil-7.1.2-cp313-cp313t-win_amd64.whl", hash = "sha256:f101ef84de7e05d41310e3ccbdd65a6dd1d9eed85e8aaf0758405d022308e204", size = 248713, upload-time = "2025-10-25T10:46:49.573Z" }, + { url = "https://files.pythonhosted.org/packages/ab/1a/0681a92b53366e01f0a099f5237d0c8a2f79d322ac589cccde5e30c8a4e2/psutil-7.1.2-cp313-cp313t-win_arm64.whl", hash = "sha256:20c00824048a95de67f00afedc7b08b282aa08638585b0206a9fb51f28f1a165", size = 244644, upload-time = "2025-10-25T10:46:51.924Z" }, + { url = "https://files.pythonhosted.org/packages/56/9e/f1c5c746b4ed5320952acd3002d3962fe36f30524c00ea79fdf954cc6779/psutil-7.1.2-cp314-cp314t-macosx_10_15_x86_64.whl", hash = "sha256:e09cfe92aa8e22b1ec5e2d394820cf86c5dff6367ac3242366485dfa874d43bc", size = 238640, upload-time = "2025-10-25T10:46:54.089Z" }, + { url = "https://files.pythonhosted.org/packages/32/ee/fd26216a735395cc25c3899634e34aeb41fb1f3dbb44acc67d9e594be562/psutil-7.1.2-cp314-cp314t-macosx_11_0_arm64.whl", hash = "sha256:fa6342cf859c48b19df3e4aa170e4cfb64aadc50b11e06bb569c6c777b089c9e", size = 239303, upload-time = "2025-10-25T10:46:56.932Z" }, + { url = "https://files.pythonhosted.org/packages/3c/cd/7d96eaec4ef7742b845a9ce2759a2769ecce4ab7a99133da24abacbc9e41/psutil-7.1.2-cp314-cp314t-manylinux2010_x86_64.manylinux_2_12_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:625977443498ee7d6c1e63e93bacca893fd759a66c5f635d05e05811d23fb5ee", size = 281717, upload-time = "2025-10-25T10:46:59.116Z" }, + { url = "https://files.pythonhosted.org/packages/bc/1a/7f0b84bdb067d35fe7fade5fff888408688caf989806ce2d6dae08c72dd5/psutil-7.1.2-cp314-cp314t-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:4a24bcd7b7f2918d934af0fb91859f621b873d6aa81267575e3655cd387572a7", size = 284575, upload-time = "2025-10-25T10:47:00.944Z" }, + { url = "https://files.pythonhosted.org/packages/de/05/7820ef8f7b275268917e0c750eada5834581206d9024ca88edce93c4b762/psutil-7.1.2-cp314-cp314t-win_amd64.whl", hash = "sha256:329f05610da6380982e6078b9d0881d9ab1e9a7eb7c02d833bfb7340aa634e31", size = 249491, upload-time = "2025-10-25T10:47:03.174Z" }, + { url = "https://files.pythonhosted.org/packages/db/9a/58de399c7cb58489f08498459ff096cd76b3f1ddc4f224ec2c5ef729c7d0/psutil-7.1.2-cp314-cp314t-win_arm64.whl", hash = "sha256:7b04c29e3c0c888e83ed4762b70f31e65c42673ea956cefa8ced0e31e185f582", size = 244880, upload-time = "2025-10-25T10:47:05.228Z" }, + { url = "https://files.pythonhosted.org/packages/ae/89/b9f8d47ddbc52d7301fc868e8224e5f44ed3c7f55e6d0f54ecaf5dd9ff5e/psutil-7.1.2-cp36-abi3-macosx_10_9_x86_64.whl", hash = "sha256:c9ba5c19f2d46203ee8c152c7b01df6eec87d883cfd8ee1af2ef2727f6b0f814", size = 237244, upload-time = "2025-10-25T10:47:07.086Z" }, + { url = "https://files.pythonhosted.org/packages/c8/7a/8628c2f6b240680a67d73d8742bb9ff39b1820a693740e43096d5dcb01e5/psutil-7.1.2-cp36-abi3-macosx_11_0_arm64.whl", hash = "sha256:2a486030d2fe81bec023f703d3d155f4823a10a47c36784c84f1cc7f8d39bedb", size = 238101, upload-time = "2025-10-25T10:47:09.523Z" }, + { url = "https://files.pythonhosted.org/packages/30/28/5e27f4d5a0e347f8e3cc16cd7d35533dbce086c95807f1f0e9cd77e26c10/psutil-7.1.2-cp36-abi3-manylinux2010_x86_64.manylinux_2_12_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:3efd8fc791492e7808a51cb2b94889db7578bfaea22df931424f874468e389e3", size = 258675, upload-time = "2025-10-25T10:47:11.082Z" }, + { url = "https://files.pythonhosted.org/packages/e5/5c/79cf60c9acf36d087f0db0f82066fca4a780e97e5b3a2e4c38209c03d170/psutil-7.1.2-cp36-abi3-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:e2aeb9b64f481b8eabfc633bd39e0016d4d8bbcd590d984af764d80bf0851b8a", size = 260203, upload-time = "2025-10-25T10:47:13.226Z" }, + { url = "https://files.pythonhosted.org/packages/f7/03/0a464404c51685dcb9329fdd660b1721e076ccd7b3d97dee066bcc9ffb15/psutil-7.1.2-cp37-abi3-win_amd64.whl", hash = "sha256:8e17852114c4e7996fe9da4745c2bdef001ebbf2f260dec406290e66628bdb91", size = 246714, upload-time = "2025-10-25T10:47:15.093Z" }, + { url = "https://files.pythonhosted.org/packages/6a/32/97ca2090f2f1b45b01b6aa7ae161cfe50671de097311975ca6eea3e7aabc/psutil-7.1.2-cp37-abi3-win_arm64.whl", hash = "sha256:3e988455e61c240cc879cb62a008c2699231bf3e3d061d7fce4234463fd2abb4", size = 243742, upload-time = "2025-10-25T10:47:17.302Z" }, +] + +[[package]] +name = "pyasn1" +version = "0.6.1" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/ba/e9/01f1a64245b89f039897cb0130016d79f77d52669aae6ee7b159a6c4c018/pyasn1-0.6.1.tar.gz", hash = "sha256:6f580d2bdd84365380830acf45550f2511469f673cb4a5ae3857a3170128b034", size = 145322, upload-time = "2024-09-10T22:41:42.55Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/c8/f1/d6a797abb14f6283c0ddff96bbdd46937f64122b8c925cab503dd37f8214/pyasn1-0.6.1-py3-none-any.whl", hash = "sha256:0d632f46f2ba09143da3a8afe9e33fb6f92fa2320ab7e886e2d0f7672af84629", size = 83135, upload-time = "2024-09-11T16:00:36.122Z" }, +] + +[[package]] +name = "pyasn1-modules" +version = "0.4.2" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "pyasn1" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/e9/e6/78ebbb10a8c8e4b61a59249394a4a594c1a7af95593dc933a349c8d00964/pyasn1_modules-0.4.2.tar.gz", hash = "sha256:677091de870a80aae844b1ca6134f54652fa2c8c5a52aa396440ac3106e941e6", size = 307892, upload-time = "2025-03-28T02:41:22.17Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/47/8d/d529b5d697919ba8c11ad626e835d4039be708a35b0d22de83a269a6682c/pyasn1_modules-0.4.2-py3-none-any.whl", hash = "sha256:29253a9207ce32b64c3ac6600edc75368f98473906e8fd1043bd6b5b1de2c14a", size = 181259, upload-time = "2025-03-28T02:41:19.028Z" }, +] + +[[package]] +name = "pycparser" +version = "2.23" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/fe/cf/d2d3b9f5699fb1e4615c8e32ff220203e43b248e1dfcc6736ad9057731ca/pycparser-2.23.tar.gz", hash = "sha256:78816d4f24add8f10a06d6f05b4d424ad9e96cfebf68a4ddc99c65c0720d00c2", size = 173734, upload-time = "2025-09-09T13:23:47.91Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/a0/e3/59cd50310fc9b59512193629e1984c1f95e5c8ae6e5d8c69532ccc65a7fe/pycparser-2.23-py3-none-any.whl", hash = "sha256:e5c6e8d3fbad53479cab09ac03729e0a9faf2bee3db8208a550daf5af81a5934", size = 118140, upload-time = "2025-09-09T13:23:46.651Z" }, +] + +[[package]] +name = "pydantic" +version = "2.12.3" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "annotated-types" }, + { name = "pydantic-core" }, + { name = "typing-extensions" }, + { name = "typing-inspection" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/f3/1e/4f0a3233767010308f2fd6bd0814597e3f63f1dc98304a9112b8759df4ff/pydantic-2.12.3.tar.gz", hash = "sha256:1da1c82b0fc140bb0103bc1441ffe062154c8d38491189751ee00fd8ca65ce74", size = 819383, upload-time = "2025-10-17T15:04:21.222Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/a1/6b/83661fa77dcefa195ad5f8cd9af3d1a7450fd57cc883ad04d65446ac2029/pydantic-2.12.3-py3-none-any.whl", hash = "sha256:6986454a854bc3bc6e5443e1369e06a3a456af9d339eda45510f517d9ea5c6bf", size = 462431, upload-time = "2025-10-17T15:04:19.346Z" }, +] + +[[package]] +name = "pydantic-core" +version = "2.41.4" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "typing-extensions" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/df/18/d0944e8eaaa3efd0a91b0f1fc537d3be55ad35091b6a87638211ba691964/pydantic_core-2.41.4.tar.gz", hash = "sha256:70e47929a9d4a1905a67e4b687d5946026390568a8e952b92824118063cee4d5", size = 457557, upload-time = "2025-10-14T10:23:47.909Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/13/d0/c20adabd181a029a970738dfe23710b52a31f1258f591874fcdec7359845/pydantic_core-2.41.4-cp313-cp313-macosx_10_12_x86_64.whl", hash = "sha256:85e050ad9e5f6fe1004eec65c914332e52f429bc0ae12d6fa2092407a462c746", size = 2105688, upload-time = "2025-10-14T10:20:54.448Z" }, + { url = "https://files.pythonhosted.org/packages/00/b6/0ce5c03cec5ae94cca220dfecddc453c077d71363b98a4bbdb3c0b22c783/pydantic_core-2.41.4-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:e7393f1d64792763a48924ba31d1e44c2cfbc05e3b1c2c9abb4ceeadd912cced", size = 1910807, upload-time = "2025-10-14T10:20:56.115Z" }, + { url = "https://files.pythonhosted.org/packages/68/3e/800d3d02c8beb0b5c069c870cbb83799d085debf43499c897bb4b4aaff0d/pydantic_core-2.41.4-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:94dab0940b0d1fb28bcab847adf887c66a27a40291eedf0b473be58761c9799a", size = 1956669, upload-time = "2025-10-14T10:20:57.874Z" }, + { url = "https://files.pythonhosted.org/packages/60/a4/24271cc71a17f64589be49ab8bd0751f6a0a03046c690df60989f2f95c2c/pydantic_core-2.41.4-cp313-cp313-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:de7c42f897e689ee6f9e93c4bec72b99ae3b32a2ade1c7e4798e690ff5246e02", size = 2051629, upload-time = "2025-10-14T10:21:00.006Z" }, + { url = "https://files.pythonhosted.org/packages/68/de/45af3ca2f175d91b96bfb62e1f2d2f1f9f3b14a734afe0bfeff079f78181/pydantic_core-2.41.4-cp313-cp313-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:664b3199193262277b8b3cd1e754fb07f2c6023289c815a1e1e8fb415cb247b1", size = 2224049, upload-time = "2025-10-14T10:21:01.801Z" }, + { url = "https://files.pythonhosted.org/packages/af/8f/ae4e1ff84672bf869d0a77af24fd78387850e9497753c432875066b5d622/pydantic_core-2.41.4-cp313-cp313-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:d95b253b88f7d308b1c0b417c4624f44553ba4762816f94e6986819b9c273fb2", size = 2342409, upload-time = "2025-10-14T10:21:03.556Z" }, + { url = "https://files.pythonhosted.org/packages/18/62/273dd70b0026a085c7b74b000394e1ef95719ea579c76ea2f0cc8893736d/pydantic_core-2.41.4-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:a1351f5bbdbbabc689727cb91649a00cb9ee7203e0a6e54e9f5ba9e22e384b84", size = 2069635, upload-time = "2025-10-14T10:21:05.385Z" }, + { url = "https://files.pythonhosted.org/packages/30/03/cf485fff699b4cdaea469bc481719d3e49f023241b4abb656f8d422189fc/pydantic_core-2.41.4-cp313-cp313-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:1affa4798520b148d7182da0615d648e752de4ab1a9566b7471bc803d88a062d", size = 2194284, upload-time = "2025-10-14T10:21:07.122Z" }, + { url = "https://files.pythonhosted.org/packages/f9/7e/c8e713db32405dfd97211f2fc0a15d6bf8adb7640f3d18544c1f39526619/pydantic_core-2.41.4-cp313-cp313-musllinux_1_1_aarch64.whl", hash = "sha256:7b74e18052fea4aa8dea2fb7dbc23d15439695da6cbe6cfc1b694af1115df09d", size = 2137566, upload-time = "2025-10-14T10:21:08.981Z" }, + { url = "https://files.pythonhosted.org/packages/04/f7/db71fd4cdccc8b75990f79ccafbbd66757e19f6d5ee724a6252414483fb4/pydantic_core-2.41.4-cp313-cp313-musllinux_1_1_armv7l.whl", hash = "sha256:285b643d75c0e30abda9dc1077395624f314a37e3c09ca402d4015ef5979f1a2", size = 2316809, upload-time = "2025-10-14T10:21:10.805Z" }, + { url = "https://files.pythonhosted.org/packages/76/63/a54973ddb945f1bca56742b48b144d85c9fc22f819ddeb9f861c249d5464/pydantic_core-2.41.4-cp313-cp313-musllinux_1_1_x86_64.whl", hash = "sha256:f52679ff4218d713b3b33f88c89ccbf3a5c2c12ba665fb80ccc4192b4608dbab", size = 2311119, upload-time = "2025-10-14T10:21:12.583Z" }, + { url = "https://files.pythonhosted.org/packages/f8/03/5d12891e93c19218af74843a27e32b94922195ded2386f7b55382f904d2f/pydantic_core-2.41.4-cp313-cp313-win32.whl", hash = "sha256:ecde6dedd6fff127c273c76821bb754d793be1024bc33314a120f83a3c69460c", size = 1981398, upload-time = "2025-10-14T10:21:14.584Z" }, + { url = "https://files.pythonhosted.org/packages/be/d8/fd0de71f39db91135b7a26996160de71c073d8635edfce8b3c3681be0d6d/pydantic_core-2.41.4-cp313-cp313-win_amd64.whl", hash = "sha256:d081a1f3800f05409ed868ebb2d74ac39dd0c1ff6c035b5162356d76030736d4", size = 2030735, upload-time = "2025-10-14T10:21:16.432Z" }, + { url = "https://files.pythonhosted.org/packages/72/86/c99921c1cf6650023c08bfab6fe2d7057a5142628ef7ccfa9921f2dda1d5/pydantic_core-2.41.4-cp313-cp313-win_arm64.whl", hash = "sha256:f8e49c9c364a7edcbe2a310f12733aad95b022495ef2a8d653f645e5d20c1564", size = 1973209, upload-time = "2025-10-14T10:21:18.213Z" }, + { url = "https://files.pythonhosted.org/packages/36/0d/b5706cacb70a8414396efdda3d72ae0542e050b591119e458e2490baf035/pydantic_core-2.41.4-cp313-cp313t-macosx_11_0_arm64.whl", hash = "sha256:ed97fd56a561f5eb5706cebe94f1ad7c13b84d98312a05546f2ad036bafe87f4", size = 1877324, upload-time = "2025-10-14T10:21:20.363Z" }, + { url = "https://files.pythonhosted.org/packages/de/2d/cba1fa02cfdea72dfb3a9babb067c83b9dff0bbcb198368e000a6b756ea7/pydantic_core-2.41.4-cp313-cp313t-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:a870c307bf1ee91fc58a9a61338ff780d01bfae45922624816878dce784095d2", size = 1884515, upload-time = "2025-10-14T10:21:22.339Z" }, + { url = "https://files.pythonhosted.org/packages/07/ea/3df927c4384ed9b503c9cc2d076cf983b4f2adb0c754578dfb1245c51e46/pydantic_core-2.41.4-cp313-cp313t-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:d25e97bc1f5f8f7985bdc2335ef9e73843bb561eb1fa6831fdfc295c1c2061cf", size = 2042819, upload-time = "2025-10-14T10:21:26.683Z" }, + { url = "https://files.pythonhosted.org/packages/6a/ee/df8e871f07074250270a3b1b82aad4cd0026b588acd5d7d3eb2fcb1471a3/pydantic_core-2.41.4-cp313-cp313t-win_amd64.whl", hash = "sha256:d405d14bea042f166512add3091c1af40437c2e7f86988f3915fabd27b1e9cd2", size = 1995866, upload-time = "2025-10-14T10:21:28.951Z" }, + { url = "https://files.pythonhosted.org/packages/fc/de/b20f4ab954d6d399499c33ec4fafc46d9551e11dc1858fb7f5dca0748ceb/pydantic_core-2.41.4-cp313-cp313t-win_arm64.whl", hash = "sha256:19f3684868309db5263a11bace3c45d93f6f24afa2ffe75a647583df22a2ff89", size = 1970034, upload-time = "2025-10-14T10:21:30.869Z" }, + { url = "https://files.pythonhosted.org/packages/54/28/d3325da57d413b9819365546eb9a6e8b7cbd9373d9380efd5f74326143e6/pydantic_core-2.41.4-cp314-cp314-macosx_10_12_x86_64.whl", hash = "sha256:e9205d97ed08a82ebb9a307e92914bb30e18cdf6f6b12ca4bedadb1588a0bfe1", size = 2102022, upload-time = "2025-10-14T10:21:32.809Z" }, + { url = "https://files.pythonhosted.org/packages/9e/24/b58a1bc0d834bf1acc4361e61233ee217169a42efbdc15a60296e13ce438/pydantic_core-2.41.4-cp314-cp314-macosx_11_0_arm64.whl", hash = "sha256:82df1f432b37d832709fbcc0e24394bba04a01b6ecf1ee87578145c19cde12ac", size = 1905495, upload-time = "2025-10-14T10:21:34.812Z" }, + { url = "https://files.pythonhosted.org/packages/fb/a4/71f759cc41b7043e8ecdaab81b985a9b6cad7cec077e0b92cff8b71ecf6b/pydantic_core-2.41.4-cp314-cp314-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:fc3b4cc4539e055cfa39a3763c939f9d409eb40e85813257dcd761985a108554", size = 1956131, upload-time = "2025-10-14T10:21:36.924Z" }, + { url = "https://files.pythonhosted.org/packages/b0/64/1e79ac7aa51f1eec7c4cda8cbe456d5d09f05fdd68b32776d72168d54275/pydantic_core-2.41.4-cp314-cp314-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:b1eb1754fce47c63d2ff57fdb88c351a6c0150995890088b33767a10218eaa4e", size = 2052236, upload-time = "2025-10-14T10:21:38.927Z" }, + { url = "https://files.pythonhosted.org/packages/e9/e3/a3ffc363bd4287b80f1d43dc1c28ba64831f8dfc237d6fec8f2661138d48/pydantic_core-2.41.4-cp314-cp314-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:e6ab5ab30ef325b443f379ddb575a34969c333004fca5a1daa0133a6ffaad616", size = 2223573, upload-time = "2025-10-14T10:21:41.574Z" }, + { url = "https://files.pythonhosted.org/packages/28/27/78814089b4d2e684a9088ede3790763c64693c3d1408ddc0a248bc789126/pydantic_core-2.41.4-cp314-cp314-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:31a41030b1d9ca497634092b46481b937ff9397a86f9f51bd41c4767b6fc04af", size = 2342467, upload-time = "2025-10-14T10:21:44.018Z" }, + { url = "https://files.pythonhosted.org/packages/92/97/4de0e2a1159cb85ad737e03306717637842c88c7fd6d97973172fb183149/pydantic_core-2.41.4-cp314-cp314-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:a44ac1738591472c3d020f61c6df1e4015180d6262ebd39bf2aeb52571b60f12", size = 2063754, upload-time = "2025-10-14T10:21:46.466Z" }, + { url = "https://files.pythonhosted.org/packages/0f/50/8cb90ce4b9efcf7ae78130afeb99fd1c86125ccdf9906ef64b9d42f37c25/pydantic_core-2.41.4-cp314-cp314-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:d72f2b5e6e82ab8f94ea7d0d42f83c487dc159c5240d8f83beae684472864e2d", size = 2196754, upload-time = "2025-10-14T10:21:48.486Z" }, + { url = "https://files.pythonhosted.org/packages/34/3b/ccdc77af9cd5082723574a1cc1bcae7a6acacc829d7c0a06201f7886a109/pydantic_core-2.41.4-cp314-cp314-musllinux_1_1_aarch64.whl", hash = "sha256:c4d1e854aaf044487d31143f541f7aafe7b482ae72a022c664b2de2e466ed0ad", size = 2137115, upload-time = "2025-10-14T10:21:50.63Z" }, + { url = "https://files.pythonhosted.org/packages/ca/ba/e7c7a02651a8f7c52dc2cff2b64a30c313e3b57c7d93703cecea76c09b71/pydantic_core-2.41.4-cp314-cp314-musllinux_1_1_armv7l.whl", hash = "sha256:b568af94267729d76e6ee5ececda4e283d07bbb28e8148bb17adad93d025d25a", size = 2317400, upload-time = "2025-10-14T10:21:52.959Z" }, + { url = "https://files.pythonhosted.org/packages/2c/ba/6c533a4ee8aec6b812c643c49bb3bd88d3f01e3cebe451bb85512d37f00f/pydantic_core-2.41.4-cp314-cp314-musllinux_1_1_x86_64.whl", hash = "sha256:6d55fb8b1e8929b341cc313a81a26e0d48aa3b519c1dbaadec3a6a2b4fcad025", size = 2312070, upload-time = "2025-10-14T10:21:55.419Z" }, + { url = "https://files.pythonhosted.org/packages/22/ae/f10524fcc0ab8d7f96cf9a74c880243576fd3e72bd8ce4f81e43d22bcab7/pydantic_core-2.41.4-cp314-cp314-win32.whl", hash = "sha256:5b66584e549e2e32a1398df11da2e0a7eff45d5c2d9db9d5667c5e6ac764d77e", size = 1982277, upload-time = "2025-10-14T10:21:57.474Z" }, + { url = "https://files.pythonhosted.org/packages/b4/dc/e5aa27aea1ad4638f0c3fb41132f7eb583bd7420ee63204e2d4333a3bbf9/pydantic_core-2.41.4-cp314-cp314-win_amd64.whl", hash = "sha256:557a0aab88664cc552285316809cab897716a372afaf8efdbef756f8b890e894", size = 2024608, upload-time = "2025-10-14T10:21:59.557Z" }, + { url = "https://files.pythonhosted.org/packages/3e/61/51d89cc2612bd147198e120a13f150afbf0bcb4615cddb049ab10b81b79e/pydantic_core-2.41.4-cp314-cp314-win_arm64.whl", hash = "sha256:3f1ea6f48a045745d0d9f325989d8abd3f1eaf47dd00485912d1a3a63c623a8d", size = 1967614, upload-time = "2025-10-14T10:22:01.847Z" }, + { url = "https://files.pythonhosted.org/packages/0d/c2/472f2e31b95eff099961fa050c376ab7156a81da194f9edb9f710f68787b/pydantic_core-2.41.4-cp314-cp314t-macosx_11_0_arm64.whl", hash = "sha256:6c1fe4c5404c448b13188dd8bd2ebc2bdd7e6727fa61ff481bcc2cca894018da", size = 1876904, upload-time = "2025-10-14T10:22:04.062Z" }, + { url = "https://files.pythonhosted.org/packages/4a/07/ea8eeb91173807ecdae4f4a5f4b150a520085b35454350fc219ba79e66a3/pydantic_core-2.41.4-cp314-cp314t-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:523e7da4d43b113bf8e7b49fa4ec0c35bf4fe66b2230bfc5c13cc498f12c6c3e", size = 1882538, upload-time = "2025-10-14T10:22:06.39Z" }, + { url = "https://files.pythonhosted.org/packages/1e/29/b53a9ca6cd366bfc928823679c6a76c7a4c69f8201c0ba7903ad18ebae2f/pydantic_core-2.41.4-cp314-cp314t-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:5729225de81fb65b70fdb1907fcf08c75d498f4a6f15af005aabb1fdadc19dfa", size = 2041183, upload-time = "2025-10-14T10:22:08.812Z" }, + { url = "https://files.pythonhosted.org/packages/c7/3d/f8c1a371ceebcaf94d6dd2d77c6cf4b1c078e13a5837aee83f760b4f7cfd/pydantic_core-2.41.4-cp314-cp314t-win_amd64.whl", hash = "sha256:de2cfbb09e88f0f795fd90cf955858fc2c691df65b1f21f0aa00b99f3fbc661d", size = 1993542, upload-time = "2025-10-14T10:22:11.332Z" }, + { url = "https://files.pythonhosted.org/packages/8a/ac/9fc61b4f9d079482a290afe8d206b8f490e9fd32d4fc03ed4fc698214e01/pydantic_core-2.41.4-cp314-cp314t-win_arm64.whl", hash = "sha256:d34f950ae05a83e0ede899c595f312ca976023ea1db100cd5aa188f7005e3ab0", size = 1973897, upload-time = "2025-10-14T10:22:13.444Z" }, +] + +[[package]] +name = "pydantic-settings" +version = "2.11.0" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "pydantic" }, + { name = "python-dotenv" }, + { name = "typing-inspection" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/20/c5/dbbc27b814c71676593d1c3f718e6cd7d4f00652cefa24b75f7aa3efb25e/pydantic_settings-2.11.0.tar.gz", hash = "sha256:d0e87a1c7d33593beb7194adb8470fc426e95ba02af83a0f23474a04c9a08180", size = 188394, upload-time = "2025-09-24T14:19:11.764Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/83/d6/887a1ff844e64aa823fb4905978d882a633cfe295c32eacad582b78a7d8b/pydantic_settings-2.11.0-py3-none-any.whl", hash = "sha256:fe2cea3413b9530d10f3a5875adffb17ada5c1e1bab0b2885546d7310415207c", size = 48608, upload-time = "2025-09-24T14:19:10.015Z" }, +] + +[[package]] +name = "pyobjc" +version = "12.0" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "pyobjc-core" }, + { name = "pyobjc-framework-accessibility", marker = "platform_release >= '20.0'" }, + { name = "pyobjc-framework-accounts", marker = "platform_release >= '12.0'" }, + { name = "pyobjc-framework-addressbook" }, + { name = "pyobjc-framework-adservices", marker = "platform_release >= '20.0'" }, + { name = "pyobjc-framework-adsupport", marker = "platform_release >= '18.0'" }, + { name = "pyobjc-framework-applescriptkit" }, + { name = "pyobjc-framework-applescriptobjc", marker = "platform_release >= '10.0'" }, + { name = "pyobjc-framework-applicationservices" }, + { name = "pyobjc-framework-apptrackingtransparency", marker = "platform_release >= '20.0'" }, + { name = "pyobjc-framework-arkit", marker = "platform_release >= '25.0'" }, + { name = "pyobjc-framework-audiovideobridging", marker = "platform_release >= '12.0'" }, + { name = "pyobjc-framework-authenticationservices", marker = "platform_release >= '19.0'" }, + { name = "pyobjc-framework-automaticassessmentconfiguration", marker = "platform_release >= '19.0'" }, + { name = "pyobjc-framework-automator" }, + { name = "pyobjc-framework-avfoundation", marker = "platform_release >= '11.0'" }, + { name = "pyobjc-framework-avkit", marker = "platform_release >= '13.0'" }, + { name = "pyobjc-framework-avrouting", marker = "platform_release >= '22.0'" }, + { name = "pyobjc-framework-backgroundassets", marker = "platform_release >= '22.0'" }, + { name = "pyobjc-framework-browserenginekit", marker = "platform_release >= '23.4'" }, + { name = "pyobjc-framework-businesschat", marker = "platform_release >= '18.0'" }, + { name = "pyobjc-framework-calendarstore", marker = "platform_release >= '9.0'" }, + { name = "pyobjc-framework-callkit", marker = "platform_release >= '20.0'" }, + { name = "pyobjc-framework-carbon" }, + { name = "pyobjc-framework-cfnetwork" }, + { name = "pyobjc-framework-cinematic", marker = "platform_release >= '23.0'" }, + { name = "pyobjc-framework-classkit", marker = "platform_release >= '20.0'" }, + { name = "pyobjc-framework-cloudkit", marker = "platform_release >= '14.0'" }, + { name = "pyobjc-framework-cocoa" }, + { name = "pyobjc-framework-collaboration", marker = "platform_release >= '9.0'" }, + { name = "pyobjc-framework-colorsync", marker = "platform_release >= '17.0'" }, + { name = "pyobjc-framework-compositorservices", marker = "platform_release >= '25.0'" }, + { name = "pyobjc-framework-contacts", marker = "platform_release >= '15.0'" }, + { name = "pyobjc-framework-contactsui", marker = "platform_release >= '15.0'" }, + { name = "pyobjc-framework-coreaudio" }, + { name = "pyobjc-framework-coreaudiokit" }, + { name = "pyobjc-framework-corebluetooth", marker = "platform_release >= '14.0'" }, + { name = "pyobjc-framework-coredata" }, + { name = "pyobjc-framework-corehaptics", marker = "platform_release >= '19.0'" }, + { name = "pyobjc-framework-corelocation", marker = "platform_release >= '10.0'" }, + { name = "pyobjc-framework-coremedia", marker = "platform_release >= '11.0'" }, + { name = "pyobjc-framework-coremediaio", marker = "platform_release >= '11.0'" }, + { name = "pyobjc-framework-coremidi" }, + { name = "pyobjc-framework-coreml", marker = "platform_release >= '17.0'" }, + { name = "pyobjc-framework-coremotion", marker = "platform_release >= '19.0'" }, + { name = "pyobjc-framework-coreservices" }, + { name = "pyobjc-framework-corespotlight", marker = "platform_release >= '17.0'" }, + { name = "pyobjc-framework-coretext" }, + { name = "pyobjc-framework-corewlan", marker = "platform_release >= '10.0'" }, + { name = "pyobjc-framework-cryptotokenkit", marker = "platform_release >= '14.0'" }, + { name = "pyobjc-framework-datadetection", marker = "platform_release >= '21.0'" }, + { name = "pyobjc-framework-devicecheck", marker = "platform_release >= '19.0'" }, + { name = "pyobjc-framework-devicediscoveryextension", marker = "platform_release >= '24.0'" }, + { name = "pyobjc-framework-dictionaryservices", marker = "platform_release >= '9.0'" }, + { name = "pyobjc-framework-discrecording" }, + { name = "pyobjc-framework-discrecordingui" }, + { name = "pyobjc-framework-diskarbitration" }, + { name = "pyobjc-framework-dvdplayback" }, + { name = "pyobjc-framework-eventkit", marker = "platform_release >= '12.0'" }, + { name = "pyobjc-framework-exceptionhandling" }, + { name = "pyobjc-framework-executionpolicy", marker = "platform_release >= '19.0'" }, + { name = "pyobjc-framework-extensionkit", marker = "platform_release >= '22.0'" }, + { name = "pyobjc-framework-externalaccessory", marker = "platform_release >= '17.0'" }, + { name = "pyobjc-framework-fileprovider", marker = "platform_release >= '19.0'" }, + { name = "pyobjc-framework-fileproviderui", marker = "platform_release >= '19.0'" }, + { name = "pyobjc-framework-findersync", marker = "platform_release >= '14.0'" }, + { name = "pyobjc-framework-fsevents", marker = "platform_release >= '9.0'" }, + { name = "pyobjc-framework-fskit", marker = "platform_release >= '24.4'" }, + { name = "pyobjc-framework-gamecenter", marker = "platform_release >= '12.0'" }, + { name = "pyobjc-framework-gamecontroller", marker = "platform_release >= '13.0'" }, + { name = "pyobjc-framework-gamekit", marker = "platform_release >= '12.0'" }, + { name = "pyobjc-framework-gameplaykit", marker = "platform_release >= '15.0'" }, + { name = "pyobjc-framework-gamesave", marker = "platform_release >= '25.0'" }, + { name = "pyobjc-framework-healthkit", marker = "platform_release >= '22.0'" }, + { name = "pyobjc-framework-imagecapturecore", marker = "platform_release >= '10.0'" }, + { name = "pyobjc-framework-inputmethodkit", marker = "platform_release >= '9.0'" }, + { name = "pyobjc-framework-installerplugins" }, + { name = "pyobjc-framework-instantmessage", marker = "platform_release >= '9.0'" }, + { name = "pyobjc-framework-intents", marker = "platform_release >= '16.0'" }, + { name = "pyobjc-framework-intentsui", marker = "platform_release >= '21.0'" }, + { name = "pyobjc-framework-iobluetooth" }, + { name = "pyobjc-framework-iobluetoothui" }, + { name = "pyobjc-framework-iosurface", marker = "platform_release >= '10.0'" }, + { name = "pyobjc-framework-ituneslibrary", marker = "platform_release >= '10.0'" }, + { name = "pyobjc-framework-kernelmanagement", marker = "platform_release >= '20.0'" }, + { name = "pyobjc-framework-latentsemanticmapping" }, + { name = "pyobjc-framework-launchservices" }, + { name = "pyobjc-framework-libdispatch", marker = "platform_release >= '12.0'" }, + { name = "pyobjc-framework-libxpc", marker = "platform_release >= '12.0'" }, + { name = "pyobjc-framework-linkpresentation", marker = "platform_release >= '19.0'" }, + { name = "pyobjc-framework-localauthentication", marker = "platform_release >= '14.0'" }, + { name = "pyobjc-framework-localauthenticationembeddedui", marker = "platform_release >= '21.0'" }, + { name = "pyobjc-framework-mailkit", marker = "platform_release >= '21.0'" }, + { name = "pyobjc-framework-mapkit", marker = "platform_release >= '13.0'" }, + { name = "pyobjc-framework-mediaaccessibility", marker = "platform_release >= '13.0'" }, + { name = "pyobjc-framework-mediaextension", marker = "platform_release >= '24.0'" }, + { name = "pyobjc-framework-medialibrary", marker = "platform_release >= '13.0'" }, + { name = "pyobjc-framework-mediaplayer", marker = "platform_release >= '16.0'" }, + { name = "pyobjc-framework-mediatoolbox", marker = "platform_release >= '13.0'" }, + { name = "pyobjc-framework-metal", marker = "platform_release >= '15.0'" }, + { name = "pyobjc-framework-metalfx", marker = "platform_release >= '22.0'" }, + { name = "pyobjc-framework-metalkit", marker = "platform_release >= '15.0'" }, + { name = "pyobjc-framework-metalperformanceshaders", marker = "platform_release >= '17.0'" }, + { name = "pyobjc-framework-metalperformanceshadersgraph", marker = "platform_release >= '20.0'" }, + { name = "pyobjc-framework-metrickit", marker = "platform_release >= '21.0'" }, + { name = "pyobjc-framework-mlcompute", marker = "platform_release >= '20.0'" }, + { name = "pyobjc-framework-modelio", marker = "platform_release >= '15.0'" }, + { name = "pyobjc-framework-multipeerconnectivity", marker = "platform_release >= '14.0'" }, + { name = "pyobjc-framework-naturallanguage", marker = "platform_release >= '18.0'" }, + { name = "pyobjc-framework-netfs", marker = "platform_release >= '10.0'" }, + { name = "pyobjc-framework-network", marker = "platform_release >= '18.0'" }, + { name = "pyobjc-framework-networkextension", marker = "platform_release >= '15.0'" }, + { name = "pyobjc-framework-notificationcenter", marker = "platform_release >= '14.0'" }, + { name = "pyobjc-framework-opendirectory", marker = "platform_release >= '10.0'" }, + { name = "pyobjc-framework-osakit" }, + { name = "pyobjc-framework-oslog", marker = "platform_release >= '19.0'" }, + { name = "pyobjc-framework-passkit", marker = "platform_release >= '20.0'" }, + { name = "pyobjc-framework-pencilkit", marker = "platform_release >= '19.0'" }, + { name = "pyobjc-framework-phase", marker = "platform_release >= '21.0'" }, + { name = "pyobjc-framework-photos", marker = "platform_release >= '15.0'" }, + { name = "pyobjc-framework-photosui", marker = "platform_release >= '15.0'" }, + { name = "pyobjc-framework-preferencepanes" }, + { name = "pyobjc-framework-pushkit", marker = "platform_release >= '19.0'" }, + { name = "pyobjc-framework-quartz" }, + { name = "pyobjc-framework-quicklookthumbnailing", marker = "platform_release >= '19.0'" }, + { name = "pyobjc-framework-replaykit", marker = "platform_release >= '20.0'" }, + { name = "pyobjc-framework-safariservices", marker = "platform_release >= '16.0'" }, + { name = "pyobjc-framework-safetykit", marker = "platform_release >= '22.0'" }, + { name = "pyobjc-framework-scenekit", marker = "platform_release >= '11.0'" }, + { name = "pyobjc-framework-screencapturekit", marker = "platform_release >= '21.4'" }, + { name = "pyobjc-framework-screensaver" }, + { name = "pyobjc-framework-screentime", marker = "platform_release >= '20.0'" }, + { name = "pyobjc-framework-scriptingbridge", marker = "platform_release >= '9.0'" }, + { name = "pyobjc-framework-searchkit" }, + { name = "pyobjc-framework-security" }, + { name = "pyobjc-framework-securityfoundation" }, + { name = "pyobjc-framework-securityinterface" }, + { name = "pyobjc-framework-securityui", marker = "platform_release >= '24.4'" }, + { name = "pyobjc-framework-sensitivecontentanalysis", marker = "platform_release >= '23.0'" }, + { name = "pyobjc-framework-servicemanagement", marker = "platform_release >= '10.0'" }, + { name = "pyobjc-framework-sharedwithyou", marker = "platform_release >= '22.0'" }, + { name = "pyobjc-framework-sharedwithyoucore", marker = "platform_release >= '22.0'" }, + { name = "pyobjc-framework-shazamkit", marker = "platform_release >= '21.0'" }, + { name = "pyobjc-framework-social", marker = "platform_release >= '12.0'" }, + { name = "pyobjc-framework-soundanalysis", marker = "platform_release >= '19.0'" }, + { name = "pyobjc-framework-speech", marker = "platform_release >= '19.0'" }, + { name = "pyobjc-framework-spritekit", marker = "platform_release >= '13.0'" }, + { name = "pyobjc-framework-storekit", marker = "platform_release >= '11.0'" }, + { name = "pyobjc-framework-symbols", marker = "platform_release >= '23.0'" }, + { name = "pyobjc-framework-syncservices" }, + { name = "pyobjc-framework-systemconfiguration" }, + { name = "pyobjc-framework-systemextensions", marker = "platform_release >= '19.0'" }, + { name = "pyobjc-framework-threadnetwork", marker = "platform_release >= '22.0'" }, + { name = "pyobjc-framework-uniformtypeidentifiers", marker = "platform_release >= '20.0'" }, + { name = "pyobjc-framework-usernotifications", marker = "platform_release >= '18.0'" }, + { name = "pyobjc-framework-usernotificationsui", marker = "platform_release >= '20.0'" }, + { name = "pyobjc-framework-videosubscriberaccount", marker = "platform_release >= '18.0'" }, + { name = "pyobjc-framework-videotoolbox", marker = "platform_release >= '12.0'" }, + { name = "pyobjc-framework-virtualization", marker = "platform_release >= '20.0'" }, + { name = "pyobjc-framework-vision", marker = "platform_release >= '17.0'" }, + { name = "pyobjc-framework-webkit" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/36/0f/0b21447c9461905022aab2f19626e94a0b00eee9c6d3593a5ab425f7a42e/pyobjc-12.0.tar.gz", hash = "sha256:ce6b7c68889722248250d1b4daac28272100634e3a9826affdbd6f36a0dc52b2", size = 11236, upload-time = "2025-10-21T08:25:05.018Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/3f/36/f5335452694fb4bc0dd69affe516886abde64ad43ed88d9b104d822a29de/pyobjc-12.0-py3-none-any.whl", hash = "sha256:cc0004c8e615d4b99f4910804477b322d951d472d5ee20bfef8f390ea734d038", size = 4204, upload-time = "2025-10-21T07:49:12.453Z" }, +] + +[[package]] +name = "pyobjc-core" +version = "12.0" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/ab/dc/6d63019133e39e2b299dfbab786e64997fff0f145c45a417e1dd51faaf3f/pyobjc_core-12.0.tar.gz", hash = "sha256:7e05c805a776149a937b61b892a0459895d32d9002bedc95ce2be31ef1e37a29", size = 991669, upload-time = "2025-10-21T08:26:07.496Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/88/17/6c247bf9d8de2813f6015671f242333534797e81bdac9e85516fb57dfb00/pyobjc_core-12.0-cp313-cp313-macosx_10_13_universal2.whl", hash = "sha256:c44b76d8306a130c9eb0cb79d86fd6675c8ba3e5b458e78095d271a10cd38b6a", size = 679700, upload-time = "2025-10-21T07:51:09.518Z" }, + { url = "https://files.pythonhosted.org/packages/08/a3/1b26c438c78821e5a82b9c02f7b19a86097aeb2c51132d06e159acc22dc2/pyobjc_core-12.0-cp313-cp313t-macosx_10_13_universal2.whl", hash = "sha256:5c617551e0ab860c49229fcec0135a5cde702485f22254ddc17205eb24b7fc55", size = 721370, upload-time = "2025-10-21T07:51:55.981Z" }, + { url = "https://files.pythonhosted.org/packages/35/b1/6df7d4b0d9f0088855a59f6af59230d1191f78fa84ca68851723272f1916/pyobjc_core-12.0-cp314-cp314-macosx_10_15_universal2.whl", hash = "sha256:c2709ff43ac5c2e9e2c574ae515d3aa0e470345847a4d96c5d4a04b1b86e966d", size = 672302, upload-time = "2025-10-21T07:52:39.445Z" }, + { url = "https://files.pythonhosted.org/packages/f8/10/3a029797c0a22c730ee0d0149ac34ab27afdf51667f96aa23a8ebe7dc3c9/pyobjc_core-12.0-cp314-cp314t-macosx_10_15_universal2.whl", hash = "sha256:eb6b987e53291e7cafd8f71a80a2dd44d7afec4202a143a3e47b75cb9cdb5716", size = 713255, upload-time = "2025-10-21T07:53:25.478Z" }, +] + +[[package]] +name = "pyobjc-framework-accessibility" +version = "12.0" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "pyobjc-core" }, + { name = "pyobjc-framework-cocoa" }, + { name = "pyobjc-framework-quartz" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/87/77/28cf2885e6964932773456114ba1012e2a5c60f31582a2dc4980aa6018a9/pyobjc_framework_accessibility-12.0.tar.gz", hash = "sha256:a7794887330d4e50d41af72633d08aa41a9e946a80c49b4ede4a2f7936751c46", size = 30002, upload-time = "2025-10-21T08:26:11.274Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/2d/12/2548c021c31e9931a026ace2f85ab9e8c2781f8916e5773398e198a53bc8/pyobjc_framework_accessibility-12.0-cp313-cp313-macosx_10_13_universal2.whl", hash = "sha256:3a7aa16ff51111d19992dbe971a52f9cd21afacadd18c4912d266405d834a6a1", size = 11320, upload-time = "2025-10-21T07:53:34.133Z" }, + { url = "https://files.pythonhosted.org/packages/45/a1/3c28c9235c808cb29964178d71859bfcfbc5446c78cf1d8ae45c72a4e3e6/pyobjc_framework_accessibility-12.0-cp313-cp313t-macosx_10_13_universal2.whl", hash = "sha256:93a7bbfad141ef389935cb84cc2ce3a564b88828440167131b8e15b4407fccd0", size = 11489, upload-time = "2025-10-21T07:53:36.865Z" }, + { url = "https://files.pythonhosted.org/packages/da/3f/bf0f22de28f179a11c465b5aa41d2e8fd5013819825bf2256529808d39b7/pyobjc_framework_accessibility-12.0-cp314-cp314-macosx_10_15_universal2.whl", hash = "sha256:7e304153f4c031ed6a3c573d7234eaf95684420f1341e305ebd62e5822b531b1", size = 11380, upload-time = "2025-10-21T07:53:38.657Z" }, + { url = "https://files.pythonhosted.org/packages/40/40/65d2a26235363c2602b88279b105a8b368a4de32c71863ae9497304275d5/pyobjc_framework_accessibility-12.0-cp314-cp314t-macosx_10_15_universal2.whl", hash = "sha256:61b82d8f05c61f4a052066460caffd96516b964516c4bc487c6143c6642f36a4", size = 11567, upload-time = "2025-10-21T07:53:40.389Z" }, +] + +[[package]] +name = "pyobjc-framework-accounts" +version = "12.0" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "pyobjc-core" }, + { name = "pyobjc-framework-cocoa" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/e3/77/da53be3992e793a857fb07fe3dfc3a595b9c2365f00451578d2843413d30/pyobjc_framework_accounts-12.0.tar.gz", hash = "sha256:48fa0d270208655fa47b89452fa3ef5eadadf61ecf5935b83f22bcb3c28feabe", size = 15288, upload-time = "2025-10-21T08:26:13.567Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/33/b3/e18aa7763b1de9a116862a022f21d35fbedeb5e8d4aff9633446d3088bef/pyobjc_framework_accounts-12.0-py2.py3-none-any.whl", hash = "sha256:9a12dcb35c4367ab846abcd3a529778ba527155b31249380a8eb360baacdcb05", size = 5116, upload-time = "2025-10-21T07:53:41.836Z" }, +] + +[[package]] +name = "pyobjc-framework-addressbook" +version = "12.0" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "pyobjc-core" }, + { name = "pyobjc-framework-cocoa" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/b4/9e/fed3073b5e712d3ed14d27410f03e84c1ea164c560ac7b597b1e6fc8dea8/pyobjc_framework_addressbook-12.0.tar.gz", hash = "sha256:1004b7d8e610748c9ce61aeab766319c2632d1e314838e95eb10f0dd6a64f3d8", size = 44733, upload-time = "2025-10-21T08:26:17.23Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/11/f7/e794035122e8ec21f2411483145a966ef1716cfba6001b1d657325b6cdb4/pyobjc_framework_addressbook-12.0-cp313-cp313-macosx_10_13_universal2.whl", hash = "sha256:05ade2fada2ba7601799a2243496fefdb9e708157e4676c07f29b741c78edc5b", size = 12919, upload-time = "2025-10-21T07:53:50.289Z" }, + { url = "https://files.pythonhosted.org/packages/fc/ac/242cf2b0d292b28ff00ebb8f46cfd6882c0dc4a72662ad22243eed80eda0/pyobjc_framework_addressbook-12.0-cp313-cp313t-macosx_10_13_universal2.whl", hash = "sha256:87ed2a5004ff58778b999e7006ba325659d3e74ba6cbe97f73108ce65240b1fb", size = 13074, upload-time = "2025-10-21T07:53:52.583Z" }, + { url = "https://files.pythonhosted.org/packages/76/d8/6d23d431d87384f55b85fe47f8c8deda9f025c9ff2c6ac46325ddbc0af7e/pyobjc_framework_addressbook-12.0-cp314-cp314-macosx_10_15_universal2.whl", hash = "sha256:10c8274a4f369c27f608ed4e36343dc5a37e11f53adfb4069124e290e1af3bba", size = 12977, upload-time = "2025-10-21T07:53:54.444Z" }, + { url = "https://files.pythonhosted.org/packages/ee/45/dec0a83a532dc345bd013f04c4d8e0aa117aa1e2c3fbc79891f8057d41f9/pyobjc_framework_addressbook-12.0-cp314-cp314t-macosx_10_15_universal2.whl", hash = "sha256:c541a39c51988ed1e29043a6bd23ac31e37edf2fe9b41bc0b09bf1cbb4d4f632", size = 13142, upload-time = "2025-10-21T07:53:56.314Z" }, +] + +[[package]] +name = "pyobjc-framework-adservices" +version = "12.0" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "pyobjc-core" }, + { name = "pyobjc-framework-cocoa" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/d1/63/98e08ce5ba933b104fe73126c1050fc2a4c02ebd654f1ecba272d98892d2/pyobjc_framework_adservices-12.0.tar.gz", hash = "sha256:e58ec0c617f9967d1c1b717fb291ce675555f7ece0b3999d2e8b74d2a49c161e", size = 11834, upload-time = "2025-10-21T08:26:19.448Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/dc/26/ecad8d077c3ce9662fdd57c6c0d1d6ba89b8bd96bcfe4ed28f6c214365f8/pyobjc_framework_adservices-12.0-py2.py3-none-any.whl", hash = "sha256:bf6f6992a00295e936a0cde486f20cf0747b0341d317ead3a353c6c7d327a2e2", size = 3505, upload-time = "2025-10-21T07:53:57.987Z" }, +] + +[[package]] +name = "pyobjc-framework-adsupport" +version = "12.0" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "pyobjc-core" }, + { name = "pyobjc-framework-cocoa" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/b0/e2/0deac6d431ba4b319784b8b25e6bd060385556d50ff1b76aab7b43d54972/pyobjc_framework_adsupport-12.0.tar.gz", hash = "sha256:accaaa66739260b5420aa085cfb1dd1fc4b0b52c59076124b9355bd60d2c129c", size = 11714, upload-time = "2025-10-21T08:26:21.098Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/48/bb/82529e38c1f83f08a4f84241e2935ad3c545142a8e7d65d9c5461e6ca56e/pyobjc_framework_adsupport-12.0-py2.py3-none-any.whl", hash = "sha256:649fb4114cf1f16bb9c402c360a39eb0ea84e72e49cd6db5451a2806bbc05b24", size = 3412, upload-time = "2025-10-21T07:53:59.452Z" }, +] + +[[package]] +name = "pyobjc-framework-applescriptkit" +version = "12.0" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "pyobjc-core" }, + { name = "pyobjc-framework-cocoa" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/e4/ee/9f861171c5dbc1f132e884415e573038372fb1af83c1d23fdaeae20ab4e3/pyobjc_framework_applescriptkit-12.0.tar.gz", hash = "sha256:69f57f2f6dd72bdb83f69e33839438caf804302fb177e00136cd49a172e6cc32", size = 11504, upload-time = "2025-10-21T08:26:22.979Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/0b/84/595a8acb19958de210f04c5d79bff30337d04ca00c20374db4acbfe5c83d/pyobjc_framework_applescriptkit-12.0-py2.py3-none-any.whl", hash = "sha256:940e10bc281a0155a01f817275b11c6819ae773891847c8c90403d27aa6efb5d", size = 4363, upload-time = "2025-10-21T07:54:00.974Z" }, +] + +[[package]] +name = "pyobjc-framework-applescriptobjc" +version = "12.0" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "pyobjc-core" }, + { name = "pyobjc-framework-cocoa" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/2a/81/28f123566793ff9037a218a393272a569020ebd228f343dccb6920855355/pyobjc_framework_applescriptobjc-12.0.tar.gz", hash = "sha256:5d89b060fa960bc34b5a505cd5fbbd3625c8035d7246ff0315a00acb205e8a92", size = 11624, upload-time = "2025-10-21T08:26:24.955Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/3d/e7/f53cb5ade63db949ecde23bdcc20867453f24d6faf29b9fa2a2276ab252c/pyobjc_framework_applescriptobjc-12.0-py2.py3-none-any.whl", hash = "sha256:6b4926a29ea2cefea482ff28152dda0e05f2f8ec6d9f84d97a6d19bb872f824b", size = 4461, upload-time = "2025-10-21T07:54:02.723Z" }, +] + +[[package]] +name = "pyobjc-framework-applicationservices" +version = "12.0" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "pyobjc-core" }, + { name = "pyobjc-framework-cocoa" }, + { name = "pyobjc-framework-coretext" }, + { name = "pyobjc-framework-quartz" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/8c/79/0b7a00bcc7561c816281382c933a46aa7a90acca48b942054b7d32d0caf7/pyobjc_framework_applicationservices-12.0.tar.gz", hash = "sha256:eabbf6c57573158714aa656e5d0112330a87692db336aae7e94e216db89e93be", size = 103595, upload-time = "2025-10-21T08:26:32.651Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/9b/cf/ae603c46217c04ec7598c62a2d46fa9b6ab66e127148bff1f352b850fc72/pyobjc_framework_applicationservices-12.0-cp313-cp313-macosx_10_13_universal2.whl", hash = "sha256:9ff39c0301f2430253fbfea114afb00594426e0b66a1bec1c28cd60f75d02005", size = 32871, upload-time = "2025-10-21T07:54:15.33Z" }, + { url = "https://files.pythonhosted.org/packages/c6/79/a578c8b1aa8634c2c9f8bbd66a3cdc385013a4cd9558741a4da26c040e51/pyobjc_framework_applicationservices-12.0-cp313-cp313t-macosx_10_13_universal2.whl", hash = "sha256:ecd7651ab330790722f3590465392dbab3d76be0370ff7e015584053d571e218", size = 33132, upload-time = "2025-10-21T07:54:18.388Z" }, + { url = "https://files.pythonhosted.org/packages/ce/8b/336788981a3c1aa00e75d021a5ed00e453587da1eee0d55bb8b674f2b623/pyobjc_framework_applicationservices-12.0-cp314-cp314-macosx_10_15_universal2.whl", hash = "sha256:b153a0b8e915751ca50651be6f9fe002ef7536677f5c37a4dff0f3fd98e5b16a", size = 33007, upload-time = "2025-10-21T07:54:21.971Z" }, + { url = "https://files.pythonhosted.org/packages/a8/50/0e300544e8204d02b4a0477fa157e904921c98b15f67e19b4a49a80f02c9/pyobjc_framework_applicationservices-12.0-cp314-cp314t-macosx_10_15_universal2.whl", hash = "sha256:56f8fabdc3972fc9a97630b24c31d8b852502c3273071ab3d3b467cc5e7c6431", size = 33250, upload-time = "2025-10-21T07:54:25.395Z" }, +] + +[[package]] +name = "pyobjc-framework-apptrackingtransparency" +version = "12.0" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "pyobjc-core" }, + { name = "pyobjc-framework-cocoa" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/78/bb/7cde677be892d94ca07b82612704861899710865e650530c5a0fed91fbea/pyobjc_framework_apptrackingtransparency-12.0.tar.gz", hash = "sha256:22bd689ab7a6b457ece8bf86cad615af10c2f36203ea4307273f74e4e372cdf4", size = 12468, upload-time = "2025-10-21T08:26:34.845Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/ed/42/1fd41fd755fb686f2842a51610351904e1414448fe306fa3ff2d9a72e8dd/pyobjc_framework_apptrackingtransparency-12.0-py2.py3-none-any.whl", hash = "sha256:543d9eb6ce6397930b8eb6e7162e6592f708f251f2fd6e9307bfa965daf10f7d", size = 3891, upload-time = "2025-10-21T07:54:26.96Z" }, +] + +[[package]] +name = "pyobjc-framework-arkit" +version = "12.0" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "pyobjc-core" }, + { name = "pyobjc-framework-cocoa" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/3b/32/edd3198e33e9ad0e5d47cb228c1346a05a6523d242af1f9dd74ec2ef3c8b/pyobjc_framework_arkit-12.0.tar.gz", hash = "sha256:29c34f5db22f084cf1ae285562a5ad6522f9166d725eb55df987021f8d02e257", size = 35830, upload-time = "2025-10-21T08:26:37.852Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/63/23/43d3032baebebb2d35055c56a3c42f31a68fb84dc80443e565644ac213c0/pyobjc_framework_arkit-12.0-py2.py3-none-any.whl", hash = "sha256:90997c4e205bb2023886f59de635d1d9ded139d0add8d9941c8ebb69d5a92284", size = 8310, upload-time = "2025-10-21T07:54:28.73Z" }, +] + +[[package]] +name = "pyobjc-framework-audiovideobridging" +version = "12.0" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "pyobjc-core" }, + { name = "pyobjc-framework-cocoa" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/a9/16/92f2ecb7ad7329ff25b44b7cc1d7bd6dbf56bc4511c99cd1b157d4f4941f/pyobjc_framework_audiovideobridging-12.0.tar.gz", hash = "sha256:b38b564b4b2f5edbba8bfde8e0c26eef3a7a654faf0ad0a1b2a1ea6219371772", size = 38916, upload-time = "2025-10-21T08:26:41.219Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/7e/97/0ffc62736fd0326ce2c9cbff469dea3fc8d00f9a994b533476fdef8c1fc9/pyobjc_framework_audiovideobridging-12.0-cp313-cp313-macosx_10_13_universal2.whl", hash = "sha256:792a70c1111480a75732cbbc7004c071f2a3d6aedddff8d2af22727fb235a519", size = 11078, upload-time = "2025-10-21T07:54:36.374Z" }, + { url = "https://files.pythonhosted.org/packages/23/96/237a77a7a09f4a1bd6b52f84aaa628e3adfd62e31ed299ff6868f97e5f55/pyobjc_framework_audiovideobridging-12.0-cp313-cp313t-macosx_10_13_universal2.whl", hash = "sha256:ff02fefd09bcb3636bb3891bec850ed60940c06e57ee6463ac48df27ada6ecd1", size = 11250, upload-time = "2025-10-21T07:54:38.121Z" }, + { url = "https://files.pythonhosted.org/packages/df/9b/fd15d1586e6b6df028eeda202629093d6c60e0d7327986381c4e9b31cb08/pyobjc_framework_audiovideobridging-12.0-cp314-cp314-macosx_10_15_universal2.whl", hash = "sha256:d847c0982df26014326e27aeecdbec803d48663a3bdbeb0b2492820bdb43b789", size = 11138, upload-time = "2025-10-21T07:54:40.273Z" }, + { url = "https://files.pythonhosted.org/packages/77/92/ecdbf0e1c3455884a01744982533605b0304a7d33c669642bce2301b237c/pyobjc_framework_audiovideobridging-12.0-cp314-cp314t-macosx_10_15_universal2.whl", hash = "sha256:4f30bb5aa605a5330fde3ab51f238130fb3cfb6227fc3b466bbdf8388b33bcc4", size = 11311, upload-time = "2025-10-21T07:54:42.061Z" }, +] + +[[package]] +name = "pyobjc-framework-authenticationservices" +version = "12.0" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "pyobjc-core" }, + { name = "pyobjc-framework-cocoa" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/37/09/2e51e8e72a72536c3721124bdd6ac93f88ec28ad352a35437536ec08c70f/pyobjc_framework_authenticationservices-12.0.tar.gz", hash = "sha256:6dbc94140584d439d5106fd3b64db97c3681ff27c9b3793a6e7885df9974af16", size = 58917, upload-time = "2025-10-21T08:26:46.164Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/25/cf/6c5ab3861d2ea4e65f760955d57f8c2f2b2342480ea4d58ea395ad77232b/pyobjc_framework_authenticationservices-12.0-cp313-cp313-macosx_10_13_universal2.whl", hash = "sha256:113e6cf5db0f04194e5fa290f03c32390d667e330b524cdf62a47df1b5974917", size = 20744, upload-time = "2025-10-21T07:54:52.482Z" }, + { url = "https://files.pythonhosted.org/packages/be/e6/2958b9cc06808c2e129bb9e13184818227c7b42b7dcbcde41f7d66153e80/pyobjc_framework_authenticationservices-12.0-cp313-cp313t-macosx_10_13_universal2.whl", hash = "sha256:ee7a913fa66a7adedfeadb6a663096945119ce0b8c237ed2db3b328b083d1e91", size = 20991, upload-time = "2025-10-21T07:54:55.105Z" }, + { url = "https://files.pythonhosted.org/packages/83/4a/31cd3c2bc7538f81d047e64fed7e7034a35d8227d6633bc341a18c5cd9e5/pyobjc_framework_authenticationservices-12.0-cp314-cp314-macosx_10_15_universal2.whl", hash = "sha256:0e31113dc12946dfd15aa5d0f2933aa077b69b0510f213fd6517192e27a09cb9", size = 20750, upload-time = "2025-10-21T07:54:57.336Z" }, + { url = "https://files.pythonhosted.org/packages/2a/1c/b124c0d9aec42bd770e9803743e52228202c709f7183265d6996db0cec5b/pyobjc_framework_authenticationservices-12.0-cp314-cp314t-macosx_10_15_universal2.whl", hash = "sha256:46cbdbfa8ad581cf1d3e0da9e1256a92b663aab42f3a89a9acf2fd8fe4f99e94", size = 21027, upload-time = "2025-10-21T07:54:59.662Z" }, +] + +[[package]] +name = "pyobjc-framework-automaticassessmentconfiguration" +version = "12.0" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "pyobjc-core" }, + { name = "pyobjc-framework-cocoa" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/1c/74/e1bb0cfd93cfbdfec173c141d2bbb619e9b500551209ba9d8da81e896665/pyobjc_framework_automaticassessmentconfiguration-12.0.tar.gz", hash = "sha256:8922e5366d2cd6e09f8366e85afe012f9b7fa81d192f98674daa55f098de3f1e", size = 22045, upload-time = "2025-10-21T08:26:48.589Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/aa/02/b1afb728f6369b18824f139d89ac3b500beddd3f93e3993da9e9b12943fb/pyobjc_framework_automaticassessmentconfiguration-12.0-cp313-cp313-macosx_10_13_universal2.whl", hash = "sha256:c44bf1d4980b35e16858a93a357df73cd77b972096e4675b57058f4d2095b82d", size = 9309, upload-time = "2025-10-21T07:55:08.337Z" }, + { url = "https://files.pythonhosted.org/packages/50/2a/e992f84082e9daa857f771b85fca96cdc0e7edad93511228e7514bf24368/pyobjc_framework_automaticassessmentconfiguration-12.0-cp313-cp313t-macosx_10_13_universal2.whl", hash = "sha256:818fef0fb48d122676422f9b639573eefd7fb05814ec28ca0f7de5e669895bbb", size = 9459, upload-time = "2025-10-21T07:55:10.043Z" }, + { url = "https://files.pythonhosted.org/packages/17/24/10d1119a6fdbf933bf9128baa8dee30b7c30aa3b2c212c3a58ace111dd15/pyobjc_framework_automaticassessmentconfiguration-12.0-cp314-cp314-macosx_10_15_universal2.whl", hash = "sha256:af22320b893869ecc2371af831de483bc7d0f885c7a032456c9ea90f95d57911", size = 9350, upload-time = "2025-10-21T07:55:11.756Z" }, + { url = "https://files.pythonhosted.org/packages/c9/a9/c4582418bbd114c4fcb5c86d8c126878ee34dfc05ff368a7991562b40330/pyobjc_framework_automaticassessmentconfiguration-12.0-cp314-cp314t-macosx_10_15_universal2.whl", hash = "sha256:12d8c2f3ab3d8790ab1d84deee6d5c21eff7808a876e31995d4474e76703fcb0", size = 9504, upload-time = "2025-10-21T07:55:13.409Z" }, +] + +[[package]] +name = "pyobjc-framework-automator" +version = "12.0" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "pyobjc-core" }, + { name = "pyobjc-framework-cocoa" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/25/d3/17178d3c6fde3f95718f9832a799d2328e59ba5158d1434fe2767c957187/pyobjc_framework_automator-12.0.tar.gz", hash = "sha256:7c2f0236b2a474a2d411835419e8f140e0f563be299f770fe8762f96d254443d", size = 186429, upload-time = "2025-10-21T08:27:01.249Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/96/d0/f138a72276e6f5a43d5e8e0b4de9f3d22ee9f018b5871385bcbac14e4dbd/pyobjc_framework_automator-12.0-cp313-cp313-macosx_10_13_universal2.whl", hash = "sha256:e4e79a42f45602c6d971f9c33c3dab391fd2338b2feb62835b5fdf3137b3bce6", size = 10054, upload-time = "2025-10-21T07:55:20.203Z" }, + { url = "https://files.pythonhosted.org/packages/fb/e4/13828164bffffd8e97f3bc0772a1756fa2854e17b50d3ff6605f16b8c53d/pyobjc_framework_automator-12.0-cp313-cp313t-macosx_10_13_universal2.whl", hash = "sha256:1316ad293eadf1dda832303b7b05dc5fb435087e67a831f0b6b2d6f3b06d0cd0", size = 10198, upload-time = "2025-10-21T07:55:22.141Z" }, + { url = "https://files.pythonhosted.org/packages/05/0f/e5a5e613afc279e3f080290aec787281cb60ebfe011e9e1d41b5c0d5c4c2/pyobjc_framework_automator-12.0-cp314-cp314-macosx_10_15_universal2.whl", hash = "sha256:a299effc6d1322f439e4d02d174fd9865610873c9a0e5d8868b7ae9038a8e563", size = 10104, upload-time = "2025-10-21T07:55:23.784Z" }, + { url = "https://files.pythonhosted.org/packages/2b/89/77c37ab4cb895e82da94163a3b99a5e2624ba050ab47bc7a04e29b02869b/pyobjc_framework_automator-12.0-cp314-cp314t-macosx_10_15_universal2.whl", hash = "sha256:db5e3b0fd4a9defaa316efc46ea6c62f4401befe4c5127955e77833c8f235b26", size = 10252, upload-time = "2025-10-21T07:55:25.421Z" }, +] + +[[package]] +name = "pyobjc-framework-avfoundation" +version = "12.0" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "pyobjc-core" }, + { name = "pyobjc-framework-cocoa" }, + { name = "pyobjc-framework-coreaudio" }, + { name = "pyobjc-framework-coremedia" }, + { name = "pyobjc-framework-quartz" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/d9/95/29d3dbf7bfa6f2beb865ab4ce22ee1ccd58c2036a6c4caa6fa6568c7a727/pyobjc_framework_avfoundation-12.0.tar.gz", hash = "sha256:e9e9a15edea43341b39de677a58ac98b2a6bd4d6c55176b4804c5f75b3d20ece", size = 310508, upload-time = "2025-10-21T08:27:21.867Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/dd/a3/07b098df03c1d5d8b4762ccba77881c9d41733a94db34815a27853531bf8/pyobjc_framework_avfoundation-12.0-cp313-cp313-macosx_10_13_universal2.whl", hash = "sha256:3aef07f73e8e908aeae195846d0d9bddb95bf82bbc10c22b51ec15f822a828fd", size = 83413, upload-time = "2025-10-21T07:55:51.443Z" }, + { url = "https://files.pythonhosted.org/packages/57/64/bffe9c7980313c84ef66f1c97770c12c505bc91a7e188a401f8655e85f91/pyobjc_framework_avfoundation-12.0-cp313-cp313t-macosx_10_13_universal2.whl", hash = "sha256:31840a514e703f64094c9f29053a0a22969b4666a207b5061d965fa0ddb96e4d", size = 83866, upload-time = "2025-10-21T07:55:57.81Z" }, + { url = "https://files.pythonhosted.org/packages/e8/5a/40edf86b2c040070ca18c9eec2e2c52e7d111209279fee919b13ad86d2b2/pyobjc_framework_avfoundation-12.0-cp314-cp314-macosx_10_15_universal2.whl", hash = "sha256:953bb5d6db3a6e2cddf489eb58bb6a1fb306e441ba6a011d04356b25c60a78e4", size = 83625, upload-time = "2025-10-21T07:56:04.163Z" }, + { url = "https://files.pythonhosted.org/packages/2d/6d/c6398333f88e2142d18ca9704413c5aa10d86fbc5ed813ded61da70104bc/pyobjc_framework_avfoundation-12.0-cp314-cp314t-macosx_10_15_universal2.whl", hash = "sha256:a612ae9863abd4e0769ce6ff9960a5bf46128dddb3ef8f027406b8cd136e41f9", size = 83962, upload-time = "2025-10-21T07:56:10.484Z" }, +] + +[[package]] +name = "pyobjc-framework-avkit" +version = "12.0" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "pyobjc-core" }, + { name = "pyobjc-framework-cocoa" }, + { name = "pyobjc-framework-quartz" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/76/65/2de0788c5ecde6906b9acfe1c37c6be59f9527eeb44b6fc494c63584edb9/pyobjc_framework_avkit-12.0.tar.gz", hash = "sha256:0f1ea37cd19483c62ba7a42e73dc07a03a0656ce916e772d13b017c625757930", size = 28881, upload-time = "2025-10-21T08:27:24.941Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/06/1a/880617bae980bd93ac49a5a9633aaf41db8cb10bf5154ada77b400d2490e/pyobjc_framework_avkit-12.0-cp313-cp313-macosx_10_13_universal2.whl", hash = "sha256:172763e9c06da1fe074b35911e75d4db3d65bdd4e22bfd7c18083e787ccc6c3b", size = 11633, upload-time = "2025-10-21T07:56:17.773Z" }, + { url = "https://files.pythonhosted.org/packages/a0/db/6dad06275e722c05d138b8cef2582bb5fb8b3f396ec346563d7a1d540aca/pyobjc_framework_avkit-12.0-cp313-cp313t-macosx_10_13_universal2.whl", hash = "sha256:11abbbe482824aa5aaff0e6570be7567e5cb60b50abefb294da522e346149eca", size = 11838, upload-time = "2025-10-21T07:56:19.511Z" }, + { url = "https://files.pythonhosted.org/packages/32/51/38b9cff57e07d3443a53b67e825c476d304932538a5862f096272aca3a74/pyobjc_framework_avkit-12.0-cp314-cp314-macosx_10_15_universal2.whl", hash = "sha256:6a6990b18ac63b4f5d8e8792c7bc04b305505beb7a989bfa6c0d1203dfbbdd95", size = 11621, upload-time = "2025-10-21T07:56:21.301Z" }, + { url = "https://files.pythonhosted.org/packages/1f/ce/7a4fab52c0ddeee6d4f25a9d85bfb2fcecd05f57c8fec14720b0c9f217a3/pyobjc_framework_avkit-12.0-cp314-cp314t-macosx_10_15_universal2.whl", hash = "sha256:52815d4b663c5ec4e1a96b23d2d3b0c7e03ff0ceca99d0a0475e9f0055c3c15d", size = 11838, upload-time = "2025-10-21T07:56:23.449Z" }, +] + +[[package]] +name = "pyobjc-framework-avrouting" +version = "12.0" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "pyobjc-core" }, + { name = "pyobjc-framework-cocoa" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/4e/98/cc2316849224736b9386189a52c80a73a154979a24c8877faa1be258a3b0/pyobjc_framework_avrouting-12.0.tar.gz", hash = "sha256:01edbba4257450bb42b87deb8c2498fc30e6d7a2adc9b25c81e118af5bdf7dac", size = 20432, upload-time = "2025-10-21T08:27:27.068Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/ee/e9/a0ce79da974ddb40475621d2fbd42462063d57dc00238e49f27c49cedd24/pyobjc_framework_avrouting-12.0-cp313-cp313-macosx_10_13_universal2.whl", hash = "sha256:58b3ef31ad0855df04ba9ca47e13a3d2cff8365d70a6d59708b747b22fd2e9a0", size = 8479, upload-time = "2025-10-21T07:56:29.972Z" }, + { url = "https://files.pythonhosted.org/packages/01/7a/0c10711dad7c1e7022427e0db7515ee3051042b3af95f7f680f1af0bbc47/pyobjc_framework_avrouting-12.0-cp313-cp313t-macosx_10_13_universal2.whl", hash = "sha256:2d97593d312f7c1eb9cc3df3d9c82d9124130567a579641ff976d594e1d6b371", size = 8638, upload-time = "2025-10-21T07:56:31.622Z" }, + { url = "https://files.pythonhosted.org/packages/a2/ea/e248c709473d7cc50b6ffce8243aef737b74fe597aa5d9beb929dacb4115/pyobjc_framework_avrouting-12.0-cp314-cp314-macosx_10_15_universal2.whl", hash = "sha256:210f20df144aa56d04b3834ffc46423880de6361ac6b63bbb63daa602cfc0d95", size = 8531, upload-time = "2025-10-21T07:56:33.939Z" }, + { url = "https://files.pythonhosted.org/packages/b0/89/d5726926189ccb42acd0df50b50cf95c99d24957539d1a8bc49e881930e8/pyobjc_framework_avrouting-12.0-cp314-cp314t-macosx_10_15_universal2.whl", hash = "sha256:644cadc54028efb991e2db74eed582e2278fec90d3a783475cf62afaba8e6af3", size = 8701, upload-time = "2025-10-21T07:56:36.684Z" }, +] + +[[package]] +name = "pyobjc-framework-backgroundassets" +version = "12.0" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "pyobjc-core" }, + { name = "pyobjc-framework-cocoa" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/8c/d6/143de9d93121fae5201c18ca3b5dcf155f3abc6cabed946ab20f52b99572/pyobjc_framework_backgroundassets-12.0.tar.gz", hash = "sha256:f9bcfba27ffec725620e87778a26b783e3955343adcc96e3d5635edcc4cb1207", size = 26625, upload-time = "2025-10-21T08:27:29.629Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/17/c2/7c742e87a02763f2523618659db1d6c48a7f92c3cadc06b73411a6710e19/pyobjc_framework_backgroundassets-12.0-cp313-cp313-macosx_10_13_universal2.whl", hash = "sha256:2cd40f12d97d0993894fdccfac6eebf6787decf0c13c0213e723ef62abf1f00e", size = 10813, upload-time = "2025-10-21T07:56:43.715Z" }, + { url = "https://files.pythonhosted.org/packages/ec/72/2ee6f418c72d0f0617cb03c01ad88473c46580441e59b7c1f98571114895/pyobjc_framework_backgroundassets-12.0-cp313-cp313t-macosx_10_13_universal2.whl", hash = "sha256:7542ec038356046ecc790379d059ea6ae381eada7a75b4b342d6788230508f45", size = 11069, upload-time = "2025-10-21T07:56:45.367Z" }, + { url = "https://files.pythonhosted.org/packages/d2/08/6ebf4147a2185ec12fae1d6dfd481d30d5b1cfebf7a18ac7ad5041fb016e/pyobjc_framework_backgroundassets-12.0-cp314-cp314-macosx_10_15_universal2.whl", hash = "sha256:7e1f44669c110150a65b765e3a92a1538dc925b037a6d7e50c156a24062ab83a", size = 10864, upload-time = "2025-10-21T07:56:47.042Z" }, + { url = "https://files.pythonhosted.org/packages/a3/85/f4e20f74b9741fbb7d8174e18b1729d9a491fe4221a8b88d6e2d2e43f408/pyobjc_framework_backgroundassets-12.0-cp314-cp314t-macosx_10_15_universal2.whl", hash = "sha256:5df2618f89d14ea0084afa59d044c6342c8a394d5368c85965055cc44f08b4e6", size = 11069, upload-time = "2025-10-21T07:56:48.981Z" }, +] + +[[package]] +name = "pyobjc-framework-browserenginekit" +version = "12.0" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "pyobjc-core" }, + { name = "pyobjc-framework-cocoa" }, + { name = "pyobjc-framework-coreaudio" }, + { name = "pyobjc-framework-coremedia" }, + { name = "pyobjc-framework-quartz" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/b5/a3/fe0015c88f576e42702a96c33d9d8c4f0195f32017f81d224e3f2238905b/pyobjc_framework_browserenginekit-12.0.tar.gz", hash = "sha256:8409031977ee725b258e96096a2ad2910c11753865d8e79aa6c8c154a98a55a6", size = 29480, upload-time = "2025-10-21T08:27:32.699Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/11/e5/b732d765d0f48c4559fdef85aacee030fb31614eeb138aaf149a34a5ac42/pyobjc_framework_browserenginekit-12.0-cp313-cp313-macosx_10_13_universal2.whl", hash = "sha256:3d290dfcb353828ee0220c3026c1920572c4b04d9fdf9934349988d2ad1ddc58", size = 11575, upload-time = "2025-10-21T07:56:56.513Z" }, + { url = "https://files.pythonhosted.org/packages/a9/59/9c5a0bcbbdd964b42a416b085a0ea7d8ba369130ada44956b1507b54850c/pyobjc_framework_browserenginekit-12.0-cp313-cp313t-macosx_10_13_universal2.whl", hash = "sha256:e22aada3a3dcf0cec5dae7856aaacf05ea38bfb8e1e69d15956bc8fb52f61cd6", size = 11748, upload-time = "2025-10-21T07:56:58.677Z" }, + { url = "https://files.pythonhosted.org/packages/5e/d7/085cde585aef2d3601e745e2a2f101abca2a8ca761a0567c9cfcca524564/pyobjc_framework_browserenginekit-12.0-cp314-cp314-macosx_10_15_universal2.whl", hash = "sha256:6688b3a109158a4734cefff7ca866e85550d3d10f3fa12d09268fbe174521370", size = 11629, upload-time = "2025-10-21T07:57:00.753Z" }, + { url = "https://files.pythonhosted.org/packages/e7/10/89141c5fa3492f06740104850b95995232c14f84305dfdd9a463681663bc/pyobjc_framework_browserenginekit-12.0-cp314-cp314t-macosx_10_15_universal2.whl", hash = "sha256:d4b5809a751bf0f3d24773034763c57b139fff5eeef22f07ce760d14b0f83e2a", size = 11818, upload-time = "2025-10-21T07:57:02.82Z" }, +] + +[[package]] +name = "pyobjc-framework-businesschat" +version = "12.0" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "pyobjc-core" }, + { name = "pyobjc-framework-cocoa" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/59/74/a34367bab4b74126897e37b5838e47c135407950bd843fddd115ffb75428/pyobjc_framework_businesschat-12.0.tar.gz", hash = "sha256:2f598056f1a90a5a85ef3c75c8457f8cd80511017982a17ddb28695a6bf205f6", size = 12127, upload-time = "2025-10-21T08:27:34.516Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/39/41/3f41a8a7c2443cc8e2d6a6cbc19444d9a56ebd000b16246573fc5bb6d2f1/pyobjc_framework_businesschat-12.0-py2.py3-none-any.whl", hash = "sha256:a3faa5a6be27fd18f2b0d34306d8cb8e81c1f2c1f637239b4c9b9f5d90e322ee", size = 3482, upload-time = "2025-10-21T07:57:04.105Z" }, +] + +[[package]] +name = "pyobjc-framework-calendarstore" +version = "12.0" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "pyobjc-core" }, + { name = "pyobjc-framework-cocoa" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/e1/6d/62bf488ca94108fa8820a691b41da62aa69daeef3bca86f14af1f576a5a3/pyobjc_framework_calendarstore-12.0.tar.gz", hash = "sha256:cfdac6543090d7790c576e24ff87440d3b57e234a51e9468bdbb5451b4d94c9b", size = 52284, upload-time = "2025-10-21T08:27:39.643Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/8c/f8/678b8725046e320a3183c232349af205567b0489dda818eb7572a1a7b8e0/pyobjc_framework_calendarstore-12.0-py2.py3-none-any.whl", hash = "sha256:32432f4fddf080f8a5d592a2dc659f30bde9486c89dc0978fee5faec7847a076", size = 5295, upload-time = "2025-10-21T07:57:05.732Z" }, +] + +[[package]] +name = "pyobjc-framework-callkit" +version = "12.0" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "pyobjc-core" }, + { name = "pyobjc-framework-cocoa" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/4d/2a/b0ed29456b1d55bb2764768bcd2668cbf2f746a27a67854da71d89e4609b/pyobjc_framework_callkit-12.0.tar.gz", hash = "sha256:fab030e3e5c33d245f3b00165b5cf366ae43846ce237e3d4a0874198c17d8d60", size = 29544, upload-time = "2025-10-21T08:27:42.462Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/da/3c/d0f193229bfc95a5022479ce3812e8e0cada5aad35bcf291aec1e794e4f4/pyobjc_framework_callkit-12.0-cp313-cp313-macosx_10_13_universal2.whl", hash = "sha256:143a1edb64a3d17f7a379a50200b220f060b0f89e29f4ee4e098ef9c47dd90f5", size = 11356, upload-time = "2025-10-21T07:57:13.651Z" }, + { url = "https://files.pythonhosted.org/packages/1e/72/e7ae42e301c5052893be17be5fadfb137097aa41baf0edc07bf56b444f6b/pyobjc_framework_callkit-12.0-cp313-cp313t-macosx_10_13_universal2.whl", hash = "sha256:ad37a033b7ed1bccec7dcabcc297e97a9b16064723805d9eda9e9fad2b659fba", size = 11568, upload-time = "2025-10-21T07:57:16.159Z" }, + { url = "https://files.pythonhosted.org/packages/1c/45/ea7638c053678bf82d58a270ae7991408d4dfa352ca92bf9cea63d461d52/pyobjc_framework_callkit-12.0-cp314-cp314-macosx_10_15_universal2.whl", hash = "sha256:07fc2b314ccfe0b192ca69c810e4adba2990b31c1bb6bfbdbd3794501ae00982", size = 11348, upload-time = "2025-10-21T07:57:18.007Z" }, + { url = "https://files.pythonhosted.org/packages/80/75/19366317f39e02cfde6ca578c7cd0012bd7a7b227b4f0185a3705c3657ec/pyobjc_framework_callkit-12.0-cp314-cp314t-macosx_10_15_universal2.whl", hash = "sha256:fca661ce7212e90f39cf30e3793c54beeac60d8cb36f6d2d687eef775bc468f1", size = 11567, upload-time = "2025-10-21T07:57:19.685Z" }, +] + +[[package]] +name = "pyobjc-framework-carbon" +version = "12.0" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "pyobjc-core" }, + { name = "pyobjc-framework-cocoa" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/0a/86/e5212c091d614f5097fb34d06820fda00d4dc2dcc0ac68d102b8cb0a79ac/pyobjc_framework_carbon-12.0.tar.gz", hash = "sha256:ad24c6c9def13669f9b6dc2350b39ac96270f4918223d1abf4d8a70990eed84c", size = 37320, upload-time = "2025-10-21T08:27:45.651Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/7e/aa/56b0bc78523ca3ecdf6e72a8b786b7204364c57d1b2db17bb50cfed1091d/pyobjc_framework_carbon-12.0-py2.py3-none-any.whl", hash = "sha256:b58d0f558f3f31e981c26a1074fce8a32bf0aa6f9c6bccefdb2828a4f9c46eac", size = 4635, upload-time = "2025-10-21T07:57:21.073Z" }, +] + +[[package]] +name = "pyobjc-framework-cfnetwork" +version = "12.0" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "pyobjc-core" }, + { name = "pyobjc-framework-cocoa" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/53/92/910990becf6e6205787a9e1a1ce6847358fab73b76949283a053c7cd8d54/pyobjc_framework_cfnetwork-12.0.tar.gz", hash = "sha256:b6c3d156c774f8c5fc2bfb3efc311c62cfd317ddaffb4d6637821039e852e3f1", size = 44831, upload-time = "2025-10-21T08:27:49.303Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/f9/79/076af9b27dfee72f2a383812efbc4206bdae02ddcfbc2267c914a135d0e8/pyobjc_framework_cfnetwork-12.0-cp313-cp313-macosx_10_13_universal2.whl", hash = "sha256:1b02b95f7f0be4a4bd5c2ba468528daded3dea05641b01133c4cbab37f31254d", size = 19144, upload-time = "2025-10-21T07:57:30.331Z" }, + { url = "https://files.pythonhosted.org/packages/c2/72/c0de6704a6c3351149391892eb5fe8009260355070487c0bf9a9c28cf7f7/pyobjc_framework_cfnetwork-12.0-cp313-cp313t-macosx_10_13_universal2.whl", hash = "sha256:f26e05d1b7f5e4af3b2dfe3e1d443ab09d625a3b3d6007ec84e851ca02e8f383", size = 19422, upload-time = "2025-10-21T07:57:32.953Z" }, + { url = "https://files.pythonhosted.org/packages/b7/96/ea7607704670a886b94c39e1a4fbd8b2b43a8321369937652935c3023889/pyobjc_framework_cfnetwork-12.0-cp314-cp314-macosx_10_15_universal2.whl", hash = "sha256:8f313ed9b11e203ea4be80f2310819749d99c5a4554293467269e0a6db9952f1", size = 19192, upload-time = "2025-10-21T07:57:35.195Z" }, + { url = "https://files.pythonhosted.org/packages/f6/4c/837eeffd0f3456dd8f2fc7055c9394006769d28c8ebd5cfb82182a9bf5a7/pyobjc_framework_cfnetwork-12.0-cp314-cp314t-macosx_10_15_universal2.whl", hash = "sha256:653a350813a0d10935b191b7d56227a1b7dce6a6e2d43bbaf758233126f581ab", size = 19415, upload-time = "2025-10-21T07:57:37.835Z" }, +] + +[[package]] +name = "pyobjc-framework-cinematic" +version = "12.0" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "pyobjc-core" }, + { name = "pyobjc-framework-avfoundation" }, + { name = "pyobjc-framework-cocoa" }, + { name = "pyobjc-framework-coremedia" }, + { name = "pyobjc-framework-metal" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/04/73/803108294b8345056fcfdd592e4652155080b47fc1f977bcbac6d360adab/pyobjc_framework_cinematic-12.0.tar.gz", hash = "sha256:4b0592f975a24192ef46f28b5ea811c2a7ed15d145974da173c93f39819b911f", size = 21218, upload-time = "2025-10-21T08:27:51.939Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/5c/38/9779f870b59383d063030d095d50e7a37e3f1f11e5ba782a6fdbaab5cbe6/pyobjc_framework_cinematic-12.0-py2.py3-none-any.whl", hash = "sha256:2c8a4e862731a623e7a4c29e466a4ad9ee7630653567aa32c586914e16f91ae7", size = 5042, upload-time = "2025-10-21T07:57:39.419Z" }, +] + +[[package]] +name = "pyobjc-framework-classkit" +version = "12.0" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "pyobjc-core" }, + { name = "pyobjc-framework-cocoa" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/a1/a5/e6a3cb61d2e7579376c11282c504445e5ad38c9cd6220f62949b863ef5df/pyobjc_framework_classkit-12.0.tar.gz", hash = "sha256:a8511b242a7092e79e0f97cc50f0f2fe4b28f92710f3c3242247334227818820", size = 26664, upload-time = "2025-10-21T08:27:54.802Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/5f/f2/54ce6f6013b051021d95db651a4115a340c37fa00c9e30238bdc43064188/pyobjc_framework_classkit-12.0-cp313-cp313-macosx_10_13_universal2.whl", hash = "sha256:d6c5968cbca3b3cbbd2fb91e46e2716a43dce910206bc84192cac145c8d17dbd", size = 8890, upload-time = "2025-10-21T07:57:46.091Z" }, + { url = "https://files.pythonhosted.org/packages/55/bf/b121f3da28787091db6d654bde4bff288ace26071ef466b6fd8b878ec833/pyobjc_framework_classkit-12.0-cp313-cp313t-macosx_10_13_universal2.whl", hash = "sha256:34c3881f97b996ce0b80210f0d3435ecec4be2a23a931e231f463ca54ac047d4", size = 9051, upload-time = "2025-10-21T07:57:47.93Z" }, + { url = "https://files.pythonhosted.org/packages/49/6c/2e60e91750624a907c8d10ae4a7f2034f680f47625912be14a7ad53ee7d1/pyobjc_framework_classkit-12.0-cp314-cp314-macosx_10_15_universal2.whl", hash = "sha256:e0d837c35d996f86d11aa84031ed26060eb9db10423d3f6dc78affc0688e42f3", size = 8966, upload-time = "2025-10-21T07:57:49.926Z" }, + { url = "https://files.pythonhosted.org/packages/72/1f/2a2dbc163ff34b1965a1f842ee651145579e5ab64cdb367785ae67c7455b/pyobjc_framework_classkit-12.0-cp314-cp314t-macosx_10_15_universal2.whl", hash = "sha256:c08ed6c0f2e2272bb86491a8bf19662d94ccdee34d34c0ce4a40a734ba5508a1", size = 9117, upload-time = "2025-10-21T07:57:51.877Z" }, +] + +[[package]] +name = "pyobjc-framework-cloudkit" +version = "12.0" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "pyobjc-core" }, + { name = "pyobjc-framework-accounts" }, + { name = "pyobjc-framework-cocoa" }, + { name = "pyobjc-framework-coredata" }, + { name = "pyobjc-framework-corelocation" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/83/dc/539f3a4c2b490adc2079f111b6594e847cd9fdb10d44b65b629977673c44/pyobjc_framework_cloudkit-12.0.tar.gz", hash = "sha256:1ac29d81005b92575ce6a5c9bdbb8fec50cd9fadaaab66db972934e5e542cf1c", size = 53756, upload-time = "2025-10-21T08:27:59.031Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/01/67/5bbc583777376642c103a327930c11bca0c3eb3a1ceaad20dfaf55be96eb/pyobjc_framework_cloudkit-12.0-py2.py3-none-any.whl", hash = "sha256:1ad9af5c0ef94e147cd8c5676aab7925ead9da8398bd01898597c4da7cb3231b", size = 11102, upload-time = "2025-10-21T07:57:53.771Z" }, +] + +[[package]] +name = "pyobjc-framework-cocoa" +version = "12.0" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "pyobjc-core" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/37/6f/89837da349fe7de6476c426f118096b147de923139556d98af1832c64b97/pyobjc_framework_cocoa-12.0.tar.gz", hash = "sha256:02d69305b698015a20fcc8e1296e1528e413d8cf9fdcd590478d359386d76e8a", size = 2771906, upload-time = "2025-10-21T08:30:51.765Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/fb/29/cfef5f021576976698c6ae195fa304238b9f6716e1b3eb11258d2572afe9/pyobjc_framework_cocoa-12.0-cp313-cp313-macosx_10_13_universal2.whl", hash = "sha256:13e573f5093f4158f305b1bac5e1f783881ce2f5f4a69f3c80cb000f76731259", size = 384659, upload-time = "2025-10-21T07:59:34.859Z" }, + { url = "https://files.pythonhosted.org/packages/f1/37/d2d9a143ab5387815a00f478916a52425c4792678366ef6cedf20b8cc9cd/pyobjc_framework_cocoa-12.0-cp313-cp313t-macosx_10_13_universal2.whl", hash = "sha256:3b167793cd1b509eaf693140ace9be1f827a2c8686fceb8c599907661f608bc2", size = 388787, upload-time = "2025-10-21T08:00:00.006Z" }, + { url = "https://files.pythonhosted.org/packages/0f/15/0a6122e430d0e2ba27ad0e345b89f85346805f39d6f97eea6430a74350d9/pyobjc_framework_cocoa-12.0-cp314-cp314-macosx_10_15_universal2.whl", hash = "sha256:a2b6fb9ab3e5ab6db04dfa17828a97894e7da85dd8600885c72a0c2c2214d618", size = 384890, upload-time = "2025-10-21T08:00:25.286Z" }, + { url = "https://files.pythonhosted.org/packages/79/d7/1a3ad814d427c08b99405e571e47a0219598930ad73850ac02d164d88cd0/pyobjc_framework_cocoa-12.0-cp314-cp314t-macosx_10_15_universal2.whl", hash = "sha256:32ff10250a57f72a0b6eca85b790dcc87548ff71d33d0436ffb69680d5e2f308", size = 388925, upload-time = "2025-10-21T08:00:47.309Z" }, +] + +[[package]] +name = "pyobjc-framework-collaboration" +version = "12.0" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "pyobjc-core" }, + { name = "pyobjc-framework-cocoa" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/80/df/611e4f31a4ad32bc85d39f049006d7013fde6eec57f798714d13c3e02c70/pyobjc_framework_collaboration-12.0.tar.gz", hash = "sha256:7090d493adeffee2d6abcf2ce85d79cb273448b7624284ea7ede166e1a9daf7f", size = 14322, upload-time = "2025-10-21T08:30:54.394Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/6e/a7/02070855162d0b997884fffcc42976cead4de3e764f7b3b234fd9c23f2b2/pyobjc_framework_collaboration-12.0-py2.py3-none-any.whl", hash = "sha256:f3d5bf79ed1012068c279b46225b23236e4c099d549421192c89468d591c40cc", size = 4915, upload-time = "2025-10-21T08:00:49.897Z" }, +] + +[[package]] +name = "pyobjc-framework-colorsync" +version = "12.0" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "pyobjc-core" }, + { name = "pyobjc-framework-cocoa" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/66/81/efc29f6af5fb9c1c483c3035c3020e0e6932f8d975972e0f9c71a31615f6/pyobjc_framework_colorsync-12.0.tar.gz", hash = "sha256:9733cef2d4641cbd308fc3f33b8fba07f34ed1e58bf45a4d982289c9c6706156", size = 25015, upload-time = "2025-10-21T08:30:57.019Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/43/10/6e1025a7aaa9b7d5bbd97b0ff462a40880b0ded608e7ec5c87c5f50100ae/pyobjc_framework_colorsync-12.0-py2.py3-none-any.whl", hash = "sha256:68c24293b0613796521172964c2b579b76794bcbb62f1d045ef5539e60b91626", size = 5963, upload-time = "2025-10-21T08:00:51.87Z" }, +] + +[[package]] +name = "pyobjc-framework-compositorservices" +version = "12.0" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "pyobjc-core" }, + { name = "pyobjc-framework-cocoa" }, + { name = "pyobjc-framework-metal" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/2f/0c/e7e6b4b329691804bf4dd5a4c05e7e3432b929265c914e38d09de80b629b/pyobjc_framework_compositorservices-12.0.tar.gz", hash = "sha256:c2d47153e6d180d0040235b8a61d58d1c9659f55df933fd4f16a55f281fcf9c9", size = 23309, upload-time = "2025-10-21T08:30:59.5Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/7e/26/83bf8f230ae22ab531c2870ef33a85c3d36aef05d3efd0a5899a68531b96/pyobjc_framework_compositorservices-12.0-py2.py3-none-any.whl", hash = "sha256:71f98346eb05c240a3b4c3f0d5399dbadd4dbb73b74bea24600065c9ef9d453f", size = 5918, upload-time = "2025-10-21T08:00:53.527Z" }, +] + +[[package]] +name = "pyobjc-framework-contacts" +version = "12.0" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "pyobjc-core" }, + { name = "pyobjc-framework-cocoa" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/47/fb/9e60e4db4a4f4c02be4b0ba2d59ea116db230e1f4de134247d3390168dcb/pyobjc_framework_contacts-12.0.tar.gz", hash = "sha256:ac921f8ef7bf3767b335d8055f597b03ad6845dfd93c05647cf41550af6dcda3", size = 42727, upload-time = "2025-10-21T08:31:03.189Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/df/27/da5ffb07e7b0a54f5c16d99ebffe4e7407204681e2aa03efa4d47792a669/pyobjc_framework_contacts-12.0-cp313-cp313-macosx_10_13_universal2.whl", hash = "sha256:5b9892f560586295fd9d8e87610add3417c36564a5cc3af70baf64f662024b56", size = 12183, upload-time = "2025-10-21T08:01:02.877Z" }, + { url = "https://files.pythonhosted.org/packages/e7/e2/d3f8fe4cb9018086b4dcea1090533cd3fc44ff99ffc809e5f5fef6845d8d/pyobjc_framework_contacts-12.0-cp313-cp313t-macosx_10_13_universal2.whl", hash = "sha256:70469137f625a909becee54770c1134766d6a9367f19027b9b04f04d673ce2d0", size = 12352, upload-time = "2025-10-21T08:01:05.025Z" }, + { url = "https://files.pythonhosted.org/packages/bf/8a/a9b64fddb086bfe34bbf12a791876b892d274666557188dea9232233c4db/pyobjc_framework_contacts-12.0-cp314-cp314-macosx_10_15_universal2.whl", hash = "sha256:01f58f1b5c49b1cfe9bfc3dbebc00ca48962000b7d40fbeb1a9f25e2b03732ed", size = 12268, upload-time = "2025-10-21T08:01:07.201Z" }, + { url = "https://files.pythonhosted.org/packages/88/56/55ddc21dd30d971e7a3f55b18431f49ffd9cce1cafbffeb953c84e839c3f/pyobjc_framework_contacts-12.0-cp314-cp314t-macosx_10_15_universal2.whl", hash = "sha256:14f80cfc5b77e4db87c5e679ad7f864435a732e55fd1158a046383603e8224d8", size = 12423, upload-time = "2025-10-21T08:01:08.939Z" }, +] + +[[package]] +name = "pyobjc-framework-contactsui" +version = "12.0" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "pyobjc-core" }, + { name = "pyobjc-framework-cocoa" }, + { name = "pyobjc-framework-contacts" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/64/9b/eb41bfdad0a2049f27559e0d152b1bb6cc1d001cc9ebf97fb94f548bc3ea/pyobjc_framework_contactsui-12.0.tar.gz", hash = "sha256:98bed7b93b0934786f6ddd9644c80175a40a593a0a4ffd8128ef7885bc377f5a", size = 19163, upload-time = "2025-10-21T08:31:05.826Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/6b/ff/05321db2ce7979dd8d0137a919734e8608990c7a8323e7bfaeed283a3750/pyobjc_framework_contactsui-12.0-cp313-cp313-macosx_10_13_universal2.whl", hash = "sha256:4ee9afcc857434147939e53d7190582f919660f7bc7c44b3a2682cb61f639162", size = 7914, upload-time = "2025-10-21T08:01:16.813Z" }, + { url = "https://files.pythonhosted.org/packages/19/b9/30e4db40690ecee1c84dcdcf445f65378b54cebb0bd650faa92caff231e9/pyobjc_framework_contactsui-12.0-cp313-cp313t-macosx_10_13_universal2.whl", hash = "sha256:93cae23de7d80bec4de6241f10328a40581360e6b4ed7510deb004290068f2e5", size = 8061, upload-time = "2025-10-21T08:01:18.513Z" }, + { url = "https://files.pythonhosted.org/packages/15/c1/14d8afd208cc8f03dc67d68027bd28b71a1dec0a7635662626584617e7b8/pyobjc_framework_contactsui-12.0-cp314-cp314-macosx_10_15_universal2.whl", hash = "sha256:fe9081e485b4be4c9062f9d9764f0cad969effb20ff98fa2b51fc6db478e33f5", size = 7968, upload-time = "2025-10-21T08:01:20.578Z" }, + { url = "https://files.pythonhosted.org/packages/7f/02/91454deed58153c97ad07a93c70179714c3ca9ee4821d32eeace3a3ada4a/pyobjc_framework_contactsui-12.0-cp314-cp314t-macosx_10_15_universal2.whl", hash = "sha256:4bd37e9024336302e021459b2b9098e463d8e6ef96a9bebe79285d043bb79a7a", size = 8122, upload-time = "2025-10-21T08:01:22.465Z" }, +] + +[[package]] +name = "pyobjc-framework-coreaudio" +version = "12.0" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "pyobjc-core" }, + { name = "pyobjc-framework-cocoa" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/4c/a0/604b8e2e53f46536b9045fc0fbfa9468a606910c9c0a238d0f3d31071d87/pyobjc_framework_coreaudio-12.0.tar.gz", hash = "sha256:19741907d2d80a658d3721140eb998061007955323b427afca67eda0e2ad3215", size = 75415, upload-time = "2025-10-21T08:31:12.282Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/52/c1/8bd4c6a917d7314042a7b26f3433c680c051f64995da682a5f99502202c9/pyobjc_framework_coreaudio-12.0-cp313-cp313-macosx_10_13_universal2.whl", hash = "sha256:f7309087b42ce6c399d2971a7173c9216c03a43a998bb2be2eecc90fb362ccb2", size = 36944, upload-time = "2025-10-21T08:01:36.973Z" }, + { url = "https://files.pythonhosted.org/packages/84/92/23ab5d0f3b953bb944d7bbb99d054c560b9a2d931d173e9165b44172ebb8/pyobjc_framework_coreaudio-12.0-cp313-cp313t-macosx_10_13_universal2.whl", hash = "sha256:b52a2ef28b557c5f5cbf97264ce0c6f8ce1a4ea0309b4a952122b9bc3a4ad636", size = 38398, upload-time = "2025-10-21T08:01:40.422Z" }, + { url = "https://files.pythonhosted.org/packages/e2/14/d7f6b39f0234de213889df52091681b9abab9e4b7ca6858eff1cbe5e3c14/pyobjc_framework_coreaudio-12.0-cp314-cp314-macosx_10_15_universal2.whl", hash = "sha256:30ac30f6be6b35bbe7f21c055269de6643c378c5e15bf5002c4eb1de942904fc", size = 37021, upload-time = "2025-10-21T08:01:44.003Z" }, + { url = "https://files.pythonhosted.org/packages/34/ee/f1e955191775df1cdac142bfca1dc2787c9dde9f23e821061c7a18ff6e86/pyobjc_framework_coreaudio-12.0-cp314-cp314t-macosx_10_15_universal2.whl", hash = "sha256:1bb16d186466cf3b9c23e29dbc0470c282c7194dc022b685f075a7585dfc8a43", size = 38498, upload-time = "2025-10-21T08:01:47.554Z" }, +] + +[[package]] +name = "pyobjc-framework-coreaudiokit" +version = "12.0" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "pyobjc-core" }, + { name = "pyobjc-framework-cocoa" }, + { name = "pyobjc-framework-coreaudio" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/e2/4e/9c55aa44e330cbbecf47c41fd1804128057422ae9ef2349db8c122c9ffb2/pyobjc_framework_coreaudiokit-12.0.tar.gz", hash = "sha256:2f02896167adf3f420ab8dd55a41c905e42ed59edf21a6f5f6d4d2f16b8b67a8", size = 20519, upload-time = "2025-10-21T08:31:14.66Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/e6/4c/377cf6bba1282ab5f02da2bbb2ddf9d4a7f68124096f5f0c712292d6294f/pyobjc_framework_coreaudiokit-12.0-cp313-cp313-macosx_10_13_universal2.whl", hash = "sha256:e6dd90bee277d320198041ca54986af9a985dda5ee9a97910f446ab43bb1379a", size = 7295, upload-time = "2025-10-21T08:01:54.489Z" }, + { url = "https://files.pythonhosted.org/packages/5d/70/a851e968af8b523ed8e194dcb9b232baffd2448c6c4f85daac91d143b68c/pyobjc_framework_coreaudiokit-12.0-cp313-cp313t-macosx_10_13_universal2.whl", hash = "sha256:c34d09d49e2b5ce3bc40bc91db6616807aa34f7d88a75dcfd89d5e6184fe4186", size = 7449, upload-time = "2025-10-21T08:01:56.042Z" }, + { url = "https://files.pythonhosted.org/packages/0d/d4/207c787fd2522df4ea14838f73979d31a69a70c2d0fec227eb36c0ff7bfa/pyobjc_framework_coreaudiokit-12.0-cp314-cp314-macosx_10_15_universal2.whl", hash = "sha256:48b4a04dcb825567bcf6aca1e9145ed68722f82e081d6db0cb0330d3dfca2190", size = 7359, upload-time = "2025-10-21T08:01:57.572Z" }, + { url = "https://files.pythonhosted.org/packages/a5/7e/599499bf4ebc7a81fb900107e334f4ba0e57cb38423c5c85c9904180349b/pyobjc_framework_coreaudiokit-12.0-cp314-cp314t-macosx_10_15_universal2.whl", hash = "sha256:2be1a9f95a4e24c7cd18a8bbe2a3173a14aa60a4edc830bb341a4ac4d2189265", size = 7514, upload-time = "2025-10-21T08:01:59.038Z" }, +] + +[[package]] +name = "pyobjc-framework-corebluetooth" +version = "12.0" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "pyobjc-core" }, + { name = "pyobjc-framework-cocoa" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/96/b2/ad9e8516cd73611a3a8f8ff2d7d51b917115f3f7f9e7a9760d5fc4e9dd6b/pyobjc_framework_corebluetooth-12.0.tar.gz", hash = "sha256:61ae2a56c3dcb8b7307d833e7d913bd7c063d11a1ea931158facceb38aae21d3", size = 33587, upload-time = "2025-10-21T08:31:18.036Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/9c/7e/8d6c430d6a282ea496373ef210d451ae716e8ceea1a6a5b3a1155b793150/pyobjc_framework_corebluetooth-12.0-cp313-cp313-macosx_10_13_universal2.whl", hash = "sha256:ba02d0a6257cb08a86198e70cb8c0113c81abf5f919be9078912af8eaf6688ae", size = 13241, upload-time = "2025-10-21T08:02:07.722Z" }, + { url = "https://files.pythonhosted.org/packages/d4/1a/e879130406efdbef2067245af85bbb9ae0053a8e80e69a3603926e1a6cd1/pyobjc_framework_corebluetooth-12.0-cp313-cp313t-macosx_10_13_universal2.whl", hash = "sha256:7696dbb61074ac657d213717869c93e6c3910369255f426844b85f4b039fb58c", size = 13425, upload-time = "2025-10-21T08:02:09.948Z" }, + { url = "https://files.pythonhosted.org/packages/b6/bf/68d2c3c90039265c94b69d3091c8c8af94b1107f38898b49bd88acb81ae0/pyobjc_framework_corebluetooth-12.0-cp314-cp314-macosx_10_15_universal2.whl", hash = "sha256:a50ff5e5ef5df8fd2b275fadbd51f44cec45ba78948a86339e89315909d82bd6", size = 13233, upload-time = "2025-10-21T08:02:12.927Z" }, + { url = "https://files.pythonhosted.org/packages/80/b7/fd0563e15d17746695247f247e9cdaf56ebca47b4db72c6a882e861fb2fe/pyobjc_framework_corebluetooth-12.0-cp314-cp314t-macosx_10_15_universal2.whl", hash = "sha256:000d3a863fcd119dbdc6682ebe4cc559e2569ec367a7417ac2635c3f411f7697", size = 13423, upload-time = "2025-10-21T08:02:16.063Z" }, +] + +[[package]] +name = "pyobjc-framework-coredata" +version = "12.0" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "pyobjc-core" }, + { name = "pyobjc-framework-cocoa" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/cc/ad/391d4c821c37ccf1a15ac13579c8f1eac8114a95b97d5904c9566ad4d593/pyobjc_framework_coredata-12.0.tar.gz", hash = "sha256:b9955d3b5951de8025cb24646281e42e85f37233150e4c7c62f1e2961088488b", size = 124704, upload-time = "2025-10-21T08:31:26.835Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/d3/6d/bc0fd51b3d06f3cc7a555b8c16a4ac1194db213f4549e80802d0683eba05/pyobjc_framework_coredata-12.0-cp313-cp313-macosx_10_13_universal2.whl", hash = "sha256:a85947442d8aad572e54a9459f7285f69fcc5643b4fbec03bfad12d35ab23434", size = 16425, upload-time = "2025-10-21T08:02:25.14Z" }, + { url = "https://files.pythonhosted.org/packages/05/62/af7bef77d6db9ee0f18e03017eb012a767ae495791b576815251f8aa5f89/pyobjc_framework_coredata-12.0-cp313-cp313t-macosx_10_13_universal2.whl", hash = "sha256:057e8e0535a39ed6f764dd840fbb99dee58d55944aab00258ba50edcf0ce9778", size = 16583, upload-time = "2025-10-21T08:02:27.336Z" }, + { url = "https://files.pythonhosted.org/packages/f6/4d/22371987fcf1ab81697fbacfb1424f6a3fcf6826617fbb03d17ef537f0e0/pyobjc_framework_coredata-12.0-cp314-cp314-macosx_10_15_universal2.whl", hash = "sha256:b20932f5eef4544ff8ae6c2a483ea6d9d4e7f36d27520ec4f3c9c8dc47d92889", size = 16490, upload-time = "2025-10-21T08:02:29.7Z" }, + { url = "https://files.pythonhosted.org/packages/2f/42/afc082fcdc6229ce3246308e9d1ab401d3f07907f551827a3df76ea2507b/pyobjc_framework_coredata-12.0-cp314-cp314t-macosx_10_15_universal2.whl", hash = "sha256:c85318310737c3bf835fb6e4b5bf9bb333a7ac8b25a3880ea4a81adee8aa5852", size = 16643, upload-time = "2025-10-21T08:02:31.942Z" }, +] + +[[package]] +name = "pyobjc-framework-corehaptics" +version = "12.0" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "pyobjc-core" }, + { name = "pyobjc-framework-cocoa" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/8d/3a/040fc7a9dfebe59825cf71749d1085cdbd21a2b9192efbe0333407d7c2e4/pyobjc_framework_corehaptics-12.0.tar.gz", hash = "sha256:f2de5699473162421522347a090285f5394da7fd23da5008c1f18229678d84bf", size = 22150, upload-time = "2025-10-21T08:31:29.333Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/3f/f0/928ebf2bae947ead0cf9aba49ad6f1085c4fa6c183e75d6719539348d2fe/pyobjc_framework_corehaptics-12.0-py2.py3-none-any.whl", hash = "sha256:b04d1a7895b7c56371971bc87aacbb604bb3778896cab3d81d97caef4e89240a", size = 5390, upload-time = "2025-10-21T08:02:33.396Z" }, +] + +[[package]] +name = "pyobjc-framework-corelocation" +version = "12.0" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "pyobjc-core" }, + { name = "pyobjc-framework-cocoa" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/a7/3a/a196c403b4f911905a5886374054019f3842873cf517f38c728905e0fe55/pyobjc_framework_corelocation-12.0.tar.gz", hash = "sha256:20a6fe17709f17ddbf9dd833a1a0ef045ad2e5838ba777f20eb329ed71c597c6", size = 53900, upload-time = "2025-10-21T08:31:33.838Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/fd/7e/415ebfe90b909a9400755702a49c985cd8dd8a0669dac7747eb289a703b3/pyobjc_framework_corelocation-12.0-cp313-cp313-macosx_10_13_universal2.whl", hash = "sha256:4b3480a4dc2b2dadea40513d3aea48137be418fb0603a50adbb10b277c654195", size = 12744, upload-time = "2025-10-21T08:02:41.228Z" }, + { url = "https://files.pythonhosted.org/packages/a6/ab/7d27db51f524bdfd2714d1132d0105fb6fc35beff381ed72d2cace7ac4c7/pyobjc_framework_corelocation-12.0-cp313-cp313t-macosx_10_13_universal2.whl", hash = "sha256:6ae6031dc633780b8ebdb50642891cd12221809a9da2314aa02949df108d8dee", size = 12880, upload-time = "2025-10-21T08:02:43.084Z" }, + { url = "https://files.pythonhosted.org/packages/13/ba/1a5e6b2efe67bfcffe1b919173ce1a410df4e48b7a85fd451511ea587998/pyobjc_framework_corelocation-12.0-cp314-cp314-macosx_10_15_universal2.whl", hash = "sha256:2c5c0ad450f18a22e800f50c3884652fce408ab0011e4d6c04c3f379056541d2", size = 12730, upload-time = "2025-10-21T08:02:44.88Z" }, + { url = "https://files.pythonhosted.org/packages/d5/5b/146f329a0fdb8f33b1eea712c40924f4ee39b8a3fef5e19d4a0bd044a8a3/pyobjc_framework_corelocation-12.0-cp314-cp314t-macosx_10_15_universal2.whl", hash = "sha256:e182e340ceb24a3907afbd75745b0f50e25f3f85adc589f48521009c0ba9351c", size = 12876, upload-time = "2025-10-21T08:02:46.781Z" }, +] + +[[package]] +name = "pyobjc-framework-coremedia" +version = "12.0" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "pyobjc-core" }, + { name = "pyobjc-framework-cocoa" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/55/6d/ed4f8b525a0520e609cea57fd0677bf7792e168297ad5577df1088eb7cd6/pyobjc_framework_coremedia-12.0.tar.gz", hash = "sha256:d7f76d2eb2890be9f8836b95682e83fa7f158c92043958daa71845fbc4a01ba9", size = 89928, upload-time = "2025-10-21T08:31:40.487Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/eb/08/15d500b9325f8c22ed379dba21559dfa9c7430c9b7eb709a55e515648c8d/pyobjc_framework_coremedia-12.0-cp313-cp313-macosx_10_13_universal2.whl", hash = "sha256:4d10a8b551626ae99a67436de498fc06a0beaa66db065baed19d7dfc5f1db44f", size = 29425, upload-time = "2025-10-21T08:02:58.756Z" }, + { url = "https://files.pythonhosted.org/packages/a9/98/ccf63a3a3aff8fce8be57b8ae1a67c9872e278a890c0508e86ed6bf98055/pyobjc_framework_coremedia-12.0-cp313-cp313t-macosx_10_13_universal2.whl", hash = "sha256:370aece067a0fb85e54eed57c6ca84118a55e7ff697988e5c82358d1bd3b648a", size = 29486, upload-time = "2025-10-21T08:03:01.687Z" }, + { url = "https://files.pythonhosted.org/packages/8f/fb/43b2a78ffdcb1eed7f04c317f9675d40dcd573f805d7385fec6c54005a2d/pyobjc_framework_coremedia-12.0-cp314-cp314-macosx_10_15_universal2.whl", hash = "sha256:0c89ca9d7cedd7b37178e358c83332933fcd65d82c362244aa208383724dce6f", size = 29462, upload-time = "2025-10-21T08:03:04.537Z" }, + { url = "https://files.pythonhosted.org/packages/2f/2b/3cb4ba97483987b6dd9165e2da0f5e85f81044bd8fba26c409271dc2c880/pyobjc_framework_coremedia-12.0-cp314-cp314t-macosx_10_15_universal2.whl", hash = "sha256:aaa904d82f75f1e38a1ba8ba9a19a5acb3869304626b12fd6b60040a85188211", size = 29512, upload-time = "2025-10-21T08:03:07.678Z" }, +] + +[[package]] +name = "pyobjc-framework-coremediaio" +version = "12.0" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "pyobjc-core" }, + { name = "pyobjc-framework-cocoa" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/54/4f/903bcf45358beda6efa5c926f66cb8ebe2b4345ea29e17b63c57bb828a28/pyobjc_framework_coremediaio-12.0.tar.gz", hash = "sha256:4067639c463df36831f12a5a87366700e68de054ea2624ee5695c660fe667551", size = 51467, upload-time = "2025-10-21T08:31:44.716Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/44/82/7d7c0dd5987eabea2ee48a00909446b9332627d296f9874c567dc3c4e8a1/pyobjc_framework_coremediaio-12.0-cp313-cp313-macosx_10_13_universal2.whl", hash = "sha256:768a2ec70927f9c74d0aa209f0051d1e7ce61d976a0bac519b1e380540d0a421", size = 17254, upload-time = "2025-10-21T08:03:17.159Z" }, + { url = "https://files.pythonhosted.org/packages/1b/1b/3859742412f7659b666112ac50cabc29cd6909597713fbcedf2549b38d08/pyobjc_framework_coremediaio-12.0-cp313-cp313t-macosx_10_13_universal2.whl", hash = "sha256:c6a1baae9dcf1731b0da312b6137a063a309a0d63688ae3f40a4bb78fecd1ce4", size = 17580, upload-time = "2025-10-21T08:03:19.266Z" }, + { url = "https://files.pythonhosted.org/packages/ef/84/144acef5ea102b8ad22a0078fbc3f8532b681ffc787cc46ecae192d0fc07/pyobjc_framework_coremediaio-12.0-cp314-cp314-macosx_10_15_universal2.whl", hash = "sha256:9af3c8e3523379ea7b50326cafada8ad7bf6d1881bd1e0f1ee1c0dbbbea057df", size = 17273, upload-time = "2025-10-21T08:03:21.673Z" }, + { url = "https://files.pythonhosted.org/packages/bb/1d/f87c421a35d3a10e52967511707acec81c1a942c2789a2bf5e7f46e71121/pyobjc_framework_coremediaio-12.0-cp314-cp314t-macosx_10_15_universal2.whl", hash = "sha256:8e751b5fcfb66ff80bba8d9eea0210513326d3aaec519369c1c7601121b47b87", size = 17570, upload-time = "2025-10-21T08:03:24.134Z" }, +] + +[[package]] +name = "pyobjc-framework-coremidi" +version = "12.0" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "pyobjc-core" }, + { name = "pyobjc-framework-cocoa" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/c9/e5/705bc151fd4ee430288aaffcbaa965747b4c49564c2e2dcfa44e1208a783/pyobjc_framework_coremidi-12.0.tar.gz", hash = "sha256:0021e76c795e98fe17cefb6eb5b9a312c573ac65e7e732569af0932e9bc4a8c9", size = 55918, upload-time = "2025-10-21T08:31:49.597Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/90/95/700498d0ce9f88a50ea5b0bf3be7d5dac6741f5003ac7f005306131c959e/pyobjc_framework_coremidi-12.0-cp313-cp313-macosx_10_13_universal2.whl", hash = "sha256:731f8c5fd37d3c8117dfd27688d0cef70716f188ed763570532df3e74ce62b17", size = 24347, upload-time = "2025-10-21T08:03:35.101Z" }, + { url = "https://files.pythonhosted.org/packages/28/64/3e8eca8b1ea58e7adbb1a1e5a4e3532137920eb5b8257e362eee39718cea/pyobjc_framework_coremidi-12.0-cp313-cp313t-macosx_10_13_universal2.whl", hash = "sha256:78acecbfb811050a6bb41f77b23c037c1cbefd3df7aacb20caf1048b7065219e", size = 24502, upload-time = "2025-10-21T08:03:38.043Z" }, + { url = "https://files.pythonhosted.org/packages/84/55/0f21117eb6410865171f6407b824128206f2fd3a428c4b509fce4571c136/pyobjc_framework_coremidi-12.0-cp314-cp314-macosx_10_15_universal2.whl", hash = "sha256:dd2f6ad40d5a39005aa4f0475e07002f4231f212a95b1f69ae10c81a39593563", size = 24384, upload-time = "2025-10-21T08:03:40.589Z" }, + { url = "https://files.pythonhosted.org/packages/62/89/6760795cc834055fce7c00d988fdf421c13e13e665979fd1f173e3187d79/pyobjc_framework_coremidi-12.0-cp314-cp314t-macosx_10_15_universal2.whl", hash = "sha256:05752f8d2739fdbc410f30c06689c321650d6238514faf47f84ef3d9ebc8556c", size = 24546, upload-time = "2025-10-21T08:03:43.453Z" }, +] + +[[package]] +name = "pyobjc-framework-coreml" +version = "12.0" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "pyobjc-core" }, + { name = "pyobjc-framework-cocoa" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/0c/a0/875b5174794c984df60944be54df0282945f8bae4a606fbafa0c6b717ddd/pyobjc_framework_coreml-12.0.tar.gz", hash = "sha256:e1d7a9812886150881c86000fba885cb15201352c75fb286bd9e3a1819b5a4d5", size = 40814, upload-time = "2025-10-21T08:31:53.83Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/57/41/b532645812eed1fab1e1d296d972ff62c4a21ccb6f134784070b94b16a27/pyobjc_framework_coreml-12.0-cp313-cp313-macosx_10_13_universal2.whl", hash = "sha256:67b69e035559cc04915c8463c7942b1b2ca0016f0c3044f16558730f4b69782e", size = 11386, upload-time = "2025-10-21T08:03:51.645Z" }, + { url = "https://files.pythonhosted.org/packages/a8/df/5f250afd2e1a844956327d50200f3721a7c9b21d21b33a490512a54282b1/pyobjc_framework_coreml-12.0-cp313-cp313t-macosx_10_13_universal2.whl", hash = "sha256:75cf48d7555ec88dff51de1a5c471976fe601edc0a184ece79c2bcce976cd06a", size = 11613, upload-time = "2025-10-21T08:03:53.411Z" }, + { url = "https://files.pythonhosted.org/packages/b2/a8/d7d45503e569658375465242118092934fd33a9325f71583fdcbbc109cdb/pyobjc_framework_coreml-12.0-cp314-cp314-macosx_10_15_universal2.whl", hash = "sha256:5c6ebfa62e62b154ea6aa3079578bf6cf22130137024e8ea316eb8fcde1c22ae", size = 11426, upload-time = "2025-10-21T08:03:55.536Z" }, + { url = "https://files.pythonhosted.org/packages/08/93/30ab85521034cf65b9914a6e419e25ca8c55b43a5f4c69ee2a03c001b765/pyobjc_framework_coreml-12.0-cp314-cp314t-macosx_10_15_universal2.whl", hash = "sha256:1e481ff8195721557eb357af8080c0ad77727d3fb6744a1bfa371a2a2b0603eb", size = 11609, upload-time = "2025-10-21T08:03:57.308Z" }, +] + +[[package]] +name = "pyobjc-framework-coremotion" +version = "12.0" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "pyobjc-core" }, + { name = "pyobjc-framework-cocoa" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/85/15/d4bff65f1817a4be08c8dc572e40afb561394f6b98833cc1bd0799939fe4/pyobjc_framework_coremotion-12.0.tar.gz", hash = "sha256:7db1f7a5d1a29c631e000bdcf3500af9cc9d51eb140326ab8dc4aea0f4ea358a", size = 34231, upload-time = "2025-10-21T08:31:56.821Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/b5/21/2238b5d8c092140f305bdaa41e1876950bb00664c06dfc6cef66123fa418/pyobjc_framework_coremotion-12.0-cp313-cp313-macosx_10_13_universal2.whl", hash = "sha256:fbfa46a5a81d7e1aa424011b56c6153b4e83ed34a81aab98f4432aeda469f4f0", size = 10428, upload-time = "2025-10-21T08:04:04.595Z" }, + { url = "https://files.pythonhosted.org/packages/4a/c3/2a3288ef1762ec800b1cb6beac0a45604d23eb1b4932a9294417b0f04769/pyobjc_framework_coremotion-12.0-cp313-cp313t-macosx_10_13_universal2.whl", hash = "sha256:0c8675abf26b6a647b3a085cceb35fde938f07068085b3f9ea029f08cb4fa86c", size = 10570, upload-time = "2025-10-21T08:04:06.221Z" }, + { url = "https://files.pythonhosted.org/packages/0f/0d/abe75b17ddfbeb439d15e7c0f1cf6b5154520abdc95b286d613412d472eb/pyobjc_framework_coremotion-12.0-cp314-cp314-macosx_10_15_universal2.whl", hash = "sha256:db0fa44ed782c3d5e76cb87bd2dc3a5c04cc0a8675520f0ed8a05b2aceab5d20", size = 10496, upload-time = "2025-10-21T08:04:07.851Z" }, + { url = "https://files.pythonhosted.org/packages/e0/a0/4c2fdc40a6a3aa19fb624b9128851d6faf2b62bf226a534e94496af138a2/pyobjc_framework_coremotion-12.0-cp314-cp314t-macosx_10_15_universal2.whl", hash = "sha256:2896ac44348c19d5e86f7892b5e843efaa7dd2dabba0527e9030bc482e1f11d8", size = 10641, upload-time = "2025-10-21T08:04:09.515Z" }, +] + +[[package]] +name = "pyobjc-framework-coreservices" +version = "12.0" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "pyobjc-core" }, + { name = "pyobjc-framework-cocoa" }, + { name = "pyobjc-framework-fsevents" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/d6/8e/e9ad1d201482036d528a9d9f18459706013f8e0f44a61b029d3164167584/pyobjc_framework_coreservices-12.0.tar.gz", hash = "sha256:36e0cb684d20c2ace81fde9829fd972a69463c51800fc1102a28118bfb804a0b", size = 366603, upload-time = "2025-10-21T08:32:20.981Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/18/89/e0a0799f1a4a55b837c944d755e66e11bf501126567871de1e8b7cf645ee/pyobjc_framework_coreservices-12.0-cp313-cp313-macosx_10_13_universal2.whl", hash = "sha256:ad53b603762138ad88faec98fb27019ffb9083fce410b41225d8b41940e696d7", size = 30232, upload-time = "2025-10-21T08:04:21.852Z" }, + { url = "https://files.pythonhosted.org/packages/28/7f/db3b852ad49329e291ebbd8013de787ac2680eac1c7c5df80134d4ffe81d/pyobjc_framework_coreservices-12.0-cp313-cp313t-macosx_10_13_universal2.whl", hash = "sha256:7f630bbdd99e3f980b5b256357097a54fc17acab442e6c16d76504d95d9adf0b", size = 30238, upload-time = "2025-10-21T08:04:24.836Z" }, + { url = "https://files.pythonhosted.org/packages/d7/4a/77310cb6e38ee2d7163ed962434c5ed528cb864b31e73020ded04f40c31c/pyobjc_framework_coreservices-12.0-cp314-cp314-macosx_10_15_universal2.whl", hash = "sha256:ee52df5f5dbf5a8b207e6c2319babe2766c4458fb3709b0d5e537a6394ff2c1b", size = 30264, upload-time = "2025-10-21T08:04:28.538Z" }, + { url = "https://files.pythonhosted.org/packages/81/68/f0b673b73368561a09e14e049f6d78ea595813af55d119fdf35c70432014/pyobjc_framework_coreservices-12.0-cp314-cp314t-macosx_10_15_universal2.whl", hash = "sha256:6f745ced27f61b729042138db04601104b51d5569029595e801e0c27e0fde960", size = 30273, upload-time = "2025-10-21T08:04:31.696Z" }, +] + +[[package]] +name = "pyobjc-framework-corespotlight" +version = "12.0" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "pyobjc-core" }, + { name = "pyobjc-framework-cocoa" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/18/7e/6f7cd71fb6795eba72a5886b3de8a3ec2c3ae6f1696340d6e51076d48eaf/pyobjc_framework_corespotlight-12.0.tar.gz", hash = "sha256:440181b5bb177ed76cea6e5d65ed39814b04f51bcfa02fba1b58fb5dc30d17c9", size = 38429, upload-time = "2025-10-21T08:32:24.56Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/f0/73/50db0cb816a1d47a77dfc998e1ba0e4159090438f465b96ecc10445183bf/pyobjc_framework_corespotlight-12.0-cp313-cp313-macosx_10_13_universal2.whl", hash = "sha256:7fb8b38bd6413b3fdcba4e5c710165835c84d0ea69800c5e8d5c8244286f9007", size = 10021, upload-time = "2025-10-21T08:04:39.1Z" }, + { url = "https://files.pythonhosted.org/packages/cf/d3/8e7e39111978edea5e3061b007e1cb1f199a019e0877d0d1dc37cffcdc14/pyobjc_framework_corespotlight-12.0-cp313-cp313t-macosx_10_13_universal2.whl", hash = "sha256:243e6d8b667402cd19dd9ec5402d33d5d761601d0c3ceea6de5b2e492f643d2c", size = 10163, upload-time = "2025-10-21T08:04:41.106Z" }, + { url = "https://files.pythonhosted.org/packages/2e/de/0eabeb3ec532658ac0b13c4802802555d09fed23a47ae9243cda9142d556/pyobjc_framework_corespotlight-12.0-cp314-cp314-macosx_10_15_universal2.whl", hash = "sha256:9d63fa40c2fee8de6ae6aa687d6110cd9b2faeeb0459930e5a73add0fe3dc2b3", size = 10081, upload-time = "2025-10-21T08:04:42.73Z" }, + { url = "https://files.pythonhosted.org/packages/cd/94/a9d0e3fa2b2fdde4df51fb5047ad91f89224f1b2499bcb23c7e70725caa5/pyobjc_framework_corespotlight-12.0-cp314-cp314t-macosx_10_15_universal2.whl", hash = "sha256:3c9e2a61a5bf6399fae62c3f0cf3ac2f024752b5153aa47844cdbdfbafc63cac", size = 10219, upload-time = "2025-10-21T08:04:44.468Z" }, +] + +[[package]] +name = "pyobjc-framework-coretext" +version = "12.0" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "pyobjc-core" }, + { name = "pyobjc-framework-cocoa" }, + { name = "pyobjc-framework-quartz" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/b1/36/32ec183e555b73152d7813f6f7c277fd018440f70a1f142bd75b04946089/pyobjc_framework_coretext-12.0.tar.gz", hash = "sha256:8cc0c7dd2b7e68ad1c760784e422722550c77cbdbd60eb455170ec444ca1cfd2", size = 90546, upload-time = "2025-10-21T08:32:31.291Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/30/64/31da2b1236c710b963510fc03008ebe607d03e2c0288467db9bf9f297873/pyobjc_framework_coretext-12.0-cp313-cp313-macosx_10_13_universal2.whl", hash = "sha256:ecd424cf6da1a69cad40ef4007bc5af842ccb7456c5fcc4c9aded40e3e0c22ba", size = 30119, upload-time = "2025-10-21T08:04:57.402Z" }, + { url = "https://files.pythonhosted.org/packages/21/1d/d23fa47ffb6ad32e26a58e357619b5564b4f6e421a839d12961cce521c8f/pyobjc_framework_coretext-12.0-cp313-cp313t-macosx_10_13_universal2.whl", hash = "sha256:60e84e46e0aeb12101a4354c39ce84066107773b0c96fdc4ff15fd1662dc88d8", size = 30702, upload-time = "2025-10-21T08:05:00.387Z" }, + { url = "https://files.pythonhosted.org/packages/07/e4/96caefd91817d0f82aaae089e4421cbbef2a216933b5c98435ee2927fbef/pyobjc_framework_coretext-12.0-cp314-cp314-macosx_10_15_universal2.whl", hash = "sha256:6ecf89af6de87072f1615fb89d7ed51b345000850a9b827774f262bf6be5acac", size = 30104, upload-time = "2025-10-21T08:05:03.331Z" }, + { url = "https://files.pythonhosted.org/packages/e5/b5/9152c1a2d8a6fb06d48a36d95b5bb919e820a2f623ca8313ab5eba263be0/pyobjc_framework_coretext-12.0-cp314-cp314t-macosx_10_15_universal2.whl", hash = "sha256:ddc34c91d16a653db81963141d29f8fc82550fc7a39ed39ff0332764d844ffe1", size = 30714, upload-time = "2025-10-21T08:05:07.092Z" }, +] + +[[package]] +name = "pyobjc-framework-corewlan" +version = "12.0" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "pyobjc-core" }, + { name = "pyobjc-framework-cocoa" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/ac/06/ed26dab70dce1e2137e08cd18beca9313bccb2cc357bcbf5764c776b85ff/pyobjc_framework_corewlan-12.0.tar.gz", hash = "sha256:a724959e0b9b0fcc7b698b7c0a6e8457b82828c3a88385c9ac8c758791aed15a", size = 32760, upload-time = "2025-10-21T08:32:34.626Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/0a/1c/f4bcb0c6cdf1cc5184f266aecf814ca60e4acbb3b65bfa9395d39fb0f425/pyobjc_framework_corewlan-12.0-cp313-cp313-macosx_10_13_universal2.whl", hash = "sha256:1bf43f273f5bce60dd60c98739bd5877581f04027774018549d8ffd81a3f93ea", size = 9974, upload-time = "2025-10-21T08:05:13.731Z" }, + { url = "https://files.pythonhosted.org/packages/ac/9f/53e0886d9fe5de867cf77c0e0c6f90b8b40058375c3bf3770fe878e5aae9/pyobjc_framework_corewlan-12.0-cp313-cp313t-macosx_10_13_universal2.whl", hash = "sha256:7f2c0d38dc39877365185dd748c5e61ae5c418dec5b2683cebedd653d1a333e6", size = 10124, upload-time = "2025-10-21T08:05:15.727Z" }, + { url = "https://files.pythonhosted.org/packages/b7/b1/7043bab71e3f917711ba4da5f7ac8a248fe6a6f56dfaacf12f739de097a4/pyobjc_framework_corewlan-12.0-cp314-cp314-macosx_10_15_universal2.whl", hash = "sha256:e8675a8aa5906d22cfd6ccc834344ddfd6527a362c0c140e4659f349a59c9915", size = 10016, upload-time = "2025-10-21T08:05:17.371Z" }, + { url = "https://files.pythonhosted.org/packages/39/4b/7f4c8d26b7c9f1389ee075f44f123b5354046dc2b8f884b6ecf66a734128/pyobjc_framework_corewlan-12.0-cp314-cp314t-macosx_10_15_universal2.whl", hash = "sha256:85958c9e61c6894ff6f039b771f5b01a9f53a8ad4d930504bfe1c1c2dfdef1e9", size = 10177, upload-time = "2025-10-21T08:05:18.986Z" }, +] + +[[package]] +name = "pyobjc-framework-cryptotokenkit" +version = "12.0" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "pyobjc-core" }, + { name = "pyobjc-framework-cocoa" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/43/4b/31141f2f8ba250d1de21895984b179ca2307870a5c00e97f0ad34227303c/pyobjc_framework_cryptotokenkit-12.0.tar.gz", hash = "sha256:3b6aa22c584a5e330be6c85ca588798686c7eb3e25f06e069c12e82eacb36c38", size = 33086, upload-time = "2025-10-21T08:32:37.683Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/21/f3/016fa856ae44547273ed36c2d87a4ae7376b9eda6dfaa80e3515ed853f42/pyobjc_framework_cryptotokenkit-12.0-cp313-cp313-macosx_10_13_universal2.whl", hash = "sha256:0907f65b48857ed1724299aca5fa94f96abb56cc078d7455e7ba4dbcf1dee77d", size = 12660, upload-time = "2025-10-21T08:05:27.853Z" }, + { url = "https://files.pythonhosted.org/packages/fb/56/7e2bd25abd3ee53ff98765615850393851408033d13d1a2dc0796e7236ff/pyobjc_framework_cryptotokenkit-12.0-cp313-cp313t-macosx_10_13_universal2.whl", hash = "sha256:973efe489fff55b7e688bf62c161c18c0007d8b029f09d80267a1181a8aca6f2", size = 12845, upload-time = "2025-10-21T08:05:29.746Z" }, + { url = "https://files.pythonhosted.org/packages/f2/7d/112a3b8308fa18e65b86b9d2f09cc3e00758df6a24b96f0776ba8e008274/pyobjc_framework_cryptotokenkit-12.0-cp314-cp314-macosx_10_15_universal2.whl", hash = "sha256:d58427f8794250574a4ed8736efd294414755ecbd84bc103531aeeaaa5b922ee", size = 12639, upload-time = "2025-10-21T08:05:31.969Z" }, + { url = "https://files.pythonhosted.org/packages/4a/f7/6132d386f89a013d87bd210da86e66182e0dc5942f309c6122baa79e5931/pyobjc_framework_cryptotokenkit-12.0-cp314-cp314t-macosx_10_15_universal2.whl", hash = "sha256:0bafe8ca98d016637b9ae94b845469e6fd193922a004194dd75c5e8768fff718", size = 12848, upload-time = "2025-10-21T08:05:33.73Z" }, +] + +[[package]] +name = "pyobjc-framework-datadetection" +version = "12.0" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "pyobjc-core" }, + { name = "pyobjc-framework-cocoa" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/9f/a1/2d556dd61c05f8fdd05d3383eb85f49d037cb3ccc276da10d38c86259720/pyobjc_framework_datadetection-12.0.tar.gz", hash = "sha256:3784ce6f220dc1bd7bc39fed240431500f106d4ae627ff2b99575ef7667f2a37", size = 12377, upload-time = "2025-10-21T08:32:39.458Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/71/1d/5fa176aa5734c99ed0c99c64b547225ac97f6254ce00703d13289f09b4f2/pyobjc_framework_datadetection-12.0-py2.py3-none-any.whl", hash = "sha256:6715d68cb38a3660e083fb8c70bce75c30e61d91cd7818f006b6e2cb49491e05", size = 3505, upload-time = "2025-10-21T08:05:35.095Z" }, +] + +[[package]] +name = "pyobjc-framework-devicecheck" +version = "12.0" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "pyobjc-core" }, + { name = "pyobjc-framework-cocoa" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/cb/56/72626225f821c6c7aef0bb14100e5418b9c4a46c101236336096e9f9b2ad/pyobjc_framework_devicecheck-12.0.tar.gz", hash = "sha256:dc51a4ac7afb68f7dbfaa6ec74b85ac0915058be9d4ee5e17b2ca33edde57d28", size = 12953, upload-time = "2025-10-21T08:32:41.158Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/3b/31/ee708c5f5329da63ad4448eed9079c4310c140a0d064cce9a03bb8c112e4/pyobjc_framework_devicecheck-12.0-py2.py3-none-any.whl", hash = "sha256:b11efc8d82875de368cd102aedea468da32fed6d0686b5da2eeed9cd750cc5ae", size = 3696, upload-time = "2025-10-21T08:05:36.564Z" }, +] + +[[package]] +name = "pyobjc-framework-devicediscoveryextension" +version = "12.0" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "pyobjc-core" }, + { name = "pyobjc-framework-cocoa" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/4b/b4/7fd6b558a657d1557ce41be0f647473f739079a6f5e1289cdd788fb717e0/pyobjc_framework_devicediscoveryextension-12.0.tar.gz", hash = "sha256:77a6a39468a9aa01d127b14ea314870b757280ddd802e7b30274ffc138b7a76c", size = 14768, upload-time = "2025-10-21T08:32:43.055Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/54/a5/b48b9018ebaf3d79ed01c33ba23828a2c10ad276f45457c7b5dd0b00ecd7/pyobjc_framework_devicediscoveryextension-12.0-py2.py3-none-any.whl", hash = "sha256:46c1a39be20183776ee95cc7b2132e2e3013aeea559ec0431275a77a613c4012", size = 4327, upload-time = "2025-10-21T08:05:38.142Z" }, +] + +[[package]] +name = "pyobjc-framework-dictionaryservices" +version = "12.0" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "pyobjc-core" }, + { name = "pyobjc-framework-coreservices" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/0b/14/18a56b54e3fe6477f6a9ab92a318f05fd70b0b7797f4170bcd38418aba37/pyobjc_framework_dictionaryservices-12.0.tar.gz", hash = "sha256:e415dcdcc93ab42bc7beaab9b6696f6c417e57ace689d3e7d7ed9b1fef5d1119", size = 10589, upload-time = "2025-10-21T08:32:44.649Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/3a/b0/c57721118d28a9cd3d05fb74774c72eb2304b95a2a7beb1d7653fdd551e6/pyobjc_framework_dictionaryservices-12.0-py2.py3-none-any.whl", hash = "sha256:f8f54b290772c36081d38dfc089d5ed5c4486a7a584a7e1f685203e1c8b210f6", size = 3940, upload-time = "2025-10-21T08:05:39.627Z" }, +] + +[[package]] +name = "pyobjc-framework-discrecording" +version = "12.0" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "pyobjc-core" }, + { name = "pyobjc-framework-cocoa" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/8c/ab/a6126d2a23e50cb5c53a731a4eb084b98c9ee7fc86ba3952a61ef1729c39/pyobjc_framework_discrecording-12.0.tar.gz", hash = "sha256:cb2bc1c9ea9c4f3ed38e4fa64ed0d7ff3c1d8cfa2a90cee5680e9468190aeb17", size = 55974, upload-time = "2025-10-21T08:32:49.274Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/f2/5f/ec63dda83d0616c68855801e4c3aa341b9c47b9d6cecbbcce57f26e637aa/pyobjc_framework_discrecording-12.0-cp313-cp313-macosx_10_13_universal2.whl", hash = "sha256:d5e3f5ac73ee969ee99a12057ce6356609971f52a2323b1b5f1abb7ba5fcee50", size = 14582, upload-time = "2025-10-21T08:05:47.824Z" }, + { url = "https://files.pythonhosted.org/packages/96/50/d844de9cb36193dc990fd68ac7989e9f592fd8d50971bcd1a71b4d0815d2/pyobjc_framework_discrecording-12.0-cp313-cp313t-macosx_10_13_universal2.whl", hash = "sha256:91e369ff415c189df373a4e435456eb227e2579636801b4635cd60577293d06a", size = 14756, upload-time = "2025-10-21T08:05:49.84Z" }, + { url = "https://files.pythonhosted.org/packages/ac/bd/56b912a9a1314696b9e5d23e99632601689f9e2ff8a08a17214f761ecbaa/pyobjc_framework_discrecording-12.0-cp314-cp314-macosx_10_15_universal2.whl", hash = "sha256:6f62d945627c78acfd5ffd523e86a5d4ae41cfcd0c2683e437ee9e65aefccb5d", size = 14646, upload-time = "2025-10-21T08:05:51.834Z" }, + { url = "https://files.pythonhosted.org/packages/d2/85/cb54cc0344900c4bc34e3eb02ada9dae5a966b5ec4bd733490f781b45429/pyobjc_framework_discrecording-12.0-cp314-cp314t-macosx_10_15_universal2.whl", hash = "sha256:95f09e2c715660fff406637946a4b8d7696dafd2c3c00d840c46b15fede91667", size = 14818, upload-time = "2025-10-21T08:05:53.829Z" }, +] + +[[package]] +name = "pyobjc-framework-discrecordingui" +version = "12.0" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "pyobjc-core" }, + { name = "pyobjc-framework-cocoa" }, + { name = "pyobjc-framework-discrecording" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/9f/12/895107bac87ad78c822debb9c68bfc17d7e632f9778cfb8f01b3b7fcafc8/pyobjc_framework_discrecordingui-12.0.tar.gz", hash = "sha256:31d31a903f4d12753e24e77951fe1fc2e27a7bf8643e7b97ba061d41008336ec", size = 16477, upload-time = "2025-10-21T08:32:51.288Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/bf/ce/35f69d7fb296e7548d2d76de446e02c351890a745799454e85bd170c60ca/pyobjc_framework_discrecordingui-12.0-py2.py3-none-any.whl", hash = "sha256:3cce85f3d13f28561e734b61facc1a16b632b73e69c5f14943816cf0fa184cdc", size = 4716, upload-time = "2025-10-21T08:05:55.284Z" }, +] + +[[package]] +name = "pyobjc-framework-diskarbitration" +version = "12.0" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "pyobjc-core" }, + { name = "pyobjc-framework-cocoa" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/0e/96/be0ced457c9483efa7ec9789abcd5945446bc54ab1d785363c5f8d8bbd45/pyobjc_framework_diskarbitration-12.0.tar.gz", hash = "sha256:88df934c0cbc63daa496e2318e9ffa1d5e0096b6107fcff550afdd6817142813", size = 17191, upload-time = "2025-10-21T08:32:53.577Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/2f/9c/79e41d6fedea3c07d1a9d83b1d6ad2585a0d9693b57a8b92ee60a0c19135/pyobjc_framework_diskarbitration-12.0-py2.py3-none-any.whl", hash = "sha256:690e34ea7548c21519855e5d1ebb0fcf9538d7562ec15779c5c63b580d9c855f", size = 4889, upload-time = "2025-10-21T08:05:56.835Z" }, +] + +[[package]] +name = "pyobjc-framework-dvdplayback" +version = "12.0" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "pyobjc-core" }, + { name = "pyobjc-framework-cocoa" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/de/28/a9b7a2722cf94382ec843601e656524246384f3ff710a60c18e617acc756/pyobjc_framework_dvdplayback-12.0.tar.gz", hash = "sha256:433e8790641a210304b47079965eda2737578033747f3eb20d1758afcfbb35a2", size = 32345, upload-time = "2025-10-21T08:32:56.597Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/fd/81/57fe080195079c27e45bcfbc528895549f6f35080fb41dde6720485964ec/pyobjc_framework_dvdplayback-12.0-py2.py3-none-any.whl", hash = "sha256:9d68ed25523e14faf6c79f89d87c21942147063b7e5cb625edad40e9dffe6360", size = 8253, upload-time = "2025-10-21T08:05:58.852Z" }, +] + +[[package]] +name = "pyobjc-framework-eventkit" +version = "12.0" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "pyobjc-core" }, + { name = "pyobjc-framework-cocoa" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/1d/c4/b6e30b7917777bb74d3caffb6568e4644c0b9cfa75b0dfc4942bfde3fad1/pyobjc_framework_eventkit-12.0.tar.gz", hash = "sha256:6a67a70cee1d9399cca2c04303ec10ae0d2a99ceca1bd7f9a3c67ff166057680", size = 28578, upload-time = "2025-10-21T08:32:59.228Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/1c/49/aa23695c867aafea7254058218202bffda0abf1b3bbf2d1c617a73266662/pyobjc_framework_eventkit-12.0-py2.py3-none-any.whl", hash = "sha256:1771062ab40d26e878cbf27bdf1f9fe539854c62eea8b44d7be9218dc7d6ce67", size = 6827, upload-time = "2025-10-21T08:06:00.692Z" }, +] + +[[package]] +name = "pyobjc-framework-exceptionhandling" +version = "12.0" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "pyobjc-core" }, + { name = "pyobjc-framework-cocoa" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/51/e6/afbd7407d43562878cf66f16bc79439616a447900f1dadf5015e9bbf3f8d/pyobjc_framework_exceptionhandling-12.0.tar.gz", hash = "sha256:047dc74c185b9bacb165a6d77a079a0ccec099f0ab516da726273305e41b18f6", size = 16748, upload-time = "2025-10-21T08:33:01.159Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/23/c3/97804dc40a8a3af7a01b71b52a50bb2d43e4bb6aabb15a20de083f49caa6/pyobjc_framework_exceptionhandling-12.0-py2.py3-none-any.whl", hash = "sha256:d69f34caf50bd2fe135d04ffc00342e4b1c0d76340170418688317ad4685ac08", size = 7124, upload-time = "2025-10-21T08:06:02.731Z" }, +] + +[[package]] +name = "pyobjc-framework-executionpolicy" +version = "12.0" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "pyobjc-core" }, + { name = "pyobjc-framework-cocoa" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/cf/40/10c3c6a10d0b2829e96fcf3f8375846e5af1926b9b024147c9fc7e0ceff8/pyobjc_framework_executionpolicy-12.0.tar.gz", hash = "sha256:508d1ac045f9f2747db1a93ce45381f4e5f64881f4adc79fb0474f4dbe6237eb", size = 12649, upload-time = "2025-10-21T08:33:03.053Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/dd/67/b8398c778e3821f666d8530974e216f7e7c148beb5fa0088c151935b6554/pyobjc_framework_executionpolicy-12.0-py2.py3-none-any.whl", hash = "sha256:6b882acdbfe5cc6f0783f9f99ffb98d2d34eb72b0761e8cc812f7b518b77b2a8", size = 3749, upload-time = "2025-10-21T08:06:04.194Z" }, +] + +[[package]] +name = "pyobjc-framework-extensionkit" +version = "12.0" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "pyobjc-core" }, + { name = "pyobjc-framework-cocoa" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/b3/54/36ea7f32481e5e4cc1bac159ff9e4dc94fd4827f544e85caa2a03b4c5938/pyobjc_framework_extensionkit-12.0.tar.gz", hash = "sha256:02e6b5613797a79c77b277b352441c8667117b657b06b862277c681d75cc7c01", size = 19085, upload-time = "2025-10-21T08:33:05.427Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/08/ef/a4fe3c097e55244f27ade55af62e5a8a747fc87c2285b6838ec2c1593550/pyobjc_framework_extensionkit-12.0-cp313-cp313-macosx_10_13_universal2.whl", hash = "sha256:6f0d037a5288d709ea6eb44adf5406d324958f693aca622b840078d8a5825db2", size = 7950, upload-time = "2025-10-21T08:06:11.815Z" }, + { url = "https://files.pythonhosted.org/packages/67/6c/8a2b08eaa67c883eb434821af0d415168dd7123fcbf3e03ad7bb4bc3cd27/pyobjc_framework_extensionkit-12.0-cp313-cp313t-macosx_10_13_universal2.whl", hash = "sha256:eed6b5bf85b9d06c5e47b95c3b36fd530b3c768cda830b58734ba18cdd5b39ba", size = 8099, upload-time = "2025-10-21T08:06:13.703Z" }, + { url = "https://files.pythonhosted.org/packages/d7/a2/df77539dd30d5344f223a4fc5bc9414ae8029ba5b196cdf7a33d6f6cffdb/pyobjc_framework_extensionkit-12.0-cp314-cp314-macosx_10_15_universal2.whl", hash = "sha256:2c3dc04387cf96467e3aa8221150b6d0ed9d52af26980ff3eca012671eb662df", size = 8018, upload-time = "2025-10-21T08:06:15.464Z" }, + { url = "https://files.pythonhosted.org/packages/9b/f3/764fe0feb220667b85110d95399e76d567a4d626ed2ae7d1eabc0c685c2c/pyobjc_framework_extensionkit-12.0-cp314-cp314t-macosx_10_15_universal2.whl", hash = "sha256:1a97ae6663bd5faf256484fcbc85625cb9735994fcce83d0bfa912967b33e3df", size = 8157, upload-time = "2025-10-21T08:06:17.023Z" }, +] + +[[package]] +name = "pyobjc-framework-externalaccessory" +version = "12.0" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "pyobjc-core" }, + { name = "pyobjc-framework-cocoa" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/77/af/65fb12b47da17c7cbe32c5650fbe6071aa7ca580d1db27f6760730bbba55/pyobjc_framework_externalaccessory-12.0.tar.gz", hash = "sha256:654301eb0370eef57ddd472c8e71e25a0f0e6d720e38730369b1c3712fe67b0b", size = 21353, upload-time = "2025-10-21T08:33:07.688Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/37/00/56c302c594516fd9cb1e64c073774ba1e3337a1236cd55a88d5ef0f2acee/pyobjc_framework_externalaccessory-12.0-cp313-cp313-macosx_10_13_universal2.whl", hash = "sha256:2e8ea60aede93ed6af3b121f95aedfffe87913659ee470d9140eedaf3cac04d7", size = 8953, upload-time = "2025-10-21T08:06:25.53Z" }, + { url = "https://files.pythonhosted.org/packages/8d/2b/74456a9f89e966560e09beb4841bd8ee52284f2eb6692e0cce3adebba343/pyobjc_framework_externalaccessory-12.0-cp313-cp313t-macosx_10_13_universal2.whl", hash = "sha256:b9275d656f44464b96e75cb1d5514ef6806747ca3d9e34469d409a8bd16eaa22", size = 9111, upload-time = "2025-10-21T08:06:27.168Z" }, + { url = "https://files.pythonhosted.org/packages/a4/fa/c647e023dafc79675024f5a0afa9ea179a7c97ae9d6a267129cf541857f6/pyobjc_framework_externalaccessory-12.0-cp314-cp314-macosx_10_15_universal2.whl", hash = "sha256:f2e188740640270af2b608682bb041b9006d38899657c54d775acc723ba7c7ef", size = 9009, upload-time = "2025-10-21T08:06:28.837Z" }, + { url = "https://files.pythonhosted.org/packages/f8/61/a9cdaf3bca459b81a8f4d2d367eb9753ee7ebbd56733588ddf1bf0e95e25/pyobjc_framework_externalaccessory-12.0-cp314-cp314t-macosx_10_15_universal2.whl", hash = "sha256:38f655c538a6a7dc65ff83b6fb2c6d9441f9334612012fc2c05d3e7f2f9f2073", size = 9193, upload-time = "2025-10-21T08:06:30.778Z" }, +] + +[[package]] +name = "pyobjc-framework-fileprovider" +version = "12.0" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "pyobjc-core" }, + { name = "pyobjc-framework-cocoa" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/79/3c/57bcedb1076903d44078ecfa402ee4a27a3cee123a86e684c8683316b2d1/pyobjc_framework_fileprovider-12.0.tar.gz", hash = "sha256:8b0c33f34c123b757b09406e6fd29a8e5b3348cc8e271533386af860f2bfce65", size = 43431, upload-time = "2025-10-21T08:33:11.66Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/34/38/401a24b91f299bc7de29e9ec61c214ae4b84d6834f629fb34858d34fe7e0/pyobjc_framework_fileprovider-12.0-cp313-cp313-macosx_10_13_universal2.whl", hash = "sha256:9b4fcea703e8f8b17b0503b7b48c071bef524f5420f5ae4c66fcd35cf87a85bb", size = 21016, upload-time = "2025-10-21T08:06:40.082Z" }, + { url = "https://files.pythonhosted.org/packages/ce/c4/43325b4d2161ea22180087bf29f3c784cdc22ed2c395ee6324a123bcab4f/pyobjc_framework_fileprovider-12.0-cp313-cp313t-macosx_10_13_universal2.whl", hash = "sha256:dab249a72005cd473bf18cc5d335bacac15bf9faeb639960d7b38594543f6a45", size = 21307, upload-time = "2025-10-21T08:06:43.218Z" }, + { url = "https://files.pythonhosted.org/packages/f6/7d/6f7cd199ce73c6b0001cbaf972531ca64f90c405e2362a776cee8614cb81/pyobjc_framework_fileprovider-12.0-cp314-cp314-macosx_10_15_universal2.whl", hash = "sha256:f6b842ea2f9bc7fab2bfc8bf62262a4e4594b7b29052afc4587dc1bb601507ba", size = 21066, upload-time = "2025-10-21T08:06:45.473Z" }, + { url = "https://files.pythonhosted.org/packages/eb/51/571806793ef91f8c522a879a24b621b816f777ebe39b9e0f0f625d219a42/pyobjc_framework_fileprovider-12.0-cp314-cp314t-macosx_10_15_universal2.whl", hash = "sha256:040e13cb5ec00bc9453bbed2fe65b8b8900c035cf169cc76e6c4fd96760a683d", size = 21343, upload-time = "2025-10-21T08:06:48.227Z" }, +] + +[[package]] +name = "pyobjc-framework-fileproviderui" +version = "12.0" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "pyobjc-core" }, + { name = "pyobjc-framework-fileprovider" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/39/19/fb3a1ce592110c02152b1663ce82ec9505af9310dc1b4d30b6669e2becdb/pyobjc_framework_fileproviderui-12.0.tar.gz", hash = "sha256:7d6903eeb9a1b890d26d4beff0fa027be780c2135eab6a642fbfdcad71dfa78c", size = 12476, upload-time = "2025-10-21T08:33:13.512Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/04/24/41981f2d97c7beeaf7b48351fc7044293f99ffd678c5690e24e356ce02f4/pyobjc_framework_fileproviderui-12.0-py2.py3-none-any.whl", hash = "sha256:821e5a84f6c2122cd03d64428a9b0af2d41ee27bce8b417d9fa7a97470a97ee7", size = 3723, upload-time = "2025-10-21T08:06:49.631Z" }, +] + +[[package]] +name = "pyobjc-framework-findersync" +version = "12.0" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "pyobjc-core" }, + { name = "pyobjc-framework-cocoa" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/6c/8f/7574edd92f3ba6358b14708ab40a049d2a4c02029ac6f4f88f498074a0ba/pyobjc_framework_findersync-12.0.tar.gz", hash = "sha256:7a7220395127bec31b4cbbbe40c1ec8fa0f5586c241e5c158c567543338d766d", size = 13615, upload-time = "2025-10-21T08:33:15.282Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/79/93/b49eb8f4e8bdc8892018acfd82b0be9b5b4f2cc44416867bf3afa0e16ccc/pyobjc_framework_findersync-12.0-py2.py3-none-any.whl", hash = "sha256:0b27ef0255a04d0241700bd68d30df629c01a02afeb9ab2aad0bd50219022485", size = 4901, upload-time = "2025-10-21T08:06:51.271Z" }, +] + +[[package]] +name = "pyobjc-framework-fsevents" +version = "12.0" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "pyobjc-core" }, + { name = "pyobjc-framework-cocoa" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/59/2b/52f6c1f1c8725b08d53c8fe4c0ea18fb17a91674b8023e20d6aef0f15820/pyobjc_framework_fsevents-12.0.tar.gz", hash = "sha256:768bfc90da3547516b6833e33f28d5f49238c2b47f44b8a9b7c941b951488cd9", size = 26890, upload-time = "2025-10-21T08:33:18.139Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/af/ab/085b9012909b7daee172c0466d25f38928b9c8d905da0d8b8a2e85aeb81a/pyobjc_framework_fsevents-12.0-cp313-cp313-macosx_10_13_universal2.whl", hash = "sha256:0fdddf5a11b2d3f46d75e53d72aa01dedb74bbbcdc0251df4e47196989f1102e", size = 13155, upload-time = "2025-10-21T08:06:59.986Z" }, + { url = "https://files.pythonhosted.org/packages/df/7d/5ea57bf2a101c37a019bf2a2af3c1444c85aa6602d5aab52630c8d470237/pyobjc_framework_fsevents-12.0-cp313-cp313t-macosx_10_13_universal2.whl", hash = "sha256:2bcfc084dfc4db42f503eeecb5d3e8f5cad9cf54f14ab84e61f6d24c41276454", size = 13518, upload-time = "2025-10-21T08:07:01.996Z" }, + { url = "https://files.pythonhosted.org/packages/d9/1d/3105e4419e184e1b31ededdd788c5f2a9c9b97cfa0a391f584218cc8ec85/pyobjc_framework_fsevents-12.0-cp314-cp314-macosx_10_15_universal2.whl", hash = "sha256:a066a7f3aa2eb9e1cdae0773939a736e133fbdaf08a36b07558cf9283f9c5541", size = 13047, upload-time = "2025-10-21T08:07:04.186Z" }, + { url = "https://files.pythonhosted.org/packages/1e/70/feb81655ed49ef3b4adc211e98cbc9f0360a380deb74afaeb8f4cf064519/pyobjc_framework_fsevents-12.0-cp314-cp314t-macosx_10_15_universal2.whl", hash = "sha256:a8046f4cecaa5b107bd1968a99925bbccf36ef9ab70e9ac6990483334465967a", size = 13510, upload-time = "2025-10-21T08:07:06.124Z" }, +] + +[[package]] +name = "pyobjc-framework-fskit" +version = "12.0" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "pyobjc-core" }, + { name = "pyobjc-framework-cocoa" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/0b/6e/240f3ff4e1b6c51ddb48f0ebb7dfb25d6d328b474fc43891fbbd70a7e760/pyobjc_framework_fskit-12.0.tar.gz", hash = "sha256:90efb6c61aa27f7a0c7a9c09d465f5dac65ccfc35753e772be0394274fbad499", size = 42767, upload-time = "2025-10-21T08:33:21.725Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/82/7d/95b2effe20b05f8b99cc85838ab25c1da09d8ba5d80ae91a9d02c5a89942/pyobjc_framework_fskit-12.0-cp313-cp313-macosx_10_13_universal2.whl", hash = "sha256:6b56bb27d6e628594c09fe61d7de42b4c63499fa402b2b486669a904519aea4c", size = 20265, upload-time = "2025-10-21T08:07:15.879Z" }, + { url = "https://files.pythonhosted.org/packages/73/a6/341008b04ac28924e5e1e1c038f117e22e2edab11741941eb34a3d45db87/pyobjc_framework_fskit-12.0-cp313-cp313t-macosx_10_13_universal2.whl", hash = "sha256:be56f2edc7f25dbf94cc579f84bd33bdf0278f742a95565cb5ae8a2305fba774", size = 20497, upload-time = "2025-10-21T08:07:18.223Z" }, + { url = "https://files.pythonhosted.org/packages/70/c4/7e9fbbc5ab1e349f700e870fae04a67f6a9c58e5456cf3e93c4b397be2e0/pyobjc_framework_fskit-12.0-cp314-cp314-macosx_10_15_universal2.whl", hash = "sha256:fb228d94776a7b8e73259302231fc0c9db2423d404e75fafc867e637b740f4a9", size = 20300, upload-time = "2025-10-21T08:07:20.394Z" }, + { url = "https://files.pythonhosted.org/packages/b9/ea/fa33ebef6388bce4533bb5892638ff1b6dd571229ebb1e6b99bca363e3b4/pyobjc_framework_fskit-12.0-cp314-cp314t-macosx_10_15_universal2.whl", hash = "sha256:ae6a2c2c9dd0ba405f1c9cdc4dd63c22e713257baa73ae394dacaa84066b8ed4", size = 20546, upload-time = "2025-10-21T08:07:22.658Z" }, +] + +[[package]] +name = "pyobjc-framework-gamecenter" +version = "12.0" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "pyobjc-core" }, + { name = "pyobjc-framework-cocoa" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/71/46/f4a7d4aef99e82a65a6c769cf5eed4dad42c8a9a6b2bc72234590513990f/pyobjc_framework_gamecenter-12.0.tar.gz", hash = "sha256:c33467f4a8d93b1d6d3e719d6d11d373909ede6e86f61eaf5fa936d8d7e78cdf", size = 31860, upload-time = "2025-10-21T08:33:25.12Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/07/47/2c589fd453099d326bc077e7dff19ca41e9b68fc006ebe289a0724cd4dc8/pyobjc_framework_gamecenter-12.0-cp313-cp313-macosx_10_13_universal2.whl", hash = "sha256:74633c2460344f44e88adff0e1c46a76622ea6b957dcd6959f2b930a99cd72ef", size = 18876, upload-time = "2025-10-21T08:07:32.798Z" }, + { url = "https://files.pythonhosted.org/packages/1b/de/c21fc23b087dc399546dc82fd6cc0492eeb51990e7a4ff58bc65cfa1231c/pyobjc_framework_gamecenter-12.0-cp313-cp313t-macosx_10_13_universal2.whl", hash = "sha256:d2091f1ba0703b2119163853e490d9c90c014194510155be58ea3eab8629473c", size = 19166, upload-time = "2025-10-21T08:07:35.006Z" }, + { url = "https://files.pythonhosted.org/packages/50/5b/02252fcba11bcf20e4c772d60c2500a2f432c3bb1019f37a56152e438e16/pyobjc_framework_gamecenter-12.0-cp314-cp314-macosx_10_15_universal2.whl", hash = "sha256:a1375778604896b13d9b84ae93053db2cf052376ad9c63fc16431ef2211150d1", size = 18932, upload-time = "2025-10-21T08:07:37.491Z" }, + { url = "https://files.pythonhosted.org/packages/f6/ea/fda2bc1a852688cb4866dc82d88532d28dc648182c3943c6c2f0654164f9/pyobjc_framework_gamecenter-12.0-cp314-cp314t-macosx_10_15_universal2.whl", hash = "sha256:7f4c5073d52fe6d2ccf2a7ef5d39b283cd33c2f9357fc5d463abac66b77c3ac0", size = 19221, upload-time = "2025-10-21T08:07:39.685Z" }, +] + +[[package]] +name = "pyobjc-framework-gamecontroller" +version = "12.0" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "pyobjc-core" }, + { name = "pyobjc-framework-cocoa" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/4d/f2/f2496dbe861fff298f6f7d40f2aff085d04704afd87320fcf11227397efd/pyobjc_framework_gamecontroller-12.0.tar.gz", hash = "sha256:d01ede48c35ae62b27db500218a7c83b80a876c0ec2ac42c365f9b8e711fc8e2", size = 54982, upload-time = "2025-10-21T08:33:29.519Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/39/30/0d7e4c08e2f43c3c5a741619d3c3101c977e30a31fe4e1ce759c38711eeb/pyobjc_framework_gamecontroller-12.0-cp313-cp313-macosx_10_13_universal2.whl", hash = "sha256:39f5381980247367b659f2d468df63223b11c8d9f43d11231a291d86b8a3aea9", size = 20963, upload-time = "2025-10-21T08:07:50.26Z" }, + { url = "https://files.pythonhosted.org/packages/c7/54/5069dbbb9b84e88254a6ac28b6ed9e43e1df4319909375730dc9838652b2/pyobjc_framework_gamecontroller-12.0-cp313-cp313t-macosx_10_13_universal2.whl", hash = "sha256:163ecc202b1a43e4e4331a23eff3a5404834b6415cd4380fc5f8288daae00d4e", size = 21232, upload-time = "2025-10-21T08:07:53.003Z" }, + { url = "https://files.pythonhosted.org/packages/af/3a/18c8bd006aad3b67ae822cb66370fbb0268b58127777190016a2bdb3196b/pyobjc_framework_gamecontroller-12.0-cp314-cp314-macosx_10_15_universal2.whl", hash = "sha256:2108d420e876cf324270f179d27df58b116cc22a95afee9975ad5fe589a2ea77", size = 21010, upload-time = "2025-10-21T08:07:55.66Z" }, + { url = "https://files.pythonhosted.org/packages/bc/c1/d70e32b6add228de574e03fa9477bddac8706329b319a8d3e8b45e6400a6/pyobjc_framework_gamecontroller-12.0-cp314-cp314t-macosx_10_15_universal2.whl", hash = "sha256:7ee5b5bfaf9f8a4ae7357902b04e2aa8c1fdc6f66cb867464dfc4d06a64a1de1", size = 21278, upload-time = "2025-10-21T08:07:58.102Z" }, +] + +[[package]] +name = "pyobjc-framework-gamekit" +version = "12.0" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "pyobjc-core" }, + { name = "pyobjc-framework-cocoa" }, + { name = "pyobjc-framework-quartz" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/ad/aa/2734bdd000970d8884a77714c5adebba684c982821f9293205e2cb71b429/pyobjc_framework_gamekit-12.0.tar.gz", hash = "sha256:381724769aa57428eefdb11f1fae9cf6933061723a5806ac41dc63553850f18c", size = 64236, upload-time = "2025-10-21T08:33:34.51Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/42/07/f442ace3c1bee84e5f317f57d375f101b59e5d932033272320b8e4a725ac/pyobjc_framework_gamekit-12.0-cp313-cp313-macosx_10_13_universal2.whl", hash = "sha256:4f4a4b58ebf5986c941a98c828431cad9495f5483041605dd5f114c628212519", size = 22513, upload-time = "2025-10-21T08:08:10.236Z" }, + { url = "https://files.pythonhosted.org/packages/fe/ae/6b2901d9c360648c5ad61b72d74eda8b512d6da77226fa87c5a62af3168b/pyobjc_framework_gamekit-12.0-cp313-cp313t-macosx_10_13_universal2.whl", hash = "sha256:28fdb8992ec926f67159700637495cca0271519c278e22f410fb65260404df6c", size = 22805, upload-time = "2025-10-21T08:08:12.754Z" }, + { url = "https://files.pythonhosted.org/packages/3c/d2/5d413a8cccd68cb5aa8a10f461aa426f3d93dfb39204e632063f71ba66c5/pyobjc_framework_gamekit-12.0-cp314-cp314-macosx_10_15_universal2.whl", hash = "sha256:08414996660aa25f86fe4583649f702769a9600ba5bd5c37152e1bee36904df5", size = 22545, upload-time = "2025-10-21T08:08:15.306Z" }, + { url = "https://files.pythonhosted.org/packages/04/f8/58b74fd7b4f321d6d028754fc50effa90b9b2161af2a26d3641fb9b192f5/pyobjc_framework_gamekit-12.0-cp314-cp314t-macosx_10_15_universal2.whl", hash = "sha256:604ca75774845f99b0781290319b642db6e95810275423cc7f1bb1bfbef72295", size = 22859, upload-time = "2025-10-21T08:08:17.829Z" }, +] + +[[package]] +name = "pyobjc-framework-gameplaykit" +version = "12.0" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "pyobjc-core" }, + { name = "pyobjc-framework-cocoa" }, + { name = "pyobjc-framework-spritekit" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/09/d9/d506dde3818c09295f11af52176cf3a6a5d00333cea19069ff44c44a4a89/pyobjc_framework_gameplaykit-12.0.tar.gz", hash = "sha256:e0ff1cac933f5686b62c06766fca7e740932d93fb7e1367e18ab3be082a810dc", size = 41918, upload-time = "2025-10-21T08:33:38.116Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/33/88/3f4fa760b3acb2680bd3e165a68b130f447e9458f2ba9f75fd9aa7ab2023/pyobjc_framework_gameplaykit-12.0-cp313-cp313-macosx_10_13_universal2.whl", hash = "sha256:41b865b484fa885dc5fe26621c599f9a81ab36a8076a23955c73ca2d1a912b15", size = 13174, upload-time = "2025-10-21T08:08:26.136Z" }, + { url = "https://files.pythonhosted.org/packages/93/66/1fcbc04b3e48d3843fcbd53486a9fe072da7560c7b3089c48cc35a1bd97a/pyobjc_framework_gameplaykit-12.0-cp313-cp313t-macosx_10_13_universal2.whl", hash = "sha256:2d4a3fb37cb4393f7bda1e9ced78f7a83962b49c846c3357b768cad7a111b841", size = 13389, upload-time = "2025-10-21T08:08:28.372Z" }, + { url = "https://files.pythonhosted.org/packages/42/30/ab2f6c35603b01f4ef7409c6f850d13cd6323d2c24e87e73c60320f922cd/pyobjc_framework_gameplaykit-12.0-cp314-cp314-macosx_10_15_universal2.whl", hash = "sha256:74fdd8a02deefbbb000ed614a859b153df45245c35d4a27e7e8194f2c7532501", size = 13179, upload-time = "2025-10-21T08:08:30.263Z" }, + { url = "https://files.pythonhosted.org/packages/53/7c/e2753b7dbf88249f3147b8b14da9aac335b0d93ea12015b1b2f10a9490ba/pyobjc_framework_gameplaykit-12.0-cp314-cp314t-macosx_10_15_universal2.whl", hash = "sha256:9515b9fc5f58d0e9331ec9c4df10e9ab2374556bf9957bf1fdba4d553cf8715d", size = 13375, upload-time = "2025-10-21T08:08:32.01Z" }, +] + +[[package]] +name = "pyobjc-framework-gamesave" +version = "12.0" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "pyobjc-core" }, + { name = "pyobjc-framework-cocoa" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/66/b6/de69ddc08ea89a6e2dc3cb64b0ba468996b43b6d91e65463d66530f1cef6/pyobjc_framework_gamesave-12.0.tar.gz", hash = "sha256:2412a243b7a06afa08c46003bbe75790d8cfae2761f55187dd54b082da7ca62f", size = 12714, upload-time = "2025-10-21T08:33:40.191Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/12/84/27dab140da6102f23f1666630d876446152e1d28b35920e65797496d4222/pyobjc_framework_gamesave-12.0-py2.py3-none-any.whl", hash = "sha256:a5be943b5969848b44d2132e33ed88720aa4c389916e41f909e3a7a144ea71cf", size = 3697, upload-time = "2025-10-21T08:08:33.335Z" }, +] + +[[package]] +name = "pyobjc-framework-healthkit" +version = "12.0" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "pyobjc-core" }, + { name = "pyobjc-framework-cocoa" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/24/8c/12fa3d73598d80f2ce77bc0ab1a344e89fd8b5db93a36c74e1c925cf632a/pyobjc_framework_healthkit-12.0.tar.gz", hash = "sha256:4e47b84ed39f322e90a45d39eb91ddcde9fffbf76c75b6e700b80258db3ec58b", size = 92173, upload-time = "2025-10-21T08:33:46.835Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/7f/bd/369f2a1adad473cbe15942f81d829a21fee04af69a21aa23937405c10173/pyobjc_framework_healthkit-12.0-cp313-cp313-macosx_10_13_universal2.whl", hash = "sha256:75d1aa170b3d2b0d6f0ad91f8fa9426765a86a7a747d4cdf4aec7714cce90c3e", size = 20822, upload-time = "2025-10-21T08:08:43.331Z" }, + { url = "https://files.pythonhosted.org/packages/75/45/fba110652b41849cd96080b35f94482be4b232236c6f309125a77dadc6ac/pyobjc_framework_healthkit-12.0-cp313-cp313t-macosx_10_13_universal2.whl", hash = "sha256:c8f59013b88da01ea677cce7e58d5885bf6663397f531ec18693466b968403a7", size = 20991, upload-time = "2025-10-21T08:08:45.565Z" }, + { url = "https://files.pythonhosted.org/packages/49/8f/6810a866a73d92163dd998c1a2dd67b76df54ff943c1a138137815e36c6f/pyobjc_framework_healthkit-12.0-cp314-cp314-macosx_10_15_universal2.whl", hash = "sha256:078563e7fc5a4f492ea972b1d86b5b10ec20484bfb798e18c92c7c6ef252697d", size = 20878, upload-time = "2025-10-21T08:08:47.845Z" }, + { url = "https://files.pythonhosted.org/packages/9a/5c/fdb299a61f6bad7b2d0b73197c2f9ff9fc5f4e6544ab445dee4b823debae/pyobjc_framework_healthkit-12.0-cp314-cp314t-macosx_10_15_universal2.whl", hash = "sha256:4680698a20a3baa869bb2a96a14a5588453518ffa83abf67c72a404ff91e94ee", size = 21055, upload-time = "2025-10-21T08:08:50.113Z" }, +] + +[[package]] +name = "pyobjc-framework-imagecapturecore" +version = "12.0" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "pyobjc-core" }, + { name = "pyobjc-framework-cocoa" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/90/a7/52fa4a0092feaa2c0b72256b3593e03028a8e491344e64c074bdbf33d926/pyobjc_framework_imagecapturecore-12.0.tar.gz", hash = "sha256:36d12a818660de257635b338f286083d09a5b34e4ebd3bc6aae4b979028585cd", size = 46807, upload-time = "2025-10-21T08:33:51.102Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/51/94/acb74f94acf23ea16ff28b7d55e1872b4ae0c15b105bc49785c67caf5cac/pyobjc_framework_imagecapturecore-12.0-cp313-cp313-macosx_10_13_universal2.whl", hash = "sha256:f4889fbcc17948335e2be5dcaf40d171c6f7ea514bb9994dbb3519a4d6a0de5d", size = 16032, upload-time = "2025-10-21T08:08:58.63Z" }, + { url = "https://files.pythonhosted.org/packages/f5/83/51feaf4fd51624c3800d235fd70e791b245867296090d4b6d4675923e9a6/pyobjc_framework_imagecapturecore-12.0-cp313-cp313t-macosx_10_13_universal2.whl", hash = "sha256:bd8d7db7a7acb97fa363e800fd47cf0d026db17fc635ff6c2306a0ba855ae6db", size = 16222, upload-time = "2025-10-21T08:09:00.741Z" }, + { url = "https://files.pythonhosted.org/packages/12/80/e4d7f1ef9664e8f01af06b0c025b77c7362ab319d8b20cf33a2700598b34/pyobjc_framework_imagecapturecore-12.0-cp314-cp314-macosx_10_15_universal2.whl", hash = "sha256:c94f3514bc9ed4288b0568f05b18cbc2138b7656c51e18316a7334f29a472b97", size = 16029, upload-time = "2025-10-21T08:09:02.748Z" }, + { url = "https://files.pythonhosted.org/packages/e3/0a/13ffde2aa24224f93ed7cba6381b58fb7312475c6e871ee5cdf393be3541/pyobjc_framework_imagecapturecore-12.0-cp314-cp314t-macosx_10_15_universal2.whl", hash = "sha256:e04142bec0c3b042c12efafe8948458ff22ef63cd8622cdb13fa84912ac99e2b", size = 16218, upload-time = "2025-10-21T08:09:05.093Z" }, +] + +[[package]] +name = "pyobjc-framework-inputmethodkit" +version = "12.0" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "pyobjc-core" }, + { name = "pyobjc-framework-cocoa" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/e4/49/c58dc9dd9dfce812cadcafb1da8bed88af88fe6f10978a0522ab4b96ceb5/pyobjc_framework_inputmethodkit-12.0.tar.gz", hash = "sha256:a5c16a003f0a08e7ac005a6c4d43074bb5e4cf587d5e57a4f11c47232349962d", size = 23449, upload-time = "2025-10-21T08:33:53.964Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/08/fd/c6237dbc593158edfa7993a51341009bdc3a0daa1c2d2fd191d6e9fbaad6/pyobjc_framework_inputmethodkit-12.0-cp313-cp313-macosx_10_13_universal2.whl", hash = "sha256:fff98e1ba95f5f4ef69d59e791820497498f72a53ef1abf561c819d933273bd7", size = 9533, upload-time = "2025-10-21T08:09:12.161Z" }, + { url = "https://files.pythonhosted.org/packages/da/81/c4c2237988738a19015637053a288cc07eca452065e8430f0456f63c4047/pyobjc_framework_inputmethodkit-12.0-cp313-cp313t-macosx_10_13_universal2.whl", hash = "sha256:5648177af6040ac5b9c1c12c35862b4a3ab8b7819b609b9543644deb6f7a7d62", size = 9700, upload-time = "2025-10-21T08:09:13.771Z" }, + { url = "https://files.pythonhosted.org/packages/6e/65/ff921650fa5647bb36cf5281f6c6b16fd3da1f0564360481f9b5a79a7516/pyobjc_framework_inputmethodkit-12.0-cp314-cp314-macosx_10_15_universal2.whl", hash = "sha256:44f5dec871e2555fa82901d56506b200ec80556acbf7041588dfa8fdad5adfce", size = 9585, upload-time = "2025-10-21T08:09:15.397Z" }, + { url = "https://files.pythonhosted.org/packages/7e/89/87cf9de076846929f55f779333967987755c3d7d1caa15fa04f464032ff6/pyobjc_framework_inputmethodkit-12.0-cp314-cp314t-macosx_10_15_universal2.whl", hash = "sha256:a8b8c3b00c07109923ac48e495ae610c970d7a9c6698b71c3697a5b47d42e985", size = 9757, upload-time = "2025-10-21T08:09:17.331Z" }, +] + +[[package]] +name = "pyobjc-framework-installerplugins" +version = "12.0" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "pyobjc-core" }, + { name = "pyobjc-framework-cocoa" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/fd/65/403d3d6244f8e85201b232b37aacde4d6e80895b7d709047ce71b3f5e830/pyobjc_framework_installerplugins-12.0.tar.gz", hash = "sha256:fbd5824e282f95999ae14b0128ad7bc3dad4b44a067016a8e3750f0252f4d6b7", size = 25313, upload-time = "2025-10-21T08:33:56.444Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/bd/d5/be8217352ebb3d78b600bd85fe274f44f642fd8268b3bca4335caaa7da85/pyobjc_framework_installerplugins-12.0-py2.py3-none-any.whl", hash = "sha256:60950cc9dd4fd0f5e4e8d4cbcf3197765f20b390a8fbfd91478c955e6d90ba11", size = 4826, upload-time = "2025-10-21T08:09:18.707Z" }, +] + +[[package]] +name = "pyobjc-framework-instantmessage" +version = "12.0" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "pyobjc-core" }, + { name = "pyobjc-framework-cocoa" }, + { name = "pyobjc-framework-quartz" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/30/e4/fe583666b7f99aa14d8656600823668d008f52ccce0476c0c9ab2d2ada46/pyobjc_framework_instantmessage-12.0.tar.gz", hash = "sha256:8a9fa19a03c6c56a4e366422259d46a5462ddee23acdb44e74f71e3f923e1aa5", size = 31255, upload-time = "2025-10-21T08:33:59.489Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/79/0e/0e768739befaffe849d1b3aaf2b7078c04d6b2b3e14fb37c53b44c09a291/pyobjc_framework_instantmessage-12.0-py2.py3-none-any.whl", hash = "sha256:9b0068f669e735f59b5d5ccb44861275530cb4bc4aca5e1fd7179828a23f500d", size = 5446, upload-time = "2025-10-21T08:09:20.334Z" }, +] + +[[package]] +name = "pyobjc-framework-intents" +version = "12.0" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "pyobjc-core" }, + { name = "pyobjc-framework-cocoa" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/e1/b6/d2692a8710a9c2c605f8449c90d38cb454ec5e4d35731a97beceed1051f2/pyobjc_framework_intents-12.0.tar.gz", hash = "sha256:77e778574911fe4db80256094260f959c60ad9d67f9cd3d34c136fc37700bba2", size = 132672, upload-time = "2025-10-21T08:34:08.981Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/0a/d5/e1561117512c7a29d98120362b9769aff4d1747f809053fa2c4973042257/pyobjc_framework_intents-12.0-cp313-cp313-macosx_10_13_universal2.whl", hash = "sha256:b5da926124f9e4171438bd19ce80caee6a53fd3cccfd6c1d61874bf24871558a", size = 32177, upload-time = "2025-10-21T08:09:33.824Z" }, + { url = "https://files.pythonhosted.org/packages/04/eb/467619274e835a8c0bcd39293f2bcfcf44bb34c35b9773669a37ababad0d/pyobjc_framework_intents-12.0-cp313-cp313t-macosx_10_13_universal2.whl", hash = "sha256:7fc800d5055eed336d772bc3ddda92f50db6c9b11fe2c8225d1c1e35ca0d7f27", size = 32419, upload-time = "2025-10-21T08:09:37.423Z" }, + { url = "https://files.pythonhosted.org/packages/68/74/09f806440a5164ad2506b3acd6bf799d5a66ed2a09c4d808b8f980670588/pyobjc_framework_intents-12.0-cp314-cp314-macosx_10_15_universal2.whl", hash = "sha256:9c42a92611daad86ff5b1bce44d37f072ddabe06fc5e6084b676a5d380c501a6", size = 32200, upload-time = "2025-10-21T08:09:40.524Z" }, + { url = "https://files.pythonhosted.org/packages/93/0c/edbdd9d3b4f1160c95d4ef0fa27ecd3e87afb81748e1e84a7f2b0626815d/pyobjc_framework_intents-12.0-cp314-cp314t-macosx_10_15_universal2.whl", hash = "sha256:43093cab2ad5482314dde83c2ee88a90fccbc8a21942b0884ff18a6f4ce2bd6d", size = 32484, upload-time = "2025-10-21T08:09:43.605Z" }, +] + +[[package]] +name = "pyobjc-framework-intentsui" +version = "12.0" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "pyobjc-core" }, + { name = "pyobjc-framework-intents" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/98/1c/ac36510c5697d930e5922ae70c141c34b0bd9185e1ca71f8de0a8a9025da/pyobjc_framework_intentsui-12.0.tar.gz", hash = "sha256:cb53f34abef6a96f1df12b34c682088578fbc3e1f63d0ee02e09f41f16fb54a8", size = 20142, upload-time = "2025-10-21T08:34:11.357Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/82/ee/f93c685c993c58c17d45a3dad9f57b0507756641a858d009c73f47865371/pyobjc_framework_intentsui-12.0-cp313-cp313-macosx_10_13_universal2.whl", hash = "sha256:e9e57aac35b9cd4b5e95fa9715a8a4a753c53f1747fe08f32c3701b270fc0d05", size = 9014, upload-time = "2025-10-21T08:09:50.58Z" }, + { url = "https://files.pythonhosted.org/packages/0c/b4/59ad5706c4f40f26a912a587bccd82ed94e9a22da4c76fe7fc040058af2c/pyobjc_framework_intentsui-12.0-cp313-cp313t-macosx_10_13_universal2.whl", hash = "sha256:d7b3d7b5609a2c605b5b80038af18a6cb042ba39a394d200ffbc3a3fe78e7473", size = 9184, upload-time = "2025-10-21T08:09:52.182Z" }, + { url = "https://files.pythonhosted.org/packages/56/5f/7b8035431b2bec046dc4ac672d9960c1cc23bc14dfbd01ad88c98a2891e6/pyobjc_framework_intentsui-12.0-cp314-cp314-macosx_10_15_universal2.whl", hash = "sha256:5e1e5ed95f76135dd9662f7509aaac51b273e54d75a17dbc10e9872758cc1d8b", size = 9071, upload-time = "2025-10-21T08:09:55.106Z" }, + { url = "https://files.pythonhosted.org/packages/0d/e5/e3ebdd7a4666482a26754fa7e4b5987d773af14a5aacc096dd6aaaaa5c6f/pyobjc_framework_intentsui-12.0-cp314-cp314t-macosx_10_15_universal2.whl", hash = "sha256:f9a339d68a276513f5545a2a4446095921451193bb81157f00bc564e65392981", size = 9259, upload-time = "2025-10-21T08:09:56.699Z" }, +] + +[[package]] +name = "pyobjc-framework-iobluetooth" +version = "12.0" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "pyobjc-core" }, + { name = "pyobjc-framework-cocoa" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/7f/a2/639dd9503842ec12ecd2712b58baf47df96ca170651828a7dc8e7a721a9e/pyobjc_framework_iobluetooth-12.0.tar.gz", hash = "sha256:44eb58bab83172f0bba41928a5831a8aa852151485dc87252229f0542cecd7c8", size = 155642, upload-time = "2025-10-21T08:34:22.012Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/71/94/744b0dc6e0bd1e08dfa73e73966569f0a69300c0d9c6f9cdb7a4c21d96dd/pyobjc_framework_iobluetooth-12.0-cp313-cp313-macosx_10_13_universal2.whl", hash = "sha256:78591a41a9621e52c718c6b150058076a407099f9ba3092c8214c3b097cb2833", size = 40462, upload-time = "2025-10-21T08:10:12.082Z" }, + { url = "https://files.pythonhosted.org/packages/08/54/e64dc86f1582f347a9b20e1a2a468ee694a90ec84fb0758ea5b0dc21a807/pyobjc_framework_iobluetooth-12.0-cp313-cp313t-macosx_10_13_universal2.whl", hash = "sha256:b42aedf60074b36b3d99cad743e45e070091d305880f4d14e87023a8a190a57c", size = 40674, upload-time = "2025-10-21T08:10:15.691Z" }, + { url = "https://files.pythonhosted.org/packages/49/b6/d6a5bf68337b8301ce1ed8bed3bee1c39f1c224a56728d02cd780b894041/pyobjc_framework_iobluetooth-12.0-cp314-cp314-macosx_10_15_universal2.whl", hash = "sha256:91e5b230c1f0ffe803362c9b1512b5669b26838d31ff839b27e63e7ad0b76bc6", size = 40451, upload-time = "2025-10-21T08:10:19.291Z" }, + { url = "https://files.pythonhosted.org/packages/47/d0/6c80e57378fec38c0747c65ab5315d7d7f8d18ae2941d79b0ba57f9b58e9/pyobjc_framework_iobluetooth-12.0-cp314-cp314t-macosx_10_15_universal2.whl", hash = "sha256:d0f666e9f9053c9cea55d64707c0365dbb4a05829656bbde5ccc9ff1d0e6356f", size = 40654, upload-time = "2025-10-21T08:10:22.996Z" }, +] + +[[package]] +name = "pyobjc-framework-iobluetoothui" +version = "12.0" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "pyobjc-core" }, + { name = "pyobjc-framework-iobluetooth" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/74/95/22588965d90ce13e9ac65d46b9c97379a9400336052663c3b8066f5b2c70/pyobjc_framework_iobluetoothui-12.0.tar.gz", hash = "sha256:a768e16ce112b3a01fbc324e9cb5976a1d908069df8aa0d2b77f0f6f56cd4ad6", size = 16536, upload-time = "2025-10-21T08:34:24.041Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/07/af/b6df402c5a82da4f1a6d1b97cf251a6b5c687256e7007201f42caeaa00f1/pyobjc_framework_iobluetoothui-12.0-py2.py3-none-any.whl", hash = "sha256:2bfb0bf3589db9b4a06132503d2998490d5f2ad56e2259fb066c05f19b71754a", size = 4056, upload-time = "2025-10-21T08:10:25.203Z" }, +] + +[[package]] +name = "pyobjc-framework-iosurface" +version = "12.0" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "pyobjc-core" }, + { name = "pyobjc-framework-cocoa" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/6e/8f/b4767fbf4ba4219d92d7c2ac2e48425342442f9ecea7adb351da6bc65da1/pyobjc_framework_iosurface-12.0.tar.gz", hash = "sha256:456a706e73e698494aec539e713341f6b1bd4c870c95a0e554fe0b8d32dfda06", size = 17739, upload-time = "2025-10-21T08:34:26.355Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/20/9c/e65b489d448ec26bf3567228788fb36931412719447c8e87002375de42b4/pyobjc_framework_iosurface-12.0-py2.py3-none-any.whl", hash = "sha256:734543a79f6bceb0ade88138f83657c23422c33f2b83f732d09581f54c486ae3", size = 4913, upload-time = "2025-10-21T08:10:26.678Z" }, +] + +[[package]] +name = "pyobjc-framework-ituneslibrary" +version = "12.0" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "pyobjc-core" }, + { name = "pyobjc-framework-cocoa" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/d1/94/d7f8ac73777323c01859136bf50ba6cfc674fc8c5eedb0aa45ad3fa6b4cd/pyobjc_framework_ituneslibrary-12.0.tar.gz", hash = "sha256:f859806281d7604e71ddbf2323daa853ccb83a3295f631cab106e93900383d57", size = 23745, upload-time = "2025-10-21T08:34:29.075Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/97/20/b5a88ab437898ba43be98634a3aa8418b8990c045821059fb199dbf6c550/pyobjc_framework_ituneslibrary-12.0-py2.py3-none-any.whl", hash = "sha256:7274a34ef8e3d51754c571af3a49d49a3c946abf30562e9f647f53626dbea5e2", size = 5220, upload-time = "2025-10-21T08:10:30.203Z" }, +] + +[[package]] +name = "pyobjc-framework-kernelmanagement" +version = "12.0" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "pyobjc-core" }, + { name = "pyobjc-framework-cocoa" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/9d/d8/54cdf0e439b71e11dd081dfbdc0c23fd9122a90deab2a819a9ef08b6abab/pyobjc_framework_kernelmanagement-12.0.tar.gz", hash = "sha256:f7fa54676777f525eda77c261a6f2120256855f28531fd18fd0081be869d003d", size = 11836, upload-time = "2025-10-21T08:34:30.812Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/c2/26/57122ddbe123b20b02b3c0510fc80719507ac849e311479d47225c13f7c2/pyobjc_framework_kernelmanagement-12.0-py2.py3-none-any.whl", hash = "sha256:a7cc70a131dbd3eb8b0b22c5283baf9b6c52ecbf26a5c689c254984719b17049", size = 3712, upload-time = "2025-10-21T08:10:31.777Z" }, +] + +[[package]] +name = "pyobjc-framework-latentsemanticmapping" +version = "12.0" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "pyobjc-core" }, + { name = "pyobjc-framework-cocoa" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/61/67/40a1c7d581a258f8dc436e3768f137d9c3885346f6f8aabcd35d9a472147/pyobjc_framework_latentsemanticmapping-12.0.tar.gz", hash = "sha256:737f2ceb84c85ab5352ad361f674c66be7602a5d2d68fbcfbe28400cf04fb1fa", size = 15564, upload-time = "2025-10-21T08:34:33.021Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/a0/57/bc9764affff2e6b3cea4c3e8bf527fc70b2bba600f1f4d079a3ecfd2b090/pyobjc_framework_latentsemanticmapping-12.0-py2.py3-none-any.whl", hash = "sha256:de98fb922e209f16cbacdaf60c186893b384fda9077293dd74257ea118502780", size = 5483, upload-time = "2025-10-21T08:10:33.389Z" }, +] + +[[package]] +name = "pyobjc-framework-launchservices" +version = "12.0" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "pyobjc-core" }, + { name = "pyobjc-framework-coreservices" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/91/a8/c93919c0e249f3453ea2e2732ea1b69e959ac50bf63d8bf87017a8def36c/pyobjc_framework_launchservices-12.0.tar.gz", hash = "sha256:8c162e7f021b8428a35989fb86bc6dfb251456ec18b6e7570a83b3c32a683438", size = 20500, upload-time = "2025-10-21T08:34:35.212Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/17/51/f249292cb459f25c3ea09cdee7b8faaeb9cd06d62a02e453f450c5015879/pyobjc_framework_launchservices-12.0-py2.py3-none-any.whl", hash = "sha256:e95d30f2f21eadfd815806f2183735d8c93ed960251ef9123850dcb1b62c9384", size = 3912, upload-time = "2025-10-21T08:10:35.19Z" }, +] + +[[package]] +name = "pyobjc-framework-libdispatch" +version = "12.0" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "pyobjc-core" }, + { name = "pyobjc-framework-cocoa" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/b3/7e/251ea268ce5a341586c963de758c7ff6dea681c98a1fb6da87f6d0004bd3/pyobjc_framework_libdispatch-12.0.tar.gz", hash = "sha256:2ef31c02670c377d9e2875e74053087b1d96b240d2fc8721cc4c665c05394b3a", size = 38599, upload-time = "2025-10-21T08:34:38.878Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/d6/b3/e61f3b08e0145918a3e2a2f4450b4d3f3ac6eb251f923d0850a85a984053/pyobjc_framework_libdispatch-12.0-cp313-cp313-macosx_10_13_universal2.whl", hash = "sha256:006d492b469b2a1fe3da7df9687f2638d832ef76333e5f7c6ab023bf25703fbf", size = 15681, upload-time = "2025-10-21T08:10:45.758Z" }, + { url = "https://files.pythonhosted.org/packages/64/e3/7befaf176f09ba2648bcf4506a458ca67379d0c61cdfd00d0cd0690ed394/pyobjc_framework_libdispatch-12.0-cp313-cp313t-macosx_10_13_universal2.whl", hash = "sha256:bb73f193fab434bd89b4d92d062a645b0068f6a3af50e00df3bc789f94927db6", size = 15948, upload-time = "2025-10-21T08:10:47.797Z" }, + { url = "https://files.pythonhosted.org/packages/a1/33/6db320381e215a1a772d3ed2d094680c1797faa22cec799e5086cb850e02/pyobjc_framework_libdispatch-12.0-cp314-cp314-macosx_10_15_universal2.whl", hash = "sha256:ce51a4e729c3d549b512721bef502f5a5bdb2cc61902a4046ec8e1807064e5bb", size = 15704, upload-time = "2025-10-21T08:10:50.101Z" }, + { url = "https://files.pythonhosted.org/packages/d1/d0/71bc50c6d57e3a55216ebd618b67eeb9d568239809382c7dfd870e906c67/pyobjc_framework_libdispatch-12.0-cp314-cp314t-macosx_10_15_universal2.whl", hash = "sha256:cf3b4befc34a143969db6a0dfcfebaea484c8c3ec527cd73676880b06b5348fc", size = 15986, upload-time = "2025-10-21T08:10:52.515Z" }, +] + +[[package]] +name = "pyobjc-framework-libxpc" +version = "12.0" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "pyobjc-core" }, + { name = "pyobjc-framework-cocoa" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/04/d3/e03390b44ff0c7c4542f5626e808f80f794e93a34a883377339cc1a18b0b/pyobjc_framework_libxpc-12.0.tar.gz", hash = "sha256:bf29f76f743a2af6cc5e294b34d671155257ef3f9751f92b821ecae75a9e7e52", size = 35557, upload-time = "2025-10-21T08:34:42.058Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/c2/f8/6e800bf2b25da4ead85a4a5c8ee866f02a2f1747ee2b4fe5c7d11df0b624/pyobjc_framework_libxpc-12.0-cp313-cp313-macosx_10_13_universal2.whl", hash = "sha256:edb8f63b3ab39b22bfa4db028c45bb953115b7cadbeadaef8f558e2e58ee2752", size = 19737, upload-time = "2025-10-21T08:11:01.887Z" }, + { url = "https://files.pythonhosted.org/packages/21/07/4001b087b3151c9674ab2c63c2d173e3ce0bed6dd91ca899665aee424a55/pyobjc_framework_libxpc-12.0-cp313-cp313t-macosx_10_13_universal2.whl", hash = "sha256:ca57eca41b50a4216a1eab550e6abcd865fc40f948b2df9822a589155f041501", size = 20316, upload-time = "2025-10-21T08:11:04.241Z" }, + { url = "https://files.pythonhosted.org/packages/01/c8/09ef28d6e55f59afbf964f7915b41a6e13fdff666578dc542fc87b1f9b58/pyobjc_framework_libxpc-12.0-cp314-cp314-macosx_10_15_universal2.whl", hash = "sha256:05037c18d24816c70c8c8e3af6ad4655674914ac53cb00beadceadd269f1dd50", size = 19460, upload-time = "2025-10-21T08:11:06.802Z" }, + { url = "https://files.pythonhosted.org/packages/d6/a1/8c7a1e8721179d5fba091ad2db650cc3d41050cf4a3bd4c46ebfad367274/pyobjc_framework_libxpc-12.0-cp314-cp314t-macosx_10_15_universal2.whl", hash = "sha256:1ef89e6892305c412d7e0d892ca0faf404b7b19b403a599cdda88f27287f7ce0", size = 20030, upload-time = "2025-10-21T08:11:09.46Z" }, +] + +[[package]] +name = "pyobjc-framework-linkpresentation" +version = "12.0" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "pyobjc-core" }, + { name = "pyobjc-framework-cocoa" }, + { name = "pyobjc-framework-quartz" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/f8/35/63a070df5478caa26b5babe80002f4cca6fe2324061dd11a9b6c564c829b/pyobjc_framework_linkpresentation-12.0.tar.gz", hash = "sha256:e98d035cbe943720dbb28873b510916c168a27e80614cf34b65c619c372e8d98", size = 13373, upload-time = "2025-10-21T08:34:43.858Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/de/0a/43ef70f68840ebaff950052b23be84ef3f9620ca628a56501a287f8bfec7/pyobjc_framework_linkpresentation-12.0-py2.py3-none-any.whl", hash = "sha256:d895cada661657c3d43525372ab38294352cceba7a007ee8464af5ce822153c7", size = 3876, upload-time = "2025-10-21T08:11:10.904Z" }, +] + +[[package]] +name = "pyobjc-framework-localauthentication" +version = "12.0" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "pyobjc-core" }, + { name = "pyobjc-framework-cocoa" }, + { name = "pyobjc-framework-security" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/08/20/6744b25940d9462e0410cadd6da2e25ea3c01e6067a1234d8092ae0a40fa/pyobjc_framework_localauthentication-12.0.tar.gz", hash = "sha256:6287b671d4e418419d8d5b2244616d72f346f6b8a8bc18d9a6bccb93a291091c", size = 30327, upload-time = "2025-10-21T08:34:46.643Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/25/90/5304a84dc35d432c5189e7f1cc971a2da339ef32208364829808decc5679/pyobjc_framework_localauthentication-12.0-cp313-cp313-macosx_10_13_universal2.whl", hash = "sha256:44c895e8bceea74532f01c5d45e57230c37f80c4dd3b5a4928deffe674a27a77", size = 10786, upload-time = "2025-10-21T08:11:20.462Z" }, + { url = "https://files.pythonhosted.org/packages/d7/a8/b408b2a2eb0c7e2846dd6f6e5efad0db78d5628b7d82f5040d2ddf32b4bf/pyobjc_framework_localauthentication-12.0-cp313-cp313t-macosx_10_13_universal2.whl", hash = "sha256:c6ab5aee535981e699c3248692eb02b52216dbe1ee7d5f0fe148be3672eaa5b8", size = 10938, upload-time = "2025-10-21T08:11:23.758Z" }, + { url = "https://files.pythonhosted.org/packages/1b/08/74582ce5f66598c45f9f64ad6389a00ef2408663450dd604e568a3bdbf14/pyobjc_framework_localauthentication-12.0-cp314-cp314-macosx_10_15_universal2.whl", hash = "sha256:4357e9f741cdbe59edb5bc151b34d25ad3637074339e3c689322b72a367af800", size = 10851, upload-time = "2025-10-21T08:11:25.912Z" }, + { url = "https://files.pythonhosted.org/packages/ec/72/dcaa61b77513cea50843390dc4faf970d76bbd7f4b299349393151a928e9/pyobjc_framework_localauthentication-12.0-cp314-cp314t-macosx_10_15_universal2.whl", hash = "sha256:032dc56c09f863df593ed8c4dc0a4b605e0dd5db25715f4f6d61e88d594db794", size = 10989, upload-time = "2025-10-21T08:11:27.671Z" }, +] + +[[package]] +name = "pyobjc-framework-localauthenticationembeddedui" +version = "12.0" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "pyobjc-core" }, + { name = "pyobjc-framework-cocoa" }, + { name = "pyobjc-framework-localauthentication" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/4b/b9/b0ebb005d1a96733463e811f60b0cc254bef3bb8792769e22621d1af80cb/pyobjc_framework_localauthenticationembeddedui-12.0.tar.gz", hash = "sha256:6f54afb2380a190c0a3fb54f26cd1492ccc0eb9ce040cd20c2702c305dd866da", size = 13643, upload-time = "2025-10-21T08:34:48.457Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/7b/80/cfa1df39d32329350c9eec7b84a4cb966fe62679c463277bcfb75e8a03e0/pyobjc_framework_localauthenticationembeddedui-12.0-py2.py3-none-any.whl", hash = "sha256:0e78a1b41a47ca28310b4bece72bd52ba744a7f3386b8558d1b57129161a44bc", size = 3998, upload-time = "2025-10-21T08:11:29.039Z" }, +] + +[[package]] +name = "pyobjc-framework-mailkit" +version = "12.0" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "pyobjc-core" }, + { name = "pyobjc-framework-cocoa" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/c2/f0/f702efc9fe2a0c0dbb44728e7fd1edd75dd022edc54d51f2cb0fa001aaf0/pyobjc_framework_mailkit-12.0.tar.gz", hash = "sha256:98c45662428cfd4f672c170e2cc6c820bc1d625739a11603e3c267bebd18c6d8", size = 21015, upload-time = "2025-10-21T08:34:50.99Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/bf/4a/d5a86176153459264339d4c440dbc827e6f262788218534ce15c50ce37ab/pyobjc_framework_mailkit-12.0-py2.py3-none-any.whl", hash = "sha256:ef1241515f486a91ef6d5c548043ceb0de54103e76232d6c14d3082c0e99fe2e", size = 4880, upload-time = "2025-10-21T08:11:30.909Z" }, +] + +[[package]] +name = "pyobjc-framework-mapkit" +version = "12.0" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "pyobjc-core" }, + { name = "pyobjc-framework-cocoa" }, + { name = "pyobjc-framework-corelocation" }, + { name = "pyobjc-framework-quartz" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/15/6d/6392039d550044b60fe2f716991c2543674b62837eed61254f356380a6f2/pyobjc_framework_mapkit-12.0.tar.gz", hash = "sha256:15b6078243797aea2fbf0eee003c2868fae735ce278db0b25b9aade01cf9564a", size = 63945, upload-time = "2025-10-21T08:34:55.811Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/85/08/83220d516eb0a95956569c4e4318951a8533f34cc38c7368c56247f5c428/pyobjc_framework_mapkit-12.0-cp313-cp313-macosx_10_13_universal2.whl", hash = "sha256:2c08689b82102767c71a81643181180e512a1316a774b99fcd1f8acc7b12d911", size = 22545, upload-time = "2025-10-21T08:11:41.746Z" }, + { url = "https://files.pythonhosted.org/packages/ff/65/2d66304c0edb6b64d447f1ab35abcf5f3a59476aa08b5bf032aa5ba105fd/pyobjc_framework_mapkit-12.0-cp313-cp313t-macosx_10_13_universal2.whl", hash = "sha256:1a4274ad4680887a39354f98b4c5cbabf4155d0a3277bd6b64417c3cd3a30748", size = 22722, upload-time = "2025-10-21T08:11:44.291Z" }, + { url = "https://files.pythonhosted.org/packages/46/8f/6106799ec49d5ee8fbc3e821b0f6729594d90242785ebbccf4334aa41890/pyobjc_framework_mapkit-12.0-cp314-cp314-macosx_10_15_universal2.whl", hash = "sha256:18f0596305c796cb4421b6b130903ac731a844dde6cd4c4955350c950ad7a78e", size = 22570, upload-time = "2025-10-21T08:11:46.756Z" }, + { url = "https://files.pythonhosted.org/packages/f7/01/a683baad57f65e233b07568ca44fcfc2f5a584ddb4f16ee436671421d51f/pyobjc_framework_mapkit-12.0-cp314-cp314t-macosx_10_15_universal2.whl", hash = "sha256:e5c6a91a75dfcc529376db0931ee0a029a5ad355a8fbddc4b6010155a1e716ea", size = 22785, upload-time = "2025-10-21T08:11:49.515Z" }, +] + +[[package]] +name = "pyobjc-framework-mediaaccessibility" +version = "12.0" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "pyobjc-core" }, + { name = "pyobjc-framework-cocoa" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/7b/34/8d90408cf4e864e4800fe0fc481389c11e09f43dbe63305a73b98591fa80/pyobjc_framework_mediaaccessibility-12.0.tar.gz", hash = "sha256:bc9f2ca30dea75b43e5aa6d15dfbd2ec357d4afad42eb34f95d0056180e75182", size = 16374, upload-time = "2025-10-21T08:34:57.895Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/94/36/74b3970406cf5f831476f978513fc6614e8f40c1eb26f73e3a763e978547/pyobjc_framework_mediaaccessibility-12.0-py2.py3-none-any.whl", hash = "sha256:391244c646abe6489bd5886e4a5d11e7a3da5443f9a7a74bbd48520c19252082", size = 4809, upload-time = "2025-10-21T08:11:51.018Z" }, +] + +[[package]] +name = "pyobjc-framework-mediaextension" +version = "12.0" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "pyobjc-core" }, + { name = "pyobjc-framework-avfoundation" }, + { name = "pyobjc-framework-cocoa" }, + { name = "pyobjc-framework-coremedia" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/9d/7b/8ecced95e3a4f5e8fc639202bbdebb1ffbe444341b63f42f732b718cad00/pyobjc_framework_mediaextension-12.0.tar.gz", hash = "sha256:af68dd3cc6a647990322e55f6b37b63da783ad400816c238a8bae6f2fea72a07", size = 39809, upload-time = "2025-10-21T08:35:01.292Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/be/79/13074763bd2e6f74f7fc348fae0d98e719c0ae3d60138176350cc0ef96ac/pyobjc_framework_mediaextension-12.0-cp313-cp313-macosx_10_13_universal2.whl", hash = "sha256:6aece94b2f169ea5d40f1a3d2aef1303bb5e60007b998256b02be7c186cd2417", size = 39004, upload-time = "2025-10-21T08:12:04.987Z" }, + { url = "https://files.pythonhosted.org/packages/80/9b/cec1662e6c4b2cdc5ef1ad6efce6a4c29ee190a07deeaa91939ea811fe58/pyobjc_framework_mediaextension-12.0-cp313-cp313t-macosx_10_13_universal2.whl", hash = "sha256:8dac2b40b58d23d4beaf48e816e9f40acf3460fe0e3e07a0b370540e3aa2b5b1", size = 39207, upload-time = "2025-10-21T08:12:08.507Z" }, + { url = "https://files.pythonhosted.org/packages/2e/15/92bae64fd90f98bcaf9cf61b3e8d4ed38a5b1d10a68606edd237fdcbce51/pyobjc_framework_mediaextension-12.0-cp314-cp314-macosx_10_15_universal2.whl", hash = "sha256:fcc00c8f07c2c4317db230ac69dc5b7b1fc92e45ba7b1d7d22b733dd33055939", size = 38993, upload-time = "2025-10-21T08:12:11.971Z" }, + { url = "https://files.pythonhosted.org/packages/aa/8a/fe2cae7146797c8b534f8c37699c5853c7492df59582074caef6120dcf6b/pyobjc_framework_mediaextension-12.0-cp314-cp314t-macosx_10_15_universal2.whl", hash = "sha256:ba4c141613b908623b56af02ca6ebaea7d75679efbbe5dbf4865a3095e4544e4", size = 39199, upload-time = "2025-10-21T08:12:15.46Z" }, +] + +[[package]] +name = "pyobjc-framework-medialibrary" +version = "12.0" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "pyobjc-core" }, + { name = "pyobjc-framework-cocoa" }, + { name = "pyobjc-framework-quartz" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/04/27/731cc25ea86cce6d19f3db99b1bb14d350ec6842120f834d7cc6f0001bab/pyobjc_framework_medialibrary-12.0.tar.gz", hash = "sha256:783b4a01ba731e3b7a1d0c76db66bc2be7ef0d6482ad153a65da7c996f1329cc", size = 16068, upload-time = "2025-10-21T08:35:03.639Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/4a/57/5abdc5ef3ddd8a97bbcc0e9a375078f375d10f7e30222e1bef5348507fd2/pyobjc_framework_medialibrary-12.0-py2.py3-none-any.whl", hash = "sha256:f2a69aa959bf878bf6ce98d256e45d5ed19926f0d81d9ecbabd51ffdd2b54d18", size = 4372, upload-time = "2025-10-21T08:12:16.955Z" }, +] + +[[package]] +name = "pyobjc-framework-mediaplayer" +version = "12.0" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "pyobjc-core" }, + { name = "pyobjc-framework-avfoundation" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/98/58/022b4daa464db3448be0481abefcf08634b2bc3f121641eb33dfb9e1ee03/pyobjc_framework_mediaplayer-12.0.tar.gz", hash = "sha256:800c5a7b6652be54cbeefb7c9b2de02a7eaec9b7fef7a91c354dfc16880664e7", size = 35440, upload-time = "2025-10-21T08:35:07.076Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/92/2b/968ae22ef293c4b3f0373a28dd188156097b38494a7deadf30448b5666c7/pyobjc_framework_mediaplayer-12.0-py2.py3-none-any.whl", hash = "sha256:c754087dfdbd065bceb31cc224363e91b05305d530db4295cffbb0c3ae0613e4", size = 7131, upload-time = "2025-10-21T08:12:18.622Z" }, +] + +[[package]] +name = "pyobjc-framework-mediatoolbox" +version = "12.0" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "pyobjc-core" }, + { name = "pyobjc-framework-cocoa" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/68/18/c7db54e9feafab8a201d05a668d4ffc5272ea65413c1032e1171f5bb98ca/pyobjc_framework_mediatoolbox-12.0.tar.gz", hash = "sha256:fcf0bd774860120203763e141a72f11aeeb2624c6ccd9beab4c79e24d31fb493", size = 22746, upload-time = "2025-10-21T08:35:09.437Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/0e/ea/a2e521193d4d8dda383567959ba268335bb923f172cfc4adf4c0ea2dd045/pyobjc_framework_mediatoolbox-12.0-cp313-cp313-macosx_10_13_universal2.whl", hash = "sha256:bc2c679aca82e5a058241da80198765713e247f824890cdeac6660003c9339af", size = 12837, upload-time = "2025-10-21T08:12:26.308Z" }, + { url = "https://files.pythonhosted.org/packages/38/f2/039e5debaade9a90a2ae62a5bd8f74a3da4ab21be9dced0b4b41fb021b8e/pyobjc_framework_mediatoolbox-12.0-cp313-cp313t-macosx_10_13_universal2.whl", hash = "sha256:768267825941f0c61d124338aaa28cc5b37b321bc07a029959a03d4e745a13f6", size = 13432, upload-time = "2025-10-21T08:12:28.458Z" }, + { url = "https://files.pythonhosted.org/packages/88/14/4eb75241eb1bf63f088463ba90927016f21dcc8d3c717be83e4c3a47a621/pyobjc_framework_mediatoolbox-12.0-cp314-cp314-macosx_10_15_universal2.whl", hash = "sha256:859455a780b88a9102f808b64aeecb67ba2c9d1951b77edf5228fe5edf2f26a9", size = 12823, upload-time = "2025-10-21T08:12:30.347Z" }, + { url = "https://files.pythonhosted.org/packages/10/81/850825ac65a6012fc13173113f898951fc8396f7d31a32c55f4712381fa8/pyobjc_framework_mediatoolbox-12.0-cp314-cp314t-macosx_10_15_universal2.whl", hash = "sha256:2b1d568651cf7106962057e5aeeb49484141cf5c89efdd0bb01480a2a13e307b", size = 13425, upload-time = "2025-10-21T08:12:33.192Z" }, +] + +[[package]] +name = "pyobjc-framework-metal" +version = "12.0" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "pyobjc-core" }, + { name = "pyobjc-framework-cocoa" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/53/fe/529b6061e9d2012330fd5089fb9db3b56061557ca97762c961688eca41ad/pyobjc_framework_metal-12.0.tar.gz", hash = "sha256:1a4c08118089239986a3c4f7b19722e18986626933f0960be027c682a70d8758", size = 182133, upload-time = "2025-10-21T08:35:21.972Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/29/e2/640e8ca7c55b73c44e462ac6f80a34ee1fae1c45b945020dbf59b7909144/pyobjc_framework_metal-12.0-cp313-cp313-macosx_10_13_universal2.whl", hash = "sha256:8f902490f46203f2f97e8bba7980b608fa653103b0e2a5e3ab2f6099abb4723a", size = 75881, upload-time = "2025-10-21T08:12:57.427Z" }, + { url = "https://files.pythonhosted.org/packages/2a/8b/275c9ad42814a31c7afe0d1c2147cfaf2ddf96354247167900141702f8c4/pyobjc_framework_metal-12.0-cp313-cp313t-macosx_10_13_universal2.whl", hash = "sha256:e147b7138ca953bc32be546dc34d10932552f2eee6ac83e438df3d0cc6f25c50", size = 76428, upload-time = "2025-10-21T08:13:03.051Z" }, + { url = "https://files.pythonhosted.org/packages/dd/6f/5c970d719f4ce23910d59bbe342ad621739ef81720cdd34976127fdd5869/pyobjc_framework_metal-12.0-cp314-cp314-macosx_10_15_universal2.whl", hash = "sha256:877d4dc62d9086fe0e1007cd6a4c3d310fb8692311264a7908466f0f595f814b", size = 75876, upload-time = "2025-10-21T08:13:08.827Z" }, + { url = "https://files.pythonhosted.org/packages/e6/7c/8fd303cae8afc6c8d748194c6eb6cf8684bf465c796b4c949f92d72ea156/pyobjc_framework_metal-12.0-cp314-cp314t-macosx_10_15_universal2.whl", hash = "sha256:85dc55e77bf36e3217b81c27f0c17398959fce45acda917db2af7096d8ca90ec", size = 76499, upload-time = "2025-10-21T08:13:15.324Z" }, +] + +[[package]] +name = "pyobjc-framework-metalfx" +version = "12.0" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "pyobjc-core" }, + { name = "pyobjc-framework-metal" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/e9/22/dae4a062b18093668ea6e4abd7d0a4b122ee2e67f8482804a93baa7539f0/pyobjc_framework_metalfx-12.0.tar.gz", hash = "sha256:179d1f1f3efa42cbd788e40d424bf5f0335d72282c766d9f79868b262904579b", size = 29852, upload-time = "2025-10-21T08:35:24.972Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/f1/79/2b9b4fba3820c6df6b9e2dd5802900edf5dcac1688fd5ef5490cfe1c7033/pyobjc_framework_metalfx-12.0-cp313-cp313-macosx_10_13_universal2.whl", hash = "sha256:faf296274f00912bdcba4bf1986e608fcbf6c8f2ef3bd6b0a9e5f7bd35c4a8d8", size = 15079, upload-time = "2025-10-21T08:13:23.409Z" }, + { url = "https://files.pythonhosted.org/packages/4c/69/d9a19e982b7d6a5d28cede0a9c251a2944aa09fcf24e42efb1a6228f7eb7/pyobjc_framework_metalfx-12.0-cp313-cp313t-macosx_10_13_universal2.whl", hash = "sha256:1c61569bc4b95c4f6ca9bd878f3a231b216d13abbd999f55d77da2a20d8232de", size = 15298, upload-time = "2025-10-21T08:13:25.73Z" }, + { url = "https://files.pythonhosted.org/packages/f6/bb/b636890598aa9dd2ca7a439e1ca9b62c2badfb9f0a2a3c675450c1348b59/pyobjc_framework_metalfx-12.0-cp314-cp314-macosx_10_15_universal2.whl", hash = "sha256:241a2857509714dfe0e8e15dbcdd226d9540266151186f889fdca360d619477f", size = 16353, upload-time = "2025-10-21T08:13:28.478Z" }, + { url = "https://files.pythonhosted.org/packages/f3/36/337d6fbf8b92ae38d1f38110462269e87841fb7b3f4f967e694020a639b7/pyobjc_framework_metalfx-12.0-cp314-cp314t-macosx_10_15_universal2.whl", hash = "sha256:951bc0176a5761100cbaa880977868797df4282ef7428f35210764e6cf7fc192", size = 16600, upload-time = "2025-10-21T08:13:30.547Z" }, +] + +[[package]] +name = "pyobjc-framework-metalkit" +version = "12.0" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "pyobjc-core" }, + { name = "pyobjc-framework-cocoa" }, + { name = "pyobjc-framework-metal" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/75/e9/668136ba83197b2ff34c018710d55abebd8de0267a138f12df0dde17772d/pyobjc_framework_metalkit-12.0.tar.gz", hash = "sha256:e5c2c27fc5ecd7dd553524cb3ccce7cbd0fa62d39e58e532a06ce977069a7132", size = 25878, upload-time = "2025-10-21T08:35:27.65Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/1f/3b/a3cd18064ce891bb3d5bdf06d2674da0d7af02e20728cbe6532ca7b8b383/pyobjc_framework_metalkit-12.0-cp313-cp313-macosx_10_13_universal2.whl", hash = "sha256:2794b834d70821777e44e876740aa0254669749711d938759c0a63cf0056ea3b", size = 8780, upload-time = "2025-10-21T08:13:39.352Z" }, + { url = "https://files.pythonhosted.org/packages/d9/26/31bc69b7e926415c8289b997a04fee7bc397919edddc22a97d0a31262c05/pyobjc_framework_metalkit-12.0-cp313-cp313t-macosx_10_13_universal2.whl", hash = "sha256:f64a827edf6777ea0b4f93f035bac23042b7de6101e80306d37d0ea175aeb79a", size = 8931, upload-time = "2025-10-21T08:13:40.942Z" }, + { url = "https://files.pythonhosted.org/packages/70/4b/4f9e1c46a5a790a2dc497b9c466e1b352a2e491c331f88db8a7638af9406/pyobjc_framework_metalkit-12.0-cp314-cp314-macosx_10_15_universal2.whl", hash = "sha256:d494e8e16d24174c957b67e35bee18fcaf8b43caf3d9f51d27c6454a9fb9529e", size = 8830, upload-time = "2025-10-21T08:13:42.608Z" }, + { url = "https://files.pythonhosted.org/packages/5c/19/eac92586b4e87551c2d33c87356af0a03c5ddae6cd17f85d5f0b765e93cf/pyobjc_framework_metalkit-12.0-cp314-cp314t-macosx_10_15_universal2.whl", hash = "sha256:8192274350db236a06504486bedbe06f9c857b619cd83e176e6d20c328320dac", size = 8981, upload-time = "2025-10-21T08:13:44.23Z" }, +] + +[[package]] +name = "pyobjc-framework-metalperformanceshaders" +version = "12.0" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "pyobjc-core" }, + { name = "pyobjc-framework-metal" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/19/5f/86c48d83cf90da2f626a3134a51c0531a739ad325d64f7cf3e92ddcab8bf/pyobjc_framework_metalperformanceshaders-12.0.tar.gz", hash = "sha256:a87af3d89122fd35de03157d787c207eebd17446e4532868b8d70f1723cc476f", size = 137694, upload-time = "2025-10-21T08:35:37.068Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/fa/d7/b82d26abfb909d850c91f23b8172ffe4e0931aeadf3a56d210767e79f887/pyobjc_framework_metalperformanceshaders-12.0-cp313-cp313-macosx_10_13_universal2.whl", hash = "sha256:b2dc5df8f8c27c468aa9795fa8960edb9e42ad3d5d5727a4ac04d9bf391f3d6c", size = 33268, upload-time = "2025-10-21T08:13:56.659Z" }, + { url = "https://files.pythonhosted.org/packages/77/69/caaa23c8b20963180f188e9dd30f7663fee0a1ecef3abc0456506da5e725/pyobjc_framework_metalperformanceshaders-12.0-cp313-cp313t-macosx_10_13_universal2.whl", hash = "sha256:2275c3b28d9c0f5cd53ec03145f3acda640ddda9c598582f4160e588c70f0cd1", size = 33464, upload-time = "2025-10-21T08:13:59.661Z" }, + { url = "https://files.pythonhosted.org/packages/ae/14/5ac7db29658d21233fda1824d5b5f75ece202567d7125e66fdc6a7eeb345/pyobjc_framework_metalperformanceshaders-12.0-cp314-cp314-macosx_10_15_universal2.whl", hash = "sha256:48c56fec469f70364171890b371808aa8aba24289aecae6aecf4c34a73b326eb", size = 33332, upload-time = "2025-10-21T08:14:03.109Z" }, + { url = "https://files.pythonhosted.org/packages/3c/36/b357c4cacb231bd1691c7ea124dc984304b5b3cbf4258374f154e24a8b0c/pyobjc_framework_metalperformanceshaders-12.0-cp314-cp314t-macosx_10_15_universal2.whl", hash = "sha256:331e1d06a486be9a41f2c0b80386bbdf59a6f3518873016589daef5416439090", size = 33546, upload-time = "2025-10-21T08:14:06.203Z" }, +] + +[[package]] +name = "pyobjc-framework-metalperformanceshadersgraph" +version = "12.0" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "pyobjc-core" }, + { name = "pyobjc-framework-metalperformanceshaders" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/89/e9/4a57eb83ecb167528e3ae3114ad1bf114c56216449da5c236ae41f8ad797/pyobjc_framework_metalperformanceshadersgraph-12.0.tar.gz", hash = "sha256:8323f119faa1d2a141e9ac895b7b796e016e891e70ef0af000863714af845a21", size = 43030, upload-time = "2025-10-21T08:35:41.292Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/82/21/b4e0f21f013c54e0675b57a5523ee1c13b1bea73b34455a2450a92e9cc0e/pyobjc_framework_metalperformanceshadersgraph-12.0-py2.py3-none-any.whl", hash = "sha256:3e8f978d733e911fff61b212a27553142596edd53b80a630b20a0db06f59a601", size = 6491, upload-time = "2025-10-21T08:14:07.994Z" }, +] + +[[package]] +name = "pyobjc-framework-metrickit" +version = "12.0" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "pyobjc-core" }, + { name = "pyobjc-framework-cocoa" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/ea/30/89f4731851814be85d100fd329fa1aa808648c73d702c9835b2ad9d0628f/pyobjc_framework_metrickit-12.0.tar.gz", hash = "sha256:ddfc464625433ab842a0ff86ea8663226f0dee8c75af4ac8f7e7478fef4fdddd", size = 28046, upload-time = "2025-10-21T08:35:44.229Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/11/88/c176fcd66f8e3028605a0953b5d5c9200557e494f17a0728e9ab5f721cf3/pyobjc_framework_metrickit-12.0-cp313-cp313-macosx_10_13_universal2.whl", hash = "sha256:8bee6b2bf4add4171a7aa5444bcd7015202af9d993bc8b4efbbdedc35f5cd42c", size = 8144, upload-time = "2025-10-21T08:14:15.939Z" }, + { url = "https://files.pythonhosted.org/packages/bd/a8/7d670440f8330d76b2b9a942598adf51d0b04347919c603fbf9f4f66c345/pyobjc_framework_metrickit-12.0-cp313-cp313t-macosx_10_13_universal2.whl", hash = "sha256:6c03927f02b27c929d8883e829785c721a1031e9bd8a674a71f6dacc3ab8ffc4", size = 8282, upload-time = "2025-10-21T08:14:17.861Z" }, + { url = "https://files.pythonhosted.org/packages/ba/4b/29976e2cd5396fae84abbd5d6b0bfa7159bdede5a6c7762b90583187cf17/pyobjc_framework_metrickit-12.0-cp314-cp314-macosx_10_15_universal2.whl", hash = "sha256:3c0b3a7892991f4de6e828fc4075409a1962eafbd773a61e689ef120159d41fb", size = 8196, upload-time = "2025-10-21T08:14:19.418Z" }, + { url = "https://files.pythonhosted.org/packages/a0/70/d261d5b36d6bc3f9fb25fe932633cf01a29cc870b94e37d4fc7d4da1a59d/pyobjc_framework_metrickit-12.0-cp314-cp314t-macosx_10_15_universal2.whl", hash = "sha256:56cefe73b47a42e79acf8cbd1e453dba345afa7908b2d3efc355d394a7d74150", size = 8343, upload-time = "2025-10-21T08:14:21.51Z" }, +] + +[[package]] +name = "pyobjc-framework-mlcompute" +version = "12.0" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "pyobjc-core" }, + { name = "pyobjc-framework-cocoa" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/b8/b6/054839433183983c923d91e383cff027a8d6dc2f106d485869584fa4c030/pyobjc_framework_mlcompute-12.0.tar.gz", hash = "sha256:64bdaf38c564c583dbb242677acd8b4e0d2e100ea651953f61fecbb5ba94a844", size = 40717, upload-time = "2025-10-21T08:35:48.066Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/ce/5d/aa7eaa1a5a3d709f8df2955b2898048e666d54e25473e74854384ecf4c06/pyobjc_framework_mlcompute-12.0-py2.py3-none-any.whl", hash = "sha256:ba172ffd3b3544a3dccd305b91b538da10f80214c3d8ddd2a730a5caa75669c7", size = 6753, upload-time = "2025-10-21T08:14:23.019Z" }, +] + +[[package]] +name = "pyobjc-framework-modelio" +version = "12.0" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "pyobjc-core" }, + { name = "pyobjc-framework-cocoa" }, + { name = "pyobjc-framework-quartz" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/ba/a1/e4497a07fdbe81ef48fd33af1123ba2613d72a59f9affa6aeb0b302dc85f/pyobjc_framework_modelio-12.0.tar.gz", hash = "sha256:15341997259521e132b2010c0bea5928143e47de6772a447d4d1c834db0f7f01", size = 66906, upload-time = "2025-10-21T08:35:53.139Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/37/5b/8141ca4b2b014343c92b916eca8640b43b5f3a14aa6bbba6048907bc62d9/pyobjc_framework_modelio-12.0-cp313-cp313-macosx_10_13_universal2.whl", hash = "sha256:0df12e3251b180fa40a5f6328f5719839e6a1815a64d7cd10ab349d7777135cf", size = 20221, upload-time = "2025-10-21T08:14:33.286Z" }, + { url = "https://files.pythonhosted.org/packages/9d/1c/3e9e303d88a0ad878fd6c23107836185da9f4b81b2777e327b5838fd2880/pyobjc_framework_modelio-12.0-cp313-cp313t-macosx_10_13_universal2.whl", hash = "sha256:de869883bc1c6d376ba5484fca7971a6c184c4e46e573d31a26f333ff1e86305", size = 20452, upload-time = "2025-10-21T08:14:35.625Z" }, + { url = "https://files.pythonhosted.org/packages/ed/75/e71deca023d4159c76da3faae3dff49bc5fa87eae14dfada07a884e5498c/pyobjc_framework_modelio-12.0-cp314-cp314-macosx_10_15_universal2.whl", hash = "sha256:d89883d1b5ba79fbc49c6513eea88c7cc57a4cd23446bb24301b52d19288c45d", size = 20189, upload-time = "2025-10-21T08:14:38.381Z" }, + { url = "https://files.pythonhosted.org/packages/73/df/ba2b49fb757075f67ba29ea6fdb519863753e140665edf4817a6e8c89f05/pyobjc_framework_modelio-12.0-cp314-cp314t-macosx_10_15_universal2.whl", hash = "sha256:38ee4a61cdaaed709c18a52dff285a678b179705b8105d3cc329d240fa085a00", size = 20436, upload-time = "2025-10-21T08:14:40.887Z" }, +] + +[[package]] +name = "pyobjc-framework-multipeerconnectivity" +version = "12.0" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "pyobjc-core" }, + { name = "pyobjc-framework-cocoa" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/95/af/e1379399637fc292eae354e15a1a55037c9c198494f30f65c8a6cb3ad771/pyobjc_framework_multipeerconnectivity-12.0.tar.gz", hash = "sha256:91796d7a2b88ea2cc44c03474e6730e9f647a018406c324943c224c1f3ea1fc5", size = 23213, upload-time = "2025-10-21T08:35:55.98Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/01/ac/5ab35302e2c4ce1d65fef94b5b5238b175d355f4fdf13d9ce712d9cb1f54/pyobjc_framework_multipeerconnectivity-12.0-cp313-cp313-macosx_10_13_universal2.whl", hash = "sha256:73b36e3d1b5c813586de1c2f05f93c86f625d60754258c0599cede7edd8b282f", size = 12028, upload-time = "2025-10-21T08:14:48.872Z" }, + { url = "https://files.pythonhosted.org/packages/5c/9c/0ce837d6be1f1d641f4d4e83c6646a44872d8e4a3083bdd233df95fb259b/pyobjc_framework_multipeerconnectivity-12.0-cp313-cp313t-macosx_10_13_universal2.whl", hash = "sha256:1ed9397cb0923d91307284b14f8a66779a3e9699f1d2e5a6c3b0abc3fefc322c", size = 12211, upload-time = "2025-10-21T08:14:50.683Z" }, + { url = "https://files.pythonhosted.org/packages/f2/7f/ef8ae7925925c20eb191bb929082f12ceedbc7c7e1b07417556b09cbebd8/pyobjc_framework_multipeerconnectivity-12.0-cp314-cp314-macosx_10_15_universal2.whl", hash = "sha256:d345e777362c190bd80e61f2ad646dcea08956db6460d55542bfa363deadfeef", size = 12001, upload-time = "2025-10-21T08:14:52.764Z" }, + { url = "https://files.pythonhosted.org/packages/e1/83/4751f168073fca6e94282495c18cbda0ac3f705998bebe7f49c81ee287df/pyobjc_framework_multipeerconnectivity-12.0-cp314-cp314t-macosx_10_15_universal2.whl", hash = "sha256:7e4dca99ee378430a4be66b319c841e3e3bcdc0d0a35e82f611c294380dbc663", size = 12224, upload-time = "2025-10-21T08:14:54.515Z" }, +] + +[[package]] +name = "pyobjc-framework-naturallanguage" +version = "12.0" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "pyobjc-core" }, + { name = "pyobjc-framework-cocoa" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/8b/91/785780967e0cf8f78ac2d69f3b7624d9fd52ec746bd655fb738fec584b39/pyobjc_framework_naturallanguage-12.0.tar.gz", hash = "sha256:a5fc834d9fe81cc2e45dd3749de3df0edfc9ab41b1c31efa4fcf0d00a51c9dfb", size = 23561, upload-time = "2025-10-21T08:35:58.811Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/eb/0c/bfe280f01e61a2ef43f6fc341a8f039ff1e7a20283f159fda05c24f5c1b2/pyobjc_framework_naturallanguage-12.0-py2.py3-none-any.whl", hash = "sha256:acfb624e438a14285aaaa2233b064d875fe3895a0fc0578f67dc15fdba85e33b", size = 5330, upload-time = "2025-10-21T08:14:55.911Z" }, +] + +[[package]] +name = "pyobjc-framework-netfs" +version = "12.0" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "pyobjc-core" }, + { name = "pyobjc-framework-cocoa" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/e2/fd/f7df2b99f900856b15ea9cd425577cff4b7e0399c01b48fc317036e8067c/pyobjc_framework_netfs-12.0.tar.gz", hash = "sha256:0bbd02e171ba634c44a357763d3204f743af60004fd0a2bd76fd2e6918602c52", size = 14859, upload-time = "2025-10-21T08:36:00.739Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/66/bc/d17ecc6a17327d7a950af52b8a68c471d7b5689108d77b9c079ec2ccc884/pyobjc_framework_netfs-12.0-py2.py3-none-any.whl", hash = "sha256:a1251a56a4a0716ebb97569993c5406b3adaecd16c9042347e8bce14fa3a140f", size = 4169, upload-time = "2025-10-21T08:14:57.474Z" }, +] + +[[package]] +name = "pyobjc-framework-network" +version = "12.0" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "pyobjc-core" }, + { name = "pyobjc-framework-cocoa" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/67/e0/a51caeb37e7e737392c53a45a21418fd14057b8abea7a427347fbd6a3d6b/pyobjc_framework_network-12.0.tar.gz", hash = "sha256:5524e449c22e3feda1938bf071e64cec149cea4f1459959f2e7de513a6c902ec", size = 57385, upload-time = "2025-10-21T08:36:05.268Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/00/88/d15c0414495d3cdb5305d560acd1dd510c5a8f301d3a0d2e7aa5e4416c4f/pyobjc_framework_network-12.0-cp313-cp313-macosx_10_13_universal2.whl", hash = "sha256:168e331063b50c020b350c9426ff61d90f6400c5d953bb4e0ff6e23c76c5a96d", size = 19634, upload-time = "2025-10-21T08:15:06.856Z" }, + { url = "https://files.pythonhosted.org/packages/06/b2/d4ccf7e04e213d2a11c0de573e16ed461933901c12f0d7fc8cb9eac607ad/pyobjc_framework_network-12.0-cp313-cp313t-macosx_10_13_universal2.whl", hash = "sha256:d8783a4c83e7e4bc6c5e829e216e1e0f107bdbe51500a333dd2afe456bc2fabb", size = 19706, upload-time = "2025-10-21T08:15:09.822Z" }, + { url = "https://files.pythonhosted.org/packages/c7/08/588cba7bca8877c27d0903ef686043bb974ada9cd53625495342b2f17759/pyobjc_framework_network-12.0-cp314-cp314-macosx_10_15_universal2.whl", hash = "sha256:0c19e64b1bc2164671fe6cabe2885154201995a282ee02b1f3bd2caba792f23f", size = 19369, upload-time = "2025-10-21T08:15:12.61Z" }, + { url = "https://files.pythonhosted.org/packages/d5/9a/8fbfa8b7a930c83838110e194ed8c7bf4d7a94b4a78d7773d22d9a1114bf/pyobjc_framework_network-12.0-cp314-cp314t-macosx_10_15_universal2.whl", hash = "sha256:d1a9e47e4f2693ea773dcbe97f8c16ed5531b579a6b471656a5b003291a90a87", size = 19421, upload-time = "2025-10-21T08:15:14.893Z" }, +] + +[[package]] +name = "pyobjc-framework-networkextension" +version = "12.0" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "pyobjc-core" }, + { name = "pyobjc-framework-cocoa" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/ab/ab/27769fdb0af13c8ba781b052fa7e1b5c77944665bab3a85a39fbf9f08f50/pyobjc_framework_networkextension-12.0.tar.gz", hash = "sha256:fff9e747d2d5da8352649028abaabc610bc3fa2779573e70df216aff7c00cb44", size = 63197, upload-time = "2025-10-21T08:36:10.071Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/36/b8/bdb501e1e0f32a1e4f20ceef81ef04c6e6584f928968a00dc1e3f17d27c3/pyobjc_framework_networkextension-12.0-cp313-cp313-macosx_10_13_universal2.whl", hash = "sha256:4738b8521873d1403fcbaa6c0282697a1104e53e229547232da2773bf37f096e", size = 14403, upload-time = "2025-10-21T08:15:23.681Z" }, + { url = "https://files.pythonhosted.org/packages/e6/c9/0643087a70694ddc3c80c5cd44fd379b00dffe17532351eaf2f18ea24daa/pyobjc_framework_networkextension-12.0-cp313-cp313t-macosx_10_13_universal2.whl", hash = "sha256:a5e7b8d5b1811480e6f00bc6b4a89c2d2c3c8298ef906689541f01214e866b3c", size = 14546, upload-time = "2025-10-21T08:15:25.773Z" }, + { url = "https://files.pythonhosted.org/packages/cf/1e/1d2ebe00ffe2f4bd197534a1f8da80826b53bfd6312fe6bb6e76a3e46996/pyobjc_framework_networkextension-12.0-cp314-cp314-macosx_10_15_universal2.whl", hash = "sha256:22efe55a39a8a36b5a3d68e3d527351a060b66fdf1c6c4e9c88bbe501e93684a", size = 14465, upload-time = "2025-10-21T08:15:28.134Z" }, + { url = "https://files.pythonhosted.org/packages/e0/b7/47c4297f0d0cd08fb72c00f2d60d248ffe71801192d8f1c0c4a9ed23d5a6/pyobjc_framework_networkextension-12.0-cp314-cp314t-macosx_10_15_universal2.whl", hash = "sha256:930572f289ef6450521411834d55df207885cb2c81385d2256ca334a1f103869", size = 14599, upload-time = "2025-10-21T08:15:30.211Z" }, +] + +[[package]] +name = "pyobjc-framework-notificationcenter" +version = "12.0" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "pyobjc-core" }, + { name = "pyobjc-framework-cocoa" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/82/bd/76355e7ecdb558291c0699d825d962a1f53089645eee8e92dcc418aa13c8/pyobjc_framework_notificationcenter-12.0.tar.gz", hash = "sha256:ecec30ef99c440f7013eab2c147f413d9b87047eb3b4a6656ec58513f67fe61e", size = 21729, upload-time = "2025-10-21T08:36:12.827Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/a3/69/fff76d3fac81ed3a74aee9c302897114d1273de17132155919e3031bdb80/pyobjc_framework_notificationcenter-12.0-cp313-cp313-macosx_10_13_universal2.whl", hash = "sha256:3aa8371456c57a7de65b6073ace39106310284394749ed72c0b0e47dd92169bc", size = 9928, upload-time = "2025-10-21T08:15:36.797Z" }, + { url = "https://files.pythonhosted.org/packages/25/0c/62d484e4ca483446f777b5f1d2c43b62bc2da9c2e71fe6cc00ff24e1611e/pyobjc_framework_notificationcenter-12.0-cp313-cp313t-macosx_10_13_universal2.whl", hash = "sha256:367cda711515e60bf6259bf4e9f447c606a0f2a1a471b6a6d70a801ded653d2e", size = 10123, upload-time = "2025-10-21T08:15:38.747Z" }, + { url = "https://files.pythonhosted.org/packages/eb/c7/2d71cf162b284f093d9784ecd08de38dbf8737f5a73c3760c92660afdfd5/pyobjc_framework_notificationcenter-12.0-cp314-cp314-macosx_10_15_universal2.whl", hash = "sha256:d8594430a18312c4c818696cf4c67d1054f2ced0304a2d17f16585b36a4fb76b", size = 9991, upload-time = "2025-10-21T08:15:40.411Z" }, + { url = "https://files.pythonhosted.org/packages/60/7e/8058987767d48f134939b467af39a46398e308153a01ea8b6fd339b2f779/pyobjc_framework_notificationcenter-12.0-cp314-cp314t-macosx_10_15_universal2.whl", hash = "sha256:fac468fb2a86c8fb886bf99b73046ea522503bc6123ea3636a42ec88d54f84f9", size = 10198, upload-time = "2025-10-21T08:15:42.367Z" }, +] + +[[package]] +name = "pyobjc-framework-opendirectory" +version = "12.0" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "pyobjc-core" }, + { name = "pyobjc-framework-cocoa" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/f2/3b/da8e6c62df0b721683940737a12f324342ee25e321fe8d26457bc394523e/pyobjc_framework_opendirectory-12.0.tar.gz", hash = "sha256:1fdcd865486b984dd19aa6e1f6ac200d43d1fb12ca34b56b44978ad19ed0b2b7", size = 61060, upload-time = "2025-10-21T08:36:17.564Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/2a/44/e761c1bcf2516561d144668f85a0adcc60e2866475e6af56293b9a57c4ea/pyobjc_framework_opendirectory-12.0-py2.py3-none-any.whl", hash = "sha256:009de69034f254381786ee14cabacbc892d05204127caaeae8fe05d57172fffa", size = 11855, upload-time = "2025-10-21T08:15:44.141Z" }, +] + +[[package]] +name = "pyobjc-framework-osakit" +version = "12.0" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "pyobjc-core" }, + { name = "pyobjc-framework-cocoa" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/a5/f8/f861aaf97c03525d530e269f63132a5dad37db2766eb2c08c5db74e0121e/pyobjc_framework_osakit-12.0.tar.gz", hash = "sha256:1662e40c5e28a254ff611310ef226194c6e22f2b731d2e877930e22a715f2144", size = 17119, upload-time = "2025-10-21T08:36:19.863Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/d2/8a/2fabeb3f0e7be46ee64c31f7d17200fb8198139c82bca57db5344e11d1b9/pyobjc_framework_osakit-12.0-py2.py3-none-any.whl", hash = "sha256:807400db5845daaee55dbb6fbc63eadbfc120d12f4e62cb6135cf29929821f54", size = 4171, upload-time = "2025-10-21T08:15:45.638Z" }, +] + +[[package]] +name = "pyobjc-framework-oslog" +version = "12.0" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "pyobjc-core" }, + { name = "pyobjc-framework-cocoa" }, + { name = "pyobjc-framework-coremedia" }, + { name = "pyobjc-framework-quartz" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/ad/81/45878bbf7814e5cb6723f1cfd21e5a9f61ef2db5ce71cc32c66db89f31d2/pyobjc_framework_oslog-12.0.tar.gz", hash = "sha256:635548ab6cfd0201f6785d7c572bc7515eb0c2fe569e1b37f8742c164ea4b2cb", size = 21589, upload-time = "2025-10-21T08:36:22.153Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/99/56/411424aed9a4ef9a50c89a4e0e8dcc29fa7f35ccfc3215bead7e1dc596ce/pyobjc_framework_oslog-12.0-cp313-cp313-macosx_10_13_universal2.whl", hash = "sha256:f33975c15f4d0c9a3eeb644034525220b8f53d633bbf5258ea4efb36139e0d89", size = 7840, upload-time = "2025-10-21T08:15:53.003Z" }, + { url = "https://files.pythonhosted.org/packages/bc/27/c18fc593460113fed8e0c5c0d5ebd898621265281dcf750dedca9c8efbb9/pyobjc_framework_oslog-12.0-cp313-cp313t-macosx_10_13_universal2.whl", hash = "sha256:fd279fbc4aebfd57fd301d68b269dd00b46649ac25de054a4ca8f4276e02a2ac", size = 8020, upload-time = "2025-10-21T08:15:54.528Z" }, + { url = "https://files.pythonhosted.org/packages/4f/ad/c19b4c3b69c19ba7355e1d64eae0d9e670c17b9b323e977e6b2621ae3e45/pyobjc_framework_oslog-12.0-cp314-cp314-macosx_10_15_universal2.whl", hash = "sha256:0be22d5da3f8d45f09959b25872bac1dcccc3ed91cd2402785141f6fc40ce149", size = 7887, upload-time = "2025-10-21T08:15:56.246Z" }, + { url = "https://files.pythonhosted.org/packages/e4/ca/9edd613d6db985e8a618418a4cc9b3769ab0533eded138f25416c8060fb9/pyobjc_framework_oslog-12.0-cp314-cp314t-macosx_10_15_universal2.whl", hash = "sha256:750c82d2374959dcf4abbf682a9bb1bce2cfe24333a5c38e6fc5239cabbdaea7", size = 8084, upload-time = "2025-10-21T08:15:57.875Z" }, +] + +[[package]] +name = "pyobjc-framework-passkit" +version = "12.0" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "pyobjc-core" }, + { name = "pyobjc-framework-cocoa" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/2d/ca/4cdac3a3461f46261e70cbfb551eb51d6b0eac51eb918c6e685bc5c39566/pyobjc_framework_passkit-12.0.tar.gz", hash = "sha256:6a206195385a62472b71384799f85fb5c6316e819d9bdedf905efa150ec82313", size = 54214, upload-time = "2025-10-21T08:36:26.396Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/5e/95/6401621bf1c7d4ef39b529219ac03be8a85d9c52d7398ea430cc64d00720/pyobjc_framework_passkit-12.0-cp313-cp313-macosx_10_13_universal2.whl", hash = "sha256:7b6a42e5a5096570b7423f7b1b4b2a1f96ac3fd8187e39d702350b6ba5e0c960", size = 14126, upload-time = "2025-10-21T08:16:06.163Z" }, + { url = "https://files.pythonhosted.org/packages/f7/b3/8155a5599f9eb7dd5532185298458b08cb552be5730316b4583859780d70/pyobjc_framework_passkit-12.0-cp313-cp313t-macosx_10_13_universal2.whl", hash = "sha256:5c880d60b7d43d5180f1643b553b848ebff87188a01a2d6f4ccf509d4da28255", size = 14283, upload-time = "2025-10-21T08:16:08.175Z" }, + { url = "https://files.pythonhosted.org/packages/63/cb/40ff8554c2d279a1da76f1980f9cac4b192525079b6eb9f0b58bb92b81c0/pyobjc_framework_passkit-12.0-cp314-cp314-macosx_10_15_universal2.whl", hash = "sha256:1f57f21badb615385ff0916cc40d6741684df430dd56b9472e4bb889fb10c285", size = 14135, upload-time = "2025-10-21T08:16:10.196Z" }, + { url = "https://files.pythonhosted.org/packages/27/8e/359e25846b4d1809412941e295a92e0b445fc7c5532bce9d61c3b359d97b/pyobjc_framework_passkit-12.0-cp314-cp314t-macosx_10_15_universal2.whl", hash = "sha256:3c599699efc44e674b0ab50dc35679ff03550e06b56aace9ff52ed3d374ab09a", size = 14288, upload-time = "2025-10-21T08:16:12.499Z" }, +] + +[[package]] +name = "pyobjc-framework-pencilkit" +version = "12.0" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "pyobjc-core" }, + { name = "pyobjc-framework-cocoa" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/e8/1d/c9ea9612680049a8b411acf817c77b18bae5180d8ad87753c172c9502b37/pyobjc_framework_pencilkit-12.0.tar.gz", hash = "sha256:efbead8c776bf9a24964586a70d937d54b087882b9b11a6e85478631e2a56f78", size = 17700, upload-time = "2025-10-21T08:36:28.537Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/13/d4/03f54c700d0278f6696cd9b3e5f65ab99aba3e5d026367b980d8ae566489/pyobjc_framework_pencilkit-12.0-py2.py3-none-any.whl", hash = "sha256:94794222210081205aa49f16f6c19be50c6ca73b598cbd8d8a1849bb1bf88075", size = 4218, upload-time = "2025-10-21T08:16:13.969Z" }, +] + +[[package]] +name = "pyobjc-framework-phase" +version = "12.0" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "pyobjc-core" }, + { name = "pyobjc-framework-avfoundation" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/bb/a2/7de65c8a8c9eaead9f3435ef433c4cc36b6480fcaeb92799a331ffa9bcd9/pyobjc_framework_phase-12.0.tar.gz", hash = "sha256:f1c004cc26a136a6dd6a36097865f37d725bd4ba03c59c7d23859af2ce855ac7", size = 32756, upload-time = "2025-10-21T08:36:31.821Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/c4/a6/5845a8710f2087199b512e47129f07f6c6a80d6eb3aa195f2c6a50bfe23a/pyobjc_framework_phase-12.0-py2.py3-none-any.whl", hash = "sha256:a520e94ac9163bd4c586bfefdb8a129a15c5fbda59d728c4135835e3ce5c6031", size = 6913, upload-time = "2025-10-21T08:16:15.556Z" }, +] + +[[package]] +name = "pyobjc-framework-photos" +version = "12.0" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "pyobjc-core" }, + { name = "pyobjc-framework-cocoa" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/03/b6/db478ff16bf203a956a704de266c2f09e1a97cdbf386679724009d02dfce/pyobjc_framework_photos-12.0.tar.gz", hash = "sha256:3d910e0665e3b9ff9a72e43b82f2547cb33d4631e3b355e5d4cc3bae8089794b", size = 46460, upload-time = "2025-10-21T08:36:35.646Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/7b/c9/8296b98d4bc012d9666b350983b2e47e0b443466728c33977a8f1abe87c3/pyobjc_framework_photos-12.0-cp313-cp313-macosx_10_13_universal2.whl", hash = "sha256:3689fde092ef4439167abf62ed2457889de7047d2d5b3b716054220451f3c4eb", size = 12282, upload-time = "2025-10-21T08:16:23.63Z" }, + { url = "https://files.pythonhosted.org/packages/50/59/2716769ef7dc1243f4548fd283d6c5fa6f06572b398f32ffa1e6852dd355/pyobjc_framework_photos-12.0-cp313-cp313t-macosx_10_13_universal2.whl", hash = "sha256:cd71c1eed83941e572467bd84ffed173def01fd898249e879972f4619dc67e72", size = 12464, upload-time = "2025-10-21T08:16:25.41Z" }, + { url = "https://files.pythonhosted.org/packages/ff/e6/5e23437570bbaa7ffb972ce09281e98d2ca3d3ec6df145b428bb9835354f/pyobjc_framework_photos-12.0-cp314-cp314-macosx_10_15_universal2.whl", hash = "sha256:bb524ccf20752e3c6cc7f3953b0272cc961a7a3a7312467054986d95db3a4ece", size = 12333, upload-time = "2025-10-21T08:16:27.024Z" }, + { url = "https://files.pythonhosted.org/packages/6a/d8/67148c57f3554d242a270323e33e161c3e74bf877c2b62c95e241bc8f369/pyobjc_framework_photos-12.0-cp314-cp314t-macosx_10_15_universal2.whl", hash = "sha256:426c8149610e264b81f498bfd7916294e6d427449297346047c3328aad693701", size = 12522, upload-time = "2025-10-21T08:16:29.161Z" }, +] + +[[package]] +name = "pyobjc-framework-photosui" +version = "12.0" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "pyobjc-core" }, + { name = "pyobjc-framework-cocoa" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/d2/73/7a9adf5eda2a5de6e40527531beb9a84fc2ca897a103528317c5f14423a0/pyobjc_framework_photosui-12.0.tar.gz", hash = "sha256:59bc6a169129b8a63fc5e175923900df4957c469081686299e2ba384291972fc", size = 30235, upload-time = "2025-10-21T08:36:38.52Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/06/d9/c746e5ef3caf2c6ce2e0a97a8b08f9acc050d83d86843c6dc68fb8bef8c0/pyobjc_framework_photosui-12.0-cp313-cp313-macosx_10_13_universal2.whl", hash = "sha256:b82ac86cb22ddc9dc3b113d52d7aedee268750ce61fc9edc54f07f0ab3092db4", size = 11730, upload-time = "2025-10-21T08:16:37.879Z" }, + { url = "https://files.pythonhosted.org/packages/18/e3/fc7404f5c14e948476ba24fc593130c4527dae16ab733998ca977fc6ddc8/pyobjc_framework_photosui-12.0-cp313-cp313t-macosx_10_13_universal2.whl", hash = "sha256:5350e303bbfdba0ead32e3215d9aaf70ea627626d38d24088e7a99bea5403598", size = 11934, upload-time = "2025-10-21T08:16:39.989Z" }, + { url = "https://files.pythonhosted.org/packages/5f/7a/7e82e472f8316fae6de43850a3a41dae9927404afe600399cf92dc5170b6/pyobjc_framework_photosui-12.0-cp314-cp314-macosx_10_15_universal2.whl", hash = "sha256:d3238e006d98d24c16bfd25583816f19ac4251841862e1b7e5aba53312497e83", size = 11733, upload-time = "2025-10-21T08:16:41.792Z" }, + { url = "https://files.pythonhosted.org/packages/6b/f8/dd262e7daddaf97d90c00a992da820bb7a58c35e978e3db0a85f3351d63e/pyobjc_framework_photosui-12.0-cp314-cp314t-macosx_10_15_universal2.whl", hash = "sha256:33a83af5fe2864c83ff0ba76bed8cde6f4770fd71cb45f2abd3eb36d1eafec49", size = 11919, upload-time = "2025-10-21T08:16:43.623Z" }, +] + +[[package]] +name = "pyobjc-framework-preferencepanes" +version = "12.0" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "pyobjc-core" }, + { name = "pyobjc-framework-cocoa" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/34/de/efe94e0c44a893893b8bac388a4a31d141f1fafa6085999cb09fd9dd1326/pyobjc_framework_preferencepanes-12.0.tar.gz", hash = "sha256:4c5a8df26846cada6c2cc7c1739d6b9334863a85cba509c3a62d92f13c18b112", size = 24630, upload-time = "2025-10-21T08:36:41.035Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/24/67/9ead9b61d31707d2c3ebcce7bbb019f2c469c1e069063d0dcaf76aa33a5b/pyobjc_framework_preferencepanes-12.0-py2.py3-none-any.whl", hash = "sha256:b9be4e2a69ad9809758b648b683438c3142f9803db6fab46a13e83ff31eff400", size = 4811, upload-time = "2025-10-21T08:16:45.044Z" }, +] + +[[package]] +name = "pyobjc-framework-pushkit" +version = "12.0" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "pyobjc-core" }, + { name = "pyobjc-framework-cocoa" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/6c/08/0407f3752efde2913268b31dc40003a0175088683353134b437476a3bd80/pyobjc_framework_pushkit-12.0.tar.gz", hash = "sha256:202f95172bf35427eb5284c0005d72ef8a9dc5aa61f369bee371e1f1f76a2403", size = 19840, upload-time = "2025-10-21T08:36:45.061Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/08/c8/44baad8b36987b12fb37f939701cc1ba03c17be7f926c58a1deda8e4c0ac/pyobjc_framework_pushkit-12.0-cp313-cp313-macosx_10_13_universal2.whl", hash = "sha256:bcc6ecba8687123432900d62fa169cee2597515a960666b54e1d2e03db51b457", size = 8201, upload-time = "2025-10-21T08:16:54.259Z" }, + { url = "https://files.pythonhosted.org/packages/ac/06/213512593a6ed9432b626c3c24d88076e9cc713a0ac1518aa4d88ead6512/pyobjc_framework_pushkit-12.0-cp313-cp313t-macosx_10_13_universal2.whl", hash = "sha256:018caf2d8c19eb9d9bac771f97a854127eadae9752221f90f40f11067cebb739", size = 8348, upload-time = "2025-10-21T08:16:55.863Z" }, + { url = "https://files.pythonhosted.org/packages/05/ed/2a4013d9b1f7f504cc9add94b18f2d3879628d137ead61e3d5d7b27a69ee/pyobjc_framework_pushkit-12.0-cp314-cp314-macosx_10_15_universal2.whl", hash = "sha256:24533a577d6d39b6ad6d9bbb659232d3a8d50e29df12cfc0a36938c4caf617a9", size = 8268, upload-time = "2025-10-21T08:16:58.413Z" }, + { url = "https://files.pythonhosted.org/packages/27/36/9c4651543ba426383d6aedcb8433d27d9285d176bd7b47fb42d77bd6b0a9/pyobjc_framework_pushkit-12.0-cp314-cp314t-macosx_10_15_universal2.whl", hash = "sha256:4c32316ccb304c72be565ecb8c1befea774876cf8e4cb40cfc2926402a4fbea5", size = 8403, upload-time = "2025-10-21T08:17:00.016Z" }, +] + +[[package]] +name = "pyobjc-framework-quartz" +version = "12.0" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "pyobjc-core" }, + { name = "pyobjc-framework-cocoa" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/91/0b/3c34fc9de790daff5ca49d1f36cb8dcc353ac10e4e29b4759e397a3831f4/pyobjc_framework_quartz-12.0.tar.gz", hash = "sha256:5bcb9e78d671447e04d89e2e3c39f3135157892243facc5f8468aa333e40d67f", size = 3159509, upload-time = "2025-10-21T08:40:01.918Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/60/d8/05f8fb5f27af69c0b5a9802f220a7c00bbe595c790e13edefa042603b957/pyobjc_framework_quartz-12.0-cp313-cp313-macosx_10_13_universal2.whl", hash = "sha256:ece7a05aa2bfc3aa215f1a7c8580e873f3867ba40d0006469618cc2ceb796578", size = 219201, upload-time = "2025-10-21T08:17:59.277Z" }, + { url = "https://files.pythonhosted.org/packages/7e/3f/1228f86de266874e20c04f04736a5f11c5a29a1839efde594ba4097d0255/pyobjc_framework_quartz-12.0-cp313-cp313t-macosx_10_13_universal2.whl", hash = "sha256:f1b2e34f6f0dd023f80a0e875af4dab0ad27fccac239da9ad3d311a2d2578e27", size = 224330, upload-time = "2025-10-21T08:18:14.776Z" }, + { url = "https://files.pythonhosted.org/packages/8a/23/ec1804bd10c409fe98ba086329569914fd10b6814208ca6168e81ca0ec1a/pyobjc_framework_quartz-12.0-cp314-cp314-macosx_10_15_universal2.whl", hash = "sha256:a2cde43ddc5d2a9ace13af38b4a9ee70dbd47d1707ec6b7185a1a3a1d48e54f9", size = 219581, upload-time = "2025-10-21T08:18:30.219Z" }, + { url = "https://files.pythonhosted.org/packages/86/c2/cf89fda2e477c0c4e2a8aae86202c2891a83bead24e8a7fc733ff490dffc/pyobjc_framework_quartz-12.0-cp314-cp314t-macosx_10_15_universal2.whl", hash = "sha256:9b928d551ec779141558d986684c19f8f5742251721f440d7087257e4e35b22b", size = 224613, upload-time = "2025-10-21T08:18:45.39Z" }, +] + +[[package]] +name = "pyobjc-framework-quicklookthumbnailing" +version = "12.0" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "pyobjc-core" }, + { name = "pyobjc-framework-cocoa" }, + { name = "pyobjc-framework-quartz" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/12/64/3861655637e4beee4746e3f85af3f61028091d43f8b91fdff702285052b7/pyobjc_framework_quicklookthumbnailing-12.0.tar.gz", hash = "sha256:6b5ab7f8f75809535258c5af1db134e9f3449b36c5a40228766197527291297f", size = 14805, upload-time = "2025-10-21T08:40:04.485Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/ec/16/da70d0c7aa6df70080e966e160fb0a545daa52a692c41a58cc659b6cdfe1/pyobjc_framework_quicklookthumbnailing-12.0-py2.py3-none-any.whl", hash = "sha256:6ff4dadb49e82319aa9391dbe759dc5d9fe3b7d30d87c6fb6efad22681c9426c", size = 4242, upload-time = "2025-10-21T08:18:47.341Z" }, +] + +[[package]] +name = "pyobjc-framework-replaykit" +version = "12.0" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "pyobjc-core" }, + { name = "pyobjc-framework-cocoa" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/ba/a5/c2875fb3a18da6a63a574b9628b052c93cf32884edd77e951b67b5c79e5b/pyobjc_framework_replaykit-12.0.tar.gz", hash = "sha256:9b04f20b04e78e9a6e4d0e85bd5e706a02ed939e9012f468b16dfb6fcc3ab03f", size = 23686, upload-time = "2025-10-21T08:40:06.926Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/06/1d/a45705a7ac6ca4aec0329335f1531232be1ab9562029efbebfeafbaf9a30/pyobjc_framework_replaykit-12.0-cp313-cp313-macosx_10_13_universal2.whl", hash = "sha256:e8d7ea4fe9a4ab2bfe9d9d166e81d1a449313784e9afcd25fa0eb5152520840d", size = 10147, upload-time = "2025-10-21T08:18:55.895Z" }, + { url = "https://files.pythonhosted.org/packages/73/36/3483a6780a7078b42aa8cb6967f80e386efc12e438749454cb8015f303b3/pyobjc_framework_replaykit-12.0-cp313-cp313t-macosx_10_13_universal2.whl", hash = "sha256:0409f253e632ab36edd86425737dfd695201078299172a40c662b3684b180021", size = 10329, upload-time = "2025-10-21T08:18:57.708Z" }, + { url = "https://files.pythonhosted.org/packages/ba/30/e4f9f62a3e0570d9614b70b2247d9f7f39432157b3e75457e16331649d20/pyobjc_framework_replaykit-12.0-cp314-cp314-macosx_10_15_universal2.whl", hash = "sha256:3cbd3cc587e4c2fa722c444ebb5457568c3d0a803cf17cec107c9b6316a7539b", size = 10203, upload-time = "2025-10-21T08:18:59.709Z" }, + { url = "https://files.pythonhosted.org/packages/a7/b2/b90f7451a313ff1d8f6fbc0f4d8c19c740910a45ab516ab1aab8062c1267/pyobjc_framework_replaykit-12.0-cp314-cp314t-macosx_10_15_universal2.whl", hash = "sha256:1e1cd0c2bdee7bf0eae66201c546e9e1093cfb5c365595a6fe0e0fc3bab3422e", size = 10397, upload-time = "2025-10-21T08:19:01.335Z" }, +] + +[[package]] +name = "pyobjc-framework-safariservices" +version = "12.0" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "pyobjc-core" }, + { name = "pyobjc-framework-cocoa" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/2d/90/ada857aca483a83dacada061746badb0d9eb705311df4c43139909eb8c64/pyobjc_framework_safariservices-12.0.tar.gz", hash = "sha256:3fa9624285723cb9df282479bee315f0548ee91e1a277d9bd767c273fa7648fd", size = 25499, upload-time = "2025-10-21T08:40:09.716Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/db/23/2aac0cef66a560222cebbd9dd635b18292cb97c641415a590e248dbb58d7/pyobjc_framework_safariservices-12.0-cp313-cp313-macosx_10_13_universal2.whl", hash = "sha256:0a1700d2145fd5f1451cb18b7668eaef22fc2d099a5e5fd459e482c7b05cd0a4", size = 7310, upload-time = "2025-10-21T08:19:07.905Z" }, + { url = "https://files.pythonhosted.org/packages/9c/d9/79d907a700357fd9d87717f65812d5280d96823f589b85f37c7916aae7ca/pyobjc_framework_safariservices-12.0-cp313-cp313t-macosx_10_13_universal2.whl", hash = "sha256:50513325180c950896cb242ce33c991bef87765e253f65ed583a442b29dfd243", size = 7317, upload-time = "2025-10-21T08:19:09.406Z" }, + { url = "https://files.pythonhosted.org/packages/b8/d9/6d25774ce2090349bf6eee3bac285992bc8e91d8cd02c34b9a2770a875c9/pyobjc_framework_safariservices-12.0-cp314-cp314-macosx_10_15_universal2.whl", hash = "sha256:b390264fa1c262560e92280ac1d5180209fa382350e04a5bb29ea9dff9e78576", size = 7342, upload-time = "2025-10-21T08:19:11.279Z" }, + { url = "https://files.pythonhosted.org/packages/21/07/0ff0a95464871efa631ffd5a7155d5e4c7036c794df4618c99d493a898d4/pyobjc_framework_safariservices-12.0-cp314-cp314t-macosx_10_15_universal2.whl", hash = "sha256:792a6739a04cc71fc9a97ebd7c3df619320573ebd1e125a572302b592e7651ab", size = 7353, upload-time = "2025-10-21T08:19:12.77Z" }, +] + +[[package]] +name = "pyobjc-framework-safetykit" +version = "12.0" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "pyobjc-core" }, + { name = "pyobjc-framework-cocoa" }, + { name = "pyobjc-framework-quartz" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/39/ab/9038e5067650af29ffb491df5a02a3c45da0690e4a2efcf10640bde195a2/pyobjc_framework_safetykit-12.0.tar.gz", hash = "sha256:eec3d74db7a0cdc4265cd29def24b8f1af3fdace8e309640e68c58c935157296", size = 20450, upload-time = "2025-10-21T08:40:12.565Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/f9/d1/e399f2c71934d4a07025374ed372ef459b1ed899bccba83e7c7d0d1e6833/pyobjc_framework_safetykit-12.0-cp313-cp313-macosx_10_13_universal2.whl", hash = "sha256:eee259b78a66b4b45aa84c7c8af26fbf8d1649fd39f3d9cb86b706d7b0ccf244", size = 8572, upload-time = "2025-10-21T08:19:19.853Z" }, + { url = "https://files.pythonhosted.org/packages/10/d2/9557ecb3fa41c2743eca6296139bdd4fdbcbee739ec83d629fe0fd0dd047/pyobjc_framework_safetykit-12.0-cp313-cp313t-macosx_10_13_universal2.whl", hash = "sha256:46e3c02c44cc0b7cd8398347b8a62761d6ba225201d0809228e2effbd512b7a5", size = 8730, upload-time = "2025-10-21T08:19:21.442Z" }, + { url = "https://files.pythonhosted.org/packages/f5/5e/315677971eecc170c11beeb72735e5c6715c3975419417c0a3266153e0c2/pyobjc_framework_safetykit-12.0-cp314-cp314-macosx_10_15_universal2.whl", hash = "sha256:8e2267cfbefdf123a44622dc0494b662d376bd3cb37629ada9f99aa83fdfc46b", size = 8626, upload-time = "2025-10-21T08:19:23.03Z" }, + { url = "https://files.pythonhosted.org/packages/24/f6/736c756819f5820072ba694584ea0037f25a9aa28836d1f806a40c45c8ba/pyobjc_framework_safetykit-12.0-cp314-cp314t-macosx_10_15_universal2.whl", hash = "sha256:d7e0b6e39e7c9e424b1ca9f470f5320ffb1988859bb6935b2d5388e9f55bb352", size = 8790, upload-time = "2025-10-21T08:19:24.719Z" }, +] + +[[package]] +name = "pyobjc-framework-scenekit" +version = "12.0" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "pyobjc-core" }, + { name = "pyobjc-framework-cocoa" }, + { name = "pyobjc-framework-quartz" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/33/6e/d67322896c3f0f4ae940d1a7a2ed49bdcad139d8f7ab2eeff066d2a4ca8e/pyobjc_framework_scenekit-12.0.tar.gz", hash = "sha256:3c725a9fa2f5788d6451291d1c71db9b68f1cbb1969facaa514cd6e73a11d7c6", size = 101580, upload-time = "2025-10-21T08:40:19.86Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/e1/2e/081508eb23901b8a05a3ce435d20402ade5f289336ef99069f753e3ed94a/pyobjc_framework_scenekit-12.0-cp313-cp313-macosx_10_13_universal2.whl", hash = "sha256:de17da992d7b17a3f2424ed05f2ef3bf745330cfc60a063bf3222ac734c5959c", size = 33622, upload-time = "2025-10-21T08:19:38.126Z" }, + { url = "https://files.pythonhosted.org/packages/12/3c/0e7e73f6d543558b85197d8805bbe6ac7ec3606780a51582b0485a72b398/pyobjc_framework_scenekit-12.0-cp313-cp313t-macosx_10_13_universal2.whl", hash = "sha256:b3cee34975b0bdcb87d1c14795ff5fa3a4c05d8332c9f35786a897e3610a2c85", size = 33937, upload-time = "2025-10-21T08:19:41.516Z" }, + { url = "https://files.pythonhosted.org/packages/b0/fe/d206308a63106ea829e9baf6e369c66097801f36e9cf17eee60856cdd60d/pyobjc_framework_scenekit-12.0-cp314-cp314-macosx_10_15_universal2.whl", hash = "sha256:a5475e8508621749f957082a646761b8945391107d109c0bcbb13f4036d98c61", size = 33736, upload-time = "2025-10-21T08:19:44.787Z" }, + { url = "https://files.pythonhosted.org/packages/92/a4/6d5a47deda44661f643a355967857c332c49d1e42bb3ddd44ae5d46f777f/pyobjc_framework_scenekit-12.0-cp314-cp314t-macosx_10_15_universal2.whl", hash = "sha256:8cadd5d7ac9e3616845c4d5e9d5a0ac0117eb887e865d97babf5640f6971356e", size = 34018, upload-time = "2025-10-21T08:19:48.003Z" }, +] + +[[package]] +name = "pyobjc-framework-screencapturekit" +version = "12.0" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "pyobjc-core" }, + { name = "pyobjc-framework-cocoa" }, + { name = "pyobjc-framework-coremedia" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/4c/e5/6e1a3a5588d28eb7a80a2bd2feb8a76e32662ce169b309068121e94b0ea9/pyobjc_framework_screencapturekit-12.0.tar.gz", hash = "sha256:278743764adfbfc046b831bceaae2f0b4a42ea3b0b40e4ee349f9efcb62374e5", size = 32967, upload-time = "2025-10-21T08:40:23.005Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/09/50/e3809266ba4dbdf233cf4570d25eb9931c34e96db6cbb506ca12ec58de1e/pyobjc_framework_screencapturekit-12.0-cp313-cp313-macosx_10_13_universal2.whl", hash = "sha256:c84a9051757706fff21d1f4b70a2255e53402c9b5d31f1708beac8c53237a9d8", size = 11531, upload-time = "2025-10-21T08:19:55.95Z" }, + { url = "https://files.pythonhosted.org/packages/e6/55/3be7e77de7ae192d95e7e6aca39940457191c110cc4060b23bc328e69b62/pyobjc_framework_screencapturekit-12.0-cp313-cp313t-macosx_10_13_universal2.whl", hash = "sha256:78392b27825eebd4afdf31b18d60a4e8d4a2f494af7ce6188c193f76f4142067", size = 11709, upload-time = "2025-10-21T08:19:57.766Z" }, + { url = "https://files.pythonhosted.org/packages/9e/39/ba12d780a0dc61985f00083f35ab3240c2f38feaf7a4854374fe2ec40ede/pyobjc_framework_screencapturekit-12.0-cp314-cp314-macosx_10_15_universal2.whl", hash = "sha256:1d95db1e63559ecb5472c4a90739c2282ac58694911a3c0d42ed22a0b381b322", size = 11587, upload-time = "2025-10-21T08:19:59.532Z" }, + { url = "https://files.pythonhosted.org/packages/34/d5/45b0fff308ffeb122400d7e9df81f15784da348bf3c2b56f504a47e376e5/pyobjc_framework_screencapturekit-12.0-cp314-cp314t-macosx_10_15_universal2.whl", hash = "sha256:86bcc5c8d9243d16e675da7e8dd063f9afa18423f9b6c181754cf0624b84487d", size = 11792, upload-time = "2025-10-21T08:20:01.361Z" }, +] + +[[package]] +name = "pyobjc-framework-screensaver" +version = "12.0" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "pyobjc-core" }, + { name = "pyobjc-framework-cocoa" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/97/56/8262f65fddc0e86f52f589d7ac927b7c2ee6fb9b83c5906126a7544707b5/pyobjc_framework_screensaver-12.0.tar.gz", hash = "sha256:d1f875a89c511046d08304d801aba960e9ceef62808de104bb878d948696d29b", size = 22614, upload-time = "2025-10-21T08:40:25.795Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/d9/d6/4181e31c3b87ab480bc3ef44e456d1c20e7d53e15b1d00a686bb459150d6/pyobjc_framework_screensaver-12.0-cp313-cp313-macosx_10_13_universal2.whl", hash = "sha256:87de6e035315b6b2304f20a1953b5c3c6c017f4ef73bc91a4fd23a1789f4cc2f", size = 8457, upload-time = "2025-10-21T08:20:08.744Z" }, + { url = "https://files.pythonhosted.org/packages/9c/d8/80e00cfc6fa2766f324c2fac4a882e82a6f1ebbbfddf7c5bee6aca933d94/pyobjc_framework_screensaver-12.0-cp313-cp313t-macosx_10_13_universal2.whl", hash = "sha256:7ae3fae60a3740f73c4267e1eb0e430d064d1ed56b84fc4e8aac7fe4b1fdbbe4", size = 8463, upload-time = "2025-10-21T08:20:10.367Z" }, + { url = "https://files.pythonhosted.org/packages/8d/ae/c869b82f2a10985d9091581364c185a66cf770c0b923b6546b372981a54b/pyobjc_framework_screensaver-12.0-cp314-cp314-macosx_10_15_universal2.whl", hash = "sha256:dac0a57ad4c39d6ff577c5a8e776f53654e29022096bbbbfffe73575c1d3fdf3", size = 8498, upload-time = "2025-10-21T08:20:11.954Z" }, + { url = "https://files.pythonhosted.org/packages/2e/4e/0c90bf65c4166fb976cad68e18811aed9fbc8167bfce51cc4edc31233dc2/pyobjc_framework_screensaver-12.0-cp314-cp314t-macosx_10_15_universal2.whl", hash = "sha256:163621994011fd25b2d48bacbee45ffca8b0b2e4726bf8d7692ef969e2222545", size = 8511, upload-time = "2025-10-21T08:20:13.528Z" }, +] + +[[package]] +name = "pyobjc-framework-screentime" +version = "12.0" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "pyobjc-core" }, + { name = "pyobjc-framework-cocoa" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/6c/0a/369431b09cd9cfff0c6be01e256244d446ae8d37d95bcd8b79191078d5c3/pyobjc_framework_screentime-12.0.tar.gz", hash = "sha256:cf414fcb988b4ca408c82e1924f8ad9b52f3ff6d509a9dec5eb84983e1cd45bb", size = 13444, upload-time = "2025-10-21T08:40:27.696Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/4d/fc/974228e9a93ad848f585ba74be4b0632ef18e652aa7459553a1490ffd276/pyobjc_framework_screentime-12.0-py2.py3-none-any.whl", hash = "sha256:c8046559698a53b7dfb7e7515fcfe5df850ffa0f6c093b5d825b5446af7e8604", size = 3975, upload-time = "2025-10-21T08:20:14.98Z" }, +] + +[[package]] +name = "pyobjc-framework-scriptingbridge" +version = "12.0" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "pyobjc-core" }, + { name = "pyobjc-framework-cocoa" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/67/ff/478ce8ba77b61b9b48bf2f881f0aec7c6059eb9166e29c6ee60223b09cb3/pyobjc_framework_scriptingbridge-12.0.tar.gz", hash = "sha256:062f03132fbf2f4e71bcf80d7e78c27d63588a1985d465ab1e7fa07f806590b5", size = 20710, upload-time = "2025-10-21T08:40:29.854Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/4b/53/aac8e25857219614b173028d34ee0d2a816f3b9d81e9c93576ee39f79f94/pyobjc_framework_scriptingbridge-12.0-cp313-cp313-macosx_10_13_universal2.whl", hash = "sha256:453ae60ac93a7e183853715b6b4ede6f4cd581e1c008011820db0216590d60e1", size = 8380, upload-time = "2025-10-21T08:20:22.562Z" }, + { url = "https://files.pythonhosted.org/packages/2d/df/1cb8a408f7dd79696cb6cdce82e4e0f80179f975a56a15bf051d85c429c6/pyobjc_framework_scriptingbridge-12.0-cp313-cp313t-macosx_10_13_universal2.whl", hash = "sha256:74a8d2d009c075f47b38b88767c84626865fef29ddf94c5e01eac4b165358b27", size = 8529, upload-time = "2025-10-21T08:20:24.575Z" }, + { url = "https://files.pythonhosted.org/packages/94/ce/ce8c048050770f416c7b385a69e24101b4d4ced53dee836fbbdcac24515d/pyobjc_framework_scriptingbridge-12.0-cp314-cp314-macosx_10_15_universal2.whl", hash = "sha256:d70baa98108d4165a4dad62ddc30174fe7811b1425d99ebd9267e4d2d13ab549", size = 8412, upload-time = "2025-10-21T08:20:26.594Z" }, + { url = "https://files.pythonhosted.org/packages/3d/26/7395fd8bee832a665f94e4d97cb8c9dd679c1c4e4159a5f54c33c5c21cd3/pyobjc_framework_scriptingbridge-12.0-cp314-cp314t-macosx_10_15_universal2.whl", hash = "sha256:f6b1d24381e445a815e6b2a7d4c00a343912aa549b8b781488652b072166f00f", size = 8572, upload-time = "2025-10-21T08:20:28.378Z" }, +] + +[[package]] +name = "pyobjc-framework-searchkit" +version = "12.0" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "pyobjc-core" }, + { name = "pyobjc-framework-coreservices" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/c2/28/186a8525adb01657e2162ab8cd2ea3df17201bd1def22f460a6838301ca3/pyobjc_framework_searchkit-12.0.tar.gz", hash = "sha256:78c5fdd8f96da140883eabca82a3eb720a37e6e58c9a90d1c62dbe220a3fded5", size = 30949, upload-time = "2025-10-21T08:40:32.868Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/0e/00/e56077f1e21d55772064b645bd0b9359747967e9cb4599c48f79d3c77b99/pyobjc_framework_searchkit-12.0-py2.py3-none-any.whl", hash = "sha256:12dd4a566df2616dad316c95eb5b77fe7f98428a8cb707aee814328ce07bd6a8", size = 3742, upload-time = "2025-10-21T08:20:30.024Z" }, +] + +[[package]] +name = "pyobjc-framework-security" +version = "12.0" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "pyobjc-core" }, + { name = "pyobjc-framework-cocoa" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/cb/d6/ab109af82a65d52ab829010013b5a24b829c9155bc9608ebc80a43b8797c/pyobjc_framework_security-12.0.tar.gz", hash = "sha256:d64d069da79fbf1dadbc091717604843b9d5be96670f7b40bc9a08df12b4045b", size = 168360, upload-time = "2025-10-21T08:40:44.379Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/2c/6d/7e50349ed08cfd2ee7438642b51512415739a87befc009d73b026d1e35c1/pyobjc_framework_security-12.0-cp313-cp313-macosx_10_13_universal2.whl", hash = "sha256:be1435584cdd116495a16e6cd8a086d6930f0005ea49df4e4958b5a142dd6f63", size = 41291, upload-time = "2025-10-21T08:20:45.044Z" }, + { url = "https://files.pythonhosted.org/packages/2b/4b/4bcc8a24806fb5cabd81b0c9bd110ec559eccce55829754f7a88931c2cd2/pyobjc_framework_security-12.0-cp313-cp313t-macosx_10_13_universal2.whl", hash = "sha256:e3c27816b102858c976956ab8eee156b9c724cd0f1d488f3285ac4921a904788", size = 42167, upload-time = "2025-10-21T08:20:48.651Z" }, + { url = "https://files.pythonhosted.org/packages/51/b6/aabbb1ef3268b487f36caf5647a0f544ae0ab32518f70e622821f2030d9a/pyobjc_framework_security-12.0-cp314-cp314-macosx_10_15_universal2.whl", hash = "sha256:0f9c1598215a9372f446e63ac5dab8a120e25f3caa5890b2abd8b075e4122a52", size = 41362, upload-time = "2025-10-21T08:20:52.26Z" }, + { url = "https://files.pythonhosted.org/packages/68/40/aca4812e4d619c667f8432b79142cf6f89f7149aaec2194fed1f8b211da7/pyobjc_framework_security-12.0-cp314-cp314t-macosx_10_15_universal2.whl", hash = "sha256:d67224e548735f4464778f1911063fd37b64dfe3950d0920d9c1afac229b03db", size = 42918, upload-time = "2025-10-21T08:20:56.1Z" }, +] + +[[package]] +name = "pyobjc-framework-securityfoundation" +version = "12.0" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "pyobjc-core" }, + { name = "pyobjc-framework-cocoa" }, + { name = "pyobjc-framework-security" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/b5/f8/b806f00731237ef45d7cf6fdb12233320696e23e6bd04b14932027a03c81/pyobjc_framework_securityfoundation-12.0.tar.gz", hash = "sha256:55890147e294c5eb92f2467111ae577d18f15710ff3bb9caecb961b8397c5708", size = 12728, upload-time = "2025-10-21T08:40:46.366Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/93/d0/ececa41a50918594b8ee3f28af4174fb47740950e758585bc70c787f49b1/pyobjc_framework_securityfoundation-12.0-py2.py3-none-any.whl", hash = "sha256:01933f6f5424e11e19e833803b65873458d3a32de390f8c6bfa849e258f0c018", size = 3803, upload-time = "2025-10-21T08:20:58.011Z" }, +] + +[[package]] +name = "pyobjc-framework-securityinterface" +version = "12.0" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "pyobjc-core" }, + { name = "pyobjc-framework-cocoa" }, + { name = "pyobjc-framework-security" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/ee/3b/0d263da7f2fa340e917b5a003d7dc34f930a60b4d489bdb29974890860c6/pyobjc_framework_securityinterface-12.0.tar.gz", hash = "sha256:6a17854bb37737b14684b379f2e3a7a71e4f2e5836aa3cdff7e9c179fc65369c", size = 25966, upload-time = "2025-10-21T08:40:48.931Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/06/fa/941e19d267f38bfe0f714bce99af4f180e55868bff881e5dab5dcc1b1dab/pyobjc_framework_securityinterface-12.0-cp313-cp313-macosx_10_13_universal2.whl", hash = "sha256:6e21a47d9ae3fdf7baa7c29c4ce3cc4abd3e3a7a6f7926fa9823343374cfa8d0", size = 10807, upload-time = "2025-10-21T08:21:05.002Z" }, + { url = "https://files.pythonhosted.org/packages/f5/cd/feeaccb7c9f38f40cffdc444ad7686343e11ec609431ed72dad54b833456/pyobjc_framework_securityinterface-12.0-cp313-cp313t-macosx_10_13_universal2.whl", hash = "sha256:c138276a669e796f1d49053cd5cedabfc6eb911cd0a4e3ca7665251adf37ced2", size = 11144, upload-time = "2025-10-21T08:21:07.14Z" }, + { url = "https://files.pythonhosted.org/packages/59/6f/2703523d2cd838ded70ba1022fe7f8012c265ec7c896d7def302274dd1b9/pyobjc_framework_securityinterface-12.0-cp314-cp314-macosx_10_15_universal2.whl", hash = "sha256:658932a843f569ea40a2a3f9304fac0dac42ac37eb28e8e072abdbe6239a5943", size = 10844, upload-time = "2025-10-21T08:21:08.762Z" }, + { url = "https://files.pythonhosted.org/packages/46/6a/a8a7b6301436bf4b900aaca3ed1ee752d2da0bf6214aacf1315f25da5bf3/pyobjc_framework_securityinterface-12.0-cp314-cp314t-macosx_10_15_universal2.whl", hash = "sha256:0fb1214d7d25ac1eb2892d0c6a9ab5295cc1084e291b4c79b0c97279cdd2f389", size = 11194, upload-time = "2025-10-21T08:21:10.501Z" }, +] + +[[package]] +name = "pyobjc-framework-securityui" +version = "12.0" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "pyobjc-core" }, + { name = "pyobjc-framework-cocoa" }, + { name = "pyobjc-framework-security" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/c3/b9/40ee5e3added96c9b2039e5016b7a994783c09580ac89eb5f077b9ed8810/pyobjc_framework_securityui-12.0.tar.gz", hash = "sha256:cbb5cfdb5f196ecb5b1c7369fa6af6e8a3c285013c8949b855b39bea4c09382e", size = 12206, upload-time = "2025-10-21T08:40:50.736Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/c5/82/53bacd8fc7344bbce297f317f9a46ea0f4c75f9cdd3c72bc6b0b762b440e/pyobjc_framework_securityui-12.0-py2.py3-none-any.whl", hash = "sha256:9c7511241d19b416b79b1291eb57896ffc317528e6c342982722a32901a177a5", size = 3606, upload-time = "2025-10-21T08:21:11.839Z" }, +] + +[[package]] +name = "pyobjc-framework-sensitivecontentanalysis" +version = "12.0" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "pyobjc-core" }, + { name = "pyobjc-framework-cocoa" }, + { name = "pyobjc-framework-quartz" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/12/fa/1a597c43747efb764f8d069b4d8db0458cdf14086ce9bd32fa41139484e1/pyobjc_framework_sensitivecontentanalysis-12.0.tar.gz", hash = "sha256:2e56f19af4506a0b222b223f70ab59725fc59b24d40267c1e03dcd3113f865ea", size = 13786, upload-time = "2025-10-21T08:40:52.907Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/f4/0b/3be629ba18bec304236dba34e7bc592faa6a8486dd1188bd3994102ea2ec/pyobjc_framework_sensitivecontentanalysis-12.0-py2.py3-none-any.whl", hash = "sha256:fca905676790e76a2697c93fb798479aee3be5a57144ac681fa0e5cdc33e7d3a", size = 4240, upload-time = "2025-10-21T08:21:13.355Z" }, +] + +[[package]] +name = "pyobjc-framework-servicemanagement" +version = "12.0" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "pyobjc-core" }, + { name = "pyobjc-framework-cocoa" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/4a/76/8980c4451f27b646bf2b6b9895f155c780e040cfdddc66a3aca0125b93bf/pyobjc_framework_servicemanagement-12.0.tar.gz", hash = "sha256:768e0a288f38a4dcc65bbfc144fbccfc10fc29df72102b1a00923d78385d1c15", size = 14624, upload-time = "2025-10-21T08:40:55.084Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/18/c0/dc4c35cd42fc6e398d2b86f05a446007d3ae802cda187b8cf6834c3a248f/pyobjc_framework_servicemanagement-12.0-py2.py3-none-any.whl", hash = "sha256:57c22bb43aa6eb956aa5dee5976fe8602d45b72271e9ae9ed6f328645907fdac", size = 5366, upload-time = "2025-10-21T08:21:14.996Z" }, +] + +[[package]] +name = "pyobjc-framework-sharedwithyou" +version = "12.0" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "pyobjc-core" }, + { name = "pyobjc-framework-sharedwithyoucore" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/ba/49/9fdb0d4e8c1f2d800975fb60d6975292767379e37250360072d9d84e9116/pyobjc_framework_sharedwithyou-12.0.tar.gz", hash = "sha256:e83152057aec724ede34be680bd98d5962b2e5d5443646fe41635fda9d5e996f", size = 25148, upload-time = "2025-10-21T08:40:57.485Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/bf/16/ddf19adbbc69e57d484a683aaa1c1812da1a732188de75ebdc97c0c25f0b/pyobjc_framework_sharedwithyou-12.0-cp313-cp313-macosx_10_13_universal2.whl", hash = "sha256:c03665432b090e4a147a30f1af936a259ecf0ce337fe534ceff2c4f46dd12524", size = 8787, upload-time = "2025-10-21T08:21:22.613Z" }, + { url = "https://files.pythonhosted.org/packages/20/f6/1644c078321e73a769054744186930d639e38be99b9369da2004993a292d/pyobjc_framework_sharedwithyou-12.0-cp313-cp313t-macosx_10_13_universal2.whl", hash = "sha256:25f403f90688f2b4f389d1df4902ebdee59bd5c44861cc04d217d513b1c7d9b0", size = 8932, upload-time = "2025-10-21T08:21:24.542Z" }, + { url = "https://files.pythonhosted.org/packages/9e/77/a54b13ec4d1dfc3d6b9c12393b61e40fcb56f096f4bf119d66244a3a149f/pyobjc_framework_sharedwithyou-12.0-cp314-cp314-macosx_10_15_universal2.whl", hash = "sha256:3509163025f9a47a366d22472fc7206c509c32019a6b9c9c520746df70e34f95", size = 8831, upload-time = "2025-10-21T08:21:26.155Z" }, + { url = "https://files.pythonhosted.org/packages/8c/94/4c09b390fb4b8f8ee19072ddb19cada38e7ea4ae2e6c63a6276c22bfd4c9/pyobjc_framework_sharedwithyou-12.0-cp314-cp314t-macosx_10_15_universal2.whl", hash = "sha256:ace608ae20e48fdd082426c560d9bb558199256b69653b8e688f723d6eb6e012", size = 8980, upload-time = "2025-10-21T08:21:27.784Z" }, +] + +[[package]] +name = "pyobjc-framework-sharedwithyoucore" +version = "12.0" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "pyobjc-core" }, + { name = "pyobjc-framework-cocoa" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/a5/da/6e2f57bcfd4a5425a97d98c952d92f55c2ba8e5b7b227b2c122af9ab68f4/pyobjc_framework_sharedwithyoucore-12.0.tar.gz", hash = "sha256:ea923c3336c895d3dd79fa405f6fc17db6abbaac85ed8d7ed4ce9887e508ce1a", size = 22791, upload-time = "2025-10-21T08:41:00.157Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/2c/be/53a568fb87f037382f1ff87df03d393b529cb6fcebb1506c4e6cf8a0a1f8/pyobjc_framework_sharedwithyoucore-12.0-cp313-cp313-macosx_10_13_universal2.whl", hash = "sha256:b51a3ac935dd41d0d4ebe5ac08960e4a91e0732e94cf4bca0f753b86f6b79bf0", size = 8554, upload-time = "2025-10-21T08:21:34.411Z" }, + { url = "https://files.pythonhosted.org/packages/69/4a/26177b557b8f9a4cb7d95984c5dd06d798bfb3dc64adf10f71af8eb6a424/pyobjc_framework_sharedwithyoucore-12.0-cp313-cp313t-macosx_10_13_universal2.whl", hash = "sha256:84cc03cfd3e0dada72991f1c842ab16176a4bb859a20734a9aa30a6954978305", size = 8687, upload-time = "2025-10-21T08:21:36.042Z" }, + { url = "https://files.pythonhosted.org/packages/f2/1d/7c85af279ba24427ef6e4165cd22d99690ee69700703116243a1f9b38038/pyobjc_framework_sharedwithyoucore-12.0-cp314-cp314-macosx_10_15_universal2.whl", hash = "sha256:14e2ef808e72628e037b5967b196470f5dcec28931d81451d49b30aa87591310", size = 8600, upload-time = "2025-10-21T08:21:38.002Z" }, + { url = "https://files.pythonhosted.org/packages/c8/c6/ecb7332a7d6d23b883c3cedf7607a6c7d984074cb5eefc0c17ea927ae820/pyobjc_framework_sharedwithyoucore-12.0-cp314-cp314t-macosx_10_15_universal2.whl", hash = "sha256:1705dce361b984dea4ba1cb2e67f3433cf4f074cbf49729e8999254726896c04", size = 8749, upload-time = "2025-10-21T08:21:39.629Z" }, +] + +[[package]] +name = "pyobjc-framework-shazamkit" +version = "12.0" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "pyobjc-core" }, + { name = "pyobjc-framework-cocoa" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/cf/21/1743b7d7592117f9739f0c14041e90c5de28b05a8b0c936602719b624fd4/pyobjc_framework_shazamkit-12.0.tar.gz", hash = "sha256:4624fc90435eaabb19c0079505a942e92b6cdf516830340289d543816fceca91", size = 22935, upload-time = "2025-10-21T08:41:02.444Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/4c/e8/05e934e4f36432c191ab662056ec1807c26a7f56f02de7ac151b244432e1/pyobjc_framework_shazamkit-12.0-cp313-cp313-macosx_10_13_universal2.whl", hash = "sha256:50337b0e81d51f07beef7db7b036b2f2051ea0603f0d92ff93f8596d67f6dba5", size = 8595, upload-time = "2025-10-21T08:21:46.576Z" }, + { url = "https://files.pythonhosted.org/packages/e2/7f/16e61fe1fae03f2f4bd81b6e328eeec78d5c6cd18dc8d1762deafbb8274a/pyobjc_framework_shazamkit-12.0-cp313-cp313t-macosx_10_13_universal2.whl", hash = "sha256:3f074540562a0de1e2dcb66f70a74ab73035da475f9c3ae4426f91fab8c5af35", size = 8738, upload-time = "2025-10-21T08:21:48.159Z" }, + { url = "https://files.pythonhosted.org/packages/ea/53/fa4bcde1af718ff832825e167522ff7e18ce03b11f27e55638fc3f312239/pyobjc_framework_shazamkit-12.0-cp314-cp314-macosx_10_15_universal2.whl", hash = "sha256:0911efc4dafbe1fbb8d44acba01b2473efb9bf5c49f7a6899cfaddc441298fef", size = 8656, upload-time = "2025-10-21T08:21:49.797Z" }, + { url = "https://files.pythonhosted.org/packages/04/a4/9be04728b6483b1ed47e81ed4ee4059a0e84a06d36084d18aa6239728bac/pyobjc_framework_shazamkit-12.0-cp314-cp314t-macosx_10_15_universal2.whl", hash = "sha256:ba5089661647e16978e29a43ebfba96f713cae1eb9dba270719598516b8c2dcd", size = 8798, upload-time = "2025-10-21T08:21:51.435Z" }, +] + +[[package]] +name = "pyobjc-framework-social" +version = "12.0" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "pyobjc-core" }, + { name = "pyobjc-framework-cocoa" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/e1/a0/034973099006522f01a32f83cf29458bd89acbd4b5a7f782358c9d781bf9/pyobjc_framework_social-12.0.tar.gz", hash = "sha256:be7d4b827537de49dea96c7defcfd28263b4a4cd4f28c5abeb873a072456db5b", size = 13229, upload-time = "2025-10-21T08:41:04.277Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/1b/dc/4da2473821c80acbfa65783430faad8923a0281e257960e5abcc821265b2/pyobjc_framework_social-12.0-py2.py3-none-any.whl", hash = "sha256:0bf4b935014f70957d0dd6316ce47c944495201c30990738d9be11431fa0db00", size = 4469, upload-time = "2025-10-21T08:21:53.037Z" }, +] + +[[package]] +name = "pyobjc-framework-soundanalysis" +version = "12.0" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "pyobjc-core" }, + { name = "pyobjc-framework-cocoa" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/90/eb/30927f7d3e93913fcb4472bd2fb46b90cf341a52065c4c3bad3ffac463ad/pyobjc_framework_soundanalysis-12.0.tar.gz", hash = "sha256:eb60a6b172ca2d71f8b5ae9b6169a3b542755af0f763fec0786403f90b1394c5", size = 14871, upload-time = "2025-10-21T08:41:06.236Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/15/2a/80786fe9e85ddb3b44828336911bd4bab99a2674cf9dd7912295f6c319a3/pyobjc_framework_soundanalysis-12.0-py2.py3-none-any.whl", hash = "sha256:08fd2e988ca0ae84c8dbaf490d634e250d32e44f420de7e6c2ff72bac947aaaf", size = 4197, upload-time = "2025-10-21T08:21:54.618Z" }, +] + +[[package]] +name = "pyobjc-framework-speech" +version = "12.0" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "pyobjc-core" }, + { name = "pyobjc-framework-cocoa" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/63/73/623e37a98f0279cf4e5b6c160bcf8b510bb67d4f9fdc3202b48c326bdc66/pyobjc_framework_speech-12.0.tar.gz", hash = "sha256:9e6a208205e3065055e3d98b553464086ddc60f165df7e9c93596a819b4ab9b4", size = 25615, upload-time = "2025-10-21T08:41:08.667Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/d8/39/30c9e02475afd3976c3667cfc5a94aaf0237579d1f9b588292706299e38b/pyobjc_framework_speech-12.0-cp313-cp313-macosx_10_13_universal2.whl", hash = "sha256:f5c81f0c5e32110f61fb487d3a47d4fc504776ac2d5ab2a9857a7ebe921fbf1d", size = 9280, upload-time = "2025-10-21T08:22:01.728Z" }, + { url = "https://files.pythonhosted.org/packages/4e/48/c41931ca8e305bd250e7cc7adbfecebefaaa296b06d0c1d1dbc87d6266f3/pyobjc_framework_speech-12.0-cp313-cp313t-macosx_10_13_universal2.whl", hash = "sha256:b3baea1720e54a60bec2ce20d7b979fcfe25d1e25f2e2a4ca4e5b23a990b210e", size = 9442, upload-time = "2025-10-21T08:22:03.701Z" }, + { url = "https://files.pythonhosted.org/packages/16/89/b9c6fbbb2adbb42005884b8294899b994d206d299d6c826c55f8bdf20d08/pyobjc_framework_speech-12.0-cp314-cp314-macosx_10_15_universal2.whl", hash = "sha256:71fd245edc11cbbe890772cd4a8bfa48ade5fa83dc5e5add1a10882a21b3182d", size = 9345, upload-time = "2025-10-21T08:22:05.671Z" }, + { url = "https://files.pythonhosted.org/packages/7b/cd/5ffff71717caf90e6d5f95a0c38fa68496a341e75315fb9a0d91dbb5ba25/pyobjc_framework_speech-12.0-cp314-cp314t-macosx_10_15_universal2.whl", hash = "sha256:a2a971db829b76c9b6377250d9a406e8ad50d81c0e13ed9831ba429375570732", size = 9505, upload-time = "2025-10-21T08:22:07.666Z" }, +] + +[[package]] +name = "pyobjc-framework-spritekit" +version = "12.0" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "pyobjc-core" }, + { name = "pyobjc-framework-cocoa" }, + { name = "pyobjc-framework-quartz" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/bf/a0/aababd3124b2303379d76dfd058b2c37d1609e6397f932a183dbb68b2d31/pyobjc_framework_spritekit-12.0.tar.gz", hash = "sha256:d2d673437d5863f59d4ed4cd1145c30c02cf7737b889573252d8d81cbb48e1db", size = 64834, upload-time = "2025-10-21T08:41:13.859Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/f5/5f/f4f69dee686daa9bc69cc09493b0fbe642db7fac6a1eb3daf8cb8b1800c5/pyobjc_framework_spritekit-12.0-cp313-cp313-macosx_10_13_universal2.whl", hash = "sha256:a67878483326b8079e6077ecdeb571a91197b7f13a1aab803cbb14d0e966ffb6", size = 17828, upload-time = "2025-10-21T08:22:16.559Z" }, + { url = "https://files.pythonhosted.org/packages/14/03/cdced6f888211515503ccafcf9d46ae34ad65cbd44286be7e1bb239d5517/pyobjc_framework_spritekit-12.0-cp313-cp313t-macosx_10_13_universal2.whl", hash = "sha256:e460d1b764755a7e4bdeef79ffc66d016c496b0a20ad679ea2cf2ec4ced13af9", size = 18096, upload-time = "2025-10-21T08:22:18.692Z" }, + { url = "https://files.pythonhosted.org/packages/7d/2c/078f283220713936774d6bfe3ae05e57303fd9fe64103a453a5423a95938/pyobjc_framework_spritekit-12.0-cp314-cp314-macosx_10_15_universal2.whl", hash = "sha256:0bb3d5ccec06f3165f5c8eae891a9a5e218bbb28a19f661b300340b1d71fde19", size = 17800, upload-time = "2025-10-21T08:22:21.199Z" }, + { url = "https://files.pythonhosted.org/packages/16/de/0ab2c08e12a21cb8a94bece9069002f77a49cca5c825797840a8a78fccc0/pyobjc_framework_spritekit-12.0-cp314-cp314t-macosx_10_15_universal2.whl", hash = "sha256:f404417bfacb9702a24b706cd6376b71e08980df13d2d808ff73dab0027dca4f", size = 18079, upload-time = "2025-10-21T08:22:23.704Z" }, +] + +[[package]] +name = "pyobjc-framework-storekit" +version = "12.0" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "pyobjc-core" }, + { name = "pyobjc-framework-cocoa" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/cb/a0/c8d7df4eb7f771838d6075c010b11fdf9d99bff2a60261b03ed196b22b03/pyobjc_framework_storekit-12.0.tar.gz", hash = "sha256:b72cbf8d79fa2f542765a9ccd75b3fc83ed0b985985c626e09ea268246416a95", size = 35012, upload-time = "2025-10-21T08:41:17.245Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/87/48/ed3822fa87e96a0724b05e212f7e0829dc8739e44f4adccc8fc85f0b08bc/pyobjc_framework_storekit-12.0-cp313-cp313-macosx_10_13_universal2.whl", hash = "sha256:961dceeeb3ba3364b1fc77f2176cd6fcff2e19fef2eb402b14bdef616ed7a121", size = 12845, upload-time = "2025-10-21T08:22:31.909Z" }, + { url = "https://files.pythonhosted.org/packages/d0/1d/0d473466153c1d651d0ed4c139556d8ae8c7029bcc5603154e37ffd0b6d3/pyobjc_framework_storekit-12.0-cp313-cp313t-macosx_10_13_universal2.whl", hash = "sha256:a87d636a2c7d905b9e429a4dd30ffd5dc895539da11ba282c5bb0a47781503ae", size = 13036, upload-time = "2025-10-21T08:22:33.78Z" }, + { url = "https://files.pythonhosted.org/packages/fc/49/2a2c7177a8f8543473b5b0c1c6a658689c59d2274a77ec1537a69f083b44/pyobjc_framework_storekit-12.0-cp314-cp314-macosx_10_15_universal2.whl", hash = "sha256:a682be4a5c896a916bf4b7e976c343e8ba81d0f301cc23bad93609f9bdbadff4", size = 12833, upload-time = "2025-10-21T08:22:35.662Z" }, + { url = "https://files.pythonhosted.org/packages/60/be/5dc4eef2ba8f81cdcebe654d691709e5cf37d94ce67b532a6e4d76e023d3/pyobjc_framework_storekit-12.0-cp314-cp314t-macosx_10_15_universal2.whl", hash = "sha256:9afb63e5b13fc60a4f349d9816e4a9670b79a38984bab238f956ce062cfaf856", size = 13027, upload-time = "2025-10-21T08:22:37.576Z" }, +] + +[[package]] +name = "pyobjc-framework-symbols" +version = "12.0" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "pyobjc-core" }, + { name = "pyobjc-framework-cocoa" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/ed/49/7e206fa8b912bd929bbcae17627f370ac6f81c75c1d2ca3a006fb12f4697/pyobjc_framework_symbols-12.0.tar.gz", hash = "sha256:0707226ae8741163f3f450559c7d7c87a987ddb84ccb5fe22fb1f40554404cfa", size = 12843, upload-time = "2025-10-21T08:41:19.35Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/d7/eb/bec85c6ca8b765ff135297ce91acee1a63fbed8a9a5ad130dfb46e2ee50e/pyobjc_framework_symbols-12.0-py2.py3-none-any.whl", hash = "sha256:e47998c35073906cc5c82ca1eff73957d9f2b673621bad044cfa46b0b08697a6", size = 3345, upload-time = "2025-10-21T08:22:38.927Z" }, +] + +[[package]] +name = "pyobjc-framework-syncservices" +version = "12.0" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "pyobjc-core" }, + { name = "pyobjc-framework-cocoa" }, + { name = "pyobjc-framework-coredata" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/d8/41/c7a6c68a0ceb7309ee4e167396a1d806543d7863a0e2945a835fd463359c/pyobjc_framework_syncservices-12.0.tar.gz", hash = "sha256:7ba335196f09495fade38753958ce5dcabe25a1280821ac69a77a1fc526d228d", size = 31454, upload-time = "2025-10-21T08:41:22.26Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/53/70/acedc33df3d03aa1638f854de91c08cbcd1ae844111033aea1b58a7b8ee0/pyobjc_framework_syncservices-12.0-cp313-cp313-macosx_10_13_universal2.whl", hash = "sha256:e9c5565ed72d4bce4e51a810c3fc72d3a9f19f6554fd9890fe3864c6c93220c8", size = 13436, upload-time = "2025-10-21T08:22:46.811Z" }, + { url = "https://files.pythonhosted.org/packages/b3/3b/bcc45794a73cc1bd4c5d9fb9505686d7b60e32ba09bd6af2b8a94b5de18f/pyobjc_framework_syncservices-12.0-cp313-cp313t-macosx_10_13_universal2.whl", hash = "sha256:a462940649c6823aae889c330c748aca4dca96d443e4a9a401183bbc05f15960", size = 13603, upload-time = "2025-10-21T08:22:48.765Z" }, + { url = "https://files.pythonhosted.org/packages/d7/29/38a4adf7ec6ce28245555ad5cda74a35007fc6c17ab45bf8c31ae4281e22/pyobjc_framework_syncservices-12.0-cp314-cp314-macosx_10_15_universal2.whl", hash = "sha256:ca94dde6e9c9dc068ee20a8130c2a5dd85091ce132b495e92d9f7d5385aef10c", size = 13418, upload-time = "2025-10-21T08:22:50.769Z" }, + { url = "https://files.pythonhosted.org/packages/a3/91/98cd392afe4868ef23debf6bfc2c26220fe20e4783e4d9cc77399a99739b/pyobjc_framework_syncservices-12.0-cp314-cp314t-macosx_10_15_universal2.whl", hash = "sha256:d63efc5885f347338a57635720caa867888dfe953f607c97fe589b35b1a476f9", size = 13595, upload-time = "2025-10-21T08:22:52.792Z" }, +] + +[[package]] +name = "pyobjc-framework-systemconfiguration" +version = "12.0" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "pyobjc-core" }, + { name = "pyobjc-framework-cocoa" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/c1/a5/6d02fec1b04a7b44acf993157fd24ffbd7762c4937f3a733be3ae3899378/pyobjc_framework_systemconfiguration-12.0.tar.gz", hash = "sha256:441738af5663127e0bce23771ddaac25c891c0b09c22254b10a1de0933ed2ca2", size = 59482, upload-time = "2025-10-21T08:41:26.973Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/d1/99/ca0600867272573786f2efa79cccf7018b442475bd5eed30f8da2cc498f6/pyobjc_framework_systemconfiguration-12.0-cp313-cp313-macosx_10_13_universal2.whl", hash = "sha256:e8abae336df40c216ee1bcf9ac5ee40f7fdfdaa3ad96d56d49a7e8c521e27f1c", size = 21582, upload-time = "2025-10-21T08:23:03.682Z" }, + { url = "https://files.pythonhosted.org/packages/59/3d/6bc58890a00a9e853ef9d29c0f9f85b07cafd2d9cb6e116ccdede0d61c60/pyobjc_framework_systemconfiguration-12.0-cp313-cp313t-macosx_10_13_universal2.whl", hash = "sha256:2583ce2c28b3af11bde74f5317c49ed0ece4fc93391db8a8e5bff77b7c1c524a", size = 22000, upload-time = "2025-10-21T08:23:06.077Z" }, + { url = "https://files.pythonhosted.org/packages/0d/99/e0575334a6470de12ba01bd5fdef875b93760a90766c38d25184fcac0de9/pyobjc_framework_systemconfiguration-12.0-cp314-cp314-macosx_10_15_universal2.whl", hash = "sha256:54b35c020fdc9c6158df217843be3483ad6bc2f7dc99a48a187bdff08bf98074", size = 21620, upload-time = "2025-10-21T08:23:08.484Z" }, + { url = "https://files.pythonhosted.org/packages/89/ab/3036dc52762cc8f18b2171014d57845a904c5b080c8ca4e8043011d84eea/pyobjc_framework_systemconfiguration-12.0-cp314-cp314t-macosx_10_15_universal2.whl", hash = "sha256:d05f4a4f2a2d7971893b64106f4bbd234366494980cd5db8ce1a49f0ccf69966", size = 22009, upload-time = "2025-10-21T08:23:10.963Z" }, +] + +[[package]] +name = "pyobjc-framework-systemextensions" +version = "12.0" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "pyobjc-core" }, + { name = "pyobjc-framework-cocoa" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/4b/ad/cad5b63d52a11d7e41a378753d30798d47bca41ecd1b519e4c34b1ee1ba7/pyobjc_framework_systemextensions-12.0.tar.gz", hash = "sha256:1eec39afc1a138cc31162577622542e65f0941a001aa4cac0e458bddbad76ba9", size = 21110, upload-time = "2025-10-21T08:41:29.288Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/31/11/bc32194dfd28fcba6baf975582a13bfeac7156c7f10709a0216fa3222dcf/pyobjc_framework_systemextensions-12.0-cp313-cp313-macosx_10_13_universal2.whl", hash = "sha256:2c398a5b6c41e65465230acddedb990fac4e558609401f52c15d0a00a00ee0a7", size = 9198, upload-time = "2025-10-21T08:23:18.232Z" }, + { url = "https://files.pythonhosted.org/packages/3d/6b/d1b34b74dc19861a57f947219713bc08ef365c9165fb7ddf47a20deccfad/pyobjc_framework_systemextensions-12.0-cp313-cp313t-macosx_10_13_universal2.whl", hash = "sha256:206227d972436cf18300244b5400a3f5b2b6840ca003488b5804b6809430c97e", size = 9354, upload-time = "2025-10-21T08:23:20.197Z" }, + { url = "https://files.pythonhosted.org/packages/06/14/2cc7b2e4c010739cf4ce9ea579c0b935d87fa8d541f726f8fcaab809fd31/pyobjc_framework_systemextensions-12.0-cp314-cp314-macosx_10_15_universal2.whl", hash = "sha256:790bb198dff02fcdeb54f95d5d6d1bec22f5aaa70f6d9bbe46cab4f5c64c0c9e", size = 9265, upload-time = "2025-10-21T08:23:21.794Z" }, + { url = "https://files.pythonhosted.org/packages/fc/10/9c0f1d9d562229df94f380fb929e720e5596efb972a33549158a347dbd50/pyobjc_framework_systemextensions-12.0-cp314-cp314t-macosx_10_15_universal2.whl", hash = "sha256:a43dd5f5202b12558bf90382bb10686de9c810b2d5c4bea577e5375c42955687", size = 9423, upload-time = "2025-10-21T08:23:23.372Z" }, +] + +[[package]] +name = "pyobjc-framework-threadnetwork" +version = "12.0" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "pyobjc-core" }, + { name = "pyobjc-framework-cocoa" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/a9/27/7d365ed3228c819e7cb3bf1c00530ad332b16b1f366fa68201ef6802b0e1/pyobjc_framework_threadnetwork-12.0.tar.gz", hash = "sha256:5c4b14ea351f2208e05f3a6b85e46eba4f11ab009af1251ea6caabfb6588dc42", size = 12810, upload-time = "2025-10-21T08:41:31.361Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/63/5e/660f7043d0946d47353f311aa4204e0063ddf768846bac402381542badaa/pyobjc_framework_threadnetwork-12.0-py2.py3-none-any.whl", hash = "sha256:e3f030bd6d36f01480e2f0d0639ada0c21d0d74bcc15f8b6301ebe525180e2f9", size = 3780, upload-time = "2025-10-21T08:23:24.825Z" }, +] + +[[package]] +name = "pyobjc-framework-uniformtypeidentifiers" +version = "12.0" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "pyobjc-core" }, + { name = "pyobjc-framework-cocoa" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/63/8d/45e8290134b06e73fb1cdce72aea71bddf7d8dee820165a549379d32837e/pyobjc_framework_uniformtypeidentifiers-12.0.tar.gz", hash = "sha256:f7fe17832de25098b9ad7718af536f6f4597985418d9869946cee104e2782b8a", size = 17064, upload-time = "2025-10-21T08:41:33.528Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/5f/04/2b000e6e55572854c20eea7e0f4ba94597a6c8fb22a1fca9f1d2952a1ab6/pyobjc_framework_uniformtypeidentifiers-12.0-py2.py3-none-any.whl", hash = "sha256:b2c406e34306ef55ceb9c8cb16a4a9e37e7fc2ed4c8e7948f05bf3d51dea2a91", size = 4913, upload-time = "2025-10-21T08:23:26.31Z" }, +] + +[[package]] +name = "pyobjc-framework-usernotifications" +version = "12.0" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "pyobjc-core" }, + { name = "pyobjc-framework-cocoa" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/e5/fc/3e5d15bddc660fc987cbf72b7b476dbe13bedcf52e18c58606432457d41e/pyobjc_framework_usernotifications-12.0.tar.gz", hash = "sha256:93dea828a26a3a93f6259f21496bcdda5dc1625a48c2ba9ce4a58c8a57d3f84c", size = 30118, upload-time = "2025-10-21T08:41:36.393Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/74/b4/4da877831f4fb0c1c87c295792efae21c0c2bc1d8c9f97fb90f261a9e0cf/pyobjc_framework_usernotifications-12.0-cp313-cp313-macosx_10_13_universal2.whl", hash = "sha256:fcff4a99268ed3d4d897d061d085188695cd2ad0fe63e16319a7ecbd1af7ddc3", size = 9664, upload-time = "2025-10-21T08:23:33.313Z" }, + { url = "https://files.pythonhosted.org/packages/88/3b/786b4bdbdf67776d625c3bb575f5cbecde868c7ba9840ea1c3bd33670743/pyobjc_framework_usernotifications-12.0-cp313-cp313t-macosx_10_13_universal2.whl", hash = "sha256:73898e126ee61d429d160e5de5f8f10bf08406e5fbb0a43939d32ebc02f7c165", size = 9819, upload-time = "2025-10-21T08:23:35.238Z" }, + { url = "https://files.pythonhosted.org/packages/f1/58/f6d3cc17d500cb8c4716dad03da5978029483b2794d6d8e06c4d290091bb/pyobjc_framework_usernotifications-12.0-cp314-cp314-macosx_10_15_universal2.whl", hash = "sha256:162802f84c95c63bd0962add355bfcdc56539e7ac3972f002e13f9c4168e7730", size = 9727, upload-time = "2025-10-21T08:23:36.853Z" }, + { url = "https://files.pythonhosted.org/packages/b6/2e/b0c414798b557dae3c142879fd2c39dbb672e2820ce6ea40ebce83327130/pyobjc_framework_usernotifications-12.0-cp314-cp314t-macosx_10_15_universal2.whl", hash = "sha256:6a0da8999950a22643f6fdf294d969a082354bbae2f9e2ee2dfbbf5596c05074", size = 9889, upload-time = "2025-10-21T08:23:38.467Z" }, +] + +[[package]] +name = "pyobjc-framework-usernotificationsui" +version = "12.0" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "pyobjc-core" }, + { name = "pyobjc-framework-cocoa" }, + { name = "pyobjc-framework-usernotifications" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/aa/07/e7564e9948ad5e834c394cb8b3cfba51312715a91f1cb0e01a9dcf8f5bc5/pyobjc_framework_usernotificationsui-12.0.tar.gz", hash = "sha256:b62eed9660a3b824dd732fca831f111b888af912c8608e0fe7e075de217274b8", size = 13148, upload-time = "2025-10-21T08:41:38.228Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/52/0f/79602271972bd1060e1ad24973d005be7984f7687278d4b2489021fe0f20/pyobjc_framework_usernotificationsui-12.0-py2.py3-none-any.whl", hash = "sha256:ab0d9fc8e9505daf15e089837125bedf9aec5fa5c49ba0ec91305fab3233977f", size = 3944, upload-time = "2025-10-21T08:23:39.959Z" }, +] + +[[package]] +name = "pyobjc-framework-videosubscriberaccount" +version = "12.0" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "pyobjc-core" }, + { name = "pyobjc-framework-cocoa" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/1e/0f/ad63ee1b7b0813dd6505b210f90b9cd39d1e9b5a994c2e2d81e34ce045b0/pyobjc_framework_videosubscriberaccount-12.0.tar.gz", hash = "sha256:45ded32cd5d75323a3c9a692fe0f47fdda3885f16d84c0195908bfe0708db9e3", size = 18836, upload-time = "2025-10-21T08:41:40.268Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/b2/be/ff8942932b0ffe180b7f64fd15fb8503b846040af5a7aceae33a831f0aa3/pyobjc_framework_videosubscriberaccount-12.0-py2.py3-none-any.whl", hash = "sha256:18a495d747252712b65235f98459fec139966060a269eebf55cd56d159640663", size = 4834, upload-time = "2025-10-21T08:23:41.471Z" }, +] + +[[package]] +name = "pyobjc-framework-videotoolbox" +version = "12.0" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "pyobjc-core" }, + { name = "pyobjc-framework-cocoa" }, + { name = "pyobjc-framework-coremedia" }, + { name = "pyobjc-framework-quartz" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/d7/2f/f85731e4f2ce2c67545dfbe2fbdd1b776b6e2d58e354a4037a2e59803fa0/pyobjc_framework_videotoolbox-12.0.tar.gz", hash = "sha256:69677923fa61fd2ca5acadb404e4be87185cd52946681764986bc43635d27674", size = 58211, upload-time = "2025-10-21T08:41:45.146Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/48/5a/2ea252b95489dcba67c0d22fb60d0969b39cae595f304157ec69da30e976/pyobjc_framework_videotoolbox-12.0-cp313-cp313-macosx_10_13_universal2.whl", hash = "sha256:f45d91996796c5d6398205b3e00c6cf651d67e503158ea6e53c9de01901f8ac4", size = 18936, upload-time = "2025-10-21T08:23:51.474Z" }, + { url = "https://files.pythonhosted.org/packages/c7/4a/138107dc891093ab36b4fc0886259286c23af15004ac0f154824d5680d0c/pyobjc_framework_videotoolbox-12.0-cp313-cp313t-macosx_10_13_universal2.whl", hash = "sha256:17eefbcee1a2e1d74bec281b1995c2dc2017c3c40f1cbaeb69cb6258bbc79feb", size = 19149, upload-time = "2025-10-21T08:23:54.003Z" }, + { url = "https://files.pythonhosted.org/packages/8e/5f/1cb3a83b3de3d0de059b9abbd68f936d53949b42b961a453ec688b361163/pyobjc_framework_videotoolbox-12.0-cp314-cp314-macosx_10_15_universal2.whl", hash = "sha256:f11ec3534dcc02b556232643d53ba62a07fef2de2ff3ff83409290888ed04fa8", size = 18940, upload-time = "2025-10-21T08:23:56.163Z" }, + { url = "https://files.pythonhosted.org/packages/f5/c1/35c68277fbc62daee074fc1ae6f43b27ecd2d840d9a24f43116f854fe3bd/pyobjc_framework_videotoolbox-12.0-cp314-cp314t-macosx_10_15_universal2.whl", hash = "sha256:84817ba1912935262852ca7d8687e3e4bd5e5db55fd62c4d54be35b7657ccb2d", size = 19138, upload-time = "2025-10-21T08:23:58.354Z" }, +] + +[[package]] +name = "pyobjc-framework-virtualization" +version = "12.0" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "pyobjc-core" }, + { name = "pyobjc-framework-cocoa" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/e6/53/cdba247e9b8252407757edd2e1a7f166b1c8e7a6edf54fc57aa55ca3e0b4/pyobjc_framework_virtualization-12.0.tar.gz", hash = "sha256:0745f57ab3010f10c6e7a424cbfc805f162167687756cce7ef220d1a4fc192cc", size = 41136, upload-time = "2025-10-21T08:41:48.764Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/a3/7b/c5a230ce374334c896bdc6db95586f7a1211d3ff45831175e441a262cb9a/pyobjc_framework_virtualization-12.0-cp313-cp313-macosx_10_13_universal2.whl", hash = "sha256:385baa7b4ff44b1368ab32ad91ec05e667abc687800e3362ad4463d4f81db715", size = 13159, upload-time = "2025-10-21T08:24:06.418Z" }, + { url = "https://files.pythonhosted.org/packages/9e/92/ffff716de121c4077490098b11921580b438b98c05184ab9d54987e16162/pyobjc_framework_virtualization-12.0-cp313-cp313t-macosx_10_13_universal2.whl", hash = "sha256:7a446087e0806ddf6d09560e80e8b06b79b8039e4abbd6cfca32b9f07736d42e", size = 13365, upload-time = "2025-10-21T08:24:08.338Z" }, + { url = "https://files.pythonhosted.org/packages/41/17/1e1bc10ddd32eb63902b2aebe5f12f32fe82660ae96911ebe9d4a5668b89/pyobjc_framework_virtualization-12.0-cp314-cp314-macosx_10_15_universal2.whl", hash = "sha256:65fbcf184964b52fd60e821c5b2a173fd87d1e4a50afcccfbd3dc909019e1d50", size = 13148, upload-time = "2025-10-21T08:24:10.135Z" }, + { url = "https://files.pythonhosted.org/packages/ff/1f/8c51a1c0149b3a58d0217f516c573114746b701675e48fddab2d3aa29363/pyobjc_framework_virtualization-12.0-cp314-cp314t-macosx_10_15_universal2.whl", hash = "sha256:27f27d5aa30dd94c6ad977c11af3d5bc13369950e497007534c1c951c2ca93b5", size = 13352, upload-time = "2025-10-21T08:24:12.335Z" }, +] + +[[package]] +name = "pyobjc-framework-vision" +version = "12.0" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "pyobjc-core" }, + { name = "pyobjc-framework-cocoa" }, + { name = "pyobjc-framework-coreml" }, + { name = "pyobjc-framework-quartz" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/0f/5a/07cdead5adb77d0742b014fa742d503706754e3ad10e39760e67bb58b497/pyobjc_framework_vision-12.0.tar.gz", hash = "sha256:942c9583f1d887ac9f704f3b0c21b3206b68e02852a87219db4309bb13a02f14", size = 59905, upload-time = "2025-10-21T08:41:53.741Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/28/ed/eb94a75b58a9868a32b10cdb59faf0cd877341df80637d1e94beda3fe4e2/pyobjc_framework_vision-12.0-cp313-cp313-macosx_10_13_universal2.whl", hash = "sha256:10c580fcb19a82e19bcc02e782aaaf0cf8ea0d148b95282740e102223127de5a", size = 16646, upload-time = "2025-10-21T08:24:23.039Z" }, + { url = "https://files.pythonhosted.org/packages/62/69/fffcf849bec521d2d8440814c18f6a9865300136489a8c52c1902d10d117/pyobjc_framework_vision-12.0-cp313-cp313t-macosx_10_13_universal2.whl", hash = "sha256:12be79c5282a2cf53ac5b69f5edbd15f242d70a21629b728efcf68fc06fbe58b", size = 16790, upload-time = "2025-10-21T08:24:25.134Z" }, + { url = "https://files.pythonhosted.org/packages/36/22/b2962283d4d90efee7ecee0712963810ac02fd08646f6f0ec11fb2e23c47/pyobjc_framework_vision-12.0-cp314-cp314-macosx_10_15_universal2.whl", hash = "sha256:56aae4cb8dd72838c22450c1adc8b5acd2bba9138e116a651e910c4e24293ad9", size = 16623, upload-time = "2025-10-21T08:24:27.463Z" }, + { url = "https://files.pythonhosted.org/packages/94/d2/bc004c6c0a16b2a4eef6a7964ea3f712014c0a94c4ceb9ddaba0c6e2d72c/pyobjc_framework_vision-12.0-cp314-cp314t-macosx_10_15_universal2.whl", hash = "sha256:177c996e547a581f7c3ac2502325c1af6db1edbe5f85e9297f5a76df2e33efbf", size = 16780, upload-time = "2025-10-21T08:24:29.75Z" }, +] + +[[package]] +name = "pyobjc-framework-webkit" +version = "12.0" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "pyobjc-core" }, + { name = "pyobjc-framework-cocoa" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/80/6a/9af14df620fd363e58d3676d7182060672f3eace49df78fc36ddbce9b820/pyobjc_framework_webkit-12.0.tar.gz", hash = "sha256:a65a33d7057aed8d096672be4a53a7ea49a7c74a0b4bc9cb216d4773ebfed6d2", size = 284938, upload-time = "2025-10-21T08:42:12.645Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/19/0b/3897b36ce88ac1201662ffb4373579e9cd477715ca55c197f2cb3c4216ed/pyobjc_framework_webkit-12.0-cp313-cp313-macosx_10_13_universal2.whl", hash = "sha256:46fd5e0d8aa3bc57a614dc60eef768abf715cdd873682aadd09df6ee8d31fcda", size = 50104, upload-time = "2025-10-21T08:24:46.981Z" }, + { url = "https://files.pythonhosted.org/packages/f9/b9/0d35364f44a0a70b42a536dae503a913a2fef1acd81f9ae4567536b82ac3/pyobjc_framework_webkit-12.0-cp313-cp313t-macosx_10_13_universal2.whl", hash = "sha256:c933ccbdfecdfe3217e32883fa365c3b2cfad601eb25c0a3aee00043aca838fb", size = 50576, upload-time = "2025-10-21T08:24:51.14Z" }, + { url = "https://files.pythonhosted.org/packages/12/e1/dfd6bb0f92e24dec90192c3a10109c99eac8d49f517a1e135d9065daed26/pyobjc_framework_webkit-12.0-cp314-cp314-macosx_10_15_universal2.whl", hash = "sha256:bdae2a612d20a4c9038eb7fea2d3a8e1bbb2b21b758d871fb210f8ff1b9d240b", size = 50220, upload-time = "2025-10-21T08:24:55.483Z" }, + { url = "https://files.pythonhosted.org/packages/d9/32/bf22675cd9cde637cb0ec0f7eae8a19d5375cd07448d98e288e9d0798962/pyobjc_framework_webkit-12.0-cp314-cp314t-macosx_10_15_universal2.whl", hash = "sha256:8db8db7f9225718ec578788b21d56e55560019a158592d17c784f1550612261a", size = 50687, upload-time = "2025-10-21T08:24:59.701Z" }, +] + +[[package]] +name = "pyotp" +version = "2.9.0" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/f3/b2/1d5994ba2acde054a443bd5e2d384175449c7d2b6d1a0614dbca3a63abfc/pyotp-2.9.0.tar.gz", hash = "sha256:346b6642e0dbdde3b4ff5a930b664ca82abfa116356ed48cc42c7d6590d36f63", size = 17763, upload-time = "2023-07-27T23:41:03.295Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/c3/c0/c33c8792c3e50193ef55adb95c1c3c2786fe281123291c2dbf0eaab95a6f/pyotp-2.9.0-py3-none-any.whl", hash = "sha256:81c2e5865b8ac55e825b0358e496e1d9387c811e85bb40e71a3b29b288963612", size = 13376, upload-time = "2023-07-27T23:41:01.685Z" }, +] + +[[package]] +name = "pyparsing" +version = "3.2.5" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/f2/a5/181488fc2b9d093e3972d2a472855aae8a03f000592dbfce716a512b3359/pyparsing-3.2.5.tar.gz", hash = "sha256:2df8d5b7b2802ef88e8d016a2eb9c7aeaa923529cd251ed0fe4608275d4105b6", size = 1099274, upload-time = "2025-09-21T04:11:06.277Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/10/5e/1aa9a93198c6b64513c9d7752de7422c06402de6600a8767da1524f9570b/pyparsing-3.2.5-py3-none-any.whl", hash = "sha256:e38a4f02064cf41fe6593d328d0512495ad1f3d8a91c4f73fc401b3079a59a5e", size = 113890, upload-time = "2025-09-21T04:11:04.117Z" }, +] + +[[package]] +name = "pypdf" +version = "6.1.3" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/13/3d/b6ead84ee437444f96862beb68f9796da8c199793bed08e9397b77579f23/pypdf-6.1.3.tar.gz", hash = "sha256:8d420d1e79dc1743f31a57707cabb6dcd5b17e8b9a302af64b30202c5700ab9d", size = 5076271, upload-time = "2025-10-22T16:13:46.061Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/fa/ed/494fd0cc1190a7c335e6958eeaee6f373a281869830255c2ed4785dac135/pypdf-6.1.3-py3-none-any.whl", hash = "sha256:eb049195e46f014fc155f566fa20e09d70d4646a9891164ac25fa0cbcfcdbcb5", size = 323863, upload-time = "2025-10-22T16:13:44.174Z" }, +] + +[[package]] +name = "python-dateutil" +version = "2.9.0.post0" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "six" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/66/c0/0c8b6ad9f17a802ee498c46e004a0eb49bc148f2fd230864601a86dcf6db/python-dateutil-2.9.0.post0.tar.gz", hash = "sha256:37dd54208da7e1cd875388217d5e00ebd4179249f90fb72437e91a35459a0ad3", size = 342432, upload-time = "2024-03-01T18:36:20.211Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/ec/57/56b9bcc3c9c6a792fcbaf139543cee77261f3651ca9da0c93f5c1221264b/python_dateutil-2.9.0.post0-py2.py3-none-any.whl", hash = "sha256:a8b2bc7bffae282281c8140a97d3aa9c14da0b136dfe83f850eea9a5f7470427", size = 229892, upload-time = "2024-03-01T18:36:18.57Z" }, +] + +[[package]] +name = "python-dotenv" +version = "1.1.1" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/f6/b0/4bc07ccd3572a2f9df7e6782f52b0c6c90dcbb803ac4a167702d7d0dfe1e/python_dotenv-1.1.1.tar.gz", hash = "sha256:a8a6399716257f45be6a007360200409fce5cda2661e3dec71d23dc15f6189ab", size = 41978, upload-time = "2025-06-24T04:21:07.341Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/5f/ed/539768cf28c661b5b068d66d96a2f155c4971a5d55684a514c1a0e0dec2f/python_dotenv-1.1.1-py3-none-any.whl", hash = "sha256:31f23644fe2602f88ff55e1f5c79ba497e01224ee7737937930c448e4d0e24dc", size = 20556, upload-time = "2025-06-24T04:21:06.073Z" }, +] + +[[package]] +name = "python-multipart" +version = "0.0.20" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/f3/87/f44d7c9f274c7ee665a29b885ec97089ec5dc034c7f3fafa03da9e39a09e/python_multipart-0.0.20.tar.gz", hash = "sha256:8dd0cab45b8e23064ae09147625994d090fa46f5b0d1e13af944c331a7fa9d13", size = 37158, upload-time = "2024-12-16T19:45:46.972Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/45/58/38b5afbc1a800eeea951b9285d3912613f2603bdf897a4ab0f4bd7f405fc/python_multipart-0.0.20-py3-none-any.whl", hash = "sha256:8a62d3a8335e06589fe01f2a3e178cdcc632f3fbe0d492ad9ee0ec35aab1f104", size = 24546, upload-time = "2024-12-16T19:45:44.423Z" }, +] + +[[package]] +name = "pywin32" +version = "311" +source = { registry = "https://pypi.org/simple" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/a5/be/3fd5de0979fcb3994bfee0d65ed8ca9506a8a1260651b86174f6a86f52b3/pywin32-311-cp313-cp313-win32.whl", hash = "sha256:f95ba5a847cba10dd8c4d8fefa9f2a6cf283b8b88ed6178fa8a6c1ab16054d0d", size = 8705700, upload-time = "2025-07-14T20:13:26.471Z" }, + { url = "https://files.pythonhosted.org/packages/e3/28/e0a1909523c6890208295a29e05c2adb2126364e289826c0a8bc7297bd5c/pywin32-311-cp313-cp313-win_amd64.whl", hash = "sha256:718a38f7e5b058e76aee1c56ddd06908116d35147e133427e59a3983f703a20d", size = 9494700, upload-time = "2025-07-14T20:13:28.243Z" }, + { url = "https://files.pythonhosted.org/packages/04/bf/90339ac0f55726dce7d794e6d79a18a91265bdf3aa70b6b9ca52f35e022a/pywin32-311-cp313-cp313-win_arm64.whl", hash = "sha256:7b4075d959648406202d92a2310cb990fea19b535c7f4a78d3f5e10b926eeb8a", size = 8709318, upload-time = "2025-07-14T20:13:30.348Z" }, + { url = "https://files.pythonhosted.org/packages/c9/31/097f2e132c4f16d99a22bfb777e0fd88bd8e1c634304e102f313af69ace5/pywin32-311-cp314-cp314-win32.whl", hash = "sha256:b7a2c10b93f8986666d0c803ee19b5990885872a7de910fc460f9b0c2fbf92ee", size = 8840714, upload-time = "2025-07-14T20:13:32.449Z" }, + { url = "https://files.pythonhosted.org/packages/90/4b/07c77d8ba0e01349358082713400435347df8426208171ce297da32c313d/pywin32-311-cp314-cp314-win_amd64.whl", hash = "sha256:3aca44c046bd2ed8c90de9cb8427f581c479e594e99b5c0bb19b29c10fd6cb87", size = 9656800, upload-time = "2025-07-14T20:13:34.312Z" }, + { url = "https://files.pythonhosted.org/packages/c0/d2/21af5c535501a7233e734b8af901574572da66fcc254cb35d0609c9080dd/pywin32-311-cp314-cp314-win_arm64.whl", hash = "sha256:a508e2d9025764a8270f93111a970e1d0fbfc33f4153b388bb649b7eec4f9b42", size = 8932540, upload-time = "2025-07-14T20:13:36.379Z" }, +] + +[[package]] +name = "referencing" +version = "0.37.0" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "attrs" }, + { name = "rpds-py" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/22/f5/df4e9027acead3ecc63e50fe1e36aca1523e1719559c499951bb4b53188f/referencing-0.37.0.tar.gz", hash = "sha256:44aefc3142c5b842538163acb373e24cce6632bd54bdb01b21ad5863489f50d8", size = 78036, upload-time = "2025-10-13T15:30:48.871Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/2c/58/ca301544e1fa93ed4f80d724bf5b194f6e4b945841c5bfd555878eea9fcb/referencing-0.37.0-py3-none-any.whl", hash = "sha256:381329a9f99628c9069361716891d34ad94af76e461dcb0335825aecc7692231", size = 26766, upload-time = "2025-10-13T15:30:47.625Z" }, +] + +[[package]] +name = "reportlab" +version = "4.4.4" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "charset-normalizer" }, + { name = "pillow" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/f8/fa/ed71f3e750afb77497641eb0194aeda069e271ce6d6931140f8787e0e69a/reportlab-4.4.4.tar.gz", hash = "sha256:cb2f658b7f4a15be2cc68f7203aa67faef67213edd4f2d4bdd3eb20dab75a80d", size = 3711935, upload-time = "2025-09-19T10:43:36.502Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/57/66/e040586fe6f9ae7f3a6986186653791fb865947f0b745290ee4ab026b834/reportlab-4.4.4-py3-none-any.whl", hash = "sha256:299b3b0534e7202bb94ed2ddcd7179b818dcda7de9d8518a57c85a58a1ebaadb", size = 1954981, upload-time = "2025-09-19T10:43:33.589Z" }, +] + +[[package]] +name = "requests" +version = "2.32.5" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "certifi" }, + { name = "charset-normalizer" }, + { name = "idna" }, + { name = "urllib3" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/c9/74/b3ff8e6c8446842c3f5c837e9c3dfcfe2018ea6ecef224c710c85ef728f4/requests-2.32.5.tar.gz", hash = "sha256:dbba0bac56e100853db0ea71b82b4dfd5fe2bf6d3754a8893c3af500cec7d7cf", size = 134517, upload-time = "2025-08-18T20:46:02.573Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/1e/db/4254e3eabe8020b458f1a747140d32277ec7a271daf1d235b70dc0b4e6e3/requests-2.32.5-py3-none-any.whl", hash = "sha256:2462f94637a34fd532264295e186976db0f5d453d1cdd31473c85a6a161affb6", size = 64738, upload-time = "2025-08-18T20:46:00.542Z" }, +] + +[[package]] +name = "requests-oauthlib" +version = "2.0.0" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "oauthlib" }, + { name = "requests" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/42/f2/05f29bc3913aea15eb670be136045bf5c5bbf4b99ecb839da9b422bb2c85/requests-oauthlib-2.0.0.tar.gz", hash = "sha256:b3dffaebd884d8cd778494369603a9e7b58d29111bf6b41bdc2dcd87203af4e9", size = 55650, upload-time = "2024-03-22T20:32:29.939Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/3b/5d/63d4ae3b9daea098d5d6f5da83984853c1bbacd5dc826764b249fe119d24/requests_oauthlib-2.0.0-py2.py3-none-any.whl", hash = "sha256:7dd8a5c40426b779b0868c404bdef9768deccf22749cde15852df527e6269b36", size = 24179, upload-time = "2024-03-22T20:32:28.055Z" }, +] + +[[package]] +name = "rpds-py" +version = "0.28.0" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/48/dc/95f074d43452b3ef5d06276696ece4b3b5d696e7c9ad7173c54b1390cd70/rpds_py-0.28.0.tar.gz", hash = "sha256:abd4df20485a0983e2ca334a216249b6186d6e3c1627e106651943dbdb791aea", size = 27419, upload-time = "2025-10-22T22:24:29.327Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/d3/03/ce566d92611dfac0085c2f4b048cd53ed7c274a5c05974b882a908d540a2/rpds_py-0.28.0-cp313-cp313-macosx_10_12_x86_64.whl", hash = "sha256:e9e184408a0297086f880556b6168fa927d677716f83d3472ea333b42171ee3b", size = 366235, upload-time = "2025-10-22T22:22:28.397Z" }, + { url = "https://files.pythonhosted.org/packages/00/34/1c61da1b25592b86fd285bd7bd8422f4c9d748a7373b46126f9ae792a004/rpds_py-0.28.0-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:edd267266a9b0448f33dc465a97cfc5d467594b600fe28e7fa2f36450e03053a", size = 348241, upload-time = "2025-10-22T22:22:30.171Z" }, + { url = "https://files.pythonhosted.org/packages/fc/00/ed1e28616848c61c493a067779633ebf4b569eccaacf9ccbdc0e7cba2b9d/rpds_py-0.28.0-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:85beb8b3f45e4e32f6802fb6cd6b17f615ef6c6a52f265371fb916fae02814aa", size = 378079, upload-time = "2025-10-22T22:22:31.644Z" }, + { url = "https://files.pythonhosted.org/packages/11/b2/ccb30333a16a470091b6e50289adb4d3ec656fd9951ba8c5e3aaa0746a67/rpds_py-0.28.0-cp313-cp313-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:d2412be8d00a1b895f8ad827cc2116455196e20ed994bb704bf138fe91a42724", size = 393151, upload-time = "2025-10-22T22:22:33.453Z" }, + { url = "https://files.pythonhosted.org/packages/8c/d0/73e2217c3ee486d555cb84920597480627d8c0240ff3062005c6cc47773e/rpds_py-0.28.0-cp313-cp313-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:cf128350d384b777da0e68796afdcebc2e9f63f0e9f242217754e647f6d32491", size = 517520, upload-time = "2025-10-22T22:22:34.949Z" }, + { url = "https://files.pythonhosted.org/packages/c4/91/23efe81c700427d0841a4ae7ea23e305654381831e6029499fe80be8a071/rpds_py-0.28.0-cp313-cp313-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:a2036d09b363aa36695d1cc1a97b36865597f4478470b0697b5ee9403f4fe399", size = 408699, upload-time = "2025-10-22T22:22:36.584Z" }, + { url = "https://files.pythonhosted.org/packages/ca/ee/a324d3198da151820a326c1f988caaa4f37fc27955148a76fff7a2d787a9/rpds_py-0.28.0-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:b8e1e9be4fa6305a16be628959188e4fd5cd6f1b0e724d63c6d8b2a8adf74ea6", size = 385720, upload-time = "2025-10-22T22:22:38.014Z" }, + { url = "https://files.pythonhosted.org/packages/19/ad/e68120dc05af8b7cab4a789fccd8cdcf0fe7e6581461038cc5c164cd97d2/rpds_py-0.28.0-cp313-cp313-manylinux_2_31_riscv64.whl", hash = "sha256:0a403460c9dd91a7f23fc3188de6d8977f1d9603a351d5db6cf20aaea95b538d", size = 401096, upload-time = "2025-10-22T22:22:39.869Z" }, + { url = "https://files.pythonhosted.org/packages/99/90/c1e070620042459d60df6356b666bb1f62198a89d68881816a7ed121595a/rpds_py-0.28.0-cp313-cp313-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:d7366b6553cdc805abcc512b849a519167db8f5e5c3472010cd1228b224265cb", size = 411465, upload-time = "2025-10-22T22:22:41.395Z" }, + { url = "https://files.pythonhosted.org/packages/68/61/7c195b30d57f1b8d5970f600efee72a4fad79ec829057972e13a0370fd24/rpds_py-0.28.0-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:5b43c6a3726efd50f18d8120ec0551241c38785b68952d240c45ea553912ac41", size = 558832, upload-time = "2025-10-22T22:22:42.871Z" }, + { url = "https://files.pythonhosted.org/packages/b0/3d/06f3a718864773f69941d4deccdf18e5e47dd298b4628062f004c10f3b34/rpds_py-0.28.0-cp313-cp313-musllinux_1_2_i686.whl", hash = "sha256:0cb7203c7bc69d7c1585ebb33a2e6074492d2fc21ad28a7b9d40457ac2a51ab7", size = 583230, upload-time = "2025-10-22T22:22:44.877Z" }, + { url = "https://files.pythonhosted.org/packages/66/df/62fc783781a121e77fee9a21ead0a926f1b652280a33f5956a5e7833ed30/rpds_py-0.28.0-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:7a52a5169c664dfb495882adc75c304ae1d50df552fbd68e100fdc719dee4ff9", size = 553268, upload-time = "2025-10-22T22:22:46.441Z" }, + { url = "https://files.pythonhosted.org/packages/84/85/d34366e335140a4837902d3dea89b51f087bd6a63c993ebdff59e93ee61d/rpds_py-0.28.0-cp313-cp313-win32.whl", hash = "sha256:2e42456917b6687215b3e606ab46aa6bca040c77af7df9a08a6dcfe8a4d10ca5", size = 217100, upload-time = "2025-10-22T22:22:48.342Z" }, + { url = "https://files.pythonhosted.org/packages/3c/1c/f25a3f3752ad7601476e3eff395fe075e0f7813fbb9862bd67c82440e880/rpds_py-0.28.0-cp313-cp313-win_amd64.whl", hash = "sha256:e0a0311caedc8069d68fc2bf4c9019b58a2d5ce3cd7cb656c845f1615b577e1e", size = 227759, upload-time = "2025-10-22T22:22:50.219Z" }, + { url = "https://files.pythonhosted.org/packages/e0/d6/5f39b42b99615b5bc2f36ab90423ea404830bdfee1c706820943e9a645eb/rpds_py-0.28.0-cp313-cp313-win_arm64.whl", hash = "sha256:04c1b207ab8b581108801528d59ad80aa83bb170b35b0ddffb29c20e411acdc1", size = 217326, upload-time = "2025-10-22T22:22:51.647Z" }, + { url = "https://files.pythonhosted.org/packages/5c/8b/0c69b72d1cee20a63db534be0df271effe715ef6c744fdf1ff23bb2b0b1c/rpds_py-0.28.0-cp313-cp313t-macosx_10_12_x86_64.whl", hash = "sha256:f296ea3054e11fc58ad42e850e8b75c62d9a93a9f981ad04b2e5ae7d2186ff9c", size = 355736, upload-time = "2025-10-22T22:22:53.211Z" }, + { url = "https://files.pythonhosted.org/packages/f7/6d/0c2ee773cfb55c31a8514d2cece856dd299170a49babd50dcffb15ddc749/rpds_py-0.28.0-cp313-cp313t-macosx_11_0_arm64.whl", hash = "sha256:5a7306c19b19005ad98468fcefeb7100b19c79fc23a5f24a12e06d91181193fa", size = 342677, upload-time = "2025-10-22T22:22:54.723Z" }, + { url = "https://files.pythonhosted.org/packages/e2/1c/22513ab25a27ea205144414724743e305e8153e6abe81833b5e678650f5a/rpds_py-0.28.0-cp313-cp313t-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:e5d9b86aa501fed9862a443c5c3116f6ead8bc9296185f369277c42542bd646b", size = 371847, upload-time = "2025-10-22T22:22:56.295Z" }, + { url = "https://files.pythonhosted.org/packages/60/07/68e6ccdb4b05115ffe61d31afc94adef1833d3a72f76c9632d4d90d67954/rpds_py-0.28.0-cp313-cp313t-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:e5bbc701eff140ba0e872691d573b3d5d30059ea26e5785acba9132d10c8c31d", size = 381800, upload-time = "2025-10-22T22:22:57.808Z" }, + { url = "https://files.pythonhosted.org/packages/73/bf/6d6d15df80781d7f9f368e7c1a00caf764436518c4877fb28b029c4624af/rpds_py-0.28.0-cp313-cp313t-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:9a5690671cd672a45aa8616d7374fdf334a1b9c04a0cac3c854b1136e92374fe", size = 518827, upload-time = "2025-10-22T22:22:59.826Z" }, + { url = "https://files.pythonhosted.org/packages/7b/d3/2decbb2976cc452cbf12a2b0aaac5f1b9dc5dd9d1f7e2509a3ee00421249/rpds_py-0.28.0-cp313-cp313t-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:9f1d92ecea4fa12f978a367c32a5375a1982834649cdb96539dcdc12e609ab1a", size = 399471, upload-time = "2025-10-22T22:23:01.968Z" }, + { url = "https://files.pythonhosted.org/packages/b1/2c/f30892f9e54bd02e5faca3f6a26d6933c51055e67d54818af90abed9748e/rpds_py-0.28.0-cp313-cp313t-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:8d252db6b1a78d0a3928b6190156042d54c93660ce4d98290d7b16b5296fb7cc", size = 377578, upload-time = "2025-10-22T22:23:03.52Z" }, + { url = "https://files.pythonhosted.org/packages/f0/5d/3bce97e5534157318f29ac06bf2d279dae2674ec12f7cb9c12739cee64d8/rpds_py-0.28.0-cp313-cp313t-manylinux_2_31_riscv64.whl", hash = "sha256:d61b355c3275acb825f8777d6c4505f42b5007e357af500939d4a35b19177259", size = 390482, upload-time = "2025-10-22T22:23:05.391Z" }, + { url = "https://files.pythonhosted.org/packages/e3/f0/886bd515ed457b5bd93b166175edb80a0b21a210c10e993392127f1e3931/rpds_py-0.28.0-cp313-cp313t-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:acbe5e8b1026c0c580d0321c8aae4b0a1e1676861d48d6e8c6586625055b606a", size = 402447, upload-time = "2025-10-22T22:23:06.93Z" }, + { url = "https://files.pythonhosted.org/packages/42/b5/71e8777ac55e6af1f4f1c05b47542a1eaa6c33c1cf0d300dca6a1c6e159a/rpds_py-0.28.0-cp313-cp313t-musllinux_1_2_aarch64.whl", hash = "sha256:8aa23b6f0fc59b85b4c7d89ba2965af274346f738e8d9fc2455763602e62fd5f", size = 552385, upload-time = "2025-10-22T22:23:08.557Z" }, + { url = "https://files.pythonhosted.org/packages/5d/cb/6ca2d70cbda5a8e36605e7788c4aa3bea7c17d71d213465a5a675079b98d/rpds_py-0.28.0-cp313-cp313t-musllinux_1_2_i686.whl", hash = "sha256:7b14b0c680286958817c22d76fcbca4800ddacef6f678f3a7c79a1fe7067fe37", size = 575642, upload-time = "2025-10-22T22:23:10.348Z" }, + { url = "https://files.pythonhosted.org/packages/4a/d4/407ad9960ca7856d7b25c96dcbe019270b5ffdd83a561787bc682c797086/rpds_py-0.28.0-cp313-cp313t-musllinux_1_2_x86_64.whl", hash = "sha256:bcf1d210dfee61a6c86551d67ee1031899c0fdbae88b2d44a569995d43797712", size = 544507, upload-time = "2025-10-22T22:23:12.434Z" }, + { url = "https://files.pythonhosted.org/packages/51/31/2f46fe0efcac23fbf5797c6b6b7e1c76f7d60773e525cb65fcbc582ee0f2/rpds_py-0.28.0-cp313-cp313t-win32.whl", hash = "sha256:3aa4dc0fdab4a7029ac63959a3ccf4ed605fee048ba67ce89ca3168da34a1342", size = 205376, upload-time = "2025-10-22T22:23:13.979Z" }, + { url = "https://files.pythonhosted.org/packages/92/e4/15947bda33cbedfc134490a41841ab8870a72a867a03d4969d886f6594a2/rpds_py-0.28.0-cp313-cp313t-win_amd64.whl", hash = "sha256:7b7d9d83c942855e4fdcfa75d4f96f6b9e272d42fffcb72cd4bb2577db2e2907", size = 215907, upload-time = "2025-10-22T22:23:15.5Z" }, + { url = "https://files.pythonhosted.org/packages/08/47/ffe8cd7a6a02833b10623bf765fbb57ce977e9a4318ca0e8cf97e9c3d2b3/rpds_py-0.28.0-cp314-cp314-macosx_10_12_x86_64.whl", hash = "sha256:dcdcb890b3ada98a03f9f2bb108489cdc7580176cb73b4f2d789e9a1dac1d472", size = 353830, upload-time = "2025-10-22T22:23:17.03Z" }, + { url = "https://files.pythonhosted.org/packages/f9/9f/890f36cbd83a58491d0d91ae0db1702639edb33fb48eeb356f80ecc6b000/rpds_py-0.28.0-cp314-cp314-macosx_11_0_arm64.whl", hash = "sha256:f274f56a926ba2dc02976ca5b11c32855cbd5925534e57cfe1fda64e04d1add2", size = 341819, upload-time = "2025-10-22T22:23:18.57Z" }, + { url = "https://files.pythonhosted.org/packages/09/e3/921eb109f682aa24fb76207698fbbcf9418738f35a40c21652c29053f23d/rpds_py-0.28.0-cp314-cp314-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:4fe0438ac4a29a520ea94c8c7f1754cdd8feb1bc490dfda1bfd990072363d527", size = 373127, upload-time = "2025-10-22T22:23:20.216Z" }, + { url = "https://files.pythonhosted.org/packages/23/13/bce4384d9f8f4989f1a9599c71b7a2d877462e5fd7175e1f69b398f729f4/rpds_py-0.28.0-cp314-cp314-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:8a358a32dd3ae50e933347889b6af9a1bdf207ba5d1a3f34e1a38cd3540e6733", size = 382767, upload-time = "2025-10-22T22:23:21.787Z" }, + { url = "https://files.pythonhosted.org/packages/23/e1/579512b2d89a77c64ccef5a0bc46a6ef7f72ae0cf03d4b26dcd52e57ee0a/rpds_py-0.28.0-cp314-cp314-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:e80848a71c78aa328fefaba9c244d588a342c8e03bda518447b624ea64d1ff56", size = 517585, upload-time = "2025-10-22T22:23:23.699Z" }, + { url = "https://files.pythonhosted.org/packages/62/3c/ca704b8d324a2591b0b0adcfcaadf9c862375b11f2f667ac03c61b4fd0a6/rpds_py-0.28.0-cp314-cp314-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:f586db2e209d54fe177e58e0bc4946bea5fb0102f150b1b2f13de03e1f0976f8", size = 399828, upload-time = "2025-10-22T22:23:25.713Z" }, + { url = "https://files.pythonhosted.org/packages/da/37/e84283b9e897e3adc46b4c88bb3f6ec92a43bd4d2f7ef5b13459963b2e9c/rpds_py-0.28.0-cp314-cp314-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:5ae8ee156d6b586e4292491e885d41483136ab994e719a13458055bec14cf370", size = 375509, upload-time = "2025-10-22T22:23:27.32Z" }, + { url = "https://files.pythonhosted.org/packages/1a/c2/a980beab869d86258bf76ec42dec778ba98151f253a952b02fe36d72b29c/rpds_py-0.28.0-cp314-cp314-manylinux_2_31_riscv64.whl", hash = "sha256:a805e9b3973f7e27f7cab63a6b4f61d90f2e5557cff73b6e97cd5b8540276d3d", size = 392014, upload-time = "2025-10-22T22:23:29.332Z" }, + { url = "https://files.pythonhosted.org/packages/da/b5/b1d3c5f9d3fa5aeef74265f9c64de3c34a0d6d5cd3c81c8b17d5c8f10ed4/rpds_py-0.28.0-cp314-cp314-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:5d3fd16b6dc89c73a4da0b4ac8b12a7ecc75b2864b95c9e5afed8003cb50a728", size = 402410, upload-time = "2025-10-22T22:23:31.14Z" }, + { url = "https://files.pythonhosted.org/packages/74/ae/cab05ff08dfcc052afc73dcb38cbc765ffc86f94e966f3924cd17492293c/rpds_py-0.28.0-cp314-cp314-musllinux_1_2_aarch64.whl", hash = "sha256:6796079e5d24fdaba6d49bda28e2c47347e89834678f2bc2c1b4fc1489c0fb01", size = 553593, upload-time = "2025-10-22T22:23:32.834Z" }, + { url = "https://files.pythonhosted.org/packages/70/80/50d5706ea2a9bfc9e9c5f401d91879e7c790c619969369800cde202da214/rpds_py-0.28.0-cp314-cp314-musllinux_1_2_i686.whl", hash = "sha256:76500820c2af232435cbe215e3324c75b950a027134e044423f59f5b9a1ba515", size = 576925, upload-time = "2025-10-22T22:23:34.47Z" }, + { url = "https://files.pythonhosted.org/packages/ab/12/85a57d7a5855a3b188d024b099fd09c90db55d32a03626d0ed16352413ff/rpds_py-0.28.0-cp314-cp314-musllinux_1_2_x86_64.whl", hash = "sha256:bbdc5640900a7dbf9dd707fe6388972f5bbd883633eb68b76591044cfe346f7e", size = 542444, upload-time = "2025-10-22T22:23:36.093Z" }, + { url = "https://files.pythonhosted.org/packages/6c/65/10643fb50179509150eb94d558e8837c57ca8b9adc04bd07b98e57b48f8c/rpds_py-0.28.0-cp314-cp314-win32.whl", hash = "sha256:adc8aa88486857d2b35d75f0640b949759f79dc105f50aa2c27816b2e0dd749f", size = 207968, upload-time = "2025-10-22T22:23:37.638Z" }, + { url = "https://files.pythonhosted.org/packages/b4/84/0c11fe4d9aaea784ff4652499e365963222481ac647bcd0251c88af646eb/rpds_py-0.28.0-cp314-cp314-win_amd64.whl", hash = "sha256:66e6fa8e075b58946e76a78e69e1a124a21d9a48a5b4766d15ba5b06869d1fa1", size = 218876, upload-time = "2025-10-22T22:23:39.179Z" }, + { url = "https://files.pythonhosted.org/packages/0f/e0/3ab3b86ded7bb18478392dc3e835f7b754cd446f62f3fc96f4fe2aca78f6/rpds_py-0.28.0-cp314-cp314-win_arm64.whl", hash = "sha256:a6fe887c2c5c59413353b7c0caff25d0e566623501ccfff88957fa438a69377d", size = 212506, upload-time = "2025-10-22T22:23:40.755Z" }, + { url = "https://files.pythonhosted.org/packages/51/ec/d5681bb425226c3501eab50fc30e9d275de20c131869322c8a1729c7b61c/rpds_py-0.28.0-cp314-cp314t-macosx_10_12_x86_64.whl", hash = "sha256:7a69df082db13c7070f7b8b1f155fa9e687f1d6aefb7b0e3f7231653b79a067b", size = 355433, upload-time = "2025-10-22T22:23:42.259Z" }, + { url = "https://files.pythonhosted.org/packages/be/ec/568c5e689e1cfb1ea8b875cffea3649260955f677fdd7ddc6176902d04cd/rpds_py-0.28.0-cp314-cp314t-macosx_11_0_arm64.whl", hash = "sha256:b1cde22f2c30ebb049a9e74c5374994157b9b70a16147d332f89c99c5960737a", size = 342601, upload-time = "2025-10-22T22:23:44.372Z" }, + { url = "https://files.pythonhosted.org/packages/32/fe/51ada84d1d2a1d9d8f2c902cfddd0133b4a5eb543196ab5161d1c07ed2ad/rpds_py-0.28.0-cp314-cp314t-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:5338742f6ba7a51012ea470bd4dc600a8c713c0c72adaa0977a1b1f4327d6592", size = 372039, upload-time = "2025-10-22T22:23:46.025Z" }, + { url = "https://files.pythonhosted.org/packages/07/c1/60144a2f2620abade1a78e0d91b298ac2d9b91bc08864493fa00451ef06e/rpds_py-0.28.0-cp314-cp314t-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:e1460ebde1bcf6d496d80b191d854adedcc619f84ff17dc1c6d550f58c9efbba", size = 382407, upload-time = "2025-10-22T22:23:48.098Z" }, + { url = "https://files.pythonhosted.org/packages/45/ed/091a7bbdcf4038a60a461df50bc4c82a7ed6d5d5e27649aab61771c17585/rpds_py-0.28.0-cp314-cp314t-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:e3eb248f2feba84c692579257a043a7699e28a77d86c77b032c1d9fbb3f0219c", size = 518172, upload-time = "2025-10-22T22:23:50.16Z" }, + { url = "https://files.pythonhosted.org/packages/54/dd/02cc90c2fd9c2ef8016fd7813bfacd1c3a1325633ec8f244c47b449fc868/rpds_py-0.28.0-cp314-cp314t-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:bd3bbba5def70b16cd1c1d7255666aad3b290fbf8d0fe7f9f91abafb73611a91", size = 399020, upload-time = "2025-10-22T22:23:51.81Z" }, + { url = "https://files.pythonhosted.org/packages/ab/81/5d98cc0329bbb911ccecd0b9e19fbf7f3a5de8094b4cda5e71013b2dd77e/rpds_py-0.28.0-cp314-cp314t-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:3114f4db69ac5a1f32e7e4d1cbbe7c8f9cf8217f78e6e002cedf2d54c2a548ed", size = 377451, upload-time = "2025-10-22T22:23:53.711Z" }, + { url = "https://files.pythonhosted.org/packages/b4/07/4d5bcd49e3dfed2d38e2dcb49ab6615f2ceb9f89f5a372c46dbdebb4e028/rpds_py-0.28.0-cp314-cp314t-manylinux_2_31_riscv64.whl", hash = "sha256:4b0cb8a906b1a0196b863d460c0222fb8ad0f34041568da5620f9799b83ccf0b", size = 390355, upload-time = "2025-10-22T22:23:55.299Z" }, + { url = "https://files.pythonhosted.org/packages/3f/79/9f14ba9010fee74e4f40bf578735cfcbb91d2e642ffd1abe429bb0b96364/rpds_py-0.28.0-cp314-cp314t-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:cf681ac76a60b667106141e11a92a3330890257e6f559ca995fbb5265160b56e", size = 403146, upload-time = "2025-10-22T22:23:56.929Z" }, + { url = "https://files.pythonhosted.org/packages/39/4c/f08283a82ac141331a83a40652830edd3a4a92c34e07e2bbe00baaea2f5f/rpds_py-0.28.0-cp314-cp314t-musllinux_1_2_aarch64.whl", hash = "sha256:1e8ee6413cfc677ce8898d9cde18cc3a60fc2ba756b0dec5b71eb6eb21c49fa1", size = 552656, upload-time = "2025-10-22T22:23:58.62Z" }, + { url = "https://files.pythonhosted.org/packages/61/47/d922fc0666f0dd8e40c33990d055f4cc6ecff6f502c2d01569dbed830f9b/rpds_py-0.28.0-cp314-cp314t-musllinux_1_2_i686.whl", hash = "sha256:b3072b16904d0b5572a15eb9d31c1954e0d3227a585fc1351aa9878729099d6c", size = 576782, upload-time = "2025-10-22T22:24:00.312Z" }, + { url = "https://files.pythonhosted.org/packages/d3/0c/5bafdd8ccf6aa9d3bfc630cfece457ff5b581af24f46a9f3590f790e3df2/rpds_py-0.28.0-cp314-cp314t-musllinux_1_2_x86_64.whl", hash = "sha256:b670c30fd87a6aec281c3c9896d3bae4b205fd75d79d06dc87c2503717e46092", size = 544671, upload-time = "2025-10-22T22:24:02.297Z" }, + { url = "https://files.pythonhosted.org/packages/2c/37/dcc5d8397caa924988693519069d0beea077a866128719351a4ad95e82fc/rpds_py-0.28.0-cp314-cp314t-win32.whl", hash = "sha256:8014045a15b4d2b3476f0a287fcc93d4f823472d7d1308d47884ecac9e612be3", size = 205749, upload-time = "2025-10-22T22:24:03.848Z" }, + { url = "https://files.pythonhosted.org/packages/d7/69/64d43b21a10d72b45939a28961216baeb721cc2a430f5f7c3bfa21659a53/rpds_py-0.28.0-cp314-cp314t-win_amd64.whl", hash = "sha256:7a4e59c90d9c27c561eb3160323634a9ff50b04e4f7820600a2beb0ac90db578", size = 216233, upload-time = "2025-10-22T22:24:05.471Z" }, +] + +[[package]] +name = "rsa" +version = "4.9.1" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "pyasn1" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/da/8a/22b7beea3ee0d44b1916c0c1cb0ee3af23b700b6da9f04991899d0c555d4/rsa-4.9.1.tar.gz", hash = "sha256:e7bdbfdb5497da4c07dfd35530e1a902659db6ff241e39d9953cad06ebd0ae75", size = 29034, upload-time = "2025-04-16T09:51:18.218Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/64/8d/0133e4eb4beed9e425d9a98ed6e081a55d195481b7632472be1af08d2f6b/rsa-4.9.1-py3-none-any.whl", hash = "sha256:68635866661c6836b8d39430f97a996acbd61bfa49406748ea243539fe239762", size = 34696, upload-time = "2025-04-16T09:51:17.142Z" }, +] + +[[package]] +name = "screeninfo" +version = "0.8.1" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "cython", marker = "sys_platform == 'darwin'" }, + { name = "pyobjc-framework-cocoa", marker = "sys_platform == 'darwin'" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/ec/bb/e69e5e628d43f118e0af4fc063c20058faa8635c95a1296764acc8167e27/screeninfo-0.8.1.tar.gz", hash = "sha256:9983076bcc7e34402a1a9e4d7dabf3729411fd2abb3f3b4be7eba73519cd2ed1", size = 10666, upload-time = "2022-09-09T11:35:23.419Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/6e/bf/c5205d480307bef660e56544b9e3d7ff687da776abb30c9cb3f330887570/screeninfo-0.8.1-py3-none-any.whl", hash = "sha256:e97d6b173856edcfa3bd282f81deb528188aff14b11ec3e195584e7641be733c", size = 12907, upload-time = "2022-09-09T11:35:21.351Z" }, +] + +[[package]] +name = "six" +version = "1.17.0" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/94/e7/b2c673351809dca68a0e064b6af791aa332cf192da575fd474ed7d6f16a2/six-1.17.0.tar.gz", hash = "sha256:ff70335d468e7eb6ec65b95b99d3a2836546063f63acc5171de367e834932a81", size = 34031, upload-time = "2024-12-04T17:35:28.174Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/b7/ce/149a00dd41f10bc29e5921b496af8b574d8413afcd5e30dfa0ed46c2cc5e/six-1.17.0-py2.py3-none-any.whl", hash = "sha256:4721f391ed90541fddacab5acf947aa0d3dc7d27b2e1e8eda2be8970586c3274", size = 11050, upload-time = "2024-12-04T17:35:26.475Z" }, +] + +[[package]] +name = "sniffio" +version = "1.3.1" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/a2/87/a6771e1546d97e7e041b6ae58d80074f81b7d5121207425c964ddf5cfdbd/sniffio-1.3.1.tar.gz", hash = "sha256:f4324edc670a0f49750a81b895f35c3adb843cca46f0530f79fc1babb23789dc", size = 20372, upload-time = "2024-02-25T23:20:04.057Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/e9/44/75a9c9421471a6c4805dbf2356f7c181a29c1879239abab1ea2cc8f38b40/sniffio-1.3.1-py3-none-any.whl", hash = "sha256:2f6da418d1f1e0fddd844478f41680e794e6051915791a034ff65e5f100525a2", size = 10235, upload-time = "2024-02-25T23:20:01.196Z" }, +] + +[[package]] +name = "soupsieve" +version = "2.8" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/6d/e6/21ccce3262dd4889aa3332e5a119a3491a95e8f60939870a3a035aabac0d/soupsieve-2.8.tar.gz", hash = "sha256:e2dd4a40a628cb5f28f6d4b0db8800b8f581b65bb380b97de22ba5ca8d72572f", size = 103472, upload-time = "2025-08-27T15:39:51.78Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/14/a0/bb38d3b76b8cae341dad93a2dd83ab7462e6dbcdd84d43f54ee60a8dc167/soupsieve-2.8-py3-none-any.whl", hash = "sha256:0cc76456a30e20f5d7f2e14a98a4ae2ee4e5abdc7c5ea0aafe795f344bc7984c", size = 36679, upload-time = "2025-08-27T15:39:50.179Z" }, +] + +[[package]] +name = "sse-starlette" +version = "3.0.2" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "anyio" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/42/6f/22ed6e33f8a9e76ca0a412405f31abb844b779d52c5f96660766edcd737c/sse_starlette-3.0.2.tar.gz", hash = "sha256:ccd60b5765ebb3584d0de2d7a6e4f745672581de4f5005ab31c3a25d10b52b3a", size = 20985, upload-time = "2025-07-27T09:07:44.565Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/ef/10/c78f463b4ef22eef8491f218f692be838282cd65480f6e423d7730dfd1fb/sse_starlette-3.0.2-py3-none-any.whl", hash = "sha256:16b7cbfddbcd4eaca11f7b586f3b8a080f1afe952c15813455b162edea619e5a", size = 11297, upload-time = "2025-07-27T09:07:43.268Z" }, +] + +[[package]] +name = "starlette" +version = "0.48.0" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "anyio" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/a7/a5/d6f429d43394057b67a6b5bbe6eae2f77a6bf7459d961fdb224bf206eee6/starlette-0.48.0.tar.gz", hash = "sha256:7e8cee469a8ab2352911528110ce9088fdc6a37d9876926e73da7ce4aa4c7a46", size = 2652949, upload-time = "2025-09-13T08:41:05.699Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/be/72/2db2f49247d0a18b4f1bb9a5a39a0162869acf235f3a96418363947b3d46/starlette-0.48.0-py3-none-any.whl", hash = "sha256:0764ca97b097582558ecb498132ed0c7d942f233f365b86ba37770e026510659", size = 73736, upload-time = "2025-09-13T08:41:03.869Z" }, +] + +[[package]] +name = "tenacity" +version = "9.1.2" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/0a/d4/2b0cd0fe285e14b36db076e78c93766ff1d529d70408bd1d2a5a84f1d929/tenacity-9.1.2.tar.gz", hash = "sha256:1169d376c297e7de388d18b4481760d478b0e99a777cad3a9c86e556f4b697cb", size = 48036, upload-time = "2025-04-02T08:25:09.966Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/e5/30/643397144bfbfec6f6ef821f36f33e57d35946c44a2352d3c9f0ae847619/tenacity-9.1.2-py3-none-any.whl", hash = "sha256:f77bf36710d8b73a50b2dd155c97b870017ad21afe6ab300326b0371b3b05138", size = 28248, upload-time = "2025-04-02T08:25:07.678Z" }, +] + +[[package]] +name = "tqdm" +version = "4.67.1" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "colorama", marker = "sys_platform == 'win32'" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/a8/4b/29b4ef32e036bb34e4ab51796dd745cdba7ed47ad142a9f4a1eb8e0c744d/tqdm-4.67.1.tar.gz", hash = "sha256:f8aef9c52c08c13a65f30ea34f4e5aac3fd1a34959879d7e59e63027286627f2", size = 169737, upload-time = "2024-11-24T20:12:22.481Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/d0/30/dc54f88dd4a2b5dc8a0279bdd7270e735851848b762aeb1c1184ed1f6b14/tqdm-4.67.1-py3-none-any.whl", hash = "sha256:26445eca388f82e72884e0d580d5464cd801a3ea01e63e5601bdff9ba6a48de2", size = 78540, upload-time = "2024-11-24T20:12:19.698Z" }, +] + +[[package]] +name = "typing-extensions" +version = "4.15.0" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/72/94/1a15dd82efb362ac84269196e94cf00f187f7ed21c242792a923cdb1c61f/typing_extensions-4.15.0.tar.gz", hash = "sha256:0cea48d173cc12fa28ecabc3b837ea3cf6f38c6d1136f85cbaaf598984861466", size = 109391, upload-time = "2025-08-25T13:49:26.313Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/18/67/36e9267722cc04a6b9f15c7f3441c2363321a3ea07da7ae0c0707beb2a9c/typing_extensions-4.15.0-py3-none-any.whl", hash = "sha256:f0fa19c6845758ab08074a0cfa8b7aecb71c999ca73d62883bc25cc018c4e548", size = 44614, upload-time = "2025-08-25T13:49:24.86Z" }, +] + +[[package]] +name = "typing-inspection" +version = "0.4.2" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "typing-extensions" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/55/e3/70399cb7dd41c10ac53367ae42139cf4b1ca5f36bb3dc6c9d33acdb43655/typing_inspection-0.4.2.tar.gz", hash = "sha256:ba561c48a67c5958007083d386c3295464928b01faa735ab8547c5692e87f464", size = 75949, upload-time = "2025-10-01T02:14:41.687Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/dc/9b/47798a6c91d8bdb567fe2698fe81e0c6b7cb7ef4d13da4114b41d239f65d/typing_inspection-0.4.2-py3-none-any.whl", hash = "sha256:4ed1cacbdc298c220f1bd249ed5287caa16f34d44ef4e9c3d0cbad5b521545e7", size = 14611, upload-time = "2025-10-01T02:14:40.154Z" }, +] + +[[package]] +name = "uritemplate" +version = "4.2.0" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/98/60/f174043244c5306c9988380d2cb10009f91563fc4b31293d27e17201af56/uritemplate-4.2.0.tar.gz", hash = "sha256:480c2ed180878955863323eea31b0ede668795de182617fef9c6ca09e6ec9d0e", size = 33267, upload-time = "2025-06-02T15:12:06.318Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/a9/99/3ae339466c9183ea5b8ae87b34c0b897eda475d2aec2307cae60e5cd4f29/uritemplate-4.2.0-py3-none-any.whl", hash = "sha256:962201ba1c4edcab02e60f9a0d3821e82dfc5d2d6662a21abd533879bdb8a686", size = 11488, upload-time = "2025-06-02T15:12:03.405Z" }, +] + +[[package]] +name = "urllib3" +version = "2.5.0" source = { registry = "https://pypi.org/simple" } sdist = { url = "https://files.pythonhosted.org/packages/15/22/9ee70a2574a4f4599c47dd506532914ce044817c7752a79b6a51286319bc/urllib3-2.5.0.tar.gz", hash = "sha256:3fc47733c7e419d4bc3f6b3dc2b4f890bb743906a30d56ba4a5bfa4bbff92760", size = 393185, upload-time = "2025-06-18T14:07:41.644Z" } wheels = [ { url = "https://files.pythonhosted.org/packages/a7/c2/fe1e52489ae3122415c51f387e221dd0773709bad6c6cdaa599e8a2c5185/urllib3-2.5.0-py3-none-any.whl", hash = "sha256:e6b01673c0fa6a13e374b50871808eb3bf7046c4b125b216f6bf1cc604cff0dc", size = 129795, upload-time = "2025-06-18T14:07:40.39Z" }, ] + +[[package]] +name = "uuid7" +version = "0.1.0" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/5c/19/7472bd526591e2192926247109dbf78692e709d3e56775792fec877a7720/uuid7-0.1.0.tar.gz", hash = "sha256:8c57aa32ee7456d3cc68c95c4530bc571646defac01895cfc73545449894a63c", size = 14052, upload-time = "2021-12-29T01:38:21.897Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/b5/77/8852f89a91453956582a85024d80ad96f30a41fed4c2b3dce0c9f12ecc7e/uuid7-0.1.0-py2.py3-none-any.whl", hash = "sha256:5e259bb63c8cb4aded5927ff41b444a80d0c7124e8a0ced7cf44efa1f5cccf61", size = 7477, upload-time = "2021-12-29T01:38:20.418Z" }, +] + +[[package]] +name = "uvicorn" +version = "0.38.0" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "click" }, + { name = "h11" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/cb/ce/f06b84e2697fef4688ca63bdb2fdf113ca0a3be33f94488f2cadb690b0cf/uvicorn-0.38.0.tar.gz", hash = "sha256:fd97093bdd120a2609fc0d3afe931d4d4ad688b6e75f0f929fde1bc36fe0e91d", size = 80605, upload-time = "2025-10-18T13:46:44.63Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/ee/d9/d88e73ca598f4f6ff671fb5fde8a32925c2e08a637303a1d12883c7305fa/uvicorn-0.38.0-py3-none-any.whl", hash = "sha256:48c0afd214ceb59340075b4a052ea1ee91c16fbc2a9b1469cca0e54566977b02", size = 68109, upload-time = "2025-10-18T13:46:42.958Z" }, +] + +[[package]] +name = "websockets" +version = "15.0.1" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/21/e6/26d09fab466b7ca9c7737474c52be4f76a40301b08362eb2dbc19dcc16c1/websockets-15.0.1.tar.gz", hash = "sha256:82544de02076bafba038ce055ee6412d68da13ab47f0c60cab827346de828dee", size = 177016, upload-time = "2025-03-05T20:03:41.606Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/cb/9f/51f0cf64471a9d2b4d0fc6c534f323b664e7095640c34562f5182e5a7195/websockets-15.0.1-cp313-cp313-macosx_10_13_universal2.whl", hash = "sha256:ee443ef070bb3b6ed74514f5efaa37a252af57c90eb33b956d35c8e9c10a1931", size = 175440, upload-time = "2025-03-05T20:02:36.695Z" }, + { url = "https://files.pythonhosted.org/packages/8a/05/aa116ec9943c718905997412c5989f7ed671bc0188ee2ba89520e8765d7b/websockets-15.0.1-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:5a939de6b7b4e18ca683218320fc67ea886038265fd1ed30173f5ce3f8e85675", size = 173098, upload-time = "2025-03-05T20:02:37.985Z" }, + { url = "https://files.pythonhosted.org/packages/ff/0b/33cef55ff24f2d92924923c99926dcce78e7bd922d649467f0eda8368923/websockets-15.0.1-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:746ee8dba912cd6fc889a8147168991d50ed70447bf18bcda7039f7d2e3d9151", size = 173329, upload-time = "2025-03-05T20:02:39.298Z" }, + { url = "https://files.pythonhosted.org/packages/31/1d/063b25dcc01faa8fada1469bdf769de3768b7044eac9d41f734fd7b6ad6d/websockets-15.0.1-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:595b6c3969023ecf9041b2936ac3827e4623bfa3ccf007575f04c5a6aa318c22", size = 183111, upload-time = "2025-03-05T20:02:40.595Z" }, + { url = "https://files.pythonhosted.org/packages/93/53/9a87ee494a51bf63e4ec9241c1ccc4f7c2f45fff85d5bde2ff74fcb68b9e/websockets-15.0.1-cp313-cp313-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:3c714d2fc58b5ca3e285461a4cc0c9a66bd0e24c5da9911e30158286c9b5be7f", size = 182054, upload-time = "2025-03-05T20:02:41.926Z" }, + { url = "https://files.pythonhosted.org/packages/ff/b2/83a6ddf56cdcbad4e3d841fcc55d6ba7d19aeb89c50f24dd7e859ec0805f/websockets-15.0.1-cp313-cp313-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:0f3c1e2ab208db911594ae5b4f79addeb3501604a165019dd221c0bdcabe4db8", size = 182496, upload-time = "2025-03-05T20:02:43.304Z" }, + { url = "https://files.pythonhosted.org/packages/98/41/e7038944ed0abf34c45aa4635ba28136f06052e08fc2168520bb8b25149f/websockets-15.0.1-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:229cf1d3ca6c1804400b0a9790dc66528e08a6a1feec0d5040e8b9eb14422375", size = 182829, upload-time = "2025-03-05T20:02:48.812Z" }, + { url = "https://files.pythonhosted.org/packages/e0/17/de15b6158680c7623c6ef0db361da965ab25d813ae54fcfeae2e5b9ef910/websockets-15.0.1-cp313-cp313-musllinux_1_2_i686.whl", hash = "sha256:756c56e867a90fb00177d530dca4b097dd753cde348448a1012ed6c5131f8b7d", size = 182217, upload-time = "2025-03-05T20:02:50.14Z" }, + { url = "https://files.pythonhosted.org/packages/33/2b/1f168cb6041853eef0362fb9554c3824367c5560cbdaad89ac40f8c2edfc/websockets-15.0.1-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:558d023b3df0bffe50a04e710bc87742de35060580a293c2a984299ed83bc4e4", size = 182195, upload-time = "2025-03-05T20:02:51.561Z" }, + { url = "https://files.pythonhosted.org/packages/86/eb/20b6cdf273913d0ad05a6a14aed4b9a85591c18a987a3d47f20fa13dcc47/websockets-15.0.1-cp313-cp313-win32.whl", hash = "sha256:ba9e56e8ceeeedb2e080147ba85ffcd5cd0711b89576b83784d8605a7df455fa", size = 176393, upload-time = "2025-03-05T20:02:53.814Z" }, + { url = "https://files.pythonhosted.org/packages/1b/6c/c65773d6cab416a64d191d6ee8a8b1c68a09970ea6909d16965d26bfed1e/websockets-15.0.1-cp313-cp313-win_amd64.whl", hash = "sha256:e09473f095a819042ecb2ab9465aee615bd9c2028e4ef7d933600a8401c79561", size = 176837, upload-time = "2025-03-05T20:02:55.237Z" }, + { url = "https://files.pythonhosted.org/packages/fa/a8/5b41e0da817d64113292ab1f8247140aac61cbf6cfd085d6a0fa77f4984f/websockets-15.0.1-py3-none-any.whl", hash = "sha256:f7a866fbc1e97b5c617ee4116daaa09b722101d4a3c170c787450ba409f9736f", size = 169743, upload-time = "2025-03-05T20:03:39.41Z" }, +] + +[[package]] +name = "yarl" +version = "1.22.0" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "idna" }, + { name = "multidict" }, + { name = "propcache" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/57/63/0c6ebca57330cd313f6102b16dd57ffaf3ec4c83403dcb45dbd15c6f3ea1/yarl-1.22.0.tar.gz", hash = "sha256:bebf8557577d4401ba8bd9ff33906f1376c877aa78d1fe216ad01b4d6745af71", size = 187169, upload-time = "2025-10-06T14:12:55.963Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/ea/f3/d67de7260456ee105dc1d162d43a019ecad6b91e2f51809d6cddaa56690e/yarl-1.22.0-cp313-cp313-macosx_10_13_universal2.whl", hash = "sha256:8dee9c25c74997f6a750cd317b8ca63545169c098faee42c84aa5e506c819b53", size = 139980, upload-time = "2025-10-06T14:10:14.601Z" }, + { url = "https://files.pythonhosted.org/packages/01/88/04d98af0b47e0ef42597b9b28863b9060bb515524da0a65d5f4db160b2d5/yarl-1.22.0-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:01e73b85a5434f89fc4fe27dcda2aff08ddf35e4d47bbbea3bdcd25321af538a", size = 93424, upload-time = "2025-10-06T14:10:16.115Z" }, + { url = "https://files.pythonhosted.org/packages/18/91/3274b215fd8442a03975ce6bee5fe6aa57a8326b29b9d3d56234a1dca244/yarl-1.22.0-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:22965c2af250d20c873cdbee8ff958fb809940aeb2e74ba5f20aaf6b7ac8c70c", size = 93821, upload-time = "2025-10-06T14:10:17.993Z" }, + { url = "https://files.pythonhosted.org/packages/61/3a/caf4e25036db0f2da4ca22a353dfeb3c9d3c95d2761ebe9b14df8fc16eb0/yarl-1.22.0-cp313-cp313-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:b4f15793aa49793ec8d1c708ab7f9eded1aa72edc5174cae703651555ed1b601", size = 373243, upload-time = "2025-10-06T14:10:19.44Z" }, + { url = "https://files.pythonhosted.org/packages/6e/9e/51a77ac7516e8e7803b06e01f74e78649c24ee1021eca3d6a739cb6ea49c/yarl-1.22.0-cp313-cp313-manylinux2014_armv7l.manylinux_2_17_armv7l.manylinux_2_31_armv7l.whl", hash = "sha256:e5542339dcf2747135c5c85f68680353d5cb9ffd741c0f2e8d832d054d41f35a", size = 342361, upload-time = "2025-10-06T14:10:21.124Z" }, + { url = "https://files.pythonhosted.org/packages/d4/f8/33b92454789dde8407f156c00303e9a891f1f51a0330b0fad7c909f87692/yarl-1.22.0-cp313-cp313-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:5c401e05ad47a75869c3ab3e35137f8468b846770587e70d71e11de797d113df", size = 387036, upload-time = "2025-10-06T14:10:22.902Z" }, + { url = "https://files.pythonhosted.org/packages/d9/9a/c5db84ea024f76838220280f732970aa4ee154015d7f5c1bfb60a267af6f/yarl-1.22.0-cp313-cp313-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:243dda95d901c733f5b59214d28b0120893d91777cb8aa043e6ef059d3cddfe2", size = 397671, upload-time = "2025-10-06T14:10:24.523Z" }, + { url = "https://files.pythonhosted.org/packages/11/c9/cd8538dc2e7727095e0c1d867bad1e40c98f37763e6d995c1939f5fdc7b1/yarl-1.22.0-cp313-cp313-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:bec03d0d388060058f5d291a813f21c011041938a441c593374da6077fe21b1b", size = 377059, upload-time = "2025-10-06T14:10:26.406Z" }, + { url = "https://files.pythonhosted.org/packages/a1/b9/ab437b261702ced75122ed78a876a6dec0a1b0f5e17a4ac7a9a2482d8abe/yarl-1.22.0-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:b0748275abb8c1e1e09301ee3cf90c8a99678a4e92e4373705f2a2570d581273", size = 365356, upload-time = "2025-10-06T14:10:28.461Z" }, + { url = "https://files.pythonhosted.org/packages/b2/9d/8e1ae6d1d008a9567877b08f0ce4077a29974c04c062dabdb923ed98e6fe/yarl-1.22.0-cp313-cp313-musllinux_1_2_armv7l.whl", hash = "sha256:47fdb18187e2a4e18fda2c25c05d8251a9e4a521edaed757fef033e7d8498d9a", size = 361331, upload-time = "2025-10-06T14:10:30.541Z" }, + { url = "https://files.pythonhosted.org/packages/ca/5a/09b7be3905962f145b73beb468cdd53db8aa171cf18c80400a54c5b82846/yarl-1.22.0-cp313-cp313-musllinux_1_2_ppc64le.whl", hash = "sha256:c7044802eec4524fde550afc28edda0dd5784c4c45f0be151a2d3ba017daca7d", size = 382590, upload-time = "2025-10-06T14:10:33.352Z" }, + { url = "https://files.pythonhosted.org/packages/aa/7f/59ec509abf90eda5048b0bc3e2d7b5099dffdb3e6b127019895ab9d5ef44/yarl-1.22.0-cp313-cp313-musllinux_1_2_s390x.whl", hash = "sha256:139718f35149ff544caba20fce6e8a2f71f1e39b92c700d8438a0b1d2a631a02", size = 385316, upload-time = "2025-10-06T14:10:35.034Z" }, + { url = "https://files.pythonhosted.org/packages/e5/84/891158426bc8036bfdfd862fabd0e0fa25df4176ec793e447f4b85cf1be4/yarl-1.22.0-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:e1b51bebd221006d3d2f95fbe124b22b247136647ae5dcc8c7acafba66e5ee67", size = 374431, upload-time = "2025-10-06T14:10:37.76Z" }, + { url = "https://files.pythonhosted.org/packages/bb/49/03da1580665baa8bef5e8ed34c6df2c2aca0a2f28bf397ed238cc1bbc6f2/yarl-1.22.0-cp313-cp313-win32.whl", hash = "sha256:d3e32536234a95f513bd374e93d717cf6b2231a791758de6c509e3653f234c95", size = 81555, upload-time = "2025-10-06T14:10:39.649Z" }, + { url = "https://files.pythonhosted.org/packages/9a/ee/450914ae11b419eadd067c6183ae08381cfdfcb9798b90b2b713bbebddda/yarl-1.22.0-cp313-cp313-win_amd64.whl", hash = "sha256:47743b82b76d89a1d20b83e60d5c20314cbd5ba2befc9cda8f28300c4a08ed4d", size = 86965, upload-time = "2025-10-06T14:10:41.313Z" }, + { url = "https://files.pythonhosted.org/packages/98/4d/264a01eae03b6cf629ad69bae94e3b0e5344741e929073678e84bf7a3e3b/yarl-1.22.0-cp313-cp313-win_arm64.whl", hash = "sha256:5d0fcda9608875f7d052eff120c7a5da474a6796fe4d83e152e0e4d42f6d1a9b", size = 81205, upload-time = "2025-10-06T14:10:43.167Z" }, + { url = "https://files.pythonhosted.org/packages/88/fc/6908f062a2f77b5f9f6d69cecb1747260831ff206adcbc5b510aff88df91/yarl-1.22.0-cp313-cp313t-macosx_10_13_universal2.whl", hash = "sha256:719ae08b6972befcba4310e49edb1161a88cdd331e3a694b84466bd938a6ab10", size = 146209, upload-time = "2025-10-06T14:10:44.643Z" }, + { url = "https://files.pythonhosted.org/packages/65/47/76594ae8eab26210b4867be6f49129861ad33da1f1ebdf7051e98492bf62/yarl-1.22.0-cp313-cp313t-macosx_10_13_x86_64.whl", hash = "sha256:47d8a5c446df1c4db9d21b49619ffdba90e77c89ec6e283f453856c74b50b9e3", size = 95966, upload-time = "2025-10-06T14:10:46.554Z" }, + { url = "https://files.pythonhosted.org/packages/ab/ce/05e9828a49271ba6b5b038b15b3934e996980dd78abdfeb52a04cfb9467e/yarl-1.22.0-cp313-cp313t-macosx_11_0_arm64.whl", hash = "sha256:cfebc0ac8333520d2d0423cbbe43ae43c8838862ddb898f5ca68565e395516e9", size = 97312, upload-time = "2025-10-06T14:10:48.007Z" }, + { url = "https://files.pythonhosted.org/packages/d1/c5/7dffad5e4f2265b29c9d7ec869c369e4223166e4f9206fc2243ee9eea727/yarl-1.22.0-cp313-cp313t-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:4398557cbf484207df000309235979c79c4356518fd5c99158c7d38203c4da4f", size = 361967, upload-time = "2025-10-06T14:10:49.997Z" }, + { url = "https://files.pythonhosted.org/packages/50/b2/375b933c93a54bff7fc041e1a6ad2c0f6f733ffb0c6e642ce56ee3b39970/yarl-1.22.0-cp313-cp313t-manylinux2014_armv7l.manylinux_2_17_armv7l.manylinux_2_31_armv7l.whl", hash = "sha256:2ca6fd72a8cd803be290d42f2dec5cdcd5299eeb93c2d929bf060ad9efaf5de0", size = 323949, upload-time = "2025-10-06T14:10:52.004Z" }, + { url = "https://files.pythonhosted.org/packages/66/50/bfc2a29a1d78644c5a7220ce2f304f38248dc94124a326794e677634b6cf/yarl-1.22.0-cp313-cp313t-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:ca1f59c4e1ab6e72f0a23c13fca5430f889634166be85dbf1013683e49e3278e", size = 361818, upload-time = "2025-10-06T14:10:54.078Z" }, + { url = "https://files.pythonhosted.org/packages/46/96/f3941a46af7d5d0f0498f86d71275696800ddcdd20426298e572b19b91ff/yarl-1.22.0-cp313-cp313t-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:6c5010a52015e7c70f86eb967db0f37f3c8bd503a695a49f8d45700144667708", size = 372626, upload-time = "2025-10-06T14:10:55.767Z" }, + { url = "https://files.pythonhosted.org/packages/c1/42/8b27c83bb875cd89448e42cd627e0fb971fa1675c9ec546393d18826cb50/yarl-1.22.0-cp313-cp313t-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:9d7672ecf7557476642c88497c2f8d8542f8e36596e928e9bcba0e42e1e7d71f", size = 341129, upload-time = "2025-10-06T14:10:57.985Z" }, + { url = "https://files.pythonhosted.org/packages/49/36/99ca3122201b382a3cf7cc937b95235b0ac944f7e9f2d5331d50821ed352/yarl-1.22.0-cp313-cp313t-musllinux_1_2_aarch64.whl", hash = "sha256:3b7c88eeef021579d600e50363e0b6ee4f7f6f728cd3486b9d0f3ee7b946398d", size = 346776, upload-time = "2025-10-06T14:10:59.633Z" }, + { url = "https://files.pythonhosted.org/packages/85/b4/47328bf996acd01a4c16ef9dcd2f59c969f495073616586f78cd5f2efb99/yarl-1.22.0-cp313-cp313t-musllinux_1_2_armv7l.whl", hash = "sha256:f4afb5c34f2c6fecdcc182dfcfc6af6cccf1aa923eed4d6a12e9d96904e1a0d8", size = 334879, upload-time = "2025-10-06T14:11:01.454Z" }, + { url = "https://files.pythonhosted.org/packages/c2/ad/b77d7b3f14a4283bffb8e92c6026496f6de49751c2f97d4352242bba3990/yarl-1.22.0-cp313-cp313t-musllinux_1_2_ppc64le.whl", hash = "sha256:59c189e3e99a59cf8d83cbb31d4db02d66cda5a1a4374e8a012b51255341abf5", size = 350996, upload-time = "2025-10-06T14:11:03.452Z" }, + { url = "https://files.pythonhosted.org/packages/81/c8/06e1d69295792ba54d556f06686cbd6a7ce39c22307100e3fb4a2c0b0a1d/yarl-1.22.0-cp313-cp313t-musllinux_1_2_s390x.whl", hash = "sha256:5a3bf7f62a289fa90f1990422dc8dff5a458469ea71d1624585ec3a4c8d6960f", size = 356047, upload-time = "2025-10-06T14:11:05.115Z" }, + { url = "https://files.pythonhosted.org/packages/4b/b8/4c0e9e9f597074b208d18cef227d83aac36184bfbc6eab204ea55783dbc5/yarl-1.22.0-cp313-cp313t-musllinux_1_2_x86_64.whl", hash = "sha256:de6b9a04c606978fdfe72666fa216ffcf2d1a9f6a381058d4378f8d7b1e5de62", size = 342947, upload-time = "2025-10-06T14:11:08.137Z" }, + { url = "https://files.pythonhosted.org/packages/e0/e5/11f140a58bf4c6ad7aca69a892bff0ee638c31bea4206748fc0df4ebcb3a/yarl-1.22.0-cp313-cp313t-win32.whl", hash = "sha256:1834bb90991cc2999f10f97f5f01317f99b143284766d197e43cd5b45eb18d03", size = 86943, upload-time = "2025-10-06T14:11:10.284Z" }, + { url = "https://files.pythonhosted.org/packages/31/74/8b74bae38ed7fe6793d0c15a0c8207bbb819cf287788459e5ed230996cdd/yarl-1.22.0-cp313-cp313t-win_amd64.whl", hash = "sha256:ff86011bd159a9d2dfc89c34cfd8aff12875980e3bd6a39ff097887520e60249", size = 93715, upload-time = "2025-10-06T14:11:11.739Z" }, + { url = "https://files.pythonhosted.org/packages/69/66/991858aa4b5892d57aef7ee1ba6b4d01ec3b7eb3060795d34090a3ca3278/yarl-1.22.0-cp313-cp313t-win_arm64.whl", hash = "sha256:7861058d0582b847bc4e3a4a4c46828a410bca738673f35a29ba3ca5db0b473b", size = 83857, upload-time = "2025-10-06T14:11:13.586Z" }, + { url = "https://files.pythonhosted.org/packages/46/b3/e20ef504049f1a1c54a814b4b9bed96d1ac0e0610c3b4da178f87209db05/yarl-1.22.0-cp314-cp314-macosx_10_13_universal2.whl", hash = "sha256:34b36c2c57124530884d89d50ed2c1478697ad7473efd59cfd479945c95650e4", size = 140520, upload-time = "2025-10-06T14:11:15.465Z" }, + { url = "https://files.pythonhosted.org/packages/e4/04/3532d990fdbab02e5ede063676b5c4260e7f3abea2151099c2aa745acc4c/yarl-1.22.0-cp314-cp314-macosx_10_13_x86_64.whl", hash = "sha256:0dd9a702591ca2e543631c2a017e4a547e38a5c0f29eece37d9097e04a7ac683", size = 93504, upload-time = "2025-10-06T14:11:17.106Z" }, + { url = "https://files.pythonhosted.org/packages/11/63/ff458113c5c2dac9a9719ac68ee7c947cb621432bcf28c9972b1c0e83938/yarl-1.22.0-cp314-cp314-macosx_11_0_arm64.whl", hash = "sha256:594fcab1032e2d2cc3321bb2e51271e7cd2b516c7d9aee780ece81b07ff8244b", size = 94282, upload-time = "2025-10-06T14:11:19.064Z" }, + { url = "https://files.pythonhosted.org/packages/a7/bc/315a56aca762d44a6aaaf7ad253f04d996cb6b27bad34410f82d76ea8038/yarl-1.22.0-cp314-cp314-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:f3d7a87a78d46a2e3d5b72587ac14b4c16952dd0887dbb051451eceac774411e", size = 372080, upload-time = "2025-10-06T14:11:20.996Z" }, + { url = "https://files.pythonhosted.org/packages/3f/3f/08e9b826ec2e099ea6e7c69a61272f4f6da62cb5b1b63590bb80ca2e4a40/yarl-1.22.0-cp314-cp314-manylinux2014_armv7l.manylinux_2_17_armv7l.manylinux_2_31_armv7l.whl", hash = "sha256:852863707010316c973162e703bddabec35e8757e67fcb8ad58829de1ebc8590", size = 338696, upload-time = "2025-10-06T14:11:22.847Z" }, + { url = "https://files.pythonhosted.org/packages/e3/9f/90360108e3b32bd76789088e99538febfea24a102380ae73827f62073543/yarl-1.22.0-cp314-cp314-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:131a085a53bfe839a477c0845acf21efc77457ba2bcf5899618136d64f3303a2", size = 387121, upload-time = "2025-10-06T14:11:24.889Z" }, + { url = "https://files.pythonhosted.org/packages/98/92/ab8d4657bd5b46a38094cfaea498f18bb70ce6b63508fd7e909bd1f93066/yarl-1.22.0-cp314-cp314-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:078a8aefd263f4d4f923a9677b942b445a2be970ca24548a8102689a3a8ab8da", size = 394080, upload-time = "2025-10-06T14:11:27.307Z" }, + { url = "https://files.pythonhosted.org/packages/f5/e7/d8c5a7752fef68205296201f8ec2bf718f5c805a7a7e9880576c67600658/yarl-1.22.0-cp314-cp314-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:bca03b91c323036913993ff5c738d0842fc9c60c4648e5c8d98331526df89784", size = 372661, upload-time = "2025-10-06T14:11:29.387Z" }, + { url = "https://files.pythonhosted.org/packages/b6/2e/f4d26183c8db0bb82d491b072f3127fb8c381a6206a3a56332714b79b751/yarl-1.22.0-cp314-cp314-musllinux_1_2_aarch64.whl", hash = "sha256:68986a61557d37bb90d3051a45b91fa3d5c516d177dfc6dd6f2f436a07ff2b6b", size = 364645, upload-time = "2025-10-06T14:11:31.423Z" }, + { url = "https://files.pythonhosted.org/packages/80/7c/428e5812e6b87cd00ee8e898328a62c95825bf37c7fa87f0b6bb2ad31304/yarl-1.22.0-cp314-cp314-musllinux_1_2_armv7l.whl", hash = "sha256:4792b262d585ff0dff6bcb787f8492e40698443ec982a3568c2096433660c694", size = 355361, upload-time = "2025-10-06T14:11:33.055Z" }, + { url = "https://files.pythonhosted.org/packages/ec/2a/249405fd26776f8b13c067378ef4d7dd49c9098d1b6457cdd152a99e96a9/yarl-1.22.0-cp314-cp314-musllinux_1_2_ppc64le.whl", hash = "sha256:ebd4549b108d732dba1d4ace67614b9545b21ece30937a63a65dd34efa19732d", size = 381451, upload-time = "2025-10-06T14:11:35.136Z" }, + { url = "https://files.pythonhosted.org/packages/67/a8/fb6b1adbe98cf1e2dd9fad71003d3a63a1bc22459c6e15f5714eb9323b93/yarl-1.22.0-cp314-cp314-musllinux_1_2_s390x.whl", hash = "sha256:f87ac53513d22240c7d59203f25cc3beac1e574c6cd681bbfd321987b69f95fd", size = 383814, upload-time = "2025-10-06T14:11:37.094Z" }, + { url = "https://files.pythonhosted.org/packages/d9/f9/3aa2c0e480fb73e872ae2814c43bc1e734740bb0d54e8cb2a95925f98131/yarl-1.22.0-cp314-cp314-musllinux_1_2_x86_64.whl", hash = "sha256:22b029f2881599e2f1b06f8f1db2ee63bd309e2293ba2d566e008ba12778b8da", size = 370799, upload-time = "2025-10-06T14:11:38.83Z" }, + { url = "https://files.pythonhosted.org/packages/50/3c/af9dba3b8b5eeb302f36f16f92791f3ea62e3f47763406abf6d5a4a3333b/yarl-1.22.0-cp314-cp314-win32.whl", hash = "sha256:6a635ea45ba4ea8238463b4f7d0e721bad669f80878b7bfd1f89266e2ae63da2", size = 82990, upload-time = "2025-10-06T14:11:40.624Z" }, + { url = "https://files.pythonhosted.org/packages/ac/30/ac3a0c5bdc1d6efd1b41fa24d4897a4329b3b1e98de9449679dd327af4f0/yarl-1.22.0-cp314-cp314-win_amd64.whl", hash = "sha256:0d6e6885777af0f110b0e5d7e5dda8b704efed3894da26220b7f3d887b839a79", size = 88292, upload-time = "2025-10-06T14:11:42.578Z" }, + { url = "https://files.pythonhosted.org/packages/df/0a/227ab4ff5b998a1b7410abc7b46c9b7a26b0ca9e86c34ba4b8d8bc7c63d5/yarl-1.22.0-cp314-cp314-win_arm64.whl", hash = "sha256:8218f4e98d3c10d683584cb40f0424f4b9fd6e95610232dd75e13743b070ee33", size = 82888, upload-time = "2025-10-06T14:11:44.863Z" }, + { url = "https://files.pythonhosted.org/packages/06/5e/a15eb13db90abd87dfbefb9760c0f3f257ac42a5cac7e75dbc23bed97a9f/yarl-1.22.0-cp314-cp314t-macosx_10_13_universal2.whl", hash = "sha256:45c2842ff0e0d1b35a6bf1cd6c690939dacb617a70827f715232b2e0494d55d1", size = 146223, upload-time = "2025-10-06T14:11:46.796Z" }, + { url = "https://files.pythonhosted.org/packages/18/82/9665c61910d4d84f41a5bf6837597c89e665fa88aa4941080704645932a9/yarl-1.22.0-cp314-cp314t-macosx_10_13_x86_64.whl", hash = "sha256:d947071e6ebcf2e2bee8fce76e10faca8f7a14808ca36a910263acaacef08eca", size = 95981, upload-time = "2025-10-06T14:11:48.845Z" }, + { url = "https://files.pythonhosted.org/packages/5d/9a/2f65743589809af4d0a6d3aa749343c4b5f4c380cc24a8e94a3c6625a808/yarl-1.22.0-cp314-cp314t-macosx_11_0_arm64.whl", hash = "sha256:334b8721303e61b00019474cc103bdac3d7b1f65e91f0bfedeec2d56dfe74b53", size = 97303, upload-time = "2025-10-06T14:11:50.897Z" }, + { url = "https://files.pythonhosted.org/packages/b0/ab/5b13d3e157505c43c3b43b5a776cbf7b24a02bc4cccc40314771197e3508/yarl-1.22.0-cp314-cp314t-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:1e7ce67c34138a058fd092f67d07a72b8e31ff0c9236e751957465a24b28910c", size = 361820, upload-time = "2025-10-06T14:11:52.549Z" }, + { url = "https://files.pythonhosted.org/packages/fb/76/242a5ef4677615cf95330cfc1b4610e78184400699bdda0acb897ef5e49a/yarl-1.22.0-cp314-cp314t-manylinux2014_armv7l.manylinux_2_17_armv7l.manylinux_2_31_armv7l.whl", hash = "sha256:d77e1b2c6d04711478cb1c4ab90db07f1609ccf06a287d5607fcd90dc9863acf", size = 323203, upload-time = "2025-10-06T14:11:54.225Z" }, + { url = "https://files.pythonhosted.org/packages/8c/96/475509110d3f0153b43d06164cf4195c64d16999e0c7e2d8a099adcd6907/yarl-1.22.0-cp314-cp314t-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:c4647674b6150d2cae088fc07de2738a84b8bcedebef29802cf0b0a82ab6face", size = 363173, upload-time = "2025-10-06T14:11:56.069Z" }, + { url = "https://files.pythonhosted.org/packages/c9/66/59db471aecfbd559a1fd48aedd954435558cd98c7d0da8b03cc6c140a32c/yarl-1.22.0-cp314-cp314t-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:efb07073be061c8f79d03d04139a80ba33cbd390ca8f0297aae9cce6411e4c6b", size = 373562, upload-time = "2025-10-06T14:11:58.783Z" }, + { url = "https://files.pythonhosted.org/packages/03/1f/c5d94abc91557384719da10ff166b916107c1b45e4d0423a88457071dd88/yarl-1.22.0-cp314-cp314t-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:e51ac5435758ba97ad69617e13233da53908beccc6cfcd6c34bbed8dcbede486", size = 339828, upload-time = "2025-10-06T14:12:00.686Z" }, + { url = "https://files.pythonhosted.org/packages/5f/97/aa6a143d3afba17b6465733681c70cf175af89f76ec8d9286e08437a7454/yarl-1.22.0-cp314-cp314t-musllinux_1_2_aarch64.whl", hash = "sha256:33e32a0dd0c8205efa8e83d04fc9f19313772b78522d1bdc7d9aed706bfd6138", size = 347551, upload-time = "2025-10-06T14:12:02.628Z" }, + { url = "https://files.pythonhosted.org/packages/43/3c/45a2b6d80195959239a7b2a8810506d4eea5487dce61c2a3393e7fc3c52e/yarl-1.22.0-cp314-cp314t-musllinux_1_2_armv7l.whl", hash = "sha256:bf4a21e58b9cde0e401e683ebd00f6ed30a06d14e93f7c8fd059f8b6e8f87b6a", size = 334512, upload-time = "2025-10-06T14:12:04.871Z" }, + { url = "https://files.pythonhosted.org/packages/86/a0/c2ab48d74599c7c84cb104ebd799c5813de252bea0f360ffc29d270c2caa/yarl-1.22.0-cp314-cp314t-musllinux_1_2_ppc64le.whl", hash = "sha256:e4b582bab49ac33c8deb97e058cd67c2c50dac0dd134874106d9c774fd272529", size = 352400, upload-time = "2025-10-06T14:12:06.624Z" }, + { url = "https://files.pythonhosted.org/packages/32/75/f8919b2eafc929567d3d8411f72bdb1a2109c01caaab4ebfa5f8ffadc15b/yarl-1.22.0-cp314-cp314t-musllinux_1_2_s390x.whl", hash = "sha256:0b5bcc1a9c4839e7e30b7b30dd47fe5e7e44fb7054ec29b5bb8d526aa1041093", size = 357140, upload-time = "2025-10-06T14:12:08.362Z" }, + { url = "https://files.pythonhosted.org/packages/cf/72/6a85bba382f22cf78add705d8c3731748397d986e197e53ecc7835e76de7/yarl-1.22.0-cp314-cp314t-musllinux_1_2_x86_64.whl", hash = "sha256:c0232bce2170103ec23c454e54a57008a9a72b5d1c3105dc2496750da8cfa47c", size = 341473, upload-time = "2025-10-06T14:12:10.994Z" }, + { url = "https://files.pythonhosted.org/packages/35/18/55e6011f7c044dc80b98893060773cefcfdbf60dfefb8cb2f58b9bacbd83/yarl-1.22.0-cp314-cp314t-win32.whl", hash = "sha256:8009b3173bcd637be650922ac455946197d858b3630b6d8787aa9e5c4564533e", size = 89056, upload-time = "2025-10-06T14:12:13.317Z" }, + { url = "https://files.pythonhosted.org/packages/f9/86/0f0dccb6e59a9e7f122c5afd43568b1d31b8ab7dda5f1b01fb5c7025c9a9/yarl-1.22.0-cp314-cp314t-win_amd64.whl", hash = "sha256:9fb17ea16e972c63d25d4a97f016d235c78dd2344820eb35bc034bc32012ee27", size = 96292, upload-time = "2025-10-06T14:12:15.398Z" }, + { url = "https://files.pythonhosted.org/packages/48/b7/503c98092fb3b344a179579f55814b613c1fbb1c23b3ec14a7b008a66a6e/yarl-1.22.0-cp314-cp314t-win_arm64.whl", hash = "sha256:9f6d73c1436b934e3f01df1e1b21ff765cd1d28c77dfb9ace207f746d4610ee1", size = 85171, upload-time = "2025-10-06T14:12:16.935Z" }, + { url = "https://files.pythonhosted.org/packages/73/ae/b48f95715333080afb75a4504487cbe142cae1268afc482d06692d605ae6/yarl-1.22.0-py3-none-any.whl", hash = "sha256:1380560bdba02b6b6c90de54133c81c9f2a453dee9912fe58c1dcced1edb7cff", size = 46814, upload-time = "2025-10-06T14:12:53.872Z" }, +] From 4195f87060957c2ce064e5f0cf525baecd6b72be Mon Sep 17 00:00:00 2001 From: rafa-rrayes Date: Sun, 26 Oct 2025 11:23:16 -0300 Subject: [PATCH 2/3] beacon --- README.md | 47 +++- audio_tools.py | 197 ++++++++++++++++ beep1.wav | Bin 0 -> 44144 bytes beep2.wav | Bin 0 -> 44144 bytes browser-use/main.py | 21 -- browser-use/tools.py | 13 -- config.py | 95 ++++++++ gemini-pc-use/main.py | 50 ---- gemini-pc-use/tools.py | 0 main.py | 395 +++++++++++++++++++++++++++++++ pyproject.toml | 10 + recorder.py | 136 +++++++++++ uv.lock | 520 ++++++++++++++++++++++++++++++++++++++++- 13 files changed, 1398 insertions(+), 86 deletions(-) create mode 100644 audio_tools.py create mode 100644 beep1.wav create mode 100644 beep2.wav delete mode 100644 browser-use/main.py delete mode 100644 browser-use/tools.py create mode 100644 config.py delete mode 100644 gemini-pc-use/main.py delete mode 100644 gemini-pc-use/tools.py create mode 100644 main.py create mode 100644 recorder.py diff --git a/README.md b/README.md index 3c4bffe..d26d921 100644 --- a/README.md +++ b/README.md @@ -1 +1,46 @@ -# Hackathon-DevsImpacto \ No newline at end of file +# Beacon MVP + +Beacon is a voice-first browsing assistant designed for blind users. It analyses the current page, explains what matters, presents a numbered action menu, and executes the selected task through an autonomous browser agent. High-risk actions (purchases, submissions, posts) always require confirmation in plain language. + +## Requirements +- Python 3.13 (matches the project `pyproject.toml`). +- Google Chrome running locally (Beacon connects through the `browser-use` CDP client). +- An `OPENAI_API_KEY` with access to the text and audio models used below. +- Optional for microphone input: `sounddevice` and `numpy` (`pip install sounddevice numpy`). +- macOS users get spoken output automatically through `afplay`. On other systems install `ffplay`, `mpg123`, or `sox`'s `play` command for audio playback, otherwise transcripts are printed. + +## Installation + +```bash +uv sync # or: pip install -e . +``` + +Ensure the virtual environment is activated (`source .venv/bin/activate` when using `uv`). + +## Running Beacon + +```bash +python browser-use/main.py --url https://example.com +``` + +Useful flags: + +- `--no-voice` – disable text-to-speech output (text prompts only). +- `--mic` – enable microphone capture (requires `sounddevice` and `numpy`). +- `--analysis-model`, `--tts-model`, `--transcription-model` – override default OpenAI models. +- `--agent-steps` – cap the browser agent iterations per action (defaults to 8). +- `--load-wait` – seconds to pause after navigation before summarising. + +## Workflow +1. Beacon opens the target page and collects a DOM snapshot through `browser-use`. +2. `gpt-4o-mini` summarises the page intent, highlights important data, and proposes 3–6 key actions. +3. Actions are voiced as a numbered menu (`1. Add to cart`, `2. Read reviews`, …). +4. The user responds by voice or keyboard. Beacon parses numbers, action names, or navigation commands. +5. Selected actions run through the `browser-use` agent. High-risk actions require explicit confirmation. +6. Beacon reads back the result and refreshes the summary so the user can continue. + +## Limitations & Next Steps +- Microphone capture is optional; for production we would add wake-word detection and streaming STT. +- Presently the agent shares a single session; future iterations could support multi-tab workflows. +- Safety heuristics rely on model output—additional rule-based checks (e.g. detecting payment forms) would harden confirmations. +- The accessibility menu is generated from DOM text; integrating landmark roles / ARIA data would further improve prioritisation. diff --git a/audio_tools.py b/audio_tools.py new file mode 100644 index 0000000..f58b2f2 --- /dev/null +++ b/audio_tools.py @@ -0,0 +1,197 @@ +"""Audio handling for Beacon - recording, transcription, and text-to-speech.""" +from openai import OpenAI +from typing import BinaryIO +import os +import tempfile +from threading import Event, Lock, Thread + +import sounddevice as sd +import soundfile as sf + +from recorder import record_mic +import librosa # pip install librosa + +class AudioHandler: + """Handles audio recording, transcription, and text-to-speech for Beacon.""" + + def __init__(self, openai_api_key: str | None = None, voice: str = "coral"): + """Initialize the audio handler. + + Args: + openai_api_key: OpenAI API key for transcription and TTS + voice: Default voice for TTS (coral, alloy, echo, fable, onyx, nova, shimmer) + """ + self.client = OpenAI(api_key=openai_api_key) + self.default_voice = voice + self._playback_lock = Lock() + self._is_playing = Event() + self._playback_thread: Thread | None = None + + def transcribe_audio(self, audio: BinaryIO) -> str: + """Transcribe audio file to text using OpenAI Whisper. + + Args: + audio: Binary file handle containing audio data + + Returns: + Transcribed text string + """ + try: + transcription = self.client.audio.transcriptions.create( + model="gpt-4o-transcribe", + file=audio, + ) + return transcription.text + except Exception as exc: + print(f"Transcription error: {exc}") + raise + + def record_and_transcribe(self, duration_seconds: float = 5.0) -> str: + """Capture audio via microphone and transcribe it. + + Args: + duration_seconds: How long to record (default 5 seconds) + + Returns: + Transcribed text string + """ + audio_handle = None + tmp_path = None + + try: + audio_handle = record_mic(duration_seconds) + tmp_path = getattr(audio_handle, "name", None) + transcription = self.transcribe_audio(audio_handle) + return transcription.strip() + except Exception as exc: + print(f"Recording or transcription failed: {exc}") + raise + finally: + # Clean up resources + if audio_handle: + audio_handle.close() + if tmp_path and os.path.exists(tmp_path): + try: + os.unlink(tmp_path) + except OSError: + pass + + def generate_speech(self, text: str, output_path: str, voice: str | None = None) -> None: + """Generate speech audio file from text. + + Args: + text: Text to convert to speech + output_path: Where to save the audio file + voice: Voice to use (or default if None) + """ + if not text or text.strip() == "": + print("Warning: Empty text provided for speech generation") + return + + voice = voice or self.default_voice + + try: + with self.client.audio.speech.with_streaming_response.create( + model="gpt-4o-mini-tts", + voice=voice, + input=text, + instructions="Speak in a clear, friendly, and helpful tone suitable for a blind user. Be concise but warm.", + ) as response: + response.stream_to_file(output_path) + except Exception as exc: + print(f"Speech generation error: {exc}") + raise + + def stop_playback(self) -> None: + """Stop any active audio playback immediately.""" + with self._playback_lock: + active_thread = self._playback_thread + if active_thread and active_thread.is_alive(): + try: + sd.stop() + except Exception as exc: + print(f"Audio stop error: {exc}") + self._is_playing.clear() + + @property + def is_playing(self) -> bool: + """Return True when audio is currently playing.""" + return self._is_playing.is_set() + + def play_speech(self, text: str, voice: str | None = None) -> None: + """Generate speech from text and play it directly through speakers. + + This method creates a temporary audio file, plays it, then deletes it. + Uses WAV format for maximum compatibility with sounddevice. + + Args: + text: Text to speak + voice: Voice to use (or default if None) + """ + text = text[:2000] + if not text or text.strip() == "": + print("Warning: Empty text provided for speech playback") + return + + voice = voice or self.default_voice + tmp_path = None + + try: + # Create temporary file for audio + tmp = tempfile.NamedTemporaryFile( + prefix="beacon_tts_", + suffix=".wav", + delete=False + ) + tmp_path = tmp.name + tmp.close() + + # Generate speech + with self.client.audio.speech.with_streaming_response.create( + model="gpt-4o-mini-tts", + voice=voice, + input=text, + instructions="Speak in a clear, friendly, and helpful tone suitable for a blind user. Be concise but warm.", + ) as response: + response.stream_to_file(tmp_path) + + # Play the audio + data, samplerate = sf.read(tmp_path, dtype="float32") + if samplerate != 48000: + data = librosa.resample(data.T, orig_sr=samplerate, target_sr=48000).T + samplerate = 48000 + + self.stop_playback() # Ensure previous playback is halted + + def _playback_worker(buffer, sample_rate): + try: + sd.play(buffer, sample_rate, blocking=False) + sd.wait() + except Exception as playback_exc: + print(f"Speech playback error: {playback_exc}") + finally: + with self._playback_lock: + self._is_playing.clear() + self._playback_thread = None + + playback_thread = Thread(target=_playback_worker, args=(data, samplerate), daemon=True) + + with self._playback_lock: + self._is_playing.set() + self._playback_thread = playback_thread + playback_thread.start() + + except Exception as exc: + print(f"Speech playback error: {exc}") + # Don't raise - we want the app to continue even if audio fails + + finally: + # Clean up the temporary file + if tmp_path and os.path.exists(tmp_path): + try: + os.unlink(tmp_path) + except OSError: + pass + +if __name__ == "__main__": + print("\a") \ No newline at end of file diff --git a/beep1.wav b/beep1.wav new file mode 100644 index 0000000000000000000000000000000000000000..917c01f3ca118f675fac3e111b9c2045938af3a5 GIT binary patch literal 44144 zcmeI5_dAvG|HtiARw0rVq3jh68QCPt2%+q~k9F34pJ^R??`#=G3fW4E>{V9TQB+9D z>f`%Ie6Q>Cxvuwhemdv3`?}8S{^5B&pO42~eH|UQN-C;*8W!3v-UvZ9Dk>`KqmS0n zZxNQ%R5Vm_g4RUaF{pv~U zR~a}LoEtWWD#d)q)H_6n=rzAlxDihYv<+$4VyRQZ=%iAAK$EsW_~`H5j(t>&ofl9D6wpFFLGQ{kp&Z zkj|dTfg`u%nbv0>$~&*PEBdenAcK5DSCK1dcdQrm9r^+J zLH^iH^lv0KG$u$iz|e=r!`S)q!zSw`v&P%%dRUFHYgZMzB*ZQ_@e(=WnPTap_QQWA ztW_;8Piu_5>%(;++R7S)pRHG%EFnI!&B{*IO0 zJw(ND?x=tmwFFd(aHd>devwysZ1umo#+HW8jrVpVe)KYbXjT}sGTg}>?cKYn5>3z+=710;sh=kC5SQTgr+J(}gI;9l1aNhvnH3yq9R&qSww>0 z)vhu;ymN4`$ac+P$koWp)^9&hB;;clE4l~60KGc8kVfbiwi>gBstnrLPx>7odM{B%;$g0tKS!YuNCtgAJyyvh#tHQ^Wr6RXR0WV(J8|>B`lL#&ZWU zq*MOJE5yu2GK3cs+whh+UziaVgd5=zoEHH{Ivv3qofS(-{FeGWYyOdM$-Tw zALoG1psG+_6dQ(&#XwuoDr5(lV!P2DNY&7rK|}s)-Wl%GPK^(gt*y+&ZkOoJsE=HY zmFJQ`2tPU3%RYW`ly+dRZ|mc?KMV5H38TDylW#^^nH%D2>?^{H86SPkluunuppQ+D zDhR(o5+dZ{GGGpv6{f%uI6A@sF(BMN>P<{e!a_<)W@X-m;+^vIH5v8Rt#)s+ds#*+ zr+gM}f4jM*xu-{Ka8iR^;!A!3h@wef?OH-n^GG;myF6l<$fy6d0hLHr|x}o`|Hgf%i;BjvN`-}z=r?d zAnLH=fv0TFN}Qj#XeV2%JfK>st$8cvF40oh&cRXDt;Va)&j8^b!iH2quVHwhzM~7N zf~K()ObaR?tSZ>-S6_C{%HX&T_07MU8)mDhxsC~` z;kP|$uZx<0y@-2?dfZZIoBJT+U2=B(93?Zdha5=Ez~8{x!*uW^xF6oar4brPW)W`D zo3ZPO7HOBVALMVBELMuuHoS~$FMhk-A3QGjX?EN)V2pl@xr?)a@1e+FNhigu z>!~-5^qY()%pcunvgdSZ@c8M|5WpP#Ez}sLj48mzKs(SpWC$r@^UxIJVaOi@%Aevb zTsn+M$v9YBttt+9^KH)s>MeQ+#y zWA|q9Pe)XS=po(F%vgEo!_m7p4|ql+H2a7Ec{KF3~V&r zRjythkx~;S@mHQ{VQFP(JgocO^nG}l=CkRCzJZW;)*YzEh1#^LoYI5*rtFzCx1@)0 z-O*(chok`lAAS|Sd~_iuFh9-{uS|rwbgAp zH2*Pu)@Q}$r`3)vl|7>!n?5(6;Go!jnL4G(8|_;5hIMyd-gC08amaM#^^)})4Wtce z3fn<7V0N)BM;Fo#Q9&ITT6A|9N61Q`uHR*^I@f*&qV3eZ$vfeOD_XRwvr1%{eK7;U z5N--vJR^lFVkhcn_Da_*%LFvU*R%DCzS-u*;ggLrmBOW*AL$Os8u9TI)5ut|CJ}+Z zfHOUM4h47-=D>Fnev;B6>Y@$ejFVoaT= zcl2Q#Lo5sSj3qz2XqgntWp$Oyn#=k|CXNBDSj_r1mR%)h)w|sRn)reP=r#XaibTe?yjqSqGXeI@#ZkMmySP+*dyliU~orMPx?kutqH z8qg=zCERA+Fi}%l(Os6};undg;VMyC zF+K@TQ*1JQ^X7}5m4B$dRez%Oq3ArLYdErr#AW{=)k2~ZhU19Km>8!8ao7jVpX z*h9`m+`i-fzWJlF3bAwk?lMp-*$jH;dXj-k$7 z4a)^vF-Jx>$ScZE7@-^TD@+tUg*gSiJGzisXa$>#8AHW|4FsnLuKNyp>bc%?ptCi- zXK?4Ifq~Y88_G%_r47VV1lqYqSjUeI|LglR^kebMsae~PLxYHJ<5#XtZ=U-+aW88w z@Xo=dA0#cusZ&@Y&Bz=?6Fd`6=jcLI;ayk>zd^W2o{FHO6vovi$)t1S*c8x~(L6DI zzR@_^@%x?e;KvVqle~4B17yDy?)(ZR&KE4O}i4yn!9edMznWS zXOyF487^6!k2+g$s`Pjfb>81c8`Z00b3Bv8Vcz$vueX}j>pnbfdwf`!k(-vWm;65d zL`+NM3YkKz#2et;Uw9qS8Pk-`Lyp@g89!%aw}(^dAw9@zxy_? zpKrWtCUGfb-ETYaAe26o*@IJ$@0dt|B&(v{b)B2k`T@qt<`3=hV3M&UXd7CB%poo8b95<^Ka?-1#J}0w$-U4C{b1XQ-E79lQkS9*UA-dTCe9;l zdd`|`))z@Fb0`djwG#MHIXx4q$S@U89jIyL7iw2R;8)np!~yhxag35>#rpCGXi z;&AcsDfl#;45#6^30$PaaB|eonBD~L)c(w`c`n7O6&^Lq^%bo(Z#H_JN9m`#7s|io zZ9Up6rY$|0%MPE@75*mfDF68C3w21B=C+dA8SAVEZBCH;sCSdUY>;&5b7ULZ5Nic} zfqp?aC2ykbU0T(RK4$SZe%>E$A44c`l3RxCMH>rB$le_9>b=>I!RJ$`)f zRKr>FdHG8(WRG1DRNK{#y)}CGouz|ajw8Zt-fP~^9}yiQi8Mv;W5l50qkmQjG>8qu z6r;?-B7=1U6MQ{ACtN<;6Kr}c8ci$>Dm9x_VlRtJXNb=7Gjg3}J$H=jANwD!A5vdz zK39AY9_)Qr(b3Z={rpqaT&YUI?`)3r%%qsOjp&{T9`Z6l8vhHvesm%F@M)YCUV!L8 z7Kk*X9K@YT&Pk8XnJ$PfOMLS6d0bQItGw?0!N`xQv!_@7{n-Blk`s`efaC-uCm=Zi z$q7hKKym_-6Of#M==$wGg z3Fw@F&I#z8fX)f%oPf>==$wGg30UiZwGLS8fVB=->wvWmSnGhb4p{4ewGLS8fVB=- z>wvWmSnGhb4p{2|&I#b00L}^EoB+-V;G6)?3E-Rn&I#b00L}^EoB+-V;G6)?3E-Rn z&IusI0zxbx!~#MrAjASfEFi=JLM$M}0zxbx!~#MrAjASfEFi=JLM$M}0=Euu>j1Y7 zaO(iK4sh!Lw+?XY0Jjcs>j1Y7aO(iK4sh!Lw+?XY0JjdX5(6tSuo43+F|ZN?EAjuQ zm6#e>iGh_ESc!p^7+8scl^9rwft46oiGh_EScw~F+X3eUa83Z{1aM9O=LB$00Otg7 zP5|cwa83Z{1aM9O=LB$00Otg7P5|cwa83Z{1aM9O=LB$00Otg7P5|cwa8CZ0I4A$0 zc8ChYp79A#E|T&@NO1 znPN9k*iaTkrH_@Hn7xFRzwsFzrvKt(i$$Gy)>!pu^Y^H}$1IqB^zT3FVrp)Da;EH3 z9$otT1aypW#1H|8Q-xXJAMgx*j5HM06Za$qnaxv7tjce&ep&R+ZWQ_X^P1nz1w|8%{oI~w*sg`hLEWkW9SgdfP}H7D8A5)Kpvk)*T6@Pmgz>9 zv^kZ@GMOT#+@mZqG?BZT8>o5x3IF#DT_R1NYqUzeb6wNa5>CbRg_8-EIBEDId=7Vk za3x$hT0dSl^=i)N;``P3=LQ}5z0PA%Uw(ay_#;g<&SZ1($>lmJBPD-Ls=FH&d=E)3 zY~IZQ?jby=K8zQ14B?>PmcX(1 zEJKO|_PyL){@L|e%o^%ziYSFk;VxghSjI$2W%Z}~o6Q%cF+{IWhs|@j>h|I@IoDF< zQyq9Mv<@YS%{h5G1`rw3h5QvP65!(1<*aUZXnuUhMnmEz z?ixaf=RyMG8im?U?V90dxzUh!vM<9L?5hroY_n5S>f+j?dPpPqHJBOJfFp5J1o?>g zn1zH(=_+}WWm8Y&nnhma^g|z;7o@)r?uF8Fo=xHz7JVVB@Sm(sn(F|owE9;JTG`&=MF@D z>Rr_Sv9cdeCvmQbck)V$oWyM|U7vgBt&i+E+zov*5bL4J=y2>S=m*3Iabft7{K1#~ zZ+N;pb=z2(-7>(c$twm+SY7(f;c&X;n0-6ytL)5`54aw)w&rIYkD)^PEVty^*p0}` zBnNyIObvU%i#S)}uLv~xFwrHWI=`blu9mKatvi1(WpaAS=I8N2IlUTNJ>TNh7xDrs zlzQ4GGuCwu4ek@Zr-QV@AoNr02(%2XVn3sM!=42d_~m)DI8xb!n_B9VRTUL{#q|Z| z*!52p9UW~2uZTwO0j7cpFgw1EXcqa0OintJ z>0A&~;Ze8Ma^_9ZP{GvZa=_O4qYefO_E-GtV$IjtR9EzPObZ@3INtNH^+N{bg>|4O zuyfEP^ctIw4hT~Z;_{>NIPG}*L7hpUUY5$u>#kx-{QYcl4AF;Qe>yF5O$iLeb)#Ai zYlSNq3Ys%ClU|U8BFV%9T*%2ua$#Nk5%EQ2KrCN!eWpO6*Rjl zAz+zD*07}2C*M! z57WXeFb02z#2@uDwm#V=Yqn6dQndbk+i_3jhZi&FR`a*D|81Veo}at4CsD8XN3F)- zmDy$64kwbQv%gueE>aQ018qYskUy3S-4<$xp!a>_R&4*wit1jOPThYu<;<^e@fMw> zp|jp^{jRo1^NDAm@Kr^#_S3|&%sl^e(Zt>u$A}|B9?lRx15d)w@wuePD8D$p6#DF( zqTNb{hL-ldx3wcZvm$GazilaK7?U`^3;vUQa${LN?oNvNqOGShkJpO-%iv6;A4VD4 zgUTRH>^RCUbTts=BjmREXwCAfal3Y_@(o#i(NjER)(slhyxpoIu7v*-0+56uRr3q zG&CC3>b|8QqayN`E0|@BT5LCQLtuVuoacR0=VW7g4Rxt(u521x!eVrFcnCosCl2$% zd^kyhR=9n1a6Bs2F^9h-uX^x#PRDj{``F@_yX#ATVyR@9n=jG}Ge{RHb!y(ZD|6rW zVY`cl_k2K1hyrRFgE+ZiL!m{CIx0KlPk@d0qzn3?>3#pZtD5~va?+bmdysKKJ1kOoKjg1eCHVaoIT*mRiS7A+@7a=!%IQl65LK=JSLP=mv zePev*uf8|q+j9;Zhkr|{by@nj*hJ3AWZ$aRx@vTE|NJ9I*D-IK!0#bA6caY~m}pTX-Be1HayT6y(uLndU^DM9#aYB!H(NEsxJ$p0==UzS)XrKVTwOw zAEYqE(?%bY_VE-rcK8PDg{vX_4OfpLB{ZhJ&8;Zaf0Efm=-PTeI6=J-vdOmBPGiS9 z&CMsuB%7q1rcGn~&T{AxgPWtzSm52zUX(Jn7}|%_pfF51awzz~|GHPCGqqi#dHo$G zjZZhku5k%_B1DVBblt!>Xvj|jb6XusCLUDZ}}IolzH6qglMN$S9Vh8bZ!I32e| zFpX%8VNJA1N9FmJ2|mR&hrZhC|MZb?_@V z`sgESLRrx6*e2*VBnYWtERZh2DE~aq87EEKWwQ|jKJ{5eVM!*z>hnBj5dQ|YRaaML zCO%wwyWM73uU~mo7@GAynKn))%8C?$?||uGTeusiNPHF{LC#IwO_#~PQGWQ;nY_#uwgU%sV}KEr@$w1ERexLd)nr>>6hf!$>|Tnl0CF--p^2vRSSnQ6_dkb z`yx-1jPXS$_gWyljf05iB1^~;Nx2!{@~JC6)|$0Ackc{tPAV)n|9o&r!;r_u#D7bS z`MSS~pb#lh# z*-~FSU;aKHm%*NtK&FZeB(CFpPyYYPVJkc*X*x1H)+l*B^I>7`bcuZ-cpX7oAp^e+%Ep7e`e~ulAy69{S9sP zT>}PlC)+)zCeH-_&|pWT0Y((sf$AX#EHyeeR1q=h6Yu6~?`zd!Y^n3`za`m2(GDK1 zvt_i0dv@Pf7OFnJ?KgU5-F*DyZkcV~t@OQwq8QDH6+%2t8)kx+;9h()sX8h<4wa&o zJyUeM%CzD1OT%~cqXM7tYiv6$6!whYIdz0Au2J2*t}%IM(p<={#M#h`HDErt0ZG7U zLkCbkB#&)J-45*xH1OGQt$kExIcMan?XJ8a^GoCjw-jp}&GN3^=JF>8;xpSmHf#$PF;zA866jHPxucf z3JbtuI5mPpczASi{L|FDoJS=~)m)969lCuSA>m`Bh&^4b8-?tXasW=g$x-85ce*0`R^giebKv_nqf+_Qd5_sFH$qx zQ8oS%Sa1B2IM&;X=%{#(tUfN*&T&Y66n{5bF`|60jSn%9IW!Z+i%mKC z|1*d3Ff&N@5aWOhuRUj+otlNNVYLQy^V79Kp^yt3jM|iWJB;7TKSz)Dzr(+L(@S=1TsMIu!Y!sgVLgpH?^|iola;2iF71BNk9G@VoBn%T zv@NWPJRzcvvP;TK+J?qwtQhTYyCwM?2Kt1~qYSW>C+~lXkSm6atO@?$Pwi#o+->V` z?slhLop@tZvP;m3bK=Z3iiqF4tC_RJk)gLq?Thu}mFS{xS<)%iaUoIhq-y*qdW(m!%s%tILbK;v_fq-++$Dy-}+! z`!8;MzW#{*P!V(}wjKHfaYENHN=S`hBY#iNVka8ge6t9HLA5Bw0g3uc#^*aubN=(& zUiwO&fj*4&l(bRR(^S4JRLROpo{D9TQXwJm&tV$a2_D565l14-$o+{@8NT`Ga;@6t z7oD&525(KmOaFcp9O%<8pR?qPzUm}Dbh|fe#|uaOmK8aX`mrmaDB9 zUGES}<-fw7!0`1@W2<91a4L9czPqnQyUx8ryWmF#B59ti8CgnX#6u@1Nr4scOT_d@ z-Pp|}ROUhf`{U!f_}02NM#Co4B`e~;hL6HdF>{0nWQ*G?JXgi)KQxYy>E$L8y2EG4>;7a|@Ir*Up4Pp204#LJM5BHzT~l7+JJ3Kt&FK0~)v^_YHm zIMei1eS7sd;k4lS@JmG!c8Xo0678V z1dtOzP5?Op=LC38fae5wPJrhGcus)l1b9w> zAr=^7fgu(cVu2wR7-E4T78qiIAr=^7fgu(cVu2wR7-E4T78qiIAr@@wfNdSHtpm1o zz_t$9)&bi(U|R=l>ws+?u&o2Ob-=a`*wz8tI$&D|Z0mqkVz5dKR*AtXF<2!AtHfZH z7_1V5RbsG83|5K3Dlu3k2CKwil^CoNgH>X>^!Ewq7~zN^0uHANv%o*#8T=S&C<>4h zKu!QT0ptXb6F^P?IRWGZkdyz5~Uv1dtOzP5?Opo06F=;NKU8#IVoq$pG_wvULY4m zh!fjz)-XNX4JY7TN$OEtaZAamS-eGFl>znK?Iv$2N6yXqtR8L`|IP-&f`4eRBhmmP3hhAkkOP()og1o%nDmKvbG7%iYB9Fd0ptXb6F^P? MIRWJ4{|h str: - """Description of what this tool does.""" - return f"Result: {param}" - -agent = Agent( - task="Your task", - llm=llm, - browser=browser, - use_custom_tools=[custom_tool], -) \ No newline at end of file diff --git a/config.py b/config.py new file mode 100644 index 0000000..ed4a4fd --- /dev/null +++ b/config.py @@ -0,0 +1,95 @@ +"""Configuration settings for Beacon.""" + +# Audio Settings +DEFAULT_RECORDING_DURATION = 7.0 # seconds +DEFAULT_TTS_VOICE = "coral" # Options: coral, alloy, echo, fable, onyx, nova, shimmer +SAMPLE_RATE = 16_000 # Hz, optimized for speech recognition +AUDIO_CHANNELS = 1 # Mono + +# Agent Settings +MAX_STEPS_PER_TASK = 5 # Maximum browser steps per user command +INITIAL_MAX_STEPS = 2 # Steps for initial page load + +# Keyboard Shortcuts (displayed to users) +SHORTCUTS = { + "voice": "Command-R (or Control-R)", + "stop_audio": "Command-S (or Control-S)", + "help": "Command-H (or Control-H)", + "quit": "Command-Q (or Control-Q)", +} + +# Safety Features - Actions that require confirmation +HIGH_RISK_KEYWORDS = [ + "submit payment", + "purchase", + "buy now", + "checkout", + "confirm order", + "post", + "publish", + "delete", + "send message", + "send email", + "transfer", + "withdraw", +] + +# UI Settings +BANNER_WIDTH = 60 +ENABLE_COLORED_OUTPUT = True # Set to False for better screen reader compatibility + +# Browser Settings +BROWSER_KEEP_ALIVE = True +BROWSER_HEADLESS = False # Set to True to hide browser window + +# Agent Instructions +SYSTEM_PROMPT = """ +You are Beacon, a voice-first browser assistant for blind users. + +Your role: +1. Understand web pages and present them as simple, spoken summaries +2. Identify the page type (shopping, article, form, etc.) and main purpose +3. Extract key information and present it concisely +4. Offer the most important actions as a numbered menu (up to 5 items) +5. Perform actions based on user voice commands +6. Always confirm before high-risk actions (payments, submissions, posts) + +CRITICAL: ASK WHEN UNSURE +- Use the "ask_for_user_help" tool whenever you're uncertain +- Don't guess when there are multiple valid options +- Ask about ambiguous situations +- Examples: "I see three login buttons, which should I use?", "Should I sort by price or rating?" + +Communication style: +- Be concise and clear - blind users rely on audio, so brevity matters +- Use natural, friendly language +- Present information in order of importance +- Offer numbered choices for actions (e.g., "1. Add to cart, 2. Read reviews") +- Keep the user informed of what's happening - don't work silently for too long +- When reading long content, break it into digestible chunks + +High-risk actions that REQUIRE confirmation (use request_confirmation): +- Submitting payment information +- Posting or publishing content +- Making purchases +- Deleting anything +- Sending messages or emails + +Page analysis format: +When analyzing a page, always provide: +1. Page type (one word: shopping, article, form, login, search, etc.) +2. Main purpose (one sentence) +3. Key information (2-4 bullet points) +4. Available actions (numbered list, up to 5 most important) + +Example: +"This is a shopping page. It's a product page for wireless headphones. +Key details: Price is $99, 4.5 star rating, free shipping available. +Here are your options: +1. Add to cart +2. Read customer reviews +3. See technical specifications +4. Compare with similar products +5. Ask a question about this product" + +Remember: The user can't see the screen. Your voice is their window to the web.""" diff --git a/gemini-pc-use/main.py b/gemini-pc-use/main.py deleted file mode 100644 index 46f4a68..0000000 --- a/gemini-pc-use/main.py +++ /dev/null @@ -1,50 +0,0 @@ -from google import genai -from google.genai import types -from google.genai.types import Content, Part -from dotenv import load_dotenv -import os -load_dotenv() - - - -client = genai.Client(api_key=os.getenv("GEMINI_API_KEY")) - -# Specify predefined functions to exclude (optional) -excluded_functions = ["drag_and_drop"] - -generate_content_config = genai.types.GenerateContentConfig( - tools=[ - # 1. Computer Use tool with browser environment - types.Tool( - computer_use=types.ComputerUse( - environment=types.Environment.ENVIRONMENT_BROWSER, - # Optional: Exclude specific predefined functions - excluded_predefined_functions=excluded_functions - ) - ), - # 2. Optional: Custom user-defined functions - #types.Tool( - # function_declarations=custom_functions - # ) - ], - ) - -# Create the content with user message -contents=[ - Content( - role="user", - parts=[ - Part(text="Find the latest Ben Eater video and comment 'Great video!' on it." ), - ], - ) -] - -# Generate content with the configured settings -response = client.models.generate_content( - model='gemini-2.5-computer-use-preview-10-2025', - contents=contents, - config=generate_content_config, -) - -# Print the response output -print(response) \ No newline at end of file diff --git a/gemini-pc-use/tools.py b/gemini-pc-use/tools.py deleted file mode 100644 index e69de29..0000000 diff --git a/main.py b/main.py new file mode 100644 index 0000000..665b41a --- /dev/null +++ b/main.py @@ -0,0 +1,395 @@ +"""Beacon - Voice-First Browser Controller for Blind Users. + +Beacon understands web pages and presents them as simple spoken menus, +allowing blind users to navigate and interact through natural voice commands. +""" + +import asyncio +import os +from threading import Thread, Event +from queue import Queue, Empty +import time +from dotenv import load_dotenv +from browser_use import Agent, Browser, ChatBrowserUse, Tools, ChatGoogle +from pynput import keyboard +from audio_tools import AudioHandler +import time +from config import ( + DEFAULT_RECORDING_DURATION, + DEFAULT_TTS_VOICE, + MAX_STEPS_PER_TASK, + INITIAL_MAX_STEPS, + SHORTCUTS, + BANNER_WIDTH, + BROWSER_KEEP_ALIVE, + BROWSER_HEADLESS, + SYSTEM_PROMPT, +) + +load_dotenv() + +# Global state for keyboard control +voice_trigger = Event() +help_trigger = Event() +stop_audio_trigger = Event() # Cmd/Ctrl+S to stop audio playback +command_queue = Queue() + + +HELP_TEXT = f""" +Beacon Help Guide. + +Keyboard Shortcuts: +Press {SHORTCUTS['voice']} to start voice recording. +Press {SHORTCUTS['stop_audio']} to stop current audio playback. +Press {SHORTCUTS['help']} to hear this help message. +Press {SHORTCUTS['quit']} to quit Beacon. + +Voice Commands: +You can ask Beacon to: +- Navigate to websites: "Go to amazon.com" or "Open YouTube" +- Summarize the page: "What is this page?" or "Summarize" +- Perform actions: "Click add to cart" or "Do number 2" +- Read content: "Read the main article" or "Read reviews" +- Fill forms: "Type John Doe in the name field" +- Search: "Search for wireless headphones" +- Go back: "Go back" or "Previous page" + +Safety Features: +Beacon will always ask for confirmation before: +- Submitting payment information +- Posting or publishing content +- Deleting anything +- Making purchases + +Examples: +"Open amazon.com" - Opens Amazon +"What can I do here?" - Summarizes available actions +"Do 1" - Performs the first action from the menu +"Read more details" - Reads additional content +"Help" - Plays this help message + +Remember: Beacon is here to help you browse the web efficiently. +Just speak naturally and Beacon will understand your intent. +""" + + +def keyboard_listener_thread(): + """Listen for global keyboard shortcuts using pynput.""" + + listener_holder: dict[str, keyboard.GlobalHotKeys] = {} + + def trigger_voice() -> None: + print("🎤 Voice command triggered") + voice_trigger.set() + return "r" + + def trigger_help() -> None: + help_trigger.set() + + def trigger_stop_audio() -> None: + print("🎤 Voice command triggered") + stop_audio_trigger.set() + + + def trigger_quit() -> None: + command_queue.put("__QUIT__") + listener = listener_holder.get("listener") + if listener: + listener.stop() + + hotkeys = { + '+r': trigger_voice, + '+r': trigger_voice, + '+s': trigger_stop_audio, + '+s': trigger_stop_audio, + '+h': trigger_help, + '+h': trigger_help, + '+q': trigger_quit, + '+q': trigger_quit, + } + + listener = keyboard.GlobalHotKeys(hotkeys) + listener_holder["listener"] = listener + listener.start() + listener.join() + + +async def handle_voice_command(audio_handler: AudioHandler) -> str | None: + """Capture and transcribe a voice command.""" + + audio_handler.stop_playback() + + try: + command = await asyncio.to_thread( + audio_handler.record_and_transcribe, + duration_seconds=DEFAULT_RECORDING_DURATION + ) + except Exception as exc: + print(f"Voice command failed: {exc}") + audio_handler.play_speech("Sorry, I could not process that. Please try again.") + return None + + if not command or command.strip() == "": + print("No speech detected.") + audio_handler.play_speech("I didn't catch that. Please try again.") + return None + + print(f"Voice command: {command}") + audio_handler.play_speech(f"You said: {command}") + return command.strip() + + +async def check_for_keyboard_events(audio_handler: AudioHandler) -> str | None: + """Check for keyboard shortcuts and return command if any.""" + if stop_audio_trigger.is_set(): + stop_audio_trigger.clear() + was_playing = audio_handler.is_playing + audio_handler.stop_playback() + if was_playing: + print("⏹️ Audio playback stopped by keyboard shortcut") + return None + + if voice_trigger.is_set(): + voice_trigger.clear() + return "r" + + if help_trigger.is_set(): + help_trigger.clear() + audio_handler.play_speech(HELP_TEXT) + print("\n" + HELP_TEXT) + return None + + try: + cmd = command_queue.get_nowait() + return cmd + except Empty: + return None + + +async def analyze_page_and_speak(agent: Agent, audio_handler: AudioHandler): + """Analyze the current page and present key information to the user.""" + analysis_task = """ + Analyze this web page and provide: + 1. Page type (e.g., shopping page, article, form, search results, login page) + 2. Main purpose of the page in one sentence + 3. Most important information on the page (2-3 key points) + 4. Available actions as a numbered list (up to 5 most important actions) + + Format your response clearly for a blind user. + """ + + agent.add_new_task(analysis_task) + result = await agent.run(max_steps=5) + + # Extract and speak the analysis + if result: + audio_handler.play_speech("Page analysis complete. Here's what I found.") + # The agent will have already generated output; we just confirm completion + + +async def main(audio_handler: AudioHandler): + """Main Beacon application loop.""" + + # Start keyboard listener thread + listener_thread = Thread(target=keyboard_listener_thread, daemon=True) + listener_thread.start() + + # Initialize browser and agent + print("🚀 Starting Beacon browser...") + browser = Browser(keep_alive=BROWSER_KEEP_ALIVE, headless=BROWSER_HEADLESS) + await browser.start() + # llm = ChatBrowserUse() + llm = ChatGoogle(model='gemini-2.5-flash', temperature=0.2, api_key=os.getenv("GEMINI_API_KEY")) + + tools = Tools() + + # @tools.action(description="Speak an alert or information aloud to the blind user.") + # async def speak_to_user(message: str, priority: str | None = None) -> str: + # """Convert the provided message into speech and play it for the user.""" + # cleaned = message.strip() or "Attention needed." + # spoken_message = f"Priority {priority}. {cleaned}" if priority else cleaned + + # print(f"🔊 [Beacon] {spoken_message}") + + # try: + # await asyncio.to_thread(audio_handler.play_speech, spoken_message) + # except Exception as exc: + # print(f"Failed to voice alert: {exc}") + # return f"Alert printed but speech failed: {exc}" + + # return f"Message delivered: {spoken_message}" + + @tools.action(description="Request explicit confirmation from the user before performing high-risk actions.") + async def request_confirmation(action_description: str) -> str: + """Ask the user to confirm a high-risk action before proceeding.""" + prompt = f"Confirmation required: {action_description}. Say 'yes' to confirm or 'no' to cancel." + + print(f"⚠️ {prompt}") + await asyncio.to_thread(audio_handler.play_speech, prompt) + + # Get voice response + audio_handler.play_speech("Listening for your response.") + try: + response = await asyncio.to_thread( + audio_handler.record_and_transcribe, + duration_seconds=5.0 + ) + response_lower = response.lower().strip() + + if any(word in response_lower for word in ["yes", "confirm", "proceed", "do it", "go ahead"]): + await asyncio.to_thread(audio_handler.play_speech, "Confirmed. Proceeding.") + return "USER_CONFIRMED" + else: + await asyncio.to_thread(audio_handler.play_speech, "Cancelled.") + return "USER_CANCELLED" + except Exception as exc: + print(f"Confirmation failed: {exc}") + await asyncio.to_thread(audio_handler.play_speech, "Could not get confirmation. Action cancelled.") + return "USER_CANCELLED" + + # @tools.action(description="Describe what you are currently doing to keep the blind user informed.") + # async def describe_what_im_doing(description: str) -> str: + # """Tell the user what action or task you are currently performing. + + # This keeps the user aware of what's happening and maintains engagement. + + # Args: + # description: A brief, clear description of what you're about to do or are doing. + # Examples: "Clicking the search button", "Scrolling down to see more results", + # "Opening the first article", "Typing in the search box" + + # Returns: + # Confirmation that the message was delivered. + # """ + # message = f"{description}" + # print(f"🔧 [Action] {message}") + + # try: + # await asyncio.to_thread(audio_handler.play_speech, message) + # except Exception as exc: + # print(f"Failed to describe action: {exc}") + # return f"Description printed but speech failed: {exc}" + + # return f"User informed: {message}" + + @tools.action(description="Ask the user for help or clarification when you're unsure how to proceed.") + async def ask_for_user_help(question: str) -> str: + """Ask the blind user a question when you need clarification or guidance. + + Use this when: + - Multiple options exist and you're unsure which to choose + - The page is ambiguous or unclear + - You need more context about what the user wants + - An unexpected situation occurs + + Args: + question: A clear, specific question for the user. + Examples: "I found three login buttons. Which one should I use?", + "Should I filter by price or by rating?", + "The page has a popup. Should I close it or interact with it?" + + Returns: + The user's spoken response. + """ + prompt = f"{question} Please speak your answer after the beep." + print(f"❓ [Question] {question}") + + await asyncio.to_thread(audio_handler.play_speech, prompt) + + # Get voice response + try: + response = await asyncio.to_thread( + audio_handler.record_and_transcribe, + duration_seconds=7.0 + ) + + if not response or response.strip() == "": + await asyncio.to_thread(audio_handler.play_speech, "I didn't catch that. I'll make my best guess.") + return "USER_DID_NOT_RESPOND" + + print(f"📝 User answered: {response}") + await asyncio.to_thread(audio_handler.play_speech, f"Got it. {response}") + return response.strip() + + except Exception as exc: + print(f"Failed to get user response: {exc}") + await asyncio.to_thread(audio_handler.play_speech, "I couldn't hear your response. I'll proceed with my best judgment.") + return "USER_DID_NOT_RESPOND" + + # Create agent with initial task + agent = Agent( + task="do nothing", + browser_session=browser, + llm=llm, + tools=tools, + extend_system_message=SYSTEM_PROMPT, + ) + + audio_handler.play_speech("Ready for your command.") + + # Main interaction loop + print("\n" + "="*BANNER_WIDTH) + print(f"Beacon is ready! Use {SHORTCUTS['voice']} to speak commands.") + print(f"Press {SHORTCUTS['stop_audio']} to stop audio playback.") + print(f"Press {SHORTCUTS['help']} for help.") + print(f"Press {SHORTCUTS['quit']} to quit.") + print("="*BANNER_WIDTH + "\n") + + while True: + # Check for keyboard shortcuts + keyboard_cmd = await check_for_keyboard_events(audio_handler) + print + if keyboard_cmd == "__QUIT__": + break + if keyboard_cmd == "r": + nxt = await handle_voice_command(audio_handler) + else: + # Wait a bit and check again for keyboard events + await asyncio.sleep(0.1) + continue + + # Handle help command + if nxt.lower() in {"help", "help me", "what can i do", "commands"}: + audio_handler.play_speech(HELP_TEXT) + audio_handler.play_speech("Ready for your next command.") + continue + + # Handle exit commands + if nxt.lower() in {"exit", "quit", "goodbye", "stop"}: + break + + # Process the command + print(f"\n📝 Processing: {nxt}") + agent.add_new_task(nxt) + + try: + history = await agent.run(max_steps=MAX_STEPS_PER_TASK) + audio_handler.play_speech(history.final_result()) + except Exception as exc: + print(f"Error executing task: {exc}") + audio_handler.play_speech("Sorry, I encountered an error. Please try again.") + + # Cleanup + print("\n🛑 Shutting down Beacon...") + await browser.kill() + + +if __name__ == "__main__": + audio_handler = AudioHandler( + openai_api_key=os.getenv("OPENAI_API_KEY"), + voice=DEFAULT_TTS_VOICE + ) + + print("\n" + "="*BANNER_WIDTH) + print("🔷 BEACON - Voice-First Browser Controller") + print("="*BANNER_WIDTH) + + audio_handler.play_speech("Welcome to Beacon, your voice-first browser assistant!") + + try: + asyncio.run(main(audio_handler)) + except KeyboardInterrupt: + print("\n\nInterrupted by user.") + finally: + audio_handler.play_speech("Shutting down. Goodbye!") + print("👋 Beacon closed.") diff --git a/pyproject.toml b/pyproject.toml index 7963ddd..afb840f 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -7,4 +7,14 @@ dependencies = [ "google>=3.0.0", "google-genai>=1.46.0", "requests>=2.32.5", + "openai>=1.52.0", + "python-dotenv>=1.1.1", + "sounddevice>=0.5.3", + "soundfile>=0.13.1", + "pynput>=1.7.7", + "simpleaudio>=1.0.4", + "scipy>=1.16.2", + "playsound3>=3.2.8", + "librosa>=0.11.0", + ] diff --git a/recorder.py b/recorder.py new file mode 100644 index 0000000..98a8e14 --- /dev/null +++ b/recorder.py @@ -0,0 +1,136 @@ +"""Audio recording utilities for Beacon. + +This module provides simple audio capture from the system's default microphone. +It returns a file handle suitable for uploading to transcription APIs. + +Key Features: +- Records in WAV format for maximum compatibility +- 16kHz sample rate optimized for speech recognition +- Mono channel to reduce file size +- Automatic resource cleanup + +Dependencies: + - sounddevice: Cross-platform audio I/O + - soundfile: Audio file encoding/decoding + +Example: + >>> from recorder import record_mic + >>> audio_file = record_mic(5.0) # Record 5 seconds + >>> # Use audio_file with transcription API + >>> audio_file.close() +""" + +from __future__ import annotations + + +import os +import tempfile +from typing import BinaryIO + +from playsound3 import playsound +import sounddevice as sd +import soundfile as sf + +__all__ = ["record_mic"] + + +def record_mic( + duration_seconds: float, + *, + samplerate: int = 16_000, + channels: int = 1, + subtype: str = "PCM_16", + beep: bool = True, +) -> BinaryIO: + """Record audio from the default microphone and return a file handle. + + This function captures audio for the specified duration and returns a + file handle that can be passed directly to transcription APIs. + + Parameters: + duration_seconds: Number of seconds to record (float or int). + samplerate: Sample rate in Hz (default: 16000, optimal for speech). + channels: Number of channels - 1 for mono, 2 for stereo (default: 1). + subtype: WAV encoding format (default: "PCM_16" for 16-bit PCM). + + Returns: + An open binary file object (mode 'rb') pointing to a temporary .wav file. + The caller MUST close this file handle when done. + + Raises: + ValueError: If parameters are invalid (negative duration, etc.). + RuntimeError: If recording fails due to device or driver errors. + + Example: + >>> audio_file = record_mic(3.0) + >>> try: + ... # Use audio_file with your API + ... pass + ... finally: + ... audio_file.close() + """ + + # Validate parameters + if duration_seconds is None or duration_seconds <= 0: + raise ValueError("duration_seconds must be a positive number") + if samplerate <= 0: + raise ValueError("samplerate must be positive") + if channels not in (1, 2): + raise ValueError("channels must be 1 (mono) or 2 (stereo)") + if beep: + playsound('beep1.wav') # You must have a beep.wav file + + # Calculate total frames needed + frames = int(round(duration_seconds * samplerate)) + + # sounddevice uses float32 for capture; we'll convert to PCM_16 on write + dtype = "float32" + + # Capture audio from microphone + try: + print(f"🎤 Recording {duration_seconds} seconds...") + recording = sd.rec( + frames=frames, + samplerate=samplerate, + channels=channels, + dtype=dtype + ) + sd.wait() # Block until recording is complete + print("✓ Recording complete") + except Exception as exc: + raise RuntimeError(f"Microphone recording failed: {exc}") from exc + + # Create temporary file for the recording + # Using NamedTemporaryFile ensures we get a real filename that can be + # used reliably across different platforms and upload libraries + tmp = tempfile.NamedTemporaryFile( + prefix="beacon_recording_", + suffix=".wav", + delete=False + ) + tmp_path = tmp.name + tmp.close() # Close so soundfile can open it reliably on all platforms + + # Write the recording to WAV format + try: + sf.write(tmp_path, recording, samplerate=samplerate, subtype=subtype) + except Exception as exc: + raise RuntimeError(f"Failed to encode/write WAV audio: {exc}") from exc + + # Reopen as binary for reading and return + # The caller will use this handle with their API, then close it + if beep: + playsound('beep2.wav') + return open(tmp_path, "rb") + + +if __name__ == "__main__": + # Simple test: record 3 seconds and show file info + print("Testing microphone recording...") + f = record_mic(3) + try: + print(f"✓ Successfully recorded to: {getattr(f, 'name', '')}") + print(f"✓ File size: {os.path.getsize(f.name) if hasattr(f, 'name') else 'unknown'} bytes") + finally: + f.close() + print("✓ Test complete") \ No newline at end of file diff --git a/uv.lock b/uv.lock index 614fbd6..b876fab 100644 --- a/uv.lock +++ b/uv.lock @@ -1,5 +1,5 @@ version = 1 -revision = 2 +revision = 3 requires-python = ">=3.13" [[package]] @@ -116,6 +116,71 @@ wheels = [ { url = "https://files.pythonhosted.org/packages/3a/2a/7cc015f5b9f5db42b7d48157e23356022889fc354a2813c15934b7cb5c0e/attrs-25.4.0-py3-none-any.whl", hash = "sha256:adcf7e2a1fb3b36ac48d97835bb6d8ade15b8dcce26aba8bf1d14847b57a3373", size = 67615, upload-time = "2025-10-06T13:54:43.17Z" }, ] +[[package]] +name = "audioop-lts" +version = "0.2.2" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/38/53/946db57842a50b2da2e0c1e34bd37f36f5aadba1a929a3971c5d7841dbca/audioop_lts-0.2.2.tar.gz", hash = "sha256:64d0c62d88e67b98a1a5e71987b7aa7b5bcffc7dcee65b635823dbdd0a8dbbd0", size = 30686, upload-time = "2025-08-05T16:43:17.409Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/de/d4/94d277ca941de5a507b07f0b592f199c22454eeaec8f008a286b3fbbacd6/audioop_lts-0.2.2-cp313-abi3-macosx_10_13_universal2.whl", hash = "sha256:fd3d4602dc64914d462924a08c1a9816435a2155d74f325853c1f1ac3b2d9800", size = 46523, upload-time = "2025-08-05T16:42:20.836Z" }, + { url = "https://files.pythonhosted.org/packages/f8/5a/656d1c2da4b555920ce4177167bfeb8623d98765594af59702c8873f60ec/audioop_lts-0.2.2-cp313-abi3-macosx_10_13_x86_64.whl", hash = "sha256:550c114a8df0aafe9a05442a1162dfc8fec37e9af1d625ae6060fed6e756f303", size = 27455, upload-time = "2025-08-05T16:42:22.283Z" }, + { url = "https://files.pythonhosted.org/packages/1b/83/ea581e364ce7b0d41456fb79d6ee0ad482beda61faf0cab20cbd4c63a541/audioop_lts-0.2.2-cp313-abi3-macosx_11_0_arm64.whl", hash = "sha256:9a13dc409f2564de15dd68be65b462ba0dde01b19663720c68c1140c782d1d75", size = 26997, upload-time = "2025-08-05T16:42:23.849Z" }, + { url = "https://files.pythonhosted.org/packages/b8/3b/e8964210b5e216e5041593b7d33e97ee65967f17c282e8510d19c666dab4/audioop_lts-0.2.2-cp313-abi3-manylinux1_x86_64.manylinux_2_28_x86_64.manylinux_2_5_x86_64.whl", hash = "sha256:51c916108c56aa6e426ce611946f901badac950ee2ddaf302b7ed35d9958970d", size = 85844, upload-time = "2025-08-05T16:42:25.208Z" }, + { url = "https://files.pythonhosted.org/packages/c7/2e/0a1c52faf10d51def20531a59ce4c706cb7952323b11709e10de324d6493/audioop_lts-0.2.2-cp313-abi3-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:47eba38322370347b1c47024defbd36374a211e8dd5b0dcbce7b34fdb6f8847b", size = 85056, upload-time = "2025-08-05T16:42:26.559Z" }, + { url = "https://files.pythonhosted.org/packages/75/e8/cd95eef479656cb75ab05dfece8c1f8c395d17a7c651d88f8e6e291a63ab/audioop_lts-0.2.2-cp313-abi3-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:ba7c3a7e5f23e215cb271516197030c32aef2e754252c4c70a50aaff7031a2c8", size = 93892, upload-time = "2025-08-05T16:42:27.902Z" }, + { url = "https://files.pythonhosted.org/packages/5c/1e/a0c42570b74f83efa5cca34905b3eef03f7ab09fe5637015df538a7f3345/audioop_lts-0.2.2-cp313-abi3-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:def246fe9e180626731b26e89816e79aae2276f825420a07b4a647abaa84becc", size = 96660, upload-time = "2025-08-05T16:42:28.9Z" }, + { url = "https://files.pythonhosted.org/packages/50/d5/8a0ae607ca07dbb34027bac8db805498ee7bfecc05fd2c148cc1ed7646e7/audioop_lts-0.2.2-cp313-abi3-manylinux_2_31_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:e160bf9df356d841bb6c180eeeea1834085464626dc1b68fa4e1d59070affdc3", size = 79143, upload-time = "2025-08-05T16:42:29.929Z" }, + { url = "https://files.pythonhosted.org/packages/12/17/0d28c46179e7910bfb0bb62760ccb33edb5de973052cb2230b662c14ca2e/audioop_lts-0.2.2-cp313-abi3-musllinux_1_2_aarch64.whl", hash = "sha256:4b4cd51a57b698b2d06cb9993b7ac8dfe89a3b2878e96bc7948e9f19ff51dba6", size = 84313, upload-time = "2025-08-05T16:42:30.949Z" }, + { url = "https://files.pythonhosted.org/packages/84/ba/bd5d3806641564f2024e97ca98ea8f8811d4e01d9b9f9831474bc9e14f9e/audioop_lts-0.2.2-cp313-abi3-musllinux_1_2_ppc64le.whl", hash = "sha256:4a53aa7c16a60a6857e6b0b165261436396ef7293f8b5c9c828a3a203147ed4a", size = 93044, upload-time = "2025-08-05T16:42:31.959Z" }, + { url = "https://files.pythonhosted.org/packages/f9/5e/435ce8d5642f1f7679540d1e73c1c42d933331c0976eb397d1717d7f01a3/audioop_lts-0.2.2-cp313-abi3-musllinux_1_2_riscv64.whl", hash = "sha256:3fc38008969796f0f689f1453722a0f463da1b8a6fbee11987830bfbb664f623", size = 78766, upload-time = "2025-08-05T16:42:33.302Z" }, + { url = "https://files.pythonhosted.org/packages/ae/3b/b909e76b606cbfd53875693ec8c156e93e15a1366a012f0b7e4fb52d3c34/audioop_lts-0.2.2-cp313-abi3-musllinux_1_2_s390x.whl", hash = "sha256:15ab25dd3e620790f40e9ead897f91e79c0d3ce65fe193c8ed6c26cffdd24be7", size = 87640, upload-time = "2025-08-05T16:42:34.854Z" }, + { url = "https://files.pythonhosted.org/packages/30/e7/8f1603b4572d79b775f2140d7952f200f5e6c62904585d08a01f0a70393a/audioop_lts-0.2.2-cp313-abi3-musllinux_1_2_x86_64.whl", hash = "sha256:03f061a1915538fd96272bac9551841859dbb2e3bf73ebe4a23ef043766f5449", size = 86052, upload-time = "2025-08-05T16:42:35.839Z" }, + { url = "https://files.pythonhosted.org/packages/b5/96/c37846df657ccdda62ba1ae2b6534fa90e2e1b1742ca8dcf8ebd38c53801/audioop_lts-0.2.2-cp313-abi3-win32.whl", hash = "sha256:3bcddaaf6cc5935a300a8387c99f7a7fbbe212a11568ec6cf6e4bc458c048636", size = 26185, upload-time = "2025-08-05T16:42:37.04Z" }, + { url = "https://files.pythonhosted.org/packages/34/a5/9d78fdb5b844a83da8a71226c7bdae7cc638861085fff7a1d707cb4823fa/audioop_lts-0.2.2-cp313-abi3-win_amd64.whl", hash = "sha256:a2c2a947fae7d1062ef08c4e369e0ba2086049a5e598fda41122535557012e9e", size = 30503, upload-time = "2025-08-05T16:42:38.427Z" }, + { url = "https://files.pythonhosted.org/packages/34/25/20d8fde083123e90c61b51afb547bb0ea7e77bab50d98c0ab243d02a0e43/audioop_lts-0.2.2-cp313-abi3-win_arm64.whl", hash = "sha256:5f93a5db13927a37d2d09637ccca4b2b6b48c19cd9eda7b17a2e9f77edee6a6f", size = 24173, upload-time = "2025-08-05T16:42:39.704Z" }, + { url = "https://files.pythonhosted.org/packages/58/a7/0a764f77b5c4ac58dc13c01a580f5d32ae8c74c92020b961556a43e26d02/audioop_lts-0.2.2-cp313-cp313t-macosx_10_13_universal2.whl", hash = "sha256:73f80bf4cd5d2ca7814da30a120de1f9408ee0619cc75da87d0641273d202a09", size = 47096, upload-time = "2025-08-05T16:42:40.684Z" }, + { url = "https://files.pythonhosted.org/packages/aa/ed/ebebedde1a18848b085ad0fa54b66ceb95f1f94a3fc04f1cd1b5ccb0ed42/audioop_lts-0.2.2-cp313-cp313t-macosx_10_13_x86_64.whl", hash = "sha256:106753a83a25ee4d6f473f2be6b0966fc1c9af7e0017192f5531a3e7463dce58", size = 27748, upload-time = "2025-08-05T16:42:41.992Z" }, + { url = "https://files.pythonhosted.org/packages/cb/6e/11ca8c21af79f15dbb1c7f8017952ee8c810c438ce4e2b25638dfef2b02c/audioop_lts-0.2.2-cp313-cp313t-macosx_11_0_arm64.whl", hash = "sha256:fbdd522624141e40948ab3e8cdae6e04c748d78710e9f0f8d4dae2750831de19", size = 27329, upload-time = "2025-08-05T16:42:42.987Z" }, + { url = "https://files.pythonhosted.org/packages/84/52/0022f93d56d85eec5da6b9da6a958a1ef09e80c39f2cc0a590c6af81dcbb/audioop_lts-0.2.2-cp313-cp313t-manylinux1_x86_64.manylinux_2_28_x86_64.manylinux_2_5_x86_64.whl", hash = "sha256:143fad0311e8209ece30a8dbddab3b65ab419cbe8c0dde6e8828da25999be911", size = 92407, upload-time = "2025-08-05T16:42:44.336Z" }, + { url = "https://files.pythonhosted.org/packages/87/1d/48a889855e67be8718adbc7a01f3c01d5743c325453a5e81cf3717664aad/audioop_lts-0.2.2-cp313-cp313t-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:dfbbc74ec68a0fd08cfec1f4b5e8cca3d3cd7de5501b01c4b5d209995033cde9", size = 91811, upload-time = "2025-08-05T16:42:45.325Z" }, + { url = "https://files.pythonhosted.org/packages/98/a6/94b7213190e8077547ffae75e13ed05edc488653c85aa5c41472c297d295/audioop_lts-0.2.2-cp313-cp313t-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:cfcac6aa6f42397471e4943e0feb2244549db5c5d01efcd02725b96af417f3fe", size = 100470, upload-time = "2025-08-05T16:42:46.468Z" }, + { url = "https://files.pythonhosted.org/packages/e9/e9/78450d7cb921ede0cfc33426d3a8023a3bda755883c95c868ee36db8d48d/audioop_lts-0.2.2-cp313-cp313t-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:752d76472d9804ac60f0078c79cdae8b956f293177acd2316cd1e15149aee132", size = 103878, upload-time = "2025-08-05T16:42:47.576Z" }, + { url = "https://files.pythonhosted.org/packages/4f/e2/cd5439aad4f3e34ae1ee852025dc6aa8f67a82b97641e390bf7bd9891d3e/audioop_lts-0.2.2-cp313-cp313t-manylinux_2_31_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:83c381767e2cc10e93e40281a04852facc4cd9334550e0f392f72d1c0a9c5753", size = 84867, upload-time = "2025-08-05T16:42:49.003Z" }, + { url = "https://files.pythonhosted.org/packages/68/4b/9d853e9076c43ebba0d411e8d2aa19061083349ac695a7d082540bad64d0/audioop_lts-0.2.2-cp313-cp313t-musllinux_1_2_aarch64.whl", hash = "sha256:c0022283e9556e0f3643b7c3c03f05063ca72b3063291834cca43234f20c60bb", size = 90001, upload-time = "2025-08-05T16:42:50.038Z" }, + { url = "https://files.pythonhosted.org/packages/58/26/4bae7f9d2f116ed5593989d0e521d679b0d583973d203384679323d8fa85/audioop_lts-0.2.2-cp313-cp313t-musllinux_1_2_ppc64le.whl", hash = "sha256:a2d4f1513d63c795e82948e1305f31a6d530626e5f9f2605408b300ae6095093", size = 99046, upload-time = "2025-08-05T16:42:51.111Z" }, + { url = "https://files.pythonhosted.org/packages/b2/67/a9f4fb3e250dda9e9046f8866e9fa7d52664f8985e445c6b4ad6dfb55641/audioop_lts-0.2.2-cp313-cp313t-musllinux_1_2_riscv64.whl", hash = "sha256:c9c8e68d8b4a56fda8c025e538e639f8c5953f5073886b596c93ec9b620055e7", size = 84788, upload-time = "2025-08-05T16:42:52.198Z" }, + { url = "https://files.pythonhosted.org/packages/70/f7/3de86562db0121956148bcb0fe5b506615e3bcf6e63c4357a612b910765a/audioop_lts-0.2.2-cp313-cp313t-musllinux_1_2_s390x.whl", hash = "sha256:96f19de485a2925314f5020e85911fb447ff5fbef56e8c7c6927851b95533a1c", size = 94472, upload-time = "2025-08-05T16:42:53.59Z" }, + { url = "https://files.pythonhosted.org/packages/f1/32/fd772bf9078ae1001207d2df1eef3da05bea611a87dd0e8217989b2848fa/audioop_lts-0.2.2-cp313-cp313t-musllinux_1_2_x86_64.whl", hash = "sha256:e541c3ef484852ef36545f66209444c48b28661e864ccadb29daddb6a4b8e5f5", size = 92279, upload-time = "2025-08-05T16:42:54.632Z" }, + { url = "https://files.pythonhosted.org/packages/4f/41/affea7181592ab0ab560044632571a38edaf9130b84928177823fbf3176a/audioop_lts-0.2.2-cp313-cp313t-win32.whl", hash = "sha256:d5e73fa573e273e4f2e5ff96f9043858a5e9311e94ffefd88a3186a910c70917", size = 26568, upload-time = "2025-08-05T16:42:55.627Z" }, + { url = "https://files.pythonhosted.org/packages/28/2b/0372842877016641db8fc54d5c88596b542eec2f8f6c20a36fb6612bf9ee/audioop_lts-0.2.2-cp313-cp313t-win_amd64.whl", hash = "sha256:9191d68659eda01e448188f60364c7763a7ca6653ed3f87ebb165822153a8547", size = 30942, upload-time = "2025-08-05T16:42:56.674Z" }, + { url = "https://files.pythonhosted.org/packages/ee/ca/baf2b9cc7e96c179bb4a54f30fcd83e6ecb340031bde68f486403f943768/audioop_lts-0.2.2-cp313-cp313t-win_arm64.whl", hash = "sha256:c174e322bb5783c099aaf87faeb240c8d210686b04bd61dfd05a8e5a83d88969", size = 24603, upload-time = "2025-08-05T16:42:57.571Z" }, + { url = "https://files.pythonhosted.org/packages/5c/73/413b5a2804091e2c7d5def1d618e4837f1cb82464e230f827226278556b7/audioop_lts-0.2.2-cp314-cp314t-macosx_10_13_universal2.whl", hash = "sha256:f9ee9b52f5f857fbaf9d605a360884f034c92c1c23021fb90b2e39b8e64bede6", size = 47104, upload-time = "2025-08-05T16:42:58.518Z" }, + { url = "https://files.pythonhosted.org/packages/ae/8c/daa3308dc6593944410c2c68306a5e217f5c05b70a12e70228e7dd42dc5c/audioop_lts-0.2.2-cp314-cp314t-macosx_10_13_x86_64.whl", hash = "sha256:49ee1a41738a23e98d98b937a0638357a2477bc99e61b0f768a8f654f45d9b7a", size = 27754, upload-time = "2025-08-05T16:43:00.132Z" }, + { url = "https://files.pythonhosted.org/packages/4e/86/c2e0f627168fcf61781a8f72cab06b228fe1da4b9fa4ab39cfb791b5836b/audioop_lts-0.2.2-cp314-cp314t-macosx_11_0_arm64.whl", hash = "sha256:5b00be98ccd0fc123dcfad31d50030d25fcf31488cde9e61692029cd7394733b", size = 27332, upload-time = "2025-08-05T16:43:01.666Z" }, + { url = "https://files.pythonhosted.org/packages/c7/bd/35dce665255434f54e5307de39e31912a6f902d4572da7c37582809de14f/audioop_lts-0.2.2-cp314-cp314t-manylinux1_x86_64.manylinux_2_28_x86_64.manylinux_2_5_x86_64.whl", hash = "sha256:a6d2e0f9f7a69403e388894d4ca5ada5c47230716a03f2847cfc7bd1ecb589d6", size = 92396, upload-time = "2025-08-05T16:43:02.991Z" }, + { url = "https://files.pythonhosted.org/packages/2d/d2/deeb9f51def1437b3afa35aeb729d577c04bcd89394cb56f9239a9f50b6f/audioop_lts-0.2.2-cp314-cp314t-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:f9b0b8a03ef474f56d1a842af1a2e01398b8f7654009823c6d9e0ecff4d5cfbf", size = 91811, upload-time = "2025-08-05T16:43:04.096Z" }, + { url = "https://files.pythonhosted.org/packages/76/3b/09f8b35b227cee28cc8231e296a82759ed80c1a08e349811d69773c48426/audioop_lts-0.2.2-cp314-cp314t-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:2b267b70747d82125f1a021506565bdc5609a2b24bcb4773c16d79d2bb260bbd", size = 100483, upload-time = "2025-08-05T16:43:05.085Z" }, + { url = "https://files.pythonhosted.org/packages/0b/15/05b48a935cf3b130c248bfdbdea71ce6437f5394ee8533e0edd7cfd93d5e/audioop_lts-0.2.2-cp314-cp314t-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:0337d658f9b81f4cd0fdb1f47635070cc084871a3d4646d9de74fdf4e7c3d24a", size = 103885, upload-time = "2025-08-05T16:43:06.197Z" }, + { url = "https://files.pythonhosted.org/packages/83/80/186b7fce6d35b68d3d739f228dc31d60b3412105854edb975aa155a58339/audioop_lts-0.2.2-cp314-cp314t-manylinux_2_31_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:167d3b62586faef8b6b2275c3218796b12621a60e43f7e9d5845d627b9c9b80e", size = 84899, upload-time = "2025-08-05T16:43:07.291Z" }, + { url = "https://files.pythonhosted.org/packages/49/89/c78cc5ac6cb5828f17514fb12966e299c850bc885e80f8ad94e38d450886/audioop_lts-0.2.2-cp314-cp314t-musllinux_1_2_aarch64.whl", hash = "sha256:0d9385e96f9f6da847f4d571ce3cb15b5091140edf3db97276872647ce37efd7", size = 89998, upload-time = "2025-08-05T16:43:08.335Z" }, + { url = "https://files.pythonhosted.org/packages/4c/4b/6401888d0c010e586c2ca50fce4c903d70a6bb55928b16cfbdfd957a13da/audioop_lts-0.2.2-cp314-cp314t-musllinux_1_2_ppc64le.whl", hash = "sha256:48159d96962674eccdca9a3df280e864e8ac75e40a577cc97c5c42667ffabfc5", size = 99046, upload-time = "2025-08-05T16:43:09.367Z" }, + { url = "https://files.pythonhosted.org/packages/de/f8/c874ca9bb447dae0e2ef2e231f6c4c2b0c39e31ae684d2420b0f9e97ee68/audioop_lts-0.2.2-cp314-cp314t-musllinux_1_2_riscv64.whl", hash = "sha256:8fefe5868cd082db1186f2837d64cfbfa78b548ea0d0543e9b28935ccce81ce9", size = 84843, upload-time = "2025-08-05T16:43:10.749Z" }, + { url = "https://files.pythonhosted.org/packages/3e/c0/0323e66f3daebc13fd46b36b30c3be47e3fc4257eae44f1e77eb828c703f/audioop_lts-0.2.2-cp314-cp314t-musllinux_1_2_s390x.whl", hash = "sha256:58cf54380c3884fb49fdd37dfb7a772632b6701d28edd3e2904743c5e1773602", size = 94490, upload-time = "2025-08-05T16:43:12.131Z" }, + { url = "https://files.pythonhosted.org/packages/98/6b/acc7734ac02d95ab791c10c3f17ffa3584ccb9ac5c18fd771c638ed6d1f5/audioop_lts-0.2.2-cp314-cp314t-musllinux_1_2_x86_64.whl", hash = "sha256:088327f00488cdeed296edd9215ca159f3a5a5034741465789cad403fcf4bec0", size = 92297, upload-time = "2025-08-05T16:43:13.139Z" }, + { url = "https://files.pythonhosted.org/packages/13/c3/c3dc3f564ce6877ecd2a05f8d751b9b27a8c320c2533a98b0c86349778d0/audioop_lts-0.2.2-cp314-cp314t-win32.whl", hash = "sha256:068aa17a38b4e0e7de771c62c60bbca2455924b67a8814f3b0dee92b5820c0b3", size = 27331, upload-time = "2025-08-05T16:43:14.19Z" }, + { url = "https://files.pythonhosted.org/packages/72/bb/b4608537e9ffcb86449091939d52d24a055216a36a8bf66b936af8c3e7ac/audioop_lts-0.2.2-cp314-cp314t-win_amd64.whl", hash = "sha256:a5bf613e96f49712073de86f20dbdd4014ca18efd4d34ed18c75bd808337851b", size = 31697, upload-time = "2025-08-05T16:43:15.193Z" }, + { url = "https://files.pythonhosted.org/packages/f6/22/91616fe707a5c5510de2cac9b046a30defe7007ba8a0c04f9c08f27df312/audioop_lts-0.2.2-cp314-cp314t-win_arm64.whl", hash = "sha256:b492c3b040153e68b9fdaff5913305aaaba5bb433d8a7f73d5cf6a64ed3cc1dd", size = 25206, upload-time = "2025-08-05T16:43:16.444Z" }, +] + +[[package]] +name = "audioread" +version = "3.0.1" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/db/d2/87016ca9f083acadffb2d8da59bfa3253e4da7eeb9f71fb8e7708dc97ecd/audioread-3.0.1.tar.gz", hash = "sha256:ac5460a5498c48bdf2e8e767402583a4dcd13f4414d286f42ce4379e8b35066d", size = 116513, upload-time = "2023-09-27T19:27:53.084Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/57/8d/30aa32745af16af0a9a650115fbe81bde7c610ed5c21b381fca0196f3a7f/audioread-3.0.1-py3-none-any.whl", hash = "sha256:4cdce70b8adc0da0a3c9e0d85fb10b3ace30fbdf8d1670fd443929b61d117c33", size = 23492, upload-time = "2023-09-27T19:27:51.334Z" }, +] + [[package]] name = "authlib" version = "1.6.5" @@ -416,6 +481,15 @@ wheels = [ { url = "https://files.pythonhosted.org/packages/18/d5/7a04640bf559bb890455ffb28978daf7d44f667c3f04a4d422c655c1ba92/cython-3.1.6-py3-none-any.whl", hash = "sha256:91dcf7eb9b6a089ce4e9e1140e571d84c3bca834afb77ec269be7aa9d31a8157", size = 1223550, upload-time = "2025-10-23T12:38:16.732Z" }, ] +[[package]] +name = "decorator" +version = "5.2.1" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/43/fa/6d96a0978d19e17b68d634497769987b16c8f4cd0a7a05048bec693caa6b/decorator-5.2.1.tar.gz", hash = "sha256:65f266143752f734b0a7cc83c46f4618af75b8c5911b00ccb61d0ac9b6da0360", size = 56711, upload-time = "2025-02-24T04:41:34.073Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/4e/8c/f3147f5c4b73e7550fe5f9352eaa956ae838d5c51eb58e7a25b9f3e2643b/decorator-5.2.1-py3-none-any.whl", hash = "sha256:d316bb415a2d9e2d2b3abcc4084c6502fc09240e292cd76a76afc106a1c8e04a", size = 9190, upload-time = "2025-02-24T04:41:32.565Z" }, +] + [[package]] name = "distro" version = "1.9.0" @@ -434,6 +508,12 @@ wheels = [ { url = "https://files.pythonhosted.org/packages/55/e2/2537ebcff11c1ee1ff17d8d0b6f4db75873e3b0fb32c2d4a2ee31ecb310a/docstring_parser-0.17.0-py3-none-any.whl", hash = "sha256:cf2569abd23dce8099b300f9b4fa8191e9582dda731fd533daf54c4551658708", size = 36896, upload-time = "2025-07-21T07:35:00.684Z" }, ] +[[package]] +name = "evdev" +version = "1.9.2" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/63/fe/a17c106a1f4061ce83f04d14bcedcfb2c38c7793ea56bfb906a6fadae8cb/evdev-1.9.2.tar.gz", hash = "sha256:5d3278892ce1f92a74d6bf888cc8525d9f68af85dbe336c95d1c87fb8f423069", size = 33301, upload-time = "2025-05-01T19:53:47.69Z" } + [[package]] name = "frozenlist" version = "1.8.0" @@ -656,7 +736,16 @@ dependencies = [ { name = "browser-use" }, { name = "google" }, { name = "google-genai" }, + { name = "librosa" }, + { name = "openai" }, + { name = "playsound3" }, + { name = "pynput" }, + { name = "python-dotenv" }, { name = "requests" }, + { name = "scipy" }, + { name = "simpleaudio" }, + { name = "sounddevice" }, + { name = "soundfile" }, ] [package.metadata] @@ -664,7 +753,16 @@ requires-dist = [ { name = "browser-use", specifier = ">=0.9.1" }, { name = "google", specifier = ">=3.0.0" }, { name = "google-genai", specifier = ">=1.46.0" }, + { name = "librosa", specifier = ">=0.11.0" }, + { name = "openai", specifier = ">=1.52.0" }, + { name = "playsound3", specifier = ">=3.2.8" }, + { name = "pynput", specifier = ">=1.7.7" }, + { name = "python-dotenv", specifier = ">=1.1.1" }, { name = "requests", specifier = ">=2.32.5" }, + { name = "scipy", specifier = ">=1.16.2" }, + { name = "simpleaudio", specifier = ">=1.0.4" }, + { name = "sounddevice", specifier = ">=0.5.3" }, + { name = "soundfile", specifier = ">=0.13.1" }, ] [[package]] @@ -776,6 +874,15 @@ wheels = [ { url = "https://files.pythonhosted.org/packages/dd/01/43f7b4eb61db3e565574c4c5714685d042fb652f9eef7e5a3de6aafa943a/jiter-0.11.1-cp314-cp314t-win_arm64.whl", hash = "sha256:28e4fdf2d7ebfc935523e50d1efa3970043cfaa161674fe66f9642409d001dfe", size = 188069, upload-time = "2025-10-17T11:30:43.23Z" }, ] +[[package]] +name = "joblib" +version = "1.5.2" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/e8/5d/447af5ea094b9e4c4054f82e223ada074c552335b9b4b2d14bd9b35a67c4/joblib-1.5.2.tar.gz", hash = "sha256:3faa5c39054b2f03ca547da9b2f52fde67c06240c31853f306aea97f13647b55", size = 331077, upload-time = "2025-08-27T12:15:46.575Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/1e/e8/685f47e0d754320684db4425a0967f7d3fa70126bffd76110b7009a0090f/joblib-1.5.2-py3-none-any.whl", hash = "sha256:4e1f0bdbb987e6d843c70cf43714cb276623def372df3c22fe5266b2670bc241", size = 308396, upload-time = "2025-08-27T12:15:45.188Z" }, +] + [[package]] name = "jsonschema" version = "4.25.1" @@ -803,6 +910,57 @@ wheels = [ { url = "https://files.pythonhosted.org/packages/41/45/1a4ed80516f02155c51f51e8cedb3c1902296743db0bbc66608a0db2814f/jsonschema_specifications-2025.9.1-py3-none-any.whl", hash = "sha256:98802fee3a11ee76ecaca44429fda8a41bff98b00a0f2838151b113f210cc6fe", size = 18437, upload-time = "2025-09-08T01:34:57.871Z" }, ] +[[package]] +name = "lazy-loader" +version = "0.4" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "packaging" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/6f/6b/c875b30a1ba490860c93da4cabf479e03f584eba06fe5963f6f6644653d8/lazy_loader-0.4.tar.gz", hash = "sha256:47c75182589b91a4e1a85a136c074285a5ad4d9f39c63e0d7fb76391c4574cd1", size = 15431, upload-time = "2024-04-05T13:03:12.261Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/83/60/d497a310bde3f01cb805196ac61b7ad6dc5dcf8dce66634dc34364b20b4f/lazy_loader-0.4-py3-none-any.whl", hash = "sha256:342aa8e14d543a154047afb4ba8ef17f5563baad3fc610d7b15b213b0f119efc", size = 12097, upload-time = "2024-04-05T13:03:10.514Z" }, +] + +[[package]] +name = "librosa" +version = "0.11.0" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "audioread" }, + { name = "decorator" }, + { name = "joblib" }, + { name = "lazy-loader" }, + { name = "msgpack" }, + { name = "numba" }, + { name = "numpy" }, + { name = "pooch" }, + { name = "scikit-learn" }, + { name = "scipy" }, + { name = "soundfile" }, + { name = "soxr" }, + { name = "standard-aifc" }, + { name = "standard-sunau" }, + { name = "typing-extensions" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/64/36/360b5aafa0238e29758729e9486c6ed92a6f37fa403b7875e06c115cdf4a/librosa-0.11.0.tar.gz", hash = "sha256:f5ed951ca189b375bbe2e33b2abd7e040ceeee302b9bbaeeffdfddb8d0ace908", size = 327001, upload-time = "2025-03-11T15:09:54.884Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/b5/ba/c63c5786dfee4c3417094c4b00966e61e4a63efecee22cb7b4c0387dda83/librosa-0.11.0-py3-none-any.whl", hash = "sha256:0b6415c4fd68bff4c29288abe67c6d80b587e0e1e2cfb0aad23e4559504a7fa1", size = 260749, upload-time = "2025-03-11T15:09:52.982Z" }, +] + +[[package]] +name = "llvmlite" +version = "0.45.1" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/99/8d/5baf1cef7f9c084fb35a8afbde88074f0d6a727bc63ef764fe0e7543ba40/llvmlite-0.45.1.tar.gz", hash = "sha256:09430bb9d0bb58fc45a45a57c7eae912850bedc095cd0810a57de109c69e1c32", size = 185600, upload-time = "2025-10-01T17:59:52.046Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/1d/e2/c185bb7e88514d5025f93c6c4092f6120c6cea8fe938974ec9860fb03bbb/llvmlite-0.45.1-cp313-cp313-macosx_10_15_x86_64.whl", hash = "sha256:d9ea9e6f17569a4253515cc01dade70aba536476e3d750b2e18d81d7e670eb15", size = 43043524, upload-time = "2025-10-01T18:03:43.249Z" }, + { url = "https://files.pythonhosted.org/packages/09/b8/b5437b9ecb2064e89ccf67dccae0d02cd38911705112dd0dcbfa9cd9a9de/llvmlite-0.45.1-cp313-cp313-macosx_12_0_arm64.whl", hash = "sha256:c9f3cadee1630ce4ac18ea38adebf2a4f57a89bd2740ce83746876797f6e0bfb", size = 37253121, upload-time = "2025-10-01T18:04:30.557Z" }, + { url = "https://files.pythonhosted.org/packages/f7/97/ad1a907c0173a90dd4df7228f24a3ec61058bc1a9ff8a0caec20a0cc622e/llvmlite-0.45.1-cp313-cp313-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:57c48bf2e1083eedbc9406fb83c4e6483017879714916fe8be8a72a9672c995a", size = 56288210, upload-time = "2025-10-01T18:01:40.26Z" }, + { url = "https://files.pythonhosted.org/packages/32/d8/c99c8ac7a326e9735401ead3116f7685a7ec652691aeb2615aa732b1fc4a/llvmlite-0.45.1-cp313-cp313-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:3aa3dfceda4219ae39cf18806c60eeb518c1680ff834b8b311bd784160b9ce40", size = 55140957, upload-time = "2025-10-01T18:02:46.244Z" }, + { url = "https://files.pythonhosted.org/packages/09/56/ed35668130e32dbfad2eb37356793b0a95f23494ab5be7d9bf5cb75850ee/llvmlite-0.45.1-cp313-cp313-win_amd64.whl", hash = "sha256:080e6f8d0778a8239cd47686d402cb66eb165e421efa9391366a9b7e5810a38b", size = 38132232, upload-time = "2025-10-01T18:05:14.477Z" }, +] + [[package]] name = "markdownify" version = "1.2.0" @@ -838,6 +996,41 @@ wheels = [ { url = "https://files.pythonhosted.org/packages/ce/a3/3e71a875a08b6a830b88c40bc413bff01f1650f1efe8a054b5e90a9d4f56/mcp-1.19.0-py3-none-any.whl", hash = "sha256:f5907fe1c0167255f916718f376d05f09a830a215327a3ccdd5ec8a519f2e572", size = 170105, upload-time = "2025-10-24T01:11:14.151Z" }, ] +[[package]] +name = "msgpack" +version = "1.1.2" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/4d/f2/bfb55a6236ed8725a96b0aa3acbd0ec17588e6a2c3b62a93eb513ed8783f/msgpack-1.1.2.tar.gz", hash = "sha256:3b60763c1373dd60f398488069bcdc703cd08a711477b5d480eecc9f9626f47e", size = 173581, upload-time = "2025-10-08T09:15:56.596Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/6b/31/b46518ecc604d7edf3a4f94cb3bf021fc62aa301f0cb849936968164ef23/msgpack-1.1.2-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:4efd7b5979ccb539c221a4c4e16aac1a533efc97f3b759bb5a5ac9f6d10383bf", size = 81212, upload-time = "2025-10-08T09:15:14.552Z" }, + { url = "https://files.pythonhosted.org/packages/92/dc/c385f38f2c2433333345a82926c6bfa5ecfff3ef787201614317b58dd8be/msgpack-1.1.2-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:42eefe2c3e2af97ed470eec850facbe1b5ad1d6eacdbadc42ec98e7dcf68b4b7", size = 84315, upload-time = "2025-10-08T09:15:15.543Z" }, + { url = "https://files.pythonhosted.org/packages/d3/68/93180dce57f684a61a88a45ed13047558ded2be46f03acb8dec6d7c513af/msgpack-1.1.2-cp313-cp313-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:1fdf7d83102bf09e7ce3357de96c59b627395352a4024f6e2458501f158bf999", size = 412721, upload-time = "2025-10-08T09:15:16.567Z" }, + { url = "https://files.pythonhosted.org/packages/5d/ba/459f18c16f2b3fc1a1ca871f72f07d70c07bf768ad0a507a698b8052ac58/msgpack-1.1.2-cp313-cp313-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:fac4be746328f90caa3cd4bc67e6fe36ca2bf61d5c6eb6d895b6527e3f05071e", size = 424657, upload-time = "2025-10-08T09:15:17.825Z" }, + { url = "https://files.pythonhosted.org/packages/38/f8/4398c46863b093252fe67368b44edc6c13b17f4e6b0e4929dbf0bdb13f23/msgpack-1.1.2-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:fffee09044073e69f2bad787071aeec727183e7580443dfeb8556cbf1978d162", size = 402668, upload-time = "2025-10-08T09:15:19.003Z" }, + { url = "https://files.pythonhosted.org/packages/28/ce/698c1eff75626e4124b4d78e21cca0b4cc90043afb80a507626ea354ab52/msgpack-1.1.2-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:5928604de9b032bc17f5099496417f113c45bc6bc21b5c6920caf34b3c428794", size = 419040, upload-time = "2025-10-08T09:15:20.183Z" }, + { url = "https://files.pythonhosted.org/packages/67/32/f3cd1667028424fa7001d82e10ee35386eea1408b93d399b09fb0aa7875f/msgpack-1.1.2-cp313-cp313-win32.whl", hash = "sha256:a7787d353595c7c7e145e2331abf8b7ff1e6673a6b974ded96e6d4ec09f00c8c", size = 65037, upload-time = "2025-10-08T09:15:21.416Z" }, + { url = "https://files.pythonhosted.org/packages/74/07/1ed8277f8653c40ebc65985180b007879f6a836c525b3885dcc6448ae6cb/msgpack-1.1.2-cp313-cp313-win_amd64.whl", hash = "sha256:a465f0dceb8e13a487e54c07d04ae3ba131c7c5b95e2612596eafde1dccf64a9", size = 72631, upload-time = "2025-10-08T09:15:22.431Z" }, + { url = "https://files.pythonhosted.org/packages/e5/db/0314e4e2db56ebcf450f277904ffd84a7988b9e5da8d0d61ab2d057df2b6/msgpack-1.1.2-cp313-cp313-win_arm64.whl", hash = "sha256:e69b39f8c0aa5ec24b57737ebee40be647035158f14ed4b40e6f150077e21a84", size = 64118, upload-time = "2025-10-08T09:15:23.402Z" }, + { url = "https://files.pythonhosted.org/packages/22/71/201105712d0a2ff07b7873ed3c220292fb2ea5120603c00c4b634bcdafb3/msgpack-1.1.2-cp314-cp314-macosx_10_13_x86_64.whl", hash = "sha256:e23ce8d5f7aa6ea6d2a2b326b4ba46c985dbb204523759984430db7114f8aa00", size = 81127, upload-time = "2025-10-08T09:15:24.408Z" }, + { url = "https://files.pythonhosted.org/packages/1b/9f/38ff9e57a2eade7bf9dfee5eae17f39fc0e998658050279cbb14d97d36d9/msgpack-1.1.2-cp314-cp314-macosx_11_0_arm64.whl", hash = "sha256:6c15b7d74c939ebe620dd8e559384be806204d73b4f9356320632d783d1f7939", size = 84981, upload-time = "2025-10-08T09:15:25.812Z" }, + { url = "https://files.pythonhosted.org/packages/8e/a9/3536e385167b88c2cc8f4424c49e28d49a6fc35206d4a8060f136e71f94c/msgpack-1.1.2-cp314-cp314-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:99e2cb7b9031568a2a5c73aa077180f93dd2e95b4f8d3b8e14a73ae94a9e667e", size = 411885, upload-time = "2025-10-08T09:15:27.22Z" }, + { url = "https://files.pythonhosted.org/packages/2f/40/dc34d1a8d5f1e51fc64640b62b191684da52ca469da9cd74e84936ffa4a6/msgpack-1.1.2-cp314-cp314-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:180759d89a057eab503cf62eeec0aa61c4ea1200dee709f3a8e9397dbb3b6931", size = 419658, upload-time = "2025-10-08T09:15:28.4Z" }, + { url = "https://files.pythonhosted.org/packages/3b/ef/2b92e286366500a09a67e03496ee8b8ba00562797a52f3c117aa2b29514b/msgpack-1.1.2-cp314-cp314-musllinux_1_2_aarch64.whl", hash = "sha256:04fb995247a6e83830b62f0b07bf36540c213f6eac8e851166d8d86d83cbd014", size = 403290, upload-time = "2025-10-08T09:15:29.764Z" }, + { url = "https://files.pythonhosted.org/packages/78/90/e0ea7990abea5764e4655b8177aa7c63cdfa89945b6e7641055800f6c16b/msgpack-1.1.2-cp314-cp314-musllinux_1_2_x86_64.whl", hash = "sha256:8e22ab046fa7ede9e36eeb4cfad44d46450f37bb05d5ec482b02868f451c95e2", size = 415234, upload-time = "2025-10-08T09:15:31.022Z" }, + { url = "https://files.pythonhosted.org/packages/72/4e/9390aed5db983a2310818cd7d3ec0aecad45e1f7007e0cda79c79507bb0d/msgpack-1.1.2-cp314-cp314-win32.whl", hash = "sha256:80a0ff7d4abf5fecb995fcf235d4064b9a9a8a40a3ab80999e6ac1e30b702717", size = 66391, upload-time = "2025-10-08T09:15:32.265Z" }, + { url = "https://files.pythonhosted.org/packages/6e/f1/abd09c2ae91228c5f3998dbd7f41353def9eac64253de3c8105efa2082f7/msgpack-1.1.2-cp314-cp314-win_amd64.whl", hash = "sha256:9ade919fac6a3e7260b7f64cea89df6bec59104987cbea34d34a2fa15d74310b", size = 73787, upload-time = "2025-10-08T09:15:33.219Z" }, + { url = "https://files.pythonhosted.org/packages/6a/b0/9d9f667ab48b16ad4115c1935d94023b82b3198064cb84a123e97f7466c1/msgpack-1.1.2-cp314-cp314-win_arm64.whl", hash = "sha256:59415c6076b1e30e563eb732e23b994a61c159cec44deaf584e5cc1dd662f2af", size = 66453, upload-time = "2025-10-08T09:15:34.225Z" }, + { url = "https://files.pythonhosted.org/packages/16/67/93f80545eb1792b61a217fa7f06d5e5cb9e0055bed867f43e2b8e012e137/msgpack-1.1.2-cp314-cp314t-macosx_10_13_x86_64.whl", hash = "sha256:897c478140877e5307760b0ea66e0932738879e7aa68144d9b78ea4c8302a84a", size = 85264, upload-time = "2025-10-08T09:15:35.61Z" }, + { url = "https://files.pythonhosted.org/packages/87/1c/33c8a24959cf193966ef11a6f6a2995a65eb066bd681fd085afd519a57ce/msgpack-1.1.2-cp314-cp314t-macosx_11_0_arm64.whl", hash = "sha256:a668204fa43e6d02f89dbe79a30b0d67238d9ec4c5bd8a940fc3a004a47b721b", size = 89076, upload-time = "2025-10-08T09:15:36.619Z" }, + { url = "https://files.pythonhosted.org/packages/fc/6b/62e85ff7193663fbea5c0254ef32f0c77134b4059f8da89b958beb7696f3/msgpack-1.1.2-cp314-cp314t-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:5559d03930d3aa0f3aacb4c42c776af1a2ace2611871c84a75afe436695e6245", size = 435242, upload-time = "2025-10-08T09:15:37.647Z" }, + { url = "https://files.pythonhosted.org/packages/c1/47/5c74ecb4cc277cf09f64e913947871682ffa82b3b93c8dad68083112f412/msgpack-1.1.2-cp314-cp314t-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:70c5a7a9fea7f036b716191c29047374c10721c389c21e9ffafad04df8c52c90", size = 432509, upload-time = "2025-10-08T09:15:38.794Z" }, + { url = "https://files.pythonhosted.org/packages/24/a4/e98ccdb56dc4e98c929a3f150de1799831c0a800583cde9fa022fa90602d/msgpack-1.1.2-cp314-cp314t-musllinux_1_2_aarch64.whl", hash = "sha256:f2cb069d8b981abc72b41aea1c580ce92d57c673ec61af4c500153a626cb9e20", size = 415957, upload-time = "2025-10-08T09:15:40.238Z" }, + { url = "https://files.pythonhosted.org/packages/da/28/6951f7fb67bc0a4e184a6b38ab71a92d9ba58080b27a77d3e2fb0be5998f/msgpack-1.1.2-cp314-cp314t-musllinux_1_2_x86_64.whl", hash = "sha256:d62ce1f483f355f61adb5433ebfd8868c5f078d1a52d042b0a998682b4fa8c27", size = 422910, upload-time = "2025-10-08T09:15:41.505Z" }, + { url = "https://files.pythonhosted.org/packages/f0/03/42106dcded51f0a0b5284d3ce30a671e7bd3f7318d122b2ead66ad289fed/msgpack-1.1.2-cp314-cp314t-win32.whl", hash = "sha256:1d1418482b1ee984625d88aa9585db570180c286d942da463533b238b98b812b", size = 75197, upload-time = "2025-10-08T09:15:42.954Z" }, + { url = "https://files.pythonhosted.org/packages/15/86/d0071e94987f8db59d4eeb386ddc64d0bb9b10820a8d82bcd3e53eeb2da6/msgpack-1.1.2-cp314-cp314t-win_amd64.whl", hash = "sha256:5a46bf7e831d09470ad92dff02b8b1ac92175ca36b087f904a0519857c6be3ff", size = 85772, upload-time = "2025-10-08T09:15:43.954Z" }, + { url = "https://files.pythonhosted.org/packages/81/f2/08ace4142eb281c12701fc3b93a10795e4d4dc7f753911d836675050f886/msgpack-1.1.2-cp314-cp314t-win_arm64.whl", hash = "sha256:d99ef64f349d5ec3293688e91486c5fdb925ed03807f64d98d205d2713c60b46", size = 70868, upload-time = "2025-10-08T09:15:44.959Z" }, +] + [[package]] name = "multidict" version = "6.7.0" @@ -919,6 +1112,75 @@ wheels = [ { url = "https://files.pythonhosted.org/packages/b7/da/7d22601b625e241d4f23ef1ebff8acfc60da633c9e7e7922e24d10f592b3/multidict-6.7.0-py3-none-any.whl", hash = "sha256:394fc5c42a333c9ffc3e421a4c85e08580d990e08b99f6bf35b4132114c5dcb3", size = 12317, upload-time = "2025-10-06T14:52:29.272Z" }, ] +[[package]] +name = "numba" +version = "0.62.1" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "llvmlite" }, + { name = "numpy" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/a3/20/33dbdbfe60e5fd8e3dbfde299d106279a33d9f8308346022316781368591/numba-0.62.1.tar.gz", hash = "sha256:7b774242aa890e34c21200a1fc62e5b5757d5286267e71103257f4e2af0d5161", size = 2749817, upload-time = "2025-09-29T10:46:31.551Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/22/76/501ea2c07c089ef1386868f33dff2978f43f51b854e34397b20fc55e0a58/numba-0.62.1-cp313-cp313-macosx_10_15_x86_64.whl", hash = "sha256:b72489ba8411cc9fdcaa2458d8f7677751e94f0109eeb53e5becfdc818c64afb", size = 2685766, upload-time = "2025-09-29T10:43:49.161Z" }, + { url = "https://files.pythonhosted.org/packages/80/68/444986ed95350c0611d5c7b46828411c222ce41a0c76707c36425d27ce29/numba-0.62.1-cp313-cp313-macosx_12_0_arm64.whl", hash = "sha256:44a1412095534a26fb5da2717bc755b57da5f3053965128fe3dc286652cc6a92", size = 2688741, upload-time = "2025-09-29T10:44:10.07Z" }, + { url = "https://files.pythonhosted.org/packages/78/7e/bf2e3634993d57f95305c7cee4c9c6cb3c9c78404ee7b49569a0dfecfe33/numba-0.62.1-cp313-cp313-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:8c9460b9e936c5bd2f0570e20a0a5909ee6e8b694fd958b210e3bde3a6dba2d7", size = 3804576, upload-time = "2025-09-29T10:42:59.53Z" }, + { url = "https://files.pythonhosted.org/packages/e8/b6/8a1723fff71f63bbb1354bdc60a1513a068acc0f5322f58da6f022d20247/numba-0.62.1-cp313-cp313-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:728f91a874192df22d74e3fd42c12900b7ce7190b1aad3574c6c61b08313e4c5", size = 3503367, upload-time = "2025-09-29T10:43:26.326Z" }, + { url = "https://files.pythonhosted.org/packages/9c/ec/9d414e7a80d6d1dc4af0e07c6bfe293ce0b04ea4d0ed6c45dad9bd6e72eb/numba-0.62.1-cp313-cp313-win_amd64.whl", hash = "sha256:bbf3f88b461514287df66bc8d0307e949b09f2b6f67da92265094e8fa1282dd8", size = 2745529, upload-time = "2025-09-29T10:44:31.738Z" }, +] + +[[package]] +name = "numpy" +version = "2.3.4" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/b5/f4/098d2270d52b41f1bd7db9fc288aaa0400cb48c2a3e2af6fa365d9720947/numpy-2.3.4.tar.gz", hash = "sha256:a7d018bfedb375a8d979ac758b120ba846a7fe764911a64465fd87b8729f4a6a", size = 20582187, upload-time = "2025-10-15T16:18:11.77Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/57/7e/b72610cc91edf138bc588df5150957a4937221ca6058b825b4725c27be62/numpy-2.3.4-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:c090d4860032b857d94144d1a9976b8e36709e40386db289aaf6672de2a81966", size = 20950335, upload-time = "2025-10-15T16:16:10.304Z" }, + { url = "https://files.pythonhosted.org/packages/3e/46/bdd3370dcea2f95ef14af79dbf81e6927102ddf1cc54adc0024d61252fd9/numpy-2.3.4-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:a13fc473b6db0be619e45f11f9e81260f7302f8d180c49a22b6e6120022596b3", size = 14179878, upload-time = "2025-10-15T16:16:12.595Z" }, + { url = "https://files.pythonhosted.org/packages/ac/01/5a67cb785bda60f45415d09c2bc245433f1c68dd82eef9c9002c508b5a65/numpy-2.3.4-cp313-cp313-macosx_14_0_arm64.whl", hash = "sha256:3634093d0b428e6c32c3a69b78e554f0cd20ee420dcad5a9f3b2a63762ce4197", size = 5108673, upload-time = "2025-10-15T16:16:14.877Z" }, + { url = "https://files.pythonhosted.org/packages/c2/cd/8428e23a9fcebd33988f4cb61208fda832800ca03781f471f3727a820704/numpy-2.3.4-cp313-cp313-macosx_14_0_x86_64.whl", hash = "sha256:043885b4f7e6e232d7df4f51ffdef8c36320ee9d5f227b380ea636722c7ed12e", size = 6641438, upload-time = "2025-10-15T16:16:16.805Z" }, + { url = "https://files.pythonhosted.org/packages/3e/d1/913fe563820f3c6b079f992458f7331278dcd7ba8427e8e745af37ddb44f/numpy-2.3.4-cp313-cp313-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:4ee6a571d1e4f0ea6d5f22d6e5fbd6ed1dc2b18542848e1e7301bd190500c9d7", size = 14281290, upload-time = "2025-10-15T16:16:18.764Z" }, + { url = "https://files.pythonhosted.org/packages/9e/7e/7d306ff7cb143e6d975cfa7eb98a93e73495c4deabb7d1b5ecf09ea0fd69/numpy-2.3.4-cp313-cp313-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:fc8a63918b04b8571789688b2780ab2b4a33ab44bfe8ccea36d3eba51228c953", size = 16636543, upload-time = "2025-10-15T16:16:21.072Z" }, + { url = "https://files.pythonhosted.org/packages/47/6a/8cfc486237e56ccfb0db234945552a557ca266f022d281a2f577b98e955c/numpy-2.3.4-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:40cc556d5abbc54aabe2b1ae287042d7bdb80c08edede19f0c0afb36ae586f37", size = 16056117, upload-time = "2025-10-15T16:16:23.369Z" }, + { url = "https://files.pythonhosted.org/packages/b1/0e/42cb5e69ea901e06ce24bfcc4b5664a56f950a70efdcf221f30d9615f3f3/numpy-2.3.4-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:ecb63014bb7f4ce653f8be7f1df8cbc6093a5a2811211770f6606cc92b5a78fd", size = 18577788, upload-time = "2025-10-15T16:16:27.496Z" }, + { url = "https://files.pythonhosted.org/packages/86/92/41c3d5157d3177559ef0a35da50f0cda7fa071f4ba2306dd36818591a5bc/numpy-2.3.4-cp313-cp313-win32.whl", hash = "sha256:e8370eb6925bb8c1c4264fec52b0384b44f675f191df91cbe0140ec9f0955646", size = 6282620, upload-time = "2025-10-15T16:16:29.811Z" }, + { url = "https://files.pythonhosted.org/packages/09/97/fd421e8bc50766665ad35536c2bb4ef916533ba1fdd053a62d96cc7c8b95/numpy-2.3.4-cp313-cp313-win_amd64.whl", hash = "sha256:56209416e81a7893036eea03abcb91c130643eb14233b2515c90dcac963fe99d", size = 12784672, upload-time = "2025-10-15T16:16:31.589Z" }, + { url = "https://files.pythonhosted.org/packages/ad/df/5474fb2f74970ca8eb978093969b125a84cc3d30e47f82191f981f13a8a0/numpy-2.3.4-cp313-cp313-win_arm64.whl", hash = "sha256:a700a4031bc0fd6936e78a752eefb79092cecad2599ea9c8039c548bc097f9bc", size = 10196702, upload-time = "2025-10-15T16:16:33.902Z" }, + { url = "https://files.pythonhosted.org/packages/11/83/66ac031464ec1767ea3ed48ce40f615eb441072945e98693bec0bcd056cc/numpy-2.3.4-cp313-cp313t-macosx_10_13_x86_64.whl", hash = "sha256:86966db35c4040fdca64f0816a1c1dd8dbd027d90fca5a57e00e1ca4cd41b879", size = 21049003, upload-time = "2025-10-15T16:16:36.101Z" }, + { url = "https://files.pythonhosted.org/packages/5f/99/5b14e0e686e61371659a1d5bebd04596b1d72227ce36eed121bb0aeab798/numpy-2.3.4-cp313-cp313t-macosx_11_0_arm64.whl", hash = "sha256:838f045478638b26c375ee96ea89464d38428c69170360b23a1a50fa4baa3562", size = 14302980, upload-time = "2025-10-15T16:16:39.124Z" }, + { url = "https://files.pythonhosted.org/packages/2c/44/e9486649cd087d9fc6920e3fc3ac2aba10838d10804b1e179fb7cbc4e634/numpy-2.3.4-cp313-cp313t-macosx_14_0_arm64.whl", hash = "sha256:d7315ed1dab0286adca467377c8381cd748f3dc92235f22a7dfc42745644a96a", size = 5231472, upload-time = "2025-10-15T16:16:41.168Z" }, + { url = "https://files.pythonhosted.org/packages/3e/51/902b24fa8887e5fe2063fd61b1895a476d0bbf46811ab0c7fdf4bd127345/numpy-2.3.4-cp313-cp313t-macosx_14_0_x86_64.whl", hash = "sha256:84f01a4d18b2cc4ade1814a08e5f3c907b079c847051d720fad15ce37aa930b6", size = 6739342, upload-time = "2025-10-15T16:16:43.777Z" }, + { url = "https://files.pythonhosted.org/packages/34/f1/4de9586d05b1962acdcdb1dc4af6646361a643f8c864cef7c852bf509740/numpy-2.3.4-cp313-cp313t-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:817e719a868f0dacde4abdfc5c1910b301877970195db9ab6a5e2c4bd5b121f7", size = 14354338, upload-time = "2025-10-15T16:16:46.081Z" }, + { url = "https://files.pythonhosted.org/packages/1f/06/1c16103b425de7969d5a76bdf5ada0804b476fed05d5f9e17b777f1cbefd/numpy-2.3.4-cp313-cp313t-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:85e071da78d92a214212cacea81c6da557cab307f2c34b5f85b628e94803f9c0", size = 16702392, upload-time = "2025-10-15T16:16:48.455Z" }, + { url = "https://files.pythonhosted.org/packages/34/b2/65f4dc1b89b5322093572b6e55161bb42e3e0487067af73627f795cc9d47/numpy-2.3.4-cp313-cp313t-musllinux_1_2_aarch64.whl", hash = "sha256:2ec646892819370cf3558f518797f16597b4e4669894a2ba712caccc9da53f1f", size = 16134998, upload-time = "2025-10-15T16:16:51.114Z" }, + { url = "https://files.pythonhosted.org/packages/d4/11/94ec578896cdb973aaf56425d6c7f2aff4186a5c00fac15ff2ec46998b46/numpy-2.3.4-cp313-cp313t-musllinux_1_2_x86_64.whl", hash = "sha256:035796aaaddfe2f9664b9a9372f089cfc88bd795a67bd1bfe15e6e770934cf64", size = 18651574, upload-time = "2025-10-15T16:16:53.429Z" }, + { url = "https://files.pythonhosted.org/packages/62/b7/7efa763ab33dbccf56dade36938a77345ce8e8192d6b39e470ca25ff3cd0/numpy-2.3.4-cp313-cp313t-win32.whl", hash = "sha256:fea80f4f4cf83b54c3a051f2f727870ee51e22f0248d3114b8e755d160b38cfb", size = 6413135, upload-time = "2025-10-15T16:16:55.992Z" }, + { url = "https://files.pythonhosted.org/packages/43/70/aba4c38e8400abcc2f345e13d972fb36c26409b3e644366db7649015f291/numpy-2.3.4-cp313-cp313t-win_amd64.whl", hash = "sha256:15eea9f306b98e0be91eb344a94c0e630689ef302e10c2ce5f7e11905c704f9c", size = 12928582, upload-time = "2025-10-15T16:16:57.943Z" }, + { url = "https://files.pythonhosted.org/packages/67/63/871fad5f0073fc00fbbdd7232962ea1ac40eeaae2bba66c76214f7954236/numpy-2.3.4-cp313-cp313t-win_arm64.whl", hash = "sha256:b6c231c9c2fadbae4011ca5e7e83e12dc4a5072f1a1d85a0a7b3ed754d145a40", size = 10266691, upload-time = "2025-10-15T16:17:00.048Z" }, + { url = "https://files.pythonhosted.org/packages/72/71/ae6170143c115732470ae3a2d01512870dd16e0953f8a6dc89525696069b/numpy-2.3.4-cp314-cp314-macosx_10_15_x86_64.whl", hash = "sha256:81c3e6d8c97295a7360d367f9f8553973651b76907988bb6066376bc2252f24e", size = 20955580, upload-time = "2025-10-15T16:17:02.509Z" }, + { url = "https://files.pythonhosted.org/packages/af/39/4be9222ffd6ca8a30eda033d5f753276a9c3426c397bb137d8e19dedd200/numpy-2.3.4-cp314-cp314-macosx_11_0_arm64.whl", hash = "sha256:7c26b0b2bf58009ed1f38a641f3db4be8d960a417ca96d14e5b06df1506d41ff", size = 14188056, upload-time = "2025-10-15T16:17:04.873Z" }, + { url = "https://files.pythonhosted.org/packages/6c/3d/d85f6700d0a4aa4f9491030e1021c2b2b7421b2b38d01acd16734a2bfdc7/numpy-2.3.4-cp314-cp314-macosx_14_0_arm64.whl", hash = "sha256:62b2198c438058a20b6704351b35a1d7db881812d8512d67a69c9de1f18ca05f", size = 5116555, upload-time = "2025-10-15T16:17:07.499Z" }, + { url = "https://files.pythonhosted.org/packages/bf/04/82c1467d86f47eee8a19a464c92f90a9bb68ccf14a54c5224d7031241ffb/numpy-2.3.4-cp314-cp314-macosx_14_0_x86_64.whl", hash = "sha256:9d729d60f8d53a7361707f4b68a9663c968882dd4f09e0d58c044c8bf5faee7b", size = 6643581, upload-time = "2025-10-15T16:17:09.774Z" }, + { url = "https://files.pythonhosted.org/packages/0c/d3/c79841741b837e293f48bd7db89d0ac7a4f2503b382b78a790ef1dc778a5/numpy-2.3.4-cp314-cp314-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:bd0c630cf256b0a7fd9d0a11c9413b42fef5101219ce6ed5a09624f5a65392c7", size = 14299186, upload-time = "2025-10-15T16:17:11.937Z" }, + { url = "https://files.pythonhosted.org/packages/e8/7e/4a14a769741fbf237eec5a12a2cbc7a4c4e061852b6533bcb9e9a796c908/numpy-2.3.4-cp314-cp314-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:d5e081bc082825f8b139f9e9fe42942cb4054524598aaeb177ff476cc76d09d2", size = 16638601, upload-time = "2025-10-15T16:17:14.391Z" }, + { url = "https://files.pythonhosted.org/packages/93/87/1c1de269f002ff0a41173fe01dcc925f4ecff59264cd8f96cf3b60d12c9b/numpy-2.3.4-cp314-cp314-musllinux_1_2_aarch64.whl", hash = "sha256:15fb27364ed84114438fff8aaf998c9e19adbeba08c0b75409f8c452a8692c52", size = 16074219, upload-time = "2025-10-15T16:17:17.058Z" }, + { url = "https://files.pythonhosted.org/packages/cd/28/18f72ee77408e40a76d691001ae599e712ca2a47ddd2c4f695b16c65f077/numpy-2.3.4-cp314-cp314-musllinux_1_2_x86_64.whl", hash = "sha256:85d9fb2d8cd998c84d13a79a09cc0c1091648e848e4e6249b0ccd7f6b487fa26", size = 18576702, upload-time = "2025-10-15T16:17:19.379Z" }, + { url = "https://files.pythonhosted.org/packages/c3/76/95650169b465ececa8cf4b2e8f6df255d4bf662775e797ade2025cc51ae6/numpy-2.3.4-cp314-cp314-win32.whl", hash = "sha256:e73d63fd04e3a9d6bc187f5455d81abfad05660b212c8804bf3b407e984cd2bc", size = 6337136, upload-time = "2025-10-15T16:17:22.886Z" }, + { url = "https://files.pythonhosted.org/packages/dc/89/a231a5c43ede5d6f77ba4a91e915a87dea4aeea76560ba4d2bf185c683f0/numpy-2.3.4-cp314-cp314-win_amd64.whl", hash = "sha256:3da3491cee49cf16157e70f607c03a217ea6647b1cea4819c4f48e53d49139b9", size = 12920542, upload-time = "2025-10-15T16:17:24.783Z" }, + { url = "https://files.pythonhosted.org/packages/0d/0c/ae9434a888f717c5ed2ff2393b3f344f0ff6f1c793519fa0c540461dc530/numpy-2.3.4-cp314-cp314-win_arm64.whl", hash = "sha256:6d9cd732068e8288dbe2717177320723ccec4fb064123f0caf9bbd90ab5be868", size = 10480213, upload-time = "2025-10-15T16:17:26.935Z" }, + { url = "https://files.pythonhosted.org/packages/83/4b/c4a5f0841f92536f6b9592694a5b5f68c9ab37b775ff342649eadf9055d3/numpy-2.3.4-cp314-cp314t-macosx_10_15_x86_64.whl", hash = "sha256:22758999b256b595cf0b1d102b133bb61866ba5ceecf15f759623b64c020c9ec", size = 21052280, upload-time = "2025-10-15T16:17:29.638Z" }, + { url = "https://files.pythonhosted.org/packages/3e/80/90308845fc93b984d2cc96d83e2324ce8ad1fd6efea81b324cba4b673854/numpy-2.3.4-cp314-cp314t-macosx_11_0_arm64.whl", hash = "sha256:9cb177bc55b010b19798dc5497d540dea67fd13a8d9e882b2dae71de0cf09eb3", size = 14302930, upload-time = "2025-10-15T16:17:32.384Z" }, + { url = "https://files.pythonhosted.org/packages/3d/4e/07439f22f2a3b247cec4d63a713faae55e1141a36e77fb212881f7cda3fb/numpy-2.3.4-cp314-cp314t-macosx_14_0_arm64.whl", hash = "sha256:0f2bcc76f1e05e5ab58893407c63d90b2029908fa41f9f1cc51eecce936c3365", size = 5231504, upload-time = "2025-10-15T16:17:34.515Z" }, + { url = "https://files.pythonhosted.org/packages/ab/de/1e11f2547e2fe3d00482b19721855348b94ada8359aef5d40dd57bfae9df/numpy-2.3.4-cp314-cp314t-macosx_14_0_x86_64.whl", hash = "sha256:8dc20bde86802df2ed8397a08d793da0ad7a5fd4ea3ac85d757bf5dd4ad7c252", size = 6739405, upload-time = "2025-10-15T16:17:36.128Z" }, + { url = "https://files.pythonhosted.org/packages/3b/40/8cd57393a26cebe2e923005db5134a946c62fa56a1087dc7c478f3e30837/numpy-2.3.4-cp314-cp314t-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:5e199c087e2aa71c8f9ce1cb7a8e10677dc12457e7cc1be4798632da37c3e86e", size = 14354866, upload-time = "2025-10-15T16:17:38.884Z" }, + { url = "https://files.pythonhosted.org/packages/93/39/5b3510f023f96874ee6fea2e40dfa99313a00bf3ab779f3c92978f34aace/numpy-2.3.4-cp314-cp314t-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:85597b2d25ddf655495e2363fe044b0ae999b75bc4d630dc0d886484b03a5eb0", size = 16703296, upload-time = "2025-10-15T16:17:41.564Z" }, + { url = "https://files.pythonhosted.org/packages/41/0d/19bb163617c8045209c1996c4e427bccbc4bbff1e2c711f39203c8ddbb4a/numpy-2.3.4-cp314-cp314t-musllinux_1_2_aarch64.whl", hash = "sha256:04a69abe45b49c5955923cf2c407843d1c85013b424ae8a560bba16c92fe44a0", size = 16136046, upload-time = "2025-10-15T16:17:43.901Z" }, + { url = "https://files.pythonhosted.org/packages/e2/c1/6dba12fdf68b02a21ac411c9df19afa66bed2540f467150ca64d246b463d/numpy-2.3.4-cp314-cp314t-musllinux_1_2_x86_64.whl", hash = "sha256:e1708fac43ef8b419c975926ce1eaf793b0c13b7356cfab6ab0dc34c0a02ac0f", size = 18652691, upload-time = "2025-10-15T16:17:46.247Z" }, + { url = "https://files.pythonhosted.org/packages/f8/73/f85056701dbbbb910c51d846c58d29fd46b30eecd2b6ba760fc8b8a1641b/numpy-2.3.4-cp314-cp314t-win32.whl", hash = "sha256:863e3b5f4d9915aaf1b8ec79ae560ad21f0b8d5e3adc31e73126491bb86dee1d", size = 6485782, upload-time = "2025-10-15T16:17:48.872Z" }, + { url = "https://files.pythonhosted.org/packages/17/90/28fa6f9865181cb817c2471ee65678afa8a7e2a1fb16141473d5fa6bacc3/numpy-2.3.4-cp314-cp314t-win_amd64.whl", hash = "sha256:962064de37b9aef801d33bc579690f8bfe6c5e70e29b61783f60bcba838a14d6", size = 13113301, upload-time = "2025-10-15T16:17:50.938Z" }, + { url = "https://files.pythonhosted.org/packages/54/23/08c002201a8e7e1f9afba93b97deceb813252d9cfd0d3351caed123dcf97/numpy-2.3.4-cp314-cp314t-win_arm64.whl", hash = "sha256:8b5a9a39c45d852b62693d9b3f3e0fe052541f804296ff401a72a1b60edafb29", size = 10547532, upload-time = "2025-10-15T16:17:53.48Z" }, +] + [[package]] name = "oauthlib" version = "3.3.1" @@ -960,6 +1222,15 @@ wheels = [ { url = "https://files.pythonhosted.org/packages/1d/2a/7dd3d207ec669cacc1f186fd856a0f61dbc255d24f6fdc1a6715d6051b0f/openai-1.109.1-py3-none-any.whl", hash = "sha256:6bcaf57086cf59159b8e27447e4e7dd019db5d29a438072fbd49c290c7e65315", size = 948627, upload-time = "2025-09-24T13:00:50.754Z" }, ] +[[package]] +name = "packaging" +version = "25.0" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/a1/d4/1fc4078c65507b51b96ca8f8c3ba19e6a61c8253c72794544580a7b6c24d/packaging-25.0.tar.gz", hash = "sha256:d443872c98d677bf60f6a1f2f8c1cb748e8fe762d2bf9d3148b5599295b0fc4f", size = 165727, upload-time = "2025-04-19T11:48:59.673Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/20/12/38679034af332785aac8774540895e234f4d07f7545804097de4b666afd8/packaging-25.0-py3-none-any.whl", hash = "sha256:29572ef2b1f17581046b3a2227d5c611fb25ec70ca1ba8554b24b0e69331a484", size = 66469, upload-time = "2025-04-19T11:48:57.875Z" }, +] + [[package]] name = "pillow" version = "12.0.0" @@ -1018,6 +1289,41 @@ wheels = [ { url = "https://files.pythonhosted.org/packages/c1/70/6b41bdcddf541b437bbb9f47f94d2db5d9ddef6c37ccab8c9107743748a4/pillow-12.0.0-cp314-cp314t-win_arm64.whl", hash = "sha256:99353a06902c2e43b43e8ff74ee65a7d90307d82370604746738a1e0661ccca7", size = 2525630, upload-time = "2025-10-15T18:23:57.149Z" }, ] +[[package]] +name = "platformdirs" +version = "4.5.0" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/61/33/9611380c2bdb1225fdef633e2a9610622310fed35ab11dac9620972ee088/platformdirs-4.5.0.tar.gz", hash = "sha256:70ddccdd7c99fc5942e9fc25636a8b34d04c24b335100223152c2803e4063312", size = 21632, upload-time = "2025-10-08T17:44:48.791Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/73/cb/ac7874b3e5d58441674fb70742e6c374b28b0c7cb988d37d991cde47166c/platformdirs-4.5.0-py3-none-any.whl", hash = "sha256:e578a81bb873cbb89a41fcc904c7ef523cc18284b7e3b3ccf06aca1403b7ebd3", size = 18651, upload-time = "2025-10-08T17:44:47.223Z" }, +] + +[[package]] +name = "playsound3" +version = "3.2.8" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "pywin32", marker = "sys_platform == 'win32'" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/20/df/1bc4664f65f5068df468e1d4c085382dcdf17454276531938341a01ee935/playsound3-3.2.8.tar.gz", hash = "sha256:c7a7b4dbbd1cdf76a2715059daf20537bb2f8713ee8f2f5a27e3e053374c2342", size = 608326, upload-time = "2025-10-01T19:45:28.958Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/37/11/83a47fa57257f4b2bbc52aa4b5ebcdb1e6aba0ebd8604a85d9a375194e36/playsound3-3.2.8-py3-none-any.whl", hash = "sha256:1225807f14354702cba0171c999fe062580d77d07d8718a35b5978ed00272402", size = 9679, upload-time = "2025-10-01T19:45:27.277Z" }, +] + +[[package]] +name = "pooch" +version = "1.8.2" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "packaging" }, + { name = "platformdirs" }, + { name = "requests" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/c6/77/b3d3e00c696c16cf99af81ef7b1f5fe73bd2a307abca41bd7605429fe6e5/pooch-1.8.2.tar.gz", hash = "sha256:76561f0de68a01da4df6af38e9955c4c9d1a5c90da73f7e40276a5728ec83d10", size = 59353, upload-time = "2024-06-06T16:53:46.224Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/a8/87/77cc11c7a9ea9fd05503def69e3d18605852cd0d4b0d3b8f15bbeb3ef1d1/pooch-1.8.2-py3-none-any.whl", hash = "sha256:3529a57096f7198778a5ceefd5ac3ef0e4d06a6ddaf9fc2d609b806f25302c47", size = 64574, upload-time = "2024-06-06T16:53:44.343Z" }, +] + [[package]] name = "portalocker" version = "2.10.1" @@ -1277,6 +1583,22 @@ wheels = [ { url = "https://files.pythonhosted.org/packages/83/d6/887a1ff844e64aa823fb4905978d882a633cfe295c32eacad582b78a7d8b/pydantic_settings-2.11.0-py3-none-any.whl", hash = "sha256:fe2cea3413b9530d10f3a5875adffb17ada5c1e1bab0b2885546d7310415207c", size = 48608, upload-time = "2025-09-24T14:19:10.015Z" }, ] +[[package]] +name = "pynput" +version = "1.8.1" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "evdev", marker = "'linux' in sys_platform" }, + { name = "pyobjc-framework-applicationservices", marker = "sys_platform == 'darwin'" }, + { name = "pyobjc-framework-quartz", marker = "sys_platform == 'darwin'" }, + { name = "python-xlib", marker = "'linux' in sys_platform" }, + { name = "six" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/f0/c3/dccf44c68225046df5324db0cc7d563a560635355b3e5f1d249468268a6f/pynput-1.8.1.tar.gz", hash = "sha256:70d7c8373ee98911004a7c938742242840a5628c004573d84ba849d4601df81e", size = 82289, upload-time = "2025-03-17T17:12:01.481Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/59/4f/ac3fa906ae8a375a536b12794128c5efacade9eaa917a35dfd27ce0c7400/pynput-1.8.1-py2.py3-none-any.whl", hash = "sha256:42dfcf27404459ca16ca889c8fb8ffe42a9fe54f722fd1a3e130728e59e768d2", size = 91693, upload-time = "2025-03-17T17:12:00.094Z" }, +] + [[package]] name = "pyobjc" version = "12.0" @@ -3931,6 +4253,18 @@ wheels = [ { url = "https://files.pythonhosted.org/packages/45/58/38b5afbc1a800eeea951b9285d3912613f2603bdf897a4ab0f4bd7f405fc/python_multipart-0.0.20-py3-none-any.whl", hash = "sha256:8a62d3a8335e06589fe01f2a3e178cdcc632f3fbe0d492ad9ee0ec35aab1f104", size = 24546, upload-time = "2024-12-16T19:45:44.423Z" }, ] +[[package]] +name = "python-xlib" +version = "0.33" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "six" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/86/f5/8c0653e5bb54e0cbdfe27bf32d41f27bc4e12faa8742778c17f2a71be2c0/python-xlib-0.33.tar.gz", hash = "sha256:55af7906a2c75ce6cb280a584776080602444f75815a7aff4d287bb2d7018b32", size = 269068, upload-time = "2022-12-25T18:53:00.824Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/fc/b8/ff33610932e0ee81ae7f1269c890f697d56ff74b9f5b2ee5d9b7fa2c5355/python_xlib-0.33-py2.py3-none-any.whl", hash = "sha256:c3534038d42e0df2f1392a1b30a15a4ff5fdc2b86cfa94f072bf11b10a164398", size = 182185, upload-time = "2022-12-25T18:52:58.662Z" }, +] + [[package]] name = "pywin32" version = "311" @@ -4076,6 +4410,86 @@ wheels = [ { url = "https://files.pythonhosted.org/packages/64/8d/0133e4eb4beed9e425d9a98ed6e081a55d195481b7632472be1af08d2f6b/rsa-4.9.1-py3-none-any.whl", hash = "sha256:68635866661c6836b8d39430f97a996acbd61bfa49406748ea243539fe239762", size = 34696, upload-time = "2025-04-16T09:51:17.142Z" }, ] +[[package]] +name = "scikit-learn" +version = "1.7.2" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "joblib" }, + { name = "numpy" }, + { name = "scipy" }, + { name = "threadpoolctl" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/98/c2/a7855e41c9d285dfe86dc50b250978105dce513d6e459ea66a6aeb0e1e0c/scikit_learn-1.7.2.tar.gz", hash = "sha256:20e9e49ecd130598f1ca38a1d85090e1a600147b9c02fa6f15d69cb53d968fda", size = 7193136, upload-time = "2025-09-09T08:21:29.075Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/ae/93/a3038cb0293037fd335f77f31fe053b89c72f17b1c8908c576c29d953e84/scikit_learn-1.7.2-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:0b7dacaa05e5d76759fb071558a8b5130f4845166d88654a0f9bdf3eb57851b7", size = 9212382, upload-time = "2025-09-09T08:20:54.731Z" }, + { url = "https://files.pythonhosted.org/packages/40/dd/9a88879b0c1104259136146e4742026b52df8540c39fec21a6383f8292c7/scikit_learn-1.7.2-cp313-cp313-macosx_12_0_arm64.whl", hash = "sha256:abebbd61ad9e1deed54cca45caea8ad5f79e1b93173dece40bb8e0c658dbe6fe", size = 8592042, upload-time = "2025-09-09T08:20:57.313Z" }, + { url = "https://files.pythonhosted.org/packages/46/af/c5e286471b7d10871b811b72ae794ac5fe2989c0a2df07f0ec723030f5f5/scikit_learn-1.7.2-cp313-cp313-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:502c18e39849c0ea1a5d681af1dbcf15f6cce601aebb657aabbfe84133c1907f", size = 9434180, upload-time = "2025-09-09T08:20:59.671Z" }, + { url = "https://files.pythonhosted.org/packages/f1/fd/df59faa53312d585023b2da27e866524ffb8faf87a68516c23896c718320/scikit_learn-1.7.2-cp313-cp313-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:7a4c328a71785382fe3fe676a9ecf2c86189249beff90bf85e22bdb7efaf9ae0", size = 9283660, upload-time = "2025-09-09T08:21:01.71Z" }, + { url = "https://files.pythonhosted.org/packages/a7/c7/03000262759d7b6f38c836ff9d512f438a70d8a8ddae68ee80de72dcfb63/scikit_learn-1.7.2-cp313-cp313-win_amd64.whl", hash = "sha256:63a9afd6f7b229aad94618c01c252ce9e6fa97918c5ca19c9a17a087d819440c", size = 8702057, upload-time = "2025-09-09T08:21:04.234Z" }, + { url = "https://files.pythonhosted.org/packages/55/87/ef5eb1f267084532c8e4aef98a28b6ffe7425acbfd64b5e2f2e066bc29b3/scikit_learn-1.7.2-cp313-cp313t-macosx_10_13_x86_64.whl", hash = "sha256:9acb6c5e867447b4e1390930e3944a005e2cb115922e693c08a323421a6966e8", size = 9558731, upload-time = "2025-09-09T08:21:06.381Z" }, + { url = "https://files.pythonhosted.org/packages/93/f8/6c1e3fc14b10118068d7938878a9f3f4e6d7b74a8ddb1e5bed65159ccda8/scikit_learn-1.7.2-cp313-cp313t-macosx_12_0_arm64.whl", hash = "sha256:2a41e2a0ef45063e654152ec9d8bcfc39f7afce35b08902bfe290c2498a67a6a", size = 9038852, upload-time = "2025-09-09T08:21:08.628Z" }, + { url = "https://files.pythonhosted.org/packages/83/87/066cafc896ee540c34becf95d30375fe5cbe93c3b75a0ee9aa852cd60021/scikit_learn-1.7.2-cp313-cp313t-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:98335fb98509b73385b3ab2bd0639b1f610541d3988ee675c670371d6a87aa7c", size = 9527094, upload-time = "2025-09-09T08:21:11.486Z" }, + { url = "https://files.pythonhosted.org/packages/9c/2b/4903e1ccafa1f6453b1ab78413938c8800633988c838aa0be386cbb33072/scikit_learn-1.7.2-cp313-cp313t-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:191e5550980d45449126e23ed1d5e9e24b2c68329ee1f691a3987476e115e09c", size = 9367436, upload-time = "2025-09-09T08:21:13.602Z" }, + { url = "https://files.pythonhosted.org/packages/b5/aa/8444be3cfb10451617ff9d177b3c190288f4563e6c50ff02728be67ad094/scikit_learn-1.7.2-cp313-cp313t-win_amd64.whl", hash = "sha256:57dc4deb1d3762c75d685507fbd0bc17160144b2f2ba4ccea5dc285ab0d0e973", size = 9275749, upload-time = "2025-09-09T08:21:15.96Z" }, + { url = "https://files.pythonhosted.org/packages/d9/82/dee5acf66837852e8e68df6d8d3a6cb22d3df997b733b032f513d95205b7/scikit_learn-1.7.2-cp314-cp314-macosx_10_13_x86_64.whl", hash = "sha256:fa8f63940e29c82d1e67a45d5297bdebbcb585f5a5a50c4914cc2e852ab77f33", size = 9208906, upload-time = "2025-09-09T08:21:18.557Z" }, + { url = "https://files.pythonhosted.org/packages/3c/30/9029e54e17b87cb7d50d51a5926429c683d5b4c1732f0507a6c3bed9bf65/scikit_learn-1.7.2-cp314-cp314-macosx_12_0_arm64.whl", hash = "sha256:f95dc55b7902b91331fa4e5845dd5bde0580c9cd9612b1b2791b7e80c3d32615", size = 8627836, upload-time = "2025-09-09T08:21:20.695Z" }, + { url = "https://files.pythonhosted.org/packages/60/18/4a52c635c71b536879f4b971c2cedf32c35ee78f48367885ed8025d1f7ee/scikit_learn-1.7.2-cp314-cp314-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:9656e4a53e54578ad10a434dc1f993330568cfee176dff07112b8785fb413106", size = 9426236, upload-time = "2025-09-09T08:21:22.645Z" }, + { url = "https://files.pythonhosted.org/packages/99/7e/290362f6ab582128c53445458a5befd471ed1ea37953d5bcf80604619250/scikit_learn-1.7.2-cp314-cp314-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:96dc05a854add0e50d3f47a1ef21a10a595016da5b007c7d9cd9d0bffd1fcc61", size = 9312593, upload-time = "2025-09-09T08:21:24.65Z" }, + { url = "https://files.pythonhosted.org/packages/8e/87/24f541b6d62b1794939ae6422f8023703bbf6900378b2b34e0b4384dfefd/scikit_learn-1.7.2-cp314-cp314-win_amd64.whl", hash = "sha256:bb24510ed3f9f61476181e4db51ce801e2ba37541def12dc9333b946fc7a9cf8", size = 8820007, upload-time = "2025-09-09T08:21:26.713Z" }, +] + +[[package]] +name = "scipy" +version = "1.16.2" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "numpy" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/4c/3b/546a6f0bfe791bbb7f8d591613454d15097e53f906308ec6f7c1ce588e8e/scipy-1.16.2.tar.gz", hash = "sha256:af029b153d243a80afb6eabe40b0a07f8e35c9adc269c019f364ad747f826a6b", size = 30580599, upload-time = "2025-09-11T17:48:08.271Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/c1/27/c5b52f1ee81727a9fc457f5ac1e9bf3d6eab311805ea615c83c27ba06400/scipy-1.16.2-cp313-cp313-macosx_10_14_x86_64.whl", hash = "sha256:84f7bf944b43e20b8a894f5fe593976926744f6c185bacfcbdfbb62736b5cc70", size = 36604856, upload-time = "2025-09-11T17:41:47.695Z" }, + { url = "https://files.pythonhosted.org/packages/32/a9/15c20d08e950b540184caa8ced675ba1128accb0e09c653780ba023a4110/scipy-1.16.2-cp313-cp313-macosx_12_0_arm64.whl", hash = "sha256:5c39026d12edc826a1ef2ad35ad1e6d7f087f934bb868fc43fa3049c8b8508f9", size = 28864626, upload-time = "2025-09-11T17:41:52.642Z" }, + { url = "https://files.pythonhosted.org/packages/4c/fc/ea36098df653cca26062a627c1a94b0de659e97127c8491e18713ca0e3b9/scipy-1.16.2-cp313-cp313-macosx_14_0_arm64.whl", hash = "sha256:e52729ffd45b68777c5319560014d6fd251294200625d9d70fd8626516fc49f5", size = 20855689, upload-time = "2025-09-11T17:41:57.886Z" }, + { url = "https://files.pythonhosted.org/packages/dc/6f/d0b53be55727f3e6d7c72687ec18ea6d0047cf95f1f77488b99a2bafaee1/scipy-1.16.2-cp313-cp313-macosx_14_0_x86_64.whl", hash = "sha256:024dd4a118cccec09ca3209b7e8e614931a6ffb804b2a601839499cb88bdf925", size = 23512151, upload-time = "2025-09-11T17:42:02.303Z" }, + { url = "https://files.pythonhosted.org/packages/11/85/bf7dab56e5c4b1d3d8eef92ca8ede788418ad38a7dc3ff50262f00808760/scipy-1.16.2-cp313-cp313-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:7a5dc7ee9c33019973a470556081b0fd3c9f4c44019191039f9769183141a4d9", size = 33329824, upload-time = "2025-09-11T17:42:07.549Z" }, + { url = "https://files.pythonhosted.org/packages/da/6a/1a927b14ddc7714111ea51f4e568203b2bb6ed59bdd036d62127c1a360c8/scipy-1.16.2-cp313-cp313-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:c2275ff105e508942f99d4e3bc56b6ef5e4b3c0af970386ca56b777608ce95b7", size = 35681881, upload-time = "2025-09-11T17:42:13.255Z" }, + { url = "https://files.pythonhosted.org/packages/c1/5f/331148ea5780b4fcc7007a4a6a6ee0a0c1507a796365cc642d4d226e1c3a/scipy-1.16.2-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:af80196eaa84f033e48444d2e0786ec47d328ba00c71e4299b602235ffef9acb", size = 36006219, upload-time = "2025-09-11T17:42:18.765Z" }, + { url = "https://files.pythonhosted.org/packages/46/3a/e991aa9d2aec723b4a8dcfbfc8365edec5d5e5f9f133888067f1cbb7dfc1/scipy-1.16.2-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:9fb1eb735fe3d6ed1f89918224e3385fbf6f9e23757cacc35f9c78d3b712dd6e", size = 38682147, upload-time = "2025-09-11T17:42:25.177Z" }, + { url = "https://files.pythonhosted.org/packages/a1/57/0f38e396ad19e41b4c5db66130167eef8ee620a49bc7d0512e3bb67e0cab/scipy-1.16.2-cp313-cp313-win_amd64.whl", hash = "sha256:fda714cf45ba43c9d3bae8f2585c777f64e3f89a2e073b668b32ede412d8f52c", size = 38520766, upload-time = "2025-09-11T17:43:25.342Z" }, + { url = "https://files.pythonhosted.org/packages/1b/a5/85d3e867b6822d331e26c862a91375bb7746a0b458db5effa093d34cdb89/scipy-1.16.2-cp313-cp313-win_arm64.whl", hash = "sha256:2f5350da923ccfd0b00e07c3e5cfb316c1c0d6c1d864c07a72d092e9f20db104", size = 25451169, upload-time = "2025-09-11T17:43:30.198Z" }, + { url = "https://files.pythonhosted.org/packages/09/d9/60679189bcebda55992d1a45498de6d080dcaf21ce0c8f24f888117e0c2d/scipy-1.16.2-cp313-cp313t-macosx_10_14_x86_64.whl", hash = "sha256:53d8d2ee29b925344c13bda64ab51785f016b1b9617849dac10897f0701b20c1", size = 37012682, upload-time = "2025-09-11T17:42:30.677Z" }, + { url = "https://files.pythonhosted.org/packages/83/be/a99d13ee4d3b7887a96f8c71361b9659ba4ef34da0338f14891e102a127f/scipy-1.16.2-cp313-cp313t-macosx_12_0_arm64.whl", hash = "sha256:9e05e33657efb4c6a9d23bd8300101536abd99c85cca82da0bffff8d8764d08a", size = 29389926, upload-time = "2025-09-11T17:42:35.845Z" }, + { url = "https://files.pythonhosted.org/packages/bf/0a/130164a4881cec6ca8c00faf3b57926f28ed429cd6001a673f83c7c2a579/scipy-1.16.2-cp313-cp313t-macosx_14_0_arm64.whl", hash = "sha256:7fe65b36036357003b3ef9d37547abeefaa353b237e989c21027b8ed62b12d4f", size = 21381152, upload-time = "2025-09-11T17:42:40.07Z" }, + { url = "https://files.pythonhosted.org/packages/47/a6/503ffb0310ae77fba874e10cddfc4a1280bdcca1d13c3751b8c3c2996cf8/scipy-1.16.2-cp313-cp313t-macosx_14_0_x86_64.whl", hash = "sha256:6406d2ac6d40b861cccf57f49592f9779071655e9f75cd4f977fa0bdd09cb2e4", size = 23914410, upload-time = "2025-09-11T17:42:44.313Z" }, + { url = "https://files.pythonhosted.org/packages/fa/c7/1147774bcea50d00c02600aadaa919facbd8537997a62496270133536ed6/scipy-1.16.2-cp313-cp313t-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:ff4dc42bd321991fbf611c23fc35912d690f731c9914bf3af8f417e64aca0f21", size = 33481880, upload-time = "2025-09-11T17:42:49.325Z" }, + { url = "https://files.pythonhosted.org/packages/6a/74/99d5415e4c3e46b2586f30cdbecb95e101c7192628a484a40dd0d163811a/scipy-1.16.2-cp313-cp313t-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:654324826654d4d9133e10675325708fb954bc84dae6e9ad0a52e75c6b1a01d7", size = 35791425, upload-time = "2025-09-11T17:42:54.711Z" }, + { url = "https://files.pythonhosted.org/packages/1b/ee/a6559de7c1cc710e938c0355d9d4fbcd732dac4d0d131959d1f3b63eb29c/scipy-1.16.2-cp313-cp313t-musllinux_1_2_aarch64.whl", hash = "sha256:63870a84cd15c44e65220eaed2dac0e8f8b26bbb991456a033c1d9abfe8a94f8", size = 36178622, upload-time = "2025-09-11T17:43:00.375Z" }, + { url = "https://files.pythonhosted.org/packages/4e/7b/f127a5795d5ba8ece4e0dce7d4a9fb7cb9e4f4757137757d7a69ab7d4f1a/scipy-1.16.2-cp313-cp313t-musllinux_1_2_x86_64.whl", hash = "sha256:fa01f0f6a3050fa6a9771a95d5faccc8e2f5a92b4a2e5440a0fa7264a2398472", size = 38783985, upload-time = "2025-09-11T17:43:06.661Z" }, + { url = "https://files.pythonhosted.org/packages/3e/9f/bc81c1d1e033951eb5912cd3750cc005943afa3e65a725d2443a3b3c4347/scipy-1.16.2-cp313-cp313t-win_amd64.whl", hash = "sha256:116296e89fba96f76353a8579820c2512f6e55835d3fad7780fece04367de351", size = 38631367, upload-time = "2025-09-11T17:43:14.44Z" }, + { url = "https://files.pythonhosted.org/packages/d6/5e/2cc7555fd81d01814271412a1d59a289d25f8b63208a0a16c21069d55d3e/scipy-1.16.2-cp313-cp313t-win_arm64.whl", hash = "sha256:98e22834650be81d42982360382b43b17f7ba95e0e6993e2a4f5b9ad9283a94d", size = 25787992, upload-time = "2025-09-11T17:43:19.745Z" }, + { url = "https://files.pythonhosted.org/packages/8b/ac/ad8951250516db71619f0bd3b2eb2448db04b720a003dd98619b78b692c0/scipy-1.16.2-cp314-cp314-macosx_10_14_x86_64.whl", hash = "sha256:567e77755019bb7461513c87f02bb73fb65b11f049aaaa8ca17cfaa5a5c45d77", size = 36595109, upload-time = "2025-09-11T17:43:35.713Z" }, + { url = "https://files.pythonhosted.org/packages/ff/f6/5779049ed119c5b503b0f3dc6d6f3f68eefc3a9190d4ad4c276f854f051b/scipy-1.16.2-cp314-cp314-macosx_12_0_arm64.whl", hash = "sha256:17d9bb346194e8967296621208fcdfd39b55498ef7d2f376884d5ac47cec1a70", size = 28859110, upload-time = "2025-09-11T17:43:40.814Z" }, + { url = "https://files.pythonhosted.org/packages/82/09/9986e410ae38bf0a0c737ff8189ac81a93b8e42349aac009891c054403d7/scipy-1.16.2-cp314-cp314-macosx_14_0_arm64.whl", hash = "sha256:0a17541827a9b78b777d33b623a6dcfe2ef4a25806204d08ead0768f4e529a88", size = 20850110, upload-time = "2025-09-11T17:43:44.981Z" }, + { url = "https://files.pythonhosted.org/packages/0d/ad/485cdef2d9215e2a7df6d61b81d2ac073dfacf6ae24b9ae87274c4e936ae/scipy-1.16.2-cp314-cp314-macosx_14_0_x86_64.whl", hash = "sha256:d7d4c6ba016ffc0f9568d012f5f1eb77ddd99412aea121e6fa8b4c3b7cbad91f", size = 23497014, upload-time = "2025-09-11T17:43:49.074Z" }, + { url = "https://files.pythonhosted.org/packages/a7/74/f6a852e5d581122b8f0f831f1d1e32fb8987776ed3658e95c377d308ed86/scipy-1.16.2-cp314-cp314-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:9702c4c023227785c779cba2e1d6f7635dbb5b2e0936cdd3a4ecb98d78fd41eb", size = 33401155, upload-time = "2025-09-11T17:43:54.661Z" }, + { url = "https://files.pythonhosted.org/packages/d9/f5/61d243bbc7c6e5e4e13dde9887e84a5cbe9e0f75fd09843044af1590844e/scipy-1.16.2-cp314-cp314-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:d1cdf0ac28948d225decdefcc45ad7dd91716c29ab56ef32f8e0d50657dffcc7", size = 35691174, upload-time = "2025-09-11T17:44:00.101Z" }, + { url = "https://files.pythonhosted.org/packages/03/99/59933956331f8cc57e406cdb7a483906c74706b156998f322913e789c7e1/scipy-1.16.2-cp314-cp314-musllinux_1_2_aarch64.whl", hash = "sha256:70327d6aa572a17c2941cdfb20673f82e536e91850a2e4cb0c5b858b690e1548", size = 36070752, upload-time = "2025-09-11T17:44:05.619Z" }, + { url = "https://files.pythonhosted.org/packages/c6/7d/00f825cfb47ee19ef74ecf01244b43e95eae74e7e0ff796026ea7cd98456/scipy-1.16.2-cp314-cp314-musllinux_1_2_x86_64.whl", hash = "sha256:5221c0b2a4b58aa7c4ed0387d360fd90ee9086d383bb34d9f2789fafddc8a936", size = 38701010, upload-time = "2025-09-11T17:44:11.322Z" }, + { url = "https://files.pythonhosted.org/packages/e4/9f/b62587029980378304ba5a8563d376c96f40b1e133daacee76efdcae32de/scipy-1.16.2-cp314-cp314-win_amd64.whl", hash = "sha256:f5a85d7b2b708025af08f060a496dd261055b617d776fc05a1a1cc69e09fe9ff", size = 39360061, upload-time = "2025-09-11T17:45:09.814Z" }, + { url = "https://files.pythonhosted.org/packages/82/04/7a2f1609921352c7fbee0815811b5050582f67f19983096c4769867ca45f/scipy-1.16.2-cp314-cp314-win_arm64.whl", hash = "sha256:2cc73a33305b4b24556957d5857d6253ce1e2dcd67fa0ff46d87d1670b3e1e1d", size = 26126914, upload-time = "2025-09-11T17:45:14.73Z" }, + { url = "https://files.pythonhosted.org/packages/51/b9/60929ce350c16b221928725d2d1d7f86cf96b8bc07415547057d1196dc92/scipy-1.16.2-cp314-cp314t-macosx_10_14_x86_64.whl", hash = "sha256:9ea2a3fed83065d77367775d689401a703d0f697420719ee10c0780bcab594d8", size = 37013193, upload-time = "2025-09-11T17:44:16.757Z" }, + { url = "https://files.pythonhosted.org/packages/2a/41/ed80e67782d4bc5fc85a966bc356c601afddd175856ba7c7bb6d9490607e/scipy-1.16.2-cp314-cp314t-macosx_12_0_arm64.whl", hash = "sha256:7280d926f11ca945c3ef92ba960fa924e1465f8d07ce3a9923080363390624c4", size = 29390172, upload-time = "2025-09-11T17:44:21.783Z" }, + { url = "https://files.pythonhosted.org/packages/c4/a3/2f673ace4090452696ccded5f5f8efffb353b8f3628f823a110e0170b605/scipy-1.16.2-cp314-cp314t-macosx_14_0_arm64.whl", hash = "sha256:8afae1756f6a1fe04636407ef7dbece33d826a5d462b74f3d0eb82deabefd831", size = 21381326, upload-time = "2025-09-11T17:44:25.982Z" }, + { url = "https://files.pythonhosted.org/packages/42/bf/59df61c5d51395066c35836b78136accf506197617c8662e60ea209881e1/scipy-1.16.2-cp314-cp314t-macosx_14_0_x86_64.whl", hash = "sha256:5c66511f29aa8d233388e7416a3f20d5cae7a2744d5cee2ecd38c081f4e861b3", size = 23915036, upload-time = "2025-09-11T17:44:30.527Z" }, + { url = "https://files.pythonhosted.org/packages/91/c3/edc7b300dc16847ad3672f1a6f3f7c5d13522b21b84b81c265f4f2760d4a/scipy-1.16.2-cp314-cp314t-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:efe6305aeaa0e96b0ccca5ff647a43737d9a092064a3894e46c414db84bc54ac", size = 33484341, upload-time = "2025-09-11T17:44:35.981Z" }, + { url = "https://files.pythonhosted.org/packages/26/c7/24d1524e72f06ff141e8d04b833c20db3021020563272ccb1b83860082a9/scipy-1.16.2-cp314-cp314t-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:7f3a337d9ae06a1e8d655ee9d8ecb835ea5ddcdcbd8d23012afa055ab014f374", size = 35790840, upload-time = "2025-09-11T17:44:41.76Z" }, + { url = "https://files.pythonhosted.org/packages/aa/b7/5aaad984eeedd56858dc33d75efa59e8ce798d918e1033ef62d2708f2c3d/scipy-1.16.2-cp314-cp314t-musllinux_1_2_aarch64.whl", hash = "sha256:bab3605795d269067d8ce78a910220262711b753de8913d3deeaedb5dded3bb6", size = 36174716, upload-time = "2025-09-11T17:44:47.316Z" }, + { url = "https://files.pythonhosted.org/packages/fd/c2/e276a237acb09824822b0ada11b028ed4067fdc367a946730979feacb870/scipy-1.16.2-cp314-cp314t-musllinux_1_2_x86_64.whl", hash = "sha256:b0348d8ddb55be2a844c518cd8cc8deeeb8aeba707cf834db5758fc89b476a2c", size = 38790088, upload-time = "2025-09-11T17:44:53.011Z" }, + { url = "https://files.pythonhosted.org/packages/c6/b4/5c18a766e8353015439f3780f5fc473f36f9762edc1a2e45da3ff5a31b21/scipy-1.16.2-cp314-cp314t-win_amd64.whl", hash = "sha256:26284797e38b8a75e14ea6631d29bda11e76ceaa6ddb6fdebbfe4c4d90faf2f9", size = 39457455, upload-time = "2025-09-11T17:44:58.899Z" }, + { url = "https://files.pythonhosted.org/packages/97/30/2f9a5243008f76dfc5dee9a53dfb939d9b31e16ce4bd4f2e628bfc5d89d2/scipy-1.16.2-cp314-cp314t-win_arm64.whl", hash = "sha256:d2a4472c231328d4de38d5f1f68fdd6d28a615138f842580a8a321b5845cf779", size = 26448374, upload-time = "2025-09-11T17:45:03.45Z" }, +] + [[package]] name = "screeninfo" version = "0.8.1" @@ -4089,6 +4503,12 @@ wheels = [ { url = "https://files.pythonhosted.org/packages/6e/bf/c5205d480307bef660e56544b9e3d7ff687da776abb30c9cb3f330887570/screeninfo-0.8.1-py3-none-any.whl", hash = "sha256:e97d6b173856edcfa3bd282f81deb528188aff14b11ec3e195584e7641be733c", size = 12907, upload-time = "2022-09-09T11:35:21.351Z" }, ] +[[package]] +name = "simpleaudio" +version = "1.0.4" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/94/1b/4dc29653733202b68c09d9c6ca085cf67ac54859ee860647ef21ac1ff3dc/simpleaudio-1.0.4.tar.gz", hash = "sha256:691c88649243544db717e7edf6a9831df112104e1aefb5f6038a5d071e8cf41d", size = 2042564, upload-time = "2019-11-29T03:56:28.965Z" } + [[package]] name = "six" version = "1.17.0" @@ -4107,6 +4527,40 @@ wheels = [ { url = "https://files.pythonhosted.org/packages/e9/44/75a9c9421471a6c4805dbf2356f7c181a29c1879239abab1ea2cc8f38b40/sniffio-1.3.1-py3-none-any.whl", hash = "sha256:2f6da418d1f1e0fddd844478f41680e794e6051915791a034ff65e5f100525a2", size = 10235, upload-time = "2024-02-25T23:20:01.196Z" }, ] +[[package]] +name = "sounddevice" +version = "0.5.3" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "cffi" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/4e/4f/28e734898b870db15b6474453f19813d3c81b91c806d9e6f867bd6e4dd03/sounddevice-0.5.3.tar.gz", hash = "sha256:cbac2b60198fbab84533697e7c4904cc895ec69d5fb3973556c9eb74a4629b2c", size = 53465, upload-time = "2025-10-19T13:23:57.922Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/73/e7/9020e9f0f3df00432728f4c4044387468a743e3d9a4f91123d77be10010e/sounddevice-0.5.3-py3-none-any.whl", hash = "sha256:ea7738baa0a9f9fef7390f649e41c9f2c8ada776180e56c2ffd217133c92a806", size = 32670, upload-time = "2025-10-19T13:23:51.779Z" }, + { url = "https://files.pythonhosted.org/packages/2f/39/714118f8413e0e353436914f2b976665161f1be2b6483ac15a8f61484c14/sounddevice-0.5.3-py3-none-macosx_10_6_x86_64.macosx_10_6_universal2.whl", hash = "sha256:278dc4451fff70934a176df048b77d80d7ce1623a6ec9db8b34b806f3112f9c2", size = 108306, upload-time = "2025-10-19T13:23:53.277Z" }, + { url = "https://files.pythonhosted.org/packages/f5/74/52186e3e5c833d00273f7949a9383adff93692c6e02406bf359cb4d3e921/sounddevice-0.5.3-py3-none-win32.whl", hash = "sha256:845d6927bcf14e84be5292a61ab3359cf8e6b9145819ec6f3ac2619ff089a69c", size = 312882, upload-time = "2025-10-19T13:23:54.829Z" }, + { url = "https://files.pythonhosted.org/packages/66/c7/16123d054aef6d445176c9122bfbe73c11087589b2413cab22aff5a7839a/sounddevice-0.5.3-py3-none-win_amd64.whl", hash = "sha256:f55ad20082efc2bdec06928e974fbcae07bc6c405409ae1334cefe7d377eb687", size = 364025, upload-time = "2025-10-19T13:23:56.362Z" }, +] + +[[package]] +name = "soundfile" +version = "0.13.1" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "cffi" }, + { name = "numpy" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/e1/41/9b873a8c055582859b239be17902a85339bec6a30ad162f98c9b0288a2cc/soundfile-0.13.1.tar.gz", hash = "sha256:b2c68dab1e30297317080a5b43df57e302584c49e2942defdde0acccc53f0e5b", size = 46156, upload-time = "2025-01-25T09:17:04.831Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/64/28/e2a36573ccbcf3d57c00626a21fe51989380636e821b341d36ccca0c1c3a/soundfile-0.13.1-py2.py3-none-any.whl", hash = "sha256:a23c717560da2cf4c7b5ae1142514e0fd82d6bbd9dfc93a50423447142f2c445", size = 25751, upload-time = "2025-01-25T09:16:44.235Z" }, + { url = "https://files.pythonhosted.org/packages/ea/ab/73e97a5b3cc46bba7ff8650a1504348fa1863a6f9d57d7001c6b67c5f20e/soundfile-0.13.1-py2.py3-none-macosx_10_9_x86_64.whl", hash = "sha256:82dc664d19831933fe59adad199bf3945ad06d84bc111a5b4c0d3089a5b9ec33", size = 1142250, upload-time = "2025-01-25T09:16:47.583Z" }, + { url = "https://files.pythonhosted.org/packages/a0/e5/58fd1a8d7b26fc113af244f966ee3aecf03cb9293cb935daaddc1e455e18/soundfile-0.13.1-py2.py3-none-macosx_11_0_arm64.whl", hash = "sha256:743f12c12c4054921e15736c6be09ac26b3b3d603aef6fd69f9dde68748f2593", size = 1101406, upload-time = "2025-01-25T09:16:49.662Z" }, + { url = "https://files.pythonhosted.org/packages/58/ae/c0e4a53d77cf6e9a04179535766b3321b0b9ced5f70522e4caf9329f0046/soundfile-0.13.1-py2.py3-none-manylinux_2_28_aarch64.whl", hash = "sha256:9c9e855f5a4d06ce4213f31918653ab7de0c5a8d8107cd2427e44b42df547deb", size = 1235729, upload-time = "2025-01-25T09:16:53.018Z" }, + { url = "https://files.pythonhosted.org/packages/57/5e/70bdd9579b35003a489fc850b5047beeda26328053ebadc1fb60f320f7db/soundfile-0.13.1-py2.py3-none-manylinux_2_28_x86_64.whl", hash = "sha256:03267c4e493315294834a0870f31dbb3b28a95561b80b134f0bd3cf2d5f0e618", size = 1313646, upload-time = "2025-01-25T09:16:54.872Z" }, + { url = "https://files.pythonhosted.org/packages/fe/df/8c11dc4dfceda14e3003bb81a0d0edcaaf0796dd7b4f826ea3e532146bba/soundfile-0.13.1-py2.py3-none-win32.whl", hash = "sha256:c734564fab7c5ddf8e9be5bf70bab68042cd17e9c214c06e365e20d64f9a69d5", size = 899881, upload-time = "2025-01-25T09:16:56.663Z" }, + { url = "https://files.pythonhosted.org/packages/14/e9/6b761de83277f2f02ded7e7ea6f07828ec78e4b229b80e4ca55dd205b9dc/soundfile-0.13.1-py2.py3-none-win_amd64.whl", hash = "sha256:1e70a05a0626524a69e9f0f4dd2ec174b4e9567f4d8b6c11d38b5c289be36ee9", size = 1019162, upload-time = "2025-01-25T09:16:59.573Z" }, +] + [[package]] name = "soupsieve" version = "2.8" @@ -4116,6 +4570,27 @@ wheels = [ { url = "https://files.pythonhosted.org/packages/14/a0/bb38d3b76b8cae341dad93a2dd83ab7462e6dbcdd84d43f54ee60a8dc167/soupsieve-2.8-py3-none-any.whl", hash = "sha256:0cc76456a30e20f5d7f2e14a98a4ae2ee4e5abdc7c5ea0aafe795f344bc7984c", size = 36679, upload-time = "2025-08-27T15:39:50.179Z" }, ] +[[package]] +name = "soxr" +version = "1.0.0" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "numpy" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/42/7e/f4b461944662ad75036df65277d6130f9411002bfb79e9df7dff40a31db9/soxr-1.0.0.tar.gz", hash = "sha256:e07ee6c1d659bc6957034f4800c60cb8b98de798823e34d2a2bba1caa85a4509", size = 171415, upload-time = "2025-09-07T13:22:21.317Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/c5/c7/f92b81f1a151c13afb114f57799b86da9330bec844ea5a0d3fe6a8732678/soxr-1.0.0-cp312-abi3-macosx_10_14_x86_64.whl", hash = "sha256:abecf4e39017f3fadb5e051637c272ae5778d838e5c3926a35db36a53e3a607f", size = 205508, upload-time = "2025-09-07T13:22:01.252Z" }, + { url = "https://files.pythonhosted.org/packages/ff/1d/c945fea9d83ea1f2be9d116b3674dbaef26ed090374a77c394b31e3b083b/soxr-1.0.0-cp312-abi3-macosx_11_0_arm64.whl", hash = "sha256:e973d487ee46aa8023ca00a139db6e09af053a37a032fe22f9ff0cc2e19c94b4", size = 163568, upload-time = "2025-09-07T13:22:03.558Z" }, + { url = "https://files.pythonhosted.org/packages/b5/80/10640970998a1d2199bef6c4d92205f36968cddaf3e4d0e9fe35ddd405bd/soxr-1.0.0-cp312-abi3-manylinux_2_26_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:e8ce273cca101aff3d8c387db5a5a41001ba76ef1837883438d3c652507a9ccc", size = 204707, upload-time = "2025-09-07T13:22:05.125Z" }, + { url = "https://files.pythonhosted.org/packages/b1/87/2726603c13c2126cb8ded9e57381b7377f4f0df6ba4408e1af5ddbfdc3dd/soxr-1.0.0-cp312-abi3-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:e8f2a69686f2856d37823bbb7b78c3d44904f311fe70ba49b893af11d6b6047b", size = 238032, upload-time = "2025-09-07T13:22:06.428Z" }, + { url = "https://files.pythonhosted.org/packages/ce/04/530252227f4d0721a5524a936336485dfb429bb206a66baf8e470384f4a2/soxr-1.0.0-cp312-abi3-win_amd64.whl", hash = "sha256:2a3b77b115ae7c478eecdbd060ed4f61beda542dfb70639177ac263aceda42a2", size = 172070, upload-time = "2025-09-07T13:22:07.62Z" }, + { url = "https://files.pythonhosted.org/packages/99/77/d3b3c25b4f1b1aa4a73f669355edcaee7a52179d0c50407697200a0e55b9/soxr-1.0.0-cp314-cp314t-macosx_10_14_x86_64.whl", hash = "sha256:392a5c70c04eb939c9c176bd6f654dec9a0eaa9ba33d8f1024ed63cf68cdba0a", size = 209509, upload-time = "2025-09-07T13:22:08.773Z" }, + { url = "https://files.pythonhosted.org/packages/8a/ee/3ca73e18781bb2aff92b809f1c17c356dfb9a1870652004bd432e79afbfa/soxr-1.0.0-cp314-cp314t-macosx_11_0_arm64.whl", hash = "sha256:fdc41a1027ba46777186f26a8fba7893be913383414135577522da2fcc684490", size = 167690, upload-time = "2025-09-07T13:22:10.259Z" }, + { url = "https://files.pythonhosted.org/packages/bd/f0/eea8b5f587a2531657dc5081d2543a5a845f271a3bea1c0fdee5cebde021/soxr-1.0.0-cp314-cp314t-manylinux_2_26_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:449acd1dfaf10f0ce6dfd75c7e2ef984890df94008765a6742dafb42061c1a24", size = 209541, upload-time = "2025-09-07T13:22:11.739Z" }, + { url = "https://files.pythonhosted.org/packages/64/59/2430a48c705565eb09e78346950b586f253a11bd5313426ced3ecd9b0feb/soxr-1.0.0-cp314-cp314t-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:38b35c99e408b8f440c9376a5e1dd48014857cd977c117bdaa4304865ae0edd0", size = 243025, upload-time = "2025-09-07T13:22:12.877Z" }, + { url = "https://files.pythonhosted.org/packages/3c/1b/f84a2570a74094e921bbad5450b2a22a85d58585916e131d9b98029c3e69/soxr-1.0.0-cp314-cp314t-win_amd64.whl", hash = "sha256:a39b519acca2364aa726b24a6fd55acf29e4c8909102e0b858c23013c38328e5", size = 184850, upload-time = "2025-09-07T13:22:14.068Z" }, +] + [[package]] name = "sse-starlette" version = "3.0.2" @@ -4128,6 +4603,40 @@ wheels = [ { url = "https://files.pythonhosted.org/packages/ef/10/c78f463b4ef22eef8491f218f692be838282cd65480f6e423d7730dfd1fb/sse_starlette-3.0.2-py3-none-any.whl", hash = "sha256:16b7cbfddbcd4eaca11f7b586f3b8a080f1afe952c15813455b162edea619e5a", size = 11297, upload-time = "2025-07-27T09:07:43.268Z" }, ] +[[package]] +name = "standard-aifc" +version = "3.13.0" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "audioop-lts" }, + { name = "standard-chunk" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/c4/53/6050dc3dde1671eb3db592c13b55a8005e5040131f7509cef0215212cb84/standard_aifc-3.13.0.tar.gz", hash = "sha256:64e249c7cb4b3daf2fdba4e95721f811bde8bdfc43ad9f936589b7bb2fae2e43", size = 15240, upload-time = "2024-10-30T16:01:31.772Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/c3/52/5fbb203394cc852334d1575cc020f6bcec768d2265355984dfd361968f36/standard_aifc-3.13.0-py3-none-any.whl", hash = "sha256:f7ae09cc57de1224a0dd8e3eb8f73830be7c3d0bc485de4c1f82b4a7f645ac66", size = 10492, upload-time = "2024-10-30T16:01:07.071Z" }, +] + +[[package]] +name = "standard-chunk" +version = "3.13.0" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/43/06/ce1bb165c1f111c7d23a1ad17204d67224baa69725bb6857a264db61beaf/standard_chunk-3.13.0.tar.gz", hash = "sha256:4ac345d37d7e686d2755e01836b8d98eda0d1a3ee90375e597ae43aaf064d654", size = 4672, upload-time = "2024-10-30T16:18:28.326Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/7a/90/a5c1084d87767d787a6caba615aa50dc587229646308d9420c960cb5e4c0/standard_chunk-3.13.0-py3-none-any.whl", hash = "sha256:17880a26c285189c644bd5bd8f8ed2bdb795d216e3293e6dbe55bbd848e2982c", size = 4944, upload-time = "2024-10-30T16:18:26.694Z" }, +] + +[[package]] +name = "standard-sunau" +version = "3.13.0" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "audioop-lts" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/66/e3/ce8d38cb2d70e05ffeddc28bb09bad77cfef979eb0a299c9117f7ed4e6a9/standard_sunau-3.13.0.tar.gz", hash = "sha256:b319a1ac95a09a2378a8442f403c66f4fd4b36616d6df6ae82b8e536ee790908", size = 9368, upload-time = "2024-10-30T16:01:41.626Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/34/ae/e3707f6c1bc6f7aa0df600ba8075bfb8a19252140cd595335be60e25f9ee/standard_sunau-3.13.0-py3-none-any.whl", hash = "sha256:53af624a9529c41062f4c2fd33837f297f3baa196b0cfceffea6555654602622", size = 7364, upload-time = "2024-10-30T16:01:28.003Z" }, +] + [[package]] name = "starlette" version = "0.48.0" @@ -4149,6 +4658,15 @@ wheels = [ { url = "https://files.pythonhosted.org/packages/e5/30/643397144bfbfec6f6ef821f36f33e57d35946c44a2352d3c9f0ae847619/tenacity-9.1.2-py3-none-any.whl", hash = "sha256:f77bf36710d8b73a50b2dd155c97b870017ad21afe6ab300326b0371b3b05138", size = 28248, upload-time = "2025-04-02T08:25:07.678Z" }, ] +[[package]] +name = "threadpoolctl" +version = "3.6.0" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/b7/4d/08c89e34946fce2aec4fbb45c9016efd5f4d7f24af8e5d93296e935631d8/threadpoolctl-3.6.0.tar.gz", hash = "sha256:8ab8b4aa3491d812b623328249fab5302a68d2d71745c8a4c719a2fcaba9f44e", size = 21274, upload-time = "2025-03-13T13:49:23.031Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/32/d5/f9a850d79b0851d1d4ef6456097579a9005b31fea68726a4ae5f2d82ddd9/threadpoolctl-3.6.0-py3-none-any.whl", hash = "sha256:43a0b8fd5a2928500110039e43a5eed8480b918967083ea48dc3ab9f13c4a7fb", size = 18638, upload-time = "2025-03-13T13:49:21.846Z" }, +] + [[package]] name = "tqdm" version = "4.67.1" From eb0b72b2e39051722ed445db4c45c5e944a38b92 Mon Sep 17 00:00:00 2001 From: rafa-rrayes Date: Sun, 26 Oct 2025 12:51:57 -0300 Subject: [PATCH 3/3] letsgo --- .env.example | 5 + QUICKSTART.md | 0 README.md | 155 ++++++++++--- USAGE.md | 307 ++++++++++++++++++++++++++ beacon_controller.py | 319 +++++++++++++++++++++++++++ config.py | 7 +- examples_agent_control.py | 230 ++++++++++++++++++++ keyboard_handler.py | 122 +++++++++++ main.py | 446 ++++++++++++-------------------------- pyproject.toml | 10 +- uv.lock | 82 +++---- voice_handler.py | 80 +++++++ 12 files changed, 1367 insertions(+), 396 deletions(-) create mode 100644 .env.example create mode 100644 QUICKSTART.md create mode 100644 USAGE.md create mode 100644 beacon_controller.py create mode 100644 examples_agent_control.py create mode 100644 keyboard_handler.py create mode 100644 voice_handler.py diff --git a/.env.example b/.env.example new file mode 100644 index 0000000..7b10abb --- /dev/null +++ b/.env.example @@ -0,0 +1,5 @@ +# OPENAI_API_KEY= +# BROWSER_USE_API_KEY= + +# GEMINI_API_KEY= +# BROWSER_HEADLESS=false \ No newline at end of file diff --git a/QUICKSTART.md b/QUICKSTART.md new file mode 100644 index 0000000..e69de29 diff --git a/README.md b/README.md index d26d921..dd45f4d 100644 --- a/README.md +++ b/README.md @@ -1,46 +1,131 @@ -# Beacon MVP +# 🔷 Beacon -Beacon is a voice-first browsing assistant designed for blind users. It analyses the current page, explains what matters, presents a numbered action menu, and executes the selected task through an autonomous browser agent. High-risk actions (purchases, submissions, posts) always require confirmation in plain language. +**Navegador Controlado por Voz para Pessoas Cegas** -## Requirements -- Python 3.13 (matches the project `pyproject.toml`). -- Google Chrome running locally (Beacon connects through the `browser-use` CDP client). -- An `OPENAI_API_KEY` with access to the text and audio models used below. -- Optional for microphone input: `sounddevice` and `numpy` (`pip install sounddevice numpy`). -- macOS users get spoken output automatically through `afplay`. On other systems install `ffplay`, `mpg123`, or `sox`'s `play` command for audio playback, otherwise transcripts are printed. +## Hackathon Devs de Impacto! -## Installation +--- + +## 💡 O Problema + +Navegar na web é uma tarefa visual por design. Para pessoas cegas, a experiência atual significa: +- Ouvir cada elemento da página em ordem sequencial +- Navegar por anúncios, popups e botões sem rótulos +- Não ter contexto sobre o que a página realmente oferece +- Dificuldade em identificar ações importantes rapidamente + +## 🎯 Nossa Solução: Beacon + +Beacon não apenas **lê** páginas web — ele as **compreende**. Transformamos páginas visuais complexas em menus falados simples que tornam a navegação intuitiva e eficiente. + +### Como Funciona + +1. **Analisa** a página — identifica se é uma loja, artigo, formulário, checkout, etc. +2. **Resume** informações-chave — apresenta o conteúdo mais importante primeiro +3. **Simplifica** ações — converte interações complexas em um menu numerado: + - "1. Adicionar ao carrinho" + - "2. Ler avaliações" + - "3. Ver especificações técnicas" +4. **Age em seu nome** — clica botões, preenche formulários, rola e navega baseado na sua intenção +5. **Mantém você seguro** — sempre confirma antes de ações de alto risco como pagamentos ou publicações + +## 🚀 Instalação Rápida ```bash -uv sync # or: pip install -e . +# Instalar dependências +uv sync + +# Configurar chaves de API no .env + +# Executar Beacon +uv run main.py ``` -Ensure the virtual environment is activated (`source .venv/bin/activate` when using `uv`). +### Flags Úteis -## Running Beacon +- `--agent-steps` — número máximo de passos do agente por ação (padrão: 8) +- `--load-wait` — segundos de espera após navegação (padrão: 4.0) -```bash -python browser-use/main.py --url https://example.com +## 🎮 Como Usar + +### Comandos por Voz ou Teclado + +Beacon entende linguagem natural: + +- **Navegação**: "Abrir amazon.com" / "Ir para YouTube" +- **Compreensão**: "O que é esta página?" / "Resumir" +- **Ações**: "Adicionar ao carrinho" / "Fazer número 2" / "Ler artigo" +- **Interação**: "Pesquisar fones sem fio" / "Voltar" +- **Nova página**: "Nova página" → Beacon pedirá a URL + +### Segurança em Primeiro Lugar + +Beacon **sempre pedirá confirmação** antes de: +- ✅ Enviar informações de pagamento +- ✅ Publicar conteúdo +- ✅ Fazer compras +- ✅ Deletar qualquer coisa +- ✅ Enviar mensagens ou emails + +## 🏗️ Arquitetura Técnica + +``` +browser-use/ +├── main.py # Ponto de entrada CLI +├── beacon.py # Orquestração do aplicativo +└── tools.py # Motor de análise de páginas e interface de voz ``` -Useful flags: - -- `--no-voice` – disable text-to-speech output (text prompts only). -- `--mic` – enable microphone capture (requires `sounddevice` and `numpy`). -- `--analysis-model`, `--tts-model`, `--transcription-model` – override default OpenAI models. -- `--agent-steps` – cap the browser agent iterations per action (defaults to 8). -- `--load-wait` – seconds to pause after navigation before summarising. - -## Workflow -1. Beacon opens the target page and collects a DOM snapshot through `browser-use`. -2. `gpt-4o-mini` summarises the page intent, highlights important data, and proposes 3–6 key actions. -3. Actions are voiced as a numbered menu (`1. Add to cart`, `2. Read reviews`, …). -4. The user responds by voice or keyboard. Beacon parses numbers, action names, or navigation commands. -5. Selected actions run through the `browser-use` agent. High-risk actions require explicit confirmation. -6. Beacon reads back the result and refreshes the summary so the user can continue. - -## Limitations & Next Steps -- Microphone capture is optional; for production we would add wake-word detection and streaming STT. -- Presently the agent shares a single session; future iterations could support multi-tab workflows. -- Safety heuristics rely on model output—additional rule-based checks (e.g. detecting payment forms) would harden confirmations. -- The accessibility menu is generated from DOM text; integrating landmark roles / ARIA data would further improve prioritisation. +### Componentes Principais + +1. **PageUnderstandingEngine** — Usa GPT-4o-mini para analisar DOM e extrair ações relevantes +2. **VoiceInterface** — TTS (text-to-speech) e STT (speech-to-text) via OpenAI +3. **BeaconApp** — Coordena navegação, resumos e delegação de tarefas ao agente +4. **browser-use Agent** — Executa ações autônomas na página atual + +### Dependências + +- `browser-use>=0.9.1` — Automação de navegador com agente +- `openai>=1.52.0` — API para análise, TTS e STT +- `sounddevice` + `numpy` — (Opcional) Captura de áudio por microfone + +### Requisitos + +- Python 3.13+ +- Google Chrome instalado localmente +- Chave da API OpenAI +- macOS/Linux com `afplay`/`ffplay` para reprodução de áudio (ou prints apenas) + +## 🎨 Princípios de Design + +1. **Intenção sobre interação** — Usuários dizem o que querem, não como fazer +2. **Consciência de contexto** — Cada página é analisada por tipo e propósito +3. **Hierarquia de informação** — Conteúdo mais importante primeiro +4. **Segurança por padrão** — Confirmação para qualquer ação arriscada +5. **Comunicação natural** — Fale naturalmente, Beacon entende + +## � Impacto Esperado + +- **Redução de tempo** para completar tarefas comuns na web +- **Aumento de autonomia** para usuários cegos em compras, leitura e formulários online +- **Experiência mais digna** — sem precisar ouvir todo o "ruído" visual de uma página + +## 🛠️ Melhorias Futuras + +- Detecção por palavra de ativação (wake-word) +- STT em streaming para respostas mais rápidas +- Suporte multi-abas +- Verificações de segurança baseadas em regras (detecção de formulários de pagamento) +- Integração com dados ARIA e landmarks para priorização ainda melhor + +## 👥 Equipe + +Desenvolvido para o **Hackathon Devs de Impacto** por [seu nome/equipe]. + +## 📄 Licença + +[Adicione sua licença aqui] + +--- + +**Beacon** — Porque a web deve ser acessível para todos. 🌟 diff --git a/USAGE.md b/USAGE.md new file mode 100644 index 0000000..807938d --- /dev/null +++ b/USAGE.md @@ -0,0 +1,307 @@ +# Beacon Usage Guide + +## Getting Started + +### First Time Setup + +1. **Install dependencies:** + ```bash + uv sync + ``` + +2. **Install browser:** + ```bash + uvx playwright install chromium --with-deps + ``` + +3. **Configure API key:** + ```bash + cp .env.example .env + # Edit .env and add your OpenAI API key + ``` + +4. **Run pre-flight check:** + ```bash + uv run setup_check.py + ``` + +5. **Start Beacon:** + ```bash + uv run main.py + ``` + +## Using Beacon + +### Keyboard Shortcuts + +- **⌘/Ctrl + R** — Start voice recording (speak your command) +- **⌘/Ctrl + S** — Stop current audio playback and immediately start listening +- **⌘/Ctrl + H** — Hear the help message +- **⌘/Ctrl + Q** — Quit Beacon + +> **Tip:** Use ⌘/Ctrl + S to interrupt Beacon when it's speaking too much or you want to give a new command immediately. + +### Voice Commands Reference + +#### Navigation Commands +``` +"Go to amazon.com" +"Open YouTube" +"Navigate to nytimes.com" +"Visit github.com" +"Go back" +"Refresh the page" +``` + +#### Understanding Pages +``` +"What is this page?" +"Summarize this page" +"What can I do here?" +"Tell me about this page" +"What are my options?" +``` + +#### Performing Actions +``` +"Click add to cart" +"Do number 2" # Performs action #2 from menu +"Read the main article" +"Show me the reviews" +"Search for wireless headphones" +"Scroll down" +"Click the login button" +``` + +#### Form Interaction +``` +"Type John Doe in the name field" +"Fill in my email" +"Select United States from the dropdown" +"Check the agree box" +``` + +#### Information Retrieval +``` +"Read the description" +"What's the price?" +"Tell me about this product" +"Read the first result" +``` + +#### Help & Control +``` +"Help" # Hear full help guide +"What can I do?" +"Commands" +"Stop" +"Quit" +``` + +## Example Sessions + +### Shopping Example + +``` +User: [presses ⌘+R] +Beacon: "Listening. Please speak your command now." + +User: "Go to amazon.com" +Beacon: "You said: Go to amazon.com" +Beacon: "Opening Amazon... This is a shopping homepage. You can search + for products, view deals, or browse categories. Available actions: + 1. Search for a product + 2. View today's deals + 3. Browse all departments + 4. Access your account + Done. Ready for your next command." + +User: [presses ⌘+R] +User: "Search for wireless headphones" +Beacon: "Searching for wireless headphones... Search results page. + Here are the top options: + 1. Sony WH-1000XM5 - $398 + 2. Bose QuietComfort 45 - $329 + 3. Apple AirPods Max - $549 + Done. Ready for your next command." + +User: [presses ⌘+R] +User: "Tell me more about option 1" +Beacon: "Opening Sony WH-1000XM5 product page... This is a product page + for Sony WH-1000XM5 wireless headphones. Price: $398, 4.7 star + rating from 12,450 reviews. Key features: Industry-leading noise + cancellation, 30-hour battery life, premium sound quality. + Available actions: + 1. Add to cart + 2. Read customer reviews + 3. See technical specifications + 4. Compare with similar products + Done. Ready for your next command." +``` + +### Reading News Example + +``` +User: [presses ⌘+R] +User: "Go to the New York Times" +Beacon: "Opening nytimes.com... This is a news homepage. Top stories: + 1. Breaking: [Headline] + 2. Politics: [Headline] + 3. Technology: [Headline] + Available actions: + 1. Read the top story + 2. Browse sections + 3. Search articles + Done. Ready for your next command." + +User: [presses ⌘+R] +User: "Read the top story" +Beacon: "Opening article... This is a news article. Title: [Title]. + [Article summary in 2-3 sentences]. Available actions: + 1. Read full article + 2. Listen to audio version + 3. Share article + 4. Read comments + Done. Ready for your next command." + +User: [presses ⌘+R] +User: "Do 1" +Beacon: "Reading full article... [Reads article content in chunks] + Article finished. Ready for your next command." +``` + +## Safety Features + +Beacon will **always ask for confirmation** before: + +- ✅ Submitting payment information +- ✅ Making purchases (clicking "Buy Now", "Place Order", etc.) +- ✅ Posting or publishing content +- ✅ Sending messages or emails +- ✅ Deleting anything + +### Confirmation Example + +``` +User: "Add to cart and checkout" +Beacon: "Adding to cart... Item added. Proceeding to checkout... + ⚠️ Confirmation required: This will proceed to payment submission. + Say 'yes' to confirm or 'no' to cancel. + Listening for your response." + +User: "Yes" +Beacon: "Confirmed. Proceeding." +``` + +## Tips for Best Results + +### Speaking Commands + +1. **Be natural** — Beacon understands natural language, not just exact phrases +2. **Be specific** — "Click the blue login button" is better than "click button" +3. **Use numbers** — When Beacon gives you a numbered menu, you can say "Do 2" or "Do number two" +4. **One action at a time** — While Beacon can handle complex commands, breaking them into steps gives you more control + +### Audio Quality + +1. **Quiet environment** — Background noise can affect transcription accuracy +2. **Clear speech** — Speak clearly and at a normal pace +3. **Close to microphone** — Position yourself within good microphone range +4. **Wait for the prompt** — Let Beacon say "Listening" before you speak + +### Navigation Tips + +1. **Let Beacon analyze** — After navigating to a new page, Beacon will analyze it automatically +2. **Ask for help** — If you're not sure what to do, say "What can I do here?" +3. **Use the menu** — Beacon presents the most important actions as a numbered menu +4. **Go back safely** — You can always say "go back" to return to the previous page + +## Troubleshooting + +### Beacon doesn't hear me + +- Check your microphone is connected and selected as default +- Ensure Beacon has microphone permissions (System Preferences > Security & Privacy > Microphone) +- Try increasing recording duration in `config.py` (DEFAULT_RECORDING_DURATION) +- Reduce background noise + +### Keyboard shortcuts don't work + +- Make sure Beacon is the active window +- Try using the alternative (Command vs Control) +- Check accessibility permissions for the terminal/Python + +### Beacon is too verbose + +- The TTS voice settings can be adjusted in `config.py` +- Ask Beacon to be more concise: "Be brief" or "Short answers please" + +### Browser doesn't open + +- Ensure Playwright is installed: `uvx playwright install chromium --with-deps` +- Check that no other process is using the browser +- Try setting BROWSER_HEADLESS=false in config.py to see what's happening + +### API errors + +- Verify your OpenAI API key is correct in `.env` +- Check you have sufficient API credits +- Ensure you have access to gpt-4o-transcribe and gpt-4o-mini-tts models + +## Customization + +### Changing the Voice + +Edit `config.py`: + +```python +DEFAULT_TTS_VOICE = "coral" # Options: coral, alloy, echo, fable, onyx, nova, shimmer +``` + +### Adjusting Recording Duration + +Edit `config.py`: + +```python +DEFAULT_RECORDING_DURATION = 7.0 # Increase for longer commands +``` + +### Modifying the System Prompt + +Edit `config.py` and customize the `SYSTEM_PROMPT` to change how Beacon behaves and communicates. + +### Running Headless + +Edit `config.py`: + +```python +BROWSER_HEADLESS = True # Hide the browser window +``` + +## Advanced Usage + +### Custom Actions + +You can add custom tools/actions by editing `main.py` and adding new `@tools.action()` decorated functions. + +### Different Browsers + +While Chromium is default, you can modify the Browser initialization in `main.py` to use Firefox or WebKit. + +### Integration + +Beacon's components can be used independently: +- `AudioHandler` — For any project needing transcription/TTS +- `recorder.py` — For simple microphone recording +- The agent tools — Can be imported and used in other automation scripts + +## Support + +For issues, questions, or contributions: +- File an issue on GitHub +- Check the README.md for additional documentation +- Review the code comments for technical details + +--- + +**Remember:** Beacon is designed to give you control. It will always keep you informed and ask before doing anything risky. Speak naturally and let Beacon handle the complexity! diff --git a/beacon_controller.py b/beacon_controller.py new file mode 100644 index 0000000..aefa433 --- /dev/null +++ b/beacon_controller.py @@ -0,0 +1,319 @@ +"""BeaconController - Main orchestrator for voice-first browser interaction. + +This module provides a clean, controllable interface for managing the agent flow, +making it easy to customize behavior and understand the interaction lifecycle. +""" + +from __future__ import annotations + +import asyncio +from dataclasses import dataclass +from enum import Enum +from typing import Callable, Awaitable +import os + +from browser_use import Agent, Browser, ChatGoogle, Tools +from audio_tools import AudioHandler +from config import ( + SYSTEM_PROMPT, + MAX_STEPS_PER_TASK, + BROWSER_KEEP_ALIVE, + BROWSER_HEADLESS, +) + + +class BeaconState(Enum): + """States of the Beacon controller.""" + INITIALIZING = "initializing" + READY = "ready" + LISTENING = "listening" + PROCESSING = "processing" + EXECUTING = "executing" + ERROR = "error" + SHUTTING_DOWN = "shutting_down" + + +@dataclass +class AgentTask: + """Represents a task for the agent to execute.""" + command: str + max_steps: int = MAX_STEPS_PER_TASK + requires_confirmation: bool = False + metadata: dict | None = None + + +class BeaconController: + """Controls the agent flow and manages browser interaction lifecycle. + + This class provides a clean separation of concerns and makes it easy to: + - Control agent execution flow + - Add custom tools and callbacks + - Manage state transitions + - Handle errors gracefully + """ + + def __init__( + self, + audio_handler: AudioHandler, + gemini_api_key: str | None = None, + verbose: bool = True, + ): + """Initialize the Beacon controller. + + Args: + audio_handler: AudioHandler instance for voice I/O + gemini_api_key: API key for Gemini (reads from env if None) + verbose: Whether to print detailed logs + """ + self.audio_handler = audio_handler + self.gemini_api_key = gemini_api_key or os.getenv("GEMINI_API_KEY") + self.verbose = verbose + + # Core components (initialized in start()) + self.browser: Browser | None = None + self.agent: Agent | None = None + self.llm = None + self.tools: Tools | None = None + + # State management + self.state = BeaconState.INITIALIZING + self.current_task: AgentTask | None = None + + # Callbacks (can be customized by user) + self.on_state_change: Callable[[BeaconState, BeaconState], Awaitable[None]] | None = None + self.on_task_start: Callable[[AgentTask], Awaitable[None]] | None = None + self.on_task_complete: Callable[[AgentTask, str], Awaitable[None]] | None = None + self.on_error: Callable[[Exception], Awaitable[None]] | None = None + + def log(self, message: str, prefix: str = "🔷") -> None: + """Log a message if verbose mode is enabled.""" + if self.verbose: + print(f"{prefix} {message}") + + async def start(self) -> None: + """Start the browser and initialize the agent.""" + self.log("Starting Beacon browser...") + await self._change_state(BeaconState.INITIALIZING) + + try: + # Initialize browser + self.browser = Browser( + keep_alive=BROWSER_KEEP_ALIVE, + headless=BROWSER_HEADLESS + ) + await self.browser.start() + + # Initialize LLM + self.llm = ChatGoogle( + model='gemini-2.5-flash', + temperature=0.2, + api_key=self.gemini_api_key + ) + + # Setup tools + self.tools = Tools() + self._register_tools() + + # Create agent + self.agent = Agent( + task="do nothing", + browser_session=self.browser, + llm=self.llm, + tools=self.tools, + extend_system_message=SYSTEM_PROMPT, + ) + + await self._change_state(BeaconState.READY) + self.log("Beacon is ready!", "✅") + + except Exception as exc: + await self._change_state(BeaconState.ERROR) + self.log(f"Failed to start: {exc}", "❌") + raise + + def _register_tools(self) -> None: + """Register custom tools for the agent.""" + + @self.tools.action( + description="Request explicit confirmation from the user before performing high-risk actions." + ) + async def request_confirmation(action_description: str) -> str: + """Ask the user to confirm a high-risk action before proceeding.""" + return await self._request_confirmation(action_description) + + @self.tools.action( + description="Ask the user for help or clarification when you're unsure how to proceed." + ) + async def ask_for_user_help(question: str) -> str: + """Ask the blind user a question when you need clarification or guidance.""" + return await self._ask_user_help(question) + + async def _request_confirmation(self, action_description: str) -> str: + """Internal handler for confirmation requests.""" + prompt = f"Confirmation required: {action_description}. Say 'yes' to confirm or 'no' to cancel." + + self.log(f"⚠️ {prompt}") + await asyncio.to_thread(self.audio_handler.play_speech, prompt) + + # Get voice response + self.audio_handler.play_speech("Listening for your response.") + try: + response = await asyncio.to_thread( + self.audio_handler.record_and_transcribe, + duration_seconds=5.0 + ) + response_lower = response.lower().strip() + + if any(word in response_lower for word in ["yes", "confirm", "proceed", "do it", "go ahead"]): + await asyncio.to_thread(self.audio_handler.play_speech, "Confirmed. Proceeding.") + return "USER_CONFIRMED" + else: + await asyncio.to_thread(self.audio_handler.play_speech, "Cancelled.") + return "USER_CANCELLED" + except Exception as exc: + self.log(f"Confirmation failed: {exc}", "❌") + await asyncio.to_thread( + self.audio_handler.play_speech, + "Could not get confirmation. Action cancelled." + ) + return "USER_CANCELLED" + + async def _ask_user_help(self, question: str) -> str: + """Internal handler for asking user questions.""" + prompt = f"{question} Please speak your answer after the beep." + self.log(f"❓ {question}") + + await asyncio.to_thread(self.audio_handler.play_speech, prompt) + while (self.audio_handler.is_playing): + await asyncio.sleep(0.1) + try: + response = await asyncio.to_thread( + self.audio_handler.record_and_transcribe, + duration_seconds=7.0 + ) + + if not response or response.strip() == "": + await asyncio.to_thread( + self.audio_handler.play_speech, + "I didn't catch that. I'll make my best guess." + ) + return "USER_DID_NOT_RESPOND" + + self.log(f"📝 User answered: {response}") + await asyncio.to_thread(self.audio_handler.play_speech, f"Got it. {response}") + return response.strip() + + except Exception as exc: + self.log(f"Failed to get user response: {exc}", "❌") + await asyncio.to_thread( + self.audio_handler.play_speech, + "I couldn't hear your response. I'll proceed with my best judgment." + ) + return "USER_DID_NOT_RESPOND" + + async def execute_task(self, task: AgentTask) -> str: + """Execute a task with the agent. + + Args: + task: The task to execute + + Returns: + The result of the task execution + """ + if self.state not in [BeaconState.READY, BeaconState.PROCESSING]: + raise RuntimeError(f"Cannot execute task in state: {self.state}") + + self.current_task = task + await self._change_state(BeaconState.EXECUTING) + + # Call task start callback + if self.on_task_start: + await self.on_task_start(task) + + try: + self.log(f"📝 Executing: {task.command}") + + # Add task to agent + self.agent.add_new_task(task.command) + + # Execute with configured max steps + history = await self.agent.run(max_steps=task.max_steps) + result = history.final_result() + + self.log(f"✅ Task completed: {result[:100]}...") + + # Speak the result + await asyncio.to_thread(self.audio_handler.play_speech, result) + + # Call task complete callback + if self.on_task_complete: + await self.on_task_complete(task, result) + + await self._change_state(BeaconState.READY) + return result + + except Exception as exc: + self.log(f"❌ Task failed: {exc}") + await self._change_state(BeaconState.ERROR) + + if self.on_error: + await self.on_error(exc) + + # Speak error to user + await asyncio.to_thread( + self.audio_handler.play_speech, + "Sorry, I encountered an error. Please try again." + ) + + # Return to ready state + await self._change_state(BeaconState.READY) + raise + finally: + self.current_task = None + + async def execute_command(self, command: str, max_steps: int | None = None) -> str: + """Execute a simple command (convenience method). + + Args: + command: The command text + max_steps: Maximum steps (uses config default if None) + + Returns: + The result of the command execution + """ + task = AgentTask( + command=command, + max_steps=max_steps or MAX_STEPS_PER_TASK + ) + return await self.execute_task(task) + + async def _change_state(self, new_state: BeaconState) -> None: + """Change the controller state and trigger callback if set.""" + old_state = self.state + self.state = new_state + + if self.on_state_change and old_state != new_state: + await self.on_state_change(old_state, new_state) + + async def shutdown(self) -> None: + """Gracefully shutdown the browser and clean up resources.""" + await self._change_state(BeaconState.SHUTTING_DOWN) + self.log("Shutting down Beacon...") + + if self.browser: + try: + await self.browser.kill() + except Exception as exc: + self.log(f"Error during browser shutdown: {exc}", "⚠️") + + self.log("Beacon shutdown complete", "✅") + + @property + def is_ready(self) -> bool: + """Check if the controller is ready to accept tasks.""" + return self.state == BeaconState.READY + + @property + def is_busy(self) -> bool: + """Check if the controller is currently processing a task.""" + return self.state in [BeaconState.EXECUTING, BeaconState.PROCESSING] diff --git a/config.py b/config.py index ed4a4fd..ffdac64 100644 --- a/config.py +++ b/config.py @@ -92,4 +92,9 @@ 4. Compare with similar products 5. Ask a question about this product" -Remember: The user can't see the screen. Your voice is their window to the web.""" +Remember: The user can't see the screen. Your voice is their window to the web. + +After completing what the user asked or at least trying, complete the task immediately. In your output, make a very shortdescription of what was done/what's on the screen/what the user asked for. + +RESPONDA EM PORTUGUES +""" diff --git a/examples_agent_control.py b/examples_agent_control.py new file mode 100644 index 0000000..28898d6 --- /dev/null +++ b/examples_agent_control.py @@ -0,0 +1,230 @@ +"""Examples showing how to control and customize Beacon's agent flow. + +This demonstrates the flexibility of the refactored architecture. +""" + +import asyncio +import os +from dotenv import load_dotenv + +from audio_tools import AudioHandler +from beacon_controller import BeaconController, BeaconState, AgentTask +from config import DEFAULT_TTS_VOICE + +load_dotenv() + + +# Example 1: Basic usage with custom max steps +async def example_basic(): + """Basic example - control max steps per command.""" + print("\n=== Example 1: Basic Usage ===\n") + + audio_handler = AudioHandler( + openai_api_key=os.getenv("OPENAI_API_KEY"), + voice=DEFAULT_TTS_VOICE + ) + + controller = BeaconController(audio_handler=audio_handler) + await controller.start() + + # Execute a command with custom step limit + result = await controller.execute_command( + "Go to google.com and tell me what you see", + max_steps=3 # Limit to 3 steps + ) + + print(f"Result: {result}") + + await controller.shutdown() + + +# Example 2: Using callbacks to monitor agent flow +async def example_callbacks(): + """Example with callbacks to monitor and control flow.""" + print("\n=== Example 2: Using Callbacks ===\n") + + audio_handler = AudioHandler( + openai_api_key=os.getenv("OPENAI_API_KEY"), + voice=DEFAULT_TTS_VOICE + ) + + controller = BeaconController(audio_handler=audio_handler) + + # Track task execution + task_log = [] + + async def on_task_start(task: AgentTask): + """Log when tasks start.""" + task_log.append(f"Started: {task.command}") + print(f"📝 Task started: {task.command}") + print(f" Max steps: {task.max_steps}") + + async def on_task_complete(task: AgentTask, result: str): + """Log when tasks complete.""" + task_log.append(f"Completed: {task.command}") + print(f"✅ Task completed: {task.command}") + print(f" Result length: {len(result)} chars") + + async def on_state_change(old_state: BeaconState, new_state: BeaconState): + """Monitor state changes.""" + print(f"🔄 State transition: {old_state.value} → {new_state.value}") + + # Attach callbacks + controller.on_task_start = on_task_start + controller.on_task_complete = on_task_complete + controller.on_state_change = on_state_change + + await controller.start() + + # Execute multiple commands + commands = [ + "Open wikipedia.org", + "What is the main article about?", + "Search for Python programming", + ] + + for cmd in commands: + await controller.execute_command(cmd) + await asyncio.sleep(1) # Small delay between commands + + print("\n📊 Task Log:") + for entry in task_log: + print(f" - {entry}") + + await controller.shutdown() + + +# Example 3: Custom task with metadata +async def example_custom_task(): + """Example using custom AgentTask objects with metadata.""" + print("\n=== Example 3: Custom Tasks with Metadata ===\n") + + audio_handler = AudioHandler( + openai_api_key=os.getenv("OPENAI_API_KEY"), + voice=DEFAULT_TTS_VOICE + ) + + controller = BeaconController(audio_handler=audio_handler) + + # Track task metadata + async def on_task_start(task: AgentTask): + if task.metadata: + print(f"📋 Task metadata: {task.metadata}") + + controller.on_task_start = on_task_start + + await controller.start() + + # Create custom tasks with metadata + tasks = [ + AgentTask( + command="Go to amazon.com", + max_steps=2, + metadata={"category": "navigation", "priority": "high"} + ), + AgentTask( + command="Search for wireless headphones", + max_steps=3, + metadata={"category": "search", "user_intent": "shopping"} + ), + AgentTask( + command="Read the first three results", + max_steps=4, + metadata={"category": "information", "detail_level": "summary"} + ), + ] + + for task in tasks: + print(f"\n🎯 Executing: {task.command}") + print(f" Category: {task.metadata.get('category')}") + await controller.execute_task(task) + + await controller.shutdown() + + +# Example 4: Conditional execution based on state +async def example_conditional_flow(): + """Example showing conditional execution based on controller state.""" + print("\n=== Example 4: Conditional Flow Control ===\n") + + audio_handler = AudioHandler( + openai_api_key=os.getenv("OPENAI_API_KEY"), + voice=DEFAULT_TTS_VOICE + ) + + controller = BeaconController(audio_handler=audio_handler) + await controller.start() + + commands = [ + "Open reddit.com", + "What are the top posts?", + "Read the first post", + ] + + for cmd in commands: + # Check if controller is ready before executing + if not controller.is_ready: + print(f"⏳ Waiting for controller to be ready...") + while not controller.is_ready: + await asyncio.sleep(0.5) + + print(f"\n🎯 Executing: {cmd}") + + try: + result = await controller.execute_command(cmd, max_steps=5) + print(f"✅ Success! Got {len(result)} characters") + except Exception as exc: + print(f"❌ Failed: {exc}") + # Controller automatically returns to ready state on error + continue + + await controller.shutdown() + + +# Example 5: Simple sequential workflow +async def example_workflow(): + """Example of a simple sequential workflow.""" + print("\n=== Example 5: Sequential Workflow ===\n") + + audio_handler = AudioHandler( + openai_api_key=os.getenv("OPENAI_API_KEY"), + voice=DEFAULT_TTS_VOICE + ) + + controller = BeaconController(audio_handler=audio_handler) + await controller.start() + + # Define a shopping workflow + workflow = [ + ("Navigate to store", "Go to amazon.com", 2), + ("Search for product", "Search for bluetooth speakers", 3), + ("Analyze results", "What are the top 3 products and their prices?", 4), + ("Get details", "Tell me about the first product", 3), + ] + + print("🛍️ Starting shopping workflow...\n") + + for step_name, command, max_steps in workflow: + print(f"\n📍 Step: {step_name}") + print(f" Command: {command}") + + try: + result = await controller.execute_command(command, max_steps=max_steps) + print(f" ✅ Completed") + except Exception as exc: + print(f" ❌ Failed: {exc}") + print(" Stopping workflow due to error") + break + + print("\n🏁 Workflow complete!") + await controller.shutdown() + + +if __name__ == "__main__": + # Run one of the examples (uncomment the one you want to try) + + # asyncio.run(example_basic()) + # asyncio.run(example_callbacks()) + # asyncio.run(example_custom_task()) + # asyncio.run(example_conditional_flow()) + asyncio.run(example_workflow()) diff --git a/keyboard_handler.py b/keyboard_handler.py new file mode 100644 index 0000000..78710c6 --- /dev/null +++ b/keyboard_handler.py @@ -0,0 +1,122 @@ +"""Keyboard input handler for Beacon. + +Manages keyboard shortcuts and input events in a clean, reusable way. +""" + +from __future__ import annotations + +from threading import Thread, Event +from queue import Queue, Empty +from typing import Callable +from pynput import keyboard + + +class InputEvent: + """Represents an input event from keyboard or other sources.""" + VOICE = "voice" + HELP = "help" + STOP_AUDIO = "stop_audio" + QUIT = "quit" + + +class KeyboardHandler: + """Handles keyboard shortcuts and input events for Beacon. + + Provides a clean interface for registering shortcuts and handling events. + """ + + def __init__(self): + """Initialize the keyboard handler.""" + self.event_queue = Queue() + self._listener_thread: Thread | None = None + self._listener: keyboard.GlobalHotKeys | None = None + self._running = False + + # Event triggers + self._triggers = { + InputEvent.VOICE: Event(), + InputEvent.HELP: Event(), + InputEvent.STOP_AUDIO: Event(), + InputEvent.QUIT: Event(), + } + + def start(self) -> None: + """Start listening for keyboard shortcuts.""" + if self._running: + return + + self._running = True + self._listener_thread = Thread(target=self._listen, daemon=True) + self._listener_thread.start() + + def stop(self) -> None: + """Stop listening for keyboard shortcuts.""" + self._running = False + if self._listener: + self._listener.stop() + + def _listen(self) -> None: + """Internal method to listen for keyboard shortcuts.""" + + def make_trigger_handler(event_type: str) -> Callable[[], None]: + """Create a handler function for a specific event type.""" + def handler(): + self._triggers[event_type].set() + self.event_queue.put(event_type) + return handler + + # Define hotkey mappings + hotkeys = { + '+r': make_trigger_handler(InputEvent.VOICE), + '+r': make_trigger_handler(InputEvent.VOICE), + '+s': make_trigger_handler(InputEvent.STOP_AUDIO), + '+s': make_trigger_handler(InputEvent.STOP_AUDIO), + '+h': make_trigger_handler(InputEvent.HELP), + '+h': make_trigger_handler(InputEvent.HELP), + '+q': make_trigger_handler(InputEvent.QUIT), + '+q': make_trigger_handler(InputEvent.QUIT), + } + + self._listener = keyboard.GlobalHotKeys(hotkeys) + self._listener.start() + self._listener.join() + + def get_event(self, timeout: float | None = None) -> str | None: + """Get the next input event from the queue. + + Args: + timeout: How long to wait for an event (None = don't wait) + + Returns: + Event type string or None if no event available + """ + try: + if timeout is None: + return self.event_queue.get_nowait() + else: + return self.event_queue.get(timeout=timeout) + except Empty: + return None + + def check_event(self, event_type: str) -> bool: + """Check if a specific event type has been triggered. + + Args: + event_type: The event type to check + + Returns: + True if the event was triggered, False otherwise + """ + trigger = self._triggers.get(event_type) + if trigger and trigger.is_set(): + trigger.clear() + return True + return False + + def clear_events(self) -> None: + """Clear all pending events from the queue.""" + while not self.event_queue.empty(): + try: + self.event_queue.get_nowait() + except Empty: + break diff --git a/main.py b/main.py index 665b41a..c96b818 100644 --- a/main.py +++ b/main.py @@ -1,40 +1,26 @@ """Beacon - Voice-First Browser Controller for Blind Users. -Beacon understands web pages and presents them as simple spoken menus, -allowing blind users to navigate and interact through natural voice commands. +Refactored for simplicity and easy control flow management. """ import asyncio import os -from threading import Thread, Event -from queue import Queue, Empty -import time from dotenv import load_dotenv -from browser_use import Agent, Browser, ChatBrowserUse, Tools, ChatGoogle -from pynput import keyboard + from audio_tools import AudioHandler -import time +from beacon_controller import BeaconController, BeaconState, AgentTask +from keyboard_handler import KeyboardHandler, InputEvent +from voice_handler import VoiceHandler from config import ( - DEFAULT_RECORDING_DURATION, DEFAULT_TTS_VOICE, - MAX_STEPS_PER_TASK, - INITIAL_MAX_STEPS, SHORTCUTS, BANNER_WIDTH, - BROWSER_KEEP_ALIVE, - BROWSER_HEADLESS, - SYSTEM_PROMPT, ) load_dotenv() -# Global state for keyboard control -voice_trigger = Event() -help_trigger = Event() -stop_audio_trigger = Event() # Cmd/Ctrl+S to stop audio playback -command_queue = Queue() - +# Help text for users HELP_TEXT = f""" Beacon Help Guide. @@ -73,323 +59,175 @@ """ -def keyboard_listener_thread(): - """Listen for global keyboard shortcuts using pynput.""" - - listener_holder: dict[str, keyboard.GlobalHotKeys] = {} - - def trigger_voice() -> None: - print("🎤 Voice command triggered") - voice_trigger.set() - return "r" - - def trigger_help() -> None: - help_trigger.set() - - def trigger_stop_audio() -> None: - print("🎤 Voice command triggered") - stop_audio_trigger.set() - - - def trigger_quit() -> None: - command_queue.put("__QUIT__") - listener = listener_holder.get("listener") - if listener: - listener.stop() - - hotkeys = { - '+r': trigger_voice, - '+r': trigger_voice, - '+s': trigger_stop_audio, - '+s': trigger_stop_audio, - '+h': trigger_help, - '+h': trigger_help, - '+q': trigger_quit, - '+q': trigger_quit, - } - - listener = keyboard.GlobalHotKeys(hotkeys) - listener_holder["listener"] = listener - listener.start() - listener.join() - - -async def handle_voice_command(audio_handler: AudioHandler) -> str | None: - """Capture and transcribe a voice command.""" - - audio_handler.stop_playback() - - try: - command = await asyncio.to_thread( - audio_handler.record_and_transcribe, - duration_seconds=DEFAULT_RECORDING_DURATION - ) - except Exception as exc: - print(f"Voice command failed: {exc}") - audio_handler.play_speech("Sorry, I could not process that. Please try again.") - return None - - if not command or command.strip() == "": - print("No speech detected.") - audio_handler.play_speech("I didn't catch that. Please try again.") - return None - - print(f"Voice command: {command}") - audio_handler.play_speech(f"You said: {command}") - return command.strip() - - -async def check_for_keyboard_events(audio_handler: AudioHandler) -> str | None: - """Check for keyboard shortcuts and return command if any.""" - if stop_audio_trigger.is_set(): - stop_audio_trigger.clear() - was_playing = audio_handler.is_playing - audio_handler.stop_playback() - if was_playing: - print("⏹️ Audio playback stopped by keyboard shortcut") - return None - - if voice_trigger.is_set(): - voice_trigger.clear() - return "r" +class BeaconApp: + """Main Beacon application that orchestrates all components. - if help_trigger.is_set(): - help_trigger.clear() - audio_handler.play_speech(HELP_TEXT) - print("\n" + HELP_TEXT) - return None - - try: - cmd = command_queue.get_nowait() - return cmd - except Empty: - return None - - -async def analyze_page_and_speak(agent: Agent, audio_handler: AudioHandler): - """Analyze the current page and present key information to the user.""" - analysis_task = """ - Analyze this web page and provide: - 1. Page type (e.g., shopping page, article, form, search results, login page) - 2. Main purpose of the page in one sentence - 3. Most important information on the page (2-3 key points) - 4. Available actions as a numbered list (up to 5 most important actions) - - Format your response clearly for a blind user. + This class provides a clean, easy-to-understand control flow. """ - agent.add_new_task(analysis_task) - result = await agent.run(max_steps=5) - - # Extract and speak the analysis - if result: - audio_handler.play_speech("Page analysis complete. Here's what I found.") - # The agent will have already generated output; we just confirm completion - - -async def main(audio_handler: AudioHandler): - """Main Beacon application loop.""" - - # Start keyboard listener thread - listener_thread = Thread(target=keyboard_listener_thread, daemon=True) - listener_thread.start() - - # Initialize browser and agent - print("🚀 Starting Beacon browser...") - browser = Browser(keep_alive=BROWSER_KEEP_ALIVE, headless=BROWSER_HEADLESS) - await browser.start() - # llm = ChatBrowserUse() - llm = ChatGoogle(model='gemini-2.5-flash', temperature=0.2, api_key=os.getenv("GEMINI_API_KEY")) - - tools = Tools() + def __init__(self): + """Initialize the Beacon application.""" + # Initialize components + self.audio_handler = AudioHandler( + openai_api_key=os.getenv("OPENAI_API_KEY"), + voice=DEFAULT_TTS_VOICE + ) + self.controller = BeaconController( + audio_handler=self.audio_handler, + gemini_api_key=os.getenv("GEMINI_API_KEY"), + verbose=True + ) + self.keyboard = KeyboardHandler() + self.voice = VoiceHandler(self.audio_handler) + + # Application state + self.running = False + + # Setup callbacks for better control + self._setup_callbacks() - # @tools.action(description="Speak an alert or information aloud to the blind user.") - # async def speak_to_user(message: str, priority: str | None = None) -> str: - # """Convert the provided message into speech and play it for the user.""" - # cleaned = message.strip() or "Attention needed." - # spoken_message = f"Priority {priority}. {cleaned}" if priority else cleaned + def _setup_callbacks(self): + """Setup callbacks to monitor and control agent flow.""" - # print(f"🔊 [Beacon] {spoken_message}") + async def on_state_change(old_state: BeaconState, new_state: BeaconState): + """Called when controller state changes.""" + print(f"🔄 State: {old_state.value} → {new_state.value}") - # try: - # await asyncio.to_thread(audio_handler.play_speech, spoken_message) - # except Exception as exc: - # print(f"Failed to voice alert: {exc}") - # return f"Alert printed but speech failed: {exc}" + async def on_task_start(task: AgentTask): + """Called when a task starts executing.""" + print(f"▶️ Starting task: {task.command}") - # return f"Message delivered: {spoken_message}" - - @tools.action(description="Request explicit confirmation from the user before performing high-risk actions.") - async def request_confirmation(action_description: str) -> str: - """Ask the user to confirm a high-risk action before proceeding.""" - prompt = f"Confirmation required: {action_description}. Say 'yes' to confirm or 'no' to cancel." + async def on_task_complete(task: AgentTask, result: str): + """Called when a task completes successfully.""" + print(f"✅ Task completed: {task.command}") - print(f"⚠️ {prompt}") - await asyncio.to_thread(audio_handler.play_speech, prompt) + async def on_error(error: Exception): + """Called when an error occurs.""" + print(f"❌ Error: {error}") - # Get voice response - audio_handler.play_speech("Listening for your response.") - try: - response = await asyncio.to_thread( - audio_handler.record_and_transcribe, - duration_seconds=5.0 - ) - response_lower = response.lower().strip() - - if any(word in response_lower for word in ["yes", "confirm", "proceed", "do it", "go ahead"]): - await asyncio.to_thread(audio_handler.play_speech, "Confirmed. Proceeding.") - return "USER_CONFIRMED" - else: - await asyncio.to_thread(audio_handler.play_speech, "Cancelled.") - return "USER_CANCELLED" - except Exception as exc: - print(f"Confirmation failed: {exc}") - await asyncio.to_thread(audio_handler.play_speech, "Could not get confirmation. Action cancelled.") - return "USER_CANCELLED" + # Attach callbacks + self.controller.on_state_change = on_state_change + self.controller.on_task_start = on_task_start + self.controller.on_task_complete = on_task_complete + self.controller.on_error = on_error - # @tools.action(description="Describe what you are currently doing to keep the blind user informed.") - # async def describe_what_im_doing(description: str) -> str: - # """Tell the user what action or task you are currently performing. + async def start(self): + """Start the Beacon application.""" + print("\n" + "="*BANNER_WIDTH) + print("🔷 BEACON - Voice-First Browser Controller") + print("="*BANNER_WIDTH) - # This keeps the user aware of what's happening and maintains engagement. + # Welcome message + self.audio_handler.play_speech( + "Welcome to Beacon, your voice-first browser assistant!" + ) + self.keyboard.start() + await self.controller.start() + while (self.audio_handler.is_playing): + await asyncio.sleep(0.1) + # Start keyboard handler - # Args: - # description: A brief, clear description of what you're about to do or are doing. - # Examples: "Clicking the search button", "Scrolling down to see more results", - # "Opening the first article", "Typing in the search box" + # Start controller - # Returns: - # Confirmation that the message was delivered. - # """ - # message = f"{description}" - # print(f"🔧 [Action] {message}") + # Ready message + self.audio_handler.play_speech("Ready for your command.") - # try: - # await asyncio.to_thread(audio_handler.play_speech, message) - # except Exception as exc: - # print(f"Failed to describe action: {exc}") - # return f"Description printed but speech failed: {exc}" + print("\n" + "="*BANNER_WIDTH) + print(f"Beacon is ready! Use {SHORTCUTS['voice']} to speak commands.") + print(f"Press {SHORTCUTS['stop_audio']} to stop audio playback.") + print(f"Press {SHORTCUTS['help']} for help.") + print(f"Press {SHORTCUTS['quit']} to quit.") + print("="*BANNER_WIDTH + "\n") - # return f"User informed: {message}" + self.running = True + + async def handle_help(self): + """Handle help request.""" + print("\n" + HELP_TEXT) + self.audio_handler.play_speech(HELP_TEXT) - @tools.action(description="Ask the user for help or clarification when you're unsure how to proceed.") - async def ask_for_user_help(question: str) -> str: - """Ask the blind user a question when you need clarification or guidance. + async def handle_voice_command(self): + """Handle voice command input.""" + # Capture command + command = await self.voice.capture_command() - Use this when: - - Multiple options exist and you're unsure which to choose - - The page is ambiguous or unclear - - You need more context about what the user wants - - An unexpected situation occurs + if not command: + return - Args: - question: A clear, specific question for the user. - Examples: "I found three login buttons. Which one should I use?", - "Should I filter by price or by rating?", - "The page has a popup. Should I close it or interact with it?" + # Check for built-in commands + command_lower = command.lower() - Returns: - The user's spoken response. - """ - prompt = f"{question} Please speak your answer after the beep." - print(f"❓ [Question] {question}") + # Help commands + if command_lower in {"help", "help me", "what can i do", "commands"}: + await self.handle_help() + self.audio_handler.play_speech("Ready for your next command.") + return - await asyncio.to_thread(audio_handler.play_speech, prompt) + # Exit commands + if command_lower in {"exit", "quit", "goodbye", "stop"}: + self.running = False + return - # Get voice response + # Execute command with agent try: - response = await asyncio.to_thread( - audio_handler.record_and_transcribe, - duration_seconds=7.0 - ) + await self.controller.execute_command(command) + except Exception as exc: + print(f"❌ Command execution failed: {exc}") + + async def run(self): + """Main application loop.""" + await self.start() + + # Main event loop + while self.running: + # Check for keyboard events + event = self.keyboard.get_event(timeout=None) - if not response or response.strip() == "": - await asyncio.to_thread(audio_handler.play_speech, "I didn't catch that. I'll make my best guess.") - return "USER_DID_NOT_RESPOND" + if event == InputEvent.QUIT: + print("👋 Quit requested") + break - print(f"📝 User answered: {response}") - await asyncio.to_thread(audio_handler.play_speech, f"Got it. {response}") - return response.strip() + elif event == InputEvent.VOICE: + await self.handle_voice_command() - except Exception as exc: - print(f"Failed to get user response: {exc}") - await asyncio.to_thread(audio_handler.play_speech, "I couldn't hear your response. I'll proceed with my best judgment.") - return "USER_DID_NOT_RESPOND" - - # Create agent with initial task - agent = Agent( - task="do nothing", - browser_session=browser, - llm=llm, - tools=tools, - extend_system_message=SYSTEM_PROMPT, - ) - - audio_handler.play_speech("Ready for your command.") - - # Main interaction loop - print("\n" + "="*BANNER_WIDTH) - print(f"Beacon is ready! Use {SHORTCUTS['voice']} to speak commands.") - print(f"Press {SHORTCUTS['stop_audio']} to stop audio playback.") - print(f"Press {SHORTCUTS['help']} for help.") - print(f"Press {SHORTCUTS['quit']} to quit.") - print("="*BANNER_WIDTH + "\n") - - while True: - # Check for keyboard shortcuts - keyboard_cmd = await check_for_keyboard_events(audio_handler) - print - if keyboard_cmd == "__QUIT__": - break - if keyboard_cmd == "r": - nxt = await handle_voice_command(audio_handler) - else: - # Wait a bit and check again for keyboard events + elif event == InputEvent.HELP: + await self.handle_help() + + elif event == InputEvent.STOP_AUDIO: + self.voice.stop_audio() + + # Small delay to prevent CPU spinning await asyncio.sleep(0.1) - continue - # Handle help command - if nxt.lower() in {"help", "help me", "what can i do", "commands"}: - audio_handler.play_speech(HELP_TEXT) - audio_handler.play_speech("Ready for your next command.") - continue + # Shutdown + await self.shutdown() + + async def shutdown(self): + """Gracefully shutdown the application.""" + print("\n🛑 Shutting down Beacon...") - # Handle exit commands - if nxt.lower() in {"exit", "quit", "goodbye", "stop"}: - break + # Stop keyboard handler + self.keyboard.stop() - # Process the command - print(f"\n📝 Processing: {nxt}") - agent.add_new_task(nxt) + # Shutdown controller + await self.controller.shutdown() - try: - history = await agent.run(max_steps=MAX_STEPS_PER_TASK) - audio_handler.play_speech(history.final_result()) - except Exception as exc: - print(f"Error executing task: {exc}") - audio_handler.play_speech("Sorry, I encountered an error. Please try again.") - - # Cleanup - print("\n🛑 Shutting down Beacon...") - await browser.kill() + # Goodbye message + self.audio_handler.play_speech("Shutting down. Goodbye!") + print("👋 Beacon closed.") + + +async def main(): + """Main entry point.""" + app = BeaconApp() + await app.run() if __name__ == "__main__": - audio_handler = AudioHandler( - openai_api_key=os.getenv("OPENAI_API_KEY"), - voice=DEFAULT_TTS_VOICE - ) - - print("\n" + "="*BANNER_WIDTH) - print("🔷 BEACON - Voice-First Browser Controller") - print("="*BANNER_WIDTH) - - audio_handler.play_speech("Welcome to Beacon, your voice-first browser assistant!") - try: - asyncio.run(main(audio_handler)) + asyncio.run(main()) except KeyboardInterrupt: print("\n\nInterrupted by user.") - finally: - audio_handler.play_speech("Shutting down. Goodbye!") - print("👋 Beacon closed.") + except Exception as exc: + print(f"\n❌ Fatal error: {exc}") + raise diff --git a/pyproject.toml b/pyproject.toml index afb840f..d46be0d 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -1,13 +1,12 @@ [project] -name = "hackathon-devsimpacto" +name = "beacon" version = "0.1.0" +description = "Voice-first browser controller for blind users" +readme = "README.md" requires-python = ">=3.13" dependencies = [ "browser-use>=0.9.1", - "google>=3.0.0", - "google-genai>=1.46.0", - "requests>=2.32.5", - "openai>=1.52.0", + "openai>=1.109.1", "python-dotenv>=1.1.1", "sounddevice>=0.5.3", "soundfile>=0.13.1", @@ -16,5 +15,4 @@ dependencies = [ "scipy>=1.16.2", "playsound3>=3.2.8", "librosa>=0.11.0", - ] diff --git a/uv.lock b/uv.lock index b876fab..a8bea5b 100644 --- a/uv.lock +++ b/uv.lock @@ -1,5 +1,5 @@ version = 1 -revision = 3 +revision = 2 requires-python = ">=3.13" [[package]] @@ -202,6 +202,37 @@ wheels = [ { url = "https://files.pythonhosted.org/packages/df/73/b6e24bd22e6720ca8ee9a85a0c4a2971af8497d8f3193fa05390cbd46e09/backoff-2.2.1-py3-none-any.whl", hash = "sha256:63579f9a0628e06278f7e47b7d7d5b6ce20dc65c5e96a6f3ca99a6adca0396e8", size = 15148, upload-time = "2022-10-05T19:19:30.546Z" }, ] +[[package]] +name = "beacon" +version = "0.1.0" +source = { virtual = "." } +dependencies = [ + { name = "browser-use" }, + { name = "librosa" }, + { name = "openai" }, + { name = "playsound3" }, + { name = "pynput" }, + { name = "python-dotenv" }, + { name = "scipy" }, + { name = "simpleaudio" }, + { name = "sounddevice" }, + { name = "soundfile" }, +] + +[package.metadata] +requires-dist = [ + { name = "browser-use", specifier = ">=0.9.1" }, + { name = "librosa", specifier = ">=0.11.0" }, + { name = "openai", specifier = ">=1.109.1" }, + { name = "playsound3", specifier = ">=3.2.8" }, + { name = "pynput", specifier = ">=1.7.7" }, + { name = "python-dotenv", specifier = ">=1.1.1" }, + { name = "scipy", specifier = ">=1.16.2" }, + { name = "simpleaudio", specifier = ">=1.0.4" }, + { name = "sounddevice", specifier = ">=0.5.3" }, + { name = "soundfile", specifier = ">=0.13.1" }, +] + [[package]] name = "beautifulsoup4" version = "4.14.2" @@ -587,18 +618,6 @@ wheels = [ { url = "https://files.pythonhosted.org/packages/9a/9a/e35b4a917281c0b8419d4207f4334c8e8c5dbf4f3f5f9ada73958d937dcc/frozenlist-1.8.0-py3-none-any.whl", hash = "sha256:0c18a16eab41e82c295618a77502e17b195883241c563b00f0aa5106fc4eaa0d", size = 13409, upload-time = "2025-10-06T05:38:16.721Z" }, ] -[[package]] -name = "google" -version = "3.0.0" -source = { registry = "https://pypi.org/simple" } -dependencies = [ - { name = "beautifulsoup4" }, -] -sdist = { url = "https://files.pythonhosted.org/packages/89/97/b49c69893cddea912c7a660a4b6102c6b02cd268f8c7162dd70b7c16f753/google-3.0.0.tar.gz", hash = "sha256:143530122ee5130509ad5e989f0512f7cb218b2d4eddbafbad40fd10e8d8ccbe", size = 44978, upload-time = "2020-07-11T14:50:45.678Z" } -wheels = [ - { url = "https://files.pythonhosted.org/packages/ac/35/17c9141c4ae21e9a29a43acdfd848e3e468a810517f862cad07977bf8fe9/google-3.0.0-py2.py3-none-any.whl", hash = "sha256:889cf695f84e4ae2c55fbc0cfdaf4c1e729417fa52ab1db0485202ba173e4935", size = 45258, upload-time = "2020-07-11T14:49:58.287Z" }, -] - [[package]] name = "google-api-core" version = "2.27.0" @@ -728,43 +747,6 @@ wheels = [ { url = "https://files.pythonhosted.org/packages/04/4b/29cac41a4d98d144bf5f6d33995617b185d14b22401f75ca86f384e87ff1/h11-0.16.0-py3-none-any.whl", hash = "sha256:63cf8bbe7522de3bf65932fda1d9c2772064ffb3dae62d55932da54b31cb6c86", size = 37515, upload-time = "2025-04-24T03:35:24.344Z" }, ] -[[package]] -name = "hackathon-devsimpacto" -version = "0.1.0" -source = { virtual = "." } -dependencies = [ - { name = "browser-use" }, - { name = "google" }, - { name = "google-genai" }, - { name = "librosa" }, - { name = "openai" }, - { name = "playsound3" }, - { name = "pynput" }, - { name = "python-dotenv" }, - { name = "requests" }, - { name = "scipy" }, - { name = "simpleaudio" }, - { name = "sounddevice" }, - { name = "soundfile" }, -] - -[package.metadata] -requires-dist = [ - { name = "browser-use", specifier = ">=0.9.1" }, - { name = "google", specifier = ">=3.0.0" }, - { name = "google-genai", specifier = ">=1.46.0" }, - { name = "librosa", specifier = ">=0.11.0" }, - { name = "openai", specifier = ">=1.52.0" }, - { name = "playsound3", specifier = ">=3.2.8" }, - { name = "pynput", specifier = ">=1.7.7" }, - { name = "python-dotenv", specifier = ">=1.1.1" }, - { name = "requests", specifier = ">=2.32.5" }, - { name = "scipy", specifier = ">=1.16.2" }, - { name = "simpleaudio", specifier = ">=1.0.4" }, - { name = "sounddevice", specifier = ">=0.5.3" }, - { name = "soundfile", specifier = ">=0.13.1" }, -] - [[package]] name = "httpcore" version = "1.0.9" diff --git a/voice_handler.py b/voice_handler.py new file mode 100644 index 0000000..2ad2f21 --- /dev/null +++ b/voice_handler.py @@ -0,0 +1,80 @@ +"""Voice command handler for Beacon. + +Handles voice recording, transcription, and command processing. +""" + +from __future__ import annotations + +import asyncio +from audio_tools import AudioHandler +from config import DEFAULT_RECORDING_DURATION + + +class VoiceHandler: + """Handles voice command capture and processing. + + Provides a clean interface for recording and transcribing voice commands. + """ + + def __init__(self, audio_handler: AudioHandler): + """Initialize the voice handler. + + Args: + audio_handler: AudioHandler instance for recording and TTS + """ + self.audio_handler = audio_handler + + async def capture_command( + self, + duration: float = DEFAULT_RECORDING_DURATION, + confirm: bool = True + ) -> str | None: + """Capture and transcribe a voice command. + + Args: + duration: Recording duration in seconds + confirm: Whether to confirm the captured command to the user + + Returns: + The transcribed command text, or None if capture failed + """ + # Stop any playing audio first + self.audio_handler.stop_playback() + + try: + # Record and transcribe + command = await asyncio.to_thread( + self.audio_handler.record_and_transcribe, + duration_seconds=duration + ) + + # Validate command + if not command or command.strip() == "": + print("⚠️ No speech detected") + await self._speak("I didn't catch that. Please try again.") + return None + + command = command.strip() + print(f"🎤 Voice command: {command}") + + # Confirm to user if requested + if confirm: + await self._speak(f"You said: {command}") + + return command + + except Exception as exc: + print(f"❌ Voice command failed: {exc}") + await self._speak("Sorry, I could not process that. Please try again.") + return None + + async def _speak(self, text: str) -> None: + """Helper to speak text without blocking.""" + await asyncio.to_thread(self.audio_handler.play_speech, text) + + def stop_audio(self) -> None: + """Stop any currently playing audio.""" + was_playing = self.audio_handler.is_playing + self.audio_handler.stop_playback() + if was_playing: + print("⏹️ Audio playback stopped")