§
    øžyjÓx  ã                  ó¢  — U 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	m
Z
mZ ddlmZmZ ddlmZmZmZ ed         ZdZd	Zdad
ed<    ej        ¦   «         Z e
d¬¦  «         G d„ d¦  «        ¦   «         Z e
d¬¦  «         G d„ d¦  «        ¦   «         Z e
d¬¦  «         G d„ d¦  «        ¦   «         Z e
d¬¦  «         G d„ d¦  «        ¦   «         Zd[d\d„Zd[d\d„Zddddœd]d#„Zd^d%„Z d_d*„Z!d`d,„Z"d-d	d.œdad2„Z#dbd6„Z$dcd7„Z%ddd8„Z&ded:„Z'dfd=„Z(	 d[dgd?„Z)dhdA„Z*didC„Z+djdF„Z,dkdH„Z-dldJ„Z.dddKœdmdQ„Z/dndR„Z0dodS„Z1dpdT„Z2dqdU„Z3drdW„Z4dsdY„Z5dpdZ„Z6dS )tz3Normalized Nous Portal account entitlement helpers.é    )ÚannotationsN)Ú	dataclassÚfield)ÚdatetimeÚtimezone)ÚAnyÚLiteralÚOptional)ÚjwtÚaccount_apiÚinference_keyÚnoneÚerror)Ú	firecrawlÚfalz	fal-videozopenai-audiozbrowser-useÚmodalé<   z1tuple[str, float, 'NousPortalAccountInfo'] | NoneÚ_account_info_cacheT)Úfrozenc                  ór   — e Zd ZU 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S )ÚNousPortalSubscriptionInfoNúOptional[str]ÚplanúOptional[int]ÚtierúOptional[float]Úmonthly_chargeÚmonthly_creditsÚcurrent_period_endÚcredits_remainingÚrollover_credits)Ú__name__Ú
__module__Ú__qualname__r   Ú__annotations__r   r   r   r   r    r!   © ó    ú=/home/ragecks/.hermes/hermes-agent/hermes_cli/nous_account.pyr   r   $   sŒ   € € € € € € à€DÐÐÐÑØ€DÐÐÐÑØ&*€NÐ*Ð*Ð*Ñ*Ø'+€OÐ+Ð+Ð+Ñ+Ø(,ÐÐ,Ð,Ð,Ñ,Ø)-ÐÐ-Ð-Ð-Ñ-Ø(,ÐÐ,Ð,Ð,Ñ,Ð,Ð,r'   r   c                  óð   — e Zd ZU 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S )ÚNousPaidServiceAccessInfoNúOptional[bool]ÚallowedÚpaid_accessr   ÚreasonÚorganisation_idr   Úeffective_at_msÚhas_active_subscriptionÚactive_subscription_is_paidÚsubscription_tierr   Úsubscription_monthly_chargeÚsubscription_credits_remainingÚpurchased_credits_remainingÚtotal_usable_creditsÚmember_spend_cap_exceededÚmember_spend_cap_usdÚmember_spend_usdÚmember_spend_cap_remaining_usd)r"   r#   r$   r,   r%   r-   r.   r/   r0   r1   r2   r3   r4   r5   r6   r7   r8   r9   r:   r;   r&   r'   r(   r*   r*   /   s-  € € € € € € à"€GÐ"Ð"Ð"Ñ"Ø"&€KÐ&Ð&Ð&Ñ&Ø €FÐ Ð Ð Ñ Ø%)€OÐ)Ð)Ð)Ñ)Ø%)€OÐ)Ð)Ð)Ñ)Ø.2ÐÐ2Ð2Ð2Ñ2Ø26ÐÐ6Ð6Ð6Ñ6Ø'+ÐÐ+Ð+Ð+Ñ+Ø37ÐÐ7Ð7Ð7Ñ7Ø6:Ð"Ð:Ð:Ð:Ñ:Ø37ÐÐ7Ð7Ð7Ñ7Ø,0ÐÐ0Ð0Ð0Ñ0Ø04ÐÐ4Ð4Ð4Ñ4Ø,0ÐÐ0Ð0Ð0Ñ0Ø(,ÐÐ,Ð,Ð,Ñ,Ø6:Ð"Ð:Ð:Ð:Ñ:Ð:Ð:r'   r*   c                  óD   — e Zd ZU dZdZded<    ee¬¦  «        Zded<   dS )	ÚNousToolAccessInfoa/  Free tool-pool entitlement, decoupled from paid/billing access.

    Mirrors the Portal's ``tool_access`` claim/field: ``enabled`` is true when a
    positive tool-pool balance is live and not gated off; ``coverage`` maps each
    tool category to whether the pool funds it (FAL video is excluded).
    FÚboolÚenabled)Údefault_factoryzdict[str, bool]ÚcoverageN)	r"   r#   r$   Ú__doc__r?   r%   r   ÚdictrA   r&   r'   r(   r=   r=   C   sM   € € € € € € ðð ð €GÐÐÐÑØ % °dÐ ;Ñ ;Ô ;€HÐ;Ð;Ð;Ñ;Ð;Ð;r'   r=   c                  ó¤  — e Zd ZU 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ed<   dZded<   dZd ed!<   dZd ed"<   dZded#<   ed+d%„¦   «         Zed+d&„¦   «         Zed+d'„¦   «         Zd,d*„ZdS )-ÚNousPortalAccountInfor>   Ú	logged_inÚNousAccountInfoSourceÚsourceÚfreshNr   Úuser_idÚorg_idÚorg_slugÚorg_nameÚ	client_idÚ
