§
    ‰eîi)î  ã                  ób  — d Z ddlmZ ddlZddlZddlZddlZddlZddlZddl	Z	ddl
mZmZmZ ddlmZ ddlmZmZmZmZmZmZ ddlmZ ddlmZ ddlmZ dd	lmZmZmZm Z m!Z!m"Z"m#Z#m$Z$m%Z%m&Z&m'Z'm(Z(m)Z)m*Z*  ej+        e,¦  «        Z-dPd„Z.dZ/dZ0dZ1dZ2dZ3dZ4dZ5dZ6dZ7e4e5e6e7hZ8dZ9dZ:dZ; e<h d£¦  «        Z=e G d„ d¦  «        ¦   «         Z>dQd„Z?dRd"„Z@dSd%„ZAdTd(„ZBdUd,„ZCdVd.„ZDdWd2„ZEdXd4„ZFdYd6„ZGdZd[d8„ZHd\d;„ZId]d=„ZJd^d?„ZKd_dA„ZLdBZM G dC„ dD¦  «        ZNd`dF„ZOdadG„ZPdbdI„ZQdbdJ„ZRdcdM„ZSdddN„ZTdedO„ZUdS )fz<Persistent multi-credential pool for same-provider failover.é    )ÚannotationsN)Ú	dataclassÚfieldsÚreplace)Údatetime)ÚAnyÚDictÚListÚOptionalÚSetÚTuple)ÚOPENROUTER_BASE_URL)Úget_env_value)Ú'CODEX_ACCESS_TOKEN_REFRESH_SKEW_SECONDSÚ!DEFAULT_AGENT_KEY_MIN_TTL_SECONDSÚPROVIDER_REGISTRYÚ_auth_store_lockÚ_codex_access_token_is_expiringÚ_decode_jwt_claimsÚ_load_auth_storeÚ_load_provider_stateÚ_resolve_kimi_base_urlÚ_resolve_zai_base_urlÚ_save_auth_storeÚ_save_provider_stateÚread_credential_poolÚwrite_credential_poolÚreturnúOptional[dict]c                 óF   — 	 ddl m}   | ¦   «         S # t          $ r Y dS w xY w)z.Load config.yaml, returning None on any error.r   ©Úload_configN)Úhermes_cli.configr"   Ú	Exceptionr!   s    ú7/home/div/.hermes/hermes-agent/agent/credential_pool.pyÚ_load_config_safer&   '   sG   € ðØ1Ð1Ð1Ð1Ð1Ð1àˆ{‰}Œ}ÐøÝð ð ð Øˆtˆtðøøøs   ‚ ’
 Ÿ ÚokÚ	exhaustedÚoauthÚapi_keyÚmanualÚ
fill_firstÚround_robinÚrandomÚ
least_usedi  zcustom:>   ÚtlsÚscopeÚ	client_idÚ
expires_inÚ
token_typeÚobtained_atÚagent_key_idÚportal_base_urlÚagent_key_reusedÚagent_key_expires_inÚagent_key_obtained_atc                  ó”  — e Zd ZU ded<   ded<   ded<   ded<   ded<   ded<   ded	<   d
Zded<   d
Zded<   d
Zded<   d
Zded<   d
Zded<   d
Z	ded<   d
Z
ded<   d
Zded<   d
Zded<   d
Zded<   d
Zded<   d
Zded<   d
Zded<   d
Zded<   dZded<   d
Zded<   d „ Zd*d"„Zed+d&„¦   «         Zd,d'„Zed-d(„¦   «         Zed.d)„¦   «         Zd
S )/ÚPooledCredentialÚstrÚproviderÚidÚlabelÚ	auth_typeÚintÚpriorityÚsourceÚaccess_tokenNúOptional[str]Úrefresh_tokenÚlast_statusúOptional[float]Úlast_status_atúOptional[int]Úlast_error_codeÚlast_error_reasonÚlast_error_messageÚlast_error_reset_atÚbase_urlÚ
expires_atÚexpires_at_msÚlast_refreshÚinference_base_urlÚ	agent_keyÚagent_key_expires_atr   Úrequest_countúDict[str, Any]Úextrac                ó&   — | j         €	i | _         d S d S ©N)rY   ©Úselfs    r%   Ú__post_init__zPooledCredential.__post_init__t   s   € ØŒ:ÐØˆDŒJˆJˆJð Ðó    Únamec                ó–   — |t           v r| j                             |¦  «        S t          dt	          | ¦  «        j        › d|›�¦  «        ‚)Nú'z' object has no attribute )Ú_EXTRA_KEYSrY   ÚgetÚAttributeErrorÚtypeÚ__name__)r]   r`   s     r%   Ú__getattr__zPooledCredential.__getattr__x   sJ   € Ø•;ÐÐØ”:—>’> $Ñ'Ô'Ð'ÝÐX¥ d¡¤Ô!4ÐXÐXÐPTÐXÐXÑYÔYÐYr_   Úpayloadr   ú'PooledCredential'c                ó  ‡— d„ t          | ¦  «        D ¦   «         }ˆfd„|D ¦   «         }ˆfd„t          D ¦   «         }||d<   |                     dt          j        ¦   «         j        d d…         ¦  «         |                     d‰                     d|¦  «        ¦  «         |                     d	t          ¦  «         |                     d
d¦  «         |                     dt          ¦  «         |                     dd¦  «          | dd|i|¤ŽS )Nc                ó2   — h | ]}|j         d k    ¯|j         ’ŒS )r>   ©r`   ©Ú.0Úfs     r%   ú	<setcomp>z-PooledCredential.from_dict.<locals>.<setcomp>   s&   € ÐKÐKÐK !°a´fÀ
Ò6JÐ6J�q”vÐ6JÐ6JÐ6Jr_   c                óD   •— i | ]}|‰v ¯|‰                      |¦  «        “ŒS © )rd   ©ro   Úkri   s     €r%   ú
<dictcomp>z.PooledCredential.from_dict.<locals>.<dictcomp>€   s*   ø€ ÐGÐGÐG a¸!¸w¸,¸,��7—;’;˜q‘>”>¸,¸,¸,r_   c                ó:   •— i | ]}|‰v ¯‰|         ®|‰|         “ŒS r[   rs   rt   s     €r%   rv   z.PooledCredential.from_dict.<locals>.<dictcomp>�   s1   ø€ Ð_Ð_Ð_ 1°q¸G°|°|ÈÐPQÌ
ÐH^��G˜A”JÐH^ÐH^ÐH^r_   rY   r?   é   r@   rD   rA   rC   r   rE   Ú r>   rs   )	r   rc   Ú
setdefaultÚuuidÚuuid4Úhexrd   ÚAUTH_TYPE_API_KEYÚSOURCE_MANUAL)Úclsr>   ri   Úfield_namesÚdatarY   s     `   r%   Ú	from_dictzPooledCredential.from_dict}   s  ø€ àKÐK¥v¨c¡{¤{ÐKÑKÔKˆØGÐGÐGÐG¨;ÐGÑGÔGˆØ_Ð_Ð_Ð_­Ð_Ñ_Ô_ˆØˆˆW‰Ø�Š˜�dœj™lœlÔ.¨r°¨rÔ2Ñ3Ô3Ð3Ø�Š˜ §¢¨X°xÑ!@Ô!@ÑAÔAÐAØ�Š˜Õ%6Ñ7Ô7Ð7Ø�Š˜
 AÑ&Ô&Ð&Ø�Š˜¥-Ñ0Ô0Ð0Ø�Š˜¨Ñ+Ô+Ð+ØˆsÐ-Ð-˜HÐ-¨Ð-Ð-Ð-r_   c                óê   — h d£}i }t          | ¦  «        D ]6}|j        dv rŒt          | |j        ¦  «        }|€	|j        |v r
|||j        <   Œ7| j                             ¦   «         D ]\  }}|�|||<   Œ|S )N>   rH   rJ   rL   rM   rN   rO   )r>   rY   )r   r`   ÚgetattrrY   Úitems)r]   Ú_ALWAYS_EMITÚresultÚ	field_defÚvalueru   Úvs          r%   Úto_dictzPooledCredential.to_dict‹   s¥   € ð
ð 
ð 
ˆð "$ˆÝ ™œð 	/ð 	/ˆIØŒ~Ð!6Ð6Ð6ØÝ˜D )¤.Ñ1Ô1ˆEØÐ  I¤N°lÐ$BÐ$BØ).��y”~Ñ&øØ”J×$Ò$Ñ&Ô&ð 	ð 	‰DˆAˆqØˆ}Ø��q‘	øØˆr_   c                ó~   — | j         dk    rt          | j        p| j        pd¦  «        S t          | j        pd¦  «        S )NÚnousry   )r>   r=   rU   rE   r\   s    r%   Úruntime_api_keyz PooledCredential.runtime_api_key    sB   € àŒ=˜FÒ"Ð"Ý�t”~Ð@¨Ô):Ð@¸bÑAÔAÐAÝ�4Ô$Ð*¨Ñ+Ô+Ð+r_   c                óB   — | j         dk    r| j        p| j        S | j        S )NrŽ   )r>   rT   rP   r\   s    r%   Úruntime_base_urlz!PooledCredential.runtime_base_url¦   s'   € àŒ=˜FÒ"Ð"ØÔ*Ð;¨d¬mÐ;ØŒ}Ðr_   )r`   r=   )r>   r=   ri   rX   r   rj   )r   rX   )r   r=   )r   rF   )rg   Ú
__module__Ú__qualname__Ú__annotations__rG   rH   rJ   rL   rM   rN   rO   rP   rQ   rR   rS   rT   rU   rV   rW   rY   r^   rh   Úclassmethodrƒ   rŒ   Úpropertyr�   r‘   rs   r_   r%   r<   r<   Z   s  € € € € € € à€M€M�MØ€G€G�GØ€J€J�JØ€N€N�NØ€M€M�MØ€K€K�KØÐÐÑØ#'€MÐ'Ð'Ð'Ñ'Ø!%€KÐ%Ð%Ð%Ñ%Ø&*€NÐ*Ð*Ð*Ñ*Ø%)€OÐ)Ð)Ð)Ñ)Ø'+ÐÐ+Ð+Ð+Ñ+Ø(,ÐÐ,Ð,Ð,Ñ,Ø+/ÐÐ/Ð/Ð/Ñ/Ø"€HÐ"Ð"Ð"Ñ"Ø $€JÐ$Ð$Ð$Ñ$Ø#'€MÐ'Ð'Ð'Ñ'Ø"&€LÐ&Ð&Ð&Ñ&Ø(,ÐÐ,Ð,Ð,Ñ,Ø#€IÐ#Ð#Ð#Ñ#Ø*.ÐÐ.Ð.Ð.Ñ.Ø€MÐÐÐÑØ €EÐ Ð Ð Ñ ðð ð ðZð Zð Zð Zð
 ð.ð .ð .ñ „[ð.ðð ð ð ð* ð,ð ,ð ,ñ „Xð,ð
 ðð ð ñ „Xðð ð r_   r<   Útokenr=   Úfallbackc                óÖ   — t          | ¦  «        }dD ]V}|                     |¦  «        }t          |t          ¦  «        r*|                     ¦   «         r|                     ¦   «         c S ŒW|S )N)ÚemailÚpreferred_usernameÚupn)r   rd   Ú
