aiomusiccast-0.15.0/.appveyor.yml0000644000000000000000000000126313615410400013651 0ustar00environment: global: RANDOM_SEED: 0 matrix: - PYTHON_MAJOR: 3 PYTHON_MINOR: 8 cache: - .venv -> poetry.lock install: # Add Make and Python to the PATH - copy C:\MinGW\bin\mingw32-make.exe C:\MinGW\bin\make.exe - set PATH=%PATH%;C:\MinGW\bin - set PATH=C:\Python%PYTHON_MAJOR%%PYTHON_MINOR%;%PATH% - set PATH=C:\Python%PYTHON_MAJOR%%PYTHON_MINOR%\Scripts;%PATH% # Install system dependencies - curl -sSL https://raw.githubusercontent.com/python-poetry/poetry/master/get-poetry.py | python - set PATH=%USERPROFILE%\.poetry\bin;%PATH% - make doctor # Install project dependencies - make install build: off test_script: - make check - make test aiomusiccast-0.15.0/.coveragerc0000644000000000000000000000034613615410400013325 0ustar00[run] branch = true data_file = .cache/coverage omit = .venv/* */tests/* */__main__.py [report] exclude_lines = pragma: no cover raise NotImplementedError except DistributionNotFound TYPE_CHECKING aiomusiccast-0.15.0/.gitattributes0000644000000000000000000000004513615410400014073 0ustar00* text=auto CHANGELOG.md merge=union aiomusiccast-0.15.0/.mypy.ini0000644000000000000000000000061013615410400012753 0ustar00[mypy] ignore_missing_imports = true no_implicit_optional = true check_untyped_defs = true show_error_codes = true warn_redundant_casts = true warn_unused_ignores = true warn_unreachable = true cache_dir = .cache/mypy/ [mypy-aiomusiccast.pyamaha] ignore_errors = true [mypy-aiomusiccast.musiccast_device] ignore_errors = true [mypy-aiomusiccast.capability_registry] ignore_errors = true aiomusiccast-0.15.0/.pre-commit-config.yaml0000644000000000000000000000255213615410400015466 0ustar00# Linting and formatting powered by uv (inspired by py-capellambse) default_install_hook_types: [pre-commit, commit-msg] repos: - repo: https://github.com/pre-commit/pre-commit-hooks rev: v5.0.0 hooks: - id: check-added-large-files - id: check-ast - id: check-case-conflict - id: check-merge-conflict - id: check-toml - id: check-yaml - id: debug-statements - id: end-of-file-fixer - id: trailing-whitespace - repo: local hooks: - id: docformatter name: docformatter language: system entry: uv run --dev docformatter --config pyproject.toml --in-place types_or: [python] require_serial: true - repo: local hooks: - id: ruff-format name: ruff format language: system entry: uv run --dev ruff format types_or: [python, pyi, jupyter] require_serial: true - id: ruff name: ruff lint language: system entry: uv run --dev ruff check --output-format=concise --fix types_or: [python, pyi, jupyter] require_serial: true - repo: local hooks: - id: mypy name: mypy language: system entry: uv run --dev mypy aiomusiccast --config-file=.mypy.ini types_or: [python, pyi, toml, yaml] pass_filenames: false require_serial: true aiomusiccast-0.15.0/CONTRIBUTING.md0000644000000000000000000000330713615410400013435 0ustar00# Setup ## Requirements * Python 3.10–3.14 (for example via [pyenv](https://github.com/pyenv/pyenv#installation)) * uv: [https://docs.astral.sh/uv/getting-started/installation/](https://docs.astral.sh/uv/getting-started/installation/) * Graphviz (only required for UML/doc generation): * macOS: `$ brew install graphviz` * Linux / Windows: [https://graphviz.org/download](https://graphviz.org/download/) ## Installation Install project dependencies into a virtual environment: ```text $ uv sync ``` Install the pre-commit hooks (run once per clone): ```text $ uv run pre-commit install --install-hooks ``` # Development Tasks ## Manual There is no automated test suite yet. Static checks are the primary safety net. Docstrings follow the NumPy convention; the pre-commit hooks (docformatter and Ruff) keep them consistent automatically. Run formatting and static analysis: ```text $ uv run ruff format aiomusiccast $ uv run ruff check aiomusiccast $ uv run mypy aiomusiccast --config-file=.mypy.ini ``` Build the documentation: ```text $ uv run mkdocs build --clean --strict ``` ## Automatic Use your editor’s on-save hooks or a simple watcher such as `entr` to rerun the commands above, e.g. `find aiomusiccast -name '*.py' | entr -r uv run ruff check aiomusiccast`. You can also run the full hook suite manually: ```text $ uv run pre-commit run --all-files ``` # Continuous Integration CI runs the same Ruff and mypy checks defined above. # Demo Tasks Run the program: ```text $ uv run python aiomusiccast/__main__.py ``` Launch an IPython session: ```text $ uv run ipython --ipython-dir=notebooks ``` # Release Tasks Release to PyPI: ```text $ uv build $ UV_PUBLISH_TOKEN=... uv publish ``` aiomusiccast-0.15.0/banner-dark.png0000644000000000000000000003273413615410400014104 0ustar00‰PNG  IHDR8‹„)G„iCCPICC profile(‘}‘=HÃ@Å_?¤"‡qÈP�,ˆŠè¦U(B…P+´ê`ré4iHR\ׂƒ‹Ug]\AðÄÍÍIÑEJü_RhãÁq?ÞÝ{ܽü� SÍà j–‘N&„lnU½"ˆ0"èÇŒÄL}NSð_÷ðñõ.γ¼Ïý9z•¼ÉŸ@<ËtÃ"Þ žÚ´tÎûÄQV’âsâQƒ.HüÈuÙå7ÎE‡ý<3jdÒóÄQb¡ØÁr³’¡OÇU£|Öe…ógµRc­{ò†óÚÊ2×i!‰E,A„5”Q�…8­)&Ò´Ÿðð:~‘\2¹Ê`äX@*$Çþ¿»5 ãnR8t½ØöÇ0ÚšuÛþ>¶íæ x®´¶¿Ú¦?I¯·µØз \\·5y¸ÜžtÉ�)@Ó_(ïgôM9 r ô¬¹½µöqúd¨«Ô ppŒ){ÝãÝÝ�½ý{¦Õ߉0r° ï‚9bKGDùC» pHYs  šœtIMEå $:�Ô IDATxÚíÝ{œ&U}çñÏozn=0Üåâ \DX¢º*(«⊬k$.¢Æ�à† ‚‰hQŒÄ@¢¬šˆŠ\ň(Q–‹ˆÜ¹a€™az¦çéç»Ôy¦kžéKU=·êîïûõêWßž§žSçT�ú�S§Î3333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333³¹)œfff6HÚ xðàÀ^À¶%7ó0p3ð#ঈø�sÖÌÌÌÌÌÌÌzJÒ»$]¯¦Ö©©u’Ö¦ï-MI�ô½©�µþßhûë:IϤßVKºTÒ1Îq3333333똤’N“ô@®sBuPlØ�ÑÔÔšm¯›¸ÓcÜ­’Žsi˜™™™™™™Y)’‘tÝ�y«ÛF_yOU_“´›KÈÌÌÌÌÌÌÌ&%é8Iå)¢Y¢ƒbªGWÊlçIGºÄÌÌÌÌÌÌÌl=Io‘´¼BÇF³m�µÌÁ1þ·µŒìh¬íøœE¬Ì}¿KÒ‹]‚fffýçUTÌÌ̬6$í\ ,Ëýy 0h‹§ÛDŠož®îI?çm ìL“½™ÇNÀ~ÀÀ0 Oóy#À0¢A0?÷÷GDĈKÕÌÌÌÌÌÌl‘ôå4²bªÇMš¼fDÒ’Γ´GÓóIŸË�ÐhÒšãc*í’5333333›$*é©I:¹NŒñ�¬“á’Ž—4¯iÜJÒ))�¶Gbž™¢ƒcDÒý’¶vI›™™™™™™ÍR’.L£ F&™Ñ²6×Á±ZÒÇœæ]$}5u²4 ÍÏ‘½ö½.q333333³YFÒ­¹ŒÉ<•þ¿\Ò;j¸'O9éøÿV¤ï—ºäÍÌÌÌÌÌÌfIÛKz|ŠGRFÚæ·8¡öû4¦OM³Lm3÷u»�333333³NÒ—_ýǸoWOñØJþï_ó‘`ffÖ]^&ÖÌÌÌúÙ°x†lé×É–|}88"îîàsö^¼ Ø Øxö$/ ¸¸¸øiD<ÚÁg¿ø‡ öOùØ+"‡™™™™™™™ÍD’Ló(Ç—*nw I'Iz0÷ˆKþÑ�ñG`šZ—æÆhL1Âb…¤+$#)*¦éªI&L•$ùh0333333›Á$Ý1Á2° Iאּ­7Kz8½¿¡Þù¾¤#*¤ïìI–½=×G‚™™™™™™Ù —VPi�´¸[ÒŽ%ßFq±VýõTÙIOS'ÌêÜ6¼’Š™™™™™™Ùl"i^Éן—:&|ì£'&^v…¤cK¦}—¸™™™™™™Ù&éå’•ôLÛ£k'™k£{ÝÏבŸãã&I»º„ÌÌÌϳw›™™Y­¥%U�š&v†�Q`!ã+–Œ�w¶½oGàEÀ®À¢ôµ–l!Æši›cé=CmÛΉˆ»´ÌÌÌÌÌÌÌl’v”tOn„ÆÈ$£,ži[åÇ’NRC;WøÌ½$}LÒ]“<ž2Ù(‘’®r©™™™™™™™Ùz’†×?2ñíHz{Òq¦¤ßL’†öÇbÖJºÃ¥gfffffffH:·àWHzIÒs”¤;'éäX›¾Zóté43333333$}c’�V'Â’^=€t?Íê*’ô— ™™Yÿy’Q3³ú4èvöö6žl,ž$›(ñ)ઈ¸·�éZìì ì4ÁKF�€[€{#âq—¦uá¸;øÜ$ÿ¾0"Žpú®^“ûÓ0„hì÷¹ûZ[ÛÏiû×âToþxx8"šÎ13333³îäo�ô…49áÚi&2l¨©umwŒ¯‘tZÒuPJ×ésVO�¾ÉfCh-§y“¤S¼|¦ux,^+i¤í¸?¨Fé;i‚óö .¹žå÷&’Þ,é#’~&iåuÏÔsµ¨m©ßFªã¾,éTIûKZä\63›Ù<‚Ã̬¿úÀiÀ~dKZ X‡˜GÀ¼�êgÑH™?Éf××ÇGÄ�Óµˆ&g¼/}Î(Ùéa` ¡´TfÛ™7EºHÛy øTDœë#À*›o^ ÜUÜÆAÀë€Ý€ç¶ýûWÀýÀw#↊Û/°piDÜâRëjù¿ 8&A6"£ãͦå‡&ˆ…ü¸ø÷ˆxÊ¥`ffffÖŠ–ÚYÒÅVƒè†ë+4 ¾œî„6&Y¢S­m=$é<Ö‡Fñ¢tWþñ´´l£Ì9$éDçâÀÊn;I§§ú¢‘¾º]'•±ZÒÙ’vp阙™™Ùl¸[n–t¾¤£%m_à}JúE �[Vô! o¦ù ¦Kßñ¹GOÖæ†m7ºÚ˜È:uòÛ{BÒa>²¬çꮩƒâ‰�×gÒ÷‹œ«}+»×Kºc‚º¬¡úxPÒû\ZffõåGTÌÌ tpLñïßW+€'È&³{9Ùpøö¡Ôêq½»h Ó×·"â�“ìÓÏR:[iZ ,É¥³›×ˆ±ô}¨-.ˆˆ?ñf]:O¿¼)Mò9¿Ó͵ÿçDÄ)Îåž”ÛiÀŸ“M¬ÜÊûf[�1ðd¶OßNŒˆå.E3³úp‡™Ùô¸R#},ut� z\ÿæ?ó®ˆØ#·/[·Ïž¤¢e^Ÿ®?‰ˆƒ}”YççvÀ]ÀÒ Î�lŽ…nvtÜ{;Ç»Vnï>›Ëg€ud�CuJj:ÆÚêű”Î�utÜíR53¼yÎ3³®å;7˜ “`aÒ›ÿÌÝ%Ýž‡ ~ÇÆ�´5*úÕ¹p�¤k}ˆY®eÃÎ�ìŸ,wMÁ³¼‘~i;—Z�/’ôegw‡•©t¬¤d�kïÜ€¬ó·jç†&)k­ÿÊÊx4WÖeêÓö I[é<¸IÒW\ºffƒçffÓEÍM­ëÂ�à�îÙ¨�=èOKŸ�ˆwûh³ æV6È:'†'8þ#ýÔ h¿Ó¾gú>‚X0ɹ޺[?Kœë•Êià'ÀîmyÚ*£ª±éD�Ôås�ÞvÚ¶Ž¹•Às"âi—¶™Ùàx‡™ÙtfvçF+ð° ݹTÝÚ>ÀñžxÔ:<ÆaãÎ €[€w;ƼX/hû `Sà,‚;Øp¹Æ8À=Îê '¸ô àAÆ;7 uu¡> 6îÜhm¿õÓÔ?ù¯²¦zõpwn˜™Õ' 03³ÉƒsÍìØ`ÒÅüd¢õJ%,�ˆm|ÄYÉóóÓÀ‰)¦i=¦0 \ œ#%··'ð`ÿÜŸW¥mþ�ˆð£åòóFàùd£Ç†ØpäF{§DÕØô.àJàfàjྈxjŠ4íì 켆lÏžd7þªŒrûŸñE—¶™ÙใÃÌlú½[ùÀþ `ëôóoÉfåÿ-Ù*,cÀvÀnÀ¼·£øüëÚÓ×LéÚ Øv‚®ŠA“ò“©Šlå—7ù¨³’çè9À‡Ò¯·oêtÒGI¯.¶"[-é/"âBçváüÛ¸)Õ#�N¬Ü>YóCÀç�K"âW]N÷‘ÀáÀÛ�ŹâñGa²¿�¦4�'»ÄÍÌÌÌlÆtp$MUÓ”´2ý¼VÒM’N–´yÁÏßSÒgÔ[«Ó÷†¤%�&iëBékhgI稩uéýùýn–Ì·¦�8³_g¾µƒº²9I�û�¤ôy?Hú�¤»réY›K×W]Úffff6×:8Z�wKڻôü°mÛ�Ò¥\§‹$Ý/ißÓ÷�ÔÑѾí2>æ£ÎlÆÖ—ïÈuèVÕÈu–^!iŸì×°¤ssõùu.m3³úñ#*f6ˆ@q?àd�<<ücDœÐ¥ô}ñÖ4¬{ °¸ä&VFÄf>SÌ&¬;w!{„m'²GÅÚk�=Jöxú¾¸Ÿl²Õû#b]ÓwpnîO‹+l¦õ8ÞW€÷ÔqâNIðifV?îà°¹î¼Ø™lr±�'¾VäÁ€«"â!ç^Gù¾7pÙóÌ;›³ñ|­%ý†Ÿëá‹ÀeqË ïàðш8£Ëizxn•·æö¡õóg"⤤ï9\g^·ù 2×�Õ��.y*ààà:à†ˆø¿]HïÀw*¼u °XGÖY{pdDÜë£Àq�™™;8̲‹þ&À[€ãÈ–Ç\Jgwßï®.¯ëLé’vˆˆ»j�–À’­B°”ò£ Ƚge Âÿ¶Aø:8~/íAš~ØAºZn‰ˆ}z�¾—×·­àRÆ{#â|×f=�wöHuèŽd+a,¶![Vu)/Ëzð$ÙȬå©þ¼�ñO×`ßjS_ö î,ÛÙѪ;î~ ükD|¯dºwMå>2É1QÄ*à�Œp\S1ö![†x[`{²ÎžíR>-MõÖL6Y·˜—ZFÁ†�ˆÝXÆx®i�ܼ "þÄg¯™Yg¸“$= i$7gBgs4µ.Í)�߯ý’>^v¾‚4aÙ %½]ÒÙ]ØßcÓÄk퓲Ý)éÅ}Îûí$]2AŽäæ¡XÝ6?ÃÆyÝz݆ïÍ»DÒvýîà¨8G£èD¢Óµ²ƒ‰üZù½u Ó'IW»Fëûù{jšï WiN–•’V¤Év/–t‚¤ú°�µ©/»^wvg‚áöºá–´¢H‘}ht˜†[|:®)øy¯�ôAI?ž$FPÛ„°k»p|ZÙøBºÝg¯ ŠGpØl¸ø¿ø²¡¼Ó¾¼àq?†±¾§¿½' Ù]ªÖ£ÿ�ìnúmd�XÙ�„ÿB¶”ændË—ä¶Ó¶‹ˆ'*î÷�C˜zùÐOözùºt§þ߀]ÓŸ&ºãXå®ÞDïÉoû^à-ñó~tp”<~Z¯»."èaº¾@6|½Š'€§"b·¦ïÓÀ{+_ "|�êíqýàÏR=Ò-c©þœ7ÅÈ�Éê¬5dóG\�êÓ #by—öµõeŸêÎ"5T#]ßbŠr[ì;Ý£"’.í`´Ö×#â}F:®™$/öN×¹·Ë&8v­^F�µÀÎݪ¿ÍÜÁas)X|#]p·LÁئ3l76�ˆg*ì{~Ç©<œŸìAþïük r(ÿÖwÿ½—ó5T|De øñ•¦ë0à»ä݇zùˆ¤ƒ�+{ÝÁ!éKnzm·ç)�7cúó؆lÈ¥Ó¼|°øVDü¸ åÒꛪ±?YCªWñÃTÃÀoξª°¿¯/ûPw*�Ó ')ÓÑ\çEûÄ¿š 6>gM³/ï.,™Öì¸ËªDÄ{±9×L�§'¥úq!½}TË:¯"×Áñ±ˆø¨³ÅÜÁaVîÂ÷MàÐ)‚¹YHZ‚xºÄ�²‡"bÇ.çÿ—”ÒPuÒ»Nžn½¿™ ”¿o«QÀöñh�J·TÌG‘Mäù«¦o²‘6½íàhªÜªÁüA�‘ôÙÝÏ2Ίˆwð™_!{†?:8çÑÁ‘ÿ¬c#âK3©¾ìAÝ9q=˜ýÖ r¿gò?¯füŽûdùÀõ±�ýy”�Wq)’êÁ?GÄ»Ñ8®iˇÏǧ|n«ÔÝ(ÙÈ»ùÀ²‘«:[l�æ9 l†ïK�Í7� ¥šƒÙðç%‡/“tT—òÿàÔ0;&—†!²aÔeòFúZž~«�œ‘õ埥åIO¥QµÐËÎ�´ýÛRã¦jÿÁ¯zœ¾û:<Þ¶)ÚaQê«dþ[çÄT_c�\³%½1�·‡§?�‘Ýž)ÆÈF\V¦scÐõeêÎ|~(×ѺþŽà—À?Î}ý’leªQ´Ñ]𘠹¦`çÆùT]�un|×�ŽkÚòá•)ÞžêGܹ1#,${$eaºî»sÃn¾³ÀfÐÅï2àõÀbÁhjÜ-h Ê»žiÞܶ¯ØßCɆ½v’ÿŸ&z>} ba C¦»Û2B¶²Â-d³·/¶ö$›¾hI¤Ïlj½9p¥¤s"â”A®5Ìê�¾ñgù·ŸÅçrÑCTëDÒÇ€Ó'ØÞ¦d+-�ù4<0SêËÔ�y·×ß&»[úHÉô û¯IßßÒö’ß/°�þYÇS9Áï"â�Žj×äòáüt< 1\£Žh+v½Þ2ývˆ3ÄÜÁaVìÂ÷œÌí�þ4qÍ#ý‚ŠÙÐ÷ú²Guç•ÀyñíŽO¯ˆ‘tM½6ýé­)­/&›Tô§6ó�õûPÌJ²NµHǃãÇ5­¼¸Øk}=PìÚTtùd·ýí×m¿·/[½|‚ëy':-ßLçÎË��*v@ôîz¬K±ØEq%fîà0›öÂwpM©ª6˜¿¾Bß°!7ü5pÙd}ÍéØx>p4Ù]¯�€ÅiûJ}_³¦_�Ô¶àcª ¢õÜ÷´ÁãËÉæøÛ�÷·ÉîJ"éƒÀéDj deÚHW‘g×��tkD¼h@‡ïXmO¬ð°ß9Pw~� G/Ñšý~Qj<¬n.®‰yq]ÒµYªCwöö EÐ^Ÿ´êì1àÏ#bÅL¨/Uwv¥Zˆ¸¸¡àËÿ€lDÞbŠuÐ-MMµ¿�¡î­°á¸ffÇ5’®È�#e:TÚÓ¶*Åß~Ü_eBâš7gYázÿ3àïÉæÞ™]ïà`uD\ê+¯™Ùô•ù+¯ï>îq�éS’ô }‡IúE‡ë…oVásmÛÇ"¾Sqo,ñYͶ5éN3ìwšÏïLÛjÉ­³^äX¸± ih_ß}: I«ûtžTÑÈMœZÇô­Mß_Ò£ÏhÔ ~{´B™�]pÛÇäŽÿ%ò¼™;ÆOès~l'é8Iÿ”«GšiâÅÎò¹OõeÝêΖÕI’šòõæ8Ç5|Öùm×õÂÇQ:gVHú»*qÔ =vþ.í{Ys‹Â̬>A@{cruÉÆÀ‰}JëÖ›Tø¼Ç*|Îw*|ÎÅ)›‚°3{�ÏgNèi84$]ìwpäËq–wp¬Hõe³ÄöW¤Ï8¯F×�ƒº°�¾Ô—u®;{P.wåÎÑ2çôÿv\ã¸&mÿ€;Q.˜ƒÇÏ™:%éÓnUØ\ãUT¬Ž•øï“=ßÛ>ìuxº·’ qüxDÌ�ˆóû‘Þˆxøâl:oSu,L0÷ŸÕåðŸÀó"âŒäóÀóÒghš´¬[Ú‡cûÚŒP‡GtžÕ£s÷t²Ç†KîçRà´ˆxm )â'3-ΩcÝÙÛSîñ…1`aD|Ôq�ãšä_˜ziè©òã}qÂ<ŒT|Ìnfîà0h°5𭌖žþØ9"þb&írÝgi¸çg ¼tIÛd�?ŠˆçEĽ= ºî�ˆç?Êå`ƒìÙÒé|¦�CYçÕü²ÙëÔŠïûyDœ3 ó£o�Yu®;»¸�ï6)™¯CÀeŽkפüØعÄõk X‰hÐäï"Â#̬6A¸Y÷‘ÝÑxšb3d·‚§EÄÎñè€ÒÝÏ!ï½Øo¡è™ãw®Œˆ×ö-²Ïº²- E‚¤[faÃjöMªõ×&_£Ê5¤žC6Û~§ÎÒléçùQûº³ ¯�§cÀç×8®I>Àød¢Q0/–D ÅŸ¹¦7³é8x´:ç—!†�'É–=+º ÅÅáµ·»SožK±eÞ” Ð_Ó÷VKö™W¶¥eº é¹iÝéÐÏî ë—#¨¶zÏšˆ¸ÂÙ77êÎý~ÅúúÛsô¸p\3ñ1T¶žz¸Û5�™á«Kppxº«µe®A:Q`8Œ¤!¾ÿoŸÁ�¸~5þŠ•lÄ?6È=}öc%;.ò çN‡Yj“‚ ìv‹«Lx<‹Ué$šQug6¯ðžÇ5ŽkrvMùPf„È–d#`æ²&fVˆ;8¬.ŠNfµ6]‡ n�ˆ·:뺌½+w-àVƒ¤MCkŸši_ÍAÙl³MÅÆ9ÀÞξ9Ww–ÝϪ�`w8®q\ÓaD©~33ëjåbÖ« éd`ë’o[ûÔi7fAQœÌøs±Eî="nt¢S¾^७}ZœöÕõk]Åú9~Ô§œG(>‰a»Sœ}s«î¬à¥Të@û…ãÇ5ùýLÛ.[¿?[’;9Ì̸ÍSâBÚ "_ëlëj0¶Ø¥dÇÂÖ¦=\>-»¤}¶Þ‡È~¦®¡Ú#*o”ôbgáܪ;Kz~Ÿñ׎k×ä<�Öw”í0‹”OÿäZÇ̦ãtpø ²á™Añç+/‰ˆkk¶+O΂`Œ‚Ùõ\òï2Š=ë­¶}6›"â6\¥¡LçR ®‘ôFç䜫;‹z6ÕFU5×8®É¹07J¯¬ÿ&é ®vÌl*îà°A{ãw/ M^älëº7§¥9‹ÃÔsIÉSSÚŠ4äæov±Û,ôù\czm‰÷�ÌG\"éO::§êNs\ÓOg“�4{šj#ÎÞ.éö´,¶™ÙFÜÁa#é `«’o;×9×K‰ÂË>·ÕmRšž¤È�Ôl_—ºØm¶‰ˆwçÓ‹K¼u!­Nެóo•¤ËÕÐÎÎÕÙ]wšãš>×Qk�¯›¥UcÊZ쉸WÒU’ ¬‘ô„¤‹%íçºsÆ×�Eü¶ƒ†¬ãÇ5íuÔ#ÀþŒÏ4Bµ¥i£íë¿_H²7Iú�¤Ý}U0›;ÜÁaƒrdá@ =ßßp¶õÄ>ë¥røy�¦Ÿ·5Ȧ«ÿöqñÛ ×>œgÿ“ñÕÆØ¸Ã£¨ÑôþaÆeÙxpujL\-é/çм³¦î,è�ŠïÛÍq�ãšI꨻#b¸‹b�{•±0�£~-©!éû’Ž’äö�Ù,æÜåŠßéà?�e=³“÷ÝlÖ6 ¾[—§:we‰zwü+[)d,ýo¤í5‹ScâeÀ™ qŸ¤I—Ïò¡âs­þx´âûæÊãLŽkª×S{çtaSjûy,ÕO�ðZàëÀ˜¤û%�/iO—€Ùìâ”—–|ýUβžÙœl¼"ÙŒ‰— ¼¦IÁ%üÌfAâõÀ^©‘:–Âÿã#3¦>²gݤߊÌq³8”l¨¸Ò$€Ÿ˜eK;ÎÆºsªcèΊ«^ Kz¡ãÇ5Ó_§DD×¶ýKd�ª£‡õç_V‡ å¶¹ðNàv5µ.�@;Á%a6ó¹ƒÃe‹’¯¿ÏYÖCªôÜ«÷Ù¬Gbÿ¿ŠˆÝ�í€ –“�¼(s×¹ª­�“�ûR‡Çç$-s=2ÓZ¡…:tÚ­Žq\㸦`=u YçáYÀc©Þi=7:íZ®.[œ~›O6ís©~z@Ò©’¶w‰˜Í<îà°AÙ¦ÄkG�Ûœeff]i@<Û~½A³=ÕÑúêNW@¦Õ™rðIJ:Ý«²Ì7TxÏbà�×8®)QG­ˆˆ§:jßTGýŽñùºi4WK5R�·,}æo%Ý!éT—ŠÙÌá”2w:øNG�£‰Ù1„ÚûlVº!qmDüED왆‡ÿ pk ò×¥¯îœq­&Ć�&;#[•åjI/q=Rk?¬ø¾¹°Š…ãšÞÔQ7§:j[²Ò³èîã= i-� M0*kàãi ÚËæÈãVf3š;8lpaaqK€5βžYCù¥ífƒ¡ ÇUñãV®_­‹² »Ùë�‰ˆ "bŸˆXìœ Ü“ëœhÉý¼z’Ÿ';‡&«o^\Ÿ†‡⺳–>ÛVöÅaélÇ5Žk:¬ŸšidÇA©CöeÀ×R^¶:NÇ&¬A§¶éú2Üp®5ÀáÀmiTÇQ.³zrnƒ²²äëýdïÜY.FÕþµmfiS�öÝl®5&Œˆ�FÄn©1ñNàGéßé¡«¶†Ý’.|ôs�JºGÒ®;kuL<‚ÖO6 ­;ßÅ¼ÃØÿ%ÍIDATq�ãš.�×DÄÑi©Ù­�?n?ëh�uºv{¤ÕÀW%Ý)iw—„Y½¸ƒÃå±âa! ¼œg/]_âµMàÈïË‘”»Ë}½‹ß¬pcâ_"â�ÔÙñ|àód�ÃdwM»=áæöÀÃ’ÎpÝY§�ïTŒ#·•ô^Ç5ŽkzT?=�꨽SõJ‚‹€ù]þ(ϤQu»wJú’KÀ¬>ÜÁaƒ²¢D0µßéè¥âw!³ ú�5Þ—K®jà³ËL\Ñ¢93:"÷GÄ&ÀÀûÉæîéÂæÇÚb”¿’t…ëÎÚødú>Jñ;+Ɇýÿ½ãÇ5}ª£~'¤Çí¦;»°iz”¥åI;×ÍêÁ6(·”xí*à 7Rzæò—õùÀÁ5Þ—ƒÛ‚Žîí»ÕÝØ ?grC⑈8?Íݱxp-­9²»Õãß§×zþ}qîo¯‘tUÍv}6Õ�eÊûjʯh±´õvI_t\㸦ÏÇìhDœ/J£;þø6ìïtN”ÔÔ:In[™ ˜OB”ëJ¼öYÀïÕýúÉôë³×õÂS‰—¯FH҇궒>”î’®îѾ[½ 13'|œu“TFÄ"â@`3à<‚gr�ü '÷úŽ‘WJ:Ïug-œº¾tÊ{Ë ™DÖqÍ �k œ»_�ˆWEÄ<à à ²Õª�”ê¸|96,wpØ |«äë·¬ùdsï¦7ë³÷Ë÷ ¾n~Zñ´îÃi)mó»¼ÏVO2ñÌù6ØFĺˆø@DlA¶Ò•ÁP®|ß§†vvÝ9𲽈챓*“7Q}¹YÇ5Žkº},$"¶ŽC•çëˆÜ¹°£¤¯ú `68îà°A]P~Sám'Õq_$½„ú5�Î?|ÝÂ4Jb+Iï«Q¼Ø*¥ma—÷Ùêo9°n¦$VÒ’¹V@q4p Ù³ðë³¢Dã!ß<þœëÎZø_ß7šÎƒû×8®©Qù]óbðƒÎ2�p´¤¾4› †;8l�nLßG ºu½óuiú^år-î:GÄ·�U…ž‘fþñ•ÁÇÛÒ6]ð±*í³Í7ç®g…Í’9áãkçb!EÄW€—æê¾2Ïøçåy]�öi¦×��ìûÿîÝ v-vþ “M»ºLÒêYv˜;®™á£é"âut²ÂÚøy~Ž/Ífƒá¤KrÁN¡a®’ޝÓHú °,·Už¥¯Ó�ÜÈ]˜‹¬„0OÒÏjP?+X—�ä‚�Þ˜]®¬/‹Ùc€é=œ™¹âK77¤º$Õ™ªxÞ¿Úug-üA®Ad�VEÊ4Rž-–t³ãÇ55óú.lcNvd›Õ�;8l�þ†òXÕ¦a*é3À«r�Zù;QclQ£†Ç)) Q Φ³xù Ÿ5MŸýò\ãv*­»†�ˆ8eNŸyQé¹ù:»Œòs¼e€é}sJ¯æèøY`Óôs•G‹ÄøH×�ƒÝ÷_Ÿa|n•¡’çb{KZ-i�Ypl;®©Q\ÓÁq½xºÒþ�ÛËa¾™;8l®µ±"šÀ¯ÈžŸ/ÖJÒ÷jœ˜~%›�{¸ô††jv§#8»DpÚº³stÊ�A”ÁÑmi)Ò´?Ûgó˜E“r¦FVY‡ ¨îرyúu®.kûãKÈV‰Cê×A7ƒêΜîìp3ÃÀM’Ιáyá¸fˆÙ2ÇеT�’uvŽRl4—™õ(È5¤ã€­ _²; I:y€AÀÅÀñë/eÙݸ­*nn»šggçþ4B±UNìg€–>ëÄ/]Óvl=œöq® fФœÝQá8zÏÒùíÜã E;æÆÒ{fËÁ}×Q¹“§V�C3¥î¬Xß.”tµ¤7L±ÿû¦ý_“»6–¡´ø�¤»$íç¸ÆqÍ ýÞ;D•Î!3s‡Í‚VVö<ö­%/ÃÀéý$…¤[�cÉVêèÆúðÏ®iãc,]Þ¤†H‘}}½¤$íÚÃ2ØUÒ{>vX—ö�´Oûú¬«g± ÎMéªÁë'ú\‡¼œì‘ª*ÁòJ`‡YRVï–v¸�;k¸_µ­;;8fÏÖ/CL71ó+\pYGêÊ »ð I7¥Õ<ê–'{Hz‹ãš×Tñ:ªŒtÌ:¬†03wpØœv<ÙsŽEzË[›Í�3%}¹OAÀÛÉîLí•KC7Ö‡?¼n…�'!óÃ%.òÏî‘ôÍ”Á7�{ÒgPèXÃiÀIißlÃsiVˆˆ Rƒj“/_�^»PÒwûT‡,$[™ Ê]ÁU©C`ÿ™^N’vÍý©j=úï®;{Û±!ix_¾á&éÁ)öÿ^àÅiŸ[XU;²Ö{×Kº]ÒaÎ�y’N•tðkàŸ×Ìœ¸¦BÞ—~줣âj‡ffs˜¤ TLSR£íoOH:¤Géz“¤ ¤©õUÖê iZ^ás¾Yás.VSëJ|ÆŠô}$÷¾ ºvldÛiû¬"G̺4ü¶“4”×Ôº>�;U­èKúÊC-­sü€’yñ�ÇDÞ¥=.£ýR=¥ ꯢõ^Ë®3¸ž_’Î݆¤µëLIzªnõeëÎ é>PÒåmåòÌÇáEÓlç%¥êèÉ­Í�¯ÏHz\ÒE’^اüØWÒ_Kº§mÿiRÔ:®éN\S³zjÿ\¬íàúõÁ.§ëcÏ£Y±,µ™ÙL½¨<Ú…€èC’–t˜ŽE’>’†  LªëͲ –\C©ç»¤o¶vkKìëêÜÏß“ôæŸûæôž‰¶5U^®Í$Ín4V:èDh¸ƒ£bÇø{ö/™ ;hH= éÀ.—MHú»)‚à‘ i½n†Öï\߈¯Þ`hÕ§Õ±¾¬CÝY!�¯—ôI·–Ì£W¸ŽŽTìÐ+ê¦Ôè;@ÒVæÃž’NL��æ®#� �Ǧ֥zê9Žk:�kjTOו#³78ÜÁaV\8 ¬F–í¿ÉMÀWi3鸾ø:ðCஈxhŠÏÝ8’lø÷[É&:[²~˜ñôŽIŸUÅ“±U‰|z‚ò“}+"ÞX±\.þ8ýº Ø´DÞLäjàÀÿ#{¶{>ÙÜ/v¬Xò­4eiÌüsD¼³�Þ6óûpÞT�meDlÖ�ŽÒÇÊxYוÌ�O${–|˜l˜ø’uÇCÀqaer0ð~à�dsL5LMªsÊ87"þtÔé[�=Ûÿ¿�­ÓŸ«ùn•ÏòˆØº®õe�ëΛ� �«#âçU¹é:w8pPu~‹1`UDlQà3¯&›¿£Ñáµ½ÌqòKà)àñô½ýüÚ#ÛOynfin’Í+mo-‡{kDìí¸¦³¸¦Àˆí»tœþcDœÐíàô oýëˆ8 3wp˜ ì"sHÔ|00Õñ­.ÿ«#b“”ök©þŒüCÀÁqwö.¬BŒDjØŒó£ËÛ ¥¥"[¯#{x ¡\ YÖYñáv"Ô½ƒãé" ”™ÖÁ‘òä1Ä–%��Ñtܵwˆ\AÖ)·xxr‚Ó È&}Y®!¿&Õ5 'hÔWéÔhÿýÀ»#â?jRwo•ÌÏ'[‚÷¥)/–çê«VW5¼""®™ =¨;‡R�8?wžÜ“:>V¿žNÇï–©¿U:.[^>�Ø$wNV½Þ¼$-‹:]ä—Íw@Óá±0/¥{,} Ñ�É[yÒÚ·öm¶:-[óV¼6"~츦z\Óçºj!p@®蕹¼¡óÕOŽˆe=H·;8ÌÜÁa3º“C|¿Ow{& –F�ba�4ì�¤to<Òa:þ*"þ©n{¾ÿƒœV­;´> ÔE¶Ú@+8U‡Û_Z¦äŽY×Á±�ìîí’Š žÉF}ŒMÒài¯CÚ÷¥½£e45žöO�ÓNý&Õ=÷§N˜ÇÚþÿŸÓÕcm¿·/ó8Ø xÙDˆ[¦üYJ6©k‘N‹Vö“óû�#â_J íàèIÝ™}e£ &>¾¦zÑ¿OåØˆøRÉ<ظ25;éäjuü´öyª†½Òy64͵± bÌ1šêÒm×L×ü¸žl‚ÖvË'é¨™ìØœn×öé\Û6ÕWÛ“­ì²°m:g¢í¸ÈŸ_ó:l='"~ã³Á™ï,°º‰ˆ+$½¸*]œú!¡[,HÀV�0ÔÖ`y Ø+"žÊ¥ûQI_#»+P5€[ü>ðO5,—k€Í$]¼"™óÛ¤Ónf}~o>,œà5EÁùFäO#âU>‹æ|2š–—üõ ì"–¨'Šýo¼o„lÔF¤ã}LjxHÒ9d�ÔtrçyÇôõ’˦…Ïïñs;?Ò娈¸t†�Ý­;Ç;‚)Ñ`Ž‚Ÿ¨s¯Õ©ò‘ˆ8«bÜl‘–AýX[�?š¶À¢¶Ž‹�ÓüÓìótçÕ0\¡9»&¥u!ð,IóÍq Ǥ¯œ�ž3ùó«èÊ7ùŽ�Qà ày1â«°Ù`y™X«k@x3Ù]ěӟc©�пKà†AÂê\@yGD,˹t üj–—Í«€c FÒE�>ß•jRFSZŽuç†åŽÓ;�ÝÉîŽûY}Òÿ£5»sÝL-/j=?§�Ý!IõÌ\4’û>–;·¿ŒÌ¥³à˜¬GÝ9µ%¹òX™ŽÉ³"bQÕÎ�¶<8'"ŸO×Ôì‘D±€ñ»èšæ\Dì:¶þøl›bŒltÔ«‹Œ,r\3sNÕ¯É�šZ|'"žíÎ 3wp˜M ¬�ˆ} N§u—¥Ôöµ$]Ì>;Õ„b)Ýû¥FŒfqÙ|9MPyV б¯­»âgEÄfñeŸ5ÖvœÞ;W§Ô ”#À #â¶¶tîHñÉPg£át>ççPø%°oªO]wöÏšTË�Ó#b“ˆ8£ùðœŸ;/‡S§Je1ˆÖ—×-‡FÄNSÍ¿á¸fVRî\¹1Õéèl1s‡Y™@èÀwðñO¥‹ØÝŒ±KDœX0ÍK�Ÿeó‘ˆXœ:€�?5"–DÄG|–Ø4Çé%xp+­;çýµ øfD,�ˆ'yͳR°› Á¸†l¹è“È&æÛ,†âÏZÎÖú²Kug7'‰¿ø£ˆŽˆW bežˆ87"vdŒ]€ÏËÓ# 1AýÑÌý½ÒГÄo/ëÔ8 =Âq\D<ëqÍ �­/ÿñú>Ÿ×·'“=^8'GÄ3}NãH®LË|™™ÙL!ém’~¬–¦Ö¥Ÿ’š*#{ï3é·Õ’¾�fïVZ�’ô]IËÓö§òoÓlkDå}wås”¤¯Jz*•G‘}oåÿòôž§Ò6Žð±VImÓ–ï�×9ï’}{˜®E’N”tõú\ÉêŽÆ¤¹6þÕÈ}MT׬�t�¤í;H߉’üÆë»^kHZ[àó©nz&}ÏçËã)ŸÏ“ô^IûôñÜ�õe—êÎÉŽ×vH:_Ò^5¿Æ/“tФ›s×çf*ÓÆû[$O6>¶7üÿjI—Jz�¤EŽkº×ô[#í³­|צ¯æ„9–½çrIçHzƒ¤e5:Ω˜éƒÍ5^&ÖfKgÇ>À'[Û|o²áÞkh�RRúë'(Ëû·?nþ-"Vô8­K€×û’ ÇÝØ&ý< \çNñþ“Ùx6óéFcý<"¾7ÀòYœöù5À>d˶å=L¶dæ�RYü8"Fkr|�Y¢.�—Êg¬K³I:ƒòw1ÏtcÒÀy×Ê£ÖØÉÒ,²;è �3û5i›¤€#€ÉV#Ù ±}Á9; ‰ppmDÜÝå´íH¶ÔéödK´6ÉVbh-Ûš�j¦z`Þúú`â¥3›4™WxÏXª—Ö’ÝA\›êÖ|ù-'»£û8Ùð÷Çë2ÙÞL¬/+Ô�YC¶dðr²GŸ®.‹ˆßÎàëü"àUÀ[€�Óµ~ÛŠ›!»+/ð=ঈ¸ÉqMÏâš¼­¦ù½ª±Üµ%?zá1`EªŸž&ØZVû1à±nŽÊéa¼Žò£/ÿ-MºmffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffVoÿáI÷?*ÊI®IEND®B`‚aiomusiccast-0.15.0/banner.png0000644000000000000000000002730313615410400013161 0ustar00‰PNG  IHDR8‹„)G„iCCPICC profile(‘}‘=HÃ@Å_?¤"‡qÈP�,ˆŠè¦U(B…P+´ê`ré4iHR\ׂƒ‹Ug]\AðÄÍÍIÑEJü_RhãÁq?ÞÝ{ܽü� SÍà j–‘N&„lnU½"ˆ0"èÇŒÄL}NSð_÷ðñõ.γ¼Ïý9z•¼ÉŸ@<ËtÃ"Þ žÚ´tÎûÄQV’âsâQƒ.HüÈuÙå7ÎE‡ý<3jdÒóÄQb¡ØÁr³’¡OÇU£|Öe…ógµRc­{ò†óÚÊ2×i!‰E,A„5”Q�…8­)&Ò´Ÿðð:~‘\2¹Ê`äX@*$Çþ¿»5 ãnR8t½ØöÇ0ÚšuÛþ>¶íæ x®´¶¿Ú¦?I¯·µØз \\·5y¸ÜžtÉ�)@Ó_(ïgôM9 r ô¬¹½µöqúd¨«Ô ppŒ){ÝãÝÝ�½ý{¦Õ߉0r° ï‚9bKGDùC» pHYs  šœtIMEå %*ûQ IDATxÚíÝ{´dU}àñouC?x‰@xŒÀ$"8Œ1Kƒ‚1Š„1b‡1ŠCÅ000f4(¢%BDYšAp ’À€,¦ ˆÒá!�î¶¹MßËí®[5ì]]çÖ­Ç9§NU�ªûý¬uÖí¾·ç¹ÏoÿÎ~€$I’$I’$I’$I’$I’$I’$I’$I’$I’$I’$I’$I’$I’$I’$I’$I’$I’$I’$I’$I’$I’$I’$I’$I’$I’$I’$I’$I’$I’$I’$I’$I’$I’$I’$I’$I’$I’$I’$I’$I’$I’$I‹SÅ] I’&ÄNÀ 8Ø5ãg<<Ü<|×Ý*I’$I’íƒÀ½TØL…ÍÀlüY�K ¨ÆŸµÄï[ÿ^�÷ûðãÿ§�o'º»%I’$IR¶ÎVÓLNÔiMPÌO`Ô:ü­õ55º%=šË#À) I’$I’”ÕQÀéœtH.ÓÌo}‘æ=y—ë€Wyx$I’$IR7§OÓì6’&éP#}‚¢[ו,Ÿó0p¬‡K’$I’$%½XGöÄF3)Ñ“#9Gów�ß'ß_ÝòÚæ˜i¾wCâçcÀë=|’$ Ÿ³¨H’¤2Ùø°gâw/KIŠ=Þ_�ñÍZàIà.à9à àÙøï¤—{³„ƒ¨ñJà``)0¬ìñ}3ÀJ*T©³Uâ÷·ÇÄ¿K’$I’¤Eä„–ݺ›ÔÚ¼fø p°�ëóNàRš-4Z[†4ÆøèÖºãóVI’$I’‡·ëiŸ ht#™!™ðI†û�Zw ÚNÀYq=ªÌﳑΠŽBë‘�=Ì’$I’$M®¯ZA̰°eFc™¥™à˜>7âuÞ¸&&Yz DZ„×~ÔÃ-I’$IÒäy„f£S‚`}üû:àý%܆3»FÚüÛTüù-»$I’$I“aw` �»¤$[kÔ�SK¿EKø"ݧ©­%–Už’$I’$�¿Õ¤›~õò1ܶ»èÜm%ùûë< $I’$I_Û0ÐÐvËSÀ«úüžý ]Z.nžîò}Ï·*Ç»õùÝïï°}­‰I’$I’4¦¶¦{WŽ«s~îŽÀiÀ“ÌO.ÔZ¾§J…ÍqlŒ*�SÀmÀ‰@%ç:ÝAûSMpH’$I’4~ÂÂi`«Àr|ÖñÀ3ñý­ ‹"—›�cr¬ßù´ŸööËž’$I’$�¿Gh¶´ø)°WÆ÷ŠÐâ¢Û ,ƒXÖ“}ÐÓãi˜êL*’$I’$M %_!ÉЩÛGñKûi`§€÷e\÷m=Ü’$I’$-n¿I t#ó»z4’­cmµÔڌבããA`_�$I£WqH’¤’»8®Gì2¬6ËɇJüÿ³„n0Ï!MÚ x-!I±<.³À Bë�9êÔâgÎÅ÷,mùŒMÀ…ÀŸz¨$I’$IR«½€Çi¶Ðè4µìFæÏ‚ò}à4–²wŽï<8xŒöÝS:µ™"Ìš"I’$I’´ÅJÝBÚ��ÑšpX œ<€õ8xªÃ:´v‹™%Ì#I’$I’„iTÓŒ‘qpèÖç8àQÚ'9fãÒ§ãXŸ$I’$I¸žö �Fa-ðׇ֬è>»J8ÝÃ'IÒð9Ȩ$•ǾÀ뀀—¿ì¬~I(q=¡Ÿÿφ¸^{û¯ló÷M„îÇõZã¡TN.í𷯧ŒxýnŽLüXJ…*uö~î!ª��Ý�W´ü~E,7ÿx�0ÐlÍÝ%I’$ë�À× ƒ6¦ºì4�a• ›[žß œ3€õ:"®×êø=ÓmÖ¯ýÒœNóAà,œ>Sý¹˜i9ï�(Ñú�Öæºýº‡m`¶Ž> Ü l˜Wöt«%Ùú§ñïÕÀ7€³�Ã3èH’$IJ阘O“ì¿ßL Ô$7zî3À€ýûX¯å,ዉï™M¬c5þ~vÁÒ»B1K˜–Ó&ûÊë�ÀÀúøŒ#€ó�k‰ÁärðIàõ}|þGãgäá*ÜIÀ·cy4CºqYz-µXvÕh?¦ÊÍÀ ÀŽî~I’$))LUy½gƒ(b¹7Ç~ƒð$´Jû™!ú¯L„ŸOyBh–žÊ¯‰•âjÆkè#î‘٠øD,/ªtJüo™&$ÇöðÐH’$i4݇€KOövOñ¾Ã�ûi¶„¨º£ : ¯Æ/èåC4»ž4~&+ŬÏÂ'¥k�£=­4ûÆÅÚ>Ï×�ñçîÒ¡yaŠÝÖ²¬Êhí–'��y¨$I’4 ŽvËóÀ7�ËOùÎn }SêA?�œ!´Äh$+nè²Mw¶¬ÓÆ–õ,r]«-•”Æg_ê©¥]Oq­¤ZÏÿ ܽsaÐÖ¤F™­çÃúXîïäá“$IÒ8&8ª¤h³{`<;„DGòómÙ– M¿;%!ŠoÁÑ}ù¾§—ú´ [FÕ�èxØ]]¨³0©:[²ÄFòh-ëy ð*§$I’ÆE­à±3†Ý—|UÜŽ£RÎ20ìõ»ÇSL}x‚îƒÜ¦˜²ymLÓyæ�o¸»ûö>š ©™Dr£ß–c5:·œ«%ÊñÙŒ…´‘ТC’$I*¹Á :Œ'�“¯ʰ–Ë=Ñ”S2i8M·„b¸–Wµ,ÍÁ$;_ëÕÄç+Ÿ=-ÊÚ%ŽúIp´{_²›Ë “¶�sn x™‡Y’$IãP�š„¥ÛÔˆehîÀ£Äõù aŠÙ=»|ƶ„™;î�$i$í¦’Ï´ïz2Mq-8òŽ!Ôï÷7¦Ñ~³‡Y’$I&8½Ì*½‘ò¶2Y㩦¾’¨˜Ö Š+�•9>ïB·©äùÙ˜Fù½îî̈ǤʖE´àhŒ5tazßCc u³ðvÂLRߌë8CþVn'{˜%I’´ØÉÀ~MâßÏšÊßN˜ âZàŽøûz—JAže6ÇëZ×ï:Â,,ÏuI¨äLµ|ËÓM9\ÈüÁ@‹ôñ­ñ:­ÅsýƒîæLö¥9«S¿-3Zßÿð)à5Xïcc²d†ù âf¦1•pHÜ\è¡–$IÒ8&8òéµè7g’¾¿öÀÅ ¶Åt"‘òaêÆ�S­ÝRö.ŒA¿ýêkžnÒØ{/Åt/Iþûiàô!oÇÖÀÀc‰õI&l®ñPK’$i±%8ɃŸõ¹.·Rü¬'�ÖO¯ësýnlé“§É÷yžrÒØz?Í„n?­ÝÉÒÛ€ƒK°]+�/'Êóz¨%©|*îI#páIÜ/€Õ„æß?'´(k‚£ñ3o¹ù—„þáE¸šð„´l–eÜ–vÛp9pjAëw%ÞK�­€—€ß¿ØÁËDj[vîì¼’0–Ä®-¯©ë ÝkÖÇëé B×�'€Í\¿Sc aEŽÏ˜–ÆÆø0ðB �Ç�¿òt”¤ò1Á¡Åä@àõÀÞ„§è{· ¾¦�àjÂ8O»ëúrp a¶=Ý2l²Ò]‹¿{��ø¸¸‰rÌZÐO‚£|†Ð_¼H«�_˹-•–_ œ6€õ{E÷™×?öò‘e炲sIŸñ[x¸�Ð á>àÿ°¾Ç7æxßKÀrBâeY¼î�~æ)`\#I&8¤`[à=À)±¢´=ý=} ¸¸%V¼Ëh¿ÄºŽÚÑÀÇ�Ãâ¾ÏÚÊ€Ä{6Ä üÏ Â‡�àøðX§£ÝUèóÜ~˜Á4ÿ>¸— ÕØ’#«�—X”�ÔÀþ± Ý x5aªÕ]€íâµÝn–’Ç�_Zf­‹eÒÏi¶ (Ãù2•—E—�Y˶FÙñ3àŸ�¿¾“ñsö�Ç}†|3×¼œ…-#Œkò98^×»»’=»Åý´},·vdþÕd�hI¼"*ÌO"Ö­keÖh¹yðÇ^º’ÔŸÓO(fh¶ èoŒ‚ ›ã˜ÉÏxøÙÇ+Øš0êûÉÀùlïûObZe{”ðTg˜v#ÌþѺÇb˜nŸ¡ÝìÓ4û8Ï´yݵñ»†�àÈ3G•ô‰æ‘·Ÿ{r&€�K¸~uà.‹³¡_¿gÆ;Ô@¶U˜,O•®"tkxö±Låe±eg1 ·– ZR¤Ñï,O{ פô&Bðûb„ä¹<—*ã>Ýûø,�sj•—®$å÷B³ØûñøÝeLp4^wÏ€×ëë}!kƒžÒWú ”4Xïdá µÅ$1ºWÆ;•Y31ùq a–¡� ÜÖ²”—Ã(;ÓUpç—gíŽÛBËŒ^naþtªY—ë¼�kº8(^›Ou8w]ÊµÌÆöN^Æ»¨hœí \Oh’ørBóÖíÆl¶‹BVÉA»yš0àÛ°îš2¿Š|Éá¥XIÿC;^Cž.*sÀ& ”7(Gßîcß�Á`»�¼øÞîQ—güÜYŠs$›%|‘»�ܾǫ-›þ�ðÔ²ˆÄØÉ, 'íu0ˆø¡[BëA“áër&¾ÊP^ºì¬ÇkzY‡cº‰ K: ü[osÝmŠ•ÛÏöøÞ_˸®á¼ Ý×.#tG“qM«sb9½}<¯—yz”V26ÚD˜ í3îIÊæ†ð�{³Ãmslû6Ÿ”=5€ýubò6•í÷ LmËñërõ€oÞyÖyÐ]iìc?ÖO i†Ñ‚£ÑÜ:íRŽÖ!ëþô¹ßì󺫱ðéo‘Íš;-É×�4†åeÑegûr°Y6šäWÛÜ#7¦ØïY¦@}Žü-H.GÆ5 ]L³5“-5Æ£ÅÆÆø³Üí¥,IÙ|ŒÎMyK pnŽï9® ýÿ–³�òÍ„,ÿÚzú¥Ýw®�ëX–Ç0ô C?×Ç.üŽQ[“¸–j=–Æ1ÎÛ¿ýÝñ»¦Ÿ—g|”Q%8ª„î+7ŽYyYtÙYï‘yž0hä­-Ë„îݺ%÷÷LÊmº$×ú‡u¸ÁpƸ¦Å›ãû§r^.£[Ö%ÊIR7ÅÀn:ñ”j¦Moœž~ä iÙÖ4Û{iûÿ:õ›oͽ*>Ó„Ùþøßq½®% 0—g€ÌNŒ]0âG­ä Ža®_Þ§»uš3]Lj‚#Må¾–¸Öó$8Î벦Ÿy§µUyYtÙÙ: çW €îžc}Vu=‡f«žäò¦ŸQ¡ó@н–g gŒkÚ$ËÂu0¸Át]7žOãÿoõ’Vlå.Ðxa°Æ=¶gõ.� õÄßëT˜‹ýŽ_`ጿˆAþó„'š› Óˆ5¦Û³K…ê¥ä­`aŸæ´–æxÏN‰³N=ÕgìÙç1¸8¦ÃßVt8�}Ÿ\¿" }«.eØ™À¯¿;¢s¶Fèg> ÙÏ¡æ5QNõ-O�3Mèû?js-•ÅA¸ø½.ß>ÇyS%L/ùãú-Û�ÎÂØ •x>××42¤uݹ�€ O_Õçs|Ož€ý*²Žòß ÂÎÀ~>·M —v†�«Lp˜àh9Ž“œà˜Šç_–q¦âw\T¢ûÀ|ưÊË2—�E{ŒìbÎÆ]2®1®�Њ¥Ÿ$Êe‹ðü97çø$_±J!I£÷ÛäŸvt†ü3 ôãô!&8Ö !`ÿ鞢´îÿÇ Í^eßø5²ÏDÐO`h‚c²ehº\c0 ŽOôQi8sï'Ã(/Ç¡ì,Ò†Œço•Éë.`\Ó_\³ª�ýqÚ"=‡ÎÏy<>gµB’FkgšO4Ò>!jOOš9�BÞ@`›ßµvÀûäk6{ë÷÷­Öa]‚ò$8jCLpä MpLn‚cCÎýqï„ÞS]^Ž[ÙÙ¯÷ç,sndñ2®™ïš]Mk)÷Å6Ç®9‹• )¥%î•ÌÏ Sؽ@º²! ²u;°7¡Ù÷¨*+Ã2è"&í™Í�ξ¼mˆûàm4FëN?pà\ܶI9NÃþžaî¹%Þ£rya´ý<ΞÐ}2ÌëcÊÎ~½+Ç>�þڸƸ&:�æ`¢•”ûb{êT¨ñ?,æ%õbð¨2¹‰ +�_¦=K; ÅUÀQî¾Bœüé¦y«'ô#G°®GÒœ’,Íù¥qÛN2é0TuwÁÐC¾Ù{^"Ìf ÅQvöã·s¾ïéya\ÓþÊZNýø©ÅŒ¤4Lp¨,ŽÞŸj½!Ç¡Ñ/6ÍSà¿î+Ázß×¥—Æ6­`8³EX¾æ¿š-rìê“ͳÀ¦œï=ËÝ·èÊά~ƒ| ´û�kŒkZ¶³ž£|ÿULrH2טø?n¤� òmî¶Bmì“ñ=¿_¢õϺ.û�oeew˜aº›|]TÞ ¼Þ]¸èÊÎ,^�3nüWããš„¨lI”¥M˜Uâ~úªEޤ^LphÔ. 4Ϭ�¾åµÀ=%ÛŽ_N@0FÊ€l¸©„Ûpéúz×[¶Yšw3–†,É¥ î&$:´¸Êδ~•|­ªªÆ5Æ5 _K´ÒËê?_·Ø‘Ô� �Úi>½H;xÙ¸Û w|œš3Mб’rN)yv\·4¹%ÀñvM ¿NT¦g3¼ou¶¢Âµ±²å £‹§ì”qÍ0�OhiöùZœ� ¬"L‹-I ˜àÐ(ì”ñ=_v· ÄöÔSOoøKàÇ%܆Çu«§ØŠ¥ÀövM ÿš¨L¯Èð¾e4’!ù÷"p KÙÛ]:ñe§Œk†i¸Ø!ΓÕKÀTøp�,©… �ÒiopÿÝÝV¸£be¨×ÈÂL7—x[nŽëØ««J%nóQ~M ÷�Ê@ZË×À›˜cððqwëD—�2®¦€u1¡šÕ,ÍgoÖXFIj0Á¡Q ÓäõºÁ5…ïºË∔¯[ËŒ2÷!¿)®ãÊ‚·]'W_! ොޭšêmþ_�×Ñr`Oà‹±bñX¬Ä-w7OTٙƋ9ßwð":'ŒkÒ{-i[]Î÷2ÉØ°Ÿë„V3_ $ tc‘´H™àШìHö¾——¹Û"Ë àÑoË£do¿&Ôÿ>¯‡ä5QoS¡èuÍ4^¿Œ�ìø¡eÈZà*àËα/;ÓøEYããšVχÑ+h†|SÓVZ–ÿ@ˆtx8ØÏ[‚´x˜àШ›:höo¾ÞÝ6§, �Ç�J¼-?jY×^åßÁ~�Heßq.ð_hΆ0Ç„GZ›âûWÒìÊòrà$à®X™¸ øä"·c’ÊÎ4Vç|ß«ŒkŒk:øi,S#]w¯,–ÅkôÓ„©Š«„nbÇYÿ‘&›¸Få ¤ÒQþÍ]60¯tÛ¥‰u%¡ùö-±ÌÝ�¡Üm.a¦�¹ø·™–׬ˆ•‰7ç2ÇÏãkna²›Š/¶ò㹜ï[,Ý™ŒkòÛ¸°€Ï©·ü{.–O*Ô�·ÿp p€»_š,&84*¿‘ñõw¸Ëæe„~«i²q‘f]k¤ŸÂOwԹx•Ti¶Ìè~ý„¾î[Çÿ¥ãfðvBSñ:aÀ ˜¬©'±ììæÑœ³^¬^c\c\ÓÃYñZ¹gA馛rÄK·\¡ [šøÌWVQa3¡Ú©iü™àШì˜ñõ?w— 4Pw›¥‘æyø/„¾è»—Qg¡åE–§Îyí œËò:p)a<Ë‘ñ:[k9Þµ8ѸƸ&¥Ã ÉÃÏÏÓœõ,Le]LÕxÝŠx^oEh�vi,ŸVg»{8¤ñc‚C£²K†×n~ì.“¤B¬þ˜�è8ø¡�z³Zu4–bªÆA#™r*aúÙ'�Oà¬,ãâ¾ïYü�q�qMSÀŸÆ2êu±Œúwšãÿ©™4 -”æÉ×ÏÖý !Ù!iL˜àШdyÒQÅ'ƒUŸ˜&Ôn³”Í=„W <Õücà‘äoŽK*[®¼ùI“½€ó³²Üj9Rj·æ|ßb˜Å¸f0ŠeÔ®„ég)¶{Ï2S ×YÚ¦UÖ>„dG�0Õók<$R¹™àШd ·‰Á¯ã%²Om7 –æ8¯*^iùª"KÌ:äê�Õe„™–þ;x|Ku¾i&ñïéÿît u*oÞÜKh~”eg)ýe˱Ïâ|ããš>Õ-;Žˆûû�Àuq_6§íZ�õêJ¶]¢¤Ýªåº^–8¾ï"´¼ù a6I%d®QÙ�ñõöƒœG3¼¶N˜·¾¬#Û˜�zø¥Žž>C˜æ³B�ïöø·•±¢[o©ØmSÀ÷þ¡¥ÀãÀ–�¥ò,•-ƒÍBãÉw:ï7®1®)ØÝÀ ±<Úø#`Õ–¿†.'Ó?ÐïþÀ5± ØÏà •‹ �Êó©_nPNç98÷fxm 8¶ÄÛr,Ùžrßëá—RûBËŠ ðj௠IŽ•„§¦E¸¹;ð ð)ËΩscÎ8rWà£Æ5Æ5òB,£ŠeÔ›©s°UáWlŒ­êö#$9®v÷Kåa‚C£2•áV²Ÿt Rú§�á†~x‰·åðŒ³Ø‚c²ŒãŒµ1Ý×�lKheñ'„±;f øì¹–åÏ€Û,;Kã ñç&Ò·ØÙ@höÿÆ5Æ5CòÏ„ÁŒ—ÇåO)f`× °]ìÊÒp"!+©LphTÎðÚ ý-­¤ Æ-‚²­€·”x[ÞÒt·í*»¹1¿ÇÙ³À%„±;¶~‡0xéK±:P�÷³·Fÿ÷‰ßI± ZvæwÙg´Ø>Q9¼Ò¸Æ¸fÈ6'}m<ø'æ'Åûe*l¶n%�ž¡Få‡^û+À,ùöTè=?{Y=˜áµÓñIä%ÜŽ3âºMhÛUnKÏ'q�ÊïZ+ì\D��‰J~žÒµ‘y3p‘eg)4¦ÍÌÓjê=ŒÇ ²Æ5ã×ôò÷ÀoÅzЧSg¯ ’£Ôc·ÚÛ±$-N{m¹!¤_Ê<ØÜ÷slO�Ðw=«u9¾ç†Ÿù�”Ÿ3K˜Þnm �ÁÚ¸n³)·å;™ƒ—,K¥°é5µnÃéÎÑü®,K5þ|C†k¢šñ;F-Ï1;oŒËükã¶Ìä8jóŽïRöqy9ieg^S9ï{UƳ;™qÍàâš2ø`ÎûU»åš¬ßy9×åsV9´ØØ‚C£òTŽ÷œVÒm9”ò75íå¯R¾nY| ¹ð±­ÿÇ€�âº-+x›U~ë`h ¥"l³�Ñ „~êË[’òifBXÜY‚õ¾3eY6Ó[aë�Is7ͧeiË’ýG¸¾ïb2›è§q_,ûgb™™w?¼Õ²³~—æ¬7•D¥¾—JÜg+€‡ŒkŒkJæ|ÆÛ¼5KÒⳄôã%$Ÿì–ÅÅ,|*—-³ž­/yÃàžH†'j5²=e¿f„Çà²=eªål�¼{ ´IDATY1Y-8†Ù~8-8^“ã;¾=Âóv ÙZ›LR ³‰$ǦÈ3&ÇY#//Ç»ì,Ò—É7¶Jr™f´IGãšÑÆ5e´>×ö®uŽ-8¤ ±4*5à_bš6ˆÌ:8ä ƒ€�Äo" —}`­¹’=é¨s>éŸ:5žìœ÷Ç(ŽÁ -ë’æ :ßK�%4ŸºN‚Éñž£G´®;Sáe‰2p1z–æ²yâ�Jé¶h¼Ê΢�<Úçg¬$ÌJs¡q�qMIÜCžÖ(¡åË&Òµæ’$M Fìi²=é9s„ë|óûû'—¬™õ<ͬýDòé–}�öÉÜ0´´3Ì´œ[O箾LV ŽúЂ¯á´àX•ã{><‚òãÎ>öÇ·&¤ÜÍ8fsž¿g”¤¼·²3�eÀ]À;Slÿ ÙÇãh]1®YTqMÝÜǽ­$mÁ!Icäáöúàæ7­î78©„ Ž]¶ÜœÃ�z*C%d5°ï�Á¾ñ;ÒNË8•¨`Wã¶™àæ@‡ÃKpœ¯Á ¤ïæ°aÈeÈoöq¼¦c�L‚[诋J�0PkÙe.;óº(C™¶oâÚ�jù™gy�0›GÙì“tÆ5ÅÅ5e”w�U»¨H’8Mº®µ>ƒõZŽ ËÚ!ì7´v³¶5ùäò;Àñ¾÷xæ�³1�r_Î2¿qQODóÎTb‚#O‚£ùžÃ2~Û²>*R«c¯Ø­‡/u9?òÌ<ñÃ1-ß?NóÉ|Þ C£8§¤åeÊάÞ|“ùÝŠgay<ÖE´æèօ弘Ý©Ïýpa€ÍËb,2Û%!Y¥ÂæXN½Â¸¦�¸¦,N)äÜÌ’4†vËù´·Ý“ÎUñfð`Ïß»#¡©æÅ1ÞHû§¼�–çOZò®óºŒûiØû´6•ïï8Ý |81îï!ŒÂ½Ÿ*¥©'Ç`¸¢ sÓÇx$8. ù„5Ë4‡�²ã)àƒ}nõ[­BÒ´6ÊSáÿÒ˜”é;�edµÏÊnãø¬-yy9ȲóAàcä—b9ðfB«„{ûX�*é[ÑÜUÀvg=Oîn'LÃ{9peËr7aÖ—©åÐÂJþü)�6®)$®)CbãÉÏÓA´À2Á!IcªŸjkÓʼÏ;Pã=}|ÎSÀ«J°Ÿ—ûXÌQ|ØL…�1˜˜%< K¾®ùäl~ ™u9oÄI„²'8Öe톟àx>ǹ3Û!!r+áÉçéÀ{ O¼ßݲœÜHhBß:ƒOµ ¤FëûWÅÊjYì¼8�Ðê`M"!ÑÉk*k+›Q&8Š.;«ó®§ðïŸÄŠüWcEæìx¾~¸¸�ù-BÖ·\“yï‡÷Cê)~/fáx2õÎ…d—‘YŠk-ÒØ'�’rS‰ï­Æ„ƒqMqÍ0-‹eç…ÀZöÝtûïé­· )uè)•1ÉQáfêl5ÄÁZ…0y• ËR¬ÃÀ³ñß»%þ�×ÓÀŸÅ`µ[Àžµ9î?ÄŠX?¾ l×GÙQ�ï�£B=îß:°X—zŸŸÿb¬h9ãD=ç95Œs8ïHí/žò >Á‘õZ®P�ïyùºd,‹ìmâ9•Õ4후ÏÅŸK{”!­Û²´å÷›b@}ðP{ù©Xö‘ã}Ÿ'[·>IÒ€LxÂ\Ñ’|2ÿ Nxúõt‡Êáµôÿ”òïRì£|"yͧ‹�mÌ»¯ó<åO6¾c€I[päMp ¿„©ÛÍD2ªòdºå\o41¿€ÁŽS0~Kóø'[ºü^Îó`Ôåå ÊÎÚ€öÿÆeÙlÎÊU«3ÛÜ#gãõ‘œ9¥Ó —�–µŸ§3-ëð~㚉YÒÎ|Sk9‡Ÿ!ýìNy¶à�¤1·x0ÑL·ˆ¦ƒý}iûÜ>0á ãgLôô¨ÎÆu9±dI£Mp@xb÷ɦÇà  Ó9±8°e=ŸŠë·‘řԘNülMö<Ðç9P¦G‘egmÇc*ž“ç`?\Nrö�ùSêö𦴯ðÕçgXçÕôî¢b\3ÙË pÝî¦&8$i‚œÅh2øí¬KR®ó†>°qHp4|’…O¦‡¨7žŠ²¤I£Op4Ü9âÄF²I§YÖ,òJB딌žx÷«l Ž¢ÊÎAUð­fÖÆS´‹X8¾E­eÓCôžIƸf²[xÌÆ¢ÙgH÷z’4�nA °.¡�±”½3®ï-‹ ÁQD°–7`:kˆçž ŽñNpCxJ9ЦÖ³ªtßS!X^¬•†*0žHè3_”²&8ú-;‹¬hnLTØî`4ƒ×žN³µU¹ÍòèiÂøX»×,úÆ&’4¡¶!L½·.E°œ%j6•�ßD÷I²5?mõ²÷¹í•à˜"û îÛC:>G7Óß(ïÝ^wsüŽáª°¹ëÒM¿õ¼†jÏõ[¸¾ÃœÆ¯õxÖº®sH@4*\¯Àú¼ø)éf%˜fã…ë;ÛeÖ–€}3¬ß§r^Y+|µ”K?O‰“åq•öclÜE˜Jv��e./‹.;ó.w'”â*ÜkçI­Ã½:ï~©vˆ:}ÞW N¶.Ƹf¬áø7Ëûä¾~8ƒ…Ý ‡éÌŸÝ'íb‚C’ÆÈIÀ÷ÛÍÙ ïݘ¾Î™úq\ š×Ñ»Ïm¯Gž)&G°G˜¾p=óŸ¥éÿ½.¾g}üŒãF|®å šÊ¹ná|_Sò}W^7ÀõZ|$V°ëtŸ²µâ^íRIj4³¿ŒþZ"|„0hûã7¼.7ÕD§×ëfb9Ú:㚸Ÿ/ŠÉŒƒ‡xíŽKyYDÙÙ+ÑÔXVº%H¹íIháòPâþ\‹Ç´š#ÁW£ýà©­Ý¿|8–Æ5ÅÄ5ÃOX,L:×¶$¤;%‰Ã{n!´Ðx'ÍÁ Ëàœûâ“H‹ŒÓÄjR ü!aZɃÓ¾D˜î *ñg˜¬u °Ç€âÁ˜\˜ðºn+oÛF-ß%þ{pðå.ï?“…Óì-éñ�?¾3Â㳌ðÄèuqÛ&LÛ–ôL do�Çâûq”A¯Aö*-Çbaº¹aLÍö©É”1ðýì÷]%‘ð¨uYç:a Ìeñ½3C:Æ{º± ìD…ÝSNë¸ø„ææ÷Zˆi/ÂT§»¦h­¦?lLÛº4žy¡¨m)ÚO�¹„5j)¿{.^‡³ñXÌÆ²5yüÖ¦Ê\+åk†xÜzÇò2kÙÙÎK„)ƒ×ZÝÏÏ_Œñ}~9ð[À{€½ã½~לŸ5Cè²ö³x¬Œ‹qÍ`⚤�zü?¯¹Ä½¥1�2„i³§b¹ôaÊêÆ´ÚÏÇeÍœÿ‡¿·1‹¿µš I’$I’$I’$I’$I’$I’$I’$I’$I’$I’$I’$I’$I’$I’$I’$I’$I’$I’$I’$I’$I’$I’$I’$I’$I’$I’$I’$I’$I’$I’$I’$I’$I’$I’$I’$I’$I’$I’$I’$I’$I’$I’$I’$I’¤Òûÿ N¹å†y¿IEND®B`‚aiomusiccast-0.15.0/mkdocs.yml0000644000000000000000000000074313615410400013210 0ustar00site_name: aiomusiccast site_description: Companion library for musiccast devices intended for the Home Assistant integration. site_author: Tom Schneider repo_url: https://github.com/vigonotion/aiomusiccast edit_uri: https://github.com/vigonotion/aiomusiccast/edit/main/docs theme: readthedocs markdown_extensions: - codehilite nav: - Home: index.md - About: - Release Notes: about/changelog.md - Contributing: about/contributing.md - License: about/license.md aiomusiccast-0.15.0/pytest.ini0000644000000000000000000000027213615410400013233 0ustar00[pytest] addopts = --strict -r sxX --show-capture=log --cov-report=html --cov-report=term-missing:skip-covered --no-cov-on-fail cache_dir = .cache markers = aiomusiccast-0.15.0/uv.lock0000644000000000000000000121404613615410400012515 0ustar00version = 1 revision = 3 requires-python = ">=3.10" resolution-markers = [ "python_full_version >= '3.11'", "python_full_version < '3.11'", ] [[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.13.1" source = { registry = "https://pypi.org/simple" } dependencies = [ { name = "aiohappyeyeballs" }, { name = "aiosignal" }, { name = "async-timeout", marker = "python_full_version < '3.11'" }, { name = "attrs" }, { name = "frozenlist" }, { name = "multidict" }, { name = "propcache" }, { name = "yarl" }, ] sdist = { url = "https://files.pythonhosted.org/packages/ba/fa/3ae643cd525cf6844d3dc810481e5748107368eb49563c15a5fb9f680750/aiohttp-3.13.1.tar.gz", hash = "sha256:4b7ee9c355015813a6aa085170b96ec22315dabc3d866fd77d147927000e9464", size = 7835344, upload-time = "2025-10-17T14:03:29.337Z" } wheels = [ { url = "https://files.pythonhosted.org/packages/e6/34/5097441cc3047eccc2e0bfed3760ed068489b8392545d3aec0d8fbfab2b5/aiohttp-3.13.1-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:2349a6b642020bf20116a8a5c83bae8ba071acf1461c7cbe45fc7fafd552e7e2", size = 735069, upload-time = "2025-10-17T13:58:56.602Z" }, { url = "https://files.pythonhosted.org/packages/8c/2b/726466b4b4b16271a3db2a8a914d754d6cb9cee7bebde1f3ac6043e4e030/aiohttp-3.13.1-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:2a8434ca31c093a90edb94d7d70e98706ce4d912d7f7a39f56e1af26287f4bb7", size = 492575, upload-time = "2025-10-17T13:58:58.696Z" }, { url = "https://files.pythonhosted.org/packages/82/1f/364e64292c95bb6c9e2823b0afa1ad3f06524c573d45df82294be572489d/aiohttp-3.13.1-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:0bd610a7e87431741021a9a6ab775e769ea8c01bf01766d481282bfb17df597f", size = 487862, upload-time = "2025-10-17T13:59:00.315Z" }, { url = "https://files.pythonhosted.org/packages/23/b0/c5a774b3125ac854987b8ca45a6d995829987d01ece4525d3fc369a9ca88/aiohttp-3.13.1-cp310-cp310-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:777ec887264b629395b528af59b8523bf3164d4c6738cd8989485ff3eda002e2", size = 1666761, upload-time = "2025-10-17T13:59:02.224Z" }, { url = "https://files.pythonhosted.org/packages/29/be/32c6c1d3a6c69e594b855bbf4014bea4c42008b0daac8c6e5c9f03207b89/aiohttp-3.13.1-cp310-cp310-manylinux2014_armv7l.manylinux_2_17_armv7l.manylinux_2_31_armv7l.whl", hash = "sha256:ac1892f56e2c445aca5ba28f3bf8e16b26dfc05f3c969867b7ef553b74cb4ebe", size = 1634627, upload-time = "2025-10-17T13:59:03.829Z" }, { url = "https://files.pythonhosted.org/packages/73/8d/fde3a8f4801b14e0b9490f5bc86c5106cb7d96bd60ff2aaee53749c72fe1/aiohttp-3.13.1-cp310-cp310-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:499a047d1c5e490c31d16c033e2e47d1358f0e15175c7a1329afc6dfeb04bc09", size = 1726564, upload-time = "2025-10-17T13:59:05.997Z" }, { url = "https://files.pythonhosted.org/packages/52/b2/8290556f1f6b17b1af976a9abb17f9b54dc7218e11bbf6abbebaa7cc70fb/aiohttp-3.13.1-cp310-cp310-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:610be925f89501938c770f1e28ca9dd62e9b308592c81bd5d223ce92434c0089", size = 1814413, upload-time = "2025-10-17T13:59:08.975Z" }, { url = "https://files.pythonhosted.org/packages/ef/6b/4b657e9fa72479df38117609d4ec8e4b07e8110b872df3872f9c6a96e26b/aiohttp-3.13.1-cp310-cp310-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:90eb902c06c6ac85d6b80fa9f2bd681f25b1ebf73433d428b3d182a507242711", size = 1667964, upload-time = "2025-10-17T13:59:10.606Z" }, { url = "https://files.pythonhosted.org/packages/ee/ed/563de175d01fa26459a60a7c82dbf69d20e356d459476a7526329091b4c3/aiohttp-3.13.1-cp310-cp310-manylinux_2_31_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:ab8ac3224b2beb46266c094b3869d68d5f96f35dba98e03dea0acbd055eefa03", size = 1553917, upload-time = "2025-10-17T13:59:12.312Z" }, { url = "https://files.pythonhosted.org/packages/39/26/48a4b5681eada16eb5b39cae277765aed1644b03610c43eadb8b331ccfea/aiohttp-3.13.1-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:79ac65b6e2731558aad1e4c1a655d2aa2a77845b62acecf5898b0d4fe8c76618", size = 1637730, upload-time = "2025-10-17T13:59:14.395Z" }, { url = "https://files.pythonhosted.org/packages/c1/43/57b137af37344e03c7f6b28ddf38a4af820b53c1fa9ce13f668fe468d2e2/aiohttp-3.13.1-cp310-cp310-musllinux_1_2_armv7l.whl", hash = "sha256:4dadbd858ed8c04d1aa7a2a91ad65f8e1fbd253ae762ef5be8111e763d576c3c", size = 1644088, upload-time = "2025-10-17T13:59:16.749Z" }, { url = "https://files.pythonhosted.org/packages/0d/c4/e49bafa4babef09929b10968a6b6efe3707fbaa5c5bb7c8db7f810232269/aiohttp-3.13.1-cp310-cp310-musllinux_1_2_ppc64le.whl", hash = "sha256:e0b2ccd331bc77149e88e919aa95c228a011e03e1168fd938e6aeb1a317d7a8a", size = 1696215, upload-time = "2025-10-17T13:59:18.711Z" }, { url = "https://files.pythonhosted.org/packages/15/e4/8414be434b3e50f9089ffa7c4d5130ba6ff0d1c6fa9f55cd760b088abbe0/aiohttp-3.13.1-cp310-cp310-musllinux_1_2_riscv64.whl", hash = "sha256:fba3c85fb24fe204e73f3c92f09f4f5cfa55fa7e54b34d59d91b7c5a258d0f6a", size = 1540617, upload-time = "2025-10-17T13:59:20.46Z" }, { url = "https://files.pythonhosted.org/packages/bd/8b/31cb6725f819b74a9c0b0055c500187294e73aea40708b6a5aa7b328ea4c/aiohttp-3.13.1-cp310-cp310-musllinux_1_2_s390x.whl", hash = "sha256:8d5011e4e741d2635cda18f2997a56e8e1d1b94591dc8732f2ef1d3e1bfc5f45", size = 1713509, upload-time = "2025-10-17T13:59:22.61Z" }, { url = "https://files.pythonhosted.org/packages/24/ac/49a79c2711423cfa091e265c46e58617de31258c64502b890f25421cb742/aiohttp-3.13.1-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:c5fe2728a89c82574bd3132d59237c3b5fb83e2e00a320e928d05d74d1ae895f", size = 1654702, upload-time = "2025-10-17T13:59:24.396Z" }, { url = "https://files.pythonhosted.org/packages/30/52/1cf23cffeda1f079f20cd9c72174a76e8b0c6595def6803892e37ee35c8a/aiohttp-3.13.1-cp310-cp310-win32.whl", hash = "sha256:add14a5e68cbcfc526c89c1ed8ea963f5ff8b9b4b854985b07820c6fbfdb3c3c", size = 430898, upload-time = "2025-10-17T13:59:26.227Z" }, { url = "https://files.pythonhosted.org/packages/0e/13/214a01f2936f4645b1fbd5cba9001331ca5af5c04bbdbe747eed330a8516/aiohttp-3.13.1-cp310-cp310-win_amd64.whl", hash = "sha256:a4cc9d9cfdf75a69ae921c407e02d0c1799ab333b0bc6f7928c175f47c080d6a", size = 453684, upload-time = "2025-10-17T13:59:28.129Z" }, { url = "https://files.pythonhosted.org/packages/be/2c/739d03730ffce57d2093e2e611e1541ac9a4b3bb88288c33275058b9ffc2/aiohttp-3.13.1-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:9eefa0a891e85dca56e2d00760945a6325bd76341ec386d3ad4ff72eb97b7e64", size = 742004, upload-time = "2025-10-17T13:59:29.73Z" }, { url = "https://files.pythonhosted.org/packages/fc/f8/7f5b7f7184d7c80e421dbaecbd13e0b2a0bb8663fd0406864f9a167a438c/aiohttp-3.13.1-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:6c20eb646371a5a57a97de67e52aac6c47badb1564e719b3601bbb557a2e8fd0", size = 495601, upload-time = "2025-10-17T13:59:31.312Z" }, { url = "https://files.pythonhosted.org/packages/3e/af/fb78d028b9642dd33ff127d9a6a151586f33daff631b05250fecd0ab23f8/aiohttp-3.13.1-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:bfc28038cd86fb1deed5cc75c8fda45c6b0f5c51dfd76f8c63d3d22dc1ab3d1b", size = 491790, upload-time = "2025-10-17T13:59:33.304Z" }, { url = "https://files.pythonhosted.org/packages/1e/ae/e40e422ee995e4f91f7f087b86304e3dd622d3a5b9ca902a1e94ebf9a117/aiohttp-3.13.1-cp311-cp311-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:8b22eeffca2e522451990c31a36fe0e71079e6112159f39a4391f1c1e259a795", size = 1746350, upload-time = "2025-10-17T13:59:35.158Z" }, { url = "https://files.pythonhosted.org/packages/28/a5/fe6022bb869bf2d2633b155ed8348d76358c22d5ff9692a15016b2d1019f/aiohttp-3.13.1-cp311-cp311-manylinux2014_armv7l.manylinux_2_17_armv7l.manylinux_2_31_armv7l.whl", hash = "sha256:65782b2977c05ebd78787e3c834abe499313bf69d6b8be4ff9c340901ee7541f", size = 1703046, upload-time = "2025-10-17T13:59:37.077Z" }, { url = "https://files.pythonhosted.org/packages/5a/a5/c4ef3617d7cdc49f2d5af077f19794946f0f2d94b93c631ace79047361a2/aiohttp-3.13.1-cp311-cp311-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:dacba54f9be3702eb866b0b9966754b475e1e39996e29e442c3cd7f1117b43a9", size = 1806161, upload-time = "2025-10-17T13:59:38.837Z" }, { url = "https://files.pythonhosted.org/packages/ad/45/b87d2430aee7e7d00b24e3dff2c5bd69f21017f6edb19cfd91e514664fc8/aiohttp-3.13.1-cp311-cp311-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:aa878da718e8235302c365e376b768035add36b55177706d784a122cb822a6a4", size = 1894546, upload-time = "2025-10-17T13:59:40.741Z" }, { url = "https://files.pythonhosted.org/packages/e8/a2/79eb466786a7f11a0292c353a8a9b95e88268c48c389239d7531d66dbb48/aiohttp-3.13.1-cp311-cp311-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:0e4b4e607fbd4964d65945a7b9d1e7f98b0d5545736ea613f77d5a2a37ff1e46", size = 1745683, upload-time = "2025-10-17T13:59:42.59Z" }, { url = "https://files.pythonhosted.org/packages/93/1a/153b0ad694f377e94eacc85338efe03ed4776a396c8bb47bd9227135792a/aiohttp-3.13.1-cp311-cp311-manylinux_2_31_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:0c3db2d0e5477ad561bf7ba978c3ae5f8f78afda70daa05020179f759578754f", size = 1605418, upload-time = "2025-10-17T13:59:45.229Z" }, { url = "https://files.pythonhosted.org/packages/3f/4e/18605b1bfeb4b00d3396d833647cdb213118e2a96862e5aebee62ad065b4/aiohttp-3.13.1-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:9739d34506fdf59bf2c092560d502aa728b8cdb33f34ba15fb5e2852c35dd829", size = 1722379, upload-time = "2025-10-17T13:59:46.969Z" }, { url = "https://files.pythonhosted.org/packages/72/13/0a38ad385d547fb283e0e1fe1ff1dff8899bd4ed0aaceeb13ec14abbf136/aiohttp-3.13.1-cp311-cp311-musllinux_1_2_armv7l.whl", hash = "sha256:b902e30a268a85d50197b4997edc6e78842c14c0703450f632c2d82f17577845", size = 1716693, upload-time = "2025-10-17T13:59:49.217Z" }, { url = "https://files.pythonhosted.org/packages/55/65/7029d7573ab9009adde380052c6130d02c8db52195fda112db35e914fe7b/aiohttp-3.13.1-cp311-cp311-musllinux_1_2_ppc64le.whl", hash = "sha256:1bbfc04c8de7def6504cce0a97f9885a5c805fd2395a0634bc10f9d6ecb42524", size = 1784174, upload-time = "2025-10-17T13:59:51.439Z" }, { url = "https://files.pythonhosted.org/packages/2d/36/fd46e39cb85418e45b0e4a8bfc39651ee0b8f08ea006adf217a221cdb269/aiohttp-3.13.1-cp311-cp311-musllinux_1_2_riscv64.whl", hash = "sha256:6941853405a38a5eeb7d9776db77698df373ff7fa8c765cb81ea14a344fccbeb", size = 1593716, upload-time = "2025-10-17T13:59:53.367Z" }, { url = "https://files.pythonhosted.org/packages/85/b8/188e0cb1be37b4408373171070fda17c3bf9c67c0d3d4fd5ee5b1fa108e1/aiohttp-3.13.1-cp311-cp311-musllinux_1_2_s390x.whl", hash = "sha256:7764adcd2dc8bd21c8228a53dda2005428498dc4d165f41b6086f0ac1c65b1c9", size = 1799254, upload-time = "2025-10-17T13:59:55.352Z" }, { url = "https://files.pythonhosted.org/packages/67/ff/fdf768764eb427b0cc9ebb2cebddf990f94d98b430679f8383c35aa114be/aiohttp-3.13.1-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:c09e08d38586fa59e5a2f9626505a0326fadb8e9c45550f029feeb92097a0afc", size = 1738122, upload-time = "2025-10-17T13:59:57.263Z" }, { url = "https://files.pythonhosted.org/packages/94/84/fce7a4d575943394d7c0e632273838eb6f39de8edf25386017bf5f0de23b/aiohttp-3.13.1-cp311-cp311-win32.whl", hash = "sha256:ce1371675e74f6cf271d0b5530defb44cce713fd0ab733713562b3a2b870815c", size = 430491, upload-time = "2025-10-17T13:59:59.466Z" }, { url = "https://files.pythonhosted.org/packages/ac/d2/d21b8ab6315a5d588c550ab285b4f02ae363edf012920e597904c5a56608/aiohttp-3.13.1-cp311-cp311-win_amd64.whl", hash = "sha256:77a2f5cc28cf4704cc157be135c6a6cfb38c9dea478004f1c0fd7449cf445c28", size = 454808, upload-time = "2025-10-17T14:00:01.247Z" }, { url = "https://files.pythonhosted.org/packages/1a/72/d463a10bf29871f6e3f63bcf3c91362dc4d72ed5917a8271f96672c415ad/aiohttp-3.13.1-cp312-cp312-macosx_10_13_universal2.whl", hash = "sha256:0760bd9a28efe188d77b7c3fe666e6ef74320d0f5b105f2e931c7a7e884c8230", size = 736218, upload-time = "2025-10-17T14:00:03.51Z" }, { url = "https://files.pythonhosted.org/packages/26/13/f7bccedbe52ea5a6eef1e4ebb686a8d7765319dfd0a5939f4238cb6e79e6/aiohttp-3.13.1-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:7129a424b441c3fe018a414401bf1b9e1d49492445f5676a3aecf4f74f67fcdb", size = 491251, upload-time = "2025-10-17T14:00:05.756Z" }, { url = "https://files.pythonhosted.org/packages/0c/7c/7ea51b5aed6cc69c873f62548da8345032aa3416336f2d26869d4d37b4a2/aiohttp-3.13.1-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:e1cb04ae64a594f6ddf5cbb024aba6b4773895ab6ecbc579d60414f8115e9e26", size = 490394, upload-time = "2025-10-17T14:00:07.504Z" }, { url = "https://files.pythonhosted.org/packages/31/05/1172cc4af4557f6522efdee6eb2b9f900e1e320a97e25dffd3c5a6af651b/aiohttp-3.13.1-cp312-cp312-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:782d656a641e755decd6bd98d61d2a8ea062fd45fd3ff8d4173605dd0d2b56a1", size = 1737455, upload-time = "2025-10-17T14:00:09.403Z" }, { url = "https://files.pythonhosted.org/packages/24/3d/ce6e4eca42f797d6b1cd3053cf3b0a22032eef3e4d1e71b9e93c92a3f201/aiohttp-3.13.1-cp312-cp312-manylinux2014_armv7l.manylinux_2_17_armv7l.manylinux_2_31_armv7l.whl", hash = "sha256:f92ad8169767429a6d2237331726c03ccc5f245222f9373aa045510976af2b35", size = 1699176, upload-time = "2025-10-17T14:00:11.314Z" }, { url = "https://files.pythonhosted.org/packages/25/04/7127ba55653e04da51477372566b16ae786ef854e06222a1c96b4ba6c8ef/aiohttp-3.13.1-cp312-cp312-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:0e778f634ca50ec005eefa2253856921c429581422d887be050f2c1c92e5ce12", size = 1767216, upload-time = "2025-10-17T14:00:13.668Z" }, { url = "https://files.pythonhosted.org/packages/b8/3b/43bca1e75847e600f40df829a6b2f0f4e1d4c70fb6c4818fdc09a462afd5/aiohttp-3.13.1-cp312-cp312-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:9bc36b41cf4aab5d3b34d22934a696ab83516603d1bc1f3e4ff9930fe7d245e5", size = 1865870, upload-time = "2025-10-17T14:00:15.852Z" }, { url = "https://files.pythonhosted.org/packages/9e/69/b204e5d43384197a614c88c1717c324319f5b4e7d0a1b5118da583028d40/aiohttp-3.13.1-cp312-cp312-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:3fd4570ea696aee27204dd524f287127ed0966d14d309dc8cc440f474e3e7dbd", size = 1751021, upload-time = "2025-10-17T14:00:18.297Z" }, { url = "https://files.pythonhosted.org/packages/1c/af/845dc6b6fdf378791d720364bf5150f80d22c990f7e3a42331d93b337cc7/aiohttp-3.13.1-cp312-cp312-manylinux_2_31_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:7bda795f08b8a620836ebfb0926f7973972a4bf8c74fdf9145e489f88c416811", size = 1561448, upload-time = "2025-10-17T14:00:20.152Z" }, { url = "https://files.pythonhosted.org/packages/7a/91/d2ab08cd77ed76a49e4106b1cfb60bce2768242dd0c4f9ec0cb01e2cbf94/aiohttp-3.13.1-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:055a51d90e351aae53dcf324d0eafb2abe5b576d3ea1ec03827d920cf81a1c15", size = 1698196, upload-time = "2025-10-17T14:00:22.131Z" }, { url = "https://files.pythonhosted.org/packages/5e/d1/082f0620dc428ecb8f21c08a191a4694915cd50f14791c74a24d9161cc50/aiohttp-3.13.1-cp312-cp312-musllinux_1_2_armv7l.whl", hash = "sha256:d4131df864cbcc09bb16d3612a682af0db52f10736e71312574d90f16406a867", size = 1719252, upload-time = "2025-10-17T14:00:24.453Z" }, { url = "https://files.pythonhosted.org/packages/fc/78/2af2f44491be7b08e43945b72d2b4fd76f0a14ba850ba9e41d28a7ce716a/aiohttp-3.13.1-cp312-cp312-musllinux_1_2_ppc64le.whl", hash = "sha256:163d3226e043f79bf47c87f8dfc89c496cc7bc9128cb7055ce026e435d551720", size = 1736529, upload-time = "2025-10-17T14:00:26.567Z" }, { url = "https://files.pythonhosted.org/packages/b0/34/3e919ecdc93edaea8d140138049a0d9126141072e519535e2efa38eb7a02/aiohttp-3.13.1-cp312-cp312-musllinux_1_2_riscv64.whl", hash = "sha256:a2370986a3b75c1a5f3d6f6d763fc6be4b430226577b0ed16a7c13a75bf43d8f", size = 1553723, upload-time = "2025-10-17T14:00:28.592Z" }, { url = "https://files.pythonhosted.org/packages/21/4b/d8003aeda2f67f359b37e70a5a4b53fee336d8e89511ac307ff62aeefcdb/aiohttp-3.13.1-cp312-cp312-musllinux_1_2_s390x.whl", hash = "sha256:d7c14de0c7c9f1e6e785ce6cbe0ed817282c2af0012e674f45b4e58c6d4ea030", size = 1763394, upload-time = "2025-10-17T14:00:31.051Z" }, { url = "https://files.pythonhosted.org/packages/4c/7b/1dbe6a39e33af9baaafc3fc016a280663684af47ba9f0e5d44249c1f72ec/aiohttp-3.13.1-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:bb611489cf0db10b99beeb7280bd39e0ef72bc3eb6d8c0f0a16d8a56075d1eb7", size = 1718104, upload-time = "2025-10-17T14:00:33.407Z" }, { url = "https://files.pythonhosted.org/packages/5c/88/bd1b38687257cce67681b9b0fa0b16437be03383fa1be4d1a45b168bef25/aiohttp-3.13.1-cp312-cp312-win32.whl", hash = "sha256:f90fe0ee75590f7428f7c8b5479389d985d83c949ea10f662ab928a5ed5cf5e6", size = 425303, upload-time = "2025-10-17T14:00:35.829Z" }, { url = "https://files.pythonhosted.org/packages/0e/e3/4481f50dd6f27e9e58c19a60cff44029641640237e35d32b04aaee8cf95f/aiohttp-3.13.1-cp312-cp312-win_amd64.whl", hash = "sha256:3461919a9dca272c183055f2aab8e6af0adc810a1b386cce28da11eb00c859d9", size = 452071, upload-time = "2025-10-17T14:00:37.764Z" }, { url = "https://files.pythonhosted.org/packages/16/6d/d267b132342e1080f4c1bb7e1b4e96b168b3cbce931ec45780bff693ff95/aiohttp-3.13.1-cp313-cp313-macosx_10_13_universal2.whl", hash = "sha256:55785a7f8f13df0c9ca30b5243d9909bd59f48b274262a8fe78cee0828306e5d", size = 730727, upload-time = "2025-10-17T14:00:39.681Z" }, { url = "https://files.pythonhosted.org/packages/92/c8/1cf495bac85cf71b80fad5f6d7693e84894f11b9fe876b64b0a1e7cbf32f/aiohttp-3.13.1-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:4bef5b83296cebb8167707b4f8d06c1805db0af632f7a72d7c5288a84667e7c3", size = 488678, upload-time = "2025-10-17T14:00:41.541Z" }, { url = "https://files.pythonhosted.org/packages/a8/19/23c6b81cca587ec96943d977a58d11d05a82837022e65cd5502d665a7d11/aiohttp-3.13.1-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:27af0619c33f9ca52f06069ec05de1a357033449ab101836f431768ecfa63ff5", size = 487637, upload-time = "2025-10-17T14:00:43.527Z" }, { url = "https://files.pythonhosted.org/packages/48/58/8f9464afb88b3eed145ad7c665293739b3a6f91589694a2bb7e5778cbc72/aiohttp-3.13.1-cp313-cp313-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:a47fe43229a8efd3764ef7728a5c1158f31cdf2a12151fe99fde81c9ac87019c", size = 1718975, upload-time = "2025-10-17T14:00:45.496Z" }, { url = "https://files.pythonhosted.org/packages/e1/8b/c3da064ca392b2702f53949fd7c403afa38d9ee10bf52c6ad59a42537103/aiohttp-3.13.1-cp313-cp313-manylinux2014_armv7l.manylinux_2_17_armv7l.manylinux_2_31_armv7l.whl", hash = "sha256:6e68e126de5b46e8b2bee73cab086b5d791e7dc192056916077aa1e2e2b04437", size = 1686905, upload-time = "2025-10-17T14:00:47.707Z" }, { url = "https://files.pythonhosted.org/packages/0a/a4/9c8a3843ecf526daee6010af1a66eb62579be1531d2d5af48ea6f405ad3c/aiohttp-3.13.1-cp313-cp313-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:e65ef49dd22514329c55970d39079618a8abf856bae7147913bb774a3ab3c02f", size = 1754907, upload-time = "2025-10-17T14:00:49.702Z" }, { url = "https://files.pythonhosted.org/packages/a4/80/1f470ed93e06436e3fc2659a9fc329c192fa893fb7ed4e884d399dbfb2a8/aiohttp-3.13.1-cp313-cp313-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:0e425a7e0511648b3376839dcc9190098671a47f21a36e815b97762eb7d556b0", size = 1857129, upload-time = "2025-10-17T14:00:51.822Z" }, { url = "https://files.pythonhosted.org/packages/cc/e6/33d305e6cce0a8daeb79c7d8d6547d6e5f27f4e35fa4883fc9c9eb638596/aiohttp-3.13.1-cp313-cp313-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:010dc9b7110f055006acd3648d5d5955bb6473b37c3663ec42a1b4cba7413e6b", size = 1738189, upload-time = "2025-10-17T14:00:53.976Z" }, { url = "https://files.pythonhosted.org/packages/ac/42/8df03367e5a64327fe0c39291080697795430c438fc1139c7cc1831aa1df/aiohttp-3.13.1-cp313-cp313-manylinux_2_31_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:1b5c722d0ca5f57d61066b5dfa96cdb87111e2519156b35c1f8dd17c703bee7a", size = 1553608, upload-time = "2025-10-17T14:00:56.144Z" }, { url = "https://files.pythonhosted.org/packages/96/17/6d5c73cd862f1cf29fddcbb54aac147037ff70a043a2829d03a379e95742/aiohttp-3.13.1-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:93029f0e9b77b714904a281b5aa578cdc8aa8ba018d78c04e51e1c3d8471b8ec", size = 1681809, upload-time = "2025-10-17T14:00:58.603Z" }, { url = "https://files.pythonhosted.org/packages/be/31/8926c8ab18533f6076ce28d2c329a203b58c6861681906e2d73b9c397588/aiohttp-3.13.1-cp313-cp313-musllinux_1_2_armv7l.whl", hash = "sha256:d1824c7d08d8ddfc8cb10c847f696942e5aadbd16fd974dfde8bd2c3c08a9fa1", size = 1711161, upload-time = "2025-10-17T14:01:01.744Z" }, { url = "https://files.pythonhosted.org/packages/f2/36/2f83e1ca730b1e0a8cf1c8ab9559834c5eec9f5da86e77ac71f0d16b521d/aiohttp-3.13.1-cp313-cp313-musllinux_1_2_ppc64le.whl", hash = "sha256:8f47d0ff5b3eb9c1278a2f56ea48fda667da8ebf28bd2cb378b7c453936ce003", size = 1731999, upload-time = "2025-10-17T14:01:04.626Z" }, { url = "https://files.pythonhosted.org/packages/b9/ec/1f818cc368dfd4d5ab4e9efc8f2f6f283bfc31e1c06d3e848bcc862d4591/aiohttp-3.13.1-cp313-cp313-musllinux_1_2_riscv64.whl", hash = "sha256:8a396b1da9b51ded79806ac3b57a598f84e0769eaa1ba300655d8b5e17b70c7b", size = 1548684, upload-time = "2025-10-17T14:01:06.828Z" }, { url = "https://files.pythonhosted.org/packages/d3/ad/33d36efd16e4fefee91b09a22a3a0e1b830f65471c3567ac5a8041fac812/aiohttp-3.13.1-cp313-cp313-musllinux_1_2_s390x.whl", hash = "sha256:d9c52a65f54796e066b5d674e33b53178014752d28bca555c479c2c25ffcec5b", size = 1756676, upload-time = "2025-10-17T14:01:09.517Z" }, { url = "https://files.pythonhosted.org/packages/3c/c4/4a526d84e77d464437713ca909364988ed2e0cd0cdad2c06cb065ece9e08/aiohttp-3.13.1-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:a89da72d18d6c95a653470b78d8ee5aa3c4b37212004c103403d0776cbea6ff0", size = 1715577, upload-time = "2025-10-17T14:01:11.958Z" }, { url = "https://files.pythonhosted.org/packages/a2/21/e39638b7d9c7f1362c4113a91870f89287e60a7ea2d037e258b81e8b37d5/aiohttp-3.13.1-cp313-cp313-win32.whl", hash = "sha256:02e0258b7585ddf5d01c79c716ddd674386bfbf3041fbbfe7bdf9c7c32eb4a9b", size = 424468, upload-time = "2025-10-17T14:01:14.344Z" }, { url = "https://files.pythonhosted.org/packages/cc/00/f3a92c592a845ebb2f47d102a67f35f0925cb854c5e7386f1a3a1fdff2ab/aiohttp-3.13.1-cp313-cp313-win_amd64.whl", hash = "sha256:ef56ffe60e8d97baac123272bde1ab889ee07d3419606fae823c80c2b86c403e", size = 450806, upload-time = "2025-10-17T14:01:16.437Z" }, { url = "https://files.pythonhosted.org/packages/97/be/0f6c41d2fd0aab0af133c509cabaf5b1d78eab882cb0ceb872e87ceeabf7/aiohttp-3.13.1-cp314-cp314-macosx_10_13_universal2.whl", hash = "sha256:77f83b3dc5870a2ea79a0fcfdcc3fc398187ec1675ff61ec2ceccad27ecbd303", size = 733828, upload-time = "2025-10-17T14:01:18.58Z" }, { url = "https://files.pythonhosted.org/packages/75/14/24e2ac5efa76ae30e05813e0f50737005fd52da8ddffee474d4a5e7f38a6/aiohttp-3.13.1-cp314-cp314-macosx_10_13_x86_64.whl", hash = "sha256:9cafd2609ebb755e47323306c7666283fbba6cf82b5f19982ea627db907df23a", size = 489320, upload-time = "2025-10-17T14:01:20.644Z" }, { url = "https://files.pythonhosted.org/packages/da/5a/4cbe599358d05ea7db4869aff44707b57d13f01724d48123dc68b3288d5a/aiohttp-3.13.1-cp314-cp314-macosx_11_0_arm64.whl", hash = "sha256:9c489309a2ca548d5f11131cfb4092f61d67954f930bba7e413bcdbbb82d7fae", size = 489899, upload-time = "2025-10-17T14:01:22.638Z" }, { url = "https://files.pythonhosted.org/packages/67/96/3aec9d9cfc723273d4386328a1e2562cf23629d2f57d137047c49adb2afb/aiohttp-3.13.1-cp314-cp314-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:79ac15fe5fdbf3c186aa74b656cd436d9a1e492ba036db8901c75717055a5b1c", size = 1716556, upload-time = "2025-10-17T14:01:25.406Z" }, { url = "https://files.pythonhosted.org/packages/b9/99/39a3d250595b5c8172843831221fa5662884f63f8005b00b4034f2a7a836/aiohttp-3.13.1-cp314-cp314-manylinux2014_armv7l.manylinux_2_17_armv7l.manylinux_2_31_armv7l.whl", hash = "sha256:095414be94fce3bc080684b4cd50fb70d439bc4662b2a1984f45f3bf9ede08aa", size = 1665814, upload-time = "2025-10-17T14:01:27.683Z" }, { url = "https://files.pythonhosted.org/packages/3b/96/8319e7060a85db14a9c178bc7b3cf17fad458db32ba6d2910de3ca71452d/aiohttp-3.13.1-cp314-cp314-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:c68172e1a2dca65fa1272c85ca72e802d78b67812b22827df01017a15c5089fa", size = 1755767, upload-time = "2025-10-17T14:01:29.914Z" }, { url = "https://files.pythonhosted.org/packages/1c/c6/0a2b3d886b40aa740fa2294cd34ed46d2e8108696748492be722e23082a7/aiohttp-3.13.1-cp314-cp314-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:3751f9212bcd119944d4ea9de6a3f0fee288c177b8ca55442a2cdff0c8201eb3", size = 1836591, upload-time = "2025-10-17T14:01:32.28Z" }, { url = "https://files.pythonhosted.org/packages/fb/34/8ab5904b3331c91a58507234a1e2f662f837e193741609ee5832eb436251/aiohttp-3.13.1-cp314-cp314-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:8619dca57d98a8353abdc7a1eeb415548952b39d6676def70d9ce76d41a046a9", size = 1714915, upload-time = "2025-10-17T14:01:35.138Z" }, { url = "https://files.pythonhosted.org/packages/b5/d3/d36077ca5f447649112189074ac6c192a666bf68165b693e48c23b0d008c/aiohttp-3.13.1-cp314-cp314-manylinux_2_31_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:97795a0cb0a5f8a843759620e9cbd8889f8079551f5dcf1ccd99ed2f056d9632", size = 1546579, upload-time = "2025-10-17T14:01:38.237Z" }, { url = "https://files.pythonhosted.org/packages/a8/14/dbc426a1bb1305c4fc78ce69323498c9e7c699983366ef676aa5d3f949fa/aiohttp-3.13.1-cp314-cp314-musllinux_1_2_aarch64.whl", hash = "sha256:1060e058da8f9f28a7026cdfca9fc886e45e551a658f6a5c631188f72a3736d2", size = 1680633, upload-time = "2025-10-17T14:01:40.902Z" }, { url = "https://files.pythonhosted.org/packages/29/83/1e68e519aff9f3ef6d4acb6cdda7b5f592ef5c67c8f095dc0d8e06ce1c3e/aiohttp-3.13.1-cp314-cp314-musllinux_1_2_armv7l.whl", hash = "sha256:f48a2c26333659101ef214907d29a76fe22ad7e912aa1e40aeffdff5e8180977", size = 1678675, upload-time = "2025-10-17T14:01:43.779Z" }, { url = "https://files.pythonhosted.org/packages/38/b9/7f3e32a81c08b6d29ea15060c377e1f038ad96cd9923a85f30e817afff22/aiohttp-3.13.1-cp314-cp314-musllinux_1_2_ppc64le.whl", hash = "sha256:f1dfad638b9c91ff225162b2824db0e99ae2d1abe0dc7272b5919701f0a1e685", size = 1726829, upload-time = "2025-10-17T14:01:46.546Z" }, { url = "https://files.pythonhosted.org/packages/23/ce/610b1f77525a0a46639aea91377b12348e9f9412cc5ddcb17502aa4681c7/aiohttp-3.13.1-cp314-cp314-musllinux_1_2_riscv64.whl", hash = "sha256:8fa09ab6dd567cb105db4e8ac4d60f377a7a94f67cf669cac79982f626360f32", size = 1542985, upload-time = "2025-10-17T14:01:49.082Z" }, { url = "https://files.pythonhosted.org/packages/53/39/3ac8dfdad5de38c401846fa071fcd24cb3b88ccfb024854df6cbd9b4a07e/aiohttp-3.13.1-cp314-cp314-musllinux_1_2_s390x.whl", hash = "sha256:4159fae827f9b5f655538a4f99b7cbc3a2187e5ca2eee82f876ef1da802ccfa9", size = 1741556, upload-time = "2025-10-17T14:01:51.846Z" }, { url = "https://files.pythonhosted.org/packages/2a/48/b1948b74fea7930b0f29595d1956842324336de200593d49a51a40607fdc/aiohttp-3.13.1-cp314-cp314-musllinux_1_2_x86_64.whl", hash = "sha256:ad671118c19e9cfafe81a7a05c294449fe0ebb0d0c6d5bb445cd2190023f5cef", size = 1696175, upload-time = "2025-10-17T14:01:54.232Z" }, { url = "https://files.pythonhosted.org/packages/96/26/063bba38e4b27b640f56cc89fe83cc3546a7ae162c2e30ca345f0ccdc3d1/aiohttp-3.13.1-cp314-cp314-win32.whl", hash = "sha256:c5c970c148c48cf6acb65224ca3c87a47f74436362dde75c27bc44155ccf7dfc", size = 430254, upload-time = "2025-10-17T14:01:56.451Z" }, { url = "https://files.pythonhosted.org/packages/88/aa/25fd764384dc4eab714023112d3548a8dd69a058840d61d816ea736097a2/aiohttp-3.13.1-cp314-cp314-win_amd64.whl", hash = "sha256:748a00167b7a88385756fa615417d24081cba7e58c8727d2e28817068b97c18c", size = 456256, upload-time = "2025-10-17T14:01:58.752Z" }, { url = "https://files.pythonhosted.org/packages/d4/9f/9ba6059de4bad25c71cd88e3da53f93e9618ea369cf875c9f924b1c167e2/aiohttp-3.13.1-cp314-cp314t-macosx_10_13_universal2.whl", hash = "sha256:390b73e99d7a1f0f658b3f626ba345b76382f3edc65f49d6385e326e777ed00e", size = 765956, upload-time = "2025-10-17T14:02:01.515Z" }, { url = "https://files.pythonhosted.org/packages/1f/30/b86da68b494447d3060f45c7ebb461347535dab4af9162a9267d9d86ca31/aiohttp-3.13.1-cp314-cp314t-macosx_10_13_x86_64.whl", hash = "sha256:27e83abb330e687e019173d8fc1fd6a1cf471769624cf89b1bb49131198a810a", size = 503206, upload-time = "2025-10-17T14:02:03.818Z" }, { url = "https://files.pythonhosted.org/packages/c1/21/d27a506552843ff9eeb9fcc2d45f943b09eefdfdf205aab044f4f1f39f6a/aiohttp-3.13.1-cp314-cp314t-macosx_11_0_arm64.whl", hash = "sha256:2b20eed07131adbf3e873e009c2869b16a579b236e9d4b2f211bf174d8bef44a", size = 507719, upload-time = "2025-10-17T14:02:05.947Z" }, { url = "https://files.pythonhosted.org/packages/58/23/4042230ec7e4edc7ba43d0342b5a3d2fe0222ca046933c4251a35aaf17f5/aiohttp-3.13.1-cp314-cp314t-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:58fee9ef8477fd69e823b92cfd1f590ee388521b5ff8f97f3497e62ee0656212", size = 1862758, upload-time = "2025-10-17T14:02:08.469Z" }, { url = "https://files.pythonhosted.org/packages/df/88/525c45bea7cbb9f65df42cadb4ff69f6a0dbf95931b0ff7d1fdc40a1cb5f/aiohttp-3.13.1-cp314-cp314t-manylinux2014_armv7l.manylinux_2_17_armv7l.manylinux_2_31_armv7l.whl", hash = "sha256:1f62608fcb7b3d034d5e9496bea52d94064b7b62b06edba82cd38191336bbeda", size = 1717790, upload-time = "2025-10-17T14:02:11.37Z" }, { url = "https://files.pythonhosted.org/packages/1d/80/21e9b5eb77df352a5788713f37359b570a793f0473f3a72db2e46df379b9/aiohttp-3.13.1-cp314-cp314t-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:fdc4d81c3dfc999437f23e36d197e8b557a3f779625cd13efe563a9cfc2ce712", size = 1842088, upload-time = "2025-10-17T14:02:13.872Z" }, { url = "https://files.pythonhosted.org/packages/d2/bf/d1738f6d63fe8b2a0ad49533911b3347f4953cd001bf3223cb7b61f18dff/aiohttp-3.13.1-cp314-cp314t-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:601d7ec812f746fd80ff8af38eeb3f196e1bab4a4d39816ccbc94c222d23f1d0", size = 1934292, upload-time = "2025-10-17T14:02:16.624Z" }, { url = "https://files.pythonhosted.org/packages/04/e6/26cab509b42610ca49573f2fc2867810f72bd6a2070182256c31b14f2e98/aiohttp-3.13.1-cp314-cp314t-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:47c3f21c469b840d9609089435c0d9918ae89f41289bf7cc4afe5ff7af5458db", size = 1791328, upload-time = "2025-10-17T14:02:19.051Z" }, { url = "https://files.pythonhosted.org/packages/8a/6d/baf7b462852475c9d045bee8418d9cdf280efb687752b553e82d0c58bcc2/aiohttp-3.13.1-cp314-cp314t-manylinux_2_31_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:d6c6cdc0750db88520332d4aaa352221732b0cafe89fd0e42feec7cb1b5dc236", size = 1622663, upload-time = "2025-10-17T14:02:21.397Z" }, { url = "https://files.pythonhosted.org/packages/c8/48/396a97318af9b5f4ca8b3dc14a67976f71c6400a9609c622f96da341453f/aiohttp-3.13.1-cp314-cp314t-musllinux_1_2_aarch64.whl", hash = "sha256:58a12299eeb1fca2414ee2bc345ac69b0f765c20b82c3ab2a75d91310d95a9f6", size = 1787791, upload-time = "2025-10-17T14:02:24.212Z" }, { url = "https://files.pythonhosted.org/packages/a8/e2/6925f6784134ce3ff3ce1a8502ab366432a3b5605387618c1a939ce778d9/aiohttp-3.13.1-cp314-cp314t-musllinux_1_2_armv7l.whl", hash = "sha256:0989cbfc195a4de1bb48f08454ef1cb47424b937e53ed069d08404b9d3c7aea1", size = 1775459, upload-time = "2025-10-17T14:02:26.971Z" }, { url = "https://files.pythonhosted.org/packages/c3/e3/b372047ba739fc39f199b99290c4cc5578ce5fd125f69168c967dac44021/aiohttp-3.13.1-cp314-cp314t-musllinux_1_2_ppc64le.whl", hash = "sha256:feb5ee664300e2435e0d1bc3443a98925013dfaf2cae9699c1f3606b88544898", size = 1789250, upload-time = "2025-10-17T14:02:29.686Z" }, { url = "https://files.pythonhosted.org/packages/02/8c/9f48b93d7d57fc9ef2ad4adace62e4663ea1ce1753806c4872fb36b54c39/aiohttp-3.13.1-cp314-cp314t-musllinux_1_2_riscv64.whl", hash = "sha256:58a6f8702da0c3606fb5cf2e669cce0ca681d072fe830968673bb4c69eb89e88", size = 1616139, upload-time = "2025-10-17T14:02:32.151Z" }, { url = "https://files.pythonhosted.org/packages/5c/c6/c64e39d61aaa33d7de1be5206c0af3ead4b369bf975dac9fdf907a4291c1/aiohttp-3.13.1-cp314-cp314t-musllinux_1_2_s390x.whl", hash = "sha256:a417ceb433b9d280e2368ffea22d4bc6e3e0d894c4bc7768915124d57d0964b6", size = 1815829, upload-time = "2025-10-17T14:02:34.635Z" }, { url = "https://files.pythonhosted.org/packages/22/75/e19e93965ea675f1151753b409af97a14f1d888588a555e53af1e62b83eb/aiohttp-3.13.1-cp314-cp314t-musllinux_1_2_x86_64.whl", hash = "sha256:8ac8854f7b0466c5d6a9ea49249b3f6176013859ac8f4bb2522ad8ed6b94ded2", size = 1760923, upload-time = "2025-10-17T14:02:37.364Z" }, { url = "https://files.pythonhosted.org/packages/6c/a4/06ed38f1dabd98ea136fd116cba1d02c9b51af5a37d513b6850a9a567d86/aiohttp-3.13.1-cp314-cp314t-win32.whl", hash = "sha256:be697a5aeff42179ed13b332a411e674994bcd406c81642d014ace90bf4bb968", size = 463318, upload-time = "2025-10-17T14:02:39.924Z" }, { url = "https://files.pythonhosted.org/packages/04/0f/27e4fdde899e1e90e35eeff56b54ed63826435ad6cdb06b09ed312d1b3fa/aiohttp-3.13.1-cp314-cp314t-win_amd64.whl", hash = "sha256:f1d6aa90546a4e8f20c3500cb68ab14679cd91f927fa52970035fd3207dfb3da", size = 496721, upload-time = "2025-10-17T14:02:42.199Z" }, ] [[package]] name = "aiomusiccast" source = { editable = "." } dependencies = [ { name = "aiohttp" }, ] [package.dev-dependencies] dev = [ { name = "docformatter", extra = ["tomli"] }, { name = "ipython", version = "8.37.0", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version < '3.11'" }, { name = "ipython", version = "9.6.0", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version >= '3.11'" }, { name = "mkdocs" }, { name = "mypy" }, { name = "pre-commit" }, { name = "pygments" }, { name = "ruff" }, ] docs = [ { name = "mkdocs" }, { name = "pygments" }, ] [package.metadata] requires-dist = [{ name = "aiohttp", specifier = ">=3.9" }] [package.metadata.requires-dev] dev = [ { name = "docformatter", extras = ["tomli"], specifier = ">=1.7.7" }, { name = "ipython", specifier = ">=8.24.0" }, { name = "mkdocs", specifier = ">=1.5.3" }, { name = "mypy", specifier = ">=1.8.0" }, { name = "pre-commit", specifier = ">=3.7.0" }, { name = "pygments", specifier = ">=2.15.0" }, { name = "ruff", specifier = ">=0.5.0" }, ] docs = [ { name = "mkdocs", specifier = ">=1.5.3" }, { name = "pygments", specifier = ">=2.15.0" }, ] [[package]] name = "aiosignal" version = "1.4.0" source = { registry = "https://pypi.org/simple" } dependencies = [ { name = "frozenlist" }, { name = "typing-extensions", marker = "python_full_version < '3.13'" }, ] 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 = "asttokens" version = "3.0.0" source = { registry = "https://pypi.org/simple" } sdist = { url = "https://files.pythonhosted.org/packages/4a/e7/82da0a03e7ba5141f05cce0d302e6eed121ae055e0456ca228bf693984bc/asttokens-3.0.0.tar.gz", hash = "sha256:0dcd8baa8d62b0c1d118b399b2ddba3c4aff271d0d7a9e0d4c1681c79035bbc7", size = 61978, upload-time = "2024-11-30T04:30:14.439Z" } wheels = [ { url = "https://files.pythonhosted.org/packages/25/8a/c46dcc25341b5bce5472c718902eb3d38600a903b14fa6aeecef3f21a46f/asttokens-3.0.0-py3-none-any.whl", hash = "sha256:e3078351a059199dd5138cb1c706e6430c05eff2ff136af5eb4790f9d28932e2", size = 26918, upload-time = "2024-11-30T04:30:10.946Z" }, ] [[package]] name = "async-timeout" version = "5.0.1" source = { registry = "https://pypi.org/simple" } sdist = { url = "https://files.pythonhosted.org/packages/a5/ae/136395dfbfe00dfc94da3f3e136d0b13f394cba8f4841120e34226265780/async_timeout-5.0.1.tar.gz", hash = "sha256:d9321a7a3d5a6a5e187e824d2fa0793ce379a202935782d555d6e9d2735677d3", size = 9274, upload-time = "2024-11-06T16:41:39.6Z" } wheels = [ { url = "https://files.pythonhosted.org/packages/fe/ba/e2081de779ca30d473f21f5b30e0e737c438205440784c7dfc81efc2b029/async_timeout-5.0.1-py3-none-any.whl", hash = "sha256:39e3809566ff85354557ec2398b55e096c8364bacac9405a7a1fa429e77fe76c", size = 6233, upload-time = "2024-11-06T16:41:37.9Z" }, ] [[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 = "cfgv" version = "3.4.0" source = { registry = "https://pypi.org/simple" } sdist = { url = "https://files.pythonhosted.org/packages/11/74/539e56497d9bd1d484fd863dd69cbbfa653cd2aa27abfe35653494d85e94/cfgv-3.4.0.tar.gz", hash = "sha256:e52591d4c5f5dead8e0f673fb16db7949d2cfb3f7da4582893288f0ded8fe560", size = 7114, upload-time = "2023-08-12T20:38:17.776Z" } wheels = [ { url = "https://files.pythonhosted.org/packages/c5/55/51844dd50c4fc7a33b653bfaba4c2456f06955289ca770a5dbd5fd267374/cfgv-3.4.0-py2.py3-none-any.whl", hash = "sha256:b7265b1f29fd3316bfcd2b330d63d024f2bfd8bcb8b0272f8e19a504856c48f9", size = 7249, upload-time = "2023-08-12T20:38:16.269Z" }, ] [[package]] name = "charset-normalizer" version = "3.4.4" source = { registry = "https://pypi.org/simple" } sdist = { url = "https://files.pythonhosted.org/packages/13/69/33ddede1939fdd074bce5434295f38fae7136463422fe4fd3e0e89b98062/charset_normalizer-3.4.4.tar.gz", hash = "sha256:94537985111c35f28720e43603b8e7b43a6ecfb2ce1d3058bbe955b73404e21a", size = 129418, upload-time = "2025-10-14T04:42:32.879Z" } wheels = [ { url = "https://files.pythonhosted.org/packages/1f/b8/6d51fc1d52cbd52cd4ccedd5b5b2f0f6a11bbf6765c782298b0f3e808541/charset_normalizer-3.4.4-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:e824f1492727fa856dd6eda4f7cee25f8518a12f3c4a56a74e8095695089cf6d", size = 209709, upload-time = "2025-10-14T04:40:11.385Z" }, { url = "https://files.pythonhosted.org/packages/5c/af/1f9d7f7faafe2ddfb6f72a2e07a548a629c61ad510fe60f9630309908fef/charset_normalizer-3.4.4-cp310-cp310-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:4bd5d4137d500351a30687c2d3971758aac9a19208fc110ccb9d7188fbe709e8", size = 148814, upload-time = "2025-10-14T04:40:13.135Z" }, { url = "https://files.pythonhosted.org/packages/79/3d/f2e3ac2bbc056ca0c204298ea4e3d9db9b4afe437812638759db2c976b5f/charset_normalizer-3.4.4-cp310-cp310-manylinux2014_armv7l.manylinux_2_17_armv7l.manylinux_2_31_armv7l.whl", hash = "sha256:027f6de494925c0ab2a55eab46ae5129951638a49a34d87f4c3eda90f696b4ad", size = 144467, upload-time = "2025-10-14T04:40:14.728Z" }, { url = "https://files.pythonhosted.org/packages/ec/85/1bf997003815e60d57de7bd972c57dc6950446a3e4ccac43bc3070721856/charset_normalizer-3.4.4-cp310-cp310-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:f820802628d2694cb7e56db99213f930856014862f3fd943d290ea8438d07ca8", size = 162280, upload-time = "2025-10-14T04:40:16.14Z" }, { url = "https://files.pythonhosted.org/packages/3e/8e/6aa1952f56b192f54921c436b87f2aaf7c7a7c3d0d1a765547d64fd83c13/charset_normalizer-3.4.4-cp310-cp310-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:798d75d81754988d2565bff1b97ba5a44411867c0cf32b77a7e8f8d84796b10d", size = 159454, upload-time = "2025-10-14T04:40:17.567Z" }, { url = "https://files.pythonhosted.org/packages/36/3b/60cbd1f8e93aa25d1c669c649b7a655b0b5fb4c571858910ea9332678558/charset_normalizer-3.4.4-cp310-cp310-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:9d1bb833febdff5c8927f922386db610b49db6e0d4f4ee29601d71e7c2694313", size = 153609, upload-time = "2025-10-14T04:40:19.08Z" }, { url = "https://files.pythonhosted.org/packages/64/91/6a13396948b8fd3c4b4fd5bc74d045f5637d78c9675585e8e9fbe5636554/charset_normalizer-3.4.4-cp310-cp310-manylinux_2_31_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:9cd98cdc06614a2f768d2b7286d66805f94c48cde050acdbbb7db2600ab3197e", size = 151849, upload-time = "2025-10-14T04:40:20.607Z" }, { url = "https://files.pythonhosted.org/packages/b7/7a/59482e28b9981d105691e968c544cc0df3b7d6133152fb3dcdc8f135da7a/charset_normalizer-3.4.4-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:077fbb858e903c73f6c9db43374fd213b0b6a778106bc7032446a8e8b5b38b93", size = 151586, upload-time = "2025-10-14T04:40:21.719Z" }, { url = "https://files.pythonhosted.org/packages/92/59/f64ef6a1c4bdd2baf892b04cd78792ed8684fbc48d4c2afe467d96b4df57/charset_normalizer-3.4.4-cp310-cp310-musllinux_1_2_armv7l.whl", hash = "sha256:244bfb999c71b35de57821b8ea746b24e863398194a4014e4c76adc2bbdfeff0", size = 145290, upload-time = "2025-10-14T04:40:23.069Z" }, { url = "https://files.pythonhosted.org/packages/6b/63/3bf9f279ddfa641ffa1962b0db6a57a9c294361cc2f5fcac997049a00e9c/charset_normalizer-3.4.4-cp310-cp310-musllinux_1_2_ppc64le.whl", hash = "sha256:64b55f9dce520635f018f907ff1b0df1fdc31f2795a922fb49dd14fbcdf48c84", size = 163663, upload-time = "2025-10-14T04:40:24.17Z" }, { url = "https://files.pythonhosted.org/packages/ed/09/c9e38fc8fa9e0849b172b581fd9803bdf6e694041127933934184e19f8c3/charset_normalizer-3.4.4-cp310-cp310-musllinux_1_2_riscv64.whl", hash = "sha256:faa3a41b2b66b6e50f84ae4a68c64fcd0c44355741c6374813a800cd6695db9e", size = 151964, upload-time = "2025-10-14T04:40:25.368Z" }, { url = "https://files.pythonhosted.org/packages/d2/d1/d28b747e512d0da79d8b6a1ac18b7ab2ecfd81b2944c4c710e166d8dd09c/charset_normalizer-3.4.4-cp310-cp310-musllinux_1_2_s390x.whl", hash = "sha256:6515f3182dbe4ea06ced2d9e8666d97b46ef4c75e326b79bb624110f122551db", size = 161064, upload-time = "2025-10-14T04:40:26.806Z" }, { url = "https://files.pythonhosted.org/packages/bb/9a/31d62b611d901c3b9e5500c36aab0ff5eb442043fb3a1c254200d3d397d9/charset_normalizer-3.4.4-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:cc00f04ed596e9dc0da42ed17ac5e596c6ccba999ba6bd92b0e0aef2f170f2d6", size = 155015, upload-time = "2025-10-14T04:40:28.284Z" }, { url = "https://files.pythonhosted.org/packages/1f/f3/107e008fa2bff0c8b9319584174418e5e5285fef32f79d8ee6a430d0039c/charset_normalizer-3.4.4-cp310-cp310-win32.whl", hash = "sha256:f34be2938726fc13801220747472850852fe6b1ea75869a048d6f896838c896f", size = 99792, upload-time = "2025-10-14T04:40:29.613Z" }, { url = "https://files.pythonhosted.org/packages/eb/66/e396e8a408843337d7315bab30dbf106c38966f1819f123257f5520f8a96/charset_normalizer-3.4.4-cp310-cp310-win_amd64.whl", hash = "sha256:a61900df84c667873b292c3de315a786dd8dac506704dea57bc957bd31e22c7d", size = 107198, upload-time = "2025-10-14T04:40:30.644Z" }, { url = "https://files.pythonhosted.org/packages/b5/58/01b4f815bf0312704c267f2ccb6e5d42bcc7752340cd487bc9f8c3710597/charset_normalizer-3.4.4-cp310-cp310-win_arm64.whl", hash = "sha256:cead0978fc57397645f12578bfd2d5ea9138ea0fac82b2f63f7f7c6877986a69", size = 100262, upload-time = "2025-10-14T04:40:32.108Z" }, { url = "https://files.pythonhosted.org/packages/ed/27/c6491ff4954e58a10f69ad90aca8a1b6fe9c5d3c6f380907af3c37435b59/charset_normalizer-3.4.4-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:6e1fcf0720908f200cd21aa4e6750a48ff6ce4afe7ff5a79a90d5ed8a08296f8", size = 206988, upload-time = "2025-10-14T04:40:33.79Z" }, { url = "https://files.pythonhosted.org/packages/94/59/2e87300fe67ab820b5428580a53cad894272dbb97f38a7a814a2a1ac1011/charset_normalizer-3.4.4-cp311-cp311-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:5f819d5fe9234f9f82d75bdfa9aef3a3d72c4d24a6e57aeaebba32a704553aa0", size = 147324, upload-time = "2025-10-14T04:40:34.961Z" }, { url = "https://files.pythonhosted.org/packages/07/fb/0cf61dc84b2b088391830f6274cb57c82e4da8bbc2efeac8c025edb88772/charset_normalizer-3.4.4-cp311-cp311-manylinux2014_armv7l.manylinux_2_17_armv7l.manylinux_2_31_armv7l.whl", hash = "sha256:a59cb51917aa591b1c4e6a43c132f0cdc3c76dbad6155df4e28ee626cc77a0a3", size = 142742, upload-time = "2025-10-14T04:40:36.105Z" }, { url = "https://files.pythonhosted.org/packages/62/8b/171935adf2312cd745d290ed93cf16cf0dfe320863ab7cbeeae1dcd6535f/charset_normalizer-3.4.4-cp311-cp311-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:8ef3c867360f88ac904fd3f5e1f902f13307af9052646963ee08ff4f131adafc", size = 160863, upload-time = "2025-10-14T04:40:37.188Z" }, { url = "https://files.pythonhosted.org/packages/09/73/ad875b192bda14f2173bfc1bc9a55e009808484a4b256748d931b6948442/charset_normalizer-3.4.4-cp311-cp311-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:d9e45d7faa48ee908174d8fe84854479ef838fc6a705c9315372eacbc2f02897", size = 157837, upload-time = "2025-10-14T04:40:38.435Z" }, { url = "https://files.pythonhosted.org/packages/6d/fc/de9cce525b2c5b94b47c70a4b4fb19f871b24995c728e957ee68ab1671ea/charset_normalizer-3.4.4-cp311-cp311-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:840c25fb618a231545cbab0564a799f101b63b9901f2569faecd6b222ac72381", size = 151550, upload-time = "2025-10-14T04:40:40.053Z" }, { url = "https://files.pythonhosted.org/packages/55/c2/43edd615fdfba8c6f2dfbd459b25a6b3b551f24ea21981e23fb768503ce1/charset_normalizer-3.4.4-cp311-cp311-manylinux_2_31_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:ca5862d5b3928c4940729dacc329aa9102900382fea192fc5e52eb69d6093815", size = 149162, upload-time = "2025-10-14T04:40:41.163Z" }, { url = "https://files.pythonhosted.org/packages/03/86/bde4ad8b4d0e9429a4e82c1e8f5c659993a9a863ad62c7df05cf7b678d75/charset_normalizer-3.4.4-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:d9c7f57c3d666a53421049053eaacdd14bbd0a528e2186fcb2e672effd053bb0", size = 150019, upload-time = "2025-10-14T04:40:42.276Z" }, { url = "https://files.pythonhosted.org/packages/1f/86/a151eb2af293a7e7bac3a739b81072585ce36ccfb4493039f49f1d3cae8c/charset_normalizer-3.4.4-cp311-cp311-musllinux_1_2_armv7l.whl", hash = "sha256:277e970e750505ed74c832b4bf75dac7476262ee2a013f5574dd49075879e161", size = 143310, upload-time = "2025-10-14T04:40:43.439Z" }, { url = "https://files.pythonhosted.org/packages/b5/fe/43dae6144a7e07b87478fdfc4dbe9efd5defb0e7ec29f5f58a55aeef7bf7/charset_normalizer-3.4.4-cp311-cp311-musllinux_1_2_ppc64le.whl", hash = "sha256:31fd66405eaf47bb62e8cd575dc621c56c668f27d46a61d975a249930dd5e2a4", size = 162022, upload-time = "2025-10-14T04:40:44.547Z" }, { url = "https://files.pythonhosted.org/packages/80/e6/7aab83774f5d2bca81f42ac58d04caf44f0cc2b65fc6db2b3b2e8a05f3b3/charset_normalizer-3.4.4-cp311-cp311-musllinux_1_2_riscv64.whl", hash = "sha256:0d3d8f15c07f86e9ff82319b3d9ef6f4bf907608f53fe9d92b28ea9ae3d1fd89", size = 149383, upload-time = "2025-10-14T04:40:46.018Z" }, { url = "https://files.pythonhosted.org/packages/4f/e8/b289173b4edae05c0dde07f69f8db476a0b511eac556dfe0d6bda3c43384/charset_normalizer-3.4.4-cp311-cp311-musllinux_1_2_s390x.whl", hash = "sha256:9f7fcd74d410a36883701fafa2482a6af2ff5ba96b9a620e9e0721e28ead5569", size = 159098, upload-time = "2025-10-14T04:40:47.081Z" }, { url = "https://files.pythonhosted.org/packages/d8/df/fe699727754cae3f8478493c7f45f777b17c3ef0600e28abfec8619eb49c/charset_normalizer-3.4.4-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:ebf3e58c7ec8a8bed6d66a75d7fb37b55e5015b03ceae72a8e7c74495551e224", size = 152991, upload-time = "2025-10-14T04:40:48.246Z" }, { url = "https://files.pythonhosted.org/packages/1a/86/584869fe4ddb6ffa3bd9f491b87a01568797fb9bd8933f557dba9771beaf/charset_normalizer-3.4.4-cp311-cp311-win32.whl", hash = "sha256:eecbc200c7fd5ddb9a7f16c7decb07b566c29fa2161a16cf67b8d068bd21690a", size = 99456, upload-time = "2025-10-14T04:40:49.376Z" }, { url = "https://files.pythonhosted.org/packages/65/f6/62fdd5feb60530f50f7e38b4f6a1d5203f4d16ff4f9f0952962c044e919a/charset_normalizer-3.4.4-cp311-cp311-win_amd64.whl", hash = "sha256:5ae497466c7901d54b639cf42d5b8c1b6a4fead55215500d2f486d34db48d016", size = 106978, upload-time = "2025-10-14T04:40:50.844Z" }, { url = "https://files.pythonhosted.org/packages/7a/9d/0710916e6c82948b3be62d9d398cb4fcf4e97b56d6a6aeccd66c4b2f2bd5/charset_normalizer-3.4.4-cp311-cp311-win_arm64.whl", hash = "sha256:65e2befcd84bc6f37095f5961e68a6f077bf44946771354a28ad434c2cce0ae1", size = 99969, upload-time = "2025-10-14T04:40:52.272Z" }, { url = "https://files.pythonhosted.org/packages/f3/85/1637cd4af66fa687396e757dec650f28025f2a2f5a5531a3208dc0ec43f2/charset_normalizer-3.4.4-cp312-cp312-macosx_10_13_universal2.whl", hash = "sha256:0a98e6759f854bd25a58a73fa88833fba3b7c491169f86ce1180c948ab3fd394", size = 208425, upload-time = "2025-10-14T04:40:53.353Z" }, { url = "https://files.pythonhosted.org/packages/9d/6a/04130023fef2a0d9c62d0bae2649b69f7b7d8d24ea5536feef50551029df/charset_normalizer-3.4.4-cp312-cp312-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:b5b290ccc2a263e8d185130284f8501e3e36c5e02750fc6b6bdeb2e9e96f1e25", size = 148162, upload-time = "2025-10-14T04:40:54.558Z" }, { url = "https://files.pythonhosted.org/packages/78/29/62328d79aa60da22c9e0b9a66539feae06ca0f5a4171ac4f7dc285b83688/charset_normalizer-3.4.4-cp312-cp312-manylinux2014_armv7l.manylinux_2_17_armv7l.manylinux_2_31_armv7l.whl", hash = "sha256:74bb723680f9f7a6234dcf67aea57e708ec1fbdf5699fb91dfd6f511b0a320ef", size = 144558, upload-time = "2025-10-14T04:40:55.677Z" }, { url = "https://files.pythonhosted.org/packages/86/bb/b32194a4bf15b88403537c2e120b817c61cd4ecffa9b6876e941c3ee38fe/charset_normalizer-3.4.4-cp312-cp312-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:f1e34719c6ed0b92f418c7c780480b26b5d9c50349e9a9af7d76bf757530350d", size = 161497, upload-time = "2025-10-14T04:40:57.217Z" }, { url = "https://files.pythonhosted.org/packages/19/89/a54c82b253d5b9b111dc74aca196ba5ccfcca8242d0fb64146d4d3183ff1/charset_normalizer-3.4.4-cp312-cp312-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:2437418e20515acec67d86e12bf70056a33abdacb5cb1655042f6538d6b085a8", size = 159240, upload-time = "2025-10-14T04:40:58.358Z" }, { url = "https://files.pythonhosted.org/packages/c0/10/d20b513afe03acc89ec33948320a5544d31f21b05368436d580dec4e234d/charset_normalizer-3.4.4-cp312-cp312-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:11d694519d7f29d6cd09f6ac70028dba10f92f6cdd059096db198c283794ac86", size = 153471, upload-time = "2025-10-14T04:40:59.468Z" }, { url = "https://files.pythonhosted.org/packages/61/fa/fbf177b55bdd727010f9c0a3c49eefa1d10f960e5f09d1d887bf93c2e698/charset_normalizer-3.4.4-cp312-cp312-manylinux_2_31_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:ac1c4a689edcc530fc9d9aa11f5774b9e2f33f9a0c6a57864e90908f5208d30a", size = 150864, upload-time = "2025-10-14T04:41:00.623Z" }, { url = "https://files.pythonhosted.org/packages/05/12/9fbc6a4d39c0198adeebbde20b619790e9236557ca59fc40e0e3cebe6f40/charset_normalizer-3.4.4-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:21d142cc6c0ec30d2efee5068ca36c128a30b0f2c53c1c07bd78cb6bc1d3be5f", size = 150647, upload-time = "2025-10-14T04:41:01.754Z" }, { url = "https://files.pythonhosted.org/packages/ad/1f/6a9a593d52e3e8c5d2b167daf8c6b968808efb57ef4c210acb907c365bc4/charset_normalizer-3.4.4-cp312-cp312-musllinux_1_2_armv7l.whl", hash = "sha256:5dbe56a36425d26d6cfb40ce79c314a2e4dd6211d51d6d2191c00bed34f354cc", size = 145110, upload-time = "2025-10-14T04:41:03.231Z" }, { url = "https://files.pythonhosted.org/packages/30/42/9a52c609e72471b0fc54386dc63c3781a387bb4fe61c20231a4ebcd58bdd/charset_normalizer-3.4.4-cp312-cp312-musllinux_1_2_ppc64le.whl", hash = "sha256:5bfbb1b9acf3334612667b61bd3002196fe2a1eb4dd74d247e0f2a4d50ec9bbf", size = 162839, upload-time = "2025-10-14T04:41:04.715Z" }, { url = "https://files.pythonhosted.org/packages/c4/5b/c0682bbf9f11597073052628ddd38344a3d673fda35a36773f7d19344b23/charset_normalizer-3.4.4-cp312-cp312-musllinux_1_2_riscv64.whl", hash = "sha256:d055ec1e26e441f6187acf818b73564e6e6282709e9bcb5b63f5b23068356a15", size = 150667, upload-time = "2025-10-14T04:41:05.827Z" }, { url = "https://files.pythonhosted.org/packages/e4/24/a41afeab6f990cf2daf6cb8c67419b63b48cf518e4f56022230840c9bfb2/charset_normalizer-3.4.4-cp312-cp312-musllinux_1_2_s390x.whl", hash = "sha256:af2d8c67d8e573d6de5bc30cdb27e9b95e49115cd9baad5ddbd1a6207aaa82a9", size = 160535, upload-time = "2025-10-14T04:41:06.938Z" }, { url = "https://files.pythonhosted.org/packages/2a/e5/6a4ce77ed243c4a50a1fecca6aaaab419628c818a49434be428fe24c9957/charset_normalizer-3.4.4-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:780236ac706e66881f3b7f2f32dfe90507a09e67d1d454c762cf642e6e1586e0", size = 154816, upload-time = "2025-10-14T04:41:08.101Z" }, { url = "https://files.pythonhosted.org/packages/a8/ef/89297262b8092b312d29cdb2517cb1237e51db8ecef2e9af5edbe7b683b1/charset_normalizer-3.4.4-cp312-cp312-win32.whl", hash = "sha256:5833d2c39d8896e4e19b689ffc198f08ea58116bee26dea51e362ecc7cd3ed26", size = 99694, upload-time = "2025-10-14T04:41:09.23Z" }, { url = "https://files.pythonhosted.org/packages/3d/2d/1e5ed9dd3b3803994c155cd9aacb60c82c331bad84daf75bcb9c91b3295e/charset_normalizer-3.4.4-cp312-cp312-win_amd64.whl", hash = "sha256:a79cfe37875f822425b89a82333404539ae63dbdddf97f84dcbc3d339aae9525", size = 107131, upload-time = "2025-10-14T04:41:10.467Z" }, { url = "https://files.pythonhosted.org/packages/d0/d9/0ed4c7098a861482a7b6a95603edce4c0d9db2311af23da1fb2b75ec26fc/charset_normalizer-3.4.4-cp312-cp312-win_arm64.whl", hash = "sha256:376bec83a63b8021bb5c8ea75e21c4ccb86e7e45ca4eb81146091b56599b80c3", size = 100390, upload-time = "2025-10-14T04:41:11.915Z" }, { url = "https://files.pythonhosted.org/packages/97/45/4b3a1239bbacd321068ea6e7ac28875b03ab8bc0aa0966452db17cd36714/charset_normalizer-3.4.4-cp313-cp313-macosx_10_13_universal2.whl", hash = "sha256:e1f185f86a6f3403aa2420e815904c67b2f9ebc443f045edd0de921108345794", size = 208091, upload-time = "2025-10-14T04:41:13.346Z" }, { url = "https://files.pythonhosted.org/packages/7d/62/73a6d7450829655a35bb88a88fca7d736f9882a27eacdca2c6d505b57e2e/charset_normalizer-3.4.4-cp313-cp313-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:6b39f987ae8ccdf0d2642338faf2abb1862340facc796048b604ef14919e55ed", size = 147936, upload-time = "2025-10-14T04:41:14.461Z" }, { url = "https://files.pythonhosted.org/packages/89/c5/adb8c8b3d6625bef6d88b251bbb0d95f8205831b987631ab0c8bb5d937c2/charset_normalizer-3.4.4-cp313-cp313-manylinux2014_armv7l.manylinux_2_17_armv7l.manylinux_2_31_armv7l.whl", hash = "sha256:3162d5d8ce1bb98dd51af660f2121c55d0fa541b46dff7bb9b9f86ea1d87de72", size = 144180, upload-time = "2025-10-14T04:41:15.588Z" }, { url = "https://files.pythonhosted.org/packages/91/ed/9706e4070682d1cc219050b6048bfd293ccf67b3d4f5a4f39207453d4b99/charset_normalizer-3.4.4-cp313-cp313-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:81d5eb2a312700f4ecaa977a8235b634ce853200e828fbadf3a9c50bab278328", size = 161346, upload-time = "2025-10-14T04:41:16.738Z" }, { url = "https://files.pythonhosted.org/packages/d5/0d/031f0d95e4972901a2f6f09ef055751805ff541511dc1252ba3ca1f80cf5/charset_normalizer-3.4.4-cp313-cp313-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:5bd2293095d766545ec1a8f612559f6b40abc0eb18bb2f5d1171872d34036ede", size = 158874, upload-time = "2025-10-14T04:41:17.923Z" }, { url = "https://files.pythonhosted.org/packages/f5/83/6ab5883f57c9c801ce5e5677242328aa45592be8a00644310a008d04f922/charset_normalizer-3.4.4-cp313-cp313-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:a8a8b89589086a25749f471e6a900d3f662d1d3b6e2e59dcecf787b1cc3a1894", size = 153076, upload-time = "2025-10-14T04:41:19.106Z" }, { url = "https://files.pythonhosted.org/packages/75/1e/5ff781ddf5260e387d6419959ee89ef13878229732732ee73cdae01800f2/charset_normalizer-3.4.4-cp313-cp313-manylinux_2_31_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:bc7637e2f80d8530ee4a78e878bce464f70087ce73cf7c1caf142416923b98f1", size = 150601, upload-time = "2025-10-14T04:41:20.245Z" }, { url = "https://files.pythonhosted.org/packages/d7/57/71be810965493d3510a6ca79b90c19e48696fb1ff964da319334b12677f0/charset_normalizer-3.4.4-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:f8bf04158c6b607d747e93949aa60618b61312fe647a6369f88ce2ff16043490", size = 150376, upload-time = "2025-10-14T04:41:21.398Z" }, { url = "https://files.pythonhosted.org/packages/e5/d5/c3d057a78c181d007014feb7e9f2e65905a6c4ef182c0ddf0de2924edd65/charset_normalizer-3.4.4-cp313-cp313-musllinux_1_2_armv7l.whl", hash = "sha256:554af85e960429cf30784dd47447d5125aaa3b99a6f0683589dbd27e2f45da44", size = 144825, upload-time = "2025-10-14T04:41:22.583Z" }, { url = "https://files.pythonhosted.org/packages/e6/8c/d0406294828d4976f275ffbe66f00266c4b3136b7506941d87c00cab5272/charset_normalizer-3.4.4-cp313-cp313-musllinux_1_2_ppc64le.whl", hash = "sha256:74018750915ee7ad843a774364e13a3db91682f26142baddf775342c3f5b1133", size = 162583, upload-time = "2025-10-14T04:41:23.754Z" }, { url = "https://files.pythonhosted.org/packages/d7/24/e2aa1f18c8f15c4c0e932d9287b8609dd30ad56dbe41d926bd846e22fb8d/charset_normalizer-3.4.4-cp313-cp313-musllinux_1_2_riscv64.whl", hash = "sha256:c0463276121fdee9c49b98908b3a89c39be45d86d1dbaa22957e38f6321d4ce3", size = 150366, upload-time = "2025-10-14T04:41:25.27Z" }, { url = "https://files.pythonhosted.org/packages/e4/5b/1e6160c7739aad1e2df054300cc618b06bf784a7a164b0f238360721ab86/charset_normalizer-3.4.4-cp313-cp313-musllinux_1_2_s390x.whl", hash = "sha256:362d61fd13843997c1c446760ef36f240cf81d3ebf74ac62652aebaf7838561e", size = 160300, upload-time = "2025-10-14T04:41:26.725Z" }, { url = "https://files.pythonhosted.org/packages/7a/10/f882167cd207fbdd743e55534d5d9620e095089d176d55cb22d5322f2afd/charset_normalizer-3.4.4-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:9a26f18905b8dd5d685d6d07b0cdf98a79f3c7a918906af7cc143ea2e164c8bc", size = 154465, upload-time = "2025-10-14T04:41:28.322Z" }, { url = "https://files.pythonhosted.org/packages/89/66/c7a9e1b7429be72123441bfdbaf2bc13faab3f90b933f664db506dea5915/charset_normalizer-3.4.4-cp313-cp313-win32.whl", hash = "sha256:9b35f4c90079ff2e2edc5b26c0c77925e5d2d255c42c74fdb70fb49b172726ac", size = 99404, upload-time = "2025-10-14T04:41:29.95Z" }, { url = "https://files.pythonhosted.org/packages/c4/26/b9924fa27db384bdcd97ab83b4f0a8058d96ad9626ead570674d5e737d90/charset_normalizer-3.4.4-cp313-cp313-win_amd64.whl", hash = "sha256:b435cba5f4f750aa6c0a0d92c541fb79f69a387c91e61f1795227e4ed9cece14", size = 107092, upload-time = "2025-10-14T04:41:31.188Z" }, { url = "https://files.pythonhosted.org/packages/af/8f/3ed4bfa0c0c72a7ca17f0380cd9e4dd842b09f664e780c13cff1dcf2ef1b/charset_normalizer-3.4.4-cp313-cp313-win_arm64.whl", hash = "sha256:542d2cee80be6f80247095cc36c418f7bddd14f4a6de45af91dfad36d817bba2", size = 100408, upload-time = "2025-10-14T04:41:32.624Z" }, { url = "https://files.pythonhosted.org/packages/2a/35/7051599bd493e62411d6ede36fd5af83a38f37c4767b92884df7301db25d/charset_normalizer-3.4.4-cp314-cp314-macosx_10_13_universal2.whl", hash = "sha256:da3326d9e65ef63a817ecbcc0df6e94463713b754fe293eaa03da99befb9a5bd", size = 207746, upload-time = "2025-10-14T04:41:33.773Z" }, { url = "https://files.pythonhosted.org/packages/10/9a/97c8d48ef10d6cd4fcead2415523221624bf58bcf68a802721a6bc807c8f/charset_normalizer-3.4.4-cp314-cp314-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:8af65f14dc14a79b924524b1e7fffe304517b2bff5a58bf64f30b98bbc5079eb", size = 147889, upload-time = "2025-10-14T04:41:34.897Z" }, { url = "https://files.pythonhosted.org/packages/10/bf/979224a919a1b606c82bd2c5fa49b5c6d5727aa47b4312bb27b1734f53cd/charset_normalizer-3.4.4-cp314-cp314-manylinux2014_armv7l.manylinux_2_17_armv7l.manylinux_2_31_armv7l.whl", hash = "sha256:74664978bb272435107de04e36db5a9735e78232b85b77d45cfb38f758efd33e", size = 143641, upload-time = "2025-10-14T04:41:36.116Z" }, { url = "https://files.pythonhosted.org/packages/ba/33/0ad65587441fc730dc7bd90e9716b30b4702dc7b617e6ba4997dc8651495/charset_normalizer-3.4.4-cp314-cp314-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:752944c7ffbfdd10c074dc58ec2d5a8a4cd9493b314d367c14d24c17684ddd14", size = 160779, upload-time = "2025-10-14T04:41:37.229Z" }, { url = "https://files.pythonhosted.org/packages/67/ed/331d6b249259ee71ddea93f6f2f0a56cfebd46938bde6fcc6f7b9a3d0e09/charset_normalizer-3.4.4-cp314-cp314-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:d1f13550535ad8cff21b8d757a3257963e951d96e20ec82ab44bc64aeb62a191", size = 159035, upload-time = "2025-10-14T04:41:38.368Z" }, { url = "https://files.pythonhosted.org/packages/67/ff/f6b948ca32e4f2a4576aa129d8bed61f2e0543bf9f5f2b7fc3758ed005c9/charset_normalizer-3.4.4-cp314-cp314-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:ecaae4149d99b1c9e7b88bb03e3221956f68fd6d50be2ef061b2381b61d20838", size = 152542, upload-time = "2025-10-14T04:41:39.862Z" }, { url = "https://files.pythonhosted.org/packages/16/85/276033dcbcc369eb176594de22728541a925b2632f9716428c851b149e83/charset_normalizer-3.4.4-cp314-cp314-manylinux_2_31_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:cb6254dc36b47a990e59e1068afacdcd02958bdcce30bb50cc1700a8b9d624a6", size = 149524, upload-time = "2025-10-14T04:41:41.319Z" }, { url = "https://files.pythonhosted.org/packages/9e/f2/6a2a1f722b6aba37050e626530a46a68f74e63683947a8acff92569f979a/charset_normalizer-3.4.4-cp314-cp314-musllinux_1_2_aarch64.whl", hash = "sha256:c8ae8a0f02f57a6e61203a31428fa1d677cbe50c93622b4149d5c0f319c1d19e", size = 150395, upload-time = "2025-10-14T04:41:42.539Z" }, { url = "https://files.pythonhosted.org/packages/60/bb/2186cb2f2bbaea6338cad15ce23a67f9b0672929744381e28b0592676824/charset_normalizer-3.4.4-cp314-cp314-musllinux_1_2_armv7l.whl", hash = "sha256:47cc91b2f4dd2833fddaedd2893006b0106129d4b94fdb6af1f4ce5a9965577c", size = 143680, upload-time = "2025-10-14T04:41:43.661Z" }, { url = "https://files.pythonhosted.org/packages/7d/a5/bf6f13b772fbb2a90360eb620d52ed8f796f3c5caee8398c3b2eb7b1c60d/charset_normalizer-3.4.4-cp314-cp314-musllinux_1_2_ppc64le.whl", hash = "sha256:82004af6c302b5d3ab2cfc4cc5f29db16123b1a8417f2e25f9066f91d4411090", size = 162045, upload-time = "2025-10-14T04:41:44.821Z" }, { url = "https://files.pythonhosted.org/packages/df/c5/d1be898bf0dc3ef9030c3825e5d3b83f2c528d207d246cbabe245966808d/charset_normalizer-3.4.4-cp314-cp314-musllinux_1_2_riscv64.whl", hash = "sha256:2b7d8f6c26245217bd2ad053761201e9f9680f8ce52f0fcd8d0755aeae5b2152", size = 149687, upload-time = "2025-10-14T04:41:46.442Z" }, { url = "https://files.pythonhosted.org/packages/a5/42/90c1f7b9341eef50c8a1cb3f098ac43b0508413f33affd762855f67a410e/charset_normalizer-3.4.4-cp314-cp314-musllinux_1_2_s390x.whl", hash = "sha256:799a7a5e4fb2d5898c60b640fd4981d6a25f1c11790935a44ce38c54e985f828", size = 160014, upload-time = "2025-10-14T04:41:47.631Z" }, { url = "https://files.pythonhosted.org/packages/76/be/4d3ee471e8145d12795ab655ece37baed0929462a86e72372fd25859047c/charset_normalizer-3.4.4-cp314-cp314-musllinux_1_2_x86_64.whl", hash = "sha256:99ae2cffebb06e6c22bdc25801d7b30f503cc87dbd283479e7b606f70aff57ec", size = 154044, upload-time = "2025-10-14T04:41:48.81Z" }, { url = "https://files.pythonhosted.org/packages/b0/6f/8f7af07237c34a1defe7defc565a9bc1807762f672c0fde711a4b22bf9c0/charset_normalizer-3.4.4-cp314-cp314-win32.whl", hash = "sha256:f9d332f8c2a2fcbffe1378594431458ddbef721c1769d78e2cbc06280d8155f9", size = 99940, upload-time = "2025-10-14T04:41:49.946Z" }, { url = "https://files.pythonhosted.org/packages/4b/51/8ade005e5ca5b0d80fb4aff72a3775b325bdc3d27408c8113811a7cbe640/charset_normalizer-3.4.4-cp314-cp314-win_amd64.whl", hash = "sha256:8a6562c3700cce886c5be75ade4a5db4214fda19fede41d9792d100288d8f94c", size = 107104, upload-time = "2025-10-14T04:41:51.051Z" }, { url = "https://files.pythonhosted.org/packages/da/5f/6b8f83a55bb8278772c5ae54a577f3099025f9ade59d0136ac24a0df4bde/charset_normalizer-3.4.4-cp314-cp314-win_arm64.whl", hash = "sha256:de00632ca48df9daf77a2c65a484531649261ec9f25489917f09e455cb09ddb2", size = 100743, upload-time = "2025-10-14T04:41:52.122Z" }, { 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 = "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 = "distlib" version = "0.4.0" source = { registry = "https://pypi.org/simple" } sdist = { url = "https://files.pythonhosted.org/packages/96/8e/709914eb2b5749865801041647dc7f4e6d00b549cfe88b65ca192995f07c/distlib-0.4.0.tar.gz", hash = "sha256:feec40075be03a04501a973d81f633735b4b69f98b05450592310c0f401a4e0d", size = 614605, upload-time = "2025-07-17T16:52:00.465Z" } wheels = [ { url = "https://files.pythonhosted.org/packages/33/6b/e0547afaf41bf2c42e52430072fa5658766e3d65bd4b03a563d1b6336f57/distlib-0.4.0-py2.py3-none-any.whl", hash = "sha256:9659f7d87e46584a30b5780e43ac7a2143098441670ff0a49d5f9034c54a6c16", size = 469047, upload-time = "2025-07-17T16:51:58.613Z" }, ] [[package]] name = "docformatter" version = "1.7.7" source = { registry = "https://pypi.org/simple" } dependencies = [ { name = "charset-normalizer" }, { name = "untokenize" }, ] sdist = { url = "https://files.pythonhosted.org/packages/2a/7b/ee08cb5fe2627ed0b6f0cc4a1c6be6c9c71de5a3e9785de8174273fc3128/docformatter-1.7.7.tar.gz", hash = "sha256:ea0e1e8867e5af468dfc3f9e947b92230a55be9ec17cd1609556387bffac7978", size = 26587, upload-time = "2025-05-11T04:54:04.356Z" } wheels = [ { url = "https://files.pythonhosted.org/packages/dc/b4/a7ec1eaee86761a9dbfd339732b4706db3c6b65e970c12f0f56cfcce3dcf/docformatter-1.7.7-py3-none-any.whl", hash = "sha256:7af49f8a46346a77858f6651f431b882c503c2f4442c8b4524b920c863277834", size = 33525, upload-time = "2025-05-11T04:54:03.353Z" }, ] [package.optional-dependencies] tomli = [ { name = "tomli", marker = "python_full_version < '3.11'" }, ] [[package]] name = "exceptiongroup" version = "1.3.0" source = { registry = "https://pypi.org/simple" } dependencies = [ { name = "typing-extensions", marker = "python_full_version < '3.11'" }, ] sdist = { url = "https://files.pythonhosted.org/packages/0b/9f/a65090624ecf468cdca03533906e7c69ed7588582240cfe7cc9e770b50eb/exceptiongroup-1.3.0.tar.gz", hash = "sha256:b241f5885f560bc56a59ee63ca4c6a8bfa46ae4ad651af316d4e81817bb9fd88", size = 29749, upload-time = "2025-05-10T17:42:51.123Z" } wheels = [ { url = "https://files.pythonhosted.org/packages/36/f4/c6e662dade71f56cd2f3735141b265c3c79293c109549c1e6933b0651ffc/exceptiongroup-1.3.0-py3-none-any.whl", hash = "sha256:4d111e6e0c13d0644cad6ddaa7ed0261a0b36971f6d23e7ec9b4b9097da78a10", size = 16674, upload-time = "2025-05-10T17:42:49.33Z" }, ] [[package]] name = "executing" version = "2.2.1" source = { registry = "https://pypi.org/simple" } sdist = { url = "https://files.pythonhosted.org/packages/cc/28/c14e053b6762b1044f34a13aab6859bbf40456d37d23aa286ac24cfd9a5d/executing-2.2.1.tar.gz", hash = "sha256:3632cc370565f6648cc328b32435bd120a1e4ebb20c77e3fdde9a13cd1e533c4", size = 1129488, upload-time = "2025-09-01T09:48:10.866Z" } wheels = [ { url = "https://files.pythonhosted.org/packages/c1/ea/53f2148663b321f21b5a606bd5f191517cf40b7072c0497d3c92c4a13b1e/executing-2.2.1-py2.py3-none-any.whl", hash = "sha256:760643d3452b4d777d295bb167ccc74c64a81df23fb5e08eff250c425a4b2017", size = 28317, upload-time = "2025-09-01T09:48:08.5Z" }, ] [[package]] name = "filelock" version = "3.20.0" source = { registry = "https://pypi.org/simple" } sdist = { url = "https://files.pythonhosted.org/packages/58/46/0028a82567109b5ef6e4d2a1f04a583fb513e6cf9527fcdd09afd817deeb/filelock-3.20.0.tar.gz", hash = "sha256:711e943b4ec6be42e1d4e6690b48dc175c822967466bb31c0c293f34334c13f4", size = 18922, upload-time = "2025-10-08T18:03:50.056Z" } wheels = [ { url = "https://files.pythonhosted.org/packages/76/91/7216b27286936c16f5b4d0c530087e4a54eead683e6b0b73dd0c64844af6/filelock-3.20.0-py3-none-any.whl", hash = "sha256:339b4732ffda5cd79b13f4e2711a31b0365ce445d95d243bb996273d072546a2", size = 16054, upload-time = "2025-10-08T18:03:48.35Z" }, ] [[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/83/4a/557715d5047da48d54e659203b9335be7bfaafda2c3f627b7c47e0b3aaf3/frozenlist-1.8.0-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:b37f6d31b3dcea7deb5e9696e529a6aa4a898adc33db82da12e4c60a7c4d2011", size = 86230, upload-time = "2025-10-06T05:35:23.699Z" }, { url = "https://files.pythonhosted.org/packages/a2/fb/c85f9fed3ea8fe8740e5b46a59cc141c23b842eca617da8876cfce5f760e/frozenlist-1.8.0-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:ef2b7b394f208233e471abc541cc6991f907ffd47dc72584acee3147899d6565", size = 49621, upload-time = "2025-10-06T05:35:25.341Z" }, { url = "https://files.pythonhosted.org/packages/63/70/26ca3f06aace16f2352796b08704338d74b6d1a24ca38f2771afbb7ed915/frozenlist-1.8.0-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:a88f062f072d1589b7b46e951698950e7da00442fc1cacbe17e19e025dc327ad", size = 49889, upload-time = "2025-10-06T05:35:26.797Z" }, { url = "https://files.pythonhosted.org/packages/5d/ed/c7895fd2fde7f3ee70d248175f9b6cdf792fb741ab92dc59cd9ef3bd241b/frozenlist-1.8.0-cp310-cp310-manylinux1_x86_64.manylinux_2_28_x86_64.manylinux_2_5_x86_64.whl", hash = "sha256:f57fb59d9f385710aa7060e89410aeb5058b99e62f4d16b08b91986b9a2140c2", size = 219464, upload-time = "2025-10-06T05:35:28.254Z" }, { url = "https://files.pythonhosted.org/packages/6b/83/4d587dccbfca74cb8b810472392ad62bfa100bf8108c7223eb4c4fa2f7b3/frozenlist-1.8.0-cp310-cp310-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:799345ab092bee59f01a915620b5d014698547afd011e691a208637312db9186", size = 221649, upload-time = "2025-10-06T05:35:29.454Z" }, { url = "https://files.pythonhosted.org/packages/6a/c6/fd3b9cd046ec5fff9dab66831083bc2077006a874a2d3d9247dea93ddf7e/frozenlist-1.8.0-cp310-cp310-manylinux2014_armv7l.manylinux_2_17_armv7l.manylinux_2_31_armv7l.whl", hash = "sha256:c23c3ff005322a6e16f71bf8692fcf4d5a304aaafe1e262c98c6d4adc7be863e", size = 219188, upload-time = "2025-10-06T05:35:30.951Z" }, { url = "https://files.pythonhosted.org/packages/ce/80/6693f55eb2e085fc8afb28cf611448fb5b90e98e068fa1d1b8d8e66e5c7d/frozenlist-1.8.0-cp310-cp310-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:8a76ea0f0b9dfa06f254ee06053d93a600865b3274358ca48a352ce4f0798450", size = 231748, upload-time = "2025-10-06T05:35:32.101Z" }, { url = "https://files.pythonhosted.org/packages/97/d6/e9459f7c5183854abd989ba384fe0cc1a0fb795a83c033f0571ec5933ca4/frozenlist-1.8.0-cp310-cp310-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:c7366fe1418a6133d5aa824ee53d406550110984de7637d65a178010f759c6ef", size = 236351, upload-time = "2025-10-06T05:35:33.834Z" }, { url = "https://files.pythonhosted.org/packages/97/92/24e97474b65c0262e9ecd076e826bfd1d3074adcc165a256e42e7b8a7249/frozenlist-1.8.0-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:13d23a45c4cebade99340c4165bd90eeb4a56c6d8a9d8aa49568cac19a6d0dc4", size = 218767, upload-time = "2025-10-06T05:35:35.205Z" }, { url = "https://files.pythonhosted.org/packages/ee/bf/dc394a097508f15abff383c5108cb8ad880d1f64a725ed3b90d5c2fbf0bb/frozenlist-1.8.0-cp310-cp310-musllinux_1_2_armv7l.whl", hash = "sha256:e4a3408834f65da56c83528fb52ce7911484f0d1eaf7b761fc66001db1646eff", size = 235887, upload-time = "2025-10-06T05:35:36.354Z" }, { url = "https://files.pythonhosted.org/packages/40/90/25b201b9c015dbc999a5baf475a257010471a1fa8c200c843fd4abbee725/frozenlist-1.8.0-cp310-cp310-musllinux_1_2_ppc64le.whl", hash = "sha256:42145cd2748ca39f32801dad54aeea10039da6f86e303659db90db1c4b614c8c", size = 228785, upload-time = "2025-10-06T05:35:37.949Z" }, { url = "https://files.pythonhosted.org/packages/84/f4/b5bc148df03082f05d2dd30c089e269acdbe251ac9a9cf4e727b2dbb8a3d/frozenlist-1.8.0-cp310-cp310-musllinux_1_2_s390x.whl", hash = "sha256:e2de870d16a7a53901e41b64ffdf26f2fbb8917b3e6ebf398098d72c5b20bd7f", size = 230312, upload-time = "2025-10-06T05:35:39.178Z" }, { url = "https://files.pythonhosted.org/packages/db/4b/87e95b5d15097c302430e647136b7d7ab2398a702390cf4c8601975709e7/frozenlist-1.8.0-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:20e63c9493d33ee48536600d1a5c95eefc870cd71e7ab037763d1fbb89cc51e7", size = 217650, upload-time = "2025-10-06T05:35:40.377Z" }, { url = "https://files.pythonhosted.org/packages/e5/70/78a0315d1fea97120591a83e0acd644da638c872f142fd72a6cebee825f3/frozenlist-1.8.0-cp310-cp310-win32.whl", hash = "sha256:adbeebaebae3526afc3c96fad434367cafbfd1b25d72369a9e5858453b1bb71a", size = 39659, upload-time = "2025-10-06T05:35:41.863Z" }, { url = "https://files.pythonhosted.org/packages/66/aa/3f04523fb189a00e147e60c5b2205126118f216b0aa908035c45336e27e4/frozenlist-1.8.0-cp310-cp310-win_amd64.whl", hash = "sha256:667c3777ca571e5dbeb76f331562ff98b957431df140b54c85fd4d52eea8d8f6", size = 43837, upload-time = "2025-10-06T05:35:43.205Z" }, { url = "https://files.pythonhosted.org/packages/39/75/1135feecdd7c336938bd55b4dc3b0dfc46d85b9be12ef2628574b28de776/frozenlist-1.8.0-cp310-cp310-win_arm64.whl", hash = "sha256:80f85f0a7cc86e7a54c46d99c9e1318ff01f4687c172ede30fd52d19d1da1c8e", size = 39989, upload-time = "2025-10-06T05:35:44.596Z" }, { url = "https://files.pythonhosted.org/packages/bc/03/077f869d540370db12165c0aa51640a873fb661d8b315d1d4d67b284d7ac/frozenlist-1.8.0-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:09474e9831bc2b2199fad6da3c14c7b0fbdd377cce9d3d77131be28906cb7d84", size = 86912, upload-time = "2025-10-06T05:35:45.98Z" }, { url = "https://files.pythonhosted.org/packages/df/b5/7610b6bd13e4ae77b96ba85abea1c8cb249683217ef09ac9e0ae93f25a91/frozenlist-1.8.0-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:17c883ab0ab67200b5f964d2b9ed6b00971917d5d8a92df149dc2c9779208ee9", size = 50046, upload-time = "2025-10-06T05:35:47.009Z" }, { url = "https://files.pythonhosted.org/packages/6e/ef/0e8f1fe32f8a53dd26bdd1f9347efe0778b0fddf62789ea683f4cc7d787d/frozenlist-1.8.0-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:fa47e444b8ba08fffd1c18e8cdb9a75db1b6a27f17507522834ad13ed5922b93", size = 50119, upload-time = "2025-10-06T05:35:48.38Z" }, { url = "https://files.pythonhosted.org/packages/11/b1/71a477adc7c36e5fb628245dfbdea2166feae310757dea848d02bd0689fd/frozenlist-1.8.0-cp311-cp311-manylinux1_x86_64.manylinux_2_28_x86_64.manylinux_2_5_x86_64.whl", hash = "sha256:2552f44204b744fba866e573be4c1f9048d6a324dfe14475103fd51613eb1d1f", size = 231067, upload-time = "2025-10-06T05:35:49.97Z" }, { url = "https://files.pythonhosted.org/packages/45/7e/afe40eca3a2dc19b9904c0f5d7edfe82b5304cb831391edec0ac04af94c2/frozenlist-1.8.0-cp311-cp311-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:957e7c38f250991e48a9a73e6423db1bb9dd14e722a10f6b8bb8e16a0f55f695", size = 233160, upload-time = "2025-10-06T05:35:51.729Z" }, { url = "https://files.pythonhosted.org/packages/a6/aa/7416eac95603ce428679d273255ffc7c998d4132cfae200103f164b108aa/frozenlist-1.8.0-cp311-cp311-manylinux2014_armv7l.manylinux_2_17_armv7l.manylinux_2_31_armv7l.whl", hash = "sha256:8585e3bb2cdea02fc88ffa245069c36555557ad3609e83be0ec71f54fd4abb52", size = 228544, upload-time = "2025-10-06T05:35:53.246Z" }, { url = "https://files.pythonhosted.org/packages/8b/3d/2a2d1f683d55ac7e3875e4263d28410063e738384d3adc294f5ff3d7105e/frozenlist-1.8.0-cp311-cp311-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:edee74874ce20a373d62dc28b0b18b93f645633c2943fd90ee9d898550770581", size = 243797, upload-time = "2025-10-06T05:35:54.497Z" }, { url = "https://files.pythonhosted.org/packages/78/1e/2d5565b589e580c296d3bb54da08d206e797d941a83a6fdea42af23be79c/frozenlist-1.8.0-cp311-cp311-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:c9a63152fe95756b85f31186bddf42e4c02c6321207fd6601a1c89ebac4fe567", size = 247923, upload-time = "2025-10-06T05:35:55.861Z" }, { url = "https://files.pythonhosted.org/packages/aa/c3/65872fcf1d326a7f101ad4d86285c403c87be7d832b7470b77f6d2ed5ddc/frozenlist-1.8.0-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:b6db2185db9be0a04fecf2f241c70b63b1a242e2805be291855078f2b404dd6b", size = 230886, upload-time = "2025-10-06T05:35:57.399Z" }, { url = "https://files.pythonhosted.org/packages/a0/76/ac9ced601d62f6956f03cc794f9e04c81719509f85255abf96e2510f4265/frozenlist-1.8.0-cp311-cp311-musllinux_1_2_armv7l.whl", hash = "sha256:f4be2e3d8bc8aabd566f8d5b8ba7ecc09249d74ba3c9ed52e54dc23a293f0b92", size = 245731, upload-time = "2025-10-06T05:35:58.563Z" }, { url = "https://files.pythonhosted.org/packages/b9/49/ecccb5f2598daf0b4a1415497eba4c33c1e8ce07495eb07d2860c731b8d5/frozenlist-1.8.0-cp311-cp311-musllinux_1_2_ppc64le.whl", hash = "sha256:c8d1634419f39ea6f5c427ea2f90ca85126b54b50837f31497f3bf38266e853d", size = 241544, upload-time = "2025-10-06T05:35:59.719Z" }, { url = "https://files.pythonhosted.org/packages/53/4b/ddf24113323c0bbcc54cb38c8b8916f1da7165e07b8e24a717b4a12cbf10/frozenlist-1.8.0-cp311-cp311-musllinux_1_2_s390x.whl", hash = "sha256:1a7fa382a4a223773ed64242dbe1c9c326ec09457e6b8428efb4118c685c3dfd", size = 241806, upload-time = "2025-10-06T05:36:00.959Z" }, { url = "https://files.pythonhosted.org/packages/a7/fb/9b9a084d73c67175484ba2789a59f8eebebd0827d186a8102005ce41e1ba/frozenlist-1.8.0-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:11847b53d722050808926e785df837353bd4d75f1d494377e59b23594d834967", size = 229382, upload-time = "2025-10-06T05:36:02.22Z" }, { url = "https://files.pythonhosted.org/packages/95/a3/c8fb25aac55bf5e12dae5c5aa6a98f85d436c1dc658f21c3ac73f9fa95e5/frozenlist-1.8.0-cp311-cp311-win32.whl", hash = "sha256:27c6e8077956cf73eadd514be8fb04d77fc946a7fe9f7fe167648b0b9085cc25", size = 39647, upload-time = "2025-10-06T05:36:03.409Z" }, { url = "https://files.pythonhosted.org/packages/0a/f5/603d0d6a02cfd4c8f2a095a54672b3cf967ad688a60fb9faf04fc4887f65/frozenlist-1.8.0-cp311-cp311-win_amd64.whl", hash = "sha256:ac913f8403b36a2c8610bbfd25b8013488533e71e62b4b4adce9c86c8cea905b", size = 44064, upload-time = "2025-10-06T05:36:04.368Z" }, { url = "https://files.pythonhosted.org/packages/5d/16/c2c9ab44e181f043a86f9a8f84d5124b62dbcb3a02c0977ec72b9ac1d3e0/frozenlist-1.8.0-cp311-cp311-win_arm64.whl", hash = "sha256:d4d3214a0f8394edfa3e303136d0575eece0745ff2b47bd2cb2e66dd92d4351a", size = 39937, upload-time = "2025-10-06T05:36:05.669Z" }, { url = "https://files.pythonhosted.org/packages/69/29/948b9aa87e75820a38650af445d2ef2b6b8a6fab1a23b6bb9e4ef0be2d59/frozenlist-1.8.0-cp312-cp312-macosx_10_13_universal2.whl", hash = "sha256:78f7b9e5d6f2fdb88cdde9440dc147259b62b9d3b019924def9f6478be254ac1", size = 87782, upload-time = "2025-10-06T05:36:06.649Z" }, { url = "https://files.pythonhosted.org/packages/64/80/4f6e318ee2a7c0750ed724fa33a4bdf1eacdc5a39a7a24e818a773cd91af/frozenlist-1.8.0-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:229bf37d2e4acdaf808fd3f06e854a4a7a3661e871b10dc1f8f1896a3b05f18b", size = 50594, upload-time = "2025-10-06T05:36:07.69Z" }, { url = "https://files.pythonhosted.org/packages/2b/94/5c8a2b50a496b11dd519f4a24cb5496cf125681dd99e94c604ccdea9419a/frozenlist-1.8.0-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:f833670942247a14eafbb675458b4e61c82e002a148f49e68257b79296e865c4", size = 50448, upload-time = "2025-10-06T05:36:08.78Z" }, { url = "https://files.pythonhosted.org/packages/6a/bd/d91c5e39f490a49df14320f4e8c80161cfcce09f1e2cde1edd16a551abb3/frozenlist-1.8.0-cp312-cp312-manylinux1_x86_64.manylinux_2_28_x86_64.manylinux_2_5_x86_64.whl", hash = "sha256:494a5952b1c597ba44e0e78113a7266e656b9794eec897b19ead706bd7074383", size = 242411, upload-time = "2025-10-06T05:36:09.801Z" }, { url = "https://files.pythonhosted.org/packages/8f/83/f61505a05109ef3293dfb1ff594d13d64a2324ac3482be2cedc2be818256/frozenlist-1.8.0-cp312-cp312-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:96f423a119f4777a4a056b66ce11527366a8bb92f54e541ade21f2374433f6d4", size = 243014, upload-time = "2025-10-06T05:36:11.394Z" }, { url = "https://files.pythonhosted.org/packages/d8/cb/cb6c7b0f7d4023ddda30cf56b8b17494eb3a79e3fda666bf735f63118b35/frozenlist-1.8.0-cp312-cp312-manylinux2014_armv7l.manylinux_2_17_armv7l.manylinux_2_31_armv7l.whl", hash = "sha256:3462dd9475af2025c31cc61be6652dfa25cbfb56cbbf52f4ccfe029f38decaf8", size = 234909, upload-time = "2025-10-06T05:36:12.598Z" }, { url = "https://files.pythonhosted.org/packages/31/c5/cd7a1f3b8b34af009fb17d4123c5a778b44ae2804e3ad6b86204255f9ec5/frozenlist-1.8.0-cp312-cp312-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:c4c800524c9cd9bac5166cd6f55285957fcfc907db323e193f2afcd4d9abd69b", size = 250049, upload-time = "2025-10-06T05:36:14.065Z" }, { url = "https://files.pythonhosted.org/packages/c0/01/2f95d3b416c584a1e7f0e1d6d31998c4a795f7544069ee2e0962a4b60740/frozenlist-1.8.0-cp312-cp312-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:d6a5df73acd3399d893dafc71663ad22534b5aa4f94e8a2fabfe856c3c1b6a52", size = 256485, upload-time = "2025-10-06T05:36:15.39Z" }, { url = "https://files.pythonhosted.org/packages/ce/03/024bf7720b3abaebcff6d0793d73c154237b85bdf67b7ed55e5e9596dc9a/frozenlist-1.8.0-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:405e8fe955c2280ce66428b3ca55e12b3c4e9c336fb2103a4937e891c69a4a29", size = 237619, upload-time = "2025-10-06T05:36:16.558Z" }, { url = "https://files.pythonhosted.org/packages/69/fa/f8abdfe7d76b731f5d8bd217827cf6764d4f1d9763407e42717b4bed50a0/frozenlist-1.8.0-cp312-cp312-musllinux_1_2_armv7l.whl", hash = "sha256:908bd3f6439f2fef9e85031b59fd4f1297af54415fb60e4254a95f75b3cab3f3", size = 250320, upload-time = "2025-10-06T05:36:17.821Z" }, { url = "https://files.pythonhosted.org/packages/f5/3c/b051329f718b463b22613e269ad72138cc256c540f78a6de89452803a47d/frozenlist-1.8.0-cp312-cp312-musllinux_1_2_ppc64le.whl", hash = "sha256:294e487f9ec720bd8ffcebc99d575f7eff3568a08a253d1ee1a0378754b74143", size = 246820, upload-time = "2025-10-06T05:36:19.046Z" }, { url = "https://files.pythonhosted.org/packages/0f/ae/58282e8f98e444b3f4dd42448ff36fa38bef29e40d40f330b22e7108f565/frozenlist-1.8.0-cp312-cp312-musllinux_1_2_s390x.whl", hash = "sha256:74c51543498289c0c43656701be6b077f4b265868fa7f8a8859c197006efb608", size = 250518, upload-time = "2025-10-06T05:36:20.763Z" }, { url = "https://files.pythonhosted.org/packages/8f/96/007e5944694d66123183845a106547a15944fbbb7154788cbf7272789536/frozenlist-1.8.0-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:776f352e8329135506a1d6bf16ac3f87bc25b28e765949282dcc627af36123aa", size = 239096, upload-time = "2025-10-06T05:36:22.129Z" }, { url = "https://files.pythonhosted.org/packages/66/bb/852b9d6db2fa40be96f29c0d1205c306288f0684df8fd26ca1951d461a56/frozenlist-1.8.0-cp312-cp312-win32.whl", hash = "sha256:433403ae80709741ce34038da08511d4a77062aa924baf411ef73d1146e74faf", size = 39985, upload-time = "2025-10-06T05:36:23.661Z" }, { url = "https://files.pythonhosted.org/packages/b8/af/38e51a553dd66eb064cdf193841f16f077585d4d28394c2fa6235cb41765/frozenlist-1.8.0-cp312-cp312-win_amd64.whl", hash = "sha256:34187385b08f866104f0c0617404c8eb08165ab1272e884abc89c112e9c00746", size = 44591, upload-time = "2025-10-06T05:36:24.958Z" }, { url = "https://files.pythonhosted.org/packages/a7/06/1dc65480ab147339fecc70797e9c2f69d9cea9cf38934ce08df070fdb9cb/frozenlist-1.8.0-cp312-cp312-win_arm64.whl", hash = "sha256:fe3c58d2f5db5fbd18c2987cba06d51b0529f52bc3a6cdc33d3f4eab725104bd", size = 40102, upload-time = "2025-10-06T05:36:26.333Z" }, { 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 = "ghp-import" version = "2.1.0" source = { registry = "https://pypi.org/simple" } dependencies = [ { name = "python-dateutil" }, ] sdist = { url = "https://files.pythonhosted.org/packages/d9/29/d40217cbe2f6b1359e00c6c307bb3fc876ba74068cbab3dde77f03ca0dc4/ghp-import-2.1.0.tar.gz", hash = "sha256:9c535c4c61193c2df8871222567d7fd7e5014d835f97dc7b7439069e2413d343", size = 10943, upload-time = "2022-05-02T15:47:16.11Z" } wheels = [ { url = "https://files.pythonhosted.org/packages/f7/ec/67fbef5d497f86283db54c22eec6f6140243aae73265799baaaa19cd17fb/ghp_import-2.1.0-py3-none-any.whl", hash = "sha256:8337dd7b50877f163d4c0289bc1f1c7f127550241988d568c1db512c4324a619", size = 11034, upload-time = "2022-05-02T15:47:14.552Z" }, ] [[package]] name = "identify" version = "2.6.15" source = { registry = "https://pypi.org/simple" } sdist = { url = "https://files.pythonhosted.org/packages/ff/e7/685de97986c916a6d93b3876139e00eef26ad5bbbd61925d670ae8013449/identify-2.6.15.tar.gz", hash = "sha256:e4f4864b96c6557ef2a1e1c951771838f4edc9df3a72ec7118b338801b11c7bf", size = 99311, upload-time = "2025-10-02T17:43:40.631Z" } wheels = [ { url = "https://files.pythonhosted.org/packages/0f/1c/e5fd8f973d4f375adb21565739498e2e9a1e54c858a97b9a8ccfdc81da9b/identify-2.6.15-py2.py3-none-any.whl", hash = "sha256:1181ef7608e00704db228516541eb83a88a9f94433a8c80bb9b5bd54b1d81757", size = 99183, upload-time = "2025-10-02T17:43:39.137Z" }, ] [[package]] name = "idna" version = "3.11" source = { registry = "https://pypi.org/simple" } sdist = { url = "https://files.pythonhosted.org/packages/6f/6d/0703ccc57f3a7233505399edb88de3cbd678da106337b9fcde432b65ed60/idna-3.11.tar.gz", hash = "sha256:795dafcc9c04ed0c1fb032c2aa73654d8e8c5023a7df64a53f39190ada629902", size = 194582, upload-time = "2025-10-12T14:55:20.501Z" } wheels = [ { url = "https://files.pythonhosted.org/packages/0e/61/66938bbb5fc52dbdf84594873d5b51fb1f7c7794e9c0f5bd885f30bc507b/idna-3.11-py3-none-any.whl", hash = "sha256:771a87f49d9defaf64091e6e6fe9c18d4833f140bd19464795bc32d966ca37ea", size = 71008, upload-time = "2025-10-12T14:55:18.883Z" }, ] [[package]] name = "ipython" version = "8.37.0" source = { registry = "https://pypi.org/simple" } resolution-markers = [ "python_full_version < '3.11'", ] dependencies = [ { name = "colorama", marker = "python_full_version < '3.11' and sys_platform == 'win32'" }, { name = "decorator", marker = "python_full_version < '3.11'" }, { name = "exceptiongroup", marker = "python_full_version < '3.11'" }, { name = "jedi", marker = "python_full_version < '3.11'" }, { name = "matplotlib-inline", marker = "python_full_version < '3.11'" }, { name = "pexpect", marker = "python_full_version < '3.11' and sys_platform != 'emscripten' and sys_platform != 'win32'" }, { name = "prompt-toolkit", marker = "python_full_version < '3.11'" }, { name = "pygments", marker = "python_full_version < '3.11'" }, { name = "stack-data", marker = "python_full_version < '3.11'" }, { name = "traitlets", marker = "python_full_version < '3.11'" }, { name = "typing-extensions", marker = "python_full_version < '3.11'" }, ] sdist = { url = "https://files.pythonhosted.org/packages/85/31/10ac88f3357fc276dc8a64e8880c82e80e7459326ae1d0a211b40abf6665/ipython-8.37.0.tar.gz", hash = "sha256:ca815841e1a41a1e6b73a0b08f3038af9b2252564d01fc405356d34033012216", size = 5606088, upload-time = "2025-05-31T16:39:09.613Z" } wheels = [ { url = "https://files.pythonhosted.org/packages/91/d0/274fbf7b0b12643cbbc001ce13e6a5b1607ac4929d1b11c72460152c9fc3/ipython-8.37.0-py3-none-any.whl", hash = "sha256:ed87326596b878932dbcb171e3e698845434d8c61b8d8cd474bf663041a9dcf2", size = 831864, upload-time = "2025-05-31T16:39:06.38Z" }, ] [[package]] name = "ipython" version = "9.6.0" source = { registry = "https://pypi.org/simple" } resolution-markers = [ "python_full_version >= '3.11'", ] dependencies = [ { name = "colorama", marker = "python_full_version >= '3.11' and sys_platform == 'win32'" }, { name = "decorator", marker = "python_full_version >= '3.11'" }, { name = "ipython-pygments-lexers", marker = "python_full_version >= '3.11'" }, { name = "jedi", marker = "python_full_version >= '3.11'" }, { name = "matplotlib-inline", marker = "python_full_version >= '3.11'" }, { name = "pexpect", marker = "python_full_version >= '3.11' and sys_platform != 'emscripten' and sys_platform != 'win32'" }, { name = "prompt-toolkit", marker = "python_full_version >= '3.11'" }, { name = "pygments", marker = "python_full_version >= '3.11'" }, { name = "stack-data", marker = "python_full_version >= '3.11'" }, { name = "traitlets", marker = "python_full_version >= '3.11'" }, { name = "typing-extensions", marker = "python_full_version == '3.11.*'" }, ] sdist = { url = "https://files.pythonhosted.org/packages/2a/34/29b18c62e39ee2f7a6a3bba7efd952729d8aadd45ca17efc34453b717665/ipython-9.6.0.tar.gz", hash = "sha256:5603d6d5d356378be5043e69441a072b50a5b33b4503428c77b04cb8ce7bc731", size = 4396932, upload-time = "2025-09-29T10:55:53.948Z" } wheels = [ { url = "https://files.pythonhosted.org/packages/48/c5/d5e07995077e48220269c28a221e168c91123ad5ceee44d548f54a057fc0/ipython-9.6.0-py3-none-any.whl", hash = "sha256:5f77efafc886d2f023442479b8149e7d86547ad0a979e9da9f045d252f648196", size = 616170, upload-time = "2025-09-29T10:55:47.676Z" }, ] [[package]] name = "ipython-pygments-lexers" version = "1.1.1" source = { registry = "https://pypi.org/simple" } dependencies = [ { name = "pygments", marker = "python_full_version >= '3.11'" }, ] sdist = { url = "https://files.pythonhosted.org/packages/ef/4c/5dd1d8af08107f88c7f741ead7a40854b8ac24ddf9ae850afbcf698aa552/ipython_pygments_lexers-1.1.1.tar.gz", hash = "sha256:09c0138009e56b6854f9535736f4171d855c8c08a563a0dcd8022f78355c7e81", size = 8393, upload-time = "2025-01-17T11:24:34.505Z" } wheels = [ { url = "https://files.pythonhosted.org/packages/d9/33/1f075bf72b0b747cb3288d011319aaf64083cf2efef8354174e3ed4540e2/ipython_pygments_lexers-1.1.1-py3-none-any.whl", hash = "sha256:a9462224a505ade19a605f71f8fa63c2048833ce50abc86768a0d81d876dc81c", size = 8074, upload-time = "2025-01-17T11:24:33.271Z" }, ] [[package]] name = "jedi" version = "0.19.2" source = { registry = "https://pypi.org/simple" } dependencies = [ { name = "parso" }, ] sdist = { url = "https://files.pythonhosted.org/packages/72/3a/79a912fbd4d8dd6fbb02bf69afd3bb72cf0c729bb3063c6f4498603db17a/jedi-0.19.2.tar.gz", hash = "sha256:4770dc3de41bde3966b02eb84fbcf557fb33cce26ad23da12c742fb50ecb11f0", size = 1231287, upload-time = "2024-11-11T01:41:42.873Z" } wheels = [ { url = "https://files.pythonhosted.org/packages/c0/5a/9cac0c82afec3d09ccd97c8b6502d48f165f9124db81b4bcb90b4af974ee/jedi-0.19.2-py2.py3-none-any.whl", hash = "sha256:a8ef22bde8490f57fe5c7681a3c83cb58874daf72b4784de3cce5b6ef6edb5b9", size = 1572278, upload-time = "2024-11-11T01:41:40.175Z" }, ] [[package]] name = "jinja2" version = "3.1.6" source = { registry = "https://pypi.org/simple" } dependencies = [ { name = "markupsafe" }, ] sdist = { url = "https://files.pythonhosted.org/packages/df/bf/f7da0350254c0ed7c72f3e33cef02e048281fec7ecec5f032d4aac52226b/jinja2-3.1.6.tar.gz", hash = "sha256:0137fb05990d35f1275a587e9aee6d56da821fc83491a0fb838183be43f66d6d", size = 245115, upload-time = "2025-03-05T20:05:02.478Z" } wheels = [ { url = "https://files.pythonhosted.org/packages/62/a1/3d680cbfd5f4b8f15abc1d571870c5fc3e594bb582bc3b64ea099db13e56/jinja2-3.1.6-py3-none-any.whl", hash = "sha256:85ece4451f492d0c13c5dd7c13a64681a86afae63a5f347908daf103ce6d2f67", size = 134899, upload-time = "2025-03-05T20:05:00.369Z" }, ] [[package]] name = "markdown" version = "3.9" source = { registry = "https://pypi.org/simple" } sdist = { url = "https://files.pythonhosted.org/packages/8d/37/02347f6d6d8279247a5837082ebc26fc0d5aaeaf75aa013fcbb433c777ab/markdown-3.9.tar.gz", hash = "sha256:d2900fe1782bd33bdbbd56859defef70c2e78fc46668f8eb9df3128138f2cb6a", size = 364585, upload-time = "2025-09-04T20:25:22.885Z" } wheels = [ { url = "https://files.pythonhosted.org/packages/70/ae/44c4a6a4cbb496d93c6257954260fe3a6e91b7bed2240e5dad2a717f5111/markdown-3.9-py3-none-any.whl", hash = "sha256:9f4d91ed810864ea88a6f32c07ba8bee1346c0cc1f6b1f9f6c822f2a9667d280", size = 107441, upload-time = "2025-09-04T20:25:21.784Z" }, ] [[package]] name = "markupsafe" version = "3.0.3" source = { registry = "https://pypi.org/simple" } sdist = { url = "https://files.pythonhosted.org/packages/7e/99/7690b6d4034fffd95959cbe0c02de8deb3098cc577c67bb6a24fe5d7caa7/markupsafe-3.0.3.tar.gz", hash = "sha256:722695808f4b6457b320fdc131280796bdceb04ab50fe1795cd540799ebe1698", size = 80313, upload-time = "2025-09-27T18:37:40.426Z" } wheels = [ { url = "https://files.pythonhosted.org/packages/e8/4b/3541d44f3937ba468b75da9eebcae497dcf67adb65caa16760b0a6807ebb/markupsafe-3.0.3-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:2f981d352f04553a7171b8e44369f2af4055f888dfb147d55e42d29e29e74559", size = 11631, upload-time = "2025-09-27T18:36:05.558Z" }, { url = "https://files.pythonhosted.org/packages/98/1b/fbd8eed11021cabd9226c37342fa6ca4e8a98d8188a8d9b66740494960e4/markupsafe-3.0.3-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:e1c1493fb6e50ab01d20a22826e57520f1284df32f2d8601fdd90b6304601419", size = 12057, upload-time = "2025-09-27T18:36:07.165Z" }, { url = "https://files.pythonhosted.org/packages/40/01/e560d658dc0bb8ab762670ece35281dec7b6c1b33f5fbc09ebb57a185519/markupsafe-3.0.3-cp310-cp310-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:1ba88449deb3de88bd40044603fafffb7bc2b055d626a330323a9ed736661695", size = 22050, upload-time = "2025-09-27T18:36:08.005Z" }, { url = "https://files.pythonhosted.org/packages/af/cd/ce6e848bbf2c32314c9b237839119c5a564a59725b53157c856e90937b7a/markupsafe-3.0.3-cp310-cp310-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:f42d0984e947b8adf7dd6dde396e720934d12c506ce84eea8476409563607591", size = 20681, upload-time = "2025-09-27T18:36:08.881Z" }, { url = "https://files.pythonhosted.org/packages/c9/2a/b5c12c809f1c3045c4d580b035a743d12fcde53cf685dbc44660826308da/markupsafe-3.0.3-cp310-cp310-manylinux_2_31_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:c0c0b3ade1c0b13b936d7970b1d37a57acde9199dc2aecc4c336773e1d86049c", size = 20705, upload-time = "2025-09-27T18:36:10.131Z" }, { url = "https://files.pythonhosted.org/packages/cf/e3/9427a68c82728d0a88c50f890d0fc072a1484de2f3ac1ad0bfc1a7214fd5/markupsafe-3.0.3-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:0303439a41979d9e74d18ff5e2dd8c43ed6c6001fd40e5bf2e43f7bd9bbc523f", size = 21524, upload-time = "2025-09-27T18:36:11.324Z" }, { url = "https://files.pythonhosted.org/packages/bc/36/23578f29e9e582a4d0278e009b38081dbe363c5e7165113fad546918a232/markupsafe-3.0.3-cp310-cp310-musllinux_1_2_riscv64.whl", hash = "sha256:d2ee202e79d8ed691ceebae8e0486bd9a2cd4794cec4824e1c99b6f5009502f6", size = 20282, upload-time = "2025-09-27T18:36:12.573Z" }, { url = "https://files.pythonhosted.org/packages/56/21/dca11354e756ebd03e036bd8ad58d6d7168c80ce1fe5e75218e4945cbab7/markupsafe-3.0.3-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:177b5253b2834fe3678cb4a5f0059808258584c559193998be2601324fdeafb1", size = 20745, upload-time = "2025-09-27T18:36:13.504Z" }, { url = "https://files.pythonhosted.org/packages/87/99/faba9369a7ad6e4d10b6a5fbf71fa2a188fe4a593b15f0963b73859a1bbd/markupsafe-3.0.3-cp310-cp310-win32.whl", hash = "sha256:2a15a08b17dd94c53a1da0438822d70ebcd13f8c3a95abe3a9ef9f11a94830aa", size = 14571, upload-time = "2025-09-27T18:36:14.779Z" }, { url = "https://files.pythonhosted.org/packages/d6/25/55dc3ab959917602c96985cb1253efaa4ff42f71194bddeb61eb7278b8be/markupsafe-3.0.3-cp310-cp310-win_amd64.whl", hash = "sha256:c4ffb7ebf07cfe8931028e3e4c85f0357459a3f9f9490886198848f4fa002ec8", size = 15056, upload-time = "2025-09-27T18:36:16.125Z" }, { url = "https://files.pythonhosted.org/packages/d0/9e/0a02226640c255d1da0b8d12e24ac2aa6734da68bff14c05dd53b94a0fc3/markupsafe-3.0.3-cp310-cp310-win_arm64.whl", hash = "sha256:e2103a929dfa2fcaf9bb4e7c091983a49c9ac3b19c9061b6d5427dd7d14d81a1", size = 13932, upload-time = "2025-09-27T18:36:17.311Z" }, { url = "https://files.pythonhosted.org/packages/08/db/fefacb2136439fc8dd20e797950e749aa1f4997ed584c62cfb8ef7c2be0e/markupsafe-3.0.3-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:1cc7ea17a6824959616c525620e387f6dd30fec8cb44f649e31712db02123dad", size = 11631, upload-time = "2025-09-27T18:36:18.185Z" }, { url = "https://files.pythonhosted.org/packages/e1/2e/5898933336b61975ce9dc04decbc0a7f2fee78c30353c5efba7f2d6ff27a/markupsafe-3.0.3-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:4bd4cd07944443f5a265608cc6aab442e4f74dff8088b0dfc8238647b8f6ae9a", size = 12058, upload-time = "2025-09-27T18:36:19.444Z" }, { url = "https://files.pythonhosted.org/packages/1d/09/adf2df3699d87d1d8184038df46a9c80d78c0148492323f4693df54e17bb/markupsafe-3.0.3-cp311-cp311-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:6b5420a1d9450023228968e7e6a9ce57f65d148ab56d2313fcd589eee96a7a50", size = 24287, upload-time = "2025-09-27T18:36:20.768Z" }, { url = "https://files.pythonhosted.org/packages/30/ac/0273f6fcb5f42e314c6d8cd99effae6a5354604d461b8d392b5ec9530a54/markupsafe-3.0.3-cp311-cp311-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:0bf2a864d67e76e5c9a34dc26ec616a66b9888e25e7b9460e1c76d3293bd9dbf", size = 22940, upload-time = "2025-09-27T18:36:22.249Z" }, { url = "https://files.pythonhosted.org/packages/19/ae/31c1be199ef767124c042c6c3e904da327a2f7f0cd63a0337e1eca2967a8/markupsafe-3.0.3-cp311-cp311-manylinux_2_31_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:bc51efed119bc9cfdf792cdeaa4d67e8f6fcccab66ed4bfdd6bde3e59bfcbb2f", size = 21887, upload-time = "2025-09-27T18:36:23.535Z" }, { url = "https://files.pythonhosted.org/packages/b2/76/7edcab99d5349a4532a459e1fe64f0b0467a3365056ae550d3bcf3f79e1e/markupsafe-3.0.3-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:068f375c472b3e7acbe2d5318dea141359e6900156b5b2ba06a30b169086b91a", size = 23692, upload-time = "2025-09-27T18:36:24.823Z" }, { url = "https://files.pythonhosted.org/packages/a4/28/6e74cdd26d7514849143d69f0bf2399f929c37dc2b31e6829fd2045b2765/markupsafe-3.0.3-cp311-cp311-musllinux_1_2_riscv64.whl", hash = "sha256:7be7b61bb172e1ed687f1754f8e7484f1c8019780f6f6b0786e76bb01c2ae115", size = 21471, upload-time = "2025-09-27T18:36:25.95Z" }, { url = "https://files.pythonhosted.org/packages/62/7e/a145f36a5c2945673e590850a6f8014318d5577ed7e5920a4b3448e0865d/markupsafe-3.0.3-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:f9e130248f4462aaa8e2552d547f36ddadbeaa573879158d721bbd33dfe4743a", size = 22923, upload-time = "2025-09-27T18:36:27.109Z" }, { url = "https://files.pythonhosted.org/packages/0f/62/d9c46a7f5c9adbeeeda52f5b8d802e1094e9717705a645efc71b0913a0a8/markupsafe-3.0.3-cp311-cp311-win32.whl", hash = "sha256:0db14f5dafddbb6d9208827849fad01f1a2609380add406671a26386cdf15a19", size = 14572, upload-time = "2025-09-27T18:36:28.045Z" }, { url = "https://files.pythonhosted.org/packages/83/8a/4414c03d3f891739326e1783338e48fb49781cc915b2e0ee052aa490d586/markupsafe-3.0.3-cp311-cp311-win_amd64.whl", hash = "sha256:de8a88e63464af587c950061a5e6a67d3632e36df62b986892331d4620a35c01", size = 15077, upload-time = "2025-09-27T18:36:29.025Z" }, { url = "https://files.pythonhosted.org/packages/35/73/893072b42e6862f319b5207adc9ae06070f095b358655f077f69a35601f0/markupsafe-3.0.3-cp311-cp311-win_arm64.whl", hash = "sha256:3b562dd9e9ea93f13d53989d23a7e775fdfd1066c33494ff43f5418bc8c58a5c", size = 13876, upload-time = "2025-09-27T18:36:29.954Z" }, { url = "https://files.pythonhosted.org/packages/5a/72/147da192e38635ada20e0a2e1a51cf8823d2119ce8883f7053879c2199b5/markupsafe-3.0.3-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:d53197da72cc091b024dd97249dfc7794d6a56530370992a5e1a08983ad9230e", size = 11615, upload-time = "2025-09-27T18:36:30.854Z" }, { url = "https://files.pythonhosted.org/packages/9a/81/7e4e08678a1f98521201c3079f77db69fb552acd56067661f8c2f534a718/markupsafe-3.0.3-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:1872df69a4de6aead3491198eaf13810b565bdbeec3ae2dc8780f14458ec73ce", size = 12020, upload-time = "2025-09-27T18:36:31.971Z" }, { url = "https://files.pythonhosted.org/packages/1e/2c/799f4742efc39633a1b54a92eec4082e4f815314869865d876824c257c1e/markupsafe-3.0.3-cp312-cp312-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:3a7e8ae81ae39e62a41ec302f972ba6ae23a5c5396c8e60113e9066ef893da0d", size = 24332, upload-time = "2025-09-27T18:36:32.813Z" }, { url = "https://files.pythonhosted.org/packages/3c/2e/8d0c2ab90a8c1d9a24f0399058ab8519a3279d1bd4289511d74e909f060e/markupsafe-3.0.3-cp312-cp312-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:d6dd0be5b5b189d31db7cda48b91d7e0a9795f31430b7f271219ab30f1d3ac9d", size = 22947, upload-time = "2025-09-27T18:36:33.86Z" }, { url = "https://files.pythonhosted.org/packages/2c/54/887f3092a85238093a0b2154bd629c89444f395618842e8b0c41783898ea/markupsafe-3.0.3-cp312-cp312-manylinux_2_31_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:94c6f0bb423f739146aec64595853541634bde58b2135f27f61c1ffd1cd4d16a", size = 21962, upload-time = "2025-09-27T18:36:35.099Z" }, { url = "https://files.pythonhosted.org/packages/c9/2f/336b8c7b6f4a4d95e91119dc8521402461b74a485558d8f238a68312f11c/markupsafe-3.0.3-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:be8813b57049a7dc738189df53d69395eba14fb99345e0a5994914a3864c8a4b", size = 23760, upload-time = "2025-09-27T18:36:36.001Z" }, { url = "https://files.pythonhosted.org/packages/32/43/67935f2b7e4982ffb50a4d169b724d74b62a3964bc1a9a527f5ac4f1ee2b/markupsafe-3.0.3-cp312-cp312-musllinux_1_2_riscv64.whl", hash = "sha256:83891d0e9fb81a825d9a6d61e3f07550ca70a076484292a70fde82c4b807286f", size = 21529, upload-time = "2025-09-27T18:36:36.906Z" }, { url = "https://files.pythonhosted.org/packages/89/e0/4486f11e51bbba8b0c041098859e869e304d1c261e59244baa3d295d47b7/markupsafe-3.0.3-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:77f0643abe7495da77fb436f50f8dab76dbc6e5fd25d39589a0f1fe6548bfa2b", size = 23015, upload-time = "2025-09-27T18:36:37.868Z" }, { url = "https://files.pythonhosted.org/packages/2f/e1/78ee7a023dac597a5825441ebd17170785a9dab23de95d2c7508ade94e0e/markupsafe-3.0.3-cp312-cp312-win32.whl", hash = "sha256:d88b440e37a16e651bda4c7c2b930eb586fd15ca7406cb39e211fcff3bf3017d", size = 14540, upload-time = "2025-09-27T18:36:38.761Z" }, { url = "https://files.pythonhosted.org/packages/aa/5b/bec5aa9bbbb2c946ca2733ef9c4ca91c91b6a24580193e891b5f7dbe8e1e/markupsafe-3.0.3-cp312-cp312-win_amd64.whl", hash = "sha256:26a5784ded40c9e318cfc2bdb30fe164bdb8665ded9cd64d500a34fb42067b1c", size = 15105, upload-time = "2025-09-27T18:36:39.701Z" }, { url = "https://files.pythonhosted.org/packages/e5/f1/216fc1bbfd74011693a4fd837e7026152e89c4bcf3e77b6692fba9923123/markupsafe-3.0.3-cp312-cp312-win_arm64.whl", hash = "sha256:35add3b638a5d900e807944a078b51922212fb3dedb01633a8defc4b01a3c85f", size = 13906, upload-time = "2025-09-27T18:36:40.689Z" }, { url = "https://files.pythonhosted.org/packages/38/2f/907b9c7bbba283e68f20259574b13d005c121a0fa4c175f9bed27c4597ff/markupsafe-3.0.3-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:e1cf1972137e83c5d4c136c43ced9ac51d0e124706ee1c8aa8532c1287fa8795", size = 11622, upload-time = "2025-09-27T18:36:41.777Z" }, { url = "https://files.pythonhosted.org/packages/9c/d9/5f7756922cdd676869eca1c4e3c0cd0df60ed30199ffd775e319089cb3ed/markupsafe-3.0.3-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:116bb52f642a37c115f517494ea5feb03889e04df47eeff5b130b1808ce7c219", size = 12029, upload-time = "2025-09-27T18:36:43.257Z" }, { url = "https://files.pythonhosted.org/packages/00/07/575a68c754943058c78f30db02ee03a64b3c638586fba6a6dd56830b30a3/markupsafe-3.0.3-cp313-cp313-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:133a43e73a802c5562be9bbcd03d090aa5a1fe899db609c29e8c8d815c5f6de6", size = 24374, upload-time = "2025-09-27T18:36:44.508Z" }, { url = "https://files.pythonhosted.org/packages/a9/21/9b05698b46f218fc0e118e1f8168395c65c8a2c750ae2bab54fc4bd4e0e8/markupsafe-3.0.3-cp313-cp313-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:ccfcd093f13f0f0b7fdd0f198b90053bf7b2f02a3927a30e63f3ccc9df56b676", size = 22980, upload-time = "2025-09-27T18:36:45.385Z" }, { url = "https://files.pythonhosted.org/packages/7f/71/544260864f893f18b6827315b988c146b559391e6e7e8f7252839b1b846a/markupsafe-3.0.3-cp313-cp313-manylinux_2_31_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:509fa21c6deb7a7a273d629cf5ec029bc209d1a51178615ddf718f5918992ab9", size = 21990, upload-time = "2025-09-27T18:36:46.916Z" }, { url = "https://files.pythonhosted.org/packages/c2/28/b50fc2f74d1ad761af2f5dcce7492648b983d00a65b8c0e0cb457c82ebbe/markupsafe-3.0.3-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:a4afe79fb3de0b7097d81da19090f4df4f8d3a2b3adaa8764138aac2e44f3af1", size = 23784, upload-time = "2025-09-27T18:36:47.884Z" }, { url = "https://files.pythonhosted.org/packages/ed/76/104b2aa106a208da8b17a2fb72e033a5a9d7073c68f7e508b94916ed47a9/markupsafe-3.0.3-cp313-cp313-musllinux_1_2_riscv64.whl", hash = "sha256:795e7751525cae078558e679d646ae45574b47ed6e7771863fcc079a6171a0fc", size = 21588, upload-time = "2025-09-27T18:36:48.82Z" }, { url = "https://files.pythonhosted.org/packages/b5/99/16a5eb2d140087ebd97180d95249b00a03aa87e29cc224056274f2e45fd6/markupsafe-3.0.3-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:8485f406a96febb5140bfeca44a73e3ce5116b2501ac54fe953e488fb1d03b12", size = 23041, upload-time = "2025-09-27T18:36:49.797Z" }, { url = "https://files.pythonhosted.org/packages/19/bc/e7140ed90c5d61d77cea142eed9f9c303f4c4806f60a1044c13e3f1471d0/markupsafe-3.0.3-cp313-cp313-win32.whl", hash = "sha256:bdd37121970bfd8be76c5fb069c7751683bdf373db1ed6c010162b2a130248ed", size = 14543, upload-time = "2025-09-27T18:36:51.584Z" }, { url = "https://files.pythonhosted.org/packages/05/73/c4abe620b841b6b791f2edc248f556900667a5a1cf023a6646967ae98335/markupsafe-3.0.3-cp313-cp313-win_amd64.whl", hash = "sha256:9a1abfdc021a164803f4d485104931fb8f8c1efd55bc6b748d2f5774e78b62c5", size = 15113, upload-time = "2025-09-27T18:36:52.537Z" }, { url = "https://files.pythonhosted.org/packages/f0/3a/fa34a0f7cfef23cf9500d68cb7c32dd64ffd58a12b09225fb03dd37d5b80/markupsafe-3.0.3-cp313-cp313-win_arm64.whl", hash = "sha256:7e68f88e5b8799aa49c85cd116c932a1ac15caaa3f5db09087854d218359e485", size = 13911, upload-time = "2025-09-27T18:36:53.513Z" }, { url = "https://files.pythonhosted.org/packages/e4/d7/e05cd7efe43a88a17a37b3ae96e79a19e846f3f456fe79c57ca61356ef01/markupsafe-3.0.3-cp313-cp313t-macosx_10_13_x86_64.whl", hash = "sha256:218551f6df4868a8d527e3062d0fb968682fe92054e89978594c28e642c43a73", size = 11658, upload-time = "2025-09-27T18:36:54.819Z" }, { url = "https://files.pythonhosted.org/packages/99/9e/e412117548182ce2148bdeacdda3bb494260c0b0184360fe0d56389b523b/markupsafe-3.0.3-cp313-cp313t-macosx_11_0_arm64.whl", hash = "sha256:3524b778fe5cfb3452a09d31e7b5adefeea8c5be1d43c4f810ba09f2ceb29d37", size = 12066, upload-time = "2025-09-27T18:36:55.714Z" }, { url = "https://files.pythonhosted.org/packages/bc/e6/fa0ffcda717ef64a5108eaa7b4f5ed28d56122c9a6d70ab8b72f9f715c80/markupsafe-3.0.3-cp313-cp313t-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:4e885a3d1efa2eadc93c894a21770e4bc67899e3543680313b09f139e149ab19", size = 25639, upload-time = "2025-09-27T18:36:56.908Z" }, { url = "https://files.pythonhosted.org/packages/96/ec/2102e881fe9d25fc16cb4b25d5f5cde50970967ffa5dddafdb771237062d/markupsafe-3.0.3-cp313-cp313t-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:8709b08f4a89aa7586de0aadc8da56180242ee0ada3999749b183aa23df95025", size = 23569, upload-time = "2025-09-27T18:36:57.913Z" }, { url = "https://files.pythonhosted.org/packages/4b/30/6f2fce1f1f205fc9323255b216ca8a235b15860c34b6798f810f05828e32/markupsafe-3.0.3-cp313-cp313t-manylinux_2_31_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:b8512a91625c9b3da6f127803b166b629725e68af71f8184ae7e7d54686a56d6", size = 23284, upload-time = "2025-09-27T18:36:58.833Z" }, { url = "https://files.pythonhosted.org/packages/58/47/4a0ccea4ab9f5dcb6f79c0236d954acb382202721e704223a8aafa38b5c8/markupsafe-3.0.3-cp313-cp313t-musllinux_1_2_aarch64.whl", hash = "sha256:9b79b7a16f7fedff2495d684f2b59b0457c3b493778c9eed31111be64d58279f", size = 24801, upload-time = "2025-09-27T18:36:59.739Z" }, { url = "https://files.pythonhosted.org/packages/6a/70/3780e9b72180b6fecb83a4814d84c3bf4b4ae4bf0b19c27196104149734c/markupsafe-3.0.3-cp313-cp313t-musllinux_1_2_riscv64.whl", hash = "sha256:12c63dfb4a98206f045aa9563db46507995f7ef6d83b2f68eda65c307c6829eb", size = 22769, upload-time = "2025-09-27T18:37:00.719Z" }, { url = "https://files.pythonhosted.org/packages/98/c5/c03c7f4125180fc215220c035beac6b9cb684bc7a067c84fc69414d315f5/markupsafe-3.0.3-cp313-cp313t-musllinux_1_2_x86_64.whl", hash = "sha256:8f71bc33915be5186016f675cd83a1e08523649b0e33efdb898db577ef5bb009", size = 23642, upload-time = "2025-09-27T18:37:01.673Z" }, { url = "https://files.pythonhosted.org/packages/80/d6/2d1b89f6ca4bff1036499b1e29a1d02d282259f3681540e16563f27ebc23/markupsafe-3.0.3-cp313-cp313t-win32.whl", hash = "sha256:69c0b73548bc525c8cb9a251cddf1931d1db4d2258e9599c28c07ef3580ef354", size = 14612, upload-time = "2025-09-27T18:37:02.639Z" }, { url = "https://files.pythonhosted.org/packages/2b/98/e48a4bfba0a0ffcf9925fe2d69240bfaa19c6f7507b8cd09c70684a53c1e/markupsafe-3.0.3-cp313-cp313t-win_amd64.whl", hash = "sha256:1b4b79e8ebf6b55351f0d91fe80f893b4743f104bff22e90697db1590e47a218", size = 15200, upload-time = "2025-09-27T18:37:03.582Z" }, { url = "https://files.pythonhosted.org/packages/0e/72/e3cc540f351f316e9ed0f092757459afbc595824ca724cbc5a5d4263713f/markupsafe-3.0.3-cp313-cp313t-win_arm64.whl", hash = "sha256:ad2cf8aa28b8c020ab2fc8287b0f823d0a7d8630784c31e9ee5edea20f406287", size = 13973, upload-time = "2025-09-27T18:37:04.929Z" }, { url = "https://files.pythonhosted.org/packages/33/8a/8e42d4838cd89b7dde187011e97fe6c3af66d8c044997d2183fbd6d31352/markupsafe-3.0.3-cp314-cp314-macosx_10_13_x86_64.whl", hash = "sha256:eaa9599de571d72e2daf60164784109f19978b327a3910d3e9de8c97b5b70cfe", size = 11619, upload-time = "2025-09-27T18:37:06.342Z" }, { url = "https://files.pythonhosted.org/packages/b5/64/7660f8a4a8e53c924d0fa05dc3a55c9cee10bbd82b11c5afb27d44b096ce/markupsafe-3.0.3-cp314-cp314-macosx_11_0_arm64.whl", hash = "sha256:c47a551199eb8eb2121d4f0f15ae0f923d31350ab9280078d1e5f12b249e0026", size = 12029, upload-time = "2025-09-27T18:37:07.213Z" }, { url = "https://files.pythonhosted.org/packages/da/ef/e648bfd021127bef5fa12e1720ffed0c6cbb8310c8d9bea7266337ff06de/markupsafe-3.0.3-cp314-cp314-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:f34c41761022dd093b4b6896d4810782ffbabe30f2d443ff5f083e0cbbb8c737", size = 24408, upload-time = "2025-09-27T18:37:09.572Z" }, { url = "https://files.pythonhosted.org/packages/41/3c/a36c2450754618e62008bf7435ccb0f88053e07592e6028a34776213d877/markupsafe-3.0.3-cp314-cp314-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:457a69a9577064c05a97c41f4e65148652db078a3a509039e64d3467b9e7ef97", size = 23005, upload-time = "2025-09-27T18:37:10.58Z" }, { url = "https://files.pythonhosted.org/packages/bc/20/b7fdf89a8456b099837cd1dc21974632a02a999ec9bf7ca3e490aacd98e7/markupsafe-3.0.3-cp314-cp314-manylinux_2_31_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:e8afc3f2ccfa24215f8cb28dcf43f0113ac3c37c2f0f0806d8c70e4228c5cf4d", size = 22048, upload-time = "2025-09-27T18:37:11.547Z" }, { url = "https://files.pythonhosted.org/packages/9a/a7/591f592afdc734f47db08a75793a55d7fbcc6902a723ae4cfbab61010cc5/markupsafe-3.0.3-cp314-cp314-musllinux_1_2_aarch64.whl", hash = "sha256:ec15a59cf5af7be74194f7ab02d0f59a62bdcf1a537677ce67a2537c9b87fcda", size = 23821, upload-time = "2025-09-27T18:37:12.48Z" }, { url = "https://files.pythonhosted.org/packages/7d/33/45b24e4f44195b26521bc6f1a82197118f74df348556594bd2262bda1038/markupsafe-3.0.3-cp314-cp314-musllinux_1_2_riscv64.whl", hash = "sha256:0eb9ff8191e8498cca014656ae6b8d61f39da5f95b488805da4bb029cccbfbaf", size = 21606, upload-time = "2025-09-27T18:37:13.485Z" }, { url = "https://files.pythonhosted.org/packages/ff/0e/53dfaca23a69fbfbbf17a4b64072090e70717344c52eaaaa9c5ddff1e5f0/markupsafe-3.0.3-cp314-cp314-musllinux_1_2_x86_64.whl", hash = "sha256:2713baf880df847f2bece4230d4d094280f4e67b1e813eec43b4c0e144a34ffe", size = 23043, upload-time = "2025-09-27T18:37:14.408Z" }, { url = "https://files.pythonhosted.org/packages/46/11/f333a06fc16236d5238bfe74daccbca41459dcd8d1fa952e8fbd5dccfb70/markupsafe-3.0.3-cp314-cp314-win32.whl", hash = "sha256:729586769a26dbceff69f7a7dbbf59ab6572b99d94576a5592625d5b411576b9", size = 14747, upload-time = "2025-09-27T18:37:15.36Z" }, { url = "https://files.pythonhosted.org/packages/28/52/182836104b33b444e400b14f797212f720cbc9ed6ba34c800639d154e821/markupsafe-3.0.3-cp314-cp314-win_amd64.whl", hash = "sha256:bdc919ead48f234740ad807933cdf545180bfbe9342c2bb451556db2ed958581", size = 15341, upload-time = "2025-09-27T18:37:16.496Z" }, { url = "https://files.pythonhosted.org/packages/6f/18/acf23e91bd94fd7b3031558b1f013adfa21a8e407a3fdb32745538730382/markupsafe-3.0.3-cp314-cp314-win_arm64.whl", hash = "sha256:5a7d5dc5140555cf21a6fefbdbf8723f06fcd2f63ef108f2854de715e4422cb4", size = 14073, upload-time = "2025-09-27T18:37:17.476Z" }, { url = "https://files.pythonhosted.org/packages/3c/f0/57689aa4076e1b43b15fdfa646b04653969d50cf30c32a102762be2485da/markupsafe-3.0.3-cp314-cp314t-macosx_10_13_x86_64.whl", hash = "sha256:1353ef0c1b138e1907ae78e2f6c63ff67501122006b0f9abad68fda5f4ffc6ab", size = 11661, upload-time = "2025-09-27T18:37:18.453Z" }, { url = "https://files.pythonhosted.org/packages/89/c3/2e67a7ca217c6912985ec766c6393b636fb0c2344443ff9d91404dc4c79f/markupsafe-3.0.3-cp314-cp314t-macosx_11_0_arm64.whl", hash = "sha256:1085e7fbddd3be5f89cc898938f42c0b3c711fdcb37d75221de2666af647c175", size = 12069, upload-time = "2025-09-27T18:37:19.332Z" }, { url = "https://files.pythonhosted.org/packages/f0/00/be561dce4e6ca66b15276e184ce4b8aec61fe83662cce2f7d72bd3249d28/markupsafe-3.0.3-cp314-cp314t-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:1b52b4fb9df4eb9ae465f8d0c228a00624de2334f216f178a995ccdcf82c4634", size = 25670, upload-time = "2025-09-27T18:37:20.245Z" }, { url = "https://files.pythonhosted.org/packages/50/09/c419f6f5a92e5fadde27efd190eca90f05e1261b10dbd8cbcb39cd8ea1dc/markupsafe-3.0.3-cp314-cp314t-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:fed51ac40f757d41b7c48425901843666a6677e3e8eb0abcff09e4ba6e664f50", size = 23598, upload-time = "2025-09-27T18:37:21.177Z" }, { url = "https://files.pythonhosted.org/packages/22/44/a0681611106e0b2921b3033fc19bc53323e0b50bc70cffdd19f7d679bb66/markupsafe-3.0.3-cp314-cp314t-manylinux_2_31_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:f190daf01f13c72eac4efd5c430a8de82489d9cff23c364c3ea822545032993e", size = 23261, upload-time = "2025-09-27T18:37:22.167Z" }, { url = "https://files.pythonhosted.org/packages/5f/57/1b0b3f100259dc9fffe780cfb60d4be71375510e435efec3d116b6436d43/markupsafe-3.0.3-cp314-cp314t-musllinux_1_2_aarch64.whl", hash = "sha256:e56b7d45a839a697b5eb268c82a71bd8c7f6c94d6fd50c3d577fa39a9f1409f5", size = 24835, upload-time = "2025-09-27T18:37:23.296Z" }, { url = "https://files.pythonhosted.org/packages/26/6a/4bf6d0c97c4920f1597cc14dd720705eca0bf7c787aebc6bb4d1bead5388/markupsafe-3.0.3-cp314-cp314t-musllinux_1_2_riscv64.whl", hash = "sha256:f3e98bb3798ead92273dc0e5fd0f31ade220f59a266ffd8a4f6065e0a3ce0523", size = 22733, upload-time = "2025-09-27T18:37:24.237Z" }, { url = "https://files.pythonhosted.org/packages/14/c7/ca723101509b518797fedc2fdf79ba57f886b4aca8a7d31857ba3ee8281f/markupsafe-3.0.3-cp314-cp314t-musllinux_1_2_x86_64.whl", hash = "sha256:5678211cb9333a6468fb8d8be0305520aa073f50d17f089b5b4b477ea6e67fdc", size = 23672, upload-time = "2025-09-27T18:37:25.271Z" }, { url = "https://files.pythonhosted.org/packages/fb/df/5bd7a48c256faecd1d36edc13133e51397e41b73bb77e1a69deab746ebac/markupsafe-3.0.3-cp314-cp314t-win32.whl", hash = "sha256:915c04ba3851909ce68ccc2b8e2cd691618c4dc4c4232fb7982bca3f41fd8c3d", size = 14819, upload-time = "2025-09-27T18:37:26.285Z" }, { url = "https://files.pythonhosted.org/packages/1a/8a/0402ba61a2f16038b48b39bccca271134be00c5c9f0f623208399333c448/markupsafe-3.0.3-cp314-cp314t-win_amd64.whl", hash = "sha256:4faffd047e07c38848ce017e8725090413cd80cbc23d86e55c587bf979e579c9", size = 15426, upload-time = "2025-09-27T18:37:27.316Z" }, { url = "https://files.pythonhosted.org/packages/70/bc/6f1c2f612465f5fa89b95bead1f44dcb607670fd42891d8fdcd5d039f4f4/markupsafe-3.0.3-cp314-cp314t-win_arm64.whl", hash = "sha256:32001d6a8fc98c8cb5c947787c5d08b0a50663d139f1305bac5885d98d9b40fa", size = 14146, upload-time = "2025-09-27T18:37:28.327Z" }, ] [[package]] name = "matplotlib-inline" version = "0.2.1" source = { registry = "https://pypi.org/simple" } dependencies = [ { name = "traitlets" }, ] sdist = { url = "https://files.pythonhosted.org/packages/c7/74/97e72a36efd4ae2bccb3463284300f8953f199b5ffbc04cbbb0ec78f74b1/matplotlib_inline-0.2.1.tar.gz", hash = "sha256:e1ee949c340d771fc39e241ea75683deb94762c8fa5f2927ec57c83c4dffa9fe", size = 8110, upload-time = "2025-10-23T09:00:22.126Z" } wheels = [ { url = "https://files.pythonhosted.org/packages/af/33/ee4519fa02ed11a94aef9559552f3b17bb863f2ecfe1a35dc7f548cde231/matplotlib_inline-0.2.1-py3-none-any.whl", hash = "sha256:d56ce5156ba6085e00a9d54fead6ed29a9c47e215cd1bba2e976ef39f5710a76", size = 9516, upload-time = "2025-10-23T09:00:20.675Z" }, ] [[package]] name = "mergedeep" version = "1.3.4" source = { registry = "https://pypi.org/simple" } sdist = { url = "https://files.pythonhosted.org/packages/3a/41/580bb4006e3ed0361b8151a01d324fb03f420815446c7def45d02f74c270/mergedeep-1.3.4.tar.gz", hash = "sha256:0096d52e9dad9939c3d975a774666af186eda617e6ca84df4c94dec30004f2a8", size = 4661, upload-time = "2021-02-05T18:55:30.623Z" } wheels = [ { url = "https://files.pythonhosted.org/packages/2c/19/04f9b178c2d8a15b076c8b5140708fa6ffc5601fb6f1e975537072df5b2a/mergedeep-1.3.4-py3-none-any.whl", hash = "sha256:70775750742b25c0d8f36c55aed03d24c3384d17c951b3175d898bd778ef0307", size = 6354, upload-time = "2021-02-05T18:55:29.583Z" }, ] [[package]] name = "mkdocs" version = "1.6.1" source = { registry = "https://pypi.org/simple" } dependencies = [ { name = "click" }, { name = "colorama", marker = "sys_platform == 'win32'" }, { name = "ghp-import" }, { name = "jinja2" }, { name = "markdown" }, { name = "markupsafe" }, { name = "mergedeep" }, { name = "mkdocs-get-deps" }, { name = "packaging" }, { name = "pathspec" }, { name = "pyyaml" }, { name = "pyyaml-env-tag" }, { name = "watchdog" }, ] sdist = { url = "https://files.pythonhosted.org/packages/bc/c6/bbd4f061bd16b378247f12953ffcb04786a618ce5e904b8c5a01a0309061/mkdocs-1.6.1.tar.gz", hash = "sha256:7b432f01d928c084353ab39c57282f29f92136665bdd6abf7c1ec8d822ef86f2", size = 3889159, upload-time = "2024-08-30T12:24:06.899Z" } wheels = [ { url = "https://files.pythonhosted.org/packages/22/5b/dbc6a8cddc9cfa9c4971d59fb12bb8d42e161b7e7f8cc89e49137c5b279c/mkdocs-1.6.1-py3-none-any.whl", hash = "sha256:db91759624d1647f3f34aa0c3f327dd2601beae39a366d6e064c03468d35c20e", size = 3864451, upload-time = "2024-08-30T12:24:05.054Z" }, ] [[package]] name = "mkdocs-get-deps" version = "0.2.0" source = { registry = "https://pypi.org/simple" } dependencies = [ { name = "mergedeep" }, { name = "platformdirs" }, { name = "pyyaml" }, ] sdist = { url = "https://files.pythonhosted.org/packages/98/f5/ed29cd50067784976f25ed0ed6fcd3c2ce9eb90650aa3b2796ddf7b6870b/mkdocs_get_deps-0.2.0.tar.gz", hash = "sha256:162b3d129c7fad9b19abfdcb9c1458a651628e4b1dea628ac68790fb3061c60c", size = 10239, upload-time = "2023-11-20T17:51:09.981Z" } wheels = [ { url = "https://files.pythonhosted.org/packages/9f/d4/029f984e8d3f3b6b726bd33cafc473b75e9e44c0f7e80a5b29abc466bdea/mkdocs_get_deps-0.2.0-py3-none-any.whl", hash = "sha256:2bf11d0b133e77a0dd036abeeb06dec8775e46efa526dc70667d8863eefc6134", size = 9521, upload-time = "2023-11-20T17:51:08.587Z" }, ] [[package]] name = "multidict" version = "6.7.0" source = { registry = "https://pypi.org/simple" } dependencies = [ { name = "typing-extensions", marker = "python_full_version < '3.11'" }, ] 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/a9/63/7bdd4adc330abcca54c85728db2327130e49e52e8c3ce685cec44e0f2e9f/multidict-6.7.0-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:9f474ad5acda359c8758c8accc22032c6abe6dc87a8be2440d097785e27a9349", size = 77153, upload-time = "2025-10-06T14:48:26.409Z" }, { url = "https://files.pythonhosted.org/packages/3f/bb/b6c35ff175ed1a3142222b78455ee31be71a8396ed3ab5280fbe3ebe4e85/multidict-6.7.0-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:4b7a9db5a870f780220e931d0002bbfd88fb53aceb6293251e2c839415c1b20e", size = 44993, upload-time = "2025-10-06T14:48:28.4Z" }, { url = "https://files.pythonhosted.org/packages/e0/1f/064c77877c5fa6df6d346e68075c0f6998547afe952d6471b4c5f6a7345d/multidict-6.7.0-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:03ca744319864e92721195fa28c7a3b2bc7b686246b35e4078c1e4d0eb5466d3", size = 44607, upload-time = "2025-10-06T14:48:29.581Z" }, { url = "https://files.pythonhosted.org/packages/04/7a/bf6aa92065dd47f287690000b3d7d332edfccb2277634cadf6a810463c6a/multidict-6.7.0-cp310-cp310-manylinux1_i686.manylinux_2_28_i686.manylinux_2_5_i686.whl", hash = "sha256:f0e77e3c0008bc9316e662624535b88d360c3a5d3f81e15cf12c139a75250046", size = 241847, upload-time = "2025-10-06T14:48:32.107Z" }, { url = "https://files.pythonhosted.org/packages/94/39/297a8de920f76eda343e4ce05f3b489f0ab3f9504f2576dfb37b7c08ca08/multidict-6.7.0-cp310-cp310-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:08325c9e5367aa379a3496aa9a022fe8837ff22e00b94db256d3a1378c76ab32", size = 242616, upload-time = "2025-10-06T14:48:34.054Z" }, { url = "https://files.pythonhosted.org/packages/39/3a/d0eee2898cfd9d654aea6cb8c4addc2f9756e9a7e09391cfe55541f917f7/multidict-6.7.0-cp310-cp310-manylinux2014_armv7l.manylinux_2_17_armv7l.manylinux_2_31_armv7l.whl", hash = "sha256:e2862408c99f84aa571ab462d25236ef9cb12a602ea959ba9c9009a54902fc73", size = 222333, upload-time = "2025-10-06T14:48:35.9Z" }, { url = "https://files.pythonhosted.org/packages/05/48/3b328851193c7a4240815b71eea165b49248867bbb6153a0aee227a0bb47/multidict-6.7.0-cp310-cp310-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:4d72a9a2d885f5c208b0cb91ff2ed43636bb7e345ec839ff64708e04f69a13cc", size = 253239, upload-time = "2025-10-06T14:48:37.302Z" }, { url = "https://files.pythonhosted.org/packages/b1/ca/0706a98c8d126a89245413225ca4a3fefc8435014de309cf8b30acb68841/multidict-6.7.0-cp310-cp310-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:478cc36476687bac1514d651cbbaa94b86b0732fb6855c60c673794c7dd2da62", size = 251618, upload-time = "2025-10-06T14:48:38.963Z" }, { url = "https://files.pythonhosted.org/packages/5e/4f/9c7992f245554d8b173f6f0a048ad24b3e645d883f096857ec2c0822b8bd/multidict-6.7.0-cp310-cp310-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:6843b28b0364dc605f21481c90fadb5f60d9123b442eb8a726bb74feef588a84", size = 241655, upload-time = "2025-10-06T14:48:40.312Z" }, { url = "https://files.pythonhosted.org/packages/31/79/26a85991ae67efd1c0b1fc2e0c275b8a6aceeb155a68861f63f87a798f16/multidict-6.7.0-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:23bfeee5316266e5ee2d625df2d2c602b829435fc3a235c2ba2131495706e4a0", size = 239245, upload-time = "2025-10-06T14:48:41.848Z" }, { url = "https://files.pythonhosted.org/packages/14/1e/75fa96394478930b79d0302eaf9a6c69f34005a1a5251ac8b9c336486ec9/multidict-6.7.0-cp310-cp310-musllinux_1_2_armv7l.whl", hash = "sha256:680878b9f3d45c31e1f730eef731f9b0bc1da456155688c6745ee84eb818e90e", size = 233523, upload-time = "2025-10-06T14:48:43.749Z" }, { url = "https://files.pythonhosted.org/packages/b2/5e/085544cb9f9c4ad2b5d97467c15f856df8d9bac410cffd5c43991a5d878b/multidict-6.7.0-cp310-cp310-musllinux_1_2_i686.whl", hash = "sha256:eb866162ef2f45063acc7a53a88ef6fe8bf121d45c30ea3c9cd87ce7e191a8d4", size = 243129, upload-time = "2025-10-06T14:48:45.225Z" }, { url = "https://files.pythonhosted.org/packages/b9/c3/e9d9e2f20c9474e7a8fcef28f863c5cbd29bb5adce6b70cebe8bdad0039d/multidict-6.7.0-cp310-cp310-musllinux_1_2_ppc64le.whl", hash = "sha256:df0e3bf7993bdbeca5ac25aa859cf40d39019e015c9c91809ba7093967f7a648", size = 248999, upload-time = "2025-10-06T14:48:46.703Z" }, { url = "https://files.pythonhosted.org/packages/b5/3f/df171b6efa3239ae33b97b887e42671cd1d94d460614bfb2c30ffdab3b95/multidict-6.7.0-cp310-cp310-musllinux_1_2_s390x.whl", hash = "sha256:661709cdcd919a2ece2234f9bae7174e5220c80b034585d7d8a755632d3e2111", size = 243711, upload-time = "2025-10-06T14:48:48.146Z" }, { url = "https://files.pythonhosted.org/packages/3c/2f/9b5564888c4e14b9af64c54acf149263721a283aaf4aa0ae89b091d5d8c1/multidict-6.7.0-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:096f52730c3fb8ed419db2d44391932b63891b2c5ed14850a7e215c0ba9ade36", size = 237504, upload-time = "2025-10-06T14:48:49.447Z" }, { url = "https://files.pythonhosted.org/packages/6c/3a/0bd6ca0f7d96d790542d591c8c3354c1e1b6bfd2024d4d92dc3d87485ec7/multidict-6.7.0-cp310-cp310-win32.whl", hash = "sha256:afa8a2978ec65d2336305550535c9c4ff50ee527914328c8677b3973ade52b85", size = 41422, upload-time = "2025-10-06T14:48:50.789Z" }, { url = "https://files.pythonhosted.org/packages/00/35/f6a637ea2c75f0d3b7c7d41b1189189acff0d9deeb8b8f35536bb30f5e33/multidict-6.7.0-cp310-cp310-win_amd64.whl", hash = "sha256:b15b3afff74f707b9275d5ba6a91ae8f6429c3ffb29bbfd216b0b375a56f13d7", size = 46050, upload-time = "2025-10-06T14:48:51.938Z" }, { url = "https://files.pythonhosted.org/packages/e7/b8/f7bf8329b39893d02d9d95cf610c75885d12fc0f402b1c894e1c8e01c916/multidict-6.7.0-cp310-cp310-win_arm64.whl", hash = "sha256:4b73189894398d59131a66ff157837b1fafea9974be486d036bb3d32331fdbf0", size = 43153, upload-time = "2025-10-06T14:48:53.146Z" }, { url = "https://files.pythonhosted.org/packages/34/9e/5c727587644d67b2ed479041e4b1c58e30afc011e3d45d25bbe35781217c/multidict-6.7.0-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:4d409aa42a94c0b3fa617708ef5276dfe81012ba6753a0370fcc9d0195d0a1fc", size = 76604, upload-time = "2025-10-06T14:48:54.277Z" }, { url = "https://files.pythonhosted.org/packages/17/e4/67b5c27bd17c085a5ea8f1ec05b8a3e5cba0ca734bfcad5560fb129e70ca/multidict-6.7.0-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:14c9e076eede3b54c636f8ce1c9c252b5f057c62131211f0ceeec273810c9721", size = 44715, upload-time = "2025-10-06T14:48:55.445Z" }, { url = "https://files.pythonhosted.org/packages/4d/e1/866a5d77be6ea435711bef2a4291eed11032679b6b28b56b4776ab06ba3e/multidict-6.7.0-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:4c09703000a9d0fa3c3404b27041e574cc7f4df4c6563873246d0e11812a94b6", size = 44332, upload-time = "2025-10-06T14:48:56.706Z" }, { url = "https://files.pythonhosted.org/packages/31/61/0c2d50241ada71ff61a79518db85ada85fdabfcf395d5968dae1cbda04e5/multidict-6.7.0-cp311-cp311-manylinux1_i686.manylinux_2_28_i686.manylinux_2_5_i686.whl", hash = "sha256:a265acbb7bb33a3a2d626afbe756371dce0279e7b17f4f4eda406459c2b5ff1c", size = 245212, upload-time = "2025-10-06T14:48:58.042Z" }, { url = "https://files.pythonhosted.org/packages/ac/e0/919666a4e4b57fff1b57f279be1c9316e6cdc5de8a8b525d76f6598fefc7/multidict-6.7.0-cp311-cp311-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:51cb455de290ae462593e5b1cb1118c5c22ea7f0d3620d9940bf695cea5a4bd7", size = 246671, upload-time = "2025-10-06T14:49:00.004Z" }, { url = "https://files.pythonhosted.org/packages/a1/cc/d027d9c5a520f3321b65adea289b965e7bcbd2c34402663f482648c716ce/multidict-6.7.0-cp311-cp311-manylinux2014_armv7l.manylinux_2_17_armv7l.manylinux_2_31_armv7l.whl", hash = "sha256:db99677b4457c7a5c5a949353e125ba72d62b35f74e26da141530fbb012218a7", size = 225491, upload-time = "2025-10-06T14:49:01.393Z" }, { url = "https://files.pythonhosted.org/packages/75/c4/bbd633980ce6155a28ff04e6a6492dd3335858394d7bb752d8b108708558/multidict-6.7.0-cp311-cp311-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:f470f68adc395e0183b92a2f4689264d1ea4b40504a24d9882c27375e6662bb9", size = 257322, upload-time = "2025-10-06T14:49:02.745Z" }, { url = "https://files.pythonhosted.org/packages/4c/6d/d622322d344f1f053eae47e033b0b3f965af01212de21b10bcf91be991fb/multidict-6.7.0-cp311-cp311-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:0db4956f82723cc1c270de9c6e799b4c341d327762ec78ef82bb962f79cc07d8", size = 254694, upload-time = "2025-10-06T14:49:04.15Z" }, { url = "https://files.pythonhosted.org/packages/a8/9f/78f8761c2705d4c6d7516faed63c0ebdac569f6db1bef95e0d5218fdc146/multidict-6.7.0-cp311-cp311-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:3e56d780c238f9e1ae66a22d2adf8d16f485381878250db8d496623cd38b22bd", size = 246715, upload-time = "2025-10-06T14:49:05.967Z" }, { url = "https://files.pythonhosted.org/packages/78/59/950818e04f91b9c2b95aab3d923d9eabd01689d0dcd889563988e9ea0fd8/multidict-6.7.0-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:9d14baca2ee12c1a64740d4531356ba50b82543017f3ad6de0deb943c5979abb", size = 243189, upload-time = "2025-10-06T14:49:07.37Z" }, { url = "https://files.pythonhosted.org/packages/7a/3d/77c79e1934cad2ee74991840f8a0110966d9599b3af95964c0cd79bb905b/multidict-6.7.0-cp311-cp311-musllinux_1_2_armv7l.whl", hash = "sha256:295a92a76188917c7f99cda95858c822f9e4aae5824246bba9b6b44004ddd0a6", size = 237845, upload-time = "2025-10-06T14:49:08.759Z" }, { url = "https://files.pythonhosted.org/packages/63/1b/834ce32a0a97a3b70f86437f685f880136677ac00d8bce0027e9fd9c2db7/multidict-6.7.0-cp311-cp311-musllinux_1_2_i686.whl", hash = "sha256:39f1719f57adbb767ef592a50ae5ebb794220d1188f9ca93de471336401c34d2", size = 246374, upload-time = "2025-10-06T14:49:10.574Z" }, { url = "https://files.pythonhosted.org/packages/23/ef/43d1c3ba205b5dec93dc97f3fba179dfa47910fc73aaaea4f7ceb41cec2a/multidict-6.7.0-cp311-cp311-musllinux_1_2_ppc64le.whl", hash = "sha256:0a13fb8e748dfc94749f622de065dd5c1def7e0d2216dba72b1d8069a389c6ff", size = 253345, upload-time = "2025-10-06T14:49:12.331Z" }, { url = "https://files.pythonhosted.org/packages/6b/03/eaf95bcc2d19ead522001f6a650ef32811aa9e3624ff0ad37c445c7a588c/multidict-6.7.0-cp311-cp311-musllinux_1_2_s390x.whl", hash = "sha256:e3aa16de190d29a0ea1b48253c57d99a68492c8dd8948638073ab9e74dc9410b", size = 246940, upload-time = "2025-10-06T14:49:13.821Z" }, { url = "https://files.pythonhosted.org/packages/e8/df/ec8a5fd66ea6cd6f525b1fcbb23511b033c3e9bc42b81384834ffa484a62/multidict-6.7.0-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:a048ce45dcdaaf1defb76b2e684f997fb5abf74437b6cb7b22ddad934a964e34", size = 242229, upload-time = "2025-10-06T14:49:15.603Z" }, { url = "https://files.pythonhosted.org/packages/8a/a2/59b405d59fd39ec86d1142630e9049243015a5f5291ba49cadf3c090c541/multidict-6.7.0-cp311-cp311-win32.whl", hash = "sha256:a90af66facec4cebe4181b9e62a68be65e45ac9b52b67de9eec118701856e7ff", size = 41308, upload-time = "2025-10-06T14:49:16.871Z" }, { url = "https://files.pythonhosted.org/packages/32/0f/13228f26f8b882c34da36efa776c3b7348455ec383bab4a66390e42963ae/multidict-6.7.0-cp311-cp311-win_amd64.whl", hash = "sha256:95b5ffa4349df2887518bb839409bcf22caa72d82beec453216802f475b23c81", size = 46037, upload-time = "2025-10-06T14:49:18.457Z" }, { url = "https://files.pythonhosted.org/packages/84/1f/68588e31b000535a3207fd3c909ebeec4fb36b52c442107499c18a896a2a/multidict-6.7.0-cp311-cp311-win_arm64.whl", hash = "sha256:329aa225b085b6f004a4955271a7ba9f1087e39dcb7e65f6284a988264a63912", size = 43023, upload-time = "2025-10-06T14:49:19.648Z" }, { url = "https://files.pythonhosted.org/packages/c2/9e/9f61ac18d9c8b475889f32ccfa91c9f59363480613fc807b6e3023d6f60b/multidict-6.7.0-cp312-cp312-macosx_10_13_universal2.whl", hash = "sha256:8a3862568a36d26e650a19bb5cbbba14b71789032aebc0423f8cc5f150730184", size = 76877, upload-time = "2025-10-06T14:49:20.884Z" }, { url = "https://files.pythonhosted.org/packages/38/6f/614f09a04e6184f8824268fce4bc925e9849edfa654ddd59f0b64508c595/multidict-6.7.0-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:960c60b5849b9b4f9dcc9bea6e3626143c252c74113df2c1540aebce70209b45", size = 45467, upload-time = "2025-10-06T14:49:22.054Z" }, { url = "https://files.pythonhosted.org/packages/b3/93/c4f67a436dd026f2e780c433277fff72be79152894d9fc36f44569cab1a6/multidict-6.7.0-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:2049be98fb57a31b4ccf870bf377af2504d4ae35646a19037ec271e4c07998aa", size = 43834, upload-time = "2025-10-06T14:49:23.566Z" }, { url = "https://files.pythonhosted.org/packages/7f/f5/013798161ca665e4a422afbc5e2d9e4070142a9ff8905e482139cd09e4d0/multidict-6.7.0-cp312-cp312-manylinux1_i686.manylinux_2_28_i686.manylinux_2_5_i686.whl", hash = "sha256:0934f3843a1860dd465d38895c17fce1f1cb37295149ab05cd1b9a03afacb2a7", size = 250545, upload-time = "2025-10-06T14:49:24.882Z" }, { url = "https://files.pythonhosted.org/packages/71/2f/91dbac13e0ba94669ea5119ba267c9a832f0cb65419aca75549fcf09a3dc/multidict-6.7.0-cp312-cp312-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:b3e34f3a1b8131ba06f1a73adab24f30934d148afcd5f5de9a73565a4404384e", size = 258305, upload-time = "2025-10-06T14:49:26.778Z" }, { url = "https://files.pythonhosted.org/packages/ef/b0/754038b26f6e04488b48ac621f779c341338d78503fb45403755af2df477/multidict-6.7.0-cp312-cp312-manylinux2014_armv7l.manylinux_2_17_armv7l.manylinux_2_31_armv7l.whl", hash = "sha256:efbb54e98446892590dc2458c19c10344ee9a883a79b5cec4bc34d6656e8d546", size = 242363, upload-time = "2025-10-06T14:49:28.562Z" }, { url = "https://files.pythonhosted.org/packages/87/15/9da40b9336a7c9fa606c4cf2ed80a649dffeb42b905d4f63a1d7eb17d746/multidict-6.7.0-cp312-cp312-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:a35c5fc61d4f51eb045061e7967cfe3123d622cd500e8868e7c0c592a09fedc4", size = 268375, upload-time = "2025-10-06T14:49:29.96Z" }, { url = "https://files.pythonhosted.org/packages/82/72/c53fcade0cc94dfaad583105fd92b3a783af2091eddcb41a6d5a52474000/multidict-6.7.0-cp312-cp312-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:29fe6740ebccba4175af1b9b87bf553e9c15cd5868ee967e010efcf94e4fd0f1", size = 269346, upload-time = "2025-10-06T14:49:31.404Z" }, { url = "https://files.pythonhosted.org/packages/0d/e2/9baffdae21a76f77ef8447f1a05a96ec4bc0a24dae08767abc0a2fe680b8/multidict-6.7.0-cp312-cp312-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:123e2a72e20537add2f33a79e605f6191fba2afda4cbb876e35c1a7074298a7d", size = 256107, upload-time = "2025-10-06T14:49:32.974Z" }, { url = "https://files.pythonhosted.org/packages/3c/06/3f06f611087dc60d65ef775f1fb5aca7c6d61c6db4990e7cda0cef9b1651/multidict-6.7.0-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:b284e319754366c1aee2267a2036248b24eeb17ecd5dc16022095e747f2f4304", size = 253592, upload-time = "2025-10-06T14:49:34.52Z" }, { url = "https://files.pythonhosted.org/packages/20/24/54e804ec7945b6023b340c412ce9c3f81e91b3bf5fa5ce65558740141bee/multidict-6.7.0-cp312-cp312-musllinux_1_2_armv7l.whl", hash = "sha256:803d685de7be4303b5a657b76e2f6d1240e7e0a8aa2968ad5811fa2285553a12", size = 251024, upload-time = "2025-10-06T14:49:35.956Z" }, { url = "https://files.pythonhosted.org/packages/14/48/011cba467ea0b17ceb938315d219391d3e421dfd35928e5dbdc3f4ae76ef/multidict-6.7.0-cp312-cp312-musllinux_1_2_i686.whl", hash = "sha256:c04a328260dfd5db8c39538f999f02779012268f54614902d0afc775d44e0a62", size = 251484, upload-time = "2025-10-06T14:49:37.631Z" }, { url = "https://files.pythonhosted.org/packages/0d/2f/919258b43bb35b99fa127435cfb2d91798eb3a943396631ef43e3720dcf4/multidict-6.7.0-cp312-cp312-musllinux_1_2_ppc64le.whl", hash = "sha256:8a19cdb57cd3df4cd865849d93ee14920fb97224300c88501f16ecfa2604b4e0", size = 263579, upload-time = "2025-10-06T14:49:39.502Z" }, { url = "https://files.pythonhosted.org/packages/31/22/a0e884d86b5242b5a74cf08e876bdf299e413016b66e55511f7a804a366e/multidict-6.7.0-cp312-cp312-musllinux_1_2_s390x.whl", hash = "sha256:9b2fd74c52accced7e75de26023b7dccee62511a600e62311b918ec5c168fc2a", size = 259654, upload-time = "2025-10-06T14:49:41.32Z" }, { url = "https://files.pythonhosted.org/packages/b2/e5/17e10e1b5c5f5a40f2fcbb45953c9b215f8a4098003915e46a93f5fcaa8f/multidict-6.7.0-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:3e8bfdd0e487acf992407a140d2589fe598238eaeffa3da8448d63a63cd363f8", size = 251511, upload-time = "2025-10-06T14:49:46.021Z" }, { url = "https://files.pythonhosted.org/packages/e3/9a/201bb1e17e7af53139597069c375e7b0dcbd47594604f65c2d5359508566/multidict-6.7.0-cp312-cp312-win32.whl", hash = "sha256:dd32a49400a2c3d52088e120ee00c1e3576cbff7e10b98467962c74fdb762ed4", size = 41895, upload-time = "2025-10-06T14:49:48.718Z" }, { url = "https://files.pythonhosted.org/packages/46/e2/348cd32faad84eaf1d20cce80e2bb0ef8d312c55bca1f7fa9865e7770aaf/multidict-6.7.0-cp312-cp312-win_amd64.whl", hash = "sha256:92abb658ef2d7ef22ac9f8bb88e8b6c3e571671534e029359b6d9e845923eb1b", size = 46073, upload-time = "2025-10-06T14:49:50.28Z" }, { url = "https://files.pythonhosted.org/packages/25/ec/aad2613c1910dce907480e0c3aa306905830f25df2e54ccc9dea450cb5aa/multidict-6.7.0-cp312-cp312-win_arm64.whl", hash = "sha256:490dab541a6a642ce1a9d61a4781656b346a55c13038f0b1244653828e3a83ec", size = 43226, upload-time = "2025-10-06T14:49:52.304Z" }, { 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 = "mypy" version = "1.18.2" source = { registry = "https://pypi.org/simple" } dependencies = [ { name = "mypy-extensions" }, { name = "pathspec" }, { name = "tomli", marker = "python_full_version < '3.11'" }, { name = "typing-extensions" }, ] sdist = { url = "https://files.pythonhosted.org/packages/c0/77/8f0d0001ffad290cef2f7f216f96c814866248a0b92a722365ed54648e7e/mypy-1.18.2.tar.gz", hash = "sha256:06a398102a5f203d7477b2923dda3634c36727fa5c237d8f859ef90c42a9924b", size = 3448846, upload-time = "2025-09-19T00:11:10.519Z" } wheels = [ { url = "https://files.pythonhosted.org/packages/03/6f/657961a0743cff32e6c0611b63ff1c1970a0b482ace35b069203bf705187/mypy-1.18.2-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:c1eab0cf6294dafe397c261a75f96dc2c31bffe3b944faa24db5def4e2b0f77c", size = 12807973, upload-time = "2025-09-19T00:10:35.282Z" }, { url = "https://files.pythonhosted.org/packages/10/e9/420822d4f661f13ca8900f5fa239b40ee3be8b62b32f3357df9a3045a08b/mypy-1.18.2-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:7a780ca61fc239e4865968ebc5240bb3bf610ef59ac398de9a7421b54e4a207e", size = 11896527, upload-time = "2025-09-19T00:10:55.791Z" }, { url = "https://files.pythonhosted.org/packages/aa/73/a05b2bbaa7005f4642fcfe40fb73f2b4fb6bb44229bd585b5878e9a87ef8/mypy-1.18.2-cp310-cp310-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:448acd386266989ef11662ce3c8011fd2a7b632e0ec7d61a98edd8e27472225b", size = 12507004, upload-time = "2025-09-19T00:11:05.411Z" }, { url = "https://files.pythonhosted.org/packages/4f/01/f6e4b9f0d031c11ccbd6f17da26564f3a0f3c4155af344006434b0a05a9d/mypy-1.18.2-cp310-cp310-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:f9e171c465ad3901dc652643ee4bffa8e9fef4d7d0eece23b428908c77a76a66", size = 13245947, upload-time = "2025-09-19T00:10:46.923Z" }, { url = "https://files.pythonhosted.org/packages/d7/97/19727e7499bfa1ae0773d06afd30ac66a58ed7437d940c70548634b24185/mypy-1.18.2-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:592ec214750bc00741af1f80cbf96b5013d81486b7bb24cb052382c19e40b428", size = 13499217, upload-time = "2025-09-19T00:09:39.472Z" }, { url = "https://files.pythonhosted.org/packages/9f/4f/90dc8c15c1441bf31cf0f9918bb077e452618708199e530f4cbd5cede6ff/mypy-1.18.2-cp310-cp310-win_amd64.whl", hash = "sha256:7fb95f97199ea11769ebe3638c29b550b5221e997c63b14ef93d2e971606ebed", size = 9766753, upload-time = "2025-09-19T00:10:49.161Z" }, { url = "https://files.pythonhosted.org/packages/88/87/cafd3ae563f88f94eec33f35ff722d043e09832ea8530ef149ec1efbaf08/mypy-1.18.2-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:807d9315ab9d464125aa9fcf6d84fde6e1dc67da0b6f80e7405506b8ac72bc7f", size = 12731198, upload-time = "2025-09-19T00:09:44.857Z" }, { url = "https://files.pythonhosted.org/packages/0f/e0/1e96c3d4266a06d4b0197ace5356d67d937d8358e2ee3ffac71faa843724/mypy-1.18.2-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:776bb00de1778caf4db739c6e83919c1d85a448f71979b6a0edd774ea8399341", size = 11817879, upload-time = "2025-09-19T00:09:47.131Z" }, { url = "https://files.pythonhosted.org/packages/72/ef/0c9ba89eb03453e76bdac5a78b08260a848c7bfc5d6603634774d9cd9525/mypy-1.18.2-cp311-cp311-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:1379451880512ffce14505493bd9fe469e0697543717298242574882cf8cdb8d", size = 12427292, upload-time = "2025-09-19T00:10:22.472Z" }, { url = "https://files.pythonhosted.org/packages/1a/52/ec4a061dd599eb8179d5411d99775bec2a20542505988f40fc2fee781068/mypy-1.18.2-cp311-cp311-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:1331eb7fd110d60c24999893320967594ff84c38ac6d19e0a76c5fd809a84c86", size = 13163750, upload-time = "2025-09-19T00:09:51.472Z" }, { url = "https://files.pythonhosted.org/packages/c4/5f/2cf2ceb3b36372d51568f2208c021870fe7834cf3186b653ac6446511839/mypy-1.18.2-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:3ca30b50a51e7ba93b00422e486cbb124f1c56a535e20eff7b2d6ab72b3b2e37", size = 13351827, upload-time = "2025-09-19T00:09:58.311Z" }, { url = "https://files.pythonhosted.org/packages/c8/7d/2697b930179e7277529eaaec1513f8de622818696857f689e4a5432e5e27/mypy-1.18.2-cp311-cp311-win_amd64.whl", hash = "sha256:664dc726e67fa54e14536f6e1224bcfce1d9e5ac02426d2326e2bb4e081d1ce8", size = 9757983, upload-time = "2025-09-19T00:10:09.071Z" }, { url = "https://files.pythonhosted.org/packages/07/06/dfdd2bc60c66611dd8335f463818514733bc763e4760dee289dcc33df709/mypy-1.18.2-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:33eca32dd124b29400c31d7cf784e795b050ace0e1f91b8dc035672725617e34", size = 12908273, upload-time = "2025-09-19T00:10:58.321Z" }, { url = "https://files.pythonhosted.org/packages/81/14/6a9de6d13a122d5608e1a04130724caf9170333ac5a924e10f670687d3eb/mypy-1.18.2-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:a3c47adf30d65e89b2dcd2fa32f3aeb5e94ca970d2c15fcb25e297871c8e4764", size = 11920910, upload-time = "2025-09-19T00:10:20.043Z" }, { url = "https://files.pythonhosted.org/packages/5f/a9/b29de53e42f18e8cc547e38daa9dfa132ffdc64f7250e353f5c8cdd44bee/mypy-1.18.2-cp312-cp312-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:5d6c838e831a062f5f29d11c9057c6009f60cb294fea33a98422688181fe2893", size = 12465585, upload-time = "2025-09-19T00:10:33.005Z" }, { url = "https://files.pythonhosted.org/packages/77/ae/6c3d2c7c61ff21f2bee938c917616c92ebf852f015fb55917fd6e2811db2/mypy-1.18.2-cp312-cp312-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:01199871b6110a2ce984bde85acd481232d17413868c9807e95c1b0739a58914", size = 13348562, upload-time = "2025-09-19T00:10:11.51Z" }, { url = "https://files.pythonhosted.org/packages/4d/31/aec68ab3b4aebdf8f36d191b0685d99faa899ab990753ca0fee60fb99511/mypy-1.18.2-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:a2afc0fa0b0e91b4599ddfe0f91e2c26c2b5a5ab263737e998d6817874c5f7c8", size = 13533296, upload-time = "2025-09-19T00:10:06.568Z" }, { url = "https://files.pythonhosted.org/packages/9f/83/abcb3ad9478fca3ebeb6a5358bb0b22c95ea42b43b7789c7fb1297ca44f4/mypy-1.18.2-cp312-cp312-win_amd64.whl", hash = "sha256:d8068d0afe682c7c4897c0f7ce84ea77f6de953262b12d07038f4d296d547074", size = 9828828, upload-time = "2025-09-19T00:10:28.203Z" }, { url = "https://files.pythonhosted.org/packages/5f/04/7f462e6fbba87a72bc8097b93f6842499c428a6ff0c81dd46948d175afe8/mypy-1.18.2-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:07b8b0f580ca6d289e69209ec9d3911b4a26e5abfde32228a288eb79df129fcc", size = 12898728, upload-time = "2025-09-19T00:10:01.33Z" }, { url = "https://files.pythonhosted.org/packages/99/5b/61ed4efb64f1871b41fd0b82d29a64640f3516078f6c7905b68ab1ad8b13/mypy-1.18.2-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:ed4482847168439651d3feee5833ccedbf6657e964572706a2adb1f7fa4dfe2e", size = 11910758, upload-time = "2025-09-19T00:10:42.607Z" }, { url = "https://files.pythonhosted.org/packages/3c/46/d297d4b683cc89a6e4108c4250a6a6b717f5fa96e1a30a7944a6da44da35/mypy-1.18.2-cp313-cp313-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:c3ad2afadd1e9fea5cf99a45a822346971ede8685cc581ed9cd4d42eaf940986", size = 12475342, upload-time = "2025-09-19T00:11:00.371Z" }, { url = "https://files.pythonhosted.org/packages/83/45/4798f4d00df13eae3bfdf726c9244bcb495ab5bd588c0eed93a2f2dd67f3/mypy-1.18.2-cp313-cp313-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:a431a6f1ef14cf8c144c6b14793a23ec4eae3db28277c358136e79d7d062f62d", size = 13338709, upload-time = "2025-09-19T00:11:03.358Z" }, { url = "https://files.pythonhosted.org/packages/d7/09/479f7358d9625172521a87a9271ddd2441e1dab16a09708f056e97007207/mypy-1.18.2-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:7ab28cc197f1dd77a67e1c6f35cd1f8e8b73ed2217e4fc005f9e6a504e46e7ba", size = 13529806, upload-time = "2025-09-19T00:10:26.073Z" }, { url = "https://files.pythonhosted.org/packages/71/cf/ac0f2c7e9d0ea3c75cd99dff7aec1c9df4a1376537cb90e4c882267ee7e9/mypy-1.18.2-cp313-cp313-win_amd64.whl", hash = "sha256:0e2785a84b34a72ba55fb5daf079a1003a34c05b22238da94fcae2bbe46f3544", size = 9833262, upload-time = "2025-09-19T00:10:40.035Z" }, { url = "https://files.pythonhosted.org/packages/5a/0c/7d5300883da16f0063ae53996358758b2a2df2a09c72a5061fa79a1f5006/mypy-1.18.2-cp314-cp314-macosx_10_13_x86_64.whl", hash = "sha256:62f0e1e988ad41c2a110edde6c398383a889d95b36b3e60bcf155f5164c4fdce", size = 12893775, upload-time = "2025-09-19T00:10:03.814Z" }, { url = "https://files.pythonhosted.org/packages/50/df/2cffbf25737bdb236f60c973edf62e3e7b4ee1c25b6878629e88e2cde967/mypy-1.18.2-cp314-cp314-macosx_11_0_arm64.whl", hash = "sha256:8795a039bab805ff0c1dfdb8cd3344642c2b99b8e439d057aba30850b8d3423d", size = 11936852, upload-time = "2025-09-19T00:10:51.631Z" }, { url = "https://files.pythonhosted.org/packages/be/50/34059de13dd269227fb4a03be1faee6e2a4b04a2051c82ac0a0b5a773c9a/mypy-1.18.2-cp314-cp314-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:6ca1e64b24a700ab5ce10133f7ccd956a04715463d30498e64ea8715236f9c9c", size = 12480242, upload-time = "2025-09-19T00:11:07.955Z" }, { url = "https://files.pythonhosted.org/packages/5b/11/040983fad5132d85914c874a2836252bbc57832065548885b5bb5b0d4359/mypy-1.18.2-cp314-cp314-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:d924eef3795cc89fecf6bedc6ed32b33ac13e8321344f6ddbf8ee89f706c05cb", size = 13326683, upload-time = "2025-09-19T00:09:55.572Z" }, { url = "https://files.pythonhosted.org/packages/e9/ba/89b2901dd77414dd7a8c8729985832a5735053be15b744c18e4586e506ef/mypy-1.18.2-cp314-cp314-musllinux_1_2_x86_64.whl", hash = "sha256:20c02215a080e3a2be3aa50506c67242df1c151eaba0dcbc1e4e557922a26075", size = 13514749, upload-time = "2025-09-19T00:10:44.827Z" }, { url = "https://files.pythonhosted.org/packages/25/bc/cc98767cffd6b2928ba680f3e5bc969c4152bf7c2d83f92f5a504b92b0eb/mypy-1.18.2-cp314-cp314-win_amd64.whl", hash = "sha256:749b5f83198f1ca64345603118a6f01a4e99ad4bf9d103ddc5a3200cc4614adf", size = 9982959, upload-time = "2025-09-19T00:10:37.344Z" }, { url = "https://files.pythonhosted.org/packages/87/e3/be76d87158ebafa0309946c4a73831974d4d6ab4f4ef40c3b53a385a66fd/mypy-1.18.2-py3-none-any.whl", hash = "sha256:22a1748707dd62b58d2ae53562ffc4d7f8bcc727e8ac7cbc69c053ddc874d47e", size = 2352367, upload-time = "2025-09-19T00:10:15.489Z" }, ] [[package]] name = "mypy-extensions" version = "1.1.0" source = { registry = "https://pypi.org/simple" } sdist = { url = "https://files.pythonhosted.org/packages/a2/6e/371856a3fb9d31ca8dac321cda606860fa4548858c0cc45d9d1d4ca2628b/mypy_extensions-1.1.0.tar.gz", hash = "sha256:52e68efc3284861e772bbcd66823fde5ae21fd2fdb51c62a211403730b916558", size = 6343, upload-time = "2025-04-22T14:54:24.164Z" } wheels = [ { url = "https://files.pythonhosted.org/packages/79/7b/2c79738432f5c924bef5071f933bcc9efd0473bac3b4aa584a6f7c1c8df8/mypy_extensions-1.1.0-py3-none-any.whl", hash = "sha256:1be4cccdb0f2482337c4743e60421de3a356cd97508abadd57d47403e94f5505", size = 4963, upload-time = "2025-04-22T14:54:22.983Z" }, ] [[package]] name = "nodeenv" version = "1.9.1" source = { registry = "https://pypi.org/simple" } sdist = { url = "https://files.pythonhosted.org/packages/43/16/fc88b08840de0e0a72a2f9d8c6bae36be573e475a6326ae854bcc549fc45/nodeenv-1.9.1.tar.gz", hash = "sha256:6ec12890a2dab7946721edbfbcd91f3319c6ccc9aec47be7c7e6b7011ee6645f", size = 47437, upload-time = "2024-06-04T18:44:11.171Z" } wheels = [ { url = "https://files.pythonhosted.org/packages/d2/1d/1b658dbd2b9fa9c4c9f32accbfc0205d532c8c6194dc0f2a4c0428e7128a/nodeenv-1.9.1-py2.py3-none-any.whl", hash = "sha256:ba11c9782d29c27c70ffbdda2d7415098754709be8a7056d79a737cd901155c9", size = 22314, upload-time = "2024-06-04T18:44:08.352Z" }, ] [[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 = "parso" version = "0.8.5" source = { registry = "https://pypi.org/simple" } sdist = { url = "https://files.pythonhosted.org/packages/d4/de/53e0bcf53d13e005bd8c92e7855142494f41171b34c2536b86187474184d/parso-0.8.5.tar.gz", hash = "sha256:034d7354a9a018bdce352f48b2a8a450f05e9d6ee85db84764e9b6bd96dafe5a", size = 401205, upload-time = "2025-08-23T15:15:28.028Z" } wheels = [ { url = "https://files.pythonhosted.org/packages/16/32/f8e3c85d1d5250232a5d3477a2a28cc291968ff175caeadaf3cc19ce0e4a/parso-0.8.5-py2.py3-none-any.whl", hash = "sha256:646204b5ee239c396d040b90f9e272e9a8017c630092bf59980beb62fd033887", size = 106668, upload-time = "2025-08-23T15:15:25.663Z" }, ] [[package]] name = "pathspec" version = "0.12.1" source = { registry = "https://pypi.org/simple" } sdist = { url = "https://files.pythonhosted.org/packages/ca/bc/f35b8446f4531a7cb215605d100cd88b7ac6f44ab3fc94870c120ab3adbf/pathspec-0.12.1.tar.gz", hash = "sha256:a482d51503a1ab33b1c67a6c3813a26953dbdc71c31dacaef9a838c4e29f5712", size = 51043, upload-time = "2023-12-10T22:30:45Z" } wheels = [ { url = "https://files.pythonhosted.org/packages/cc/20/ff623b09d963f88bfde16306a54e12ee5ea43e9b597108672ff3a408aad6/pathspec-0.12.1-py3-none-any.whl", hash = "sha256:a0d503e138a4c123b27490a4f7beda6a01c6f288df0e4a8b79c7eb0dc7b4cc08", size = 31191, upload-time = "2023-12-10T22:30:43.14Z" }, ] [[package]] name = "pexpect" version = "4.9.0" source = { registry = "https://pypi.org/simple" } dependencies = [ { name = "ptyprocess" }, ] sdist = { url = "https://files.pythonhosted.org/packages/42/92/cc564bf6381ff43ce1f4d06852fc19a2f11d180f23dc32d9588bee2f149d/pexpect-4.9.0.tar.gz", hash = "sha256:ee7d41123f3c9911050ea2c2dac107568dc43b2d3b0c7557a33212c398ead30f", size = 166450, upload-time = "2023-11-25T09:07:26.339Z" } wheels = [ { url = "https://files.pythonhosted.org/packages/9e/c3/059298687310d527a58bb01f3b1965787ee3b40dce76752eda8b44e9a2c5/pexpect-4.9.0-py2.py3-none-any.whl", hash = "sha256:7236d1e080e4936be2dc3e326cec0af72acf9212a7e1d060210e70a47e253523", size = 63772, upload-time = "2023-11-25T06:56:14.81Z" }, ] [[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 = "pre-commit" version = "4.3.0" source = { registry = "https://pypi.org/simple" } dependencies = [ { name = "cfgv" }, { name = "identify" }, { name = "nodeenv" }, { name = "pyyaml" }, { name = "virtualenv" }, ] sdist = { url = "https://files.pythonhosted.org/packages/ff/29/7cf5bbc236333876e4b41f56e06857a87937ce4bf91e117a6991a2dbb02a/pre_commit-4.3.0.tar.gz", hash = "sha256:499fe450cc9d42e9d58e606262795ecb64dd05438943c62b66f6a8673da30b16", size = 193792, upload-time = "2025-08-09T18:56:14.651Z" } wheels = [ { url = "https://files.pythonhosted.org/packages/5b/a5/987a405322d78a73b66e39e4a90e4ef156fd7141bf71df987e50717c321b/pre_commit-4.3.0-py2.py3-none-any.whl", hash = "sha256:2b0747ad7e6e967169136edffee14c16e148a778a54e4f967921aa1ebf2308d8", size = 220965, upload-time = "2025-08-09T18:56:13.192Z" }, ] [[package]] name = "prompt-toolkit" version = "3.0.52" source = { registry = "https://pypi.org/simple" } dependencies = [ { name = "wcwidth" }, ] sdist = { url = "https://files.pythonhosted.org/packages/a1/96/06e01a7b38dce6fe1db213e061a4602dd6032a8a97ef6c1a862537732421/prompt_toolkit-3.0.52.tar.gz", hash = "sha256:28cde192929c8e7321de85de1ddbe736f1375148b02f2e17edd840042b1be855", size = 434198, upload-time = "2025-08-27T15:24:02.057Z" } wheels = [ { url = "https://files.pythonhosted.org/packages/84/03/0d3ce49e2505ae70cf43bc5bb3033955d2fc9f932163e84dc0779cc47f48/prompt_toolkit-3.0.52-py3-none-any.whl", hash = "sha256:9aac639a3bbd33284347de5ad8d68ecc044b91a762dc39b7c21095fcd6a19955", size = 391431, upload-time = "2025-08-27T15:23:59.498Z" }, ] [[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/3c/0e/934b541323035566a9af292dba85a195f7b78179114f2c6ebb24551118a9/propcache-0.4.1-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:7c2d1fa3201efaf55d730400d945b5b3ab6e672e100ba0f9a409d950ab25d7db", size = 79534, upload-time = "2025-10-08T19:46:02.083Z" }, { url = "https://files.pythonhosted.org/packages/a1/6b/db0d03d96726d995dc7171286c6ba9d8d14251f37433890f88368951a44e/propcache-0.4.1-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:1eb2994229cc8ce7fe9b3db88f5465f5fd8651672840b2e426b88cdb1a30aac8", size = 45526, upload-time = "2025-10-08T19:46:03.884Z" }, { url = "https://files.pythonhosted.org/packages/e4/c3/82728404aea669e1600f304f2609cde9e665c18df5a11cdd57ed73c1dceb/propcache-0.4.1-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:66c1f011f45a3b33d7bcb22daed4b29c0c9e2224758b6be00686731e1b46f925", size = 47263, upload-time = "2025-10-08T19:46:05.405Z" }, { url = "https://files.pythonhosted.org/packages/df/1b/39313ddad2bf9187a1432654c38249bab4562ef535ef07f5eb6eb04d0b1b/propcache-0.4.1-cp310-cp310-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:9a52009f2adffe195d0b605c25ec929d26b36ef986ba85244891dee3b294df21", size = 201012, upload-time = "2025-10-08T19:46:07.165Z" }, { url = "https://files.pythonhosted.org/packages/5b/01/f1d0b57d136f294a142acf97f4ed58c8e5b974c21e543000968357115011/propcache-0.4.1-cp310-cp310-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:5d4e2366a9c7b837555cf02fb9be2e3167d333aff716332ef1b7c3a142ec40c5", size = 209491, upload-time = "2025-10-08T19:46:08.909Z" }, { url = "https://files.pythonhosted.org/packages/a1/c8/038d909c61c5bb039070b3fb02ad5cccdb1dde0d714792e251cdb17c9c05/propcache-0.4.1-cp310-cp310-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:9d2b6caef873b4f09e26ea7e33d65f42b944837563a47a94719cc3544319a0db", size = 215319, upload-time = "2025-10-08T19:46:10.7Z" }, { url = "https://files.pythonhosted.org/packages/08/57/8c87e93142b2c1fa2408e45695205a7ba05fb5db458c0bf5c06ba0e09ea6/propcache-0.4.1-cp310-cp310-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:2b16ec437a8c8a965ecf95739448dd938b5c7f56e67ea009f4300d8df05f32b7", size = 196856, upload-time = "2025-10-08T19:46:12.003Z" }, { url = "https://files.pythonhosted.org/packages/42/df/5615fec76aa561987a534759b3686008a288e73107faa49a8ae5795a9f7a/propcache-0.4.1-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:296f4c8ed03ca7476813fe666c9ea97869a8d7aec972618671b33a38a5182ef4", size = 193241, upload-time = "2025-10-08T19:46:13.495Z" }, { url = "https://files.pythonhosted.org/packages/d5/21/62949eb3a7a54afe8327011c90aca7e03547787a88fb8bd9726806482fea/propcache-0.4.1-cp310-cp310-musllinux_1_2_armv7l.whl", hash = "sha256:1f0978529a418ebd1f49dad413a2b68af33f85d5c5ca5c6ca2a3bed375a7ac60", size = 190552, upload-time = "2025-10-08T19:46:14.938Z" }, { url = "https://files.pythonhosted.org/packages/30/ee/ab4d727dd70806e5b4de96a798ae7ac6e4d42516f030ee60522474b6b332/propcache-0.4.1-cp310-cp310-musllinux_1_2_ppc64le.whl", hash = "sha256:fd138803047fb4c062b1c1dd95462f5209456bfab55c734458f15d11da288f8f", size = 200113, upload-time = "2025-10-08T19:46:16.695Z" }, { url = "https://files.pythonhosted.org/packages/8a/0b/38b46208e6711b016aa8966a3ac793eee0d05c7159d8342aa27fc0bc365e/propcache-0.4.1-cp310-cp310-musllinux_1_2_s390x.whl", hash = "sha256:8c9b3cbe4584636d72ff556d9036e0c9317fa27b3ac1f0f558e7e84d1c9c5900", size = 200778, upload-time = "2025-10-08T19:46:18.023Z" }, { url = "https://files.pythonhosted.org/packages/cf/81/5abec54355ed344476bee711e9f04815d4b00a311ab0535599204eecc257/propcache-0.4.1-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:f93243fdc5657247533273ac4f86ae106cc6445a0efacb9a1bfe982fcfefd90c", size = 193047, upload-time = "2025-10-08T19:46:19.449Z" }, { url = "https://files.pythonhosted.org/packages/ec/b6/1f237c04e32063cb034acd5f6ef34ef3a394f75502e72703545631ab1ef6/propcache-0.4.1-cp310-cp310-win32.whl", hash = "sha256:a0ee98db9c5f80785b266eb805016e36058ac72c51a064040f2bc43b61101cdb", size = 38093, upload-time = "2025-10-08T19:46:20.643Z" }, { url = "https://files.pythonhosted.org/packages/a6/67/354aac4e0603a15f76439caf0427781bcd6797f370377f75a642133bc954/propcache-0.4.1-cp310-cp310-win_amd64.whl", hash = "sha256:1cdb7988c4e5ac7f6d175a28a9aa0c94cb6f2ebe52756a3c0cda98d2809a9e37", size = 41638, upload-time = "2025-10-08T19:46:21.935Z" }, { url = "https://files.pythonhosted.org/packages/e0/e1/74e55b9fd1a4c209ff1a9a824bf6c8b3d1fc5a1ac3eabe23462637466785/propcache-0.4.1-cp310-cp310-win_arm64.whl", hash = "sha256:d82ad62b19645419fe79dd63b3f9253e15b30e955c0170e5cebc350c1844e581", size = 38229, upload-time = "2025-10-08T19:46:23.368Z" }, { url = "https://files.pythonhosted.org/packages/8c/d4/4e2c9aaf7ac2242b9358f98dccd8f90f2605402f5afeff6c578682c2c491/propcache-0.4.1-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:60a8fda9644b7dfd5dece8c61d8a85e271cb958075bfc4e01083c148b61a7caf", size = 80208, upload-time = "2025-10-08T19:46:24.597Z" }, { url = "https://files.pythonhosted.org/packages/c2/21/d7b68e911f9c8e18e4ae43bdbc1e1e9bbd971f8866eb81608947b6f585ff/propcache-0.4.1-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:c30b53e7e6bda1d547cabb47c825f3843a0a1a42b0496087bb58d8fedf9f41b5", size = 45777, upload-time = "2025-10-08T19:46:25.733Z" }, { url = "https://files.pythonhosted.org/packages/d3/1d/11605e99ac8ea9435651ee71ab4cb4bf03f0949586246476a25aadfec54a/propcache-0.4.1-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:6918ecbd897443087a3b7cd978d56546a812517dcaaca51b49526720571fa93e", size = 47647, upload-time = "2025-10-08T19:46:27.304Z" }, { url = "https://files.pythonhosted.org/packages/58/1a/3c62c127a8466c9c843bccb503d40a273e5cc69838805f322e2826509e0d/propcache-0.4.1-cp311-cp311-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:3d902a36df4e5989763425a8ab9e98cd8ad5c52c823b34ee7ef307fd50582566", size = 214929, upload-time = "2025-10-08T19:46:28.62Z" }, { url = "https://files.pythonhosted.org/packages/56/b9/8fa98f850960b367c4b8fe0592e7fc341daa7a9462e925228f10a60cf74f/propcache-0.4.1-cp311-cp311-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:a9695397f85973bb40427dedddf70d8dc4a44b22f1650dd4af9eedf443d45165", size = 221778, upload-time = "2025-10-08T19:46:30.358Z" }, { url = "https://files.pythonhosted.org/packages/46/a6/0ab4f660eb59649d14b3d3d65c439421cf2f87fe5dd68591cbe3c1e78a89/propcache-0.4.1-cp311-cp311-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:2bb07ffd7eaad486576430c89f9b215f9e4be68c4866a96e97db9e97fead85dc", size = 228144, upload-time = "2025-10-08T19:46:32.607Z" }, { url = "https://files.pythonhosted.org/packages/52/6a/57f43e054fb3d3a56ac9fc532bc684fc6169a26c75c353e65425b3e56eef/propcache-0.4.1-cp311-cp311-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:fd6f30fdcf9ae2a70abd34da54f18da086160e4d7d9251f81f3da0ff84fc5a48", size = 210030, upload-time = "2025-10-08T19:46:33.969Z" }, { url = "https://files.pythonhosted.org/packages/40/e2/27e6feebb5f6b8408fa29f5efbb765cd54c153ac77314d27e457a3e993b7/propcache-0.4.1-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:fc38cba02d1acba4e2869eef1a57a43dfbd3d49a59bf90dda7444ec2be6a5570", size = 208252, upload-time = "2025-10-08T19:46:35.309Z" }, { url = "https://files.pythonhosted.org/packages/9e/f8/91c27b22ccda1dbc7967f921c42825564fa5336a01ecd72eb78a9f4f53c2/propcache-0.4.1-cp311-cp311-musllinux_1_2_armv7l.whl", hash = "sha256:67fad6162281e80e882fb3ec355398cf72864a54069d060321f6cd0ade95fe85", size = 202064, upload-time = "2025-10-08T19:46:36.993Z" }, { url = "https://files.pythonhosted.org/packages/f2/26/7f00bd6bd1adba5aafe5f4a66390f243acab58eab24ff1a08bebb2ef9d40/propcache-0.4.1-cp311-cp311-musllinux_1_2_ppc64le.whl", hash = "sha256:f10207adf04d08bec185bae14d9606a1444715bc99180f9331c9c02093e1959e", size = 212429, upload-time = "2025-10-08T19:46:38.398Z" }, { url = "https://files.pythonhosted.org/packages/84/89/fd108ba7815c1117ddca79c228f3f8a15fc82a73bca8b142eb5de13b2785/propcache-0.4.1-cp311-cp311-musllinux_1_2_s390x.whl", hash = "sha256:e9b0d8d0845bbc4cfcdcbcdbf5086886bc8157aa963c31c777ceff7846c77757", size = 216727, upload-time = "2025-10-08T19:46:39.732Z" }, { url = "https://files.pythonhosted.org/packages/79/37/3ec3f7e3173e73f1d600495d8b545b53802cbf35506e5732dd8578db3724/propcache-0.4.1-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:981333cb2f4c1896a12f4ab92a9cc8f09ea664e9b7dbdc4eff74627af3a11c0f", size = 205097, upload-time = "2025-10-08T19:46:41.025Z" }, { url = "https://files.pythonhosted.org/packages/61/b0/b2631c19793f869d35f47d5a3a56fb19e9160d3c119f15ac7344fc3ccae7/propcache-0.4.1-cp311-cp311-win32.whl", hash = "sha256:f1d2f90aeec838a52f1c1a32fe9a619fefd5e411721a9117fbf82aea638fe8a1", size = 38084, upload-time = "2025-10-08T19:46:42.693Z" }, { url = "https://files.pythonhosted.org/packages/f4/78/6cce448e2098e9f3bfc91bb877f06aa24b6ccace872e39c53b2f707c4648/propcache-0.4.1-cp311-cp311-win_amd64.whl", hash = "sha256:364426a62660f3f699949ac8c621aad6977be7126c5807ce48c0aeb8e7333ea6", size = 41637, upload-time = "2025-10-08T19:46:43.778Z" }, { url = "https://files.pythonhosted.org/packages/9c/e9/754f180cccd7f51a39913782c74717c581b9cc8177ad0e949f4d51812383/propcache-0.4.1-cp311-cp311-win_arm64.whl", hash = "sha256:e53f3a38d3510c11953f3e6a33f205c6d1b001129f972805ca9b42fc308bc239", size = 38064, upload-time = "2025-10-08T19:46:44.872Z" }, { url = "https://files.pythonhosted.org/packages/a2/0f/f17b1b2b221d5ca28b4b876e8bb046ac40466513960646bda8e1853cdfa2/propcache-0.4.1-cp312-cp312-macosx_10_13_universal2.whl", hash = "sha256:e153e9cd40cc8945138822807139367f256f89c6810c2634a4f6902b52d3b4e2", size = 80061, upload-time = "2025-10-08T19:46:46.075Z" }, { url = "https://files.pythonhosted.org/packages/76/47/8ccf75935f51448ba9a16a71b783eb7ef6b9ee60f5d14c7f8a8a79fbeed7/propcache-0.4.1-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:cd547953428f7abb73c5ad82cbb32109566204260d98e41e5dfdc682eb7f8403", size = 46037, upload-time = "2025-10-08T19:46:47.23Z" }, { url = "https://files.pythonhosted.org/packages/0a/b6/5c9a0e42df4d00bfb4a3cbbe5cf9f54260300c88a0e9af1f47ca5ce17ac0/propcache-0.4.1-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:f048da1b4f243fc44f205dfd320933a951b8d89e0afd4c7cacc762a8b9165207", size = 47324, upload-time = "2025-10-08T19:46:48.384Z" }, { url = "https://files.pythonhosted.org/packages/9e/d3/6c7ee328b39a81ee877c962469f1e795f9db87f925251efeb0545e0020d0/propcache-0.4.1-cp312-cp312-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:ec17c65562a827bba85e3872ead335f95405ea1674860d96483a02f5c698fa72", size = 225505, upload-time = "2025-10-08T19:46:50.055Z" }, { url = "https://files.pythonhosted.org/packages/01/5d/1c53f4563490b1d06a684742cc6076ef944bc6457df6051b7d1a877c057b/propcache-0.4.1-cp312-cp312-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:405aac25c6394ef275dee4c709be43745d36674b223ba4eb7144bf4d691b7367", size = 230242, upload-time = "2025-10-08T19:46:51.815Z" }, { url = "https://files.pythonhosted.org/packages/20/e1/ce4620633b0e2422207c3cb774a0ee61cac13abc6217763a7b9e2e3f4a12/propcache-0.4.1-cp312-cp312-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:0013cb6f8dde4b2a2f66903b8ba740bdfe378c943c4377a200551ceb27f379e4", size = 238474, upload-time = "2025-10-08T19:46:53.208Z" }, { url = "https://files.pythonhosted.org/packages/46/4b/3aae6835b8e5f44ea6a68348ad90f78134047b503765087be2f9912140ea/propcache-0.4.1-cp312-cp312-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:15932ab57837c3368b024473a525e25d316d8353016e7cc0e5ba9eb343fbb1cf", size = 221575, upload-time = "2025-10-08T19:46:54.511Z" }, { url = "https://files.pythonhosted.org/packages/6e/a5/8a5e8678bcc9d3a1a15b9a29165640d64762d424a16af543f00629c87338/propcache-0.4.1-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:031dce78b9dc099f4c29785d9cf5577a3faf9ebf74ecbd3c856a7b92768c3df3", size = 216736, upload-time = "2025-10-08T19:46:56.212Z" }, { url = "https://files.pythonhosted.org/packages/f1/63/b7b215eddeac83ca1c6b934f89d09a625aa9ee4ba158338854c87210cc36/propcache-0.4.1-cp312-cp312-musllinux_1_2_armv7l.whl", hash = "sha256:ab08df6c9a035bee56e31af99be621526bd237bea9f32def431c656b29e41778", size = 213019, upload-time = "2025-10-08T19:46:57.595Z" }, { url = "https://files.pythonhosted.org/packages/57/74/f580099a58c8af587cac7ba19ee7cb418506342fbbe2d4a4401661cca886/propcache-0.4.1-cp312-cp312-musllinux_1_2_ppc64le.whl", hash = "sha256:4d7af63f9f93fe593afbf104c21b3b15868efb2c21d07d8732c0c4287e66b6a6", size = 220376, upload-time = "2025-10-08T19:46:59.067Z" }, { url = "https://files.pythonhosted.org/packages/c4/ee/542f1313aff7eaf19c2bb758c5d0560d2683dac001a1c96d0774af799843/propcache-0.4.1-cp312-cp312-musllinux_1_2_s390x.whl", hash = "sha256:cfc27c945f422e8b5071b6e93169679e4eb5bf73bbcbf1ba3ae3a83d2f78ebd9", size = 226988, upload-time = "2025-10-08T19:47:00.544Z" }, { url = "https://files.pythonhosted.org/packages/8f/18/9c6b015dd9c6930f6ce2229e1f02fb35298b847f2087ea2b436a5bfa7287/propcache-0.4.1-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:35c3277624a080cc6ec6f847cbbbb5b49affa3598c4535a0a4682a697aaa5c75", size = 215615, upload-time = "2025-10-08T19:47:01.968Z" }, { url = "https://files.pythonhosted.org/packages/80/9e/e7b85720b98c45a45e1fca6a177024934dc9bc5f4d5dd04207f216fc33ed/propcache-0.4.1-cp312-cp312-win32.whl", hash = "sha256:671538c2262dadb5ba6395e26c1731e1d52534bfe9ae56d0b5573ce539266aa8", size = 38066, upload-time = "2025-10-08T19:47:03.503Z" }, { url = "https://files.pythonhosted.org/packages/54/09/d19cff2a5aaac632ec8fc03737b223597b1e347416934c1b3a7df079784c/propcache-0.4.1-cp312-cp312-win_amd64.whl", hash = "sha256:cb2d222e72399fcf5890d1d5cc1060857b9b236adff2792ff48ca2dfd46c81db", size = 41655, upload-time = "2025-10-08T19:47:04.973Z" }, { url = "https://files.pythonhosted.org/packages/68/ab/6b5c191bb5de08036a8c697b265d4ca76148efb10fa162f14af14fb5f076/propcache-0.4.1-cp312-cp312-win_arm64.whl", hash = "sha256:204483131fb222bdaaeeea9f9e6c6ed0cac32731f75dfc1d4a567fc1926477c1", size = 37789, upload-time = "2025-10-08T19:47:06.077Z" }, { 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 = "ptyprocess" version = "0.7.0" source = { registry = "https://pypi.org/simple" } sdist = { url = "https://files.pythonhosted.org/packages/20/e5/16ff212c1e452235a90aeb09066144d0c5a6a8c0834397e03f5224495c4e/ptyprocess-0.7.0.tar.gz", hash = "sha256:5c5d0a3b48ceee0b48485e0c26037c0acd7d29765ca3fbb5cb3831d347423220", size = 70762, upload-time = "2020-12-28T15:15:30.155Z" } wheels = [ { url = "https://files.pythonhosted.org/packages/22/a6/858897256d0deac81a172289110f31629fc4cee19b6f01283303e18c8db3/ptyprocess-0.7.0-py2.py3-none-any.whl", hash = "sha256:4b41f3967fce3af57cc7e94b888626c18bf37a083e3651ca8feeb66d492fef35", size = 13993, upload-time = "2020-12-28T15:15:28.35Z" }, ] [[package]] name = "pure-eval" version = "0.2.3" source = { registry = "https://pypi.org/simple" } sdist = { url = "https://files.pythonhosted.org/packages/cd/05/0a34433a064256a578f1783a10da6df098ceaa4a57bbeaa96a6c0352786b/pure_eval-0.2.3.tar.gz", hash = "sha256:5f4e983f40564c576c7c8635ae88db5956bb2229d7e9237d03b3c0b0190eaf42", size = 19752, upload-time = "2024-07-21T12:58:21.801Z" } wheels = [ { url = "https://files.pythonhosted.org/packages/8e/37/efad0257dc6e593a18957422533ff0f87ede7c9c6ea010a2177d738fb82f/pure_eval-0.2.3-py3-none-any.whl", hash = "sha256:1db8e35b67b3d218d818ae653e27f06c3aa420901fa7b081ca98cbedc874e0d0", size = 11842, upload-time = "2024-07-21T12:58:20.04Z" }, ] [[package]] name = "pygments" version = "2.19.2" source = { registry = "https://pypi.org/simple" } sdist = { url = "https://files.pythonhosted.org/packages/b0/77/a5b8c569bf593b0140bde72ea885a803b82086995367bf2037de0159d924/pygments-2.19.2.tar.gz", hash = "sha256:636cb2477cec7f8952536970bc533bc43743542f70392ae026374600add5b887", size = 4968631, upload-time = "2025-06-21T13:39:12.283Z" } wheels = [ { url = "https://files.pythonhosted.org/packages/c7/21/705964c7812476f378728bdf590ca4b771ec72385c533964653c68e86bdc/pygments-2.19.2-py3-none-any.whl", hash = "sha256:86540386c03d588bb81d44bc3928634ff26449851e99741617ecb9037ee5ec0b", size = 1225217, upload-time = "2025-06-21T13:39:07.939Z" }, ] [[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 = "pyyaml" version = "6.0.3" source = { registry = "https://pypi.org/simple" } sdist = { url = "https://files.pythonhosted.org/packages/05/8e/961c0007c59b8dd7729d542c61a4d537767a59645b82a0b521206e1e25c2/pyyaml-6.0.3.tar.gz", hash = "sha256:d76623373421df22fb4cf8817020cbb7ef15c725b9d5e45f17e189bfc384190f", size = 130960, upload-time = "2025-09-25T21:33:16.546Z" } wheels = [ { url = "https://files.pythonhosted.org/packages/f4/a0/39350dd17dd6d6c6507025c0e53aef67a9293a6d37d3511f23ea510d5800/pyyaml-6.0.3-cp310-cp310-macosx_10_13_x86_64.whl", hash = "sha256:214ed4befebe12df36bcc8bc2b64b396ca31be9304b8f59e25c11cf94a4c033b", size = 184227, upload-time = "2025-09-25T21:31:46.04Z" }, { url = "https://files.pythonhosted.org/packages/05/14/52d505b5c59ce73244f59c7a50ecf47093ce4765f116cdb98286a71eeca2/pyyaml-6.0.3-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:02ea2dfa234451bbb8772601d7b8e426c2bfa197136796224e50e35a78777956", size = 174019, upload-time = "2025-09-25T21:31:47.706Z" }, { url = "https://files.pythonhosted.org/packages/43/f7/0e6a5ae5599c838c696adb4e6330a59f463265bfa1e116cfd1fbb0abaaae/pyyaml-6.0.3-cp310-cp310-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:b30236e45cf30d2b8e7b3e85881719e98507abed1011bf463a8fa23e9c3e98a8", size = 740646, upload-time = "2025-09-25T21:31:49.21Z" }, { url = "https://files.pythonhosted.org/packages/2f/3a/61b9db1d28f00f8fd0ae760459a5c4bf1b941baf714e207b6eb0657d2578/pyyaml-6.0.3-cp310-cp310-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:66291b10affd76d76f54fad28e22e51719ef9ba22b29e1d7d03d6777a9174198", size = 840793, upload-time = "2025-09-25T21:31:50.735Z" }, { url = "https://files.pythonhosted.org/packages/7a/1e/7acc4f0e74c4b3d9531e24739e0ab832a5edf40e64fbae1a9c01941cabd7/pyyaml-6.0.3-cp310-cp310-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:9c7708761fccb9397fe64bbc0395abcae8c4bf7b0eac081e12b809bf47700d0b", size = 770293, upload-time = "2025-09-25T21:31:51.828Z" }, { url = "https://files.pythonhosted.org/packages/8b/ef/abd085f06853af0cd59fa5f913d61a8eab65d7639ff2a658d18a25d6a89d/pyyaml-6.0.3-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:418cf3f2111bc80e0933b2cd8cd04f286338bb88bdc7bc8e6dd775ebde60b5e0", size = 732872, upload-time = "2025-09-25T21:31:53.282Z" }, { url = "https://files.pythonhosted.org/packages/1f/15/2bc9c8faf6450a8b3c9fc5448ed869c599c0a74ba2669772b1f3a0040180/pyyaml-6.0.3-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:5e0b74767e5f8c593e8c9b5912019159ed0533c70051e9cce3e8b6aa699fcd69", size = 758828, upload-time = "2025-09-25T21:31:54.807Z" }, { url = "https://files.pythonhosted.org/packages/a3/00/531e92e88c00f4333ce359e50c19b8d1de9fe8d581b1534e35ccfbc5f393/pyyaml-6.0.3-cp310-cp310-win32.whl", hash = "sha256:28c8d926f98f432f88adc23edf2e6d4921ac26fb084b028c733d01868d19007e", size = 142415, upload-time = "2025-09-25T21:31:55.885Z" }, { url = "https://files.pythonhosted.org/packages/2a/fa/926c003379b19fca39dd4634818b00dec6c62d87faf628d1394e137354d4/pyyaml-6.0.3-cp310-cp310-win_amd64.whl", hash = "sha256:bdb2c67c6c1390b63c6ff89f210c8fd09d9a1217a465701eac7316313c915e4c", size = 158561, upload-time = "2025-09-25T21:31:57.406Z" }, { url = "https://files.pythonhosted.org/packages/6d/16/a95b6757765b7b031c9374925bb718d55e0a9ba8a1b6a12d25962ea44347/pyyaml-6.0.3-cp311-cp311-macosx_10_13_x86_64.whl", hash = "sha256:44edc647873928551a01e7a563d7452ccdebee747728c1080d881d68af7b997e", size = 185826, upload-time = "2025-09-25T21:31:58.655Z" }, { url = "https://files.pythonhosted.org/packages/16/19/13de8e4377ed53079ee996e1ab0a9c33ec2faf808a4647b7b4c0d46dd239/pyyaml-6.0.3-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:652cb6edd41e718550aad172851962662ff2681490a8a711af6a4d288dd96824", size = 175577, upload-time = "2025-09-25T21:32:00.088Z" }, { url = "https://files.pythonhosted.org/packages/0c/62/d2eb46264d4b157dae1275b573017abec435397aa59cbcdab6fc978a8af4/pyyaml-6.0.3-cp311-cp311-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:10892704fc220243f5305762e276552a0395f7beb4dbf9b14ec8fd43b57f126c", size = 775556, upload-time = "2025-09-25T21:32:01.31Z" }, { url = "https://files.pythonhosted.org/packages/10/cb/16c3f2cf3266edd25aaa00d6c4350381c8b012ed6f5276675b9eba8d9ff4/pyyaml-6.0.3-cp311-cp311-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:850774a7879607d3a6f50d36d04f00ee69e7fc816450e5f7e58d7f17f1ae5c00", size = 882114, upload-time = "2025-09-25T21:32:03.376Z" }, { url = "https://files.pythonhosted.org/packages/71/60/917329f640924b18ff085ab889a11c763e0b573da888e8404ff486657602/pyyaml-6.0.3-cp311-cp311-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:b8bb0864c5a28024fac8a632c443c87c5aa6f215c0b126c449ae1a150412f31d", size = 806638, upload-time = "2025-09-25T21:32:04.553Z" }, { url = "https://files.pythonhosted.org/packages/dd/6f/529b0f316a9fd167281a6c3826b5583e6192dba792dd55e3203d3f8e655a/pyyaml-6.0.3-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:1d37d57ad971609cf3c53ba6a7e365e40660e3be0e5175fa9f2365a379d6095a", size = 767463, upload-time = "2025-09-25T21:32:06.152Z" }, { url = "https://files.pythonhosted.org/packages/f2/6a/b627b4e0c1dd03718543519ffb2f1deea4a1e6d42fbab8021936a4d22589/pyyaml-6.0.3-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:37503bfbfc9d2c40b344d06b2199cf0e96e97957ab1c1b546fd4f87e53e5d3e4", size = 794986, upload-time = "2025-09-25T21:32:07.367Z" }, { url = "https://files.pythonhosted.org/packages/45/91/47a6e1c42d9ee337c4839208f30d9f09caa9f720ec7582917b264defc875/pyyaml-6.0.3-cp311-cp311-win32.whl", hash = "sha256:8098f252adfa6c80ab48096053f512f2321f0b998f98150cea9bd23d83e1467b", size = 142543, upload-time = "2025-09-25T21:32:08.95Z" }, { url = "https://files.pythonhosted.org/packages/da/e3/ea007450a105ae919a72393cb06f122f288ef60bba2dc64b26e2646fa315/pyyaml-6.0.3-cp311-cp311-win_amd64.whl", hash = "sha256:9f3bfb4965eb874431221a3ff3fdcddc7e74e3b07799e0e84ca4a0f867d449bf", size = 158763, upload-time = "2025-09-25T21:32:09.96Z" }, { url = "https://files.pythonhosted.org/packages/d1/33/422b98d2195232ca1826284a76852ad5a86fe23e31b009c9886b2d0fb8b2/pyyaml-6.0.3-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:7f047e29dcae44602496db43be01ad42fc6f1cc0d8cd6c83d342306c32270196", size = 182063, upload-time = "2025-09-25T21:32:11.445Z" }, { url = "https://files.pythonhosted.org/packages/89/a0/6cf41a19a1f2f3feab0e9c0b74134aa2ce6849093d5517a0c550fe37a648/pyyaml-6.0.3-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:fc09d0aa354569bc501d4e787133afc08552722d3ab34836a80547331bb5d4a0", size = 173973, upload-time = "2025-09-25T21:32:12.492Z" }, { url = "https://files.pythonhosted.org/packages/ed/23/7a778b6bd0b9a8039df8b1b1d80e2e2ad78aa04171592c8a5c43a56a6af4/pyyaml-6.0.3-cp312-cp312-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:9149cad251584d5fb4981be1ecde53a1ca46c891a79788c0df828d2f166bda28", size = 775116, upload-time = "2025-09-25T21:32:13.652Z" }, { url = "https://files.pythonhosted.org/packages/65/30/d7353c338e12baef4ecc1b09e877c1970bd3382789c159b4f89d6a70dc09/pyyaml-6.0.3-cp312-cp312-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:5fdec68f91a0c6739b380c83b951e2c72ac0197ace422360e6d5a959d8d97b2c", size = 844011, upload-time = "2025-09-25T21:32:15.21Z" }, { url = "https://files.pythonhosted.org/packages/8b/9d/b3589d3877982d4f2329302ef98a8026e7f4443c765c46cfecc8858c6b4b/pyyaml-6.0.3-cp312-cp312-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:ba1cc08a7ccde2d2ec775841541641e4548226580ab850948cbfda66a1befcdc", size = 807870, upload-time = "2025-09-25T21:32:16.431Z" }, { url = "https://files.pythonhosted.org/packages/05/c0/b3be26a015601b822b97d9149ff8cb5ead58c66f981e04fedf4e762f4bd4/pyyaml-6.0.3-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:8dc52c23056b9ddd46818a57b78404882310fb473d63f17b07d5c40421e47f8e", size = 761089, upload-time = "2025-09-25T21:32:17.56Z" }, { url = "https://files.pythonhosted.org/packages/be/8e/98435a21d1d4b46590d5459a22d88128103f8da4c2d4cb8f14f2a96504e1/pyyaml-6.0.3-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:41715c910c881bc081f1e8872880d3c650acf13dfa8214bad49ed4cede7c34ea", size = 790181, upload-time = "2025-09-25T21:32:18.834Z" }, { url = "https://files.pythonhosted.org/packages/74/93/7baea19427dcfbe1e5a372d81473250b379f04b1bd3c4c5ff825e2327202/pyyaml-6.0.3-cp312-cp312-win32.whl", hash = "sha256:96b533f0e99f6579b3d4d4995707cf36df9100d67e0c8303a0c55b27b5f99bc5", size = 137658, upload-time = "2025-09-25T21:32:20.209Z" }, { url = "https://files.pythonhosted.org/packages/86/bf/899e81e4cce32febab4fb42bb97dcdf66bc135272882d1987881a4b519e9/pyyaml-6.0.3-cp312-cp312-win_amd64.whl", hash = "sha256:5fcd34e47f6e0b794d17de1b4ff496c00986e1c83f7ab2fb8fcfe9616ff7477b", size = 154003, upload-time = "2025-09-25T21:32:21.167Z" }, { url = "https://files.pythonhosted.org/packages/1a/08/67bd04656199bbb51dbed1439b7f27601dfb576fb864099c7ef0c3e55531/pyyaml-6.0.3-cp312-cp312-win_arm64.whl", hash = "sha256:64386e5e707d03a7e172c0701abfb7e10f0fb753ee1d773128192742712a98fd", size = 140344, upload-time = "2025-09-25T21:32:22.617Z" }, { url = "https://files.pythonhosted.org/packages/d1/11/0fd08f8192109f7169db964b5707a2f1e8b745d4e239b784a5a1dd80d1db/pyyaml-6.0.3-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:8da9669d359f02c0b91ccc01cac4a67f16afec0dac22c2ad09f46bee0697eba8", size = 181669, upload-time = "2025-09-25T21:32:23.673Z" }, { url = "https://files.pythonhosted.org/packages/b1/16/95309993f1d3748cd644e02e38b75d50cbc0d9561d21f390a76242ce073f/pyyaml-6.0.3-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:2283a07e2c21a2aa78d9c4442724ec1eb15f5e42a723b99cb3d822d48f5f7ad1", size = 173252, upload-time = "2025-09-25T21:32:25.149Z" }, { url = "https://files.pythonhosted.org/packages/50/31/b20f376d3f810b9b2371e72ef5adb33879b25edb7a6d072cb7ca0c486398/pyyaml-6.0.3-cp313-cp313-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:ee2922902c45ae8ccada2c5b501ab86c36525b883eff4255313a253a3160861c", size = 767081, upload-time = "2025-09-25T21:32:26.575Z" }, { url = "https://files.pythonhosted.org/packages/49/1e/a55ca81e949270d5d4432fbbd19dfea5321eda7c41a849d443dc92fd1ff7/pyyaml-6.0.3-cp313-cp313-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:a33284e20b78bd4a18c8c2282d549d10bc8408a2a7ff57653c0cf0b9be0afce5", size = 841159, upload-time = "2025-09-25T21:32:27.727Z" }, { url = "https://files.pythonhosted.org/packages/74/27/e5b8f34d02d9995b80abcef563ea1f8b56d20134d8f4e5e81733b1feceb2/pyyaml-6.0.3-cp313-cp313-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:0f29edc409a6392443abf94b9cf89ce99889a1dd5376d94316ae5145dfedd5d6", size = 801626, upload-time = "2025-09-25T21:32:28.878Z" }, { url = "https://files.pythonhosted.org/packages/f9/11/ba845c23988798f40e52ba45f34849aa8a1f2d4af4b798588010792ebad6/pyyaml-6.0.3-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:f7057c9a337546edc7973c0d3ba84ddcdf0daa14533c2065749c9075001090e6", size = 753613, upload-time = "2025-09-25T21:32:30.178Z" }, { url = "https://files.pythonhosted.org/packages/3d/e0/7966e1a7bfc0a45bf0a7fb6b98ea03fc9b8d84fa7f2229e9659680b69ee3/pyyaml-6.0.3-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:eda16858a3cab07b80edaf74336ece1f986ba330fdb8ee0d6c0d68fe82bc96be", size = 794115, upload-time = "2025-09-25T21:32:31.353Z" }, { url = "https://files.pythonhosted.org/packages/de/94/980b50a6531b3019e45ddeada0626d45fa85cbe22300844a7983285bed3b/pyyaml-6.0.3-cp313-cp313-win32.whl", hash = "sha256:d0eae10f8159e8fdad514efdc92d74fd8d682c933a6dd088030f3834bc8e6b26", size = 137427, upload-time = "2025-09-25T21:32:32.58Z" }, { url = "https://files.pythonhosted.org/packages/97/c9/39d5b874e8b28845e4ec2202b5da735d0199dbe5b8fb85f91398814a9a46/pyyaml-6.0.3-cp313-cp313-win_amd64.whl", hash = "sha256:79005a0d97d5ddabfeeea4cf676af11e647e41d81c9a7722a193022accdb6b7c", size = 154090, upload-time = "2025-09-25T21:32:33.659Z" }, { url = "https://files.pythonhosted.org/packages/73/e8/2bdf3ca2090f68bb3d75b44da7bbc71843b19c9f2b9cb9b0f4ab7a5a4329/pyyaml-6.0.3-cp313-cp313-win_arm64.whl", hash = "sha256:5498cd1645aa724a7c71c8f378eb29ebe23da2fc0d7a08071d89469bf1d2defb", size = 140246, upload-time = "2025-09-25T21:32:34.663Z" }, { url = "https://files.pythonhosted.org/packages/9d/8c/f4bd7f6465179953d3ac9bc44ac1a8a3e6122cf8ada906b4f96c60172d43/pyyaml-6.0.3-cp314-cp314-macosx_10_13_x86_64.whl", hash = "sha256:8d1fab6bb153a416f9aeb4b8763bc0f22a5586065f86f7664fc23339fc1c1fac", size = 181814, upload-time = "2025-09-25T21:32:35.712Z" }, { url = "https://files.pythonhosted.org/packages/bd/9c/4d95bb87eb2063d20db7b60faa3840c1b18025517ae857371c4dd55a6b3a/pyyaml-6.0.3-cp314-cp314-macosx_11_0_arm64.whl", hash = "sha256:34d5fcd24b8445fadc33f9cf348c1047101756fd760b4dacb5c3e99755703310", size = 173809, upload-time = "2025-09-25T21:32:36.789Z" }, { url = "https://files.pythonhosted.org/packages/92/b5/47e807c2623074914e29dabd16cbbdd4bf5e9b2db9f8090fa64411fc5382/pyyaml-6.0.3-cp314-cp314-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:501a031947e3a9025ed4405a168e6ef5ae3126c59f90ce0cd6f2bfc477be31b7", size = 766454, upload-time = "2025-09-25T21:32:37.966Z" }, { url = "https://files.pythonhosted.org/packages/02/9e/e5e9b168be58564121efb3de6859c452fccde0ab093d8438905899a3a483/pyyaml-6.0.3-cp314-cp314-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:b3bc83488de33889877a0f2543ade9f70c67d66d9ebb4ac959502e12de895788", size = 836355, upload-time = "2025-09-25T21:32:39.178Z" }, { url = "https://files.pythonhosted.org/packages/88/f9/16491d7ed2a919954993e48aa941b200f38040928474c9e85ea9e64222c3/pyyaml-6.0.3-cp314-cp314-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:c458b6d084f9b935061bc36216e8a69a7e293a2f1e68bf956dcd9e6cbcd143f5", size = 794175, upload-time = "2025-09-25T21:32:40.865Z" }, { url = "https://files.pythonhosted.org/packages/dd/3f/5989debef34dc6397317802b527dbbafb2b4760878a53d4166579111411e/pyyaml-6.0.3-cp314-cp314-musllinux_1_2_aarch64.whl", hash = "sha256:7c6610def4f163542a622a73fb39f534f8c101d690126992300bf3207eab9764", size = 755228, upload-time = "2025-09-25T21:32:42.084Z" }, { url = "https://files.pythonhosted.org/packages/d7/ce/af88a49043cd2e265be63d083fc75b27b6ed062f5f9fd6cdc223ad62f03e/pyyaml-6.0.3-cp314-cp314-musllinux_1_2_x86_64.whl", hash = "sha256:5190d403f121660ce8d1d2c1bb2ef1bd05b5f68533fc5c2ea899bd15f4399b35", size = 789194, upload-time = "2025-09-25T21:32:43.362Z" }, { url = "https://files.pythonhosted.org/packages/23/20/bb6982b26a40bb43951265ba29d4c246ef0ff59c9fdcdf0ed04e0687de4d/pyyaml-6.0.3-cp314-cp314-win_amd64.whl", hash = "sha256:4a2e8cebe2ff6ab7d1050ecd59c25d4c8bd7e6f400f5f82b96557ac0abafd0ac", size = 156429, upload-time = "2025-09-25T21:32:57.844Z" }, { url = "https://files.pythonhosted.org/packages/f4/f4/a4541072bb9422c8a883ab55255f918fa378ecf083f5b85e87fc2b4eda1b/pyyaml-6.0.3-cp314-cp314-win_arm64.whl", hash = "sha256:93dda82c9c22deb0a405ea4dc5f2d0cda384168e466364dec6255b293923b2f3", size = 143912, upload-time = "2025-09-25T21:32:59.247Z" }, { url = "https://files.pythonhosted.org/packages/7c/f9/07dd09ae774e4616edf6cda684ee78f97777bdd15847253637a6f052a62f/pyyaml-6.0.3-cp314-cp314t-macosx_10_13_x86_64.whl", hash = "sha256:02893d100e99e03eda1c8fd5c441d8c60103fd175728e23e431db1b589cf5ab3", size = 189108, upload-time = "2025-09-25T21:32:44.377Z" }, { url = "https://files.pythonhosted.org/packages/4e/78/8d08c9fb7ce09ad8c38ad533c1191cf27f7ae1effe5bb9400a46d9437fcf/pyyaml-6.0.3-cp314-cp314t-macosx_11_0_arm64.whl", hash = "sha256:c1ff362665ae507275af2853520967820d9124984e0f7466736aea23d8611fba", size = 183641, upload-time = "2025-09-25T21:32:45.407Z" }, { url = "https://files.pythonhosted.org/packages/7b/5b/3babb19104a46945cf816d047db2788bcaf8c94527a805610b0289a01c6b/pyyaml-6.0.3-cp314-cp314t-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:6adc77889b628398debc7b65c073bcb99c4a0237b248cacaf3fe8a557563ef6c", size = 831901, upload-time = "2025-09-25T21:32:48.83Z" }, { url = "https://files.pythonhosted.org/packages/8b/cc/dff0684d8dc44da4d22a13f35f073d558c268780ce3c6ba1b87055bb0b87/pyyaml-6.0.3-cp314-cp314t-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:a80cb027f6b349846a3bf6d73b5e95e782175e52f22108cfa17876aaeff93702", size = 861132, upload-time = "2025-09-25T21:32:50.149Z" }, { url = "https://files.pythonhosted.org/packages/b1/5e/f77dc6b9036943e285ba76b49e118d9ea929885becb0a29ba8a7c75e29fe/pyyaml-6.0.3-cp314-cp314t-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:00c4bdeba853cc34e7dd471f16b4114f4162dc03e6b7afcc2128711f0eca823c", size = 839261, upload-time = "2025-09-25T21:32:51.808Z" }, { url = "https://files.pythonhosted.org/packages/ce/88/a9db1376aa2a228197c58b37302f284b5617f56a5d959fd1763fb1675ce6/pyyaml-6.0.3-cp314-cp314t-musllinux_1_2_aarch64.whl", hash = "sha256:66e1674c3ef6f541c35191caae2d429b967b99e02040f5ba928632d9a7f0f065", size = 805272, upload-time = "2025-09-25T21:32:52.941Z" }, { url = "https://files.pythonhosted.org/packages/da/92/1446574745d74df0c92e6aa4a7b0b3130706a4142b2d1a5869f2eaa423c6/pyyaml-6.0.3-cp314-cp314t-musllinux_1_2_x86_64.whl", hash = "sha256:16249ee61e95f858e83976573de0f5b2893b3677ba71c9dd36b9cf8be9ac6d65", size = 829923, upload-time = "2025-09-25T21:32:54.537Z" }, { url = "https://files.pythonhosted.org/packages/f0/7a/1c7270340330e575b92f397352af856a8c06f230aa3e76f86b39d01b416a/pyyaml-6.0.3-cp314-cp314t-win_amd64.whl", hash = "sha256:4ad1906908f2f5ae4e5a8ddfce73c320c2a1429ec52eafd27138b7f1cbe341c9", size = 174062, upload-time = "2025-09-25T21:32:55.767Z" }, { url = "https://files.pythonhosted.org/packages/f1/12/de94a39c2ef588c7e6455cfbe7343d3b2dc9d6b6b2f40c4c6565744c873d/pyyaml-6.0.3-cp314-cp314t-win_arm64.whl", hash = "sha256:ebc55a14a21cb14062aa4162f906cd962b28e2e9ea38f9b4391244cd8de4ae0b", size = 149341, upload-time = "2025-09-25T21:32:56.828Z" }, ] [[package]] name = "pyyaml-env-tag" version = "1.1" source = { registry = "https://pypi.org/simple" } dependencies = [ { name = "pyyaml" }, ] sdist = { url = "https://files.pythonhosted.org/packages/eb/2e/79c822141bfd05a853236b504869ebc6b70159afc570e1d5a20641782eaa/pyyaml_env_tag-1.1.tar.gz", hash = "sha256:2eb38b75a2d21ee0475d6d97ec19c63287a7e140231e4214969d0eac923cd7ff", size = 5737, upload-time = "2025-05-13T15:24:01.64Z" } wheels = [ { url = "https://files.pythonhosted.org/packages/04/11/432f32f8097b03e3cd5fe57e88efb685d964e2e5178a48ed61e841f7fdce/pyyaml_env_tag-1.1-py3-none-any.whl", hash = "sha256:17109e1a528561e32f026364712fee1264bc2ea6715120891174ed1b980d2e04", size = 4722, upload-time = "2025-05-13T15:23:59.629Z" }, ] [[package]] name = "ruff" version = "0.14.2" source = { registry = "https://pypi.org/simple" } sdist = { url = "https://files.pythonhosted.org/packages/ee/34/8218a19b2055b80601e8fd201ec723c74c7fe1ca06d525a43ed07b6d8e85/ruff-0.14.2.tar.gz", hash = "sha256:98da787668f239313d9c902ca7c523fe11b8ec3f39345553a51b25abc4629c96", size = 5539663, upload-time = "2025-10-23T19:37:00.956Z" } wheels = [ { url = "https://files.pythonhosted.org/packages/16/dd/23eb2db5ad9acae7c845700493b72d3ae214dce0b226f27df89216110f2b/ruff-0.14.2-py3-none-linux_armv6l.whl", hash = "sha256:7cbe4e593505bdec5884c2d0a4d791a90301bc23e49a6b1eb642dd85ef9c64f1", size = 12533390, upload-time = "2025-10-23T19:36:18.044Z" }, { url = "https://files.pythonhosted.org/packages/5a/8c/5f9acff43ddcf3f85130d0146d0477e28ccecc495f9f684f8f7119b74c0d/ruff-0.14.2-py3-none-macosx_10_12_x86_64.whl", hash = "sha256:8d54b561729cee92f8d89c316ad7a3f9705533f5903b042399b6ae0ddfc62e11", size = 12887187, upload-time = "2025-10-23T19:36:22.664Z" }, { url = "https://files.pythonhosted.org/packages/99/fa/047646491479074029665022e9f3dc6f0515797f40a4b6014ea8474c539d/ruff-0.14.2-py3-none-macosx_11_0_arm64.whl", hash = "sha256:5c8753dfa44ebb2cde10ce5b4d2ef55a41fb9d9b16732a2c5df64620dbda44a3", size = 11925177, upload-time = "2025-10-23T19:36:24.778Z" }, { url = "https://files.pythonhosted.org/packages/15/8b/c44cf7fe6e59ab24a9d939493a11030b503bdc2a16622cede8b7b1df0114/ruff-0.14.2-py3-none-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:3d0bbeffb8d9f4fccf7b5198d566d0bad99a9cb622f1fc3467af96cb8773c9e3", size = 12358285, upload-time = "2025-10-23T19:36:26.979Z" }, { url = "https://files.pythonhosted.org/packages/45/01/47701b26254267ef40369aea3acb62a7b23e921c27372d127e0f3af48092/ruff-0.14.2-py3-none-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:7047f0c5a713a401e43a88d36843d9c83a19c584e63d664474675620aaa634a8", size = 12303832, upload-time = "2025-10-23T19:36:29.192Z" }, { url = "https://files.pythonhosted.org/packages/2d/5c/ae7244ca4fbdf2bee9d6405dcd5bc6ae51ee1df66eb7a9884b77b8af856d/ruff-0.14.2-py3-none-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:3bf8d2f9aa1602599217d82e8e0af7fd33e5878c4d98f37906b7c93f46f9a839", size = 13036995, upload-time = "2025-10-23T19:36:31.861Z" }, { url = "https://files.pythonhosted.org/packages/27/4c/0860a79ce6fd4c709ac01173f76f929d53f59748d0dcdd662519835dae43/ruff-0.14.2-py3-none-manylinux_2_17_ppc64.manylinux2014_ppc64.whl", hash = "sha256:1c505b389e19c57a317cf4b42db824e2fca96ffb3d86766c1c9f8b96d32048a7", size = 14512649, upload-time = "2025-10-23T19:36:33.915Z" }, { url = "https://files.pythonhosted.org/packages/7f/7f/d365de998069720a3abfc250ddd876fc4b81a403a766c74ff9bde15b5378/ruff-0.14.2-py3-none-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:a307fc45ebd887b3f26b36d9326bb70bf69b01561950cdcc6c0bdf7bb8e0f7cc", size = 14088182, upload-time = "2025-10-23T19:36:36.983Z" }, { url = "https://files.pythonhosted.org/packages/6c/ea/d8e3e6b209162000a7be1faa41b0a0c16a133010311edc3329753cc6596a/ruff-0.14.2-py3-none-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:61ae91a32c853172f832c2f40bd05fd69f491db7289fb85a9b941ebdd549781a", size = 13599516, upload-time = "2025-10-23T19:36:39.208Z" }, { url = "https://files.pythonhosted.org/packages/fa/ea/c7810322086db68989fb20a8d5221dd3b79e49e396b01badca07b433ab45/ruff-0.14.2-py3-none-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:bc1967e40286f63ee23c615e8e7e98098dedc7301568bd88991f6e544d8ae096", size = 13272690, upload-time = "2025-10-23T19:36:41.453Z" }, { url = "https://files.pythonhosted.org/packages/a9/39/10b05acf8c45786ef501d454e00937e1b97964f846bf28883d1f9619928a/ruff-0.14.2-py3-none-manylinux_2_31_riscv64.whl", hash = "sha256:2877f02119cdebf52a632d743a2e302dea422bfae152ebe2f193d3285a3a65df", size = 13496497, upload-time = "2025-10-23T19:36:43.61Z" }, { url = "https://files.pythonhosted.org/packages/59/a1/1f25f8301e13751c30895092485fada29076e5e14264bdacc37202e85d24/ruff-0.14.2-py3-none-musllinux_1_2_aarch64.whl", hash = "sha256:e681c5bc777de5af898decdcb6ba3321d0d466f4cb43c3e7cc2c3b4e7b843a05", size = 12266116, upload-time = "2025-10-23T19:36:45.625Z" }, { url = "https://files.pythonhosted.org/packages/5c/fa/0029bfc9ce16ae78164e6923ef392e5f173b793b26cc39aa1d8b366cf9dc/ruff-0.14.2-py3-none-musllinux_1_2_armv7l.whl", hash = "sha256:e21be42d72e224736f0c992cdb9959a2fa53c7e943b97ef5d081e13170e3ffc5", size = 12281345, upload-time = "2025-10-23T19:36:47.618Z" }, { url = "https://files.pythonhosted.org/packages/a5/ab/ece7baa3c0f29b7683be868c024f0838770c16607bea6852e46b202f1ff6/ruff-0.14.2-py3-none-musllinux_1_2_i686.whl", hash = "sha256:b8264016f6f209fac16262882dbebf3f8be1629777cf0f37e7aff071b3e9b92e", size = 12629296, upload-time = "2025-10-23T19:36:49.789Z" }, { url = "https://files.pythonhosted.org/packages/a4/7f/638f54b43f3d4e48c6a68062794e5b367ddac778051806b9e235dfb7aa81/ruff-0.14.2-py3-none-musllinux_1_2_x86_64.whl", hash = "sha256:5ca36b4cb4db3067a3b24444463ceea5565ea78b95fe9a07ca7cb7fd16948770", size = 13371610, upload-time = "2025-10-23T19:36:51.882Z" }, { url = "https://files.pythonhosted.org/packages/8d/35/3654a973ebe5b32e1fd4a08ed2d46755af7267da7ac710d97420d7b8657d/ruff-0.14.2-py3-none-win32.whl", hash = "sha256:41775927d287685e08f48d8eb3f765625ab0b7042cc9377e20e64f4eb0056ee9", size = 12415318, upload-time = "2025-10-23T19:36:53.961Z" }, { url = "https://files.pythonhosted.org/packages/71/30/3758bcf9e0b6a4193a6f51abf84254aba00887dfa8c20aba18aa366c5f57/ruff-0.14.2-py3-none-win_amd64.whl", hash = "sha256:0df3424aa5c3c08b34ed8ce099df1021e3adaca6e90229273496b839e5a7e1af", size = 13565279, upload-time = "2025-10-23T19:36:56.578Z" }, { url = "https://files.pythonhosted.org/packages/2e/5d/aa883766f8ef9ffbe6aa24f7192fb71632f31a30e77eb39aa2b0dc4290ac/ruff-0.14.2-py3-none-win_arm64.whl", hash = "sha256:ea9d635e83ba21569fbacda7e78afbfeb94911c9434aff06192d9bc23fd5495a", size = 12554956, upload-time = "2025-10-23T19:36:58.714Z" }, ] [[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 = "stack-data" version = "0.6.3" source = { registry = "https://pypi.org/simple" } dependencies = [ { name = "asttokens" }, { name = "executing" }, { name = "pure-eval" }, ] sdist = { url = "https://files.pythonhosted.org/packages/28/e3/55dcc2cfbc3ca9c29519eb6884dd1415ecb53b0e934862d3559ddcb7e20b/stack_data-0.6.3.tar.gz", hash = "sha256:836a778de4fec4dcd1dcd89ed8abff8a221f58308462e1c4aa2a3cf30148f0b9", size = 44707, upload-time = "2023-09-30T13:58:05.479Z" } wheels = [ { url = "https://files.pythonhosted.org/packages/f1/7b/ce1eafaf1a76852e2ec9b22edecf1daa58175c090266e9f6c64afcd81d91/stack_data-0.6.3-py3-none-any.whl", hash = "sha256:d5558e0c25a4cb0853cddad3d77da9891a08cb85dd9f9f91b9f8cd66e511e695", size = 24521, upload-time = "2023-09-30T13:58:03.53Z" }, ] [[package]] name = "tomli" version = "2.3.0" source = { registry = "https://pypi.org/simple" } sdist = { url = "https://files.pythonhosted.org/packages/52/ed/3f73f72945444548f33eba9a87fc7a6e969915e7b1acc8260b30e1f76a2f/tomli-2.3.0.tar.gz", hash = "sha256:64be704a875d2a59753d80ee8a533c3fe183e3f06807ff7dc2232938ccb01549", size = 17392, upload-time = "2025-10-08T22:01:47.119Z" } wheels = [ { url = "https://files.pythonhosted.org/packages/b3/2e/299f62b401438d5fe1624119c723f5d877acc86a4c2492da405626665f12/tomli-2.3.0-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:88bd15eb972f3664f5ed4b57c1634a97153b4bac4479dcb6a495f41921eb7f45", size = 153236, upload-time = "2025-10-08T22:01:00.137Z" }, { url = "https://files.pythonhosted.org/packages/86/7f/d8fffe6a7aefdb61bced88fcb5e280cfd71e08939da5894161bd71bea022/tomli-2.3.0-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:883b1c0d6398a6a9d29b508c331fa56adbcdff647f6ace4dfca0f50e90dfd0ba", size = 148084, upload-time = "2025-10-08T22:01:01.63Z" }, { url = "https://files.pythonhosted.org/packages/47/5c/24935fb6a2ee63e86d80e4d3b58b222dafaf438c416752c8b58537c8b89a/tomli-2.3.0-cp311-cp311-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:d1381caf13ab9f300e30dd8feadb3de072aeb86f1d34a8569453ff32a7dea4bf", size = 234832, upload-time = "2025-10-08T22:01:02.543Z" }, { url = "https://files.pythonhosted.org/packages/89/da/75dfd804fc11e6612846758a23f13271b76d577e299592b4371a4ca4cd09/tomli-2.3.0-cp311-cp311-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:a0e285d2649b78c0d9027570d4da3425bdb49830a6156121360b3f8511ea3441", size = 242052, upload-time = "2025-10-08T22:01:03.836Z" }, { url = "https://files.pythonhosted.org/packages/70/8c/f48ac899f7b3ca7eb13af73bacbc93aec37f9c954df3c08ad96991c8c373/tomli-2.3.0-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:0a154a9ae14bfcf5d8917a59b51ffd5a3ac1fd149b71b47a3a104ca4edcfa845", size = 239555, upload-time = "2025-10-08T22:01:04.834Z" }, { url = "https://files.pythonhosted.org/packages/ba/28/72f8afd73f1d0e7829bfc093f4cb98ce0a40ffc0cc997009ee1ed94ba705/tomli-2.3.0-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:74bf8464ff93e413514fefd2be591c3b0b23231a77f901db1eb30d6f712fc42c", size = 245128, upload-time = "2025-10-08T22:01:05.84Z" }, { url = "https://files.pythonhosted.org/packages/b6/eb/a7679c8ac85208706d27436e8d421dfa39d4c914dcf5fa8083a9305f58d9/tomli-2.3.0-cp311-cp311-win32.whl", hash = "sha256:00b5f5d95bbfc7d12f91ad8c593a1659b6387b43f054104cda404be6bda62456", size = 96445, upload-time = "2025-10-08T22:01:06.896Z" }, { url = "https://files.pythonhosted.org/packages/0a/fe/3d3420c4cb1ad9cb462fb52967080575f15898da97e21cb6f1361d505383/tomli-2.3.0-cp311-cp311-win_amd64.whl", hash = "sha256:4dc4ce8483a5d429ab602f111a93a6ab1ed425eae3122032db7e9acf449451be", size = 107165, upload-time = "2025-10-08T22:01:08.107Z" }, { url = "https://files.pythonhosted.org/packages/ff/b7/40f36368fcabc518bb11c8f06379a0fd631985046c038aca08c6d6a43c6e/tomli-2.3.0-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:d7d86942e56ded512a594786a5ba0a5e521d02529b3826e7761a05138341a2ac", size = 154891, upload-time = "2025-10-08T22:01:09.082Z" }, { url = "https://files.pythonhosted.org/packages/f9/3f/d9dd692199e3b3aab2e4e4dd948abd0f790d9ded8cd10cbaae276a898434/tomli-2.3.0-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:73ee0b47d4dad1c5e996e3cd33b8a76a50167ae5f96a2607cbe8cc773506ab22", size = 148796, upload-time = "2025-10-08T22:01:10.266Z" }, { url = "https://files.pythonhosted.org/packages/60/83/59bff4996c2cf9f9387a0f5a3394629c7efa5ef16142076a23a90f1955fa/tomli-2.3.0-cp312-cp312-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:792262b94d5d0a466afb5bc63c7daa9d75520110971ee269152083270998316f", size = 242121, upload-time = "2025-10-08T22:01:11.332Z" }, { url = "https://files.pythonhosted.org/packages/45/e5/7c5119ff39de8693d6baab6c0b6dcb556d192c165596e9fc231ea1052041/tomli-2.3.0-cp312-cp312-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:4f195fe57ecceac95a66a75ac24d9d5fbc98ef0962e09b2eddec5d39375aae52", size = 250070, upload-time = "2025-10-08T22:01:12.498Z" }, { url = "https://files.pythonhosted.org/packages/45/12/ad5126d3a278f27e6701abde51d342aa78d06e27ce2bb596a01f7709a5a2/tomli-2.3.0-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:e31d432427dcbf4d86958c184b9bfd1e96b5b71f8eb17e6d02531f434fd335b8", size = 245859, upload-time = "2025-10-08T22:01:13.551Z" }, { url = "https://files.pythonhosted.org/packages/fb/a1/4d6865da6a71c603cfe6ad0e6556c73c76548557a8d658f9e3b142df245f/tomli-2.3.0-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:7b0882799624980785240ab732537fcfc372601015c00f7fc367c55308c186f6", size = 250296, upload-time = "2025-10-08T22:01:14.614Z" }, { url = "https://files.pythonhosted.org/packages/a0/b7/a7a7042715d55c9ba6e8b196d65d2cb662578b4d8cd17d882d45322b0d78/tomli-2.3.0-cp312-cp312-win32.whl", hash = "sha256:ff72b71b5d10d22ecb084d345fc26f42b5143c5533db5e2eaba7d2d335358876", size = 97124, upload-time = "2025-10-08T22:01:15.629Z" }, { url = "https://files.pythonhosted.org/packages/06/1e/f22f100db15a68b520664eb3328fb0ae4e90530887928558112c8d1f4515/tomli-2.3.0-cp312-cp312-win_amd64.whl", hash = "sha256:1cb4ed918939151a03f33d4242ccd0aa5f11b3547d0cf30f7c74a408a5b99878", size = 107698, upload-time = "2025-10-08T22:01:16.51Z" }, { url = "https://files.pythonhosted.org/packages/89/48/06ee6eabe4fdd9ecd48bf488f4ac783844fd777f547b8d1b61c11939974e/tomli-2.3.0-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:5192f562738228945d7b13d4930baffda67b69425a7f0da96d360b0a3888136b", size = 154819, upload-time = "2025-10-08T22:01:17.964Z" }, { url = "https://files.pythonhosted.org/packages/f1/01/88793757d54d8937015c75dcdfb673c65471945f6be98e6a0410fba167ed/tomli-2.3.0-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:be71c93a63d738597996be9528f4abe628d1adf5e6eb11607bc8fe1a510b5dae", size = 148766, upload-time = "2025-10-08T22:01:18.959Z" }, { url = "https://files.pythonhosted.org/packages/42/17/5e2c956f0144b812e7e107f94f1cc54af734eb17b5191c0bbfb72de5e93e/tomli-2.3.0-cp313-cp313-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:c4665508bcbac83a31ff8ab08f424b665200c0e1e645d2bd9ab3d3e557b6185b", size = 240771, upload-time = "2025-10-08T22:01:20.106Z" }, { url = "https://files.pythonhosted.org/packages/d5/f4/0fbd014909748706c01d16824eadb0307115f9562a15cbb012cd9b3512c5/tomli-2.3.0-cp313-cp313-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:4021923f97266babc6ccab9f5068642a0095faa0a51a246a6a02fccbb3514eaf", size = 248586, upload-time = "2025-10-08T22:01:21.164Z" }, { url = "https://files.pythonhosted.org/packages/30/77/fed85e114bde5e81ecf9bc5da0cc69f2914b38f4708c80ae67d0c10180c5/tomli-2.3.0-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:a4ea38c40145a357d513bffad0ed869f13c1773716cf71ccaa83b0fa0cc4e42f", size = 244792, upload-time = "2025-10-08T22:01:22.417Z" }, { url = "https://files.pythonhosted.org/packages/55/92/afed3d497f7c186dc71e6ee6d4fcb0acfa5f7d0a1a2878f8beae379ae0cc/tomli-2.3.0-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:ad805ea85eda330dbad64c7ea7a4556259665bdf9d2672f5dccc740eb9d3ca05", size = 248909, upload-time = "2025-10-08T22:01:23.859Z" }, { url = "https://files.pythonhosted.org/packages/f8/84/ef50c51b5a9472e7265ce1ffc7f24cd4023d289e109f669bdb1553f6a7c2/tomli-2.3.0-cp313-cp313-win32.whl", hash = "sha256:97d5eec30149fd3294270e889b4234023f2c69747e555a27bd708828353ab606", size = 96946, upload-time = "2025-10-08T22:01:24.893Z" }, { url = "https://files.pythonhosted.org/packages/b2/b7/718cd1da0884f281f95ccfa3a6cc572d30053cba64603f79d431d3c9b61b/tomli-2.3.0-cp313-cp313-win_amd64.whl", hash = "sha256:0c95ca56fbe89e065c6ead5b593ee64b84a26fca063b5d71a1122bf26e533999", size = 107705, upload-time = "2025-10-08T22:01:26.153Z" }, { url = "https://files.pythonhosted.org/packages/19/94/aeafa14a52e16163008060506fcb6aa1949d13548d13752171a755c65611/tomli-2.3.0-cp314-cp314-macosx_10_13_x86_64.whl", hash = "sha256:cebc6fe843e0733ee827a282aca4999b596241195f43b4cc371d64fc6639da9e", size = 154244, upload-time = "2025-10-08T22:01:27.06Z" }, { url = "https://files.pythonhosted.org/packages/db/e4/1e58409aa78eefa47ccd19779fc6f36787edbe7d4cd330eeeedb33a4515b/tomli-2.3.0-cp314-cp314-macosx_11_0_arm64.whl", hash = "sha256:4c2ef0244c75aba9355561272009d934953817c49f47d768070c3c94355c2aa3", size = 148637, upload-time = "2025-10-08T22:01:28.059Z" }, { url = "https://files.pythonhosted.org/packages/26/b6/d1eccb62f665e44359226811064596dd6a366ea1f985839c566cd61525ae/tomli-2.3.0-cp314-cp314-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:c22a8bf253bacc0cf11f35ad9808b6cb75ada2631c2d97c971122583b129afbc", size = 241925, upload-time = "2025-10-08T22:01:29.066Z" }, { url = "https://files.pythonhosted.org/packages/70/91/7cdab9a03e6d3d2bb11beae108da5bdc1c34bdeb06e21163482544ddcc90/tomli-2.3.0-cp314-cp314-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:0eea8cc5c5e9f89c9b90c4896a8deefc74f518db5927d0e0e8d4a80953d774d0", size = 249045, upload-time = "2025-10-08T22:01:31.98Z" }, { url = "https://files.pythonhosted.org/packages/15/1b/8c26874ed1f6e4f1fcfeb868db8a794cbe9f227299402db58cfcc858766c/tomli-2.3.0-cp314-cp314-musllinux_1_2_aarch64.whl", hash = "sha256:b74a0e59ec5d15127acdabd75ea17726ac4c5178ae51b85bfe39c4f8a278e879", size = 245835, upload-time = "2025-10-08T22:01:32.989Z" }, { url = "https://files.pythonhosted.org/packages/fd/42/8e3c6a9a4b1a1360c1a2a39f0b972cef2cc9ebd56025168c4137192a9321/tomli-2.3.0-cp314-cp314-musllinux_1_2_x86_64.whl", hash = "sha256:b5870b50c9db823c595983571d1296a6ff3e1b88f734a4c8f6fc6188397de005", size = 253109, upload-time = "2025-10-08T22:01:34.052Z" }, { url = "https://files.pythonhosted.org/packages/22/0c/b4da635000a71b5f80130937eeac12e686eefb376b8dee113b4a582bba42/tomli-2.3.0-cp314-cp314-win32.whl", hash = "sha256:feb0dacc61170ed7ab602d3d972a58f14ee3ee60494292d384649a3dc38ef463", size = 97930, upload-time = "2025-10-08T22:01:35.082Z" }, { url = "https://files.pythonhosted.org/packages/b9/74/cb1abc870a418ae99cd5c9547d6bce30701a954e0e721821df483ef7223c/tomli-2.3.0-cp314-cp314-win_amd64.whl", hash = "sha256:b273fcbd7fc64dc3600c098e39136522650c49bca95df2d11cf3b626422392c8", size = 107964, upload-time = "2025-10-08T22:01:36.057Z" }, { url = "https://files.pythonhosted.org/packages/54/78/5c46fff6432a712af9f792944f4fcd7067d8823157949f4e40c56b8b3c83/tomli-2.3.0-cp314-cp314t-macosx_10_13_x86_64.whl", hash = "sha256:940d56ee0410fa17ee1f12b817b37a4d4e4dc4d27340863cc67236c74f582e77", size = 163065, upload-time = "2025-10-08T22:01:37.27Z" }, { url = "https://files.pythonhosted.org/packages/39/67/f85d9bd23182f45eca8939cd2bc7050e1f90c41f4a2ecbbd5963a1d1c486/tomli-2.3.0-cp314-cp314t-macosx_11_0_arm64.whl", hash = "sha256:f85209946d1fe94416debbb88d00eb92ce9cd5266775424ff81bc959e001acaf", size = 159088, upload-time = "2025-10-08T22:01:38.235Z" }, { url = "https://files.pythonhosted.org/packages/26/5a/4b546a0405b9cc0659b399f12b6adb750757baf04250b148d3c5059fc4eb/tomli-2.3.0-cp314-cp314t-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:a56212bdcce682e56b0aaf79e869ba5d15a6163f88d5451cbde388d48b13f530", size = 268193, upload-time = "2025-10-08T22:01:39.712Z" }, { url = "https://files.pythonhosted.org/packages/42/4f/2c12a72ae22cf7b59a7fe75b3465b7aba40ea9145d026ba41cb382075b0e/tomli-2.3.0-cp314-cp314t-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:c5f3ffd1e098dfc032d4d3af5c0ac64f6d286d98bc148698356847b80fa4de1b", size = 275488, upload-time = "2025-10-08T22:01:40.773Z" }, { url = "https://files.pythonhosted.org/packages/92/04/a038d65dbe160c3aa5a624e93ad98111090f6804027d474ba9c37c8ae186/tomli-2.3.0-cp314-cp314t-musllinux_1_2_aarch64.whl", hash = "sha256:5e01decd096b1530d97d5d85cb4dff4af2d8347bd35686654a004f8dea20fc67", size = 272669, upload-time = "2025-10-08T22:01:41.824Z" }, { url = "https://files.pythonhosted.org/packages/be/2f/8b7c60a9d1612a7cbc39ffcca4f21a73bf368a80fc25bccf8253e2563267/tomli-2.3.0-cp314-cp314t-musllinux_1_2_x86_64.whl", hash = "sha256:8a35dd0e643bb2610f156cca8db95d213a90015c11fee76c946aa62b7ae7e02f", size = 279709, upload-time = "2025-10-08T22:01:43.177Z" }, { url = "https://files.pythonhosted.org/packages/7e/46/cc36c679f09f27ded940281c38607716c86cf8ba4a518d524e349c8b4874/tomli-2.3.0-cp314-cp314t-win32.whl", hash = "sha256:a1f7f282fe248311650081faafa5f4732bdbfef5d45fe3f2e702fbc6f2d496e0", size = 107563, upload-time = "2025-10-08T22:01:44.233Z" }, { url = "https://files.pythonhosted.org/packages/84/ff/426ca8683cf7b753614480484f6437f568fd2fda2edbdf57a2d3d8b27a0b/tomli-2.3.0-cp314-cp314t-win_amd64.whl", hash = "sha256:70a251f8d4ba2d9ac2542eecf008b3c8a9fc5c3f9f02c56a9d7952612be2fdba", size = 119756, upload-time = "2025-10-08T22:01:45.234Z" }, { url = "https://files.pythonhosted.org/packages/77/b8/0135fadc89e73be292b473cb820b4f5a08197779206b33191e801feeae40/tomli-2.3.0-py3-none-any.whl", hash = "sha256:e95b1af3c5b07d9e643909b5abbec77cd9f1217e6d0bca72b0234736b9fb1f1b", size = 14408, upload-time = "2025-10-08T22:01:46.04Z" }, ] [[package]] name = "traitlets" version = "5.14.3" source = { registry = "https://pypi.org/simple" } sdist = { url = "https://files.pythonhosted.org/packages/eb/79/72064e6a701c2183016abbbfedaba506d81e30e232a68c9f0d6f6fcd1574/traitlets-5.14.3.tar.gz", hash = "sha256:9ed0579d3502c94b4b3732ac120375cda96f923114522847de4b3bb98b96b6b7", size = 161621, upload-time = "2024-04-19T11:11:49.746Z" } wheels = [ { url = "https://files.pythonhosted.org/packages/00/c0/8f5d070730d7836adc9c9b6408dec68c6ced86b304a9b26a14df072a6e8c/traitlets-5.14.3-py3-none-any.whl", hash = "sha256:b74e89e397b1ed28cc831db7aea759ba6640cb3de13090ca145426688ff1ac4f", size = 85359, upload-time = "2024-04-19T11:11:46.763Z" }, ] [[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 = "untokenize" version = "0.1.1" source = { registry = "https://pypi.org/simple" } sdist = { url = "https://files.pythonhosted.org/packages/f7/46/e7cea8159199096e1df52da20a57a6665da80c37fb8aeb848a3e47442c32/untokenize-0.1.1.tar.gz", hash = "sha256:3865dbbbb8efb4bb5eaa72f1be7f3e0be00ea8b7f125c69cbd1f5fda926f37a2", size = 3099, upload-time = "2014-02-08T16:30:40.631Z" } [[package]] name = "virtualenv" version = "20.35.3" source = { registry = "https://pypi.org/simple" } dependencies = [ { name = "distlib" }, { name = "filelock" }, { name = "platformdirs" }, { name = "typing-extensions", marker = "python_full_version < '3.11'" }, ] sdist = { url = "https://files.pythonhosted.org/packages/a4/d5/b0ccd381d55c8f45d46f77df6ae59fbc23d19e901e2d523395598e5f4c93/virtualenv-20.35.3.tar.gz", hash = "sha256:4f1a845d131133bdff10590489610c98c168ff99dc75d6c96853801f7f67af44", size = 6002907, upload-time = "2025-10-10T21:23:33.178Z" } wheels = [ { url = "https://files.pythonhosted.org/packages/27/73/d9a94da0e9d470a543c1b9d3ccbceb0f59455983088e727b8a1824ed90fb/virtualenv-20.35.3-py3-none-any.whl", hash = "sha256:63d106565078d8c8d0b206d48080f938a8b25361e19432d2c9db40d2899c810a", size = 5981061, upload-time = "2025-10-10T21:23:30.433Z" }, ] [[package]] name = "watchdog" version = "6.0.0" source = { registry = "https://pypi.org/simple" } sdist = { url = "https://files.pythonhosted.org/packages/db/7d/7f3d619e951c88ed75c6037b246ddcf2d322812ee8ea189be89511721d54/watchdog-6.0.0.tar.gz", hash = "sha256:9ddf7c82fda3ae8e24decda1338ede66e1c99883db93711d8fb941eaa2d8c282", size = 131220, upload-time = "2024-11-01T14:07:13.037Z" } wheels = [ { url = "https://files.pythonhosted.org/packages/0c/56/90994d789c61df619bfc5ce2ecdabd5eeff564e1eb47512bd01b5e019569/watchdog-6.0.0-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:d1cdb490583ebd691c012b3d6dae011000fe42edb7a82ece80965b42abd61f26", size = 96390, upload-time = "2024-11-01T14:06:24.793Z" }, { url = "https://files.pythonhosted.org/packages/55/46/9a67ee697342ddf3c6daa97e3a587a56d6c4052f881ed926a849fcf7371c/watchdog-6.0.0-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:bc64ab3bdb6a04d69d4023b29422170b74681784ffb9463ed4870cf2f3e66112", size = 88389, upload-time = "2024-11-01T14:06:27.112Z" }, { url = "https://files.pythonhosted.org/packages/44/65/91b0985747c52064d8701e1075eb96f8c40a79df889e59a399453adfb882/watchdog-6.0.0-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:c897ac1b55c5a1461e16dae288d22bb2e412ba9807df8397a635d88f671d36c3", size = 89020, upload-time = "2024-11-01T14:06:29.876Z" }, { url = "https://files.pythonhosted.org/packages/e0/24/d9be5cd6642a6aa68352ded4b4b10fb0d7889cb7f45814fb92cecd35f101/watchdog-6.0.0-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:6eb11feb5a0d452ee41f824e271ca311a09e250441c262ca2fd7ebcf2461a06c", size = 96393, upload-time = "2024-11-01T14:06:31.756Z" }, { url = "https://files.pythonhosted.org/packages/63/7a/6013b0d8dbc56adca7fdd4f0beed381c59f6752341b12fa0886fa7afc78b/watchdog-6.0.0-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:ef810fbf7b781a5a593894e4f439773830bdecb885e6880d957d5b9382a960d2", size = 88392, upload-time = "2024-11-01T14:06:32.99Z" }, { url = "https://files.pythonhosted.org/packages/d1/40/b75381494851556de56281e053700e46bff5b37bf4c7267e858640af5a7f/watchdog-6.0.0-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:afd0fe1b2270917c5e23c2a65ce50c2a4abb63daafb0d419fde368e272a76b7c", size = 89019, upload-time = "2024-11-01T14:06:34.963Z" }, { url = "https://files.pythonhosted.org/packages/39/ea/3930d07dafc9e286ed356a679aa02d777c06e9bfd1164fa7c19c288a5483/watchdog-6.0.0-cp312-cp312-macosx_10_13_universal2.whl", hash = "sha256:bdd4e6f14b8b18c334febb9c4425a878a2ac20efd1e0b231978e7b150f92a948", size = 96471, upload-time = "2024-11-01T14:06:37.745Z" }, { url = "https://files.pythonhosted.org/packages/12/87/48361531f70b1f87928b045df868a9fd4e253d9ae087fa4cf3f7113be363/watchdog-6.0.0-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:c7c15dda13c4eb00d6fb6fc508b3c0ed88b9d5d374056b239c4ad1611125c860", size = 88449, upload-time = "2024-11-01T14:06:39.748Z" }, { url = "https://files.pythonhosted.org/packages/5b/7e/8f322f5e600812e6f9a31b75d242631068ca8f4ef0582dd3ae6e72daecc8/watchdog-6.0.0-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:6f10cb2d5902447c7d0da897e2c6768bca89174d0c6e1e30abec5421af97a5b0", size = 89054, upload-time = "2024-11-01T14:06:41.009Z" }, { url = "https://files.pythonhosted.org/packages/68/98/b0345cabdce2041a01293ba483333582891a3bd5769b08eceb0d406056ef/watchdog-6.0.0-cp313-cp313-macosx_10_13_universal2.whl", hash = "sha256:490ab2ef84f11129844c23fb14ecf30ef3d8a6abafd3754a6f75ca1e6654136c", size = 96480, upload-time = "2024-11-01T14:06:42.952Z" }, { url = "https://files.pythonhosted.org/packages/85/83/cdf13902c626b28eedef7ec4f10745c52aad8a8fe7eb04ed7b1f111ca20e/watchdog-6.0.0-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:76aae96b00ae814b181bb25b1b98076d5fc84e8a53cd8885a318b42b6d3a5134", size = 88451, upload-time = "2024-11-01T14:06:45.084Z" }, { url = "https://files.pythonhosted.org/packages/fe/c4/225c87bae08c8b9ec99030cd48ae9c4eca050a59bf5c2255853e18c87b50/watchdog-6.0.0-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:a175f755fc2279e0b7312c0035d52e27211a5bc39719dd529625b1930917345b", size = 89057, upload-time = "2024-11-01T14:06:47.324Z" }, { url = "https://files.pythonhosted.org/packages/30/ad/d17b5d42e28a8b91f8ed01cb949da092827afb9995d4559fd448d0472763/watchdog-6.0.0-pp310-pypy310_pp73-macosx_10_15_x86_64.whl", hash = "sha256:c7ac31a19f4545dd92fc25d200694098f42c9a8e391bc00bdd362c5736dbf881", size = 87902, upload-time = "2024-11-01T14:06:53.119Z" }, { url = "https://files.pythonhosted.org/packages/5c/ca/c3649991d140ff6ab67bfc85ab42b165ead119c9e12211e08089d763ece5/watchdog-6.0.0-pp310-pypy310_pp73-macosx_11_0_arm64.whl", hash = "sha256:9513f27a1a582d9808cf21a07dae516f0fab1cf2d7683a742c498b93eedabb11", size = 88380, upload-time = "2024-11-01T14:06:55.19Z" }, { url = "https://files.pythonhosted.org/packages/a9/c7/ca4bf3e518cb57a686b2feb4f55a1892fd9a3dd13f470fca14e00f80ea36/watchdog-6.0.0-py3-none-manylinux2014_aarch64.whl", hash = "sha256:7607498efa04a3542ae3e05e64da8202e58159aa1fa4acddf7678d34a35d4f13", size = 79079, upload-time = "2024-11-01T14:06:59.472Z" }, { url = "https://files.pythonhosted.org/packages/5c/51/d46dc9332f9a647593c947b4b88e2381c8dfc0942d15b8edc0310fa4abb1/watchdog-6.0.0-py3-none-manylinux2014_armv7l.whl", hash = "sha256:9041567ee8953024c83343288ccc458fd0a2d811d6a0fd68c4c22609e3490379", size = 79078, upload-time = "2024-11-01T14:07:01.431Z" }, { url = "https://files.pythonhosted.org/packages/d4/57/04edbf5e169cd318d5f07b4766fee38e825d64b6913ca157ca32d1a42267/watchdog-6.0.0-py3-none-manylinux2014_i686.whl", hash = "sha256:82dc3e3143c7e38ec49d61af98d6558288c415eac98486a5c581726e0737c00e", size = 79076, upload-time = "2024-11-01T14:07:02.568Z" }, { url = "https://files.pythonhosted.org/packages/ab/cc/da8422b300e13cb187d2203f20b9253e91058aaf7db65b74142013478e66/watchdog-6.0.0-py3-none-manylinux2014_ppc64.whl", hash = "sha256:212ac9b8bf1161dc91bd09c048048a95ca3a4c4f5e5d4a7d1b1a7d5752a7f96f", size = 79077, upload-time = "2024-11-01T14:07:03.893Z" }, { url = "https://files.pythonhosted.org/packages/2c/3b/b8964e04ae1a025c44ba8e4291f86e97fac443bca31de8bd98d3263d2fcf/watchdog-6.0.0-py3-none-manylinux2014_ppc64le.whl", hash = "sha256:e3df4cbb9a450c6d49318f6d14f4bbc80d763fa587ba46ec86f99f9e6876bb26", size = 79078, upload-time = "2024-11-01T14:07:05.189Z" }, { url = "https://files.pythonhosted.org/packages/62/ae/a696eb424bedff7407801c257d4b1afda455fe40821a2be430e173660e81/watchdog-6.0.0-py3-none-manylinux2014_s390x.whl", hash = "sha256:2cce7cfc2008eb51feb6aab51251fd79b85d9894e98ba847408f662b3395ca3c", size = 79077, upload-time = "2024-11-01T14:07:06.376Z" }, { url = "https://files.pythonhosted.org/packages/b5/e8/dbf020b4d98251a9860752a094d09a65e1b436ad181faf929983f697048f/watchdog-6.0.0-py3-none-manylinux2014_x86_64.whl", hash = "sha256:20ffe5b202af80ab4266dcd3e91aae72bf2da48c0d33bdb15c66658e685e94e2", size = 79078, upload-time = "2024-11-01T14:07:07.547Z" }, { url = "https://files.pythonhosted.org/packages/07/f6/d0e5b343768e8bcb4cda79f0f2f55051bf26177ecd5651f84c07567461cf/watchdog-6.0.0-py3-none-win32.whl", hash = "sha256:07df1fdd701c5d4c8e55ef6cf55b8f0120fe1aef7ef39a1c6fc6bc2e606d517a", size = 79065, upload-time = "2024-11-01T14:07:09.525Z" }, { url = "https://files.pythonhosted.org/packages/db/d9/c495884c6e548fce18a8f40568ff120bc3a4b7b99813081c8ac0c936fa64/watchdog-6.0.0-py3-none-win_amd64.whl", hash = "sha256:cbafb470cf848d93b5d013e2ecb245d4aa1c8fd0504e863ccefa32445359d680", size = 79070, upload-time = "2024-11-01T14:07:10.686Z" }, { url = "https://files.pythonhosted.org/packages/33/e8/e40370e6d74ddba47f002a32919d91310d6074130fe4e17dabcafc15cbf1/watchdog-6.0.0-py3-none-win_ia64.whl", hash = "sha256:a1914259fa9e1454315171103c6a30961236f508b9b623eae470268bbcc6a22f", size = 79067, upload-time = "2024-11-01T14:07:11.845Z" }, ] [[package]] name = "wcwidth" version = "0.2.14" source = { registry = "https://pypi.org/simple" } sdist = { url = "https://files.pythonhosted.org/packages/24/30/6b0809f4510673dc723187aeaf24c7f5459922d01e2f794277a3dfb90345/wcwidth-0.2.14.tar.gz", hash = "sha256:4d478375d31bc5395a3c55c40ccdf3354688364cd61c4f6adacaa9215d0b3605", size = 102293, upload-time = "2025-09-22T16:29:53.023Z" } wheels = [ { url = "https://files.pythonhosted.org/packages/af/b5/123f13c975e9f27ab9c0770f514345bd406d0e8d3b7a0723af9d43f710af/wcwidth-0.2.14-py2.py3-none-any.whl", hash = "sha256:a7bb560c8aee30f9957e5f9895805edd20602f2d7f720186dfd906e82b4982e1", size = 37286, upload-time = "2025-09-22T16:29:51.641Z" }, ] [[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/d1/43/a2204825342f37c337f5edb6637040fa14e365b2fcc2346960201d457579/yarl-1.22.0-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:c7bd6683587567e5a49ee6e336e0612bec8329be1b7d4c8af5687dcdeb67ee1e", size = 140517, upload-time = "2025-10-06T14:08:42.494Z" }, { url = "https://files.pythonhosted.org/packages/44/6f/674f3e6f02266428c56f704cd2501c22f78e8b2eeb23f153117cc86fb28a/yarl-1.22.0-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:5cdac20da754f3a723cceea5b3448e1a2074866406adeb4ef35b469d089adb8f", size = 93495, upload-time = "2025-10-06T14:08:46.2Z" }, { url = "https://files.pythonhosted.org/packages/b8/12/5b274d8a0f30c07b91b2f02cba69152600b47830fcfb465c108880fcee9c/yarl-1.22.0-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:07a524d84df0c10f41e3ee918846e1974aba4ec017f990dc735aad487a0bdfdf", size = 94400, upload-time = "2025-10-06T14:08:47.855Z" }, { url = "https://files.pythonhosted.org/packages/e2/7f/df1b6949b1fa1aa9ff6de6e2631876ad4b73c4437822026e85d8acb56bb1/yarl-1.22.0-cp310-cp310-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:e1b329cb8146d7b736677a2440e422eadd775d1806a81db2d4cded80a48efc1a", size = 347545, upload-time = "2025-10-06T14:08:49.683Z" }, { url = "https://files.pythonhosted.org/packages/84/09/f92ed93bd6cd77872ab6c3462df45ca45cd058d8f1d0c9b4f54c1704429f/yarl-1.22.0-cp310-cp310-manylinux2014_armv7l.manylinux_2_17_armv7l.manylinux_2_31_armv7l.whl", hash = "sha256:75976c6945d85dbb9ee6308cd7ff7b1fb9409380c82d6119bd778d8fcfe2931c", size = 319598, upload-time = "2025-10-06T14:08:51.215Z" }, { url = "https://files.pythonhosted.org/packages/c3/97/ac3f3feae7d522cf7ccec3d340bb0b2b61c56cb9767923df62a135092c6b/yarl-1.22.0-cp310-cp310-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:80ddf7a5f8c86cb3eb4bc9028b07bbbf1f08a96c5c0bc1244be5e8fefcb94147", size = 363893, upload-time = "2025-10-06T14:08:53.144Z" }, { url = "https://files.pythonhosted.org/packages/06/49/f3219097403b9c84a4d079b1d7bda62dd9b86d0d6e4428c02d46ab2c77fc/yarl-1.22.0-cp310-cp310-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:d332fc2e3c94dad927f2112395772a4e4fedbcf8f80efc21ed7cdfae4d574fdb", size = 371240, upload-time = "2025-10-06T14:08:55.036Z" }, { url = "https://files.pythonhosted.org/packages/35/9f/06b765d45c0e44e8ecf0fe15c9eacbbde342bb5b7561c46944f107bfb6c3/yarl-1.22.0-cp310-cp310-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:0cf71bf877efeac18b38d3930594c0948c82b64547c1cf420ba48722fe5509f6", size = 346965, upload-time = "2025-10-06T14:08:56.722Z" }, { url = "https://files.pythonhosted.org/packages/c5/69/599e7cea8d0fcb1694323b0db0dda317fa3162f7b90166faddecf532166f/yarl-1.22.0-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:663e1cadaddae26be034a6ab6072449a8426ddb03d500f43daf952b74553bba0", size = 342026, upload-time = "2025-10-06T14:08:58.563Z" }, { url = "https://files.pythonhosted.org/packages/95/6f/9dfd12c8bc90fea9eab39832ee32ea48f8e53d1256252a77b710c065c89f/yarl-1.22.0-cp310-cp310-musllinux_1_2_armv7l.whl", hash = "sha256:6dcbb0829c671f305be48a7227918cfcd11276c2d637a8033a99a02b67bf9eda", size = 335637, upload-time = "2025-10-06T14:09:00.506Z" }, { url = "https://files.pythonhosted.org/packages/57/2e/34c5b4eb9b07e16e873db5b182c71e5f06f9b5af388cdaa97736d79dd9a6/yarl-1.22.0-cp310-cp310-musllinux_1_2_ppc64le.whl", hash = "sha256:f0d97c18dfd9a9af4490631905a3f131a8e4c9e80a39353919e2cfed8f00aedc", size = 359082, upload-time = "2025-10-06T14:09:01.936Z" }, { url = "https://files.pythonhosted.org/packages/31/71/fa7e10fb772d273aa1f096ecb8ab8594117822f683bab7d2c5a89914c92a/yarl-1.22.0-cp310-cp310-musllinux_1_2_s390x.whl", hash = "sha256:437840083abe022c978470b942ff832c3940b2ad3734d424b7eaffcd07f76737", size = 357811, upload-time = "2025-10-06T14:09:03.445Z" }, { url = "https://files.pythonhosted.org/packages/26/da/11374c04e8e1184a6a03cf9c8f5688d3e5cec83ed6f31ad3481b3207f709/yarl-1.22.0-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:a899cbd98dce6f5d8de1aad31cb712ec0a530abc0a86bd6edaa47c1090138467", size = 351223, upload-time = "2025-10-06T14:09:05.401Z" }, { url = "https://files.pythonhosted.org/packages/82/8f/e2d01f161b0c034a30410e375e191a5d27608c1f8693bab1a08b089ca096/yarl-1.22.0-cp310-cp310-win32.whl", hash = "sha256:595697f68bd1f0c1c159fcb97b661fc9c3f5db46498043555d04805430e79bea", size = 82118, upload-time = "2025-10-06T14:09:11.148Z" }, { url = "https://files.pythonhosted.org/packages/62/46/94c76196642dbeae634c7a61ba3da88cd77bed875bf6e4a8bed037505aa6/yarl-1.22.0-cp310-cp310-win_amd64.whl", hash = "sha256:cb95a9b1adaa48e41815a55ae740cfda005758104049a640a398120bf02515ca", size = 86852, upload-time = "2025-10-06T14:09:12.958Z" }, { url = "https://files.pythonhosted.org/packages/af/af/7df4f179d3b1a6dcb9a4bd2ffbc67642746fcafdb62580e66876ce83fff4/yarl-1.22.0-cp310-cp310-win_arm64.whl", hash = "sha256:b85b982afde6df99ecc996990d4ad7ccbdbb70e2a4ba4de0aecde5922ba98a0b", size = 82012, upload-time = "2025-10-06T14:09:14.664Z" }, { url = "https://files.pythonhosted.org/packages/4d/27/5ab13fc84c76a0250afd3d26d5936349a35be56ce5785447d6c423b26d92/yarl-1.22.0-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:1ab72135b1f2db3fed3997d7e7dc1b80573c67138023852b6efb336a5eae6511", size = 141607, upload-time = "2025-10-06T14:09:16.298Z" }, { url = "https://files.pythonhosted.org/packages/6a/a1/d065d51d02dc02ce81501d476b9ed2229d9a990818332242a882d5d60340/yarl-1.22.0-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:669930400e375570189492dc8d8341301578e8493aec04aebc20d4717f899dd6", size = 94027, upload-time = "2025-10-06T14:09:17.786Z" }, { url = "https://files.pythonhosted.org/packages/c1/da/8da9f6a53f67b5106ffe902c6fa0164e10398d4e150d85838b82f424072a/yarl-1.22.0-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:792a2af6d58177ef7c19cbf0097aba92ca1b9cb3ffdd9c7470e156c8f9b5e028", size = 94963, upload-time = "2025-10-06T14:09:19.662Z" }, { url = "https://files.pythonhosted.org/packages/68/fe/2c1f674960c376e29cb0bec1249b117d11738db92a6ccc4a530b972648db/yarl-1.22.0-cp311-cp311-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:3ea66b1c11c9150f1372f69afb6b8116f2dd7286f38e14ea71a44eee9ec51b9d", size = 368406, upload-time = "2025-10-06T14:09:21.402Z" }, { url = "https://files.pythonhosted.org/packages/95/26/812a540e1c3c6418fec60e9bbd38e871eaba9545e94fa5eff8f4a8e28e1e/yarl-1.22.0-cp311-cp311-manylinux2014_armv7l.manylinux_2_17_armv7l.manylinux_2_31_armv7l.whl", hash = "sha256:3e2daa88dc91870215961e96a039ec73e4937da13cf77ce17f9cad0c18df3503", size = 336581, upload-time = "2025-10-06T14:09:22.98Z" }, { url = "https://files.pythonhosted.org/packages/0b/f5/5777b19e26fdf98563985e481f8be3d8a39f8734147a6ebf459d0dab5a6b/yarl-1.22.0-cp311-cp311-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:ba440ae430c00eee41509353628600212112cd5018d5def7e9b05ea7ac34eb65", size = 388924, upload-time = "2025-10-06T14:09:24.655Z" }, { url = "https://files.pythonhosted.org/packages/86/08/24bd2477bd59c0bbd994fe1d93b126e0472e4e3df5a96a277b0a55309e89/yarl-1.22.0-cp311-cp311-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:e6438cc8f23a9c1478633d216b16104a586b9761db62bfacb6425bac0a36679e", size = 392890, upload-time = "2025-10-06T14:09:26.617Z" }, { url = "https://files.pythonhosted.org/packages/46/00/71b90ed48e895667ecfb1eaab27c1523ee2fa217433ed77a73b13205ca4b/yarl-1.22.0-cp311-cp311-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:4c52a6e78aef5cf47a98ef8e934755abf53953379b7d53e68b15ff4420e6683d", size = 365819, upload-time = "2025-10-06T14:09:28.544Z" }, { url = "https://files.pythonhosted.org/packages/30/2d/f715501cae832651d3282387c6a9236cd26bd00d0ff1e404b3dc52447884/yarl-1.22.0-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:3b06bcadaac49c70f4c88af4ffcfbe3dc155aab3163e75777818092478bcbbe7", size = 363601, upload-time = "2025-10-06T14:09:30.568Z" }, { url = "https://files.pythonhosted.org/packages/f8/f9/a678c992d78e394e7126ee0b0e4e71bd2775e4334d00a9278c06a6cce96a/yarl-1.22.0-cp311-cp311-musllinux_1_2_armv7l.whl", hash = "sha256:6944b2dc72c4d7f7052683487e3677456050ff77fcf5e6204e98caf785ad1967", size = 358072, upload-time = "2025-10-06T14:09:32.528Z" }, { url = "https://files.pythonhosted.org/packages/2c/d1/b49454411a60edb6fefdcad4f8e6dbba7d8019e3a508a1c5836cba6d0781/yarl-1.22.0-cp311-cp311-musllinux_1_2_ppc64le.whl", hash = "sha256:d5372ca1df0f91a86b047d1277c2aaf1edb32d78bbcefffc81b40ffd18f027ed", size = 385311, upload-time = "2025-10-06T14:09:34.634Z" }, { url = "https://files.pythonhosted.org/packages/87/e5/40d7a94debb8448c7771a916d1861d6609dddf7958dc381117e7ba36d9e8/yarl-1.22.0-cp311-cp311-musllinux_1_2_s390x.whl", hash = "sha256:51af598701f5299012b8416486b40fceef8c26fc87dc6d7d1f6fc30609ea0aa6", size = 381094, upload-time = "2025-10-06T14:09:36.268Z" }, { url = "https://files.pythonhosted.org/packages/35/d8/611cc282502381ad855448643e1ad0538957fc82ae83dfe7762c14069e14/yarl-1.22.0-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:b266bd01fedeffeeac01a79ae181719ff848a5a13ce10075adbefc8f1daee70e", size = 370944, upload-time = "2025-10-06T14:09:37.872Z" }, { url = "https://files.pythonhosted.org/packages/2d/df/fadd00fb1c90e1a5a8bd731fa3d3de2e165e5a3666a095b04e31b04d9cb6/yarl-1.22.0-cp311-cp311-win32.whl", hash = "sha256:a9b1ba5610a4e20f655258d5a1fdc7ebe3d837bb0e45b581398b99eb98b1f5ca", size = 81804, upload-time = "2025-10-06T14:09:39.359Z" }, { url = "https://files.pythonhosted.org/packages/b5/f7/149bb6f45f267cb5c074ac40c01c6b3ea6d8a620d34b337f6321928a1b4d/yarl-1.22.0-cp311-cp311-win_amd64.whl", hash = "sha256:078278b9b0b11568937d9509b589ee83ef98ed6d561dfe2020e24a9fd08eaa2b", size = 86858, upload-time = "2025-10-06T14:09:41.068Z" }, { url = "https://files.pythonhosted.org/packages/2b/13/88b78b93ad3f2f0b78e13bfaaa24d11cbc746e93fe76d8c06bf139615646/yarl-1.22.0-cp311-cp311-win_arm64.whl", hash = "sha256:b6a6f620cfe13ccec221fa312139135166e47ae169f8253f72a0abc0dae94376", size = 81637, upload-time = "2025-10-06T14:09:42.712Z" }, { url = "https://files.pythonhosted.org/packages/75/ff/46736024fee3429b80a165a732e38e5d5a238721e634ab41b040d49f8738/yarl-1.22.0-cp312-cp312-macosx_10_13_universal2.whl", hash = "sha256:e340382d1afa5d32b892b3ff062436d592ec3d692aeea3bef3a5cfe11bbf8c6f", size = 142000, upload-time = "2025-10-06T14:09:44.631Z" }, { url = "https://files.pythonhosted.org/packages/5a/9a/b312ed670df903145598914770eb12de1bac44599549b3360acc96878df8/yarl-1.22.0-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:f1e09112a2c31ffe8d80be1b0988fa6a18c5d5cad92a9ffbb1c04c91bfe52ad2", size = 94338, upload-time = "2025-10-06T14:09:46.372Z" }, { url = "https://files.pythonhosted.org/packages/ba/f5/0601483296f09c3c65e303d60c070a5c19fcdbc72daa061e96170785bc7d/yarl-1.22.0-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:939fe60db294c786f6b7c2d2e121576628468f65453d86b0fe36cb52f987bd74", size = 94909, upload-time = "2025-10-06T14:09:48.648Z" }, { url = "https://files.pythonhosted.org/packages/60/41/9a1fe0b73dbcefce72e46cf149b0e0a67612d60bfc90fb59c2b2efdfbd86/yarl-1.22.0-cp312-cp312-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:e1651bf8e0398574646744c1885a41198eba53dc8a9312b954073f845c90a8df", size = 372940, upload-time = "2025-10-06T14:09:50.089Z" }, { url = "https://files.pythonhosted.org/packages/17/7a/795cb6dfee561961c30b800f0ed616b923a2ec6258b5def2a00bf8231334/yarl-1.22.0-cp312-cp312-manylinux2014_armv7l.manylinux_2_17_armv7l.manylinux_2_31_armv7l.whl", hash = "sha256:b8a0588521a26bf92a57a1705b77b8b59044cdceccac7151bd8d229e66b8dedb", size = 345825, upload-time = "2025-10-06T14:09:52.142Z" }, { url = "https://files.pythonhosted.org/packages/d7/93/a58f4d596d2be2ae7bab1a5846c4d270b894958845753b2c606d666744d3/yarl-1.22.0-cp312-cp312-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:42188e6a615c1a75bcaa6e150c3fe8f3e8680471a6b10150c5f7e83f47cc34d2", size = 386705, upload-time = "2025-10-06T14:09:54.128Z" }, { url = "https://files.pythonhosted.org/packages/61/92/682279d0e099d0e14d7fd2e176bd04f48de1484f56546a3e1313cd6c8e7c/yarl-1.22.0-cp312-cp312-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:f6d2cb59377d99718913ad9a151030d6f83ef420a2b8f521d94609ecc106ee82", size = 396518, upload-time = "2025-10-06T14:09:55.762Z" }, { url = "https://files.pythonhosted.org/packages/db/0f/0d52c98b8a885aeda831224b78f3be7ec2e1aa4a62091f9f9188c3c65b56/yarl-1.22.0-cp312-cp312-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:50678a3b71c751d58d7908edc96d332af328839eea883bb554a43f539101277a", size = 377267, upload-time = "2025-10-06T14:09:57.958Z" }, { url = "https://files.pythonhosted.org/packages/22/42/d2685e35908cbeaa6532c1fc73e89e7f2efb5d8a7df3959ea8e37177c5a3/yarl-1.22.0-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:1e8fbaa7cec507aa24ea27a01456e8dd4b6fab829059b69844bd348f2d467124", size = 365797, upload-time = "2025-10-06T14:09:59.527Z" }, { url = "https://files.pythonhosted.org/packages/a2/83/cf8c7bcc6355631762f7d8bdab920ad09b82efa6b722999dfb05afa6cfac/yarl-1.22.0-cp312-cp312-musllinux_1_2_armv7l.whl", hash = "sha256:433885ab5431bc3d3d4f2f9bd15bfa1614c522b0f1405d62c4f926ccd69d04fa", size = 365535, upload-time = "2025-10-06T14:10:01.139Z" }, { url = "https://files.pythonhosted.org/packages/25/e1/5302ff9b28f0c59cac913b91fe3f16c59a033887e57ce9ca5d41a3a94737/yarl-1.22.0-cp312-cp312-musllinux_1_2_ppc64le.whl", hash = "sha256:b790b39c7e9a4192dc2e201a282109ed2985a1ddbd5ac08dc56d0e121400a8f7", size = 382324, upload-time = "2025-10-06T14:10:02.756Z" }, { url = "https://files.pythonhosted.org/packages/bf/cd/4617eb60f032f19ae3a688dc990d8f0d89ee0ea378b61cac81ede3e52fae/yarl-1.22.0-cp312-cp312-musllinux_1_2_s390x.whl", hash = "sha256:31f0b53913220599446872d757257be5898019c85e7971599065bc55065dc99d", size = 383803, upload-time = "2025-10-06T14:10:04.552Z" }, { url = "https://files.pythonhosted.org/packages/59/65/afc6e62bb506a319ea67b694551dab4a7e6fb7bf604e9bd9f3e11d575fec/yarl-1.22.0-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:a49370e8f711daec68d09b821a34e1167792ee2d24d405cbc2387be4f158b520", size = 374220, upload-time = "2025-10-06T14:10:06.489Z" }, { url = "https://files.pythonhosted.org/packages/e7/3d/68bf18d50dc674b942daec86a9ba922d3113d8399b0e52b9897530442da2/yarl-1.22.0-cp312-cp312-win32.whl", hash = "sha256:70dfd4f241c04bd9239d53b17f11e6ab672b9f1420364af63e8531198e3f5fe8", size = 81589, upload-time = "2025-10-06T14:10:09.254Z" }, { url = "https://files.pythonhosted.org/packages/c8/9a/6ad1a9b37c2f72874f93e691b2e7ecb6137fb2b899983125db4204e47575/yarl-1.22.0-cp312-cp312-win_amd64.whl", hash = "sha256:8884d8b332a5e9b88e23f60bb166890009429391864c685e17bd73a9eda9105c", size = 87213, upload-time = "2025-10-06T14:10:11.369Z" }, { url = "https://files.pythonhosted.org/packages/44/c5/c21b562d1680a77634d748e30c653c3ca918beb35555cff24986fff54598/yarl-1.22.0-cp312-cp312-win_arm64.whl", hash = "sha256:ea70f61a47f3cc93bdf8b2f368ed359ef02a01ca6393916bc8ff877427181e74", size = 81330, upload-time = "2025-10-06T14:10:13.112Z" }, { 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" }, ] aiomusiccast-0.15.0/.github/release-drafter.yml0000644000000000000000000000114613615410400016333 0ustar00name-template: $NEXT_MINOR_VERSION tag-template: $NEXT_MINOR_VERSION categories: - title: ⬆ï¸� Dependencies label: dependencies - title: 🚀 Features label: feature - title: ðŸ�› Bug Fixes labels: - fix - bug - title: 🧰 Maintenance label: chore - title: 🚨 Breaking Changes label: breaking version-resolver: major: labels: - 'major' - 'breaking' minor: labels: - 'minor' - 'feature' patch: labels: - 'patch' - 'dependencies' - 'chore' - 'fix' default: patch template: | ## Changes $CHANGES aiomusiccast-0.15.0/.github/workflows/ci.yml0000644000000000000000000000114413615410400015714 0ustar00name: CI on: pull_request: push: branches: [main] jobs: quality: runs-on: ubuntu-latest steps: - uses: actions/checkout@v4 - name: Set up Python uses: actions/setup-python@v5 with: python-version: "3.12" - name: Install uv toolchain run: | python -m pip install --upgrade pip python -m pip install uv - name: Sync dependencies run: uv sync --locked --group dev --group docs - name: Run pre-commit hooks run: uv run pre-commit run --all-files - name: Build package run: uv build aiomusiccast-0.15.0/.github/workflows/publish-to-pypi.yml0000644000000000000000000000143113615410400020365 0ustar00name: Publish (PyPI) on: release: types: [published] jobs: deploy: runs-on: ubuntu-latest steps: - uses: actions/checkout@v4 with: fetch-depth: 0 # ensure tags are available for git describe - name: Set up Python uses: actions/setup-python@v5 with: python-version: "3.12" - name: Install uv toolchain run: | python -m pip install --upgrade pip python -m pip install uv hatch - name: Sync dependencies run: uv sync --locked - name: Set project version from tag run: uv run hatch version "$(git describe --tags --abbrev=0)" - name: Build distribution run: uv build - name: Publish to PyPI env: UV_PUBLISH_TOKEN: ${{ secrets.PYPI_TOKEN }} run: uv publish aiomusiccast-0.15.0/.github/workflows/publish-to-test-pypi.yml0000644000000000000000000000322213615410400021342 0ustar00name: Publish (Test PyPI) on: workflow_dispatch: inputs: prerelease_suffix: description: "Optional suffix to append (e.g. dev42). Leave empty to auto-generate." required: false release: types: [created] jobs: deploy: runs-on: ubuntu-latest steps: - uses: actions/checkout@v4 with: fetch-depth: 0 - name: Set up Python uses: actions/setup-python@v5 with: python-version: "3.12" - name: Install uv toolchain run: | python -m pip install --upgrade pip python -m pip install uv hatch - name: Sync dependencies run: uv sync --locked - name: Determine version id: version env: EVENT_NAME: ${{ github.event_name }} RELEASE_TAG: ${{ github.event.release.tag_name }} PRERELEASE_SUFFIX: ${{ inputs.prerelease_suffix }} RUN_NUMBER: ${{ github.run_number }} run: | if [[ "$EVENT_NAME" == "release" && -n "$RELEASE_TAG" ]]; then VERSION="$RELEASE_TAG" else BASE_TAG=$(git describe --tags --abbrev=0 2>/dev/null || echo "0.0.0") VERSION="${BASE_TAG}.dev${RUN_NUMBER}" fi if [[ -n "$PRERELEASE_SUFFIX" ]]; then VERSION="${VERSION}.${PRERELEASE_SUFFIX}" fi echo "version=$VERSION" >> "$GITHUB_OUTPUT" - name: Set project version run: uv run hatch version "${{ steps.version.outputs.version }}" - name: Build distribution run: uv build - name: Publish to Test PyPI env: UV_PUBLISH_TOKEN: ${{ secrets.TEST_PYPI_TOKEN }} run: uv publish --publish-url https://test.pypi.org/legacy/ aiomusiccast-0.15.0/.github/workflows/release-drafter.yml0000644000000000000000000000060713615410400020371 0ustar00name: Release Drafter on: push: # branches to consider in the event; optional, defaults to all branches: - main jobs: update_release_draft: runs-on: ubuntu-latest steps: # Drafts your next Release notes as Pull Requests are merged into "main" - uses: release-drafter/release-drafter@v5 env: GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} aiomusiccast-0.15.0/.vscode/settings.json0000644000000000000000000000011513615410400015272 0ustar00{ "python.pythonPath": "venv/bin/python", "editor.rulers": [80,88] } aiomusiccast-0.15.0/aiomusiccast/__init__.py0000644000000000000000000000143513615410400016001 0ustar00from importlib import metadata from .exceptions import MusicCastConnectionException, MusicCastException, MusicCastGroupException from .features import DeviceFeature, ZoneFeature from .musiccast_data import MusicCastData, MusicCastZoneData from .musiccast_device import ( MusicCastDevice, ) from .musiccast_media_content import MusicCastMediaContent __all__ = [ "DeviceFeature", "MusicCastConnectionException", "MusicCastData", "MusicCastDevice", "MusicCastException", "MusicCastGroupException", "MusicCastMediaContent", "MusicCastZoneData", "ZoneFeature", ] # Placeholder value replaced via `hatch version`. __version__ = "0.15.0" try: __version__ = metadata.version("aiomusiccast") except metadata.PackageNotFoundError: __version__ = "(local)" aiomusiccast-0.15.0/aiomusiccast/__main__.py0000644000000000000000000000041313615410400015755 0ustar00#!/usr/bin/env python """Package entry point.""" def main() -> None: """Abort because no command-line interface is provided.""" raise SystemExit("aiomusiccast does not expose a CLI entry point.") if __name__ == "__main__": # pragma: no cover main() aiomusiccast-0.15.0/aiomusiccast/capabilities.py0000644000000000000000000001276413615410400016702 0ustar00from __future__ import annotations from abc import ABC from collections.abc import Awaitable, Callable, Mapping from enum import Enum from typing import Any from aiomusiccast.musiccast_data import RangeStep class EntityType(Enum): """Type of the Capability.""" REGULAR = 1 # For major features CONFIG = 2 # For features to configure the device or a zone DIAGNOSTIC = 3 # For diagnostic values or settings class Capability(ABC): """Base class for all capabilities.""" id: str name: str entity_type: EntityType get_value: Callable[[], Any] def __init__( self, capability_id: str, name: str, entity_type: EntityType, get_value: Callable[[], Any], ) -> None: """Initialize the base class and set general vars. Parameters ---------- capability_id : Any Unique ID of this capability. name : Any Name that should be displayed in a UI. entity_type : Any Defines the type of entity the capability represents. get_value : Callable[[], Any] Callback that returns the current value of the capability. """ self.id = capability_id self.name = name self.entity_type = entity_type self.get_value = get_value @property def current(self) -> Any: return self.get_value() class SettableCapability(Capability, ABC): """Base class for a capability, which is not read only.""" set_value: Callable[[Any], Awaitable[None]] def __init__( self, capability_id: str, name: str, entity_type: EntityType, get_value: Callable[[], Any], set_value: Callable[[Any], Awaitable[None]], ) -> None: """Initialize the setable base class. Parameters ---------- capability_id : Any Unique ID of this capability. name : Any Name that should be displayed in a UI. entity_type : Any Defines the type of entity this capability represents. get_value : Callable[[], Any] Callback used to obtain the current value. set_value : Callable[[Any], Awaitable[None]] Asynchronous callback that persists new values supplied by the caller. """ super().__init__(capability_id, name, entity_type, get_value) self.set_value = set_value async def set(self, value: Any) -> None: await self.set_value(value) class NumberSensor(Capability): pass class BinarySensor(Capability): pass class TextSensor(Capability): pass class NumberSetter(SettableCapability): """Class to set numbers.""" value_range: RangeStep def __init__( self, capability_id: str, name: str, entity_type: EntityType, get_value: Callable[[], Any], set_value: Callable[[Any], Awaitable[None]], min_value: int, max_value: int, step: int, ) -> None: """Initialize a NumberSetter. Parameters ---------- capability_id : Any Unique ID of this capability name : Any Name that should be displayed in a UI entity_type : Any Define of what type this capability is get_value : Any Callable to get the current values of this capability set_value : Any Callable to set the value. Should only expect the new values as parameter min_value : Any Minimum value, which can be set max_value : Any Maximum value, which can be set step : Any The step between minimum and maximum """ super().__init__(capability_id, name, entity_type, get_value, set_value) self.value_range = RangeStep(min_value, max_value, step) async def set(self, value: int) -> None: self.value_range.check(value) await super().set(value) class OptionSetter(SettableCapability): """A capability to set a value from a list of valid options.""" options: Mapping[str | int, str] def __init__( self, capability_id: str, name: str, entity_type: EntityType, get_value: Callable[[], Any], set_value: Callable[[Any], Awaitable[None]], options: Mapping[str | int, str], ) -> None: """Initialize an option setter. Parameters ---------- capability_id : Any Unique ID of this capability name : Any Name that should be displayed in a UI entity_type : Any Define of what type this capability is get_value : Any Callable to get the current values of this capability set_value : Any Callable to set the value. Should only expect the new values as parameter options : Any A dictionary of valid options with the option as key and a label as value """ super().__init__(capability_id, name, entity_type, get_value, set_value) self.options = options async def set(self, value: str | int) -> None: if value not in self.options: raise ValueError("The given value is not a valid option") await super().set(value) class BinarySetter(SettableCapability): """A class to set boolean values.""" async def set(self, value: bool) -> None: if not isinstance(value, bool): raise ValueError("The given value is not a boolean value") await super().set(value) aiomusiccast-0.15.0/aiomusiccast/capability_registry.py0000644000000000000000000003176513615410400020324 0ustar00from __future__ import annotations from collections.abc import Callable from typing import TYPE_CHECKING, Any from .capabilities import BinarySetter, Capability, EntityType, NumberSetter, OptionSetter from .const import DISPLAY_DIMMER_SPECIALS from .features import DeviceFeature, ZoneFeature if TYPE_CHECKING: from .musiccast_device import MusicCastDevice DeviceCapabilityFactory = Callable[[str, Any], Capability] ZoneCapabilityFactory = Callable[[str, Any, str], Capability] def normalize_option(option: object) -> str: option_str = str(option) return option_str.replace(" ", "_").lower() """Dictionary of all DeviceFeatures with a callable as value. The callable expects an ID and a MusicCastDevice as parameters.""" _device_capabilities: dict[DeviceFeature, DeviceCapabilityFactory | dict[str, DeviceCapabilityFactory]] = { DeviceFeature.DIMMER: lambda capability_id, device: OptionSetter( capability_id, "Display Brightness", EntityType.CONFIG, lambda: device.data.dimmer.dimmer_current, lambda value: device.set_dimmer(int(value)), { x: normalize_option(DISPLAY_DIMMER_SPECIALS.get(x, x)) for x in range( int(device.data.dimmer.minimum), int(device.data.dimmer.maximum + 1), int(device.data.dimmer.step) ) }, ), DeviceFeature.SPEAKER_A: lambda capability_id, device: BinarySetter( capability_id, "Speaker A", EntityType.CONFIG, lambda: device.data.speaker_a, lambda val: device.set_speaker_a(val), ), DeviceFeature.SPEAKER_B: lambda capability_id, device: BinarySetter( capability_id, "Speaker B", EntityType.CONFIG, lambda: device.data.speaker_b, lambda val: device.set_speaker_b(val), ), DeviceFeature.PARTY_MODE: lambda capability_id, device: BinarySetter( capability_id, "Party Mode", EntityType.CONFIG, lambda: device.data.party_enable, lambda val: device.set_party_mode(val), ), } """Dictionary of all ZoneFeatures with a callable as value. The callable expects an ID, a MusicCastDevice and a zone_id as parameters. """ _zone_capabilities: dict[ZoneFeature, ZoneCapabilityFactory | dict[str, ZoneCapabilityFactory]] = { ZoneFeature.SURR_DECODER_TYPE: lambda capability_id, device, zone_id: OptionSetter( capability_id, "Surround Decoder Device", EntityType.CONFIG, lambda: device.data.zones[zone_id].surr_decoder_type, lambda val: device.set_surround_decoder(zone_id, val), {key: normalize_option(key) for key in device.data.zones[zone_id].surr_decoder_type_list}, ), ZoneFeature.SLEEP: lambda capability_id, device, zone_id: OptionSetter( capability_id, "Sleep Timer", EntityType.CONFIG, lambda: device.data.zones[zone_id].sleep_time, lambda val: device.set_sleep_timer(zone_id, val), {0: "off", 30: "30_min", 60: "60_min", 90: "90_min", 120: "120_min"}, ), ZoneFeature.EQUALIZER: { "mode": lambda capability_id, device, zone_id: OptionSetter( capability_id, "Equalizer Mode", EntityType.CONFIG, lambda: device.data.zones[zone_id].equalizer_mode, lambda val: device.set_equalizer(zone_id, mode=val), {key: normalize_option(key) for key in device.data.zones[zone_id].equalizer_mode_list}, ), "low": lambda capability_id, device, zone_id: NumberSetter( capability_id, "Equalizer Low", EntityType.CONFIG, lambda: device.data.zones[zone_id].equalizer_low, lambda val: device.set_equalizer(zone_id, low=int(val)), device.data.zones[zone_id].range_step["equalizer"].minimum, device.data.zones[zone_id].range_step["equalizer"].maximum, device.data.zones[zone_id].range_step["equalizer"].step, ), "mid": lambda capability_id, device, zone_id: NumberSetter( capability_id, "Equalizer Mid", EntityType.CONFIG, lambda: device.data.zones[zone_id].equalizer_mid, lambda val: device.set_equalizer(zone_id, mid=int(val)), device.data.zones[zone_id].range_step["equalizer"].minimum, device.data.zones[zone_id].range_step["equalizer"].maximum, device.data.zones[zone_id].range_step["equalizer"].step, ), "high": lambda capability_id, device, zone_id: NumberSetter( capability_id, "Equalizer High", EntityType.CONFIG, lambda: device.data.zones[zone_id].equalizer_high, lambda val: device.set_equalizer(zone_id, high=int(val)), device.data.zones[zone_id].range_step["equalizer"].minimum, device.data.zones[zone_id].range_step["equalizer"].maximum, device.data.zones[zone_id].range_step["equalizer"].step, ), }, ZoneFeature.TONE_CONTROL: { "mode": lambda capability_id, device, zone_id: OptionSetter( capability_id, "Tone Control Mode", EntityType.CONFIG, lambda: device.data.zones[zone_id].tone_mode, lambda val: device.set_tone_control(zone_id, mode=val), {key: normalize_option(key) for key in device.data.zones[zone_id].tone_control_mode_list}, ), "bass": lambda capability_id, device, zone_id: NumberSetter( capability_id, "Tone Control Bass", EntityType.CONFIG, lambda: device.data.zones[zone_id].tone_bass, lambda val: device.set_tone_control(zone_id, bass=int(val)), device.data.zones[zone_id].range_step["tone_control"].minimum, device.data.zones[zone_id].range_step["tone_control"].maximum, device.data.zones[zone_id].range_step["tone_control"].step, ), "treble": lambda capability_id, device, zone_id: NumberSetter( capability_id, "Tone Control Treble", EntityType.CONFIG, lambda: device.data.zones[zone_id].tone_treble, lambda val: device.set_tone_control(zone_id, treble=int(val)), device.data.zones[zone_id].range_step["tone_control"].minimum, device.data.zones[zone_id].range_step["tone_control"].maximum, device.data.zones[zone_id].range_step["tone_control"].step, ), }, ZoneFeature.DIALOGUE_LEVEL: lambda capability_id, device, zone_id: NumberSetter( capability_id, "Dialogue Level", EntityType.CONFIG, lambda: device.data.zones[zone_id].dialogue_level, lambda val: device.set_dialogue_level(zone_id, int(val)), device.data.zones[zone_id].range_step["dialogue_level"].minimum, device.data.zones[zone_id].range_step["dialogue_level"].maximum, device.data.zones[zone_id].range_step["dialogue_level"].step, ), ZoneFeature.DIALOGUE_LIFT: lambda capability_id, device, zone_id: NumberSetter( capability_id, "Dialogue Lift", EntityType.CONFIG, lambda: device.data.zones[zone_id].dialogue_lift, lambda val: device.set_dialogue_lift(zone_id, int(val)), device.data.zones[zone_id].range_step["dialogue_lift"].minimum, device.data.zones[zone_id].range_step["dialogue_lift"].maximum, device.data.zones[zone_id].range_step["dialogue_lift"].step, ), ZoneFeature.DTS_DIALOGUE_CONTROL: lambda capability_id, device, zone_id: NumberSetter( capability_id, "DTS Dialogue Control", EntityType.CONFIG, lambda: device.data.zones[zone_id].dts_dialogue_control, lambda val: device.set_dts_dialogue_control(zone_id, int(val)), device.data.zones[zone_id].range_step["dts_dialogue_control"].minimum, device.data.zones[zone_id].range_step["dts_dialogue_control"].maximum, device.data.zones[zone_id].range_step["dts_dialogue_control"].step, ), ZoneFeature.LINK_AUDIO_DELAY: lambda capability_id, device, zone_id: OptionSetter( capability_id, "Link Audio Delay", EntityType.CONFIG, lambda: device.data.zones[zone_id].link_audio_delay, lambda val: device.set_link_audio_delay(zone_id, val), {key: normalize_option(key) for key in device.data.zones[zone_id].link_audio_delay_list}, ), ZoneFeature.LINK_CONTROL: lambda capability_id, device, zone_id: OptionSetter( capability_id, "Link Control", EntityType.CONFIG, lambda: device.data.zones[zone_id].link_control, lambda val: device.set_link_control(zone_id, val), {key: normalize_option(key) for key in device.data.zones[zone_id].link_control_list}, ), ZoneFeature.LINK_AUDIO_QUALITY: lambda capability_id, device, zone_id: OptionSetter( capability_id, "Link Audio Quality", EntityType.CONFIG, lambda: device.data.zones[zone_id].link_audio_quality, lambda val: device.set_link_audio_quality(zone_id, val), {key: normalize_option(key) for key in device.data.zones[zone_id].link_audio_quality_list}, ), ZoneFeature.BASS_EXTENSION: lambda capability_id, device, zone_id: BinarySetter( capability_id, "Bass Extension", EntityType.CONFIG, lambda: device.data.zones[zone_id].bass_extension, lambda val: device.set_bass_extension(zone_id, val), ), ZoneFeature.EXTRA_BASS: lambda capability_id, device, zone_id: BinarySetter( capability_id, "Extra Bass", EntityType.CONFIG, lambda: device.data.zones[zone_id].extra_bass, lambda val: device.set_extra_bass(zone_id, val), ), ZoneFeature.ENHANCER: lambda capability_id, device, zone_id: BinarySetter( capability_id, "Enhancer", EntityType.CONFIG, lambda: device.data.zones[zone_id].enhancer, lambda val: device.set_enhancer(zone_id, val), ), ZoneFeature.PURE_DIRECT: lambda capability_id, device, zone_id: BinarySetter( capability_id, "Pure Direct", EntityType.CONFIG, lambda: device.data.zones[zone_id].pure_direct, lambda val: device.set_pure_direct(zone_id, val), ), ZoneFeature.ADAPTIVE_DRC: lambda capability_id, device, zone_id: BinarySetter( capability_id, "Adaptive DRC", EntityType.CONFIG, lambda: device.data.zones[zone_id].adaptive_drc, lambda val: device.set_adaptive_drc(zone_id, val), ), ZoneFeature.SUBWOOFER_VOLUME: lambda capability_id, device, zone_id: NumberSetter( capability_id, "Subwoofer Volume", EntityType.CONFIG, lambda: device.data.zones[zone_id].subwoofer_volume, lambda val: device.set_subwoofer_volume(zone_id, int(val)), device.data.zones[zone_id].range_step["subwoofer_volume"].minimum, device.data.zones[zone_id].range_step["subwoofer_volume"].maximum, device.data.zones[zone_id].range_step["subwoofer_volume"].step, ), ZoneFeature.CLEAR_VOICE: lambda capability_id, device, zone_id: BinarySetter( capability_id, "Clear Voice", EntityType.CONFIG, lambda: device.data.zones[zone_id].clear_voice, lambda val: device.set_clear_voice(zone_id, val), ), ZoneFeature.SURROUND_3D: lambda capability_id, device, zone_id: BinarySetter( capability_id, "3D Surround", EntityType.CONFIG, lambda: device.data.zones[zone_id].surround_3d, lambda val: device.set_surround_3d(zone_id, val), ), } def build_device_capabilities(device: MusicCastDevice) -> list[Capability]: """Build capabilities for the given device. The resulting identifiers follow the pattern ``{feature.name.lower()}_{key}``. """ result: list[Capability] = [] for feature in [f for f in DeviceFeature if f in device.features]: feature_entry = _device_capabilities.get(feature) if feature_entry is not None: if isinstance(feature_entry, dict): for key, capability in feature_entry.items(): capability_id = f"{feature.name}_{key}" result.append(capability(capability_id, device)) else: result.append(feature_entry(feature.name, device)) return result def build_zone_capabilities(device: MusicCastDevice, zone_id: str) -> list[Capability]: """Build capabilities for a specific device zone. Identifiers follow the pattern ``zone_{feature.name.lower()}_{key}``. """ result: list[Capability] = [] for feature in [f for f in ZoneFeature if f in device.data.zones[zone_id].features]: feature_entry = _zone_capabilities.get(feature) if feature_entry is not None: if isinstance(feature_entry, dict): for key, capability in feature_entry.items(): capability_id = f"zone_{feature.name}_{key}" result.append(capability(capability_id, device, zone_id)) else: result.append(feature_entry(f"zone_{feature.name}", device, zone_id)) return result aiomusiccast-0.15.0/aiomusiccast/const.py0000644000000000000000000001012013615410400015357 0ustar00from aiomusiccast.features import DeviceFeature, ZoneFeature DEVICE_FUNC_LIST_TO_FEATURE_MAPPING = { "wired_lan": DeviceFeature.WIRED_LAN, "wireless_lan": DeviceFeature.WIRELESS_LAN, "wireless_direct": DeviceFeature.WIRELESS_DIRECT, "extend_1_band": DeviceFeature.EXTEND_1_BAND, "dfs_option": DeviceFeature.DFS_OPTION, "network_standby": DeviceFeature.NETWORK_STANDBY, "network_standby_auto": DeviceFeature.NETWORK_STANDBY_AUTO, "bluetooth_standby": DeviceFeature.BLUETOOTH_STANDBY, "bluetooth_tx_setting": DeviceFeature.BLUETOOTH_TX_SETTING, "bluetooth_tx_connectivity_type": DeviceFeature.BLUETOOTH_TX_CONNECTIVITY_TYPE, "auto_power_standby": DeviceFeature.AUTO_POWER_STANDBY, "ir_sensor": DeviceFeature.IR_SENSOR, "speaker_a": DeviceFeature.SPEAKER_A, "speaker_b": DeviceFeature.SPEAKER_B, "headphone": DeviceFeature.HEADPHONE, "dimmer": DeviceFeature.DIMMER, "zone_b_volume_sync": DeviceFeature.ZONE_B_VOLUME_SYNC, "hdmi_out_1": DeviceFeature.HDMI_OUT_1, "hdmi_out_2": DeviceFeature.HDMI_OUT_2, "hdmi_out_3": DeviceFeature.HDMI_OUT_3, "airplay": DeviceFeature.AIRPLAY, "stereo_pair": DeviceFeature.STEREO_PAIR, "speaker_settings": DeviceFeature.SPEAKER_SETTINGS, "disklavier_settings": DeviceFeature.DISKLAVIER_SETTINGS, "background_download": DeviceFeature.BACKGROUND_DOWNLOAD, "remote_info": DeviceFeature.REMOTE_INFO, "network_reboot": DeviceFeature.NETWORK_REBOOT, "system_reboot": DeviceFeature.SYSTEM_REBOOT, "auto_play": DeviceFeature.AUTO_PLAY, "speaker_pattern": DeviceFeature.SPEAKER_PATTERN, "party_mode": DeviceFeature.PARTY_MODE, "analytics": DeviceFeature.ANALYTICS, "ypao_volume": DeviceFeature.YPAO_VOLUME, "party_volume": DeviceFeature.PARTY_VOLUME, "party_mute": DeviceFeature.PARTY_MUTE, "name_text_avr": DeviceFeature.NAME_TEXT_AVR, "hdmi_standby_through": DeviceFeature.HDMI_STANDBY_THROUGH, } ZONE_FUNC_LIST_TO_FEATURE_MAPPING = { "power": ZoneFeature.POWER, "sleep": ZoneFeature.SLEEP, "volume": ZoneFeature.VOLUME, "mute": ZoneFeature.MUTE, "sound_program": ZoneFeature.SOUND_PROGRAM, "surround_3d": ZoneFeature.SURROUND_3D, "direct": ZoneFeature.DIRECT, "pure_direct": ZoneFeature.PURE_DIRECT, "enhancer": ZoneFeature.ENHANCER, "tone_control": ZoneFeature.TONE_CONTROL, "equalizer": ZoneFeature.EQUALIZER, "balance": ZoneFeature.BALANCE, "dialogue_level": ZoneFeature.DIALOGUE_LEVEL, "dialogue_lift": ZoneFeature.DIALOGUE_LIFT, "clear_voice": ZoneFeature.CLEAR_VOICE, "subwoofer_volume": ZoneFeature.SUBWOOFER_VOLUME, "bass_extension": ZoneFeature.BASS_EXTENSION, "signal_info": ZoneFeature.SIGNAL_INFO, "prepare_input_change": ZoneFeature.PREPARE_INPUT_CHANGE, "link_control": ZoneFeature.LINK_CONTROL, "link_audio_delay": ZoneFeature.LINK_AUDIO_DELAY, "link_audio_quality": ZoneFeature.LINK_AUDIO_QUALITY, "scene": ZoneFeature.SCENE, "contents_display": ZoneFeature.CONTENTS_DISPLAY, "cursor": ZoneFeature.CURSOR, "menu": ZoneFeature.MENU, "actual_volume": ZoneFeature.ACTUAL_VOLUME, "audio_select": ZoneFeature.AUDIO_SELECT, "surr_decoder_type": ZoneFeature.SURR_DECODER_TYPE, "extra_bass": ZoneFeature.EXTRA_BASS, "adaptive_drc": ZoneFeature.ADAPTIVE_DRC, "dts_dialogue_control": ZoneFeature.DTS_DIALOGUE_CONTROL, "adaptive_dsp_level": ZoneFeature.ADAPTIVE_DSP_LEVEL, "mono": ZoneFeature.MONO, } MIME_TYPE_UPNP_CLASS = { "application/x-mpegurl": "object.item.videoItem", "image": "object.item.imageItem", "video": "object.item.videoItem", "application/dash+xml": "object.item.videoItem", "application/vnd.apple.mpegurl": "object.item.videoItem", "audio": "object.item.audioItem", } ALARM_WEEK_DAYS = [ "sunday", "monday", "tuesday", "wednesday", "thursday", "friday", "saturday", ] ALARM_ONEDAY = "oneday" ALARM_WEEKLY = "weekly" MC_LINK = "mc_link" MAIN_SYNC = "main_sync" MC_LINK_SOURCES = [MC_LINK, MAIN_SYNC] NULL_GROUP = "00000000000000000000000000000000" DISPLAY_DIMMER_SPECIALS = {-1: "auto"} aiomusiccast-0.15.0/aiomusiccast/exceptions.py0000644000000000000000000000056313615410400016424 0ustar00class MusicCastException(Exception): pass class MusicCastUnsupportedException(Exception): pass class MusicCastGroupException(MusicCastException): pass class MusicCastConnectionException(MusicCastException): pass class MusicCastConfigurationException(MusicCastGroupException): pass class MusicCastParamException(MusicCastException): pass aiomusiccast-0.15.0/aiomusiccast/features.py0000644000000000000000000000425713615410400016065 0ustar00# list of supported features, directly indicated by musiccast from enum import Flag, auto class Feature(Flag): pass class DeviceFeature(Feature): NONE = 0 WIRED_LAN = auto() WIRELESS_LAN = auto() WIRELESS_DIRECT = auto() EXTEND_1_BAND = auto() DFS_OPTION = auto() NETWORK_STANDBY = auto() NETWORK_STANDBY_AUTO = auto() BLUETOOTH_STANDBY = auto() BLUETOOTH_TX_SETTING = auto() BLUETOOTH_TX_CONNECTIVITY_TYPE = auto() IR_SENSOR = auto() SPEAKER_A = auto() SPEAKER_B = auto() HEADPHONE = auto() DIMMER = auto() ZONE_B_VOLUME_SYNC = auto() HDMI_OUT_1 = auto() HDMI_OUT_2 = auto() HDMI_OUT_3 = auto() AIRPLAY = auto() STEREO_PAIR = auto() SPEAKER_SETTINGS = auto() DISKLAVIER_SETTINGS = auto() BACKGROUND_DOWNLOAD = auto() REMOTE_INFO = auto() NETWORK_REBOOT = auto() SYSTEM_REBOOT = auto() AUTO_PLAY = auto() SPEAKER_PATTERN = auto() PARTY_MODE = auto() AUTO_POWER_STANDBY = auto() ANALYTICS = auto() YPAO_VOLUME = auto() PARTY_VOLUME = auto() PARTY_MUTE = auto() NAME_TEXT_AVR = auto() HDMI_STANDBY_THROUGH = auto() # list of supported features that got infered indirectly CLOCK = auto() ALARM_ONEDAY = auto() ALARM_WEEKLY = auto() # Zone Features class ZoneFeature(Feature): NONE = 0 POWER = auto() SLEEP = auto() VOLUME = auto() MUTE = auto() SOUND_PROGRAM = auto() SURROUND_3D = auto() DIRECT = auto() PURE_DIRECT = auto() ENHANCER = auto() TONE_CONTROL = auto() EQUALIZER = auto() BALANCE = auto() DIALOGUE_LEVEL = auto() DIALOGUE_LIFT = auto() CLEAR_VOICE = auto() SUBWOOFER_VOLUME = auto() BASS_EXTENSION = auto() SIGNAL_INFO = auto() PREPARE_INPUT_CHANGE = auto() LINK_CONTROL = auto() LINK_AUDIO_DELAY = auto() LINK_AUDIO_QUALITY = auto() SCENE = auto() CONTENTS_DISPLAY = auto() CURSOR = auto() MENU = auto() ACTUAL_VOLUME = auto() AUDIO_SELECT = auto() SURR_DECODER_TYPE = auto() EXTRA_BASS = auto() ADAPTIVE_DRC = auto() DTS_DIALOGUE_CONTROL = auto() ADAPTIVE_DSP_LEVEL = auto() MONO = auto() aiomusiccast-0.15.0/aiomusiccast/musiccast_data.py0000644000000000000000000001512613615410400017230 0ustar00from __future__ import annotations import asyncio from dataclasses import dataclass from datetime import datetime from typing import Any from .exceptions import MusicCastException from .features import ZoneFeature @dataclass(slots=True) class MusicCastAlarmDetails: enabled: bool | None = None time: str | None = None playback_type: str | None = None resume_input: str | None = None preset: int | None = None preset_type: str | None = None preset_info: dict[str, Any] | None = None beep: bool | None = None @property def input(self) -> str | None: return ( f"preset:{self.preset_type}:{self.preset}" if self.playback_type == "preset" else f"resume:{self.resume_input}" if self.playback_type == "resume" else None ) class MusicCastData: """Object that holds data for a MusicCast device.""" def __init__(self): """Ctor.""" # device info self.device_id: str | None = None self.model_name: str | None = None self.system_version: str | None = None self.api_version: str | None = None # network status self.mac_addresses: dict[str, str] | None = None self.network_name: str | None = None # features self.zones: dict[str, MusicCastZoneData] = {} self.input_names: dict[str, str] = {} self.sound_program_names: dict[str, str] = {} # NetUSB data self.netusb_input: str | None = None self.netusb_playback: str | None = None self.netusb_repeat: str | None = None self.netusb_shuffle: str | None = None self.netusb_artist: str | None = None self.netusb_album: str | None = None self.netusb_track: str | None = None self.netusb_albumart_url: str | None = None self.netusb_play_time: int | None = None self.netusb_play_time_updated: datetime | None = None self.netusb_total_time: int | None = None self.netusb_preset_list: dict[Any, Any] = {} # Tuner self.band: str | None = None self.am_freq: int = 1 self.fm_freq: int = 1 self.rds_text_a: str = "" self.rds_text_b: str = "" self.dab_service_label: str = "" self.dab_dls: str = "" # Group self.last_group_role: str | None = None self.last_group_id: str | None = None self.group_id: str | None = None self.group_name: str | None = None self.group_role: str | None = None self.group_server_zone: str | None = None self.group_client_list: list[str] = [] self.group_update_lock = asyncio.locks.Lock() # Dimmer self.dimmer: Dimmer | None = None # Alarm self.alarm_on: bool | None = None self.alarm_volume: int | None = None self.alarm_volume_range: tuple[int, int] = (0, 0) self.alarm_volume_step: int = 1 self.alarm_fade_range: tuple[int, int] = (0, 0) self.alarm_fade_step: int = 1 self.alarm_resume_input_list: list[str] = [] self.alarm_preset_list: list[str] = [] self.alarm_mode: str | None = None self.alarm_details: dict[str, MusicCastAlarmDetails] = {} # Speaker A/B self.speaker_a: bool | None = None self.speaker_b: bool | None = None self.party_enable: bool | None = None self.capabilities: list[str] = [] @property def fm_freq_str(self) -> str: """Return a formatted string with fm frequency.""" return f"FM {self.fm_freq / 1000:.2f} MHz" @property def am_freq_str(self) -> str: """Return a formatted string with am frequency.""" return f"AM {self.am_freq:.2f} KHz" class MusicCastZoneData: """Object that holds data for a MusicCast device zone.""" features: ZoneFeature = ZoneFeature.NONE def __init__(self): """Ctor.""" self.power: bool | None = None self.name: str | None = None self.min_volume: int = 0 self.max_volume: int = 100 self.current_volume: int = 0 self.mute: bool = False self.input_list: list[str] = [] self.input: str | None = None self.sound_program_list: list[str] = [] self.sound_program: str | None = None self.sleep_time: int | None = None self.subwoofer_volume: int | None = None # Equalizer self.equalizer_mode: str | None = None self.equalizer_low: int | None = None self.equalizer_mid: int | None = None self.equalizer_high: int | None = None # Tone Control self.tone_mode: str | None = None self.tone_bass: int | None = None self.tone_treble: int | None = None # Dialogue self.dialogue_level: int | None = None self.dialogue_lift: int | None = None self.dts_dialogue_control: int | None = None self.link_audio_delay: str | None = None self.link_audio_quality: str | None = None self.link_control: str | None = None self.tone_control_mode_list: list[str] | None = None self.surr_decoder_type_list: list[str] | None = None self.link_control_list: list[str] | None = None self.link_audio_delay_list: list[str] | None = None self.link_audio_quality_list: list[str] | None = None self.equalizer_mode_list: list[str] | None = None self.range_step: dict[str, RangeStep] = {} self.func_list: list[str] = [] self.capabilities: list[str] = [] self.extra_bass: bool | None = None self.bass_extension: bool | None = None self.adaptive_drc: bool | None = None self.enhancer: bool | None = None self.pure_direct: bool | None = None self.clear_voice: bool | None = None self.surround_3d: bool | None = None self.surr_decoder_type: str | None = None @dataclass(slots=True) class RangeStep: minimum: int = 0 maximum: int = 0 step: int = 1 def check(self, value: int) -> None: if value > self.maximum or value < self.minimum or value % self.step: raise MusicCastException( "Given value %s is not in range of %s to %s with step %s", value, self.minimum, self.maximum, self.step ) class Dimmer(RangeStep): """Dimmer. Not all devices support dimming. A value of -1 indicates auto dimming. """ dimmer_current: int def __init__(self, dimmer_min: int, dimmer_max: int, dimmer_step: int, dimmer_current: int) -> None: super().__init__(dimmer_min, dimmer_max, dimmer_step) self.dimmer_current = dimmer_current aiomusiccast-0.15.0/aiomusiccast/musiccast_device.py0000644000000000000000000013553113615410400017561 0ustar00from __future__ import annotations import asyncio import logging import math import mimetypes from collections.abc import Awaitable, Callable from datetime import datetime, time, timezone from functools import wraps from typing import Any, ParamSpec, TypeVar from xml.sax.saxutils import escape from aiohttp import ClientSession from aiomusiccast.const import ( ALARM_ONEDAY, ALARM_WEEK_DAYS, ALARM_WEEKLY, DEVICE_FUNC_LIST_TO_FEATURE_MAPPING, MC_LINK, MC_LINK_SOURCES, MIME_TYPE_UPNP_CLASS, NULL_GROUP, ZONE_FUNC_LIST_TO_FEATURE_MAPPING, DeviceFeature, ZoneFeature, ) from aiomusiccast.exceptions import ( MusicCastException, MusicCastGroupException, MusicCastUnsupportedException, ) from .capability_registry import build_device_capabilities, build_zone_capabilities from .features import Feature from .musiccast_data import Dimmer, MusicCastAlarmDetails, MusicCastData, MusicCastZoneData, RangeStep from .pyamaha import AsyncDevice, Clock, Dist, NetUSB, System, Tuner, Zone Callback = Callable[[], None] AsyncCallback = Callable[[], Awaitable[None]] P = ParamSpec("P") R = TypeVar("R") _LOGGER = logging.getLogger(__name__) def _check_feature(feature: Feature) -> Callable[[Callable[P, R]], Callable[P, R]]: """Return a decorator that checks whether a feature is supported. Should be used for all methods of MusicCastDevice, which rely on features. A decorated function relying on a zone feature must provide the zone_id as the first parameter. """ def decorator(func: Callable[P, R]) -> Callable[P, R]: if isinstance(feature, ZoneFeature): @wraps(func) def inner(self: MusicCastDevice, zone_id: str, *args: P.args, **kwargs: P.kwargs) -> R: if zone_id not in self.data.zones: raise MusicCastException("Zone %s does not exist.", zone_id) if not feature & self.data.zones[zone_id].features: raise MusicCastUnsupportedException("Zone %s doesn't support %s.", zone_id, feature.name) return func(self, zone_id, *args, **kwargs) elif isinstance(feature, DeviceFeature): @wraps(func) def inner(self: MusicCastDevice, *args: P.args, **kwargs: P.kwargs) -> R: if not feature & self.features: raise MusicCastUnsupportedException("Device doesn't support %s.", feature.name) return func(self, *args, **kwargs) else: raise MusicCastException("Unknown feature type ") return inner return decorator class MusicCastDevice: """Dummy MusicCastDevice (device for HA) for Hello World example.""" device: AsyncDevice features: DeviceFeature = DeviceFeature.NONE def __init__(self, ip: str, client: ClientSession, upnp_description: str | None = None) -> None: """Init dummy MusicCastDevice.""" self.ip = ip self.client = client try: self.event_loop = asyncio.get_running_loop() except RuntimeError: self.event_loop = asyncio.new_event_loop() self.device: AsyncDevice = AsyncDevice(client, ip, self.event_loop, self.handle, upnp_description) self._callbacks: set[Callback] = set() self._group_update_callbacks: set[AsyncCallback] = set() self.group_reduce_by_source: bool = False self.data: MusicCastData = MusicCastData() # the following data must not be updated frequently self._zone_ids: list[str] = [] self._network_status: dict[str, Any] | None = None self._device_info: dict[str, Any] | None = None self._features: dict[str, Any] = {} self._netusb_play_info: dict[str, Any] | None = None self._tuner_play_info: dict[str, Any] | None = None self._clock_info: dict[str, Any] | None = None self._func_status: dict[str, Any] | None = None self._distribution_info: dict[str, Any] = {} self._name_text: dict[str, Any] | None = None @classmethod async def check_yamaha_ssdp(cls, location: str, client: ClientSession) -> bool: res = await client.get(location) text = await res.text() return "/YamahaExtendedControl/v1/" in text @classmethod async def get_device_info(cls, ip: str, client: ClientSession) -> dict[str, Any]: try: event_loop = asyncio.get_running_loop() except RuntimeError: event_loop = asyncio.new_event_loop() device = AsyncDevice(client, ip, event_loop) return await device.request_json(System.get_device_info()) # -----UDP messaging----- async def handle(self, message): """Handle udp events.""" if message is None: await self.fetch() for parameter in message: if parameter in ["main", "zone2", "zone3", "zone4"]: new_zone_data = message[parameter] zone = self.data.zones.get(parameter) if zone: zone.current_volume = new_zone_data.get("volume", zone.current_volume) zone.power = new_zone_data.get("power", zone.power) zone.mute = new_zone_data.get("mute", zone.mute) await self._update_input(parameter, new_zone_data.get("input", zone.input)) else: _LOGGER.warning( "Zone %s does not exist. Available zones are: %s", parameter, list(self.data.zones), ) if new_zone_data.get("play_info_updated") or new_zone_data.get("status_updated"): await self._fetch_zone(parameter) netusb_message = message.get("netusb") if netusb_message: if netusb_message.get("play_info_updated"): await self._fetch_netusb() play_time = netusb_message.get("play_time") if play_time: self.data.netusb_play_time = play_time self.data.netusb_play_time_updated = datetime.now(timezone.utc) if netusb_message.get("preset_info_updated"): await self._fetch_netusb_presets() tuner_message = message.get("tuner") if tuner_message and tuner_message.get("play_info_updated"): await self._fetch_tuner() dist_message = message.get("dist") if dist_message and dist_message.get("dist_info_updated"): await self._fetch_distribution_data() clock_message = message.get("clock") if clock_message and clock_message.get("settings_updated"): await self._fetch_clock_data() system_message = message.get("system") if system_message and system_message.get("func_status_updated"): await self._fetch_func_status() for callback in self._callbacks: callback() def register_callback(self, callback: Callback) -> None: """Register callbacks invoked when the device changes state.""" self._callbacks.add(callback) def remove_callback(self, callback: Callback) -> None: """Remove previously registered callback.""" self._callbacks.discard(callback) async def _update_input(self, zone_id: str, new_input: str) -> None: """Trigger group updates when a zone toggles MC_LINK state. The helper ensures that listeners receive callbacks whenever the link state changes. """ trigger_group_cb = ( self.data.zones[zone_id].input == MC_LINK or new_input == MC_LINK ) and not self.data.group_update_lock.locked() self.data.zones[zone_id].input = new_input if trigger_group_cb: if self.data.zones[zone_id].input != MC_LINK: self.group_reduce_by_source = True try: for cb in self._group_update_callbacks: await cb() finally: self.group_reduce_by_source = False # -----Data Fetching----- async def _fetch_netusb(self): """Fetch NetUSB data.""" _LOGGER.debug("Fetching netusb...") self._netusb_play_info = await self.device.request_json(NetUSB.get_play_info()) self.data.netusb_input = self._netusb_play_info.get("input", self.data.netusb_input) self.data.netusb_playback = self._netusb_play_info.get("playback", self.data.netusb_playback) self.data.netusb_repeat = self._netusb_play_info.get("repeat", self.data.netusb_repeat) self.data.netusb_shuffle = self._netusb_play_info.get("shuffle", self.data.netusb_shuffle) self.data.netusb_artist = self._netusb_play_info.get("artist", self.data.netusb_artist) self.data.netusb_album = self._netusb_play_info.get("album", self.data.netusb_album) self.data.netusb_track = self._netusb_play_info.get("track", self.data.netusb_track) self.data.netusb_albumart_url = self._netusb_play_info.get("albumart_url", self.data.netusb_albumart_url) self.data.netusb_total_time = self._netusb_play_info.get("total_time", None) self.data.netusb_play_time = self._netusb_play_info.get("play_time", None) self.data.netusb_play_time_updated = datetime.now(timezone.utc) async def _fetch_tuner(self): """Fetch tuner data.""" _LOGGER.debug("Fetching tuner...") self._tuner_play_info = await self.device.request_json(Tuner.get_play_info()) self.data.band = self._tuner_play_info.get("band", self.data.band) self.data.fm_freq = self._tuner_play_info.get("fm", {}).get("freq", self.data.fm_freq) self.data.am_freq = self._tuner_play_info.get("am", {}).get("freq", self.data.am_freq) self.data.rds_text_a = self._tuner_play_info.get("rds", {}).get("radio_text_a", self.data.rds_text_a).strip() self.data.rds_text_b = self._tuner_play_info.get("rds", {}).get("radio_text_b", self.data.rds_text_b).strip() self.data.dab_service_label = ( self._tuner_play_info.get("dab", {}).get("service_label", self.data.dab_service_label).strip() ) self.data.dab_dls = self._tuner_play_info.get("dab", {}).get("dls", self.data.dab_dls).strip() async def _fetch_zone(self, zone_id): _LOGGER.debug("Fetching zone %s...", zone_id) zone = await self.device.request_json(Zone.get_status(zone_id)) zone_data: MusicCastZoneData = self.data.zones.get(zone_id, MusicCastZoneData()) self.data.party_enable = zone.get("party_enable") zone_data.power = zone.get("power") zone_data.current_volume = zone.get("volume") zone_data.mute = zone.get("mute") zone_data.sound_program = zone.get("sound_program") zone_data.sleep_time = zone.get("sleep") zone_data.extra_bass = zone.get("extra_bass") zone_data.bass_extension = zone.get("bass_extension") zone_data.subwoofer_volume = zone.get("subwoofer_volume") zone_data.adaptive_drc = zone.get("adaptive_drc") zone_data.enhancer = zone.get("enhancer") zone_data.pure_direct = zone.get("pure_direct") zone_data.clear_voice = zone.get("clear_voice") zone_data.surround_3d = zone.get("surround_3d") zone_data.surr_decoder_type = zone.get("surr_decoder_type") zone_data.equalizer_mode = zone.get("equalizer", {}).get("mode") zone_data.equalizer_high = zone.get("equalizer", {}).get("high") zone_data.equalizer_mid = zone.get("equalizer", {}).get("mid") zone_data.equalizer_low = zone.get("equalizer", {}).get("low") zone_data.tone_mode = zone.get("tone_control", {}).get("mode") zone_data.tone_bass = zone.get("tone_control", {}).get("bass") zone_data.tone_treble = zone.get("tone_control", {}).get("treble") zone_data.dialogue_level = zone.get("dialogue_level") zone_data.dialogue_lift = zone.get("dialogue_lift") zone_data.dts_dialogue_control = zone.get("dts_dialogue_control") zone_data.link_audio_delay = zone.get("link_audio_delay") zone_data.link_audio_quality = zone.get("link_audio_quality") zone_data.link_control = zone.get("link_control") self.data.zones[zone_id] = zone_data await self._update_input(zone_id, zone.get("input")) async def _fetch_distribution_data(self): _LOGGER.debug("Fetching Distribution data...") self._distribution_info = await self.device.request_json(Dist.get_distribution_info()) self.data.last_group_role = self.data.group_role self.data.last_group_id = self.data.group_id self.data.group_id = self._distribution_info.get("group_id", None) self.data.group_name = self._distribution_info.get("group_name", None) self.data.group_role = self._distribution_info.get("role", None) self.data.group_server_zone = self._distribution_info.get("server_zone", None) self.data.group_client_list = [ client.get("ip_address", "") for client in self._distribution_info.get("client_list", []) ] if not self.data.group_update_lock.locked(): for cb in self._group_update_callbacks: await cb() async def _fetch_clock_data(self): _LOGGER.debug("Fetching Clock data...") self._clock_info = await self.device.request_json(Clock.get_clock_settings()) self.data.alarm_on = self._clock_info.get("alarm", {}).get("alarm_on", False) self.data.alarm_volume = self._clock_info.get("alarm", {}).get("volume", None) self.data.alarm_mode = self._clock_info.get("alarm", {}).get("mode", None) days = [] if DeviceFeature.ALARM_WEEKLY in self.features: days += ALARM_WEEK_DAYS if DeviceFeature.ALARM_ONEDAY in self.features: days += [ALARM_ONEDAY] for day in days: if day not in self.data.alarm_details: self.data.alarm_details[day] = MusicCastAlarmDetails() day_info = self._clock_info.get("alarm", {}).get(day, {}) time_str = day_info.get("time") if isinstance(time_str, str): time_str = f"{time_str[:2]}:{time_str[2:]}" self.data.alarm_details[day].enabled = day_info.get("enable") self.data.alarm_details[day].beep = day_info.get("beep") self.data.alarm_details[day].time = time_str self.data.alarm_details[day].playback_type = day_info.get("playback_type") self.data.alarm_details[day].resume_input = day_info.get("resume", {}).get("input") self.data.alarm_details[day].preset = day_info.get("preset", {}).get("num") self.data.alarm_details[day].preset_type = day_info.get("preset", {}).get("type") self.data.alarm_details[day].preset_info = ( day_info.get("preset", {}).get("netusb_info", {}) if self.data.alarm_details[day].preset_type == "netusb" else day_info.get("preset", {}).get("tuner_info", {}) ) async def _fetch_func_status(self): _LOGGER.debug("Fetching func status...") self._func_status = await self.device.request_json(System.get_func_status()) if DeviceFeature.SPEAKER_A in self.features: self.data.speaker_a = self._func_status.get("speaker_a") if DeviceFeature.SPEAKER_B in self.features: self.data.speaker_b = self._func_status.get("speaker_b") if DeviceFeature.DIMMER in self.features and "dimmer" in self._func_status and self.data.dimmer: self.data.dimmer.dimmer_current = self._func_status.get("dimmer") async def fetch(self): """Fetch data from musiccast device.""" if not self._network_status: self._network_status = await self.device.request_json(System.get_network_status()) self.data.network_name = self._network_status.get("network_name") self.data.mac_addresses = self._network_status.get("mac_address") if not self._device_info: self._device_info = await self.device.request_json(System.get_device_info()) self.data.device_id = self._device_info.get("device_id") self.data.model_name = self._device_info.get("model_name") self.data.system_version = self._device_info.get("system_version") self.data.api_version = self._device_info.get("api_version") self._name_text = await self.device.request_json(System.get_name_text(None)) zone_names = {zone.get("id"): zone.get("text") for zone in self._name_text.get("zone_list")} if not self._features: self._features = await self.device.request_json(System.get_features()) # feature flags from func list for feature in self._features.get("system", {}).get("func_list", []): feature_bit = DEVICE_FUNC_LIST_TO_FEATURE_MAPPING.get(feature) if feature_bit: self.features |= feature_bit else: _LOGGER.info( "The model %s supports the feature %s which is not known to aiomusiccast. Please consider " "opening an issue on GitHub to tell us about this feature so we can implement it.", self.data.model_name, feature, ) self._zone_ids = [zone.get("id") for zone in self._features.get("zone", [])] for zone in self._features.get("zone", []): zone_id = zone.get("id") zone_data: MusicCastZoneData = self.data.zones.get(zone_id, MusicCastZoneData()) zone_data.sound_program_list = zone.get("sound_program_list", []) zone_data.tone_control_mode_list = zone.get("tone_control_mode_list", ["manual"]) zone_data.surr_decoder_type_list = zone.get("surr_decoder_type_list", None) zone_data.link_control_list = zone.get("link_control_list", None) zone_data.link_audio_delay_list = zone.get("link_audio_delay_list", None) zone_data.link_audio_quality_list = zone.get("link_audio_quality_list", None) zone_data.equalizer_mode_list = zone.get("equalizer_mode_list", ["manual"]) for range_step in zone.get("range_step", []): current = RangeStep() current.minimum = range_step.get("min") current.maximum = range_step.get("max") current.step = range_step.get("step") zone_data.range_step[range_step.get("id")] = current zone_data.input_list = zone.get("input_list", []) zone_data.func_list = zone.get("func_list") zone_data.name = zone_names.get(zone_id) for feature in zone_data.func_list: feature_bit = ZONE_FUNC_LIST_TO_FEATURE_MAPPING.get(feature) if feature_bit: zone_data.features |= feature_bit else: _LOGGER.info( "Zone %s of model %s supports the feature %s which is not known to aiomusiccast. Please " "consider opening an issue on GitHub to tell us about this feature so we can implement it.", zone_id, self.data.model_name, feature, ) if ZoneFeature.VOLUME in zone_data.features: range_volume = next(item for item in zone.get("range_step") if item["id"] == "volume") zone_data.min_volume = range_volume.get("min") zone_data.max_volume = range_volume.get("max") self.data.zones[zone_id] = zone_data if "clock" in self._features: clock_features = self._features.get("clock", {}) if "alarm" in clock_features.get("func_list", []): if ALARM_ONEDAY in clock_features.get("alarm_mode_list", []): self.features |= DeviceFeature.ALARM_ONEDAY if ALARM_WEEKLY in clock_features.get("alarm_mode_list", []): self.features |= DeviceFeature.ALARM_WEEKLY if "date_and_time" in clock_features.get("func_list", []): self.features |= DeviceFeature.CLOCK for value_range in clock_features.get("range_step", []): if value_range.get("id") == "alarm_volume": self.data.alarm_volume_range = ( value_range.get("min", 0), value_range.get("max", 0), ) self.data.alarm_volume_step = value_range.get("step", 1) if value_range.get("id") == "alarm_fade": self.data.alarm_fade_range = ( value_range.get("min", 0), value_range.get("max", 0), ) self.data.alarm_fade_step = value_range.get("step", 1) self.data.alarm_preset_list = clock_features.get("alarm_preset_list", []) self.data.alarm_resume_input_list = clock_features.get("alarm_input_list", []) self.data.input_names = {source.get("id"): source.get("text") for source in self._name_text.get("input_list")} self.data.sound_program_names = { program.get("id"): program.get("text") for program in self._name_text.get("sound_program_list") } netusb_features = self._features.get("netusb", {}) if "netusb" in self._features and netusb_features.get("func_list"): await self._fetch_netusb() await self._fetch_netusb_presets() if "tuner" in self._features: await self._fetch_tuner() await self._fetch_distribution_data() if DeviceFeature.ALARM_ONEDAY in self.features or DeviceFeature.ALARM_WEEKLY in self.features: await self._fetch_clock_data() for zone in self._zone_ids: await self._fetch_zone(zone) ranges = self._features.get("system").get("range_step") if DeviceFeature.DIMMER in self.features and ranges: dimmer_range = next(filter(lambda x: x.get("id") == "dimmer", ranges)) self.data.dimmer = Dimmer(dimmer_range.get("min"), dimmer_range.get("max"), dimmer_range.get("step"), 0) await self._fetch_func_status() def build_capabilities(self): """Build capabilities for the device and its zones.""" self.data.capabilities = build_device_capabilities(self) for zone_id in self.data.zones: self.data.zones[zone_id].capabilities = build_zone_capabilities(self, zone_id) # -----Commands----- async def turn_on(self, zone_id): """Turn the media player on.""" await self.device.request(Zone.set_power(zone_id, "on")) async def turn_off(self, zone_id): """Turn the media player off.""" await self.device.request(Zone.set_power(zone_id, "standby")) async def mute_volume(self, zone_id, mute): """Mute the volume.""" await self.device.request(Zone.set_mute(zone_id, mute)) async def set_volume_level(self, zone_id, volume): """Set the volume level, range 0..1.""" vol = ( self.data.zones[zone_id].min_volume + (self.data.zones[zone_id].max_volume - self.data.zones[zone_id].min_volume) * volume ) await self.device.request(Zone.set_volume(zone_id, round(vol), 1)) async def volume_up(self, zone_id, step=None): """Increase volume by the provided step or the default step.""" await self.device.request(Zone.set_volume(zone_id, "up", step)) async def volume_down(self, zone_id, step=None): """Decrease volume by the provided step or the default step.""" await self.device.request(Zone.set_volume(zone_id, "down", step)) @_check_feature(ZoneFeature.TONE_CONTROL) async def set_tone_control(self, zone_id, mode=None, bass=None, treble=None): """Set treble, bass, mode using tone_control.""" await self.device.request(Zone.set_tone_control(zone_id, mode, bass, treble)) @_check_feature(ZoneFeature.EQUALIZER) async def set_equalizer(self, zone_id, mode=None, low=None, mid=None, high=None): """Set low, mid, high, mode using equalizer.""" await self.device.request(Zone.set_equalizer(zone_id, mode, low, mid, high)) @_check_feature(ZoneFeature.DIALOGUE_LEVEL) async def set_dialogue_level(self, zone_id, level): """Adjust the dialogue level for the zone.""" await self.device.request(Zone.set_dialogue_level(zone_id, level)) @_check_feature(ZoneFeature.DIALOGUE_LIFT) async def set_dialogue_lift(self, zone_id, level): """Set the vertical position of the dialogues.""" await self.device.request(Zone.set_dialogue_lift(zone_id, level)) @_check_feature(ZoneFeature.DTS_DIALOGUE_CONTROL) async def set_dts_dialogue_control(self, zone_id, value): """Adjust the dialogue level for DTS sound programs.""" await self.device.request(Zone.set_dts_dialogue_control(zone_id, value)) @_check_feature(ZoneFeature.EXTRA_BASS) async def set_extra_bass(self, zone_id, value): """Set extra bass for a higher bass level.""" await self.device.request(Zone.set_extra_bass(zone_id, value)) @_check_feature(ZoneFeature.BASS_EXTENSION) async def set_bass_extension(self, zone_id, value): """Set bass extension for a higher bass level.""" await self.device.request(Zone.set_bass_extension(zone_id, value)) @_check_feature(ZoneFeature.ENHANCER) async def set_enhancer(self, zone_id, value): """Enable or disable the audio enhancer for the device.""" await self.device.request(Zone.set_enhancer(zone_id, value)) @_check_feature(DeviceFeature.PARTY_MODE) async def set_party_mode(self, value): """Set the party mode.""" await self.device.request(System.set_partymode(value)) @_check_feature(ZoneFeature.ADAPTIVE_DRC) async def set_adaptive_drc(self, zone_id, value): """Set the dynamic range control.""" await self.device.request(Zone.set_adaptive_drc(zone_id, value)) @_check_feature(ZoneFeature.PURE_DIRECT) async def set_pure_direct(self, zone_id, value): """Set pure direct mode to pass through the signal.""" await self.device.request(Zone.set_pure_direct(zone_id, value)) @_check_feature(ZoneFeature.LINK_AUDIO_DELAY) async def set_link_audio_delay(self, zone_id, option): """Select if lip sync or sync of multi room is preferred.""" await self.device.request(Zone.set_link_audio_delay(zone_id, option)) @_check_feature(ZoneFeature.LINK_AUDIO_QUALITY) async def set_link_audio_quality(self, zone_id, option): """Set the audio quality for musiccast linked speakers.""" await self.device.request(Zone.set_link_audio_quality(zone_id, option)) @_check_feature(ZoneFeature.LINK_CONTROL) async def set_link_control(self, zone_id, option): """Set link control.""" await self.device.request(Zone.set_link_control(zone_id, option)) @_check_feature(ZoneFeature.SURR_DECODER_TYPE) async def set_surround_decoder(self, zone_id, option): """Set surround decoder for sound mode 'surr_decoder'.""" await self.device.request(Zone.set_surr_decoder_type(zone_id, option)) @_check_feature(DeviceFeature.DIMMER) async def set_dimmer(self, dimmer: int): """Set the dimmer on the device.""" self.data.dimmer.check(dimmer) await self.device.request(System.set_dimmer(dimmer)) async def netusb_play(self): await self.device.request(NetUSB.set_playback("play")) async def netusb_pause(self): await self.device.request(NetUSB.set_playback("pause")) async def netusb_stop(self): await self.device.request(NetUSB.set_playback("stop")) async def netusb_shuffle(self, shuffle: bool): if self.data.api_version < 1.19: if (self.data.netusb_shuffle == "on") != shuffle: await self.device.request(NetUSB.toggle_shuffle()) else: await self.device.request(NetUSB.set_shuffle("on" if shuffle else "off")) @_check_feature(DeviceFeature.SPEAKER_A) async def set_speaker_a(self, speaker_a: bool): """Set speaker a.""" await self.device.request(System.set_speaker_a(speaker_a)) @_check_feature(DeviceFeature.SPEAKER_B) async def set_speaker_b(self, speaker_b: bool): """Set speaker b.""" await self.device.request(System.set_speaker_b(speaker_b)) @_check_feature(ZoneFeature.SUBWOOFER_VOLUME) async def set_subwoofer_volume(self, zone_id, level): """Set the level of the subwoofer volume.""" await self.device.request(Zone.set_subwoofer_volume(zone_id, level)) @_check_feature(ZoneFeature.CLEAR_VOICE) async def set_clear_voice(self, zone_id, value): """Set clear voice option.""" await self.device.request(Zone.set_clear_voice(zone_id, value)) @_check_feature(ZoneFeature.SURROUND_3D) async def set_surround_3d(self, zone_id, value): """Set 3d surround option.""" await self.device.request(Zone.set_surround_3d(zone_id, value)) async def select_sound_mode(self, zone_id, sound_mode): """Select sound mode.""" await self.device.request(Zone.set_sound_program(zone_id, sound_mode)) async def netusb_previous_track(self): await self.device.request(NetUSB.set_playback("previous")) async def netusb_next_track(self): await self.device.request(NetUSB.set_playback("next")) async def tuner_previous_station(self): if self.data.band in ("fm", "am"): await self.device.request(Tuner.set_freq(self.data.band, "auto_down", 0)) elif self.data.band == "dab": await self.device.request(Tuner.set_dab_service("previous")) async def tuner_next_station(self): if self.data.band in ("fm", "am"): await self.device.request(Tuner.set_freq(self.data.band, "auto_up", 0)) elif self.data.band == "dab": await self.device.request(Tuner.set_dab_service("next")) async def netusb_repeat(self, mode: str): """Set the repeat mode for NetUSB playback.""" if self.data.api_version < 1.19: if self.data.netusb_repeat not in {mode, "one"}: await self.device.request(NetUSB.toggle_repeat()) else: await self.device.request(NetUSB.set_repeat(mode)) async def select_source(self, zone_id, source, mode=""): await self.device.request(Zone.set_input(zone_id, source, mode)) async def recall_netusb_preset(self, zone_id, preset): """Play the selected preset.""" await self.device.get(NetUSB.recall_preset(zone_id, preset)) async def store_netusb_preset(self, preset): """Play the selected preset.""" await self.device.get(NetUSB.store_preset(preset)) async def set_sleep_timer(self, zone_id, sleep_time=0): """Set sleep time.""" sleep_time = math.ceil(sleep_time / 30) * 30 await self.device.get(Zone.set_sleep(zone_id, sleep_time)) async def configure_alarm( self, alarm_on: bool | None = None, volume: float | None = None, alarm_time: time | str | None = None, source: str | None = None, mode: str | None = None, day: str | None = None, enable_day: bool | None = None, beep: bool | None = None, ) -> None: """Configure an alarm. Parameters ---------- alarm_on : Any Define whether the alarm should be turned on (bool) volume : Any Alarm volume 0..1 (float) alarm_time : Any Alarm time in str in hh:mm form or as time object (valid only with mode and day) source : Any Source for the alarm in PLAYBACKTYPE:SOURCE[:ID] form e.g. preset:netusb:2 (valid only with mode and day) mode : Any 'oneday' or 'weekly' must be set together with day day : Any Must be set with mode enable_day : Any Define whether to enable the alarm for the defined day (valid only with mode and day) beep : Any Define to enable the beep mode (valid only with mode and day) """ resume_input = None preset_type = None preset_num = None playback_type = None if day is None or mode is None: assert source is None, "if no day or mode is defined, the source cannot be set" assert alarm_time is None, "if no day or mode is defined, the alarm_time cannot be set" assert enable_day is None, "if no day or mode is defined, the enable_day cannot be set" assert beep is None, "if no day or mode is defined, the beep cannot be set" assert day is None, "day must not be defined without mode" assert mode is None, "mode must not be defined without day" else: # For some reason beep can only be set, if the alarm time or source are send together with it. # To ensure that this is working as expected in all cases, the alarm time will always be send with details. alarm_time = alarm_time if alarm_time is not None else self.data.alarm_details[day].time if source is not None: source_parts = source.split(":") if len(source_parts) > 0 and source_parts[0] != "": playback_type = source_parts[0] if playback_type == "resume": resume_input = source_parts[1] elif playback_type == "preset": preset_type = source_parts[1] preset_num = int(source_parts[2]) if volume is not None: volume = ( self.data.alarm_volume_range[0] + (self.data.alarm_volume_range[1] - self.data.alarm_volume_range[0]) * volume ) volume = self.data.alarm_volume_step * round(volume / self.data.alarm_volume_step) if isinstance(alarm_time, str) and alarm_time.find(":") != -1: time_parts = alarm_time.split(":") alarm_time = time_parts[0] + time_parts[1] if isinstance(alarm_time, time): alarm_time = alarm_time.strftime("%H%M") await self.device.post( *Clock.set_alarm_settings( alarm_on=alarm_on, volume=volume, mode=mode, day=day, playback_type=playback_type, alarm_time=alarm_time, preset_num=preset_num, preset_type=preset_type, enable=enable_day, resume_input=resume_input, beep=beep, ) ) # -----NetUSB Browsing----- async def get_list_info(self, source, start_index): return await self.device.request_json(NetUSB.get_list_info(source, start_index, 8, "en", "main")) async def select_list_item(self, item, zone_id): await self.device.request(NetUSB.set_list_control("main", "select", item, zone_id)) async def return_in_list(self, zone_id): await self.device.request(NetUSB.set_list_control("main", "return", "", zone_id)) async def play_list_media(self, item, zone_id): await self.device.request(NetUSB.set_list_control("main", "play", item, zone_id)) async def play_url_media(self, zone_id, media_url, title, mime_type=None): await self.select_source(zone_id, "server", "autoplay_disabled") await self.device.dlna_avt_request("Stop", {"InstanceID": 0}) if not mime_type: mime_type, _ = mimetypes.guess_type(media_url) if not mime_type: mime_type = "application/octet-stream" obj_class = None for mime, upnp in MIME_TYPE_UPNP_CLASS.items(): if mime_type.startswith(mime): obj_class = upnp break if not obj_class: obj_class = "object.item" meta = ( '' '' f"{title}{obj_class}" f'{media_url}' "" "" ) await self.device.dlna_avt_request( "SetAVTransportURI", { "InstanceID": 0, "CurrentURI": media_url, "CurrentURIMetaData": escape(meta), }, ) await self.device.dlna_avt_request( "Play", { "InstanceID": 0, "Speed": 1, }, ) # -----Properties----- @property def media_image_url(self) -> str: """Return the image url of current playing media.""" return f"http://{self.device.ip}{self.data.netusb_albumart_url}" if self.data.netusb_albumart_url else "" @property def tuner_media_title(self) -> str | None: if self.data.band == "dab": return self.data.dab_dls if self.data.rds_text_a == "" and self.data.rds_text_b != "": return self.data.rds_text_b if self.data.rds_text_a != "" and self.data.rds_text_b == "": return self.data.rds_text_a if self.data.rds_text_a != "" and self.data.rds_text_b != "": return f"{self.data.rds_text_a} / {self.data.rds_text_b}" return None @property def tuner_media_artist(self) -> str | None: if self.data.band == "dab": return self.data.dab_service_label if self.data.band == "fm": return self.data.fm_freq_str if self.data.band == "am": return self.data.am_freq_str return None @property def alarm_input_list(self) -> dict[str, str]: inputs = { "resume:" + inp: "Resume " + self.data.input_names.get(inp, inp) for inp in self.data.alarm_resume_input_list } if "netusb" in self.data.alarm_preset_list: inputs = { **inputs, **{ "preset:netusb:" + str(index): self.data.input_names.get(entry[0], entry[0]) + " - " + entry[1] for index, entry in self.data.netusb_preset_list.items() }, } return inputs # -----Group Management------ def register_group_update_callback(self, callback: AsyncCallback) -> None: """Register callbacks invoked after distribution updates.""" self._group_update_callbacks.add(callback) def remove_group_update_callback(self, callback: AsyncCallback) -> None: """Remove callbacks invoked after distribution data changes.""" self._group_update_callbacks.discard(callback) # Simple check functions for better code readability def _check_clients_removed(self, clients: list[str]) -> bool: return all(client not in self.data.group_client_list for client in clients) def _check_clients_added(self, clients: list[str]) -> bool: return all(client in self.data.group_client_list for client in clients) def _check_group_id(self, group_id: str | None) -> bool: return self.data.group_id == group_id def _check_source(self, source: str, zone: str) -> bool: return self.data.zones[zone].input == source def _check_group_role(self, role): return self.data.group_role == role def _check_group_server_zone(self, zone): return self.data.group_server_zone == zone def _check_power_status(self, zone_id, status): return self.data.zones[zone_id].power == status # Group update checking functions async def wait_for_data_update(self, checks): while True: if all(check() for check in checks): return await asyncio.sleep(0.1) async def check_group_data(self, checks): try: await asyncio.wait_for(self.wait_for_data_update(checks), 1) except asyncio.exceptions.TimeoutError: _LOGGER.warning( "Coordinator of %s did not receive the expected group data update via UDP. Fetching manually.", self.ip, ) await self._fetch_distribution_data() return all(check() for check in checks) # Group server functions async def mc_server_group_extend(self, zone, client_ips, group_id, distribution_num, retry=True): """Extend the given group by the given clients. If the group does not exist, it will be created. """ async with self.data.group_update_lock: await self.device.post(*Dist.set_server_info(group_id, zone, "add", client_ips)) await self.device.get(Dist.start_distribution(distribution_num)) if await self.check_group_data( [ lambda: self._check_clients_added(client_ips), lambda: self._check_group_id(group_id), lambda: self._check_group_role("server"), lambda: self._check_group_server_zone(zone), ] ): return if retry: await self.mc_server_group_extend(zone, client_ips, group_id, distribution_num, False) else: raise MusicCastGroupException(self.ip + ": Failed to extent group by clients " + str(client_ips)) async def mc_server_group_reduce(self, zone, client_ips_for_removal, distribution_num, retry=True): """Reduce the current group by the given clients.""" async with self.data.group_update_lock: await self.device.post( *Dist.set_server_info( self.data.group_id, zone, "remove", client_ips_for_removal, ) ) if await self.check_group_data([lambda: self._check_clients_removed(client_ips_for_removal)]): if self.data.group_client_list: await self.device.get(Dist.start_distribution(distribution_num)) return if retry: await self.mc_server_group_reduce(zone, client_ips_for_removal, distribution_num, False) else: raise MusicCastGroupException( self.ip + ": Failed to reduce group by clients " + str(client_ips_for_removal) ) async def mc_server_group_close(self, retry=True): """Close the current group.""" async with self.data.group_update_lock: await self.device.get(Dist.stop_distribution()) await self.device.post(*Dist.set_server_info("")) if await self.check_group_data([lambda: self._check_group_id(NULL_GROUP)]): return if retry: await self.mc_server_group_close(False) else: raise MusicCastGroupException(self.ip + ": Failed to close group.") # Group client functions async def mc_client_join(self, server_ip, group_id, zone, retry=True): """Join the given group as a client.""" async with self.data.group_update_lock: await self.device.post(*Dist.set_client_info(group_id, [zone], server_ip)) await self.device.request(Zone.set_input(zone, MC_LINK, "")) if await self.check_group_data( [ lambda: self._check_group_id(group_id), lambda: self._check_source(MC_LINK, zone), ] ): return if retry: await self.mc_client_join(server_ip, group_id, zone, False) else: raise MusicCastGroupException(self.ip + ": Failed to join the group.") async def mc_client_unjoin(self, retry=True): """Unjoin the current group.""" async with self.data.group_update_lock: await self.device.post(*Dist.set_client_info("")) if await self.check_group_data([lambda: self._check_group_id(NULL_GROUP)]): return if retry: await self.mc_client_unjoin(False) else: raise MusicCastGroupException(self.ip + ": Failed to leave group") async def zone_unjoin(self, zone_id, retry=True): """Stop playback for one zone while keeping the device grouped. The previous input is restored if possible and the zone is turned off. """ async with self.data.group_update_lock: save_inputs = self.get_save_inputs(zone_id) if len(save_inputs): await self.select_source(zone_id, save_inputs[0]) else: _LOGGER.warning("%s: did not find a save input for zone %s", self.ip, zone_id) # Then turn off the zone await self.turn_off(zone_id) if await self.check_group_data([lambda: self._check_power_status(zone_id, "standby")]): return if retry: await self.zone_unjoin(zone_id, False) else: raise MusicCastGroupException(self.ip + ": Failed to leave group with zone " + zone_id) async def zone_join(self, zone_id, retry=True): """Join a MusicCast group with another zone on this device. The zone switches to the MC_LINK input and retries automatically on transient failures. """ async with self.data.group_update_lock: await self.select_source(zone_id, MC_LINK) if await self.check_group_data([lambda: self._check_source(MC_LINK, zone_id)]): return if retry: await self.zone_join(zone_id, False) else: raise MusicCastGroupException(self.ip + ": Failed to join group with zone " + zone_id) # Misc def get_save_inputs(self, zone_id): """Return a save save source for the given zone_id. A save input can be any input except netusb ones if the netusb module is already in use. """ netusb_in_use = any(zone.input == self.data.netusb_input for zone in self.data.zones.values()) zone = self.data.zones.get(zone_id) return [ source.get("id") for source in self._features.get("system", {}).get("input_list", []) if source.get("distribution_enable") and (source.get("play_info_type") != "netusb" or not netusb_in_use) and source.get("id") not in MC_LINK_SOURCES and source.get("id") in (zone.input_list if zone else []) ] async def _fetch_netusb_presets(self): result = await self.device.request_json(NetUSB.get_preset_info()) self.data.netusb_preset_list = { index + 1: (entry.get("input"), entry.get("text")) for index, entry in enumerate(result.get("preset_info", [])) if entry.get("input") != "unknown" } aiomusiccast-0.15.0/aiomusiccast/musiccast_media_content.py0000644000000000000000000001753513615410400021136 0ustar00from __future__ import annotations import logging from collections.abc import Sequence from dataclasses import dataclass, field from typing import ClassVar from .musiccast_device import MusicCastDevice Logger = logging.getLogger(__name__) @dataclass(slots=True) class MusicCastMediaContent: """Container for browsable MusicCast media entries.""" BROWSABLE_INPUTS: ClassVar[tuple[str, ...]] = ( "usb", "server", "net_radio", "rhapsody", "napster", "pandora", "siriusxm", "juke", "radiko", "qobuz", "deezer", "amazon_music", ) musiccast: MusicCastDevice | None = None zone_id: str | None = None can_browse: bool = False can_play: bool = False can_search: bool = False title: str | None = None content_id: str | None = None menu_layer: int = -1 thumbnail: str | None = None content_type: str | None = None list_len: int = 8 start_index: int = 0 has_next_page: bool = False has_previous_page: bool = False children: list[MusicCastMediaContent] = field(default_factory=list) def __post_init__(self) -> None: if self.musiccast and not self.zone_id: msg = "Zone id must be provided when binding a musiccast device." raise ValueError(msg) @property def _zone_id(self) -> str: if self.zone_id is None: msg = "Zone id is required for this operation." raise ValueError(msg) return self.zone_id @property def _device(self) -> MusicCastDevice: if self.musiccast is None: msg = "MusicCast device must be provided for this operation." raise ValueError(msg) return self.musiccast @classmethod def from_info(cls, source: str, info: dict, menu_layer: int, index: int) -> MusicCastMediaContent: # b[1] Capable of Select(common for all Net/USB sources # b[2] Capable of Play(common for all Net/USB sources) # b[3] Capable of Search attribute_raw = info.get("attribute") attribute = int(attribute_raw) if attribute_raw is not None else 0 return cls( can_browse=attribute & 0b10 == 0b10, can_play=attribute & 0b100 == 0b100, can_search=attribute & 0b1000 == 0b1000, title=info.get("text"), content_id=f"list:{source}:{menu_layer}:{index}", thumbnail=info.get("thumbnail"), menu_layer=menu_layer, content_type="directory" if attribute & 0b10 == 0b10 else "track", ) @classmethod def from_preset(cls, preset_num: str | int, preset: Sequence[str]) -> MusicCastMediaContent: return cls( can_play=True, title=preset[0] + " - " + preset[1], content_id=f"presets:{preset_num}", content_type="track" ) @classmethod async def browse_media( cls, musiccast: MusicCastDevice, zone_id: str, media_content_path: Sequence[str], list_len: int = 8 ) -> MusicCastMediaContent: self = cls( musiccast=musiccast, zone_id=zone_id, can_browse=True, content_id=":".join(media_content_path), list_len=list_len, ) if media_content_path[-1].startswith("<>"): # just a page change self.start_index = int(media_content_path[-1][2:]) self.content_id = ":".join(media_content_path[:-1]) device = self._device if media_content_path[0] == "input": source = media_content_path[1] await self.return_in_list_info(source) await self.load_list(source) elif media_content_path[0] == "list": source = media_content_path[1] self.menu_layer = int(media_content_path[2]) list_info = await device.get_list_info(source, 0) if self.menu_layer < list_info.get("menu_layer"): await self.return_in_list_info(source, self.menu_layer) elif media_content_path[3].isdigit(): # an item was selected await device.select_list_item(media_content_path[3], self._zone_id) elif self.menu_layer != list_info.get("menu_layer"): Logger.warning( "Unexpected menu layer. Expected %s, found %s", self.menu_layer, list_info.get("menu_layer"), ) await self.load_list(source) elif media_content_path[0] == "presets": for i, preset in device.data.netusb_preset_list.items(): self.children.append(self.from_preset(i, preset)) self.title = "Presets" self.can_browse = True self.content_type = "directory" else: raise ValueError(f"{media_content_path[0]} is an unknown browse method.") return self @classmethod def categories(cls, musiccast: MusicCastDevice, zone_id: str) -> MusicCastMediaContent: self = cls( musiccast=musiccast, zone_id=zone_id, title="Library", content_id="", content_type="categories", can_browse=True, ) device = self._device sources = sorted(set(cls.BROWSABLE_INPUTS).intersection(device.data.zones[self._zone_id].input_list)) self.children.append( MusicCastMediaContent(title="Presets", content_id="presets", can_browse=True, content_type="directory") ) for source in sources: self.children.append( MusicCastMediaContent( title=device.data.input_names.get(source, source), content_id=f"input:{source}", can_browse=True, content_type="directory", ) ) return self async def load_list(self, source: str) -> None: # load list info device = self._device list_info = await device.get_list_info(source, self.start_index) self.title = list_info.get("menu_name") self.menu_layer = int(list_info.get("menu_layer")) self.content_id = f"list:{source}:{self.menu_layer}:<>{self.start_index}" # get list items entries = list_info.get("list_info", []) for i in range(self.start_index + 8, self.start_index + self.list_len, 8): if i >= list_info.get("max_line", 8): break list_info_tmp = await device.get_list_info(source, i) entries += list_info_tmp.get("list_info", []) if int(self.start_index) != 0: self.has_previous_page = True for i, info in enumerate(list_info.get("list_info", [])): self.children.append(self.from_info(source, info, self.menu_layer + 1, self.start_index + i)) self.can_play = not any(child.can_browse for child in self.children) self.can_browse = True self.content_type = "directory" if any(child.can_browse for child in self.children) else "track" if (list_info.get("max_line", 8) - self.start_index) >= self.list_len: self.has_next_page = True self.children.append( MusicCastMediaContent( can_browse=True, content_type="directory", menu_layer=self.menu_layer, content_id=":".join(self.content_id.split(":")[:-1]) + f":<>{self.start_index + self.list_len}", title="Next Page", ) ) async def return_in_list_info(self, source: str, until_layer: int = 0) -> None: # reset list info while True: list_info = await self._device.get_list_info(source, 0) self.menu_layer = list_info.get("menu_layer") if self.menu_layer == until_layer: break await self._device.return_in_list(self._zone_id) aiomusiccast-0.15.0/aiomusiccast/pyamaha.py0000644000000000000000000025173413615410400015673 0ustar00# taken from github.com/rsc-dev/pyamaha, which is licensed under the MIT License # ruff: noqa: D205,D400,D401 from __future__ import annotations import asyncio import json import logging import queue import urllib import xml.etree.ElementTree as ET from asyncio import AbstractEventLoop from asyncio.transports import BaseTransport from collections.abc import Awaitable, Callable from datetime import datetime from typing import Any, ClassVar from urllib.parse import urlparse import aiohttp from aiohttp import ClientError, ClientResponse, ClientTimeout from aiomusiccast.exceptions import ( MusicCastConfigurationException, MusicCastConnectionException, MusicCastParamException, ) BAND = ["common", "am", "fm", "dab"] CD_PLAYBACK = [ "play", "stop", "pause", "previous", "next", "fast_reverse_start", "fast_reverse_end", "fast_forward_start", "fast_forward_end", "track_select ", ] DIR = ["next", "previous"] PLAYBACK = [ "play", "stop", "pause", "play_pause", "previous", "next", "fast_reverse_start", "fast_reverse_end", "fast_forward_start", "fast_forward_end", ] PRESET_BAND = ["common", "separate"] ZONES = ["main", "zone2", "zone3", "zone4"] SERVICE_INFO_TYPE = ["account_list", "licensing", "activation_code"] SLEEP = [0, 30, 60, 90, 120] TUNING = ["up", "down", "cancel", "auto_up", "auto_down", "tp_up", "tp_down", "direct"] TYPE = ["select", "play", "return"] POWER = ["on", "standby", "toggle"] LIST_ID = ["main", "auto_complete", "search_artist", "search_track"] LANG = ["en", "ja", "fr", "de", "es", "ru", "it", "zh"] WIFI = ["none", "wep", "wpa2-psk(aes)", "mixed_mode"] WIFI_DIRECT = ["none", "wpa2-psk(aes)"] STANDBY = ["off", "on", "auto"] RESPONSE_CODE = { 0: "Successful request", 1: "Initializing", 2: "Internal Error", 3: "Invalid Request (A method did not exist, a method wasn't appropriate etc.)", 4: "Invalid Parameter (Out of range, invalid characters etc.)", 5: "Guarded (Unable to setup in current status etc.)", 6: "Time Out", 99: "Firmware Updating", 100: "Access Error", 101: "Other Errors", 102: "Wrong User Name", 103: "Wrong Password", 104: "Account Expired", 105: "Account Disconnected/Gone Off/Shut Down", 106: "Account Number Reached to the Limit", 107: "Server Maintenance", 108: "Invalid Account", 109: "License Error", 110: "Read Only Mode", 111: "Max Stations", 112: "Access Denied", } _LOGGER = logging.getLogger(__name__) class MusicCastUdpProtocol(asyncio.DatagramProtocol): transport: BaseTransport def __init__(self, handle_event) -> None: super().__init__() self.handle_event = handle_event def connection_made(self, transport): self.transport = transport def datagram_received(self, data, _addr): message_data = None message_str = "" try: message_str = data.decode() message_data = json.loads(message_str) except UnicodeDecodeError: _LOGGER.error("Received non UTF-8 compliant message: %s", data) except ValueError: _LOGGER.error("Received invalid message: %s", message_str) except Exception: _LOGGER.exception("An unexpected error occurred while handling an UDP message.") finally: task = asyncio.create_task(self.handle_event(message_data)) task.add_done_callback(lambda _task: None) class UrlBuilder: @classmethod def build_query_str(cls, query_params: dict[str, str], **kwargs): if not all(param in query_params for param in kwargs): raise MusicCastParamException("Unknown parameter while building query string.") if not all(param in kwargs for param, req in query_params.items() if req): raise MusicCastParamException("Not all required params were provided.") return urllib.parse.urlencode({key: val for key, val in kwargs.items() if val is not None}) @classmethod def build_url(cls, url: tuple[str, dict[str, Any]], **kwargs: Any) -> str: return f"{url[0]}?{cls.build_query_str(url[1], **kwargs)}" @classmethod def build_zone_url(cls, url: tuple[str, dict[str, Any]], zone: str, **kwargs: Any) -> str: base_url = url[0].format(host="{host}", zone=zone) return f"{base_url}?{cls.build_query_str(url[1], **kwargs)}" class AsyncDevice: """Yamaha async device abstraction class.""" ip: str handle_event: Callable[[dict[str, Any] | None], Awaitable[None]] | None _messages: queue.Queue[Any] _transport: BaseTransport | None def __init__( self, client: aiohttp.ClientSession, ip: str, loop: AbstractEventLoop, handle_event: Callable[[dict[str, Any] | None], Awaitable[None]] | None = None, upnp_description: str | None = None, ) -> None: """Ctor. Parameters ---------- client : Any aiohttp client session. ip : Any Yamaha device IP. """ self.ip = ip self.client: aiohttp.ClientSession = client self.loop = loop self.handle_event = handle_event self.upnp_description = upnp_description self.upnp_avt_ns = None self.upnp_avt_ctrl = None self._messages = queue.Queue() self._headers = {} self._transport = None # end-of-method __init__ @property def transport(self): return self._transport async def enable_polling(self): # One protocol instance will be created to serve all # client requests. self._transport, _ = await self.loop.create_datagram_endpoint( lambda: MusicCastUdpProtocol(self.handle_event), local_addr=("0.0.0.0", 0) ) socket = self._transport.get_extra_info("socket") if socket is None: self.disable_polling() _LOGGER.error("Failed to open UDP connection") return port = socket.getsockname()[1] self._headers.update({"X-AppName": "MusicCast/1.0", "X-AppPort": str(port)}) await self.request_json(System.get_device_info()) def disable_polling(self): self._headers = {} self._transport.close() self._transport = None async def request(self, *args): """Request YamahaExtendedControl API URI. Parameters ---------- args : Any URI link for GET or tuple (URI, data) for POST. """ try: # If it is only a URI, send GET... if isinstance(args[0], str): return await self.get(args[0]) # ...otherwise unpack tuple and send POST return await self.post(*(args[0])) except ClientError as ce: raise MusicCastConnectionException() from ce except TimeoutError as te: raise MusicCastConnectionException() from te # end-of-method request @classmethod async def build_json(cls, response: ClientResponse): """A method, which tries to decode the response with errors being ignored. Parameters ---------- response : ClientResponse The ClientResponse, which the data should be extracted from. Returns ------- dict A dictionary on success. """ try: text = await response.text() except UnicodeDecodeError: _LOGGER.warning("Failed to decode response. Trying to decode it with errors being ignored") text = await response.text(errors="ignore") try: return json.loads(text) except ValueError: _LOGGER.error("Failed to generate JSON from %s", text) raise async def request_json(self, *args): """Request YamahaExtendedControl API URI. Parameters ---------- args : Any URI link for GET or tuple (URI, data) for POST. """ try: # If it is only a URI, send GET... if isinstance(args[0], str): response = await self.get(args[0]) else: # ...otherwise unpack tuple and send POST response = await self.post(*(args[0])) return await self.build_json(response) except ClientError as ce: raise MusicCastConnectionException() from ce except TimeoutError as te: raise MusicCastConnectionException() from te # end-of-method request_json async def get(self, uri): """Request given URI. Returns response object. Parameters ---------- uri : Any URI to request """ return await self.client.get(uri.format(host=self.ip), headers=self._headers, timeout=ClientTimeout(total=5)) # end-of-method get async def post(self, uri, data): """Send POST request. Returns response object. Parameters ---------- uri : Any URI to send POST data : Any POST data """ return await self.client.post(uri.format(host=self.ip), data=json.dumps(data), headers=self._headers) # end-of-method post async def dlna_avt_request(self, action: str, dlna_body_args: dict): if not self.upnp_description: raise MusicCastConfigurationException("The UPNP description has to be set to perform this action.") upnp_port = urlparse(self.upnp_description).port if not self.upnp_avt_ctrl or not self.upnp_avt_ns: desc = await (await self.client.get(self.upnp_description)).text() service_list = desc[desc.find("") : desc.find("") + 14] services_xml = ET.fromstring(service_list) res = None for child in services_xml: service_id = child.find("serviceId") if service_id.text.find("AVT") != -1: res = child break if not res: raise MusicCastConfigurationException("Did not find the AVTransport service.") self.upnp_avt_ns = res.find("serviceType").text self.upnp_avt_ctrl = res.find("controlURL").text avt_ctrl_url = f"http://{self.ip}:{upnp_port}{self.upnp_avt_ctrl}" dlna_body = "".join([f"<{key}>{value}" for key, value in dlna_body_args.items()]) body = ( '' '' "" f'' f"{dlna_body}" f"" "" "" ) headers = { "Content-Type": 'text/xml; charset="utf-8"', "SOAPACTION": f'"{self.upnp_avt_ns}#{action}"', "Accept": "*/*", "User-Agent": "MusicCast/4673 (iOS)", # Otherwise the main zone switches to server source on play commands "Content-Length": str(len(body)), } return await self.client.request("POST", avt_ctrl_url, headers=headers, data=body) # end-of-class Device class Dist: """APIs for link distribution settings and information.""" URI: ClassVar[dict[str, str]] = { "GET_DISTRIBUTION_INFO": "http://{host}/YamahaExtendedControl/v1/dist/getDistributionInfo", "SET_SERVER_INFO": "http://{host}/YamahaExtendedControl/v1/dist/setServerInfo", "SET_CLIENT_INFO": "http://{host}/YamahaExtendedControl/v1/dist/setClientInfo", "START_DISTRIBUTION": "http://{host}/YamahaExtendedControl/v1/dist/startDistribution?num={num}", "STOP_DISTRIBUTION": "http://{host}/YamahaExtendedControl/v1/dist/stopDistribution", "SET_GROUP_NAME": "http://{host}/YamahaExtendedControl/v1/dist/setGroupName", } @staticmethod def get_distribution_info(): """Retrieve link distribution information from the device.""" return Dist.URI["GET_DISTRIBUTION_INFO"] # end-of-method get_distribution_info @staticmethod def set_server_info(group_id, zone=None, type=None, client_list=None): """For setting a Link distribution server (Link master). Parameters ---------- group_id : Any Specify Group ID in 32-digit hex. Specify "" (empty text) here to cancel a Device being the Link distribution server. Group ID will be initialized ("000...") after the cancel operation. zone : Any Specifies which target Zone ID to be the Link distribution server. If nothing is specified, current setting is kept. Zone ID to be the Link distribution server is confirmable using system/getFeatures server_zone_list. Values: "main" / "zone2" / "zone3" / "zone4" type : Any Specifies a type of adding or removing clients. Not necessary to specify when canceling the Link master status. Values: "add" / "remove" client_list : Any Specifies IP addresses of adding/removing clients. Specifiable up to 9 clients """ data = {"group_id": group_id} if zone is not None: data["zone"] = zone if type is not None: data["type"] = type if client_list is not None: data["client_list"] = client_list return Dist.URI["SET_SERVER_INFO"], data # end-of-method set_server_info @staticmethod def set_client_info(group_id, zones=None, server_ip_address=None): """ For setting Link distributed clients. If a Device is already setup as Link distribution server, this client setup is denied by that Device: use this API after canceling a Device's Link distribution server setup using setServerInfo, then confirming that the target Device's role is changed to other values than "server" using getDistributionInfo. Parameters ---------- group_id : Any Specifies Group ID in 32-digit hex. Specify "" (empty text) here to cancel a Device being a Link distributed client. Group ID will be initialized ("000...") after the cancel operation. zones : Any Specifies which target Zone ID to be a Link distributed client. Not necessary to specify when cancelling a client status. Values: "main" / "zone2" / "zone3" / "zone4" server_ip_address : Any Specifies the IP Address of the Link distribution server. """ data = {"group_id": group_id} if zones is not None: data["zone"] = zones if server_ip_address is not None: data["server_ip_address"] = server_ip_address return Dist.URI["SET_CLIENT_INFO"], data # end-of-method set_client_info @staticmethod def start_distribution(num): """For initiating Link distribution. This is valid to a Device that is setup as Link distribution server. Parameters ---------- num : Any Specifies Link distribution number on current MusicCast Network. """ return Dist.URI["START_DISTRIBUTION"].format(host="{host}", num=num) # end-of-method start_distribution @staticmethod def stop_distribution(): """For quitting Link distribution. This is valid to a Device that is setup as Link distribution server. """ return Dist.URI["STOP_DISTRIBUTION"] # end-of-method stop_distribution @staticmethod def set_group_name(name): """For setting up Group Name. Note that Group Name is reserved in volatile memory. Parameters ---------- name : Any Specifies Group Name. Use UTF-8 within 128 bytes. Default name would be used if it's not setup or "" (empty text) is specified. """ data = {"name": name} return Dist.URI["SET_GROUP_NAME"], data # end-of-method set_group_name # end-of-class Dist class System: """System commands.""" URI: ClassVar[dict[str, str]] = { "GET_DEVICE_INFO": "http://{host}/YamahaExtendedControl/v1/system/getDeviceInfo", "GET_FEATURES": "http://{host}/YamahaExtendedControl/v1/system/getFeatures", "GET_NETWORK_STATUS": "http://{host}/YamahaExtendedControl/v1/system/getNetworkStatus", "GET_FUNC_STATUS": "http://{host}/YamahaExtendedControl/v1/system/getFuncStatus", "SET_AUTOPOWER_STANDBY": "http://{host}/YamahaExtendedControl/v1/system/setAutoPowerStandby?enable={enable}", "GET_LOCATION_INFO": "http://{host}/YamahaExtendedControl/v1/system/getLocationInfo", "SEND_IR_CODE": "http://{host}/YamahaExtendedControl/v1/system/sendIrCode?code={code}", "SET_WIRED_LAN": "http://{host}/YamahaExtendedControl/v1/system/setWiredLan", "SET_WIRELESS_LAN": "http://{host}/YamahaExtendedControl/v1/system/setWirelessLan", "SET_WIRELESS_DIRECT": "http://{host}/YamahaExtendedControl/v1/system/setWirelessDirect", "SET_IP_SETTINGS": "http://{host}/YamahaExtendedControl/v1/system/setIpSettings", "SET_NETWORK_NAME": "http://{host}/YamahaExtendedControl/v1/system/setNetworkName", "SET_AIRPLAY_PIN": "http://{host}/YamahaExtendedControl/v1/system/setAirPlayPin", "GET_MAC_ADDRESS_FILTER": "http://{host}/YamahaExtendedControl/v1/system/getMacAddressFilter", "SET_MAC_ADDRESS_FILTER": "http://{host}/YamahaExtendedControl/v1/system/setMacAddressFilter", "GET_NETWORK_STANDBY": "http://{host}/YamahaExtendedControl/v1/system/getNetworkStandby", "SET_NETWORK_STANDBY": "http://{host}/YamahaExtendedControl/v1/system/setNetworkStandby?standby={standby}", "GET_BLUETOOTH_INFO": "http://{host}/YamahaExtendedControl/v1/system/getBluetoothInfo", "SET_BLUETOOTH_STANDBY": "http://{host}/YamahaExtendedControl/v1/system/setBluetoothStandby?enable={enable}", "SET_BLUETOOTH_TX_SETTING": "http://{host}/YamahaExtendedControl/v1/system/setBluetoothTxSetting?enable={enable}", "GET_BLUETOOTH_DEVICE_LIST": "http://{host}/YamahaExtendedControl/v1/system/getBluetoothDeviceList", "UPDATE_BLUETOOTH_DEVICE_LIST": "http://{host}/YamahaExtendedControl/v1/system/updateBluetoothDeviceList", "CONNECT_BLUETOOTH_DEVICE": "http://{host}/YamahaExtendedControl/v1/system/connectBluetoothDevice?address={address}", "DISCONNECT_BLUETOOTH_DEVICE": "http://{host}/YamahaExtendedControl/v1/system/disconnectBluetoothDevice", "SET_SPEAKER_A": "http://{host}/YamahaExtendedControl/v1/system/setSpeakerA?enable={enable}", "SET_SPEAKER_B": "http://{host}/YamahaExtendedControl/v1/system/setSpeakerB?enable={enable}", "SET_DIMMER": "http://{host}/YamahaExtendedControl/v1/system/setDimmer?value={value}", "SET_ZONE_B_VOLUME_SYNC": "http://{host}/YamahaExtendedControl/v1/system/setZoneBVolumeSync?enable={enable}", "SET_HDMI_OUT_1": "http://{host}/YamahaExtendedControl/v1/system/setHdmiOut1?enable={enable}", "SET_HDMI_OUT_2": "http://{host}/YamahaExtendedControl/v1/system/setHdmiOut2?enable={enable}", "GET_NAME_TEXT": "http://{host}/YamahaExtendedControl/v1/system/getNameText?id={id}", "SET_NAME_TEXT": "http://{host}/YamahaExtendedControl/v1/system/setNameText", "SET_SPEAKER_PATTERN": "http://{host}/YamahaExtendedControl/v1/system/setSpeakerPattern?num={num}", "SET_PARTYMODE": "http://{host}/YamahaExtendedControl/v1/system/setPartyMode?enable={enable}", } @staticmethod def get_device_info(): """For retrieving basic information of a Device.""" return System.URI["GET_DEVICE_INFO"] # end-of-method get_device_info @staticmethod def get_features(): """For retrieving feature information equipped with a Device.""" return System.URI["GET_FEATURES"] # end-of-method get_features @staticmethod def get_network_status(): """For retrieving network related setup/information.""" return System.URI["GET_NETWORK_STATUS"] # end-of-method get_network_status @staticmethod def get_func_status(): """For retrieving setup/information of overall system function. Parameters are readable only when corresponding functions are available in "func_list" of /system/getFeatures. """ return System.URI["GET_FUNC_STATUS"] # end-of-method get_func_status @staticmethod def set_autopower_standby(enable=True): """For setting Auto Power Standby status. Actual operations/reactions of enabling Auto Power Standby depend on each Device. Parameters ---------- enable : Any Specifies Auto Power Standby status. """ return System.URI["SET_AUTOPOWER_STANDBY"].format(host="{host}", enable=_bool_to_str(enable)) # end-of-method set_autopower_standby @staticmethod def get_location_info(): """For retrieving Location information.""" return System.URI["GET_LOCATION_INFO"] # end-of-method get_location_info @staticmethod def send_ir_code(code): """For sending specific remote IR code. A Device is operated same as remote IR code reception. But continuous IR code cannot be used in this command. Refer to each Device's IR code list for details.. Parameters ---------- code : Any Specifies IR code in 8-digit hex. """ return System.URI["SEND_IR_CODE"].format(host="{host}", code=code) # end-of-method send_ir_code @staticmethod def set_wired_lan( dhcp=None, ip_address=None, subnet_mask=None, default_gateway=None, dns_server_1=None, dns_server_2=None, ): """For setting Wired Network. Network connection is switched to wired by using this API. If no parameter is specified, current parameter is used. If set parameter is incomplete, it is possible not to provide network availability. Parameters ---------- dhcp : Any Specifies DHCP setting. ip_address : Any Specifies IP Address. subnet_mask : Any Specifies Subnet Mask. default_gateway : Any Specifies Default Gateway. dns_server_1 : Any Specifies DNS Server 1. dns_server_2 : Any Specifies DNS Server 2. """ data = {} if dhcp is not None: data["dhcp"] = dhcp if ip_address is not None: data["ip_address"] = ip_address if subnet_mask is not None: data["subnet_mask"] = subnet_mask if default_gateway is not None: data["default_gateway"] = default_gateway if dns_server_1 is not None: data["dns_server_1"] = dns_server_1 if dns_server_2 is not None: data["dns_server_2"] = dns_server_2 return System.URI["SET_WIRED_LAN"].format(host="{host}"), data # end-of-method set_wired_lan @staticmethod def set_wireless_lan( ssid=None, wifi_type=None, key=None, dhcp=None, ip_address=None, subnet_mask=None, default_gateway=None, dns_server_1=None, dns_server_2=None, ): """For setting Wireless Network (Wi-Fi). Network connection is switched to wireless (Wi-Fi) by using this API. If no parameter is specified, current parameter is used. If set parameter is incomplete, it is possible not to provide network availability. """ data = {} if ssid is not None: data["ssid"] = ssid if wifi_type is not None: assert wifi_type in WIFI, "Invalid TYPE value!" data["type"] = wifi_type if key is not None: data["key"] = key if dhcp is not None: data["dhcp"] = dhcp if ip_address is not None: data["ip_address"] = ip_address if subnet_mask is not None: data["subnet_mask"] = subnet_mask if default_gateway is not None: data["default_gateway"] = default_gateway if dns_server_1 is not None: data["dns_server_1"] = dns_server_1 if dns_server_2 is not None: data["dns_server_2"] = dns_server_2 return System.URI["SET_WIRELESS_LAN"].format(host="{host}"), data # end-of-method set_wireless_lan @staticmethod def set_wireless_direct(wifi_type=None, key=None): """For setting Wireless Network (Wireless Direct). Network connection is switched to wireless (Wireless Direct) by using this API. If no parameter is specified, current parameter is used. If set parameter is incomplete, it is possible not to provide network availability. """ data = {} if wifi_type is not None: assert wifi_type in WIFI_DIRECT, "Invalid TYPE value!" data["type"] = wifi_type if key is not None: data["key"] = key return System.URI["SET_WIRELESS_DIRECT"].format(host="{host}"), data # end-of-method set_wireless_direct @staticmethod def set_ip_settings(dhcp, ip_address, subnet_mask, default_gateway, dns_server_1, dns_server_2): """For setting IP. This API only set IP as maintain same network connection status (Wired/Wireless Lan/Wireless Direct/Extend). If no parameter is specified, current parameter is used. If set parameter is incomplete, it is possible not to provide network availability. """ data = {} if dhcp is not None: data["dhcp"] = dhcp if ip_address is not None: data["ip_address"] = ip_address if subnet_mask is not None: data["subnet_mask"] = subnet_mask if default_gateway is not None: data["default_gateway"] = default_gateway if dns_server_1 is not None: data["dns_server_1"] = dns_server_1 if dns_server_2 is not None: data["dns_server_2"] = dns_server_2 return System.URI["SET_WIRED_LAN"].format(host="{host}"), data # end-of-method set_ip_settings @staticmethod def set_network_name(name): """For setting Network Name (Friendly Name).""" return System.URI["SET_NETWORK_NAME"].format(host="{host}"), {"name": name} # end-of-method set_network_name @staticmethod def set_airplay_pin(pin): """For setting AirPlay PIN. This is valid only when "airplay" exists in "func_list" found in /system/getFuncStatus. """ return System.URI["SET_AIRPLAY_PIN"].format(host="{host}"), {"pin": pin} # end-of-method set_airplay_pin @staticmethod def get_mac_address_filter(): """For retrieving setup of MAC Address Filter.""" return System.URI["GET_MAC_ADDRESS_FILTER"] # end-of-method get_mac_address_filter @staticmethod def set_mac_address_filter(filter, *macs): """For setting MAC Address Filter.""" data = {"filter": filter} for i, address in enumerate(macs): data[f"address_{i + 1}"] = address if i >= 9: break return System.URI["SET_MAC_ADDRESS_FILTER"].format(host="{host}"), data # end-of-method set_mac_address_filter @staticmethod def get_network_standby(): """For retrieving setup of Network Standby.""" return System.URI["GET_NETWORK_STANDBY"] # end-of-method get_network_standby @staticmethod def set_network_standby(standby): """For setting Network Standby.""" assert standby in STANDBY, "Invalid STANDBY value!" return System.URI["SET_NETWORK_STANDBY"].format(host="{host}", standby=standby) # end-of-method set_network_standby @staticmethod def get_bluetooth_info(): """For retrieving setup/information of Bluetooth. Parameters are readable only when corresponding functions are available in "func_list" of /system/getFuncStatus. "bluetooth_device" parameter is contained in "bluetooth_tx_setting". """ return System.URI["GET_BLUETOOTH_INFO"] # end-of-method get_bluetooth_info @staticmethod def set_bluetooth_standby(enable=True): """For setting Bluetooth Standby.""" return System.URI["SET_BLUETOOTH_STANDBY"].format(host="{host}", enable=_bool_to_str(enable)) # end-of-method set_bluetooth_standby @staticmethod def set_bluetooth_tx_setting(enable=True): """For setting Bluetooth transmission.""" return System.URI["SET_BLUETOOTH_TX_SETTING"].format(host="{host}", enable=_bool_to_str(enable)) # end-of-method set_bluetooth_tx_setting @staticmethod def get_bluetooth_device_list(): """For retrieving Bluetooth (Sink) device list. This API is available only when "bluetooth_tx_setting" is true under /system/getFuncStatus. This device list information is in the cache. If update device list information, execute /system/updateBluetoothDeviceList. """ return System.URI["GET_BLUETOOTH_DEVICE_LIST"] # end-of-method get_bluetooth_device_list @staticmethod def update_bluetooth_device_list(): """For updating Bluetooth (Sink) device list. This API is available only when "bluetooth_tx_setting" is true under /system/getFuncStatus. Retrieve update status and list information after finish updating via /system/getBluetoothDeviceList. """ return System.URI["UPDATE_BLUETOOTH_DEVICE_LIST"] # end-of-method update_bluetooth_device_list @staticmethod def connect_bluetooth_device(address): """For connecting Bluetooth (Sink) device. This API is available only when "bluetooth_tx_setting" is true under /system/getFuncStatus. It is possible to take time to return this API response issued after connection status is fixed. """ return System.URI["CONNECT_BLUETOOTH_DEVICE"].format(host="{host}", address=address) # end-of-method connect_bluetooth_device @staticmethod def disconnect_bluetooth_device(): """For disconnecting Bluetooth (Sink) device. This API is available only when "bluetooth_tx_setting" is true under /system/getFuncStatus. This API response is issued immediately after disconnect request is accepted. """ return System.URI["DISCONNECT_BLUETOOTH_DEVICE"] # end-of-method disconnect_bluetooth_device @staticmethod def set_speaker_a(enable=True): """For setting Speaker A status.""" return System.URI["SET_SPEAKER_A"].format(host="{host}", enable=_bool_to_str(enable)) # end-of-method set_speaker_a @staticmethod def set_speaker_b(enable=True): """For setting Speaker A status.""" return System.URI["SET_SPEAKER_B"].format(host="{host}", enable=_bool_to_str(enable)) # end-of-method set_speaker_b @staticmethod def set_dimmer(value): """For setting FL/LED Dimmer. Parameters ---------- value : Any Setting Dimmer. Specifies -1 in case of auto setting. Specifies 0 or more than 0 in case of manual setting. Auto setting is available only when -1 is exists in vale range under /system/getFeatures. Value Range: calculated by minimum/maximum/step values gotten via /system/getFeatures """ return System.URI["SET_DIMMER"].format(host="{host}", value=value) # end-of-method set_dimmer @staticmethod def set_zone_b_volume_sync(enable): """For setting Zone B volume sync.""" return System.URI["SET_ZONE_B_VOLUME_SYNC"].format(host="{host}", enable=_bool_to_str(enable)) # end-of-method set_zone_b_volume_sync @staticmethod def set_hdmi_out_1(enable): """set_hdmi_out_1.""" return System.URI["SET_HDMI_OUT_1"].format(host="{host}", enable=_bool_to_str(enable)) # end-of-method set_hdmi_out_1 @staticmethod def set_hdmi_out_2(enable): """set_hdmi_out_1.""" return System.URI["SET_HDMI_OUT_2"].format(host="{host}", enable=_bool_to_str(enable)) # end-of-method set_hdmi_out_2 @staticmethod def get_name_text(id): """For retrieving text information of Zone, Input, Sound program. If they can be renamed, can retrieve text information renamed. Parameters ---------- id : Any Specifies ID. If no ID is specified, retrieve all information of Zone, Input, Sound program. Refer to "All ID List" for details (documentation). """ return System.URI["GET_NAME_TEXT"].format(host="{host}", id=id) # end-of-method get_name_text @staticmethod def set_name_text(id, text): """For setting text information related to each ID of Zone, Input. Parameters ---------- id : Any Specifies ID. Input ID can be specified only when " rename_enable " is true under /system/getFeatures. Sound Program ID can not be specified. Note: If "main" is specified, Network Name is overwritten with same text information to be acceptable both MusicCast CONTROLLER (Yamaha) and Spotify App. If Network Name is changed, "main" text information is not changed. text : Any Specifies text information (UTF-8 within 64 bytes). If "" (empty text) is specified, specifies default text information. """ data = {"id": id, "text": text} return System.URI["SET_NAME_TEXT"], data # end-of-method set_name_text @staticmethod def set_partymode(enable=True): """For setting Party Mode. Available only when "party_mode" exists in system func_list under /system/getFeatures. Parameters ---------- enable : Any boolean """ return System.URI["SET_PARTYMODE"].format(host="{host}", enable=_bool_to_str(enable)) # end-of-method set_partymode @staticmethod def set_speaker_pattern(num): """For setting speaker of device. Available only when "speaker_pattern" function exists in system func_list under /system/getFeatures. Parameters ---------- num : Any int Specifies Speaker pattern number. Values: speaker_pattern number from /system/getFeatures """ return System.URI["SET_SPEAKER_PATTERN"].format(host="{host}", num=num) # end-of-method set_speaker_pattern # end-of-class System class Zone: """Zone commands.""" URI: ClassVar[dict[str, str | tuple[str, dict[str, bool]]]] = { "GET_STATUS": "http://{host}/YamahaExtendedControl/v1/{zone}/getStatus", "GET_SOUND_PROGRAM_LIST": "http://{host}/YamahaExtendedControl/v1/{zone}/getSoundProgramList", "SET_POWER": "http://{host}/YamahaExtendedControl/v1/{zone}/setPower?power={power}", "SET_SLEEP": "http://{host}/YamahaExtendedControl/v1/{zone}/setSleep?sleep={sleep}", "SET_VOLUME": "http://{host}/YamahaExtendedControl/v1/{zone}/setVolume?volume={volume}", "SET_MUTE": "http://{host}/YamahaExtendedControl/v1/{zone}/setMute?enable={enable}", "SET_INPUT": "http://{host}/YamahaExtendedControl/v1/{zone}/setInput?input={input}&mode={mode}", "SET_SOUND_PROGRAM": "http://{host}/YamahaExtendedControl/v1/{zone}/setSoundProgram?program={program}", "PREPARE_INPUT_CHANGE": "http://{host}/YamahaExtendedControl/v1/{zone}/prepareInputChange?input={input}", "SET_SURROUND_3D": "http://{host}/YamahaExtendedControl/v1/{zone}/set3dSurround?enable={enable}", "SET_DIRECT": "http://{host}/YamahaExtendedControl/v1/{zone}/setDirect?enable={enable}", "SET_PURE_DIRECT": "http://{host}/YamahaExtendedControl/v1/{zone}/setPureDirect?enable={enable}", "SET_ENHANCER": "http://{host}/YamahaExtendedControl/v1/{zone}/setEnhancer?enable={enable}", "SET_TONE_CONTROL": ( "http://{host}/YamahaExtendedControl/v1/{zone}/setToneControl", {"mode": False, "bass": False, "treble": False}, ), "SET_EQUALIZER": ( "http://{host}/YamahaExtendedControl/v1/{zone}/setEqualizer", {"mode": False, "low": False, "mid": False, "high": False}, ), "SET_BALANCE": "http://{host}/YamahaExtendedControl/v1/{zone}/setBalance?value={value}", "SET_DIALOGUE_LEVEL": "http://{host}/YamahaExtendedControl/v1/{zone}/setDialogueLevel?value={value}", "SET_DIALOGUE_LIFT": "http://{host}/YamahaExtendedControl/v1/{zone}/setDialogueLift?value={value}", "SET_DTS_DIALOGUE_CONTROL": "http://{host}/YamahaExtendedControl/v1/{zone}/setDtsDialogueControl?num={value}", "SET_CLEAR_VOICE": "http://{host}/YamahaExtendedControl/v1/{zone}/setClearVoice?enable={enable}", "SET_SUBWOOFER_VOLUME": "http://{host}/YamahaExtendedControl/v1/{zone}/setSubwooferVolume?volume={volume}", "SET_BASS_EXTENSION": "http://{host}/YamahaExtendedControl/v1/{zone}/setBassExtension?enable={enable}", "SET_EXTRA_BASS": "http://{host}/YamahaExtendedControl/v1/{zone}/setExtraBass?enable={enable}", "GET_SIGNAL_INFO": "http://{host}/YamahaExtendedControl/v1/{zone}/getSignalInfo", "SET_LINK_CONTROL": "http://{host}/YamahaExtendedControl/v1/{zone}/setLinkControl?control={control}", "SET_LINK_AUDIO_DELAY": "http://{host}/YamahaExtendedControl/v1/{zone}/setLinkAudioDelay?delay={delay}", "SET_LINK_AUDIO_QUALITY": "http://{host}/YamahaExtendedControl/v1/{zone}/setLinkAudioQuality?mode={mode}", "SET_ADAPTIVE_DRC": "http://{host}/YamahaExtendedControl/v1/{zone}/setAdaptiveDrc?enable={enable}", "SET_SURR_DECODER_TYPE": "http://{host}/YamahaExtendedControl/v1/{zone}/setSurroundDecoderType?type={option}", } @staticmethod def get_status(zone): """For retrieving basic information of each Zone like power, volume, input and so on. Parameters ---------- zone : Any Specifies target Zone. Values: 'main', 'zone2', 'zone3', 'zone4' """ assert zone in ZONES, "Invalid ZONE value!" return Zone.URI["GET_STATUS"].format(host="{host}", zone=zone) # end-of-method get_status @staticmethod def get_sound_program_list(zone): """For retrieving a list of Sound Program available in each Zone. It is possible for the list contents to be dynamically changed. Parameters ---------- zone : Any Specifies target Zone. Values: 'main', 'zone2', 'zone3', 'zone4' """ assert zone in ZONES, "Invalid ZONE value!" return Zone.URI["GET_SOUND_PROGRAM_LIST"].format(host="{host}", zone=zone) # end-of-method get_sound_program_list @staticmethod def set_power(zone, power): """For setting power status of each Zone. Parameters ---------- zone : Any Specifies target Zone. Values: 'main', 'zone2', 'zone3', 'zone4' power : Any Specifies power status. Values: 'on', 'standby', 'toggle' """ assert zone in ZONES, "Invalid ZONE value!" assert power in POWER, "Invalid POWER value!" return Zone.URI["SET_POWER"].format(host="{host}", zone=zone, power=power) # end-of-method set_power @staticmethod def set_sleep(zone, sleep): """For setting Sleep Timer for each Zone. With Zone B enabled Devices, target Zone is described as Master Power, but Main Zone is used to set it up via YXC. Parameters ---------- zone : Any Specifies target Zone. Values: 'main', 'zone2', 'zone3', 'zone4' sleep : Any Specifies Sleep Time (unit in minutes) Values: 0, 30, 60, 90, 120 """ assert zone in ZONES, "Invalid ZONE value!" assert sleep in SLEEP, "Invalid SLEEP value!" return Zone.URI["SET_SLEEP"].format(host="{host}", zone=zone, sleep=sleep) # end-of-method set_sleep @staticmethod def set_volume(zone, volume, step): """For setting volume in each Zone. Values of specifying range and steps are different. There are some Devices that cannot allow this value to be go up to Device's maximum volume. Parameters ---------- zone : Any Specifies target Zone. Values: 'main', 'zone2', 'zone3', 'zone4' volume : Any Specifies volume value Value Range: calculated by minimum/maximum/step values gotten via /system/getFeatures. (Available on and after API Version 1.17) 'up', 'down' step : Any Specifies volume step value if the volume is 'up' or 'down'. If nothing specified, minimum step value is used implicitly. (Available on and after API Version 1.17) Values: Value range calculated by minimum/maximum/step values gotten via /system/getFeatures. """ assert zone in ZONES, "Invalid ZONE value!" url = Zone.URI["SET_VOLUME"].format(host="{host}", zone=zone, volume=volume) if step: url += f"&step={step}" return url # end-of-method set_volume @staticmethod def set_mute(zone, enable=True): """For setting mute status in each Zone. Parameters ---------- zone : Any Specifies target Zone. Values: 'main', 'zone2', 'zone3', 'zone4' enable : Any Specifying mute status. Default: True. """ assert zone in ZONES, "Invalid ZONE value!" return Zone.URI["SET_MUTE"].format(host="{host}", zone=zone, enable=_bool_to_str(enable)) # end-of-method set_mute @staticmethod def set_input(zone, input, mode): """For selecting each Zone input. Parameters ---------- zone : Any Specifies target Zone. Values: 'main', 'zone2', 'zone3', 'zone4' input : Any Specifies Input ID. Values: Input IDs gotten via /system/getFeatures mode : Any Specifies select mode. If no parameter is specified, actions of input change depend on a Device's specification Value: "autoplay_disabled" (Restricts Auto Play of Net/USB related Inputs). Available on and after API Version 1.12 """ assert zone in ZONES, "Invalid ZONE value!" return Zone.URI["SET_INPUT"].format(host="{host}", zone=zone, input=input, mode=mode) # end-of-method set_input @staticmethod def set_sound_program(zone, program): """For selecting Sound Programs. Parameters ---------- zone : Any Specifies target Zone. Values: 'main', 'zone2', 'zone3', 'zone4' program : Any Specifies Sound Program ID. Values: Sound Program IDs gotten via /system/getFeatures """ assert zone in ZONES, "Invalid ZONE value!" return Zone.URI["SET_SOUND_PROGRAM"].format(host="{host}", zone=zone, program=program) # end-of-method set_sound_program @staticmethod def prepare_input_change(zone, input): """Let a Device do necessary process before changing input in a specific zone. This is valid only when 'prepare_input_change' exists in 'func_list' found in /system/getFuncStatus. MusicCast CONTROLLER executes this API when an input icon is selected in a Room, right before sending various APIs (of retrieving list information etc.) regarding selecting input. Parameters ---------- zone : Any Specifies target Zone. Values: 'main', 'zone2', 'zone3', 'zone4' input : Any Specifies Input ID. Values: Input IDs gotten via /system/getFeatures """ assert zone in ZONES, "Invalid ZONE value!" return Zone.URI["PREPARE_INPUT_CHANGE"].format(host="{host}", zone=zone, input=input) # end-of-method prepare_input_change @staticmethod def set_surround_3d(zone, enable): """For setting 3D Surround status. Parameters ---------- zone : Any Specifies target Zone. Values: 'main', 'zone2', 'zone3', 'zone4' enable : Any Specifies 3D Surround status. """ assert zone in ZONES, "Invalid ZONE value!" return Zone.URI["SET_SURROUND_3D"].format(host="{host}", zone=zone, enable=_bool_to_str(enable)) # end-of-method set_surround_3d @staticmethod def set_direct(zone, enable): """For setting Direct status. Parameters ---------- zone : Any Specifies target Zone. Values: 'main', 'zone2', 'zone3', 'zone4' enable : Any Specifies Direct status. """ assert zone in ZONES, "Invalid ZONE value!" return Zone.URI["SET_DIRECT"].format(host="{host}", zone=zone, enable=_bool_to_str(enable)) # end-of-method set_direct @staticmethod def set_pure_direct(zone, enable): """For setting Pure Direct status. Parameters ---------- zone : Any Specifies target Zone. Values: 'main', 'zone2', 'zone3', 'zone4' enable : Any Specifies Pure Direct status. """ assert zone in ZONES, "Invalid ZONE value!" return Zone.URI["SET_PURE_DIRECT"].format(host="{host}", zone=zone, enable=_bool_to_str(enable)) # end-of-method set_pure_direct @staticmethod def set_enhancer(zone, enable): """For setting Enhancer status. Parameters ---------- zone : Any Specifies target Zone. Values: 'main', 'zone2', 'zone3', 'zone4' enable : Any Specifies Enhancer status. """ assert zone in ZONES, "Invalid ZONE value!" return Zone.URI["SET_ENHANCER"].format(host="{host}", zone=zone, enable=_bool_to_str(enable)) # end-of-method set_enhancer @staticmethod def set_tone_control(zone, mode, bass, treble): """For setting Tone Control in each Zone. Values of specifying range and steps are different. Parameters ---------- zone : Any Specifies target Zone. Values: 'main', 'zone2', 'zone3', 'zone4' mode : Any Specifies Mode setting. If no parameter is specified, current Mode setting is not changed. Regardless of the Mode setting, bass/treble setting can be changed, but valid only when Mode setting is "manual". bass : Any Specifies Bass value Values: Value range calculated by minimum/maximum/step values gotten via /system/getFeatures treble : Any Specifies Treble value Values: Value range calculated by minimum/maximum/step values gotten via /system/getFeatures """ assert zone in ZONES, "Invalid ZONE value!" return UrlBuilder.build_zone_url(Zone.URI["SET_TONE_CONTROL"], zone, mode=mode, bass=bass, treble=treble) # end-of-method set_tone_control @staticmethod def set_equalizer(zone, mode, low, mid, high): """For setting Equalizer in each Zone. Values of specifying range and steps are different. Parameters ---------- zone : Any Specifies target Zone. Values: 'main', 'zone2', 'zone3', 'zone4' mode : Any Specifies Mode setting. If no parameter is specified, current Mode setting is not changed. Regardless of the Mode setting, low/mid/high setting can be changed, but valid only when Mode setting is "manual". Values: Values gotten via /system/getFeatures low : Any Specifies Low value Values: Value range calculated by minimum/maximum/step values gotten via /system/getFeatures mid : Any Specifies Mid value Values: Value range calculated by minimum/maximum/step values gotten via /system/getFeatures high : Any Specifies High value Values: Value range calculated by minimum/maximum/step values gotten via /system/getFeatures """ assert zone in ZONES, "Invalid ZONE value!" return UrlBuilder.build_zone_url(Zone.URI["SET_EQUALIZER"], zone, mode=mode, low=low, mid=mid, high=high) # end-of-method set_equalizer @staticmethod def set_balance(zone, value): """For setting L/R Balance in each Zone's speaker. Values of specifying range and steps are different. Parameters ---------- zone : Any Specifies target Zone. Values: 'main', 'zone2', 'zone3', 'zone4' value : Any Specifies L/R Balance value. Negative values are for left side, positive values are for right side balance. Values: Value range calculated by minimum/maximum/step values gotten via /system/getFeatures """ assert zone in ZONES, "Invalid ZONE value!" return Zone.URI["SET_BALANCE"].format(host="{host}", zone=zone, value=value) # end-of-method set_balance @staticmethod def set_dialogue_level(zone, value): """For setting Dialogue Level in each Zone. Values of specifying range and steps are different. Parameters ---------- zone : Any Specifies target Zone. Values: 'main', 'zone2', 'zone3', 'zone4' value : Any Specifies Dialogue Level value Values: Value range calculated by minimum/maximum/step values gotten via /system/getFeatures """ assert zone in ZONES, "Invalid ZONE value!" return Zone.URI["SET_DIALOGUE_LEVEL"].format(host="{host}", zone=zone, value=value) # end-of-method set_dialogue_level @staticmethod def set_dialogue_lift(zone, value): """For setting Dialogue Lift in each Zone. Values of specifying range and steps are different. Parameters ---------- zone : Any Specifies target Zone. Values: 'main', 'zone2', 'zone3', 'zone4' value : Any Specifies Dialogue Lift value Values: Value range calculated by minimum/maximum/step values gotten via /system/getFeatures """ assert zone in ZONES, "Invalid ZONE value!" return Zone.URI["SET_DIALOGUE_LIFT"].format(host="{host}", zone=zone, value=value) # end-of-method set_dialogue_lift @staticmethod def set_dts_dialogue_control(zone, value): """For setting DTS Dialogue Control in each Zone. Values of specifying range and steps are different. Undocumented method. Parameters ---------- zone : Any Specifies target Zone. Values: 'main', 'zone2', 'zone3', 'zone4' value : Any Specifies DTS Dialogue Control value Values: Value range calculated by minimum/maximum/step values gotten via /system/getFeatures """ assert zone in ZONES, "Invalid ZONE value!" return Zone.URI["SET_DTS_DIALOGUE_CONTROL"].format(host="{host}", zone=zone, value=value) # end-of-method set_dts_dialogue_control @staticmethod def set_clear_voice(zone, enable): """For setting Clear Voice in each Zone. Parameters ---------- zone : Any Specifies target Zone. Values: 'main', 'zone2', 'zone3', 'zone4' enable : Any Specifies Clear Voice setting """ assert zone in ZONES, "Invalid ZONE value!" return Zone.URI["SET_CLEAR_VOICE"].format(host="{host}", zone=zone, enable=_bool_to_str(enable)) # end-of-method set_clear_voice @staticmethod def set_subwoofer_volume(zone, volume): """For setting Subwoofer Volume in each Zone. Parameters ---------- zone : Any Specifies target Zone. Values: 'main', 'zone2', 'zone3', 'zone4' volume : Any Specifies volume value Values: Value range calculated by minimum/maximum/step values gotten via /system/getFeatures """ assert zone in ZONES, "Invalid ZONE value!" return Zone.URI["SET_SUBWOOFER_VOLUME"].format(host="{host}", zone=zone, volume=volume) # end-of-method set_subwoofer_volume @staticmethod def set_bass_extension(zone, enable): """For setting Bass Extension in each Zone. Parameters ---------- zone : Any Specifies target Zone. Values: 'main', 'zone2', 'zone3', 'zone4' enable : Any Specifies Bass Extension setting """ assert zone in ZONES, "Invalid ZONE value!" return Zone.URI["SET_BASS_EXTENSION"].format(host="{host}", zone=zone, enable=_bool_to_str(enable)) # end-of-method set_bass_extension @staticmethod def set_extra_bass(zone, enable): """For setting Extra Bass in each Zone. Parameters ---------- zone : Any Specifies target Zone. Values: 'main', 'zone2', 'zone3', 'zone4' enable : Any Specifies Extra Bass setting """ assert zone in ZONES, "Invalid ZONE value!" return Zone.URI["SET_EXTRA_BASS"].format(host="{host}", zone=zone, enable=_bool_to_str(enable)) # end-of-method set_bass_extension @staticmethod def get_signal_info(zone): """For retrieving current playback signal information in each Zone. Parameters ---------- zone : Any Specifies target Zone. Values: 'main', 'zone2', 'zone3', 'zone4' """ assert zone in ZONES, "Invalid ZONE value!" return Zone.URI["GET_SIGNAL_INFO"].format(host="{host}", zone=zone) # end-of-method get_signal_info @staticmethod def set_link_control(zone, control): """For setting Link Control in each Zone. Parameters ---------- zone : Any Specifies target Zone. Values: 'main', 'zone2', 'zone3', 'zone4' control : Any Specifies Link Control setting Values: Values gotten via /system/getFeatures """ assert zone in ZONES, "Invalid ZONE value!" return Zone.URI["SET_LINK_CONTROL"].format(host="{host}", zone=zone, control=control) # end-of-method set_link_control @staticmethod def set_link_audio_delay(zone, delay): """For setting Link Audio Delay in each Zone. This setting is invalid when Link Control setting is "Stability Boost". Parameters ---------- zone : Any Specifies target Zone. Values: 'main', 'zone2', 'zone3', 'zone4' delay : Any Specifies Link Audio Delay setting Values: Values gotten via /system/getFeatures """ assert zone in ZONES, "Invalid ZONE value!" return Zone.URI["SET_LINK_AUDIO_DELAY"].format(host="{host}", zone=zone, delay=delay) # end-of-method set_link_audio_delay @staticmethod def set_link_audio_quality(zone, quality): """For setting Link Audio Quality in each Zone. Parameters ---------- zone : Any Specifies target Zone. Values: 'main', 'zone2', 'zone3', 'zone4' quality : Any Specifies Link Audio Quality setting Values: Values gotten via /system/getFeatures """ assert zone in ZONES, "Invalid ZONE value!" return Zone.URI["SET_LINK_AUDIO_QUALITY"].format(host="{host}", zone=zone, mode=quality) # end-of-method set_link_audio_delay @classmethod def set_adaptive_drc(cls, zone, value): """For setting Link Audio Quality in each Zone. Parameters ---------- zone : Any Specifies target Zone. Values: 'main', 'zone2', 'zone3', 'zone4' value : Any Specifies drc enable """ assert zone in ZONES, "Invalid ZONE value!" return Zone.URI["SET_ADAPTIVE_DRC"].format(host="{host}", zone=zone, enable=_bool_to_str(value)) @classmethod def set_surr_decoder_type(cls, zone, option): """For setting Surround decoder type in each Zone. Parameters ---------- zone : Any Specifies target Zone. Values: 'main', 'zone2', 'zone3', 'zone4' option : Any the surround decoder type to set """ assert zone in ZONES, "Invalid ZONE value!" return Zone.URI["SET_SURR_DECODER_TYPE"].format(host="{host}", zone=zone, option=option) # end-of-class Zone class Tuner: """APIs in regard to Tuner setting and getting information. Target inputs: AM / FM / DAB """ URI: ClassVar[dict[str, str]] = { "GET_PRESET_INFO": "http://{host}/YamahaExtendedControl/v1/tuner/getPresetInfo?band={band}", "GET_PLAY_INFO": "http://{host}/YamahaExtendedControl/v1/tuner/getPlayInfo", "SET_FREQ": "http://{host}/YamahaExtendedControl/v1/tuner/setFreq?band={band}&tuning={tuning}&num={num}", "RECALL_PRESET": "http://{host}/YamahaExtendedControl/v1/tuner/recallPreset?zone={zone}&band={band}&num={num}", "SWITCH_PRESET": "http://{host}/YamahaExtendedControl/v1/tuner/switchPreset?dir={dir}", "STORE_PRESET": "http://{host}/YamahaExtendedControl/v1/tuner/storePreset?num={num}", "SET_DAB_SERVICE": "http://{host}/YamahaExtendedControl/v1/tuner/setDabService?dir={dir}", } @staticmethod def get_preset_info(band): """For retrieving Tuner preset information. Parameters ---------- band : Any Specifying a band. Values depend on Preset Type gotten via /system/getFeatures. Values: 'common' (common), 'am', 'fm', 'dab' (separate) """ assert band in BAND, "Invalid BAND value!" return Tuner.URI["GET_PRESET_INFO"].format(host="{host}", band=band) # end-of-method get_preset_info @staticmethod def get_play_info(): """For retrieving playback information of Tuner.""" return Tuner.URI["GET_PLAY_INFO"] # end-of-method get_play_info @staticmethod def set_freq(band, tuning, num): """For setting Tuner frequency. Parameters ---------- band : Any Specifies Band. Values : 'am', 'fm' tuning : Any Specifies a tuning method. Use 'tp_up' and 'tp_down' only when Band is RDS. Values: 'up', 'down', 'cancel', 'auto_up', 'auto_down', 'tp_up', 'tp_down', 'direct' num : Any Specifies frequency (unit in kHz). Valid only when tuning is 'direct' """ assert band in BAND, "Invalid BAND value!" assert tuning in TUNING, "Invalid TUNING value!" return Tuner.URI["SET_FREQ"].format(host="{host}", band=band, tuning=tuning, num=num) # end-of-method set_freq @staticmethod def recall_preset(zone, band, num): """For recalling a Tuner preset. Parameters ---------- zone : Any Specifies station recalling zone. This causes input change in specified zone. Values: 'main', 'zone2', 'zone3', 'zone4' band : Any Specifies Band type. Depending on Preset Type gotten via /system/getFeatures, specifying value is different Values: 'common' (band common), 'separate' (each band preset) num : Any Specifies Preset number. Value: one in the range gotten via /system/getFeatures """ assert zone in ZONES, "Invalid ZONE value!" assert band in PRESET_BAND, "Invalid BAND value!" return Tuner.URI["RECALL_PRESET"].format(host="{host}", zone=zone, band=band, num=num) # end-of-method recall_preset @staticmethod def switch_preset(dir): """ For selecting Tuner preset. Call this API after change the target zone's input to Tuner. It is possible to change Band in case of preset type is 'common'. In case of preset type is 'separate', need to change the target Band before calling this API. This API is available on and after API Version 1.17. Parameters ---------- dir : Any Specifies change direction of preset. Values: 'next', 'previous' """ assert dir in DIR, "Invalid DIR value!" return Tuner.URI["SWITCH_PRESET"].format(host="{host}", dir=dir) # end-of-method switch_preset @staticmethod def store_preset(num): """For registering current station to a preset. Parameters ---------- num : Any Specifying a preset number. Value: one in the range gotten via /system/getFeatures """ return Tuner.URI["STORE_PRESET"].format(host="{host}", num=num) # end-of-method store_preset @staticmethod def set_dab_service(dir): """For selecting DAB Service. Available only when DAB is valid to use. Parameters ---------- dir : Any Specifies change direction of services. Values: 'next', 'previous' """ assert dir in DIR, "Invalid DIR value!" return Tuner.URI["SET_DAB_SERVICE"].format(host="{host}", dir=dir) # end-of-method set_dab_service # end-of-class Tuner class NetUSB: """APIs in regard to Network/USB related setting and getting information Target Inputs: USB / Network related ones (Server / Net Radio / Pandora / Spotify / AirPlay etc.). """ URI: ClassVar[dict[str, str]] = { "GET_PRESET_INFO": "http://{host}/YamahaExtendedControl/v1/netusb/getPresetInfo", "GET_PLAY_INFO": "http://{host}/YamahaExtendedControl/v1/netusb/getPlayInfo", "SET_PLAYBACK": "http://{host}/YamahaExtendedControl/v1/netusb/setPlayback?playback={playback}", "TOGGLE_REPEAT": "http://{host}/YamahaExtendedControl/v1/netusb/toggleRepeat", "TOGGLE_SHUFFLE": "http://{host}/YamahaExtendedControl/v1/netusb/toggleShuffle", "GET_LIST_INFO": "http://{host}/YamahaExtendedControl/v1/netusb/getListInfo?input={input}&index={index}&size={size}&lang={lang}&list_id={list_id}", "SET_LIST_CONTROL": "http://{host}/YamahaExtendedControl/v1/netusb/setListControl?list_id={list_id}&type={type}&index={index}&zone={zone}", "SET_SEARCH_STRING": "http://{host}/YamahaExtendedControl/v1/netusb/setSearchString", "RECALL_PRESET": "http://{host}/YamahaExtendedControl/v1/netusb/recallPreset?zone={zone}&num={num}", "STORE_PRESET": "http://{host}/YamahaExtendedControl/v1/netusb/storePreset?num={num}", "GET_ACCOUNT_STATUS": "http://{host}/YamahaExtendedControl/v1/netusb/getAccountStatus", "SWITCH_ACCOUNT": "http://{host}/YamahaExtendedControl/v1/netusb/switchAccount?input={input}&index={index}&timeout={timeout}", "GET_SERVICE_INFO": "http://{host}/YamahaExtendedControl/v1/netusb/getServiceInfo?input={input}&type={type}&timeout={timeout}", "SET_REPEAT": "http://{host}/YamahaExtendedControl/v1/netusb/setRepeat?mode={mode}", "SET_SHUFFLE": "http://{host}/YamahaExtendedControl/v1/netusb/setShuffle?mode={mode}", } @staticmethod def get_preset_info(): """For retrieving preset information. Presets are common use among Net/USB related input sources. """ return NetUSB.URI["GET_PRESET_INFO"] # end-of-method get_preset_info @staticmethod def get_play_info(): """For retrieving playback information.""" return NetUSB.URI["GET_PLAY_INFO"] # end-of-method get_play_info @staticmethod def set_playback(playback): """For controlling playback status. Parameters ---------- playback : Any Specifies playback status. Values: 'play', 'stop', 'pause', 'play_pause', 'previous', 'next', 'fast_reverse_start', 'fast_reverse_end', 'fast_forward_start', 'fast_forward_end' """ assert playback in PLAYBACK, "Invalid PLAYBACK value!" return NetUSB.URI["SET_PLAYBACK"].format(host="{host}", playback=playback) # end-of-method set_playback @staticmethod def toggle_repeat(): """For toggling repeat setting. No direct / discrete setting commands available. """ return NetUSB.URI["TOGGLE_REPEAT"] # end-of-method toggle_repeat @staticmethod def set_repeat(mode): """For setting repeat. Available on after API version 1.19. Parameters ---------- mode : Any Specifies the repeat setting. Value : "off" / "one" / "all" """ return NetUSB.URI["SET_REPEAT"].format(host="{host}", mode=mode) @staticmethod def set_shuffle(mode): """For setting shuffle. Available on after API version 1.19. Parameters ---------- mode : Any Specifies the shuffle setting. Value : "off" / "on" / "songs" / "albums" """ return NetUSB.URI["SET_SHUFFLE"].format(host="{host}", mode=mode) @staticmethod def toggle_shuffle(): """For toggling shuffle setting. No direct / discrete setting commands available. """ return NetUSB.URI["TOGGLE_SHUFFLE"] # end-of-method toggle_shuffle @staticmethod def get_list_info(input, index, size, lang, list_id): """For retrieving list information. Basically this info is available to all relevant inputs, not limited to or independent from current input. Parameters ---------- input : Any Specifies target Input ID. Controls for setListControl are to work with the input specified here. Values: Input IDs for Net/USB related sources index : Any Specifies the reference index (offset from the beginning of the list). Note that this index must be in multiple of 8. If nothing was specified, the reference index previously specified would be used. Values: 0, 8, 16, 24, ..., 64984, 64992 size : Any Specifies max list size retrieved at a time. Value Range: 1 - 8 lang : Any Specifies list language. But menu names or text info are not always necessarily pulled in a language specified here. If nothing specified, English ("en") is used implicitly Values: 'en' (English), 'ja' (Japanese), 'fr' (French), 'de' (German), 'es' (Spanish), 'ru' (Russian), 'it' (Italy), 'zh' (Chinese) list_id : Any Specifies list ID. If nothing specified, 'main' is chosen implicitly Values: 'main' (common for all Net/USB sources) 'auto_complete' (Pandora) 'search_artist' (Pandora) 'search_track' (Pandora) """ assert lang in LANG, "Invalid LANG value!" return NetUSB.URI["GET_LIST_INFO"].format( host="{host}", input=input, index=index, size=size, lang=lang, list_id=list_id, ) # end-of-method get_list_info @staticmethod def set_list_control(list_id, type, index, zone): """For control a list. Controllable list info is not limited to or independent from current input. Parameters ---------- list_id : Any Specifies list ID. If nothing specified, 'main' is chosen implicitly Values: 'main' (common for all Net/USB sources) 'auto_complete' (Pandora) 'search_artist' (Pandora) 'search_track' (Pandora) type : Any Specifies list transition type. 'select' is to enter and get into one deeper layer than the current layer where the element specified by the index belongs to. 'play' is to start playback current index element, 'return' is to go back one upper layer than current. 'select' and 'play' needs to specify an index at the same time. In case to 'select' an element with its attribute being 'Capable of Search', specify search text using setSearchString in advance. (Or it is possible to specify search text and move layers at the same time by specifying an index in setSearchString). Values: 'select', 'play', 'return' """ assert type in TYPE, "Invalid TYPE value!" assert zone in ZONES, "Invalid ZONE value!" return NetUSB.URI["SET_LIST_CONTROL"].format(host="{host}", list_id=list_id, type=type, index=index, zone=zone) # end-of-method set_list_control @staticmethod def set_search_string(search_string, list_id=None, index=None): """For setting search text. Specifies string executing this API before select an element with its attribute being “Capable of Searchâ€� or retrieve info about searching list(Pandora). Parameters ---------- search_string : Any Value to search for. list_id : Any Specifies list ID. If nothing specified, 'main' is chosen implicitly Values: 'main' (common for all Net/USB sources) 'auto_complete' (Pandora) 'search_artist' (Pandora) 'search_track' (Pandora) index : Any Specifies an element position in the list being selected (offset from the beginning of the list). Valid only when the list_id is "main". Specifies index an element with its attribute being "Capable of Search" Controls same as setListControl "select" are to work with the index an element specified. If no index is specified, non-actions of select Values : 0 ~ 64999 """ assert isinstance(search_string, str), "search_string has to be a str" payload = {"string": search_string} if list_id is not None: search_list_ids = ["main", "auto_complete", "search_artist", "search_track"] assert list_id in search_list_ids, "list_id has to be one of the following " + str(search_list_ids) payload["list_id"] = list_id if index is not None: assert isinstance(index, int), "index has to be an int" payload["index"] = index return NetUSB.URI["SET_SEARCH_STRING"], payload # end-of-method set_search_string @staticmethod def recall_preset(zone, num): """For recalling a content preset. Parameters ---------- zone : Any Specifies station recalling zone. This causes input change in specified zone. Values: 'main', 'zone2', 'zone3', 'zone4' num : Any Specifies Preset number. Value: one in the range gotten via /system/getFeatures """ assert zone in ZONES, "Invalid ZONE value!" return NetUSB.URI["RECALL_PRESET"].format(host="{host}", zone=zone, num=num) # end-of-method recall_preset @staticmethod def store_preset(num): """For registering current content to a preset. Presets are common use among Net/USB related input sources. Parameters ---------- num : Any Specifying a preset number. Value: one in the range gotten via /system/getFeatures """ return NetUSB.URI["STORE_PRESET"].format(host="{host}", num=num) # end-of-method store_preset @staticmethod def get_account_status(): """For retrieving account information registered on Device.""" return NetUSB.URI["GET_ACCOUNT_STATUS"] # end-of-method get_account_status @staticmethod def switch_account(input, index, timeout): """For switching account for service corresponding multi account. Parameters ---------- input : Any Specifies target Input ID. Value: 'pandora' index : Any Specifies switch account index. Value : 0 - 7 (Pandora) timeout : Any Specifies timeout duration(ms) for this API process. If specifies 0, treat as maximum value. Value: 0 - 60000 """ return NetUSB.URI["SWITCH_ACCOUNT"].format(host="{host}", input=input, index=index, timeout=timeout) # end-of-method switch_account @staticmethod def get_service_info(input, type, timeout): """For retrieving information of various Streaming Service. The combination of Input/Type is available as follows; Account List (account_list) : retrieving list of account registed on Device Licensing (licensing) : checking license Activation Code (activation_code) : retrieving Activation Code * Disable to check Rhapsody license by refering the value of this APIs response_code. a Device issues events of netusb - account_updated by condition, retrieve the info excute /netusb/getAccountStatus. (Sometimes Deivice not issue events) * Before retrieve Activation Code, retrieve Account List and check not to reach Max about the num of registration. Note: Rhapsody service name will be changed to Napster. Parameters ---------- timeout : Any Specifies type of retrieving info Value: "account_list" (Pandora) "licensing" (Napster / Pandora) "activation_code" (Pandora) type : Any Specifies type of retrieving info Value: "account_list" (Pandora) "licensing" (Napster / Pandora) "activation_code" (Pandora) input : Any Specifies target Input ID. Value: 'pandora', 'rhapsody', 'napster' """ return NetUSB.URI["GET_SERVICE_INFO"].format(host="{host}", input=input, type=type, timeout=timeout) # end-of-method switch_account # end-of-class Network_USB class CD: """APIs in regard to CD setting and getting information.""" URI: ClassVar[dict[str, str]] = { "GET_PLAY_INFO": "http://{host}/YamahaExtendedControl/v1/cd/getPlayInfo", "SET_PLAYBACK": "http://{host}/YamahaExtendedControl/v1/cd/setPlayback?playback={playback}&num={num}", "TOGGLE_TRAY": "http://{host}/YamahaExtendedControl/v1/cd/toggleTray", "TOGGLE_REPEAT": "http://{host}/YamahaExtendedControl/v1/cd/toggleRepeat", "TOGGLE_SHUFFLE": "http://{host}/YamahaExtendedControl/v1/cd/toggleShuffle", } @staticmethod def get_play_info(): """For retrieving playback information of CD.""" return CD.URI["GET_PLAY_INFO"] # end-of-method get_play_info @staticmethod def set_playback(playback, num): """For controlling playback status. Parameters ---------- playback : Any Specifies playback status Values: 'play', 'stop', 'pause', 'previous', 'next', 'fast_reverse_start', 'fast_reverse_end', 'fast_forward_start', 'fast_forward_end', 'track_select' num : Any Specifies target track number to playback. This parameter is valid only when playback "track_select" is specified. Values: 1-512 """ assert playback in PLAYBACK, "Invalid PLAYBACK value!" return CD.URI["SET_PLAYBACK"].format(host="{host}", playback=playback, num=num) # end-of-method set_playback @staticmethod def toggle_tray(): """For toggling CD tray Open/Close setting.""" return CD.URI["TOGGLE_TRAY"] # end-of-method toggle_tray @staticmethod def toggle_repeat(): """For toggling repeat setting. No direct / discrete setting commands available. """ return CD.URI["TOGGLE_REPEAT"] # end-of-method toggle_repeat @staticmethod def toggle_shuffle(): """For toggling shuffle setting. No direct / discrete setting commands available. """ return CD.URI["TOGGLE_SHUFFLE"] # end-of-method toggle_shuffle # end-of-class CD class Debug: """Undocumented Debug commands.""" URI: ClassVar[dict[str, str]] = { "GET_DIAG_INFO": "http://{host}/YamahaExtendedControl/v1/debug/getDiagInfo", "GET_STATUS": "http://{host}/YamahaExtendedControl/v1/debug/getStatus", } @staticmethod def get_diag_info(): """None.""" return Debug.URI["GET_DIAG_INFO"] # end-of-method get_diag_info @staticmethod def get_status(): """None.""" return Debug.URI["GET_STATUS"] # end-of-method get_status # end-of-class Debug class Clock: """APIs for clock and alarm configuration.""" URI: ClassVar[dict[str, str]] = { "GET_CLOCK_SETTINGS": "http://{host}/YamahaExtendedControl/v1/clock/getSettings", "SET_AUTO_SYNC": "http://{host}/YamahaExtendedControl/v1/clock/setAutoSync?enable={enable}", "SET_DATE_AND_TIME": "http://{host}/YamahaExtendedControl/v1/clock/setDateAndTime?date_time={date_time}", "SET_CLOCK_FORMAT": "http://{host}/YamahaExtendedControl/v1/clock/setClockFormat?format={format}", "SET_ALARM_SETTINGS": "http://{host}/YamahaExtendedControl/v1/clock/setAlarmSettings", } DAYS: ClassVar[list[str]] = [ "oneday", "sunday", "monday", "tuesday", "wednesday", "thursday", "friday", "saturday", ] @staticmethod def get_clock_settings(): """For retrieving setting related to Clock function.""" return Clock.URI["GET_CLOCK_SETTINGS"] @staticmethod def set_auto_sync(enable=True): """For setting clock time auto sync. Available only when "date_and_time" exists in clock - func_list under /system/getFeatures. Parameters ---------- enable : Any Specifies whether or not clock auto sync is valid """ assert isinstance(enable, bool) return Clock.URI["SET_AUTO_SYNC"].format(host="{host}", enable=_bool_to_str(enable)) @staticmethod def set_date_and_time(date_time: list[datetime, str]): """For setting date and clock time. Available only when "date_and_time" exists in clock - func_list under /system/getFeatures. Parameters ---------- date_time : Any Specifies date and time set on device. Format is "YYMMDDhhmmss". Value : YY : 00 ~ 99 (Year / 2000 ~ 2099) MM : 01 ~ 12 (Month) DD : 01 ~ 31 (Day) hh : 00 ~ 23 (Hour) mm : 00 ~ 59 (Minute) ss : 00 ~ 59 (Second). Alternatively a python datetime object can be used. """ if isinstance(date_time, datetime): dat_str = date_time.strftime("%y%m%d%H%M%S") else: assert isinstance(date_time, str), "date_time has to be a str or datetime object." dat_str = date_time return Clock.URI["SET_DATE_AND_TIME"].format(host="{host}", date_time=dat_str) @staticmethod def set_clock_format(clock_format: int): """For setting format of time display. Available only when " clock_format " exists in clock - func_list under /system/getFeatures. Parameters ---------- clock_format : Any format of time display Values: 12 (12-hour notation) / 24 (24-hour notation) """ assert clock_format in {12, 24}, "Only 12 and 24 are possible formats" return Clock.URI["SET_CLOCK_FORMAT"].format(host="{host}", format=str(clock_format) + "h") @staticmethod def set_alarm_settings( alarm_on=None, volume=None, fade_interval=None, fade_type=None, mode=None, repeat=None, day=None, enable=None, alarm_time=None, beep=None, playback_type=None, resume_input=None, preset_type=None, preset_num=None, preset_snooze=None, ): """For setting alarm function. Parameters ---------- alarm_on : Any Specifies alarm function status on/off volume : Any Specifies alarm volume value Value Range : calculated by minimum/maximum/step value gotten via /system/getFeatures "alarm_volume" fade_interval : Any Specifies alarm fade interval (unit in second) Value Range : calculated by minimum/maximum/step value gotten via /system/getFeatures "alarm_fade" fade_type : Any Specifies alarm fade type Value : 1 ~ fade_type_max ( value gotten via /system/getFeatures) mode : Any Specifies alarm mode Value : one gotten via /system/getFeatures "alarm_mode_list" repeat : Any Specifies repeat setting. This parameter is valid only when alarm mode "oneday" is specified day : Any Specifies target date for alarm setting. This parameter is specified certainly when set detail parameters. Value: "oneday" / "sunday" / "monday" / "tuesday" / "wednesday " / "thursday" / "friday" / "saturday" enable : Any 対象日ã�®ã‚¢ãƒ©ãƒ¼ãƒ è¨­å®šã�®æœ‰åй/無効を指定ã�—ã�¾ã�™ã€‚:> WTF? According to google translate: Specify whether to enable/disable the alarm setting for the target day alarm_time : Any Specifies alarm start-up time. Format is "hhmm" Values : hh : 00 ~ 23 (Hour) mm : 00 ~ 59 (Minute) beep : Any Specifies whether or not beep is valid. playback_type : Any Specifies playback type Value : "resume" / "preset" resume_input : Any Specifies target Input ID to playback for resume. No playback when "none" is specified. Values: Input IDs gotten via /system/getFeatures "alarm_input_list" This parameter is valid only when playback_type "resume" is specified. preset_type : Any Specifies preset type. Values: Type gotten via /system/getFeatures "alarm_preset_list". This parameter is valid only when playback_type "preset" is specified. preset_num : Any Specifies preset number. Selectable preset number in each preset type is readable in /system/getFeatures. This parameter is valid only when playback_type "preset" is specified. preset_snooze : Any Returns snooze setting. Available only when "snooze" exists in func_list under /system/getFeatures. This parameter is valid only when playback_type "preset" is specified. """ payload = {} if alarm_on is not None: assert isinstance(alarm_on, bool), "alarm_on has to be a boolean" payload["alarm_on"] = alarm_on if volume is not None: assert isinstance(volume, int), "volume has to be an integer" payload["volume"] = volume if fade_interval is not None: assert isinstance(fade_interval, int), "fade_interval has to be an integer" payload["fade_interval"] = fade_interval if fade_type is not None: assert isinstance(fade_type, int), "fade_type has to be an integer" payload["fade_type"] = fade_type if mode is not None: assert isinstance(mode, str), "mode has to be a str" payload["mode"] = mode if repeat is not None: assert isinstance(repeat, bool), "repeat has to be a bool" assert day == "oneday", "repeat is only valid if day is oneday" payload["repeat"] = repeat if day is not None: assert day in Clock.DAYS, "day has to be one of the following " + str(Clock.DAYS) payload["detail"] = {} payload["detail"]["day"] = day if enable is not None: assert isinstance(enable, bool), "enable has to be a bool" payload["detail"]["enable"] = enable if alarm_time is not None: assert isinstance(alarm_time, str), "time has to be a str" payload["detail"]["time"] = alarm_time if beep is not None: assert isinstance(beep, bool), "beep has to be a bool" payload["detail"]["beep"] = beep if playback_type is not None: assert playback_type in [ "resume", "preset", ], "playback_type has to be resume or preset" payload["detail"]["playback_type"] = playback_type if playback_type == "resume": payload["detail"]["resume"] = {} if resume_input is not None: assert isinstance(resume_input, str), "resume_input has to be a str" payload["detail"]["resume"]["input"] = resume_input assert preset_type is None, "preset_type is not compatible with playback_type resume" assert preset_num is None, "preset_num is not compatible with playback_type resume" assert preset_snooze is None, "preset_snooze is not compatible with playback_type resume" else: payload["detail"]["preset"] = {} if preset_num is not None: assert isinstance(preset_num, int), "preset_num has to be an integer" payload["detail"]["preset"]["num"] = preset_num if preset_type is not None: assert isinstance(preset_type, str), "preset_type has to be a str" payload["detail"]["preset"]["type"] = preset_type if preset_snooze is not None: assert isinstance(preset_snooze, bool), "preset_snooze has to be a bool" payload["detail"]["preset"]["snooze"] = preset_snooze assert resume_input is None, "resume_input is not compatible with playback_type preset" return Clock.URI["SET_ALARM_SETTINGS"], payload # end-of-class Clock def _bool_to_str(value): return str(value).lower() if __name__ == "__main__": raise SystemExit("aiomusiccast.pyamaha is a library module") aiomusiccast-0.15.0/bin/checksum0000755000000000000000000000063213615410400013502 0ustar00#!/usr/bin/env python import hashlib import sys def run(paths): sha = hashlib.sha1() for path in paths: try: with open(path, "rb") as f: for chunk in iter(lambda: f.read(4096), b""): sha.update(chunk) except OSError: sha.update(path.encode()) print(sha.hexdigest()) if __name__ == "__main__": run(sys.argv[1:]) aiomusiccast-0.15.0/bin/open0000755000000000000000000000046713615410400012647 0ustar00#!/usr/bin/env python import os import sys COMMANDS = { "linux": "open", "win32": "cmd /c start", "cygwin": "cygstart", "darwin": "open", } def run(path): command = COMMANDS.get(sys.platform, "open") os.system(command + " " + path) if __name__ == "__main__": run(sys.argv[-1]) aiomusiccast-0.15.0/docs/about/changelog.md0000644000000000000000000000003513615410400015512 0ustar00# 0.0.0 (YYYY-MM-DD) - TBD aiomusiccast-0.15.0/docs/about/contributing.md0000644000000000000000000000337713615410400016306 0ustar00# Setup ## Requirements * Python 3.10–3.14 (for example via [pyenv](https://github.com/pyenv/pyenv#installation)) * uv: [https://docs.astral.sh/uv/getting-started/installation/](https://docs.astral.sh/uv/getting-started/installation/) * Graphviz (only required for UML/doc generation): * macOS: `$ brew install graphviz` * Linux / Windows: [https://graphviz.org/download](https://graphviz.org/download/) To confirm these system dependencies are configured correctly: ```text $ ./bin/verchew ``` ## Installation Install project dependencies into a virtual environment: ```text $ uv sync ``` Install the pre-commit hooks (run once per clone): ```text $ uv run pre-commit install --install-hooks ``` # Development Tasks ## Manual There is no automated test suite yet. Static checks are the primary safety net. Docstrings follow the NumPy convention; the pre-commit hooks (docformatter and Ruff) keep them consistent automatically. ```text $ uv run ruff format aiomusiccast $ uv run ruff check aiomusiccast $ uv run mypy aiomusiccast --config-file=.mypy.ini ``` Build the documentation: ```text $ uv run mkdocs build --clean --strict ``` ## Automatic Use your editor’s on-save hooks or a simple watcher such as `entr` to rerun the commands above, e.g. `find aiomusiccast -name '*.py' | entr -r uv run ruff check aiomusiccast`. You can also run the full hook suite manually: ```text $ uv run pre-commit run --all-files ``` # Continuous Integration CI runs the same Ruff and mypy checks defined above. # Demo Tasks Run the program: ```text $ uv run python aiomusiccast/__main__.py ``` Launch an IPython session: ```text $ uv run ipython --ipython-dir=notebooks ``` # Release Tasks Release to PyPI: ```text $ uv build $ UV_PUBLISH_TOKEN=... uv publish ``` aiomusiccast-0.15.0/docs/about/license.md0000644000000000000000000000210013615410400015200 0ustar00**The MIT License (MIT)** Copyright © 2020, Tom Schneider Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. aiomusiccast-0.15.0/.gitignore0000644000000000000000000000105413615410400013171 0ustar00# Temporary Python files *.pyc *.egg-info __pycache__ .ipynb_checkpoints setup.py pip-wheel-metadata/ # Temporary OS files Icon* # Temporary virtual environment files /.cache/ /.venv/ # Temporary server files .env *.pid # Generated documentation /docs/gen/ /docs/apidocs/ /site/ /*.html /docs/*.png # Google Drive *.gdoc *.gsheet *.gslides *.gdraw # Testing and coverage results /.coverage /.coverage.* /htmlcov/ # Build and release directories /build/ /dist/ *.spec # Sublime Text *.sublime-workspace # Eclipse .settings # PyCharm .idea/ venv/ aiomusiccast-0.15.0/LICENSE.md0000644000000000000000000000210013615410400012576 0ustar00**The MIT License (MIT)** Copyright © 2021, Tom Schneider Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. aiomusiccast-0.15.0/README.md0000644000000000000000000000176713615410400012473 0ustar00
## Companion library for musiccast devices intended for the Home Assistant integration. [![PyPI Version](https://img.shields.io/pypi/v/aiomusiccast.svg)](https://pypi.org/project/aiomusiccast) ![GitHub release (latest by date)](https://img.shields.io/github/v/release/vigonotion/aiomusiccast) ![Read the Docs](https://img.shields.io/readthedocs/aiomusiccast) [![PyPI License](https://img.shields.io/pypi/l/aiomusiccast.svg)](https://pypi.org/project/aiomusiccast)

# Setup ## Requirements * Python 3.10–3.14 ## Installation Install it directly into an activated virtual environment: ```text $ pip install aiomusiccast ``` or add it to your [uv](https://docs.astral.sh/uv/) project: ```text $ uv add aiomusiccast ``` # Usage After installation, the package can imported: ```text $ python >>> import aiomusiccast >>> aiomusiccast.__version__ ``` aiomusiccast-0.15.0/pyproject.toml0000644000000000000000000000430513615410400014117 0ustar00[build-system] requires = ["hatchling>=1.25.0"] build-backend = "hatchling.build" [project] name = "aiomusiccast" dynamic = ["version"] description = "Companion library for musiccast devices intended for the Home Assistant integration." readme = "README.md" license = { file = "LICENSE.md" } authors = [{ name = "Tom Schneider", email = "mail@vigonotion.com" }] requires-python = ">=3.10" keywords = [] classifiers = [ "Development Status :: 1 - Planning", "Natural Language :: English", "Operating System :: OS Independent", "Programming Language :: Python", "Programming Language :: Python :: 3 :: Only", "Programming Language :: Python :: 3.10", "Programming Language :: Python :: 3.11", "Programming Language :: Python :: 3.12", "Programming Language :: Python :: 3.13", "Programming Language :: Python :: 3.14", ] dependencies = [ "aiohttp>=3.9", ] [project.urls] Homepage = "https://pypi.org/project/aiomusiccast" Documentation = "https://aiomusiccast.readthedocs.io" Repository = "https://github.com/vigonotion/aiomusiccast" [tool.hatch.version] path = "aiomusiccast/__init__.py" [dependency-groups] dev = [ "docformatter[tomli]>=1.7.7", "ipython>=8.24.0", "mkdocs>=1.5.3", "mypy>=1.8.0", "pre-commit>=3.7.0", "pygments>=2.15.0", "ruff>=0.5.0", ] docs = [ "mkdocs>=1.5.3", "pygments>=2.15.0", ] [tool.docformatter] wrap-descriptions = 72 wrap-summaries = 72 pre-summary-newline = false [tool.ruff] line-length = 120 target-version = "py310" [tool.ruff.format] quote-style = "double" indent-style = "space" [tool.ruff.lint] extend-select = [ "ARG", "B", "C4", "D", "DTZ", "ERA", "FA", "FIX", "FURB", "G", "I", "ICN", "ISC", "LOG", "PIE", "PL", "PT", "RET", "RUF", "SIM", "T1", "UP", "YTT", ] ignore = [ "D1", "D201", "D202", "D203", "D204", "D211", "D213", "E501", "PLC0414", "PLR0911", "PLR0912", "PLR0913", "PLR0914", "PLR0915", "PLR0917", "PLR2004", ] [tool.ruff.lint.pydocstyle] convention = "numpy" ignore-decorators = ["typing.overload"] [tool.ruff.lint.isort] combine-as-imports = true aiomusiccast-0.15.0/PKG-INFO0000644000000000000000000000631013615410400012276 0ustar00Metadata-Version: 2.4 Name: aiomusiccast Version: 0.15.0 Summary: Companion library for musiccast devices intended for the Home Assistant integration. Project-URL: Homepage, https://pypi.org/project/aiomusiccast Project-URL: Documentation, https://aiomusiccast.readthedocs.io Project-URL: Repository, https://github.com/vigonotion/aiomusiccast Author-email: Tom Schneider License: **The MIT License (MIT)** Copyright © 2021, Tom Schneider Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. License-File: LICENSE.md Classifier: Development Status :: 1 - Planning Classifier: Natural Language :: English Classifier: Operating System :: OS Independent Classifier: Programming Language :: Python Classifier: Programming Language :: Python :: 3 :: Only Classifier: Programming Language :: Python :: 3.10 Classifier: Programming Language :: Python :: 3.11 Classifier: Programming Language :: Python :: 3.12 Classifier: Programming Language :: Python :: 3.13 Classifier: Programming Language :: Python :: 3.14 Requires-Python: >=3.10 Requires-Dist: aiohttp>=3.9 Description-Content-Type: text/markdown
## Companion library for musiccast devices intended for the Home Assistant integration. [![PyPI Version](https://img.shields.io/pypi/v/aiomusiccast.svg)](https://pypi.org/project/aiomusiccast) ![GitHub release (latest by date)](https://img.shields.io/github/v/release/vigonotion/aiomusiccast) ![Read the Docs](https://img.shields.io/readthedocs/aiomusiccast) [![PyPI License](https://img.shields.io/pypi/l/aiomusiccast.svg)](https://pypi.org/project/aiomusiccast)

# Setup ## Requirements * Python 3.10–3.14 ## Installation Install it directly into an activated virtual environment: ```text $ pip install aiomusiccast ``` or add it to your [uv](https://docs.astral.sh/uv/) project: ```text $ uv add aiomusiccast ``` # Usage After installation, the package can imported: ```text $ python >>> import aiomusiccast >>> aiomusiccast.__version__ ```