§
    øžyj¾3  ã                  ó$  — 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mZm	Z	 ddl
Z
 ej        e¦  «        ZdZdZdedd	œi d
œdedd	œddid
œgZded<   ddgZded<   d/d0d„Z G d„ de
j        ¦  «        Zd1d„Zd2d„Zd3d„Zd4d$„Zd5d%„Zd6d*„Zd7d.„ZdS )8aY  Telegram-specific network helpers.

Provides a hostname-preserving fallback transport for networks where
api.telegram.org resolves to an endpoint that is unreachable from the current
host. The transport keeps the logical request host and TLS SNI as
api.telegram.org while retrying the TCP connection against one or more fallback
IPv4 addresses.
é    )ÚannotationsN)ÚIterableÚOptionalzapi.telegram.orgg      @zhttps://dns.google/resolveÚA)ÚnameÚtype)ÚurlÚparamsÚheadersz$https://cloudflare-dns.com/dns-queryÚAcceptzapplication/dns-jsonz
list[dict]Ú_DOH_PROVIDERSz149.154.166.110z149.154.167.220ú	list[str]Ú_SEED_FALLBACK_IPSÚreturnú
str | Nonec                ó(   — ddl m}  |d| ¬¦  «        S )Nr   )Úresolve_proxy_urlÚTELEGRAM_PROXY©Útarget_hosts)Úgateway.platforms.baser   )r   r   s     úQ/home/ragecks/.hermes/hermes-agent/plugins/platforms/telegram/telegram_network.pyÚ_resolve_proxy_urlr   .   s+   € à8Ð8Ð8Ð8Ð8Ð8ØÐÐ-¸LÐIÑIÔIÐIó    c                  óf   — e Zd ZdZ ej        dd¬¦  «        Zdd„Zdd„Zdd„Z	dd„Z
dd„Zdd„ZdS )ÚTelegramFallbackTransportad  Retry Telegram Bot API requests via fallback IPs while preserving TLS/SNI.

    Requests continue to target https://api.telegram.org/... logically, but on
    connect failures the underlying TCP connection is retried against a known
    reachable IP. This is effectively the programmatic equivalent of
    ``curl --resolve api.telegram.org:443:<ip>``.
    é   é   )Úmax_connectionsÚmax_keepalive_connectionsÚfallback_ipsúIterable[str]c                óò  — t          t                               t          |¦  «        ¦  «        ¦  «        | _        t          t          g| j        ¢¬¦  «        }|r	d|vr||d<   |                     d| j        ¦  «         || _	        t          j        di |¤Ž| _        t          j        ¦   «         | _        d| _        i | _        t          j        ¦   «         | _        d | _        t          j        ¦   «         | _        d S )Nr   ÚproxyÚlimitsF© )ÚlistÚdictÚfromkeysÚ_normalize_fallback_ipsÚ_fallback_ipsr   Ú_TELEGRAM_API_HOSTÚ
