Ë
    ”U.jQ1  ã                  ó¸  — 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mZ ddlmZ ddlmZ ddlmZ dd	lmZ dd
lmZ ddlmZ ddlmZ ddlmZmZ ddlm Z m!Z! ddl"m#Z# ddl$m%Z%m&Z& ddl'm(Z(m)Z) ddl*m+Z+m,Z,m-Z- ddl.m/Z/m0Z0m1Z1  ejd                  e3«      Z4dd„Z5dd„Z6	 d 	 	 	 	 	 	 	 	 	 	 	 d!d„Z7d"d„Z8d#d„Z9d$d„Z:e G d„ d«      «       Z; G d„ d«      Z<y)%z(Download files with progress indicators.é    )ÚannotationsN)ÚIterableÚMapping)Ú	dataclass)Ú
HTTPStatus)ÚBinaryIO)ÚPreparedRequest)ÚResponse)ÚHTTPResponse)ÚHTTPHeaderDict)ÚReadTimeoutError)ÚBarTypeÚget_download_progress_renderer)ÚIncompleteDownloadErrorÚNetworkConnectionError)ÚLink)ÚSafeFileCacheÚis_from_cache)ÚCacheControlAdapterÚ
PipSession)ÚHEADERSÚraise_for_statusÚresponse_chunks)Úformat_sizeÚredact_auth_from_urlÚsplitextc                óh   — 	 t        | j                  d   «      S # t        t        t        f$ r Y y w xY w)Núcontent-length)ÚintÚheadersÚ
ValueErrorÚKeyErrorÚ	TypeError©Úresps    ú`C:\xampp\htdocs\tradingbinance\backend\.venv\Lib\site-packages\pip/_internal/network/download.pyÚ_get_http_response_sizer'      s5   € ðÜ�4—<‘<Ð 0Ñ1Ó2Ð2øÜœ¤)Ð,ò Ùðús   ‚ š1°1c                ól   — | j                   j                  d| j                   j                  d«      «      S )z�
    Return either the ETag or Last-Modified header (or None if neither exists).
    The return value can be used in an If-Range header.
    Úetagzlast-modified)r    Úgetr$   s    r&   Ú(_get_http_response_etag_or_last_modifiedr+   &   s*   € ð
 �<‰<×Ñ˜F D§L¡L×$4Ñ$4°_Ó$EÓFÐFó    c                óp  — t         j                  «       t        j                  kD  r|j                  }n|j
                  }t        |«      }|r1|r|› dt        |«      › dt        |«      › d�}n|› dt        |«      › d�}t        | «      rt         j                  d|«       n/|rt         j                  d|«       nt         j                  d|«       t         j                  «       t        j                  kD  rd}nt        | «      rd}n|sd}n
|d	kD  rd}nd}t        | «      }|s|S t        |||¬
«      }	 |	|«      S )Nz (Ú/Ú)zUsing cached %szResuming download %szDownloading %sFTi   )Úbar_typeÚsizeÚinitial_progress)ÚloggerÚgetEffectiveLevelÚloggingÚINFOÚurl_without_fragmentÚshow_urlr   r   r   Úinfor   r   )
r%   ÚlinkÚprogress_barÚtotal_lengthÚrange_startÚurlÚ
logged_urlÚshow_progressÚchunksÚrenderers
             r&   Ú_log_downloadrC   .   s(  € ô ×ÑÓ!¤G§L¡LÒ0Ø×'Ñ'‰à�m‰mˆä% cÓ*€JáÙà�,˜b¤¨[Ó!9Ð :¸!¼KÈÓ<UÐ;VÐVWÐXñ ð '˜< r¬+°lÓ*CÐ)DÀAÐFˆJä�TÔÜ�‰Ð% zÕ2Ù	Ü�‰Ð*¨JÕ7ä�‰Ð$ jÔ1ä×ÑÓ!¤G§L¡LÒ0Ø‰Ü	�tÔ	Ø‰ÙØ‰Ø	˜Ò	$Ø‰àˆä˜TÓ"€FáØˆä-Ø LÀ;ô€Hñ �FÓÐr,   c                ó@   — t         j                  j                  | «      S )zJ
    Sanitize the "filename" value from a Content-Disposition header.
    )ÚosÚpathÚbasename)Úfilenames    r&   Úsanitize_content_filenamerI   a   s   € ô �7‰7×Ñ˜HÓ%Ð%r,   c                ó¢   — t         j                  j                  «       }| |d<   |j                  d«      }|rt	        t        |«      «      }|xs |S )zƒ
    Parse the "filename" value from a Content-Disposition header, and
    return the default filename if the result is empty.
    úcontent-typerH   )ÚemailÚmessageÚMessageÚ	get_paramrI   Ústr)Úcontent_dispositionÚdefault_filenameÚmrH   s       r&   Úparse_content_dispositionrT   h   sM   € ô
 	�‰×ÑÓ€AØ+€A€nÑØ�{‰{˜:Ó&€HÙô -¬S°«]Ó;ˆØÒ'Ð'Ð'r,   c                ó˜  — |j                   }| j                  j                  d«      }|rt        ||«      }t	        |«      d   }|s6t        j                  | j                  j                  dd«      «      }|r||z  }|sL|j                  | j                  k7  r3t        j                  j	                  | j                  «      d   }|r||z  }|S )zoGet an ideal filename from the given HTTP response, falling back to
    the link filename if not provided.
    zcontent-dispositioné   rK   Ú )
rH   r    r*   rT   r   Ú	mimetypesÚguess_extensionr>   rE   rF   )r%   r:   rH   rQ   Úexts        r&   Ú_get_http_response_filenamer[   w   s²   € ð �}‰}€HàŸ,™,×*Ñ*Ð+@ÓAÐÙÜ,Ð-@À(ÓKˆÜ˜xÓ(¨Ñ+€CÙÜ×'Ñ'¨¯©×(8Ñ(8¸ÈÓ(LÓMˆÙØ˜‰OˆHÙ�4—8‘8˜tŸx™xÒ'Ü�g‰g×Ñ˜tŸx™xÓ(¨Ñ+ˆÙØ˜‰OˆHØ€Or,   c                  ód   — e Zd ZU dZded<   ded<   ded<   dZd	ed
<   dZd	ed<   dd„Zdd„Zdd„Z	y)Ú_FileDownloadz+Stores the state of a single link download.r   r:   r   Úoutput_fileú
int | Noner1   r   r   Úbytes_receivedÚ
reattemptsc                óf   — t        | j                  d uxr | j                  | j                  k  «      S ©N)Úboolr1   r`   ©Úselfs    r&   Úis_incompletez_FileDownload.is_incomplete–   s*   € Ü�D—I‘I TÐ)ÒM¨d×.AÑ.AÀDÇIÁIÑ.MÓNÐNr,   c                óv   — | xj                   t        |«      z  c_         | j                  j                  |«       y rc   )r`   Úlenr^   Úwrite)rf   Údatas     r&   Úwrite_chunkz_FileDownload.write_chunk™   s+   € Ø×Òœs 4›yÑ(ÕØ×Ñ×Ñ˜tÕ$r,   c                ó|   — | j                   j                  d«       | j                   j                  «        d| _        y)z1Delete any saved data and reset progress to zero.r   N)r^   ÚseekÚtruncater`   re   s    r&   Ú
reset_filez_FileDownload.reset_file�   s0   € à×Ñ×Ñ˜aÔ Ø×Ñ×!Ñ!Ô#ØˆÕr,   N)Úreturnrd   )rk   Úbytesrq   ÚNone)rq   rs   )
Ú__name__Ú
__module__Ú__qualname__Ú__doc__Ú__annotations__r`   ra   rg   rl   rp   © r,   r&   r]   r]   Œ   s:   … á5à
ƒJØÓØ
ÓØ€N�CÓØ€J�ÓóOó%ô r,   r]   c                  óŒ   — e Zd Z	 	 	 	 	 	 d
d„Z	 	 	 	 	 	 dd„Zdd„Zdd„Z	 	 	 	 	 	 dd„Z	 	 	 	 	 	 dd„Z	 	 	 	 	 	 dd„Z	e
fdd„Zy	)Ú
Downloaderc                ón   — || _         || _        |j                  | _        | j                  dk\  sJ d«       ‚y )Nr   z<Number of max resume retries must be bigger or equal to zero)Ú_sessionÚ_progress_barÚresume_retriesÚ_resume_retries)rf   Úsessionr;   s      r&   Ú__init__zDownloader.__init__¥   sA   € ð
  ˆŒØ)ˆÔØ&×5Ñ5ˆÔà× Ñ  AÒ%ð	JàIó	JÙ%r,   c              #  óB   K  — |D ]  } | ||«      \  }}|||ff–— Œ y­w)z.Convenience method to download multiple links.Nry   )rf   ÚlinksÚlocationr:   ÚfilepathÚcontent_types         r&   ÚbatchzDownloader.batch±   s3   è ø€ ó ˆDÙ%)¨$°Ó%9Ñ"ˆH�lØ˜ <Ð0Ð0Ó0ñ ùs   ‚c                ó’  — | j                  |«      }t        |«      }t        j                  j	                  |t        ||«      «      }t        |d«      5 }t        |||«      }| j                  ||«       |j                  «       r| j                  ||«       ddd«       |j                  j                  dd«      }||fS # 1 sw Y   Œ)xY w)z+Download a link and save it under location.ÚwbNzContent-TyperW   )Ú	_http_getr'   rE   rF   Újoinr[   Úopenr]   Ú_process_responserg   Ú_attempt_resumes_or_redownloadsr    r*   )	rf   r:   r…   r%   Údownload_sizer†   Úcontent_fileÚdownloadr‡   s	            r&   Ú__call__zDownloader.__call__¹   s­   € à�~‰~˜dÓ#ˆÜ/°Ó5ˆä—7‘7—<‘< Ô*EÀdÈDÓ*QÓRˆÜ�(˜DÔ! \Ü$ T¨<¸ÓGˆHØ×"Ñ" 8¨TÔ2Ø×%Ñ%Ô'Ø×4Ñ4°X¸tÔD÷	 "ð —|‘|×'Ñ'¨¸Ó;ˆØ˜Ð%Ð%÷ "Ð!ús   ÁAB=Â=Cc                ó  — t        ||j                  | j                  |j                  |j                  ¬«      }	 |D ]  }|j                  |«       Œ y# t        $ r-}|j                  €|‚t        j                  d«       Y d}~yd}~ww xY w)z)Download and save chunks from a response.)r=   Nz'Connection timed out while downloading.)	rC   r:   r~   r1   r`   rl   r   r3   Úwarning)rf   r’   r%   rA   ÚchunkÚes         r&   rŽ   zDownloader._process_responseÈ   s~   € äØØ�M‰MØ×ÑØ�M‰MØ ×/Ñ/ô
