o
    m=8j                     @   sx  U d 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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ZddlmZ ddlmZmZ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# ddl$m%Z% ddl&m'Z'm(Z( ddl)m*Z*m+Z+m,Z,m-Z-m.Z.m/Z/m0Z0m1Z1 ddl2m3Z3 ddl4m5Z5m6Z6 ddl7Z7ddl8m9Z9m:Z:m;Z; ddl<m=Z> ddl?m@Z@ ddlAmBZB ddlCmDZD ejEdkrddlZFnddlFZFdZGeH dkZIeH dkZJejEdkZKdZLe/dZMe/dZNeOddZPePjQZQeRe
jSTdZUeVd d!geWd"d#R ZXeBjYZZej[j\p.ej[j] o.eRe
jSTd$Z^d%d& eWdd'D Z_d(d& eWdd)D e`d*hB Zad+d,d-d.d/d0d1d2d3d4d5d6d7d8d9d:d;d<e`d=hZbe_eaA ebA ZcG d>d? d?ZdddBeedCeedDeedEeefdFdGZfG dHdI dIedIg dJZg	KddBeedCeedDeedEegfdLdMZhdNe@dEeie@egdB f fdOdPZjdEe	j	dB fdQdRZke7jldSdSdSdTG dUdV dVZmdWe	j	dB dXeedEegfdYdZZndEeoeeemf fd[d\ZpdNe@dEeie@egdB f fd]d^Zqe7jldSdSdSdTG d_d` d`ZrejsdadbdceedEerfdddeZtG dfdg dgeZuejsdadbdheedEeieee'eeeef f fdidjZvddke*dleedB dEeedB fdmdnZwexdoZydpd& eWd)d*D dqhB ZzdreedEeefdsdtZ{	AddueedveRdweedxeedEeef
dydzZ|dXeedB dEeRfd{d|Z}dXeedEeRfd}d~Z~daedB ed< d@adEeefddZdddZ	ddedeededejdedEejdB fddZ	ddeg e*f dedejdedEejdB f
ddZdedededEefddZG dd dZG dd de+d ZG dd deZG dd deZ	ddedB dedEeFjfddZG dd dZdddeMdEdfddZe ZG dd de.ZefdddededEdfddZejG dd de,eM ZG dd deeM ZG dd deeM ZG dd deeM ZG dd deeeee* B e*f ZdZexeZde dZexeZexd+e dZdZe7jldSdSdSdTG dd dZdeedEdfddZdeedB dEejdB fddńZejsdeededEeRfddɄZdeededEeRfdd˄ZdS )zVarious helper functions    N)
namedtuple)Callable	GeneratorIterableIteratorMapping)suppress)EmailMessage)HeaderParser)HTTP)	parsedateceil)Path)MappingProxyTypeTracebackType)AnyContextManagerGenericOptionalProtocolTypeVarget_argsoverload)quote)
getproxiesproxy_bypass)	MultiDictMultiDictProxyMultiMapping)under_cached_propertyURL   )hdrs)client_logger      )	BasicAuthChainMapProxyETagreifyDarwinWindowsi   _T_S	_SENTINELsentinelAIOHTTP_NO_EXTENSIONS   i0  d      PYTHONASYNCIODEBUGc                 C      h | ]}t |qS  chr.0ir9   r9   V/home/nk/hobo-godmode/plappi-mvp/.venv/lib/python3.10/site-packages/aiohttp/helpers.py	<setcomp>V       r@      c                 C   r8   r9   r:   r<   r9   r9   r?   r@   W   rA          ()<>@,;:\"/[]?={} 	   c                   @   s   e Zd Zded fddZdS )noopreturn)NNNc                 c   s    d V  d S Nr9   selfr9   r9   r?   	__await__s   s   
znoop.__await__N)__name__
__module____qualname__r   r]   r9   r9   r9   r?   rX   r   s    rX    utf-8loginpasswordencodingrY   c                 C   s8   d| v rt d|  d| |}dt|| S )zEncode HTTP Basic Authentication credentials as an Authorization header value.

    Returns a string of the form ``"Basic <base64>"`` suitable for use as the
    value of the ``Authorization`` (or ``Proxy-Authorization``) header.
    rL   z2A ":" is not allowed in login (RFC 7617#section-2)zBasic )
ValueErrorencodebase64	b64encodedecode)rc   rd   re   credsr9   r9   r?   encode_basic_authw   s   rl   c                	       s   e Zd ZdZ	ddedededd f fdd	Zedd
ededd fddZedddedede	d  fddZ
defddZ  ZS )r)   z!Http basic authentication helper.ra   latin1rc   rd   re   rY   c                    sR   |d u rt d|d u rt dd|v rt dtjdtdd t | |||S )Nz"None is not allowed as login valuez%None is not allowed as password valuerL   z5A ":" is not allowed in login (RFC 1945#section-11.1)zBasicAuth is deprecated and will be removed in aiohttp 4.0; use aiohttp.encode_basic_auth() with headers={'Authorization': ...} instead   )
stacklevel)rf   warningswarnDeprecationWarningsuper__new__)clsrc   rd   re   	__class__r9   r?   rt      s   zBasicAuth.__new__auth_headerc                 C   s   z
| dd\}}W n ty   tdw | dkr"td| ztj|ddd|}W n tjy=   td	w z
| d
d\}}W n tyS   tdw t	|||S )z<Create a BasicAuth object from an Authorization HTTP header.rV   r#   z%Could not parse authorization header.basiczUnknown authorization method %sasciiT)validatezInvalid base64 encoding.rL   zInvalid credentials.)
splitrf   lowerrh   	b64decoderg   rj   binasciiError_basic_auth_no_warn)ru   rx   re   	auth_typeencoded_credentialsdecodedusernamerd   r9   r9   r?   rj      s,   
zBasicAuth.decodere   urlc                C   sB   t |ts	td|jdu r|jdu rdS t|jpd|jpd|S )zCreate BasicAuth from url.zurl should be yarl.URL instanceNra   )
isinstancer"   	TypeErrorraw_userraw_passwordr   userrd   )ru   r   re   r9   r9   r?   from_url   s
   