isinstancer=   Ústrip)r—   r˜   ÚclaimsÚkeyrŠ   s        r%   Úlabel_from_tokenr¡   ­   sh   € Ý Ñ&Ô&€FØ5ð !ð !ˆØ—
’
˜3‘”ˆÝ�e�SÑ!Ô!ð 	! e§k¢k¡m¤mð 	!Ø—;’;‘=”=Ð Ð Ð øØ€Or_   ÚentriesúList[PooledCredential]rB   c                ó>   — t          d„ | D ¦   «         d¬¦  «        dz   S )Nc              3  ó$   K  — | ]}|j         V — Œd S r[   ©rC   ©ro   Úentrys     r%   ú	<genexpr>z!_next_priority.<locals>.<genexpr>·   s$   è è € Ð4Ð4 5�”Ð4Ð4Ð4Ð4Ð4Ð4r_   éÿÿÿÿ)Údefaulté   )Úmax)r¢   s    r%   Ú_next_priorityr®   ¶   s)   € ÝÐ4Ð4¨GÐ4Ñ4Ô4¸bÐAÑAÔAÀAÑEÐEr_   rD   Úboolc                ó¢   — | pd                      ¦   «                              ¦   «         }|t          k    p|                     t          › d�¦  «        S )Nry   ú:)rž   Úlowerr   Ú
startswith)rD   Ú
normalizeds     r%   Ú_is_manual_sourcerµ   º   sJ   € Ø�,˜B×%Ò%Ñ'Ô'×-Ò-Ñ/Ô/€JØ�Ò&ÐT¨*×*?Ò*?Å=Ð@SÐ@SÐ@SÑ*TÔ*TÐTr_   Ú
error_coderK   c                ó*   — | dk    rt           S t          S )zHReturn cooldown seconds based on the HTTP status that caused exhaustion.i­  )ÚEXHAUSTED_TTL_429_SECONDSÚEXHAUSTED_TTL_DEFAULT_SECONDS)r¶   s    r%   Ú_exhausted_ttlrº   ¿   s   € à�SÒÐÝ(Ð(Ý(Ð(r_   rŠ   r   rI   c                óð  — | �| dk    rdS t          | t          t          f¦  «        r$t          | ¦  «        }|dk    rdS |dk    r|dz  n|S t          | t          ¦  «        r–|                      ¦   «         }|sdS 	 t          |¦  «        }n# t
          $ r d}Y nw xY w|�|dk    r|dz  n|S 	 t          j        |                     dd¦  «        ¦  «         	                    ¦   «         S # t
          $ r Y dS w xY wdS )zœBest-effort parse for provider reset timestamps.

    Accepts epoch seconds, epoch milliseconds, and ISO-8601 strings.
    Returns seconds since epoch.
    Nry   r   l    J)£ç     @�@ÚZz+00:00)
r�   rB   Úfloatr=   rž   Ú
ValueErrorr   Úfromisoformatr   Ú	timestamp)rŠ   ÚnumericÚraws      r%   Ú_parse_absolute_timestamprÄ   Æ   s;  € ð €}˜ š˜ØˆtÝ�%�#�u˜Ñ&Ô&ð LÝ˜‘,”,ˆØ�aŠ<ˆ<Ø�4Ø#*Ð->Ò#>Ð#>ˆw˜ÑÐÀGÐKÝ�%�ÑÔð Ø�kŠk‰mŒmˆØð 	Ø�4ð	Ý˜C‘j”jˆGˆGøÝð 	ð 	ð 	ØˆGˆGˆGð	øøøàÐØ'.Ð1BÒ'BÐ'B�7˜VÑ#Ð#ÈÐOð	ÝÔ)¨#¯+ª+°c¸8Ñ*DÔ*DÑEÔE×OÒOÑQÔQÐQøÝð 	ð 	ð 	Ø�4�4ð	øøøàˆ4s$   Á9B	 Â	BÂBÂ+9C% Ã%
C3Ã2C3Úmessagec                ó‚  — | sd S t          j        d| t           j        ¦  «        }|rTt          |                     d¦  «        ¦  «        }|                     d¦  «                             ¦   «         dk    r|dz  n|S t          j        d| t           j        ¦  «        }|r"t          |                     d¦  «        ¦  «        S d S )Nz,quotaResetDelay[:\s\"]+(\d+(?:\.\d+)?)(ms|s)r¬   é   Úmsr¼   z?retry\s+(?:after\s+)?(\d+(?:\.\d+)?)\s*(?:sec|secs|seconds|s\b))ÚreÚsearchÚ
IGNORECASEr¾   Úgroupr²   )rÅ   Údelay_matchrŠ   Ú	sec_matchs       r%   Ú_extract_retry_delay_secondsrÏ   ä   s½   € Øð ØˆtÝ”)ÐKÈWÕVXÔVcÑdÔd€KØð QÝ�k×'Ò'¨Ñ*Ô*Ñ+Ô+ˆØ!,×!2Ò!2°1Ñ!5Ô!5×!;Ò!;Ñ!=Ô!=ÀÒ!EÐ!Eˆu�v‰~ˆ~È5ÐPÝ”	Ð\Ð^eÕgiÔgtÑuÔu€IØð )Ý�Y—_’_ QÑ'Ô'Ñ(Ô(Ð(Øˆ4r_   Úerror_contextúOptional[Dict[str, Any]]rX   c                ó²  — t          | t          ¦  «        si S i }|                      d¦  «        }t          |t          ¦  «        r+|                     ¦   «         r|                     ¦   «         |d<   |                      d¦  «        }t          |t          ¦  «        r+|                     ¦   «         r|                     ¦   «         |d<   |                      d¦  «        p)|                      d¦  «        p|                      d¦  «        }t          |¦  «        }|€<t          |t          ¦  «        r't          |¦  «        }|�t          j        ¦   «         |z   }|�||d<   |S )NÚreasonrÅ   Úreset_atÚ	resets_atÚretry_until)r�   Údictrd   r=   rž   rÄ   rÏ   Útime)rÐ   r´   rÓ   rÅ   rÔ   Úparsed_reset_atÚretry_delay_secondss          r%   Ú_normalize_error_contextrÛ   ñ   sK  € Ý�m¥TÑ*Ô*ð Øˆ	Ø!#€JØ×Ò˜xÑ(Ô(€FÝ�&�#ÑÔð . 6§<¢<¡>¤>ð .Ø%Ÿ|š|™~œ~ˆ
�8ÑØ×Ò 	Ñ*Ô*€GÝ�'�3ÑÔð 0 G§M¢M¡O¤Oð 0Ø '§¢¡¤ˆ
�9Ñà×Ò˜*Ñ%Ô%ð 	,Ø×Ò˜[Ñ)Ô)ð	,à×Ò˜]Ñ+Ô+ð õ
 0°Ñ9Ô9€OØÐ¥:¨gµsÑ#;Ô#;ÐÝ:¸7ÑCÔCÐØÐ*Ý"œi™kœkÐ,?Ñ?ˆOØÐ"Ø!0ˆ
�:ÑØÐr_   r¨   c                ó´   — | j         t          k    rd S t          t          | dd ¦  «        ¦  «        }|�|S | j        r| j        t          | j        ¦  «        z   S d S )NrO   )rH   ÚSTATUS_EXHAUSTEDrÄ   r…   rJ   rº   rL   )r¨   rÔ   s     r%   Ú_exhausted_untilrÞ   
  se   € ØÔÕ,Ò,Ð,ØˆtÝ(­°Ð8MÈtÑ)TÔ)TÑUÔU€HØÐØˆØÔð LØÔ#¥n°UÔ5JÑ&KÔ&KÑKÐKØˆ4r_   r`   c                óv   — |                       ¦   «                              ¦   «                              dd¦  «        S )z>Normalize a custom provider name for use as a pool key suffix.Ú Ú-)rž   r²   r   rm   s    r%   Ú_normalize_custom_pool_namerâ     s,   € à�:Š:‰<Œ<×ÒÑÔ×'Ò'¨¨SÑ1Ô1Ð1r_   Úconfigc              #  óˆ  K  — | €t          ¦   «         } | €dS |                      d¦  «        }t          |t          ¦  «        s$	 ddlm}  || ¦  «        }n# t          $ r Y dS w xY w|sdS |D ]V}t          |t          ¦  «        sŒ|                     d¦  «        }t          |t          ¦  «        sŒCt          |¦  «        |fV — ŒWdS )zJYield (normalized_name, entry_dict) for each valid custom_providers entry.NÚcustom_providersr   )Úget_compatible_custom_providersr`   )
r&   rd   r�   Úlistr#   ræ   r$   r×   r=   râ   )rã   rå   ræ   r¨   r`   s        r%   Ú_iter_custom_providersrè     s  è è € à€~Ý"Ñ$Ô$ˆØ€~ØˆØ—z’zÐ"4Ñ5Ô5ÐÝÐ&­Ñ-Ô-ð ð	ØIÐIÐIÐIÐIÐIà>Ð>¸vÑFÔFÐÐøÝð 	ð 	ð 	ØˆFˆFð	øøøàð ØˆØ!ð 7ð 7ˆÝ˜%¥Ñ&Ô&ð 	ØØ�yŠy˜Ñ Ô ˆÝ˜$¥Ñ$Ô$ð 	ØÝ)¨$Ñ/Ô/°Ð6Ð6Ð6Ð6Ð6ð7ð 7s   ÁA Á
A"Á!A"rP   rF   c                ó@  — | sdS |                       ¦   «                              d¦  «        }t          ¦   «         D ]c\  }}t          |                     d¦  «        pd¦  «                              ¦   «                              d¦  «        }|r||k    rt
          › |› �c S ŒddS )z‘Look up the custom_providers list in config.yaml and return 'custom:<name>' for a matching base_url.

    Returns None if no match is found.
    Nú/rP   ry   )rž   Úrstriprè   r=   rd   ÚCUSTOM_POOL_PREFIX)rP   Únormalized_urlÚ	norm_namer¨   Ú	entry_urls        r%   Úget_custom_provider_pool_keyrð   4  s¯   € ð
 ð ØˆtØ—^’^Ñ%Ô%×,Ò,¨SÑ1Ô1€NÝ2Ñ4Ô4ð 6ð 6Ñˆ	�5Ý˜Ÿ	š	 *Ñ-Ô-Ð3°Ñ4Ô4×:Ò:Ñ<Ô<×CÒCÀCÑHÔHˆ	Øð 	6˜ nÒ4Ð4Ý(Ð5¨)Ð5Ð5Ð5Ð5Ð5øØˆ4r_   ú	List[str]c                 óX   ‡ — t          d¦  «        Š t          ˆ fd„‰ D ¦   «         ¦  «        S )z?Return all 'custom:*' pool keys that have entries in auth.json.Nc              3  ó°   •K  — | ]P}|                      t          ¦  «        ¯t          ‰                     |¦  «        t          ¦  «        ¯D‰|         ¯L|V — ŒQd S r[   )r³   rì   r�   rd   rç   )ro   r    Ú	pool_datas     €r%   r©   z-list_custom_pool_providers.<locals>.<genexpr>F  sx   øè è € ð ð ØØ�>Š>Õ,Ñ-Ô-ðõ �y—}’} SÑ)Ô)­4Ñ0Ô0ðð �cŒNð	Øðð ð ð ð ð r_   )r   Úsorted)rô   s   @r%   Úlist_custom_pool_providersrö   C  sH   ø€ å$ TÑ*Ô*€IÝð ð ð ð Ø ðñ ô ñ ô ð r_   Úpool_keyc                ó²   — |                       t          ¦  «        sdS | t          t          ¦  «        d…         }t          ¦   «         D ]\  }}||k    r|c S ŒdS )zWReturn the custom_providers config entry matching a pool key like 'custom:together.ai'.N)r³   rì   Úlenrè   )r÷   Úsuffixrî   r¨   s       r%   Ú_get_custom_provider_configrû   N  so   € à×ÒÕ1Ñ2Ô2ð ØˆtØ•cÕ,Ñ-Ô-Ð.Ð.Ô/€FÝ2Ñ4Ô4ð ð Ñˆ	�5Ø˜ÒÐØˆLˆLˆLð àˆ4r_   r>   c                óH  — t          ¦   «         }|€t          S |                     d¦  «        }t          |t          ¦  «        st          S t          |                     | d¦  «        pd¦  «                             ¦   «                              ¦   «         }|t          v r|S t          S )z8Return the configured selection strategy for a provider.NÚcredential_pool_strategiesry   )	r&   ÚSTRATEGY_FILL_FIRSTrd   r�   r×   r=   rž   r²   ÚSUPPORTED_POOL_STRATEGIES)r>   rã   Ú