setdefaultÚ_POOL_LIMITSÚ_transport_kwargsÚhttpxÚAsyncHTTPTransportÚ_primaryÚasyncioÚLockÚ_primary_lockÚ_primary_closedÚ
_fallbacksÚ_fallback_lockÚ
_sticky_ipÚ_sticky_lock)Úselfr!   Útransport_kwargsÚ	proxy_urls       r   Ú__init__z"TelegramFallbackTransport.__init__B   sá   € Ý!¥$§-¢-Õ0GÈÑ0UÔ0UÑ"VÔ"VÑWÔWˆÔÝ&Õ5GÐ4]È$ÔJ\Ð4]Ð^Ñ^Ô^ˆ	Øð 	2˜Ð(8Ð8Ð8Ø(1Ð˜WÑ%Ø×#Ò# H¨dÔ.?Ñ@Ô@Ð@Ø!1ˆÔÝÔ0ÐDÐDÐ3CÐDÐDˆŒÝ$œ\™^œ^ˆÔØ$ˆÔà?AˆŒÝ%œl™nœnˆÔØ)-ˆŒÝ#œL™NœNˆÔÐÐr   ÚipÚstrr   úhttpx.AsyncHTTPTransportc              ƒ  óè   K  — | j         4 ƒd {V —† | j                             |¦  «        }|€ t          j        di | j        ¤Ž}|| j        |<   |cd d d ¦  «        ƒd {V —† S # 1 ƒd {V —†swxY w Y   d S )Nr&   )r8   r7   Úgetr0   r1   r/   )r;   r?   Ú	transports      r   Ú_get_fallbackz'TelegramFallbackTransport._get_fallbackR   s  è è € ØÔ&ð 	ð 	ð 	ð 	ð 	ð 	ð 	ð 	Øœ×+Ò+¨BÑ/Ô/ˆIØÐ Ý!Ô4ÐNÐN°tÔ7MÐNÐN�	Ø&/�” Ñ#Øð	ð 	ð 	ð 	ñ 	ô 	ð 	ð 	ð 	ð 	ð 	ð 	ð 	ð 	ð 	ð 	ð 	ð 	ð 	ð 	ð 	ð 	ð 	ð 	øøøð 	ð 	ð 	ð 	ð 	ð 	s   �>A!Á!
A+Á.A+rD   ÚNonec              ƒ  ó†  K  — | j         4 ƒd {V —† | j        s	|| j        ur	 d d d ¦  «        ƒd {V —† d S t          j        di | j        ¤Ž| _        d d d ¦  «        ƒd {V —† n# 1 ƒd {V —†swxY w Y   	 |                     ¦   «         ƒ d {V —† d S # t          $ r&}t           	                    d|¦  «         Y d }~d S d }~ww xY w)Nz.[Telegram] Error closing primary transport: %sr&   )
r5   r6   r2   r0   r1   r/   ÚacloseÚ	ExceptionÚloggerÚdebug)r;   rD   Úexcs      r   Ú_reset_primaryz(TelegramFallbackTransport._reset_primaryZ   sè  è è € ð Ô%ð 	Oð 	Oð 	Oð 	Oð 	Oð 	Oð 	Oð 	OØÔ#ð  y¸¼Ð'EÐ'EØð	Oð 	Oð 	Oñ 	Oô 	Oð 	Oð 	Oð 	Oð 	Oð 	Oð 	Oð 	Oð 	Oð 	Oõ "Ô4ÐNÐN°tÔ7MÐNÐNˆDŒMð	Oð 	Oð 	Oñ 	Oô 	Oð 	Oð 	Oð 	Oð 	Oð 	Oð 	Oð 	Oð 	Oð 	Oð 	Oð 	Oð 	Oð 	Oð 	Oð 	Oð 	Oð 	Oð 	Oøøøð 	Oð 	Oð 	Oð 	Oð	PØ×"Ò"Ñ$Ô$Ð$Ð$Ð$Ð$Ð$Ð$Ð$Ð$Ð$øÝð 	Pð 	Pð 	PÝ�LŠLÐIÈ3ÑOÔOÐOÐOÐOÐOÐOÐOÐOøøøøð	Pøøøs.   �A"µA"Á"
A,Á/A,Á4B Â
C ÂB;Â;C c              ƒ  óH  K  — | j         4 ƒd{V —† | j                             |d¦  «        }ddd¦  «        ƒd{V —† n# 1 ƒd{V —†swxY w Y   |€dS 	 |                     ¦   «         ƒ d{V —† dS # t          $ r'}t
                               d||¦  «         Y d}~dS d}~ww xY w)a|  Discard a failed fallback pool so its dead sockets are released.

        A connect that reaches ESTABLISHED and is then closed by the peer leaves
        its socket in CLOSE_WAIT inside the pool. Retaining the poisoned pool
        leaks one descriptor per retry until the process hits its file limit and
        can no longer accept connections or resolve DNS (#63311).
        Nz2[Telegram] Error closing fallback transport %s: %s)r8   r7   ÚpoprH   rI   rJ   rK   )r;   r?   rD   rL   s       r   Ú_reset_fallbackz)TelegramFallbackTransport._reset_fallbackf   s_  è è € ð Ô&ð 	6ð 	6ð 	6ð 	6ð 	6ð 	6ð 	6ð 	6Øœ×+Ò+¨B°Ñ5Ô5ˆIð	6ð 	6ð 	6ñ 	6ô 	6ð 	6ð 	6ð 	6ð 	6ð 	6ð 	6ð 	6ð 	6ð 	6ð 	6ð 	6ð 	6ð 	6ð 	6ð 	6ð 	6ð 	6ð 	6øøøð 	6ð 	6ð 	6ð 	6àÐØˆFð	XØ×"Ò"Ñ$Ô$Ð$Ð$Ð$Ð$Ð$Ð$Ð$Ð$Ð$øÝð 	Xð 	Xð 	XÝ�LŠLÐMÈrÐSVÑWÔWÐWÐWÐWÐWÐWÐWÐWøøøøð	Xøøøs'   �>¾