zBasicAuth.from_urlc                 C   s   t | j| j| jS )zEncode credentials.)rl   rc   rd   re   r[   r9   r9   r?   rg         zBasicAuth.encodera   rm   )rm   )r^   r_   r`   __doc__strrt   classmethodrj   r"   r   r   rg   __classcell__r9   r9   rv   r?   r)      s"    "
r)   rc   rd   re   rm   c                 C   s   t t| ||fS )zConstruct a BasicAuth without emitting the deprecation warning.

    For internal use only. Bypasses BasicAuth.__new__ so that aiohttp's own
    machinery doesn't trigger deprecation warnings in user code.
    )tuplert   r)   r   r9   r9   r?   r      s   r   r   c                 C   s<   | j du r| jdu r| dfS | dt| jpd| jpdfS )zIRemove user and password from URL if present and return BasicAuth object.Nra   )r   r   	with_userr   r   rd   )r   r9   r9   r?   strip_auth_from_url   s    r   c                  C   s0  t jd} | durt| }n(zt }W n ty. } ztd| W Y d}~dS d}~ww |tr4dnd }zt		t
|W S  t	jyY } ztd| W Y d}~dS d}~w ty } z3d}tt | }W d   n1 svw   Y  | s|rtd| W Y d}~dS W Y d}~dS d}~ww )	zLoad netrc from file.

    Attempt to load it from the path specified by the env-var
    NETRC or in the default location in the user's home directory.

    Returns None if it couldn't be found or fails to parse.
    NETRCNzHCould not resolve home directory when trying to look for .netrc file: %s_netrcz.netrczCould not parse .netrc file: %sFzCould not read .netrc file: %s)osenvirongetr   homeRuntimeErrorr%   debug
IS_WINDOWSnetrcr   NetrcParseErrorwarningOSError
contextlibr   is_file)	netrc_env
netrc_pathhome_direnetrc_existsr9   r9   r?   netrc_from_env   s@   
	

r   T)auto_attribsfrozenslotsc                   @   s"   e Zd ZU eed< edB ed< dS )	ProxyInfoproxyN
proxy_auth)r^   r_   r`   r"   __annotations__r)   r9   r9   r9   r?   r        
 r   	netrc_objhostc                 C   sf   | du rt d| |}|du rt d|d|\}}}|s$|du r&|n|}|du r.d}t||S )z
    Return :py:class:`~aiohttp.BasicAuth` credentials for ``host`` from ``netrc_obj``.

    :raises LookupError: if ``netrc_obj`` is :py:data:`None` or if no
            entry is found for the ``host``.
    NzNo .netrc file foundzNo entry for z found in the `.netrc` file.ra   )LookupErrorauthenticatorsr   )r   r   auth_from_netrcrc   accountrd   r   r9   r9   r?   basicauth_from_netrc  s   