strategiesÚstrategys       r%   Úget_pool_strategyr  Y  s‘   € åÑ Ô €FØ€~Ý"Ð"à—’Ð8Ñ9Ô9€JÝ�j¥$Ñ'Ô'ð #Ý"Ð"å�:—>’> (¨BÑ/Ô/Ð5°2Ñ6Ô6×<Ò<Ñ>Ô>×DÒDÑFÔF€HØÕ,Ð,Ð,ØˆÝÐr_   r¬   c                  óò   — e Zd Zd9d„Zd:d„Zd:d	„Zd;d
„Zd<d„Zd=d„Zd>d„Z		 d?d@d„Z
dAd„ZdAd„ZdBd„ZdCd„ZdDd„Zd<d „Zd!d!d"œdEd%„Zd<d&„Zd<d'„Zdd(œdFd)„Zd?dGd,„ZdHd-„Zd<d.„Zd<d/„ZdId1„ZdJd3„ZdKd7„ZdAd8„ZdS )LÚCredentialPoolr>   r=   r¢   r£   c                óÎ   — || _         t          |d„ ¬¦  «        | _        d | _        t	          |¦  «        | _        t          j        ¦   «         | _        i | _	        t          | _        d S )Nc                ó   — | j         S r[   r¦   ©r¨   s    r%   ú<lambda>z)CredentialPool.__init__.<locals>.<lambda>o  s   € ¸%¼.€ r_   ©r    )r>   rõ   Ú_entriesÚ_current_idr  Ú	_strategyÚ	threadingÚLockÚ_lockÚ_active_leasesÚ%DEFAULT_MAX_CONCURRENT_PER_CREDENTIALÚ_max_concurrent)r]   r>   r¢   s      r%   Ú__init__zCredentialPool.__init__m  s]   € Ø ˆŒÝ˜wÐ,HÐ,HÐIÑIÔIˆŒØ*.ˆÔÝ*¨8Ñ4Ô4ˆŒÝ”^Ñ%Ô%ˆŒ
Ø.0ˆÔÝDˆÔÐÐr_   r   r¯   c                ó*   — t          | j        ¦  «        S r[   )r¯   r
  r\   s    r%   Úhas_credentialszCredentialPool.has_credentialsv  ó   € Ý�D”MÑ"Ô"Ð"r_   c                óD   — t          |                      ¦   «         ¦  «        S )zCTrue if at least one entry is not currently in exhaustion cooldown.)r¯   Ú_available_entriesr\   s    r%   Úhas_availablezCredentialPool.has_availabley  s   € å�D×+Ò+Ñ-Ô-Ñ.Ô.Ð.r_   c                ó*   — t          | j        ¦  «        S r[   )rç   r
  r\   s    r%   r¢   zCredentialPool.entries}  r  r_   úOptional[PooledCredential]c                óX   ‡ — ‰ j         sd S t          ˆ fd„‰ j        D ¦   «         d ¦  «        S )Nc              3  ó<   •K  — | ]}|j         ‰j        k    ¯|V — Œd S r[   )r?   r  ©ro   r¨   r]   s     €r%   r©   z)CredentialPool.current.<locals>.<genexpr>ƒ  s2   øè è € ÐVÐV˜u¸¼ÀTÔEUÒ9UÐ9U�UÐ9UÐ9UÐ9UÐ9UÐVÐVr_   )r  Únextr
  r\   s   `r%   ÚcurrentzCredentialPool.current€  s;   ø€ ØÔð 	Ø�4ÝÐVÐVÐVÐV¨¬ÐVÑVÔVÐX\Ñ]Ô]Ð]r_   Úoldr<   ÚnewÚNonec                ót   — t          | j        ¦  «        D ]"\  }}|j        |j        k    r|| j        |<    dS Œ#dS )z4Swap an entry in-place by id, preserving sort order.N)Ú	enumerater
  r?   )r]   r!  r"  Úidxr¨   s        r%   Ú_replace_entryzCredentialPool._replace_entry…  sP   € å# D¤MÑ2Ô2ð 	ð 	‰JˆC�ØŒx˜3œ6Ò!Ð!Ø%(�”˜cÑ"Ø��ð "ð	ð 	r_   c                óN   — t          | j        d„ | j        D ¦   «         ¦  «         d S )Nc                ó6   — g | ]}|                      ¦   «         ‘ŒS rs   ©rŒ   r§   s     r%   ú
<listcomp>z+CredentialPool._persist.<locals>.<listcomp>�  s    € Ð8Ð8Ð8 ˆU�]Š]‰_Œ_Ð8Ð8Ð8r_   )r   r>   r
  r\   s    r%   Ú_persistzCredentialPool._persistŒ  s6   € ÝØŒMØ8Ð8¨$¬-Ð8Ñ8Ô8ñ	
ô 	
ð 	
ð 	
ð 	
r_   Nr¨   Ústatus_coderK   rÐ   rÑ   c                óB  — t          |¦  «        }t          |t          t          j        ¦   «         ||                     d¦  «        |                     d¦  «        |                     d¦  «        ¬¦  «        }|                      ||¦  «         |                      ¦   «          |S )NrÓ   rÅ   rÔ   ©rH   rJ   rL   rM   rN   rO   )rÛ   r   rÝ   rØ   rd   r'  r,  )r]   r¨   r-  rÐ   Únormalized_errorÚupdateds         r%   Ú_mark_exhaustedzCredentialPool._mark_exhausted’  s•   € õ 4°MÑBÔBÐÝØÝ(Ýœ9™;œ;Ø'Ø.×2Ò2°8Ñ<Ô<Ø/×3Ò3°IÑ>Ô>Ø 0× 4Ò 4°ZÑ @Ô @ð
ñ 
ô 
ˆð 	×Ò˜E 7Ñ+Ô+Ð+Ø�Š‰ŒˆØˆr_   c           	     ó(  — | j         dk    s|j        dk    r|S 	 ddlm}  |¦   «         }|s|S |                     dd¦  «        }|                     dd¦  «        }|                     dd¦  «        }|rm||j        k    rbt                               d	|j        ¦  «         t          ||||d
d
d
¬¦  «        }|  
                    ||¦  «         |                      ¦   «          |S n2# t          $ r%}t                               d|¦  «         Y d
}~nd
}~ww xY w|S )a‡  Sync a claude_code pool entry from ~/.claude/.credentials.json if tokens differ.

        OAuth refresh tokens are single-use. When something external (e.g.
        Claude Code CLI, or another profile's pool) refreshes the token, it
        writes the new pair to ~/.claude/.credentials.json. The pool entry's
        refresh token becomes stale. This method detects that and syncs.
        Ú	anthropicÚclaude_coder   )Úread_claude_code_credentialsÚrefreshTokenry   ÚaccessTokenÚ	expiresAtzKPool entry %s: syncing tokens from credentials file (refresh token changed)N©rE   rG   rR   rH   rJ   rL   z(Failed to sync from credentials file: %s)r>   rD   Úagent.anthropic_adapterr6  rd   rG   ÚloggerÚdebugr?   r   r'  r,  r$   )	r]   r¨   r6  ÚcredsÚfile_refreshÚfile_accessÚfile_expiresr1  Úexcs	            r%   Ú+_sync_anthropic_entry_from_credentials_filez:CredentialPool._sync_anthropic_entry_from_credentials_file¦  s\  € ð Œ=˜KÒ'Ð'¨5¬<¸=Ò+HÐ+HØˆLð	JØLÐLÐLÐLÐLÐLØ0Ð0Ñ2Ô2ˆEØð Ø�Ø Ÿ9š9 ^°RÑ8Ô8ˆLØŸ)š) M°2Ñ6Ô6ˆKØ Ÿ9š9 [°!Ñ4Ô4ˆLàð  °Ô0CÒ CÐ CÝ—’ÐjÐlqÔltÑuÔuÐuÝ!ØØ!,Ø".Ø".Ø $Ø#'Ø$(ðñ ô �ð ×#Ò# E¨7Ñ3Ô3Ð3Ø—’‘”�Ø�øøÝð 	Jð 	Jð 	JÝ�LŠLÐCÀSÑIÔIÐIÐIÐIÐIÐIÐIøøøøð	Jøøøàˆs   šC  ®B0C  Ã 
DÃ*D
Ä
Dc                óÔ  — | j         dk    s|j        dk    r|S 	 t          ¦   «         5  t          ¦   «         }t	          |d¦  «        }ddd¦  «         n# 1 swxY w Y   |s|S |                     dd¦  «        }|                     dd¦  «        }|�r$||j        k    �rt                               d|j	        ¦  «         ||ddddœ}|                     d	¦  «        r|d	         |d	<   |                     d
¦  «        r|d
         |d
<   |                     d¦  «        r|d         |d<   |                     d¦  «        r|d         |d<   t          |j        ¦  «        }dD ]}|                     |¦  «        }	|	�|	||<   Œt          |fd|i|¤Ž}
|                      ||
¦  «         |                      ¦   «          |
S n2# t          $ r%}t                               d|¦  «         Y d}~nd}~ww xY w|S )aä  Sync a Nous pool entry from auth.json if tokens differ.

        Nous OAuth refresh tokens are single-use.  When another process
        (e.g. a concurrent cron) refreshes the token via
        ``resolve_nous_runtime_credentials``, it writes fresh tokens to
        auth.json under ``_auth_store_lock``.  The pool entry's tokens
        become stale.  This method detects that and adopts the newer pair,
        avoiding a "refresh token reuse" revocation on the Nous Portal.
        rŽ   Údevice_codeNrG   ry   rE   zIPool entry %s: syncing tokens from auth.json (Nous refresh token changed))rE   rG   rH   rJ   rL   rQ   rU   rV   rT   ©r5   r3   r6   r9   r8   r:   rY   z,Failed to sync Nous entry from auth.json: %s)r>   rD   r   r   r   rd   rG   r<  r=  r?   r×   rY   r   r'  r,  r$   )r]   r¨   Ú
auth_storeÚstateÚstore_refreshÚstore_accessÚfield_updatesÚextra_updatesÚ	extra_keyÚvalr1  rB  s               r%   Ú _sync_nous_entry_from_auth_storez/CredentialPool._sync_nous_entry_from_auth_storeË  s£  € ð Œ=˜FÒ"Ð" e¤l°mÒ&CÐ&CØˆLð(	NÝ!Ñ#Ô#ð Að AÝ-Ñ/Ô/�
Ý,¨Z¸Ñ@Ô@�ðAð Að Añ Aô Að Að Að Að Að Að Aøøøð Að Að Að Að ð Ø�Ø!ŸIšI o°rÑ:Ô:ˆMØ Ÿ9š9 ^°RÑ8Ô8ˆLØñ  °%Ô2EÒ!EÑ!EÝ—’Ø_Ø”Hñô ð ð
 %1Ø%2Ø#'Ø&*Ø'+ð1ð 1�ð —9’9˜\Ñ*Ô*ð FØ27¸Ô2E�M ,Ñ/Ø—9’9˜[Ñ)Ô)ð DØ16°{Ô1C�M +Ñ.Ø—9’9Ð3Ñ4Ô4ð ZØ<AÐBXÔ<Y�MÐ"8Ñ9Ø—9’9Ð1Ñ2Ô2ð VØ:?Ð@TÔ:U�MÐ"6Ñ7Ý $ U¤[Ñ 1Ô 1�ð";ð 7ð 7�Ið  Ÿ)š) IÑ.Ô.�CØ�Ø36˜ iÑ0øÝ! %ÐNÐN¨}ÐNÀÐNÐN�Ø×#Ò# E¨7Ñ3Ô3Ð3Ø—’‘”�Ø�øøÝð 	Nð 	Nð 	NÝ�LŠLÐGÈÑMÔMÐMÐMÐMÐMÐMÐMøøøøð	NøøøàˆsA   šF6 ¨AÁF6 ÁAÁF6 ÁAÁF6 Á"EF6 Æ6
G%Ç G Ç G%c                ó$  — |j         dk    rdS 	 t          ¦   «         5  t          ¦   «         }| j        dk    r·t	          |d¦  «        }|€	 ddd¦  «         dS |j        |d<   |j        r
|j        |d<   |j        r
|j        |d<   |j        r
|j        |d<   |j	        r
|j	        |d<   d	D ]#}|j
                             |¦  «        }|�|||<   Œ$|j        r
|j        |d
<   t          |d|¦  «         nÂ| j        dk    r©t	          |d¦  «        }t          |t          ¦  «        s	 ddd¦  «         dS |                     d¦  «        }t          |t          ¦  «        s	 ddd¦  «         dS |j        |d<   |j        r
|j        |d<   |j        r
|j        |d<   t          |d|¦  «         n	 ddd¦  «         dS t#          |¦  «         ddd¦  «         dS # 1 swxY w Y   dS # t$          $ r,}t&                               d| j        |¦  «         Y d}~dS d}~ww xY w)u  Write refreshed pool entry tokens back to auth.json providers.

        After a pool-level refresh, the pool entry has fresh tokens but
        auth.json's ``providers.<id>`` still holds the pre-refresh state.
        On the next ``load_pool()``, ``_seed_from_singletons()`` reads that
        stale state and can overwrite the fresh pool entry â€” potentially
        re-seeding a consumed single-use refresh token.

        Applies to any OAuth provider whose singleton lives in auth.json
        (currently Nous and OpenAI Codex).
        rE  NrŽ   rE   rG   rQ   rU   rV   rF  rT   úopenai-codexÚtokensrS   z3Failed to sync %s pool entry back to auth store: %s)rD   r   r   r>   r   rE   rG   rQ   rU   rV   rY   rd   rT   r   r�   r×   rS   r   r$   r<  r=  )r]   r¨   rG  rH  rM  rN  rR  rB  s           r%   Ú%_sync_device_code_entry_to_auth_storez4CredentialPool._sync_device_code_entry_to_auth_store  sL  € ð Œ<˜=Ò(Ð(ØˆFð-	dÝ!Ñ#Ô#ð *-ð *-Ý-Ñ/Ô/�
Ø”= FÒ*Ð*Ý0°¸VÑDÔD�EØ�}Øð*-ð *-ð *-ñ *-ô *-ð *-ð *-ð *-ð -2Ô,>�E˜.Ñ)ØÔ*ð EØ16Ô1D˜˜oÑ.ØÔ'ð ?Ø.3Ô.>˜˜lÑ+Ø”ð =Ø-2¬_˜˜kÑ*ØÔ1ð SØ8=Ô8R˜Ð4Ñ5ð&?ð 3ð 3˜	ð $œkŸošo¨iÑ8Ô8˜Ø˜?Ø/2˜E )Ñ,øØÔ/ð OØ6;Ô6N˜Ð2Ñ3Ý(¨°V¸UÑCÔCÐCÐCà”] nÒ4Ð4Ý0°¸^ÑLÔL�EÝ% e­TÑ2Ô2ð Øð9*-ð *-ð *-ñ *-ô *-ð *-ð *-ð *-ð: #ŸYšY xÑ0Ô0�FÝ% f­dÑ3Ô3ð Øð?*-ð *-ð *-ñ *-ô *-ð *-ð *-ð *-ð@ .3Ô-?�F˜>Ñ*ØÔ*ð FØ27Ô2E˜˜Ñ/ØÔ)ð CØ05Ô0B˜˜nÑ-Ý(¨°^ÀUÑKÔKÐKÐKð ðQ*-ð *-ð *-ñ *-ô *-ð *-ð *-ð *-õT ! Ñ,Ô,Ð,ðU*-ð *-ð *-ñ *-ô *-ð *-ð *-ð *-ð *-ð *-ð *-ð *-øøøð *-ð *-ð *-ð *-ð *-ð *-øõV ð 	dð 	dð 	dÝ�LŠLÐNÐPTÔP]Ð_bÑcÔcÐcÐcÐcÐcÐcÐcÐcøøøøð	døøøsk   �G �-GÁ
G ÁCGÄG Ä,+GÅG Å$?GÆ#G Æ0GÆ?G ÇGÇG ÇGÇG Ç
HÇ#!H
È
HÚforcec               óÂ
  — |j         t          k    s|j        s|r|                      |d ¦  «         d S 	 | j        dk    r½ddlm}  ||j        |j                             d¦  «        ¬¦  «        }t          ||d         |d         |d         ¬	¦  «        }|j        d
k    r[	 ddlm
}  ||d         |d         |d         ¦  «         �n”# t          $ r&}t                               d|¦  «         Y d }~�nid }~ww xY w�n_| j        dk    rSt          j        |j        |j        ¦  «        }t          ||d         |d         |                     d¦  «        ¬¦  «        }�n| j        dk    rô|                      |¦  «        }||ur|}|j        |j        |j        |j        |j        |j        |j        |j        |j        |j        |j        |j        dœ}	t          j        |	t<          ||¬¦  «        }i }
t?          |j         ¦  «        }d„ tC          |¦  «        D ¦   «         }| "                    ¦   «         D ]\  }}||v r||
|<   Œ|tF          v r|||<   Œt          |fd|i|
¤Ž}n|S �n©# t          $ �r›}t                               d| j        |j$        |¦  «         | j        dk    �rœ|j        d
k    �r�|  %                    |¦  «        }|j        |j        k    �r4t                               d¦  «         	 ddlm}  ||j        |j                             d¦  «        ¬¦  «        }t          ||d         |d         |d         tL          d d ¬¦  «        }|  '                    ||¦  «         |  (                    ¦   «          	 ddlm
}  ||d         |d         |d         ¦  «         n2# t          $ r%}t                               d|¦  «         Y d }~nd }~ww xY w|cY d }~S # t          $ r%}t                               d|¦  «         Y d }~n>d }~ww xY w|  )                    |¦  «        s!t                               d¦  «         |cY d }~S | j        dk    r |                      |¦  «        }|j        |j        k    r{t                               d¦  «         t          |tL          d d d d d ¬¦  «        }|  '                    ||¦  «         |  (                    ¦   «          |  *                    |¦  «         |cY d }~S |                      |d ¦  «         Y d }~d S d }~ww xY wt          |tL          d d d d d ¬¦  «        }|  '                    ||¦  «         |  (                    ¦   «          |  *                    |¦  «         |S )Nr4  r   )Úrefresh_anthropic_oauth_pureÚhermes_pkce)Úuse_jsonrE   rG   rR   )rE   rG   rR   r5  )Ú_write_claude_code_credentialsz7Failed to write refreshed token to credentials file: %srQ  rS   )rE   rG   rS   rŽ   )rE   rG   r2   r7   rT   r4   r1   r5   rQ   rU   rV   r0   )Úmin_key_ttl_secondsÚforce_refreshÚ
force_mintc                ó   — h | ]	}|j         ’Œ
S rs   rm   rn   s     r%   rq   z0CredentialPool._refresh_entry.<locals>.<setcomp>†  s   € Ð>Ð>Ð>¨1 ¤Ð>Ð>Ð>r_   rY   z'Credential refresh failed for %s/%s: %sz8Retrying refresh with synced token from credentials filer:  zDFailed to write refreshed token to credentials file (retry path): %szRetry refresh also failed: %sz7Credentials file has valid token, using without refreshu?   Nous refresh failed but auth.json has newer tokens â€” adoptingr/  )+rA   ÚAUTH_TYPE_OAUTHrG   r2  r>   r;  rV  rD   Úendswithr   rY  r$   r<  r=  Úauth_modÚrefresh_codex_oauth_purerE   rd   rO  r2   r7   rT   r4   r1   r5   rQ   rU   rV   r0   Úrefresh_nous_oauth_from_stater   r×   rY   r   r†   rc   r?   rC  Ú	STATUS_OKr'  r,  Ú_entry_needs_refreshrS  )r]   r¨   rT  rV  Ú	refreshedr1  rY  ÚwexcÚsyncedÚ
nous_staterK  rL  Ú_field_namesru   r‹   rB  Ú	retry_excs                    r%   Ú_refresh_entryzCredentialPool._refresh_entry?  s³  € ØŒ?�oÒ-Ð-°UÔ5HÐ-Øð 2Ø×$Ò$ U¨DÑ1Ô1Ð1Ø�4ðI	ØŒ} Ò+Ð+ØPÐPÐPÐPÐPÐPà8Ð8ØÔ'Ø"œ\×2Ò2°=ÑAÔAðñ ô �	õ "ØØ!*¨>Ô!:Ø"+¨OÔ"<Ø"+¨OÔ"<ð	ñ ô �ð ”< =Ò0Ð0ðfØZÐZÐZÐZÐZÐZØ6Ð6Ø% nÔ5Ø% oÔ6Ø% oÔ6ñô ð ñ øõ
 %ð fð fð fÝŸšÐ%^Ð`dÑeÔeÐeÐeÐeÐeÐeÑeøøøøðføøøñ 1ð ” .Ò0Ð0Ý$Ô=ØÔ&ØÔ'ñô �	õ "ØØ!*¨>Ô!:Ø"+¨OÔ"<Ø!*§¢¨~Ñ!>Ô!>ð	ñ ô �‘ð ” &Ò(Ð(Ø×>Ò>¸uÑEÔE�Ø Ð&Ð&Ø"�Eà$)Ô$6Ø%*Ô%8Ø!&¤Ø',Ô'<Ø*/Ô*BØ"'Ô"2Ø"œ[Ø#(Ô#4Ø"'Ô"2Ø!&¤Ø,1Ô,FØ œ9ðð �
õ %ÔBØÝ(IØ"'Ø$ð	ñ ô �	ð !#�Ý $ U¤[Ñ 1Ô 1�Ø>Ð>µ°u±´Ð>Ñ>Ô>�Ø%ŸOšOÑ-Ô-ð -ð -‘D�A�qØ˜LÐ(Ð(Ø+,˜ aÑ(Ð(Ø�kÐ)Ð)Ø+,˜ aÑ(øÝ! %ÐNÐN¨}ÐNÀÐNÐN��à�ùøÝð ?	ñ ?	ð ?	Ý�LŠLÐBÀDÄMÐSXÔS[Ð]`ÑaÔaÐað Œ} Ò+Ñ+°´ÀÒ0MÑ0MØ×IÒIÈ%ÑPÔP�ØÔ'¨5Ô+>Ò>Ñ>Ý—L’LÐ![Ñ\Ô\Ð\ðQØXÐXÐXÐXÐXÐXØ$@Ð$@Ø"Ô0Ø%+¤]×%;Ò%;¸MÑ%JÔ%Jð%ñ %ô %˜	õ #*Ø"Ø)2°>Ô)BØ*3°OÔ*DØ*3°OÔ*DÝ(1Ø+/Ø,0ð#ñ #ô #˜ð ×+Ò+¨F°GÑ<Ô<Ð<ØŸš™œ˜ðwØ^Ð^Ð^Ð^Ð^Ð^Ø:Ð:Ø )¨.Ô 9Ø )¨/Ô :Ø )¨/Ô :ñô ð ð øõ
  )ð wð wð wÝ"ŸLšLÐ)oÐquÑvÔvÐvÐvÐvÐvÐvÐvøøøøðwøøøà&˜˜˜˜˜˜øÝ$ð Qð Qð QÝŸšÐ%DÀiÑPÔPÐPÐPÐPÐPÐPÐPøøøøðQøøøà×2Ò2°6Ñ:Ô:ð "å—L’LÐ!ZÑ[Ô[Ð[Ø!�M�M�M�M�M�Mð Œ} Ò&Ð&Ø×>Ò>¸uÑEÔE�ØÔ'¨5Ô+>Ò>Ð>Ý—L’LÐ!bÑcÔcÐcÝ%ØÝ$-Ø'+Ø(,Ø*.Ø+/Ø,0ðñ ô �Gð ×'Ò'¨°Ñ8Ô8Ð8Ø—M’M‘O”O�OØ×>Ò>¸wÑGÔGÐGØ"�N�N�N�N�N�NØ× Ò  ¨Ñ-Ô-Ð-Ø�4�4�4�4�4øøøøð?	øøøõB ØÝ!ØØ Ø"Ø#Ø $ð
ñ 
ô 
ˆð 	×Ò˜E 7Ñ+Ô+Ð+Ø�Š‰Œˆð 	×2Ò2°7Ñ;Ô;Ð;Øˆs²   ³A+I Â%C ÃI Ã
C6ÃC1Ã+I Ã1C6Ã6E#I ÉTÉ'A?S=Ë'BOÍ/%NÎOÎ
OÎN?Î:OÎ?OÏOÏTÏ
O=ÏO8Ï3S=Ï8O=Ï=3S=Ð0TÐ6B%S=ÓTÓ!S=Ó=Tc                ó.  — |j         t          k    rdS | j        dk    rE|j        €dS t	          |j        ¦  «        t	          t          j        ¦   «         dz  ¦  «        dz   k    S | j        dk    rt          |j        t          ¦  «        S | j        dk    rdS dS )NFr4  iè  iÀÔ rQ  rŽ   )	rA   r^  r>   rR   rB   rØ   r   rE   r   ©r]   r¨   s     r%   rd  z#CredentialPool._entry_needs_refreshá  s    € ØŒ?�oÒ-Ð-Ø�5ØŒ=˜KÒ'Ð'ØÔ"Ð*Ø�uÝ�uÔ*Ñ+Ô+­sµ4´9±;´;ÀÑ3EÑ/FÔ/FÈÑ/PÒPÐPØŒ=˜NÒ*Ð*Ý2ØÔ"Ý7ñô ð ð Œ=˜FÒ"Ð"ð �5Øˆur_   c                ól   — | j         5  |                      ¦   «         cd d d ¦  «         S # 1 swxY w Y   d S r[   )r  Ú_select_unlockedr\   s    r%   ÚselectzCredentialPool.selectô  s}   € ØŒZð 	+ð 	+Ø×(Ò(Ñ*Ô*ð	+ð 	+ð 	+ð 	+ñ 	+ô 	+ð 	+ð 	+ð 	+ð 	+ð 	+ð 	+øøøð 	+ð 	+ð 	+ð 	+ð 	+ð 	+ó   ˆ)©-°-F©Úclear_expiredÚrefreshrs  rt  c          
     óÔ  — t          j         ¦   «         }d}g }| j        D �]1}| j        dk    r8|j        dk    r-|j        t
          k    r|                      |¦  «        }||ur|}d}| j        dk    r8|j        dk    r-|j        t
          k    r|                      |¦  «        }||ur|}d}|j        t
          k    rOt          |¦  «        }|�||k     rŒ±|r5t          |t          ddddd¬¦  «        }	|                      ||	¦  «         |	}d}|r2|                      |¦  «        r|                      |d¬	¦  «        }