AÁAÁA0 Á0
B!Á:BÂB!Úrequestúhttpx.Requestúhttpx.Responsec           	   ƒ  ó  K  — |j         j        t          k    s| j        s | j                             |¦  «        ƒ d {V —†S | j        }|r|gnd g}|r|                     d ¦  «         | j        D ]}||k    r|                     |¦  «         Œd }|D �]è}|€|nt          ||¦  «        }|€| j        n|  	                    |¦  «        ƒ d {V —†}	 |                     |¦  «        ƒ d {V —†}|�i| j        |k    r^| j
        4 ƒd {V —† | j        |k    r"|| _        t                               d|¦  «         d d d ¦  «        ƒd {V —† n# 1 ƒd {V —†swxY w Y   |c S # t          $ �r}	|	}t          |	¦  «        s‚ |�i|| j        k    r^| j
        4 ƒd {V —† | j        |k    r"d | _        t                               d|¦  «         d d d ¦  «        ƒd {V —† n# 1 ƒd {V —†swxY w Y   |€U|                      |¦  «        ƒ d {V —† t                               d|	d                     | j        ¦  «        ¦  «         Y d }	~	�Œ¥t                               d||	¦  «         |                      |¦  «        ƒ d {V —† Y d }	~	�Œâd }	~	ww xY w|€t%          d¦  «        ‚|‚)NzQ[Telegram] Primary api.telegram.org path unreachable; using sticky fallback IP %szF[Telegram] Sticky fallback IP %s failed; resetting to primary DNS pathzR[Telegram] Primary api.telegram.org connection failed (%s); trying fallback IPs %sú, z$[Telegram] Fallback IP %s failed: %sz=All Telegram fallback IPs exhausted but no error was recorded)r	   Úhostr,   r+   r2   Úhandle_async_requestr9   ÚappendÚ_rewrite_request_for_iprE   r:   rJ   ÚwarningrI   Ú_is_retryable_connect_errorrM   ÚjoinrP   ÚRuntimeError)
r;   rQ   Ú	sticky_ipÚattempt_orderr?   Ú
last_errorÚ	candidaterD   ÚresponserL   s
             r   rW   z.TelegramFallbackTransport.handle_async_requestw   s4  è è € ØŒ;ÔÕ1Ò1Ð1¸Ô9KÐ1Øœ×;Ò;¸GÑDÔDÐDÐDÐDÐDÐDÐDÐDà”Oˆ	Ø<EÐ-Q¨i¨[¨[ÈDÈ6ˆØð 	'Ø× Ò  Ñ&Ô&Ð&ØÔ$ð 	)ð 	)ˆBØ�YŠˆØ×$Ò$ RÑ(Ô(Ð(øà'+ˆ
Øð $	ñ $	ˆBØ#% :˜˜Õ3JÈ7ÐTVÑ3WÔ3WˆIØ)+¨˜œ˜¸t×?QÒ?QÐRTÑ?UÔ?UÐ9UÐ9UÐ9UÐ9UÐ9UÐ9UˆIð!Ø!*×!?Ò!?À	Ñ!JÔ!JÐJÐJÐJÐJÐJÐJ�Ø�> d¤o¸Ò&;Ð&;Ø#Ô0ð ð ð ð ð ð ð ð Øœ?¨bÒ0Ð0Ø.0˜DœOÝ"ŸNšNØ sØ "ñô ð ðð ð ñ ô ð ð ð ð ð ð ð ð ð ð ð ð ð ð ð ð ð ð øøøð ð ð ð ð  ���øÝð ñ ð Ø �
Ý2°3Ñ7Ô7ð ØØ�> b¨D¬OÒ&;Ð&;Ø#Ô0ð ð ð ð ð ð ð ð Øœ?¨bÒ0Ð0Ø.2˜DœOÝ"ŸNšNØ hØ "ñô ð ðð ð ñ ô ð ð ð ð ð ð ð ð ð ð ð ð ð ð ð ð ð ð øøøð ð ð ð ð �:Ø×-Ò-¨iÑ8Ô8Ð8Ð8Ð8Ð8Ð8Ð8Ð8Ý—N’NØlØØŸ	š	 $Ô"4Ñ5Ô5ñô ð ð
 �H�H�H‘HÝ—’ÐEÀrÈ3ÑOÔOÐOØ×*Ò*¨2Ñ.Ô.Ð.Ð.Ð.Ð.Ð.Ð.Ð.Ø���‘øøøøð-øøøð0 ÐÝÐ^Ñ_Ô_Ð_ØÐsg   Ã
5EÃ?.D?Ä-EÄ?
E		Å	EÅE		ÅEÅI5Å,I0Æ.GÆ9I0Ç
GÇI0ÇGÇAI0È37I0É0I5c              ƒ  óÚ  K  — | j         4 ƒd {V —† d| _        | j        }d d d ¦  «        ƒd {V —† n# 1 ƒd {V —†swxY w Y   |                     ¦   «         ƒ d {V —† | j        4 ƒd {V —† t          | j                             ¦   «         ¦  «        }| j                             ¦   «          d d d ¦  «        ƒd {V —† n# 1 ƒd {V —†swxY w Y   |D ]}|                     ¦   «         ƒ d {V —† Œd S )NT)	r5   r6   r2   rH   r8   r'   r7   ÚvaluesÚclear)r;   ÚprimaryÚ
transportsrD   s       r   rH   z TelegramFallbackTransport.aclose®   s  è è € ØÔ%ð 	$ð 	$ð 	$ð 	$ð 	$ð 	$ð 	$ð 	$Ø#'ˆDÔ Ø”mˆGð	$ð 	$ð 	$ñ 	$ô 	$ð 	$ð 	$ð 	$ð 	$ð 	$ð 	$ð 	$ð 	$ð 	$ð 	$ð 	$ð 	$ð 	$ð 	$ð 	$ð 	$ð 	$ð 	$øøøð 	$ð 	$ð 	$ð 	$ð �nŠnÑÔÐÐÐÐÐÐÐØÔ&ð 	$ð 	$ð 	$ð 	$ð 	$ð 	$ð 	$ð 	$Ý˜dœo×4Ò4Ñ6Ô6Ñ7Ô7ˆJØŒO×!Ò!Ñ#Ô#Ð#ð	$ð 	$ð 	$ñ 	$ô 	$ð 	$ð 	$ð 	$ð 	$ð 	$ð 	$ð 	$ð 	$ð 	$ð 	$ð 	$ð 	$ð 	$ð 	$ð 	$ð 	$ð 	$ð 	$øøøð 	$ð 	$ð 	$ð 	$ð $ð 	%ð 	%ˆIØ×"Ò"Ñ$Ô$Ð$Ð$Ð$Ð$Ð$Ð$Ð$Ð$ð	%ð 	%s   �1±
;¾;Á)A B;Â;
CÃCN)r!   r"   )r?   r@   r   rA   )rD   rA   r   rF   )r?   r@   r   rF   )rQ   rR   r   rS   )r   rF   )Ú__name__Ú
__module__Ú__qualname__Ú__doc__r0   ÚLimitsr.   r>   rE   rM   rP   rW   rH   r&   r   r   r   r   4   s·   € € € € € ðð ð  �5”<°ÈQÐOÑOÔO€Lð+ð +ð +ð +ð ð ð ð ð
Pð 
Pð 
Pð 
PðXð Xð Xð Xð"5ð 5ð 5ð 5ðn	%ð 	%ð 	%ð 	%ð 	%ð 	%r   r   rd   r"   c                óà  — g }| D ]è}t          |¦  «                             ¦   «         }|sŒ&	 t          j        |¦  «        }n+# t          $ r t
                               d|¦  «         Y Œcw xY w|j        dk    rt
                               d|¦  «         ŒŽ|j        s|j	        s|j
        s|j        rt
                               d|¦  «         ŒÆ|                     t          |¦  «        ¦  «         Œé|S )Nz)Ignoring invalid Telegram fallback IP: %rr   z*Ignoring non-IPv4 Telegram fallback IP: %sz2Ignoring private/internal Telegram fallback IP: %s)r@   ÚstripÚ	ipaddressÚ