r   c               	   C   s   dd t   D } t }dd |  D }i }| D ]>\}}|\}}|jdv r4td|j | q|rS|d u rS|jd urSzt||j}W n t	yR   d }Y nw t
||||< q|S )Nc                 S   s"   i | ]\}}|d v r|t |qS ))httphttpswswssr!   r=   kvr9   r9   r?   
<dictcomp>+  s
    z$proxies_from_env.<locals>.<dictcomp>c                 S   s   i | ]	\}}|t |qS r9   )r   r   r9   r9   r?   r   1  s    )r   r   z)%s proxies %s are not supported, ignoring)r   itemsr   schemer%   r   upperr   r   r   r   )
proxy_urlsr   strippedretprotovalr   authr9   r9   r?   proxies_from_env*  s,   

r   c                 C   sf   | j durt| j rtd| j dt }z|| j }W n ty,   td| dw |j|jfS )z5Get a permitted proxy for the given URL from the env.NzProxying is disallowed for ``zNo proxies found for `z` in the env)r   r   r   r   r   KeyErrorr   r   )r   proxies_in_env
proxy_infor9   r9   r?   get_env_proxy_for_urlD  s   r   c                   @   s.   e Zd ZU eed< eed< eed< ded< dS )MimeTypetypesubtypesuffixzMultiDictProxy[str]
parametersN)r^   r_   r`   r   r   r9   r9   r9   r?   r   R  s
   
 r   8   )maxsizemimetypec                 C   s   | st dddtt dS | d}t }|dd D ]}|s q|d\}}}||  |d q|d   }|d	krDd
}|d\}}}	|	d\}	}}
t ||	|
t|dS )a  Parses a MIME type into its components.

    mimetype is a MIME type string.

    Returns a MimeType object.

    Example:

    >>> parse_mimetype('text/html; charset=utf-8')
    MimeType(type='text', subtype='html', suffix='',
             parameters={'charset': 'utf-8'})

    ra   )r   r   r   r   rK   r#   NrS   z "r   *z*/*rO   +)r   r   r   r|   	partitionaddr}   strip)r   partsparamsitemkey_valuefulltypemtypestyper   r9   r9   r?   parse_mimetypeZ  s&   
r   c                       s,   e Zd Zd fddZdefddZ  ZS )EnsureOctetStreamrY   Nc                    s   t    | d d S Nzapplication/octet-stream)rs   __init__set_default_typer[   rv   r9   r?   r     s   
zEnsureOctetStream.__init__c                 C   sB   |  dd }|d\}}}| }|ddkr|  S |S )a  Re-implementation from Message

        Returns application/octet-stream in place of plain/text when
        value is wrong.

        The way this class is used guarantees that content-type will
        be present so simplify the checks wrt to the base implementation.
        zcontent-typera   rK   rO   r#   )r   r}   r   r   countget_default_type)r\   r   ctyper   r9   r9   r?   get_content_type  s   	z"EnsureOctetStream.get_content_typerY   N)r^   r_   r`   r   r   r   r   r9   r9   rv   r?   r     s    r   rawc                 C   sF   t ttdd|  }| }|d}t|dd }|t|fS )zParse Content-Type header.

    Returns a tuple of the parsed content type and a
    MappingProxyType of parameters. The default returned value
    is `application/octet-stream`
    )policyzContent-Type: r9   r#   N)r
   r   r   parsestrr   