|
€�Œ|
}|                     |¦  «         �Œ3|r|                      ¦   «          |S )
a  Return entries not currently in exhaustion cooldown.

        When *clear_expired* is True, entries whose cooldown has elapsed are
        reset to STATUS_OK and persisted.  When *refresh* is True, entries
        that need a token refresh are refreshed (skipped on failure).
        Fr4  r5  TrŽ   rE  Nr/  ©rT  )rØ   r
  r>   rD   rH   rÝ   rC  rO  rÞ   r   rc  r'  rd  rk  Úappendr,  )r]   rs  rt  ÚnowÚcleared_anyÚ	availabler¨   rg  Úexhausted_untilÚclearedre  s              r%   r  z!CredentialPool._available_entriesø  sÆ  € õ Œi‰kŒkˆØˆØ,.ˆ	Ø”]ð +	$ñ +	$ˆEð ” Ò,Ð,°´ÀÒ1NÐ1NØÔ)Õ-=Ò=Ð=Ø×IÒIÈ%ÑPÔP�Ø Ð&Ð&Ø"�EØ"&�Kð
 ” Ò'Ð'Øœ¨Ò5Ð5ØÔ)Õ-=Ò=Ð=Ø×>Ò>¸uÑEÔE�Ø Ð&Ð&Ø"�EØ"&�KØÔ Õ$4Ò4Ð4Ý"2°5Ñ"9Ô"9�Ø"Ð.°3¸Ò3HÐ3HØØ ð 'Ý%ØÝ$-Ø'+Ø(,Ø*.Ø+/Ø,0ðñ ô �Gð ×'Ò'¨¨wÑ7Ô7Ð7Ø#�EØ"&�KØð "˜4×4Ò4°UÑ;Ô;ð "Ø ×/Ò/°¸UÐ/ÑCÔC�	ØÐ$ÙØ!�Ø×Ò˜UÑ#Ô#Ð#Ñ#Øð 	Ø�MŠM‰OŒOˆOØÐr_   c                ó†  ‡— |                       dd¬¦  «        }|s#d | _        t                               d¦  «         d S | j        t
          k    r"t          j        |¦  «        Š‰j        | _        ‰S | j        t          k    rbt          |¦  «        dk    rOt          |d„ ¬¦  «        Št          ‰‰j        dz   ¬¦  «        }|                      ‰|¦  «         ‰j        | _        |S | j        t          k    r»t          |¦  «        dk    r¨|d         Šˆfd	„| j        D ¦   «         }|                     t          ‰t          | j        ¦  «        dz
  ¬
¦  «        ¦  «         d„ t%          |¦  «        D ¦   «         | _        |                      ¦   «          ‰j        | _        |                      ¦   «         p‰S |d         Š‰j        | _        ‰S )NTrr  z>credential pool: no available entries (all exhausted or empty)r¬   c                ó   — | j         S r[   ©rW   )Úes    r%   r  z1CredentialPool._select_unlocked.<locals>.<lambda>?  s   € °´€ r_   r	  r  r   c                ó4   •— g | ]}|j         ‰j         k    ¯|‘ŒS rs   ©r?   )ro   Ú	candidater¨   s     €r%   r+  z3CredentialPool._select_unlocked.<locals>.<listcomp>H  s)   ø€ Ð\Ð\Ð\ YÀ9Ä<ÐSXÔS[ÒC[ÐC[�yÐC[ÐC[ÐC[r_   r¦   c                ó6   — g | ]\  }}t          ||¬ ¦  «        ‘ŒS ©r¦   ©r   )ro   r&  rƒ  s      r%   r+  z3CredentialPool._select_unlocked.<locals>.<listcomp>J  s)   € ÐgÐgÐgÁ.À#Ày�W Y¸Ð=Ñ=Ô=ÐgÐgÐgr_   )r  r  r<  Úinfor  ÚSTRATEGY_RANDOMr.   Úchoicer?   ÚSTRATEGY_LEAST_USEDrù   Úminr   rW   r'  ÚSTRATEGY_ROUND_ROBINr
  rw  r%  r,  r   )r]   rz  r1  Úrotatedr¨   s       @r%   ro  zCredentialPool._select_unlocked2  s²  ø€ Ø×+Ò+¸$ÈÐ+ÑMÔMˆ	Øð 	Ø#ˆDÔÝ�KŠKÐXÑYÔYÐYØ�4àŒ>�_Ò,Ð,Ý”M )Ñ,Ô,ˆEØ$œxˆDÔØˆLàŒ>Õ0Ò0Ð0µS¸±^´^ÀaÒ5GÐ5GÝ˜	Ð'@Ð'@ÐAÑAÔAˆEå˜e°5Ô3FÈÑ3JÐKÑKÔKˆGØ×Ò  wÑ/Ô/Ð/Ø$œxˆDÔØˆNàŒ>Õ1Ò1Ð1µc¸)±n´nÀqÒ6HÐ6HØ˜a”LˆEØ\Ð\Ð\Ð\°$´-Ð\Ñ\Ô\ˆGØ�NŠN�7 5µ3°t´}Ñ3EÔ3EÈÑ3IÐJÑJÔJÑKÔKÐKØgÐgÕT]Ð^eÑTfÔTfÐgÑgÔgˆDŒMØ�MŠM‰OŒOˆOØ$œxˆDÔØ—<’<‘>”>Ð* UÐ*à˜!”ˆØ œ8ˆÔØˆr_   c                ór   — |                       ¦   «         }|�|S |                      ¦   «         }|r|d         nd S ©Nr   )r   r  )r]   r   rz  s      r%   ÚpeekzCredentialPool.peekS  s>   € Ø—,’,‘.”.ˆØÐØˆNØ×+Ò+Ñ-Ô-ˆ	Ø(Ð2ˆy˜Œ|ˆ|¨dÐ2r_   )rÐ   c               óæ  — | j         5  |                      ¦   «         p|                      ¦   «         }|€	 d d d ¦  «         d S |j        p|j        d d…         }t
                               d||¦  «         |                      |||¦  «         d | _        |                      ¦   «         }|r1|j        p|j        d d…         }t
                               d|¦  «         |cd d d ¦  «         S # 1 swxY w Y   d S )Né   z;credential pool: marking %s exhausted (status=%s), rotatingzcredential pool: rotated to %s)	r  r   ro  r@   r?   r<  r‡  r2  r  )r]   r-  rÐ   r¨   Ú_labelÚ
