+
    …WÝjL  ã                  óV  a € 0 t $ R t^ RIHt ^ RIt^ RIt^ RIt^ RIt^ RI	H
t
 ^ RIHt ^ RIHtHt ^ RIHtHt ^ RIHt ]! RRR	7      tR
]R&   ]
R R l4       t]P0                  ! R4      tR R ltR R ltR R lt] ! R R4      4       tR R lt]! 4       RR/R R ll4       tRR/t R R lt!R  R! lt"R" R# lt#RCR$ R% llt$R&t%R']% 2t&R(]% R)2t'R* R+ lt(R, R- lt)R. R/ lt*R0R1/R2 R3 llt+R4 R5 lt,R6 R7 lt-R8 R9 lt.R: R; lt/]P0                  ! R<4      t0R= R> lt1R? R@ lt2RA RB lt3R# )DuQ  hermes pm update: resolve the latest versions and re-pin the lockfile.

Each Package subclass declares how to find its own latest via
``latest_versions(target)`` (see pm/package.py); this module is the driver:
it intersects those candidate lists across the targets the package serves,
compares against the lockfile, and (in real mode) re-pins + reinstalls.

Two version styles (``Package.version_style``):

  semver â€” one shared version across targets (node 26.7.0, uv 0.12.3).
          The update is the highest version every relevant target serves.
  minor  â€” the lockfile ``version`` field is major.minor; each target's
          exact patch lives in ITS artifact urls. Used when the package
          has no shared release cadence across its sources (ffmpeg's posix
          martin-riedl builds vs win32 BtbN autobuilds drift in patch).
          An update moves to the highest MAJOR.MINOR every relevant target
          serves; within it each target pins its own newest patch.