get_paramsdictr   )r   msgcontent_typer   content_dictr9   r9   r?   parse_content_type  s
   
r   objdefaultc                 C   s@   t | dd }|rt|tr|d dkr|d dkrt|jS |S )Nnamer   rG   rH   )getattrr   r   r   r   )r   r   r   r9   r9   r?   guess_filename  s   &
r  z[^\041\043-\133\135-\176]c                 C   r8   r9   r:   r<   r9   r9   r?   r@     rA   	contentc                 C   s*   t t| kstd| tdd | S )a  Return 7-bit content as quoted-string.

    Format content into a quoted-string as defined in RFC5322 for
    Internet Message Format. Notice that this is not the 8-bit HTTP
    format, but the 7-bit email format. Content must be in usascii or
    a ValueError is raised.
    zbad content for quoted-string c                 S   s   d|  d S )NrM   r   )group)xr9   r9   r?   <lambda>  s    zquoted_string.<locals>.<lambda>)QCONTENTsetrf   not_qtext_resub)r  r9   r9   r?   quoted_string  s   r  disptypequote_fields_charsetr   c           
      K   s>  | rt t| kstd| | }|rg }| D ]r\}}|r%t t|ks/td|d||rx| dkrHt|d|d}||d| f qzt|}W n tym   d|dt|d|df}||d	 |f Y qw ||d| f q|	d
d	dd}||d| f qddd |D }	d||	f}|S )ak  Sets ``Content-Disposition`` header for MIME.

    This is the MIME payload Content-Disposition header from RFC 2183
    and RFC 7579 section 4.2, not the HTTP Content-Disposition from
    RFC 6266.

    disptype is a disposition type: inline, attachment, form-data.
    Should be valid extension token (see RFC 2183)

    quote_fields performs value quoting to 7-bit MIME headers
    according to RFC 7578. Set to quote_fields to False if recipient
    can take 8-bit file names and field values.

    _charset specifies the charset to use when quote_fields is True.

    params is a dict with disposition params.
    zbad content disposition type z"bad content disposition parameter rS   filenamera   r   z"%s"z''r   rM   z\\rN   z\"z; c                 s   s    | ]}d  |V  qdS )rS   N)join)r=   pairr9   r9   r?   	<genexpr>  s    z-content_disposition_header.<locals>.<genexpr>)
TOKENr  rf   r   r}   r   appendr  r  replace)
r  r  r  r   r   lparamsr   r   qvalsparamsr9   r9   r?   content_disposition_header  s4   r  c                 C   s    | sdS d| v p|  dd S )zCheck if host looks like an IP Address.

    This check is only meant as a heuristic to ensure that
    a host is not a domain name.
    FrL   .ra   )r  isdigit)r   r9   r9   r?   is_ip_address  s   r  c                 C   s   |  d}t|dkrdS |D ]5}dt|  krdkr)n  dS | r)| s, dS |d dkr;t|dkr; dS t|dkrD dS qd	S )
zCheck if host is a canonical dotted-quad IPv4 address.

    Rejects the legacy numeric forms that ``socket`` still accepts and
    maps onto an address, e.g. ``2130706433``, ``017700000001``, ``127.1``.
    r     Fr#   r'   r   0   T)r|   lenisasciir  int)r   r   partr9   r9   r?   is_canonical_ipv4_address  s   