next_entryÚ_next_labels          r%   Úmark_exhausted_and_rotatez(CredentialPool.mark_exhausted_and_rotateZ  s`  € ð ŒZð 	ð 	Ø—L’L‘N”NÐ= d×&;Ò&;Ñ&=Ô&=ˆEØˆ}Øð	ð 	ð 	ñ 	ô 	ð 	ð 	ð 	ð ”[Ð0 E¤H¨R¨a¨R¤LˆFÝ�KŠKØMØ˜ñô ð ð × Ò  ¨°]ÑCÔCÐCØ#ˆDÔØ×.Ò.Ñ0Ô0ˆJØð KØ(Ô.ÐC°*´-ÀÀÀÔ2C�Ý—’Ð<¸kÑJÔJÐJØð	ð 	ð 	ð 	ñ 	ô 	ð 	ð 	ð 	ð 	ð 	ð 	øøøð 	ð 	ð 	ð 	ð 	ð 	s   ˆ,C&ÁBC&Ã&C*Ã-C*Úcredential_idrF   c                óä  ‡ — ‰ j         5  |r;‰ j                             |d¦  «        dz   ‰ j        |<   |‰ _        |cddd¦  «         S ‰                      dd¬¦  «        }|s	 ddd¦  «         dS ˆ fd„|D ¦   «         }|r|n|}t          |ˆ fd„¬¦  «        }‰ j                             |j        d¦  «        dz   ‰ j        |j        <   |j        ‰ _        |j        cddd¦  «         S # 1 swxY w Y   dS )	a\  Acquire a soft lease on a credential.

        If a specific credential_id is provided, lease that entry directly.
        Otherwise prefer the least-leased available credential, using priority as
        a stable tie-breaker. When every credential is already at the soft cap,
        still return the least-leased one instead of blocking.
        r   r¬   NTrr  c                óf   •— g | ]-}‰j                              |j        d ¦  «        ‰j        k     ¯+|‘Œ.S )r   )r  rd   r?   r  r  s     €r%   r+  z0CredentialPool.acquire_lease.<locals>.<listcomp>ƒ  sF   ø€ ð ð ð ØØÔ&×*Ò*¨5¬8°QÑ7Ô7¸$Ô:NÒNÐNð ØNÐNÐNr_   c                óR   •— ‰j                              | j        d¦  «        | j        fS r�  )r  rd   r?   rC   )r¨   r]   s    €r%   r  z.CredentialPool.acquire_lease.<locals>.<lambda>Š  s#   ø€  4Ô#6×#:Ò#:¸5¼8ÀQÑ#GÔ#GÈÌÐ"X€ r_   r	  )r  r  rd   r  r  r‹  r?   )r]   r—  rz  Ú	below_capÚ
candidatesÚchosens   `     r%   Úacquire_leasezCredentialPool.acquire_leaseq  s·  ø€ ð ŒZð 	ð 	Øð %Ø59Ô5H×5LÒ5LÈ]Ð\]Ñ5^Ô5^ÐabÑ5b�Ô# MÑ2Ø#0�Ô Ø$ð		ð 	ð 	ð 	ñ 	ô 	ð 	ð 	ð ×/Ò/¸dÈDÐ/ÑQÔQˆIØð Øð	ð 	ð 	ñ 	ô 	ð 	ð 	ð 	ðð ð ð Ø#,ðñ ô ˆIð '0Ð>˜˜°YˆJÝØØXÐXÐXÐXðñ ô ˆFð .2Ô-@×-DÒ-DÀVÄYÐPQÑ-RÔ-RÐUVÑ-VˆDÔ ¤	Ñ*Ø%œyˆDÔØ”9ð+	ð 	ð 	ð 	ñ 	ô 	ð 	ð 	ð 	ð 	ð 	ð 	øøøð 	ð 	ð 	ð 	ð 	ð 	s   ‰1C%ÁC%Á.A*C%Ã%C)Ã,C)c                óÚ   — | j         5  | j                             |d¦  «        }|dk    r| j                             |d¦  «         n|dz
  | j        |<   ddd¦  «         dS # 1 swxY w Y   dS )z/Release a previously acquired credential lease.r   r¬   N)r  r  rd   Úpop)r]   r—  Úcounts      r%   Úrelease_leasezCredentialPool.release_lease�  s¼   € àŒZð 	?ð 	?ØÔ'×+Ò+¨M¸1Ñ=Ô=ˆEØ˜ŠzˆzØÔ#×'Ò'¨°tÑ<Ô<Ð<Ð<à5:¸Q±Y�Ô# MÑ2ð	?ð 	?ð 	?ñ 	?ô 	?ð 	?ð 	?ð 	?ð 	?ð 	?ð 	?ð 	?øøøð 	?ð 	?ð 	?ð 	?ð 	?ð 	?s   ˆAA Á A$Á'A$c                ól   — | j         5  |                      ¦   «         cd d d ¦  «         S # 1 swxY w Y   d S r[   )r  Ú_try_refresh_current_unlockedr\   s    r%   Útry_refresh_currentz"CredentialPool.try_refresh_current™  s}   € ØŒZð 	8ð 	8Ø×5Ò5Ñ7Ô7ð	8ð 	8ð 	8ð 	8ñ 	8ô 	8ð 	8ð 	8ð 	8ð 	8ð 	8ð 	8øøøð 	8ð 	8ð 	8ð 	8ð 	8ð 	8rq  c                ó€   — |                       ¦   «         }|€d S |                      |d¬¦  «        }|�|j        | _        |S )NTrv  )r   rk  r?   r  )r]   r¨   re  s      r%   r¤  z,CredentialPool._try_refresh_current_unlocked�  sG   € Ø—’‘”ˆØˆ=Ø�4Ø×'Ò'¨°TÐ'Ñ:Ô:ˆ	ØÐ Ø(œ|ˆDÔØÐr_   rB   c                ó  — d}g }| j         D ][}|j        s|j        s|j        r/|                     t          |d d d d d d ¬¦  «        ¦  «         |dz  }ŒF|                     |¦  «         Œ\|r|| _         |                      ¦   «          |S )Nr   r/  r¬   )r
  rH   rJ   rL   rw  r   r,  )r]   r¡  Únew_entriesr¨   s       r%   Úreset_statuseszCredentialPool.reset_statuses¦  sÀ   € ØˆØˆØ”]ð 	*ð 	*ˆEØÔ ð * EÔ$8ð *¸EÔ<Qð *Ø×"Ò"ÝØØ$(Ø'+Ø(,Ø*.Ø+/Ø,0ðñ ô ñ
ô 
ð 
ð ˜‘
��à×"Ò" 5Ñ)Ô)Ð)Ð)Øð 	Ø'ˆDŒMØ�MŠM‰OŒOˆOØˆr_   Úindexc                ó  — |dk     s|t          | j        ¦  «        k    rd S | j                             |dz
  ¦  «        }d„ t          | j        ¦  «        D ¦   «         | _        |                      ¦   «          | j        |j        k    rd | _        |S )Nr¬   c                ó6   — g | ]\  }}t          ||¬ ¦  «        ‘ŒS r…  r†  )ro   Únew_priorityr¨   s      r%   r+  z/CredentialPool.remove_index.<locals>.<listcomp>Â  s9   € ð 
