o
    m=8jr                     @   s  U 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 d dlm	Z	 d dl
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 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" ddl#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/m0Z0m1Z1m2Z2m3Z3m4Z4m5Z5 ddl6m7Z7m8Z8m9Z9 ddl:m;Z;m<Z< ddl=m>Z> erddl?m@Z@ dZAed ZBeCejDZEeeCeF  eGd< eHdZIeeF eGd< eJdeI dZKee	eF  eGd< eJdejLZMee	eF  eGd< eJdejLZNee	eF  eGd< eJdZOee	eP  eGd< eJd ZQee	eF  eGd!< eRh d"ZSeeReF  eGd#< G d$d% d%eZTG d&d' d'eZUed(eTeUZVG d)d* d*eZWG d+d, d,eZXG d-d. d.eZYG d/d0 d0ZZd1eeF d2e[fd3d4Z\G d5d6 d6e j]eeV Z^G d7d8 d8e^eT Z_G d9d: d:e^eU Z`G d;d< d<ZaG d=d> d>Zbe_Zce`ZdeTZeeUZfze)sdd?lgm_Z_m`Z`mTZTmUZU e_Zhe`ZieTZjeUZkW dS W dS  ely   Y dS w )@    N)suppress)IntEnum)Pattern)TYPE_CHECKINGAnyClassVarFinalGenericLiteral
NamedTupleTypeVar)CIMultiDictCIMultiDictProxyistr)URL   )hdrs)BaseProtocol)
HAS_BROTLIHAS_ZSTDBrotliDecompressorZLibDecompressorZSTDDecompressor)_EXC_SENTINELDEBUGDEFAULT_CHUNK_SIZEEMPTY_BODY_METHODSEMPTY_BODY_STATUS_CODESNO_EXTENSIONSBaseTimerContextset_exception)	BadHttpMessageBadHttpMethodBadStatusLineContentEncodingErrorContentLengthErrorInvalidHeaderInvalidURLErrorLineTooLongTransferEncodingError)HttpVersionHttpVersion10HttpVersion11)EMPTY_PAYLOADStreamReader)
RawHeaders)ResponseHandler)HeadersParser
HttpParserHttpRequestParserHttpResponseParserRawRequestMessageRawResponseMessage)   
   
ASCIISETz!#$%&'*+-.^_`|~_TCHAR_SPECIALSz
[0-9A-Za-zz]+TOKENREzHTTP/(\d)\.(\d)VERSREz\d+DIGITSs   [0-9a-fA-F]+	HEXDIGITSz[\x00-\x08\x0a-\x1f\x7f]_FIELD_VALUE_FORBIDDEN_CTL_RE>
   
user-agentcontent-typemax-forwardscontent-rangecontent-lengthcontent-locationtransfer-encodingetaghostserverSINGLETON_HEADERSc                   @   sb   e Zd ZU eed< eed< eed< ded< eed< eed< edB ed	< eed
< eed< eed< dS )r5   methodpathversionCIMultiDictProxy[str]headersraw_headersshould_closeNcompressionupgradechunkedurl)	__name__
__module____qualname__str__annotations__r*   r/   boolr    r\   r\   Z/home/nk/hobo-godmode/plappi-mvp/.venv/lib/python3.10/site-packages/aiohttp/http_parser.pyr5   o   s   
 r5   c                   @   s^   e Zd ZU eed< eed< eed< ee ed< eed< e	ed< edB ed< e	ed	< e	ed
< dS )r6   rM   codereasonrO   rP   rQ   NrR   rS   rT   )
rV   rW   rX   r*   rZ   intrY   r   r/   r[   r\   r\   r\   r]   r6   |   s   
 r6   _MsgTc                   @   s   e Zd ZdZdZdZdS )PayloadStater   r      N)rV   rW   rX   PAYLOAD_COMPLETEPAYLOAD_NEEDS_INPUTPAYLOAD_HAS_PENDING_INPUTr\   r\   r\   r]   rb      s    rb   c                   @   s   e Zd ZdZdZdZdZdS )
ParseStater   r   rc      N)rV   rW   rX   
PARSE_NONEPARSE_LENGTHPARSE_CHUNKEDPARSE_UNTIL_EOFr\   r\   r\   r]   rg      s
    rg   c                   @   s    e Zd ZdZdZdZdZdZdS )
