Ë
    x[h—˜  ã                   ó¾  — d dl Z d dlZd dlZd dlZd dlZd dlZd dlZd dlZd dlm	Z	m
Z
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mZmZmZmZmZmZmZ d d	l m!Z!m"Z"m#Z#m$Z$ d dl%Z%d d
l%m&Z& d dl'm(Z(m)Z)m*Z*  ejV                  e,«      Z-dZ.eedge/f      Z0d„ Z1d„ Z2de3fd„Z4dKde5de6de7ddfd„Z8de5ddfd„Z9ded   fd„Z: G d„ d«      Z; G d„ de;«      Z< G d„ de;«      Z= G d „ d!«      Z> G d"„ de?«      Z@d#„ ZAd$e5de6fd%„ZBdd&œd'e@d(e0dee6   fd)„ZCddd d*ddddd+d+ddd,d+d-d,d.œd(e0d/e/de>fd0„ZD	 dLd1ed2ef   d3e5de3d4ejŠ                  d5ee6   defd6„ZF	 	 dMd1ed2ef   d8ee5   d9e6de3deee5   ee>   f   f
d:„ZG G d;„ d<e«      ZH e6d=«      de-j’                  dddddd-d+d7d>œd?e6dee6   d@edAee   dBee6   d(e0dCeeee6ge6f      dDe5dEe/dFe6fdG„ZJ G dH„ dI«      ZK	 dLdJ„ZLy)Né    N)ÚThreadPoolExecutorÚTimeoutErrorÚas_completed)Ú	parsedate)Úpartial)Ú	NOT_FOUND)Úcount)Úcreate_default_context)	ÚAnyÚCallableÚIteratorÚListÚMappingÚ
NamedTupleÚOptionalÚTupleÚUnion)ÚquoteÚurlparseÚurlsplitÚ
urlunparse)Ú
exceptions)ÚperformanceÚutilÚversionÚREDACTEDÚUrlErrorc                 ór   — t        t        | d¬«      «      }|d   s|d   r|d   |d<   d|d<   t        |«      S )NÚhttp)Úschemeé   é   Ú )Úlistr   r   )ÚurlÚ
parsed_urls     ú6/usr/lib/python3/dist-packages/cloudinit/url_helper.pyÚ	_cleanurlr(   1   sC   € Ü”h˜s¨6Ô2Ó3€JØ�aŠ=˜Z¨š]ð # 1™ˆ
�1‰Øˆ
�1‰Ü�jÓ!Ð!ó    c                 ó0   — d„ }| }|D ]  } |||«      }Œ |S )Nc                 ó¶   — t        t        | «      «      }|d   }|r|j                  d«      s|dz  }|t        t	        |«      d¬«      z  }||d<   t        |«      S )Nr"   ú/z/:)Úsafe)r$   r   Úendswithr   Ústrr   )r%   Úadd_onÚ
url_parsedÚpaths       r'   Úcombine_singlez#combine_url.<locals>.combine_single<   sY   € Üœ( 3›-Ó(ˆ
Ø˜!‰}ˆÙ˜Ÿ™ cÔ*Ø�C‰KˆDØ””c˜&“k¨Ô-Ñ-ˆØˆ
�1‰Ü˜*Ó%Ð%r)   © )ÚbaseÚadd_onsr3   r%   r0   s        r'   Úcombine_urlr7   ;   s.   € ò&ð €CØò *ˆÙ˜S &Ó)‰ð*à€Jr)   Úreturnc           
      ó8  — t         j                  dt         j                  dt         j                  dt         j                  dt
        di}|j                  t        | «      «      }|s5t        | t        «      r| j                  }|S t        j                  d«       d}|S )z4helper for read_ftps to map return codes to a numberé,  é�  éô  iX  i¼  z9Unexpected exception type while connecting to ftp server.i�ÿÿÿ)ÚftplibÚerror_replyÚ
error_tempÚ
error_permÚerror_protoÚEOFErrorÚgetÚtypeÚ
isinstanceÚOSErrorÚerrnoÚLOGÚwarning)ÚexcÚftp_error_codesÚcodes      r'   Ú"ftp_get_return_code_from_exceptionrM   K   sŒ   € ô 	×Ñ˜CÜ×Ñ˜3Ü×Ñ˜3Ü×Ñ˜CÜ�#ð€Oð ×Ñœt C›yÓ)€DÙÜ�cœ7Ô#Ø—9‘9ˆDð €Kô	 �K‰KØKôð ˆDØ€Kr)   r%   ÚtimeoutÚkwargsÚFtpResponsec           	      óL  — t        | «      }|j                  st        dt        d| ¬«      ‚t	        j
                  «       5 }|j                  xs d}|j                  xs d}d|j                  k(  �rH	 t        j                  t        «       ¬«      }t        j                  d| |«       |j                  |j                  ||xs d	¬
«       t        j                  d|«       	 |j#                  ||j$                  xs d¬«       t        j                  d«       |j'                  «        	 t        j                  d|j,                  «       |j/                  d|j,                  › �|j0                  ¬«       t3        |j5                  «       | «      t        j                  d«       |j7                  «        cddd«       S 	 t        j8                  «       }
t        j                  d| |«       |
j                  |j                  ||xs d	¬
«       t        j                  d|«       |
j#                  ||j$                  xs d¬«       t        j                  d|j,                  «       |
j/                  d|j,                  › �|j0                  ¬«       t3        |j5                  «       | «      t        j                  d«       |
j7                  «        cddd«       S # t        j                  $ r'}t!        |«      }	t        d| › d|	› d�|	d| ¬«      |‚d}~ww xY w# t        j(                  $ r*}t        j+                  d«       t        ddd| ¬«      |‚d}~ww xY w# t        j                  $ r'}t!        |«      }	t        d| › d|	› d�|	d| ¬«      |‚d}~ww xY w# t        j                  d«       |j7                  «        w xY w# t        j                  $ r'}t!        |«      }	t        d| › d|	› d�|	d| ¬«      |‚d}~ww xY w# t        j                  d«       
j7                  «        w xY w# 1 sw Y   yxY w)az  connect to URL using ftp over TLS and read a file

    when using strict mode (ftps://), raise exception in event of failure
    when not using strict mode (ftp://), fall back to using unencrypted ftp

    url: string containing the desination to read a file from. The url is
        parsed with urllib.urlsplit to identify username, password, host,
        path, and port in the following format:
            ftps://[username:password@]host[:port]/[path]
        host is the only required component
    timeout: maximum time for the connection to take
    kwargs: unused, for compatibility with read_url
    returns: UrlResponse
    zInvalid url providedN©ÚcauserL   Úheadersr%   é   Ú	anonymousÚftps)Úcontextz3Attempting to connect to %s via port [%s] over tls.ç      @)ÚhostÚportrN   z1Reading file from server over tls failed for url z [ú]z"Attempting to login with user [%s]r#   )ÚuserÚpasswdzCreating a secure connectionzšAttempted to connect to an insecure ftp server but used a scheme of ftps://, which is not allowed. Use ftp:// to allow connecting to insecure ftp servers.r<   zReading file: %szRETR )ÚcallbackzClosing connectionz,Reading file from ftp server failed for url z(Attempting to connect to %s via port %s.)r   Úhostnamer   r   ÚioÚBytesIOr[   Úusernamer    r=   ÚFTP_TLSr
   rH   ÚdebugÚconnectÚ