product_idÚnous_clientÚportal_base_urlÚinference_base_urlFÚinference_credential_presentÚcredential_sourcezOptional[datetime]Ú
expires_atÚemailÚ	privy_didú$Optional[NousPortalSubscriptionInfo]Úsubscriptionr+   Úpaid_service_accessú#Optional[NousPaidServiceAccessInfo]Úpaid_service_access_infoúOptional[NousToolAccessInfo]Útool_accessúOptional[dict[str, Any]]Ú
raw_claimsÚraw_accountr   Úreturnc                ó   — | j         du S )NT©rZ   ©Úselfs    r(   Úis_paidzNousPortalAccountInfo.is_paidk   s   € àÔ'¨4Ð/Ð/r'   c                ó   — | j         du S )NFrd   re   s    r(   Úis_free_tierz"NousPortalAccountInfo.is_free_tiero   s   € àÔ'¨5Ð0Ð0r'   c                óB   — | j         du rdS | j        duo| j        j        S )zÒCoarse "entitled to any managed tool" gate: paid access OR a live
        free tool pool. Use :meth:`tool_gateway_entitled_for` to gate a specific
        tool category (the pool does not cover every category).TN)rZ   r^   r?   re   s    r(   Útool_gateway_entitledz+NousPortalAccountInfo.tool_gateway_entitleds   s0   € ð
 Ô# tÐ+Ð+Ø�4ØÔ tÐ+ÐH°Ô0@Ô0HÐHr'   ÚcategoryÚstrc                óŠ   — | j         du rdS | j        }t          |o"|j        o|j                             |¦  «        du ¦  «        S )z¼Whether a specific tool category is entitled. Paid users are entitled
        everywhere; free tool-pool users only where ``coverage[category]`` is
        true (e.g. image but not video).T)rZ   r^   r>   r?   rA   Úget)rf   rl   Útas      r(   Útool_gateway_entitled_forz/NousPortalAccountInfo.tool_gateway_entitled_for|   sL   € ð Ô# tÐ+Ð+Ø�4ØÔˆÝ�BÐK˜2œ:ÐK¨"¬+¯/ª/¸(Ñ*CÔ*CÀtÐ*KÑLÔLÐLr'   )rb   r>   )rl   rm   rb   r>   )r"   r#   r$   r%   rJ   rK   rL   rM   rN   rO   rP   rQ   rR   rS   rT   rU   rV   rW   rY   rZ   r\   r^   r`   ra   r   Úpropertyrg   ri   rk   rq   r&   r'   r(   rE   rE   P   s  € € € € € € à€O€O�OØ!Ð!Ð!Ñ!Ø€K€K�KØ!€GÐ!Ð!Ð!Ñ!Ø €FÐ Ð Ð Ñ Ø"€HÐ"Ð"Ð"Ñ"Ø"€HÐ"Ð"Ð"Ñ"Ø#€IÐ#Ð#Ð#Ñ#Ø $€JÐ$Ð$Ð$Ñ$Ø!%€KÐ%Ð%Ð%Ñ%Ø%)€OÐ)Ð)Ð)Ñ)Ø(,ÐÐ,Ð,Ð,Ñ,Ø).Ð Ð.Ð.Ð.Ñ.Ø'+ÐÐ+Ð+Ð+Ñ+Ø%)€JÐ)Ð)Ð)Ñ)Ø€EÐÐÐÑØ#€IÐ#Ð#Ð#Ñ#Ø9=€LÐ=Ð=Ð=Ñ=Ø*.ÐÐ.Ð.Ð.Ñ.ØDHÐÐHÐHÐHÑHØ04€KÐ4Ð4Ð4Ñ4Ø+/€JÐ/Ð/Ð/Ñ/Ø,0€KÐ0Ð0Ð0Ñ0Ø€EÐÐÐÑàð0ð 0ð 0ñ „Xð0ð ð1ð 1ð 1ñ „Xð1ð ðIð Ið Iñ „XðIðMð Mð Mð Mð Mð Mr'   rE   Úaccount_infoúOptional[NousPortalAccountInfo]rb   rm   c                óÒ   — 	 ddl m} n# t          $ r d}Y nw xY wd}| �| j        }t	          |t
          ¦  «        r|                     ¦   «         s|}|                     d¦  «        › d�S )z>Return the billing URL for a normalized Nous account snapshot.r   )ÚDEFAULT_NOUS_PORTAL_URLúhttps://portal.nousresearch.comNú/ú/billing)Úhermes_cli.authrv   Ú	ExceptionrQ   Ú
isinstancerm   ÚstripÚrstrip)rs   rv   Úbases      r(   Únous_portal_billing_urlr€   †   sž   € ðDØ;Ð;Ð;Ð;Ð;Ð;Ð;øÝð Dð Dð DØ"CÐÐÐðDøøøð €DØÐØÔ+ˆÝ�d�CÑ Ô ð '¨¯
ª
©¬ð 'Ø&ˆØ�kŠk˜#ÑÔÐ(Ð(Ð(Ð(s   ‚	 ‰—c                ó,  — t          | ¦  «        }|dt          d¦  «         …         }| �t          | dd¦  «        nd}t          |t          ¦  «        r?|                     ¦   «         r+ddlm} |› d ||                     ¦   «         d¬¦  «        › d	�S |› d	�S )
aN  Return the portal top-up URL that auto-opens the top-up modal.

    Prefers the org-pinned page ``{base}/orgs/{slug}/billing?topup=open`` (skips
    the legacy shim's re-resolution + multi-org disambiguation). Falls back to the
    legacy ``{base}/billing?topup=open`` when the account has no ``org_slug`` (the
    portal's ``slug`` is nullable; the legacy page forwards the param through to
    the org-pinned page). Never builds ``/orgs/None/billing``.

    The ``?topup=open`` query is the NAS enabler that lands the user in the
    top-up flow rather than just on the billing page.
    Nry   rL   r   )Úquotez/orgs/Ú )Úsafez/billing?topup=open)r€   ÚlenÚgetattrr|   rm   r}   Úurllib.parser‚   )rs   Úbase_billingr   Úslugr‚   s        r(   Únous_portal_topup_urlrŠ   •   s¸   € õ +¨<Ñ8Ô8€LØÐ*�3˜z™?œ?Ð*Ð*Ô+€Dà6BÐ6N�7�< ¨TÑ2Ô2Ð2ÐTX€DÝ�$�ÑÔð P §¢¡¤ð PØ&Ð&Ð&Ð&Ð&Ð&àÐOÐO˜e˜e D§J¢J¡L¤L°rÐ:Ñ:Ô:ÐOÐOÐOÐOØÐ'Ð'Ð'Ð'r'   zthis feature)Ú
capabilityÚinclude_refresh_hintÚcoverage_categoryr‹   rŒ   r>   r�   r   c               óô  — t          | ¦  «        }| �2|�'|                      |¦  «        rdS | j        r|› d|› d�S n	| j        rdS | €	d|› d|› d�S | j        s| j        r	d|› d|› d�S d|› d	|› d�S | j        €-d
|› d�}| j        r|d| j        › d�z  }|r|dz  }|d|› d�z  }|S | j        }|r|j        nd}|dk    rd|› d�S |dk    s	| j        du r!t          | ||¦  «        }|r| j
        s|dz  }|S d|› d|› d�S )u   Return user-facing guidance for a missing Nous tool-gateway entitlement.

    ``None`` means the account is entitled to use the capability â€” via paid
    service access OR a live free tool pool that covers it. The message works
    from normalized entitlement fields rather than subscription price alone:
    purchased credits without a subscription still count as paid access, while a
    paid subscription with exhausted usable credits does not.

    ``coverage_category`` scopes the check to a single tool category (e.g.
    ``"fal-video"``). When given, a user who is entitled overall but whose
    access does not fund that category gets a neutral billing nudge instead of a
    message implying their credits are exhausted. The pool-vs-paid distinction is
    never surfaced to the user.
    Nzd isn't included with your current Nous Portal access. Add credits or a subscription to enable it at ú.z9Hermes could not verify your Nous Portal entitlement, so zO is unavailable. Run `hermes model` to refresh your login, or check billing at zeNous inference credentials are configured, but Hermes cannot verify your Nous Portal paid access for zc. Log in with `hermes model` to enable Portal-managed features. Billing and credits are managed at zLog in to Nous Portal to use z9: run `hermes model`. Billing and credits are managed at z9Hermes could not verify your Nous Portal paid access, so z is unavailable.z Account lookup failed: z, Run `hermes model` to refresh your session.z Check billing at Úaccount_missingzOHermes could not find a Nous Portal account or organisation for this login, so zi is unavailable. Run `hermes model` to authenticate again; if the problem persists, contact Nous support.Úno_usable_creditsFzF If you recently bought credits, run `hermes model` to refresh Hermes.zIYour Nous Portal account does not currently have paid service access, so ú2 is unavailable. Add credits or update billing at )r€   rq   rk   rF   rS   rZ   r   r\   r.   Ú_no_paid_access_messagerI   )	rs   r‹   rŒ   r�   Úbilling_urlÚdetailÚaccessr.   Úmessages	            r(   Ú&format_nous_portal_entitlement_messager˜   ¬   sd  € õ* *¨,Ñ7Ô7€KàÐØÐ(Ø×5Ò5Ð6GÑHÔHð Ø�tØÔ1ð ð
 "ð \ð \ØMXð\ð \ð \ðð	ð Ô/ð 	Ø�4àÐð)È