ChunkStater   r   rc   rh      N)rV   rW   rX   PARSE_CHUNKED_SIZEPARSE_CHUNKED_CHUNKPARSE_CHUNKED_CHUNK_EOFPARSE_MAYBE_TRAILERSPARSE_TRAILERSr\   r\   r\   r]   rm      s    rm   c                   @   sR   e Zd Z				ddededededd	f
d
dZdee dede	f fddZ
d	S )r1        Fmax_line_sizemax_headersmax_field_sizelaxreturnNc                 C   s   || _ || _|| _|| _d S N)rv   rw   rx   _lax)selfrv   rw   rx   ry   r\   r\   r]   __init__   s   
zHeadersParser.__init__linesrN   c                 C   s  t  }g }d}|| }t|}|rz
|dd\}}W n ty(   t|d w t|dkr3t||d |d hddh@ rCt||d}|dd	}	t|	sWt||d7 }|| }| j	oi|oi|d d
v }
|
rt|}|g}|
r|t|7 }|| j
kr|d d| }t|d d d | j
|| |d7 }||k r|| }|r|d d
v }
nd}n|
sud|}|d}|dd	}| j	rd|v sd|v sd|v rt|n	t|rt|| j	s|	|v r|	 tv rtd|	 d||	| |||f |st|t|fS )Nr      :r       	   s    	utf-8surrogateescape)r   r   s   :     d      ...
 zDuplicate 'z' header found.)r   lensplit
ValueErrorr&   lstripdecoder;   	fullmatchr|   rx   joinr(   appendstripr?   searchlowerrJ   r!   addr   tuple)r}   r   rO   rP   	lines_idxline
line_countbnamebvaluenamecontinuationheader_length
bvalue_lstheader_linevaluer\   r\   r]   parse_headers   sr   