The ``--check`` command is dry-run only: it hits the upstream indexes (small
HTTP GETs) but never writes the lockfile, the store, or the venv, and never
downloads an artifact. Real ``pm update`` re-pins changed packages
(``pm lock``-style artifact hashing), installs them, then refreshes the
venv (uv sync) â€” and with the dep legs enabled, uv.lock + package-lock.json.
)ÚannotationsN)Úcontextmanager)Ú
ContextVar)Ú	dataclassÚfield)ÚIteratorÚOptional)Úretry_networkÚpm_index_responses)ÚdefaultzContextVar[dict | None]Ú_index_responsesc               ó   € V ^8„  d   QhRR/# )é   ÚreturnzIterator[None]© )Úformats   "Ú=C:\Users\johnn\AppData\Local\hermes\hermes-agent\pm\update.pyÚ__annotate__r   .   s   € ÷ &ñ &˜~ñ &ó    c               #  ó    "  € \         P                  / 4      p  Rx € \         P                  V 4       R#   \         P                  T 4       i ; i5i)zGShare successful index reads only within this resolve or pin operation.N)r   ÚsetÚreset)Útokens    r   Úreuse_index_responsesr   -   s<   é € ô × Ñ  Ó$€Eð&Ûä×Ñ˜uÖ%øÔ×Ñ˜uÕ%üs   ‚A™4 �A´AÁAz\d+|[A-Za-z]+c               ó    € V ^8„  d   QhRRRR/# )r   ÚversionÚstrr   Útupler   )r   s   "r   r   r   >   s   € ÷ ñ ˜ð  ñ r   c                ó2  € . pV P                  RR4      P                  R4       Ff  p\        P                  V4       FJ  pVP	                  4       '       d   VP                  ^ \        V4      34       K7  VP                  ^V34       KL  	  Kh  	  \        V4      # )zøA sortable key for a version string. Handles dot-separated numerics,
+suffixes (python's 3.14.7+20260901, git's 2.53.0+3), and plain build
numbers (llamacpp's 10362). Non-numeric segments sort after numerics so
a prerelease never beats its release.Ú-Ú.)ÚreplaceÚsplitÚ_VERSION_PART_REÚfindallÚisdigitÚappendÚintr   )r   ÚkeyÚchunkÚms   &   r   Úversion_keyr+   >   sy   € ð
 €CØ—‘  cÓ*×0Ñ0°Ö5ˆÜ!×)Ñ)¨%Ö0ˆAØ�y‰y�{Š{Ø—
‘
˜Aœs 1›v˜;Ö'à—
‘
˜A˜q˜6Ö"ó	 1ñ 6ô �‹:Ðr   c               ó    € V ^8„  d   QhRRRR/# )r   r   r   r   zOptional[tuple[int, int]]r   )r   s   "r   r   r   M   s   € ÷ ñ �cð Ð7ñ r   c                óÜ   € \         P                  V 4       Uu. uF%  qP                  4       '       g   K  \        V4      NK'  	  pp\	        V4      ^8  d   R# V^ ,          V^,          3# u upi )zD(major, minor) of a semver-ish string; None when not 2-part numeric.N)r#   r$   r%   r'   Úlen)r   r*   Únumss   &  r   Úminor_ofr0   M   sV   € ä,×4Ñ4°WÔ=ÓMÑ=�qÇÁÇŒFŒC�ŽFÑ=€DÐMÜ
ˆ4ƒy�1„}ÙØ��G�T˜!•WÐÐùò Ns
   ˜A)´A)c               ó$   € V ^8„  d   QhRRRRRR/# )r   Úversionsú	list[str]Úminorztuple[int, int]r   úOptional[str]r   )r   s   "r   r   r   U   s!   € ÷ ñ ˜Ið ¨oð À-ñ r   c                ó‚   € RpV  F6  p\        V4      V8X  g   K  Ve   \        V4      \        V4      8”  g   K4  TpK8  	  V# )z?The highest version in `versions` whose major.minor == `minor`.N)r0   r+   )r2   r4   ÚbestÚvs   &&  r   Úbest_in_minorr9   U   s>   € à€DÛˆÜ�A‹;˜%Ö T¢\´[À³^ÄkÐRVÓFWÖ5WØŠDñ ð €Kr   c                  ó¤   € ] tR t^ct$ RtR]R&   R]R&   R]R&   RtR]R&   ]! ]R	7      t	R
]R&   Rt
R]R&   ]! ]R	7      tR]R&   ]R R l4       tRtR# )ÚResolvedz)What `pm update` decided for ONE package.r   Únamer5   ÚlockedÚstyleNr   )Údefault_factoryzdict[str, str]Ú
per_targetÚ Úreasonúdict[str, list[str]]Úartifact_updatesc               ó   € V ^8„  d   QhRR/# )r   r   Úboolr   )r   s   "r   r   ÚResolved.__annotate__p   s   € ÷ Dñ D˜ñ Dr   c                	óJ  € V P                   f   R# V P                  f   R# V P                  R8X  dI   \        V P                  4      ;'       g,    \        V P                   4      \        V P                  4      8g  # \        V P                   4      \        V P                  4      8„  # )NFTr4   )r   r=   r>   rF   rD   r0   r+   )Úselfs   &r   ÚchangedÚResolved.changedo   sx   € à�<‰<ÒÙØ�;‰;ÒÙØ�:‰:˜Ô Ü˜×-Ñ-Ó.×aÐa´(¸4¿<¹<Ó2HÌHÐUY×U`ÑU`ÓLaÑ2aÐaÜ˜4Ÿ<™<Ó(¬;°t·{±{Ó+CÑCÐCr   r   )Ú__name__Ú
__module__Ú__qualname__Ú__firstlineno__Ú__doc__Ú__annotations__r   r   Údictr@   rB   rD   ÚpropertyrJ   Ú__static_attributes__r   r   r   r;   r;   c   s]   ‡ á3à
ƒIØÓØƒJØ!€Gˆ]Ó!Ù!&°tÔ!<€J�Ó<Ø€FˆCÓÙ-2À4Ô-HÐÐ*ÓHàôDó ôDr   r;   c          
     ó,   € V ^8„  d   QhRRRRRRRRRR	/# )