ð )ð )à%ð)ð )ð )ð	
ð Ô!ð 
ØÔ4ð 	ð9Ø4>ð9ð 9ð +6ð9ð 9ð 9ððA¨Jð Að AØ2=ðAð Að Að	
ð
 Ô'Ð/ðÈ
ð ð ð ð 	ð Ôð 	GØÐF°Ô1CÐFÐFÐFÑFˆFØð 	EØÐDÑDˆFØÐ5 {Ð5Ð5Ð5Ñ5ˆØˆàÔ2€FØ$Ð.ˆVŒ]ˆ]¨$€FØÐ"Ò"Ð"ðRØ#ðRð Rð Rð	
ð Ð$Ò$Ð$¨Ô(HÈEÐ(QÐ(QÝ)¨,¸
ÀKÑPÔPˆØð 	`¨Ô(:ð 	`ØÐ_Ñ_ˆGØˆð	[Øð	[ð 	[ØLWð	[ð 	[ð 	[ðr'   r”   c                óö  — | j         }|r|j        nd }|r|j        nd }|r|j        nd }|r|j        nd }|r|j        nd }|rL|j        rE|j        }	|j        }
t          |||¦  «        }d}|	�|
�d|	d›d|
d›d�}n	|	�d|	d›d�}d|› |› d|› d	�S |r|rt          |||¦  «        }d
|› d|› d|› d�S |r|du r	d|› d|› d�S |du rt          |||¦  «        }d|› d|› d|› d�S t          |||¦  «        }d|› d|› d|› d�S )Nrƒ   z. Your organisation's per-member spend cap is $ú.2fz and you've spent $z of it.r�   zlYour Nous Portal access is paused because you've exceeded the per-member spend cap set by your organisation.z> Ask your organisation admin to raise the member spend cap at z%, then run `hermes model` to refresh.z&Your Nous Portal credits are exhaustedz, so z, is unavailable. Top up or renew credits at FzGYour current Nous Portal plan does not include paid service access, so z+ is unavailable. Upgrade or add credits at zEYour Nous Portal account has no active subscription or usable creditsz- is unavailable. Subscribe or add credits at z3Your Nous Portal account has no usable paid creditsr’   )
r\   r1   r2   r7   r5   r6   r8   r9   r:   Ú_credit_detail)rs   r‹   r”   r–   r1   r2   Útotal_usableÚsubscription_creditsÚpurchased_creditsÚcapÚspentÚcredit_detailÚ
cap_details                r(   r“   r“     si  € ð
 Ô2€FØ@FÐP˜fÔ<Ð<ÈDÐØHNÐ"X &Ô"DÐ"DÐTXÐØ28ÐB�6Ô.Ð.¸d€LØDJÐT˜6Ô@Ð@ÐPTÐØ>DÐN˜Ô:Ð:È$Ðàð 
�&Ô2ð 
ØÔ)ˆØÔ'ˆÝ& |Ð5IÐK\Ñ]Ô]ˆØˆ
Øˆ?˜uÐ0ØxÈ#ÐxÐxÐxÐfkÐxÐxÐxÐxˆJˆJØˆ_ØTÈ#ÐTÐTÐTÐTˆJðØ>Hðàðð ð %0ðð ð ð	
ð ð 
Ð#>ð 
Ý& |Ð5IÐK\Ñ]Ô]ˆðI°]ð Ið IÈð Ið IØ:EðIð Ið Ið	
ð
 ð 
Ð#>À%Ð#GÐ#GðXØðXð XØITðXð Xð Xð	
ð
  %Ð'Ð'Ý& |Ð5IÐK\Ñ]Ô]ˆð!Øð!ð !Ø#-ð!ð !àð!ð !ð !ð	
õ # <Ð1EÐGXÑYÔY€Mð	X¸mð 	Xð 	XØð	Xð 	XØITð	Xð 	Xð 	Xðr'   rœ   r   r�   rž   c                óâ   — g }| �|                      d| d›�¦  «         |�|                      d|d›�¦  «         |�|                      d|d›�¦  «         |sdS dd                     |¦  «        › d�S )	Nzusable $rš   zsubscription $zpurchased $rƒ   z (z, ú))ÚappendÚjoin)rœ   r�   rž   Úpartss       r(   r›   r›   @  s¡   € ð
 €EØÐØ�ŠÐ2 Ð2Ð2Ð2Ñ3Ô3Ð3ØÐ'Ø�ŠÐ@Ð&:Ð@Ð@Ð@ÑAÔAÐAØÐ$Ø�ŠÐ:Ð#4Ð:Ð:Ð:Ñ;Ô;Ð;Øð ØˆrØ#�—	’	˜%Ñ Ô Ð#Ð#Ð#Ð#r'   ÚNonec                 ó
   — da dS )z7Clear the short-lived account-info cache used by tests.N)r   r&   r'   r(   Ú$reset_nous_portal_account_info_cacherª   Q  s   € ð ÐÐÐr'   F)Úforce_freshÚmin_jwt_ttl_secondsr«   r¬   Úintc                óä  — 	 ddl m}  |d¦  «        pi }n(# t          $ r}t          |d¬¦  «        cY d}~S d}~ww xY w|                     d¦  «        }t          |¦  «        }t          |t          ¦  «        r|                     ¦   «         s<t          | ||¬¦  «        }|�|S t          |¦  «        }|�|S t          dd	d|¬
¦  «        S | st          ||||¬¦  «        }	|	�|	S t          || |¬¦  «        S )af  Return normalized Nous Portal account entitlement information.

    By default, a valid unexpired OAuth access JWT is used as a low-latency
    local account snapshot. ``force_fresh=True`` always calls
    ``/api/oauth/account`` and bypasses the short-lived cache. JWT claims are
    decoded locally for UX gating only; server APIs remain authoritative.
    r   )Úget_provider_auth_stateÚnousF)r   rF   NÚaccess_token)r«   r¬   rQ   r   )rF   rH   rI   rQ   ©ÚstaterQ   r¬   )r³   r«   rQ   )rz   r¯   r{   Ú_error_inforo   Ú_portal_base_urlr|   rm   r}   Ú_info_from_oauth_poolÚ_info_from_inference_key_poolrE   Ú_info_from_valid_jwtÚ_fresh_account_info)