AzHeadersParser.parse_headers)rt   ru   rt   F)rV   rW   rX   r`   r[   r~   listbytesr   r/   r   r\   r\   r\   r]   r1      s*    

r1   rO   rz   c                 C   s"   |  tjd}| o| dv S )z)Check if the upgrade header is supported. >   tcp	websocket)getr   UPGRADEisasciir   )rO   ur\   r\   r]   _is_supported_upgrade   s   r   c                   @   s  e Zd ZU dZee ed< 														d6d	edB d
ej	dB de
de
de
de
dedB de
dB dedB dee dB dededede
ddfddZejdee defddZejdedefddZd7d d!Zd7d"d#ZdedB fd$d%Zd&d'ejejejfd(ed)ed*ed+ed,ed-ede ee ee!f  eef fd.d/Z"dee de d0e#edB edB eef fd1d2Z$d3eddfd4d5Z%dS )8r2   Fry   N   rt      Tr   protocollooplimitrv   rw   rx   timerr^   rK   payload_exceptionresponse_with_bodyread_until_eofauto_decompressmax_msg_queue_sizerz   c                 C   s   || _ || _|| _|| _|| _|| _|| _|| _|	| _|
| _|| _	|| _
g | _d| _d| _d | _d | _d| _|| _|| _t|||| j| _|| _d| _d S )Nr   Fr   )r   r   rv   rw   rx   r   r^   rK   r   r   r   _lines_tail	_upgraded_payload_payload_parser_payload_has_more_data_auto_decompress_limitr1   ry   _headers_parser_max_msg_queue_size_msg_in_flight)r}   r   r   r   rv   rw   rx   r   r^   rK   r   r   r   r   r   r\   r\   r]   r~     s2   

zHttpParser.__init__r   c                 C      d S r{   r\   )r}   r   r\   r\   r]   parse_message4     zHttpParser.parse_messagetec                 C   r   r{   r\   r}   r   r\   r\   r]   _is_chunked_te7  r   zHttpParser._is_chunked_tec                 C   s   | j d usJ | j   d S r{   )r   pause_readingr}   r\   r\   r]   r   :  s   zHttpParser.pause_readingc                 C   s    | j dkr|  j d8  _ dS dS )z;Protocol drained a queued message; free a slot for parsing.r   r   N)r   r   r\   r\   r]   message_consumed>  s   
zHttpParser.message_consumedc                 C   s   | j d ur| j   | j jrd | _ d S | jr| j| j | jrG| jd dkr-| jd tt | | jW  d    S 1 sBw   Y  d S )Nr   z
r   )	r   feed_eofdoner   r   r   r   	Exceptionr   r   r\   r\   r]   r   C  s   



 zHttpParser.feed_eofr7   r   dataSEPEMPTYCONTENT_LENGTHMETH_CONNECTSEC_WEBSOCKET_KEY1c                    s  g }| j r| j | d}| _ t|}d}	| j}
| j}d}|	|k s$| jrm| jd u r| js| jr@| j| jkr@||	d  | _ n-|	||	}||	krT| j
sT|t| }	q||	kr|r_td||	| }|dkrn|d}t||krt|d d d || j
| | j}t| j
| jkrtd	|t| }	| j
d
 |kr| jt| j
 }z| | j
W | j
  n| j
  w dtd B f fdd}| }|jv rt|jotj| _td| j}tdd}| jd usJ |tv pt|o|tv }|sC|d ur|dksjrC| jsCt| j| j |
| j!d}t"||j|j#| j$| j%| j&| j'| j(| j| j|| j!d}|j)sB|| _np||krvt*t+sPJ t| j| j |
| j!d}d| _t"|jj#| j&| j'| j(| j| j|| j!d
| _n=|s|d u r| j,rt| j| j |
| j!d}t"||j|j#| j$| j%| j&| j'| j(| j| j|| j!d}|j)s|| _nt-}||f | jr|  jd7  _j.}n||	d  | _ t| j | jkrt| j d d d | j|}n| jd u r| jr| j
rJ ns| j
r J | jd usJ z| j/||	d  |\}}W n8 t0yO } z+|}| j1d ur/| 1t2|}t3| jj4|| t5j6}d}t*|tt7frE W Y d }~nd }~ww |t5j8k| _|t5j6ur]nd}	t|}d | _|	|k s$| js$|r||	|k r|||	d  }n|}|| j|fS )Nr   r   FzData after `Connection: close`r8      r   r   zToo many headers receivedr   rz   c                     s2   j  } | d u rd S t| st t| S r{   )rO   r   r=   r   r&   r`   )
length_hdrr   msgr\   r]   get_content_length  s   
z0HttpParser.feed_data.<locals>.get_content_lengthrK   r^   )r   r   r   )lengthrT   rK   rR   r^   r   r   ry   headers_parserrv   rx   max_trailersr   T)	rK   rR   r   ry   r   rv   rx   r   r   r   )9r   r   r   rv   r   r   r   r   r   findr   r!   rstripr(   r   rx   rw   r   clearr`   rO   r&   rS   r   getattrrK   r   r   r[   r   rT   r.   r   r   HttpPayloadParserrR   r^   r   r   ry   r   r   
isinstancer5   r   r-   rQ   	feed_datar   r   rY   r    payloadrb   rd   r)   rf   )r}   r   r   r   r   r   r   messagesdata_len	start_posr   max_line_lengthrQ   posr   r   r   r   rK   r^   
empty_bodyr   payload_parserpayload_stateunderlying_excreraised_excr\   r   r]   r   T  sd  







  TzHttpParser.feed_datarN   c                 C   s   | j |\}}d}d}d}d}|tjd}|r9dd |D }	d|	v r'd}nd|	v r-d}d	|	v r9|tjr9d}|tjd
}
|
 rL|
	 dv rL|
}|tj
}|durf| |r]d}tj|v rftd||||||fS )zParses RFC 5322 headers from a stream.

        Line continuations are supported. Returns list of header name
        and value pairs. Header name is in upper case.
        NFr\   c                 S   s:   h | ]}d d | dD D ]}|r| r| qqS )c                 s   s    | ]}| d V  qdS ) 	N)r   ).0partr\   r\   r]   	<genexpr>Z  s    z5HttpParser.parse_headers.<locals>.<setcomp>.<genexpr>,)r   r   r   )r   
conn_valuetokenr\   r\   r]   	<setcomp>W  s    z+HttpParser.parse_headers.<locals>.<setcomp>closeTz
keep-aliverS   r   >   brgzipzstddeflatez6Transfer-Encoding can't be present with Content-Length)r   r   getallr   
CONNECTIONr   r   CONTENT_ENCODINGr   r   TRANSFER_ENCODINGr   r   r!   )r}   r   rO   rP   
close_connencodingrS   rT   conn_valuesconn_tokensencr   r\   r\   r]   r   C  s8   


zHttpParser.parse_headersvalc                 C   s
   || _ dS )zZSet connection upgraded (to websocket) mode.

        :param bool val: new state.
        N)r   )r}   r  r\   r\   r]   set_upgradedy  s   
zHttpParser.set_upgraded)NNr   rt   r   rt   NNNNTFTr   rz   N)&rV   rW   rX   ry   r   r[   rZ   r   asyncioAbstractEventLoopr`   r   rY   typeBaseExceptionr~   abcabstractmethodr   r   ra   r   r   r   r   r   r   r   r   r   _SEPr   r   r.   r   r/   r   r  r\   r\   r\   r]   r2     s   
 	