all_errorsrM   ÚloginÚpasswordÚprot_pr@   rI   r2   Ú
retrbinaryÚwriterP   ÚgetvalueÚcloseÚFTP)r%   rN   rO   Ú	url_partsÚbufferr[   r]   Úftp_tlsÚerL   Úftps              r'   Ú	read_ftpsru   b   s   € ô  ˜“€IØ×ÒÜØ(¬yÀ$ÈCô
ð 	
ô 
�‰‹ð j˜Ø�~‰~Ò# ˆØ×!Ñ!Ò0 [ˆØ�Y×%Ñ%Ó%ðÜ Ÿ.™.Ü2Ó4ô�ô —	‘	ØIØØôð
 —‘Ø"×+Ñ+ØØ#šN sð  ô ô  �I‰IÐ:¸DÔAðØ—‘ØØ$×-Ñ-Ò3°ð ô ô —	‘	Ð8Ô9Ø—‘Ô ð" Ü—	‘	Ð,¨i¯n©nÔ=Ø×"Ñ"Ø˜IŸN™NÐ+Ð,°v·|±|ð #ô ô # 6§?¡?Ó#4°cÓ:ô —	‘	Ð.Ô/Ø—‘”÷Sjñ jðVÜ—j‘j“l�Ü—	‘	Ø>ÀÀTôð —‘Ø"×+Ñ+ØØ#šN sð ô ô
 —	‘	Ð>ÀÔEØ—	‘	ØØ$×-Ñ-Ò3°ð ô ô —	‘	Ð,¨i¯n©nÔ=Ø—‘  y§~¡~Ð&6Ð7À&Ç,Á,�ÔOÜ" 6§?¡?Ó#4°cÓ:ô —	‘	Ð.Ô/Ø—	‘	”÷Ujñ jøô$ ×$Ñ$ò 
Ü9¸!Ó<�Üð*Ø*-¨¨b°°°að9ð Ø Øôð ðûð
ûô& ×$Ñ$ò Ü—‘ðCôô
 ðNð Ø Øô	ð ð	ûðûô. ×$Ñ$ò 
Ü9¸!Ó<�Üð+Ø+.¨%¨r°$°°qð:ð Ø Øôð ðûð
ûô —	‘	Ð.Ô/Ø—‘•ûô( ×$Ñ$ò 
Ü9¸!Ó<�Üð+Ø+.¨%¨r°$°°qð:ð Ø Øôð ðûð
ûô —	‘	Ð.Ô/Ø—	‘	•ú÷Ujð jús±   ¿1PÁ1AKÃPÃALÄ&A#MÆ	%PÆ9C'N3Ê %PËL	Ë""LÌL	Ì	PÌM	Ì%MÍM	Í	PÍNÍ"NÎNÎN	Î	'N0Î0PÎ3O-Ï"O(Ï(O-Ï-O0Ï0'PÐPÐP#r2   ÚFileResponsec                 ó*  — |j                  d«      rt        j                  d| «       	 t        j                  | «      }t        || «      S # t        $ r}t        |t        d| ¬«      |‚d}~wt        $ r}t        ||j                  d| ¬«      |‚d}~ww xY w)zmread a binary file and return a FileResponse

    matches function signature with read_ftps and read_url
    Údataz'Unable to post data to file resource %sNrR   )rC   rH   rI   r   Úload_binary_filerv   ÚFileNotFoundErrorr   r   ÚIOErrorrG   )r2   rO   Úcontentsrs   s       r'   Ú
_read_filer}   ä   sˆ   € ð
 ‡z�z�&ÔÜ�‰Ð=¸tÔDðMÜ×(Ñ(¨Ó.ˆÜ˜H dÓ+Ð+øÜò OÜ˜Q¤Y¸À$ÔGÈQÐNûÜò MÜ˜Q Q§W¡W°dÀÔEÈ1ÐLûðMús#   © A
 Á
	BÁA'Á'BÁ3BÂB)rv   ÚUrlResponserP   c                 ó^  — | j                  «       } 	 t        | «      }|j                  }|dk(  s
| rd| d   k(  rt        |j                  fi |¤ŽS |dv rt        | fi |¤ŽS |dv rt        | fi |¤ŽS t        j                  d|«       t        | fi |¤ŽS # t        $ r}t        || ¬«      |‚d}~ww xY w)	a0  Wrapper function around readurl to allow passing a file path as url.

    When url is not a local file path, passthrough any kwargs to readurl.

    In the case of parameter passthrough to readurl, default values for some
    parameters. See: call-signature of readurl in this module for param docs.
    )rS   r%   NÚfiler,   r   )rt   rW   )r   ÚhttpszAttempting unknown protocol %s)Úlstripr   Ú