r$  _cached_current_datetimec                  C   s\   t t } | tkr,d}d}t| ^}}}}}}}	}
d||	 ||| ||||f a| atS )N)MonTueWedThuFriSatSun)ra   JanFebMarAprMayJunJulAugSepOctNovDecz#%s, %02d %3s %4d %02d:%02d:%02d GMT)r"  timer%  gmtime_cached_formatted_datetime)now_weekdayname
_monthnameyearmonthdayhhmmsswdtailr9   r9   r?   rfc822_formatted_time  s    	rG  infotuple[weakref.ref[object], str]c                 C   sT   | \}}| }|d ur(t t t||  W d    d S 1 s!w   Y  d S d S rZ   )r   	Exceptionr   )rH  refr   obr9   r9   r?   _weakref_handleD  s   
"rM     rL  r   timeoutlooptimeout_ceil_thresholdc                 C   sH   |d ur"|dkr"|  | }||krt|}||tt| |fS d S Nr   )r9  r   call_atrM  weakrefrK  )rL  r   rO  rP  rQ  whenr9   r9   r?   weakref_handleL  s   rV  cbc                 C   s4   |d u s|dkr
d S |  }t|||}||| S rR  )r9  calculate_timeout_whenrS  )rW  rO  rP  rQ  r<  rU  r9   r9   r?   
call_later\  s
   rY  	loop_timetimeout_ceiling_thresholdc                 C   s   | | }||krt |S |S )z$Calculate when to execute a timeout.r   )rZ  rO  r[  rU  r9   r9   r?   rX  i  s   rX  c                	   @   s   e Zd ZdZdZ	ddejdedB deddfd	d
Zde	d de
de
ddfddZdddZdejdB fddZdddZdddZdS )TimeoutHandlezTimeout handle_timeout_loop_ceil_threshold
_callbacksrN  rP  rO  Nceil_thresholdrY   c                 C   s   || _ || _|| _g | _d S rZ   r]  )r\   rP  rO  rb  r9   r9   r?   r   z  s
   zTimeoutHandle.__init__callback).Nargskwargsc                 O   s   | j |||f d S rZ   )ra  r  )r\   rc  rd  re  r9   r9   r?   register  s   zTimeoutHandle.registerc                 C   s   | j   d S rZ   )ra  clearr[   r9   r9   r?   close     zTimeoutHandle.closec                 C   sJ   | j }|d ur#|dkr#| j | }|| jkrt|}| j|| jS d S rR  )r^  r_  r9  r`  r   rS  __call__)r\   rO  rU  r9   r9   r?   start  s   
zTimeoutHandle.startBaseTimerContextc                 C   s4   | j d ur| j dkrt| j}| |j |S t S rR  )r^  TimerContextr_  rf  rO  	TimerNoop)r\   timerr9   r9   r?   ro    s
   