-


 p
6r2   c                   @   s8   e Zd ZdZdee defddZdede	fddZ
d	S )
r3   zRead request status line.

    Exception .http_exceptions.BadStatusLine
    could be raised in case of any errors in status line.
    Returns RawRequestMessage.
    r   rz   c                 C   s  |d  dd}z|jddd\}}}W n ty    t|d w t|s*t|t|}|d u r7t|tt	|
dt	|
d}|dkrRtj|d	d
}nD|drq|d\}	}
}|	d\}	}}tj|	||d	d}n%|dkr|dkrt|d	d}nt|d	d}|jdkrt|jdd d| |dd  \}}}}}}|tkrtj|vrtd|d u r|tkrd	}nd}t||||||||||
S )Nr   r   r    rc   maxsplitr   CONNECTT)	authorityencoded/#?)rL   query_stringfragmentr  *OPTIONS)r  r   )errorslatin1z!Missing 'Host' header in request.F)r   r   r   r"   r;   r   r<   r#   r*   r`   groupr   build
startswith	partitionschemer'   encoder   r,   r   HOSTr!   r+   r5   )r}   r   r   rK   rL   rM   match	version_orU   	path_part_hash_separatorurl_fragment_question_mark_separatorqs_partrO   rP   r   rR   rS   rT   r\   r\   r]   r     sp   




zHttpRequestParser.parse_messager   c                 C   s8   |j dddd d}| r| dkrdS td)	Nr   r   r  r   r   rT   Tz'Request has invalid `Transfer-Encoding`)rsplitr   r   r   r!   r   r\   r\   r]   r     s   z HttpRequestParser._is_chunked_teN)rV   rW   rX   __doc__r   r   r5   r   rY   r[   r   r\   r\   r\   r]   r3     s    Sr3   c                       s   e Zd ZU dZded< e Z	ddededB de	de	d	e
ee
eef  eef f
 fd
dZdee d	efddZded	efddZ  ZS )r4   zRead response status line and headers.

    BadStatusLine could be raised in case of any errors in status line.
    Returns RawResponseMessage.
    r0   r   Nr   r   argskwargsrz   c                    s0   |d u r
t rdnd}t j||g|R i |S )Nr7   r8   )r   superr   )r}   r   r   r0  r1  	__class__r\   r]   r     s   zHttpResponseParser.feed_datar   c              
   C   sb  |d  dd}z
|jdd\}}W n ty   t|d w z
|jdd\}}W n ty8   | }d}Y nw t|}|d u rFt|tt|	dt|	d}t
|dks`t|sdt|t|}| |dd  \}	}
}}}}|d u r|tkrd	}n!d
|  krdk sn |dv rd}ntj|	v stj|	v rd}nd	}t||| |	|
||||	S )Nr   r   r   r   r  r   rc   rh   Tr      >   0     F)r   r   r   r#   r   r<   r   r*   r`   r   r   r=   r   r+   r   r   r  r6   )r}   r   r   rM   statusr_   r'  r(  status_irO   rP   r   rR   rS   rT   r\   r\   r]   r     s\   


