ó
    &k§iD‚  ã            	       ó`  • S r SSKrSSKrSSKrSSKrSSKrSSKr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Jr  SSKJr  SSKJr  SSKJrJrJrJr  SS	K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'J(r(  SSK)J*r*  SSK+J,r,J-r-J.r.J/r/  SSK0J1r1  Sr2\Rf                  " 5       r4SSS.r5SRm                  \Rn                  " S\" SS9S   5      5      r8\Rr                  S:X  a  S r:S r"S r;S r<SHS jr=S r>S r?\R€                  S  5       rAS! rBS" rCS# rDS$ rESHS% jrFS& rGS' rHS( rIS) rJS* rKS+ rLS, rMS- rN\O" S.5      rPS/ rQS0 rRS1 rSS2 rTS3 rUS4 rV\R€                  S5 5       rWS6 rXSIS7 jrYS8 rZSJS9 jr[SKS: jr\S; r]S< r^S=R¿                  S>5      r`\`S?-  ra\`S@-  rbSA rcSB rdSC reSD rfSE rgSF rhSG rig)Lz”
requests.utils
~~~~~~~~~~~~~~

This module provides utility functions that are used within Requests
that are also useful for external consumption.
é    N)ÚOrderedDict)Úmake_headersÚ	parse_urlé   )Úcerts©Ú__version__)Ú_HEADER_VALIDATORS_BYTEÚ_HEADER_VALIDATORS_STRÚHEADER_VALIDATORSÚto_native_string)ÚMappingÚ
basestringÚbytesÚ
getproxiesÚgetproxies_environmentÚinteger_types)Úparse_http_list)Úproxy_bypassÚproxy_bypass_environmentÚquoteÚstrÚunquoteÚurlparseÚ
urlunparse©Úcookiejar_from_dict)ÚFileModeWarningÚInvalidHeaderÚ
InvalidURLÚUnrewindableBodyError)ÚCaseInsensitiveDict)z.netrcÚ_netrcéP   i»  )ÚhttpÚhttpsz, z,\s*T)Úaccept_encodingzaccept-encodingÚwin32c                 óD  •  SS K n UR                  UR                  S5      n[	        UR                  US5      S   5      nUR                  US5      S   nU(       a  U(       d  gUR                  S5      n[        S U5      nU Hs  nUS:X  a  SU ;  a    g	UR                  SS
5      nUR                  SS5      nUR                  SS5      n[        R                  " XP[        R                  5      (       d  Ms    g	   g! [         a     gf = f! [        [        4 a     gf = f)Nr   Fz;Software\Microsoft\Windows\CurrentVersion\Internet SettingsÚProxyEnableÚProxyOverrideÚ;z<local>Ú.Tz\.Ú*z.*Ú?)ÚwinregÚImportErrorÚOpenKeyÚHKEY_CURRENT_USERÚintÚQueryValueExÚOSErrorÚ
ValueErrorÚsplitÚfilterÚreplaceÚreÚmatchÚI)Úhostr0   ÚinternetSettingsÚproxyEnableÚproxyOverrideÚtests         Ú0/usr/lib/python3/dist-packages/requests/utils.pyÚproxy_bypass_registryrD   L   s!  € ð	Ûð
	Ø%Ÿ~™~Ø×(Ñ(ØNó Ðô
 ˜f×1Ñ1Ð2BÀMÓRÐSTÑUÓVˆKà"×/Ñ/Ð0@À/ÓRÐSTÑUˆMö ¦-Øð
 &×+Ñ+¨CÓ0ˆä˜t ]Ó3ˆã!ˆDØ�yÓ Ø˜d“?ÙØ—<‘<  UÓ+ˆDØ—<‘<  UÓ+ˆDØ—<‘<  TÓ*ˆDÜ�xŠx˜¤B§D¡D×)Ó)Ùñ "ð øôC ó 	Ùð	ûô œÐ$ó 	Ùð	ús#   ‚C< ‡AD Ã<
D	ÄD	ÄDÄDc                 óL   • [        5       (       a  [        U 5      $ [        U 5      $ )z‚Return True, if the host should be bypassed.

Checks proxy settings gathered from the environment, if specified,
or the registry.
)r   r   rD   )r>   s    rC   r   r   r   s#   € ô "×#Ñ#Ü+¨DÓ1Ð1ä(¨Ó.Ð.ó    c                 óH   • [        U S5      (       a  U R                  5       n U $ )z/Returns an internal sequence dictionary update.Úitems)ÚhasattrrH   )Úds    rC   Údict_to_sequencerK   ~   s!   € ô ˆq�'×ÑØ�G‰G‹Iˆà€HrF   c                 ó@  • S nSn[        U [        5      (       a  U R                  S5      n [        U S5      (       a  [	        U 5      nO‹[        U S5      (       a  U R                  nOm[        U S5      (       a\   U R                  5       n[        R                  " U5      R                  nSU R                  ;  a  [        R                  " S[        5        [        U S5      (       ab   U R!                  5       n[        U S	5      (       a@  Uc=   U R#                  SS
5        U R!                  5       nU R#                  U=(       d    S5        Uc  Sn['        SX-
  5      $ ! [        R                  [        4 a     N¢f = f! [$         a    Sn NAf = f! [$         a    Ub  Un NVf = f)Nr   úutf-8Ú__len__ÚlenÚfilenoÚba%  Requests has determined the content-length for this request using the binary size of the file: however, the file has been opened in text mode (i.e. without the 'b' flag in the mode). This may lead to an incorrect content-length. In Requests 3.0, support will be removed for files in text mode.ÚtellÚseeké   )Ú
isinstancer   ÚencoderI   rO   rP   ÚosÚfstatÚst_sizeÚmodeÚwarningsÚwarnr   ÚioÚUnsupportedOperationÚAttributeErrorrR   rS   r6   Úmax)ÚoÚtotal_lengthÚcurrent_positionrP   s       rC   Ú	super_lenrd   ‡   s„  € Ø€LØÐä�!”S×ÑØ�H‰H�WÓˆäˆq�)×ÑÜ˜1“v‰ä	��E×	Ñ	Ø—u‘u‰ä	��H×	Ñ	ð	Ø—X‘X“ZˆFô Ÿ8š8 FÓ+×3Ñ3ˆLð ˜!Ÿ&™&Ó Ü—’ð2ô $ô
ô ˆq�&×Ñð	%Ø Ÿv™v›xÐô �q˜&×!Ñ! lÑ&:ð	%à—F‘F˜1˜a”LØ#$§6¡6£8�Lð —F‘FÐ+×0¨qÔ1ð ÑØˆäˆq�,Ñ1Ó2Ð2øôe ×'Ñ'¬Ð8ó 	ñ ð		ûôX ó %Ø#$’Lð%ûô% ó 	0ð
 Ñ'Ø#/Ð ùð	0ús6   Á8E Ã%F Ä
<E9 ÅE6Å5E6Å9FÆFÆFÆFc                 óF  • [         R                  R                  S5      nUb  U4nOS [         5       n SSKJnJn  SnU HK  n [         R                  R                  U5      n[         R                  R                  U5      (       d  MI  Un  O   Uc  g[        U 5      n	U	R                  n
 U" U5      R                  U
5      nU(       a  US   (       a  SOSnX¼   US   4$ g! [         a       gf = f! U[        4 a    U(       a  e  gf = f! [        [        4 a     gf = f)z;Returns the Requests tuple auth for a given url from netrc.ÚNETRCNc              3   ó,   #   • U  H
  nS U 3v •  M     g7f)z~/N© )Ú.0Úfs     rC   Ú	<genexpr>Ú!get_netrc_auth.<locals>.<genexpr>Ó   s   é € Ð9ª[¨˜R ˜s�8ª[ùs   ‚r   )ÚNetrcParseErrorÚnetrcr   rT   )rW   ÚenvironÚgetÚNETRC_FILESrn   rm   ÚpathÚ
expanduserÚKeyErrorÚexistsr   ÚhostnameÚauthenticatorsr6   r1   r_   )ÚurlÚraise_errorsÚ
netrc_fileÚnetrc_locationsrm   rn   Ú
netrc_pathrj   ÚlocÚrir>   r#   Úlogin_is                rC   Úget_netrc_authr€   Ì   s'  € ô —‘—‘ Ó(€JØÑØ%˜-‰á9­[Ó9ˆð'ß0àˆ
ã ˆAðÜ—g‘g×(Ñ(¨Ó+�ô �w‰w�~‰~˜c×"Ó"Ø �
Ùñ !ð ÑØä�c‹]ˆØ�{‰{ˆð
	Ù˜:Ó&×5Ñ5°dÓ;ˆFÞà% aŸy™!¨a�Ø™¨°©Ð3Ð3ð øô' ó ò ð	ûð.  ¤Ð)ó 	ö Øñ ð	ûô œÐ(ó Ùðús_   µD ÁC"Á$"D Â
	D ÂD Â,4C3 Ã"
C0Ã,D Ã/C0Ã0D Ã3D
ÄD Ä	D
Ä
D ÄD ÄD c                 ó¾   • [        U SS5      nU(       aI  [        U[        5      (       a3  US   S:w  a)  US   S:w  a  [        R                  R                  U5      $ gggg)z0Tries to guess the filename of the given object.ÚnameNr   Ú<éÿÿÿÿÚ>)ÚgetattrrU   r   rW   rr   Úbasename)Úobjr‚   s     rC   Úguess_filenamer‰   ÿ   sW   € ä�3˜ Ó%€DÞ”
˜4¤×,Ñ,°°a±¸C³ÀDÈÁHÐPSÃOÜ�w‰w×Ñ Ó%Ð%ð ET°Ð,€trF   c                 ó®  • [         R                  R                  U 5      (       a  U $ [         R                  R                  U 5      u  pU(       aŒ  [         R                  R                  U5      (       dh  [         R                  R                  U5      u  pU(       d  O?SR	                  X2/5      nU(       a&  [         R                  R                  U5      (       d  Mh  [
        R                  " U5      (       d  U $ [
        R                  " U5      nX$R                  5       ;  a  U $ [        R                  " 5       n[         R                  R	                  XRR                  S5      S   5      n[         R                  R                  U5      (       d6  [        U5       nUR                  UR                  U5      5        SSS5        U$ U$ ! , (       d  f       U$ = f)z¸Replace nonexistent paths that look like they refer to a member of a zip
archive with the location of an extracted copy of the target, or else
just return the provided path unchanged.
Ú/r„   N)rW   rr   ru   r8   ÚjoinÚzipfileÚ
is_zipfileÚZipFileÚnamelistÚtempfileÚ
gettempdirÚatomic_openÚwriteÚread)rr   ÚarchiveÚmemberÚprefixÚzip_fileÚtmpÚextracted_pathÚfile_handlers           rC   Úextract_zipped_pathsr�     sH  € ô
 
‡w�w‡~�~�d×Ñàˆô —g‘g—m‘m DÓ)�O€GÞ
œ"Ÿ'™'Ÿ.™.¨×1Ñ1ÜŸ'™'Ÿ-™-¨Ó0‰ˆÞð Ø—‘˜6Ð*Ó+ˆö œ"Ÿ'™'Ÿ.™.¨×1Ó1ô ×Ò˜g×&Ñ&Øˆä�Š˜wÓ'€HØ×&Ñ&Ó(Ó(Øˆô ×
Ò
Ó
€CÜ—W‘W—\‘\ #§|¡|°CÓ'8¸Ñ'<Ó=€NÜ�7‰7�>‰>˜.×)Ñ)ä˜Ô(¨LØ×Ñ˜xŸ}™}¨VÓ4Ô5÷ )àÐˆ>Ð÷ )Ô(àÐús   Æ!GÇ
Gc              #   óT  #   • [         R                  " [        R                  R	                  U 5      S9u  p [        R
                  " US5       nUv •  SSS5        [        R                  " X 5        g! , (       d  f       N%= f! [         a    [        R                  " U5        e f = f7f)z-Write a file to the disk in an atomic fashion)ÚdirÚwbN)	r‘   ÚmkstemprW   rr   ÚdirnameÚfdopenr:   ÚBaseExceptionÚremove)ÚfilenameÚtmp_descriptorÚtmp_nameÚtmp_handlers       rC   r“   r“   +  sz   é € ô  (×/Ò/´B·G±G·O±OÀHÓ4MÑNÑ€NðÜ�YŠY�~ tÔ,°ØÒ÷ -ä
�
Š
�8Õ&÷ -Õ,ûô ó Ü
�	Š	�(ÔØðüs4   ‚4B(·B ÁA2ÁB Á1B(Á2
B Á<B Â"B%Â%B(c                 ó€   • U c  g[        U [        [        [        [        45      (       a  [        S5      e[        U 5      $ )aÓ  Take an object and test to see if it can be represented as a
dictionary. Unless it can not be represented as such, return an
OrderedDict, e.g.,

::

    >>> from_key_val_list([('key', 'val')])
    OrderedDict([('key', 'val')])
    >>> from_key_val_list('string')
    Traceback (most recent call last):
    ...
    ValueError: cannot encode objects that are not 2-tuples
    >>> from_key_val_list({'key': 'val'})
    OrderedDict([('key', 'val')])

:rtype: OrderedDict
Nú+cannot encode objects that are not 2-tuples)rU   r   r   Úboolr4   r7   r   ©Úvalues    rC   Úfrom_key_val_listr¯   8  s9   € ð$ �}Øä�%œ#œu¤d¬CÐ0×1Ñ1ÜÐFÓGÐGä�uÓÐrF   c                 óÊ   • U c  g[        U [        [        [        [        45      (       a  [        S5      e[        U [        5      (       a  U R                  5       n [        U 5      $ )a’  Take an object and test to see if it can be represented as a
dictionary. If it can be, return a list of tuples, e.g.,

::

    >>> to_key_val_list([('key', 'val')])
    [('key', 'val')]
    >>> to_key_val_list({'key': 'val'})
    [('key', 'val')]
    >>> to_key_val_list('string')
    Traceback (most recent call last):
    ...
    ValueError: cannot encode objects that are not 2-tuples

:rtype: list
Nr«   )	rU   r   r   r¬   r4   r7   r   rH   Úlistr­   s    rC   Úto_key_val_listr²   S  sP   € ð" �}Øä�%œ#œu¤d¬CÐ0×1Ñ1ÜÐFÓGÐGä�%œ×!Ñ!Ø—‘“ˆä�‹;ÐrF   c                 ó˜   • / n[        U 5       H8  nUSS USS s=:X  a  S:X  a  O  O[        USS 5      nUR                  U5        M:     U$ )aÆ  Parse lists as described by RFC 2068 Section 2.

In particular, parse comma-separated lists where the elements of
the list may include quoted-strings.  A quoted-string could
contain a comma.  A non-quoted string could have quotes in the
middle.  Quotes are removed automatically after parsing.

It basically works like :func:`parse_set_header` just that items
may appear multiple times and case sensitivity is preserved.

The return value is a standard :class:`list`:

>>> parse_list_header('token, "quoted value"')
['token', 'quoted value']

To create a header from the :class:`list` again, use the
:func:`dump_header` function.

:param value: a string with a list header.
:return: :class:`list`
:rtype: list
Nr   r„   Ú")Ú_parse_list_headerÚunquote_header_valueÚappend)r®   ÚresultÚitems      rC   Úparse_list_headerrº   q  sT   € ð. €FÜ" 5Ö)ˆØ��ˆ8�t˜B˜C�yÕ' CÖ'Ü'¨¨Q¨r¨
Ó3ˆDØ�‰�dÖñ *ð €MrF   c                 ó¾   • 0 n[        U 5       HK  nSU;  a  SX'   M  UR                  SS5      u  p0U SS U SS s=:X  a  S:X  a  O  O[        U SS 5      n XU'   MM     U$ )a"  Parse lists of key, value pairs as described by RFC 2068 Section 2 and
convert them into a python dict:

>>> d = parse_dict_header('foo="is a fish", bar="as well"')
>>> type(d) is dict
True
>>> sorted(d.items())
[('bar', 'as well'), ('foo', 'is a fish')]

If there is no value for a key it will be `None`:

>>> parse_dict_header('key_without_value')
{'key_without_value': None}

To create a header from the :class:`dict` again, use the
:func:`dump_header` function.

:param value: a string with a dict header.
:return: :class:`dict`
:rtype: dict
Ú=Nr   r„   r´   )rµ   r8   r¶   )r®   r¸   r¹   r‚   s       rC   Úparse_dict_headerr½   ‘  sr   € ð, €FÜ" 5Ö)ˆØ�d‹?ØˆF‰LÙØ—j‘j  aÓ(‰ˆØ��!ˆ9˜˜b˜c˜
Õ) cÖ)Ü(¨¨q°¨Ó5ˆEØˆt‹ñ *ð €MrF   c                 ó°   • U (       aN  U S   U S   s=:X  a  S:X  a;  O  U $ U SS n U(       a	  U SS S:w  a"  U R                  SS5      R                  S	S5      $ U $ )
zÓUnquotes a header value.  (Reversal of :func:`quote_header_value`).
This does not use the real unquoting but what browsers are actually
using for quoting.

:param value: the header value to unquote.
:rtype: str
r   r„   r´   r   NrT   z\\Ú\z\")r:   )r®   Úis_filenames     rC   r¶   r¶   ´  sd   € ö ��q‘˜U 2™YÕ-¨#Õ-ð €Lð �a˜�ˆö ˜e B Q˜i¨6Ó1Ø—=‘= ¨Ó.×6Ñ6°u¸cÓBÐBØ€LrF   c                 ó\   • U  Vs0 s H  oR                   UR                  _M     nnU$ s  snf )ztReturns a key/value dictionary from a CookieJar.

:param cj: CookieJar object to extract cookies from.
:rtype: dict
)r‚   r®   )ÚcjÚcookieÚcookie_dicts      rC   Údict_from_cookiejarrÅ   Í  s.   € ñ <>Ó>º2°—;‘; §¡Ò,¹2€KÐ>ØÐùò ?s   … )c                 ó   • [        X5      $ )z²Returns a CookieJar from a key/value dictionary.

:param cj: CookieJar to insert cookies into.
:param cookie_dict: Dict of key/values to insert into CookieJar.
:rtype: CookieJar
r   )rÂ   rÄ   s     rC   Úadd_dict_to_cookiejarrÇ   Ø  s   € ô ˜{Ó/Ð/rF   c                 óZ  • [         R                  " S[        5        [        R                  " S[        R
                  S9n[        R                  " S[        R
                  S9n[        R                  " S5      nUR                  U 5      UR                  U 5      -   UR                  U 5      -   $ )zdReturns encodings from given content string.

:param content: bytestring to extract encodings from.
z¤In requests 3.0, get_encodings_from_content will be removed. For more information, please see the discussion on issue #2266. (This warning should only appear once.)z!<meta.*?charset=["\']*(.+?)["\'>])Úflagsz+<meta.*?content=["\']*;?charset=(.+?)["\'>]z$^<\?xml.*?encoding=["\']*(.+?)["\'>])r[   r\   ÚDeprecationWarningr;   Úcompiler=   Úfindall)ÚcontentÚ
charset_reÚ	pragma_reÚxml_res       rC   Úget_encodings_from_contentrÑ   ã  s‘   € ô
 ‡M‚Mð1ô 	ôô —’Ð@ÌÏÉÑM€JÜ—
’
ÐIÔQS×QUÑQUÑV€IÜ�ZŠZÐ?Ó@€Fð 	×Ñ˜7Ó#Ø
×
Ñ
˜GÓ
$ñ	%à
�.‰.˜Ó
!ñ	"ðrF   c                 óP  • U R                  S5      nUS   R                  5       USS p20 nSnU Hr  nUR                  5       nU(       d  M  USp‡UR                  S5      n	U	S:w  a*  USU	 R                  U5      nXiS-   S R                  U5      nX„UR                  5       '   Mt     X$4$ )	z–Returns content type and parameters from given header

:param header: string
:return: tuple containing content type and dictionary of
     parameters
r,   r   r   Nz"' Tr¼   r„   )r8   ÚstripÚfindÚlower)
ÚheaderÚtokensÚcontent_typeÚparamsÚparams_dictÚitems_to_stripÚparamÚkeyr®   Úindex_of_equalss
             rC   Ú_parse_content_type_headerrß   ü  s¶   € ð �\‰\˜#Ó€FØ! !™9Ÿ?™?Ó,¨f°Q°R¨j�&Ø€KØ€NãˆØ—‘“ˆßˆ5Ø �Ø#Ÿj™j¨›oˆOØ "Ó$ØÐ,˜_Ð-×3Ñ3°NÓC�Ø°Ñ1Ð3Ð4×:Ñ:¸>ÓJ�Ø',˜Ÿ	™	›Ó$ñ ð Ð$Ð$rF   c                 ó    • U R                  S5      nU(       d  g[        U5      u  pSU;   a  US   R                  S5      $ SU;   a  gSU;   a  gg)	zqReturns encodings from given HTTP Header Dict.

:param headers: dictionary to extract encoding from.
:rtype: str
zcontent-typeNÚcharsetz'"Útextz
ISO-8859-1zapplication/jsonrM   )rp   rß   rÓ   )ÚheadersrØ   rÙ   s      rC   Úget_encoding_from_headersrä     s^   € ð —;‘;˜~Ó.€LæØä5°lÓCÑ€Là�FÓØ�iÑ ×&Ñ& uÓ-Ð-à�ÓØà˜\Ó)àð *rF   c              #   ó  #   • UR                   c  U  Sh  v•N   g[        R                  " UR                   5      " SS9nU  H!  nUR                  U5      nU(       d  M  Uv •  M#     UR                  SSS9nU(       a  Uv •  gg Nm7f)zStream decodes an iterator.Nr:   ©ÚerrorsrF   T)Úfinal)ÚencodingÚcodecsÚgetincrementaldecoderÚdecode)ÚiteratorÚrÚdecoderÚchunkÚrvs        rC   Ústream_decode_response_unicoderò   .  s~   é € ð 	‡z�zÑØ×ÐØä×*Ò*¨1¯:©:Ô6¸iÑH€GÛˆØ�^‰^˜EÓ"ˆßˆ2ØŒHñ ð 
�‰˜ 4ˆÐ	(€BÞ	Ø‹ð 
ñ 	ùs   ‚B•B–ABÁ&Bc              #   ó’   #   • SnUb  US::  a  [        U 5      nU[        U 5      :  a  XX!-    v •  X!-  nU[        U 5      :  a  M  gg7f)z Iterate over slices of a string.r   N)rO   )ÚstringÚslice_lengthÚposs      rC   Úiter_slicesr÷   ?  sP   é € à
€CØÑ˜|¨qÓ0Ü˜6“{ˆØ
”�F“Ó
Ø˜3Ñ-Ð.Ò.ØÑˆð ”�F“×
ùs   ‚AAÁAc                 óH  • [         R                  " S[        5        / n[        U R                  5      nU(       a   [        U R                  U5      $  [        U R                  USS9$ ! [         a    UR                  U5         N3f = f! [         a    U R                  s $ f = f)zÊReturns the requested content back in unicode.

:param r: Response object to get unicode content from.

Tried:

1. charset from content-type
2. fall back and replace all unicode characters

:rtype: str
z£In requests 3.0, get_unicode_from_response will be removed. For more information, please see the discussion on issue #2266. (This warning should only appear once.)r:   ræ   )
r[   r\   rÊ   rä   rã   r   rÍ   ÚUnicodeErrorr·   Ú	TypeError)rî   Útried_encodingsré   s      rC   Úget_unicode_from_responserü   I  s›   € ô ‡M‚Mð1ô 	ôð €Oô )¨¯©Ó3€Hæð	-Ü�q—y‘y (Ó+Ð+ð
Ü�1—9‘9˜h¨yÑ9Ð9øô ó 	-Ø×"Ñ" 8Ö,ð	-ûô ó Ø�y‰yÒðús#   »A' ÁB Á'BÂBÂB!Â B!zBABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789-._~c                 ó’  • U R                  S5      n[        S[        U5      5       Hp  nX   SS n[        U5      S:X  aN  UR                  5       (       a9   [	        [        US5      5      nU[        ;   a  XAU   SS -   X'   M\  SX    3X'   Mg  SX    3X'   Mr     S	R                  U5      $ ! [         a    [        SU S35      ef = f)
zœUn-escape any percent-escape sequences in a URI that are unreserved
characters. This leaves all reserved, illegal and non-ASCII bytes encoded.

:rtype: str
Ú%r   r   rT   é   z"Invalid percent-escape sequence: 'Ú'NÚ )
r8   ÚrangerO   ÚisalnumÚchrr4   r7   r    ÚUNRESERVED_SETrŒ   )ÚuriÚpartsÚiÚhÚcs        rC   Úunquote_unreservedr  v  sÑ   € ð �I‰I�c‹N€EÜ�1”c˜%“jÖ!ˆØ‰H�Q�qˆMˆÜˆq‹6�Q‹;˜1Ÿ9™9Ÿ;™;ðLÜœ˜A˜r›
“O�ð ”NÓ"Ø Q™x¨¨˜|Ñ+�“à˜u™x˜j˜>�“à˜5™8˜*�~ˆE‹Hñ "ð �7‰7�5‹>Ðøô ó LÜ Ð#EÀaÀSÈÐ!JÓKÐKðLús   ÁB,Â,Cc                 ód   • SnSn [        [        U 5      US9$ ! [         a    [        XS9s $ f = f)zœRe-quote the given URI.

This function passes the given URI through an unquote/quote cycle to
ensure that it is fully and consistently quoted.

:rtype: str
z!#$%&'()*+,/:;=?@[]~z!#$&'()*+,/:;=?@[]~)Úsafe)r   r  r    )r  Úsafe_with_percentÚsafe_without_percents      rC   Úrequote_urir  Ž  sG   € ð /ÐØ0Ðð	5ô Ô'¨Ó,Ð3DÑEÐEøÜó 5ô �SÑ4Ò4ð	5ús   † ™/®/c           
      óx  • [         R                  " S[        R                  " U 5      5      S   nUR	                  S5      u  p4[         R                  " S[        R                  " [        [        U5      5      5      5      S   n[         R                  " S[        R                  " U5      5      S   U-  nX%-  Xe-  :H  $ )zßThis function allows you to check if an IP belongs to a network subnet

Example: returns True if ip = 192.168.1.1 and net = 192.168.1.0/24
         returns False if ip = 192.168.1.1 and net = 192.168.100.0/24

:rtype: bool
z=Lr   r‹   )ÚstructÚunpackÚsocketÚ	inet_atonr8   Údotted_netmaskr4   )ÚipÚnetÚipaddrÚnetaddrÚbitsÚnetmaskÚnetworks          rC   Úaddress_in_networkr  ¤  s’   € ô �]Š]˜4¤×!1Ò!1°"Ó!5Ó6°qÑ9€FØ—I‘I˜c“N�M€GÜ�mŠm˜D¤&×"2Ò"2´>Ä#ÀdÃ)Ó3LÓ"MÓNÈqÑQ€GÜ�mŠm˜D¤&×"2Ò"2°7Ó";Ó<¸QÑ?À'ÑI€GØÑ 'Ñ"3Ñ4Ð4rF   c                 ót   • SSSU -
  -  S-
  -  n[         R                  " [        R                  " SU5      5      $ )zuConverts mask from /xx format to xxx.xxx.xxx.xxx

Example: if mask is 24 function returns 255.255.255.0

:rtype: str
l   ÿÿ r   é    z>I)r  Ú	inet_ntoar  Úpack)Úmaskr  s     rC   r  r  ³  s7   € ð ˜˜b 4™i™¨1Ñ,Ñ,€DÜ×ÒœFŸKšK¨¨dÓ3Ó4Ð4rF   c                 óR   •  [         R                  " U 5        g! [         a     gf = f)z
:rtype: bool
FT)r  r  r6   )Ú	string_ips    rC   Úis_ipv4_addressr&  ¾  s.   € ðÜ×Ò˜Ô#ð øô ó Ùðús   ‚ ™
&¥&c                 ó  • U R                  S5      S:X  aU   [        U R                  S5      S   5      nUS:  d  US:”  a  g [        R
                  " U R                  S5      S   5        gg! [         a     gf = f! [         a     gf = f)zJ
Very simple check of the cidr format in no_proxy variable.

:rtype: bool
r‹   r   Fr   r   T)Úcountr4   r8   r7   r  r  r6   )Ústring_networkr#  s     rC   Úis_valid_cidrr*  É  sœ   € ð ×Ñ˜CÓ  AÓ%ð	Ü�~×+Ñ+¨CÓ0°Ñ3Ó4ˆDð �!‹8�t˜b“yØð	Ü×Ò˜^×1Ñ1°#Ó6°qÑ9Ô:ð
 ð øô ó 	Ùð	ûô ó 	Ùð	ús#   —A, Á(A< Á,
A9Á8A9Á<
B	ÂB	c              #   óZ  #   • USLnU(       a2  [         R                  R                  U 5      nU[         R                  U '    Sv •  U(       a)  Wc  [         R                  U 	 gU[         R                  U '   gg! U(       a)  Wc  [         R                  U 	 f U[         R                  U '   f f = f7f)zÂSet the environment variable 'env_name' to 'value'

Save previous value, yield, and then restore the previous value stored in
the environment variable 'env_name'.

If 'value' is None, do nothingN)rW   ro   rp   )Úenv_namer®   Úvalue_changedÚ	old_values       rC   Úset_environr/  á  sŒ   é € ð  Ð%€MÞÜ—J‘J—N‘N 8Ó,ˆ	Ø$Œ�
‰
�8Ñð1ÛæØÑ Ü—J‘J˜xÑ(à'0”—
‘
˜8Ò$ð	 øŽ=ØÑ Ü—J‘J˜xÑ(à'0”—
‘
˜8Ò$ð	 üs   ‚>B+ÁA6 Á1B+Á62B(Â(B+c                 ó*  • S nUnUc  U" S5      n[        U 5      nUR                  c  gU(       aý  S UR                  SS5      R                  S5       5       n[	        UR                  5      (       aK  U HD  n[        U5      (       a  [        UR                  U5      (       a    gM2  UR                  U:X  d  MD    g   OpUR                  nUR                  (       a  US	UR                   3-  nU H;  nUR                  R                  U5      (       d  UR                  U5      (       d  M;    g   [        SU5          [        UR                  5      nSSS5        W(       a  gg
! [        [        R                  4 a    S
n N/f = f! , (       d  f       N9= f)z@
Returns whether we should bypass proxies or not.

:rtype: bool
c                 ó¨   • [         R                  R                  U 5      =(       d-    [         R                  R                  U R                  5       5      $ ©N)rW   ro   rp   Úupper)rÝ   s    rC   Ú	get_proxyÚ(should_bypass_proxies.<locals>.get_proxy   s-   € Ü�z‰z�~‰~˜cÓ"×A¤b§j¡j§n¡n°S·Y±Y³[Ó&AÐArF   NÚno_proxyTc              3   ó6   #   • U  H  o(       d  M  Uv •  M     g 7fr2  rh   )ri   r>   s     rC   rk   Ú(should_bypass_proxies.<locals>.<genexpr>  s   é € ÐRÒ%I˜TËT—D‘DÒ%Iùs   ‚
�	Ú r  Ú,Ú:F)r   rv   r:   r8   r&  r*  r  ÚportÚendswithr/  r   rú   r  Úgaierror)	rx   r6  r4  Úno_proxy_argÚparsedÚproxy_ipÚhost_with_portr>   Úbypasss	            rC   Úshould_bypass_proxiesrD  ÷  s^  € òBð
 €LØÑÙ˜ZÓ(ˆÜ�c‹]€Fà‡�Ñàæñ S X×%5Ñ%5°c¸2Ó%>×%DÑ%DÀSÔ%IÓRˆä˜6Ÿ?™?×+Ñ+Û$�Ü  ×*Ñ*Ü)¨&¯/©/¸8×DÑDÙ#ñ Eà—_‘_¨Õ0ñ  ò %ð $Ÿ_™_ˆNØ�{�{Ø A f§k¡k ]Ð"3Ñ3�ã �Ø—?‘?×+Ñ+¨D×1Ñ1°^×5LÑ5LÈT×5RÓ5Rñ  ñ	 !ô 
�Z Õ	.ð	Ü! &§/¡/Ó2ˆF÷ 
/ö Øàøô œ6Ÿ?™?Ð+ó 	ØŠFð	ú÷	 
/Õ	.ús*   Ä:FÄ<E"Å"FÅ>FÆ FÆFÆ
Fc                 ó6   • [        XS9(       a  0 $ [        5       $ )z5
Return a dict of environment proxies.

:rtype: dict
©r6  )rD  r   )rx   r6  s     rC   Úget_environ_proxiesrG  4  s   € ô ˜S×4Øˆ	ä‹|ÐrF   c                 ó>  • U=(       d    0 n[        U 5      nUR                  c+  UR                  UR                  UR                  S5      5      $ UR                  S-   UR                  -   UR                  SUR                  -   S/nSnU H  nXQ;   d  M
  X   n  U$    U$ )z¡Select a proxy for the url, if applicable.

:param url: The url being for the request
:param proxies: A dictionary of schemes or schemes and hosts to proxy URLs
NÚallz://zall://)r   rv   rp   Úscheme)rx   ÚproxiesÚurlpartsÚ
proxy_keysÚproxyÚ	proxy_keys         rC   Úselect_proxyrP  @  s¦   € ð �m˜€GÜ˜‹}€HØ×ÑÑ Ø�{‰{˜8Ÿ?™?¨G¯K©K¸Ó,>Ó?Ð?ð 	�‰˜%Ñ (×"3Ñ"3Ñ3Ø�‰Ø�8×$Ñ$Ñ$Øð	€Jð €EÛˆ	ØÕØÑ&ˆEØà€Lñ  ð
 €LrF   c                 óD  • Ub  UO0 nU R                   n[        U5      R                  nUR                  S5      nUR	                  5       nU(       aO  [        X5S9(       dA  [        X5S9nUR                  XGR                  S5      5      nU(       a  UR                  XH5        U$ )a�  This method takes proxy information from a request and configuration
input to resolve a mapping of target proxies. This will consider settings
such as NO_PROXY to strip proxy configurations.

:param request: Request or PreparedRequest
:param proxies: A dictionary of schemes or schemes and hosts to proxy URLs
:param trust_env: Boolean declaring whether to trust environment configs

:rtype: dict
r6  rF  rI  )rx   r   rJ  rp   ÚcopyrD  rG  Ú
setdefault)	ÚrequestrK  Ú	trust_envrx   rJ  r6  Únew_proxiesÚenviron_proxiesrN  s	            rC   Úresolve_proxiesrX  Z  sˆ   € ð !Ñ,‰g°"€GØ
�+‰+€CÜ�c‹]×!Ñ!€FØ�{‰{˜:Ó&€HØ—,‘,“.€KæÔ.¨s×FÜ-¨cÑEˆà×#Ñ# F×,?Ñ,?ÀÓ,FÓGˆæØ×"Ñ" 6Ô1ØÐrF   c                 ó   • U  S[          3$ )zC
Return a string representing the default user agent.

:rtype: str
r‹   r   )r‚   s    rC   Údefault_user_agentrZ  u  s   € ð ˆV�1”[�MÐ"Ð"rF   c                  ó:   • [        [        5       [        SSS.5      $ )z1
:rtype: requests.structures.CaseInsensitiveDict
z*/*z
keep-alive)z
User-AgentzAccept-EncodingÚAcceptÚ
Connection)r"   rZ  ÚDEFAULT_ACCEPT_ENCODINGrh   rF   rC   Údefault_headersr_  ~  s%   € ô ä,Ó.Ü6ØØ&ñ		
óð rF   c                 óÖ  • / nSnU R                  U5      n U (       d  U$ [        R                  " SU 5       HŠ  n UR                  SS5      u  pESUR                  S5      0nUR                  S5       H9  n UR                  S5      u  p€U R                  U5      XhR                  U5      '   M;     UR	                  U5        MŒ     U$ ! [         a    USpT N‡f = f! [         a       M8  f = f)	z°Return a list of parsed link headers proxies.

i.e. Link: <http:/.../front.jpeg>; rel=front; type="image/jpeg",<http://.../back.jpeg>; rel=back;type="image/jpeg"

:rtype: list
z '"z, *<r,   r   r  rx   z<> '"r¼   )rÓ   r;   r8   r7   r·   )	r®   ÚlinksÚreplace_charsÚvalrx   rÙ   ÚlinkrÜ   rÝ   s	            rC   Úparse_header_linksre  Œ  sé   € ð €Eà€Mà�K‰K˜Ó&€EÞØˆä�xŠx˜ Ö&ˆð	"ØŸ)™) C¨Ó+‰KˆCð �s—y‘y Ó*Ð+ˆà—\‘\ #Ö&ˆEðØ"Ÿ[™[¨Ó-‘
�ð .3¯[©[¸Ó-GˆD—‘˜=Ó)Ó*ñ 'ð 	�‰�TÖñ! 'ð$ €Løô ó 	"Ø˜r’ð	"ûô ó Ûðús#   ºCÁ6CÃCÃCÃ
C(Ã'C(Ú ÚasciirT   é   c                 ó¤  • U SS nU[         R                  [         R                  4;   a  gUSS [         R                  :X  a  gUSS [         R                  [         R
                  4;   a  gUR                  [        5      nUS:X  a  g	US:X  a"  USSS2   [        :X  a  g
USSS2   [        :X  a  gUS:X  a  USS [        :X  a  gUSS [        :X  a  gg)z
:rtype: str
Né   zutf-32rh  z	utf-8-sigrT   zutf-16r   rM   z	utf-16-ber   z	utf-16-lez	utf-32-bez	utf-32-le)
rê   ÚBOM_UTF32_LEÚBOM_UTF32_BEÚBOM_UTF8ÚBOM_UTF16_LEÚBOM_UTF16_BEr(  Ú_nullÚ_null2Ú_null3)ÚdataÚsampleÚ	nullcounts      rC   Úguess_json_utfrv  ·  sÕ   € ð �"�1ˆX€FØ”&×%Ñ%¤v×':Ñ':Ð;Ó;ØØˆbˆq€z”V—_‘_Ó$ØØˆbˆq€z”f×)Ñ)¬6×+>Ñ+>Ð?Ó?ØØ—‘œUÓ#€IØ�Aƒ~ØØ�Aƒ~Ø‘#�A�#‰;œ&Ó ØØ�!�$�Q�$‰<œ6Ó!Øà�Aƒ~Ø�"�1ˆ:œÓØØ�!�"ˆ:œÓØàrF   c                 ó´   • [        U 5      nUu  p4pVpxn	UR                  n
U
(       d  XzpzU(       a  SR                  XJ/5      n
Uc  UnUc  Sn[        X:USX‰45      $ )zžGiven a URL that may or may not have a scheme, prepend the given scheme.
Does not replace a present scheme with the one provided as an argument.

:rtype: str
Ú@r  )r   ÚnetlocrŒ   r   )rx   Ú
new_schemer@  rJ  Úauthr>   r<  rr   ÚqueryÚfragmentry  s              rC   Úprepend_scheme_if_neededr~  ×  sk   € ô �s‹^€FØ6<Ñ3€F�$˜d¨8ð �]‰]€FÞØ�æð —‘˜4˜.Ó)ˆØ�~ØˆØ�|Øˆä�v t¨R°ÐAÓBÐBrF   c                 ó¤   • [        U 5      n [        UR                  5      [        UR                  5      4nU$ ! [        [
        4 a    Sn U$ f = f)zoGiven a url with authentication components, extract them into a tuple of
username,password.

:rtype: (str,str)
)r  r  )r   r   ÚusernameÚpasswordr_   rú   )rx   r@  r{  s      rC   Úget_auth_from_urlr‚  ô  sU   € ô �c‹]€FðÜ˜Ÿ™Ó(¬'°&·/±/Ó*BÐCˆð €Køô œIÐ&ó Ø‰à€Kðús   �*9 ¹AÁAc                 ó<   • U u  p[        XS5        [        XS5        g)z›Verifies that header parts don't contain leading whitespace
reserved characters, or return characters.

:param header: tuple, in the format (name, value).
r   r   N)Ú_validate_header_part)rÖ   r‚   r®   s      rC   Úcheck_header_validityr…    s   € ð �K€DÜ˜&¨Ô*Ü˜&¨Õ+rF   c           
      ó   • [        U[        5      (       a
  [        U   nO=[        U[        5      (       a
  [        U   nO[        SU< SU  S[        U5       35      eUR                  U5      (       d  US:X  a  SOSn[        SU SU< 35      eg )	NzHeader part (z) from z# must be of type str or bytes, not r   r‚   r®   zTInvalid leading whitespace, reserved character(s), or return character(s) in header z: )rU   r   r   r   r
   r   Útyper<   )rÖ   Úheader_partÚheader_validator_indexÚ	validatorÚheader_kinds        rC   r„  r„    s©   € Ü�+œs×#Ñ#Ü*Ð+AÑB‰	Ü	�K¤×	'Ñ	'Ü+Ð,BÑC‰	äØ˜K™?¨'°&°ð :1Ü15°kÓ1BÐ0CðEó
ð 	
ð
 �?‰?˜;×'Ñ'Ø 6¸!Ó ;‘fÀˆÜð&Ø&1 ]°"°[±OðEó
ð 	
ð (rF   c                 óz   • [        U 5      u  pp4pVU(       d  X2p2UR                  SS5      S   n[        XX4US45      $ )zK
Given a url remove the fragment and the authentication part.

:rtype: str
rx  r   r„   r  )r   Úrsplitr   )rx   rJ  ry  rr   rÙ   r|  r}  s          rC   ÚurldefragauthrŽ  "  sG   € ô 5=¸S³MÑ1€F�D %ö Ø�à�]‰]˜3 Ó" 2Ñ&€Fä�v t°U¸BÐ?Ó@Ð@rF   c                 óä   • [        U R                  SS5      nUb3  [        U R                  [        5      (       a   U" U R                  5        g[        S5      e! [
         a    [        S5      ef = f)z^Move file pointer back to its recorded starting position
so it can be read again on redirect.
rS   Nz;An error occurred when rewinding request body for redirect.z+Unable to rewind request body for redirect.)r†   ÚbodyrU   Ú_body_positionr   r6   r!   )Úprepared_requestÚ	body_seeks     rC   Úrewind_bodyr”  3  sy   € ô Ð(×-Ñ-¨v°tÓ<€IØÑ¤Ø×'Ñ'¬÷"ñ "ð	ÙÐ&×5Ñ5Õ6ô $Ð$QÓRÐRøô ó 	Ü'ØMóð ð	ús   »A ÁA/)Fr2  )T)zpython-requests)jÚ__doc__rê   Ú
contextlibr]   rW   r;   r  r  Úsysr‘   r[   r�   Úcollectionsr   Úurllib3.utilr   r   r  r   r	   Ú_internal_utilsr
   r   r   r   Úcompatr   r   r   r   r   r   r   rµ   r   r   r   r   r   r   r   Úcookiesr   Ú
exceptionsr   r   r    r!   Ú
structuresr"   rq   ÚwhereÚDEFAULT_CA_BUNDLE_PATHÚDEFAULT_PORTSrŒ   r8   r^  ÚplatformrD   rK   rd   r€   r‰   r�   Úcontextmanagerr“   r¯   r²   rº   r½   r¶   rÅ   rÇ   rÑ   rß   rä   rò   r÷   rü   Ú	frozensetr  r  r  r  r  r&  r*  r/  rD  rG  rP  rX  rZ  r_  re  rV   rp  rq  rr  rv  r~  r‚  r…  r„  rŽ  r”  rh   rF   rC   Ú<module>r¥     s  ðñó Û Û 	Û 	Û 	Û Û Û 
Û Û Û Ý #ç 0å Ý $÷ó ÷÷ õ :÷÷ ñ õ )÷ó õ ,à"€àŸš›Ð à cÑ*€ð Ÿ)™)Ø‡H‚HˆW‘l°4Ñ8Ð9JÑKÓLóÐ ð
 ‡<�<�7Óò$òL	/òòB3ôJ0òf&ò"ðJ ×Ññ	ó ð	òò6ò<ò@ôFò2ò0òò2%ò2ò2ò"ò$ñP ØMó€ò
ò05ò,5ò5òòð0 ×Ññ1ó ð1ò*:ôz	òô4ô6#òò"ðL 	�‰�gÓ€Ø	�‰€Ø	�‰€òò@Cò:ò ,ò
ò&Aó"SrF   