ˆð	FÛ�Ø×$Ñ$ UÕ+ñ  øäò 	Fà�}‰}Ð$Ø�ä�N‰NÐD×EÑEûð	Fús   ºA Á	B	Á#BÂB	c                óR  — |j                   | j                  k  �r|j                  «       rü|j                  €J ‚|xj                   dz  c_         t        j                  dt        |j                  «      t        |j                  «      |j                   «       	 | j                  ||¬«      }|j                  t        j                  k7  }|r"|j                  «        t        |«      |_        |}| j                  ||«       |j                   | j                  k  r|j                  «       rŒü|j                  «       r4t%        j&                  |j(                  j*                  «       t-        |«      ‚|j                   dkD  r| j/                  ||«       yy# t        t         t"        f$ r Y �Œ¤w xY w)zAAttempt to resume/restart the download if connection was dropped.NrV   z<Attempting to resume incomplete download (%s/%s, attempt %d))Úshould_matchr   )ra   r€   rg   r1   r3   r•   r   r`   Ú_http_get_resumeÚstatus_coder   ÚPARTIAL_CONTENTrp   r'   rŽ   ÚConnectionErrorr   ÚOSErrorrE   Úremover^   Únamer   Ú_cache_resumed_download)rf   r’   Ú
first_respÚresume_respÚmust_restarts        r&   r�   z*Downloader._attempt_resumes_or_redownloadsÛ   sk  € ð
 ×!Ñ! D×$8Ñ$8Ó8¸X×=SÑ=SÔ=UØ—=‘=Ð,Ð,Ð,Ø×Ò 1Ñ$ÕÜ�N‰NØNÜ˜H×3Ñ3Ó4Ü˜HŸM™MÓ*Ø×#Ñ#ô	ðØ"×3Ñ3°HÈ:Ð3ÓV�ð  +×6Ñ6¼*×:TÑ:TÑT�ÙØ×'Ñ'Ô)Ü$;¸KÓ$H�H”MØ!,�Jà×&Ñ& x°Ô=ð+ ×!Ñ! D×$8Ñ$8Ò8¸X×=SÑ=SÕ=Uð4 ×!Ñ!Ô#Ü�I‰I�h×*Ñ*×/Ñ/Ô0Ü)¨(Ó3Ð3ð ×Ñ Ò"Ø×(Ñ(¨°:Õ>ð #øô $Ô%5´wÐ?ò Úðús   ÂA&F ÆF&Æ%F&c                óÆ  — |j                   j                  }| j                  j                  |«      }t	        |t
        «      st        j                  d|«       yt	        |j                  t        «      sJ d«       ‚t        «       }|j                  d|i ¬«       t        «       }|j                  j                  «       D ]  \  }}|j                  «       dvsŒ|||<   Œ t!        |j"                  «      |d<   t%        d|d	d