ValueErrorr   r    r}   r2   ru   ÚreadurlrH   rI   )r%   rO   Úparsedrs   r    s        r'   Úread_file_or_urlr†   ô   sÁ   € ð �*‰*‹,€Cð0Ü˜#“ˆð �]‰]€FØ�Ò™C C¨3¨q©6¢MÜ˜&Ÿ+™+Ñ0¨Ñ0Ð0Ø	�?Ñ	"Ü˜Ñ' Ñ'Ð'Ø	Ð$Ñ	$Ü�sÑ%˜fÑ%Ð%ä�‰Ð4°fÔ=Ü�sÑ%˜fÑ%Ð%øô ò 0Ü˜Q CÔ(¨aÐ/ûð0ús   ’B Â	B,ÂB'Â'B,c                   ó    — e Zd Zdd„Zd„ Zd„ Zy)ÚStringResponsec                 ó<   — || _         i | _        || _        || _        y ©N)rL   rT   r|   r%   )Úselfr|   r%   rL   s       r'   Ú__init__zStringResponse.__init__  s   € ØˆŒ	ØˆŒØ ˆŒØˆ�r)   c                 ó    — | j                   dk(  S )NéÈ   ©rL   ©r‹   ÚargsrO   s      r'   ÚokzStringResponse.ok  s   € Ø�y‰y˜CÑÐr)   c                 ó8   — | j                   j                  d«      S )Nzutf-8)r|   Údecode©r‹   s    r'   Ú__str__zStringResponse.__str__  s   € Ø�}‰}×#Ñ# GÓ,Ð,r)   N©rŽ   )Ú__name__Ú
__module__Ú__qualname__rŒ   r’   r–   r4   r)   r'   rˆ   rˆ     s   „ óò ó-r)   rˆ   c                   ó*   ‡ — e Zd Zddedefˆ fd„Zˆ xZS )rv   r|   r%   c                 ó*   •— t         ‰| �  |||¬«       y )Nr�   ©ÚsuperrŒ   )r‹   r|   r%   rL   Ú	__class__s       €r'   rŒ   zFileResponse.__init__!  s   ø€ Ü‰Ñ˜ 3¨TÐÕ2r)   r—   ©r˜   r™   rš   Úbytesr/   rŒ   Ú__classcell__©rŸ   s   @r'   rv   rv      s   ø„ ñ3 ð 3¨S÷ 3ñ 3r)   c                   ó(   ‡ — e Zd Zdedefˆ fd„Zˆ xZS )rP   r|   r%   c                 ó&   •— t         ‰| �  ||«       y rŠ   r�   )r‹   r|   r%   rŸ   s      €r'   rŒ   zFtpResponse.__init__&  s   ø€ Ü‰Ñ˜ 3Õ'r)   r    r£   s   @r'   rP   rP   %  s   ø„ ð( ð (¨S÷ (ñ (r)   c                   ó¶   — e Zd Zdej                  fd„Zedefd„«       Zede	fd„«       Z
ddefd„Zed„ «       Zedefd„«       Zd	„ Z	 dd
ee   dedee   fd„Zy)r~   Úresponsec                 ó   — || _         y rŠ   )Ú	_response)r‹   r§   s     r'   rŒ   zUrlResponse.__init__+  s	   € Ø!ˆ�r)   r8   c                 ó\   — | j                   j                  €y| j                   j                  S )Nr)   )r©   Úcontentr•   s    r'   r|   zUrlResponse.contents.  s%   € à�>‰>×!Ñ!Ð)ØØ�~‰~×%Ñ%Ð%r)   c                 ó.   — | j                   j                  S rŠ   )r©   r%   r•   s    r'   r%   zUrlResponse.url4  s   € à�~‰~×!Ñ!Ð!r)   c                 ó@   — d}|rd}d| j                   cxk  r|k  ry yy)Nr:   r;   rŽ   TFr�   )r‹   Úredirects_okÚuppers      r'   r’   zUrlResponse.ok8  s-   € ØˆÙØˆEØ�$—)‘)Ô#˜eÒ#Øð $ñ r)   c                 ó.   — | j                   j                  S rŠ   )r©   rT   r•   s    r'   rT   zUrlResponse.headersA  s   € à�~‰~×%Ñ%Ð%r)   c                 ó.   — | j                   j                  S rŠ   )r©   Ústatus_coder•   s    r'   rL   zUrlResponse.codeE  s   € à�~‰~×)Ñ)Ð)r)   c                 ó.   — | j                   j                  S rŠ   )r©   Útextr•   s    r'   r–   zUrlResponse.__str__I  s   € Ø�~‰~×"Ñ"Ð"r)   Ú
chunk_sizeÚdecode_unicodec              #   óX   K  — | j                   j                  ||«      E d{  –—†  y7 Œ­w)at  Iterates over the response data.

        When stream=True is set on the request, this avoids reading the content
        at once into memory for large responses.

        :param chunk_size: Number of bytes it should read into memory.
        :param decode_unicode: If True, content will be decoded using the best
        available encoding based on the response.
        N)r©   Úiter_content)r‹   rµ   r¶   s      r'   r¸   zUrlResponse.iter_contentL  s"   è ø€ ð —>‘>×.Ñ.¨z¸>ÓJ×JÒJús   ‚ *¢(£*N)F)r!   F)r˜   r™   rš   ÚrequestsÚResponserŒ   Úpropertyr¡   r|   r/   r%   Úboolr’   rT   ÚintrL   r–   r   r   r¸   r4   r)   r'   r~   r~   *  sº   „ ð" ×!2Ñ!2ó "ð ð&˜%ò &ó ð&ð
 ð"�Sò "ó ð"ñ¨ó ð ñ&ó ð&ð ð*�cò *ó ð*ò#ð EJñKØ" 3™-ðKØ=AðKà	�%‰ôKr)   r~   c            
       ó>   — e Zd Z	 	 	 ddedee   dee   dee   fd„Zy)r   NrS   rL   rT   r%   c                 ó‚   — t         j                  | t        |«      «       || _        || _        |€i n|| _        || _        y rŠ   )r{   rŒ   r/   rS   rL   rT   r%   )r‹   rS   rL   rT   r%   s        r'   rŒ   zUrlError.__init__\  s:   € ô 	×Ñ˜œs 5›zÔ*ØˆŒ
ØˆŒ	Ø&- o¡¸7ˆŒØˆ�r)   )NNN)	r˜   r™   rš   r   r   r½   r   r/   rŒ   r4   r)   r'   r   r   [  sE   „ ð #Ø%)Ø!ñàðð �s‰mðð ˜'Ñ"ð	ð
 �c‰]ôr)   c                 óÈ   — i }t        | «      j                  }|dk(  rE|rCd|v r|d   r	|d   |d<   nd|d<   d|v rd|v r|d   |d   g|d<   |S d|v rt        |d   «      |d<   |S )Nr�   Úca_certsÚverifyTÚ	cert_fileÚkey_fileÚcert)r   r    r/   )r%   Ússl_detailsÚssl_argsr    s       r'   Ú_get_ssl_argsrÈ   j  s�   € Ø€HÜ�c‹]×!Ñ!€FØ�Ò™[Ø˜Ñ$¨°ZÒ)@Ø!,¨ZÑ!8ˆH�XÒà!%ˆH�XÑØ˜+Ñ%¨*¸Ñ*Cà˜KÑ(Ø˜JÑ'ð ˆH�VÑð €Oð ˜KÑ'Ü" ;¨{Ñ#;Ó<ˆH�VÑØ€Or)   Úretry_afterc                 ó^  — 	 t        | «      }|S # t        $ r” 	 t        | «      }|st        d«      ‚t        t        j                  |«      t        j                  «       z
  «      }n'# t        $ r t
        j                  d| «       d}Y nw xY w|dk  rt
        j                  d«       d}Y |S w xY w)a<  Parse a Retry-After header value into an integer.

    : param retry_after: The value of the Retry-After header.
        https://www.rfc-editor.org/rfc/rfc9110.html#section-10.2.3
        https://www.rfc-editor.org/rfc/rfc2616#section-3.3
    : return: The number of seconds to wait before retrying the request.
    z(Failed to parse Retry-After header valuezGFailed to parse Retry-After header value: %s. Waiting 1 second instead.r!   r   zBRetry-After header value is in the past. Waiting 1 second instead.)Úfloatrƒ   r   ÚtimeÚmktimerH   Úinfo)rÉ   Úto_waitÚ