zTimeoutHandle.timerc              	   C   sV   | j D ] \}}}tt ||i | W d    n1 sw   Y  q| j   d S rZ   )ra  r   rJ  rg  )r\   rW  rd  re  r9   r9   r?   rj    s   
zTimeoutHandle.__call__rN  r   )rY   rl  )r^   r_   r`   r   	__slots__asyncioAbstractEventLoopfloatr   r   r   rf  rh  TimerHandlerk  ro  rj  r9   r9   r9   r?   r\  u  s4    




r\  c                   @   s   e Zd ZdZdddZdS )rl  r9   rY   Nc                 C   s   dS )z0Raise TimeoutError if timeout has been exceeded.Nr9   r[   r9   r9   r?   assert_timeout  s    zBaseTimerContext.assert_timeoutr   )r^   r_   r`   rq  rv  r9   r9   r9   r?   rl    s    rl  c                   @   sH   e Zd ZdZdefddZdee dB dedB dedB ddfd	d
Z	dS )rn  r9   rY   c                 C   s   | S rZ   r9   r[   r9   r9   r?   	__enter__     zTimerNoop.__enter__exc_typeNexc_valexc_tbc                 C      d S rZ   r9   )r\   ry  rz  r{  r9   r9   r?   __exit__  s   zTimerNoop.__exit__)
r^   r_   r`   rq  rl  rw  r   BaseExceptionr   r}  r9   r9   r9   r?   rn    s    
rn  c                	   @   sx   e Zd ZdZdZdejddfddZddd	Zde	fd
dZ
dee dB dedB dedB dedB fddZdddZdS )rm  z&Low resolution timeout context managerr_  _tasks
_cancelled_cancellingrP  rY   Nc                 C   s   || _ g | _d| _d| _d S )NFr   r  )r\   rP  r9   r9   r?   r     s   
zTimerContext.__init__c                 C   s   | j rtjddS )z7Raise TimeoutError if timer has already been cancelled.N)r  rr  TimeoutErrorr[   r9   r9   r?   rv    s   zTimerContext.assert_timeoutc                 C   sP   t j| jd}|d u rtdtjdkr| | _| jr t j	d | j
| | S )N)rP  z4Timeout context manager should be used inside a taskr&   )rr  current_taskr_  r   sysversion_info
cancellingr  r  r  r  r  r\   taskr9   r9   r?   rw    s   

zTimerContext.__enter__ry  rz  r{  c                 C   sX   d }| j r
| j  }|tju r*| jr*|d usJ tjdkr&| | jkr&d S tj	|d S )Nr&   )
r  poprr  CancelledErrorr  r  r  uncancelr  r  )r\   ry  rz  r{  
enter_taskr9   r9   r?   r}    s   

zTimerContext.__exit__c                 C   s,   | j st| jD ]}|  qd| _ d S d S NT)r  r  r  cancelr  r9   r9   r?   rO    s
   

zTimerContext.timeoutr   )r^   r_   r`   r   rq  rr  rs  r   rv  rl  rw  r   r~  r   boolr}  rO  r9   r9   r9   r?   rm    s     


rm  delayrb  c                 C   sL   | d u s| dkrt d S t }| }||  }| |kr!t|}t |S rR  )async_timeoutrO  rr  get_running_loopr9  r   
timeout_at)r  rb  rP  r<  rU  r9   r9   r?   ceil_timeout  s   

r  c                   @   s   e Zd ZU dZeg dZee ed< dZ	edB ed< dZ
eeef dB ed< eZedB eB ed< dedB d	dfd
dZed	efddZed	edB fddZed	edB fddZdS )HeadersMixinzMixin for handling headers.)_content_type_content_dict_stored_content_type_headersNr  r  r  r   rY   c                 C   s>   || _ |d u rd| _i | _d S t|\}}|| _| | _d S r   )r  r  r  r   copy)r\   r   r   content_mapping_proxyr9   r9   r?   _parse_content_type  s   
z HeadersMixin._parse_content_typec                 C   s6   | j tj}| j|kr| | | jdusJ | jS )z7The value of content part for Content-Type HTTP header.N)r  r   r$   CONTENT_TYPEr  r  r  r\   r   r9   r9   r?   r   &  s
   

zHeadersMixin.content_typec                 C   s<   | j tj}| j|kr| | | jdusJ | jdS )z7The value of charset part for Content-Type HTTP header.Ncharset)r  r   r$   r  r  r  r  r  r9   r9   r?   r  /  s
   

zHeadersMixin.charsetc                 C   s"   | j tj}|du rdS t|S )z(The value of Content-Length HTTP header.N)r  r   r$   CONTENT_LENGTHr"  )r\   content_lengthr9   r9   r?   r  8  s   zHeadersMixin.content_length)r^   r_   r`   r   	frozensetATTRSr   r   r   r  r  r   r2   r  r1   r  propertyr   r  r"  r  r9   r9   r9   r?   r    s   
 r  futzasyncio.Future[_T]resultc                 C   s   |   s| | d S d S rZ   )done
set_result)r  r  r9   r9   r?   r  ?  s   r  c                   @   s&   e Zd Z	ddededdfddZdS )	ErrorableProtocol.exc	exc_causerY   Nc                 C   r|  rZ   r9   )r\   r  r  r9   r9   r?   set_exceptionH  s   zErrorableProtocol.set_exception.)r^   r_   r`   r~  r  r9   r9   r9   r?   r  G  s    r  z&asyncio.Future[_T] | ErrorableProtocolr  r  c                 C   sB   t | r|  rdS |tu }||u }|s|s||_| | dS )zSet future exception.

    If the future is marked as complete, this function is a no-op.

    :param exc_cause: An exception that is a direct cause of ``exc``.
                      Only set if provided.
    N)rr  isfuturer  _EXC_SENTINEL	__cause__r  )r  r  r  exc_is_sentinelexc_causes_itselfr9   r9   r?   r  O  s   r  c                   @   s^   e Zd ZU dZdZee ed< ddedee	 dB fddZ