z HttpResponseParser.parse_messager   c                 C   s    |j dddd d dkS )Nr   r   r  r   r   rT   )r.  r   r   r   r\   r\   r]   r   6  s    z!HttpResponseParser._is_chunked_ter{   )rV   rW   rX   r/  rZ   r   ry   r   r  r   r   r   r6   r.   r[   r   r   rY   r   __classcell__r\   r\   r3  r]   r4     s$   
 :r4   c                    @   s   e Zd Z								d#dddeddededB d	ed
edB dedB dedB dededededededededdfddZ	d$ddZ
d$ddZ	d%deded edeeef fd!d"ZdS )&r   NFTrt   r   )rv   rx   r   r   r   r   rT   rR   r^   rK   r   r   ry   r   rv   rx   r   r   rz   c
                C   s   d| _ d| _tj| _tj| _d| _d| _	|| _
|	| _|
| _|| _|| _|| _d| _g | _d| _d| _|rA|rA| j
rAt|||d}n|}|sQtj| _|  d| _n!|rXtj| _n|d urrtj| _|| _ || _| j dkrr|  d| _|| _d S )Nr   Fr   )max_decompress_sizeT)_length_pausedrg   rl   _typerm   ro   _chunk_chunk_size_chunk_tailr   r|   r   _max_line_size_max_field_size_max_trailers_more_data_available_trailer_linesr   _eof_pendingDeflateBufferri   r   rk   rj   _length_expectedr   )r}   r   r   rT   rR   r^   rK   r   r   ry   r   rv   rx   r   r   real_payloadr\   r\   r]   r~   <  sF   


zHttpPayloadParser.__init__c                 C   s
   d| _ d S )NT)r=  r   r\   r\   r]   r   y  s   
zHttpPayloadParser.pause_readingc                 C   s   | j tjkr,d| _| jr| jrd| _d S | jdd| _| js| j  d| _	d| _d S | j tj
krD| j| j }td| d| j d| j tjkrNtdd S )	NTFr   r   z;Not enough data to satisfy content length header (received z of z bytes).z2Not enough data to satisfy transfer length header.)r>  rg   rl   rG  rE  r=  r   r   r   r   rj   rI  r<  r%   rk   r)   )r}   receivedr\   r\   r]   r   |  s2   

zHttpPayloadParser.feed_eofr7      ;chunkr   	CHUNK_EXTc                 C   s  | j tjkr_| jr| j| }d| _| j}t|t| d| _| j|d| || _	| j	rJ| j
r?d| _
||d | _tjdfS | jdd| _	| j	s-| jdkr]| j  tj||d fS nb| j tjkr| jr| jtjkr| j}| jtjkr{| j}t| j|krt| jdd d || j| }d| _|s| j	r| jtjkrQ||}|dkrI|| jkrt|dd d | j||d|}|dkr|d| }d|||  }	v rtd|	}
t| j|
 |
n|d| }| jr| }tt|st|d|  d	d
}
t| j|
 |
t!t"|d}||t| d }|dkr<tj| _| jr;|#dr;|dd }ntj| _|| _$| j%  n|| _tj&dfS | jtjkr| j
rgd| _
|| _tjdfS | j$}t|t| d| _$| j|d| || _	||d }| j	rq| j$rd| _
tj&dfS tj'| _| j(  | jtj'kr| jr|#dr|dd }|dt| |kr|t|d }tj| _n(t|t|ks||dt| krtd}
t| j|
 |
|| _tj&dfS | jtjkrz||}|dk r|| _tj&dfS |d| }||t| d }|dkr*|)d}t|| jkr>t|dd d | j| j*+| t| j*| j,krQt-d| j*d dkrzz| j./| j*\}}W | j*0  n| j*0  w | j  tj|fS |s| j	snA| j tj1kr| j|t|| _	| j	r| j
rd| _
tjdfS | jdd| _	| j	s| j2r| j  d| _3d| _2tjdfS tj&dfS )a  Receive a chunk of data to process.

        Return:
            PayloadState - The current state of payload processing.
                           This function may be called with empty bytes after returning
                           PAYLOAD_HAS_PENDING_INPUT to continue processing after a pause.
            bytes - If payload is complete, this is the unconsumed bytes intended for the
                    next message/payload, b"" otherwise.
        r   r   NFr   r   r8   z"Unexpected LF in chunk-extension: asciir      r   r   z3Chunk size mismatch: expected CRLF after chunk datazToo many trailers receivedr   T)4r>  rg   rj   rA  r<  maxr   r   r   rE  r=  rb   rf   r   rd   rk   r?  rm   rp   rB  rs   rC  r(   ro   r   r)   r    r|   r   rer   r>   r   r`   r   r"  r@  begin_http_chunk_receivingre   rq   end_http_chunk_receivingr   rF  r   rD  r!   r   r   r   rl   rG  r   )r}   rM  r   rN  requiredr   r   isize_bextexcsizer   trailersraw_trailersr\   r\   r]   r     s  