ð 
ð 
á#�˜eõ �E LÐ1Ñ1Ô1ð
ð 
ð 
r_   )rù   r
  r   r%  r,  r  r?   )r]   rª  Úremoveds      r%   Úremove_indexzCredentialPool.remove_index¾  s“   € Ø�1Š9ˆ9˜¥ D¤MÑ 2Ô 2Ò2Ð2Ø�4Ø”-×#Ò# E¨A¡IÑ.Ô.ˆð
ð 
å'0°´Ñ'?Ô'?ð
ñ 
ô 
ˆŒð 	�Š‰ŒˆØÔ˜wœzÒ)Ð)Ø#ˆDÔØˆr_   Útargetr   ú?Tuple[Optional[int], Optional[PooledCredential], Optional[str]]c                ó^  ‡— t          |pd¦  «                             ¦   «         Š‰sdS t          | j        d¬¦  «        D ]\  }}|j        ‰k    r||d fc S Œˆfd„t          | j        d¬¦  «        D ¦   «         }t          |¦  «        dk    r|d         d         |d         d         d fS t          |¦  «        dk    r	d d d‰› d�fS ‰                     ¦   «         rMt          ‰¦  «        }d|cxk    rt          | j        ¦  «        k    rn n|| j        |dz
           d fS d d d	|› d
�fS d d d‰› d�fS )Nry   )NNzNo credential target provided.r¬   )Ústartc                ó    •— g | ]J\  }}|j                              ¦   «                              ¦   «         ‰                     ¦   «         k    ¯F||f‘ŒKS rs   )r@   rž   r²   )ro   r&  r¨   rÃ   s      €r%   r+  z1CredentialPool.resolve_target.<locals>.<listcomp>Ô  sX   ø€ ð 
ð 
ð 
á��UØŒ{× Ò Ñ"Ô"×(Ò(Ñ*Ô*¨c¯iªi©k¬kÒ9Ð9ð �%ˆLà9Ð9Ð9r_   r   zAmbiguous credential label "z-". Use the numeric index or entry id instead.zNo credential #ú.zNo credential matching "z".)r=   rž   r%  r
  r?   rù   ÚisdigitrB   )r]   r°  r&  r¨   Úlabel_matchesrª  rÃ   s         @r%   Úresolve_targetzCredentialPool.resolve_targetË  sž  ø€ Ý�&�,˜BÑÔ×%Ò%Ñ'Ô'ˆØð 	@Ø?Ð?å# D¤M¸Ð;Ñ;Ô;ð 	(ð 	(‰JˆC�ØŒx˜3ŠˆØ˜E 4Ð'Ð'Ð'Ð'ð ð
ð 
ð 
ð 
å'¨¬¸QÐ?Ñ?Ô?ð
ñ 
ô 
ˆõ
 ˆ}ÑÔ Ò"Ð"Ø  Ô# AÔ&¨°aÔ(8¸Ô(;¸TÐAÐAÝˆ}ÑÔ Ò!Ð!Ø˜Ðp¸cÐpÐpÐpÐpÐpØ�;Š;‰=Œ=ð 	:Ý˜‘H”HˆEØ�EÐ/Ð/Ò/Ð/�S ¤Ñ/Ô/Ò/Ð/Ð/Ð/Ð/Ø˜dœm¨E°A©IÔ6¸Ð<Ð<Ø˜Ð9°Ð9Ð9Ð9Ð9Ð9Ø�TÐ=°cÐ=Ð=Ð=Ð=Ð=r_   c                ó¨   — t          |t          | j        ¦  «        ¬¦  «        }| j                             |¦  «         |                      ¦   «          |S )Nr¦   )r   r®   r
  rw  r,  rm  s     r%   Ú	add_entryzCredentialPool.add_entryä  sF   € Ý˜­°t´}Ñ(EÔ(EÐFÑFÔFˆØŒ×Ò˜UÑ#Ô#Ð#Ø�Š‰ŒˆØˆr_   )r>   r=   r¢   r£   )r   r¯   )r   r£   )r   r  )r!  r<   r"  r<   r   r#  )r   r#  r[   )r¨   r<   r-  rK   rÐ   rÑ   r   r<   )r¨   r<   r   r<   )r¨   r<   r   r#  )r¨   r<   rT  r¯   r   r  )r¨   r<   r   r¯   )rs  r¯   rt  r¯   r   r£   )r-  rK   rÐ   rÑ   r   r  )r—  rF   r   rF   )r—  r=   r   r#  )r   rB   )rª  rB   r   r  )r°  r   r   r±  )rg   r’   r“   r  r  r  r¢   r   r'  r,  r2  rC  rO  rS  rk  rd  rp  r  ro  r�  r–  rž  r¢  r¥  r¤  r©  r¯  r¸  rº  rs   r_   r%   r  r  l  sc  € € € € € ðEð Eð Eð Eð#ð #ð #ð #ð/ð /ð /ð /ð#ð #ð #ð #ð^ð ^ð ^ð ^ð
ð ð ð ð
ð 
ð 
ð 
ð 37ð	ð ð ð ð ð(#ð #ð #ð #ðJ5ð 5ð 5ð 5ðn;dð ;dð ;dð ;dðz`ð `ð `ð `ðDð ð ð ð&+ð +ð +ð +ð ;@ÐQVð 8ð 8ð 8ð 8ð 8ð 8ðtð ð ð ðB3ð 3ð 3ð 3ð 37ð	ð ð ð ð ð ð.ð ð ð ð ð>?ð ?ð ?ð ?ð8ð 8ð 8ð 8ðð ð ð ðð ð ð ð0ð ð ð ð>ð >ð >ð >ð2ð ð ð ð ð r_   r  ri   c                óB  — d }t          | ¦  «        D ]\  }}|j        |k    r|} nŒ|€²|                     dt          j        ¦   «         j        d d…         ¦  «         |                     dt          | ¦  «        ¦  «         |                     d|                     d¦  «        p|¦  «         |                      t           
                    ||¦  «        ¦  «         dS | |         }i }i }	d„ t          |¦  «        D ¦   «         }
|                     ¦   «         D ]d\  }}|dv s|€Œ|dk    r|j        rŒ||
v rt          ||¦  «        |k    r|||<   Œ8|t          v r#|j                             |¦  «        |k    r||	|<   Œe|s|	r"|	ri |j        ¥|	¥|d<   t#          |fi |¤Ž| |<   dS d	S )
Nr?   rx   rC   r@   Tc                ó   — h | ]	}|j         ’Œ
S rs   rm   rn   s     r%   rq   z _upsert_entry.<locals>.<setcomp>ü  s   € Ð5Ð5Ð5˜q�A”FÐ5Ð5Ð5r_   >   r?   rC   rY   F)r%  rD   rz   r{   r|   r}   r®   rd   rw  r<   rƒ   r   r†   r@   r…   rc   rY   r   )r¢   r>   rD   ri   Úexisting_idxr&  r¨   ÚexistingrK  rL  ri  r    rŠ   s                r%   Ú_upsert_entryr¿  ë  sø  € Ø€LÝ Ñ(Ô(ð ð ‰
ˆˆUØŒ<˜6Ò!Ð!ØˆLØˆEð "ð ÐØ×Ò˜4¥¤¡¤Ô!1°"°1°"Ô!5Ñ6Ô6Ð6Ø×Ò˜:¥~°gÑ'>Ô'>Ñ?Ô?Ð?Ø×Ò˜7 G§K¢K°Ñ$8Ô$8Ð$B¸FÑCÔCÐCØ�ŠÕ'×1Ò1°(¸GÑDÔDÑEÔEÐEØˆtà�|Ô$€HØ€MØ€MØ5Ð5¥F¨8Ñ$4Ô$4Ð5Ñ5Ô5€LØ—m’m‘o”oð 
+ð 
+‰
ˆˆUØÐ$Ð$Ð$¨¨ØØ�'Š>ˆ>˜hœnˆ>ØØ�,ÐÐÝ�x Ñ%Ô%¨Ò.Ð.Ø%*�˜cÑ"øØ•KÐÐØŒ~×!Ò! #Ñ&Ô&¨%Ò/Ð/Ø%*�˜cÑ"øØð ˜ð Øð 	IØ%H¨¬Ð%H¸-Ð%HˆM˜'Ñ"Ý '¨Ð BÐ B°MÐ BÐ Bˆ�ÑØˆtØˆ5r_   c                ó`  ‡	— | dk    rdS ddddddœŠ	t          d	„ |D ¦   «         d
„ ¬¦  «        }t          d„ |D ¦   «         ˆ	fd„¬¦  «        }g |¢|¢}d„ t          |¦  «        D ¦   «         }d}t          |¦  «        D ]1\  }}|j        |k    r!t          ||¬¦  «        |||j                 <   d}Œ2|S )Nr4  Fr   r¬   rÇ   é   é   )zenv:ANTHROPIC_TOKENzenv:CLAUDE_CODE_OAUTH_TOKENrW  r5  zenv:ANTHROPIC_API_KEYc              3  óB   K  — | ]}t          |j        ¦  «        ¯|V — Œd S r[   ©rµ   rD   r§   s     r%   r©   z-_normalize_pool_priorities.<locals>.<genexpr>  s2   è è € ÐGÐG�5Õ'8¸¼Ñ'FÔ'FÐGˆÐGÐGÐGÐGÐGÐGr_   c                ó   — | j         S r[   r¦   r  s    r%   r  z,_normalize_pool_priorities.<locals>.<lambda>  s   € ˜%œ.€ r_   r	  c              3  óB   K  — | ]}t          |j        ¦  «        °|V — Œd S r[   rÄ  r§   s     r%   r©   z-_normalize_pool_priorities.<locals>.<genexpr>   s2   è è € ÐKÐK�5Õ+<¸U¼\Ñ+JÔ+JÐKˆÐKÐKÐKÐKÐKÐKr_   c                ón   •— ‰                      | j        t          ‰¦  «        ¦  «        | j        | j        fS r[   )rd   rD   rù   rC   r@   )r¨   Úsource_ranks    €r%   r  z,_normalize_pool_priorities.<locals>.<lambda>!  s/   ø€ Ø�OŠO˜EœL­#¨kÑ*:Ô*:Ñ;Ô;ØŒNØŒKð
€ r_   c                ó$   — i | ]\  }}|j         |“ŒS rs   r‚  )ro   r&  r¨   s      r%   rv   z._normalize_pool_priorities.<locals>.<dictcomp>)  s    € ÐDÐDÐD¡: 3¨�”˜3ÐDÐDÐDr_   r¦   T)rõ   r%  rC   r   r?   )
r>   r¢   Úmanual_entriesÚseeded_entriesÚorderedÚ	id_to_idxÚchangedr­  r¨   rÈ  s
            @r%   Ú_normalize_pool_prioritiesrÏ    s  ø€ Ø�;ÒÐØˆuð  !Ø'(ØØØ!"ðð €Kõ ØGÐG˜GÐGÑGÔGØ(Ð(ðñ ô €Nõ ØKÐK˜GÐKÑKÔKð
ð 
ð 
ð 
ðñ ô €Nð 1�Ð0 Ð0€GØDÐDµ¸7Ñ1CÔ1CÐDÑDÔD€IØ€GÝ(¨Ñ1Ô1ð ð Ñˆ�eØŒ>˜\Ò)Ð)Ý+2°5À<Ð+PÑ+PÔ+PˆG�I˜eœhÔ'Ñ(ØˆGøØ€Nr_   úTuple[bool, Set[str]]c                ó  — d}t          ¦   «         }t          ¦   «         }	 ddlm} n# t          $ r d„ }Y nw xY w| dk    �r	 ddlm}  |d¦  «        s||fS n# t          $ r Y nw xY wddlm}m} d |¦   «         fd	 |¦   «         ffD ]»\  }	}
|
r´|
 	                    d