d	ed
efddZd
efddZdS )BaseKeyzBase for concrete context storage key classes.

    Each storage is provided with its own sub-class for the sake of some additional type safety.
    )_name_t__orig_class__r  Nr   tc                 C   sF   t  }|r|jjdkr|jd }n|j}|s|d | | _|| _d S )Nz<module>r^   r  )inspectcurrentframef_codeco_name	f_globalsf_backr  r  )r\   r   r  framemoduler9   r9   r?   r   t  s   

zBaseKey.__init__otherrY   c                 C   s   t |tr| j|jk S dS r  )r   r  r  )r\   r  r9   r9   r?   __lt__  s   
zBaseKey.__lt__c                 C   s   | j }|d u r"tt t| jd }W d    n1 sw   Y  |d u r)d}nt|trA|jdkr7|j}n|j d|j }nt	|}d| j
j d| j d| dS )	Nr   z<<Unknown>>builtinsr  rG   rE   z, type=z)>)r  r   AttributeErrorr   r  r   r   r_   r`   reprrw   r^   r  )r\   r  t_reprr9   r9   r?   __repr__  s   


zBaseKey.__repr__rZ   )r^   r_   r`   r   rq  r   objectr   r   r/   r   r  r  r  r9   r9   r9   r?   r  f  s   
 r  c                   @      e Zd ZdZdS )AppKeyz.Keys for static typing support in Application.Nr^   r_   r`   r   r9   r9   r9   r?   r        r  c                   @   r  )
RequestKeyz*Keys for static typing support in Request.Nr  r9   r9   r9   r?   r    r  r  c                   @   r  )ResponseKeyz+Keys for static typing support in Response.Nr  r9   r9   r9   r?   r    r  r  c                	   @   sb  e Zd ZdZdeeeee B ef  ddfddZ	dddZ
ed	ee defd
dZed	edefddZd	eee B defddZed	ee dedeeB fddZed d	ee dddedB fddZed d	ededefddZd!d	eee B dedefddZdefddZdeeee B  fddZd	edefddZdefddZdefddZdS )"r*   )_mapsmapsrY   Nc                 C   s   t || _d S rZ   )r   r  )r\   r  r9   r9   r?   r     ri  zChainMapProxy.__init__c                 C   s   t d| j d)NzInheritance class z  from ChainMapProxy is forbidden)r   r^   )ru   r9   r9   r?   __init_subclass__  s   zChainMapProxy.__init_subclass__r   c                 C   r|  rZ   r9   r\   r   r9   r9   r?   __getitem__  rx  zChainMapProxy.__getitem__c                 C   r|  rZ   r9   r  r9   r9   r?   r    rx  c              	   C   s4   | j D ]}z|| W   S  ty   Y qw t|rZ   )r  r   )r\   r   mappingr9   r9   r?   r    s   
r   c                 C   r|  rZ   r9   r\   r   r   r9   r9   r?   r     rx  zChainMapProxy.get.c                 C   r|  rZ   r9   r  r9   r9   r?   r     rx  c                 C   r|  rZ   r9   r  r9   r9   r?   r     rx  c                 C   s"   z| | W S  t y   | Y S w rZ   )r   r  r9   r9   r?   r     s
   
c                 C   s   t t j| j S rZ   )r   r  unionr  r[   r9   r9   r?   __len__  r   zChainMapProxy.__len__c                 C   s&   i }t | jD ]}|| qt|S rZ   )reversedr  updateiter)r\   dr  r9   r9   r?   __iter__  s   zChainMapProxy.__iter__c                    s   t  fdd| jD S )Nc                 3   s    | ]} |v V  qd S rZ   r9   )r=   mr   r9   r?   r    s    z-ChainMapProxy.__contains__.<locals>.<genexpr>anyr  r  r9   r  r?   __contains__  s   zChainMapProxy.__contains__c                 C   s
   t | jS rZ   r  r[   r9   r9   r?   __bool__  s   
zChainMapProxy.__bool__c                 C   s   d tt| j}d| dS )Nz, zChainMapProxy(rF   )r  mapr  r  )r\   r  r9   r9   r?   r    s   zChainMapProxy.__repr__r   r  rZ   )r^   r_   r`   rq  r   r   r   r  r   r   r  r   r/   r  r0   r   r"  r  r   r  r  r  r  r  r  r9   r9   r9   r?   r*     s*    &
 " r*   z[!\x23-\x7E\x80-\xff]+z(W/)?"(z)"z)(?:\s*,\s*|$)|(.)r   c                   @   s"   e Zd ZU eed< dZeed< dS )r+   r   Fis_weakN)r^   r_   r`   r   r   r  r  r9   r9   r9   r?   r+     r   r+   r   c                 C   s*   | t krt| std| dd S d S )NzValue z, is not a valid etag. Maybe it contains '"'?)ETAG_ANY	_ETAGC_RE	fullmatchrf   )r   r9   r9   r?   validate_etag_value  s
   
r  date_strc                 C   s`   | dur.t | }|dur.tt tj|dd dtjjiW  d   S 1 s)w   Y  dS )z/Process a date string, return a datetime objectN   tzinfo)r   r   rf   datetimetimezoneutc)r  	timetupler9   r9   r?   parse_http_date  s   
 r  methodcodec                 C   s2   |t v p| tv pd|  kodk n  o| tjv S )z-Check if a request must return an empty body.r6   ,  )EMPTY_BODY_STATUS_CODESEMPTY_BODY_METHODSr$   METH_CONNECT_ALLr  r  r9   r9   r?   must_be_empty_body  s
    r  c                 C   s*   |t v pd|  kodk n  o| tjv S )zrCheck if a Content-Length header should be removed.

    This should always be a subset of must_be_empty_body
    r6   r  )r  r$   r  r  r9   r9   r?   should_remove_content_length  s    r  )ra   rb   r   rZ   )Trb   )rH  rI  rY   Nrp  )r   rr  rh   r   r   r  enum	functoolsr  r   r   platformrer  r9  rp   rT  collectionsr   collections.abcr   r   r   r   r   r   email.messager	   email.parserr
   email.policyr   email.utilsr   mathr   pathlibr   typesr   r   typingr   r   r   r   r   r   r   r   urllib.parser   urllib.requestr   r   attr	multidictr   r   r   propcache.apir    r,   yarlr"   ra   r$   logr%   r  r  __all__systemIS_MACOSr   PY_311DEFAULT_CHUNK_SIZEr/   r0   Enumr1   r2   r  r   r   NO_EXTENSIONSr  ranger  METH_HEAD_ALLr  flagsdev_modeignore_environmentDEBUGCHARr;   CTL
SEPARATORSr  rX   r   rl   r)   r   r   r   r   sr   r   r   r   r   r   	lru_cacher   r   r   r  compiler	  r  r  r  r  r$  r%  r"  r   r;  rG  rM  r  rt  rs  ru  rV  rY  rX  r\  rl  rn  rm  Timeoutr  r  r  r~  r  r  r  total_orderingr  r  r  r  r*   _ETAGCr  _QUOTED_ETAGQUOTED_ETAG_RELIST_QUOTED_ETAG_REr  r+   r  r  r  r  r9   r9   r9   r?   <module>   s   (




F
	+
'
$ 

3
(



4B
/
1 ?


	