From f5d189fd0eb1e802791c42d5d75227d6fa9442d7 Mon Sep 17 00:00:00 2001 From: Botir Khaltaev Date: Tue, 11 Aug 2026 17:39:06 +0100 Subject: [PATCH 1/2] Prepare v0.1.0: pin install tag and clear public-launch nits. Drop unused JobTimeoutError, remove synthetic docs charts, reconcile CHANGELOG, and document self-hosted CI for contributors. --- AGENTS.md | 2 +- CHANGELOG.md | 41 ++-- CONTRIBUTING.md | 4 + README.md | 5 +- docs/concurrency.png | Bin 41783 -> 0 bytes docs/idle-cost.png | Bin 43197 -> 0 bytes docs/queue-budget.png | Bin 37675 -> 0 bytes docs/time-to-ready.png | Bin 35870 -> 0 bytes pyproject.toml | 1 - scripts/charts.py | 197 ---------------- src/runner_modal/__init__.py | 2 - src/runner_modal/exceptions.py | 6 +- src/runner_modal/meta.py | 2 +- tests/unit/test_exceptions.py | 9 +- tests/unit/test_meta.py | 4 +- tests/unit/test_runner.py | 1 - uv.lock | 410 --------------------------------- 17 files changed, 29 insertions(+), 655 deletions(-) delete mode 100644 docs/concurrency.png delete mode 100644 docs/idle-cost.png delete mode 100644 docs/queue-budget.png delete mode 100644 docs/time-to-ready.png delete mode 100644 scripts/charts.py diff --git a/AGENTS.md b/AGENTS.md index 8848f4a..daf69be 100644 --- a/AGENTS.md +++ b/AGENTS.md @@ -43,7 +43,7 @@ Concise always-on rules for this repo. Prefer Modal SDK shapes, idiomatic Python ## Errors, HTTP, secrets -- Soft absence → `None` or HTTP 204 (e.g. undeployed `url`, ignored webhook). Failures raise a small set: `ValueError`, `LookupError`, `AuthError`, `ConcurrencyLimitError`, `JobTimeoutError`. Base `RunnerError` is rare. +- Soft absence → `None` or HTTP 204 (e.g. undeployed `url`, ignored webhook). Failures raise a small set: `ValueError`, `LookupError`, `AuthError`, `ConcurrencyLimitError`. Base `RunnerError` is rare. - Do not wrap Modal / httpx failures in `RunnerError`. Propagate; map only product/auth cases. - FastAPI: HTTP status conveys success. Response models without `ok: bool`. Use `HTTPException` for 401 / 400 / 503. - Sync I/O (Modal SDK, httpx): use sync `def` endpoints or `asyncio.to_thread`. Never block `async def` handlers with sync Modal/httpx calls. diff --git a/CHANGELOG.md b/CHANGELOG.md index 6d17817..22b02f6 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,28 +1,5 @@ # Changelog -## Unreleased - -### Breaking - -- Job Sandbox entrypoint module is `runner_modal.entrypoint` (`python -m runner_modal.entrypoint`); was `runner_modal.job`. -- `Runner.Job.wait()` matches unbounded `Sandbox.wait` (no `timeout=` / `JobTimeoutError` path). -- `DeliveryStore.claim` / `bind` replace `try_claim` / `bind_object` / `bind_object_durable`. -- `Runner.admits` removed; use `admit_reason` (returns `None` when admitted). -- `Runner.objects.create` requires non-empty `repositories` (`owner/repo`), same as `Runner.create`. -- `Runner.Job.create` rejects jobs that fail admission (repo allowlist + labels). - -### Added - -- `Runner.objects.delete` also removes `{name}-runner-deliveries`. -- Stateful delivery claim/bind/release tests (in-memory Dict). - -### Changed - -- Bind failure: release claim only after confirmed `terminate`; otherwise leave claim and return 503. -- Stale delivery reclaim overwrites in place (no delete-then-put). -- Maintainer CI App lives at `scripts/ci_app.py` (not under `examples/`). -- Docs: install/Image bake, SECURITY Advisories URL, LICENSE copyright, last-deploy-wins meta. - ## 0.1.0 ### Breaking @@ -33,13 +10,29 @@ - `cpu` / `memory` / `gpu` on `Runner.create` are Job Sandbox defaults (not control-plane resources). - Default `min_containers=0`, `buffer_containers=1`, `cache=False`. - Images install runtime deps from PyPI and bake local `runner_modal` (`add_local_python_source`). -- `Runner.Job.create` takes `github_secret=`. Server/webhook mounts only `webhook_secret`; Jobs mount only `github_secret`. +- `Runner.Job.create` takes `github_secret=`. Webhook mounts only `webhook_secret`; Jobs mount only `github_secret`. - Module `api` / `server` → `webhook`. Removed `StageClock` / `runner_modal.profile`. +- Job Sandbox entrypoint module is `runner_modal.entrypoint` (`python -m runner_modal.entrypoint`). +- `Runner.Job.wait()` matches unbounded `Sandbox.wait` (no `timeout=`). +- `DeliveryStore.claim` / `bind` replace earlier claim/bind helpers. +- `admit_reason` is the admission API (`None` when admitted). +- `Runner.objects.create` requires non-empty `repositories` (`owner/repo`). +- `Runner.Job.create` rejects jobs that fail admission. +- Removed unused public `JobTimeoutError`. ### Added - Delivery claim/bind before accept; webhook outcome headers and `/health`. - `Runner.admit_reason` for fail-loud admission. +- `Runner.objects.delete` also removes `{name}-runner-deliveries`. - Consumer kits: `examples/basic/`, `examples/gpu/`. - GitHub Release workflow on `v*` tags (source dist; not PyPI). - `SECURITY.md`, `CONTRIBUTING.md` +- Stateful delivery claim/bind/release tests. + +### Changed + +- Bind failure: release claim only after confirmed `terminate`; otherwise leave claim and return 503. +- Stale delivery reclaim overwrites in place (no delete-then-put). +- Maintainer CI App lives at `scripts/ci_app.py` (not under `examples/`). +- Install pin is `git+…@v0.1.0` (`PACKAGE_SPEC`). diff --git a/CONTRIBUTING.md b/CONTRIBUTING.md index dc40400..c7508e2 100644 --- a/CONTRIBUTING.md +++ b/CONTRIBUTING.md @@ -10,6 +10,10 @@ uv run ruff format --check src/runner_modal tests examples uv run ty check ``` +## CI + +This repository’s GitHub Actions workflows run on **self-hosted** `runner-modal` runners (`self-hosted`, `modal`, `ci`, plus a unique `job-…` pin). They are not GitHub-hosted. Fork PRs only get checks when the maintainer control plane (`scripts/ci_app.py`) is up and picks up the job. Run the setup commands above locally before opening a PR. + ## Conventions See [AGENTS.md](AGENTS.md): entity-based public DX (`Runner` / `Runner.Job`), no free public helpers, explicit kwargs / named Secrets (no ambient credential `getenv` in primitives), claim-before-create, soft capacity. diff --git a/README.md b/README.md index 436cbcf..e400871 100644 --- a/README.md +++ b/README.md @@ -14,11 +14,8 @@ You deploy your own Modal App and Secrets. This is not a managed multi-tenant se ### 1. Install -Until a PyPI release, install from GitHub (prefer a tag once one exists): - ```bash -uv add git+https://github.com/modal-projects/runner-modal.git@main -# after first release: …runner-modal.git@v0.1.0 +uv add git+https://github.com/modal-projects/runner-modal.git@v0.1.0 ``` Deploy from a checkout (or editable install) so Modal Image builds can diff --git a/docs/concurrency.png b/docs/concurrency.png deleted file mode 100644 index b31c354bef30fe90ebce10e1ffd2b86e21a4d86e..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 41783 zcmcG$WmuHm7dJWr14Jyb+!r;=*_D3g5lM z>Fnd<aL)Y4tKrcde)KhAG>Vw;XxjmXY9=?c3kH{yxilE) zFDNE1#o%G*2M^Bo-rDiJ9lZ7S36FR{*L1%oPr&c*GPl#SvQdX$-oAPB<}r8xaDDa- zsB63M-{(K)S4#f-sBxM2&cy2~Ss2T|A416#bBQwmfp98b{{QJ~fB$@1`$GCK4na5OCk zp9l>Rjt5B~->r!=^$Pe|T<7Id`RkS^}jIQoSl!e@xmmHYC z^j#(BaJy!%>Y#?&zy`U4v}PR2V5mh11A;#I9YVTl$ZYk(uX^&!vCJC?L18`HhNZ zJC2rI&rkRDR7Rxzf96(N)bV)ikUWdw2ss_2xt(mJ`{1L1Syk4e4he*_kCXUr0^S?L z4GSJ^L$qu#di+xYW#!|-kI@Wui*0^wkBeArA)L>bL(V()eEZ_r=8zDGN+_6GPQ>;? zlgN`qwXQ$Q$QhgI7H=m(gM5{;n>XqlhiVh#jz7aMz2v@q`(vZ~!g};ooNuXN;a4}w zRr=esPDQLVezVn&Ui=u!oM~v&&r?ce?&q7Yafn*rfDfeVG@T8D`|XgJof+Sdn)N;d z?=qtn(%?Gddl1aEXu1=^P&jqmj(l<$koSk9{FR!>5zD)eSq$zA=}K1z9ds5-e*Ts|xDpDzpypjtAV(*qQG{wMl>C z&GHIgc>nzGZ|EXzwh_!z8JcC%q_$zL<_@NoheQ$*TJUSy%CluyCs!?wWo~l}ZNn>@ z7%qi%#)^fUJ)g0lRm*-p)%N#iFP-~v)`QM;v<%k2!DXtys`(qG*}MD3qdXny9;OxM zkIv7Ix^|*Cf~(Q$39WsUjCY)!vXQB>e^y>pai=DMxLTm#cy2F$ep**)(%Praa-gMuI`v4a+bY%X-ZQkd|joLTd-y2 zZi}tR(%qBYw!M7HN#|t&(VJ7{W=-TYEanx2V;tu2Ta3s&ersYeXe0>ZySKEM9n!Nj z@YsNu;{@QFLqEG2aqGV#lFEt!baS^rE0%r)V=R#E#Kd0jeljT*nx!p zqXM!+qJ-SppEZf2t+YQgwn0Kq`iAXd7=^-@Fe@X3qvgHKRUTutm$04IlDY!jqM|d} zG*}uK$S=e0j|qiJ0{=?x4%HODsloT27ZeK{IU(%7B_(hv;TLnB|9*}07x3nm=DVL~ z5l-T?68&+XUSYybMfb#eb2QJl2g;-}8NUrP-C1bz3%ha-(+sQxZ)-J_ zA^Cz_n&gE9tPeL?>M-_`?&Uw+nd<{0UG-7yfuGGt`_L=Q8(+%6nV}Jj2 zofAfmkM{PczC)$yjP*eGsX0S-Qm{(dhggf5YWIFAx$i#~Y?zZpi&ipcqvQp*>Z&0o?hoU$5Pq@tc>?8w{ z7xR1rd)3y5GM&I&^;g@hQvZma42M!#Cvur@Ob=vz-rkqcR%5=^6D~pNwdoJty+;#u zvYzSr!6U?%U62Mj)^fdhCnxwAF*?H{AN)MyM7RTQ7?T>3yWYM(TxV|R^-z(81~cAS zV%gx50dI7hdkog5lFH{LxAgE@wzS`TFP(fAj|TcqM&JRq#d|E|T~;J4?)u#iM@=O6 z1jZ}ey6y4iE2_vQ2;>1NC2<2&sH)fj|X*qS%l(T!e z%%pt#HShb2I7taNB}tJ_ajZ^ndG#8Z#T}b1%1IE;sV-h*EK+Xog6>p%2M!1|HGk`; zwDwPDKaS{f9?PGb?lF<>7%q>DnZnpD&%DQzNUqB0_1XrX6ON2WjG~UpF`dsWs9?7J zK4bf`fmM;!CA6Bl_f0zj4{EtoqYGO1>PFhg(Z+L~t?s?LB@D$Gj zu$xgKuCHQtsqhCgb`(1m6ll&D*f;*h^mAS2rM#k-^K`wdhqJ^~C9DU!yq>6}y|pQtFy4Buail{lhcHD$P;rOD<)bM05LZf9^3 zooZO2S1^h$%Y?_2epA1?2lpL^lweH@`6)QQfsm(gOyPTX)vb%1^$bm&?se-!&G^r% zSgbg7;k^pS;jMmckQ^UooU|cvsg7zwGs4eDUQGRC2+{0q3^$<3?}l(eIFIt* zi9$H}oujwyNs6&?Dl4&~SIZnP19jo&^{(en^LnAe2^VeP#labSvR&A>W>{I&V zKZQirOsy_RC~c4>nWJn~Iqy{617vX~axCAJxpFq6v?Uqkgv`jm8zc0?w( z^;f9{FHL{)ij;&i!P((OYguFa;X4#G6AwKPixmXavJG;14B}I2T~0|Q`%lM3`Qh-A z!`G2Jf7||ii$T+x|JfVx-I-TSsbtg)>|GA;=*qwJj~X|6zeYP#XKrlYA zIdx^=cSgfU9&BVaH?l$!uU|hV15b8rB0GDTLgygUqDPEPNvDAoTjN!GTVg>^bk(QA zWP?lJzE5;o;`^;SG3nd>Y9leKFFNVAehYgZ5sWufJe%UYKka=zxqg7<jJTWrBP3XzXPV9iTkNV%XPq}W- z8Z?)P-I+v^ha%=^+KE?JxUKuJMVTJYj!J!1R@@XQPybMOpGv>jUmwz{Te6Rcawr8$ zjhHW)b27!)?zjZL%-5zpXLb&!akwPqJv1VJe&Z-Md+?%fg>mvBNE~#yzh$?t-dBB= z&n`IfBh7BNsN|4NMTUT%Kt#%Z%zsr)c{3=YA*CaAjM^r>kU2TreQ&8}KLDZG~=3*r2A7k>#9@A)QA4j+w3 zn9|XrUk|~D)HdF=c#yXc?E1$C_*$VhIJg)Dww;ILaJEwA%Z2&(i zxrWKFTZ$DULIpj!zyH{D{aw#Q)XI|V8P!-qn~7Z@)62k(Y(KZ@3X3XTt-uDA+81J3 zAeU3KkdsxUtrh%i5aeZ)En8N@RCHSpV1I<5ORKEmjQ3!AiX^vP~olJ zr`~f58g4Rat=xcb?GGGxiaf0B0%+j&)bjCjgD_W`^xyZKM>(53Fx|CsPS~k(rY83b zkbfBeE#Um774JIE&rUp=jqDAk1~=#GigANo$Jp}H;G~efj-#))>7f^e+qT69C@HV= zLw*j5k2E*_rDGb?e`il3z1M$g5UI36KW>LQNNMw*e2^vXq&r$VP`41lWV=~3Ysxu< zj_-7#hZ`HimM%1yvzK@0$pb`3#~iv1y0J-j(?wR#41^AEC1PYv)xxvi*C;YWcuUBS zSgKm&4Tc?{0V$Wz4i$Os{oe;(k=$?k`b=xodtLtguU^?nk#_nw;rDO#c0jNI)r@Oo0oANyGg;ylW(^sY0Q;HTNd3Yp#O7Jna;u#JA=ug(hp!} z&MRsBJesGxD0(9VYwW`6I#tGi4>*RO6DzPf2Ws+adQtJ&UdTDCsc%^0!v=Ss_nX%@ zk{uXIJeNBa_h#fSR;<4H-21*=p*)-=Z>b69IByGW4S$%tZyt6H8hwy{b$HPD*v-IR z6FNr9?|kBVJ$IO-&4?XG&+xQ-P`ZqU2I!iBf=HjXsLL4-rcRC zW3=5~gD{-Q*+$T`!s|ey;K`Rarft6Nu8XY=*#Yb6H;cU(X}T_L`#^Q;wo7e00yE$y zX}9R1Y!WIe3#Eu)$y3*j;cO582yBzHR64tCp!u(FAC)_onxC#&uZLmt-RA4Rz{w{; zdj%Ke%ltqEAsY@v)A~v*u*7Tx_}oDnJhG&DI`;GC4#kwfc%$IEB8RH&7`&sh=68o5 z7_cFPz4E-Jr&V93T=|yMa%JF=Ufv;Q_k0tbu-&%TS@-ZQPYc(Feu43TlJFH~C~==o zAKN|urFw7e?O|SIGvX63O_$+Mwcb>GOP;r4PqTgwD~v+o;P~aGYhN!*Fvyujz70`J zod$FE;CF#OBRk+6%#0Mjfu?8hs0l{EPP(S%IrH(AX6V^^aTz~yfIu$GMalu{;``(N zs!?jkGYJ*`dCoXK^v95F@VkM;7=e6NmH7SxAa`$Zb%bxh7+QVdaA(12>QT#9QRd^{ zmaO+Y@H8h|pv-GeUxFyqI&5BpKoo>)!Gin5kl6+Q{c$q}B>vFtG*@vKV;?%78eDl;c+pirdx$ny>5Ty2^@`9NU zOhR~lYC5bfGMY|WzaG0)e+H$aX;Cf|Rb!l?@Ys-X=B7gDwK$lT? z#y!tns_qi=>Mj6(zSy{$8?`+9F)q{OIFwPvS#w_d-<@lcT}dQa=D!0nMSB#UEM(N` zgYXNQtA&@cPbBjFir#~+$*v1g{rlz1S}i>KX#QqdTSuK-ZuR))tyWbd&!Bh?c@GdD zK23sVRX2W1w)cT3VXE^53kt69ty?XU2TuS|W!?Rwk0Yd>O1PPGNQ|Ynz#{9(-cm;= zfE3Gn;gW{=DzB+uD4xwpZ*74J{ke}`w9E|iz5_t>N0tBG{(Eo>4_d8#Wspw()P5Ot zWK-5h-_3mYu}ax?hJBM{r61ptLlhlHd}}2ob*cZ|e{Zi)HBgcS5YaqHjE}+d)dN1M z6;V&bxoy5XwK*YYb2@dEbGeK{mQPe;7OZ0clN8blx`CUf=zzy#We1DI15`?01)pF2a z7d!2LPg3!{ES3dhIs_7{jp8bi_W+#7TG7IE@?!r>B9F58Y{_^bKUWv9C~i|_CR>b@ zwq3y;ZB+(nHAc5f{|=%d)gr9FR;r&D-u7pq9`RPlqV}IfIneDG$@-2z~4U$dnlQ52s*$Wk9+R(lMJ{18|PJn41cut_p2FGTe0H9UPu=SnbOA}qlH(9EYd=Y zcd^wvXg8V!tD3ns_cs8{2RW#X3h&J3zR-wdzAx@H?1THaAcOYDgQwIvpiZvvo;dw~ zvmx9fpzpmsdpC_nJmB{erutvStGa;L^vsx-2wNY{b_I<|0miFZy@$C{+VlW%aq{0^ z3$F?>ElmaeocEpS^uISLV&9{=3%cR^?$Q5jI?FEhh5xcik zb9s1)93t_0hP?aezrnI%iQFr=6vF@S4-+~6cPGfLi-1Y{_qr7R|NXUBXwxcUwCtFOa%f~ zZgtxG%k4B3d^?zgSr9-*Cm^L7E_OZna5m~d<%wxj-J7_9i?I;W9FkcBPslp<#1 zKBx4222nd<>%SV2yWtOFY5P|nN0ayPgT4$2#2X=ZG6<)|Key42xamsY@1K+WD_9^O zd{??J98vvDcY2QiRFlKV1qE1-2J}S&yDSU-7pTq_fT`XA0SV_Ifh1ldmAuBIT@7&A z9FZNy&0rGxv>*zRfJ8i>1N16j8-yJ^FDTFxiA2Bv`uBbztpryKIVpqXkL0NLAtNCy+S->3Usgu_hK zpVg>c8R@lHaYI=%$=k#v40gu*Mby!v;>;ZARhxzZ>Y4+SZ)4dMEPKbY-ubid%aa=; zXM_`*>=e5Y!qnmJA}%=Hm@;6Y(VcsK+OSX)YSZOXb^2#5!NW@L{wf)(v~LBgaKR6e z&OeVqge6(+f-Lm3H&g;&?6vw~x=@Qr8f@qnRo);49Rgx-A(Do*LL-SwSg;Tf=exe5 zZ+UcTOO1->0S{QI_=4OcqyP})vb#)Q0n~0Ai4}wQH?I|sP^02iv^G>gXR`y)n~q-# zAhTKt4L)0jP3}Yj7KxqY|Na}SlXsutfx9tjF{le3U7Ik*h3j8}@$$R3wNmTBBYx;e zjXwb#*mmkzVCUJftDg*#-L%a3%dqsGjO$pw>L@a@?ey1L-%h;rZZ)X13oq#8oW&gn zy*6SREjAVaB=Z3D`u^1HSW5*e_a^=M@l4nDKiBl?W8IcJ7ukch@47Cvx7YwEfMA~y zrD3C>S>OX?^{DR_0nKsQcYF2`NQK^EZGbe3d@f6qGI9BGwsc?u*1V7xWF9sQQAdb1 zl*NGkx+|`fy`X=h#b&#MA*vlHhCg!*BZSkFy{@)>@OF~BH>zyf8gVbpN)2yMJuBOh za2mdGWDZ(EBiTlmDS;CZV(x`nX}-#je{Uq53Pv0*)*~jqN+FiF2xIjKqobB&5xdTJ zS!qc(&b{WZ#dwSToW;qEbxu1q1aBH92K0nOclRw%W?7>P*2+gH2p5Y8m3fIwHa-R! z=Typ3w8*|gFde=#$AdE)sg1=T)8 z+=~fPpf#ITi0ky(jLAGpD!)cti{_Zl>ox&DQhc`x(=0)$Ui&o;=++2}?8W{R!G(8s z9lkP|C&19hTxESzJ+uW99hlAedBX`z`pfO zL)m2@M4Z?i6v+o+^M#b?q$SD)ypWptj zyrBD<7T6&|kQT(g+PoVwFNgYN)&}-$jtj>!D3Vgar+po++m+0ao5P`>TfgQu`dVgPv0tQ}haE?6(w9Y_)_Qsggq-&#v^mn7D&EM1(+T z_n!YqF|&3u>G?3|;ox|P_WKIzp97Ke-)k;^ahr15CTOPtQOnApGUL<`9&&a8uaRoD zVT3{T^B2#8N7*2WJ=>$Okvrbx4g#q3>)IJTwSj`7;>XxXOre>A#km9i%+N~aY-jv$ z+0hI64$M->IqIlcK3imdL69TE8FiXuPX8S|D2JHN+p-*iQ9gN`UnJ~Pi%W1~aLA;&~K zjz1g&a-z-78-LqSk{j>Z5WFS5Q$O)-jO@E1EG;=A*Y2(!Z0lCqmHb?L34DZ&;u}`a z_A%^qB`&(LjJtAj7ibYPNSFM8_;4;4Oz;I$3XP5Dudm*A1HG&;t5P-}GL-)F>yM4J zfEtCqnIwlI@e!7G?F>Gn%UFHcpWURpX(p)jb8I>0t4L%2#a|>W^NdhLeO&+gCjhq56^XLi1Df0#jJ_t%Tr*rt4ua3v3o2w*qe3DFPOO zJ%#SR)xZg9sHuto5#(VxXp0tjfApt#GwaPCVROsf=NS`%Q_Q0D`xLt#nTzo^BeRgg|qcQcS7qL^tdJmNsC1`WXTEA`;SWTUCtY%lwBvh%Rh=d^Tc^; zgfT-Y@trdpv9?F8xGHZ8^(4cUZvd+MhB@!a=C9<}O8ex9>B@{{rLD4`Ys_DZ)9RMW!KbqG?9d6220VT^QhnZ4zi{dW9^H=fqbrd^tdv?q{ z?TlmdH-18|O={B|8w|}jSk$(VJY$yWsjb1ED_{z}wRS+S^T2DGmvBr}l#k$#zWwvM zinM?>8CKl78S^T*(irBx!bHuP*jerB9Ca_2mvM5=(6X6C_MMG`H7w=Iffv8pNC4LHrK_r=;*5@5#ja!4{#3Ga&)BNmU-ZgK84K%210n1eRK%eL)U3U#;eIhv_32(u!QF| zmhW#sUAX2x4eqKZz$RflXBVIiMtzzm3YZ@>2?jrPnD4WU=k6P2dqIEDTfce|kT73J zf<9BOpG-G$GRszi_M9$XTN)M1_WMOWSz<%^&tIp1HvRdkbK`4Ztyr>{MjLsaO~N{q zTV)~l4hcMi%2J>^GH?|It!hHTE`|Tm;XQ|BdB9x(g%_ZJC8yIy99ZLPc{0AbvvS&&4 zyexU~9ZV%-8=-PX1o@_9cqySWG+wN@T`Gp86(*mOQhL;Nc33>(Ib^&(CO2`Wzw%HK zLGa2wXE789YrFf^_+c5{Z6Fpja?#>aHR zs%o}ha{G;mrkdw)VC_#Rtp7Rrjg`N_Q#WF;qGrL=|7lb;>~eyiRXP((?YDCre5Fx0 zM{cph^R!ev@1|xL+dthml{H_R<*Myrx*u7%G{K%7H&}+TbjVNL)i(_bNmQfPp27^1 zl2dza5hy250b&zgP#Za*6ZYRRD((&`iBxCHw`ucj8My#`?PJv-rgEY+=RYr>UTK1c zU41h)%7XkrLdwq)ovRRcUSrG{KL1@F_i&}g*lLQOm^FOm1FKrrGbAiHY#Bpg5n*g1 zsHL*_cO;gre4GqhzuBP}65OV4;T_h8%_hgUV|idq`VB|J+7F zXF-?<>0-z^K^UjjTb?XiG(tj?^4q0aMN?7VAa`7z@0$UES!n=EV205Va>7l3j<_g7$laN#Zx==~a!crD!uxUi1%AQcHGdVDb{i4UIp1Sn_R< z`PZRS$%nozHZ9MbKO9<^iOLnT_<8J#T5CJ+Y(U{4 z`A$%FP>&1E*4dyheJ=xc=FGltX5rBO#A0VA@fuC~uZ`?$%rr4$=S|(daGvffF@y@* zPLfK>#+O&GCthtZJ5OV{K6c2r&tt5(#%%^^l03jb~a2 zW%&kWzp}SGCXm9Go-JYi=B3j4c9EDJN7!DVrWqM+EM0#&GiJ=vC8izDHsTean$~eA zO#egn>tR;IyjAvlU%iw+|7dr(xVYKN(_m_S>1JK>wx7>)M6U#p4Pivql_x7y|YX+R?xYG{PM2Ib6eAJd78gpbg|u~ zG?bc=8MF^>^otHe-x2qWM$p9R7fXtAt6FfK4Fq&S%BzbVl_0_3F;|N5#%Z8eBJGxuA~1#6=7Q*S+jY+ELf-dsL=(3xNl`oC{_6ZKj+ggVbMGb zAL9EymdNW~UbJc2Z2+Az>DBD{Jg6@urMGv^azco#uJJ5@XoUf-<+LO z@6ZewvoQ|^U%Nlm>X>YxXy(~}sL^y+{Nyh85@s)h;Pfe$x$^|6EvcL`U*txI5q(CS zvK>EoW~ultgEhmBk&ao8L6JdoySte?7nENXFhEcH1ifIsW1^h!J0-z!VoIda%`Cd; zWB%9w4E!>pJl--bKbyuuqt0v-S*AWFP%Iv!8D=OCFo( zI;_YZD-{o3N19J$KIE*{x2YESq#&9>qud26yWikAVGw0zXKP}_Wxf+%QQ&P?SF#Df z3&o@^k`E8JoyaT;en|phQA^}w58S+&Hdllw2s!${-;$+-aR(`QYUA(L0 zRgIXsM7>hPtCWb`wY&;aorgHRuFvHTg==W{nO}w-WKa`)r@C6&;KB74$ z{BpXDT=^ynjmkfIQ)}a6-9ac>QM?m<)pc45$|3pP6dD8=t|w-(rhR(K7U3Q7O9L4? z4<}e$9hIRld;pqI;83nmL*h|pl+2ebln;q1N;eBN&rv<59zUBrBx8JKlBg8%=AhGz zJkBi3D&nOiz4}7szG~P@jm-w*8|GnmQA^GoffJ7a>ix>*AcB_qe?vTz)+VBg;m^e2 zGnY&f!Q-Zqim|-%T165qu~3p}&WQY7l z|71!E@h3E#68kwKBiI6`AElLk8}ySb^&yi6l%}pX4K34xUz@dcJkA<3{FGDMD1m>- z#t64{KD-X+-t^YXv7sD);>#*t$044-5+=qBfP%VVpJBFDM`zK6nZya_)DcRenwiOE zX`$6`|L%cz5w6{()tQDrmVt(1T-zy-jm-$|xml;$V4=h?Y;sxIg2yE)K7GCjwLWw? zRYQ@*Ak-x6BJu-+|J2{|wF+u81}fTu3YdG07zrWDLm*d{^8E^t46Hf-nqrr;AX>E)3xEx6P&RNY`DT-#m=o3?oF$iG@^oG7w#Ex>IB$7n zg)}d)Xk55Ns4b(7ncmUsxrzKUHAa~gXxep*V=^RUu*@=>Y-nY3AuT6sq<)vTP>b4F0!uu3{@gt?5(6&q;QP1?X`N*!7+Ks)JtoDLzpeZz1&t$(HyDIa5{eS z(8AXCM9d{kjyw5Ru6D6Kv?XP$XkRB`3psf~Z_hsfQ@U1>n;TvSbA*MQ9$BdEP~K)g zu{hDrevaY^un1;ZmqZ==96iY0Cz`Wt7RouFRDWv+V$0JFgxZE(U~)wM2q)AQA5gMg zqhHtY@mu@g<{$O(_vYDeVV)AnnqiBvE<2m2c*-PP^Hv>i^~D;wF8qTci1o@-qo9M9 zJdR5wq@OH{<@Tr8ccQw_Gbyj*o=+T$2epG`mV&w@-X)P#m>$)?4egq2`8=5X84`Nl zRnkbQ?^>h_H@W}`y9db1+I;hO{Rnawa$dh>N8lN|BU9Tt@fRXW<>95xAK!)_E zfGuu*x(m6i1*B@fx{psJvZX=?Cq$Xg^Xs+@D$}=1kS{l>3~+53k;-6HGP+6UtY)m4 ziq_ij1x|M37!rlklJ_Yt)i15CGd)OfG$sQ$@s>WCC5cRzs&u?+-=23%F!uuecJ zGd~HU>`>`VIKh-CCeSG$1C5=CU4mR{;Ct-2j55>+~#8!Jh!? z7&-APLfqhAnHAI%^b`Ft1f_FuO}SzIv(B?Ok%sg58&K(ktD&;O?&Cc?uq z0ONcT&d&TG5bvxVa|w{vb3`Uo+GkV0?4;q0$gp>w{?-cGZP~B}`XnHFcL3k&6UGw) zB$}px{q;Ejl%FU^QhyQs17-$XiK5Cmfc)F2avI9`5lvaF-b2R^c=1V08+?G#?47w{ zhRal0OK7Z^L+9Uh)}U{%d9B-k!0SXOi%;BHY`ZtK-_RZ|ArM_s`hizB%XzIYp~=d# zV+!gN{AZOS2-srsJ$V1UkwPle1vqXU0IBQU;KCmK=MmG5OFrK}UkL&}jm4k0XmqeZ z;F`poEcz|CR9uHzM$&QY7C}rP8p_$m?Pg)uMb@0KlclBa%jZh}<&&)xGXO)lq)iDnY1%*Zb%E#>rZ)NC0Re^hOOu}^XRIA;T77DW zY&uja`AdEU1C2VE#8N8X$ubi`N6ZZHU9w8LBv)FujMKDHW-TJX?Cu78T7&>vJgrSv zq)t77Uw`d?f?lEniDZ7B8W1n);Lxd01~x1-I)>TIHWFVS_T)jS7-xZQvR6c77P?vR zR`<889yFmNy=-zRHu{$5LZc8>BYB?Vr3q?l%GRxB6F}sH#c(*lPQ{$i8s!=&s%IMk zJ}>5P;Nylfa|5-nnVy|nhfjf2!xdN+{n9nH0cb;iYiGr@_J#oSJ`aqZi+A_Fw$zDq zp8yrTjbugOR@G6X7~U8y&~|J7E?I5#(u=@l+_^(w4zsl1Zaqh@~`y2#C$%2mBuKw(tR=eNq_ zZ4S8IactG(>33uShY)bp6o%F7fLyI5s>>dju1CG(W{H-)$N5_?qb&6*ra1<3-_4`9 z>oiCtv9Gqw`7(v)If+s!R%{={62~&COtDZQF49O2*ix&q*>~Ff$z6P6iJDVOY&TGy z$Wby$@i#Af61~OM()M}f%E{XnTW{3K5rVg}0&NK>_Mvq08a?{G+ zI$b-cr^%o(Zq}wo-qMr#_0OxB9aJ9P&WX!kq(}NCsz@&(kPS4MQH#KpE{s;{)9w0% zwe0%lQnCO>-T@}>c-LIDInxXRQ6+rvj9>vsaNDOnBf!8Qi$x+F?*m@|Jz};xubiWh zGcH`5s4@(cD3_p$kDS`;5XRNkVb|fiWK@&iQynh8bOoCAAyEy9HR@0Yx9y|O@djLY z>xehhh3HlAm4a}pYvSe1J;r#+QD3t7w7_(IEfKF&cpZ5YinjZbDS@~;g>#N}2RPPP zscREq=?=H#tFC?i_Zcxqe5L;?KweS7DuVtvkbFgFk1hJh97sgHE(yVR2elh%##v+o z>#4@;J(rij(GwFv;}ZR{K8CD)EZs*fK-)T){((tP=P=M4|0Q~5fFS9+a7~CN2OL;Q z?${reF0J*(+nPBp02`B>NCf+qC{9Yg%5_`U%b3V(RAoGn~ z(7ZY~h0ovv^i6WowdmS=FK=pD==EvSKc}J|e^q;DTu{3*mX!u=P-H^XEdd?sXH;`y z)baMxHJ;}E?~_J)$T>5C@Jes2-T84^W`=CXF*hZ>kY)YnX^h=ocnB;9DXeC-tg_(} zD8Xt03WIpV5W5hXHg)(ZGMC=@%V2dO(a8gq5YJ!`LO1GUNPI~n6s-|Hv3ioBL|jUe znnJ?a(lidk_;PVVb`35je(Zeu-)TDb!!fYov%Vk1!#Ro>_I+MJ`2*>V`X1W4L^~5$ zCPtwxKEV`@P}NqN^f{@Je$x!uphl`H!OxXkSeGFCHj-r#OWP461(S_nH49bd26bhG z@xDrr#d*f#XCS|y0KXURu;mcdy!QyYbRyd4P*94hBg zc-t}qbR?_Nb)vmvrSYTmQLPp@Y{V5DU%NcH3w#QTjKbE=K*fvES^yQ{Sy?mGg$IOEcs;VE=UZ50BrH5sYtd9iWQ;r`` zFu5W-$1}&i1l{>bCH+m0ZE}$Qndwgz)xxPTeDQD>mVuwJgpMzYZ20Ow#kC6;k{7RhYvAC+Tqv2!i&NzvM7y9 zZPWOg)2{KCtA(+k9REEh_ctH) zaMvw3YV$hI%m)f(u%38ow4OXHOZZ*sCIY=h5@Q=oY$1SNtbn}Cup(&N?*Dnlz)5q? zfu++A_$=CxWpNWlI^Jo0>_LM_bMb+${aroig9F%E?&qf9xW`es+Kdd>XD;g? zUrqfo9sM}qKdQ>+47CM*haZu8W$&sFQ+PWR>JFn|`NwV+O&-}It{>3UH&CXwzz3Ty z7oYdC%{|}y45(tU@Yw8I7TF$bIHY4Y$`InXwnb_Ju- z7|_SsmQiBiXN0|w1<(wqxCBgjj33u~HV|O)^&^tvdEp)T=kjLOPb1353ifq+V@?qS zm$Wm#z%VqP?>$6mL{jr$CQYfZ2B+mxohLvP_Iuw> z-ekS+m3#7`EMCKLiz>%(bn1#BuVU#=ShhcbvXr)guTVzxa;|P(=T||_QGh><6L2$n z$j=9b_r*(>Ud6*`Sa|a6N{A<&{p#(-r*LV4UrW@^l2Lr`=x*KYja##Gy- z?QQH0eG2}s@zJnQml4nrWF%8F9YBt`YRv3m32;XaKCfKb zjw0?OI+e}q*anpx6WBENzM$9Dhe8=z!Y%*6U-9vww{M5E>Ro`Ghgvy~EGn#eWNum; zb}L-qgTws8XtFu(E%~Ey`mPr(?Q@kjKD%N%*5#CC!CKn#z1!p{d0p_|f^xo=+aTE4 zDKF4N#-0WPD}W(kdEASKpl1*nAOHG1$f7qnxyKv$L@`0~!+fElLe zNOq(_$7ST;=?iD@{Ml5~rKBJN?pdYzRl+#R^ztBCA&L6gKQ& zcIpE$;UQsjT$JQx(+}(E|CmUbgUQ&aAz^|opEf-(JrQ{0z8~E!KsqRYqSAy6=1cqz zZ6)x#ev;SVrsU*@V5oBk8+lnk2K5BkN&AL_3q%UA4!p1m#^2GyT=l} zEe%RF?@|t}L%=?MJ34GZbij6py`xbM7rFM3~`#lU5?OFjxc^V&-&qNEX=hgm$LwNT=wJ2yMvT;cT@5V zSVq4Z6+PmqXQfd%O;Eq~f|%g=j6tr7VwrPHda?QiX}Aktn`Vy;w5DT_?-$2ma=QD) z+i%<_T5<>9+cO(b%4{|ZTrc(hD$jStEdaITnn~(3HV}tdIH0Eufo#lb*a?X*eEn;uXa6`f90Gnojd}YqQtT*m@sam zXHQ7ictOS@RzTYXt1X+zvujD22CkLn7_nd_9W9PagbaY=X4-ZP^u^u{x_OttJQhqjv+;$qZq&*m?NLWzXuRB- zv4h&j7YFjXyFvjZB;VY8 z{n`@!X`o;%NTBYZjo3bx4~DGiMv3X;W0nEbLNQAmhhr=(lF6&wAn=>cmIg@j163U( z@u2L^^|Ak**~n#Q)h|1=ePT{WMLi7MRrDsIi?qo zVT~D%6%(ASp~+I@(JxrohNmGMrOxj_fuS&jE03h6UwHJ+{TgR0N7Z8(%bV|03Y64h zrPGO#MuExvDd~uBsvECJATDpigYqI};f}0Iub(WmAM=d>&|HQnLRv|}Zy8HHZstNH z+>=f{ObJoTm`4wOG2cIIaY+tPPCnftQ%C1p z^|V8~jJvnz1D~$ytEHQn!?M!L!GyedXf5WV(si}`ZCM_N?U-6z&CFyu_VZRuS;!-G zhJC2g81=p5+m;hI1Rb<`RV8Fpx+=ZhPS3D3Z0mW6Un-yU`aDx zGd4142))b=*+3s-XVCK zf@AtQ=vEhA$fB9&#)-TkNv4h|O`jma#ef5pUB(I~+3s*VGTMPJWouWqaKy7^RiBb- z36n{tiY`K!J3K>V1t=Vp+-H~ndSPDDyc|4_FSpzwXNi819SZlMmh62~t7)unIw7v! zMw6#f>kb<+c6#`+%;a1{HN3%{MYm+%Dq>Yxhk>I?V;;R@l$sjOH1A1y6=9w|&t#6f z!#K$fEvLtujH-cxFy?x_f>IubJdhX4m>I3G1pgDjvlH_WT-Nwy8|YGfu)E#LiDpvb?u0Cp|Td#|l>i@=eJ z-EVr?_mOhOq-u7jlEOCGBi+o(p$cVvxgUBom+4YJU?A}@|1)tW{$AAyY1fiOV2gTr zY~-X4%|{n9f12c>VIITxvS%+GH{2f|qz}Q;yS#hp+`nQ!dFeNaWRgc+<~d}$Hq)300a%d^ft`_;QVJ(N z*tJz@&Yf+Mqf17C33!v~TKM+10y{ zuHTzezf3PNzN3;q!Z)O_q1Ouz1SCIXyraJc^}{~^p7_wo-vuu-ipZZ9mU^guR6!ru zCihQmM?Q%@8xCYN61tF`CH40M+r7?b$Uud>JWS zpsvUQmw)1zDa+E2&fq^*wVu<&CJLCNhg%|ZU!KIYM;7z%=b=sxfoO$^uonK>$ZuY- zVr8$cw__~zTFg));%PmG`DQS*KvfG&0HT#$t{b*QBD!dgAZ^(NzHVDfEl? zmw5h(RSCUgIBgQhH5aMRH75lR<<}Zw%|OR;u#I%j3~UnqPit=;Pv!cy4@;>XX+$B? zZbD*bR*7~c6-AU;gOF(nnNze&6H$rGLNd?uLNg*M^R$#95|&hk2=8&NrM>s}{XFmc zdw$R7S%2*vYq{5bU)On^=W!m#aYlEfxJk_GkKI=zIH<)YlRc$>sLY`Ea;9XC#Lv01 zygB=oxP(_Fs7bO#{`ropiID0er7HZj8vNSLr>oyxsF4+Qd8q%VSKZ>AeO_@Vq#jt5 z$4SO$|Als-L+PZ?Z?S6prV*dA#AEalGDF%Iv}boc@Lsd|zJO|Pz#G5s5gaVazaM16 zMk;`fyp`3(L4d!0`oj}1@wt1#r%njivfSoXu#e>k5tYBkJz~Q4La+|L(({ovLP<%td2!E6=s8eS(^3K|v1+PdPF9g>KduRI}L8|b}X@#mN4 zvZr4BCTF7S)@-71UGk%JhjO~wdW5hSINIV_K12N0cR_DVMK^&`h5EJ4=Ha*g+#`iY zSF$L-dDL+xL}8!I6=^ZykiIal(+@9o8;7qfzRH#UiZg57U{l6(PL88q*7a$~bd`DL zTWVj+)JZd@{4Cb_d1PeuPm971(x%w98r&k)qrdSezj?^|fNLR}h|B zQ;%PBYHLh*Ef8eT@mbbq=TFs5L0?xO;eb#5?1Lq1)jvw`@39F4s z@GQ3QV74&s=ozxg7;oX@<{r6R5kD+*`BDt-3j)ilmm4&+617E~i{Uwv?!A9MVGX}y zswh0W7uQKs+M0~2L*=SLKVBgjqvGcQHvzg6RJs5DE$yUZRYVxS@|r8OS-=HMECQP! zUwlk+A1cmuAEU@ofl_Yi{Pnr3*Ig_+MtJWAX~x9_Mj(Q|&029jwoZ>WMYufM2<5)F z3Ysj{5RinOdZ5mQ13-h%eC^W(U|hP~1rW9cWKlQzt-B@?b! zzO^h***6=I6KPaTLN#auF)aYtZQJd;uZ40Rcp3~JiyhDVW?g*l?8O}dGd~MWoc!Q0 zNQ@|?h9xNhxlcE5E=-#C`CLo5y~DbSjDJ*420a)W(a`KV?ssFWv6;J)RhxKy$?9 z7sPyW?uzNv2I!8M~m>LxSBCimD zK!qoK2^Ah4re5&}+HippRA+vsDqUF}Ff@^nEK__04ae{qW;aFIet{*|xwT)I%gLYR zU1>M^ngbV!ht6DY{#FW+nrMxjzwslWm+*l zO4+bGQMsyK=Xf~13n2StjymmxBQMz;e+npFXoHnY_a$lErd%)y^l`~;Cg7(tnp;Lo zKvgyddYn&TcIH$M?blKp2ZkjJHIXwF1pUBGham%4bDF<+ z^(P8^hpNTD&9;pi?m!wRR8`_JY3SK=i9=lV+c=(P+Xxgl1L9u#d9Wptovviw@fSyG z=2@b3(wl0KeP&s9>1$Nn^wdxpD;|3Rx72@>d0bw6+{=z_J<*2-SxA}Ikt1!|ZAaka z;oqO2pOa|&nZo$`o`#xg<3v~rO-Lcje)MXRA@;HJC`LJ2%FWT>qtP4TPI)^a18tmB z9^|P4_KJ|>**6m3B;B-D+#7#CbUCXk0=MutFju#-{WSv>-y1`KtlyX35(xb~jRr?O z1#IC-?B_v**bKtYhm62tSo*?G7v~fq_4Ga}clu6s#61x=9aY-bWLB3#_D)DbS z7f)IS;QuPFd=e~cqu=JOc%A*XJnLr3Pm=7yuCyOgciX>VY_t5 zUm4fcq+AuD=ze~V|C5udiF0b>HP^lOFy2MO#w{xnK;u6HNkIXNFRM%+5uJHMKQKr=5bN@4tc7Q2OY(iSx@7~$OXU3t7_Oxw9OJYV&k0rV$nj(GN`TIQ!X!?mf8 zXW3{Y)6D8}Xx!xcndv;Mq+Z1JQAmagL`q}^MA~bwGop=WH&>8eB-d;C{^YCywCXYs zN)*>|+8$Bym9&5}&OJ*#3IE#Yy*KaY?#enOl71xr>`A#T&MI87#J9kv+<&d?$!GH# z+iwYMFLeAggma=`tu|Q7$D6WnJz zS)s|E6Cz`!|L9P7vSES!RvTvf+w<`bk?EJZ{-%XagP&7jc2;dnVu$DI?qbMEsSEc% zK3E^x~OUD_I_=td74( zR*lp5Pntweg#MYZpv3H*OzQS4JMajCUc}9kdz*FM1d8dMg0oP@QN(?6q{9-8eIg7F zZ@N$zcfEtq952sq&bnkHY6F|q4iOO%k|H=SdjqjKWwWuJ9uAl9E<Gd2j8Vvi>$2s@YX39vyN z^rZD?kQ&)QNx$~09wBqcn!R4-Oho`8h5*~02JR!~zk!p>N$@kG$!ZGPFw3d=;>D+) zw?%Y$*lmbD3;Gd$UUcV>Mlr&&q@%I>pbS!X^=7al!|HP6Twt*o7UdqoF zSQ2Th9PQj)st20#EdX>W5RQ&0rk=Q(X+$rXq>MR7?)11c|M2e**B;X>faSZCOK{I=?#(0*_kT&0TxBH>7lP+8md0g6tt?$+*!;xgDHuDUzQJdscD$H`J(Lv^-w{sH!b z4VDFEqcEqs<=ZGPTc>zkT-U|65kf!7JQI-O0Gqs~g`2`o91Ik*Yu>@<^w3RejmP)f z{BPDH9sQCL0}r;fjYEpLz-iK3YLPvi>+cKLVjw$U!wgRa#|`JoOcUXl`0%;$FDFTE z1VafD%}UC^OEM?w+se-7V)r~>LB$ri_5Da~OFq_c2!5=NRH~Xyn-s(~?s99pmsUCz zfZhfk6Os3e1%b2DQlB==Dl;u(RdnL;ALx)D$U5%^>xjsNzpV;71>=7}^kQ`TJv6^@ zq1S5=kgu6rvd0$6!Q@a?GhSaRQ9VZ4*Rn?VOLW3hZkKmC)5l~F3AfB2a%3zb7JIcQ zGeirgG6Cmtvr`qSpzp^luB%Jdt3^g=yWv2s^YJeb4ANfG6j%*Y7XQZ~ff$^6-%g0levgzow}f$< z^Nh%&uufJP)SMiJl$2_YZCHNtpL73thR?%`gsM0sicToHeNRt53vwKwmEs;r(-Jrs z!O=l0u}p?DPe)E=mw@_Odf(dze-WY>1r`<@Ji7Q;EyXcBB?9(rVf6t5!OPkt4IkZz>a#o zz$eIR(sBI_oPLFHyP^4SG3^l6h&-L3^gKcHn@JWA8AWo7iQ-lI?1gS`5wHJc1IKVae$X3_Vvp20>o|`WNLu|H@HMj z5kt?-i&pRVS2++QK4|7#W37>~xQ2Ntr}cb8$jO3zIh3g@{m>CR#VF-IzS!0Cx4d~q z=(O#ERm`WQ+OF&?d4?-_7}T8?^=|Jr1V9sB8uRNk6^OUMvwD%W&Q;5Vxe?bVA;0)P z*12~d6V-mz&uoX@L#WKplz)V%|0H_&#zmpC`Nny#5L8sn@Dl8}B;D}|RTQ%;= z*&6esDk3#7@z*qfKhh54*4&RFr-FnU>p}2F{QwnQ`Y2A*>`j548`U zS)Z|@1TCy%{J=Ao2Y?K6ykvk`YuCJoYe|Z3#xr78g4!mNR0+5p{|2tk(c7AhYRF1= z|MGN!4fv}Jo+$$V8oxN^AM0M#d`vChx;ax8)xq}R7b|RlUXH?V?)0w&Z26zLZzi;( z_bf!HxjWci+zLD7fbiKTT<+AoQ_=aJ=+U+j+`+8Bb3B1~J>ucA6E(7v+-$xz#=T;3 zBjNW!r*Jk;=9^YF*FZD;1$0O3aB|=8uqVzm;KCNH)n{Itf~1C&Gu<%skCT6vm-($$ zI0a@b!$4W2@Ti7-j9&D!2bW%8X`S@0L=IQMCr4TRJp<)+6T*uba>#Qz4zaK_q!c$A zIfo;4kpJv78&&n9%#eN%gOT(=+{0+!)e4e5dYefIDsuhHZ$Ok-F-#IGr#SZGV53YL z*c=Ib1LCmJS#v;zqp-*|fGN(YmSfB(15Or9#B6npT}{i&iaYjHSX#UKzg6QR+GK`JaS>2N=ivUePr{PWmmVXUGRtn@@ZMP%ot>u z`F`XAa#d_wc-HjCyuuHcIFirx)xcb0Yv>MFd)e%zjKA0Igwi?Q|13%0VA_{E5G%F{ z&ZtH5>tLsIuJKX0Q%Gg>!T_a<7fA9;Ek5z|l6*D~VFJlK_;!KdC{q;(pg*?~virsRksmLYE9o_tZg^5xInH%!e=6_*{22Ps(D!cDV zPvuEk@kkgCi1X#brZZhzN=abbxpLh5UdkgK&n9{|kkVQBdIudfi7P9D#FO-vr-)>~l{kfq)a+S!mR$!utcZ0Cy( zWq@LRwLSty8Q$l`Hjgn=Gu2K$nZ#a6V3$Ev(Y$wvS(0AI1a_J^)mG zNpMEANIDW#o8fZ=1Rxd_W|R=Xec>0Ueu@@P%|YwKvLHM zpRGb-Wt3j3bkG#p9ep{v3rDxKV@-8k+Lw4d3;ca;US(j;(SZ2Z(F(U2+nwUBXhb4&-C;B1FjAI80j#ns zD4D%z4-g=3hU>b)^YouN6j}@C)d~1~w25hW?ar2VsC#yW!($fT>ArUAS@YhPH+RFx zFiH`YJ9H;FC>S>QJ$@6uohlXzjEI(Ab zhs9lDf+L6uU=l3bHhVBDi#fhC?j*|#{Zt?(@n4C@$iY79i6XU>KKi*iB zwDc>n7kL?JmIeyOVZ#>Y`QV?#Dg(4JE@`V2#4cpNA<3>s8EFD^KMy&d{urH>f*S=d zH{~~Q<1i;4Hl$)qS!df`bPQfgV{M28iU;$UNbLF`xU7kQh>IiXjZrkjxV;6;rKo(Y z;^;5D+FtS(Ui}Z&L0Mc!jAh6Y#qoEoFO&Jr3P@+9tJF6O&|C|QEtb{J=79E63~N06 z*7|GKOX^4lB$orz6}*%sD;t#64;;7wJg=1|jv~uRc6Ph9e)M~JfUr-Y9~ho0wy53c zJO#l+Gg9Hdb`k)Mzzgq*cEoq@uljwvMwaV0v*TuJAEpXpH{okL)vC+s;hIc-HB8Wm zA@ME(UKa1)lYVlR0$EQGIPiQ|K$4J!L&E@Rc?vM`j5Ey8p?r(yuCh7+0NP6jU?mXn zd%$<}*2{y8ufWpnwsm3Myh1pgw=plBMd6Gah554=TVpn^3*oec0)XO1hYeyrpB(ci zuf!?5GQ<&2#`6Ck{pC$FW4>d(bCemZLsRdc#c_~~^QmOgd9cM43-g@RP9rc!DaV9O z>(7)5D>5IjP%t`DSqK2FROd7qxDW&T{YLdGtJR}(PnM7*Rh)cWi3qG><`8lkcU|AdH*q}!Y(h8cxrHl6S%2dSm zA?_ub7Aqh6ciXJ{P5f5 z7?ps%QceT9D}9=g4{`jzpw6NYW)AId@?wid*M14DI3)OVW&re*UrY=j@lrnhw{O|= zw~t6r$+zpW#x~Bi|9GGkHxbF?j!&87JR>c?Ve8rK(0;xp_^YOkh7P`91IQJph}ibW{n|q{$V!)1%M>v|IWxX$$g6pIMp~*OX~m zX^pQ*cY-n?1;;|4IB`2elOzyh0vf*dR9S&&p2^T@_4>IFnliqD|BKG$u1zq;QxB7W zN4o%IG6g{HD8y6wk2j-8LOtvhglJ#TafrRihfhXSP(1^N;4LP8iap-O`|%iRIO~L? zzJbMG;3IUAsQZzw7$E$2)f{5{1mB-XWP=V%(< zDkYf6C21t66=$2_>fVI!`stE1#5NfyBx{Is?B?SoMI1Y6uD#(n1n=Z$GqD>XWC37} z=lA1-C+Gm(B5ieVD@p9$yW97a`ty`_xBe|F&-Ed?6jloEJm2KKi1!q6stn$VVF(!r zKOUn5{Pu~2VOU|V6))QZ#uc;J?}>`rbA7o59o%x=M4?-cko(ZxkQ{BbEhE~9OPg`# z=V4#OQ3nY3KGRJ5ZqMy~f*CluCIvx`&QB^>M^q|RkxEKEv)z(wIRALXGVQul-g_{R zU35#(VSv3>f*?!{P@Yq1ORWkh&;nh5$i1-d0D^pseZ=buvVjrTtIaqo@1s z;atEJEr_6lC^G0JWOhf@m)H(ftoXvpbDHY+?Yc?}%Ak|t%4%%XeoxRkZjmD|=#QZZ zGWWiNZ2Yoe9DXMukQwPz$5C`~irh6to>XFy!2v*!oOM)1QljRQ;SYvSRBDe$LS?tr zeQMb{mHf5GNP--iBC;+~Aqzq$?PletE`Am*%y{X!daGhyd|V}IG>U4VTc6iNtZCKM zMBDp0W!yThtUM+A-2x_HqmMBh0X4sk$He!A{R%L+bl!V;cYWiq@H$nv!=cB91fTEg z*7|ND(bMf`Zp~L~DTJQOnx&^5?~K~R3D;7vR)hV9cB-L*Sz5x$W1xWfRQkWOR{!zs zYM!g{+w#hv3tzg6o$Vp%)sy$`C+k%Ae4kK@d_$S%-;aHMSFnoZVP{bW()%+8IhOYv z`)XdQX9$STSPQ1b9r~l)guvuh#Q^H7wf||VC1~Cin4X@rC4#ij0|Xhk^{GJge3-=X zozCva@A`N|c#3Dwp49UA>sPO@*i^VyE#yyk^jRzfXMmlY*YdV%5JA_H%I|h>(_uj! zVHdQ-OMnHr_z_=4N-Og#-_fb_3W02<2~tCD$KBF~uR^&+rL==o2szVv;a;y026|0F zwwa;ZYB5$STL(r1Gi%#(i!-nlQCS$J9{{CZm%^ z-#PPVDM8%`tAS#m{V5;OFCpSF3fV~%n7^{K^@dSB@Tg3Gu=}bC%^yKZW#l~fl0#{p zUyyWrc!j{+OQfm`Nq9Qyo0otat$}j}aIV?e2H*dI&|8yeUXPmAp6243%`5|z)uCB# z+wiDX?GO=KlAtMzIK9SBU)~wx$*7(_Z-t zz4P6q?`q^9hm)VMUx;)%lN!v}-$FqZGFdxKyJ16}4e!6$#Dgn*yp=8F8&SMk<0N)$ zmLic7Ah^Nw&;40Us)MquYNE2Qc*onNkMQNniq)B+VwyPHlh^-^g(c$+|7Am|e9a&` zp#2lJ#Usb+IB~Wzx?Y-TvpImpTp7~m#25+OZ=C4+ikSzBXYAs-FuPJ-*>j)X#`7OR z%PYQd_WZ(vL4BXk%mrDZcmHzX{4d5YmHXB@xNBLPn^jQadS~k_@woryzlqm6NSQLT zA>~V4E7~zLhe)^pTrT}Pb0jnzTs3KAXM?i8F78*BZ>CnwIeQl~6*U}Sf9Y(Le&Xo> zWtM&cG=-GBD4^+1AW39p&0<&z7aKMO%iBf6$GvoH3~6)Q2!gsf4uT~UVW_H_u_n(~ zq8}&A^9xv_D_5b1;1RslYpnlH1dRNMc=j})!dw5!JCQQ-yW@QIxL6$`Q(4thSLkR( z6v=OUyFtDIC}#tBD+m3a7ty?o>t<2VS7Vg{N5y$%HM%cG&;}4Bjz?nlDfGWwud(7& zVp6I-vnR&V9o1LB{MphnAHIu^rzetdSiE6CvtcL^f)%3 zPHx-+u~U7DLE|=Oy0v+jor-t=TkE65{u8-P;i)pRY!PAsT@6N4)-bM2IS`V*!O?%9 zINLfBHPO|eNBLQVe8HYFK-+5&W}_M8MAK98ibX~B_5uU|+G8^~xCytTAC~TfNT!*y zjPa>Lm2+i?j%*7WM>GoB0?-nbVN`#uwzTXN`OCp*juqMijbRy{` z#G}w{j){ukQ^57?iFEavt*0(?)Ck|~39(AGAapd3yhPQPF{gtG!1+ zs>&xz$N;vmH9K^g<=VeM_h$C8IEC>Jp&!5_w6e_9or{qn99$0*S*ON|5aPw2ScZWk zeW~~cYrg(yHxU(QHdFoAq5ETL;I*`BJm9ydA%87c!f0Hj6@9&t_BP{UgOB$P3qD&o zAOBfC0vpbDBdZo$#-H+Bt*NG)wUK1V^^ThFjJdf|kEMi|K7>S;W?Hfuc@oi9@!xQK z&MDV~yfo6X8R^a>#VRmfqo{20YWbzd_|eSg`Efi|!;XPPK0cA90ViYDV^En-A`bA?1;G=anu7^mDZP2U8A~K9KJXJW0{!FcPPsX`- zGUw#a@!{Z#T;@i5Mfhib0~f?%+@!@D^TFOZ8$3@11=zI^%u{l{kOjXTE+w?CM4cGk z2LwR!UVo)ivFGt@UUPYIo$#mS{Z9^xNn6&HhsfG|_BIhoD&?qikvcjBwhL)1`&W+% zCgJQ3%x3QR^+EZsCj!dRW%ZBqOqaH8Z!@aKS4UW@*>PBEw@7~1V>lk+r7X7LD5IA| z$Xm`-3av0fki>$vk%^IhT6(-P(D$5BMbYCW=MyCD7;j-&?)IscB$D1M_eNvIG$1dG zH+F`%Hl@5CXDkJH;uq8E0q}m}4o6Z*jmhS9FhKYun$G)2+DPI^_!6O8O}rI>k)%?p z5Doe=t+?`CiARAwX&=F;L8X2+qZi|-`w1$Stjm`V*CJ~3Y~RPvmASc6BA4u0+MBzZ z{O*bA)v)Pf{MVp?$}UF35y;Zro*xji=WmuRLa9$h!PYi#$ZZ<-;%!~*tbH&F!;3V+ zG-VH>eAvA+wfPJFS>ntLFC3H#m3s`%}sD_+iBwwI5%b0X2zq>ryp2G81yAj?NQ3&Q$#%_HZ zL6sSOuk+R=)=(LR>T@BaIhR3k@orhD8yRwFK$OAx!a$Oq>dLx?>{7lxiV|7oXu+aAxA9O+0Y(C^Uvu3vE^S?dm@wU=- zg1!k{F^_EWvR+T>Ccp$@0pkD;uJs4;}$zWJ_|L9)P4>6Pn z7#@FfVsUpzhu+%~xC;}%bkU{r7{l0`N)?QiAutl5ZV^UerX_)z#%Ad;r_oiZ!r(}P z5jMbjbu-}Xp=mtKW|Y7w#~)unI;KIqbCaZDV+I+gu5i?F32QuYe!MbD1pL1pAwD1KP(1;c~h}kFuIwA2a`o^nj?Qnovy+&XZU0T3(#*b>e#dt$5Rzf z++MTPBSH!2b!@fW#9ZBh^DQ%L(EhdodM1mmBN&}JiDj@SnMd**VlBbwNcO)~I|^rk zWEgjpv7O)Zl&`+c6+?&!yUp%BGx7Ehi(Xs@KlRsmJ_3%r55W(Zcmzl5myxEyBuYEO z9v^SxdpLi;_Ey^hn#%SOp#%9SC%e%wnEb0Q-1|YA;!PNSAdPKqs>1yJG1K>f~)&BJugc|X5V(6|1c(HcJ zOh%cY119#BxnaS3-rMjnNjb%quqc~>e;}}3oCEZO@F`@G_5pb6NUys? z3*G5$1r69xQI#S$38TzD@36wh02k?(rjO59+EhtC41OpbqZRe@$IN?*JW$heM*)zG ztG@QV8#ogD>Yoft#u8}chqwXsZ}USX-N8-5EQI;Tw;t!5)V$q6;wbWDE8t)07=f^< zXYg&|P=429IrV(Y>LQSqQpFENAp(z6hTcC`>YgYnL)yXfZI;r4F$pRW7pGk(8y`=b zf{&URWbF3JNIF?{cNntL4+e*1P7;dQ`}AmCO^v<5(gcAEJ!X*hfH&@vW~lb&eQf@6 zU^&@`x0?{O*}{OC7j_0}u46xcMz@v_=m~x>CV(7xWvnI-p}F>WFA$l#DNuWN4}hIq zLc{&wgUOiMh8n6`c9Fo0iR-+Mvixd*w*(?Av2^jkV0%Sbm2wOXaio+CdD}kt=rm11ADOtR)f~Yx-TL z!2*n>CYyy@VzzJMB$jzs+&4jVxPkc88|?_WWAO4iH$2$Lt6Y=8A1O%4nEGo|-)yua znLB*GRy1TzH%m`b9#1*REwY4LHfXkda@K^NOeR6#gmKdzWU@la1C^`DoDkBC&N~{3 z@ss~zntX0NKhgJS3lBIHz2c0&%A&ASBc|h!v40Qdj-{i!^P-E1k+ay}L++jp&mLzF z@Sc{%&R*pkW%Y<1u5FGuiaY;93>jBP^?L<$E>PLv!vbTRq^iv8c>F0 zA+u!gHBs>RmQ^w@rdyOWSS^%XXV z6S?Th5gKSHXCf+CG9_0RP1#Nw6A1HMy*AY=giKHpbonp`tqZG=GBPiPU-I-d#feWb zWClZN)+}uDN+3QM4GJ128&E9ipl~!NJc_VH-#7!vOkp2&WE@J4K~O`pLGNkW5M;PK zEslAA*4svHL`OmJ;!nGku@-Il8O7gg4w9Lz+Lff8Y1*oWbrk`V3y@D%Jda|$N%_c4 z=;bh{qX}V!tng7-y*yl4qY5vz0ie`5h=l~A9>gSpe{-3?k!{?MlcnI<(+6Cl+U11H zP63a1$FKYd${~_}v^gRkNEzlL*`QB=h4XKwv~;pan;5UeWT`tdbpR6`IW`D66sJeT zgsl73-QD6uZZQdt2yL+T(DuLkcja3VqiO+lI8S0AL>}RT420l;6a+^>uVF(RbBvst zP3a{-wx~>`k68vp_Z8gR8p9h!+Jero-}j@g2D>TGkfi$v&3~s<_U3h}c!UgZKm$s_ zOF}!NAKbrxn9YI!H;5h&`6sjy8(n0WTT7^n$X&QVszo>90u>}-qjw+32oZD;RAkP) zeS$i7X>|}2wnUM@7e5@Ip3W*&$b5K0H?Qs_K^A<$H5fyFLVI@6ufGXC44IN_W=~Wj zyTxNVH1t)nl$aY1&HQplw+38DYP}HXusS3$4%dm=Pg6J zrGzI$&qSf;h{I#T>Yp6=<>f|FS7A(0SVv}iU0b`usa-O*ppjT}@Q9_O?SbM(pDB|hOzC=sK%`ejX2}Ejg2~^ofUz6lYNHf ztVDMv0}%qC;5*?sqMzuf1#SwG{NT;nKe2KNdFGkhG?5pP2_IA%Z1Pq%z1xNnJqGBp z-BtuY3qxo`5Mhk!W*brn*uL!ZP<6D(+O(WTQ!f|1S@BQyi2n9oe5SQ8ejnG2Ql3NF z8iWi}k{p2*bd{Ttdr7F)BG|4BAZu!J^3Fl=4Db=(1AsLn)9GRVSeiFm&|encnC$rq zN9zX)QI8RISzPC_lvTv4hvP<@U6}xV2z7Sp`WTftkpvtTy%w#PNEU|9&vAg1-`Fhn z@a_ts820OI2?xfZ@QdI&?}mZ?HB4d?k3G42sAMvgD*WLA%e9MBE2}2H6A7ggfirB& z?|RFz9XWYgeN*c1FDsG>1tjaiJ;vh_lB?v;)1;#cPi$Bk|AcrM08XI?Y3k`4+KNJS8BwVIXjqhNrvz@@FicI zj(eo55vqN7AF^sLdj*LPT$Kqgn9p~I-mztQh$i$q*GS%y6sc9@GVEXJ>IY`5MDhrJ zBGYX`B$w#usf~=CTANPcgJ`!o= zmNZB5{3D~#a}qJkPahhE&B1PQXSiueS3WZTPkfBx6+(_8(%ZekwqWs(VPUC{BCXC&;gWx#C3j5#eAmAV%7qT8>-4<$3G#B++$_zyR#3FM7F>qFIu`1 zo{g0txeb|VB2~U;x{_P**fBqVpBuaFD_HIz=APDTWp1Faq)GbH={?5zI8Tz%KfyBC zvYdt1Sd(odFccNr?y6-gVVM6%wp%)oW5N#Sk z!EFHBmXvWtLAznzHi#mjb^oUD0GmPPaaW*Ycw=ENc4(D!!vjf6P~;GwJ@QWiE{Ia z8x>{~Z?mlyzbe;xmPOBsehDnBBtkdnvnLY8umxS`%ifiKk|vnkY>&ktO z7dfFC_i(hUS&=A|?kz(G4CcCxSO$5;I9WL*VtK!a^+7`q7m zskq6@i@()iq}a;8*)wCwhbb@7yup0r0m6zz8V7ZSow051BPzYHQpHbj@Nb$DHQ%)E z+Gpx_I<3`+G-}a83lCkGh-{-FYS-NN0~*Y$zvd8CdK|gjFWyh{>iF9M0bFu>N3n>E zhEJ%!60nvPX8f+_X|B6WofpzKpz{iZO8M3l8Kx!HPcFXDI6VnWG7?ozsy~{Av|C@s z-v0tMPzt$WZWh- zWgr;XS?icC=u*jOk%`x;RLa=4?`Y{^-i7tHD!$$l`%xfW+PM>Ct(loCUwd+(U5#~9 z%TmsP6D1AiZ+6+gFi2curbR4H!Ch-2l`fW0Q-OQEH9hy(y1huDVr)U_VtUpmf&{)0$?&Oo(FTkQLoc>0od7$pxP_)p)8%Zfdj_mLst zs|EeHGE(U=Xpxdt(yfHgK_$p@IJ%&_A|HE9IyoDq8W#NX$yqx^R>XmFL1ti6dBcIF zo8vKMBZFuGC$l?H0W!^GAg;S2XMi0S^dsh}z$lEoh~6J%^^VTCMl$NK7|rMeL1H_| zxmx~@Pv5XQdM%p>^N@7YZ~pquLvJ^|vp$47oC9FGjYzoY#3++Uz(%oRFTW0ig74O5 zl{WMm<<2w9d62xswnd+)lB(X(B@T)yL(AP>)K}(3W@%^twv}-`giFbH5VWz*3?|>% z)6jQV<(e*)y7NSusaI%kam9r1UX?FE&t#%I|*$h{kCws0_klB%&BXNk;J31=Dfx#^%)Y zpFf(J^_I}iYum<~L31NzK`zR!F=vp*2FHiH2(5~L=lT39=*tOUzZq=nu*J+}uWGi) z~GH#=Y~;G zj?NI6KUfMRk4zBFn}`TttZ7r^`BONHD@)eRXS~aP3#-gbFSd|FBO!ewLdQ01l7{w* zL-J2CHQpLt?{8XSn1{n1Rcf1TcZ4*)T|{E| zF_qLR_T~f?t)Hb~X6%V7ea&g!0=%nrEs6!sf-KPGdsESL5v=`-@qQK|wQ3tPLP!qh z1T$cMu6gI$|7DlcNuF_`1tkl*e8*fG z$P#h!d-T$Mht(IsYQCbfzq&jGFBX+$l`c^DPIV)-5vWpC-@h%a+arXM%c%F&-Lg|_ zb+?3tMV(KGZl+x}JS=r{5M~&(MG`{BE`DWehU`vnYVR5@b6?%;JLYgYA5Z6KCq)&*B^;r=%^nP{9HbH(rkFZ#mQ#Mp zzL8M>wSsYN1AL#*QJjaJi5d&BXwB8!=|8NJ;|CUm-_ zXW9T$Wd3HS7cp$ZOZigN{n>`ie|MB>c_fXK#lHoYV*|X@>F2l|k!}#C@xbpwSIG%M za6OtS0b)__RbAz{ASGo5&>6Ew;uN&K^{c^`3~=?|P~uZAp!VRSi9AS=$tf z_e@X^{-A~~5IR7xE9AqEsIL)uPhlqHvPnKw<Eo3?0L~h%hro31SDjh2L6ttN>f+0Nlj4XLYgG2ofcg%MMiwgHjTqs73&yf`{^+9(e zBZF|VO((v~;s9RqZ8E=pAMS^ z>Eq6zXP-jov>BvVhHAr%^zVVVw|bN6l!|}|O&*2Wvv=vvVNv~q=m^8N zuvrCguDA~Six;NVu!yd69OsH%HYJ+2cA4>6m2i1BTb9$sxTS4uCs?g^f1a8E#Vfz# z@K;pG4_)avKy1(y6u+x7WGA7zj=0VeV-z}Z_#U#*j5K#zZ%c z1l0$n)FiF>Le5&n3RM#u$&~T(mZKrOD%#1blskvn=PXFt+Qp{3ySPloN}Koy+Z^B* zGOQ!x;BI~&darb}CF_FG5X2}T7D+_+dCcivgbvauNS>Y14?gLPBYUTQoU=XxPp81@ zp2(L+e6q&NI!`o93o6E4dR|nvOk5Jdvix^Z`S|12^(VDNbK(XFyej9G z8xz_aN$inqnUmE_^xajG_=*x_a6oyFHNWjP4NUH!M|&o3DzrU_zeBIBESrQuw`sy_J=>mhJUig#7_Y4=f7X?y z*#y~%xM~)L-RjJ9!G=8sUy-Ov%hFunk(Z|g$IM*jO8$v?*PhlrzIKOg&u{k(dxR{q zBsm04y!l2w#DwS6OLk`}z-PUdoh%6!^B)nS4LPugRZ-G9XGqk&+tl4I_IpIMySL43 zZSVSRCCSM$e*|q;Zw`J}7r|mLSpU$HR+vLY5m^^i`5L4&opbrvYvdzm{4C$a$F(7( zc1Ruv`yI`CZ)&;w`_GCIa0BSEOR27mSHOVe=8wN|kk9S>*>C7p>!>tRr{x5KxQ>51 zpv2W2LP3OoN+oJ~eDIcfG8sOXjDDu)vTj@C!J2vX(nFBz@`!z%`ok0<-yo3{bocW( zMMlZ?a#P#;;<)QaZfAoWiuB~VrHer!T>b>aYHKVq3-4W@b`AwOX`VYivxB93HU3}@ zi~|aV)DRDevWc>TT9c?WIUqGjj7#iE%ywU`d`chZ5q}()uC#V|7LL>((+zLu+ZNg= z;Ful+<2*;fp{I$=G(opB2eGf|mcaG_usVgohR_r)1w=rGRN+vbN>la8` zdd`cgtAKxy!t;;iadYeiJrvOF44OjCFP=rFhSPOixi@LEXJ5Etl0Vmf{QKq!pa_zN zZ-e9{d1que|0PNGKR?ZXFX;(xCoVh4m;CzNa(1SS zVG76fKDXOb1Yf(AB97=$MepfeRRkDCftRtl%0aTX#%Yj?^y7Z2PJgZ2*kJ3*+L7NU zq1k8?Fff8TmhYVdv36eh;Rni!EpiLZsV;}nHD!vZ3f|%jH}o_I`6Dp2y8&iKPj=4^ zz8BiXaB9alP+j^Xiwe~5!wf0*h`Ju~h2?VDF;EnMrNu%0TCq6=ssG9Pr_eq4RD~(j z!X|-&%qtT$U~Ovgs6J^1zU?JN3Lc3(p>u3DHXx7#nG*neXkyY&>Y%vA?{KgxIin@x zOWZC9nE=oWpqkHmAoSBDBRxig-4(0BV>}I1IUW3cqVcayc0h=0z{nkEviEX<2F2-_ z0oE9Ow{J}|h$%*M+L1Nuqg{*J-V?<0z6{UOWKZYPwOX>O~(q64VjiV&SlpZF zH=EzK4%%0F{OnUUah9GTLOpo8p;!W$#WKfM)|;z{5`@^`!A{}sPzD%_TdVrvMZAct z9f+f3~O>D8I{H`G9x#CpszWDN!+5fG|>{rqp3g^}+wzv@PeDex6@KtGJ$ zIot2Vpe$%gBVJ=|-p|Jm07=1olkjq9fkr=ty;r`elm3rf^`}JKTWbCY_3? z34D(fv_|M7+-eYV1r6DSuf(k&j`>s}-)zUBJeC}89n27RHgOfOvKx5K==cDhRJSHG{)G0#t7Y04qyPsx*9hBP7b!0Erj>wEl$|n6QhIt=Yl~VBPikk^6FIY!%mMW zPJ>ChVa{%;Evfpli6hHZo7Y2*;*h&$v#D@B^yXDliN)QVufDF~;ZDl6m~vBMW%1`l zX2Bv9nn1r2Kc2X)5OwxdSzp+rd$E+LJnB~@ov><{O&o$AQm z5J~mP!nB@TAUp_b-$=>Uyk%QZ#mSM>X|qi{R%Bmo-UeUL@KCi#+3G@w`e< zgyv+_g>?O=%helKCyV>U9UQfMrH`|K{ivKdPK{kdW8U3oXcd1hl%1>Lmf7VPL(}1XC9J!& z%C%SBBBj^clA60&uuL>!m;ag8`5-%M!1vA5I?m#1{SR%k=YV3l&he@*9N=bIe01i| zS{p0ltUh5ZcSG@mooERynaG#B zcTR{~v%x1hMN~T19jn4(kkOiz363mk?+__Ka+d!oc6A3 z0f%WR2cwuUBQgr$^Y3ZIg_&?jDJlYKJmsj<2f^rby12P=L!Fu$N<;@g(u+EJ>@PE} zBk$@60vNP)9fE{&5bI-XAyZlvg>PBoeMk;BD^x+nZSva@Q) zx5hviXJujc5oY%QX181DrZA(mYs-HEdp4rn1+0?1Eem$RV zy$S(jTCMnw0wY*3Kb^O-b?`_3Gq9X>m&fF&^v*+cE7A_3sfZ8Fe}e znPzYmjLcC|rgNrEU)$D92nZw<87l%&UFzt@t8v#G3T5hE_Mfw&-9~+kyt4^V41IHH z;-%CO(|xVcBbH7HK>w&^;G;(*o=9bHu-sn!K!xv4tVafXamSpI|1#Y^dS3^3g`P6Z zrV%}u2cAdCWcHfu#l^WR=iLUABQ~U2lxi#&;&JabNEG>(-cBS2A=M|QxzuA14A}Uh z6^GE??rur-5z?eOzWd(bWfKX;391kAjgw+wgJ0WMuxH2nKE;eKHn;C#KtIZ2Z90lT z3F2KFgSt*EdYe%618y(rtXrR-wmCK$fn(wr)DdmH*pXevBkR(JkOSM(vj);|zKpiJ z4;3i;Z;N8DIpfN`h&)s+Hj8c$VHy5(;3#z7h!<7vQhY?H?`#v3ibNVwzK{bIhS`TpOA6qz+!bZT_LqxwWz>em7*> zE&XC&TAFO%@Dme%qcr}il8S4WmRM3H&AHCK`w=^^bVlT1jKWZWNAwBrOB>nW#(zrB z)yujr!tv^2BpVOS*DUf%meIRwaW-&*X5~dc;Ph<>{ok1u3D+t&Z|QrdvBB~D$iWhw zyX&|d2e@@L9vKLjy?f7IbotwPzs${CYBg?ua;Dt~*!GisI-b+m+^F^82Mray-}#P3 z%Zhk**aS(+6eX{8ykE;cd->{}X> zJMMfFkIA(d~HPi^j5h*mB)lg>bsZ((jH&GAoJu%2}HIth)Z&x@*C|}-P zIk80Z!1qSZ+_ZqF%jo^3o#$_K7gfd&8gDf=J@?Wo@`|Ocd~X;lrQ=$xO|T+VbYIHe zqH5?=d#*>g3m0rwrg@6_-z8)AIIC;a^eTQIJ_94Zha?B)kWQEna?fvT$jyB53J4^r zOdVyUi&~~c5Aa*M*$8cVry*43{qQEMr0D0Q2M)$_%!u!oVbyvhbUTST!;9;gi=?G) z>9`!#GIvL;UiyN`=8^*|5YKi#( diff --git a/docs/idle-cost.png b/docs/idle-cost.png deleted file mode 100644 index 2e09bcd3095dfc4c2fbea3622ba5229f6fd8a62f..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 43197 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

eg&I=}6g4X0F^FNT|aHo@?t0Wo~5H9&!d zrSd|jrqC|9nzuXa05ysRDlWGD?7;MYQ&Gew8ur<#GZb{N-NQ5;O~Yk2u9N&ky$ndn z201d}L!#oqeeEqYK%qz*>Ac27e~2~*W&{De!z~0(Kyu;r<(U9R&)$bQxRL<*0C8Jw zVCfA419+io_&>C;{1;%pw_Je?wDUq-vP|J8&<(kqpB``dQoJ9DFZ%sC>M9Ii8^jva zY)Ry=!ho==W;9u8UjXpa$>&F(#vy!_;d@VA zXP!3%m-=Qu4G+ssAT6x|=JS(Wu3Ke!O z0r z0t_+9Nu2VIfy-kP)z&Wah{Jm8cyS?)O2dhU65hM1L1j$PIvOs6vTVZ}BnejIl@@qc z$dUrZp%R&;!;z|%hHUf;c+j!N9zbmW(2zXaD~>-~es3|O88l45)J?(217K9J?tGvf znFRR$YB_CT-t0 zG3zxy)JpyXXdNp7E~%7-3@?<{tcX2v9D`VM54F5#FZKAGZ8mf3@t=>b2cdexNst3t z=TW6~5TJORnH{hI*;*<{SLkg-L-Di9Dc(ee=)Rr5_a9ok+79opQWm11jZX8(E8DYi z0+?(Jfu{HvD3fN{3esu4%=$*v7Bow-OH4(fZJjdhL3@fuiB=XvSV@geI*@^&jj}9~ zx>37Z4Oll&gBY}F8N?eXVaqi|DaTZ?HNGrZfp>f_Ke=AV+ET{0&Oh3$7-jqj%6{Eb?1jEpN7e@#gOwkUpEK>1db&f$k;u4gG% z@_Tr!!muHaYN9LRxPEj0n|je6qC78xzN9yuouA%?-J}fJ5{d{Am+ylx>Q77c4|xfq zbrb(EZ^oRI$$x7(|Am0I!y@bt)M{`$C=XZp>?@( zg}j=db@8i~eRJR2k+4qMXYt%| z<^qraXTlR}=y8~mTE(jguoBuCo%8(E3#wm?7+zl^XIp9O}z8L_>~jVsNohT-uR0mVkAk{AyGX zs{yiINrKetbAkAJuR(EP?DD;f3#_IKvu%Rn;(Hu+v{EzQn;~5$yYTj3nwGJrf4`+* zERoMWaz7eyPsw*M<>s1PYF4_%czrJe^`^Y8j+y3-jtf0aAer4hyVhL=M;nzKa)ZT# zYu{D*+A#8}REfIKbU!SFP4t5koorQelO)NEXFrd}*z&NnR0tWw4#TX&D$H$CZi}*_ zc4{tQto&jGzDk?#k&a5LxC%Fy@P!OfLk*jM5t~7vE$%x(hC(vN|28hh^*0mc&5EP6 z)!J>$^}P`AMaH@@wowms>+3D5;T!VPrffsZF1Ku9kN8vMq_4K2$uib`3%sssT8c^& zIpQ3oGTnZi1DP~LhqZy=(lDFGbHZeX4n?WBP?%p?4Jt6;TzsrV;YZ^*dT?uNFo1%_ zPPeVVVf5kEp0g*6^ALsuz=*iDs>eF{nMp`WTL@bp)N&@R)Wof?(eCEC2xPbpw<-bc?HjmJGJt zzisR7Qe~KToVt+3BSS1rBK42nsES$m*_}E7#FgRP;AL+k6qof(+02{cw0jl+fN3_( zTvJ|1IlHhEHm#l6d2$Cj%8~a6fI!|@cCs?+ek)U)iSo26{IwpRK!ep{koZ_g{>yh<l~*yB@fHG%cGM^c3Q|}N{0*Af5Rq>B0*JBbh0^l~erIZ%R>D>b^s>pdm-`b=AGs_GHa!50Wt(YqH>d0x1V$sZ zv*-;^FkqJHzZGZuGYXx4U~l_!wXHOyk}4G4Qh4RvC-WhsP5n*K*E(kxHbmrD;9sD8 zZf*O4Ug}4gdX_{kD52Wk5r7Z&Y+?`K(7JM8$zDv(1(N)w~`e7K*aq~ocU zPt>oH3zmivR$h9BqPgBFr_pT{vA^PnGeCHO zY^lrR=)pM(38eI}+i&)_*f{xc;Mj4CY30FDp960sDW9n2`U36!lDPcKB>{vncU>u& zYasamT3)kNu-(ZGou`k+b4*MW89wjP>&s&$Zr}WUC9>%&p(${x!JFkTE*H(i`yJ8DLF_m86ua!brVg>|7*tE`ISvSRH2OB95kdSAfYV5}J#&10~IPh7bp54}YD$C&5 zoHg8J~LJ9{sKrd6; za&cGScaH~nTzu?d+blX6X8gmDK7yXO@n(Ju@EJPKGfy zox(;pE+>>nJ=J_5Uc4ce=JUwGn9taOZVv(gV!BGJ{iT_zl6@w_^atz824URJX1SzS zPu;(ET0tIIq8GRt4NV&xL$V?VFznn z7PR51>5j-MU77V;j1ByBJyg2JPx6r2rQdQv2`@bi1Ho8W$EtOz*mn>o+@<8ajm)Mz zw|F$u6-8G$8)?#H?%!(50@q6@vG#q@THISJLi*tDsAelnUKSl*l`A0oPbERhq<$>=}bCUe)m~p~O7}Q3p+KdH2{PcyD2~rxd0h{)sla7tX8Yw(E zbCC;LoCP2*hnzF{bn{My<~U)1S#>~jUNl9mob~j%v4O6!Ms_@hf^Y=9psu&T)L6ik+n^W_l+w_VF5 z(7YMikCnVtTKi<2SN@j?L-&r z0Y0I|p({-4Q3SKG;fgqc`jx#!3r&|VmNH>eW$XF6uN7Um>PzI~hdpzDj_4-pjhM|jgPT)AoyK3sHJ6t0DI9hAP=kD7> zuUlkXHMj>Uoz$IvZ)kG%adc@>dD+n#WznB-S5lR-6=J)pe%y8GSqNBCkfj{s${Q3I zN65-v>Z-Z^1zj|M4PNtI*_Dv3DNJGK_Gb8-l8vm{pf;-+j#ebjbp9DbU~b#R)9uy^ zqhq}E(>&G;plp0M#{hHl=?B*4q*T}a76!YOwcKS@mKK9z>goyvjMNw%>o zV7tndWkHP6ikJA4vPH#CGSF>I#fU!?%hl|vTNIf^WsH;Gx5GR{EpxKxmfdO7%=`#% zj}!Kze$}P~8+Bk{DY|rsH|@OZLIvuogN|v$w8mlKO*Ij96k`V?`x!Mzn$I_I4y^)_ zE<6Eo5dpXWg-nCydj=~>=6u}b(9Q>-x;g|LkxOZIR&4fW&Xgs2B%d@SLq;Z1Y2TSk z2ZedMAHAaIK1ORE?L)Fd0YRSq4m9%$eDz2kw!b|5UhR%PgZHUZG1f#ZsH|SkAqg=OsanZR^andPb3dY9OB2q(_mBV z`bM%>;iV6AM4yz{bMx0~pFVqfzxD!XARNS0Lc)y5XPhFs7o0yNdT%oNoK?g{%|!2` zex{6Cf0^Q0s*M>G>>22`{`CefKQ*_Q6> z(@IcS6i-Fb`b$@kAN_-Qi+K$&sb#@7Q|?!>;I=f%dsB=eW5wEf!bQnaHVI0DhSuCg zQ;fj;`KR_$_jkf?QmWo*leC}{8HQufw@TxGSxBZiGa%F9KOxvgD>#v5jns0zr zpfkXs$}0@B;fmqREX+_VTsUNIpb8Ayv<9`|^8=7%56u5WesGl3#g786xs8B47Cufy z&S$^KMu1^v4zHCcNr>0U7IZ0&rbqoouY(+JW}Xx`_&Cs35rV166_R z8mTcw>Vh+S?w*KxI=4i+OYS$6=vaWfkY&eBFZ>Z&|JqF0>LGcapD5Ab9?MF;b{*pmwYkGfU>2nk<$Da z7De%Dx{GdD4%SyDFydFT3?*0}X8n4arSnXFQn7RWZ*J~SvZ~^o`#8T}4k^aDgDgt> zpXz3SJnL#IxmI>MvxjrNaa! zHK<6RDt~6a!-5mI)d|PqIZL7-~5=7L-NUtZefxRa_n;2wAKrN{>^`$r?588 z*^T0;z`P#dP&cEU&ZQOvd5HRMsYQF=6x84wr86GdxqVHl=#si6uipi(|6-)L?so2^$Vb^j)KBrivtZ0<@V$zxUXaY#{j zIcI3;P--YAnJfF-9LvZ`a0To)XFG~nRYUKCP}$RBw5(BVhTph$cnD;%kDRY{VO)_y z8|069K4zp!^UUDRGEh}pcPPyE3%M3hhsAndi~{iWSzw`@?2H3@n(dM2Ita7=p|O zrR4)mw&+z(c9dgRDrXrU$?vxZ)J~0{4c**_8Dv+vp5`sY)Ladd-tHB2vK8ZGF7T3h z1btA9PLHc?D&Pl102@^P6&Pl;kWmI&wl0IwwN|1XSK%}4!p8r^#`AuFKPxI}!Ay*M z7c^&&gP!a9KZ)dg!$l=WGdLzS7GGp;4l)cC=wLs}d3Y(qT>a85&3YQa%u2hy8z1#o z0K(W4LVmi}2)k(puvV@p^rylkRk>DN2Gy8{Rye$1`x;lowVtGIotpxUJjv=5Jhqj^ zCQbZNdsH`-u0(DFNO>h3ogRSOXE3PN(;nhYlZvhJNb$($NTU(lzR#O${f6@|643C{ z*g^T!jYBxD#^p7?{IYfO5SCf_O*E$w(gE}=Gx>KhxwuQ(hWfnGfUXbPL{6Y`uLJCX@QpDwp=R$ zS>ood%Cpv8`k^^>@rawb>`XW06^+j$qMDMBD-{b%ad>haWbS>bEb9e?dMu&8oTQXg zD8p41ZYY>#LE8$R%5iMKEcDvIY=E$BXwuFzjgKvJEsudit_yyvvD?rhYYmXmUpAv1 zN{oe{iCcaqF(g+6v8FaxE|WZ*a(! zT^*cEx>BFbh=;-?G{D8y@C`-Jb<+rRDi|~M$3&9`IUZE-jsi#!E}<0W7tnVGz3RqS zOnjEKq!B@6jE--kz||+bB@Q3aQT(hg%VjEWUKKa!6alq`P1-h*6YQ7V+x-rzTPqsK1|3CCe$?@TcNXn6V|?e84}@av zk$o=rGispsmB{>HO34Qx3I^S$PdDfx9>3*$PjB|KV7B!x`pcgK`l-|tF0@!Dhrc;u zU!T@U`&L0j!qWb4Rat(F?8S&GU(=VE=Fe)ruVDevZA@tHF9E72 zYH!!7sk3B+*qmDUuSJF2h=!5Jf|3r28G*`UmNRd z+U|Zp9zaw{$;1J%G@AP7(I{Xp4mGD(lKECeqZI>O2b8M>Wu1G)lYkogaZ*P2!8QB4 z!+LXoV4V9gRSy0R(pExt=Q0U@WJLGve~RJGGp#&5_)iIb=ZUAn;U&H+nZ8qiUA*Re zysjx@TUkKiKZ(_*=68vow(W?+lVYN?9$lj7^>@P^I;~0OWL6 zqNdGh00PDd)XrJ~*gb9|OQIqOnBSX3uVjS^i}`NV5uM`@tl8q0DPS7=nJI=Ps^I{8 z<-=)Eq@}X}1I$Ju62Ra1j}4yc*Y=zOqLx96&*mHZ-6KE}f!<3UhvFYHjNb^HYW1(3 zzP8UW?%l#U@-goGoZv=#g$U+1Tk!41hqb}kPp4~aW6n-@2VGaI+JnQP+JTbtKQ$%K zmg2Sn;l@(Bl8l5o3~+}ly6R~FHk>kGuY`Y4CNP%q^TUpd$+p9}kL3um5hCL9ly#=AWYVIqC#mHUSRx{h~EsWPd3eN%`~rzCYj!*Z>q{ z57|jdk)?z;=1zcnmbZ2tP<`rvjRytaM1NhR0~~EB>poy2YRb^j0bCORMIVys{^f=% zyY=zT@~B<%&rc$wfPYA$WgS(z(Yia(-;6xF9G))vOz`Laefv*V!ZYq+1!C|4Za`B$ z04!BQ9KXn?3Eu^YOo17RdQT9E{Im!5qT??0n!}X!EO`Kp)@#6$voz(qk`?GGQz-z5 zc< ?Ij6anwc>t?l3y4(2>7O+X|5(L6{Co@?~5mSIxR)-Ta{d`MMTr6Flnph5!} z6U=2M1(l#ffLnaaeI5$3PbtWCer#KGO0*Od0j3t8uXhyx-XZC&@my9R5uw1azB7=8R0k=vGw9Sv&%ySAcAVZ_=)5iTHdz35te$#0g)B@!>~O- zP8$R?Xrf?!ak?T|+uom%qi*b$QLZk~^e;xqw6hBVZxk=xE}(2o0mgSTX)8&&BEa@A z$yhpd*QzT&fo{xIn}N=Dk)1|dSj=am3gR^0I1fBV7SD%!JUtnoJ-NJv8jq?=l z8=&HIFCq(u6-z_153{XAhHDbYOt|q}HE5OA=>T8>xQaPUB&BKB*nI!s)W-e+l_7Zf z>djt*!y=>Vm#(YHL3d~IcM-t>?OAzef<~9QCJBlf$W&58a9_@JGaR?2-Jxh4-uHCq zgu#1A`dOv5D=rTo*FAaS^3fD}12kLL=3Qz%aya5(UEJxT zBEc2t#l_2~0a=>35#`w?p$U;@1-JeUjljDP<9Z_~9@M}`FlEN0z!HDYhiA*EIxNAX zCEPM2z0XHiz%J9cmWut+XIzuhynJ|pVcSRsRnMe%cu|riHj2#Sg|J&2(Oebo*b2Za zRY8<7w}Ls_{&qibo2YXf-5~1wi(nOoWPmIv&h+~oHD2$89m2i<{L`~esPa;$XzMtU zZi>y=R>mLwUN4}vMEB-F*Dc9L92r!2bvtpH(KE1ecvbx55akuEqI(MPFcs=^z~-(p zbko)YKuG3+He;X<96!EE{WR3{8^Dsj(_={MIDnfFTTaoHnNEdO5^Yomz$$LRJ^OYG zz@*M1#y}Da>}XCK*^j7rMr}Xj6_cA{i}7B^d`B!GPWHYxTTtX%QrwWl$i%(a>D4P! zQ5X)-Kpz7>-gR()7UfOOUhfI3$Z&JZj=x{XD?Zfnp3Bi%saSLz{f;?obQpX87Xa5D z7Dkd^)w@1;XOFt%LSWvXwG1MoC67xeD;!((2fVD%Z4PL$%3^oyCNOC~ zbXkpQ^D~;bi!8&=`KpEP{r0zLNB05Nh+l=3@o-aI?JK}k;{sUxjgbZ5Boxs3OE##{ zL1%DMsA)g&{p~GZe?;(nYYX^Ztd#?;96-R>JM$* zfJJaNN(C?3cyqqja8W$%YSOA)e){%a(|Vi3WS<)5M6r}BhpKstK=e}qwQWlRQ3&Yb zt)@j)xiB(R2e74z*Wupj&C2!@nA2RVKYCN-<=5-Jp8B#_w_6mBV^L=l*6}~L&sOPj z_ebJ+CH5K|F7ygB&ATk>R)YiL_izH1MfQlgW`u1fD-OX zYv$g`IM{J8!Xt39>-Y8C z%2_f1>#Mhg6yzZE{+*MZl4rl{-|KYA$67!it$#7K_}okG3^^z68{@r7|b;3LxdxJsoOaLvh1w`kW} zN+TG%W1xRPJlT_DgkG#U0|v9IOS5f63h_r+Y&$!(MNm$isEsjWeTIUvSKcv6&ViWr zj#u`M*`L)0)T~CaC%%eH2%7z184+QH{nmkMtEbK<8GMBu~#@bPvOJS7K zWV~xO1uU>!gdX9|Tv({%R2r=KYAroA$*Aufasp1TwV;X2A+;w%okZlevx-W`#7Rym z?o9>E0={()Z1=~3YcQi|393y2GKIDLa_snbb6QXk^2Oee?CeTW%$1ITDK|M}A`A(- z%y@#_I=uA7FRdsBf=DAO&|<>!@pe$|u!mNUETXc`nW6OVPfBI)>Bl<~i^k}= zU82A_)(?J>w(57shgHD|CN=6|uc4Q#JyapHpVtxuF%=f=GU@{$+! zMxslRA2Ltl$4A%Z@6cK^?_v20FKz5s6jjMWoI;79%M`};^wDD5`pi%>+=;eIyD+|D z4IZ0|Q-i+edR`fKsVz&Cy8U!V^)M)u!657^g{L%FyihTov7$?#;W`;+wcdO7!G<1y zal~dJNdr89y~uk~CLoxMRNm>Z!mMcoTC{dz+|X<{BBFyU^$F_}l5rl9o$ zd?z!`+%U6n$dUJ*GV`x`n4)3%DDWuYpGxO3MgQ2(ck(BSfc*#BvXxK&ig#ME*f$La z>MY2MI|nHxqR$BU4!m80P6|Jri=MSQE%byGHH=bdb}(IgDa3uZG@=CjgDulLiC{X2 zosYha`+QfVj)&2N36emgJa$RN!W{Ync1H7j=mggW8Xc6U%@SpYZ%hn>$m=vN04O=z zy#A6u?MoUAbKe65rYZqB03`ZPJ!)TGqU{Uln@wt@koH&i5^BKp!8iefw8%jcKqlFNOJ_6Et9!AN z2|9|cPgGE~6eZi*XsXbO8>TBy(S{LP=ZfZ%55)Gz3CzW$-F>bjQRcN*qJyyQg@=E_ zm~z$l+u{z4FBsnX`UjMmTg<=jRpXc~ilKv6Ej=0Dr`+l|iDSQA+TB9x(HDyOmLbt# zX)Q80$j{e*-3#!%HpM7pCVPMCUHkBn3C{*R0fV9U%^N}2_Gf!btT>FJFFDmQ@p@sOz1(Z!7TLE+x3lDk=3BgW4-e z6%foFx=*haQ*M+w-3Cdqgx&Q=RFb_a{>k{F$O(aYR&Kl6Jbnv0vI7aM4Lxo4(TwN-K=@rFB^*7WKlRSUa+N;kM{#0ADOb(W5JT+A3!E zOyqgAlD!@#y%>>?kGR6FQ+U;_P9e(2!CH@*V^;-6ac^un z9j1>X>Ic`i7lo;sCiDk$cH3`C zswI-=F)Blr#@r2A4H{0qIL#CW434>DLlmctXh&cvJvy3?6Ax){Xaj}UycwzWxe9Md z)lNEc7s%*WYpFLcnjA63i4P{ib<18H(&eo@%(she-aCi?6m^wHa_R#I(_0|~+S|IPheaIOU^=!da ztBC)MMYn*{rhNK@wC_dmGk9y~zK%Gk1bp81;^y~x@7{D?^<_X}{4fE>dM`KG`m(nN zzxVI#O*$}XSBW-OIw8l~%NRd8>^p_tg}Q0Z%kIk^|Dc9)bCjy~to2&EwjyoK(-MnM z{Uk*)HQ_gv?WFf?oLf$hX1sZp;-vu%P;ZnS;b{3Y27@@NjO*P@?C$%Z3h1K z1DH87&nW;}iJK@LkcC>WgS#(^cl8;<`+C1`wxPVVGow10>fKo6eN@&y<;GoZ0(Lpq zjJ+R*q;{b70;he2R%d7oBo!HMollu(R^?_02DFAsBxYioC8EdIEJ_V{059sFRZ-}) zEMA%6K8)%SA)uhw4pZ!r)7=sJc->ZY+}b*a{655zdRCXOj`zu44z54vYFWTr?@Q*? z_6VKskoBI`vyxwQ$`*nU!Lh%XfwK9rg_t5bccbVgrmi(7tEF&WC3%9B4XX9lRd&mT zo?q9(V{P@&F*VYd-J(J9h8#E;{o8`g2=Kw8s$Qp7eoLC}l>8SyaS!L=?ei-5B#odW7*Q$ncJjXrYiw4I2) zkZ$gdayC?;+`SjfK#!g~4<_S`LcUX2iF_*ImxtQ~q(ybDTC0YC(W%5IR6e8{40`|maHYYj&iwDp`jv0Z!H;%~ zK@T*)lZ_m~b=*0*r3$)rj54Xk6$xG%)2g&20Zb=1>n>Ke`x?JTU8q4$)hDDCwvRZ8 zO+fV(uivTfT;4MwO(g2lhx;_nleTYgE#wM09r}m*RS6jJ^GE&Kbl{6 zT&qr# zB%1ksAUNv}!vqinx$Ajjh6ujv~LUr+S0S#*&LC%?U{yLYs&Un)K(|M*+hAv*F zpBaVoQ*%!kbLY+2;%d&^iHGayf$^zo&5A{0S@`%EIy#!^bZMS;lN6dknTN;6k_UYj zkC|mPL?7VSs=)GoUlsBh@;#nKc_&?DuhPm4ioXH)t@ti>xon~lRl$SsA%>98?E4EuN~yB9n-k0 zIHN!&`m2#>M zbRy2(PWQQ6@cl6%*!z`2vMbcb^qk4g zfQGu{;|cEJ9&9_4<;fdcqqL?I7+i4J8$M-}c0YwJwMvysNXcMV)TQMNMlWRJoXy>KLwc$FhJs|X&`#aJ>v(s`3mT_~*4a6J zaVs(gOnKfAopf}3W^{K@aDHA5-=6T=D>~U)5q3~BpFB6aAA)bY@pO`Er2V0YpnXhrxI~VaUd4}75MqTr%2GDx z_n%yL`gM^(HLbx@xmhr5e$;Vw)Q$1}^D$qulJl2_0PsmnfjwD?`J1sW+aFdKPouq}laJ6AE?5dkIZ4x{x zUo+)RDL-@2DYjm_#^AWZRVU@mB67y&Vj|atg-0|`Cri5aPAI&hcI_Hoou9fDH>BqH zPN__o#-OjRnqGtaaLbWbZj!h=sdDk6Pb+tONa7?DJOrOAvCCi_U6p)qPN(9TxquU2*_2n$ z6=<_PNbKdy=W`6M3{fuF!$s*=_>|+^G0`E|q|5cW&BpVkypFYwY>sv9il#=bc3=C*ApOKIH>6uL zX7$3@q3cVm`XSzJsSonqcIouGu6ix3D;*A{Q&-oXZ6dQ?8S!@S zf1rMoU#lKxra-N&JaXH0pZ;!qz3`g9TWI|2S5r>Lf^DPu`}?>BLaCI8nZ)X~rK(dV zXKe=BN3oPabe@&P<{vOYg&~D$+qYG#v;STi`5iVff8)zuew8;df#R|D^kfaSr~Mb+ zdx8(tlRx}2#`gAC6=8$?dqyh{GmKwqf4w<679@h-3yiH~w{~@R-iz^$tuI*whms8j z+c*ga<8=Kv>#WbUV_*7Q)cJZb`fKU?OH;E1JI40r3nXF%`{{X$5A7^v_JaN#BbRaorW=Y(29yon&I^ER{7atsif+_{utV9|Lt^Ps5HDw^S1=LH?qu_Z^8x zDj#e3R{dU`9^7$^m5lGv@_oDY^dFwv6?mC$7CJ^;zBiXyjoqhmk<^S*zkKRP2i7Kc zx|JFaJr0+2lrn9c%`paD_dE87^?#UAT|O0F%B-l%ekJ{8#ehfKWW1_^gE4DvjR1eq zP;#!o4f5SeYs!z=ugFvwJ?pO39=rAhY7TbVyEPN>?T32Pg1tT(eQ(R&?szeX_7D#_ zo;{xW$?mmNsV__Sllf!xsdK!svH@N?tnZw(zstIatQEWM`^_Y8-Xwea)-{@zok=kl zQr~CtVzsmu%gW7#7i_1m9y3ihS~FfuiAEAZy$DR`k6Rjp& zo_ZzcsvgyLmuDwSf@nQwmvo2Sp!2W@ROjBEu4kFvk^CtJcR!WpbZ(ExSDsMXc*@8m ze7A3*oT|?FNIC~D9k1o-bP69VXWr|jeoylVOBzckW7_L@w|bnIXa}dw%f$jeaKur| z1=^`0A~AAfUZfAzv@T4%noaqf7I!r3M)y^YPwVFb#E19lA7g!<^4X#Eev`>-!KxwO z?R)8x@M^QCsti?bTRcr`c`32-T|g;P4s!-ekZ}#Z6CCaHv3e;o&r7J?_ehOwxcxW4 zl_jm|%zbQXa_>g6cP)^yJXM*@X}7h;?p`N!<{aMcRWRgDXEyahp7bVv2kr^mrzDmZ zs^<19_cQM0<2tWN2zrXroc-P$N=1P^Wtpa!>AA+x!kw`9Op8*MXjx&FhZz1Oez)P6 zETdy@*B!+KDOwubg^4`b(QDpff-^PRVmQYd`#_tR-!#*O-&idC`5)NRlhd|~#BIm) zRhBOI*iXEsU0HRC0wRS-g4=yEK75GGSB>6-IrbpI{|Cptv|B8dPA%3D_anFL!bo}jp-rOQC z!K{FS!Yp=nYtt@X7F8;4C$+HCbn&lDNm{-o1w^|)oP0QS(l_yroBJAzQJQGHy~$63 zpCxRsl&+nZxpo>OkRLNqBU*pZ%tZ6bghdH;bf;5FU1W!*4PW=@f>z+?ggcP}dD+|B z8!g+uBrhFRJEEZ`tj-jbeOj=yoLwf+CKmVv%{2xB&qcI)G}fZJr50jpCLEtqd-;6H zYo6weZ^s0>TN*FN=KAFiucUiI#@0SoXxc6k{X1)#hJNX18K=h2)m5)kF%dH;D2&+7 zSvn{8#kZr@CcV4l+9h7&F#k7CMprVY`4UVre$9<+J5XipyRMy3%G`;K?z897Pn%j! z_My^uV?BC%n_1Mf%`YXA>K^$QpRqQ-2v&hBFDC#2w$r?cTU090v61fju2SFEU=pl4 zWOBsj+*F0TrY~D|yri{$ljyvNM*+KkHJxV2G@Z~Fxr}7dvp1SVl}TO=PzN@+`S?}j5(x*>3uUMaw zqi{^$hQqw7aX*w|c-xf$Tj?<+X^WAnrhhetdywLWdX|Oaq87y4+1AG{FL1J?iB|CG zX^ZQbO;1t5jY2!gyVn zR8ddtsX#)P&9}}c_$$Wdoeif-xISNWS!Rw9R=e_4KdH1vy4PtHRW8ZQVhx&t&u8Av zU&a?dUaDm+GA`GRqrIp2R`nVk#?$`iL{2^DFRH+tW-4MaUN!|5psI%uAAdc>f2p=n z@bW>{)s&N1R+1HHH!hoG2`bENrql0WZo1j|5KoevL`4)jWS;M|qB$egItXo(m-GCX znG;s}FPjg9E-blhBOM@od@-LVaFPEq+!9o0-A^e=e(14k`^H4>*l~eLDkqh}+u#WA zr{||Bh+W)N>t5kvP}H}^S}F2f=|z%)=KF|l{) zGN|nsRnjqrimJu%uZS;^CYK;e_=3uenH7tDis@S#1MslWvw81U@VR%k!?47Q#T-U} z?BZ3ai8s@{pAZS9QyzoXCp@4Mp^(E$ypu5c6uf3x;Tmz_h3Kd#i4QOI=uhK3)#o^w zJj2$)7nDqO3z0xQP=gY-Le9TZ35bQjzc!O+!Jll{8okxXJ>j*- zo{)2D9Xp{r*=CB6Q~h{X+0171IEjm-a%`SJ5UWxnxkF#6O`25bg*XNkB9$ceHTCk( z0q8}xDrySh;FwS%K5WB`Pz&mfH+ymDESbF$aXpZ{1F+r^3t-?Y^dhr2Y<-$JJWl{X z#CKYt;0VuC=~#xur=UG>{I~M8j}UJr-u-iltFj3UUT)YNqu$(C{LtZSewdl~5+s9P z3Q0jPq}gkiZE_n~_FS-PzVPG(XnhRy*!nuNwfvzJxe8j`d*U5Yce|`r22(HoXMf`9oWra0Z+y+eVh;MBG1Xk}wYCL%VC?j*GqZ z=>3Ig+V&pz#mgnQWA64uH8=>>A5Q8t zqQ&v+bp=s}?&5x4o2ju?)h_%&j4kmJoN5xVyFe^p(0riy;&i1EEjCR#!?Gw!EKfscFC|WMJ~Z~tigY- z5(o}Vj?5iUpwGZ{rHVUBZQilVb($1^5HIZm#>Xsd^g=LO`h!^{-cIGvU|pYCI+d!J zv1I}bT35%Qz}|`|aVDSv5_C?DbK0pZ&A21+1=`n(Q0Kdup-o&0AddyhjUrmpy6IqP zS9hi+e8tR4_~ozs0et*qrStN~T}9=<59x>39MkccxRU^fsbf=0Rjk~3iz`v0)5Zb* zI|ryxJ?tf8hloB42YY9sLEjq1Cbm+Ya5aq2UMsRqpYQw1vXdeotoA==|#xu8i(DePjOS3t1!7n^OD8s=n zSKIpgr&{x*WN=o7QcW4@boxEaP2-?8RKTgz5NRc-72U33kP1@EU0t)aIs4x>i?_q@~R*fdM?&#UFWJ#Ig7 z(g8Zo=Joj%1#gC~?AcsbJ=0i56W3Z#4S3aN6K!#sKHfRs?qX4OdV0<<|MdI-* zU4{pgxU@}y!^VvxFl&G#>s|-J8Oh}WY$S{N$QNh@%m#bYx?YLIS4w$^U!XPZ z-zHHVhLmei@AzC#Te5;QPp#CjBdGH+mPaB{OzOP?bH$_SuppVoTR=a=445SBS2i_H zXk*Ml+%s{9JMoGTGl=H#vRwHAsv`R2JTH;H)QHy;<(9RtIzLSUAllYI!mdH&UCMp?`d{W?hUr&6I3?hH* zI#p1d47B(ck{{>$us#Hwo$28!=fbtSpJVoJUc(Q6Xg|TUH@6najW`Vh*XlTm32BIT zsBrdJ3J+3G05OZXB`_hg7TW2*tcYvDsZ`@ihfzKC_?*rX@&Ckn2m>sudccDId7Eqfo0Nv&y zPzt;9ljp2NU^YlesDV{C1?d#&I^5=cl2GBq_YhJlC9~_A!MB*skG<k6aw#*fVLN$ofoSgqWK;AVy``xFZmOPfg}^KAvGU-e7Xqo-buKF#H)))G~x&Y zkAAeUi&?$iw(A41RrGtb95Tu_Kx;V%bU^#g7Y*D+GTq2D!#B+V*$__sL&CMXghO8H zl0ox*8$+(2c=N&1Li+{Wk|4$qSg8k=5+=(Weop96@O^WsfaCj5sMh>G1%-uW@Gc7W zcI*IKd3AaT(e%K78^Q_CfVe^B-%sx+Ae!!6;ikUP3T;%O`C#~L4(Q9+6hY`I{g;;) zwJ|*Pn3Hb)4Ctq{EPeoOz0!V=Ub^(Re+N5T(m&!QgM1g=Vb}th>1)^-agcZk@c1kC zgYX*%_nd`nJ@>t#NE@IfcbS6F68HTPA&q<^fA1p~YZxU%M}7~3ILF@^gQ9N|G{P5J zjEaIz*TBa4lm`~moyopy>)w}#vSEe0z!>fCFR@B4FzxLC?V*Uje%5;*9alq=Ow8PN zZY}6ioB`FBcXV{H?OD(XuK+F}yWf^Ye)szxYZ8@gOIUX4C8TvL2(LZ|9R8tL;;s_Y zj~xd(VQz`l7j@W^=?{O5$N92omRhrJnFU#+S9;~`aIVuqvW^?lLB(>^Y6C~hKM*3( zr)1O+xnPLD7E3~kMQpkv(0~!E-HLCh#K8g~Y7QNj(TIVgI%q+${;Mju^*S~iWGL~D$ zGuFlPe`=3%1NS*fT!yeR2fWdhw8PRM{zGOTwD}|?9UQWGI&XH`9X0ElyI}@Kb0;}n zAa+y{V#F(WfSN|lE6ixR~H2EIa+Dfy1mo#Mot8yD#D-g-ApTm1tkpnBD0VZV@A_CC*QIL_My$%|M(b-!MaYeF!nd2|Dwecp4$xh=Bc$xTl_#B|Pnm3s zd)%b{Jy7Ha0CFgsn*~9E{f^R*2c?607|2TT_d9&8INuxCvdM@JGmJI{7Sv{I3;ZtU zY1xET&T6_#Cf(^d?*f=KP@V=)5(0kwLbQdk7nr|ImIOcoXuJp!sXEZbGH!*i@2S$N_o26H9>BwSu4y7Zu$XbI z0jQ1@I<4EM$;P>{9XWPxehu!v)VRd%>(DIcJ$UrsKz;L}@?IqDdD)Wy=IxU?@h;AF zl44O91)6!?Kv_0GlDggN5H2OdNk29H6%=HPjZ2|&JoO}G1xVu`KmiK}Z4J@%_7icz z`|K$mzAGeN>A8x8ymX-WC1@i_yIqnSvGT5yY6z6PgOP?m#A^{)u1U}mD?*kjPM=*h z`!$j>PXlc{O#meJR1qKC<&?i%LhL)xb4*8jAZbYX8_L7Ffmfb>rx8W=pxn=`-$->8 z^28tIlKk3P8A2_<*b^9l>*V@RD!kcXPY2}T4AeocM@PQLl6Jw_Q%1 zNcpay%%PsoJY9*RAf1~x>1`AXdqY9~lEN-R!SC$ha32l9cIGBgSGo)h(5t3YKfL)> zp*R-C0g%S0@mc{n*JBRy8I+w~zFkg1*8yaN&tXf%Lub`b=h0Dl3$e`pIOqdgCS6|xGDw8sB- zhGWA%4G}OlQ?z9dQ{){G@)rBcaYD+;J;%fpzGn)F3SJ(5)QNgcqORKg<6WufFv^m} zdhcE$|Cgqa?1SP){hqD6$lVT5ZKtithfatV&1#K{v(oRp+h*=x1?E zH||UVFe5=Rop=XAaRD!dyr)`Zt%#v#tY6D2QH%1w8|%W%ip32%t(hI=dvL#otz#>M zuF2YR&^fN*U>84t%{ipy59@pO7tzR)(9&;)&M!IND8MN^Dfcgt#sXFn2 z!&D@T;kcpj$^m*C%)X6OBc!1}r~bGJ8u)=ANaS*$#j7_u&t_VA4fI%%F+zFs8dOeE z1X745+vtaA8X!Hx__Qqm<)LdhI5;%`TxZ~p3zDPl8;2a1G+`;i*S;emL$Fx+pK3kJ zX2RfTJNWio`4VY01JZ)YC`)Kp+Oj{*Lf#;_xYiqGH)M=tE#bFX>wHh#Log|5DfYuz z8<3HG_wp>lq0rnMH867-@XPPisW+d|1>o2RDCj=UZ(kgPf`3RmH3!3yBrL?h`mh{@ zka4NOnbu_7O7Y~WQufHVgdzRCd1z4hy!UXZVvC!BPzs_)KC?jI#bkl2~l0k24Sl}-wjtxH_-wxkdk6cQ1IIQmG02i z>yqYVmHkmmqg|{abelX`62U9-S{^qbK zmagF-1lk|SqA&x!0l5%v^daF`P_Vj@nRnww(){~dg~XRDRPJGV@goRfs-c*?EfG}> z08rHYW{_2}m^;~-+`s&N6q@gdkJiCP3`I3k74d-_({QVWkffCkL+lVSzXhyOg$uRR zc^@?cn>x1yS?PEa=lcC*uvTMD^Td0fFA!}3F*F1?^^&bLBHR$HdR%KSyqE}Xji-*D zG#tl!BqbjffL><0Bmi5)?@^T?jst|fWEI1^%;ND-|6ceyJPd9%;+y@xBNtvvRSzaf z9fdlDdz##6a=UW-CwSp?5ak#^w#D((W%D6~+V>Hxp{H-ECo5*5DA!2KVHRsLTv?$B z;^T3xERY{SO7srIFAX6Qwc}KNbC~_M5has!KEf-zDtap%iuS&LfX)e2fIeVMi1+3J zx`Ye*Zdil`>%tr>+r0BEWoN5U!vyMX>_u%VPy#@4S?8cOfKaGmk{;wmZDE{&fqozH zDv1Gi%YrQBZ>&g$!;VTCTYy(SVGhA)#LJ$|eg7*4JbZOh!-dY{)8=8!EVS53R;6uQ z0rqw3O(-KnyK0F1l6>`@dvNv_i6LrGb0>m~z=5VJ6AgK6o0wYcc(=wq8(}xa4@-cb zw3cpwY+C-o)4#PF`@Co`4R8&rXgk{c$;e}6nNd-S(c3_~W8bate*#aox&ESi+S47c zJj*s9@@!@O^#|jTe<_!Dr+T|eL(%^hWO9^^hnoyILdhrxGRQu(O(DjR{x|LrZGixI z${Yk_gJyq2kW|tS{irV93c97Agoy^;JB(c2q67KPyqgs%Wn&3Zf+4KPW*K* zqTXQs`Mcq<)74^7KnU^NqkjUz!TTw2Vv_!;U0hBO1zW4@%QycV1>EMTb5Q1(`5p?H z*s%VfYz)zOGCXyq%TmP4&oN0tx;IEc+)MITeiETl660XG1huH4hhON|z*d<-%V;6w zdn(CEV4*Uz??VDFUqLj5Bu}qPkYbVIG#hKV&2+cv5(gl#ke0Bi+%ASR2aU5zvcwX9 zfb*&>!ZLfIb#=}Oe*a~ZWh09+DAXhP3#~J9Ou%DG<6jvIP%gDLMsHpIuQCf#=Z=^a zmljyjyS%0_mM#O~Q#K428%D8Mf40t>ba2MKNpr-fgxH&f@fS?CDDLA5Z#M?x5vO2< zYI1X>)9fZt7&uC|0HYj||4P>LtS9B|z$YF>wG2W%xY*{tqI)s3TNrOx>Vs5w0r4IBS1 z`xh37UJ$Q+?65dvj1;@c0eu1Ms)wZiQ2*>^oB(3fvyUkRvLP)PMi}!H;TWhn|9ge~ z1TjFxO(At+7rXRuUJp8%!P0X-_%`xyt%Snykp6qrMR)wc$Ts9ZgP7$`^=};IGP;8n z6bUp#dLEkEMSN|{T&P@rvQ zh+ia&3M6+_heGP67B}#PMI4(U03FbEf~L-YZYRz^SEvQvk}1S5KIc`l8K!hmc^KSl z4(j}~{W=tt`UeUd0P2eoT04-E%7!LtfvHjOX}XZMZ8pXlypIg~3%_ci5d1abvGX#H z(BMJS`tTs&9kxY3zO>5xb<)Q{;oGJNiC{0}G?wlW*a{XDUIAhRAb2_*SBcy;9jK%K zN1nEcJ^|904bjZ_@&^`$q+-3^>$-_?MQEz-TI@FMmCxxAkma z7i2GbZ=O-uDcDRiH5(^K8K7A(|6#aAckVlK2d&fIZj`?j-W!e%vPk$S2W}?E1`13d zB_7=P=Y>LMQZs=5*H(z!LZ(EB4uOi5g@W(^YUYJV(D$#G-ux#` zS>7Cw2%F*Gw1G22RLThzeDZpT8x9Eng-{r8ICgr!I;Q80}PhH!%N;o;gb7ST?t z#!0(~FV;9&41)uh(*(lGN_seZ=EVU;X8qg_AD_|;w8Ejf*UI<9YXQPsp&nxV8!JXb zS&1YG0A*=Doahg3RvqFUG`nK%D*~lq&c|M(^Tcq6lR=geh^v5M4sBt3dXoQl1?!>t z$GDycR9hq#T7?7y@V&NxJeP%qy1_vYT5y1P%M=P%DE~*j-sidmV1SgJL&M2un^PuW zQNk!wN;ZD4Y5EyJH(<_D^WthaX@-}lC;un2QSLAc6T5x^sO^-bH3;4iBxwl_@5 z#6b@LUaBJ{^jxRSH6{T}6>RGJ&FOZ82{b_yw%P{}rKMX{)h_~tZy3@Nh{3^7#>-{1 zh5Z9xK}0_?3c^wrwf!Ixa=TtrFg{jg+lnbDGW3p3B#HMBX9%K-&r><{{-|AEH`MOvrBs|X0Dhl zO7%g!5FwdB#W3_dd_EVsx@h|;mVP)k0hL?WNIp4XnKp=u`Fp%R0U^7Cslig5PX$Si(+d#-s!AT^u}mz>0tc&H z`Do=yNEy_Sikcz#E*tT6;{wMawroS(k-)nWg((9#Kq+ksbO1^WwyE0AwfY?iP9UX? zm${NH6I?b^ic1avA)7+>%MEq@6g5GF12?D*Yc3LtiAUFgpp2uX) zA1KaiFIW!kFAVR>gbP(eBZYXJA-XS3z$8}~3CZQB++^gs^XpN5YsNFJt5^yvgzzzIwW$Z%W z$9zD13Iwr2()|zy-0X6IqWuiG)mxuaiMIwE5XKZJP=TWpjNr9Nt$>DdTh#U$Cx>F( zXUFXuU<>1a{gs33ozDi*6reUB1}}nyQPS~MiFiG+TMnO>wmSne>J{)!c2sDCi zoFT9O;jr}?PN)j#Hyu7I=v2PIC?aT)qm_ZBJK;K#2KQ9_cUH^Thh4HVCbi%$&gIZhnFu))n;FAsx z%@%gWGl67aY$$^W4$_R7h4b}Jbqf=`exAjZt}A3ucPL`VNk#MZB3u@5F7dik#KrL_ z2U)gLHgf~Le@a^iq*}MWO=Up1kq4xw{sI#fLO9l8HYf`wW}rVmWqCSUwJN6ybPP~k zr4Mp8GcXczC;FjM2XUz^>tDlxpz4KcIjBJ)-fGfmpJEMv?66udt=9K}~c7Sir!uUC{u0Q9|T(kx1vxwT5Ip^gr01#Ra z)Rty{Cyz9re0J=U6PKeMn8z6yjGGN^FD(}47g!a+yRf|$9t)*U!*!?Ti}k7q zXaa_30hDN1|NXRUIP!0UP<*-yxoHBzr}OxsbdWS>3vFC~NAW3hl6tbD!qIvVYxf>U zBowq2*M2{=MNLL~MXuWvvQB&0!95F&0%-Akt+EE8ItK zH=u(;L$EgLkm~-OXZwQ*=tYAxU)Mn-6EO%$teS8FYTX)+H!tAw>s`u25Q#!q?u$wQWl9O3h5=N+%TpvsjJ5M=fn8l)zq6g|e2}$ZOZR4Pfr(Lv*JG$-``*g0wg| z9NMqN(>L{gaW`-Q1f|lF&XIH8uEn#ZwX`Vz47;L6W8r zSTF`<&S1*bs-Tio?Y^HLhpNQ=LM!^SalZU8n0jC~lE>=r-TNn6+%Nd+ zKJaj#mdRX;xB%%I6#rE+|AI+kQ8{U@5bETJ8hl} z)3p%T-n|Y=rOMseL<8?~>gaz)d`EyDp)fJ3X!PJ?%~KczbFuzdK%jnW=*2exYnRur z19YCS_8o8=Q8XkT{;1Z4q)qHOL8oSk^%SysUm5of=5J2T*|p zCi>+#czKZB0^OE@4Uo@@G!y;9i4M9SD=Hkalj8V{Qx??H;rW^n>O zi2*Y}-n#Fs4HgO2HDT)4qX<(X&c|F^X9|F5t10u2@{FbP2v z0fCh$#FSC4J0ws(C8(I%PQ?G&Y+};OfMCaylKh^+_GQx-v#U#pM zuEgP2)m9ToKj7_-fcIf?eTY8-c_Et5SH=%ohy!iOVq_ipKs{R*fVA_G_Lf8S+Cw-8 zIqx7h&{d~&(d0?HHAv4t_uCVHQBN_}0LVayTeIW<$1p(vc&Ce2MF3{LE3zS)n}(Fh z5@1{gE;xYsPY}q28mt4K0MjPUAt<$y5te9azt4}o@E2{rfNy+)Zv6(;PgcG14(H64 zWivnV!VgxM3bF>nV}^T=*Y`HpSaAQaKKHgK57Mq2gyH6qVsj8mS~dvWYI!ZNd<=sy zCb9cfs}kf8z^`av?ppeMHAK8#El=v0q3feM3vR3Xks^#NoUU{+ET=cQkykbZsSo?q zf=dm^wiT+LSJR$pC3$Uen1t+frlG&Mha|5UD$RnmcQrD(q8%Y>EJj?!$;5^oxI}2| znX?6`SMJ29p?j)AvUFtzu{J0Kf}LPOKbu!Ueg*+|&+(06*fofhy$-z)(|<2CDs2sB z0vaa(v={#0f)HD*fdNCb(ZT>}UOY+nfz97!5Z;b`cFgiQ;s?(yLHV|gT6z$AOPXMs z%{bI?>^2a=81gVDOnKqfezNXn`U)Pj2mq5_R0oC_1-;VC)I~8qh=5lFjOff*6(Set z4n?i)+HTQ<@hrvKXo~?ZVhSh(>Z!Oo5&L*1J@0)kiu)J)(i&=$H-ACspzIk^>^0Pu zII*np_w?5PshN3EL1vF3d9nue0>n_Vt{R4!6=?Wo zZ2=yEV{5<+n1LHEg!--FU=D3=z6T0t;J7vx2LnWX#Li0)8Z}V8tWfWTE&sm6tDHC& zF0dWWC7x#M;DayDeVI;7{KBqPex-jMPLRctOcXEng~?tLd=3Q3H2HHMauNms;sd?F ztdfyBsKgGgBitAbH3SH^{QA!e!79N{lgqp%^l8 zXOcH02({!Q7#HiLQ3R~q?)KU~_HMt2 z9rUfK=NswlqPLcn*QQ}k-*i$P?}4Lg`swY9xg|hB``BTIV%zZnggKJC_Cachiua44 zN296}xAPr7IT{Bwp9hF&G$yuSjHG#-oT0pH27$Hs;9US}EbD~_w=*Q{WF`QE=u_Qb zD)-~5D@dMHn(zDD#Gj0ar*3|19yW(57`)8T?=Wy$2hqmlyXi?R=RrfWSc7`s`;4~C zTzSRfc_d!Gup1Q`pui_h@IkpH}hjU&k>fuw; z=&^^Lt+)0GG^2d|Te*j-mjO@H%m3p19W8Ip?JMhuCt%SKF953EYzNgvpcaz+z?v< zlAnej)2VZB9G3B+r95bsuTcVPqHk*p`}tU~uZ2 z<1pe8F`dgkP=Lyog=U2h`}xZ;rPeFAldqEbJ0_{ zBNFx~e#TcdkVAWjeplBt-Yfh7<341^HC+dz623RxXzd&L-`;d*N@aUYnf$ML!!)DU`fr$nhLUHQ9^2a$RPr8YyKubu zuA-biRzk7tYvg|`ofKIS!#Sl)_SmFmboffPl)GbyM(=WNi%k)I^ z?wsWP4oA(ddK%!mtNKj}+_9V`FlBC?uB(2Jt?1N|bY25i%k+8{21?~t$$DXa<$CF_ z;7%>0UXppRCER?I^(gogq(is;k|3mDf6P43&zhZJMe4^2G&(ZcsB8!gbeGE97-5)a z3X_nxUwLADC8$@XOk?9%_mY{lsHo>b=x zss0Xp+*t@&r5brj8;-HgWsb(V52uZ?2T=*h9nd5kqz${6X(~Z}aAAQuL0^&eb)t*p z8T}EX-6~_>+jbdP4?REpyyM(sp;SLPQYub~T0$Gs@ZMvhG#@4WmzWAwfo;r~w!a2^ zXdc}jvVALkJ4=-qeN!4PkR-aXm-D|0t8WzKR+qa&zO6$x?gHz+bls%wC!#w(DskMb z$g3>2`1WApo>JhIuzC@!CW`YW@R^vafEu~zfh)ZJ3v8RphBV{%&e3rs>Y2U@qNZa-}(!i17fv2$5%I4E@YjQ zC!3fMz!)L)M}$E<`Tdu)|QWea~5S3ekMRhLPLo!>=&G z^0vdi_yq}4p?I!+;@ikt+PJL7B`+r^m@Bdgg`KnnmFcseg}(_WTDLpF+~D!m<;d;V z9`d|T6UuSBp|f!KEzNBoZZ>7C{ zu76`Byz#@5kKmUAvhDB5ITm_7Q#*?xEW2z`4>s>OZzP%6&iBo*elrV-Z_cR8Se3IZ zPlYMz0%43iLcV1u3G;5=!^RE120ud4Akfd!!j6{lz2Uz^3OhaoR2!a8eWt{+RFWZ_ z>-&R@kh1eee)OG|5vu0&7hm{BJn!H%0;EV8IDj3+hp=W%Mo+<=Oc8&+2W(GYe-Xo?L-o zlkYq!$=$g4iN?f(QjQsTS;uxQnd*r4gqvkyLR>a!oH9Qha+#n0&TV3EBD<5eY_7Um zo^!x?iE!;1OZpji}R`O*1U+ zRWcZV$Ace7zRUL1fR|O9xTq~0^Cxq{oe4_W-6-9i8;cuqbtTaiAnN*P0_ zgrV&{#j>Xj!Pi<;WY&GerDsS#DfLr1AjV$?8KlKFI%+Qkij2B#!`7Wra%o>lg>rLo zim^)oquPX>#2w%Q>Ub>#qg?;~g;%56Ckv=5ZKT_bWe@N?=E7*j$(DjhGY z<)mRVqkhi7~ftprl3kb(RiwF33uK-Q_(JaJJO=JSNcn|?=%74(m>XC$20)aHK{ z#Ux$zdQabYgK#kmN~oEK6MV7+NHwEk!)Y58gv9C{^vUtdrCQnxvBr%w`L5DWb)Dzy_WG{E&ZN2Ru zLBYr`UqAI=+*0~TfZL6!3i9`3$!75`C2kknCscG%NC`gdp=BRBEe^O+TMJk`abSfn>x*T~R<* z-`<8w>fCM0L=vy5PbmQm^UG;EB}~x|;;&XFO_h^U_0vZ_J0#TCmYo1S;hb!pwLNUl z6Ni)*7*i$^JA^5qFVXH}h88JxoZ?sW?C-Hd+M3zZ3qMPF+6nnnj!N9#_IGWz^NqNW zhMwFZM#Ul&9pdtAYKVDa2#{NqP)@o9`82usr3_Kmsm3t^!;42%r38ihz?@Xdya}x` zb>b0mWJ2vpBu@=^wC9PR#63&ptQ|?+wWTvkTUuVXY$zUw5ofyC0vwfejCOE&wYZ5J8Q9)Lc(ZL)PRF<72VG?1im0}m_g-14I z696=4h%u`3hruQcX(?G#Y$BD4_#7x30smNpiZgS49>vahPF@xtxaF92WjG4q5Kwnqp#rXJ2E(sDn%UGb3@nj0! zgG6S~)Q;pg#pX@HCp&ih`(J-*&|KHHuzUuoKWrQ^O37C8w?+`xF9I=K73e!Nkl4#W z9t}8cKg6si`i+4(s7hpNC# zpI^NC8K^&&wDgd*=|_A{fLcp0no$CX6Dn|em>~vftk`K;(zhcJhZX@HM;*$g=}@zS z8$kIr!Z!&zGMLY3ct+7m5U?olC^jnA<$4oM!hnU&tqGsJQVdzdUEtabX|}O#OU#2? z?&r0gF@nIp0GL*#Bw~z+>^=isL6%ruEfC^(q%j8+enX_JfZ9>Jp_%)U20PpgOzZI2 zLt3&73ywxPbVIeTjX_G)Vi1a09{_nV0|L5ovNS!CsLAYq2Rk|epEGz3ssbM%_fCKC{Zn`BHPSR7&HDJNw3z@ZXHJhYWH>ff{V7l}my5Bgqcwyh z`ep`bA17r=^>$+nL!coU(3m2?cev7aXZi5(vY&W3=8wd2R05`93s}{2tlvn>dew}W zo*w{X37O{nIqGZ7x_q>CwRV0W(qj+PeCajbx+&GP(O*!0Hi8GRUTTHuJlv)qMzl1V zNc>7_d}4TaB0e305IE)Geh+tA2p1Gtmm5P*a}bBNK)wFNheQ)2O$Wps>L0bzs8WrI zP`LQF_? zK_^U=+4UsM>L?d+0HVSyAR|Rce*@|h-dYa>-3+?rrLQ9#zPH6)bxwvNo zBFj+1xC6943e7qZ8qG1XY!pMNZK#lns0G0&g{I@e+LRA7>A29~maB#QpmQMZpowH% z9Acn>$FhEPBnSA9_ln|#pOw}u1JG0CKu;3J_TU%cK-@`T_u@Onm!YM{u7$eELKh@+ z%!3KAu7hYCQky|&CdINfspr9g4W&&Z7gS?Tw^qKGH^wvWFJxQl6>w3s)R0Wp0yA1vajpFNv=a z?G%rSiy?HJWL9ruxWs%V!BZb&Of97B`-=T}(8bVmjpij#C%9dw4LtGN-&AR4c?Hnm zDfSTyAZwmkFL|fML|?yfY~i_Qbh4Mo!m;TOnL>wM%}M-!uMKaMPIF_Jty=&PSevtG z31`-%VB4J`&5wDSzt3iMGJGCQn(6W4bvnC-uA@0T9j@)$&Mm*_&8tgY9>(`Dx2$W0 zOl$|B@w>>>nfKnHDIlX7yWzSMW60HoyYT!Q0zUQ{>qjx0DNe=?fpk)?+u5GmR^EH% zmp=-U*)yLOHIDFToVIzX)NqBiNlEw`OB`T~l7&l&`w~%rr$w`HiaGSOM2Hf}&7Y-^ z#lBy(=k0~up8Y`0GGz)K9rR?Q!+$`Ni_K~r(s+w)LyBz|W%yt7YOxicBzrP(B-wKr zI*;GdbF6=h)8oI~JN*;2q%nBAsWzqp6-26VUmF@cL4R)>11IGsN{*UQ^cRlUXrgs2 zo4#T5?FHw3Yp+ghJg0@V6y40&tvaiK3hBnmb_+%Ns79fAVMUQvxx+BL_Kb&GjLR{j zN14o}$8S-LfegdqZU#`~VqyC%x6M5kXu@v>r>?J}@LD-RWYjn)HS6<~UhLj^J@IbK zu1iNDe|M*fgkfiMcCR8*rF}QG59}~^^QBHr#*duXSib2~&FuU!HhLdPm@t1Z@ZAg> z-MC13LB+2r;a2Z)E8S-`$@te)}u`( zooLyyucFZ1a@FN|%5g8=-8QBQqOscv@0`pzd&GNU!O_@M4c~u5-U}B$ndTqmFQf%- z){^%9nH;KZ3XKW&r)ri>Bkyn|P1P)uZa~rT$SPk~$oB#ZH{Cmw{^_4ti#vg++_tf@ z*{+`#{EFb9Kf)|5&RQ5FvaLV+718}GFg6YqXa`=B?w2C53rZSZL&I|j{NX#^@0zN|9H$O|joR!iezZWDeh9q4tA^)5QuSeLkl8o^6-!rF;m>^X|kw zYJxJOQNGrXk#rRjKkfQnRQj=(^tAO3X|M_?kp_W)eLsz^-7{;_>sh)s9w$ofN9r7x zrgOFAMbR_P2W_o*27}zkl<(Bd%@-_xI#a*i$9)Qwq-jX#fM(hPyoIh?ZN9kP6vOMn zc&Hv7Ucd&$oi35uAdfZrPSb=B6blwl3M;a8D<+6`-y!!rR3`S zK>Kp=XnJN`(27|7sY4JbHMpKgo+jP#j%sFB@#H6?ikNC%p2_@yNX|!GmjZ?j{99G@ zA5l{-;uBFrO~iGmTjyk6i6~rw%FD6UQh__b;rd_Aor^crX&lDKy)%=tF}0@1wOoee z(xMc()ya^;P{^gRH7#Y38rm3EWHU-`V;9pf!_aV4gAuJ|jh0->plq{cl6$1JM3?=( zozwrY|G=Cx=e+0lKHum0Jl}ULP->XuF{(gl+2;4HQdXwD(tQdl6z}}zwvctTRlzY> zp3o19VxPLa`X}3>Cvmk|t%bE_*~h?7roF(W8qa6X;EtDjtfVw^7jPV0q$+L$>0ps( zm#g=FCHh3TPdrhb;fJ|#C{8)XzK1U(-8+8O{<11O=M^!Glhv@3UC_ZT4Y2t@ z)VG&2%rWPBIV^(VUyx@WBoc@FJQzc=K#mEtklAb=dW&iz0OEMp)?Gy(|4I?xxSy>R4$d&bPif59mt5mhY|AZ`3Vn+&7xCCi+Ey7yKGxY8r!;@#-yL$JS}1oNRUI!6yp9Lh(lns&2HTxlX2{ zlq`a>gmwV3yNVnV&ii>O+fXrzryI)T#Z=-yGf$s9YG8+V10_1kVeX}gw`t{A>gKqJ zpQ5}hs-qb#8F@GF}n3e~cDhD@VLQLPHa04T1DCm{fK1pdIRmWng3W5M4v1dD09-r&Wu#7lfmKt%Yc9#g&a2+x(zgTW+0{b z)B#V}vB$}J--}b)f-0V0k!=Xda~(XDVPZ0|>z7Tze1yr>9jP#8Ud#7nBbL3_r>H^@xD#gdT zknKJlmqA>v>S%)*a|S?7ROAzN+)Q&my=znCR;5d~NUHC_dugEK2yVI6x*?dyC5&c! zY5S3UKB`*Sa@Gk z2BNA-Pt;OO+S6sb(5dgt?9bRk9xAiXo7%NwZa0!=*6`Mx|Iqb{m@EN1Ze~!}x4Pu) zW!Ixub9J^SmG9-q&?x&NTz{?4_M|5IVzWov0Y>cj!Yz6t8Vj_h(> zZ&dDrC}K@@jlMGGz&fqtx%UJ*B+s0a7&~@>g_;6opyCP*)dG1I^RA3Gx*S$rQtSPi zNpJUEuY$?8BB^e6i|d3US90|`f)hMe|0dc`bLz+C$h)FUMpg<51kl4^r z!7CNUSw7&Ku$#1wo4OOk?Y-$cO9VwzH)ne%H+vg18V}2Nt~O4Ne4IQyoILC_)^2Xj zuEJbg4*%yBoKEkoxZcepUxIf*cYdSmihw|x2LFpF=N_DZfbcm-`cu`auv@)Aw{i)9_gMqDj^1r=+OMIN)w-=ic!Bq5v2foPDF{I+&OU z<@;YQ9FF=M*+rj-N@bObp!9}-;t}W+P-@CJ!#-@Gohb!e-r}jJH`n}H@%KXRMUc1p) zk>)X?4bm!*&POEnAF~yF7QJ^XOp^>fY>0-mZ(1(bA}SoyYzkAlxVy0?wzM`f-Y=0= zww}))o=zx-Wd+=So4TWqdHF6Gl4>LQaDUfr;5tl1tZ!cO_ z&wpl5Sys`YSGJJp^Y@$B7pku6c8A8r2D3iZE|qU2MxM0y27YH#rZCZqy)S)9`47}v zP>#l5wbH1px)y#sBFi0-li9sg?|*rY)8WPAekIHpYHEE`u+R<$;}9&#hUUeN$o#gQ zNWKwk{PJXvd7ExYOb$ZtG;L!)0pFA1=NyjoJ-6VqZ9eJ=@4OH)vbNx{kobI@sAKkt zd(I+Wpz*~vsnBkDT^COuB^cAhI$pU}cDq77h(dud@70P@!3=GWXL(KU&S>phwY-_c zZ@ZP>^?o(1g|k7Iws))A9o-k)CKRnyWcEES7T;@Q4R9-bTAP^cr9WgUandslCDOYM z0JlNnk9+0;8G3^qxkuD%XC->|JKh1(jwLXu!r|=~QEM;E8~Mr2QYpXv?p$BNy(pQv zwM+_E)Xflrb#<{Eu5Z{_IJGUS~=ekUDv@|zL-OyrLaDp zrB=4;=u0f~=ogS7Uo)StR)v&_Ct#g|@Y(g;OtEr2Gm4xkXj7T~NFP1h@^`+Ax2DBj zfBNy@pfj|Azl(QTofUF*cd^`e;l%b~&TyA$-;NzOD*J1dJ8D(mu7}%0#g>P{nMiG& zutgG|@p7K%jpma3j3J57vG9}R)s|kbWLWR@T8mIGskxi=i{^I$@FzFFOTWEOTzcLv zHrMcFq$s239Uc~P&!;&Ls?O%MCJTz{5nbbYeW--?;kRp|Av&JhhVO+2rh8yl7bM!(zb0oeOif$U%$x ziBJA|gzK|_I!6{p1H0;?#JOnU@8TXa!bMHb54z8AZxhO<>#-%D;pm}Iz5f0E{yAR#d( zB&7I$cfPRRL(sHR$UJA{v#&X;KC;hZEl zCEE?Wi+1q-Q;^iaEGB>ScKpKY;jfYSm-Bj%Dfp-3%>s5mQaH8nq=WG12;!oe3)rov zLjO!Sb@0Yh(SN?qSW^nuhDMZKBeTY<&; zc91L2LnX)#+pf-rFJ8CSG0(*aQS;fe`YDOgOZ5s-PZT?0F3W2hd07rk_6Kl{=@iW} z>_*JhmsW61Kk6F`#ub|_ZQ_p#Xd_@LZQrXMY`An>_jMk5v8Ca=czYBHW{a!vbZgAz z9eDCES}Ev{US(qJgFxiRy{?KJp_P9;h3+rc*P9EFpH=7^fjoV_{W%p!;Zer>QHjU( zXagU5g%%R2cLu5>QFvIXa8Z1l&a;hhCDMII3F8%b<#gP}q`RRMjymq`tG>E6iPa;2 zV;1X2(9bhG*FL!zEAB@5`F-0+#Qc8H=7Ux4w&BukWtLUc;Yy6{SlNBNoTl$kuj$%3 z6LNqLiMFeEq&bQY!d*hqM~SYBpb+zw2Ojp_k|&kY~!<;3Q{HLCqL>rD9H z8fAxHPX@09HW#pl-q;Cm6P3P-*s#|#@h6?wOmlkL-ZC*ncSSRVD}IaTQ#nsA z+_T5v5Jj;i88WjK7BPj%)lzN9S8(X7^mjj_HwghZ3M(9KlWV(a6!HyycGP*%EP_MN zFvK~oPkI2v78PgP7mk-9-{G zpZRci5MYigTOrCCRUNr6fftkgT2(^6)^s)#47JX$wtD`=-5USWeY;bfr~a3#E?)1K zytYz}<0EccFP215$#%XyoG0w-U~&@Ikwhkg6v!%;NrSaDXWOG>Q~gftcbLfwl6w?8 zaxYQ$>26$c%A)0w3xyLhYR{FxWc&fEboXgp%q(SPt{YqbomFBSvXV`& z5fmD-1{YI7a#Wi9!`=gs3TSV@GdGm6ZTmq`qfxeR>58LBgp>a={Pr(1yft+4P|WD?@+n$^l*pwM8KWh%rk&*5O$A+M0pxTbY|} zsBK&{>0`VTK2v`2qOfkkFdj3^4sYZ0R&)Up$Dvg}DfB^(?hq&D*(M*;v?Q-l!*o@(1F()q8gtGZv!w zr!aFNNq@iT@s3KO6djZaU5}+K`|@0q{*~?&^n}I>xzG$fr`-Xd&G@pomKLj zWucInMrHrHh7E}?V=<|DO<>nAx};Aqxnf16zKRI@IXAsPQ?5d^y$STAr^hy;1X&yZ z$sE_*ilS;pYOZ9r>#%^fefn|eh|l56ah*TtYY}O0L_1S&Kc(K-eGz3j+2~eolTpG? z4BZwZ!#t%NjaMi9Y4rwO6yfx8Lh3Emr(5Yq-QBE2nvR1DPVH2jO)EiKjqx^}ytSN{ z!;@_eiqG^Et+*JQI_M_o#2F$Zs=lV%W2$wXl-w(nE$AnL2{tm=t98oXPY!V6#)`>Y zs5BDKKbi3{&bufrmQ7ONop#sTx;5Ulo3;~q^7`3SN>;AIqgvF7yFX0g1s)ZoN{QMW z8)C}{40zq&;+`r&>0ON0(xuF6)IJnN-eu6x?UrntWv)p0`!#416o_7qWC!++a_vNp z^1&|TRi(aK_fy-Po>oJ6@{?xPMLwK}h)=fkug(4fHG=-HUhg|lnCdJ38K@cYU_cI} zqk}H9d*25aj#%l# zkM^iyn7e5+>&dyR2Fe!lgbq^B!(s7<+nPG)hhtFTYPo(0LO|H!sWtv%K^qKp7}{EW zzVOLa&B*_aqV~VsKc_s4Yi&|AW2qzOzr3QyMDcPje4WvdWRs5<9c>?!1U#NUUT{z! z{`S>8Fm;<-%}Xyr6E4zwzDSk)XRmFNs7m+1RYA0&v;0wtDCM%>r$DljPNGK&q|gLT zR`e!|I??g<6T}Srl^ko-qTC_MHj__H1iG+*lp}Ex!+hMWBg^HdlioScQ@E)8tw#wB z-7I-F#TRtwFV!@#qA;IvVyO8cw2>0)m;`FY3>r60h7*qZHeh2@*1C`T9H()8*Ne#a z=;=YhzV?MZ9dzB!2@@nK$$uWPF>=w5zf!sp(Toq)!JDm3GrqIq8Y>Gj+0rg`NGY)3Ku^R@JYB;VlbZC?ev-O{p3R(nb-M?EA?ny<+S z%bo>uWu?eGR%?4@qrDfi*g8U{rF2(r|JXp)Inh;7P)FlnospKn3l8dBC}x}|F9vbr zi)2<<%gUcLBlWR$I#t@BTf|E%I>g&biGH_bR+qgfsPr86&NAPr$L{60RN`2_X;VOj zc%P2Rf^t5pP9vY4+CmPISgCDpDE3rnoFc+IECT73G|Bd9^~6m)XMaT7?_<73 z4JlR*>;(J$M@rj-JPxo)pL{{}k~V8fpEep7RaS2EYLTGKqnF{*#E)uAiFh64tuTL$ z(`zNz#8J=ph;<)ZjX85QqdEMrw8tf%^7_(1e-_^CeMi_TYjq(IZoTC~n_;|l+kU-M z_WZX;xpW&1-SO69xi1&JXe>%T+Y}oax5+De3&Az-HOjtwjr}6#c(#}mzMj~VW0o`N zEpzXPlikFnS;bqjJ>K!!V-5>zFGwq$iSB6oSnpBS~Da6wK^(xdtE#Y zgLGhs_d(3!w-GWAwaFBX(`JKZ%dps~nF1=0%RIh#k#Bk?WTw6i|<7#Uy?5K?-FqQC7vKsS|vd1udvCF;vU zuEaH=z&AW;K$)Z=>#cUVHbkhgR~@;C4b}@MiKlbUc&hvCTDA$~l+#I&!%8 zbhw!I*!sNsOU~7ZGHYnOJxuGqt0+&{m8Y{uudSLz=ius(3tK_JED40Zi<34dx(K@fmGs%RK*>!3qR3CVl``{d}YoB@LZl z{d=IP!YMo7nWvMEa)yMAs;YBs;)#o@d75AQI8RSaniB)WI5<*`ynb#E3CeLKWgfpT zi~Mo@qf*2<;hw$xST*uemG$?cy;%Dr@5B@YY2ovT5mEN{W6h>no8S4wf8^AuVdF<5 z^75mpHB7DKYG;`$@gqg-SjC1)SBY2kc$H2=>8Rcqwu*af30IwpYW#86Z6Ne4xp0Zc zJ>*shU+a_JViNw*-^HSrb=KiBza&||9j;3$Qpe@qV>f+6sb1y4ecVsqhm~eO%KWgn zut1g^=N*{affe{f4X4gHmp{E$0w*(x9GAcA5{ZlTt9-M^eMD-mS>!ja9aSfJ|IH7! z;ZT*S++sXCRjE>D$>lg21^l*_aLzZZXJ1b?w4u2+BNDb=70u1sc}$$30>nlpv-#)l}b+>P_C{WKS-BhFXtO*Mjev9_{{ZTm5--*0&L<6>o4498Wo$AiB{jm?@v+GaR%#|FN$VaT|*;QkK5JYI%bHA+K$6`1vv= zCiCZ3wG#ZF{;!X;N8(>5x~kDvFp;N!fl$8>>#A5`g=IgE&2@%qj6;^F6(LpMRP>a$yTaFJL?>3FMehB0mXJ?F1F)sn zg;?%f;n7S;X_F;yZl0X62n$Q;TAla(HQ3tsTim;!BI;B0*U`gxwWXS!oXTv#whmbcbkNcveln-)%&aG4r09_i=@@Dq2`xn zpW=W5U3b;E3L&pUzc<~7MWXI7+ixD_7Z=WX#Q?e(%^ZjmTBJ@rnLJPg7_}9ll`kJ_ zv#4yC7q za|Zd%QAK;Kviv;CJ7cS6UYQg!{XK|E78tnDXzTkD9h!S5E}~A`N4LPfV3L0XQ?|X0 zr>#5e!ffnUD6OxyuXj)fQ6H+sAMrNMmr+~wjv}$ndXZaR*^1X70&mic%AvXw)ifuR zxHS1wSnj9C$5M9Twp{ohem=IGh1O4=?_j`pwP>S+R_#CTb<5IcVve=RC0xs6Nw}x+ zQ+|NN4*}FEPeRVNPm^^r?rsww8K0;kd^Z~!`wU22Hg%h5y_3Ic_Q7WzXoC~<7 z?7P`Tq^;{$#jk35hb+c3ZO**&5(+ci_v>dGc7D={erLukL0hOP){<*ORP@WqB_jyu zo=|#P$Ercm4SPf!N@ zwS2$-QGoXO?H00Ku?92#V@l^&<*I7@Y3iTFt2U7pL>&SSep)ANSxw}bDjk+tV_e?4 z$R9X)Kncjv6jlfA^}Yl#OCv&a5lmHE>uhfrmp86plE{M8r0ljT2Y@-Nkw`awepQaj zTOU3>{HG|(NJqPrPbVO~oB4L|3^mHRaIk>$snjhRBVQDsdy3=t{RS-<>^&BdVE~~( zAq%^{mU*+t%nLHPa+sb`Qqa^~GYuHvC$&E>{fBaAU!=HS>4^+^BxZ?z{Z9C3dXBno zH|j3Qa!+vwK(!Q|MFE7M!yl4B5fUM$%EYQvEV>b zcBFoGH^c`k_d*R>3NJyGs~IWmd{^^kKv1;OfO!mUC8B*=5}F@YyLcQre-3DsS-zik zA&kqH!kYz{2Y(7DecClsBG?;XOwp7S(ofBvfBQMw#}{?CkAcrXJK>V zvs}dvnuNYvm;I=?-`AQ}XHDMt_>-Zto=~}g^xw#AHqxeOp5?Au@#>v6^MDw`iqc{1 z+K==ybZ%9qqH@0yw#ggH3C+M1d>PW5Zh{Z|tni(pQ`)?3RYiWKFb^>UU_CMa9ILp7 zWQN9r;_i+-ZZ~>bn|3~<#(9=@0yGV?-&YGG7)-*D$$Eyb!+BL)hj_?nJt@_z_jmQ zuE$jEwk0M8tVca}DEdVzCEqBBz*5!8P#=*r{KJMi zIRU4_R=Vp**Ue?_yk(LhE3rc!NhsG`1CqEOBDOHOjt%Rtm*mS9JSwm2v|c8zKKT+} zrug#cM-A=Rv>R0SROnsJj~*=!u;HS)`?!Sxwum76>0T&prj3 zo#`)`FR^j&#^spYZKu;lb}HRRu1&I-s`b%l?1u8^ruv3|GG+ZLo#kB)xQa}d!g;}< z!26Sd!*Siyyh-Cd{Q{q58IfsWbtQSTdV_bSxp2ftM3(DZ@72Mtwho}9lB}BLGf#bX z`(yiM*oJVlPCX&WaNjK4O_{tX5|?Q|?W;0pv5=RmhkQQX4m)YK%9TlRgsd#rm|m7FUi!o@Q@Oe&HYx z0%FTf)n?hE7}uTP4aJsgY)z*>Y-_!(ft()fbhdLd$%>2*snYIxwTM}O(icHRf9kVW zqhm+&kZPdQXw^LA?Ib%QZ9}G;1TS8+Ra@%w5)D1(NN;~mN0~xNp~{2>;qfWmxLY#N z@*0JgNv?Q^Y$Gfvi^)A|R;Jrjx=+gGy$5t<_xjRj zJlV6pS2%QguU^teMCEk(iiu&8k+B>O?QVpn5oI7Z+Xj?h2m?AX-Rfszjw9|?hqBle zLuN3k*w2eMs!`?M)X(kJGt&&kgsHY$`rnJi2EJir>`tvE4eIe~X`Ntiw7S`F!8*$5 zJYT)EX#cIV=^fW$U+VJXVXl1aEgykTsB}S$ui&9|e?Fe}t=h3nJBe1CkYXfPLh``csZ#}=oP2IQJ_lneNbfU4 z2`S<$q}T0Mw##E=an!6cBti+m7^3<5VE1~r%GiBJ*LEW|Cq9YG``31Hef+*lQQyM= zTNS%|3WJ=j23FAkswHExNs#C87|Dx&zj!vOuH0kK30;gm9>K#=+aQzdn01B{a%<2= z^j$QN5%ovr{FQEKLptN^$6{qYWS9FK&Ql&gM^NVh>Tt0eKU)(S@bN!9eV{z5b|2;i zZoh^$Q%r7cM%F$*IxPE+l&MmOLE>eg;arn^Vo{s_8wseT83<71tuMykVG;CA6i;h~okMd4G2>&qqIxyv5&$%@{c zPPlC127MgzkZk7R^WeUD%*W3orOLrq0>6C3Zs-SHXXt@}DRPPO}34thTH5WkxzwOpcvj1u?(f?xi(m$(G{*oOKZZVDhuPl3R zwoXu?2cEzp(5+)0MKlfm;lA0c)Ar3k#(l|s3w#Kx{q!+dQrH3- zi;2eYxo(!P!WiNg5C{eGHQPPhB-G6iuP|ORa|4_pUBDmoREE;!2i(>X`uDh(!s*Ad zx}tz4smHA8_tRGYhr5fz&d1blS5|wau*r|I5uj@NSJq^(4UmQ{9EZ*7Oq|Bm(6|M9FY9 zG4?IWuViy?1vUugNZ?xIaFp+qg%UEtZ4phN zTI*I4*`NHg8V;X&jRvE59#=4hVPGXaixixF6w|={IFn)uuuHqe+{&ENE=`v=*Z!;*FRsGG_fwjJz-7*){VK=wK!GxEo`)q z43bQ1-*&a>NDL20?5Y_Q2pl(D`T(LI_XH*$kUkbFObC{NwvJVX`@FAMOu^+gP@3l; zG-30M2Q4Q`w?3&hg`W_ScG|fyv9V>nuYOAY1e375W{wu5z}<%_oaKw;qz9%q7T4#gDl z?m$Hd0rSt74(6i*x>kcdSH-fF0nzaWAGChJQk2enzv)FtRCwqlY74dpU|gK@mL7yc z`K8`fPpZlH$iUU*f37j1^b$Rj%}-33AM4tv2u?WXJXU z_<`^|5=257k1P!Cq}4y3imAVNQDj|suX*Gg%>T6uZJ<8>C#KK8ZGkI+W!{- z52I^dyA_Q_LxiP75*W}ByvyQ*&QUFzh@gIyw(+gr?Yx+$iC`u#$!xLht0`M>+R>w* z4VCwJSm*;Mm(V`z{lb@pHxA}^IFv%%sHUWjKfJd{EvXBQh9GGU#9{Q<&wn`&!$6=b zniVd8J z5W8E$!=VKKG`s_g4-?;-M&BIx+#GR6NAUsxBJ2j~iNa_7hv+XX>cO~DON7x_2T>G9$HO8xq6ldDdGnojle&1I&3LFtHo< z>4{kY70jIT0v_%i+HfUsc*WIF5wn=mc)0&ItvA?Zw4RR3^EB}SA6oBT?zzd`UekIs zk2>QcmHz3~Is&|Jz!kLKT>MNOeWlFWTlb=|J+sZBn?%kMzanr}^CY>k?H zho&x;+yG*ykENO{=yf4MXD!^Pc;ye#_6E;q#vQq@c#hS_@W}sX?yAl+wg?1<6h*tr zZ;(r{z`H^CQ-HzwQoRbLfC38z;}R!)1x4i=J5lr|1Q7uk?}Meq%?`b>@wFN|w1SWX z@e;NbI7$y3(!@&9AA+o4chXv7E|upG0zRtsfuDw~(gnB?!kDsrd4bPJ&@}fGBgSKD zU+3}&MDkm9+;+I2Kbvenc)s97U57PZoj0K*QlVbQ>+UAVNdDvd-)1|5fR+a^3lzi# z&YhdIvKB3P%yuwtnncq~ugy<^)%Fz>)70u-0U(vTpkXc)(>L2u{CUt$SVd{zK@>sa znhYI4g`f>l0iTB{yo~7{Me7<8T8}(BFRN^3eF^H8RY1N(27a#_5oSYWsR9O6&+=ee zCHo?fB{@+s;W@1YpZ~U80n6MIN?`h9)IC2#u*~m(`;)BAlpIpWZoHJq6=f-l20&3rvm z_Rd=x297+^-7xl+!!C}Uj%qP7Eoq5WJ)ZQBHp3^6KB6bbDF%a5fvIvZdb`r$2VUh{ zahC6I9=NPAYCngoFeKmE7N$VL7sB29cm}Ek3t>v#6KGh4GjIFEbxp9o!1HIm%-CUI z3jee7S@RgGU0n;Fbaad1ShBdDL(=l*ol=+Ww@;;*tij>-$e}2K*X)KonmpZ+XkS%N!d5xU<&gv}cB+3-jeT4w zeojvlu4jcLvi6bQ>~Jqu3dg1`$}eYpa^B*_zl@Y;y`7^lnUt-B#fWcXMd z%?E8adW26#21g{Po-Wo$k#=dK>+%tn?eCJxBtoASc4+GdzOqH!2R2@gAgiguX%Eu) zf1@!z8b}6R&)4-W%=F&bEQzl}qrpqg$$X^FQ?y4)K5rtJ^wu`z`UN%C!0spYYY#V4 z0(kv!nUUy!3Xdvgs-2tj*HI&5YW0tsnR-V>m?5cnoO+g)V`Ji3g+>bpGcJ&5`;sA6_bc%Gg zy;%IU7UtX=tQT}_;j6AJG;af!`GfVIfr7>M61YXp0+)TAqa;Txba)H}tE2^q>Z*@Y zEe8H`MrJ#(q{Sx6l%E0}M!%;NQeJD|D*sn%!B59Iv zm#ABv>{3F!M?yI>*R0|NFD_JM9RE4fQA@DYp_FPMf=nPFq{3Zk9IesTpd^<$NQ<#K``KPAK{;O@*Bu$f_C z595ZQJKw-d2;0Qe7La+^UILF{&EGyGO!mo4=t*DNyr`@O zm6(tJAe5~JHd(SMtEGSSylq+il_$pilaHnzB#@Cg+p-EXT(NGNhGqX7p@~t@0Wh}q zVhBOXqyO7hCWZHBu#<=rzb-gr5l8P1_gMD3D1}*C6RQ)!0P!2D9x}5tDuo*rc<%`HeO?V{ zS9QG(@GYfTInYrA>ycoU(eP~o$K*!|9O&aXFG*q?zFw68=!Geo46#H8|CCcf4uM7N zVX{jfRpX(5tyZ{E@LrOekB3a!-q%6k&-7>lY^wRIKfp*6(Wvd6RSveDYW42qCqcX@ zR@1-{OPWCYrZ-aCf-|=D2QQ?Ks??7WnyrG6j8tW@T#b!JesudqOOFMDrb-e9Q{b5^ zx2=NLB>$4BH(6;(o~Ff=b3cOF&LQY0sFymknRG!ZV}3P^S0z)kmFbh%iUz-Qa#z5j zH*)>}bYDcNTU;D0FK7P;5*7^!Oc4u8eSx*`Z!F|Q!$SGsgCh4o#l!#2uNto^f1Y@q z3K|Op_Q2d)azWuYT=JO5{Qni@|2KcC{|QI&Uw!v?1K#E(RafU*;@watToxZ5?}EYi zDeZgG@Mfiaod4~{`ro3;&-}d{@PJ*_daeiWX84Ek;M;fgk0^z~diKqu1hj;9 ziu1ZU0+IDaw*a!n1skV2RxKR$t%6&?1+c_s_WiOS=CV1kX`_R(#Zd=9Ns(JJc!7Bq z*MTKE!mo0F(f-iWI|6VZp$wU20{4i}dI;!_qC2O9fz8MiXj(W?E5MP74H~t)Z*Qjc zouaay%>mbS7u=?aBfOoR>NEB1?4?u7kqkf(B3&v{*hGBV(5K$phhSrvbZc9HCwb^F z8hs=l3>n@if^`UxxQHo0kGM$&@8psJospI$1swvL{8RLMc3(yT^{EQ=m)l}%`yFm_;2Z%8R@J<`*mRdLeDa3?# zJzz!R>8u{;A@KpsCxtbDXAOtOX<_ttfINXWM}6wd1R$CJAA7PLUuy|W=MmLl3+u_o z0t3|Q43I(J%pjOE&;aE;#M2joh>ZGUj|!e^Th$kl_$;FFd;#`1?E)i22?wQchM@Px z`XfN*k5@rg8#ZXI@@idDV||Us@n{mQQf^8?{O%(@8nW)$nAnRK_`B3AgASJ^ypMZ3fdQZQrO@S>tb2QbfBNFE1KFH-1Yqvzo~+mKz^Lj^ zmUGwYhvu}&Hf%LcZ>g_*zQ*MDB)vv~N~&^u0*^qY&LyvY$ouFQn`r;|Juv*{QekGT z3etlr!TjZ{G2VDsa!nv^%*}0n;LAp0=K||}(PpMC)JnBK-kV@(ysH|euwfBk`?Y0h z9c^Eu9cAt*P64}OCkdGFL59;F==xDNh4T&p>hH|}3bZ*(O)~cP5(3?j=ED(~oJ}+k z*80Z+9F?G=Is}C;6b`{T*IyGT63(#cst_o@bU86E>2?8>c@KLrC`vg&qnv=twQ**j zSjR(217=mXALuTyV*fh8P2aEu;34HSxPlv?b7D^1-OpQb?*HgFfE9&_bu&O~W0#sd z2N7JrNw$d2-+SOj(S_EzivjV0{D)7yVuQnx8oH++)olzR)cBlLr|2Yfqc=_LI<&@3mPDhyFmNove1I2Bvk}J?;L`Mp8MyhmO8R< zoNvH%<(W?GH(zjri3kixlK=@v{QlD16HHMTz+$8nTPWE5 zNF~2>BRIp!$gvP<1_NcrK!Hc4^kO3+*{kya+)ZVV>t$9pGPVzpf=y!`jsYLkXJkkI z#(`Eow45~P+0c%p2kM;o%dG52x|}Z=)1=*in%YD2IA+ng8+-kbtJabkYhd!*WTi5nlR0K~l0e*sKY$#k+yq^b$(FA=wm`~`K>P;pkA-yp zE~2u^sHO&Q*YWwMK(RR_aNOhDklu0OUFRE$}-bLs9#oA&WNrLA*a$~THQ68f) za2tA%hrgDh8`hJQ3Pu&2=o;@IUiZ41=i^WG+5^p-B-5aOmo(M{N>JFqAxZOL^|j3< z0x6`smI}0<*5E5kFKIjZp$gR0j!T94L~ zEJV9^ThZWkI_HFBqe?OL83DnU&)f~ip! z!p|{n-{YbE_CwFKn4ula%=q-_mHrsFP`KuM$Xs~7i3&c_Td5dsy|k*F-dHH}JAada zL6Q^2g_k$8?9o%V-}Zo&J-km~3*lV1whL|goo~?xx~)XeSIaIo-2q1qlOmG^mt6gB zw9m3+kk2%&@vQ8U@FHorT{pgHH%%LJhBwxF)CyUH z!t`k$vG75+!wq0^n)1m|k&t)rcEPVXX3&KvvlUgdU<8H1)b{Z5I)3>@m z?MpXAJDZ;o1om>dJIt5W!DBa@=Y~m_#|C5X<$2oaY(q75e5Y)+CGgeThzXvk+ttBb zN8Vn*^PH{k-Ojby-E~hnqCc8Cgd$(Q@1Jtc2Qe=j0psy%Y07GaAbnXEKoVMFXUHI@&OcT_4WaIw+R#dyA9 z?$3lxI;0M>=>XpKEnfZ@YCndj1e24Jp5edNIr7C>!T09mLElKA4aiC? zPq|Pc$VOy0^@u~g$;Ln4eyi*Ua@EtiY0}yhja0p~hcfIOcvwt^A@g1JB1d`n_rEcn z?FTuKoPq+hF}p|fVn|6BSA2FrBl$_}I9x{fyMLg~pA{pGBRfqyAuv9v!dUIkm2{7F zS*u_m9nv!tx?0$9u69NTRO|6WjMnzBu-`_S9`tsme;D5jKP94KO3tP)%MG1hpDyFfJIK_TMvxi-X?nX7FI3; zWr;cQ8f6mknaT&=_kLxfG4^?c+;3uFbSGh0DIq29Hk6w_`*v~A^a2D$(V9J!SH+Li z-u@VM)nFk-VwHsnZVL$k4ZJRW0{Yh1qc{hGWuQ|3KH@0UH#8henYO|c|sP@JSt&WnS+5+#R_#cA#cs0)%GhfWNY&S79yYmGMB-U+EMG^(N~6M4+Eu)Fa|mN5dm6mtg!Tlf0zPi zkvQ2DO}X@2Y{ldFoi=U}CH%tZO0CnzJZ2T&d7Gk8u!nF@bN_svjTUL(F=y$}h9f$= zU|*+L#?onHU%*o6Rke3BPMQ}z67_s()=aRN;cO}XMFQ^7AtfX}cTC3ob1!*dI$*>3 zaYAV(^5+lBUqWK&I=a10P;)_zRU;*p8eXlG5}i8F2D*5)(iKazY&_Kp?t)-x8GbAg z@Z7qRSiz=IWvPB3`6{GCRu;;^d-^dO1R%lX3_4Rnw=CzSys>pDyCZg(#e>rh)bnwyqFzFusbb*jI5N z{V^hPKpFO9NMOdGCP$k4)2jCA558MQ#V^>rYRRhGaG1xG;il$lsw2jyZp5eQnA*dV z#c~X^jJ_28al&<*MbHT5u?j@TnAY>t@hqT_2|WL$vjq3#!nqL_!%>m;DJ}h;9HL)+ z9-eT41|is{b0HWu>^6-Ojb?Pz%+G4G@AbRW975s-M%B_5Oiwus2z$Sag%{m(0KTUb5OYjLO40lkDRM95NKgCy*Jlos%hT<5t_eM0W)| zmhXNxv9;0T<$N}UCH5;}u%G8jJ)h?UZ}Z*119srY2Yi8`5wV*+tw≶oWkfA%+U$ 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 diff --git a/docs/time-to-ready.png b/docs/time-to-ready.png deleted file mode 100644 index 64ea95600b34dac3e32d915a1fe96329d021e286..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 35870 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 z zrLaP^k(d~WhD+oLrL8dJgTKu@IgSi1yKU{Fa-kBDv$4olhMh=tC3lau(9(%6e20m6 zP;}swx&E1RTaYlDI|?M%4v?yN0AIgZq?Z&No-j)OWY|-IFWwh${TCwaDg2`@3~_n< zW36<)cwr+n$!dX3OtwDYS9|4H2kN+Emnpy_D9=~3)uvUe!L2p&CPy3y7 zpESvZ*pl+HTpY&axVtT=?sYbTr)m#6zMG_E|91C7gGn427K6yYYxuC|^RgUM_CX(A z?s$#yr_Fpkvwym8rN2SZi8FU4b5<4PcuQ2R;j=T}KvCK-kY8!!*3|!IG&pkfEU#C0 zaN<~pDPFeBv>1}=2A5`gHZH`Dx@u;l-IE`r%tHGYlybDbNlRX{DfPsdAz>@_EB`zV zl*@tB01AAkil$N-?Mzb}z|oh}+3( z?N+zs?SV$S4fE!M351F}v*=(mWyBO4-i+a4euWG|M&zD=tYvsqPz$t=@irljw)Py${@(bQ7#4-l%N0iuHt?+xx}2C*9`jj%$C1U&H^N;rREc t*#Abb{2#c|zp|kJe;6jhU&gF+Nv@Z_Kd&Yb2Vb7;grS8&x!&o>{{s-MmJa{` diff --git a/pyproject.toml b/pyproject.toml index 1a604e2..0a0e0dc 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -35,7 +35,6 @@ build-backend = "uv_build" [dependency-groups] dev = [ - "matplotlib>=3.9", "pytest>=8.0", "ruff>=0.15.21", "ty>=0.0.62", diff --git a/scripts/charts.py b/scripts/charts.py deleted file mode 100644 index 82442fa..0000000 --- a/scripts/charts.py +++ /dev/null @@ -1,197 +0,0 @@ -"""Render README performance charts (matplotlib → docs/). - -Covers the metrics CI runner users care about: - -- time to ready (vs GitHub-hosted, cold vs warm) -- where warm queue time goes -- concurrency / burst -- idle cost shape - -Run from repo root: - - uv run --group dev python scripts/charts.py -""" - -from __future__ import annotations - -from pathlib import Path - -import matplotlib.pyplot as plt -import numpy as np - -ROOT = Path(__file__).resolve().parents[1] -OUT = ROOT / "docs" - - -def style() -> None: - plt.rcParams.update( - { - "figure.facecolor": "white", - "axes.facecolor": "white", - "axes.edgecolor": "#333333", - "axes.labelcolor": "#222222", - "text.color": "#222222", - "xtick.color": "#333333", - "ytick.color": "#333333", - "font.size": 11, - "axes.titlesize": 13, - "axes.titleweight": "bold", - "figure.dpi": 160, - } - ) - - -def chart_time_to_ready() -> Path: - """Queue / time-to-ready + cold vs warm + vs GitHub-hosted.""" - labels = ["GitHub-hosted", "runner-modal\n(warm)", "runner-modal\n(cold image)"] - seconds = [3, 4, 30] - colors = ["#2a6f4e", "#3b6ea5", "#a33b3b"] - - fig, ax = plt.subplots(figsize=(7.2, 3.6)) - bars = ax.bar(labels, seconds, color=colors, width=0.62) - ax.set_ylabel("Seconds to runner ready") - ax.set_title("Time to runner ready") - ax.set_ylim(0, 36) - for bar, value in zip(bars, seconds, strict=True): - ax.text( - bar.get_x() + bar.get_width() / 2, - value + 0.6, - f"~{value}s", - ha="center", - va="bottom", - fontsize=10, - ) - ax.spines["top"].set_visible(False) - ax.spines["right"].set_visible(False) - fig.tight_layout() - path = OUT / "time-to-ready.png" - fig.savefig(path, bbox_inches="tight") - plt.close(fig) - return path - - -def chart_queue_budget() -> Path: - """Breakdown of warm self-hosted queue (time to online).""" - # Shape after Named Image + in-job JIT mint (not an SLA). - stages = ["Admit / claim", "Sandbox create", "JIT mint (in job)", "Runner online"] - shares = [5, 10, 15, 70] - colors = ["#8a8a8a", "#5b8fc7", "#3b6ea5", "#c47a2c"] - y = list(range(len(stages)))[::-1] - - fig, ax = plt.subplots(figsize=(7.2, 3.6)) - bars = ax.barh(y, shares, color=colors, height=0.65) - ax.set_yticks(y) - ax.set_yticklabels(stages) - ax.set_xlim(0, 100) - ax.set_xlabel("Share of warm time-to-online (%)") - ax.set_title("Warm queue budget (self-hosted Sandbox runner)") - for bar, share in zip(bars, shares, strict=True): - ax.text( - share + 1.5, - bar.get_y() + bar.get_height() / 2, - f"{share}%", - ha="left", - va="center", - fontsize=10, - ) - ax.spines["top"].set_visible(False) - ax.spines["right"].set_visible(False) - fig.tight_layout() - path = OUT / "queue-budget.png" - fig.savefig(path, bbox_inches="tight") - plt.close(fig) - return path - - -def chart_concurrency() -> Path: - """Can N jobs start together, or do they wait?""" - n_jobs = np.array([1, 5, 10, 20]) - # Illustrative: with headroom, each job starts ~independently (~4s). - # With a hard pool of 1, later jobs wait in series. - parallel_ready = np.full_like(n_jobs, 4, dtype=float) - serial_ready = 4 * n_jobs - - fig, ax = plt.subplots(figsize=(7.2, 3.8)) - x = np.arange(len(n_jobs)) - width = 0.36 - ax.bar( - x - width / 2, - parallel_ready, - width, - label="runner-modal (headroom under max_concurrent)", - color="#3b6ea5", - ) - ax.bar( - x + width / 2, - serial_ready, - width, - label="Serialized (effective concurrency = 1)", - color="#a33b3b", - ) - ax.set_xticks(x) - ax.set_xticklabels([str(n) for n in n_jobs]) - ax.set_xlabel("Jobs queued together") - ax.set_ylabel("Seconds until last runner is ready") - ax.set_title("Concurrency / burst") - ax.set_ylim(0, 90) - ax.legend(frameon=False, fontsize=9) - ax.spines["top"].set_visible(False) - ax.spines["right"].set_visible(False) - fig.tight_layout() - path = OUT / "concurrency.png" - fig.savefig(path, bbox_inches="tight") - plt.close(fig) - return path - - -def chart_idle_cost() -> Path: - """What you pay when nothing is running vs while jobs run.""" - categories = ["Idle\n(no jobs)", "One job\nrunning", "N jobs\nrunning"] - # Relative cost units — shape, not dollars. - github = [0, 1, 1] # hosted: no idle bill; jobs billed by GH minutes - modal = [1, 2, 2 + 3] # min_containers + per-Sandbox jobs (N=3 illustrative) - - fig, ax = plt.subplots(figsize=(7.2, 3.8)) - x = np.arange(len(categories)) - width = 0.36 - ax.bar(x - width / 2, github, width, label="GitHub-hosted", color="#2a6f4e") - ax.bar(x + width / 2, modal, width, label="runner-modal", color="#3b6ea5") - ax.set_xticks(x) - ax.set_xticklabels(categories) - ax.set_ylabel("Relative cost (illustrative units)") - ax.set_title("Idle vs active cost shape") - ax.set_ylim(0, 7) - ax.legend(frameon=False, fontsize=9) - ax.spines["top"].set_visible(False) - ax.spines["right"].set_visible(False) - ax.text( - 0.02, - 0.95, - "Modal idle ≈ control plane (min_containers).\n" - "Each job ≈ one Sandbox; goes away when the run ends.", - transform=ax.transAxes, - va="top", - fontsize=9, - color="#444444", - ) - fig.tight_layout() - path = OUT / "idle-cost.png" - fig.savefig(path, bbox_inches="tight") - plt.close(fig) - return path - - -def main() -> None: - style() - OUT.mkdir(parents=True, exist_ok=True) - for path in ( - chart_time_to_ready(), - chart_queue_budget(), - chart_concurrency(), - chart_idle_cost(), - ): - print(path.relative_to(ROOT)) - - -if __name__ == "__main__": - main() diff --git a/src/runner_modal/__init__.py b/src/runner_modal/__init__.py index c5d0d55..e6f16cb 100644 --- a/src/runner_modal/__init__.py +++ b/src/runner_modal/__init__.py @@ -5,7 +5,6 @@ from runner_modal.exceptions import ( AuthError, ConcurrencyLimitError, - JobTimeoutError, RunnerError, ) from runner_modal.meta import PACKAGE_VERSION @@ -16,7 +15,6 @@ __all__ = [ "AuthError", "ConcurrencyLimitError", - "JobTimeoutError", "Runner", "RunnerError", "RunnerInfo", diff --git a/src/runner_modal/exceptions.py b/src/runner_modal/exceptions.py index 6a2802e..0963173 100644 --- a/src/runner_modal/exceptions.py +++ b/src/runner_modal/exceptions.py @@ -1,7 +1,7 @@ """Public exception types. Soft absence → ``None`` (e.g. ``runner.url``, ignored webhook). -Failures → raise (auth, timeout, concurrency, or ``ValueError`` / ``LookupError``). +Failures → raise (auth, concurrency, or ``ValueError`` / ``LookupError``). """ from __future__ import annotations @@ -17,7 +17,3 @@ class AuthError(RunnerError): class ConcurrencyLimitError(RunnerError): pass - - -class JobTimeoutError(RunnerError): - pass diff --git a/src/runner_modal/meta.py b/src/runner_modal/meta.py index fc1c9bb..820d222 100644 --- a/src/runner_modal/meta.py +++ b/src/runner_modal/meta.py @@ -19,7 +19,7 @@ # Documented install pin for operators (`uv add …`). Image builds install # runtime deps from PyPI and bake local ``runner_modal`` via # ``add_local_python_source`` until a PyPI release. -PACKAGE_SPEC = "git+https://github.com/modal-projects/runner-modal.git@main" +PACKAGE_SPEC = "git+https://github.com/modal-projects/runner-modal.git@v0.1.0" CONTROL_PLANE_DEPS = ( "fastapi>=0.115.0", "httpx>=0.28.0", diff --git a/tests/unit/test_exceptions.py b/tests/unit/test_exceptions.py index 02522af..6529a51 100644 --- a/tests/unit/test_exceptions.py +++ b/tests/unit/test_exceptions.py @@ -4,16 +4,11 @@ import pytest -from runner_modal.exceptions import ( - AuthError, - ConcurrencyLimitError, - JobTimeoutError, - RunnerError, -) +from runner_modal.exceptions import AuthError, ConcurrencyLimitError, RunnerError def test_product_errors_are_runner_errors() -> None: - for exc in (AuthError, ConcurrencyLimitError, JobTimeoutError): + for exc in (AuthError, ConcurrencyLimitError): assert issubclass(exc, RunnerError) with pytest.raises(RunnerError): raise exc("boom") diff --git a/tests/unit/test_meta.py b/tests/unit/test_meta.py index 58a4000..ebfa6fe 100644 --- a/tests/unit/test_meta.py +++ b/tests/unit/test_meta.py @@ -12,9 +12,9 @@ ) -def test_package_spec_pins_git_main_until_release() -> None: +def test_package_spec_pins_release_tag() -> None: assert PACKAGE_VERSION == "0.1.0" - assert PACKAGE_SPEC.endswith("@main") + assert PACKAGE_SPEC.endswith("@v0.1.0") assert "runner-modal.git" in PACKAGE_SPEC diff --git a/tests/unit/test_runner.py b/tests/unit/test_runner.py index 1196b8a..fb7c5b9 100644 --- a/tests/unit/test_runner.py +++ b/tests/unit/test_runner.py @@ -21,7 +21,6 @@ def test_public_surface_is_runner_and_errors_only() -> None: "Runner", "AuthError", "ConcurrencyLimitError", - "JobTimeoutError", "RunnerError", "RunnerInfo", "__version__", diff --git a/uv.lock b/uv.lock index 1585e62..8b5ef47 100644 --- a/uv.lock +++ b/uv.lock @@ -238,81 +238,6 @@ 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 = "contourpy" -version = "1.3.3" -source = { registry = "https://pypi.org/simple" } -dependencies = [ - { name = "numpy" }, -] -sdist = { url = "https://files.pythonhosted.org/packages/58/01/1253e6698a07380cd31a736d248a3f2a50a7c88779a1813da27503cadc2a/contourpy-1.3.3.tar.gz", hash = "sha256:083e12155b210502d0bca491432bb04d56dc3432f95a979b429f2848c3dbe880", size = 13466174, upload-time = "2025-07-26T12:03:12.549Z" } -wheels = [ - { url = "https://files.pythonhosted.org/packages/be/45/adfee365d9ea3d853550b2e735f9d66366701c65db7855cd07621732ccfc/contourpy-1.3.3-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:b08a32ea2f8e42cf1d4be3169a98dd4be32bafe4f22b6c4cb4ba810fa9e5d2cb", size = 293419, upload-time = "2025-07-26T12:01:21.16Z" }, - { url = "https://files.pythonhosted.org/packages/53/3e/405b59cfa13021a56bba395a6b3aca8cec012b45bf177b0eaf7a202cde2c/contourpy-1.3.3-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:556dba8fb6f5d8742f2923fe9457dbdd51e1049c4a43fd3986a0b14a1d815fc6", size = 273979, upload-time = "2025-07-26T12:01:22.448Z" }, - { url = "https://files.pythonhosted.org/packages/d4/1c/a12359b9b2ca3a845e8f7f9ac08bdf776114eb931392fcad91743e2ea17b/contourpy-1.3.3-cp312-cp312-manylinux_2_26_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:92d9abc807cf7d0e047b95ca5d957cf4792fcd04e920ca70d48add15c1a90ea7", size = 332653, upload-time = "2025-07-26T12:01:24.155Z" }, - { url = "https://files.pythonhosted.org/packages/63/12/897aeebfb475b7748ea67b61e045accdfcf0d971f8a588b67108ed7f5512/contourpy-1.3.3-cp312-cp312-manylinux_2_26_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:b2e8faa0ed68cb29af51edd8e24798bb661eac3bd9f65420c1887b6ca89987c8", size = 379536, upload-time = "2025-07-26T12:01:25.91Z" }, - { url = "https://files.pythonhosted.org/packages/43/8a/a8c584b82deb248930ce069e71576fc09bd7174bbd35183b7943fb1064fd/contourpy-1.3.3-cp312-cp312-manylinux_2_26_s390x.manylinux_2_28_s390x.whl", hash = "sha256:626d60935cf668e70a5ce6ff184fd713e9683fb458898e4249b63be9e28286ea", size = 384397, upload-time = "2025-07-26T12:01:27.152Z" }, - { url = "https://files.pythonhosted.org/packages/cc/8f/ec6289987824b29529d0dfda0d74a07cec60e54b9c92f3c9da4c0ac732de/contourpy-1.3.3-cp312-cp312-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:4d00e655fcef08aba35ec9610536bfe90267d7ab5ba944f7032549c55a146da1", size = 362601, upload-time = "2025-07-26T12:01:28.808Z" }, - { url = "https://files.pythonhosted.org/packages/05/0a/a3fe3be3ee2dceb3e615ebb4df97ae6f3828aa915d3e10549ce016302bd1/contourpy-1.3.3-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:451e71b5a7d597379ef572de31eeb909a87246974d960049a9848c3bc6c41bf7", size = 1331288, upload-time = "2025-07-26T12:01:31.198Z" }, - { url = "https://files.pythonhosted.org/packages/33/1d/acad9bd4e97f13f3e2b18a3977fe1b4a37ecf3d38d815333980c6c72e963/contourpy-1.3.3-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:459c1f020cd59fcfe6650180678a9993932d80d44ccde1fa1868977438f0b411", size = 1403386, upload-time = "2025-07-26T12:01:33.947Z" }, - { url = "https://files.pythonhosted.org/packages/cf/8f/5847f44a7fddf859704217a99a23a4f6417b10e5ab1256a179264561540e/contourpy-1.3.3-cp312-cp312-win32.whl", hash = "sha256:023b44101dfe49d7d53932be418477dba359649246075c996866106da069af69", size = 185018, upload-time = "2025-07-26T12:01:35.64Z" }, - { url = "https://files.pythonhosted.org/packages/19/e8/6026ed58a64563186a9ee3f29f41261fd1828f527dd93d33b60feca63352/contourpy-1.3.3-cp312-cp312-win_amd64.whl", hash = "sha256:8153b8bfc11e1e4d75bcb0bff1db232f9e10b274e0929de9d608027e0d34ff8b", size = 226567, upload-time = "2025-07-26T12:01:36.804Z" }, - { url = "https://files.pythonhosted.org/packages/d1/e2/f05240d2c39a1ed228d8328a78b6f44cd695f7ef47beb3e684cf93604f86/contourpy-1.3.3-cp312-cp312-win_arm64.whl", hash = "sha256:07ce5ed73ecdc4a03ffe3e1b3e3c1166db35ae7584be76f65dbbe28a7791b0cc", size = 193655, upload-time = "2025-07-26T12:01:37.999Z" }, - { url = "https://files.pythonhosted.org/packages/68/35/0167aad910bbdb9599272bd96d01a9ec6852f36b9455cf2ca67bd4cc2d23/contourpy-1.3.3-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:177fb367556747a686509d6fef71d221a4b198a3905fe824430e5ea0fda54eb5", size = 293257, upload-time = "2025-07-26T12:01:39.367Z" }, - { url = "https://files.pythonhosted.org/packages/96/e4/7adcd9c8362745b2210728f209bfbcf7d91ba868a2c5f40d8b58f54c509b/contourpy-1.3.3-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:d002b6f00d73d69333dac9d0b8d5e84d9724ff9ef044fd63c5986e62b7c9e1b1", size = 274034, upload-time = "2025-07-26T12:01:40.645Z" }, - { url = "https://files.pythonhosted.org/packages/73/23/90e31ceeed1de63058a02cb04b12f2de4b40e3bef5e082a7c18d9c8ae281/contourpy-1.3.3-cp313-cp313-manylinux_2_26_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:348ac1f5d4f1d66d3322420f01d42e43122f43616e0f194fc1c9f5d830c5b286", size = 334672, upload-time = "2025-07-26T12:01:41.942Z" }, - { url = "https://files.pythonhosted.org/packages/ed/93/b43d8acbe67392e659e1d984700e79eb67e2acb2bd7f62012b583a7f1b55/contourpy-1.3.3-cp313-cp313-manylinux_2_26_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:655456777ff65c2c548b7c454af9c6f33f16c8884f11083244b5819cc214f1b5", size = 381234, upload-time = "2025-07-26T12:01:43.499Z" }, - { url = "https://files.pythonhosted.org/packages/46/3b/bec82a3ea06f66711520f75a40c8fc0b113b2a75edb36aa633eb11c4f50f/contourpy-1.3.3-cp313-cp313-manylinux_2_26_s390x.manylinux_2_28_s390x.whl", hash = "sha256:644a6853d15b2512d67881586bd03f462c7ab755db95f16f14d7e238f2852c67", size = 385169, upload-time = "2025-07-26T12:01:45.219Z" }, - { url = "https://files.pythonhosted.org/packages/4b/32/e0f13a1c5b0f8572d0ec6ae2f6c677b7991fafd95da523159c19eff0696a/contourpy-1.3.3-cp313-cp313-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:4debd64f124ca62069f313a9cb86656ff087786016d76927ae2cf37846b006c9", size = 362859, upload-time = "2025-07-26T12:01:46.519Z" }, - { url = "https://files.pythonhosted.org/packages/33/71/e2a7945b7de4e58af42d708a219f3b2f4cff7386e6b6ab0a0fa0033c49a9/contourpy-1.3.3-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:a15459b0f4615b00bbd1e91f1b9e19b7e63aea7483d03d804186f278c0af2659", size = 1332062, upload-time = "2025-07-26T12:01:48.964Z" }, - { url = "https://files.pythonhosted.org/packages/12/fc/4e87ac754220ccc0e807284f88e943d6d43b43843614f0a8afa469801db0/contourpy-1.3.3-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:ca0fdcd73925568ca027e0b17ab07aad764be4706d0a925b89227e447d9737b7", size = 1403932, upload-time = "2025-07-26T12:01:51.979Z" }, - { url = "https://files.pythonhosted.org/packages/a6/2e/adc197a37443f934594112222ac1aa7dc9a98faf9c3842884df9a9d8751d/contourpy-1.3.3-cp313-cp313-win32.whl", hash = "sha256:b20c7c9a3bf701366556e1b1984ed2d0cedf999903c51311417cf5f591d8c78d", size = 185024, upload-time = "2025-07-26T12:01:53.245Z" }, - { url = "https://files.pythonhosted.org/packages/18/0b/0098c214843213759692cc638fce7de5c289200a830e5035d1791d7a2338/contourpy-1.3.3-cp313-cp313-win_amd64.whl", hash = "sha256:1cadd8b8969f060ba45ed7c1b714fe69185812ab43bd6b86a9123fe8f99c3263", size = 226578, upload-time = "2025-07-26T12:01:54.422Z" }, - { url = "https://files.pythonhosted.org/packages/8a/9a/2f6024a0c5995243cd63afdeb3651c984f0d2bc727fd98066d40e141ad73/contourpy-1.3.3-cp313-cp313-win_arm64.whl", hash = "sha256:fd914713266421b7536de2bfa8181aa8c699432b6763a0ea64195ebe28bff6a9", size = 193524, upload-time = "2025-07-26T12:01:55.73Z" }, - { url = "https://files.pythonhosted.org/packages/c0/b3/f8a1a86bd3298513f500e5b1f5fd92b69896449f6cab6a146a5d52715479/contourpy-1.3.3-cp313-cp313t-macosx_10_13_x86_64.whl", hash = "sha256:88df9880d507169449d434c293467418b9f6cbe82edd19284aa0409e7fdb933d", size = 306730, upload-time = "2025-07-26T12:01:57.051Z" }, - { url = "https://files.pythonhosted.org/packages/3f/11/4780db94ae62fc0c2053909b65dc3246bd7cecfc4f8a20d957ad43aa4ad8/contourpy-1.3.3-cp313-cp313t-macosx_11_0_arm64.whl", hash = "sha256:d06bb1f751ba5d417047db62bca3c8fde202b8c11fb50742ab3ab962c81e8216", size = 287897, upload-time = "2025-07-26T12:01:58.663Z" }, - { url = "https://files.pythonhosted.org/packages/ae/15/e59f5f3ffdd6f3d4daa3e47114c53daabcb18574a26c21f03dc9e4e42ff0/contourpy-1.3.3-cp313-cp313t-manylinux_2_26_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:e4e6b05a45525357e382909a4c1600444e2a45b4795163d3b22669285591c1ae", size = 326751, upload-time = "2025-07-26T12:02:00.343Z" }, - { url = "https://files.pythonhosted.org/packages/0f/81/03b45cfad088e4770b1dcf72ea78d3802d04200009fb364d18a493857210/contourpy-1.3.3-cp313-cp313t-manylinux_2_26_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:ab3074b48c4e2cf1a960e6bbeb7f04566bf36b1861d5c9d4d8ac04b82e38ba20", size = 375486, upload-time = "2025-07-26T12:02:02.128Z" }, - { url = "https://files.pythonhosted.org/packages/0c/ba/49923366492ffbdd4486e970d421b289a670ae8cf539c1ea9a09822b371a/contourpy-1.3.3-cp313-cp313t-manylinux_2_26_s390x.manylinux_2_28_s390x.whl", hash = "sha256:6c3d53c796f8647d6deb1abe867daeb66dcc8a97e8455efa729516b997b8ed99", size = 388106, upload-time = "2025-07-26T12:02:03.615Z" }, - { url = "https://files.pythonhosted.org/packages/9f/52/5b00ea89525f8f143651f9f03a0df371d3cbd2fccd21ca9b768c7a6500c2/contourpy-1.3.3-cp313-cp313t-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:50ed930df7289ff2a8d7afeb9603f8289e5704755c7e5c3bbd929c90c817164b", size = 352548, upload-time = "2025-07-26T12:02:05.165Z" }, - { url = "https://files.pythonhosted.org/packages/32/1d/a209ec1a3a3452d490f6b14dd92e72280c99ae3d1e73da74f8277d4ee08f/contourpy-1.3.3-cp313-cp313t-musllinux_1_2_aarch64.whl", hash = "sha256:4feffb6537d64b84877da813a5c30f1422ea5739566abf0bd18065ac040e120a", size = 1322297, upload-time = "2025-07-26T12:02:07.379Z" }, - { url = "https://files.pythonhosted.org/packages/bc/9e/46f0e8ebdd884ca0e8877e46a3f4e633f6c9c8c4f3f6e72be3fe075994aa/contourpy-1.3.3-cp313-cp313t-musllinux_1_2_x86_64.whl", hash = "sha256:2b7e9480ffe2b0cd2e787e4df64270e3a0440d9db8dc823312e2c940c167df7e", size = 1391023, upload-time = "2025-07-26T12:02:10.171Z" }, - { url = "https://files.pythonhosted.org/packages/b9/70/f308384a3ae9cd2209e0849f33c913f658d3326900d0ff5d378d6a1422d2/contourpy-1.3.3-cp313-cp313t-win32.whl", hash = "sha256:283edd842a01e3dcd435b1c5116798d661378d83d36d337b8dde1d16a5fc9ba3", size = 196157, upload-time = "2025-07-26T12:02:11.488Z" }, - { url = "https://files.pythonhosted.org/packages/b2/dd/880f890a6663b84d9e34a6f88cded89d78f0091e0045a284427cb6b18521/contourpy-1.3.3-cp313-cp313t-win_amd64.whl", hash = "sha256:87acf5963fc2b34825e5b6b048f40e3635dd547f590b04d2ab317c2619ef7ae8", size = 240570, upload-time = "2025-07-26T12:02:12.754Z" }, - { url = "https://files.pythonhosted.org/packages/80/99/2adc7d8ffead633234817ef8e9a87115c8a11927a94478f6bb3d3f4d4f7d/contourpy-1.3.3-cp313-cp313t-win_arm64.whl", hash = "sha256:3c30273eb2a55024ff31ba7d052dde990d7d8e5450f4bbb6e913558b3d6c2301", size = 199713, upload-time = "2025-07-26T12:02:14.4Z" }, - { url = "https://files.pythonhosted.org/packages/72/8b/4546f3ab60f78c514ffb7d01a0bd743f90de36f0019d1be84d0a708a580a/contourpy-1.3.3-cp314-cp314-macosx_10_13_x86_64.whl", hash = "sha256:fde6c716d51c04b1c25d0b90364d0be954624a0ee9d60e23e850e8d48353d07a", size = 292189, upload-time = "2025-07-26T12:02:16.095Z" }, - { url = "https://files.pythonhosted.org/packages/fd/e1/3542a9cb596cadd76fcef413f19c79216e002623158befe6daa03dbfa88c/contourpy-1.3.3-cp314-cp314-macosx_11_0_arm64.whl", hash = "sha256:cbedb772ed74ff5be440fa8eee9bd49f64f6e3fc09436d9c7d8f1c287b121d77", size = 273251, upload-time = "2025-07-26T12:02:17.524Z" }, - { url = "https://files.pythonhosted.org/packages/b1/71/f93e1e9471d189f79d0ce2497007731c1e6bf9ef6d1d61b911430c3db4e5/contourpy-1.3.3-cp314-cp314-manylinux_2_26_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:22e9b1bd7a9b1d652cd77388465dc358dafcd2e217d35552424aa4f996f524f5", size = 335810, upload-time = "2025-07-26T12:02:18.9Z" }, - { url = "https://files.pythonhosted.org/packages/91/f9/e35f4c1c93f9275d4e38681a80506b5510e9327350c51f8d4a5a724d178c/contourpy-1.3.3-cp314-cp314-manylinux_2_26_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:a22738912262aa3e254e4f3cb079a95a67132fc5a063890e224393596902f5a4", size = 382871, upload-time = "2025-07-26T12:02:20.418Z" }, - { url = "https://files.pythonhosted.org/packages/b5/71/47b512f936f66a0a900d81c396a7e60d73419868fba959c61efed7a8ab46/contourpy-1.3.3-cp314-cp314-manylinux_2_26_s390x.manylinux_2_28_s390x.whl", hash = "sha256:afe5a512f31ee6bd7d0dda52ec9864c984ca3d66664444f2d72e0dc4eb832e36", size = 386264, upload-time = "2025-07-26T12:02:21.916Z" }, - { url = "https://files.pythonhosted.org/packages/04/5f/9ff93450ba96b09c7c2b3f81c94de31c89f92292f1380261bd7195bea4ea/contourpy-1.3.3-cp314-cp314-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:f64836de09927cba6f79dcd00fdd7d5329f3fccc633468507079c829ca4db4e3", size = 363819, upload-time = "2025-07-26T12:02:23.759Z" }, - { url = "https://files.pythonhosted.org/packages/3e/a6/0b185d4cc480ee494945cde102cb0149ae830b5fa17bf855b95f2e70ad13/contourpy-1.3.3-cp314-cp314-musllinux_1_2_aarch64.whl", hash = "sha256:1fd43c3be4c8e5fd6e4f2baeae35ae18176cf2e5cced681cca908addf1cdd53b", size = 1333650, upload-time = "2025-07-26T12:02:26.181Z" }, - { url = "https://files.pythonhosted.org/packages/43/d7/afdc95580ca56f30fbcd3060250f66cedbde69b4547028863abd8aa3b47e/contourpy-1.3.3-cp314-cp314-musllinux_1_2_x86_64.whl", hash = "sha256:6afc576f7b33cf00996e5c1102dc2a8f7cc89e39c0b55df93a0b78c1bd992b36", size = 1404833, upload-time = "2025-07-26T12:02:28.782Z" }, - { url = "https://files.pythonhosted.org/packages/e2/e2/366af18a6d386f41132a48f033cbd2102e9b0cf6345d35ff0826cd984566/contourpy-1.3.3-cp314-cp314-win32.whl", hash = "sha256:66c8a43a4f7b8df8b71ee1840e4211a3c8d93b214b213f590e18a1beca458f7d", size = 189692, upload-time = "2025-07-26T12:02:30.128Z" }, - { url = "https://files.pythonhosted.org/packages/7d/c2/57f54b03d0f22d4044b8afb9ca0e184f8b1afd57b4f735c2fa70883dc601/contourpy-1.3.3-cp314-cp314-win_amd64.whl", hash = "sha256:cf9022ef053f2694e31d630feaacb21ea24224be1c3ad0520b13d844274614fd", size = 232424, upload-time = "2025-07-26T12:02:31.395Z" }, - { url = "https://files.pythonhosted.org/packages/18/79/a9416650df9b525737ab521aa181ccc42d56016d2123ddcb7b58e926a42c/contourpy-1.3.3-cp314-cp314-win_arm64.whl", hash = "sha256:95b181891b4c71de4bb404c6621e7e2390745f887f2a026b2d99e92c17892339", size = 198300, upload-time = "2025-07-26T12:02:32.956Z" }, - { url = "https://files.pythonhosted.org/packages/1f/42/38c159a7d0f2b7b9c04c64ab317042bb6952b713ba875c1681529a2932fe/contourpy-1.3.3-cp314-cp314t-macosx_10_13_x86_64.whl", hash = "sha256:33c82d0138c0a062380332c861387650c82e4cf1747aaa6938b9b6516762e772", size = 306769, upload-time = "2025-07-26T12:02:34.2Z" }, - { url = "https://files.pythonhosted.org/packages/c3/6c/26a8205f24bca10974e77460de68d3d7c63e282e23782f1239f226fcae6f/contourpy-1.3.3-cp314-cp314t-macosx_11_0_arm64.whl", hash = "sha256:ea37e7b45949df430fe649e5de8351c423430046a2af20b1c1961cae3afcda77", size = 287892, upload-time = "2025-07-26T12:02:35.807Z" }, - { url = "https://files.pythonhosted.org/packages/66/06/8a475c8ab718ebfd7925661747dbb3c3ee9c82ac834ccb3570be49d129f4/contourpy-1.3.3-cp314-cp314t-manylinux_2_26_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:d304906ecc71672e9c89e87c4675dc5c2645e1f4269a5063b99b0bb29f232d13", size = 326748, upload-time = "2025-07-26T12:02:37.193Z" }, - { url = "https://files.pythonhosted.org/packages/b4/a3/c5ca9f010a44c223f098fccd8b158bb1cb287378a31ac141f04730dc49be/contourpy-1.3.3-cp314-cp314t-manylinux_2_26_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:ca658cd1a680a5c9ea96dc61cdbae1e85c8f25849843aa799dfd3cb370ad4fbe", size = 375554, upload-time = "2025-07-26T12:02:38.894Z" }, - { url = "https://files.pythonhosted.org/packages/80/5b/68bd33ae63fac658a4145088c1e894405e07584a316738710b636c6d0333/contourpy-1.3.3-cp314-cp314t-manylinux_2_26_s390x.manylinux_2_28_s390x.whl", hash = "sha256:ab2fd90904c503739a75b7c8c5c01160130ba67944a7b77bbf36ef8054576e7f", size = 388118, upload-time = "2025-07-26T12:02:40.642Z" }, - { url = "https://files.pythonhosted.org/packages/40/52/4c285a6435940ae25d7410a6c36bda5145839bc3f0beb20c707cda18b9d2/contourpy-1.3.3-cp314-cp314t-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:b7301b89040075c30e5768810bc96a8e8d78085b47d8be6e4c3f5a0b4ed478a0", size = 352555, upload-time = "2025-07-26T12:02:42.25Z" }, - { url = "https://files.pythonhosted.org/packages/24/ee/3e81e1dd174f5c7fefe50e85d0892de05ca4e26ef1c9a59c2a57e43b865a/contourpy-1.3.3-cp314-cp314t-musllinux_1_2_aarch64.whl", hash = "sha256:2a2a8b627d5cc6b7c41a4beff6c5ad5eb848c88255fda4a8745f7e901b32d8e4", size = 1322295, upload-time = "2025-07-26T12:02:44.668Z" }, - { url = "https://files.pythonhosted.org/packages/3c/b2/6d913d4d04e14379de429057cd169e5e00f6c2af3bb13e1710bcbdb5da12/contourpy-1.3.3-cp314-cp314t-musllinux_1_2_x86_64.whl", hash = "sha256:fd6ec6be509c787f1caf6b247f0b1ca598bef13f4ddeaa126b7658215529ba0f", size = 1391027, upload-time = "2025-07-26T12:02:47.09Z" }, - { url = "https://files.pythonhosted.org/packages/93/8a/68a4ec5c55a2971213d29a9374913f7e9f18581945a7a31d1a39b5d2dfe5/contourpy-1.3.3-cp314-cp314t-win32.whl", hash = "sha256:e74a9a0f5e3fff48fb5a7f2fd2b9b70a3fe014a67522f79b7cca4c0c7e43c9ae", size = 202428, upload-time = "2025-07-26T12:02:48.691Z" }, - { url = "https://files.pythonhosted.org/packages/fa/96/fd9f641ffedc4fa3ace923af73b9d07e869496c9cc7a459103e6e978992f/contourpy-1.3.3-cp314-cp314t-win_amd64.whl", hash = "sha256:13b68d6a62db8eafaebb8039218921399baf6e47bf85006fd8529f2a08ef33fc", size = 250331, upload-time = "2025-07-26T12:02:50.137Z" }, - { url = "https://files.pythonhosted.org/packages/ae/8c/469afb6465b853afff216f9528ffda78a915ff880ed58813ba4faf4ba0b6/contourpy-1.3.3-cp314-cp314t-win_arm64.whl", hash = "sha256:b7448cb5a725bb1e35ce88771b86fba35ef418952474492cf7c764059933ff8b", size = 203831, upload-time = "2025-07-26T12:02:51.449Z" }, -] - -[[package]] -name = "cycler" -version = "0.12.1" -source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/a9/95/a3dbbb5028f35eafb79008e7522a75244477d2838f38cbb722248dabc2a8/cycler-0.12.1.tar.gz", hash = "sha256:88bb128f02ba341da8ef447245a9e138fae777f6a23943da4540077d3601eb1c", size = 7615, upload-time = "2023-10-07T05:32:18.335Z" } -wheels = [ - { url = "https://files.pythonhosted.org/packages/e7/05/c19819d5e3d95294a6f5947fb9b9629efb316b96de511b418c53d245aae6/cycler-0.12.1-py3-none-any.whl", hash = "sha256:85cef7cff222d8644161529808465972e51340599459b8ac3ccbac5a854e0d30", size = 8321, upload-time = "2023-10-07T05:32:16.783Z" }, -] - [[package]] name = "fastapi" version = "0.139.2" @@ -329,47 +254,6 @@ wheels = [ { url = "https://files.pythonhosted.org/packages/5f/c7/cb03251d9dfb177246a9809a76f189d21df32dbd4a845951881d11323b7f/fastapi-0.139.2-py3-none-any.whl", hash = "sha256:b9ad015a835173d59865e2f5d8296fbc2b317bf56a2ba1a5bfbdd03de2fd4b1c", size = 130234, upload-time = "2026-07-16T15:06:19.557Z" }, ] -[[package]] -name = "fonttools" -version = "4.63.0" -source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/84/69/c97f2c18e0db87d2c7b15da1974dace76ae938f1cfa22e2727a648b7ed43/fonttools-4.63.0.tar.gz", hash = "sha256:caeb583deeb5168e694b65cda8b4ee62abedfa66cf88488734466f2366b9c4e0", size = 3597189, upload-time = "2026-05-14T12:04:30.958Z" } -wheels = [ - { url = "https://files.pythonhosted.org/packages/08/ef/b3c6b9b5be2f82416d73fe2ed2e96e2793cd80e7510bd6a17ca79cdd88ec/fonttools-4.63.0-cp312-cp312-macosx_10_13_universal2.whl", hash = "sha256:37dd23e621e3b0aef1baa70a303b80aaf38449632cfc8fd2a55fb285bbccfc02", size = 2881131, upload-time = "2026-05-14T12:03:13.386Z" }, - { url = "https://files.pythonhosted.org/packages/44/a0/c815bea63117fa63e4e1c01f8a1110d2112fa003f838e6467094ec2432ce/fonttools-4.63.0-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:a9faff9e0c1f76f9fd55899d2ce785832efebab37eb8ae13995853aef178bef0", size = 2426704, upload-time = "2026-05-14T12:03:15.801Z" }, - { url = "https://files.pythonhosted.org/packages/44/04/0b91d8e916e92ad1fac9e4624760baf0fd5ff2ead614c2f68fb21373f03f/fonttools-4.63.0-cp312-cp312-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:ef3048ef05dbb552b89817713d9cac912e00d0fde4a3105c00d29e52e10c89af", size = 5044298, upload-time = "2026-05-14T12:03:18.085Z" }, - { url = "https://files.pythonhosted.org/packages/77/c7/2342da9830e3e9d4870305ca5d2091d2a83284f2953079b7bdd3b5e029d8/fonttools-4.63.0-cp312-cp312-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:58dc6bb86a78d782f00f9190ca02c119cf5bbe2807536e361e18d42019f877d8", size = 4999800, upload-time = "2026-05-14T12:03:20.161Z" }, - { url = "https://files.pythonhosted.org/packages/e6/6d/67fe16c48d7ce050979b33f47e0d28a318f02da030602e944c34f7a16ef3/fonttools-4.63.0-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:ee08ebfa58f6e1aeff5697ab9582105bb620008c1caafb681e4c557e7483027b", size = 4982666, upload-time = "2026-05-14T12:03:22.87Z" }, - { url = "https://files.pythonhosted.org/packages/f2/00/3bbab338c07c71fa56269953845e92c951a61457bbbb0f1022551ea266d9/fonttools-4.63.0-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:27fdc65af8da6f88b9c6121c47a464cbe359fcfff7ff6fc2d37a1f395d755b78", size = 5133598, upload-time = "2026-05-14T12:03:25.168Z" }, - { url = "https://files.pythonhosted.org/packages/62/f2/aa27c7f98db5b064883dadcc5283947e81e034de42e22a33675878d98b54/fonttools-4.63.0-cp312-cp312-win32.whl", hash = "sha256:af2fd1664d00a397d75f806985ddb36282091c2131a73a6485c23b4a34722263", size = 2292575, upload-time = "2026-05-14T12:03:27.496Z" }, - { url = "https://files.pythonhosted.org/packages/87/36/cccb9bc2a6ab63d1b2980374f0dca72ce95ae267c9b4cfe77455bb70d0d4/fonttools-4.63.0-cp312-cp312-win_amd64.whl", hash = "sha256:59ac449f8cca9b4ffa08d2e7bbadad87ce710d69d1eda5c3c1ce579baa987272", size = 2343211, upload-time = "2026-05-14T12:03:30.057Z" }, - { url = "https://files.pythonhosted.org/packages/0f/8d/d8fec3dcde2963f8c908fb315e5ff2cd0ac34f82394bbbf73a2aa5145ce3/fonttools-4.63.0-cp313-cp313-macosx_10_13_universal2.whl", hash = "sha256:cd7e9857e5e63738b9d9fd707bc1f59c8b09e5177726d23664db393c59bb08bd", size = 2876062, upload-time = "2026-05-14T12:03:32.554Z" }, - { url = "https://files.pythonhosted.org/packages/ef/71/d935dc54e4ff121bfdd11e08702db63a7e6f25af21d8a3d7b7212df53641/fonttools-4.63.0-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:c2a2a42198b696a6f48fad91709afb55176e66a5e566131219dba372fb7f8c59", size = 2424594, upload-time = "2026-05-14T12:03:34.86Z" }, - { url = "https://files.pythonhosted.org/packages/8e/40/e76320afa1df918e146155ef239b1719ee266092e96f5423bfd075affba1/fonttools-4.63.0-cp313-cp313-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:1e874792a8212b44583ea02189d9e693906b2f78b261f372f95d6c563210ac1d", size = 5024840, upload-time = "2026-05-14T12:03:36.745Z" }, - { url = "https://files.pythonhosted.org/packages/ce/36/0b805d8c485f872f65a509cbe3b58a5d0d17bee855333b54a150c79d3061/fonttools-4.63.0-cp313-cp313-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:22135da48a348785c5e2d5d2d9d6bec5ed44adacbaeb9db12d9493bf6c6bfa68", size = 4975801, upload-time = "2026-05-14T12:03:38.833Z" }, - { url = "https://files.pythonhosted.org/packages/c8/26/2cee03d0aa083ab022da5c07aff9ed3f689da1defb81ad6917c9627896da/fonttools-4.63.0-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:ccf41f2efdf56994d22d73bef4ced1052161958169428d06ba9724ea9e9a64be", size = 4965009, upload-time = "2026-05-14T12:03:41.494Z" }, - { url = "https://files.pythonhosted.org/packages/7e/48/cc4b66d9058c0d0982c833fad10127c4b0e9324606aafa41382295ca4102/fonttools-4.63.0-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:9ced0bd02ac751dd6319b0da88aaef24414e3b0dbc32bb4f24944821a3741a27", size = 5105892, upload-time = "2026-05-14T12:03:43.525Z" }, - { url = "https://files.pythonhosted.org/packages/d8/1f/a98a30a814b9ddef3a2e706025f90b9e0bc94890e6cb15254bc86547d11a/fonttools-4.63.0-cp313-cp313-win32.whl", hash = "sha256:85be818f5506e8a7753153def2c9550178f0ecae6a47b5e0e8dbb23f7cc90380", size = 2291313, upload-time = "2026-05-14T12:03:45.594Z" }, - { url = "https://files.pythonhosted.org/packages/92/46/5177b01f3b4abfdd4409f31cca4ab279c9343a26efbe9ec78c97fc612e02/fonttools-4.63.0-cp313-cp313-win_amd64.whl", hash = "sha256:ba04cb5891d4c0c21b6da95eda8d7b090021508a294fff33464fc7d241e0856b", size = 2342299, upload-time = "2026-05-14T12:03:47.414Z" }, - { url = "https://files.pythonhosted.org/packages/27/d2/23d25e3f247b328be58d04a4c9f894178a0d1eda7d42867cfb388adaf416/fonttools-4.63.0-cp314-cp314-macosx_10_15_universal2.whl", hash = "sha256:fd1e3094f42d806d3d7c79162fc59e5910fcbe3a7360c385b8da969bc4493745", size = 2875338, upload-time = "2026-05-14T12:03:50.052Z" }, - { url = "https://files.pythonhosted.org/packages/cd/58/7dfa0c761cb3b2964e2a84c4dc986c926a87de0cb9fb60d5b28ded3f2914/fonttools-4.63.0-cp314-cp314-macosx_10_15_x86_64.whl", hash = "sha256:6e528da43bc3791085f8cb6141b1d13e459226790240340fcbb4625649238b03", size = 2422661, upload-time = "2026-05-14T12:03:52.154Z" }, - { url = "https://files.pythonhosted.org/packages/dd/87/64cfa18a7a1621d17b7f4502b2b0ed8a135a90c3db51ea590ee99043e76b/fonttools-4.63.0-cp314-cp314-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:6b2248c5decb223562f7902ff6325077a073f608ee8e33e88ad88db734eb9f49", size = 5010526, upload-time = "2026-05-14T12:03:54.647Z" }, - { url = "https://files.pythonhosted.org/packages/36/e1/a8933a72c45a87177fbde2696e0d0755c8c9062f8c077a961c6215fa27b1/fonttools-4.63.0-cp314-cp314-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:308f957cdeaf8abe4e5f2f124902ef405448af92c90f80e302a3b771c2e6116b", size = 4923946, upload-time = "2026-05-14T12:03:56.984Z" }, - { url = "https://files.pythonhosted.org/packages/27/60/872e6e233b8c5e8b41413796ff18b7fe479661bd40147e071b450dfad7a1/fonttools-4.63.0-cp314-cp314-musllinux_1_2_aarch64.whl", hash = "sha256:bf00f21eb5fb721dbaf73d1e9da6d02a1af7768f2ebcf9798be98beab8ba90f6", size = 4962489, upload-time = "2026-05-14T12:03:59.443Z" }, - { url = "https://files.pythonhosted.org/packages/30/c4/83c24f2ec38b90cfda84bf4b1a1f49df80e84a1db4e7ac6e0d41bf23bc39/fonttools-4.63.0-cp314-cp314-musllinux_1_2_x86_64.whl", hash = "sha256:c1aaa4b9c75798400ac043ce04d74e7830376c85095a5a6ed7cba2f17a266bf4", size = 5071870, upload-time = "2026-05-14T12:04:02.122Z" }, - { url = "https://files.pythonhosted.org/packages/de/40/3ae22b60ff1d41ce0bd044b31238cdc72cef99f28b976f1e128ebd618c9b/fonttools-4.63.0-cp314-cp314-win32.whl", hash = "sha256:22693918177bd9ceabec4736d338045f357769416fc6b0b2508eefef75b08616", size = 2295026, upload-time = "2026-05-14T12:04:04.47Z" }, - { url = "https://files.pythonhosted.org/packages/c3/d4/98078064ccc76b45cb0f6c002452011e93c4bd26f6850344f0951cc1fe89/fonttools-4.63.0-cp314-cp314-win_amd64.whl", hash = "sha256:7d782fac32985914c351556f68ac0855391572bcd87de50e05970d3cd4c96fc5", size = 2347454, upload-time = "2026-05-14T12:04:06.752Z" }, - { url = "https://files.pythonhosted.org/packages/49/4e/652d1580c5f4e39f7d103b0c793e4773129ad633dce4addd0cf4dfebde02/fonttools-4.63.0-cp314-cp314t-macosx_10_15_universal2.whl", hash = "sha256:6db5140a60a5d731d21ec076745b40a310607731b0a565b50776393188649001", size = 2958152, upload-time = "2026-05-14T12:04:08.706Z" }, - { url = "https://files.pythonhosted.org/packages/0e/55/ad864c9a9b219f552eb46b32cd7906c466e5a578ba0c3abfcc0fe7413eb6/fonttools-4.63.0-cp314-cp314t-macosx_10_15_x86_64.whl", hash = "sha256:7d76edbff9014094dbf03bd2d074709dfa6ec7aba13d838c937a2b33d2d6a86e", size = 2460809, upload-time = "2026-05-14T12:04:10.783Z" }, - { url = "https://files.pythonhosted.org/packages/ea/2b/0aa8db70f18cf52e49b4ed5ecec68547f981160bf5ded3b5aed6faa0a6f9/fonttools-4.63.0-cp314-cp314t-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:0eac00b9118c3c2f87d272e45341871c5b3066baa3c86897fa634a7c3fb59096", size = 5148649, upload-time = "2026-05-14T12:04:12.747Z" }, - { url = "https://files.pythonhosted.org/packages/7f/63/18e4369c25043096f1048e0c9915951adc4f842bd81c6b18155824d6fa99/fonttools-4.63.0-cp314-cp314t-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:51394295f1a51de8b5f30bdb1e1b9a4231536c7064ef5c6e211eec19fa36036f", size = 4932147, upload-time = "2026-05-14T12:04:14.806Z" }, - { url = "https://files.pythonhosted.org/packages/a1/3f/67f3eac2ffd8a98446c5022f8ed3864eac878a5ff7af8df4c8286dba16cc/fonttools-4.63.0-cp314-cp314t-musllinux_1_2_aarch64.whl", hash = "sha256:9e12f105d2b6342c559c298afb674006bb2893afc7102dcf8a1b55b0486b4e40", size = 5027237, upload-time = "2026-05-14T12:04:17.675Z" }, - { url = "https://files.pythonhosted.org/packages/1a/ba/4e6214cb38a7b04779e97bb7636de9a5c7f20af7018d03dee0b64c08510a/fonttools-4.63.0-cp314-cp314t-musllinux_1_2_x86_64.whl", hash = "sha256:796f27556dbe094c4824f75ca85267e4df776c79036c8441469a4df37038c196", size = 5053933, upload-time = "2026-05-14T12:04:20.818Z" }, - { url = "https://files.pythonhosted.org/packages/34/3b/214dcc19ee31d3d38fb5ad2755c11ef0514e5dc300bbaf41c0b69f393799/fonttools-4.63.0-cp314-cp314t-win32.whl", hash = "sha256:948428a275741f0b64b113c955425a953314f4b9ab9997f73a72c83e68e569c8", size = 2359326, upload-time = "2026-05-14T12:04:24.22Z" }, - { url = "https://files.pythonhosted.org/packages/dd/1e/3ff1a9b523058c2eeb6a9d50f5574e2a738200d0d94107d5bc4105e8da3f/fonttools-4.63.0-cp314-cp314t-win_amd64.whl", hash = "sha256:6d4741eb179121cab9eea4cb2393d24492373a260d7945006358c08cfbf45419", size = 2425829, upload-time = "2026-05-14T12:04:26.829Z" }, - { url = "https://files.pythonhosted.org/packages/2c/47/c99d5268f354002ce80f8d029cd9d7d872969da1de8b93d32de4dc56d6f4/fonttools-4.63.0-py3-none-any.whl", hash = "sha256:445af2eab030a16b9171ea8bdda7ebf7d96bda2df88ee182a464252f6e05e20d", size = 1164562, upload-time = "2026-05-14T12:04:29.092Z" }, -] - [[package]] name = "frozenlist" version = "1.8.0" @@ -594,92 +478,6 @@ wheels = [ { url = "https://files.pythonhosted.org/packages/cb/b1/3846dd7f199d53cb17f49cba7e651e9ce294d8497c8c150530ed11865bb8/iniconfig-2.3.0-py3-none-any.whl", hash = "sha256:f631c04d2c48c52b84d0d0549c99ff3859c98df65b3101406327ecc7d53fbf12", size = 7484, upload-time = "2025-10-18T21:55:41.639Z" }, ] -[[package]] -name = "kiwisolver" -version = "1.5.0" -source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/d0/67/9c61eccb13f0bdca9307614e782fec49ffdde0f7a2314935d489fa93cd9c/kiwisolver-1.5.0.tar.gz", hash = "sha256:d4193f3d9dc3f6f79aaed0e5637f45d98850ebf01f7ca20e69457f3e8946b66a", size = 103482, upload-time = "2026-03-09T13:15:53.382Z" } -wheels = [ - { url = "https://files.pythonhosted.org/packages/4d/b2/818b74ebea34dabe6d0c51cb1c572e046730e64844da6ed646d5298c40ce/kiwisolver-1.5.0-cp312-cp312-macosx_10_13_universal2.whl", hash = "sha256:4e9750bc21b886308024f8a54ccb9a2cc38ac9fa813bf4348434e3d54f337ff9", size = 123158, upload-time = "2026-03-09T13:13:23.127Z" }, - { url = "https://files.pythonhosted.org/packages/bf/d9/405320f8077e8e1c5c4bd6adc45e1e6edf6d727b6da7f2e2533cf58bff71/kiwisolver-1.5.0-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:72ec46b7eba5b395e0a7b63025490d3214c11013f4aacb4f5e8d6c3041829588", size = 66388, upload-time = "2026-03-09T13:13:24.765Z" }, - { url = "https://files.pythonhosted.org/packages/99/9f/795fedf35634f746151ca8839d05681ceb6287fbed6cc1c9bf235f7887c2/kiwisolver-1.5.0-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:ed3a984b31da7481b103f68776f7128a89ef26ed40f4dc41a2223cda7fb24819", size = 64068, upload-time = "2026-03-09T13:13:25.878Z" }, - { url = "https://files.pythonhosted.org/packages/c4/13/680c54afe3e65767bed7ec1a15571e1a2f1257128733851ade24abcefbcc/kiwisolver-1.5.0-cp312-cp312-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:bb5136fb5352d3f422df33f0c879a1b0c204004324150cc3b5e3c4f310c9049f", size = 1477934, upload-time = "2026-03-09T13:13:27.166Z" }, - { url = "https://files.pythonhosted.org/packages/c8/2f/cebfcdb60fd6a9b0f6b47a9337198bcbad6fbe15e68189b7011fd914911f/kiwisolver-1.5.0-cp312-cp312-manylinux_2_24_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:b2af221f268f5af85e776a73d62b0845fc8baf8ef0abfae79d29c77d0e776aaf", size = 1278537, upload-time = "2026-03-09T13:13:28.707Z" }, - { url = "https://files.pythonhosted.org/packages/f2/0d/9b782923aada3fafb1d6b84e13121954515c669b18af0c26e7d21f579855/kiwisolver-1.5.0-cp312-cp312-manylinux_2_24_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:b0f172dc8ffaccb8522d7c5d899de00133f2f1ca7b0a49b7da98e901de87bf2d", size = 1296685, upload-time = "2026-03-09T13:13:30.528Z" }, - { url = "https://files.pythonhosted.org/packages/27/70/83241b6634b04fe44e892688d5208332bde130f38e610c0418f9ede47ded/kiwisolver-1.5.0-cp312-cp312-manylinux_2_24_s390x.manylinux_2_28_s390x.whl", hash = "sha256:6ab8ba9152203feec73758dad83af9a0bbe05001eb4639e547207c40cfb52083", size = 1346024, upload-time = "2026-03-09T13:13:32.818Z" }, - { url = "https://files.pythonhosted.org/packages/e4/db/30ed226fb271ae1a6431fc0fe0edffb2efe23cadb01e798caeb9f2ceae8f/kiwisolver-1.5.0-cp312-cp312-manylinux_2_39_riscv64.whl", hash = "sha256:cdee07c4d7f6d72008d3f73b9bf027f4e11550224c7c50d8df1ae4a37c1402a6", size = 987241, upload-time = "2026-03-09T13:13:34.435Z" }, - { url = "https://files.pythonhosted.org/packages/ec/bd/c314595208e4c9587652d50959ead9e461995389664e490f4dce7ff0f782/kiwisolver-1.5.0-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:7c60d3c9b06fb23bd9c6139281ccbdc384297579ae037f08ae90c69f6845c0b1", size = 2227742, upload-time = "2026-03-09T13:13:36.4Z" }, - { url = "https://files.pythonhosted.org/packages/c1/43/0499cec932d935229b5543d073c2b87c9c22846aab48881e9d8d6e742a2d/kiwisolver-1.5.0-cp312-cp312-musllinux_1_2_ppc64le.whl", hash = "sha256:e315e5ec90d88e140f57696ff85b484ff68bb311e36f2c414aa4286293e6dee0", size = 2323966, upload-time = "2026-03-09T13:13:38.204Z" }, - { url = "https://files.pythonhosted.org/packages/3d/6f/79b0d760907965acfd9d61826a3d41f8f093c538f55cd2633d3f0db269f6/kiwisolver-1.5.0-cp312-cp312-musllinux_1_2_riscv64.whl", hash = "sha256:1465387ac63576c3e125e5337a6892b9e99e0627d52317f3ca79e6930d889d15", size = 1977417, upload-time = "2026-03-09T13:13:39.966Z" }, - { url = "https://files.pythonhosted.org/packages/ab/31/01d0537c41cb75a551a438c3c7a80d0c60d60b81f694dac83dd436aec0d0/kiwisolver-1.5.0-cp312-cp312-musllinux_1_2_s390x.whl", hash = "sha256:530a3fd64c87cffa844d4b6b9768774763d9caa299e9b75d8eca6a4423b31314", size = 2491238, upload-time = "2026-03-09T13:13:41.698Z" }, - { url = "https://files.pythonhosted.org/packages/e4/34/8aefdd0be9cfd00a44509251ba864f5caf2991e36772e61c408007e7f417/kiwisolver-1.5.0-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:1d9daea4ea6b9be74fe2f01f7fbade8d6ffab263e781274cffca0dba9be9eec9", size = 2294947, upload-time = "2026-03-09T13:13:43.343Z" }, - { url = "https://files.pythonhosted.org/packages/ad/cf/0348374369ca588f8fe9c338fae49fa4e16eeb10ffb3d012f23a54578a9e/kiwisolver-1.5.0-cp312-cp312-win_amd64.whl", hash = "sha256:f18c2d9782259a6dc132fdc7a63c168cbc74b35284b6d75c673958982a378384", size = 73569, upload-time = "2026-03-09T13:13:45.792Z" }, - { url = "https://files.pythonhosted.org/packages/28/26/192b26196e2316e2bd29deef67e37cdf9870d9af8e085e521afff0fed526/kiwisolver-1.5.0-cp312-cp312-win_arm64.whl", hash = "sha256:f7c7553b13f69c1b29a5bde08ddc6d9d0c8bfb84f9ed01c30db25944aeb852a7", size = 64997, upload-time = "2026-03-09T13:13:46.878Z" }, - { url = "https://files.pythonhosted.org/packages/9d/69/024d6711d5ba575aa65d5538042e99964104e97fa153a9f10bc369182bc2/kiwisolver-1.5.0-cp313-cp313-macosx_10_13_universal2.whl", hash = "sha256:fd40bb9cd0891c4c3cb1ddf83f8bbfa15731a248fdc8162669405451e2724b09", size = 123166, upload-time = "2026-03-09T13:13:48.032Z" }, - { url = "https://files.pythonhosted.org/packages/ce/48/adbb40df306f587054a348831220812b9b1d787aff714cfbc8556e38fccd/kiwisolver-1.5.0-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:c0e1403fd7c26d77c1f03e096dc58a5c726503fa0db0456678b8668f76f521e3", size = 66395, upload-time = "2026-03-09T13:13:49.365Z" }, - { url = "https://files.pythonhosted.org/packages/a8/3a/d0a972b34e1c63e2409413104216cd1caa02c5a37cb668d1687d466c1c45/kiwisolver-1.5.0-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:dda366d548e89a90d88a86c692377d18d8bd64b39c1fb2b92cb31370e2896bbd", size = 64065, upload-time = "2026-03-09T13:13:50.562Z" }, - { url = "https://files.pythonhosted.org/packages/2b/0a/7b98e1e119878a27ba8618ca1e18b14f992ff1eda40f47bccccf4de44121/kiwisolver-1.5.0-cp313-cp313-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:332b4f0145c30b5f5ad9374881133e5aa64320428a57c2c2b61e9d891a51c2f3", size = 1477903, upload-time = "2026-03-09T13:13:52.084Z" }, - { url = "https://files.pythonhosted.org/packages/18/d8/55638d89ffd27799d5cc3d8aa28e12f4ce7a64d67b285114dbedc8ea4136/kiwisolver-1.5.0-cp313-cp313-manylinux_2_24_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:0c50b89ffd3e1a911c69a1dd3de7173c0cd10b130f56222e57898683841e4f96", size = 1278751, upload-time = "2026-03-09T13:13:54.673Z" }, - { url = "https://files.pythonhosted.org/packages/b8/97/b4c8d0d18421ecceba20ad8701358453b88e32414e6f6950b5a4bad54e65/kiwisolver-1.5.0-cp313-cp313-manylinux_2_24_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:4db576bb8c3ef9365f8b40fe0f671644de6736ae2c27a2c62d7d8a1b4329f099", size = 1296793, upload-time = "2026-03-09T13:13:56.287Z" }, - { url = "https://files.pythonhosted.org/packages/c4/10/f862f94b6389d8957448ec9df59450b81bec4abb318805375c401a1e6892/kiwisolver-1.5.0-cp313-cp313-manylinux_2_24_s390x.manylinux_2_28_s390x.whl", hash = "sha256:0b85aad90cea8ac6797a53b5d5f2e967334fa4d1149f031c4537569972596cb8", size = 1346041, upload-time = "2026-03-09T13:13:58.269Z" }, - { url = "https://files.pythonhosted.org/packages/a3/6a/f1650af35821eaf09de398ec0bc2aefc8f211f0cda50204c9f1673741ba9/kiwisolver-1.5.0-cp313-cp313-manylinux_2_39_riscv64.whl", hash = "sha256:d36ca54cb4c6c4686f7cbb7b817f66f5911c12ddb519450bbe86707155028f87", size = 987292, upload-time = "2026-03-09T13:13:59.871Z" }, - { url = "https://files.pythonhosted.org/packages/de/19/d7fb82984b9238115fe629c915007be608ebd23dc8629703d917dbfaffd4/kiwisolver-1.5.0-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:38f4a703656f493b0ad185211ccfca7f0386120f022066b018eb5296d8613e23", size = 2227865, upload-time = "2026-03-09T13:14:01.401Z" }, - { url = "https://files.pythonhosted.org/packages/7f/b9/46b7f386589fd222dac9e9de9c956ce5bcefe2ee73b4e79891381dda8654/kiwisolver-1.5.0-cp313-cp313-musllinux_1_2_ppc64le.whl", hash = "sha256:3ac2360e93cb41be81121755c6462cff3beaa9967188c866e5fce5cf13170859", size = 2324369, upload-time = "2026-03-09T13:14:02.972Z" }, - { url = "https://files.pythonhosted.org/packages/92/8b/95e237cf3d9c642960153c769ddcbe278f182c8affb20cecc1cc983e7cc5/kiwisolver-1.5.0-cp313-cp313-musllinux_1_2_riscv64.whl", hash = "sha256:c95cab08d1965db3d84a121f1c7ce7479bdd4072c9b3dafd8fecce48a2e6b902", size = 1977989, upload-time = "2026-03-09T13:14:04.503Z" }, - { url = "https://files.pythonhosted.org/packages/1b/95/980c9df53501892784997820136c01f62bc1865e31b82b9560f980c0e649/kiwisolver-1.5.0-cp313-cp313-musllinux_1_2_s390x.whl", hash = "sha256:fc20894c3d21194d8041a28b65622d5b86db786da6e3cfe73f0c762951a61167", size = 2491645, upload-time = "2026-03-09T13:14:06.106Z" }, - { url = "https://files.pythonhosted.org/packages/cb/32/900647fd0840abebe1561792c6b31e6a7c0e278fc3973d30572a965ca14c/kiwisolver-1.5.0-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:7a32f72973f0f950c1920475d5c5ea3d971b81b6f0ec53b8d0a956cc965f22e0", size = 2295237, upload-time = "2026-03-09T13:14:08.891Z" }, - { url = "https://files.pythonhosted.org/packages/be/8a/be60e3bbcf513cc5a50f4a3e88e1dcecebb79c1ad607a7222877becaa101/kiwisolver-1.5.0-cp313-cp313-win_amd64.whl", hash = "sha256:0bf3acf1419fa93064a4c2189ac0b58e3be7872bf6ee6177b0d4c63dc4cea276", size = 73573, upload-time = "2026-03-09T13:14:12.327Z" }, - { url = "https://files.pythonhosted.org/packages/4d/d2/64be2e429eb4fca7f7e1c52a91b12663aeaf25de3895e5cca0f47ef2a8d0/kiwisolver-1.5.0-cp313-cp313-win_arm64.whl", hash = "sha256:fa8eb9ecdb7efb0b226acec134e0d709e87a909fa4971a54c0c4f6e88635484c", size = 64998, upload-time = "2026-03-09T13:14:13.469Z" }, - { url = "https://files.pythonhosted.org/packages/b0/69/ce68dd0c85755ae2de490bf015b62f2cea5f6b14ff00a463f9d0774449ff/kiwisolver-1.5.0-cp313-cp313t-macosx_10_13_universal2.whl", hash = "sha256:db485b3847d182b908b483b2ed133c66d88d49cacf98fd278fadafe11b4478d1", size = 125700, upload-time = "2026-03-09T13:14:14.636Z" }, - { url = "https://files.pythonhosted.org/packages/74/aa/937aac021cf9d4349990d47eb319309a51355ed1dbdc9c077cdc9224cb11/kiwisolver-1.5.0-cp313-cp313t-macosx_10_13_x86_64.whl", hash = "sha256:be12f931839a3bdfe28b584db0e640a65a8bcbc24560ae3fdb025a449b3d754e", size = 67537, upload-time = "2026-03-09T13:14:15.808Z" }, - { url = "https://files.pythonhosted.org/packages/ee/20/3a87fbece2c40ad0f6f0aefa93542559159c5f99831d596050e8afae7a9f/kiwisolver-1.5.0-cp313-cp313t-macosx_11_0_arm64.whl", hash = "sha256:16b85d37c2cbb3253226d26e64663f755d88a03439a9c47df6246b35defbdfb7", size = 65514, upload-time = "2026-03-09T13:14:18.035Z" }, - { url = "https://files.pythonhosted.org/packages/f0/7f/f943879cda9007c45e1f7dba216d705c3a18d6b35830e488b6c6a4e7cdf0/kiwisolver-1.5.0-cp313-cp313t-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:4432b835675f0ea7414aab3d37d119f7226d24869b7a829caeab49ebda407b0c", size = 1584848, upload-time = "2026-03-09T13:14:19.745Z" }, - { url = "https://files.pythonhosted.org/packages/37/f8/4d4f85cc1870c127c88d950913370dd76138482161cd07eabbc450deff01/kiwisolver-1.5.0-cp313-cp313t-manylinux_2_24_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:1b0feb50971481a2cc44d94e88bdb02cdd497618252ae226b8eb1201b957e368", size = 1391542, upload-time = "2026-03-09T13:14:21.54Z" }, - { url = "https://files.pythonhosted.org/packages/04/0b/65dd2916c84d252b244bd405303220f729e7c17c9d7d33dca6feeff9ffc4/kiwisolver-1.5.0-cp313-cp313t-manylinux_2_24_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:56fa888f10d0f367155e76ce849fa1166fc9730d13bd2d65a2aa13b6f5424489", size = 1404447, upload-time = "2026-03-09T13:14:23.205Z" }, - { url = "https://files.pythonhosted.org/packages/39/5c/2606a373247babce9b1d056c03a04b65f3cf5290a8eac5d7bdead0a17e21/kiwisolver-1.5.0-cp313-cp313t-manylinux_2_24_s390x.manylinux_2_28_s390x.whl", hash = "sha256:940dda65d5e764406b9fb92761cbf462e4e63f712ab60ed98f70552e496f3bf1", size = 1455918, upload-time = "2026-03-09T13:14:24.74Z" }, - { url = "https://files.pythonhosted.org/packages/d5/d1/c6078b5756670658e9192a2ef11e939c92918833d2745f85cd14a6004bdf/kiwisolver-1.5.0-cp313-cp313t-manylinux_2_39_riscv64.whl", hash = "sha256:89fc958c702ee9a745e4700378f5d23fddbc46ff89e8fdbf5395c24d5c1452a3", size = 1072856, upload-time = "2026-03-09T13:14:26.597Z" }, - { url = "https://files.pythonhosted.org/packages/cb/c8/7def6ddf16eb2b3741d8b172bdaa9af882b03c78e9b0772975408801fa63/kiwisolver-1.5.0-cp313-cp313t-musllinux_1_2_aarch64.whl", hash = "sha256:9027d773c4ff81487181a925945743413f6069634d0b122d0b37684ccf4f1e18", size = 2333580, upload-time = "2026-03-09T13:14:28.237Z" }, - { url = "https://files.pythonhosted.org/packages/9e/87/2ac1fce0eb1e616fcd3c35caa23e665e9b1948bb984f4764790924594128/kiwisolver-1.5.0-cp313-cp313t-musllinux_1_2_ppc64le.whl", hash = "sha256:5b233ea3e165e43e35dba1d2b8ecc21cf070b45b65ae17dd2747d2713d942021", size = 2423018, upload-time = "2026-03-09T13:14:30.018Z" }, - { url = "https://files.pythonhosted.org/packages/67/13/c6700ccc6cc218716bfcda4935e4b2997039869b4ad8a94f364c5a3b8e63/kiwisolver-1.5.0-cp313-cp313t-musllinux_1_2_riscv64.whl", hash = "sha256:ce9bf03dad3b46408c08649c6fbd6ca28a9fce0eb32fdfffa6775a13103b5310", size = 2062804, upload-time = "2026-03-09T13:14:32.888Z" }, - { url = "https://files.pythonhosted.org/packages/1b/bd/877056304626943ff0f1f44c08f584300c199b887cb3176cd7e34f1515f1/kiwisolver-1.5.0-cp313-cp313t-musllinux_1_2_s390x.whl", hash = "sha256:fc4d3f1fb9ca0ae9f97b095963bc6326f1dbfd3779d6679a1e016b9baaa153d3", size = 2597482, upload-time = "2026-03-09T13:14:34.971Z" }, - { url = "https://files.pythonhosted.org/packages/75/19/c60626c47bf0f8ac5dcf72c6c98e266d714f2fbbfd50cf6dab5ede3aaa50/kiwisolver-1.5.0-cp313-cp313t-musllinux_1_2_x86_64.whl", hash = "sha256:f443b4825c50a51ee68585522ab4a1d1257fac65896f282b4c6763337ac9f5d2", size = 2394328, upload-time = "2026-03-09T13:14:36.816Z" }, - { url = "https://files.pythonhosted.org/packages/47/84/6a6d5e5bb8273756c27b7d810d47f7ef2f1f9b9fd23c9ee9a3f8c75c9cef/kiwisolver-1.5.0-cp313-cp313t-win_arm64.whl", hash = "sha256:893ff3a711d1b515ba9da14ee090519bad4610ed1962fbe298a434e8c5f8db53", size = 68410, upload-time = "2026-03-09T13:14:38.695Z" }, - { url = "https://files.pythonhosted.org/packages/e4/d7/060f45052f2a01ad5762c8fdecd6d7a752b43400dc29ff75cd47225a40fd/kiwisolver-1.5.0-cp314-cp314-macosx_10_15_universal2.whl", hash = "sha256:8df31fe574b8b3993cc61764f40941111b25c2d9fea13d3ce24a49907cd2d615", size = 123231, upload-time = "2026-03-09T13:14:41.323Z" }, - { url = "https://files.pythonhosted.org/packages/c2/a7/78da680eadd06ff35edef6ef68a1ad273bad3e2a0936c9a885103230aece/kiwisolver-1.5.0-cp314-cp314-macosx_10_15_x86_64.whl", hash = "sha256:1d49a49ac4cbfb7c1375301cd1ec90169dfeae55ff84710d782260ce77a75a02", size = 66489, upload-time = "2026-03-09T13:14:42.534Z" }, - { url = "https://files.pythonhosted.org/packages/49/b2/97980f3ad4fae37dd7fe31626e2bf75fbf8bdf5d303950ec1fab39a12da8/kiwisolver-1.5.0-cp314-cp314-macosx_11_0_arm64.whl", hash = "sha256:0cbe94b69b819209a62cb27bdfa5dc2a8977d8de2f89dfd97ba4f53ed3af754e", size = 64063, upload-time = "2026-03-09T13:14:44.759Z" }, - { url = "https://files.pythonhosted.org/packages/e7/f9/b06c934a6aa8bc91f566bd2a214fd04c30506c2d9e2b6b171953216a65b6/kiwisolver-1.5.0-cp314-cp314-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:80aa065ffd378ff784822a6d7c3212f2d5f5e9c3589614b5c228b311fd3063ac", size = 1475913, upload-time = "2026-03-09T13:14:46.247Z" }, - { url = "https://files.pythonhosted.org/packages/6b/f0/f768ae564a710135630672981231320bc403cf9152b5596ec5289de0f106/kiwisolver-1.5.0-cp314-cp314-manylinux_2_24_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:4e7f886f47ab881692f278ae901039a234e4025a68e6dfab514263a0b1c4ae05", size = 1282782, upload-time = "2026-03-09T13:14:48.458Z" }, - { url = "https://files.pythonhosted.org/packages/e2/9f/1de7aad00697325f05238a5f2eafbd487fb637cc27a558b5367a5f37fb7f/kiwisolver-1.5.0-cp314-cp314-manylinux_2_24_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:5060731cc3ed12ca3a8b57acd4aeca5bbc2f49216dd0bec1650a1acd89486bcd", size = 1300815, upload-time = "2026-03-09T13:14:50.721Z" }, - { url = "https://files.pythonhosted.org/packages/5a/c2/297f25141d2e468e0ce7f7a7b92e0cf8918143a0cbd3422c1ad627e85a06/kiwisolver-1.5.0-cp314-cp314-manylinux_2_24_s390x.manylinux_2_28_s390x.whl", hash = "sha256:7a4aa69609f40fce3cbc3f87b2061f042eee32f94b8f11db707b66a26461591a", size = 1347925, upload-time = "2026-03-09T13:14:52.304Z" }, - { url = "https://files.pythonhosted.org/packages/b9/d3/f4c73a02eb41520c47610207b21afa8cdd18fdbf64ffd94674ae21c4812d/kiwisolver-1.5.0-cp314-cp314-manylinux_2_39_riscv64.whl", hash = "sha256:d168fda2dbff7b9b5f38e693182d792a938c31db4dac3a80a4888de603c99554", size = 991322, upload-time = "2026-03-09T13:14:54.637Z" }, - { url = "https://files.pythonhosted.org/packages/7b/46/d3f2efef7732fcda98d22bf4ad5d3d71d545167a852ca710a494f4c15343/kiwisolver-1.5.0-cp314-cp314-musllinux_1_2_aarch64.whl", hash = "sha256:413b820229730d358efd838ecbab79902fe97094565fdc80ddb6b0a18c18a581", size = 2232857, upload-time = "2026-03-09T13:14:56.471Z" }, - { url = "https://files.pythonhosted.org/packages/3f/ec/2d9756bf2b6d26ae4349b8d3662fb3993f16d80c1f971c179ce862b9dbae/kiwisolver-1.5.0-cp314-cp314-musllinux_1_2_ppc64le.whl", hash = "sha256:5124d1ea754509b09e53738ec185584cc609aae4a3b510aaf4ed6aa047ef9303", size = 2329376, upload-time = "2026-03-09T13:14:58.072Z" }, - { url = "https://files.pythonhosted.org/packages/8f/9f/876a0a0f2260f1bde92e002b3019a5fabc35e0939c7d945e0fa66185eb20/kiwisolver-1.5.0-cp314-cp314-musllinux_1_2_riscv64.whl", hash = "sha256:e4415a8db000bf49a6dd1c478bf70062eaacff0f462b92b0ba68791a905861f9", size = 1982549, upload-time = "2026-03-09T13:14:59.668Z" }, - { url = "https://files.pythonhosted.org/packages/6c/4f/ba3624dfac23a64d54ac4179832860cb537c1b0af06024936e82ca4154a0/kiwisolver-1.5.0-cp314-cp314-musllinux_1_2_s390x.whl", hash = "sha256:d618fd27420381a4f6044faa71f46d8bfd911bd077c555f7138ed88729bfbe79", size = 2494680, upload-time = "2026-03-09T13:15:01.364Z" }, - { url = "https://files.pythonhosted.org/packages/39/b7/97716b190ab98911b20d10bf92eca469121ec483b8ce0edd314f51bc85af/kiwisolver-1.5.0-cp314-cp314-musllinux_1_2_x86_64.whl", hash = "sha256:5092eb5b1172947f57d6ea7d89b2f29650414e4293c47707eb499ec07a0ac796", size = 2297905, upload-time = "2026-03-09T13:15:03.925Z" }, - { url = "https://files.pythonhosted.org/packages/a3/36/4e551e8aa55c9188bca9abb5096805edbf7431072b76e2298e34fd3a3008/kiwisolver-1.5.0-cp314-cp314-win_amd64.whl", hash = "sha256:d76e2d8c75051d58177e762164d2e9ab92886534e3a12e795f103524f221dd8e", size = 75086, upload-time = "2026-03-09T13:15:07.775Z" }, - { url = "https://files.pythonhosted.org/packages/70/15/9b90f7df0e31a003c71649cf66ef61c3c1b862f48c81007fa2383c8bd8d7/kiwisolver-1.5.0-cp314-cp314-win_arm64.whl", hash = "sha256:fa6248cd194edff41d7ea9425ced8ca3a6f838bfb295f6f1d6e6bb694a8518df", size = 66577, upload-time = "2026-03-09T13:15:09.139Z" }, - { url = "https://files.pythonhosted.org/packages/17/01/7dc8c5443ff42b38e72731643ed7cf1ed9bf01691ae5cdca98501999ed83/kiwisolver-1.5.0-cp314-cp314t-macosx_10_15_universal2.whl", hash = "sha256:d1ffeb80b5676463d7a7d56acbe8e37a20ce725570e09549fe738e02ca6b7e1e", size = 125794, upload-time = "2026-03-09T13:15:10.525Z" }, - { url = "https://files.pythonhosted.org/packages/46/8a/b4ebe46ebaac6a303417fab10c2e165c557ddaff558f9699d302b256bc53/kiwisolver-1.5.0-cp314-cp314t-macosx_10_15_x86_64.whl", hash = "sha256:bc4d8e252f532ab46a1de9349e2d27b91fce46736a9eedaa37beaca66f574ed4", size = 67646, upload-time = "2026-03-09T13:15:12.016Z" }, - { url = "https://files.pythonhosted.org/packages/60/35/10a844afc5f19d6f567359bf4789e26661755a2f36200d5d1ed8ad0126e5/kiwisolver-1.5.0-cp314-cp314t-macosx_11_0_arm64.whl", hash = "sha256:6783e069732715ad0c3ce96dbf21dbc2235ab0593f2baf6338101f70371f4028", size = 65511, upload-time = "2026-03-09T13:15:13.311Z" }, - { url = "https://files.pythonhosted.org/packages/f8/8a/685b297052dd041dcebce8e8787b58923b6e78acc6115a0dc9189011c44b/kiwisolver-1.5.0-cp314-cp314t-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:e7c4c09a490dc4d4a7f8cbee56c606a320f9dc28cf92a7157a39d1ce7676a657", size = 1584858, upload-time = "2026-03-09T13:15:15.103Z" }, - { url = "https://files.pythonhosted.org/packages/9e/80/04865e3d4638ac5bddec28908916df4a3075b8c6cc101786a96803188b96/kiwisolver-1.5.0-cp314-cp314t-manylinux_2_24_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:2a075bd7bd19c70cf67c8badfa36cf7c5d8de3c9ddb8420c51e10d9c50e94920", size = 1392539, upload-time = "2026-03-09T13:15:16.661Z" }, - { url = "https://files.pythonhosted.org/packages/ba/01/77a19cacc0893fa13fafa46d1bba06fb4dc2360b3292baf4b56d8e067b24/kiwisolver-1.5.0-cp314-cp314t-manylinux_2_24_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:bdd3e53429ff02aa319ba59dfe4ceeec345bf46cf180ec2cf6fd5b942e7975e9", size = 1405310, upload-time = "2026-03-09T13:15:18.229Z" }, - { url = "https://files.pythonhosted.org/packages/53/39/bcaf5d0cca50e604cfa9b4e3ae1d64b50ca1ae5b754122396084599ef903/kiwisolver-1.5.0-cp314-cp314t-manylinux_2_24_s390x.manylinux_2_28_s390x.whl", hash = "sha256:3cdcb35dc9d807259c981a85531048ede628eabcffb3239adf3d17463518992d", size = 1456244, upload-time = "2026-03-09T13:15:20.444Z" }, - { url = "https://files.pythonhosted.org/packages/d0/7a/72c187abc6975f6978c3e39b7cf67aeb8b3c0a8f9790aa7fd412855e9e1f/kiwisolver-1.5.0-cp314-cp314t-manylinux_2_39_riscv64.whl", hash = "sha256:70d593af6a6ca332d1df73d519fddb5148edb15cd90d5f0155e3746a6d4fcc65", size = 1073154, upload-time = "2026-03-09T13:15:22.039Z" }, - { url = "https://files.pythonhosted.org/packages/c7/ca/cf5b25783ebbd59143b4371ed0c8428a278abe68d6d0104b01865b1bbd0f/kiwisolver-1.5.0-cp314-cp314t-musllinux_1_2_aarch64.whl", hash = "sha256:377815a8616074cabbf3f53354e1d040c35815a134e01d7614b7692e4bf8acfa", size = 2334377, upload-time = "2026-03-09T13:15:23.741Z" }, - { url = "https://files.pythonhosted.org/packages/4a/e5/b1f492adc516796e88751282276745340e2a72dcd0d36cf7173e0daf3210/kiwisolver-1.5.0-cp314-cp314t-musllinux_1_2_ppc64le.whl", hash = "sha256:0255a027391d52944eae1dbb5d4cc5903f57092f3674e8e544cdd2622826b3f0", size = 2425288, upload-time = "2026-03-09T13:15:25.789Z" }, - { url = "https://files.pythonhosted.org/packages/e6/e5/9b21fbe91a61b8f409d74a26498706e97a48008bfcd1864373d32a6ba31c/kiwisolver-1.5.0-cp314-cp314t-musllinux_1_2_riscv64.whl", hash = "sha256:012b1eb16e28718fa782b5e61dc6f2da1f0792ca73bd05d54de6cb9561665fc9", size = 2063158, upload-time = "2026-03-09T13:15:27.63Z" }, - { url = "https://files.pythonhosted.org/packages/b1/02/83f47986138310f95ea95531f851b2a62227c11cbc3e690ae1374fe49f0f/kiwisolver-1.5.0-cp314-cp314t-musllinux_1_2_s390x.whl", hash = "sha256:0e3aafb33aed7479377e5e9a82e9d4bf87063741fc99fc7ae48b0f16e32bdd6f", size = 2597260, upload-time = "2026-03-09T13:15:29.421Z" }, - { url = "https://files.pythonhosted.org/packages/07/18/43a5f24608d8c313dd189cf838c8e68d75b115567c6279de7796197cfb6a/kiwisolver-1.5.0-cp314-cp314t-musllinux_1_2_x86_64.whl", hash = "sha256:e7a116ae737f0000343218c4edf5bd45893bfeaff0993c0b215d7124c9f77646", size = 2394403, upload-time = "2026-03-09T13:15:31.517Z" }, - { url = "https://files.pythonhosted.org/packages/3b/b5/98222136d839b8afabcaa943b09bd05888c2d36355b7e448550211d1fca4/kiwisolver-1.5.0-cp314-cp314t-win_amd64.whl", hash = "sha256:1dd9b0b119a350976a6d781e7278ec7aca0b201e1a9e2d23d9804afecb6ca681", size = 79687, upload-time = "2026-03-09T13:15:33.204Z" }, - { url = "https://files.pythonhosted.org/packages/99/a2/ca7dc962848040befed12732dff6acae7fb3c4f6fc4272b3f6c9a30b8713/kiwisolver-1.5.0-cp314-cp314t-win_arm64.whl", hash = "sha256:58f812017cd2985c21fbffb4864d59174d4903dd66fa23815e74bbc7a0e2dd57", size = 70032, upload-time = "2026-03-09T13:15:34.411Z" }, - { url = "https://files.pythonhosted.org/packages/1c/fa/2910df836372d8761bb6eff7d8bdcb1613b5c2e03f260efe7abe34d388a7/kiwisolver-1.5.0-graalpy312-graalpy250_312_native-macosx_10_13_x86_64.whl", hash = "sha256:5ae8e62c147495b01a0f4765c878e9bfdf843412446a247e28df59936e99e797", size = 130262, upload-time = "2026-03-09T13:15:35.629Z" }, - { url = "https://files.pythonhosted.org/packages/0f/41/c5f71f9f00aabcc71fee8b7475e3f64747282580c2fe748961ba29b18385/kiwisolver-1.5.0-graalpy312-graalpy250_312_native-macosx_11_0_arm64.whl", hash = "sha256:f6764a4ccab3078db14a632420930f6186058750df066b8ea2a7106df91d3203", size = 138036, upload-time = "2026-03-09T13:15:36.894Z" }, - { url = "https://files.pythonhosted.org/packages/fa/06/7399a607f434119c6e1fdc8ec89a8d51ccccadf3341dee4ead6bd14caaf5/kiwisolver-1.5.0-graalpy312-graalpy250_312_native-manylinux_2_24_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:c31c13da98624f957b0fb1b5bae5383b2333c2c3f6793d9825dd5ce79b525cb7", size = 194295, upload-time = "2026-03-09T13:15:38.22Z" }, - { url = "https://files.pythonhosted.org/packages/b5/91/53255615acd2a1eaca307ede3c90eb550bae9c94581f8c00081b6b1c8f44/kiwisolver-1.5.0-graalpy312-graalpy250_312_native-win_amd64.whl", hash = "sha256:1f1489f769582498610e015a8ef2d36f28f505ab3096d0e16b4858a9ec214f57", size = 75987, upload-time = "2026-03-09T13:15:39.65Z" }, -] - [[package]] name = "markdown-it-py" version = "4.2.0" @@ -692,60 +490,6 @@ wheels = [ { url = "https://files.pythonhosted.org/packages/b3/81/4da04ced5a082363ecfa159c010d200ecbd959ae410c10c0264a38cac0f5/markdown_it_py-4.2.0-py3-none-any.whl", hash = "sha256:9f7ebbcd14fe59494226453aed97c1070d83f8d24b6fc3a3bcf9a38092641c4a", size = 91687, upload-time = "2026-05-07T12:08:27.182Z" }, ] -[[package]] -name = "matplotlib" -version = "3.11.1" -source = { registry = "https://pypi.org/simple" } -dependencies = [ - { name = "contourpy" }, - { name = "cycler" }, - { name = "fonttools" }, - { name = "kiwisolver" }, - { name = "numpy" }, - { name = "packaging" }, - { name = "pillow" }, - { name = "pyparsing" }, - { name = "python-dateutil" }, -] -sdist = { url = "https://files.pythonhosted.org/packages/49/64/f9a391af28f518b11ad45a8a712353c94a0aefce09d3703200e5c54b610a/matplotlib-3.11.1.tar.gz", hash = "sha256:69647db5746941c793d6e445a4cd349323ffb87d9cc958c2ad84a659b4832d30", size = 32612045, upload-time = "2026-07-18T03:39:46.63Z" } -wheels = [ - { url = "https://files.pythonhosted.org/packages/f2/6c/7ef7ebcb2bd9739b2b66b18b076e077f44bb46fdbe28ca0506edb3c62c79/matplotlib-3.11.1-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:e15ef41507f3d525f46154ac9e3ae785dacde9f20e593a25de8986267892ef74", size = 9453849, upload-time = "2026-07-18T03:38:19.593Z" }, - { url = "https://files.pythonhosted.org/packages/eb/f8/6d0c312c8d9738e7d9677f09fe5c986b3239e651a7b73a2deb38b65e4a71/matplotlib-3.11.1-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:21a67b961a6d597bca54fae826cd20695ba4a6e4d05424a08da6e13e3176fd6b", size = 9283113, upload-time = "2026-07-18T03:38:21.95Z" }, - { url = "https://files.pythonhosted.org/packages/c9/cf/b4ad2cc81b6672ea29ea04e64e350a9f9b493b0908ccd884c67eeff8f7b2/matplotlib-3.11.1-cp312-cp312-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:ba8f811b8ddfac493734d6af0b2dff96919d0c28ca0d641858dab4262777c6ea", size = 10035615, upload-time = "2026-07-18T03:38:24.315Z" }, - { url = "https://files.pythonhosted.org/packages/88/90/4e10e033d9b66589d8ed98b84c95cdbb57033d57c1f41339d7393dbd2f2e/matplotlib-3.11.1-cp312-cp312-manylinux_2_26_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:c52f7ad20ef476806ed212380b1d54d20310c8b86bdc2c9a68b51f0024a44472", size = 10842559, upload-time = "2026-07-18T03:38:26.285Z" }, - { url = "https://files.pythonhosted.org/packages/88/eb/799612d0f8cd3e816a10fec59329fca52cd2353264df80378dfc541ae855/matplotlib-3.11.1-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:8b14eb22961fe865efb0e4ff167e333e428908b00115a8d800ccb65ee108e481", size = 10927532, upload-time = "2026-07-18T03:38:28.532Z" }, - { url = "https://files.pythonhosted.org/packages/88/89/56649bbaa2fd12e20f3be03dbcc135b0c8676d88bac17977599e3eb442a0/matplotlib-3.11.1-cp312-cp312-win_amd64.whl", hash = "sha256:88a2a27dd9691ae448dfae4b26f59036be90c3c28757edd3553a29559d00859f", size = 9333886, upload-time = "2026-07-18T03:38:30.477Z" }, - { url = "https://files.pythonhosted.org/packages/c1/11/4d124efbbad677b7b7552f6f85a3bd432d4232f95400cea98fcd2ae36ef3/matplotlib-3.11.1-cp312-cp312-win_arm64.whl", hash = "sha256:480194afceca4df2f137c2721227d3cba67121fbf4397b69cee7f83714b0a58a", size = 9007545, upload-time = "2026-07-18T03:38:32.833Z" }, - { url = "https://files.pythonhosted.org/packages/04/6c/4798363b7fb5644e309fe1fac30216e9146c9f70859d80d588c18caf5317/matplotlib-3.11.1-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:6771b0cd7838c6a857a7209814158c0ad09bfef878db3033dd82d70ad101f191", size = 9454341, upload-time = "2026-07-18T03:38:35.001Z" }, - { url = "https://files.pythonhosted.org/packages/59/98/6acadbe7f98df19d274bc107ac58bb439fa75df82c33dc110d71a4a8501f/matplotlib-3.11.1-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:2abdee5ffa2fe11b2d19f7a5c63b785fb7c28cc46c7bc1814156341d9d1a33e1", size = 9283627, upload-time = "2026-07-18T03:38:37.061Z" }, - { url = "https://files.pythonhosted.org/packages/24/ea/65cec46fe241390ccea1b1754207ee28eb71c5ab866bd5f22fe47e538fa4/matplotlib-3.11.1-cp313-cp313-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:b0a19dcf73406d3746d25a5ed42d713604c9a3e024d129b102852b0d941cb9f3", size = 10035860, upload-time = "2026-07-18T03:38:39.663Z" }, - { url = "https://files.pythonhosted.org/packages/c7/10/63fdccccbabe002fb0960876baabc5e3f24d9c1bb4cfb25651457f74b3a0/matplotlib-3.11.1-cp313-cp313-manylinux_2_26_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:7389b77ed2ab0552f46d9a90b81b7b8e6dfcdc42adc36c37a0865799843e0e3e", size = 10843594, upload-time = "2026-07-18T03:38:42.144Z" }, - { url = "https://files.pythonhosted.org/packages/98/51/a1155945bff7b91381875022ac1522c5dfdac0d006be8e7df389b3134eae/matplotlib-3.11.1-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:c90be0b73568da4f662afac580956a76e308437e641b4a45aa08925eeb67d95f", size = 10927962, upload-time = "2026-07-18T03:38:44.302Z" }, - { url = "https://files.pythonhosted.org/packages/0d/3a/3d5e1f42dc761bf53401a62a83ff93389b37de9d2c093b2a3aa49ac34f1b/matplotlib-3.11.1-cp313-cp313-win_amd64.whl", hash = "sha256:68408341f2312836fbbdf6b3c78047f65b2d8752f5fd221c3e72d348f5b34f8b", size = 9334074, upload-time = "2026-07-18T03:38:46.616Z" }, - { url = "https://files.pythonhosted.org/packages/e2/db/3f5ea5a5b64060ef5e1ff60a19170423e41ce21b8497a6fe15a36e0b43e3/matplotlib-3.11.1-cp313-cp313-win_arm64.whl", hash = "sha256:0c1f44890d435c1b4ef52f701ad5828cb450ea97bcc83918fda6be74965d6cd2", size = 9007662, upload-time = "2026-07-18T03:38:49.112Z" }, - { url = "https://files.pythonhosted.org/packages/98/6e/c7ae5e0531425b69c0826b00ebbc264c85cab853f1cd6e096c9983c2cdc1/matplotlib-3.11.1-cp313-cp313t-macosx_10_13_x86_64.whl", hash = "sha256:5e510088c27a89d53580a752f959146893563e63c330e161d159b0fee652af6f", size = 9503790, upload-time = "2026-07-18T03:38:51.527Z" }, - { url = "https://files.pythonhosted.org/packages/92/79/15be162e0a2ed546939674e2e97d0e33ec2447d86d4d4e611fa295bb178c/matplotlib-3.11.1-cp313-cp313t-macosx_11_0_arm64.whl", hash = "sha256:1524e2bdd48a93557aa47ddcfe9c225dfdd57d5a01a5c49128c20f0632980ee1", size = 9336148, upload-time = "2026-07-18T03:38:53.564Z" }, - { url = "https://files.pythonhosted.org/packages/6a/7f/36ffe144fc4aacfe0e3ed2318f72b6755d1e73b041d619b4d393e60f5a66/matplotlib-3.11.1-cp313-cp313t-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:11664c551345553db92e61cae6cf1376f138f8c47cafdf13b64b18f3e3e9e464", size = 10049244, upload-time = "2026-07-18T03:38:55.911Z" }, - { url = "https://files.pythonhosted.org/packages/ab/5f/55812d68c0a840d3a463638f48c00ab1fe338518ec49a640cb6473b444af/matplotlib-3.11.1-cp313-cp313t-manylinux_2_26_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:5e1f8922ba31959cf6a9dfb51be64b7f7bc582801a3957dc0c2f3afcd3537adf", size = 10860798, upload-time = "2026-07-18T03:38:58.282Z" }, - { url = "https://files.pythonhosted.org/packages/7a/64/cca444b4eb5e6c768c44fc5e1f0b5211f20ca2b282778051996e996a2bdf/matplotlib-3.11.1-cp313-cp313t-musllinux_1_2_x86_64.whl", hash = "sha256:83235693abde86e5e0129998f80ee39fc7f58e6d56a88fafb28a9278833e9d5f", size = 10943282, upload-time = "2026-07-18T03:39:00.465Z" }, - { url = "https://files.pythonhosted.org/packages/e5/0f/a49c329d394f2e9ef38506982107e8b04ecf94dd41a9d8423ff82cc737c7/matplotlib-3.11.1-cp313-cp313t-win_amd64.whl", hash = "sha256:9a076f4fc5cdc43fdf510f5981418d25c2db4973418d9f22d8bb3dc8045ada78", size = 9383532, upload-time = "2026-07-18T03:39:02.468Z" }, - { url = "https://files.pythonhosted.org/packages/e4/50/103e86afb806d8f64d04ede14e4cfc09dbfc25f512421ff85fdd6ebd59cf/matplotlib-3.11.1-cp313-cp313t-win_arm64.whl", hash = "sha256:216fbb93a74add02ddb4cb38ef5348f59ac00b3e84567eaf16598772d40e150a", size = 9059665, upload-time = "2026-07-18T03:39:04.607Z" }, - { url = "https://files.pythonhosted.org/packages/35/04/3079499fa8cb661ea66d13d6439d5a3ae6710a7afd5c7f72e08914f275f8/matplotlib-3.11.1-cp314-cp314-macosx_10_15_x86_64.whl", hash = "sha256:30c492d4ba9448595b6fd8708c6725963f8148e25c0d8842948da5b05f0ee8d3", size = 9456022, upload-time = "2026-07-18T03:39:07.041Z" }, - { url = "https://files.pythonhosted.org/packages/53/a2/69acfe84ec1f32930e801a5782a07fc5c79c8c6599a507b806d859d5da8e/matplotlib-3.11.1-cp314-cp314-macosx_11_0_arm64.whl", hash = "sha256:ac104be2768ffdd8655db9e71b768cbb45f2b9aa7b450cf1595e8f65d3822319", size = 9285475, upload-time = "2026-07-18T03:39:09.562Z" }, - { url = "https://files.pythonhosted.org/packages/d3/b3/31b15a2ca56d4ddd6aaa1c884c2f51cf9a61cfaf5ca6f6fbd6343d38e6df/matplotlib-3.11.1-cp314-cp314-manylinux_2_26_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:6be943cb68bc6660ead58c55b3aa6366cba2ef7feb06460fbcce32360376f19f", size = 10847102, upload-time = "2026-07-18T03:39:11.532Z" }, - { url = "https://files.pythonhosted.org/packages/64/0d/a17e966e620545c1548125af0b29ac812dd17b197a18a7462ac12fa859ee/matplotlib-3.11.1-cp314-cp314-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:5af0dcda57d471440a7b5b623e70e0a61003518443d9098f211a96ecfbbc25be", size = 11131087, upload-time = "2026-07-18T03:39:13.764Z" }, - { url = "https://files.pythonhosted.org/packages/97/c5/5e100efdd67abb7de20befaa333612ef9bfc63417fb71398f904f25d083c/matplotlib-3.11.1-cp314-cp314-musllinux_1_2_x86_64.whl", hash = "sha256:3d3fd84082b1afbd9398466c81309e20045be20d48fe0fb18c43504d164cbbb2", size = 10929036, upload-time = "2026-07-18T03:39:16.888Z" }, - { url = "https://files.pythonhosted.org/packages/ce/04/d719a0a36930ecc8dfc801ff340f9dcfc4223f8ca5d39d06b4020032fff8/matplotlib-3.11.1-cp314-cp314-win_amd64.whl", hash = "sha256:9601a1e90be21e4884c53b4f3dc3ee0544654946f9975258d691f1c2e2f119c6", size = 9489571, upload-time = "2026-07-18T03:39:19.449Z" }, - { url = "https://files.pythonhosted.org/packages/48/65/facabdc2f1f6caba7e856db64dfedddca25f7608df07d96a1c8fd114fd3b/matplotlib-3.11.1-cp314-cp314-win_arm64.whl", hash = "sha256:ae30c6109848ac0f9fa36c5d6270938487614c47ba31860bd5361266dabc5685", size = 9164486, upload-time = "2026-07-18T03:39:21.424Z" }, - { url = "https://files.pythonhosted.org/packages/88/dd/18da6cd01cf96354534f98c468a25380c68ce582a2c9dd0cae12b04af4f2/matplotlib-3.11.1-cp314-cp314t-macosx_10_15_x86_64.whl", hash = "sha256:dadfe80797174e2984aae3be0b77594a3c72d2c0a40fbd4a0de48d2728caf3ae", size = 9504876, upload-time = "2026-07-18T03:39:23.633Z" }, - { url = "https://files.pythonhosted.org/packages/79/b0/f0b63555a18b79d038c81fd6126f35fc4dfce0eaff48d96103348c7cf935/matplotlib-3.11.1-cp314-cp314t-macosx_11_0_arm64.whl", hash = "sha256:89b193b255f4f6f7948dbcee3691f4f341ab05d9a8874a67b45ddb4182922eda", size = 9336120, upload-time = "2026-07-18T03:39:25.797Z" }, - { url = "https://files.pythonhosted.org/packages/c6/dd/f210ec7c4a6f198d5567237048a93d0811fb5a1f1691f13320e592f95b41/matplotlib-3.11.1-cp314-cp314t-manylinux_2_26_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:191163532cdefcb1571ca38a6d7e6474baccde64495783e6ba47aa07ec4b9bbb", size = 10858033, upload-time = "2026-07-18T03:39:27.999Z" }, - { url = "https://files.pythonhosted.org/packages/ec/d2/d6d5324507c5fbb316db48e258c09c2807f3de03d9af47017e120070926f/matplotlib-3.11.1-cp314-cp314t-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:9fdf1c818ab05d0e74002091ddaf414478a3a449ec9d51c8976d45be7e3a01e2", size = 11141827, upload-time = "2026-07-18T03:39:30.092Z" }, - { url = "https://files.pythonhosted.org/packages/0f/68/3c22e9320bdce2c4d2f1320643ef706db7a24cb7420eea28b97a2d67f5a8/matplotlib-3.11.1-cp314-cp314t-musllinux_1_2_x86_64.whl", hash = "sha256:b937b9dba5f5f6c1e31c47abe2186c865c0914fd18f2ce0dfc39c9adcef5951d", size = 10943061, upload-time = "2026-07-18T03:39:32.356Z" }, - { url = "https://files.pythonhosted.org/packages/f6/4a/907ed190ee81a9df581e0ed5456134fc0f7cb55ffcfda2f9e54ca900761c/matplotlib-3.11.1-cp314-cp314t-win_amd64.whl", hash = "sha256:f2912f647f3fbe1ccf085f91e213936f9101bead81a5e670565b1f1b3712f4fb", size = 9540074, upload-time = "2026-07-18T03:39:34.789Z" }, - { url = "https://files.pythonhosted.org/packages/23/d4/97c19b77e0a6e3b48581185bb65088f431cd20186076cc0f650a1757ea46/matplotlib-3.11.1-cp314-cp314t-win_arm64.whl", hash = "sha256:54d47b8ae8b579633a3902ca5b4ad6c1e132a5626d64447b2e22a66394e79987", size = 9213472, upload-time = "2026-07-18T03:39:37.141Z" }, -] - [[package]] name = "mdurl" version = "0.1.2" @@ -878,57 +622,6 @@ wheels = [ { url = "https://files.pythonhosted.org/packages/81/08/7036c080d7117f28a4af526d794aab6a84463126db031b007717c1a6676e/multidict-6.7.1-py3-none-any.whl", hash = "sha256:55d97cc6dae627efa6a6e548885712d4864b81110ac76fa4e534c03819fa4a56", size = 12319, upload-time = "2026-01-26T02:46:44.004Z" }, ] -[[package]] -name = "numpy" -version = "2.5.1" -source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/22/fd/89965aa4ac08c74998539fcbf24fa3540f3e15237fbeb6bcf9c908f4aade/numpy-2.5.1.tar.gz", hash = "sha256:a48a113e6afea91f5608793bafa7ef2ad481fefbda87ec5069f483de61cb9fa3", size = 20755553, upload-time = "2026-07-04T17:08:00.933Z" } -wheels = [ - { url = "https://files.pythonhosted.org/packages/62/7b/14687aa674250e5e546f616f486b0d56d3631cd5b2415739141ce40bdcea/numpy-2.5.1-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:2c889b56fe48b1018f764b0eec8df59ab654e9148aa91faa12596043500de277", size = 16801574, upload-time = "2026-07-04T17:06:12.423Z" }, - { url = "https://files.pythonhosted.org/packages/e1/19/cc5bb2a3f2913d27d6dbb2c78d25921fabaedc6741d4a5a615a11f3c5bf3/numpy-2.5.1-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:ab451b59c5643c570974c43aef780703ef1d3b4965d2be07afd530615a9358d1", size = 11772250, upload-time = "2026-07-04T17:06:15.726Z" }, - { url = "https://files.pythonhosted.org/packages/42/77/fdf34a71dd30f54979b18603bee915e0aaf825b07afe79acd60b04b691e2/numpy-2.5.1-cp312-cp312-macosx_14_0_arm64.whl", hash = "sha256:78798bd5b9ad744056af8efa90e3b9ddaa53272a0848a483084a1cc0a13b2dc0", size = 5331516, upload-time = "2026-07-04T17:06:17.913Z" }, - { url = "https://files.pythonhosted.org/packages/ce/e2/eb7efa015b4cce41e2517bf182a7fce0d7d5b9d9ed76a29bfa0f4fe4505c/numpy-2.5.1-cp312-cp312-macosx_14_0_x86_64.whl", hash = "sha256:2ae0ca40bcb22d6ba59c1dfd5446f49940b0f2d821fde133f10dda11f816b84e", size = 6664863, upload-time = "2026-07-04T17:06:20.02Z" }, - { url = "https://files.pythonhosted.org/packages/a9/4b/a2b32dd94ee9ffbeecb28152240042a3949db33b1c834d44090b80e1b3b8/numpy-2.5.1-cp312-cp312-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:61ac47e772e6b8ea489e1d2f441a34c5c3ac17327e7ce294cbdf535795ad4e75", size = 15167977, upload-time = "2026-07-04T17:06:21.621Z" }, - { url = "https://files.pythonhosted.org/packages/b8/a9/6e73d68500f80773f65f0654ea932019d6694329a0eb0ed0533de38df376/numpy-2.5.1-cp312-cp312-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:59fda5e192b570217ec2580c96f00e9a7e12ef6866a900eb089b62c1a32545ca", size = 16672469, upload-time = "2026-07-04T17:06:24.064Z" }, - { url = "https://files.pythonhosted.org/packages/24/7d/ad3e59015135f5261c95fd4cafeff159c955febd83a99a1d9250c4233815/numpy-2.5.1-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:f7119ebff1a9829e9f431a4f9d28e703023bb6b9fe7c8f724467dbfc27c94ab3", size = 16527531, upload-time = "2026-07-04T17:06:26.69Z" }, - { url = "https://files.pythonhosted.org/packages/83/d0/a39b2fbcde9cb17a1dac678f254b33a6336298af9df338824c685425d5e8/numpy-2.5.1-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:e824c2acf8862052246be5a44c15da1777940c60d010dd2aab897824d9c430f9", size = 18431940, upload-time = "2026-07-04T17:06:29.521Z" }, - { url = "https://files.pythonhosted.org/packages/04/12/cff070947791c1ed425ff76413189adbdc2fbe215eba7ce7fa454a03c7f8/numpy-2.5.1-cp312-cp312-win32.whl", hash = "sha256:08d60c810432eb83360958dea0999ac4cfb94531ea8efcbf0b7f277c2068aeb2", size = 6066764, upload-time = "2026-07-04T17:06:32.571Z" }, - { url = "https://files.pythonhosted.org/packages/65/66/53f31807a48a750f9d748da273bc3fcedd12b27ff1f3e373bfec55ef2dc0/numpy-2.5.1-cp312-cp312-win_amd64.whl", hash = "sha256:f7d60026c0bdb1380e83bfa7a0419c4577ee4b9a08880afcb6dadeb74c649fa2", size = 12430966, upload-time = "2026-07-04T17:06:34.926Z" }, - { url = "https://files.pythonhosted.org/packages/2b/2a/d1a88066b1c14186f5d3c0d18c94f17b064511982bab0578d49ee9d43c29/numpy-2.5.1-cp312-cp312-win_arm64.whl", hash = "sha256:17a25e09640602e10bc8de0e6fa2b3fd68eedd84ba6d7842dc8f32f9ab87bd0b", size = 10350488, upload-time = "2026-07-04T17:06:37.785Z" }, - { url = "https://files.pythonhosted.org/packages/eb/07/ec2a3f0c91761581d4b7104a740791800025983f9a4dc4e73f91a99aeac4/numpy-2.5.1-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:0bfebd8695f9863592fe744be833a258120b14a9f39da255e8aa8fade2c0ddd1", size = 16796419, upload-time = "2026-07-04T17:06:40.37Z" }, - { url = "https://files.pythonhosted.org/packages/ab/ab/ddb499fc4f8780354395face5b65c7fd107bcd6e1d667a5f07d046956f6f/numpy-2.5.1-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:30b44a6b53a7ae63c54c089a8726e5563ed302716c5b7ccc85afade40b0e7ff6", size = 11765832, upload-time = "2026-07-04T17:06:42.768Z" }, - { url = "https://files.pythonhosted.org/packages/88/b3/3c28c558a09fc72100c646dac6d2fce8e834c471b0edca01a29996706117/numpy-2.5.1-cp313-cp313-macosx_14_0_arm64.whl", hash = "sha256:6165343f81b56ef8f514f396989e529b61d9dc709b99421b07e9f3e698e2287d", size = 5325143, upload-time = "2026-07-04T17:06:45.466Z" }, - { url = "https://files.pythonhosted.org/packages/5e/0e/ce19b985bb15c596f4f05954e76cccc77c845083b3b8f938a6c68e523128/numpy-2.5.1-cp313-cp313-macosx_14_0_x86_64.whl", hash = "sha256:4939237038ada79308dda3204ac6462df056b5672b2e25db1149cf873668b3e1", size = 6659749, upload-time = "2026-07-04T17:06:47.288Z" }, - { url = "https://files.pythonhosted.org/packages/2e/20/1ee6614d64332a1bba6411f38e68cb79eec1b2459e20a623777c5c5492a2/numpy-2.5.1-cp313-cp313-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:1c6759f538fb912fc46de0a6b1758ccf7b57bc7c7ebebc23974fdac3de8db0cd", size = 15164716, upload-time = "2026-07-04T17:06:49.494Z" }, - { url = "https://files.pythonhosted.org/packages/ed/a7/2bcd3fdbb87804755c35b729bf8709d62025c5f4cfd7d5b2415997097515/numpy-2.5.1-cp313-cp313-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:9726558e8db4a5bf7929a70ae50f63abda4daf0efe810e3bfbab95976f75fc1a", size = 16661440, upload-time = "2026-07-04T17:06:52.061Z" }, - { url = "https://files.pythonhosted.org/packages/fc/d7/a41e3310c886fe457d36e670bbf24fae411aca8a7b6ad92a32afd924077c/numpy-2.5.1-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:3935f3b419b244a02732676fa5317a9193cc596a4c0646db07e5b421229ac9f7", size = 16526305, upload-time = "2026-07-04T17:06:54.605Z" }, - { url = "https://files.pythonhosted.org/packages/53/75/4333a9a707c1edd3a4e1a0c58eca52c0f31e55089fa80db02b5565b24df7/numpy-2.5.1-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:dc932a65ded7ce9013d120845a2514dcccb1a67bfc8deb8d37633762951904a6", size = 18423008, upload-time = "2026-07-04T17:06:57.54Z" }, - { url = "https://files.pythonhosted.org/packages/ee/90/e314a32b1c11a2ffe818ddad3a57b50b4b6e1b6c487192eb50cdef0415d0/numpy-2.5.1-cp313-cp313-win32.whl", hash = "sha256:4b4ff1608417eb7a59da7b967bbb798cacfe071d2caf526a24281cd562072ed9", size = 6063885, upload-time = "2026-07-04T17:07:00.14Z" }, - { url = "https://files.pythonhosted.org/packages/10/70/800b3fca480af32df9e8ea9f3d4a0c8feb4b32d7f195d174eabbda4829ad/numpy-2.5.1-cp313-cp313-win_amd64.whl", hash = "sha256:6c3fe51bc6a16453d452997053454f309e8e0ed7b42d6b361ce4ac8c32913d74", size = 12425674, upload-time = "2026-07-04T17:07:02.387Z" }, - { url = "https://files.pythonhosted.org/packages/8b/0b/196350c122f50f6ca56846f2d71efd5e0d24b7b2e07355e019b2e2c7a11e/numpy-2.5.1-cp313-cp313-win_arm64.whl", hash = "sha256:f7feb014281029e628ba2d5a007407443b06e418b6fe451d1e2adcbc8eba0107", size = 10350256, upload-time = "2026-07-04T17:07:04.878Z" }, - { url = "https://files.pythonhosted.org/packages/db/f4/731b6085a83faf6ca843394cbd5e217280c214399f7e8b21b9f552af0ae2/numpy-2.5.1-cp314-cp314-macosx_10_15_x86_64.whl", hash = "sha256:7c786fe9a5bbe360022e584c5a34cf6b54265c71bd7ec8ac3d8fec38968071f8", size = 16795063, upload-time = "2026-07-04T17:07:07.374Z" }, - { url = "https://files.pythonhosted.org/packages/bf/64/0e215f2048dd11a55bb989ed41b3585ef57452404e638d703a211a3e4157/numpy-2.5.1-cp314-cp314-macosx_11_0_arm64.whl", hash = "sha256:32985c896d897419ef8da6917872d80b78ad0ea26d85b23245c7366ffde76d75", size = 11776652, upload-time = "2026-07-04T17:07:09.907Z" }, - { url = "https://files.pythonhosted.org/packages/b5/59/2b844c7a6e9deff69b404a66221e1542937734f65d5e6e39411876053862/numpy-2.5.1-cp314-cp314-macosx_14_0_arm64.whl", hash = "sha256:efd736408cc97c79b9e6917338dfc8f06013b2274f992e96b1d9a81a71e2a2c2", size = 5335944, upload-time = "2026-07-04T17:07:12.227Z" }, - { url = "https://files.pythonhosted.org/packages/86/51/9bf7cb2cabcebc9e017e4ec7e6322b378317a542c08b4cb68479c1efc716/numpy-2.5.1-cp314-cp314-macosx_14_0_x86_64.whl", hash = "sha256:ab84dc6b074fa881cae55bea94cc4f68e285181ba7f32497bf7dee6b1496165b", size = 6656266, upload-time = "2026-07-04T17:07:14.368Z" }, - { url = "https://files.pythonhosted.org/packages/83/3e/fb7615b211b82a32f44d5180a6d421b61f84d4fadd578b48ba4ac34e189f/numpy-2.5.1-cp314-cp314-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:caf3e317d33d60c37986b452613f4ab51246d0691350c03d0cb4a898627f4a95", size = 15179720, upload-time = "2026-07-04T17:07:16.272Z" }, - { url = "https://files.pythonhosted.org/packages/41/5f/0f992cb24560673496c5d68de61913b57166ce530ffda07c1f280e0cc464/numpy-2.5.1-cp314-cp314-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:54ad769f17bc2d833b620851989f62054fb9ab93c969d9e1dc3c8e3d56beea21", size = 16664835, upload-time = "2026-07-04T17:07:19.021Z" }, - { url = "https://files.pythonhosted.org/packages/a2/2f/97d6475ee91afe2587797d09446f9d3e475ad4cb681662d824809327b75a/numpy-2.5.1-cp314-cp314-musllinux_1_2_aarch64.whl", hash = "sha256:c12afb53450fa976d4c681c50a7423729a4c51c0465ed9f32b8a9cabbc472373", size = 16539135, upload-time = "2026-07-04T17:07:22.015Z" }, - { url = "https://files.pythonhosted.org/packages/c4/5b/4db81e4ba0be7e2776b1de68c82aa862c7f8ec27e1b4927d4ae075e20678/numpy-2.5.1-cp314-cp314-musllinux_1_2_x86_64.whl", hash = "sha256:e8c11c405efc5ff6816d5983c96cdfa215bab3428961243af3ff59b228490438", size = 18426684, upload-time = "2026-07-04T17:07:24.941Z" }, - { url = "https://files.pythonhosted.org/packages/1f/64/c0ba2d90724d450279a7df8f32057241070250a26a7e2b5337d77347f481/numpy-2.5.1-cp314-cp314-win32.whl", hash = "sha256:f2479a47f8d5932d1718168a681ad6e536a9df484c83cfcf9de365e164537ace", size = 6116103, upload-time = "2026-07-04T17:07:27.622Z" }, - { url = "https://files.pythonhosted.org/packages/c1/1a/837f9ed7405adcd7a40538792eb169eddd8fa5630c16a1ef49dae71a30f4/numpy-2.5.1-cp314-cp314-win_amd64.whl", hash = "sha256:24d0eb82c0541d3415a33425db64ae439dffccd7b4dbcb30e7c35120205c506a", size = 12562177, upload-time = "2026-07-04T17:07:29.887Z" }, - { url = "https://files.pythonhosted.org/packages/22/ed/49707938b6dd0a78a9178dd93227dc89e4c11af47f5c798d70366e8d0483/numpy-2.5.1-cp314-cp314-win_arm64.whl", hash = "sha256:5a4c988b38d261deeeaad9954e3deb091ad905c94e8bb6708654ef1d97f286b0", size = 10627739, upload-time = "2026-07-04T17:07:32.568Z" }, - { url = "https://files.pythonhosted.org/packages/a6/c7/bb4b882cfe7f299cbc8b66e42e7dd78cf9d14e40f9469fc5e3db7e15b3bd/numpy-2.5.1-cp314-cp314t-macosx_11_0_arm64.whl", hash = "sha256:a33276be12fa045805f477f22482088b66bb758ffbe89a9d21457de863a32e22", size = 11894709, upload-time = "2026-07-04T17:07:34.941Z" }, - { url = "https://files.pythonhosted.org/packages/40/3f/5af7f4a7f6224aef48017aa82bb6174c7a659d724be0c75017b7e64a55b4/numpy-2.5.1-cp314-cp314t-macosx_14_0_arm64.whl", hash = "sha256:f089d7b00756190aacf1f5d34bdf38c3c430ac82b4f868f8cede73380460fce7", size = 5453810, upload-time = "2026-07-04T17:07:37.495Z" }, - { url = "https://files.pythonhosted.org/packages/20/c9/3474309bc94d634d3f9c3eddf03250ecb8c22cd948ef16fef69a77cc5d7b/numpy-2.5.1-cp314-cp314t-macosx_14_0_x86_64.whl", hash = "sha256:09e9bfd8d2cf479c7d174804fb3811c53a8e9f20a37444008606b57d6b7a826d", size = 6761189, upload-time = "2026-07-04T17:07:39.563Z" }, - { url = "https://files.pythonhosted.org/packages/90/8a/558ae39fdd55d7e7f7fef9a84a6e964ac6b23edbd2a07e52bb084500507d/numpy-2.5.1-cp314-cp314t-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:e68d8dd1e7eba712948f2053a29ec86917bc70ba1358df869d9f06649ef9cf09", size = 15225039, upload-time = "2026-07-04T17:07:41.682Z" }, - { url = "https://files.pythonhosted.org/packages/63/27/ca7392b2d030277bdf0273e7d23255b3ee57d57a7c170a6f4fb3981e1e5d/numpy-2.5.1-cp314-cp314t-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:99d5095fa265a0c4152e7bb12759e14381ef5496152f1ce58f44bdf55c44beb4", size = 16701306, upload-time = "2026-07-04T17:07:44.611Z" }, - { url = "https://files.pythonhosted.org/packages/02/42/03d53ae7996c44d4374a8262e9dc41671fd56cbb98f7d47ef85cf5da4c6b/numpy-2.5.1-cp314-cp314t-musllinux_1_2_aarch64.whl", hash = "sha256:ab87a91b3cc3382b8956095bd8f95e00cf679bb81554339be1a2ba404a1473c1", size = 16589955, upload-time = "2026-07-04T17:07:47.694Z" }, - { url = "https://files.pythonhosted.org/packages/7b/15/6c1784ae469640e65db111e9a34b3d0f14d91e8a38b9ce34810ced370dbb/numpy-2.5.1-cp314-cp314t-musllinux_1_2_x86_64.whl", hash = "sha256:224ca51130ef7da85bea2191625181cb4f337f9cb64b471f10c1a12aa8b60077", size = 18464252, upload-time = "2026-07-04T17:07:50.684Z" }, - { url = "https://files.pythonhosted.org/packages/94/a8/f98e50356cf167df656c526c2dfeec2d7dde182f2a3da4b458a5938e2776/numpy-2.5.1-cp314-cp314t-win32.whl", hash = "sha256:6eab239876581b2b3c5a242281b6007bbdbcd1c7085d7709bb57c5929b11e6bf", size = 6263298, upload-time = "2026-07-04T17:07:53.445Z" }, - { url = "https://files.pythonhosted.org/packages/72/ac/96ae880cdecad0b3275d9359fcec72667b49a4863c9f12942e43679dda02/numpy-2.5.1-cp314-cp314t-win_amd64.whl", hash = "sha256:83ce9c80d5b521b0d77ddcbe5447c218d247929b6cc056ca5351342accfff0af", size = 12748623, upload-time = "2026-07-04T17:07:55.384Z" }, - { url = "https://files.pythonhosted.org/packages/a1/5a/4d2b1601df3602dba7a14f3348ba9bfe94a18adb428e693df6154c293831/numpy-2.5.1-cp314-cp314t-win_arm64.whl", hash = "sha256:5a6db61f9aaa57e369905c67d852045d3c4f7126405b29d09b19dec118e9c9cb", size = 10697674, upload-time = "2026-07-04T17:07:58.506Z" }, -] - [[package]] name = "packaging" version = "26.2" @@ -938,77 +631,6 @@ wheels = [ { url = "https://files.pythonhosted.org/packages/df/b2/87e62e8c3e2f4b32e5fe99e0b86d576da1312593b39f47d8ceef365e95ed/packaging-26.2-py3-none-any.whl", hash = "sha256:5fc45236b9446107ff2415ce77c807cee2862cb6fac22b8a73826d0693b0980e", size = 100195, upload-time = "2026-04-24T20:15:22.081Z" }, ] -[[package]] -name = "pillow" -version = "12.3.0" -source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/1c/3d/bb7fca845737cf9d7dbde16ed1843984665ff2e0a518f5db43e77ec540b9/pillow-12.3.0.tar.gz", hash = "sha256:3b8182a766685eaa002637e28b4ec8d6b18819a0c71f579bf0dbaa5830297cce", size = 47025035, upload-time = "2026-07-01T11:56:38.965Z" } -wheels = [ - { url = "https://files.pythonhosted.org/packages/37/bf/fb3ebff8ddcb76aac5a01389251bbbb9519922a9b520d8247c1ca864a25d/pillow-12.3.0-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:ba09209fbe443b4acccebe845d8a138b89a8f4fbaeedd44953490b5315d5e965", size = 5345969, upload-time = "2026-07-01T11:54:06.397Z" }, - { url = "https://files.pythonhosted.org/packages/d8/66/9a386a92561f402389a4fc70c18838bf6d35eb5eb5c6850b4b2dc64f5048/pillow-12.3.0-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:ffd0c5368496f41b0944be820fcb7a838aa6e623d250b01acf2643939c3f99d7", size = 4780323, upload-time = "2026-07-01T11:54:09.351Z" }, - { url = "https://files.pythonhosted.org/packages/25/27/ac8f99618ffd3dde21db0f4d4b1d2ab00c0880595bfd17df103f7f39fd0c/pillow-12.3.0-cp312-cp312-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:d9c7f76c0673154f044e9d78c8655fb4213f6ca31a836df48b40fe5d187717b9", size = 6266838, upload-time = "2026-07-01T11:54:11.71Z" }, - { url = "https://files.pythonhosted.org/packages/84/21/a35af28dcc61f37ed850a2d64c65c701321dfbf25085e469d5559360cbbf/pillow-12.3.0-cp312-cp312-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:78cb2c6865a35ab8ff8b75fd122f6033b92a62c82801110e48ddd6c936a45d91", size = 6940830, upload-time = "2026-07-01T11:54:13.732Z" }, - { url = "https://files.pythonhosted.org/packages/eb/51/8b08617af3ad95e33ce6d7dd2c99ed6c8298f7fb131636303956be022e25/pillow-12.3.0-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:e491916b378fba47242221bb9ead245211b70d504f495d105d17b14a24b4907c", size = 6344383, upload-time = "2026-07-01T11:54:15.756Z" }, - { url = "https://files.pythonhosted.org/packages/1d/72/cf78ac9780bb93c28328f408973845a309d4d145041665f734572ced1b52/pillow-12.3.0-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:0dd2064cbc55aaec028ef5fbb60fa47bb6c3e7918e07ff17935284b227a9d2df", size = 7052934, upload-time = "2026-07-01T11:54:17.721Z" }, - { url = "https://files.pythonhosted.org/packages/20/20/25e0f4dc178a6bc0696793720055519a0de89e7661dae886992decbd2f81/pillow-12.3.0-cp312-cp312-win32.whl", hash = "sha256:dbce0b29841537a2fa4a214c2bbf14de3587c9680caa9b4e217568472490b28f", size = 6472684, upload-time = "2026-07-01T11:54:19.839Z" }, - { url = "https://files.pythonhosted.org/packages/45/89/da2f7971a317f83d807fdd4065c0af40208e59e692cc43d315a71a0e96d1/pillow-12.3.0-cp312-cp312-win_amd64.whl", hash = "sha256:a2b55dd6b2a4c4b7d87ffa56bdb33fdc5fdb9a462173861a7bc097f17d91cb09", size = 7227137, upload-time = "2026-07-01T11:54:22.025Z" }, - { url = "https://files.pythonhosted.org/packages/de/47/4845a0a6c0dbf1db8456bd9fc791f13c5ced7ced20606d08a0aacfd25b49/pillow-12.3.0-cp312-cp312-win_arm64.whl", hash = "sha256:331b624368d4f1d069149002f25f44bc61c8919ce8ddb3c45bdad8f6e2d89510", size = 2568267, upload-time = "2026-07-01T11:54:24.051Z" }, - { url = "https://files.pythonhosted.org/packages/9d/ac/31fb64e1e7efb5a4b50cd3d92049ba89ac6e4d8d3bb6a74e15048ca3353e/pillow-12.3.0-cp313-cp313-ios_13_0_arm64_iphoneos.whl", hash = "sha256:21900ce7ba264168cd50defae43cd75d25c833ad4ad6e73ffc5596d12e25ac89", size = 4161684, upload-time = "2026-07-01T11:54:25.934Z" }, - { url = "https://files.pythonhosted.org/packages/87/b4/9805e23d2b4d77842b468513841fda254ee42f0289d25088340e4ff46e2d/pillow-12.3.0-cp313-cp313-ios_13_0_arm64_iphonesimulator.whl", hash = "sha256:4e8c2a84d977f50b9daed6eeaf3baef67d00d5d74d932288f02cb94518ee3ace", size = 4255487, upload-time = "2026-07-01T11:54:27.935Z" }, - { url = "https://files.pythonhosted.org/packages/df/39/ecf519435a200c693fe053a6ee4d835b41cf963a4dfc2551c4e637cb2a71/pillow-12.3.0-cp313-cp313-ios_13_0_x86_64_iphonesimulator.whl", hash = "sha256:ae26d61dfa7a47befdc7572b521024e8745f3d809bd95ca9505a7bba9ef849ec", size = 3696433, upload-time = "2026-07-01T11:54:29.813Z" }, - { url = "https://files.pythonhosted.org/packages/42/92/2fc3ffad878ae8dd5469ec1bc8eb83b71f48e13efdf68f02709003982a32/pillow-12.3.0-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:7a743ff716f746fc19a9557f60dab1600d4613255f8a7aeb3cdde4db7eb15a66", size = 5345889, upload-time = "2026-07-01T11:54:31.97Z" }, - { url = "https://files.pythonhosted.org/packages/10/76/8803c13605b763d33d156c4678fc77f8443389c0c51c8aef707bb02015f4/pillow-12.3.0-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:d69141514cc30b774ceea5e3ed3a6635c8d8a96edf664689b890f4089111fb35", size = 4780109, upload-time = "2026-07-01T11:54:34.026Z" }, - { url = "https://files.pythonhosted.org/packages/1f/01/e18aff37cb0b4aac47ac90f016d347a49aca667ef97f190b06ac2aabc928/pillow-12.3.0-cp313-cp313-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:f7401aebd7f581d7f83a439d87d474999317ee099218e5ad25d125290990ba65", size = 6263736, upload-time = "2026-07-01T11:54:36.131Z" }, - { url = "https://files.pythonhosted.org/packages/f7/62/de5bdd77d935331f4f802edc11e4d82950f642caad6cb2f949837b8560e2/pillow-12.3.0-cp313-cp313-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:0847a763afefb695bc912d7c131e7e0632d4edc1d8698f58ddabec8e46b8b6d3", size = 6937129, upload-time = "2026-07-01T11:54:38.216Z" }, - { url = "https://files.pythonhosted.org/packages/70/4d/105627a13300c5e0df1d174230b32fd1273062c96f7745fd552b945d1e1d/pillow-12.3.0-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:571b9fcb07b97ef3a492028fb3d2dc0993ca23a06138b0315286566d29ef718a", size = 6339562, upload-time = "2026-07-01T11:54:40.354Z" }, - { url = "https://files.pythonhosted.org/packages/6b/1d/f13de01a553988ab895ba1c722e06cf3144d4f57656fd5b81b6d881f1179/pillow-12.3.0-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:756c768d0c9c2955feb7a56c37ea24aea2e369f8d36a88da270b6a9f19e62b5e", size = 7049439, upload-time = "2026-07-01T11:54:42.489Z" }, - { url = "https://files.pythonhosted.org/packages/c9/f9/066794cca041b969964f779ee5fa66a9498bbf34248ac39c5d7954e4198f/pillow-12.3.0-cp313-cp313-win32.whl", hash = "sha256:a876864214e136f0eb367788dbd7df045f4806801518e2cfe9e13229cfe06d8f", size = 6473287, upload-time = "2026-07-01T11:54:44.9Z" }, - { url = "https://files.pythonhosted.org/packages/a6/9b/7a58e61d62be561da3a356fe2384d4059a6345fc130e23ef1c36a5b81d24/pillow-12.3.0-cp313-cp313-win_amd64.whl", hash = "sha256:1cca606cd25738df4ed873d5ad46bbdb3d83b5cbca291f6b4ff13a4df6b0bbe8", size = 7239691, upload-time = "2026-07-01T11:54:47.141Z" }, - { url = "https://files.pythonhosted.org/packages/aa/b0/c4ed4f0ef8f8fa5ee8351537db6650bb8189f7e118842978dd6589065692/pillow-12.3.0-cp313-cp313-win_arm64.whl", hash = "sha256:b629de27fda84b42cde7edef0d85f13b958b47f6e9bbcbba9b673c562a89bd8b", size = 2568185, upload-time = "2026-07-01T11:54:49.137Z" }, - { url = "https://files.pythonhosted.org/packages/dc/01/001f65b68192f0228cc1dbbc8d2530ab5d58b61037ba0587f946fea607cd/pillow-12.3.0-cp314-cp314-ios_13_0_arm64_iphoneos.whl", hash = "sha256:9cf95fe4d0f84c82d282745d9bb08ad9f926efa00be4697e767b814ce40d4330", size = 4161736, upload-time = "2026-07-01T11:54:51.156Z" }, - { url = "https://files.pythonhosted.org/packages/1a/d2/0219746d0fd16fc8a84498e79452375be3797d3ce4044596ce565164b84f/pillow-12.3.0-cp314-cp314-ios_13_0_arm64_iphonesimulator.whl", hash = "sha256:8728f216dcdb6e6d555cf971cb34076139ad74b31fc2c14da4fafc741c5f6217", size = 4255435, upload-time = "2026-07-01T11:54:53.414Z" }, - { url = "https://files.pythonhosted.org/packages/c8/02/8d0bc62ef0302318c46ff2a512822d2610e81c7aa46c9b3abe6cbaca5ad0/pillow-12.3.0-cp314-cp314-ios_13_0_x86_64_iphonesimulator.whl", hash = "sha256:a45650e8ce7fafffd731db8550230db6b0d306d181a90b67d3e6bca2f1990930", size = 3696262, upload-time = "2026-07-01T11:54:55.739Z" }, - { url = "https://files.pythonhosted.org/packages/85/e2/73c77d218410b14f5f2d565e8a998d5317b7b9c75368d29985139f7a46f0/pillow-12.3.0-cp314-cp314-macosx_10_15_x86_64.whl", hash = "sha256:ba54cfebe86920a559a7c4d6b9050791c20513650a1952ebe3368c7dc70306f8", size = 5350344, upload-time = "2026-07-01T11:54:57.657Z" }, - { url = "https://files.pythonhosted.org/packages/c7/da/32c752228ae345f489e3a42499d817b6c3996da7e8a3bc7a04fc806b243b/pillow-12.3.0-cp314-cp314-macosx_11_0_arm64.whl", hash = "sha256:e158cb00350dc278f3b91551101aa7d12415a66ebf2c91d8d5ac14e56ddd3ad0", size = 4780131, upload-time = "2026-07-01T11:54:59.713Z" }, - { url = "https://files.pythonhosted.org/packages/b1/9d/8b2c807dbef61a5197c047afe99823787eb66f63daf9fb2432f91d6f0462/pillow-12.3.0-cp314-cp314-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:e9aeb04d6aef139de265b29683e119b638208f88cf73cdd1658aa07221165321", size = 6263757, upload-time = "2026-07-01T11:55:01.778Z" }, - { url = "https://files.pythonhosted.org/packages/5c/44/c85361f65dbe00eea8576ee467c768d25129989efb76e94f205e9ca9bb46/pillow-12.3.0-cp314-cp314-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:251bf95b67017e27b13d82f5b326234ca62d70f9cf4c2b9032de2358a3b12c7b", size = 6936962, upload-time = "2026-07-01T11:55:03.93Z" }, - { url = "https://files.pythonhosted.org/packages/18/7e/e483414b35800b86b6f08dbbc7803fb5cd52c4d6f897f47d53ea2c7e6f65/pillow-12.3.0-cp314-cp314-musllinux_1_2_aarch64.whl", hash = "sha256:fe3cca2e4e8a592be0f269a1ca4835c25199d9f3ce815c8491048f785b0a0198", size = 6339171, upload-time = "2026-07-01T11:55:05.989Z" }, - { url = "https://files.pythonhosted.org/packages/f0/f4/68c491844841ede6bed70189546b3ee9731cf9f2cbad396faff5e1ccba45/pillow-12.3.0-cp314-cp314-musllinux_1_2_x86_64.whl", hash = "sha256:23aceaa007d6172b02c277f0cd359c79492bbb14f7072b4ede9fbcaf20648130", size = 7048116, upload-time = "2026-07-01T11:55:08.131Z" }, - { url = "https://files.pythonhosted.org/packages/a3/34/77f3f793fed8efc7d243f21b33c5a3f0d1c97ee70346d3db855587e155ff/pillow-12.3.0-cp314-cp314-win32.whl", hash = "sha256:af8d94b0db561cf68b88a267c5c44b49e134f525d0dc2cb7ed413a66bc23559a", size = 6467209, upload-time = "2026-07-01T11:55:10.408Z" }, - { url = "https://files.pythonhosted.org/packages/f1/e0/492879f69d94f91f60fc8cd05ba03650e9520afebb2fb7aa12777d7c7f38/pillow-12.3.0-cp314-cp314-win_amd64.whl", hash = "sha256:fdafc9cce40277e0f7a0feabce0ee50dd2fa1800f3b38015e51296b5e814048d", size = 7237707, upload-time = "2026-07-01T11:55:12.745Z" }, - { url = "https://files.pythonhosted.org/packages/c9/ac/6b11f2875f1c2ac040d84e1bbf9cf22a88038f901ca1037898b280b38365/pillow-12.3.0-cp314-cp314-win_arm64.whl", hash = "sha256:e91206ee562682b51b98ef4b26a6ef48fd84e15fd4c4bc5ec768eb641d206838", size = 2565995, upload-time = "2026-07-01T11:55:14.736Z" }, - { url = "https://files.pythonhosted.org/packages/52/69/c2208e56af9bfc1913afb24020297a691eb1d4ef688474c8a04913f65e04/pillow-12.3.0-cp314-cp314t-macosx_10_15_x86_64.whl", hash = "sha256:164b31cd1a0490ab6efae01aa5df49da7061be0af1b30e035b6e9a1bfe34ee6e", size = 5352503, upload-time = "2026-07-01T11:55:17.076Z" }, - { url = "https://files.pythonhosted.org/packages/07/70/e5686d753e898a45d778ff1718dba8516ead6ab6b95d85fc8c4b70650cf2/pillow-12.3.0-cp314-cp314t-macosx_11_0_arm64.whl", hash = "sha256:5afb51d599ea772b8365ae807ae557f18bccfe46ab261fd1c2a9ed700fc6eb17", size = 4782956, upload-time = "2026-07-01T11:55:19.448Z" }, - { url = "https://files.pythonhosted.org/packages/d5/37/25c6692f06927ee973ff18c8d9ee98ad0b4d84ee67a09610c2dd1447958e/pillow-12.3.0-cp314-cp314t-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:3edce1d53195db527e0191f84b71d02022de0540bf43a16ed734ed7537b07385", size = 6322855, upload-time = "2026-07-01T11:55:21.613Z" }, - { url = "https://files.pythonhosted.org/packages/cc/91/420637fcb8f1bc11029e403b4538e6694744428d8246118e45719f944556/pillow-12.3.0-cp314-cp314t-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:bf16ba1b4d0b6b7c8e534936632270cf70eb00dbe09005bc345b2677b726855c", size = 6989642, upload-time = "2026-07-01T11:55:24.006Z" }, - { url = "https://files.pythonhosted.org/packages/10/08/b94d7811281ccf0d143a1cf768d1c49e1e54af63e7b708ab2ee3eb87face/pillow-12.3.0-cp314-cp314t-musllinux_1_2_aarch64.whl", hash = "sha256:24870b09b224f7ae3c39ed07d10e819d06f8720bc551847b1d623832b5b0e28d", size = 6391281, upload-time = "2026-07-01T11:55:26.252Z" }, - { url = "https://files.pythonhosted.org/packages/d2/87/24233f785f55474dc02ce3e739c5528a77e3a862e9333d1dd7a25cc31f70/pillow-12.3.0-cp314-cp314t-musllinux_1_2_x86_64.whl", hash = "sha256:30f2aa603c41533cc25c05acd0da21636e84a315768feb631c937177db558931", size = 7096716, upload-time = "2026-07-01T11:55:28.318Z" }, - { url = "https://files.pythonhosted.org/packages/23/26/fcb2f6e37175b04f53570b59937867e2b80ee1685e744023153028fc14f9/pillow-12.3.0-cp314-cp314t-win32.whl", hash = "sha256:4b0a7fe987b14c31ebda6083f74f22b561fd3739bc0ac51e019622e3d72668c7", size = 6474125, upload-time = "2026-07-01T11:55:30.956Z" }, - { url = "https://files.pythonhosted.org/packages/90/de/3634abee5f1c9e13c56787b7d5517b0ba8d6de51700b95578cf338349c9f/pillow-12.3.0-cp314-cp314t-win_amd64.whl", hash = "sha256:962864dc93511324d51ddbb5b9f8731bf71675b93ca612a07441896f4688fb8c", size = 7242939, upload-time = "2026-07-01T11:55:34.044Z" }, - { url = "https://files.pythonhosted.org/packages/ce/2a/fd13f8eb24de5714a6eb444a3d67e2842c6c576e159a43793adf23051351/pillow-12.3.0-cp314-cp314t-win_arm64.whl", hash = "sha256:0740a512dc522224c77d9aa5a8d70d8b7d73fb91f2c21125d8d025d3b8990e45", size = 2567506, upload-time = "2026-07-01T11:55:35.988Z" }, - { url = "https://files.pythonhosted.org/packages/5d/dc/8fdce34ec725a33c81c6ba122b904d6b9024e50ea9ac7bede62fab54506c/pillow-12.3.0-cp315-cp315-ios_13_0_arm64_iphoneos.whl", hash = "sha256:0feb2e9d6ad6c9e3c06effe9d00f3f1e618a6643273576b016f591e9315a7139", size = 4162063, upload-time = "2026-07-01T11:55:37.941Z" }, - { url = "https://files.pythonhosted.org/packages/76/66/2044b9a63d3b84ff048228dfcb7cd9bf0df983e8470971bf7d4c57b693de/pillow-12.3.0-cp315-cp315-ios_13_0_arm64_iphonesimulator.whl", hash = "sha256:9e881fca225083806662a5c43d627d215f258ff43c890f831966c7d7ba9c7402", size = 4255549, upload-time = "2026-07-01T11:55:40.022Z" }, - { url = "https://files.pythonhosted.org/packages/52/7e/1f67e6f4ece6b582ee4b539decbcc9f848dc245a93ed8cd7338bafef72f1/pillow-12.3.0-cp315-cp315-ios_13_0_x86_64_iphonesimulator.whl", hash = "sha256:4998562bf62a445225f22e07c896bb04b35b1b1f2eb6d760584c9c51d7a5f78c", size = 3696331, upload-time = "2026-07-01T11:55:41.98Z" }, - { url = "https://files.pythonhosted.org/packages/12/40/d306fc2c8e4d45d7f175c77edca7063be7b86fe7fe6e68f4353bf71d808c/pillow-12.3.0-cp315-cp315-macosx_10_15_x86_64.whl", hash = "sha256:dc624f6bc473dacdf7ef7eb8678d0d08edf15cd94fad6ae5c7d6cc67a4e4902f", size = 5350370, upload-time = "2026-07-01T11:55:44.028Z" }, - { url = "https://files.pythonhosted.org/packages/dd/44/668fb1437e8ce420f62d6106eb66e44a5971602a4d794615bdf79315d82d/pillow-12.3.0-cp315-cp315-macosx_11_0_arm64.whl", hash = "sha256:71d6097b330eea8fd15097780c8e89cb1a8ce7838669f48c5bacd6f663dd4701", size = 4780147, upload-time = "2026-07-01T11:55:46.073Z" }, - { url = "https://files.pythonhosted.org/packages/0c/08/93fa2e70e30a2d81547e481b6ee2bb9522117221fb1e0ce4b5df70967677/pillow-12.3.0-cp315-cp315-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:28ce87c5ab450a9dd970b52e5aca5fe63ed432d18a2eaddd1979a00a1ba24ace", size = 6273659, upload-time = "2026-07-01T11:55:48.264Z" }, - { url = "https://files.pythonhosted.org/packages/f8/6d/043e96ff814fc31a33077e4cba86082167db520c93632afdf2042febbb0c/pillow-12.3.0-cp315-cp315-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:6b02afb9b97f65fbca5f31db6a2a3ba21aa93030225f150fa3f249717e938fb4", size = 6947439, upload-time = "2026-07-01T11:55:50.503Z" }, - { url = "https://files.pythonhosted.org/packages/af/92/ba71d2ee2ac0edf3fa33bd9d5ee9ee080da70b1766f3ca3934f9938ddac9/pillow-12.3.0-cp315-cp315-musllinux_1_2_aarch64.whl", hash = "sha256:1182d52bc2d5e5d7d0949503aa7e36d12f42205dc287e4883f407b1988820d39", size = 6353577, upload-time = "2026-07-01T11:55:52.697Z" }, - { url = "https://files.pythonhosted.org/packages/0f/ce/e63064e2122923ff687c8ad792d0d736a7b3920a56a46982e81a7fdd25d6/pillow-12.3.0-cp315-cp315-musllinux_1_2_x86_64.whl", hash = "sha256:e795b7eb908249c4e43c7c99fac7c2c75dab0c43566e37db472a355f63693d71", size = 7060394, upload-time = "2026-07-01T11:55:55.149Z" }, - { url = "https://files.pythonhosted.org/packages/54/76/a09cc3ccc8d773a7283d34c38bec1708f9e3cc932093cbc4c5e71ac4060b/pillow-12.3.0-cp315-cp315-win32.whl", hash = "sha256:57b3d78c95ba9059768b10e28b813002261d3f3dfc55cc48b0c988f625175827", size = 6467375, upload-time = "2026-07-01T11:55:57.769Z" }, - { url = "https://files.pythonhosted.org/packages/3e/03/1846c49ba3b1d5550392a4bbd06d6fb4578e1cd91a803198b5c90f5f7d53/pillow-12.3.0-cp315-cp315-win_amd64.whl", hash = "sha256:fa4ecea169a355be7a3ade2c783e2ed12f0e40d2c5621cda8b3297faf7fbb9f5", size = 7237048, upload-time = "2026-07-01T11:55:59.975Z" }, - { url = "https://files.pythonhosted.org/packages/fb/bb/89f35dcc79610423f9f195504d7def7f0d1416a711541b42867e25fe3412/pillow-12.3.0-cp315-cp315-win_arm64.whl", hash = "sha256:877c3f311ff35410f690861c4409e7ccbf0cd2f878e50628a28e5a0bb689e658", size = 2566006, upload-time = "2026-07-01T11:56:02.143Z" }, - { url = "https://files.pythonhosted.org/packages/30/88/707027ba09942dfa2c28759b5c222d769290a41c6d20ea60ec250801941f/pillow-12.3.0-cp315-cp315t-macosx_10_15_x86_64.whl", hash = "sha256:e9871b1ffbfa9656b60aeee92ed5136a5742696006fa322b29ea3d8da0ecc9cf", size = 5352509, upload-time = "2026-07-01T11:56:04.2Z" }, - { url = "https://files.pythonhosted.org/packages/b0/6d/00352fa25332c2569cd387851f568cc5a4b75a9adbfb37ac4fbce4c02eec/pillow-12.3.0-cp315-cp315t-macosx_11_0_arm64.whl", hash = "sha256:53aa02d20d10c3d814d536aa4e5ac9b84ca0ff5a88377963b085ad6822f93e64", size = 4783167, upload-time = "2026-07-01T11:56:06.631Z" }, - { url = "https://files.pythonhosted.org/packages/13/4f/9e049dfa21af7c22427275720e2490267ba8138120add5c4c574deb69782/pillow-12.3.0-cp315-cp315t-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:446c34dcc4324b084a53b705127dc15717b22c5e140ae0a3c38349d4efec071e", size = 6329237, upload-time = "2026-07-01T11:56:08.868Z" }, - { url = "https://files.pythonhosted.org/packages/36/16/cf6eeaae8d0fce8dd390a33437cf68c5d5bd73834a2bc6e2f14efda0ab45/pillow-12.3.0-cp315-cp315t-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:cf1845d02ad822a369a49f2bb9345b1614744267682e7a03527dc3bf6eea1777", size = 6997047, upload-time = "2026-07-01T11:56:11.379Z" }, - { url = "https://files.pythonhosted.org/packages/1e/69/dbf769bdd55f48bf5733cac28edc6364ffaa072ec9ba336266e4fe66be55/pillow-12.3.0-cp315-cp315t-musllinux_1_2_aarch64.whl", hash = "sha256:186941b6aef820ad110fb01fb06eb925374dc3a21b17e37ec9a53b250c6fe2d1", size = 6400440, upload-time = "2026-07-01T11:56:13.908Z" }, - { url = "https://files.pythonhosted.org/packages/a0/e1/ffc9cfc2eea0d178da8018e18e959301ad9d6bc9f3edb7181e748a474b97/pillow-12.3.0-cp315-cp315t-musllinux_1_2_x86_64.whl", hash = "sha256:f13c32a3abd6079a66d9526e18dad9b6d280384d49d7c54040cd57b6424041d9", size = 7105895, upload-time = "2026-07-01T11:56:16.575Z" }, - { url = "https://files.pythonhosted.org/packages/18/f0/a5595c1e8c3ae44b9828cb2f0fa8155e5095ef04d6327b8f61cf44a3df85/pillow-12.3.0-cp315-cp315t-win32.whl", hash = "sha256:1657923d2d45afb66526e5b933e5b3052e6bdea196c90d3abb2424e18c77dae8", size = 6474384, upload-time = "2026-07-01T11:56:18.855Z" }, - { url = "https://files.pythonhosted.org/packages/e4/04/62bcd9f844984c5938d3b05264a61d797a29d3e0812341a8204af70bbdee/pillow-12.3.0-cp315-cp315t-win_amd64.whl", hash = "sha256:8cd2f7bdda092d99c9fc2fb7391354f306d01443d22785d0cbfafa2e2c8bb418", size = 7243537, upload-time = "2026-07-01T11:56:21.214Z" }, - { url = "https://files.pythonhosted.org/packages/3d/68/1f3066acedf37673694a7141381d8f811ae97f30d34413d236abe7d489f1/pillow-12.3.0-cp315-cp315t-win_arm64.whl", hash = "sha256:06ff022112bc9cbf83b60f8e028d94ad87b60621706487e65f673de61610ab59", size = 2567491, upload-time = "2026-07-01T11:56:23.506Z" }, -] - [[package]] name = "pluggy" version = "1.6.0" @@ -1226,15 +848,6 @@ wheels = [ { url = "https://files.pythonhosted.org/packages/f4/7e/a72dd26f3b0f4f2bf1dd8923c85f7ceb43172af56d63c7383eb62b332364/pygments-2.20.0-py3-none-any.whl", hash = "sha256:81a9e26dd42fd28a23a2d169d86d7ac03b46e2f8b59ed4698fb4785f946d0176", size = 1231151, upload-time = "2026-03-29T13:29:30.038Z" }, ] -[[package]] -name = "pyparsing" -version = "3.3.2" -source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/f3/91/9c6ee907786a473bf81c5f53cf703ba0957b23ab84c264080fb5a450416f/pyparsing-3.3.2.tar.gz", hash = "sha256:c777f4d763f140633dcb6d8a3eda953bf7a214dc4eff598413c070bcdc117cbc", size = 6851574, upload-time = "2026-01-21T03:57:59.36Z" } -wheels = [ - { url = "https://files.pythonhosted.org/packages/10/bd/c038d7cc38edc1aa5bf91ab8068b63d4308c66c4c8bb3cbba7dfbc049f9c/pyparsing-3.3.2-py3-none-any.whl", hash = "sha256:850ba148bd908d7e2411587e247a1e4f0327839c40e2e5e6d05a007ecc69911d", size = 122781, upload-time = "2026-01-21T03:57:55.912Z" }, -] - [[package]] name = "pytest" version = "9.1.1" @@ -1251,18 +864,6 @@ wheels = [ { url = "https://files.pythonhosted.org/packages/24/25/1de2678b631f5a49215c6c96fff41ba892b0a34df68d6d80292b1b48aa7f/pytest-9.1.1-py3-none-any.whl", hash = "sha256:37a86b45efb9a47a61a36449063e8e18d0cab3161329fc099eb21783169c4f0c", size = 386536, upload-time = "2026-06-19T10:58:31.347Z" }, ] -[[package]] -name = "python-dateutil" -version = "2.9.0.post0" -source = { registry = "https://pypi.org/simple" } -dependencies = [ - { name = "six" }, -] -sdist = { url = "https://files.pythonhosted.org/packages/66/c0/0c8b6ad9f17a802ee498c46e004a0eb49bc148f2fd230864601a86dcf6db/python-dateutil-2.9.0.post0.tar.gz", hash = "sha256:37dd54208da7e1cd875388217d5e00ebd4179249f90fb72437e91a35459a0ad3", size = 342432, upload-time = "2024-03-01T18:36:20.211Z" } -wheels = [ - { url = "https://files.pythonhosted.org/packages/ec/57/56b9bcc3c9c6a792fcbaf139543cee77261f3651ca9da0c93f5c1221264b/python_dateutil-2.9.0.post0-py2.py3-none-any.whl", hash = "sha256:a8b2bc7bffae282281c8140a97d3aa9c14da0b136dfe83f850eea9a5f7470427", size = 229892, upload-time = "2024-03-01T18:36:18.57Z" }, -] - [[package]] name = "python-dotenv" version = "1.2.2" @@ -1371,7 +972,6 @@ dependencies = [ [package.dev-dependencies] dev = [ - { name = "matplotlib" }, { name = "pytest" }, { name = "ruff" }, { name = "ty" }, @@ -1389,21 +989,11 @@ requires-dist = [ [package.metadata.requires-dev] dev = [ - { name = "matplotlib", specifier = ">=3.9" }, { name = "pytest", specifier = ">=8.0" }, { name = "ruff", specifier = ">=0.15.21" }, { name = "ty", specifier = ">=0.0.62" }, ] -[[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 = "starlette" version = "1.3.1" From ac4a032c918649654beddd89b0f608e4216a1342 Mon Sep 17 00:00:00 2001 From: Botir Khaltaev Date: Tue, 11 Aug 2026 17:42:42 +0100 Subject: [PATCH 2/2] Run CI and Release on GitHub-hosted ubuntu-latest. Avoids Job Image bake shadowing the PR checkout on self-hosted dogfood runners. --- .github/workflows/ci.yml | 6 +----- .github/workflows/release.yml | 6 +----- AGENTS.md | 4 ++-- CHANGELOG.md | 1 + CONTRIBUTING.md | 2 +- 5 files changed, 6 insertions(+), 13 deletions(-) diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index 1976357..2847641 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -13,11 +13,7 @@ concurrency: jobs: test: name: python - runs-on: - - self-hosted - - modal - - ci - - job-${{ github.run_id }}-${{ github.job }} + runs-on: ubuntu-latest timeout-minutes: 30 steps: - uses: actions/checkout@v7 diff --git a/.github/workflows/release.yml b/.github/workflows/release.yml index b4da031..4ac127c 100644 --- a/.github/workflows/release.yml +++ b/.github/workflows/release.yml @@ -10,11 +10,7 @@ permissions: jobs: release: - runs-on: - - self-hosted - - modal - - ci - - job-${{ github.run_id }}-${{ github.job }} + runs-on: ubuntu-latest timeout-minutes: 30 steps: - uses: actions/checkout@v7 diff --git a/AGENTS.md b/AGENTS.md index daf69be..d43e28e 100644 --- a/AGENTS.md +++ b/AGENTS.md @@ -90,5 +90,5 @@ Concise always-on rules for this repo. Prefer Modal SDK shapes, idiomatic Python ## Workspace -- This repo’s GitHub Actions CI and Release workflows run on self-hosted `runner-modal` runners (`self-hosted`, `modal`, `ci`, unique `job-…` pin), not GitHub-hosted runners. -- Maintainer CI App is `scripts/ci_app.py` (App `runner-modal-ci-app`). +- This repo’s GitHub Actions CI and Release workflows run on ``ubuntu-latest``. +- Maintainer CI App is `scripts/ci_app.py` (App `runner-modal-ci-app`) for dogfooding Jobs, not for repo CI. \ No newline at end of file diff --git a/CHANGELOG.md b/CHANGELOG.md index 22b02f6..249277b 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -36,3 +36,4 @@ - Stale delivery reclaim overwrites in place (no delete-then-put). - Maintainer CI App lives at `scripts/ci_app.py` (not under `examples/`). - Install pin is `git+…@v0.1.0` (`PACKAGE_SPEC`). +- CI and Release workflows run on GitHub-hosted `ubuntu-latest` (not self-hosted dogfood runners). diff --git a/CONTRIBUTING.md b/CONTRIBUTING.md index c7508e2..53bbc57 100644 --- a/CONTRIBUTING.md +++ b/CONTRIBUTING.md @@ -12,7 +12,7 @@ uv run ty check ## CI -This repository’s GitHub Actions workflows run on **self-hosted** `runner-modal` runners (`self-hosted`, `modal`, `ci`, plus a unique `job-…` pin). They are not GitHub-hosted. Fork PRs only get checks when the maintainer control plane (`scripts/ci_app.py`) is up and picks up the job. Run the setup commands above locally before opening a PR. +GitHub Actions runs on ``ubuntu-latest``. Run the setup commands above locally before opening a PR. The maintainer control plane (``scripts/ci_app.py``) is for dogfooding this product on real Jobs, not for repository CI. ## Conventions