r«   r¬   r¯   r³   Úexcr±   rQ   Úpool_oauth_infoÚ	pool_infoÚjwt_infos
             r(   Úget_nous_portal_account_infor¾   W  st  € ð7Ø;Ð;Ð;Ð;Ð;Ð;à'Ð'¨Ñ/Ô/Ð5°2ˆˆøÝð 7ð 7ð 7Ý °Ð6Ñ6Ô6Ð6Ð6Ð6Ð6Ð6Ð6øøøøð7øøøð —9’9˜^Ñ,Ô,€LÝ& uÑ-Ô-€OÝ�l¥CÑ(Ô(ð 
°×0BÒ0BÑ0DÔ0Dð 
Ý/Ø#Ø 3Ø+ð
ñ 
ô 
ˆð
 Ð&Ø"Ð"Ý1°/ÑBÔBˆ	ØÐ ØÐÝ$ØØØØ+ð	
ñ 
ô 
ð 	
ð ð Ý'ØØØ+Ø 3ð	
ñ 
ô 
ˆð ÐØˆOåØØØ'ðñ ô ð s   ‚ –
; 6°;¶;r³   údict[str, Any]rQ   c           	     ó\  — 	 ddl m}m}  |¦   «         } |d¦  «        p| }t          |¦  «        p|}t	          ||¦  «        }t
          5  |sEt          �>t          \  }}	}
||k    r-t          j        ¦   «         |	z
  t          k     r|
cd d d ¦  «         S d d d ¦  «         n# 1 swxY w Y   t          ||¦  «        }|st          dd|¬¦  «        S t          |                     d¦  «        t          ¦  «        r(t          |                     d¦  «        pdd||¬	¦  «        S t          |||¬
¦  «        }t
          5  |t          j        ¦   «         |fad d d ¦  «         n# 1 swxY w Y   |S # t           $ r<}t          |t#          |                      d¦  «        ¦  «        |¬¦  «        cY d }~S d }~ww xY w)Nr   )r¯   Úresolve_nous_access_tokenr°   Úempty_account_responseT©r   rF   rQ   r   Úaccount_response_error©r   rF   rQ   ra   ©r³   rQ   r±   )rz   r¯   rÁ   rµ   Ú
_cache_keyÚ_ACCOUNT_INFO_CACHE_LOCKr   ÚtimeÚ	monotonicÚ_ACCOUNT_INFO_CACHE_TTLÚ_fetch_nous_account_infor´   r|   ro   rm   Ú_info_from_account_payloadr{   r>   )r³   r«   rQ   r¯   rÁ   r±   Úrefreshed_stateÚ	cache_keyÚ
cached_keyÚ	cached_atÚcached_infoÚpayloadÚinforº   s                 r(   r¹   r¹   �  sÇ  € ð*
ØVÐVÐVÐVÐVÐVÐVÐVà0Ð0Ñ2Ô2ˆØ1Ð1°&Ñ9Ô9ÐB¸UˆÝ*¨?Ñ;Ô;ÐN¸ˆÝ˜|¨_Ñ=Ô=ˆ	å%ð 	'ð 	'Øð 'Õ#6Ð#BÝ5HÑ2�
˜I {Ø Ò*Ð*µ´Ñ0@Ô0@À9Ñ0LÕPgÒ/gÐ/gØ&ð		'ð 	'ð 	'ð 	'ñ 	'ô 	'ð 	'ð 	'ð 	'ð 	'ð 	'ñ 	'ô 	'ð 	'ð 	'ð 	'ð 	'ð 	'ð 	'øøøð 	'ð 	'ð 	'ð 	'õ +¨<¸ÑIÔIˆØð 	ÝØ.ØØ /ðñ ô ð õ
 �g—k’k 'Ñ*Ô*­CÑ0Ô0ð 	ÝØ—k’k 'Ñ*Ô*ÐFÐ.FØØ /Ø#ð	ñ ô ð õ *ØØ!Ø+ð
ñ 
ô 
ˆõ
 &ð 	Fð 	FØ#,­d¬nÑ.>Ô.>ÀÐ"EÐð	Fð 	Fð 	Fñ 	Fô 	Fð 	Fð 	Fð 	Fð 	Fð 	Fð 	Føøøð 	Fð 	Fð 	Fð 	FàˆøÝð 
ð 
ð 
ÝØÝ˜5Ÿ9š9 ^Ñ4Ô4Ñ5Ô5Ø+ð
ñ 
ô 
ð 	
ð 	
ð 	
ð 	
ð 	
ð 	
øøøøð
øøøsy   ‚AE% Á	;BÂE% ÂE% ÂB!Â!E% Â$B!Â%&E% ÃAE% ÄE% Ä5EÅE% ÅEÅE% ÅEÅ E% Å%
F+Å/1F&Æ F+Æ&F+c                óº  — 	 t          ¦   «         }|€dS t          |dd¦  «        pt          |dd¦  «        }t          |t          ¦  «        r|                     ¦   «         sdS t          dddt          |dd¦  «        p| t          |dd¦  «        p!t          |d	d¦  «        pt          |d
d¦  «        ddt          |dd¦  «        › �d¬¦  «        S # t          $ r Y dS w xY w)zEReturn an explicit unknown-entitlement snapshot for opaque Nous keys.NÚruntime_api_keyr±   rƒ   Fr   rQ   rR   Úruntime_base_urlÚbase_urlTúpool:ÚlabelÚunknownÚportal_oauth_missing)rF   rH   rI   rQ   rR   rS   rT   r   )Ú_select_nous_pool_entryr†   r|   rm   r}   rE   r{   )rQ   ÚentryÚruntime_keys      r(   r·   r·   Ä  s  € ðÝ'Ñ)Ô)ˆØˆ=Ø�4Ý˜eÐ%6¸Ñ=Ô=ÐcÅÈÐP^Ð`bÑAcÔAcˆÝ˜+¥sÑ+Ô+ð 	°;×3DÒ3DÑ3FÔ3Fð 	Ø�4å$ØØ"Øå˜Ð0°$Ñ7Ô7ð #Ø"õ ˜Ð3°TÑ:Ô:ð 4Ý˜5Ð"4°dÑ;Ô;ð4å˜5 *¨dÑ3Ô3à)-ØJ¥g¨e°W¸iÑ&HÔ&HÐJÐJØ(ð
ñ 
ô 
ð 	
øõ" ð ð ð Øˆtˆtðøøøs   ‚C ”AC Á!A*C Ã
CÃCc           
     ón  — 	 t          ¦   «         }n# t          $ r Y d S w xY w|�t          |¦  «        sd S t          |dd ¦  «        }t	          |t
          ¦  «        r|                     ¦   «         sd S t          |dd ¦  «        p|}|t          |dd ¦  «        t          |dd ¦  «        p!t          |dd ¦  «        pt          |dd ¦  «        t          |dd ¦  «        dt          |d	d