ip_addressÚ
ValueErrorrJ   rZ   ÚversionÚ
is_privateÚis_loopbackÚis_link_localÚis_unspecifiedrX   )rd   Ú
normalizedÚvalueÚrawÚaddrs        r   r*   r*   º   s  € Ø€JØð %ð %ˆÝ�%‰jŒj×ÒÑ Ô ˆØð 	Øð	ÝÔ'¨Ñ,Ô,ˆDˆDøÝð 	ð 	ð 	Ý�NŠNÐFÈÑLÔLÐLØˆHð	øøøð Œ<˜1ÒÐÝ�NŠNÐGÈÑMÔMÐMØØŒ?ð 	˜dÔ.ð 	°$Ô2Dð 	ÈÔH[ð 	Ý�NŠNÐOÐQTÑUÔUÐUØØ×Ò�#˜d™)œ)Ñ$Ô$Ð$Ð$ØÐs   ¬AÁ%A)Á(A)rx   c                óf   — | sg S d„ |                       d¦  «        D ¦   «         }t          |¦  «        S )Nc                ó6   — g | ]}|                      ¦   «         ‘ŒS r&   )rn   )Ú.0Úparts     r   ú
<listcomp>z)parse_fallback_ip_env.<locals>.<listcomp>Ò   s    € Ð7Ð7Ð7˜dˆT�ZŠZ‰\Œ\Ð7Ð7Ð7r   Ú,)Úsplitr*   )rx   Úpartss     r   Úparse_fallback_ip_envrƒ   Ï   s<   € Øð Øˆ	Ø7Ð7 e§k¢k°#Ñ&6Ô&6Ð7Ñ7Ô7€EÝ" 5Ñ)Ô)Ð)r   úset[str]c                 ó¢   — 	 t          j        t          dt           j        ¦  «        } d„ | D ¦   «         S # t          $ r t          ¦   «         cY S w xY w)zJReturn the IPv4 addresses that the OS resolver gives for api.telegram.org.i»  c                ó*   — h | ]}|d          d         ’ŒS )r   r   r&   )r}   rz   s     r   ú	<setcomp>z&_resolve_system_dns.<locals>.<setcomp>Ú   s    € Ð/Ð/Ð/˜t��Q”˜”
Ð/Ð/Ð/r   )ÚsocketÚgetaddrinfor,   ÚAF_INETrI   Úset)Úresultss    r   Ú_resolve_system_dnsr�   Ö   sZ   € ðÝÔ$Õ%7¸½f¼nÑMÔMˆØ/Ð/ wÐ/Ñ/Ô/Ð/øÝð ð ð Ý‰uŒuˆˆˆðøøøs   ‚03 ³AÁAÚclientúhttpx.AsyncClientÚproviderr(   c              ƒ  ó`  K  — 	 |                       |d         |d         |d         ¬¦  «        ƒ d{V —†}|                     ¦   «          |                     ¦   «         }g }|                      dg ¦  «        D ]~}|                      d¦  «        dk    rŒ|                      d	d
¦  «                             ¦   «         }	 t	          j        |¦  «         |                     |¦  «         Œo# t          $ r Y Œ{w xY w|S # t          $ r.}t           
                    d|d         |¦  «         g cY d}~S d}~ww xY w)z/Query one DoH provider and return A-record IPs.r	   r
   r   )r
   r   NÚAnswerr   é   ÚdataÚ zDoH query to %s failed: %s)rC   Úraise_for_statusÚjsonrn   ro   rp   rX   rq   rI   rJ   rK   )rŽ   r�   Úrespr”   ÚipsÚanswerry   rL   s           r   Ú_query_doh_providerr›   ß   sg  è è € ðØ—Z’ZØ�UŒO H¨XÔ$6ÀÈÔ@Sð  ñ 
ô 
ð 
ð 
ð 
ð 
ð 
ð 
ˆð 	×ÒÑÔÐØ�yŠy‰{Œ{ˆØˆØ—h’h˜x¨Ñ,Ô,ð 	ð 	ˆFØ�zŠz˜&Ñ!Ô! QÒ&Ð&ØØ—*’*˜V RÑ(Ô(×.Ò.Ñ0Ô0ˆCðÝÔ$ SÑ)Ô)Ð)Ø—
’
˜3‘”��øÝð ð ð Ø�ðøøøàˆ
øÝð ð ð Ý�ŠÐ1°8¸E´?ÀCÑHÔHÐHØˆ	ˆ	ˆ	ˆ	ˆ	ˆ	øøøøðøøøsB   „B4C5 Â9)C#Ã"C5 Ã#
C0Ã-C5 Ã/C0Ã0C5 Ã5
D-Ã?#D(Ä"D-Ä(D-c               ƒ  ór  ‡K  — t          j        t          j        t          ¦  «        ¬¦  «        4 ƒd{V —†Šˆfd„t          D ¦   «         } t          j        t          j        t          ¦  «        ¦  «        }t          j	        | ddiŽƒ d{V —†}ddd¦  «        ƒd{V —† n# 1 ƒd{V —†swxY w Y   t          ¦   «         }	 t          j        |t          ¬¦  «        ƒ d{V —†}t          |t          ¦  «        r|}n0# t          $ r# t                               dt           ¦  «         Y nw xY wg }|D ],}t          |t"          ¦  «        r|                     |¦  «         Œ-t          ¦   «         }g }|D ]0}	|	|vr*|                     |	¦  «         |                     |	¦  «         Œ1t+          |¦  «        }
|
r0t                               dd                     |
¦  «        ¦  «         |
S t                               d	d                     |¦  «        pd
d                     t0          ¦  «        ¦  «         t#          t0          ¦  «        S )a-  Auto-discover Telegram API IPs via DNS-over-HTTPS.

    Resolves api.telegram.org through Google and Cloudflare DoH and returns all
    unique A records.  IPs that match the local system resolver are kept rather
    than excluded: in many networks the system-DNS IP is the most reliable path
    to api.telegram.org and a transient primary-path failure should be retried
    against the same address via the IP-rewrite path before the seed list is
    consulted (#14520).  Falls back to a hardcoded seed list only when DoH
    yields no usable answers.
    )ÚtimeoutNc                ó0   •— g | ]}t          ‰|¦  «        ‘ŒS r&   )r›   )r}   ÚprŽ   s     €r   r   z)discover_fallback_ips.<locals>.<listcomp>  s$   ø€ ÐLÐLÐL¸Õ(¨°Ñ3Ô3ÐLÐLÐLr   Úreturn_exceptionsTz5System-DNS resolution for %s did not complete in timez,Discovered Telegram fallback IPs via DoH: %srU   zPDoH discovery yielded no usable IPs (system DNS: %s); using seed fallback IPs %sÚunknown)r0   ÚAsyncClientÚTimeoutÚ_DOH_TIMEOUTr   r3   Úensure_futureÚ	to_threadr�   Úgatherr‹   Úwait_forÚ
isinstancerI   rJ   rK   r,   r'   ÚextendÚaddrX   r*   r\   Úinfor   )Ú	doh_tasksÚsystem_dns_taskrŒ   Ú
system_ipsÚsystem_resultÚdoh_ipsÚrÚseenÚ
candidatesr?   Ú	validatedrŽ   s              @r   Údiscover_fallback_ipsr¶   ù   sî  øè è € õ Ô ­¬µ|Ñ)DÔ)DÐEÑEÔEð Kð Kð Kð Kð Kð Kð KÈØLÐLÐLÐL½^ÐLÑLÔLˆ	Ý!Ô/µÔ0AÕBUÑ0VÔ0VÑWÔWˆÝœ¨	ÐJÀTÐJÐJÐJÐJÐJÐJÐJÐJˆðKð Kð Kñ Kô Kð Kð Kð Kð Kð Kð Kð Kð Kð Kð Kð Kð Kð Kð Kð Kð Kð Kð Køøøð Kð Kð Kð Kõ ™5œ5€JðbÝ%Ô.¨ÍÐUÑUÔUÐUÐUÐUÐUÐUÐUˆÝ�m¥SÑ)Ô)ð 	'Ø&ˆJøøÝð bð bð bÝ�ŠÐLÕN`ÑaÔaÐaÐaÐaðbøøøð €GØð ð ˆÝ�a�ÑÔð 	Ø�NŠN˜1ÑÔÐøõ ‘U”U€DØ€JØð "ð "ˆØ�Tˆ>ˆ>Ø�HŠH�R‰LŒLˆLØ×Ò˜bÑ!Ô!Ð!øõ (¨
Ñ3Ô3€Iàð Ý�ŠÐCÀTÇYÂYÈyÑEYÔEYÑZÔZÐZØÐå
‡K‚KØZØ�	Š	�*ÑÔÐ* Ø�	Š	Õ$Ñ%Ô%ñô ð õ
 Õ"Ñ#Ô#Ð#s$   ¶ABÂ
B(Â+B(Â>8C7 Ã7*D$Ä#D$rQ   rR   r?   r@   c                ó  — | j         j        pt          }| j                              |¬¦  «        }| j                             ¦   «         }||d<   t          | j        ¦  «        }||d<   t          j	        | j
        ||| j        |¬¦  «        S )N)rV   rV   Úsni_hostname)Úmethodr	   r   ÚstreamÚ
extensions)r	   rV   r,   Ú	copy_withr   Úcopyr(   r»   r0   ÚRequestr¹   rº   )rQ   r?   Úoriginal_hostr	   r   r»   s         r   rY   rY   2  sŒ   € Ø”KÔ$Ð:Õ(:€MØ
Œ+×
Ò
 RÐ
Ñ
(Ô
(€CØŒo×"Ò"Ñ$Ô$€GØ#€GˆF�OÝ�gÔ(Ñ)Ô)€JØ!.€Jˆ~ÑÝŒ=ØŒ~ØØØŒ~Øðñ ô ð r   rL   rI   Úboolc                óN   — t          | t          j        t          j        f¦  «        S ©N)r©   r0   ÚConnectTimeoutÚConnectError)rL   s    r   r[   r[   B  s   € Ý�c�EÔ0µ%Ô2DÐEÑFÔFÐFr   rÂ   )r   r   )rd   r"   r   r   )rx   r   r   r   )r   r„   )rŽ   r�   r�   r(   r   r   )r   r   )rQ   rR   r?   r@   r   rR   )rL   rI   r   rÀ   )rk   Ú
__future__r   r3   ro   Úloggingrˆ   Útypingr   r   r0   Ú	getLoggerrh   rJ   r,   r¤   r   Ú__annotations__r   r   ÚAsyncBaseTransportr   r*   rƒ   r�   r›   r¶   rY   r[   r&   r   r   ú<module>rË      sõ  ððð ð ð #Ð "Ð "Ð "Ð "Ð "à €€€Ø Ð Ð Ð Ø €€€Ø €€€Ø %Ð %Ð %Ð %Ð %Ð %Ð %Ð %à €€€à	ˆÔ	˜8Ñ	$Ô	$€à'Ð ð €ð ,Ø-°sÐ;Ð;Øðð ð 6Ø-°sÐ;Ð;ØÐ4Ð5ðð ð€ð ð ð ñ ð "3Ð4EÐ FÐ Ð FÐ FÐ FÑ FðJð Jð Jð Jð JðC%ð C%ð C%ð C%ð C% Ô 8ñ C%ô C%ð C%ðLð ð ð ð**ð *ð *ð *ðð ð ð ðð ð ð ð46$ð 6$ð 6$ð 6$ðrð ð ð ð Gð Gð Gð Gð Gð Gr   