
    vKg              	          S SK r S SKrS SKrS SKrS SKrS SKJr  S SKJr  S SK	J
r
JrJr  S SKJr  S SKJr  S SKJr  S SKJrJrJrJrJrJrJrJrJrJrJr  S S	KJ r J!r!J"r"J#r#J$r$J%r%J&r&  S S
K'J(r(  SSK)J*r*J+r+J,r,J-r-J.r.J/r/J0r0  SSK1J2r2J3r3  SSK4J5r5J6r6J7r7  SSK8J9r9J:r:J;r;J<r<  SSK=J>r>J?r?  SSK@JArA  SSK@JBrBJCrCJDrDJErEJFrFJGrGJHrHJIrI  SSKJJKrKJLrL  SSKMJNrNJOrOJPrPJQrQJRrR  \" \S5         S SKTrTSSS5        \" \S5         S SKUrVSSS5        \(       a   " S S\SS9rW " S S\SS9rXO	\\Y\Y4   rW\rX\S   rZ\S   r[S\YS\\4S  jr]\^" S!5      r_S4S\YS"\Y4S# jjr`S\YS$\\\\4   S\Y4S% jraS5S&\\Y   S'\YS(\YS)\\4S* jjrbS6S+\R                  4S, jjrdS6S+\ R                  4S- jjre\f" 5       rg " S. S/5      rh " S0 S1\h5      ri " S2 S3\h5      rjg! , (       d  f       N= f! , (       d  f       N= f)7    N)Counter)ThreadPoolExecutor)asynccontextmanagercontextmanagersuppress)partialmethod)BytesIO)dumps)TYPE_CHECKINGAnyCallableDictListLiteralOptionalTuple	TypedDictUnioncast)ParseResult	parse_qslquoteunquote	urlencodeurljoinurlparse)Unpack   )	AsyncCurlCurl	CurlErrorCurlHttpVersionCurlInfoCurlOptCurlSslVersion)CURL_WRITEFUNC_ERRORCurlMime   )CookiesCookieTypes
CurlMorsel)ImpersonateErrorRequestExceptionSessionClosed
code2error)HeadersHeaderTypes)BrowserType)TLS_CIPHER_NAME_MAPTLS_EC_CURVES_MAPTLS_VERSION_MAPBrowserTypeLiteralExtraFingerprintsExtraFpDictnormalize_browser_typetoggle_extension)RequestResponse)
ON_CLOSE_T
ON_ERROR_TON_MESSAGE_T	ON_OPEN_T	WebSocketc                   H    \ rS rSr% \\S'   \\S'   \\S'   \\S'   \\S'   Srg)		ProxySpec8   allhttphttpswswss N)__name__
__module____qualname____firstlineno__str__annotations____static_attributes__rJ       Z/var/www/highfloat_scraper/venv/lib/python3.13/site-packages/curl_cffi/requests/session.pyrC   rC   8   s    	
rR   rC   F)totalc                      \ rS rSr% \\   \S'   \\   \S'   \\\	\	4      \S'   \\
   \S'   \\	   \S'   \\\	\	4      \S'   \\	   \S'   \\   \S	'   \\S