¬«      }	|j&                  j)                  |«      }
|j&                  j*                  j-                  ||	d«      }|j                  j/                  |
|«       |j0                  j3                  «        t5        |j0                  j6                  d«      5 }|j                  j9                  |
|«       ddd«       t        j                  d|«       y# 1 sw Y   Œ xY w)an  
        Manually cache a file that was successfully downloaded via resume retries.

        cachecontrol doesn't cache 206 (Partial Content) responses, since they
        are not complete files. This method manually adds the final file to the
        cache as though it was downloaded in a single request, so that future
        requests can use the cache.
        z<Skipping resume download caching: no cache controller for %sNzseparate body cache not in use!ÚGET)Úmethodr>   r    )zcontent-ranger   r   rW   éÈ   F)Úbodyr    ÚstatusÚpreload_contentr,   Úrbz?Cached resumed download as complete response for future use: %s)r:   r7   r}   Úget_adapterÚ
isinstancer   r3   ÚdebugÚcacher   r	   Úpreparer   r    ÚitemsÚlowerrP   r1   ÚURLlib3ResponseÚ
controllerÚ	cache_urlÚ
serializerÚdumpsÚsetr^   Úflushr�   r    Úset_body_from_io)rf   r’   Úoriginal_responser>   ÚadapterÚsynthetic_requestÚsynthetic_response_headersÚkeyÚvalueÚsynthetic_responser¶   Úmetadata_blobÚfs                r&   r¡   z"Downloader._cache_resumed_download  s¯  € ð �m‰m×0Ñ0ˆØ—-‘-×+Ñ+¨CÓ0ˆô ˜'Ô#6Ô7Ü�L‰LØNÐPSôð ô Ø�M‰Mœ=ô
ð 	-à,ó	-ð 
ô ,Ó-ÐØ×!Ñ!¨°CÀÐ!ÔDä%3Ó%5Ð"Ø+×3Ñ3×9Ñ9Ö;‰JˆC�Ø�y‰y‹{Ð"EÒEØ27Ð*¨3Ò/ð <ô 8;¸8¿=¹=Ó7IÐ"Ð#3Ñ4ä,ØØ.ØØ!ô	
Ðð ×&Ñ&×0Ñ0°Ó5ˆ	Ø×*Ñ*×5Ñ5×;Ñ;ØÐ1°3ó
ˆð 	�‰×Ñ˜) ]Ô3Ø×Ñ×"Ñ"Ô$Ü�(×&Ñ&×+Ñ+¨TÔ2°aØ�M‰M×*Ñ*¨9°aÔ8÷ 3ô 	�‰ØMÈsõ	
÷ 3Ð2ús   ÆGÇG c                ó¬   — t        j                  «       }d|j                  › d�|d<   t        |«      x}r||d<   | j	                  |j
                  |«      S )z2Issue a HTTP range request to resume the download.zbytes=Ú-ÚRangezIf-Range)r   Úcopyr`   r+   r‹   r:   )rf   r’   r™   r    Ú
identifiers        r&   rš   zDownloader._http_get_resume;  s[   € ô —,‘,“.ˆØ# H×$;Ñ$;Ð#<¸AÐ>ˆ�Ñô BÀ,ÓOÐOˆ:ÐOØ",ˆG�JÑØ�~‰~˜hŸm™m¨WÓ5Ð5r,   c                ó  — |j                   }	 | j                  j                  ||d¬«      }t        |«       |S # t        $ r?}|j
                  €J ‚t        j                  d|j
                  j                  |«       ‚ d }~ww xY w)NT)r    ÚstreamzHTTP error %s while getting %s)	r7   r}   r*   r   r   Úresponser3   Úcriticalr›   )rf   r:   r    Ú
target_urlr%   r—   s         r&   r‹   zDownloader._http_getI  s€   € Ø×.Ñ.ˆ
ð	Ø—=‘=×$Ñ$ Z¸ÈÐ$ÓNˆDÜ˜TÔ"ð ˆøô &ò 	Ø—:‘:Ð)Ð)Ð)Ü�O‰OØ0°!·*±*×2HÑ2HÈ$ôð ûð	ús   Ž)9 ¹	BÁ:A<Á<BN)r�   r   r;   r   rq   rs   )r„   zIterable[Link]r…   rP   rq   z&Iterable[tuple[Link, tuple[str, str]]])r:   r   r…   rP   rq   ztuple[str, str])r’   r]   r%   r
   rq   rs   )r’   r]   r¢   r
   rq   rs   )r’   r]   r¼   r
   rq   rs   )r’   r]   r™   r
   rq   r
   )r:   r   r    zMapping[str, str]rq   r
   )rt   ru   rv   r‚   rˆ   r“   rŽ   r�   r¡   rš   r   r‹   ry   r,   r&   r{   r{   ¤   s´   „ ð
Jàð
Jð ð
Jð 
ó	
Jð1Ø#ð1Ø/2ð1à	/ó1ó&óFð&&?Ø%ð&?Ø3;ð&?à	ó&?ðP6
Ø%ð6
Ø:Bð6
à	ó6
ðp6Ø%ð6Ø5=ð6à	ó6ð BIõ r,   r{   )r%   r
   rq   r_   )r%   r
   rq   z
str | None)r   )r%   r
   r:   r   r;   r   r<   r_   r=   r_   rq   zIterable[bytes])rH   rP   rq   rP   )rQ   rP   rR   rP   rq   rP   )r%   r
   r:   r   rq   rP   )=rw   Ú
__future__r   Úemail.messagerL   r5   rX   rE   Úcollections.abcr   r   Údataclassesr   Úhttpr   Útypingr   Úpip._vendor.requestsr	   Úpip._vendor.requests.modelsr
   Úpip._vendor.urllib3r   r´   Ú pip._vendor.urllib3._collectionsr   Úpip._vendor.urllib3.exceptionsr   Úpip._internal.cli.progress_barsr   r   Úpip._internal.exceptionsr   r   Úpip._internal.models.linkr   Úpip._internal.network.cacher   r   Úpip._internal.network.sessionr   r   Úpip._internal.network.utilsr   r   r   Úpip._internal.utils.miscr   r   r   Ú	getLoggerrt   r3   r'   r+   rC   rI   rT   r[   r]   r{   ry   r,   r&   Ú<module>râ      sá   ðÙ .å "ã Û Û Û 	ß -Ý !Ý Ý å 0Ý 0Ý ?Ý ;Ý ;ç Sß TÝ *ß Dß Iß RÑ Rß PÑ Pà	ˆ×	Ñ	˜8Ó	$€óóGð  ð0Ø
ð0à
ð0ð ð0ð ð	0ð
 ð0ð ó0óf&ó(óð* ÷ ð  ó ð ÷.pò pr,   