time_tuples      r'   Ú_get_retry_afterrÑ   |  s¶   € ðÜ˜Ó$ˆð, €Nøô+ ò ð	Ü" ;Ó/ˆJÙÜ Ð!KÓLÐLÜœDŸK™K¨
Ó3´d·i±i³kÑAÓB‰GøÜò 	Ü�H‰Hð,àôð
 ŠGð	úð �QŠ;Ü�H‰Hð,ôð ˆGøØ€Nð+ús3   ‚ �	B,™AA%Á$B,Á%!B	ÂB,ÂB	Â	B,Â+B,©Úexception_cbÚerrorrÓ   c                ó  — |r	 || «      ry| j                   rk| j                   dk(  r\t        j                  d«       | j                  r%t	        | j                  j                  dd«      «      S t        j                  d«       y|sy| ‚)aÖ  Handle exceptions raised during request processing.

    If we have no exception callback or the callback handled the error or we
    got a 503, return with an optional timeout so the request can be retried.
    Otherwise, raise the error.

    :param error: The exception raised during the request.
    :param response: The response object.
    :param exception_cb: Callable to handle the exception.

    :return: Optional time to wait before retrying the request.
    Ni÷  zEEndpoint returned a 503 error. HTTP endpoint is overloaded. Retrying.zRetry-AfterÚ1z7Unable to introspect response header. Waiting 1 second.r!   )rL   rH   rI   rT   rÑ   rC   rÎ   )rÔ   rÓ   s     r'   Ú_handle_errorr×   ž  st   € ñ" ™ UÔ+ØØ‡z‚z�e—j‘j CÒ'Ü�‰ð5ô	
ð �=Š=Ü# E§M¡M×$5Ñ$5°mÀSÓ$IÓJÐJÜ�‰ÐJÔKØÙØà
€Kr)   r!   TFr#   )rx   rN   ÚretriesÚsec_betweenrT   Ú
headers_cbÚheaders_redactrÆ   Úcheck_statusÚallow_redirectsrÓ   ÚsessionÚinfiniteÚlog_req_respÚrequest_methodÚstreamrâ   c          	      ó:  — t        | «      } | |dœ}|j                  t        | |«      «       |
|d<   |s|rdnd}||d<   |�.t        |t        «      r||d<   nt        t        |«      d«      |d<   |€g }d	}|rt        t        |«      d	z   d	«      }d
t        j                  «       z  }|�|j                  «       }ni }|r||d<   |€d}|€t        j                  «       }t        «       D �]  }|r || «      }d|vr||d<   ||d<   i }|j                  «       D ]g  \  }}|dk(  rŒ|dk(  rR|rP|D �cg c]  }|j                  |«      sŒ|‘Œ }}|sŒ7t        j                   |«      |<   |D ]  }t"        ||   |<   Œ Œc|||<   Œi 	 |rt$        j'                  d||rdn|| |«        |j(                  di |¤Ž}|	r|j+                  «        t$        j'                  d| |j,                  t/        |j0                  «      |d	z   «       t3        |«      c S  tI        d«      ‚c c}w # t4        j6                  $ r}t9        || ¬«      |‚d}~wt4        j:                  $ rC}t9        ||j<                  j,                  |j<                  j>                  | ¬«      }|}Y d}~n4d}~wt4        j@                  $ r}t9        || ¬«      }|}d}Y d}~nd}~ww xY wtC        ||¬«      }|s|xs |d	z   |k  }|s||‚|xs |} |dkD  s�Œ	|rt$        j'                  d|«       tE        jF                  | «       �Œ8)a`  Wrapper around requests.Session to read the url and retry if necessary

    :param url: Mandatory url to request.
    :param data: Optional form data to post the URL. Will set request_method
        to 'POST' if present.
    :param timeout: Timeout in seconds to wait for a response. May be a tuple
        if specifying (connection timeout, read timeout).
    :param retries: Number of times to retry on exception if exception_cb is
        None or exception_cb returns True for the exception caught. Default is
        to fail with 0 retries on exception.
    :param sec_between: Default 1: amount of seconds passed to time.sleep
        between retries. None or -1 means don't sleep.
    :param headers: Optional dict of headers to send during request
    :param headers_cb: Optional callable returning a dict of values to send as
        headers during request
    :param headers_redact: Optional list of header names to redact from the log
    :param ssl_details: Optional dict providing key_file, ca_certs, and
        cert_file keys for use on in ssl connections.
    :param check_status: Optional boolean set True to raise when HTTPError
        occurs. Default: True.
    :param allow_redirects: Optional boolean passed straight to Session.request
        as 'allow_redirects'. Default: True.
    :param exception_cb: Optional callable to handle exception and returns
        True if retries are permitted.
    :param session: Optional exiting requests.Session instance to reuse.
    :param infinite: Bool, set True to retry indefinitely. Default: False.
    :param log_req_resp: Set False to turn off verbose debug messages.
    :param request_method: String passed as 'method' to Session.request.
        Typically GET, or POST. Default: POST if data is provided, GET
        otherwise.
    :param stream: if False, the response content will be immediately
    downloaded.
    )r%   râ   rÝ   ÚPOSTÚGETÚmethodNrN   r   r!   zCloud-Init/%srx   éÿÿÿÿz
User-AgentrT   z'[%s/%s] open '%s' with %s configurationrß   z(Read from %s (%s, %sb) after %s attempts)r%   ©rL   rT   r%   rÒ   ú1Please wait %s seconds while we wait to try againz"This path should be unreachable...r4   )%r(   ÚupdaterÈ   rE   ÚtupleÚmaxrË   r½   r   Úversion_stringÚcopyr¹   ÚSessionr	   ÚitemsrC   Údeepcopyr   rH   re   ÚrequestÚraise_for_statusr²   Úlenr«   r~   r   ÚSSLErrorr   Ú	HTTPErrorr§   rT   ÚRequestExceptionr×   rÌ   ÚsleepÚRuntimeError)!r%   rx   rN   rØ   rÙ   rT   rÚ   rÛ   rÆ   rÜ   rÝ   rÓ   rÞ   rß   rà   rá   râ   Úreq_argsÚmanual_triesÚ
user_agentÚiÚfiltered_req_argsÚkÚvÚmatched_headersÚkeyr§   rs   Ú	url_errorÚraised_exceptionÚresponse_sleep_timeÚ
will_retryÚ
sleep_times!                                    r'   r„   r„   À  sg  € ôj �C‹.€CàØñ€Hð ‡O�O”M # {Ó3Ô4Ø"1€HÐÑÙÙ#'™¨UˆØ'€HˆXÑØÐÜ�gœuÔ%Ø")ˆH�YÒä"%¤e¨G£n°aÓ"8ˆH�YÑØÐØˆØ€LÙÜœ3˜w›<¨!Ñ+¨QÓ/ˆà ¤G×$:Ñ$:Ó$<Ñ=€JØÐØ—,‘,“.‰àˆáØˆ�ÑØÐØˆà€Ü×"Ñ"Ó$ˆô ‹Wó Q#ˆÙÙ  “oˆGà˜wÑ&Ø$.ˆG�LÑ!à%ˆ�ÑØÐØ—N‘NÓ$ò 
	)‰DˆAˆqØ�FŠ{ØØ�IŠ~¡.Ø.<Ö"I¨ÀÇÁÀaÅ¢1Ð"I�Ð"IÚ"Ü+/¯=©=¸Ó+;Ð% aÑ(Ø.ò =˜Ü4<Ð)¨!Ñ,¨SÒ1ñ=ð ()Ð! !Ò$ð
	)ð(	ÙÜ—	‘	Ø=ØÙ"*‘J°ØØ%ôð '�w—‘Ñ2¨Ñ2ˆHáØ×)Ñ)Ô+Ü�I‰IØ:ØØ×$Ñ$Ü�H×$Ñ$Ó%Ø�Q‘ôô ˜xÓ(Ò(ð[Q#ôf Ð;Ó
<Ð<ùòM #JøôB ×"Ñ"ò 	.ô ˜1 #Ô&¨AÐ-ûÜ×#Ñ#ò 	!Ü ØØ—Z‘Z×+Ñ+ØŸ
™
×*Ñ*Øô	ˆIð  !ÕûÜ×*Ñ*ò 	Ü  ¨Ô,ˆIØ ÐØ�Hûð	úô
 ,ØØ%ô
Ðñ #Ø!Ò; a¨!¡e¨lÑ&:ˆJÙØÐ%5Ð5Ø(Ò7¨Kˆ
à˜Œ?ÙÜ—	‘	ØGØôô �J‰J�zÖ"s=   Ä*HÅHÅ>BHÈJ>È+H9È9J>É9JÊJ>Ê#J9Ê9J>Úfunc.ÚaddrÚeventÚdelayc                 ó>   — |r|j                  |¬«      ry | ||«      S )z Execute func with optional delay©rN   N©Úwait©r  r	  rN   r
  r  s        r'   Ú_run_func_with_delayr  p  s'   € ñ ð
 �:‰:˜eˆ:Ô$ØÙ��gÓÐr)   ç333333Ã?Ú	addressesÚstagger_delayc                 óN  — d}d}d}g }t        j                  «       }t        t        |«      ¬«      }		 t	        |«      D �
�ci c]$  \  }
}|	j                  t        | ||||
|z  ¬«      |“Œ& }}
}t        ||¬«      D ]h  }||   }|j                  «       }|r|} |j                  |«       Œ/|j                  «       }|sŒB|j                  «        ||fc |	j                  d¬«       S  |rt        j                  d||«       |‚t        j                  d|«       t!        d	«      ‚c c}}
w # t"        $ rF t        j                  d
dj%                  |«      dj%                  t'        t(        |«      «      «       Y nw xY w	 |	j                  d¬«       ||fS # |	j                  d¬«       w xY w)a  execute multiple callbacks in parallel

    Run blocking func against two different addresses staggered with a
    delay. The first call to return successfully is returned from this
    function and remaining unfinished calls are cancelled if they have not
    yet started
    N)Úmax_workersr  r  Fr  z<Exception(s) %s during request to %s, raising last exceptionzEmpty result for address %szNo result returnedzJTimed out waiting for addresses: %s, exception(s) raised while waiting: %sú )Ú	threadingÚEventr   rô   Ú	enumerateÚsubmitr  r   Ú	exceptionÚappendÚresultÚsetÚshutdownrH   re   rÔ   rƒ   r   ÚjoinÚmapr/   )r  r  r  rN   Úreturn_resultÚreturned_addressÚlast_exceptionr   Úis_doneÚexecutorrý   r	  ÚfuturesÚfutureÚreturn_exceptions                  r'   Ú
dual_stackr+  ‚  sÔ  € ð €MØÐØ.2€NØ€JÜ�o‰oÓ€Gô "¬c°)«nÔ=€Hð5&ô % YÓ/÷

ñ ��4ð �O‰OÜ$ØØØØØ˜=Ñ(ð ó ð ñð

ˆñ 

ô # 7°GÔ<ò 	=ˆFà& v™ÐØ%×/Ñ/Ó1ÐÙØ!1�Ø!�
×!Ñ! .Õ1à &§¡£�Ú ð —K‘K”MØ,¨mÐ<Ñ<ð2 	×Ñ˜uÐÕ%ðO	=ñ$ Ü�I‰Ið-àØ ô	ð !Ð ä�I‰IÐ3Ð5EÔFÜÐ1Ó2Ð2ùóS

øôX ò 
Ü�	‰	ð4à�H‰H�YÓØ�H‰H”Sœ˜jÓ)Ó*ö		
ð
úð	
ð 	×Ñ˜uÐÔ%à˜mÐ,Ð,øð 	×Ñ˜uÐÕ%ús>   ³D' Á)D!Á*AD' Â<D' Ã$AD' Ä'AE6Å3F Å5E6Å6F ÆF$c                   ó>   — e Zd ZU ee   ed<   ee   ed<   ee   ed<   y)ÚHandledResponser%   r§   Ú	wait_timeN)r˜   r™   rš   r   r/   Ú__annotations__r~   rË   r4   r)   r'   r-  r-  Õ  s#   … à	�#‰ÓØ�{Ñ#Ó#ð ˜‰Ôr)   r-  Úinf)Úmax_waitrN   Ú	status_cbrÚ   rÛ   r  rÓ   Úsleep_time_cbrá   Úconnect_synchronouslyÚasync_delayr1  r2  rÚ   r  r3  rá   r4  r5  c                óT  ‡ ‡‡‡‡‡	‡‡‡‡‡‡‡— dt         dt        fˆfd„}ddt        dt        dt        fd„Šd	t        t           d
t        t           dt
        t        t           t        f   fd„Šdt        t        gt
        t        t           t        t           f   f   dt        t        t        t           f   dt         dt        dt        dt        fˆˆfd„Šd
t        dt         dt        fˆˆˆ	fd„Šdt        fˆˆˆˆˆˆˆ fd„}dt        fˆˆˆˆ fd„}t        j                  «       }‰r|rt        d«      ‚|
r|n|}|xs |}dŠd}	  |||||«      }dŠ|j                   r"|j"                  |j                   j$                  fS |j&                  r't        j(                  |j&                  «       ‰dz   ŠdŠŒo ||‰«      } ‰‰||«      r	 y‰dz   Št*        j-                  d|«       t        j(                  |«       t        j                  «       }|r||z   |‰z   kD  r‰||z
  z
  }|dk  r	 yŒä)a  Wait for a response from one of the urls provided.

    :param urls: List of urls to try
    :param max_wait: Roughly the maximum time to wait before giving up
        The max time is *actually* len(urls)*timeout as each url will
        be tried once and given the timeout provided.
        a number <= 0 will always result in only one try
    :param timeout: Timeout provided to urlopen
    :param status_cb: Callable with string message when a url is not available
    :param headers_cb: Callable with single argument of url to get headers
        for request.
    :param headers_redact: List of header names to redact from the log
    :param sleep_time: Amount of time to sleep between retries. If this and
        sleep_time_cb are None, the default sleep time defaults to 1 second
        and increases by 1 seconds every 5 tries. Cannot be specified along
        with `sleep_time_cb`.
    :param exception_cb: Callable to handle exception and returns True if
        retries are permitted.
    :param sleep_time_cb: Callable with 2 arguments (response, loop_n) that
        generates the next sleep time. Cannot be specified
        along with 'sleep_time`.
    :param request_method: Indicates the type of HTTP request:
        GET, PUT, or POST
    :param connect_synchronously: If false, enables executing requests
        in parallel
    :param async_delay: Delay before parallel metadata requests, see RFC 6555

    :return: tuple of (url, response contents), on failure, (False, None)

    :raises: UrlError on unrecoverable error
    Úloop_numberr8   c                 ó   •— ‰�‰S |dz  dz   S )Né   r!   r4   )Ú_r7  r  s     €r'   Údefault_sleep_timez(wait_for_url.<locals>.default_sleep_time  s   ø€ Ø'Ð3ˆzÐM¸ÈÑ9IÈAÑ9MÐMr)   r   r1  Ú