'   \\\\\4   4   \S'   \\S'   \\S'   \\S'   \\   \S'   \\	   \S'   \\	   \S'   \\\\4      \S'   \\S'   \\	\\/\	4   4   \S'   \\   \S'   \\   \S'   \\   \S'   \\S'   \\	   \S'   \\\	\\	\	4   4      \S'   Srg)BaseSessionParams?   headerscookiesauthproxiesproxy
proxy_authbase_urlparamsverifytimeout	trust_envallow_redirectsmax_redirectsimpersonateja3akamaiextra_fpdefault_headersdefault_encodingcurl_options
curl_infoshttp_versiondebug	interfacecertrJ   N)rK   rL   rM   rN   r   r1   rP   r*   r   rO   rC   dictboolr   floatintr6   r7   r8   r   byteslistr"   rQ   rJ   rR   rS   rV   rV   ?   s8   +&&+&&uS#X'')$$}U38_--3-ueE5L1122011c]5!2K!?@AAXugsl%; ;<<tn$TN"//C= uS%S/1233rR   rV   )eventletgevent)GETPOSTPUTDELETEOPTIONSHEADTRACEPATCHurlreturnc                 h    [        U 5      n[        UR                  =(       a    UR                  5      $ )z,Check if the provided url is an absolute url)r   rr   schemehostname)r   
parsed_urls     rS   _is_absolute_urlr   b   s'    #J
!!9j&9&9::rR   z!#$%&'()*+,/:;=?@[]~	quote_strc           	      J   SR                  [        [        U5      -
  5      n[        U 5      n[	        UR
                  5      n[        USUS9n[        UR                  UR                  [        UR                  US9UR                  UUR                  5      R                  5       $ )N T)doseqsafe)r   )join
SAFE_CHARSsetr   r   queryr   r   r   netlocr   pathr_   fragmentgeturl)r   r   r   r   parsed_get_argsencoded_get_argss         rS   _quote_path_and_paramsr   k   s    77:I./D#J
 0 01O 4HjooD) fhrR   r_   c                    [        U 5      n [        U 5      n[        UR                  5      n[	        S U 5       5      n[        U[        5      (       a  [        UR                  5       5      n[	        S U 5       5      nU H  u  pg[        U[        [        45      (       a  [        U5      nUR                  U5      S:X  a3  UR                  U5      S:X  a  U Vs/ sH  oS   U:w  a  UOXg4PM     nnMs  UR                  Xg45        M     [        USS9n	[        UR                  UR                   UR"                  UR$                  U	UR&                  5      R)                  5       n
U
$ s  snf )a  Add URL query params to provided URL being aware of existing.

Parameters:
    url: string of target URL
    params: dict containing requested params to be added

Returns:
    string with updated URL

>> url = 'http://stackoverflow.com/test?answers=true'
>> new_params = {'answers': False, 'data': ['some','values']}
>> _update_url_params(url, new_params)
'http://stackoverflow.com/test?data=some&data=values&answers=false'
c              3   (   #    U H	  oS    v   M     g7fr   NrJ   .0xs     rS   	<genexpr>%_update_url_params.<locals>.<genexpr>   s     =_t_   c              3   (   #    U H	  oS    v   M     g7fr   rJ   r   s     rS   r   r      s     4VtVr   r(   r   T)r   )r   r   r   r   r   
isinstancerq   rv   itemsrr   r
   getappendr   r   r   r   r   r_   r   r   )r   r_   r   r   old_args_counternew_args_counterkeyvaluer   r   new_urls              rS   _update_url_paramsr   z   sN     #,C#J  
 0 01O =_==&$flln%4V44
 edD\**%LE$).>.B.B3.G1.LM\]_qTS[sl B_O]O""C<0  !=  fh  N% ^s   E%header_linesr   r   replacec                     Sn[        U 5       HN  u  pVUR                  5       R                  UR                  5       S-   5      (       d  M<  SnU(       a	  U SU 3X'     O   U(       d  U R                  U SU 35        gg)z*Update header line list by key value pair.F:T: N)	enumeratelower
startswithr   )r   r   r   r   foundidxlines          rS   _update_header_liner      s{    E|,	::<""399;#455E'*e2eW$5! - se2eW-. rR   qc                 F     U R                   S   $ ! [         a    Us $ f = fNr   )queue
IndexErrorr   defaults     rS   _peek_queuer      s)    wwqz       c                 F     U R                   S   $ ! [         a    Us $ f = fr   )_queuer   r   s     rS   _peek_aio_queuer      s)    xx{ r   c            C          \ rS rSrSrSSSSSSSSSSSSSSSSSSSSSSSSSS.S	\\   S
\\   S\\\	\	4      S\\
   S\\	   S\\\	\	4      S\\	   S\\   S\S\\\\\4   4   S\S\S\S\\   S\\	   S\\	   S\\\\4      S\S\\	\\/\	4   4   S\\   S\\   S\\   S\S \\	   S!\\\	\\	\	4   4      42S" jjrS# rS>S\	S$\4S% jjrS\	4S& jrS'\4S( jrSSSSSSS\SSSSSSSS)SSSSSSS*SSSSS+SSS4S,\S-\	S\\\\\4      S.\\\\	\	4   \\   \	\ \4      S/\\   S	\\   S
\\   S0\\   S\\\	\	4      S\\\\\\4   \!4      S\\   S\\   S\\
   S\\	   S\\\	\	4      S\\\\	4      S1\\	   S2\\	   S3\\   S\\   S\\	   S\\	   S\\\\4      S\\   S4\\	\"S   4   S\\   S \\	   S!\\\	\\	\	4   4      S5\S6\S7\\#   S8\$S9\$4BS: jjr%S; r&S< r'S=r(g)?BaseSession   zMProvide common methods for setting curl options and reading info in sessions.NT   utf-8F)rX   rY   rZ   r[   r\   r]   r^   r_   r`   ra   rb   rc   rd   re   rf   rg   rh   ri   rj   rk   rl   rm   rn   ro   rp   rX   rY   rZ   r[   r\   r]   r^   r_   r`   ra   rb   rc   rd   re   rf   rg   rh   ri   rj   rk   rl   rm   rn   ro   rp   c                Z   [        U5      U l        [        U5      U l        X0l        Xpl        Xl        Xl        Xl        Xl	        Xl
        Xl        Xl        Xl        UU l        UU l        UU l        UU l        U=(       d    0 U l        U=(       d    / U l        UU l        UU l        UU l        UU l        U(       a  U(       a  [1        S5      eU(       a  SU0nU=(       d    0 U l        X`l        U R
                  (       a%  [7        U R
                  5      (       d  [9        S5      eSU l        g )N)Cannot specify both 'proxy' and 'proxies'rE   z2You need to provide an absolute url for 'base_url'F)r0   rX   r)   rY   rZ   r^   r_   r`   ra   rb   rc   rd   re   rf   rg   rh   ri   rj   rk   rl   rm   rn   ro   rp   	TypeErrorr[   r]   r   
ValueError_closed)selfrX   rY   rZ   r[   r\   r]   r^   r_   r`   ra   rb   rc   rd   re   rf   rg   rh   ri   rj   rk   rl   rm   rn   ro   rp   s                             rS   __init__BaseSession.__init__   s    : w'w'	 ".*& . 0(.B$*(
"	WGHHenG")-R$==!1$--!@!@QRRrR   c                 h    1 SknX#-
  nU H  n[        XSS9  M     X2-
  nU H  n[        XSS9  M     g )N>   r     
               #   +   -   3   T)enableF)r:   )r   curlextension_idsdefault_enabledto_enable_idsext_idto_disable_idss          rS   _toggle_extensions_by_ids%BaseSession._toggle_extensions_by_ids  sA    H%7#FT$7 $
 )8$FT%8 %rR   permutec                    UR                  S5      u  pEpgn[        [        U5         n	UR                  [        R
                  U	[        R                  -  5        U	[        R                  :X  d   S5       e/ n
UR                  S5       H(  n[        U5      n[        U   nU
R                  U5        M*     UR                  [        R                  SR                  U
5      5        UR                  S5      (       a  USS n[        R                  " SS	S
9  [!        S UR                  S5       5       5      nU R#                  X5        U(       d   UR                  [        R$                  U5        / nUR                  S5       H(  n[        U5      n[&        U   nUR                  U5        M*     UR                  [        R(                  SR                  U5      5        [        U5      S:X  d   S5       eg)zm
Detailed explanation: https://engineering.salesforce.com/tls-fingerprinting-with-ja3-and-ja3s-247362855967/
,zOnly TLS v1.2 works for now.-r   z-21NzPadding(21) extension found in ja3 string, whether to add it should be managed by the SSL engine. The TLS client hello packet may contain or not contain this extension, any of which should be correct.r(   
stacklevelc              3   6   #    U H  n[        U5      v   M     g 7fN)rt   )r   es     rS   r   /BaseSession._set_ja3_options.<locals>.<genexpr>=  s     B,AqCFF,As   r   z%Only curve_formats == 0 is supported.)splitr5   rt   setoptr$   
SSLVERSIONr%   MAX_DEFAULTTLSv1_2r3   r   SSL_CIPHER_LISTr   endswithwarningswarnr   r   TLS_EXTENSION_ORDERr4   SSL_EC_CURVES)r   r   rf   r   tls_versionciphers
extensionscurvescurve_formatscurl_tls_versioncipher_namescipher	cipher_idcipher_namer   curve_namescurvecurve_id
curve_names                      rS   _set_ja3_optionsBaseSession._set_ja3_options#  s    CF))C.?j-*3{+;<G&&(8>;U;U(UV>#9#99Y;YY9mmC(FFI-i8K, )
 	G++SXXl-CDu%%#CRJMMQ 	 BJ,<,<S,ABB&&t;KK33Z@\\#&E5zH*84Jz* '
 	G))388K+@A=!Q&O(OO&rR   c                    UR                  S5      u  p4pVUR                  SS5      nUR                  [        R                  [
        R                  5        UR                  [        R                  U5        UR                  [        R                  [        U5      5        US:w  a   UR                  [        R                  U5        UR                  [        R                  UR                  SS5      5        g)z
Detailed explanation: https://www.blackhat.com/docs/eu-17/materials/eu-17-Shuster-Passive-Fingerprinting-Of-HTTP2-Clients-wp.pdf
|r   ;0r   N)r   r   r   r$   HTTP_VERSIONr"   V2_0HTTP2_SETTINGSHTTP2_WINDOW_UPDATErt   HTTP2_STREAMSHTTP2_PSEUDO_HEADERS_ORDER)r   r   rg   settingswindow_updatestreamsheader_orders          rS   _set_akamai_optionsBaseSession._set_akamai_optionsM  s     :@c9J6 ##C-G((/*>*>?G**H5G//]1CDc>KK--w7 	G668L8LSRT8UVrR   fpc                    UR                   (       a9  UR                  [        R                  SR	                  UR                   5      5        UR                  [        R
                  UR                  [        R                  -  5        UR                  [        R                  [        UR                  5      5        UR                  [        R                  [        UR                  5      5        UR                  [        R                  UR                  5        UR                  [        R                   UR"                  5        UR                  [        R$                  UR&                  5        g )Nr   )tls_signature_algorithmsr   r$   SSL_SIG_HASH_ALGSr   r   tls_min_versionr%   r   
TLS_GREASErt   
tls_greaseSSL_PERMUTE_EXTENSIONStls_permute_extensionsSSL_CERT_COMPRESSIONtls_cert_compressionSTREAM_WEIGHThttp2_stream_weightSTREAM_EXCLUSIVEhttp2_stream_exclusive)r   r   r  s      rS   _set_extra_fpBaseSession._set_extra_fpb  s    &&KK11388B<W<W3XYG&&(:(:^=W=W(WXG&&BMM(:;G22C8Q8Q4RSG00"2I2IJG))2+A+ABG,,b.G.GHrR   zgzip, deflate, br, zstdr   r   methodr   datajsonfilesrefereraccept_encodingcontent_callbackr   streammax_recv_speed	multipartqueue_classevent_classc#           
        ^:^;^< Un#UR                  5       nUS:X  a!  U#R                  [        R                  S5        O4US:w  a.  U#R                  [        R                  UR                  5       5        US:X  a   U#R                  [        R                  S5        U R                  (       a  [        X0R                  5      nU(       a  [        X45      nU R                  (       a  [        U R                  U5      nUSLa
  [        UUS9nU#R                  [        R                  UR                  5       5        [        U[        [        [         45      (       a  [#        U5      R                  5       n$Ou[        U[$        5      (       a  UR                  5       n$OO[        U[&        5      (       a  UR)                  5       n$O)[        U[*        5      (       a  Un$OUc  Sn$O[-        S5      eUb  [/        US	S
9R                  5       n$U$(       d  US;   ao  U#R                  [        R0                  U$5        U#R                  [        R2                  [5        U$5      5        US:X  a   U#R                  [        R                  U5        [7        U R8                  5      n%U%R;                  U5        U%R=                  S5      n&U&b=  [?        U5      n'U&U'R@                  :X  d  U&U'RB                  :X  a  U%RE                  SS 5        / n(U%RG                  5        H(  u  n)n*U(RI                  U*(       a  U) SU* 3OU) S35        M*     Ub  [K        U(SSSS9  [        U[        5      (       a  US:w  a  [K        U(SS5        [        U[$        [*        45      (       a  [K        U(SS5        [K        U(SSSS9  U#R                  [        RL                  U( V%s/ sH  n%U%R                  5       PM     sn%5        [O        UW%U5      n+U#R                  [        RP                  S5        U#R                  [        RR                  S5        U RT                  RW                  U+5       H1  n,UR                  [        RR                  U,RY                  5       5        M3     U(       aQ  [[        U5      n-U-RW                  U+5       H1  n,UR                  [        RR                  U,RY                  5       5        M3     U	(       a  []        S5      eU (       a  [_        [        U=(       d    0 5      Ra                  5        H;  u  n)n*U Rc                  U)[        U*[$        5      (       a  U*R                  5       OU*S9  M=     U#R                  [        Rd                  U Rf                  5        U Rh                  (       d  U
(       a  U Rh                  (       a  U Rh                  u  n.n/U
(       a  U
u  n.n/U#R                  [        Rj                  W.R                  5       5        U#R                  [        Rl                  W/R                  5       5        U[n        L a  U Rp                  nUc  Sn[        U[         5      (       a  Uu  n0n1U0U1-   n2U#R                  [        Rr                  [u        U0S-  5      5        U(       d.  U#R                  [        Rv                  [u        U2S-  5      5        GO$U#R                  [        Rx                  S5        U#R                  [        Rz                  [|        R~                  " U25      5        O[        U[t        [        45      (       a  U(       d-  U#R                  [        Rv                  [u        US-  5      5        OU#R                  [        Rr                  [u        US-  5      5        U#R                  [        Rx                  S5        U#R                  [        Rz                  [|        R~                  " U5      5        U#R                  [        R                  [u        Uc  U R                  OU5      5        U#R                  [        R                  Uc  U R                  OU5        U(       a  U(       a  [-        S5      eU(       a  SU0nUc  U R                  nU(       Ga  [?        U5      n3[_        [        [$           UR=                  U3R                  UR=                  S5      5      5      nU3RB                  (       ae  [_        [        [$           UR=                  U3R                   SU3RB                   3UR=                  SU3RB                   35      5      5      =(       d    UnUGb  U#R                  [        R                  U5        U3R                  S :X  af  UR                  S!5      (       a  [        R                  " S"[        S#S$9  UR                  S%5      (       d   U#R                  [        R                  S5        U=(       d    U R                  nU(       aa  Uu  n.n/U#R                  [        R                  U.R                  5       5        U#R                  [        R                  U/R                  5       5        USL d  U R                  (       dC  Uc@  U#R                  [        R                  S5        U#R                  [        R                  S5        [        U[$        5      (       a   U#R                  [        R                  U5        US&;   aI  [        U R                  [$        5      (       a*  U#R                  [        R                  U R                  5        U(       a.  U#R                  [        R                  UR                  5       5        Ub.  U#R                  [        R                  UR                  5       5        U=(       d    U R                  nU(       a{  [        U[$        5      (       a!  U#R                  [        R                  U5        OEUu  nn4U#R                  [        R                  U5        U#R                  [        R                  U45        U=(       d    U R                  nUc  U R                  OUnU(       a0  [        U5      nU#R                  UUS'9n5U5S:w  a  [        S(U S)35      eU=(       d    U R                  nU(       a  U(       a  [        R                  " S*SS$9  Sn6[        U[        5      (       a  UR                  (       a  Sn6[        U[        5      (       a  UR=                  S+5      (       a  Sn6U R                  U#UU6S,9  U=(       d    U R                  nU(       a.  U(       a  [        R                  " S-SS$9  U R                  U#U5        U=(       d    U R                  nU(       aN  [        U[        5      (       a  [        S00 UD6nU(       a  [        R                  " S.SS$9  U R                  U#U5        U=(       d    U R                  nU(       a   U#R                  [        R                  U5        U R                  Ra                  5        H  u  n)n*U#R                  U)U*5        M     S n7S m;S m:S m<U(       a>  U!" 5       m;U"" 5       m:U"" 5       m<U:U;U<4S/ jn8U#R                  [        R                  U85        ONUb!  U#R                  [        R                  U5        O*['        5       n7U#R                  [        R                  U75        ['        5       n9U#R                  [        R                  U95        U=(       d    U R                  nU(       a.  U#R                  [        R                  UR                  5       5        U#R                  [        R                  U5        U+U7U9T;T:T<4$ s  sn%f )1Nrz   r(   ry   r~   F)r   rR   z3data must be dict/list/tuple, str, BytesIO or bytes)r   r   )
separators)rz   r{   r   Hostr   r  zContent-Typezapplication/jsonT)r   z!application/x-www-form-urlencodedzapplication/octet-streamExpectr   ALLzfiles is not supported, use `multipart`. See examples here: https://github.com/lexiforest/curl_cffi/blob/main/examples/upload.py)namer-  r   i  r   rE   z://zall://rG   zhttps://zMake sure you are using https over https proxy, otherwise, the proxy prefix should be 'http://' not 'https://', see: https://github.com/lexiforest/curl_cffi/issues/6r   r   socks)NT)ri   zImpersonating z is not supportedz.JA3 was altered after browser version was set.r#  )r   z1Akamai was altered after browser version was set.z=Extra fingerprints was altered after browser version was set.c                    > TR                  5       (       d  TR                  5         TR                  5       (       a  [        $ TR                  U 5        [	        U 5      $ r   )is_setr   r&   
put_nowaitlen)chunkheader_recvedr   quit_nows    rS   qput+BaseSession._set_curl_options.<locals>.qput  sG    $++--!%%'??$$//U#5z!rR   rJ   )oupperr   r$   rz   CUSTOMREQUESTencodeNOBODYr_   r   r^   r   r   URLr   rq   rv   tupler   rO   r	   readru   r   r
   
POSTFIELDSPOSTFIELDSIZErB  r0   rX   updater   r   r   r   popmulti_itemsr   r   
HTTPHEADERr;   
COOKIEFILE
COOKIELISTrY   get_cookies_for_curlto_curl_formatr)   NotImplementedErrorr   r   addpartMIMEPOST_formrZ   USERNAMEPASSWORDnot_setra   CONNECTTIMEOUT_MSrt   
TIMEOUT_MSLOW_SPEED_LIMITLOW_SPEED_TIMEmathceilrs   FOLLOWLOCATIONrc   	MAXREDIRSrd   r[   r   r   PROXYr   r   r   RuntimeWarningHTTPPROXYTUNNELr]   PROXYUSERNAMEPROXYPASSWORDr`   SSL_VERIFYPEERSSL_VERIFYHOSTCAINFOREFERERACCEPT_ENCODINGrp   SSLCERTSSLKEYre   ri   r9   r,   rf   r7   r#  r	  rg   r  rh   r*  rm   r  rk   WRITEFUNCTION	WRITEDATA
HEADERDATAro   	INTERFACEMAX_RECV_SPEED_LARGE)=r   r   r,  r   r_   r-  r.  rX   rY   r/  rZ   ra   rc   rd   r[   r\   r]   r`   r0  r1  r2  re   rf   rg   rh   ri   r   rm   ro   rp   r3  r4  r5  r6  r7  cbodyhhost_headerur   kvreqmorseltemp_cookiesusernamepasswordconnect_timeoutread_timeoutall_timeoutpartsr   retr   bufferrF  header_bufferrD  r   rE  s=                                                             @@@rS   _set_curl_optionsBaseSession._set_curl_optionsm  sp   J  VHHW\\1%u_HHW**FMMO<VHHW^^Q' ;;$S++6C$S1C==$---C(>C	cjjl+ dT4/00T?))+Dc"";;=Dg&&99;De$$D\DQRR*5<<>D 655HHW''.HHW**CI6..7 DLL!	
 eeFm"Aahh&+*Cfd# MMODAqq1#Rs1g> $ n>PZ^_dD!!f&6n>abdS%L))n>XY 	L(BE	##,%G,Qahhj,%GHc1f% 	
##S)	##U+ll77<FKK**F,A,A,CD = "7+L&;;C@G..0E0E0GH A %W  T4:2.4461!!qZ3=O=OqxxzUV!W 7HHW%%y7 99yy%)YY"(%)"(HHW%%x'89HHW%%x'89 gllG?Ggu%%,3)O\)L8KHHW..Od4J0KL++St1C-DE 00!4//;1GH#u..++S4-@A22C$4GH00!4//71CD 	
""(?$$_U	
 	
"/"7D]	
 WGHHenG?llGSME#ELL'++eBT(UVE~~ $||nC/?@#KK&0@(AB     .<<7*''
33 T +'( !++G44!8!8!< (:4??
)3&HhHHW22HOO4EFHHW22HOO4EF U?$++&.HHW++Q/HHW++Q/ fc""HHW^^V, \!jc&B&BHHW^^T[[1 HHW__gnn&67 &HHW,,o.D.D.FG  tyy$$$$/ 	c$/- "5T%5%52A2I$..0=K--_-MCax&}DU'VWW oTXXN[\]G($5668;Z;Z(D))hll;S.T.T!!!S'!: &4;;Q^_`$$Q/ ,t}}(D)),8x8S  q(+ $8t'8'8HHW))<8 %%++-DAqHHQN . A'MM"}H" HHW**D1)HHW**,<=YFHHW&&/		##]3 /	HHW&&	(8(8(:; 	
--~>FM1mXEE[ &Hs   7~
c                 8   Un[        U5      n[        [        UR                  [        R
                  5      5      R                  5       Ul        U(       a  UR                  5       Ul	        [        [        UR                  [        R                  5      5      Ul        [        [        UR                  [        R                  5      5      Ul        SUR                  s=:*  =(       a    S:  Os  Ul        UR                  5       R!                  5       n/ nU H  n	U	R#                  5       (       d  M  U	R%                  S5      (       a(  UR'                  U	5      R                  5       Ul        / nMX  U	R%                  S5      (       d  U	R%                  S5      (       a  US==   U	-  ss'   M  UR+                  U	5        M     [-        U5      Ul        UR                  [        R0                  5       Vs/ sH  n[2        R4                  " U5      PM     n
nU R6                  R9                  U
5        U R6                  Ul        [        [        WR                  [        R:                  5      5      R                  5       Ul        [        [        UR                  [        R>                  5      5      R                  5       Ul         XFl!        [        [D        UR                  [        RF                  5      5      Ul$        [        [        UR                  [        RJ                  5      5      Ul&        [        [        UR                  [        RN                  5      5      R                  5       Ul(        U RR                   H!  nUR                  U5      URT                  U'   M#     U$ s  snf )N   i  s   HTTP/       	)+r<   r   ru   getinfor#   EFFECTIVE_URLdecoder   getvaluecontentrt   r  rm   RESPONSE_CODEstatus_codeok
splitlinesstripr   get_reason_phrasereasonr   r0   rX   rV  r+   from_curl_formatrY   update_cookies_from_curl
PRIMARY_IP
primary_ipLOCAL_IPlocal_iprj   rs   
TOTAL_TIMEelapsedREDIRECT_COUNTredirect_countREDIRECT_URLredirect_urlrl   infos)r   r   r  r  rj   ry  rspr   header_listheader_linemorselsinfos               rS   _parse_responseBaseSession._parse_response  s   qkuaii(>(>?@GGI //+CKQYYx/D/D%EFsAIIh.D.D$EF--#-$--/::< 'K$$&&%%h//00=DDF
 %%d++{/E/Ee/L/LB;.{+ ( k*;<99XEXEX;YZ;Ya:..q1;YZ 	--g6lleQYYx/B/B%CDKKME199X->->#?@GGI/5!))H,?,?"@A!#qyy1H1H'IJqyy1F1F'GHOOQOODiioCIIdO $ 
! [s   -Nc                 <    U R                   (       a  [        S5      eg )Nz'Session is closed, cannot send request.)r   r.   r   s    rS   _check_session_closed!BaseSession._check_session_closed  s    << IJJ rR   )r   rg   rc   rZ   r^   rp   rY   rl   rk   rn   rj   ri   rh   rX   rm   re   ro   rf   rd   r_   r[   r]   ra   rb   r`   F))rK   rL   rM   rN   __doc__r   r1   r*   r   rO   rC   rq   rr   r   rs   rt   r6   r7   r8   r   ru   rv   r"   r   r   r	  r  r*  r_  
HttpMethodr   r   r	   objectr   r'   r   r  r  r  rQ   rJ   rR   rS   r   r      s/   W
 *.)-*.'+#04"&!%57 $48! $DH $?F'+%)26#'6:7> +&> +&	>
 uS#X'> )$> }> U38_-> 3-> > > ueE5L112> > > >  01!>" c]#>$ %>& 5!2K!?@A'>( )>*  Xugsl%; ;<+>, tn->. TN/>0 /1>2 3>4 C=5>6 uS%S/1237>@9 (P# (P (PTW W*	I&7 	I  6:RV#)-)- $*.GN*.'+'+#04-1!%)B/348! $DH*.,.26#'6:(,GbF bF 	bF
 tT5012bF uT#s(^T%[#wMNObF tnbF +&bF +&bF ~bF uS#X'bF %uUE\':F BCDbF "$bF  }bF )$bF  }!bF" U38_-#bF$ tSy)*%bF& #'bF( "#)bF* #8,+bF, 01-bF. c]/bF0 1bF2 5!2K!?@A3bF4 "$5bF6 S'%.()7bF8 /9bF: C=;bF< uS%S/123=bF> ?bF@ AbFB H%CbFD EbFF GbFH,\KrR   r   c            C       h  ^  \ rS rSrSr   SDS\\   S\\   S\S\	\
   4U 4S jjjr\S	 5       r\S
 5       rS rS rSES jr\S 5       rSSSSS.S\\   S\\   S\\   S\\   S\4
S jjrSSSSSSS\SSSSSSSSSSSSSSSSSSSSSS4S\S\S\\\\\ 4      S\\\\\4   \\    \\!\"4      S\\#   S \\$   S!\\%   S"\\   S#\\ \\4      S$\\\&\ \&\&4   \'4      S%\\   S&\\(   S'\\)   S(\\   S)\\ \\4      S*\\   S+\\   S,\\   S-\\*   S.\\+   S/\\   S0\\   S1\\\,\-4      S2\\   S3\\\*\"/\4   4   S4\\\.S   4   S5\\/   S6\\   S7\\\\ \\4   4      S8\S9\(S:\\0   S\14BS; jjr2\3" \2S<5      r4\3" \2S=5      r5\3" \2S>5      r6\3" \2S?5      r7\3" \2S@5      r8\3" \2SA5      r9\3" \2SB5      r:SCr;U =r<$ )FSessioni  zA request session, cookies and connections will be reused. This object is thread-safe,
but it's recommended to use a seperate session for each thread.Nr   threaduse_thread_local_curlkwargsc                 p  > [         TU ]  " S0 UD6  X l        X0l        SU l        SU l        U(       ac  [        R                  " 5       U l        U(       a  SU l	        XR                  l
        gSU l	        [        U R                  S9U R                  l
        gU(       a  UO[        U R                  S9U l        g)a  
Parameters set in the init method will be override by the same parameter in request method.

Args:
    curl: curl object to use in the session. If not provided, a new one will be
        created. Also, a fresh curl object will always be created when accessed
        from another thread.
    thread: thread engine to use for working with other thread implementations.
        choices: eventlet, gevent.
    headers: headers to use in the session.
    cookies: cookies to add in the session.
    auth: HTTP basic auth, a tuple of (username, password), only basic auth is supported.
    proxies: dict of proxies to use, format: {"http": proxy_url, "https": proxy_url}.
    proxy: proxy to use, format: "http://proxy_url".
        Cannot be used with the above parameter.
    proxy_auth: HTTP basic auth for proxy, a tuple of (username, password).
    base_url: absolute url to use as base for relative urls.
    params: query string for the session.
    verify: whether to verify https certs.
    timeout: how many seconds to wait before giving up.
    trust_env: use http_proxy/https_proxy and other environments, default True.
    allow_redirects: whether to allow redirection.
    max_redirects: max redirect counts, default 30, use -1 for unlimited.
    impersonate: which browser version to impersonate in the session.
    ja3: ja3 string to impersonate in the session.
    akamai: akamai string to impersonate in the session.
    extra_fp: extra fingerprints options, in complement to ja3 and akamai strings.
    interface: which interface use.
    default_encoding: encoding for decoding response content if charset is not found in
        headers. Defaults to "utf-8". Can be set to a callable for automatic detection.
    cert: a tuple of (cert, key) filenames for client cert.

Notes:
    This class can be used as a context manager.

.. code-block:: python

    from curl_cffi.requests import Session

    with Session() as s:
        r = s.get("https://example.com")
NTFrn   rJ   )superr   _thread_use_thread_local_curlr   	_executor	threadinglocal_local_is_customized_curlr   r    rn   _curl)r   r   r  r  r  	__class__s        rS   r   Session.__init__  s    b 	"6"&;# #//+DK+/(#' +0(#'djj#9 !%4djj+ADJrR   c                 0   U R                   (       az  U R                  (       a  [        R                  " SSS9  [	        U R
                  SS 5      (       d"  [        U R                  S9U R
                  l        U R
                  R                  $ U R                  $ )Nz/Creating fresh curl handle in different thread.r   r   r   r  )
r  r  r   r   getattrr  r    rn   r   r  r  s    rS   r   Session.curlI  sf    &&''O\]^4;;55#'djj#9 ;;###::rR   c                 R    U R                   c  [        5       U l         U R                   $ r   )r  r   r  s    rS   executorSession.executorT  s     >>!/1DN~~rR   c                     U $ r   rJ   r  s    rS   	__enter__Session.__enter__Z  s    rR   c                 $    U R                  5         g r   closer   argss     rS   __exit__Session.__exit__]  s    

rR   r   c                 F    SU l         U R                  R                  5         g)Close the session.TN)r   r   r  r  s    rS   r  Session.close`  s    		rR   c              /      #    U R                   " U0 UDSS0D6n Uv   UR                  5         g! UR                  5         f = f7f)z6Equivalent to ``with request(..., stream=True) as r:``r3  TN)requestr  r   r  r  r  s       rS   r3  Session.streame  s;      llD8F848	IIIKCIIKs   A/ AAA
on_messageon_erroron_openon_closer  r  r  r  c          	         U R                  5         U R                  " U R                  SU/UQ70 UD6  U R                  R                  [        R
                  S5        U R                  R                  5         [        U U R                  UUUUS9$ )a  Connects to a websocket url.

Args:
    url: the ws url to connect.
    on_message: message callback, ``def on_message(ws, str)``
    on_error: error callback, ``def on_error(ws, error)``
    on_open: open callback, ``def on_open(ws)``
    on_close: close callback, ``def on_close(ws)``

Other parameters are the same as ``.request``

Returns:
    a ws instance to communicate with the server.
ry   r   r  )r  r  r   r   r$   CONNECT_ONLYperformrA   )r   r   r  r  r  r  r  r  s           rS   
ws_connectSession.ws_connectn  s    0 	""$tyy%FtFvF 			--q1		II!
 	
rR   gzip, deflate, brr   r   Fr   r,  r   r_   r-  r.  rX   rY   r/  rZ   ra   rc   rd   r[   r\   r]   r`   r0  r1  r2  re   rf   rg   rh   ri   rj   r   rm   ro   rp   r3  r4  r5  c!                   ^ ^^)^*^+^,^-^.^/ T R                  5         U(       a5  T R                  R                  5       m*T R                  R                  5         OT R                  m*T R                  " T*40 SU_SU_SU_SU_SU_SU_SU_SU_S	U	_S
U
_SU_SU_SU_SU_SU_SU_SU_SU_SU_SU_SU_SU_SU_SU_SU_SU_SU_SU_SU_SU _SU_S [
        R                  _S![        R                  _6u  m/m)m+m.m-n!U(       Ga	  [        R                  " 5       m,U)U*UU+U-U.U/U 4S" jn"U*U,4S# jn#T R                  R                  U"5      n$U$R                  U#5        [        [        R                  T-5      R                  5         T R                  T*T)T+T5      n%T,R                  5         [!        [        [
        R                  T.5      5      n&[#        U&[$        5      (       a  T*R                  5         U&eT/U%l        U$U%l        U!U%l        T.U%l        U%$  T R,                  S$:X  a*  [.        R0                  R3                  T*R4                  5        OgT R,                  S%:X  aG  [6        R8                  " 5       R:                  R=                  T*R4                  5      R?                  5         OT*R5                  5         T R                  T*T)T+T5      n%T/U%l        U%T*R                  5         $ ! [@         a]  n'T R                  T*T)T+T5      n%T/U%l        [C        U'RD                  [G        U'5      5      n(U(" [G        U'5      U'RD                  U%5      U'eS&n'A'ff = f! T*R                  5         f = f)'zESend the request, see ``requests.request`` for details on parameters.r,  r   r_   r-  r.  rX   rY   r/  rZ   ra   rc   rd   r[   r\   r]   r`   r0  r1  r2  re   rf   rg   rh   ri   r   rm   ro   r3  r4  r5  rp   r6  r7  c                    >  TR                  5         [	        [        R                  T5      R                  5       (       d(  [	        [        R                  T5      R                  5         [	        [
        R                  T5      R                  S 5        g ! [         al  n T	R                  TTTT5      nTUl        [	        [
        R                  T5      R                  [        [        U 5      U R                  U5      5         S n A NS n A ff = f! [	        [        R                  T5      R                  5       (       d(  [	        [        R                  T5      R                  5         [	        [
        R                  T5      R                  S 5        f = fr   )r  r!   r  r  r   r   QueuerA  r-   rO   coder  Eventr@  r   put)
r   r  r  ry  rj   r  rD  r   r  r   s
     rS   r   Session.request.<locals>.perform  s   
3IIK  	?FFHHY__m<@@Ba(,,T2 ! [..q&-IYZC"%CKa(334DSVQVVUX4YZZ[
  	?FFHHY__m<@@Ba(,,T2s+   B 
DA"D>D DD B Fc                 F   > TR                  5         TR                  5         g r   )waitreset)futry  header_parseds    rS   cleanup Session.request.<locals>.cleanup  s    ""$	rR   rw   rx   N)$r  r   	duphandler  r  r   r  r  r  r  submitadd_done_callbackr   r  r  r   r   r   r-   r  stream_taskrE  r  rw   tpoolexecuter  rx   get_hub
threadpoolspawnr   r!   r/   r  rO   )0r   r,  r   r_   r-  r.  rX   rY   r/  rZ   ra   rc   rd   r[   r\   r]   r`   r0  r1  r2  re   rf   rg   rh   ri   rj   r   rm   ro   rp   r3  r4  r5  rE  r  r  r   r  first_elementr   errorr  ry  r  r  rD  r   r  s0   `                        `               @@@@@@@rS   r  Session.request  s   J 	""$ 		##%AIIOO		AAEAWAW#B
#B
 #B
 	#B

 #B
 #B
 #B
 #B
 #B
 #B
 #B
 ,#B
 (#B
 #B
 #B
  "!#B
" ##B
$ %#B
& ,'#B
( .)#B
* $+#B
, -#B
. /#B
0 1#B
2 ,3#B
4 5#B
6 &7#B
8  9#B
: ;#B
< *=#B
>  ?#B
@ A#B
B C#B
D "E#B
>V]A}hJ %OO-M3 3 --..w7K))'2 -0557&&q&-AQRC (U[[!(<=M-)9::	##CK)CO#CLCIJ<<:-NN**1995\\X-NN$//55aii@DDFIIK **1fmEUV!	  8**1fmEUV!"1663q62CFAFFC0a7	8 	s,   B!K ,M 
M #AL;;M  M Mr~   ry   rz   r{   r   r|   r}   )r   r  r  r  r  r   r  r  )NNTr   N)=rK   rL   rM   rN   r  r   r    
ThreadTyperr   r   rV   r   propertyr   r  r  r  r  r   r3  r?   r>   r@   r=   rA   r  r_  r  rO   r   r   r   r   r	   ru   rq   r1   r*   rs   r  rt   rC   r   r6   r7   r8   r   r"   r'   r<   r  r   headr   postr  patchdeleteoptionsrQ   __classcell__r  s   @rS   r  r    s,   G
  $'+&*	?Btn?B $?B  $	?B
 *+?B ?BB    

   .2)-'+)-'
 \*	'

 :&'
 )$'
 :&'
 
'
Z 6:RV#)-)- $*.GN*.'+'+#04!%!%)</348! $DH*.?F,.26#'6:(,CNN N tT5012	N
 uT#s(^T%[#wMNON tnN +&N +&N ~N uS#X'N %uUE\':F BCDN "$N  }N )$N }N  U38_-!N" #N$ #%N& "#'N( #8,)N* 01+N, c]-N. /N0 5!2K!?@A1N2 "$3N4  Xugsl%; ;<5N6 S'%.()7N8 /9N: C=;N< uS%S/123=N> ?N@ ANB H%CND 
EN` &)D

'C&)D

'C'7+E7H-FGY/GrR   r  c            B       6  ^  \ rS rSrSrSSSS.S\\   S\S\\	   4U 4S	 jjjr
\S
 5       r\S 5       rS rS rS rS rS rSCS jrS r\S 5       rS rSSSSSSS\SSSSSSSSSSSSSSSSSSSSSS4S\S\S\\\\\4      S\\\\\4   \\   \\\ 4      S\\!   S\\"   S \\#   S!\\   S"\\\\4      S#\\\$\\$\$4   \%4      S$\\&   S%\\   S&\\'   S'\\   S(\\\\4      S)\\&   S*\\   S+\\   S,\\(   S-\\)   S.\\   S/\\   S0\\\*\+4      S1\\&   S2\\\(\ /\4   4   S3\\\,S   4   S4\\-   S5\\   S6\\\\\\4   4      S7\&S8\S9\\.   4@S: jjr/\0" \/S;5      r1\0" \/S<5      r2\0" \/S=5      r3\0" \/S>5      r4\0" \/S?5      r5\0" \/S@5      r6\0" \/SA5      r7SBr8U =r9$ )DAsyncSessioni0  zAAn async request session, cookies and connections will be reused.Nr   )loop
async_curlmax_clientsr  r  r  c                j   > [         TU ]  " S0 UD6  Xl        X l        X0l        U R                  5         g)a.  
Parameters set in the init method will be override by the same parameter in request method.

Parameters:
    loop: loop to use, if not provided, the running loop will be used.
    async_curl: [AsyncCurl](/api/curl_cffi#curl_cffi.AsyncCurl) object to use.
    max_clients: maxmium curl handle to use in the session,
        this will affect the concurrency ratio.
    headers: headers to use in the session.
    cookies: cookies to add in the session.
    auth: HTTP basic auth, a tuple of (username, password), only basic auth is supported.
    proxies: dict of proxies to use, format: {"http": proxy_url, "https": proxy_url}.
    proxy: proxy to use, format: "http://proxy_url".
        Cannot be used with the above parameter.
    proxy_auth: HTTP basic auth for proxy, a tuple of (username, password).
    base_url: absolute url to use for relative urls.
    params: query string for the session.
    verify: whether to verify https certs.
    timeout: how many seconds to wait before giving up.
    trust_env: use http_proxy/https_proxy and other environments, default True.
    allow_redirects: whether to allow redirection.
    max_redirects: max redirect counts, default 30, use -1 for unlimited.
    impersonate: which browser version to impersonate in the session.
    ja3: ja3 string to impersonate in the session.
    akamai: akamai string to impersonate in the session.
    extra_fp: extra fingerprints options, in complement to ja3 and akamai strings.
    default_encoding: encoding for decoding response content if charset is not found
        in headers. Defaults to "utf-8". Can be set to a callable for automatic detection.
    cert: a tuple of (cert, key) filenames for client cert.

Notes:
    This class can be used as a context manager, and it's recommended to use via
    ``async with``.
    However, unlike aiohttp, it is not required to use ``with``.

.. code-block:: python

    from curl_cffi.requests import AsyncSession

    # recommended.
    async with AsyncSession() as s:
        r = await s.get("https://example.com")

    s = AsyncSession()  # it also works.
NrJ   )r  r   _loop_acurlr  	init_pool)r   r  r  r  r  r  s        rS   r   AsyncSession.__init__3  s0    j 	"6"
 &rR   c                 h    U R                   c  [        R                  " 5       U l         U R                   $ r   )r  asyncioget_running_loopr  s    rS   r  AsyncSession.loopn  s&    :: 113DJzzrR   c                 d    U R                   c  [        U R                  S9U l         U R                   $ )N)r  )r  r   r  r  s    rS   acurlAsyncSession.acurlt  s&    ;;#3DK{{rR   c                     [         R                  " U R                  5      U l          U R                  R	                  S 5        M  ! [         R
                   a     g f = fr   )r  	LifoQueuer  poolrA  	QueueFullr  s    rS   r  AsyncSession.init_poolz  sS    %%d&6&67			$$T*  $$ s   A AAc                    #    U R                   R                  5       I S h  vN nUc  [        U R                  S9nU$  N7f)Nr  )r&  r   r    rn   r   r   s     rS   pop_curlAsyncSession.pop_curl  s6     YY]]_$<djj)D  %s   ?=?c                     [        [        R                  5         U R                  R	                  U5        S S S 5        g ! , (       d  f       g = fr   )r   r  r'  r&  rA  r*  s     rS   	push_curlAsyncSession.push_curl  s.    g''(II  & )((s	   ?
Ac                    #    U $ 7fr   rJ   r  s    rS   
__aenter__AsyncSession.__aenter__  s
     s   c                 @   #    U R                  5       I S h  vN   g  N7fr   r  r  s     rS   	__aexit__AsyncSession.__aexit__  s     jjl 	s   c                    #    U R                   R                  5       I Sh  vN   SU l          U R                  R	                  5       nU(       a  UR                  5         M4   N@! [
        R                   a     gf = f7f)r  NT)r"  r  r   r&  
get_nowaitr  
QueueEmptyr*  s     rS   r  AsyncSession.close  sk     jj   yy++-JJL	  	! %% s2   A=A!A=1A# A=#A:7A=9A::A=c                     UR                  5         U R                  (       d=  U R                  R                  U5        UR	                  5         U R                  U5        g UR                  5         g r   )clean_after_performr   r"  remove_handler  r.  r  r*  s     rS   release_curlAsyncSession.release_curl  sE      "||JJ$$T*JJLNN4 JJLrR   c                   #    U R                   " U0 UDSS0D6I Sh  vN n U7v   UR                  5       I Sh  vN   g N# N! UR                  5       I Sh  vN    f = f7f)z<Equivalent to ``async with request(..., stream=True) as r:``r3  TN)r  acloser  s       rS   r3  AsyncSession.stream  sT      LL$>&>>>	I**,	 ? #**,sA   A"A A"A A"AA"A"AAAA"c                 D  #    U R                  5         U R                  5       I S h  vN nU R                  " USU/UQ70 UD6  UR                  [        R
                  S5        U R                  R                  S UR                  5      I S h  vN   [        X5      $  Nu N7f)Nry   r   )
r  r+  r  r   r$   r  r  run_in_executorr  rA   )r   r   r  r  r   s        rS   r  AsyncSession.ws_connect  s     ""$]]_$tUCA$A&AG((!,ii''dll;;;$$ % 	<s"   $B BA%B BB B r  r   r   Fr   r,  r   r_   r-  r.  rX   rY   r/  rZ   ra   rc   rd   r[   r\   r]   r`   r0  r1  r2  re   rf   rg   rh   ri   rj   r   rm   ro   rp   r3  r4  r5  c!           	      v  ^ ^^)^*^+^,^-^.^/#    T R                  5         T R                  5       I Sh  vN m*T R                  " S&0 ST*_SU_SU_SU_SU_SU_SU_S	U_S
U_SU	_SU
_SU_SU_SU_SU_SU_SU_SU_SU_SU_SU_SU_SU_SU_SU_SU_SU_SU_SU_SU_S U _S!U_S"[        R                  _S#[        R
                  _6u  m.m)m+m-m,n!U(       Ga	  T R                  R                  T*5      m/U)U*UU+U,U-U.U U/4	S$ jn"U*U 4S% jn#[        R                  " U"" 5       5      n$U$R                  U#5        [        [        R
                  T,5      R                  5       I Sh  vN   T R                  T*T)T+T5      n%[        [        [        R                  T-5      5      n&[        U&[        5      (       a  T R!                  T*5        U&eT.U%l        U$U%l        U!U%l        T-U%l        U%$  T R                  R                  T*5      m/T/I Sh  vN   T R                  T*T)T+T5      n%T.U%l        U%T R!                  T*5        $  GN N N7! [*         a]  n'T R                  T*T)T+T5      n%T.U%l        [-        U'R.                  [1        U'5      5      n(U(" [1        U'5      U'R.                  U%5      U'eSn'A'ff = f! T R!                  T*5        f = f7f)'zOSend the request, see ``curl_cffi.requests.request`` for details on parameters.Nr   r,  r   r_   r-  r.  rX   rY   r/  rZ   ra   rc   rd   r[   r\   r]   r`   r0  r1  r2  re   rf   rg   rh   ri   r   rm   ro   r3  r4  r5  rp   r6  r7  c                  B  >	#     T
I S h  vN   [        [        R                  T5      R                  5       (       d(  [        [        R                  T5      R                  5         [        [        R
                  T5      R                  S 5      I S h  vN   g  N! [          al  n T	R                  TTTT5      nTUl        [        [        R
                  T5      R                  [        [        U 5      U R                  U5      5         S n A NS n A ff = f N! [        [        R                  T5      R                  5       (       d(  [        [        R                  T5      R                  5         [        [        R
                  T5      R                  S 5      I S h  vN    f = f7fr   )r!   r  r  r   r  r  rA  r-   rO   r  r  r@  r   r  )r   r  r  r   rj   r  rD  r   r  r   tasks     rS   r  %AsyncSession.request.<locals>.perform  s     
;JJ  }=DDFFW]]M:>>@w}}a044T:::   ]..tV]L\]C"%CK*556Fs1vqvvWZ6[\\] ;  }=DDFFW]]M:>>@w}}a044T:::sj   FB BB BFDFB 
D"A"D	D 	DD FBFFFFc                 (   > TR                  T5        g r   )r=  )r  r   r   s    rS   r  %AsyncSession.request.<locals>.cleanup  s    !!$'rR   rJ   )r  r+  r  r  r  r  r"  
add_handlecreate_taskr  r   r  r  r   r   r-   r=  r  astream_taskrE  r   r!   r/   r  rO   )0r   r,  r   r_   r-  r.  rX   rY   r/  rZ   ra   rc   rd   r[   r\   r]   r`   r0  r1  r2  re   rf   rg   rh   ri   rj   r   rm   ro   rp   r3  r4  r5  rE  r  r  r   r  r  r   r  r  r   r  rD  r   r  rG  s0   `                        `               @@@@@@@rS   r  AsyncSession.request  sk    H 	""$]]_$AEAWAW #B
#B
#B
 #B
 	#B

 #B
 #B
 #B
 #B
 #B
 #B
 #B
 ,#B
 (#B
 #B
 #B
  "!#B
" ##B
$ %#B
& ,'#B
( .)#B
* $+#B
, -#B
. /#B
0 1#B
2 ,3#B
4 5#B
6 &7#B
8  9#B
: ;#B
< *=#B
>  ?#B
@ A#B
B  C#B
D  E#B
>V]A}hH ::((.D; ;( "--gi8K))'2w}}m499;;;
 &&tV]DTUC+D,BCM-)9::!!$'##CK*C#CLCIJ( zz,,T2

 **4HXY!!!$'y %v <,  8**4HXY!"1663q62CFAFFC0a7	8 !!$'sl   $J9H2D,J9H5BJ9 H9 ?H7 H9 J#  J95J97H9 9
J AJJ  J# #J66J9r~   ry   rz   r{   r   r|   r}   )r  r   r  r  r&  r	  ):rK   rL   rM   rN   r  r   r   rt   r   rV   r   r  r  r"  r  r+  r.  r1  r4  r  r=  r   r3  r  r_  r  rO   r   r   r   r   r	   ru   rq   r1   r*   rs   r  rr   rC   r   r6   r7   r8   r   r"   r'   r  r   r  r   r  r  r  r  r  rQ   r  r  s   @rS   r  r  0  s   K
 *.9 Y'	9
 9 *+9 9v  
  
'
  % 6:RV#)-)- $*.GN*.'+'+#04!%!%)</348! $DH*.?F,.26#'6:(,CB(B( B( tT5012	B(
 uT#s(^T%[#wMNOB( tnB( +&B( +&B( ~B( uS#X'B( %uUE\':F BCDB( "$B(  }B( )$B( }B(  U38_-!B(" #B($ #%B(& "#'B(( #8,)B(* 01+B(, c]-B(. /B(0 5!2K!?@A1B(2 "$3B(4  Xugsl%; ;<5B(6 S'%.()7B(8 /9B(: C=;B(< uS%S/123=B(> ?B(@ AB(B H%CB(H &)D

'C&)D

'C'7+E7H-FGY/GrR   r  )r   r  r   )kr  rd  r   r  r   collectionsr   concurrent.futuresr   
contextlibr   r   r   	functoolsr   ior	   r.  r
   typingr   r   r   r   r   r   r   r   r   r   r   urllib.parser   r   r   r   r   r   r   typing_extensionsr   r   r   r    r!   r"   r#   r$   r%   r   r&   r'   rY   r)   r*   r+   
exceptionsr,   r-   r.   r/   rX   r0   r1   re   r2   r3   r4   r5   r6   r7   r8   r9   r:   modelsr;   r<   
websocketsr=   r>   r?   r@   rA   ImportErrorrx   eventlet.tpoolrw   rC   rV   rO   r
  r  rr   r   r   r   r   r   r   r  r   r   r  r_  r   r  r  rJ   rR   rS   <module>r\     s         1 D D #      ^ ] ] $ ] ] ] 1 5 5 U U ) $	 	 	 & R Rk  k  IU 4IU 48 S#XI!)*
XY
;# ;$ ; '(
  4C 4tT5/@)A 4c 4p
/d3i 
/c 
/# 
/PT 
/5;; w}}  (qK qKhi0k i0X	X0; X0A   s   F=4G=
G
G