¦  «        rŸ || |	¦  «        rŒ)| 
                    |	¦  «         |t          || |	|	t          |
 	                    d
d¦  «        |
 	                    d¦  «        |
 	                    d¦  «        t          |
 	                    d
d¦  «        |	¦  «        dœ¦  «        z  }Œ¼�n=| dk    �rTt          |d¦  «        }|�r? || d¦  «        �s2| 
                    d¦  «         t          | 	                    d¦  «        pd¦  «                             ¦   «         }|p#t          | 	                    dd¦  «        d¦  «        }|t          || di dd“dt          “d| 	                    dd¦  «        “d| 	                    d¦  «        “d| 	                    d¦  «        “d| 	                    d¦  «        “d| 	                    d¦  «        “d| 	                    d¦  «        “d| 	                    d¦  «        “d| 	                    d¦  «        “d| 	                    d¦  «        “d| 	                    d¦  «        “d| 	                    d¦  «        “d| 	                    d¦  «        “d | 	                    d ¦  «        “d!| 	                    d!¦  «        “d"| 	                    d"¦  «        “| 	                    d#¦  «        t#          | 	                    d$¦  «        t$          ¦  «        r| 	                    d$¦  «        nd |d%œ¥¦  «        z  }�nâ| d&k    rÓ	 dd'lm}m}  |¦   «         \  }}|r† ||¦  «        }d(|                     ¦   «         v rd)nd*|› �}	 || |	¦  «        sR| 
                    |	¦  «         t/          j	        | ¦  «        }|t          || |	|	t0          ||r|j        nd|d+œ¦  «        z  }�n<# t4          $ r&}t6                               d,|¦  «         Y d }~�nd }~ww xY w| d-k    ró	 dd.lm}  |d¬/¦  «        }
|
 	                    d0d¦  «        }|r“|
 	                    dd1¦  «        }	 || |	¦  «        sq| 
                    |	¦  «         |t          || |	|	t          ||
 	                    d2¦  «        |
 	                    d3d¦  «        |
 	                    d4|	¦  «        d5œ¦  «        z  }�nC# t4          $ r&}t6                               d6|¦  «         Y d }~�nd }~ww xY w| d7k    �r	 || d¦  «        r||fS t          |d7¦  «        }t#          |t$          ¦  «        r| 	                    d8¦  «        nd }t#          |t$          ¦  «        r¨| 	                    d¦  «        r“| 
                    d¦  «         |t          || ddt          | 	                    dd¦  «        | 	                    d¦  «        d9| 	                    d:¦  «        t          | 	                    dd¦  «        d¦  «        d;œ¦  «        z  }||fS )<NFr   ©Úis_source_suppressedc                ó   — dS ©NFrs   ©Ú_pÚ_ss     r%   Ú_is_suppressedz-_seed_from_singletons.<locals>._is_suppressed<  ó   € Ø�5r_   r4  )Ú!is_provider_explicitly_configured)r6  Úread_hermes_oauth_credentialsrW  r5  r8  ry   r7  r9  )rD   rA   rE   rG   rR   r@   rŽ   rE  r@   rE   rD   rA   rG   rQ   r4   r1   r2   r7   rT   rU   rV   r5   r3   r6   r9   r8   r:   r0   )r:   r0   r@   Úcopilot)Úresolve_copilot_tokenÚget_copilot_api_tokenÚghÚgh_cliúenv:©rD   rA   rE   rP   r@   zCopilot token seed failed: %sz
qwen-oauth)Ú resolve_qwen_runtime_credentials)Úrefresh_if_expiringr*   zqwen-clirR   rP   Ú	auth_file)rD   rA   rE   rR   rP   r@   z Qwen OAuth token seed failed: %srQ  rR  z%https://chatgpt.com/backend-api/codexrS   )rD   rA   rE   rG   rP   rS   r@   )Úsetr   Úhermes_cli.authrÓ  ÚImportErrorrÛ  r;  r6  rÜ  rd   Úaddr¿  r^  r¡   r   r=   rž   r�   r×   Úhermes_cli.copilot_authrÞ  rß  r²   r   r~   rT   r$   r<  r=  rä  )r>   r¢   rÎ  Úactive_sourcesrG  rÙ  rÛ  r6  rÜ  Úsource_namer>  rH  Úcustom_labelÚseeded_labelrÞ  rß  r—   rD   Ú	api_tokenÚpconfigrB  rä  rR  s                          r%   Ú_seed_from_singletonsrò  2  s)  € Ø€GÝ"™uœu€NÝ!Ñ#Ô#€JðØJÐJÐJÐJÐJÐJÐJøÝð ð ð ð	ð 	ð 	ð 	ð 	ðøøøð �;ÒÑð
	ØIÐIÐIÐIÐIÐIØ4Ð4°[ÑAÔAð /Ø Ð.Ð.ð/øåð 	ð 	ð 	ØˆDð	øøøð 	hÐgÐgÐgÐgÐgÐgÐgð Ð9Ð9Ñ;Ô;Ð<ØÐ8Ð8Ñ:Ô:Ð;ð#
ð 	ð 	ÑˆK˜ð ð ˜Ÿš =Ñ1Ô1ð Ø!�> (¨KÑ8Ô8ð ØØ×"Ò" ;Ñ/Ô/Ð/Ø�=ØØØà"-Ý%4Ø(-¯	ª	°-ÀÑ(DÔ(DØ).¯ª°>Ñ)BÔ)BØ).¯ª°;Ñ)?Ô)?Ý!1°%·)²)¸MÈ2Ñ2NÔ2NÐP[Ñ!\Ô!\ðð ñ	ô ñ �øñ	ð, 
�VÒ	Ñ	Ý$ Z°Ñ8Ô8ˆØñ *	˜˜¨°-Ñ@Ô@ñ *	Ø×Ò˜}Ñ-Ô-Ð-õ
 ˜uŸyšy¨Ñ1Ô1Ð7°RÑ8Ô8×>Ò>Ñ@Ô@ˆLØ'ð Õ+;Ø—	’	˜.¨"Ñ-Ô-¨}ñ,ô ,ˆLð •}ØØØðØ˜mðà¥ðð # E§I¢I¨n¸bÑ$AÔ$Aðð $ U§Y¢Y¨Ñ%?Ô%?ð	ð
 ! %§)¢)¨LÑ"9Ô"9ðð ! %§)¢)¨LÑ"9Ô"9ðð ˜UŸYšY wÑ/Ô/ðð   §¢¨;Ñ!7Ô!7ðð & u§y¢yÐ1BÑ'CÔ'Cðð )¨%¯)ª)Ð4HÑ*IÔ*Iðð   §¢¨;Ñ!7Ô!7ðð +¨E¯IªIÐ6LÑ,MÔ,Mðð& " 5§9¢9¨]Ñ#;Ô#;ð'ð( ! %§)¢)¨LÑ"9Ô"9ð)ð* # E§I¢I¨nÑ$=Ô$=ð+ð, +¨E¯IªIÐ6LÑ,MÔ,Mð-ð. '¨¯	ª	Ð2DÑ(EÔ(Eð/ð0 .3¯YªYÐ7NÑ-OÔ-OÝ/9¸%¿)º)ÀEÑ:JÔ:JÍDÑ/QÔ/QÐ[˜5Ÿ9š9 UÑ+Ô+Ð+ÐW[Ø)ð5ð ð ñ	 ô  ñ  ˆGùðD 