start_timer  c                 ój   — | t        d«      dfv ry| dk  xs t        j                  «       |z
  |z   | kD  S )z4Check if time is up based on start time and max waitr0  NFr   )rË   rÌ   Ú	monotonic)r1  r<  r  s      r'   Útimeupzwait_for_url.<locals>.timeup  s@   € àœ˜e› dÐ+Ñ+ØØ˜A‘ò 
Ü�N‰NÓ˜zÑ)¨JÑ6¸ÑAð	
r)   r§   r%   c                 óŒ  — d}d}| r|sd}t        t        |«      «      }||fS 	 | j                  j                  «        | j                  s?d| j                  z  }t        t        |«      | j                  | j                  |¬«      }||fS | j                  «       s;d| j                  z  }t        t        |«      | j                  | j                  |¬«      }||fS # t        j
                  j                  $ rN}t        ||j                  j                  |j                  j                  |¬«      }|t        |«      fcY d}~S d}~ww xY w)z?Map requests response code/contents to internal "UrlError" typer#   NzRequest timed outrè   zempty response [%s]zbad status code [%s])r   rƒ   r©   ró   r¹   r   rö   r§   r²   rT   r/   r|   rL   r’   )r§   r%   ÚreasonÚurl_excrs   s        r'   Úhandle_url_responsez)wait_for_url.<locals>.handle_url_response  s8  € ð ˆØˆÙ™SØ(ˆFÜœz¨&Ó1Ó2ˆGØ˜F�?Ð"ð	#ð ×Ñ×/Ñ/Ô1ð × Ò Ø*¨h¯m©mÑ<ˆFÜÜ˜6Ó"Ø—]‘]Ø ×(Ñ(Øô	ˆGð ˜Ð Ð ð —‘”à+¨x¯}©}Ñ=ˆFÜÜ˜6Ó"Ø—]‘]Ø ×(Ñ(Øô	ˆGð ˜Ð Ð øô3 ×"Ñ"×,Ñ,ò 	#ÜØØ—Z‘Z×+Ñ+ØŸ
™
×*Ñ*Øô	ˆGð œC ›F�?Õ"ûð	#ús   ¤C ÃEÃ5AD>Ä8EÄ>EÚurl_reader_cbÚurlsÚexc_cbÚlog_cbc                 óÄ  •— d}d}	  | |«      \  }} ‰||«      \  }}|st        ||d¬«      S 	 t        t	        j
                  «       |z
  «      }
‰rd‰z  nd}d|xs t        |d	d	«      ›d
|
›d|›d|›�} ||«       t        ddt        |t        «      rt        ||¬«      ¬«      S d¬«      S # t        $ r}	d|	z  }|	}Y d}	~	Œ“d}	~	wt        $ r}	d|	z  }|	}Y d}	~	Œ«d}	~	ww xY w)z:Execute request, handle response, optionally log exceptionr#   N)r.  zrequest error [%s]zunexpected error [%s]z%ssÚ	unlimitedz	Calling 'r%   z
' failed [r,   z]: rÒ   ©r%   r§   r.  )	r-  r   Ú	Exceptionr½   rÌ   r>  ÚgetattrrE   r×   )rD  rE  r<  rF  rG  rA  r%   r§   rB  rs   Ú
time_takenÚmax_wait_strÚ
status_msgrC  r1  s                €€r'   Úread_url_handle_exceptionsz0wait_for_url.<locals>.read_url_handle_exceptionsA  s  ø€ ð ˆØˆð
	Ù)¨$Ó/‰MˆC�Ù1°(¸CÓ@‰OˆG�VÙÜ& s¨HÀÔEÐEð ô œŸ™Ó)¨JÑ6Ó7ˆ
Ù+3�u˜xÒ'¸‰àÒ1”7˜7 E¨5Ó1Ñ1ÚÚÙð	
ˆ
ñ 	ˆzÔäØØô ˜g¤xÔ0ô ˜g°FÔ;ô	
ð 	
ð ô
ð 	
øô! ò 	Ø)¨AÑ-ˆFØ�GûÜò 	Ø,¨qÑ0ˆFØ�Gûð	ús#   ‡&B- Â-	CÂ6CÃCÃCÃCrN   c                 ó:   •— t        | ‰€i n ‰| «      ‰|d‰¬«      S )NF)rT   rÛ   rN   rÜ   rá   )r„   )r%   rN   rÚ   rÛ   rá   s     €€€r'   Úread_url_cbz!wait_for_url.<locals>.read_url_cbm  s-   ø€ ÜØØ$Ð,‘B±*¸S³/Ø)ØØØ)ô
ð 	
r)   c                 óœ  •‡— dt         fˆˆfd„}g }‰D ]š  }t        j                  «       }‰
dk7  r;‰s9 ‰‰| «      rt        ddd¬«      c S ‰�‰r|‰z   | ‰z   kD  rt	        | ‰z   |z
  «      Š ‰||| ||«      }|j
                  r|c S |j                  sŒ€|j                  |j                  «       Œœ |rt        |«      nd}	t        dd|	¬«      S )z|iterate over list of urls, request each one and handle responses
        and thrown exceptions individually per url
        r%   c                 ó   •— |  ‰| ‰«      fS rŠ   r4   )r%   rR  rN   s    €€r'   Úurl_reader_serialz@wait_for_url.<locals>.read_url_serial.<locals>.url_reader_serial~  s   ø€ Ø™ S¨'Ó2Ð3Ð3r)   r   NrJ  )	r/   rÌ   r>  r-  r½   r§   r.  r  rì   )r<  rN   rF  rG  rU  Ú