¦  «        › �dœ}| st          ||||¬¦  «        }|�|S 	 t          ||¦  «        }n)# t          $ r}	t          |	d|¬¦  «        cY d }	~	S d }	~	ww xY w|st          dd|¬¦  «        S t	          | 
                    d¦  «        t
          ¦  «        r(t          | 
                    d¦  «        pdd||¬¦  «        S t          |||¬¦  «        S )Nr±   rQ   rN   rR   r×   rØ   Ú	agent_keyrÙ   rÚ   rÛ   )r±   rN   rR   rá   rT   r²   TrÃ   rÂ   r   rÄ   rÅ   rÆ   )rÝ   r{   Ú_pool_entry_is_portal_oauthr†   r|   rm   r}   r¸   rÌ   r´   ro   rÍ   )
r«   r¬   rQ   rÞ   r±   Úentry_portal_urlr³   r½   rÓ   rº   s
             r(   r¶   r¶   å  sm  € ðÝ'Ñ)Ô)ˆˆøÝð ð ð Øˆtˆtðøøøà€}Õ7¸Ñ>Ô>€}Øˆtå˜5 .°$Ñ7Ô7€LÝ�l¥CÑ(Ô(ð °×0BÒ0BÑ0DÔ0Dð Øˆtõ 	�Ð(¨$Ñ/Ô/ð 	Øð ð
 %Ý˜U K°Ñ6Ô6å�EÐ/°Ñ6Ô6ð 0Ý�uÐ0°$Ñ7Ô7ð0å�u˜j¨$Ñ/Ô/å˜U K°Ñ6Ô6ØI¥W¨U°G¸YÑ%GÔ%GÐIÐIð
ð 
€Eð ð Ý'ØØØ,Ø 3ð	
ñ 
ô 
ˆð ÐØˆOð
Ý*¨<Ð9IÑJÔJˆˆøÝð 
ð 
ð 
ÝØØØ,ð
ñ 
ô 
ð 	
ð 	
ð 	
ð 	
ð 	
ð 	
øøøøð
øøøð ð 
ÝØ*ØØ,ð
ñ 
ô 
ð 	
õ
 �'—+’+˜gÑ&Ô&­Ñ,Ô,ð 
ÝØ—+’+˜gÑ&Ô&ÐBÐ*BØØ,Øð	
ñ 
ô 
ð 	
õ &ØØØ(ðñ ô ð s*   ‚ ‘
žÄD Ä
D>Ä"D9Ä3D>Ä9D>úOptional[Any]c                 óÈ   — ddl m}   | d¦  «        }|r|                     ¦   «         sd S t          |                     ¦   «         ¦  «        }|sd S d
d„}t          ||¬	¦  «        S )Nr   )Ú	load_poolr°   rÞ   r   rb   útuple[float, float, int]c                óÎ   — t          t          | dd ¦  «        ¦  «        pd}t          t          | dd ¦  «        ¦  «        pd}t          t          | dd¦  «        pd¦  «        }||| fS )NÚagent_key_expires_atg        rU   Úpriorityr   )Ú_parse_iso_timestampr†   r­   )rÞ   Ú	agent_expÚ
access_exprê   s       r(   Ú_entry_sort_keyz0_select_nous_pool_entry.<locals>._entry_sort_key6  so   € Ý(­°Ð8NÐPTÑ)UÔ)UÑVÔVÐ]ÐZ]ˆ	Ý)­'°%¸ÀtÑ*LÔ*LÑMÔMÐTÐQTˆ
Ý•w˜u j°!Ñ4Ô4Ð9¸Ñ:Ô:ˆØ˜:¨ yÐ1Ð1r'   )Úkey)rÞ   r   rb   rç   )Úagent.credential_poolræ   Úhas_credentialsÚlistÚentriesÚmax)ræ   Úpoolró   rî   s       r(   rÝ   rÝ   ,  sŽ   € Ø/Ð/Ð/Ð/Ð/Ð/àˆ9�VÑÔ€DØð �t×+Ò+Ñ-Ô-ð ØˆtÝ�4—<’<‘>”>Ñ"Ô"€GØð Øˆtð2ð 2ð 2ð 2õ ˆw˜OÐ,Ñ,Ô,Ð,r'   rÞ   r   c                ól  — t          | dd ¦  «        }t          |t          ¦  «        r|                     ¦   «         sdS t          t          | dd¦  «        pd¦  «                             ¦   «                              ¦   «         }t          | dd ¦  «        }|                     d¦  «        pt          |¦  «        S )Nr±   FÚ	auth_typerƒ   Úrefresh_tokenÚoauth)r†   r|   rm   r}   ÚlowerÚ
startswithr>   )rÞ   r±   r÷   rø   s       r(   râ   râ   ?  s¥   € Ý˜5 .°$Ñ7Ô7€LÝ�l¥CÑ(Ô(ð °×0BÒ0BÑ0DÔ0Dð ØˆuÝ•G˜E ;°Ñ3Ô3Ð9°rÑ:Ô:×@Ò@ÑBÔB×HÒHÑJÔJ€IÝ˜E ?°DÑ9Ô9€MØ×Ò Ñ(Ô(Ð?­D°Ñ,?Ô,?Ð?r'   r±   c                ó   — |pd                      d¦  «        }|› d�}d| › �ddœ}t          j                             ||¬¦  «        }t          j                             |d¬	¦  «        5 }t          j        |                     ¦   «                              ¦   «         ¦  «        }d d d ¦  «         n# 1 swxY w Y   t          |t          ¦  «        r|ni S )
Nrw   rx   z/api/oauth/accountzBearer zapplication/json)ÚAuthorizationÚAccept)Úheadersé   )Útimeout)r~   ÚurllibÚrequestÚRequestÚurlopenÚjsonÚloadsÚreadÚdecoder|   rC   )r±   rQ   r   Úurlrÿ   ÚreqÚresprÓ   s           r(   rÌ   rÌ   H  s
  € ð Ð@Ð@×HÒHÈÑMÔM€DØÐ
%Ð
%Ð
%€Cà1 <Ð1Ð1Ø$ðð €Gõ Œ.×
 Ò
  ¨gÐ
 Ñ
6Ô
6€CÝ	Œ×	Ò	 ¨QÐ	Ñ	/Ô	/ð 3°4Ý”*˜TŸYšY™[œ[×/Ò/Ñ1Ô1Ñ2Ô2ˆð3ð 3ð 3ñ 3ô 3ð 3ð 3ð 3ð 3ð 3ð 3øøøð 3ð 3ð 3ð 3å  ­$Ñ/Ô/Ð7ˆ7ˆ7°RÐ7s   Á'9B,Â,B0Â3B0Útokenc          
     óô  — 	 ddl m} n# t          $ r Y d S w xY w || ¦  «        }|sd S t          |                     d¦  «        ¦  «        }|�5|t          j        ¦   «         t          dt          |¦  «        ¦  «        z   k    rd S t          |                     d¦  «        ¦  «        }t          |                     d¦  «        ¦  «        }t          ||t          |                     d¦  «        ¦  «        |¬¦  «        }	t          di dd	“d
d“dd“dt          |                     d¦  «        ¦  «        “dt          |                     d¦  «        ¦  «        “dt          |                     d¦  «        p|                     d¦  «        ¦  «        “dt          |                     d¦  «        ¦  «        “dt          |                     d¦  «        ¦  «        “d|“dt          |                     d¦  «        ¦  «        “dd	“dt          |                     d¦  «        ¦  «        pd“dt          j        |t          j        ¬¦  «        “d|“d|	“dt#          |                     d¦  «        ¦  «        “dt%          |¦  «        “ŽS )Nr   )Ú_decode_jwt_claimsÚexpr-   r3   rK   )r,   r-   r/   r3   rF   TrH   r   rI   FrJ   ÚsubrN   rO   rP   rQ   rR   rS   rT   Ú
auth_storerU   )ÚtzrZ   r\   r^   r`   r&   )rz   r  r{   Ú_coerce_floatro   rÉ   rô   r­   Ú_coerce_boolÚ_coerce_intr*   Ú_coerce_strrE   r   Úfromtimestampr   ÚutcÚ_tool_access_from_valuerC   )
r  r³   rQ   r¬   r  Úclaimsr  r-   r3   Úaccess_infos
             r(   r¸   r¸   X  sÈ  € ðØ6Ð6Ð6Ð6Ð6Ð6Ð6øÝð ð ð Øˆtˆtðøøøð  Ð Ñ&Ô&€FØð Øˆtå
˜Ÿ
š
 5Ñ)Ô)Ñ
*Ô
*€CØ
€{�c�TœY™[œ[­3¨qµ#Ð6IÑ2JÔ2JÑ+KÔ+KÑKÒKÐKØˆtå˜vŸzšz¨-Ñ8Ô8Ñ9Ô9€KÝ# F§J¢JÐ/BÑ$CÔ$CÑDÔDÐÝ+ØØÝ# F§J¢J¨xÑ$8Ô$8Ñ9Ô9Ø+ð	ñ ô €Kõ !ð ð ð Ø�$ðàˆuðð ˆeðõ ˜FŸJšJ uÑ-Ô-Ñ.Ô.Ð.ð	õ
 ˜6Ÿ:š: hÑ/Ô/Ñ0Ô0Ð0ðõ ˜fŸjšj¨Ñ5Ô5ÐO¸¿ºÀ;Ñ9OÔ9OÑPÔPÐPðõ ˜vŸzšz¨,Ñ7Ô7Ñ8Ô8Ð8ðõ   §
¢
¨=Ñ 9Ô 9Ñ:Ô:Ð:ðð (˜ðõ ' u§y¢yÐ1EÑ'FÔ'FÑGÔGÐGðð &* Tðõ & e§i¢iÐ0CÑ&DÔ&DÑEÔEÐUÈøðõ Ô)¨#µ(´,Ð?Ñ?Ô?Ð?ðð (˜Kðð "- ðõ  ,¨F¯JªJ°}Ñ,EÔ,EÑFÔFÐFð!õ" ˜‘<”<�<ð#ð s   ‚	 ‰
–rÓ   c          
     óÌ  — |                       d¦  «        }t          |t          ¦  «        r|ni }|                       d¦  «        }t          |t          ¦  «        r|ni }t          |                       d¦  «        ¦  «        }t	          |                       d¦  «        ¦  «        }|r|j        nd }	|	€	|�|j        }	t          di dd“dd“d	d“d
t          |                      d¦  «        ¦  «        p
|r|j	        nd “dt          |                      d¦  «        ¦  «        “dt          |                      d¦  «        ¦  «        “dt          |                      d¦  «        ¦  «        “d|“dt          |                      d¦  «        ¦  «        “dt          |                      d¦  «        p|                      d¦  «        ¦  «        “dt          |                      d¦  «        ¦  «        pd“dt          |                      d¦  «        ¦  «        “dt          |                      d¦  «        ¦  «        “d|“d|	“d|“dt          |                       d¦  «        ¦  «        “dt          | ¦  «        “ŽS )NÚuserÚorganisationrY   rZ   rF   TrH   r   rI   rK   ÚidrL   r‰   rM   ÚnamerN   rQ   rR   rS   r±   rá   rT   r  rV   rW   r\   r^   ra   r&   )ro   r|   rC   Ú_subscription_from_payloadÚ!_paid_service_access_from_payloadr,   r-   rE   r  r/   r>   r  )
rÓ   r³   rQ   Úraw_userr  Úraw_orgr  rY   r–   r-   s
             r(   rÍ   rÍ   Š  sž  € ð �{Š{˜6Ñ"Ô"€HÝ'1°(½DÑ'AÔ'AÐI˜8˜8Àr€DØ�kŠk˜.Ñ)Ô)€GÝ.8¸Å$Ñ.GÔ.GÐ#O 7 7ÈR€LÝ-¨g¯kªk¸.Ñ.IÔ.IÑJÔJ€LÝ.¨w¯{ª{Ð;PÑ/QÔ/QÑRÔR€FØ$*Ð4�&”.�.°€KØÐ˜vÐ1ØÔ(ˆå ð ð ð Ø�$ðàˆ}ðð ˆdðõ ˜<×+Ò+¨DÑ1Ô1Ñ2Ô2ÐbÐQWÐ7a°vÔ7MÐ7MÐ]aøð	õ
 ˜\×-Ò-¨fÑ5Ô5Ñ6Ô6Ð6ðõ ˜\×-Ò-¨fÑ5Ô5Ñ6Ô6Ð6ðõ ˜eŸiši¨Ñ4Ô4Ñ5Ô5Ð5ðð (˜ðõ ' u§y¢yÐ1EÑ'FÔ'FÑGÔGÐGðõ &*¨%¯)ª)°NÑ*CÔ*CÐ*]ÀuÇyÂyÐQ\ÑG]ÔG]Ñ%^Ô%^Ð%^ðõ & e§i¢iÐ0CÑ&DÔ&DÑEÔEÐUÈøðõ ˜$Ÿ(š( 7Ñ+Ô+Ñ,Ô,Ð,ðõ ˜dŸhšh {Ñ3Ô3Ñ4Ô4Ð4ðð "�\ðð (˜Kðð  "( ð!õ" ,¨G¯KªK¸Ñ,FÔ,FÑGÔGÐGð#õ$ ˜‘M”M�Mð%ð r'   Úvaluer]   c                ó^  — t          | t          ¦  «        sdS t          |                      d¦  «        ¦  «        du }|                      d¦  «        }i }t          |t          ¦  «        r6|                     ¦   «         D ]!\  }}t          |t
          ¦  «        r|du ||<   Œ"t          ||¬¦  «        S )z÷Parse a Portal ``tool_access`` object (from the JWT claim or the account
    API) into :class:`NousToolAccessInfo`. Fails closed: a non-object value
    yields ``None``, and only literal ``true`` counts for ``enabled`` and each
    coverage entry.Nr?   TrA   )r?   rA   )r|   rC   r  ro   Úitemsrm   r=   )r&  r?   Úraw_coveragerA   rï   Úvals         r(   r  r  °  s³   € õ
 �e�TÑ"Ô"ð ØˆtÝ˜5Ÿ9š9 YÑ/Ô/Ñ0Ô0°DÐ8€GØ—9’9˜ZÑ(Ô(€LØ "€HÝ�,¥Ñ%Ô%ð ,Ø$×*Ò*Ñ,Ô,ð 	,ð 	,‰HˆC�Ý˜#�sÑ#Ô#ð ,Ø # t �˜‘øÝ g¸ÐAÑAÔAÐAr'   rX   c                ó  — t          | t          ¦  «        sd S t          t          |                      d¦  «        ¦  «        t          |                      d¦  «        ¦  «        t          |                      d¦  «        ¦  «        t          |                      d¦  «        ¦  «        t          |                      d¦  «        ¦  «        t          |                      d¦  «        ¦  «        t          |                      d¦  «        ¦  «        ¬¦  «        S )	Nr   r   r   r   r   r    r!   )r   r   r   r   r   r    r!   )r|   rC   r   r  ro   r  r  ©r&  s    r(   r"  r"  Á  sÖ   € Ý�e�TÑ"Ô"ð ØˆtÝ%Ý˜Ÿš 6Ñ*Ô*Ñ+Ô+Ý˜Ÿš 6Ñ*Ô*Ñ+Ô+Ý$ U§Y¢YÐ/?Ñ%@Ô%@ÑAÔAÝ% e§i¢iÐ0AÑ&BÔ&BÑCÔCÝ& u§y¢yÐ1EÑ'FÔ'FÑGÔGÝ'¨¯	ª	Ð2EÑ(FÔ(FÑGÔGÝ& u§y¢yÐ1CÑ'DÔ'DÑEÔEðñ ô ð r'   r[   c           
     ó¬  — t          | t          ¦  «        sd S t          |                      d¦  «        ¦  «        }t          |                      d¦  «        ¦  «        }t	          di d|“d|“dt          |                      d¦  «        ¦  «        “dt          |                      d¦  «        ¦  «        “dt          |                      d¦  «        ¦  «        “dt          |                      d¦  «        ¦  «        “dt          |                      d¦  «        ¦  «        “dt          |                      d¦  «        ¦  «        “d	t          |                      d	¦  «        ¦  «        “d
t          |                      d
¦  «        ¦  «        “dt          |                      d¦  «        ¦  «        “dt          |                      d¦  «        ¦  «        “dt          |                      d¦  «        ¦  «        “dt          |                      d¦  «        ¦  «        “dt          |                      d¦  «        ¦  «        “dt          |                      d¦  «        ¦  «        “ŽS )Nr,   r-   r.   r/   r0   r1   r2   r3   r4   r5   r6   r7   r8   r9   r:   r;   r&   )r|   rC   r  ro   r*   r  r  r  )r&  r,   r-   s      r(   r#  r#  Ï  sQ  € Ý�e�TÑ"Ô"ð ØˆtÝ˜5Ÿ9š9 YÑ/Ô/Ñ0Ô0€GÝ˜uŸyšy¨Ñ7Ô7Ñ8Ô8€KÝ$ð ð ð Ø�ðà�Kðõ ˜5Ÿ9š9 XÑ.Ô.Ñ/Ô/Ð/ðõ $ E§I¢IÐ.?Ñ$@Ô$@ÑAÔAÐAð	õ
 $ E§I¢IÐ.?Ñ$@Ô$@ÑAÔAÐAðõ !-¨U¯YªYÐ7PÑ-QÔ-QÑ RÔ RÐ Rðõ %1°·²Ð;XÑ1YÔ1YÑ$ZÔ$ZÐ$Zðõ & e§i¢iÐ0CÑ&DÔ&DÑEÔEÐEðõ %2°%·)²)Ð<YÑ2ZÔ2ZÑ$[Ô$[Ð$[ðõ (5°U·Y²YÐ?_Ñ5`Ô5`Ñ'aÔ'aÐ'aðõ %2°%·)²)Ð<YÑ2ZÔ2ZÑ$[Ô$[Ð$[ðõ +¨5¯9ª9Ð5KÑ+LÔ+LÑMÔMÐMðõ #/¨u¯yªyÐ9TÑ/UÔ/UÑ"VÔ"VÐ"Vðõ +¨5¯9ª9Ð5KÑ+LÔ+LÑMÔMÐMðõ ' u§y¢yÐ1CÑ'DÔ'DÑEÔEÐEðõ  (5°U·Y²YÐ?_Ñ5`Ô5`Ñ'aÔ'aÐ'að!ð r'   )rQ   ra   r   ÚobjectrF   ra   r_   c           
     óF   — t          |dd||t          | ¦  «        ¬¦  «        S )Nr   F)rF   rH   rI   rQ   ra   r   )rE   rm   rÅ   s       r(   r´   r´   è  s3   € õ !ØØØØ'ØÝ�%‰jŒjðñ ô ð r'   c                óÐ   — |                       d¦  «        }t          |t          ¦  «        r|                     ¦   «         sd S |                     ¦   «                              d¦  «        S )NrQ   rx   )ro   r|   rm   r}   r~   )r³   r&  s     r(   rµ   rµ   ù  sV   € Ø�IŠIÐ'Ñ(Ô(€EÝ�e�SÑ!Ô!ð ¨¯ª©¬ð ØˆtØ�;Š;‰=Œ=×Ò Ñ$Ô$Ð$r'   c                ó†   — t          j        |                      d¦  «        ¦  «                             ¦   «         }|pd› d|› �S )Nzutf-8rƒ   ú:)ÚhashlibÚsha256ÚencodeÚ	hexdigest)r±   rQ   Údigests      r(   rÇ   rÇ      sD   € ÝŒ^˜L×/Ò/°Ñ8Ô8Ñ9Ô9×CÒCÑEÔE€FØÐ# Ð.Ð. fÐ.Ð.Ð.r'   c                ó  — t          | t          ¦  «        r| sd S |                      ¦   «         }|                     d¦  «        r|d d…         dz   }	 t	          j        |¦  «                             ¦   «         S # t          $ r Y d S w xY w)NÚZéÿÿÿÿz+00:00)r|   rm   r}   Úendswithr   ÚfromisoformatÚ	timestampr{   )r&  Útexts     r(   rë   rë     s—   € Ý�e�SÑ!Ô!ð ¨ð ØˆtØ�;Š;‰=Œ=€DØ‡}‚}�SÑÔð $Ø�C�R�CŒy˜8Ñ#ˆðÝÔ% dÑ+Ô+×5Ò5Ñ7Ô7Ð7øÝð ð ð Øˆtˆtðøøøs   Á%A7 Á7
BÂBc                ó8   — t          | t          ¦  «        r| r| S d S ©N)r|   rm   r,  s    r(   r  r    s%   € Ý�%�ÑÔð  %ð ØˆØˆ4r'   r+   c                ó4   — t          | t          ¦  «        r| nd S r@  )r|   r>   r,  s    r(   r  r    s   € Ý˜u¥dÑ+Ô+Ð5ˆ5ˆ5°Ð5r'   r   c                óˆ   — t          | t          ¦  «        rd S 	 | €d S t          | ¦  «        S # t          t          f$ r Y d S w xY wr@  )r|   r>   r­   Ú	TypeErrorÚ
ValueErrorr,  s    r(   r  r    s[   € Ý�%�ÑÔð ØˆtðØˆ=Ø�4Ý�5‰zŒzÐøÝ•zÐ"ð ð ð Øˆtˆtðøøøó   ™, �, ¬AÁ Ac                óˆ   — t          | t          ¦  «        rd S 	 | €d S t          | ¦  «        S # t          t          f$ r Y d S w xY wr@  )r|   r>   ÚfloatrC  rD  r,  s    r(   r  r  &  s[   € Ý�%�ÑÔð ØˆtðØˆ=Ø�4Ý�U‰|Œ|ÐøÝ•zÐ"ð ð ð ØˆtˆtðøøørE  r@  )rs   rt   rb   rm   )
rs   rt   r‹   rm   rŒ   r>   r�   r   rb   r   )rs   rE   r‹   rm   r”   rm   rb   rm   )rœ   r   r�   r   rž   r   rb   rm   )rb   r¨   )r«   r>   r¬   r­   rb   rE   )r³   r¿   r«   r>   rQ   r   rb   rE   )rQ   r   rb   rt   )r«   r>   r¬   r­   rQ   r   rb   rt   )rb   rä   )rÞ   r   rb   r>   )r±   rm   rQ   r   rb   r¿   )
r  rm   r³   r¿   rQ   r   r¬   r­   rb   rt   )rÓ   r¿   r³   r¿   rQ   r   rb   rE   )r&  r   rb   r]   )r&  r   rb   rX   )r&  r   rb   r[   )
r   r.  rF   r>   rQ   r   ra   r_   rb   rE   )r³   r¿   rb   r   )r±   rm   rQ   r   rb   rm   )r&  r   rb   r   )r&  r   rb   r   )r&  r   rb   r+   )r&  r   rb   r   )7rB   Ú
__future__r   r3  r  Ú	threadingrÉ   Úurllib.requestr  Údataclassesr   r   r   r   Útypingr   r	   r
   rG   ÚTOOL_COVERAGE_CATEGORIESrË   r   r%   ÚLockrÈ   r   r*   r=   rE   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(   ú<module>rO     sk  ðØ 9Ð 9Ð 9à "Ð "Ð "Ð "Ð "Ð "à €€€Ø €€€Ø Ð Ð Ð Ø €€€Ø Ð Ð Ð Ø (Ð (Ð (Ð (Ð (Ð (Ð (Ð (Ø 'Ð 'Ð 'Ð 'Ð 'Ð 'Ð 'Ð 'Ø )Ð )Ð )Ð )Ð )Ð )Ð )Ð )Ð )Ð )ð  Ð VÔWÐ ðÐ ð Ð ØIMÐ Ð MÐ MÐ MÑ MØ)˜9œ>Ñ+Ô+Ð ð €�$ÐÑÔð-ð -ð -ð -ð -ñ -ô -ñ Ôð-ð €�$ÐÑÔð;ð ;ð ;ð ;ð ;ñ ;ô ;ñ Ôð;ð& €�$ÐÑÔð	<ð 	<ð 	<ð 	<ð 	<ñ 	<ô 	<ñ Ôð	<ð €�$ÐÑÔð2Mð 2Mð 2Mð 2Mð 2Mñ 2Mô 2Mñ Ôð2Mðj)ð )ð )ð )ð )ð(ð (ð (ð (ð (ð4 %Ø!%Ø'+ðXð Xð Xð Xð Xð Xðv6ð 6ð 6ð 6ðr$ð $ð $ð $ð"ð ð ð ð Ø!ð5ð 5ð 5ð 5ð 5ð 5ðp2
ð 2
ð 2
ð 2
ðjð ð ð ðBDð Dð Dð DðN-ð -ð -ð -ð&@ð @ð @ð @ð &*ð8ð 8ð 8ð 8ð 8ð /ð /ð /ð /ðd#ð #ð #ð #ðLBð Bð Bð Bð"ð ð ð ðð ð ð ð: &*Ø,0ðð ð ð ð ð ð"%ð %ð %ð %ð/ð /ð /ð /ð
	ð 	ð 	ð 	ðð ð ð ð6ð 6ð 6ð 6ðð ð ð ðð ð ð ð ð r'   