r   r<   r   Úlatest_by_targetrC   r=   r5   r>   r   r;   r   )r   s   "r   r   r   z   sA   € ÷ (dñ (dØ
ð(dà*ð(dð ð(dð ð	(dð
 ñ(dr   c                ó¾  € VP                  4        UUu/ uF  w  rEV'       g   K  WEbK  	  pppV'       g   \        WVRR7      # VR8X  d×   VP                  4        Uu. uF  p\        R V 4       4      NK  	  pp\	        V4      ^8”  d   \        P
                  ! V!  M\        V^ ,          4      pV'       g   \        WVRR7      # \        V4      p	VP                  4        UUu/ uF  w  rEV\        WY4      bK  	  p
pp\        V VVV	^ ,           RV	^,           2V
R7      # VP                  4        Uu. uF  p\        V4      NK  	  pp\	        V4      ^8”  d   \        P
                  ! V!  M\        V^ ,          4      pV'       g   \        WVRR7      # \        V\        R	7      p\        YY<V Uu/ uF  qDVbK  	  upR7      # u uppi u upi u uppi u upi u upi )
uð   Intersect per-target candidate lists into one update decision.

``latest_by_target[target]`` is newest-first. Empty candidates for a
target mean "no auto-update source" â€” the target is skipped (a missing
index must not block the others).
z	no source)rB   r4   c              3  ó^   "  € T F#  p\        V4      '       g   K  \        V4      x € K%  	  R # 5i©N)r0   )Ú.0r8   s   & r   Ú	<genexpr>Úresolve_best.<locals>.<genexpr>Œ   s   é € ÐA©r¨!´X¸a·[œ+œ( 1Ÿ+˜+«rùs   ‚-š-zno shared minorr    )r   r@   zno shared version)r(   )	Úitemsr;   Úvaluesr   r.   ÚintersectionÚmaxr9   r+   )r<   rV   r=   r>   ÚtÚvsÚpresentÚ
minor_setsÚcommonÚshared_minorr@   Úsetsr   s   &&&&         r   Úresolve_bestrh   z   s¸  € ð #3×"8Ñ"8Ô":ÔAÑ":™˜¼bŒuˆqŠuÑ":€GÑAßÜ˜ e°KÔ@Ð@à�ÔàLSÏNÉNÔL\Ó]ÑL\Àb”cÑA©rÓAÖAÑL\ˆ
Ð]Ü25°j³/ÀAÔ2E”×!Ò! :Ò.Ì3ÈzÐZ[Í}ÓK]ˆßÜ˜D¨%Ð8IÔJÐJÜ˜6“{ˆà<C¿M¹M¼Oô
Ù<K±5°1ˆAŒ}˜RÓ.Ò.¹Oð 	ñ 
ô ØØØØ# A•Ð' q¨°a­Ð(9Ð:Ø!ô
ð 	
ð &Ÿn™nÔ.Ó/Ñ.˜ŒC�ŽGÑ.€DÐ/Ü(+¨D«	°A¬ŒS×Ò˜tÒ$¼3¸tÀA½w»<€FßÜ˜ eÐ4GÔHÐHÜ�&œkÔ*€GÜ�D %ÑZaÓEbÑZaÐUVÈÂjÑZaÑEbÔcÐcùó9 Bùò ^ùó

ùò 0ùò
 Fcs"   ”G¥GÁG
Ã$GÄ3GÆ1GÚ	artifactsc               ó(   € V ^8„  d   QhRRRRRRRR/# )	r   Útargetsr3   r=   r5   ri   zdict | Noner   r;   r   )r   s   "r   r   r   ¦   s*   € ÷ ñ  ið ¸ð ÐVað Ðmuñ r   c               óž  € V Uu/ uF)  pT\        V P                  WBR7      ;'       g    . 4      bK+  	  pp\        V P                  WRV P                  4      pVP
                  R8X  dÜ   VP                  eÎ   VeÊ   VP                  P                  4        F~  w  rxVP                  WsP                  R. 4      4      p	\        V	\         4      '       d   T	MV	.p	V P                  W‡4      p
Y© Uu. uF  q»R,          NK  	  up8w  g   Kp  W¦P                  V&   K€  	  Ve*   \        VP                  4      \        V4      8X  d   W&n        V# u upi u upi )z@Resolve versions and detect new artifacts within a shared minor.)r=   r4   ÚanyÚurl)ÚlistÚlatest_versionsrh   r<   Úversion_styler>   r   r@   r]   ÚgetÚ
isinstanceÚ
fetch_urlsrD   r0   )Úpackagerk   r=   ri   ra   ÚlatestÚdecisionÚtargetr   ÚcurrentÚurlsÚrows   &&&$        r   Úresolve_packager|   ¥   s0  € ñ
 óáˆAð 	
Œ4�×'Ñ'¨Ð'Ó9×?Ð?¸RÓ@Ò@Ùð ð ô ˜GŸL™L¨&¸'×:OÑ:OÓP€HØ‡~�~˜Ô  X×%5Ñ%5Ò%AÀiÒF[Ø'×2Ñ2×8Ñ8Ö:‰OˆFØ—m‘m F¯M©M¸%ÀÓ,DÓEˆGÜ!+¨G´T×!:Ò!:‘gÀÀ	ˆGØ×%Ñ% gÓ6ˆDØ¨gÓ6©g s˜EŸ
˜
©gÑ6Ö6Ø48×)Ñ)¨&Ó1ñ  ;ð Ò¤(¨8×+;Ñ+;Ó"<ÄÈÓ@PÔ"PØ%ÔØ€Oùòùò 7s   …#E©EÃ*E
z
User-Agentz	hermes-pmc               ó   € V ^8„  d   QhRR/# ©r   r   rR   r   )r   s   "r   r   r   À   s   € ÷ ñ ˜ñ r   c                 óÐ   € \        \        4      p \        P                  P	                  R4      ;'       g     \        P                  P	                  R4      pV'       d	   RV 2V R&   V # )uÓ   Headers for GitHub API calls. A GH_TOKEN / GITHUB_TOKEN env var lifts
the unauthenticated 60 req/hr cap to 5000 â€” a full `pm update --check`
across every github-sourced package burns the anonymous budget fast.ÚGH_TOKENÚGITHUB_TOKENúBearer ÚAuthorization)rR   Ú_UAÚosÚenvironrr   ©Úheadersr   s     r   Ú_github_headersr‰   À   sM   € ô ”3‹i€GÜ�J‰J�N‰N˜:Ó&×HÐH¬"¯*©*¯.©.¸Ó*H€EßØ%,¨U¨GÐ#4ˆ�Ñ Ø€Nr   c               ó    € V ^8„  d   QhRRRR/# )r   rn   r   r   rR   r   )r   s   "r   r   r   Ë   s   € ÷ ñ ˜ð  ñ r   c                ó�   € ^ RI Hp V! V 4      pVR8X  d   \        4       # VR8X  d   / \        C\	        4       C# \        \        4      # )é    )Ú
url_origin)Úhttpszapi.github.comé»  )rŽ   zhuggingface.cor�   )Úhermes_cli.urllib_securityr�   r‰   r„   Ú_hf_headersrR   )rn   r�   Úorigins   &  r   Ú_index_headersr“   Ë   sE   € Ý5á˜‹_€FØÐ1Ô1ÜÓ Ð ØÐ1Ô1Ø'”#Ð'œ›Ð'Ð'Ü”‹9Ðr   c               ó    € V ^8„  d   QhRRRR/# )r   rn   r   r   zdict | listr   )r   s   "r   r   r   Ö   s   € ÷ "ñ "�3ð "˜;ñ "r   c                ó6   a a€ ^ RI Ho VV 3R lp\        V4      # )rŒ   ©Úopen_credentialed_urlc                 óŠ  <€ \        S4      p S\        \        V P                  4       4      4      R 3p\        P                  4       pVe   W9   d	   W!,          # S! \        P                  P                  SV R7      ^<R7      ;_uu_ 4       p\        P                  ! V4      pRRR4       Ve   XW!&   X#   + '       g   i     L; i)ÚjsonN©rˆ   ©Útimeout)r“   r   Úsortedr]   r   rr   ÚurllibÚrequestÚRequestr™   Úload)rˆ   r(   Ú	responsesÚrespÚresultr—   rn   s        €€r   rŸ   Ú_get_json.<locals>.requestÙ   s¤   ø€ Ü  Ó%ˆØ”Eœ& §¡£Ó1Ó2°FÐ;ˆÜ$×(Ñ(Ó*ˆ	ØÒ  SÔ%5Ø•>Ð!Ù"Ü�N‰N×"Ñ" 3°Ð"Ó8À"÷
õ 
àÜ—Y’Y˜t“_ˆF÷
ð Ò Ø#ˆI‰NØˆ÷
÷ 
ús   Â	B2Â2C	)r�   r—   r	   )rn   rŸ   r—   s   f @r   Ú	_get_jsonr¦   Ö   s   ù€ Ý@öô ˜Ó!Ð!r   c               ó$   € V ^8„  d   QhRRRRRR/# )r   rn   r   rˆ   zOptional[dict]r   r   )r   s   "r   r   r   ê   s!   € ÷ "ñ "�3ð " ð "¸3ñ "r   c                ó‚   a aa€ ^ RI Ho \        S 4      oV'       d   SP                  V4       VVV 3R lp\	        V4      # )rŒ   r–   c                 óˆ  <€ S\        \        SP                  4       4      4      R 3p \        P	                  4       pVe   W9   d	   W,          # S! \
        P                  P                  SSR7      ^<R7      ;_uu_ 4       pVP                  4       P                  RR4      pRRR4       Ve   XW&   X#   + '       g   i     L; i)ÚtextNrš   r›   zutf-8r!   )