wait_timesr%   ÚnowÚoutr.  Úloop_nr1  Úmust_try_againrR  rP  r?  rE  s    `        €€€€€€€r'   Úread_url_serialz%wait_for_url.<locals>.read_url_serialw  sä   ù€ ð	4¤3ö 	4ð ˆ
Øò 	1ˆCÜ—.‘.Ó"ˆCØ˜Š{¡>Ù˜( JÔ/Ü*Ø ¨4¸4ôò ð Ð(ÙØ˜w™¨*°xÑ*?Ò@ô " :°Ñ#8¸CÑ"?Ó@�Gá,Ø! 3¨
°F¸FóˆCð �|Š|Ø’
Ø—“Ø×!Ñ! #§-¡-Õ0ð+	1ñ, (2”C˜
”O°tˆ	Ü 4°$À)ÔLÐLr)   c                 óB   •— t        t        ‰‰|¬«      } ‰|‰| ||«      S )z‘pass list of urls to dual_stack which sends requests in parallel
        handle response and exceptions of the first endpoint to respond
        )r  rN   )r   r+  )	r<  rN   rF  rG  Úurl_reader_parallelr5  rR  rP  rE  s	        €€€€r'   Úread_url_parallelz'wait_for_url.<locals>.read_url_parallel›  s6   ø€ ô &ÜØØ%Øô	
Ðñ *Ø  z°6¸6ó
ð 	
r)   z3sleep_time and sleep_time_cb are mutually exclusiveNTFr!   ré   )FN)r   )r½   rË   r   r~   r/   r   r   r   r   r   r   ÚExceptionCallbackr-  rÌ   r>  rƒ   r§   r%   r|   r.  rø   rH   re   )rE  r1  rN   r2  rÚ   rÛ   r  rÓ   r3  rá   r4  r5  r;  r[  r^  r<  Údo_read_urlÚcalculate_sleep_timer§   ÚrespÚcurrent_sleep_timeÚcurrent_timerC  rY  rZ  rR  rP  r?  s   ``  ```  ` `          @@@@@@r'   Úwait_for_urlre  Þ  sS  ÿü€ ð^N¬3ð N´5õ Nñ
œð 
¬Eð 
¼uó 
ð'!Üœ;Ñ'ð'!Ü.6´s©mð'!ä	ŒxœÑ!¤3Ð&Ñ	'ó'!ðR*
ÜÜˆE”5œ¤#™¬´Ñ(=Ð=Ñ>Ð>ñ
ð*
ô ”Cœœc™�NÑ#ð	*
ô
 ð*
ô "ð*
ô ð*
ô 
ö*
ðX
œð 
¤sð 
¬{÷ 
ð"Mä	÷"Mó "MðH
ä	÷
ð 
ô  —‘Ó!€JÙ‘mÜÐNÓOÐOñ 1‰Ð6Gð ð )Ò>Ð,>Ðà€FØ€HØ
Ù˜: w°¸iÓHˆØˆØ�=Š=Ø—8‘8˜TŸ]™]×3Ñ3Ð3Ð3Ø�^Š^Ü�J‰J�t—~‘~Ô&Ø˜a‘ZˆFØ!ˆNØá1°(¸FÓCÐÙ�(˜JÐ(:Ô;Øð" ð ˜!‘ˆÜ�	‰	Ø?Øô	
ô 	�
‰
Ð%Ô&ô —~‘~Ó'ˆÙ�| gÑ-°
¸XÑ0EÒEØ ,°Ñ";Ñ<ˆGØ˜!Š|ààð= r)   c                   óT   — e Zd Z	 	 	 	 	 dd„Zd„ Zd„ Zd„ Zd„ Zd„ Zd„ Z	d	„ Z
d
„ Zd„ Zy)ÚOauthUrlHelperNc                 ó<  — || _         |xs d| _        || _        || _        || _        d| _        d| _        | j                  | j                  | j                   f}t        |«      sd| _        nt        |«      st        d«      ‚| j                  «       }|xs i | _        y )Nr#   Tr9  FzBall or none of token_key, token_secret, or consumer_key can be set)Úconsumer_keyÚconsumer_secretÚ	token_keyÚtoken_secretÚskew_data_fileÚ	_do_oauthÚskew_change_limitÚanyÚallrƒ   Úread_skew_fileÚ	skew_data)r‹   ri  rk  rl  rj  rm  ÚrequiredÚolds           r'   rŒ   zOauthUrlHelper.__init__Þ  s�   € ð )ˆÔØ.Ò4°"ˆÔØ"ˆŒØ(ˆÔØ,ˆÔØˆŒØ!"ˆÔØ—N‘N D×$5Ñ$5°t×7HÑ7HÐIˆÜ�8Œ}Ø"ˆD�NÜ�X”Üð*óð ð
 ×!Ñ!Ó#ˆØš ˆ�r)   c                 ót  — | j                   r‹t        j                  j                  | j                   «      rbt	        j
                  d| j                   › �«      5  t        | j                   d¬«      5 }t        j                  |«      cd d d «       cd d d «       S y # 1 sw Y   nxY wd d d «       y # 1 sw Y   y xY w)NzReading Úr©Úmode)	rm  Úosr2   Úisfiler   ÚTimedÚopenÚjsonÚload)r‹   Úfps     r'   rr  zOauthUrlHelper.read_skew_fileù  s›   € Ø×Ò¤2§7¡7§>¡>°$×2EÑ2EÔ#FÜ×"Ñ" X¨d×.AÑ.AÐ-BÐ#CÓDñ %ÄdØ×#Ñ#¨#ôGð %àÜ—y‘y “}÷%÷ %ò %ð ÷	%ð %ú÷ %ð ÷	%ð ús$   ÁB.Á0BÂ	B.ÂB"	ÂB.Â.B7c                 ó^  — | j                   sy | j                  «       }|€i }|||<   t        j                  d| j                   › �«      5  t	        | j                   d¬«      5 }|j                  t        j                  |«      «       d d d «       d d d «       y # 1 sw Y   ŒxY w# 1 sw Y   y xY w)NzWriting Úwrx  )rm  rr  r   r|  r}  rl   r~  Údumps)r‹   rZ   ÚvalueÚcurr€  s        r'   Úupdate_skew_filezOauthUrlHelper.update_skew_file  sŸ   € à×"Ò"ØØ×!Ñ!Ó#ˆØˆ;ØˆCØˆˆD‰	Ü×Ñ ¨$×*=Ñ*=Ð)>Ð?Ó@ñ 	&Ä$Ø×Ñ côC