(









w



zHttpPayloadParser.feed_data)NFNNNTTFr	  )r7   rL  )rV   rW   rX   r   r.   r`   r[   rY   r1   r~   r   r   r   r  r   rb   r   r\   r\   r\   r]   r   ;  sr    	


=

r   c                	   @   s   e Zd ZU dZeed< efdededB de	ddfdd	Z
efd
ededdfddZdede	defddZdddZdddZdddZdS )rH  zDDeflateStream decompress stream and feed data into specified stream.decompressoroutr  Nr;  rz   c                 C   sv   || _ d| _| j|_|| _d| _|  |dkr!tstdt | _n|dkr0t	s+tdt
 | _nt|d| _|| _d S )Nr   Fr   zECan not decode content-encoding: brotli (br). Please install `Brotli`r   zRCan not decode content-encoding: zstandard (zstd). Please install `backports.zstd`)r  )r^  rZ  total_compressed_bytesr  _started_decodingr   r$   r   r]  r   r   r   _max_decompress_size)r}   r^  r  r;  r\   r\   r]   r~   P  s(   


zDeflateBuffer.__init__rY  	exc_causec                 C   s   t | j|| d S r{   )r    r^  )r}   rY  rb  r\   r\   r]   r    p  s   zDeflateBuffer.set_exceptionrM  rZ  c                 C   s   |  j |7  _ | j | j_| js$| jdkr$|d d@ dkr$t| jdd| _| jj}|tj	kr/dnt
| j|}z
| jj||d}W n tyM   td| j w d| _|r\| j|t| | jjS )	Nr   r         T)r  suppress_deflate_header)
max_lengthz#Can not decode content-encoding: %s)rZ  r^  r_  r`  r  r   r]  
_low_watersysmaxsizerQ  ra  decompress_syncr   r$   r   r   data_available)r}   rM  rZ  	low_waterrf  r\   r\   r]   r   w  s.   

zDeflateBuffer.feed_datac                 C   sD   | j  }|r	J | jdkr| jdkr| j jstd| j  d S )Nr   r   )r]  flushrZ  r  eofr$   r^  r   )r}   rM  r\   r\   r]   r     s   

zDeflateBuffer.feed_eofc                 C      | j   d S r{   )r^  rS  r   r\   r\   r]   rS       z(DeflateBuffer.begin_http_chunk_receivingc                 C   ro  r{   )r^  rT  r   r\   r\   r]   rT    rp  z&DeflateBuffer.end_http_chunk_receivingr	  )rV   rW   rX   r/  r   rZ   r   r.   rY   r`   r~   r   r  r    r   r[   r   r   rS  rT  r\   r\   r\   r]   rH  K  s2   
 
#

#
rH  )r3   r4   r5   r6   )mr  r
  rR  stringrh  
contextlibr   enumr   r   typingr   r   r   r   r	   r
   r   r   	multidictr   r   r   yarlr   r   r   base_protocolr   compression_utilsr   r   r   r   r   helpersr   r   r   r   r   r   r   r    http_exceptionsr!   r"   r#   r$   r%   r&   r'   r(   r)   http_writerr*   r+   r,   streamsr-   r.   typedefsr/   client_protor0   __all__r  set	printabler9   rY   rZ   escaper:   compiler;   ASCIIr<   r=   r>   r   r?   	frozensetrJ   r5   r6   ra   rb   rg   rm   r1   r[   r   ABCr2   r3   r4   r   rH  HttpRequestParserPyHttpResponseParserPyRawRequestMessagePyRawResponseMessagePy_http_parserHttpRequestParserCHttpResponseParserCRawRequestMessageCRawResponseMessageCImportErrorr\   r\   r\   r]   <module>   s   
 ((,
		"	\  dV  c