r   r�   r]   r   rr   rž   rŸ   r    ÚreadÚdecode)r(   r¢   r£   r¤   Úhdrsr—   rn   s       €€€r   rŸ   Ú_get_text.<locals>.requestñ   s¥   ø€ Ø”Eœ& §¡£Ó.Ó/°Ð8ˆÜ$×(Ñ(Ó*ˆ	ØÒ  SÔ%5Ø•>Ð!Ù"Ü�N‰N×"Ñ" 3°Ð"Ó5¸r÷
õ 
àØ—Y‘Y“[×'Ñ'¨°Ó;ˆF÷
ð Ò Ø#ˆI‰NØˆ÷
÷ 
ús   Á>!B1Â1C	)r�   r—   r“   Úupdater	   )rn   rˆ   rŸ   r­   r—   s   f& @@r   Ú	_get_textr°   ê   s1   ú€ Ý@ä˜#Ó€DßØ�‰�GÔ÷ô ˜Ó!Ð!r   zggml-org/install.shz#https://huggingface.co/api/buckets/zhttps://huggingface.co/buckets/z/resolvec               ó   € V ^8„  d   QhRR/# r~   r   )r   s   "r   r   r     s   € ÷ ñ �Tñ r   c                 óh   € / p \         P                  P                  R4      pV'       d	   RV 2V R&   V # )zYOptional bearer auth for HF bucket fetches (HF_TOKEN), like the
installer's own requests.ÚHF_TOKENr‚   rƒ   )r…   r†   rr   r‡   s     r   r‘   r‘     s4   € ð €GÜ�J‰J�N‰N˜:Ó&€EßØ%,¨U¨GÐ#4ˆ�Ñ Ø€Nr   c               ó   € V ^8„  d   QhRR/# )r   r   r5   r   )r   s   "r   r   r     s   € ÷ %ñ %˜-ñ %r   c                 óÄ   €  \        \         R2\        4       R7      p \        P
                  ! RT 4      pT'       d   TP                  ^4      # R#   \         d     R# i ; i)u²   The build tag the llama.app installer's `latest` pointer currently
resolves to â€” the updater's "next version". Returns the bare build
number ("10679") or None when unreachable.z/latestrš   Nz(\d+))r°   Ú_LLAMA_BUCKET_RESOLVEr‘   Ú	ExceptionÚreÚsearchÚgroup)rª   r*   s     r   Úllama_app_latestr»     sY   € ðÜÔ1Ð2°'Ð:ÄKÃMÔRˆô
 	�	Š	�(˜DÓ!€Aßˆ1�7‰7�1‹:Ð$ Ð$øô ô Úðús   ‚A ÁAÁAc               ó   € V ^8„  d   QhRR/# ©r   r   r3   r   )r   s   "r   r   r   +  s   € ÷ &ñ & 9ñ &r   c                 óè  € . p \        4       p \        \         R24      pT;'       g    .  F  p\        P
                  ! RTP                  RR4      4      pT'       g   K4  TP                  ^4      R,          pYQ9  g   KT  TP                  T4       T P                  \        T4      4       K�  	  T P                  RR7       T  Uu. uF  p\        T4      NK  	  up#   \         d    . u # i ; iu upi )u  Build numbers visible in the llama.app bucket, newest-first.

The HF bucket tree API IGNORES the offset param (verified: every
offset returns the same first page â€” the oldest ~1000 paths, sorted
by path ascending). So the tree can only ever enumerate the OLDEST
builds, never the newest â€” the `latest` pointer (llama_app_latest)
is the authoritative "next version" source. This helper returns what
the tree CAN see (deduped, sorted by build number descending) as a
bounded supplement; callers should put llama_app_latest() first.
z/tree?limit=1000&offset=0z^(b\d+)/ÚpathrA   :é   NNT)Úreverse)r   r¦   Ú_LLAMA_BUCKET_APIr·   r¸   Úmatchrr   rº   Úaddr&   r'   Úsortr   )r2   ÚseenÚdataÚentryr*   Útagr8   s          r   Úllama_app_bucket_versionsrÊ   +  sÑ   € ð €HÜ‹5€DðÜÔ-Ð.Ð.GÐHÓIˆð —�˜’ˆÜ�HŠH�[ %§)¡)¨F°BÓ"7Ó8ˆß‰1Ø—'‘'˜!“*˜R•.ˆCØŽØ—‘˜”Ø—‘¤ C£Ö)ñ ð ‡M�M˜$€MÔÙ$Ó%™H�qŒC�ŽF™HÑ%Ð%øô ô ØŠ	ðüò &s   ŽC ÃC/ÃC,Ã+C,Ústrip_prefixrA   c               ó$   € V ^8„  d   QhRRRRRR/# )r   Úrepor   rË   r   r3   r   )r   s   "r   r   r   G  s!   € ÷ ñ ˜cð °Cð Àñ r   c               ó   € . p\        ^^4       Fë  p\        RV  RV 24      pV'       g    V# V F³  pVP                  R4      '       g   VP                  R4      '       d   K3  VP                  RR4      pVR8X  d   KN  V'       d&   VP                  V4      '       d   V\	        V4      R pV'       d   V^ ,          P                  4       '       g   K¢  VP                  V4       Kµ  	  \	        V4      ^8  g   Kê   V# 	  V# )	u�  Newest-first release tag names for a GitHub repo (releases, not all
tags â€” no drafts/prereleases, and a rolling 'latest' pseudo-release is
skipped). ``strip_prefix`` removes a tag prefix (e.g. 'v', 'b'). Only
version-shaped tags survive the strip â€” cua-driver's repo also tags
sandbox/experimental builds (cua-driver-rs-vsandbox-v0.4.3) that must
never appear as update candidates.zhttps://api.github.com/repos/z/releases?per_page=30&page=ÚdraftÚ
prereleaseÚtag_namerA   rv   N)Úranger¦   rr   Ú
startswithr.   r%   r&   )rÍ   rË   ÚtagsÚpagerÇ   ÚreleaserÉ   s   &$     r   Úgithub_release_tagsr×   G  sè   € ð €DÜ�a˜–ˆÜÐ8¸¸Ð>YÐZ^ÐY_Ð`ÓaˆßØð €Kó ˆGØ�{‰{˜7×#Ò# w§{¡{°<×'@Ò'@ÙØ—+‘+˜j¨"Ó-ˆCØ�hŒÙß §¡¨|× <Ò <Øœ#˜lÓ+Ð,Ð-�ß˜c !�fŸn™n×.Ò.ÙØ�K‰K˜Öñ ô ˆt‹9�rŽ>ØØ€Kñ# ð" €Kr   c               ó    € V ^8„  d   QhRRRR/# )r   r<   r   r   rR   r   )r   s   "r   r   r   c  s   € ÷ Nñ N˜ð N ñ Nr   c                óX   € ^ RI Hp \        V! \        P                  4       RV  R24      # )rŒ   )Únpm_registryz
-/package/z
/dist-tags)Úpm.index_configrÚ   r¦   r…   r†   )r<   rÚ   s   & r   Únpm_dist_tagsrÜ   c  s'   € Ý,ä™¤R§Z¡ZÓ0Ð1°¸D¸6ÀÐLÓMÐMr   c               ó   € V ^8„  d   QhRR/# r½   r   )r   s   "r   r   r   i  s   € ÷ ñ ˜iñ r   c                 óÔ   € . p \        R4       FV  pVP                  RR4      pVP                  R4      p\        P                  ! RV4      '       g   KE  V P                  V4       KX  	  V # )zCNewest-first node versions from nodejs.org's index (strip the 'v').z"https://nodejs.org/dist/index.jsonr   rA   r8   z\d+\.\d+\.\d+)r¦   rr   Úremoveprefixr¸   Ú	fullmatchr&   )ÚoutrÈ   r8   s      r   Únode_latest_versionsrâ   i  sZ   € à
€CÜÐ?Ö@ˆØ�I‰I�i Ó$ˆØ�N‰N˜3ÓˆÜ�<Š<Ð(¨!×,Ô,Ø�J‰J�qŽMñ	 Að
 €Jr   c               ó   € V ^8„  d   QhRR/# )r   r   zdict[str, dict[str, str]]r   )r   s   "r   r   r   t  s   € ÷ ñ Ð5ñ r   c                 óZ  €  \        R4      p / p\        P                  ! RT 4       Fn  pTP	                  4       w  r4rVTR8X  d   RMTpTR8X  d   RMR RT 2pTP                  T/ 4      p	Yi9  g"   \        T4      \        Y–,          4      8”  g   Kj  YYT&   Kp  	  T#   \         d    / u # i ; i)	u¾  ffmpeg.martin-riedl.de index: target -> {version: epoch}.

The site has no directory listing or API â€” the root page is the index,
and it lists the CURRENT build per platform (both snapshot builds like
N-126314-g... and release builds like 9.0.1). Parse every
<epoch>_<semver> download dir; snapshots never match the numeric
pattern. The epoch is needed to reconstruct the download URL at pin
time, so the index maps version -> epoch per target.zhttps://ffmpeg.martin-riedl.de/zG/download/(macos|linux)/(amd64|arm64)/(\d+)_(\d+\.\d+\.\d+)/ffmpeg\.zipÚamd64Úx64ÚmacosÚdarwinÚlinuxr   )r°   r·   r¸   ÚfinditerÚgroupsÚ
setdefaultr'   )
rÕ   rá   r*   ÚosnameÚarchÚepochr   Útarget_archrx   r2   s
             r   Úmartin_riedl_indexrñ   t  s¹   € ðÜÐ:Ó;ˆð &(€Cä�[Š[ØRØöˆð ()§x¡x£zÑ$ˆ�eØ# wœ‘e°DˆØ &¨'Ô 1‘H°wÐ?¸qÀÀÐNˆØ—>‘> &¨"Ó-ˆØÔ"¤c¨%£j´3°xÕ7HÓ3IÖ&IØ %�WÓñð €Jøô ô ØŠ	ðús   ‚B ÂB*Â)B*c               ó    € V ^8„  d   QhRRRR/# ©r   rx   r   r   r3   r   )r   s   "r   r   r   �  s   € ÷ Añ A #ð A¨)ñ Ar   c                óv   € \        \        4       P                  V 4      ;'       g    / P                  4       4      # )zHNewest-first release versions the martin-riedl index lists for `target`.)ro   rñ   rr   Úkeys©rx   s   &r   Úmartin_riedl_versionsr÷   �  s-   € äÔ#Ó%×)Ñ)¨&Ó1×7Ð7°R×=Ñ=Ó?Ó@Ð@r   z+autobuild-(\d{4})-(\d{2})-\d{2}-\d{2}-\d{2}c               ó   € V ^8„  d   QhRR/# )r   r   z%dict[str, dict[str, tuple[str, str]]]r   )r   s   "r   r   r   ˜  s   € ÷ 3ñ 3Ð9ñ 3r   c                 óX  € . p \        ^^4       F>  p\        RV 24      pV'       g    M'V P                  V4       \        V4      ^8  g   K>   M	  / pRp\	        4       p\        V R RR7       EF7  pVP                  R4      '       g   VP                  R4      '       d   K4  VP                  RR	4      p\        P                  V4      pV'       g   Ke  VP                  4       p	Vf   T	pW”8X  g   W•9   d   K‰  VP                  V	4       VP                  R
. 4       F‡  p
V
P                  RR	4      p\        P                  ! RV4      pV'       g   K6  VP                  4       w  rÞpVR8X  d   RMRpT RVR8X  d   RMR 2pVP                  V/ 4      P                  W×V34       K‰  	  EK:  	  V# )a  Newest retained (month-end) static GPL asset per target/version, as (tag, name).

BtbN keeps only its 14 newest autobuild tags (about two weeks of
dailies) plus the last build of each month for two years
(util/prunetags.sh), so a pin on a daily tag 404s two weeks later. The
current month's newest tag is still a daily the next build displaces,
so the newest eligible tag is last month's final build.

Releases also contain macOS, shared and LGPL builds. Retain target
identity here so discovery and pinning select the same artifact.
zJhttps://api.github.com/repos/BtbN/FFmpeg-Builds/releases?per_page=30&page=Nc                ó&   € V P                  R R4      # )rÑ   rA   )rr   )Úrs   &r   Ú<lambda>Úbtbn_index.<locals>.<lambda>¯  s   € °!·%±%¸
ÀBÔ2Gr   T)r(   rÁ   rÏ   rÐ   rÑ   rA   Úassetsr<   zNffmpeg-n(\d+\.\d+\.\d+)-.+-(win|linux)(64|arm64)-gpl-\d+\.\d+\.(?:zip|tar\.xz)ÚwinÚwin32ré   r   Ú64ræ   Úarm64)rÒ   r¦   Úextendr.   r   r�   rr   Ú	_BTBN_TAGrà   rë   rÄ   r¸   rì   )ÚreleasesrÕ   rÇ   rá   Únewest_monthÚmonths_seenrÖ   rÉ   ÚdatedÚmonthÚassetr<   r*   r   rí   rî   Úos_keyrx   s                     r   Ú
btbn_indexr  ˜  sŽ  € ð €HÜ�a˜–ˆÜÐeÐfjÐekÐlÓmˆßÙØ�‰˜ÔÜˆt‹9�rŽ>Ùñ ð 24€CØ€LÜ(+«€KÜ˜(Ñ(GÐQU×VÐVˆØ�;‰;�w×Ò 7§;¡;¨|×#<Ò#<ÙØ�k‰k˜* bÓ)ˆÜ×#Ñ# CÓ(ˆßÙØ—‘“ˆØÒØ ˆLØÔ  EÔ$8ÙØ�‰˜ÔØ—[‘[ ¨2Ö.ˆEØ—9‘9˜V RÓ(ˆDô —’ðGàóˆA÷
 ‰qØ()¯©«
Ñ%� Ø$*¨e¤O™¸�Ø"˜8 1¨d°d¬l¡UÀÐ$HÐI�Ø—‘˜v rÓ*×5Ñ5°gÀT¸{ÖKô /ñ Wð8 €Jr   c               ó    € V ^8„  d   QhRRRR/# ró   r   )r   s   "r   r   r   Î  s   € ÷ .ñ .˜#ð . )ñ .r   c                óH   € \        \        4       P                  V / 4      4      # )z=Release versions with a supported BtbN asset for this target.)ro   r  rr   rö   s   &r   Úbtbn_versionsr  Î  s   € ä”
“× Ñ  ¨Ó,Ó-Ð-r   c               ó$   € V ^8„  d   QhRRRRRR/# )r   r4   r   Útripler   r3   r   )r   s   "r   r   r   Ó  s!   € ÷ ñ ˜ð  Sð ¨Yñ r   c           
     ó‚  € \        ^^4       EF-  p\        RV 24      pV'       g    . # V F÷  pVP                  R4      '       g   VP                  R4      '       d   K3  VP                  RR4      p\        P                  ! RV4      '       g   Kd  R\        P
                  ! V 4       RV R	\        P
                  ! V4       R
2pVP                  R. 4       FI  p\        P                  ! WgP                  RR4      4      pV'       g   K3  VP                  ^4      .u u u # 	  Kù  	  \        V4      ^8  g   EK-   . # 	  . # )zPReturn the exact interpreter identity advertised by the newest matching release.zYhttps://api.github.com/repos/astral-sh/python-build-standalone/releases?per_page=30&page=rÏ   rÐ   rÑ   rA   z[0-9]{8}z	cpython-(z
\.[0-9]+\+z)-z-install_only\.tar\.gzrþ   r<   )rÒ   r¦   rr   r¸   rà   Úescaperº   r.   )	r4   r  rÕ   rÇ   rÖ   rÉ   Úpatternr
  rÃ   s	   &&       r   Úpbs_versionsr  Ó  s  € ä�a˜—ˆÜÐtÐuyÐtzÐ{Ó|ˆßØð €Ió ˆGØ�{‰{˜7×#Ò# w§{¡{°<×'@Ò'@ÙØ—+‘+˜j¨"Ó-ˆCÜ—<’< ¨S×1Ò1ÙØ"¤2§9¢9¨UÓ#3Ð"4°J¸s¸eÀ2ÄbÇiÂiÐPVÓFWÐEXÐXnÐoˆGØ Ÿ™ X¨rÖ2�ÜŸš W¯i©i¸ÀÓ.CÓD�ß‘5Ø!ŸK™K¨›NÐ+Ö+ó 3ñ ô ˆt‹9�r�>ØØ€Iñ# ð" €Ir   rY   )4Ú__conditional_annotations__rP   Ú
__future__r   r™   r…   r¸   Úurllib.requestrž   Ú
contextlibr   Úcontextvarsr   Údataclassesr   r   Útypingr   r   Ú
pm.networkr	   r   rQ   r   Úcompiler#   r+   r0   r9   r;   rh   r|   r„   r‰   r“   r¦   r°   Ú_LLAMA_BUCKETrÂ   r¶   r‘   r»   rÊ   r×   rÜ   râ   rñ   r÷   r  r  r  r  )r  s   @r   Ú<module>r      sO  øðôõ2 #ã Û 	Û 	Û Ý %Ý "ß (ß %å $ñ
 -7Ð7KÐUYÔ,ZÐ Ð)Ó Zð ô&ó ð&ð —:’:Ð.Ó/Ð õõõð ÷Dð Dó ðDõ,(dñV ÓðÐdhö ó ðð. �[Ð!€õõõ"÷("ðH &€Ø9¸-¸ÐIÐ Ø9¸-¸ÈÐQÐ õõ%õ&ð8¸"÷ õ8Nõõõ8Að
 �JŠJÐEÓF€	õ3õl.÷
r   