ð 	&àØ�H‰H”T—Z‘Z “_Ô%÷	&÷ 	&÷ 	&ñ 	&ú÷ 	&ð 	&ús$   Á	B#Á!%BÂB#ÂB 	ÂB#Â#B,c                 óÒ  — t        |t        «      r|j                  dk(  s|j                  dk(  sy d|j                  vr!t        j                  d|j                  «       y |j                  d   }	 t        j                  t        |«      «      }t        |t        j                  «       z
  «      }t        |j                  «      j                  }| j                  j                  |d«      }t!        ||z
  «      | j"                  kD  r)| j%                  ||«       t        j                  d||«       || j                  |<   y # t        $ r!}t        j                  d||«       Y d }~y d }~ww xY w)Ni“  i‘  Údatez$Missing header 'date' in %s responsez#Failed to convert datetime '%s': %sr   z$Setting oauth clockskew for %s to %d)rE   r   rL   rT   rH   rI   rÌ   rÍ   r   rK  r½   r   r%   Únetlocrs  rC   Úabsro  r†  )r‹   r  rˆ  Úremote_timers   ÚskewrZ   Úold_skews           r'   rÓ   zOauthUrlHelper.exception_cb  s!  € ä�y¤(Ô+Ø—‘ 3Ò&¨)¯.©.¸CÒ*?àà˜×*Ñ*Ñ*Ü�K‰KÐ>À	ÇÁÔOØà× Ñ  Ñ(ˆð	ÜŸ+™+¤i°£oÓ6ˆKô
 �;¤§¡£Ñ,Ó-ˆÜ˜	Ÿ™Ó&×-Ñ-ˆØ—>‘>×%Ñ% d¨AÓ.ˆÜˆx˜$‰Ó $×"8Ñ"8Ò8Ø×!Ñ! $¨Ô-Ü�K‰KÐ>ÀÀdÔKØ#ˆ�‰�tÑàøô ò 	Ü�K‰KÐ=¸tÀQÔGÜûð	ús   Á/D< Ä<	E&ÅE!Å!E&c                 óL  — | j                   si S d }t        |«      j                  }| j                  r;|| j                  v r-t	        t        j
                  «       «      | j                  |   z   }t        || j                  | j                  | j                  | j                  |¬«      S )N)r%   ri  rk  rl  rj  Ú	timestamp)rn  r   r‰  rs  r½   rÌ   Úoauth_headersri  rk  rl  rj  )r‹   r%   r�  rZ   s       r'   rÚ   zOauthUrlHelper.headers_cb*  s‡   € Ø�~Š~ØˆIàˆ	Ü˜‹}×#Ñ#ˆØ�>Š>˜d d§n¡nÑ4ÜœDŸI™I›KÓ(¨4¯>©>¸$Ñ+?Ñ?ˆIäØØ×*Ñ*Ø—n‘nØ×*Ñ*Ø ×0Ñ0Øô
ð 	
r)   c                 ó²   — t        | j                  |j                  d«      «      |d<   t        | j                  |j                  d«      «      |d<    ||i |¤ŽS )NrÚ   rÓ   )r   Ú_headers_cbrC   Ú_exception_cb)r‹   Úwrapped_funcr‘   rO   s       r'   Ú_wrappedzOauthUrlHelper._wrapped<  s\   € Ü&Ø×Ñ˜fŸj™j¨Ó6ó 
ˆˆ|Ñô ")Ø×Ñ §
¡
¨>Ó :ó"
ˆˆ~Ññ ˜TÐ, VÑ,Ð,r)   c                 ó0   — | j                  t        ||«      S rŠ   )r•  re  r�   s      r'   re  zOauthUrlHelper.wait_for_urlE  s   € Ø�}‰}œ\¨4°Ó8Ð8r)   c                 ó0   — | j                  t        ||«      S rŠ   )r•  r„   r�   s      r'   r„   zOauthUrlHelper.readurlH  s   € Ø�}‰}œW d¨FÓ3Ð3r)   c                 ón   — d}	 |r ||«      }| j                  |«       |S # | j                  |«       w xY w)NTrÒ   )r‹   Úextra_exception_cbr  Úrets       r'   r“  zOauthUrlHelper._exception_cbK  s>   € Øˆð	)Ù!Ù(¨Ó3�à×Ñ˜iÔ(Øˆ
øð ×Ñ˜iÕ(ús   „
! ¡4c                 ó^   — i }|r ||«      }|j                  | j                  |«      «       |S rŠ   )rê   rÚ   )r‹   Úextra_headers_cbr%   rT   s       r'   r’  zOauthUrlHelper._headers_cbT  s.   € ØˆÙÙ& sÓ+ˆGØ�‰�t—‘ sÓ+Ô,Øˆr)   )NNNNz/run/oauth_skew.json)r˜   r™   rš   rŒ   rr  r†  rÓ   rÚ   r•  re  r„   r“  r’  r4   r)   r'   rg  rg  Ý  sE   „ ð ØØØØ-ó#ò6ò&òò8
ò$-ò9ò4òór)   rg  c                 óÚ   — 	 dd l m} |rt	        |«      }nd }|j                  |||||j                  |¬«      }|j                  | «      \  }	}
}|
S # t        $ r}t        d«      |‚d }~ww xY w)Nr   zoauth support is not available)Úclient_secretÚresource_owner_keyÚresource_owner_secretÚsignature_methodr�  )Úoauthlib.oauth1Úoauth1ÚImportErrorÚNotImplementedErrorr/   ÚClientÚSIGNATURE_PLAINTEXTÚsign)r%   ri  rk  rl  rj  r�  r£  rs   ÚclientÚ_uriÚsigned_headersÚ_bodys               r'   r�  r�  \  sˆ   € ðKÝ(ñ Ü˜	“N‰	àˆ	à�]‰]ØØ%Ø$Ø*Ø×3Ñ3Øð ó €Fð #)§+¡+¨cÓ"2Ñ€Dˆ.˜%ØÐøô# ò KÜ!Ð"BÓCÈÐJûðKús   ‚A Á	A*ÁA%Á%A*)rY   rŠ   )r  é
   )Mrî   r=   ra   r~  Úloggingrz  r  rÌ   Úconcurrent.futuresr   r   r   Úemail.utilsr   Ú	functoolsr   Úhttp.clientr   Ú	itertoolsr	   Ússlr
   Útypingr   r   r   r   r   r   r   r   r   Úurllib.parser   r   r   r   r¹   r   Ú	cloudinitr   r   r   Ú	getLoggerr˜   rH   r   r¼   r_  r(   r7   r½   rM   r/   rË   Údictru   r}   r†   rˆ   rv   rP   r~   r{   r   rÈ   rÑ   r×   r„   r  r  r+  r-  re   re  rg  r�  r4   r)   r'   ú<module>rº     s^  ðó Û Û 	Û Û Û 	Û Û ß MÑ MÝ !Ý Ý !Ý Ý &÷
÷ 
õ 
÷ ?Ó >ã Ý ç 0Ñ 0à€g×Ñ˜Ó!€à€Ø˜X z l°DÐ&8Ñ9Ñ:Ð ò"òð ¨só ñ.�3ð  ð ¸ð Àó ðDM�Sð M ~ó Mð &à
Ð7Ñ8ó&÷<-ñ -ô3�>ô 3ô
(�.ô (÷
.Kñ .Kôbˆwô òð$ #ð ¨%ó ðJ '+òØðð $ðð ˆe�_ó	ðJ 
ØØØØØØØØØØ&*ØØØØØò%m=ð $ðm=ð$ ð%m=ð& ó'm=ðj "ñØ
�3˜�8Ñ
ðà
ðð ðð �?‰?ð	ð
 �E‰?ðð 	óð* !Øñ	P-Ø
�3˜�8Ñ
ðP-à�C‰yðP-ð ðP-ð ð	P-ð
 ˆ8�C‰=˜( ;Ñ/Ð/Ñ0óP-ôf�jô ñ ˜E“lØ#ØŸ)™)Ø%)ØØ"&Ø&*Ø=AØØ"&Øò|ð ð|ð �e‰_ð	|ð
 ð|ð ˜Ñ"ð|ð ˜‘ð|ð $ð|ð ˜H c¨5 \°5Ð%8Ñ9Ñ:ð|ð ð|ð  ð|ð ó|÷~|ñ |ð@ LPôr)   