�YÒ	Ð	ð	?Ø\Ð\Ð\Ð\Ð\Ð\Ð\Ð\Ø1Ð1Ñ3Ô3‰MˆE�6Øð Ø1Ð1°%Ñ8Ô8�	Ø*.°&·,²,±.´.Ð*@Ð*@˜h˜hÀoÈVÀoÀo�Ø%�~ h°Ñ<Ô<ð Ø"×&Ò& {Ñ3Ô3Ð3Ý/Ô3°HÑ=Ô=�GØ�}ØØ Ø#à&1Ý):Ø,5ØFMÐ(U¨Ô(BÐ(BÐSUØ%+ðð ñ	 ô  ñ �Gùøõ ð 	?ð 	?ð 	?Ý�LŠLÐ8¸#Ñ>Ô>Ð>Ð>Ð>Ð>Ð>Ñ>øøøøð	?øøøð 
�\Ò	!Ð	!ð	BØHÐHÐHÐHÐHÐHØ4Ð4ÈÐOÑOÔOˆEØ—I’I˜i¨Ñ,Ô,ˆEØð Ø#Ÿiši¨°*Ñ=Ô=�Ø%�~ h°Ñ<Ô<ð Ø"×&Ò& {Ñ3Ô3Ð3Ø�}ØØ Ø#à&1Ý)8Ø,1Ø-2¯YªY°Ñ-GÔ-GØ(-¯	ª	°*¸bÑ(AÔ(AØ%*§Y¢Y¨{¸KÑ%HÔ%Hðð ñ	 ô  ñ �Gùøõ ð 	Bð 	Bð 	BÝ�LŠLÐ;¸SÑAÔAÐAÐAÐAÐAÐAÑAøøøøð	Bøøøð 
�^Ò	#Ñ	#ð
 ˆ>˜( MÑ2Ô2ð 	+Ø˜NÐ*Ð*å$ Z°Ñ@Ô@ˆÝ(2°5½$Ñ(?Ô(?ÐI�—’˜8Ñ$Ô$Ð$ÀTˆõ �f�dÑ#Ô#ð 	¨¯
ª
°>Ñ(BÔ(Bð 	Ø×Ò˜}Ñ-Ô-Ð-Ø•}ØØØà+Ý!0Ø$*§J¢J¨~¸rÑ$BÔ$BØ%+§Z¢Z°Ñ%@Ô%@Ø GØ$)§I¢I¨nÑ$=Ô$=Ý-¨f¯jªj¸ÈÑ.LÔ.LÈmÑ\Ô\ðð ñ	ô ñ ˆGð �NÐ"Ð"sP    ' §7¶7ÁA Á
A%Á$A%Î(BQ Ñ
Q7ÑQ2Ñ2Q7ÒB=U  Õ 
U0Õ
U+Õ+U0c                ó  — d}t          ¦   «         }	 ddlm} n# t          $ r d„ }Y nw xY w| dk    rut	          d¦  «        pd                     ¦   «         }|rLd} || |¦  «        r||fS |                     |¦  «         |t          || ||t          |t          dd	œ¦  «        z  }||fS t          j        | ¦  «        }|r|j        t          k    r||fS d}|j        r;t	          |j        ¦  «        pd                     ¦   «                              d
¦  «        }t          |j        ¦  «        }	| dk    rg d¢}	|	D ]Õ}
t	          |
¦  «        pd                     ¦   «         }|sŒ(d|
› �} || |¦  «        rŒ:|                     |¦  «         | dk    r|                     d¦  «        st$          nt          }|p|j        }| dk    rt)          ||j        |¦  «        }n| dk    rt+          ||j        |¦  «        }|t          || ||||||
d	œ¦  «        z  }ŒÖ||fS )NFr   rÒ  c                ó   — dS rÕ  rs   rÖ  s     r%   Ú_is_source_suppressedz-_seed_from_env.<locals>._is_source_suppressedú  rÚ  r_   Ú
openrouterÚOPENROUTER_API_KEYry   zenv:OPENROUTER_API_KEYrã  rê   r4  )ÚANTHROPIC_TOKENÚCLAUDE_CODE_OAUTH_TOKENÚANTHROPIC_API_KEYrâ  z
sk-ant-apizkimi-codingÚzai)rç  rè  rÓ  ré  r   rž   rê  r¿  r~   r   r   rd   rA   Úbase_url_env_varrë   rç   Úapi_key_env_varsr³   r^  rT   r   r   )r>   r¢   rÎ  rì  rõ  r—   rD   rñ  Úenv_urlÚenv_varsÚenv_varrA   rP   s                r%   Ú_seed_from_envr  ï  sß  € Ø€GÝ"™uœu€NðØQÐQÐQÐQÐQÐQÐQøÝð ð ð ð	ð 	ð 	ð 	ð 	ðøøøð �<ÒÐåÐ3Ñ4Ô4Ð:¸×AÒAÑCÔCˆØð 	Ø-ˆFØ$Ð$ X¨vÑ6Ô6ð /Ø Ð.Ð.Ø×Ò˜vÑ&Ô&Ð&Ø•}ØØØà$Ý!2Ø$)Ý 3Ø1ðð ñ	ô ñ ˆGð ˜Ð&Ð&åÔ# HÑ-Ô-€GØð '�gÔ'Õ+<Ò<Ð<Ø˜Ð&Ð&à€GØÔð VÝ  Ô!9Ñ:Ô:Ð@¸b×GÒGÑIÔI×PÒPÐQTÑUÔUˆå�GÔ,Ñ-Ô-€HØ�;ÒÐð
ð 
ð 
ˆð ð 
ð 
ˆå˜wÑ'Ô'Ð-¨2×4Ò4Ñ6Ô6ˆØð 	ØØ!˜Ð!Ð!ˆØ Ð  ¨6Ñ2Ô2ð 	ØØ×Ò˜6Ñ"Ô"Ð"Ø'/°;Ò'>Ð'>Àu×GWÒGWÐXdÑGeÔGeÐ'>•O�OÕk|ˆ	ØÐ8˜gÔ8ˆØ�}Ò$Ð$Ý-¨e°WÔ5OÐQXÑYÔYˆHˆHØ˜ÒÐÝ,¨U°GÔ4NÐPWÑXÔXˆHØ•=ØØØà Ø&Ø %Ø$Ø ðð ñ	
ô 
ñ 	
ˆˆð �NÐ"Ð"s   ’ ™)¨)rì  úSet[str]c                óv   ‡— ˆfd„| D ¦   «         }t          |¦  «        t          | ¦  «        k    rdS || d d …<   dS )Nc                ó”   •— g | ]D}t          |j        ¦  «        s,|j        ‰v s#|j                             d ¦  «        s|j        dv °B|‘ŒES )râ  >   r5  rW  )rµ   rD   r³   )ro   r¨   rì  s     €r%   r+  z/_prune_stale_seeded_entries.<locals>.<listcomp>A  sn   ø€ ð 	ð 	ð 	àÝ˜Uœ\Ñ*Ô*ð	ð Œ<˜>Ð)Ð)àŒL×#Ò# FÑ+Ô+ð *ð Œ|Ð=Ð=Ð=ð 	ð >Ð=Ð=r_   FT)rù   )r¢   rì  Úretaineds    ` r%   Ú_prune_stale_seeded_entriesr  @  s[   ø€ ð	ð 	ð 	ð 	àð	ñ 	ô 	€Hõ ˆ8�}„}�˜G™œÒ$Ð$ØˆuØ€GˆAˆAˆA�JØˆ4r_   c                óº  — d}t          ¦   «         }	 ddlm} n# t          $ r d„ }Y nw xY wt	          | ¦  «        }|rÿt          |                     d¦  «        pd¦  «                             ¦   «         }t          |                     d¦  «        pd¦  «                             ¦   «                              d¦  «        }t          |                     d	¦  «        pd¦  «                             ¦   «         }|rHd
|› �}	 || |	¦  «        s7| 	                    |	¦  «         |t          || |	|	t          |||p|	dœ¦  «        z  }	 t          ¦   «         }
|
r|
                     d¦  «        nd}t          |t          ¦  «        �rNt          |                     d¦  «        pd¦  «                             ¦   «                              ¦   «         }t          |                     d¦  «        pd¦  «                             ¦   «                              d¦  «        }d}dD ]V}|                     |¦  «        }t          |t
          ¦  «        r*|                     ¦   «         r|                     ¦   «         } nŒW|dk    r\|rZ|rXt!          |¦  «        }|| k    rCd}	 || |	¦  «        s5| 	                    |	¦  «         |t          || |	|	t          ||ddœ¦  «        z  }n# t"          $ r Y nw xY w||fS )zJSeed a custom endpoint pool from custom_providers config and model config.Fr   rÒ  c                ó   — dS rÕ  rs   rÖ  s     r%   rÙ  z)_seed_custom_pool.<locals>._is_suppressedZ  rÚ  r_   r*   ry   rP   rê   r`   zconfig:rã  ÚmodelNr>   )r*   ÚapiÚcustomÚmodel_config)rç  rè  rÓ  ré  rû   r=   rd   rž   rë   rê  r¿  r~   r&   r�   r×   r²   rð   r$   )r÷   r¢   rÎ  rì  rÙ  Ú	cp_configr*   rP   r`   rD   rã   Ú	model_cfgÚmodel_providerÚmodel_base_urlÚmodel_api_keyru   r‹   Úmatched_keys                     r%   Ú_seed_custom_poolr  Q  sA  € à€GÝ"™uœu€NðØJÐJÐJÐJÐJÐJÐJøÝð ð ð ð	ð 	ð 	ð 	ð 	ðøøøõ
 ,¨HÑ5Ô5€IØð Ý�i—m’m IÑ.Ô.Ð4°"Ñ5Ô5×;Ò;Ñ=Ô=ˆÝ�y—}’} ZÑ0Ô0Ð6°BÑ7Ô7×=Ò=Ñ?Ô?×FÒFÀsÑKÔKˆÝ�9—=’= Ñ(Ô(Ð.¨BÑ/Ô/×5Ò5Ñ7Ô7ˆØð 	Ø%˜tÐ%Ð%ˆFØ!�> (¨FÑ3Ô3ð Ø×"Ò" 6Ñ*Ô*Ð*Ø�=ØØØà"(Ý%6Ø(/Ø$,Ø!% ¨ðð ñ	ô ñ �ð Ý"Ñ$Ô$ˆØ+1Ð;�F—J’J˜wÑ'Ô'Ð'°tˆ	Ý�i¥Ñ&Ô&ñ 	Ý  §¢¨zÑ!:Ô!:Ð!@¸bÑAÔA×GÒGÑIÔI×OÒOÑQÔQˆNÝ  §¢¨zÑ!:Ô!:Ð!@¸bÑAÔA×GÒGÑIÔI×PÒPÐQTÑUÔUˆNØˆMØ'ð ð �Ø—M’M !Ñ$Ô$�Ý˜a¥Ñ%Ô%ð ¨!¯'ª'©)¬)ð Ø$%§G¢G¡I¤I�MØ�EøØ Ò)Ð)¨nÐ)ÀÐ)å:¸>ÑJÔJ�Ø (Ò*Ð*Ø+�FØ)˜>¨(°FÑ;Ô;ð Ø&×*Ò*¨6Ñ2Ô2Ð2Ø¥=Ø#Ø$Ø"à*0Ý->Ø0=Ø,:Ø)7ðð ñ	$ô $ñ ˜øøõ ð ð ð Øˆðøøøð �NÐ"Ð"s   ’ ™)¨)Ä=FK	 Ë	
KËKc                ó2  ‡ — ‰ pd                      ¦   «                              ¦   «         Š t          ‰ ¦  «        }ˆ fd„|D ¦   «         }‰                      t          ¦  «        r)t          ‰ |¦  «        \  }}|}|t          ||¦  «        z  }nSt          ‰ |¦  «        \  }}t          ‰ |¦  «        \  }}	|p|}|t          |||	z  ¦  «        z  }|t          ‰ |¦  «        z  }|r*t          ‰ d„ t          |d„ ¬¦  «        D ¦   «         ¦  «         t          ‰ |¦  «        S )Nry   c                óF   •— g | ]}t                                ‰|¦  «        ‘ŒS rs   )r<   rƒ   )ro   ri   r>   s     €r%   r+  zload_pool.<locals>.<listcomp>�  s*   ø€ ÐXÐXÐXÀÕ×)Ò)¨(°GÑ<Ô<ÐXÐXÐXr_   c                ó6   — g | ]}|                      ¦   «         ‘ŒS rs   r*  r§   s     r%   r+  zload_pool.<locals>.<listcomp>®  s    € ÐZÐZÐZ ˆU�]Š]‰_Œ_ÐZÐZÐZr_   c                ó   — | j         S r[   r¦   )Úitems    r%   r  zload_pool.<locals>.<lambda>®  s   € È4Ì=€ r_   r	  )rž   r²   r   r³   rì   r  r  rò  r  rÏ  r   rõ   r  )
r>   Úraw_entriesr¢   Úcustom_changedÚcustom_sourcesrÎ  Úsingleton_changedÚsingleton_sourcesÚenv_changedÚenv_sourcess
   `         r%   Ú	load_poolr   š  sG  ø€ Ø�˜B×%Ò%Ñ'Ô'×-Ò-Ñ/Ô/€HÝ& xÑ0Ô0€KØXÐXÐXÐXÈKÐXÑXÔX€Gà×ÒÕ-Ñ.Ô.ð 
Aå):¸8ÀWÑ)MÔ)MÑ&ˆ˜Ø ˆØÕ.¨w¸ÑGÔGÑGˆˆå/DÀXÈwÑ/WÔ/WÑ,ÐÐ,Ý#1°(¸GÑ#DÔ#DÑ ˆ�[Ø#Ð2 {ˆØÕ.¨wÐ8IÈKÑ8WÑXÔXÑXˆØÕ-¨h¸Ñ@Ô@Ñ@ˆàð 
ÝØØZÐZ­&°Ð>XÐ>XÐ*YÑ*YÔ*YÐZÑZÔZñ	
ô 	
ð 	
õ ˜( GÑ,Ô,Ð,r_   )r   r   )r—   r=   r˜   r=   r   r=   )r¢   r£   r   rB   )rD   r=   r   r¯   )r¶   rK   r   rB   )rŠ   r   r   rI   )rÅ   r=   r   rI   )rÐ   rÑ   r   rX   )r¨   r<   r   rI   )r`   r=   r   r=   r[   )rã   r   )rP   r=   r   rF   )r   rñ   )r÷   r=   r   rÑ   )r>   r=   r   r=   )
r¢   r£   r>   r=   rD   r=   ri   rX   r   r¯   )r>   r=   r¢   r£   r   r¯   )r>   r=   r¢   r£   r   rÐ  )r¢   r£   rì  r  r   r¯   )r÷   r=   r¢   r£   r   rÐ  )r>   r=   r   r  )VÚ__doc__Ú
__future__r   Úloggingr.   r  rØ   r{   ÚosrÉ   Údataclassesr   r   r   r   Útypingr   r	   r
   r   r   r   Úhermes_constantsr   r#   r   rè  Úauthr`  r   r   r   r   r   r   r   r   r   r   r   r   r   r   Ú	getLoggerrg   r<  r&   rc  rÝ   r^  r~   r   rþ   rŒ  rˆ  rŠ  rÿ   r¸   r¹   rì   Ú	frozensetrc   r<   r¡   r®   rµ   rº   rÄ   rÏ   rÛ   rÞ   râ   rè   rð   rö   rû   r  r  r  r¿  rÏ  rò  r  r  r  r   rs   r_   r%   ú<module>r+     s  ðØ BÐ Bà "Ð "Ð "Ð "Ð "Ð "à €€€Ø €€€Ø Ð Ð Ð Ø €€€Ø €€€Ø 	€	€	€	Ø 	€	€	€	Ø 2Ð 2Ð 2Ð 2Ð 2Ð 2Ð 2Ð 2Ð 2Ð 2Ø Ð Ð Ð Ð Ð Ø 8Ð 8Ð 8Ð 8Ð 8Ð 8Ð 8Ð 8Ð 8Ð 8Ð 8Ð 8Ð 8Ð 8Ð 8Ð 8à 0Ð 0Ð 0Ð 0Ð 0Ð 0Ø +Ð +Ð +Ð +Ð +Ð +Ø "Ð "Ð "Ð "Ð "Ð "ðð ð ð ð ð ð ð ð ð ð ð ð ð ð ð ð ð ð ð ð ð ð ð ð ð ð ð ð ð ð ð ð" 
ˆÔ	˜8Ñ	$Ô	$€ðð ð ð ð €	ØÐ à€ØÐ à€à"Ð Ø$Ð Ø€Ø"Ð àØØØð	Ð ð $Ð Ø 'Ð ð
 Ð ð ˆið ð ð ñ ô €ð ðOð Oð Oð Oð Oñ Oô Oñ „ðOðdð ð ð ðFð Fð Fð FðUð Uð Uð Uð
)ð )ð )ð )ðð ð ð ð<
ð 
ð 
ð 
ðð ð ð ð2ð ð ð ð2ð 2ð 2ð 2ð
7ð 7ð 7ð 7ð 7ð4ð ð ð ðð ð ð ðð ð ð ðð ð ð ð  )*Ð %ð|	ð |	ð |	ð |	ð |	ñ |	ô |	ð |	ð~"ð "ð "ð "ðJð ð ð ðDz#ð z#ð z#ð z#ðzN#ð N#ð N#ð N#ðbð ð ð ð"F#ð F#ð F#ð F#ðR-ð -ð -ð -ð -ð -r_   