o
    DXh                 	   @   s  	 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
 d dlmZ edZeedB Zed	ZeeB Zeed
 Zeed ZeedB ed
 ZeeB ZeedB ZeeB Zeed ZddhZeeB Zdd Zdd Ze de je jB ZG dd de Z!G dd de!Z"G dd de!Z#G dd de!Z$G dd de!Z%G d d! d!e"Z&G d"d# d#e!Z'G d$d% d%e!Z(G d&d' d'e!Z)G d(d) d)e!Z*G d*d+ d+e*Z+G d,d- d-e"Z,G d.d/ d/e!Z-G d0d1 d1e!Z.G d2d3 d3e!Z/G d4d5 d5e!Z0G d6d7 d7e!Z1G d8d9 d9e!Z2G d:d; d;e!Z3G d<d= d=e!Z4G d>d? d?e!Z5G d@dA dAe!Z6G dBdC dCe!Z7G dDdE dEe!Z8G dFdG dGe!Z9G dHdI dIe!Z:G dJdK dKe!Z;G dLdM dMe!Z<G dNdO dOe$Z=G dPdQ dQe!Z>G dRdS dSe!Z?G dTdU dUe!Z@G dVdW dWe!ZAG dXdY dYeAZBG dZd[ d[e!ZCG d\d] d]e!ZDG d^d_ d_e!ZEG d`da dae!ZFG dbdc dce!ZGG ddde deeGZHG dfdg dgeGZIG dhdi die!ZJG djdk dke!ZKG dldm dme!ZLG dndo doeLZMG dpdq dqeMZNG drds dse!ZOG dtdu duePZQG dvdw dweQZRG dxdy dyeQZSG dzd{ d{eRZTG d|d} d}e
jUZVeSd
d~ZWeSddZXeSddZYe dZd[ej\Z]e dZe ^d[ej_Z`e djaZbe dZe ^d[ej_Zce dZe ^d[ej_Zde dZe ^d[ej_Zedd Zfdd Zgdd ZhdddZidd Zjdd Zkdd Zldd Zmdd Zndd Zodd Zpdd Zqdd Zrdd Zsdd Ztdd Zudd Zvdd Zwdd Zxdd Zydd Zzdd Z{dd Z|dd Z}dd Z~dd Zdd Zdd Zdd ZddÄ Zddń ZddǄ ZddɄ Zdd˄ Zdd̈́ Zddτ Zddф Zddӄ ZddՄ Zddׄ Zddل Zddۄ Zdd݄ Zdd߄ Zdd Zdd Zdd Zdd Zdd Zdd Zdd Zdd Zdd Zdd Zdd Zdd Zdd Zdd ZdS )    N)	hexdigits)
itemgetter)_encoded_words)errors)utilsz 	(z()<>@,:;.\"[].z."(z/?=z*'%%
c                 C   s   	 t | ddddS )N\\\"z\")strreplacevalue r   D/opt/python-3.10.19/usr/lib/python3.10/email/_header_value_parser.pymake_quoted_pairsc   s   r   c                 C   s   t | }d| dS )Nr   )r   )r   escapedr   r   r   quote_stringh   s   r   z
   =\?            # literal =?
   [^?]*          # charset
   \?             # literal ?
   [qQbB]         # literal 'q' or 'b', case insensitive
   \?             # literal ?
  .*?             # encoded word
  \?=             # literal ?=
c                       s   e Zd ZdZdZdZ fddZdd Z fddZe	d	d
 Z
e	dd Zdd Ze	dd Ze	dd Zdd ZdddZdddZdddZ  ZS )	TokenListNTc                    s   t  j|i | g | _d S N)super__init__defects)selfargskw	__class__r   r   r      s   
zTokenList.__init__c                 C      d dd | D S )N c                 s       | ]}t |V  qd S r   r   .0xr   r   r   	<genexpr>       z$TokenList.__str__.<locals>.<genexpr>joinr   r   r   r   __str__      zTokenList.__str__c                       d | jjt  S Nz{}({})formatr!   __name__r   __repr__r-   r    r   r   r5      s   
zTokenList.__repr__c                 C   r"   )Nr#   c                 s   s    | ]	}|j r|j V  qd S r   r   r&   r   r   r   r)      s    z"TokenList.value.<locals>.<genexpr>r+   r-   r   r   r   r         zTokenList.valuec                 C   s   t dd | D | jS )Nc                 s       | ]}|j V  qd S r   )all_defectsr&   r   r   r   r)          z(TokenList.all_defects.<locals>.<genexpr>)sumr   r-   r   r   r   r8      s   zTokenList.all_defectsc                 C   s   | d   S Nr   )startswith_fwsr-   r   r   r   r<         zTokenList.startswith_fwsc                 C   s   	 t dd | D S )Nc                 s   r7   r   )as_ew_allowed)r'   partr   r   r   r)      r9   z*TokenList.as_ew_allowed.<locals>.<genexpr>)allr-   r   r   r   r>      s   zTokenList.as_ew_allowedc                 C   s   g }| D ]}| |j q|S r   )extendcomments)r   rB   tokenr   r   r   rB      s   zTokenList.commentsc                C   s   t | |dS )Npolicy)_refold_parse_treer   rE   r   r   r   fold   r=   zTokenList.foldr#   c                 C   s   t | j|d d S )Nindent)printppstrr   rJ   r   r   r   pprint   r/   zTokenList.pprintc                 C   s   d | j|dS )Nr
   rI   )r,   _pprM   r   r   r   rL      s   zTokenList.ppstrc                 c   s|    d || jj| jV  | D ]}t|ds|d | V  q||d E d H  q| jr3d | j}nd}d ||V  d S )Nz{}{}/{}(rO   z*    !! invalid element in token list: {!r}z    z Defects: {}r#   z{}){})r3   r!   r4   
token_typehasattrrO   r   )r   rJ   rC   extrar   r   r   rO      s    
zTokenList._ppr#   )r4   
__module____qualname__rP   syntactic_breakew_combine_allowedr   r.   r5   propertyr   r8   r<   r>   rB   rH   rN   rL   rO   __classcell__r   r   r    r   r   }   s(    





r   c                   @   s$   e Zd Zedd Zedd ZdS )WhiteSpaceTokenListc                 C      dS N r   r-   r   r   r   r         zWhiteSpaceTokenList.valuec                 C      dd | D S )Nc                 S      g | ]
}|j d kr|jqS )comment)rP   contentr&   r   r   r   
<listcomp>       z0WhiteSpaceTokenList.comments.<locals>.<listcomp>r   r-   r   r   r   rB         zWhiteSpaceTokenList.commentsN)r4   rT   rU   rX   r   rB   r   r   r   r   rZ      s
    
rZ   c                   @      e Zd ZdZdS )UnstructuredTokenListunstructuredNr4   rT   rU   rP   r   r   r   r   rg          rg   c                   @   rf   )PhrasephraseNri   r   r   r   r   rk      rj   rk   c                   @   rf   )WordZwordNri   r   r   r   r   rm      rj   rm   c                   @   rf   )CFWSListcfwsNri   r   r   r   r   rn      rj   rn   c                   @   rf   )AtomatomNri   r   r   r   r   rp      rj   rp   c                   @      e Zd ZdZdZdS )TokenrC   FN)r4   rT   rU   rP   Zencode_as_ewr   r   r   r   rs          rs   c                   @   s   e Zd ZdZdZdZdZdS )EncodedWordencoded-wordN)r4   rT   rU   rP   ctecharsetlangr   r   r   r   ru      
    ru   c                   @   4   e Zd ZdZedd Zedd Zedd ZdS )	QuotedStringquoted-stringc                 C   "   | D ]}|j dkr|j  S qd S Nbare-quoted-stringrP   r   r   r(   r   r   r   rb      
   

zQuotedString.contentc                 C   s>   g }| D ]}|j dkr|t| q||j qd|S )Nr   r#   )rP   appendr   r   r,   )r   resr(   r   r   r   quoted_value   s   

zQuotedString.quoted_valuec                 C   r~   r   r   r   rC   r   r   r   stripped_value   r   zQuotedString.stripped_valueN)r4   rT   rU   rP   rX   rb   r   r   r   r   r   r   r|      s    

	r|   c                   @   s$   e Zd ZdZdd Zedd ZdS )BareQuotedStringr   c                 C   s   t ddd | D S )Nr#   c                 s   r$   r   r%   r&   r   r   r   r)   
  r*   z+BareQuotedString.__str__.<locals>.<genexpr>)r   r,   r-   r   r   r   r.   	  s   zBareQuotedString.__str__c                 C   r"   )Nr#   c                 s   r$   r   r%   r&   r   r   r   r)     r*   z)BareQuotedString.value.<locals>.<genexpr>r+   r-   r   r   r   r     r6   zBareQuotedString.valueN)r4   rT   rU   rP   r.   rX   r   r   r   r   r   r     s
    r   c                   @   s8   e Zd ZdZdd Zdd Zedd Zedd	 Zd
S )Commentra   c                    s(   d tdg fdd D dggg S )Nr#   r   c                    s   g | ]}  |qS r   )quoter&   r-   r   r   rc     s    z#Comment.__str__.<locals>.<listcomp>))r,   r:   r-   r   r-   r   r.     s   zComment.__str__c                 C   s2   |j dkr	t|S t|ddddddS )Nra   r   r   r   z\(r   z\))rP   r   r   )r   r   r   r   r   r     s   
zComment.quotec                 C   r"   )Nr#   c                 s   r$   r   r%   r&   r   r   r   r)   %  r*   z"Comment.content.<locals>.<genexpr>r+   r-   r   r   r   rb   #  r6   zComment.contentc                 C   s   | j gS r   )rb   r-   r   r   r   rB   '  s   zComment.commentsN)	r4   rT   rU   rP   r.   r   rX   rb   rB   r   r   r   r   r     s    
r   c                   @   r{   )	AddressListzaddress-listc                 C   r_   )Nc                 S      g | ]	}|j d kr|qS )addressrP   r&   r   r   r   rc   1      z)AddressList.addresses.<locals>.<listcomp>r   r-   r   r   r   	addresses/  re   zAddressList.addressesc                 C      t dd | D g S )Nc                 s        | ]}|j d kr|jV  qdS r   NrP   	mailboxesr&   r   r   r   r)   5      z(AddressList.mailboxes.<locals>.<genexpr>r:   r-   r   r   r   r   3  
   zAddressList.mailboxesc                 C   r   )Nc                 s   r   r   rP   all_mailboxesr&   r   r   r   r)   :  r   z,AddressList.all_mailboxes.<locals>.<genexpr>r   r-   r   r   r   r   8  r   zAddressList.all_mailboxesN)r4   rT   rU   rP   rX   r   r   r   r   r   r   r   r   +  s    

r   c                   @   r{   )	Addressr   c                 C      | d j dkr| d jS d S )Nr   grouprP   display_namer-   r   r   r   r   B     
zAddress.display_namec                 C   s4   | d j dkr| d gS | d j dkrg S | d jS Nr   mailboxinvalid-mailboxr   r-   r   r   r   r   G  s
   

zAddress.mailboxesc                 C   s:   | d j dkr| d gS | d j dkr| d gS | d jS r   r   r-   r   r   r   r   O  s
   


zAddress.all_mailboxesN)r4   rT   rU   rP   rX   r   r   r   r   r   r   r   r   >  s    

r   c                   @   (   e Zd ZdZedd Zedd ZdS )MailboxListmailbox-listc                 C   r_   )Nc                 S   r   )r   r   r&   r   r   r   rc   ]  r   z)MailboxList.mailboxes.<locals>.<listcomp>r   r-   r   r   r   r   [  re   zMailboxList.mailboxesc                 C   r_   )Nc                 S   s   g | ]	}|j d v r|qS ))r   r   r   r&   r   r   r   rc   a  s    
z-MailboxList.all_mailboxes.<locals>.<listcomp>r   r-   r   r   r   r   _  re   zMailboxList.all_mailboxesNr4   rT   rU   rP   rX   r   r   r   r   r   r   r   W  s    
r   c                   @   r   )	GroupList
group-listc                 C       | r	| d j dkrg S | d jS Nr   r   r   r-   r   r   r   r   i     
zGroupList.mailboxesc                 C   r   r   r   r-   r   r   r   r   o  r   zGroupList.all_mailboxesNr   r   r   r   r   r   e  s    
r   c                   @   r{   )	Groupr   c                 C      | d j dkr	g S | d jS N   r   r   r-   r   r   r   r   z     
zGroup.mailboxesc                 C   r   r   r   r-   r   r   r   r     r   zGroup.all_mailboxesc                 C   
   | d j S r;   )r   r-   r   r   r   r        
zGroup.display_nameN)r4   rT   rU   rP   rX   r   r   r   r   r   r   r   r   v  s    

r   c                   @   L   e Zd ZdZedd Zedd Zedd Zedd	 Zed
d Z	dS )NameAddr	name-addrc                 C   s   t | dkrd S | d jS N   r   )lenr   r-   r   r   r   r        
zNameAddr.display_namec                 C   r   N
local_partr-   r   r   r   r     r   zNameAddr.local_partc                 C   r   r   domainr-   r   r   r   r     r   zNameAddr.domainc                 C   r   r   )router-   r   r   r   r     r   zNameAddr.routec                 C   r   r   	addr_specr-   r   r   r   r     r   zNameAddr.addr_specN
r4   rT   rU   rP   rX   r   r   r   r   r   r   r   r   r   r     s    



r   c                   @   s@   e Zd ZdZedd Zedd Zedd Zedd	 Zd
S )	AngleAddrz
angle-addrc                 C   r~   N	addr-spec)rP   r   r   r   r   r   r     r   zAngleAddr.local_partc                 C   r~   r   rP   r   r   r   r   r   r     r   zAngleAddr.domainc                 C   r~   )N	obs-route)rP   domainsr   r   r   r   r     r   zAngleAddr.routec                 C   s<   | D ]}|j dkr|jr|j  S t|j|j   S qdS )Nr   z<>)rP   r   r   r   r   r   r   r   r     s   

zAngleAddr.addr_specN)	r4   rT   rU   rP   rX   r   r   r   r   r   r   r   r   r     s    


r   c                   @      e Zd ZdZedd ZdS )ObsRouter   c                 C   r_   )Nc                 S   r`   r   r   r&   r   r   r   rc     rd   z$ObsRoute.domains.<locals>.<listcomp>r   r-   r   r   r   r     re   zObsRoute.domainsN)r4   rT   rU   rP   rX   r   r   r   r   r   r         r   c                   @   r   )Mailboxr   c                 C   r   Nr   r   r   r-   r   r   r   r     r   zMailbox.display_namec                 C   r   r;   r   r-   r   r   r   r     r   zMailbox.local_partc                 C   r   r;   r   r-   r   r   r   r     r   zMailbox.domainc                 C   r   r   )rP   r   r-   r   r   r   r     r   zMailbox.routec                 C   r   r;   r   r-   r   r   r   r     r   zMailbox.addr_specNr   r   r   r   r   r     s    



r   c                   @   s,   e Zd ZdZedd Ze Z Z ZZ	dS )InvalidMailboxr   c                 C      d S r   r   r-   r   r   r   r     r^   zInvalidMailbox.display_nameNr   r   r   r   r   r     s
    
r   c                       s(   e Zd ZdZdZe fddZ  ZS )Domainr   Fc                       d t j S Nr#   r,   r   r   splitr-   r    r   r   r        zDomain.domain)r4   rT   rU   rP   r>   rX   r   rY   r   r   r    r   r     s
    r   c                   @   rf   )DotAtomdot-atomNri   r   r   r   r   r     rj   r   c                   @   rr   )DotAtomTextzdot-atom-textTNr4   rT   rU   rP   r>   r   r   r   r   r     rt   r   c                   @   rr   )NoFoldLiteralzno-fold-literalFNr   r   r   r   r   r   
  rt   r   c                   @   sD   e Zd ZdZdZedd Zedd Zedd Zed	d
 Z	dS )AddrSpecr   Fc                 C   r   r;   r   r-   r   r   r   r     r   zAddrSpec.local_partc                 C   s   t | dk rd S | d jS )N   r   )r   r   r-   r   r   r   r     r   zAddrSpec.domainc                 C   s<   t | dk r| d jS | d j | d j | d j  S )Nr   r   r   r   )r   r   rstriplstripr-   r   r   r   r     s   
&zAddrSpec.valuec                 C   sL   t | j}t|t|t krt| j}n| j}| jd ur$|d | j S |S )N@)setr   r   DOT_ATOM_ENDSr   r   )r   ZnamesetZlpr   r   r   r   $  s   

zAddrSpec.addr_specN)
r4   rT   rU   rP   r>   rX   r   r   r   r   r   r   r   r   r     s    


r   c                   @   rr   )ObsLocalPartzobs-local-partFNr   r   r   r   r   r   0      r   c                       s4   e Zd ZdZdZedd Ze fddZ  ZS )DisplayNamezdisplay-nameFc                 C   s   t | }t|dkr|jS |d jdkr|d n|d d jdkr/t |d dd  |d< |d jdkr=|  |jS |d d jdkrRt |d d d |d< |jS )Nr   ro   r   r   )r   r   r   rP   pop)r   r   r   r   r   r   ;  s   zDisplayName.display_namec                    s   d}| j rd}n| D ]	}|jdkrd}q
t| dkrM|rMd }}| d jdks0| d d jdkr2d}| d jdksB| d d jdkrDd}|t| j | S t jS )	NFTr}   r   r#   ro   r]   r   )r   rP   r   r   r   r   r   )r   r   r(   preZpostr    r   r   r   L  s   
  zDisplayName.value)	r4   rT   rU   rP   rW   rX   r   r   rY   r   r   r    r   r   6  s    
r   c                   @   s,   e Zd ZdZdZedd Zedd ZdS )	LocalPartz
local-partFc                 C   s"   | d j dkr| d jS | d jS )Nr   r}   )rP   r   r   r-   r   r   r   r   e  s   

zLocalPart.valuec                 C   s   t g}t }d}| d t g D ]J}|jdkrq|r.|jdkr.|d jdkr.t|d d |d< t|t}|rM|jdkrM|d jdkrM|t|dd   n|| |d }|}qt|dd }|jS )NFr   ro   dotr   r   )DOTrP   r   
isinstancer   r   )r   r   lastZ
last_is_tltokZis_tlr   r   r   r   l  s$   


zLocalPart.local_partN)r4   rT   rU   rP   r>   rX   r   r   r   r   r   r   r   `  s    
r   c                       s4   e Zd ZdZdZe fddZedd Z  ZS )DomainLiteralzdomain-literalFc                    r   r   r   r-   r    r   r   r     r   zDomainLiteral.domainc                 C   r~   )Nptextr   r   r   r   r   ip  r   zDomainLiteral.ip)	r4   rT   rU   rP   r>   rX   r   r   rY   r   r   r    r   r     s    r   c                   @   s   e Zd ZdZdZdZdS )MIMEVersionzmime-versionN)r4   rT   rU   rP   majorminorr   r   r   r   r     s    r   c                   @   s4   e Zd ZdZdZdZdZedd Zedd Z	dS )		Parameter	parameterFus-asciic                 C   s   | j r| d jS dS r   )	sectionednumberr-   r   r   r   section_number  s   zParameter.section_numberc                 C   sf   | D ].}|j dkr|j  S |j dkr0|D ]}|j dkr/|D ]}|j dkr.|j      S qqqdS )Nr   r}   r   r#   )rP   r   r   r   r   r   param_value  s   




zParameter.param_valueN)
r4   rT   rU   rP   r   extendedrx   rX   r   r   r   r   r   r   r     s    
r   c                   @   rf   )InvalidParameterinvalid-parameterNri   r   r   r   r   r     s    r   c                   @   r   )	Attribute	attributec                 C   s$   | D ]}|j dr|j  S qd S )Nattrtext)rP   endswithr   r   r   r   r   r     s
   
zAttribute.stripped_valueNr4   rT   rU   rP   rX   r   r   r   r   r   r    r   r  c                   @   s   e Zd ZdZdZdS )SectionsectionN)r4   rT   rU   rP   r   r   r   r   r   r    r   r  c                   @   r   )Valuer   c                 C   s2   | d }|j dkr| d }|j dr|jS | jS )Nr   ro   r   )r}   r  zextended-attribute)rP   r  r   r   r   r   r   r   r     s   
zValue.stripped_valueNr  r   r   r   r   r    r   r  c                   @   s(   e Zd ZdZdZedd Zdd ZdS )MimeParametersmime-parametersFc                 c   s   i }| D ]*}|j dsq|d j dkrq|d j }||vr%g ||< || |j|f q| D ]\}}t|tdd}|d d }|j	}|j
smt|dkrm|d d dkrm|d d jtd |d d }g }d}|D ]n\}	}
|	|kr|
j
s|
jtd qs|
jtd |d7 }|
j}|
j
rztj|}W n ty   tjj|d	d
}Y n(w z||d}W n ttfy   |dd}Y nw t|r|
jt  || qsd|}||fV  q4d S )Nr   r   r  )keyr   z.duplicate parameter name; duplicate(s) ignoredz+duplicate parameter name; duplicate ignoredz(inconsistent RFC2231 parameter numberingzlatin-1)encodingsurrogateescaper   r#   )rP   r  r   stripr   r   itemssortedr   rx   r   r   r   r   InvalidHeaderDefectr   urllibparseunquote_to_bytesUnicodeEncodeErrorunquotedecodeLookupErrorr   _has_surrogatesUndecodableBytesDefectr,   )r   paramsrC   namepartsZfirst_paramrx   Zvalue_partsir   paramr   r   r   r   r    sh   



zMimeParameters.paramsc                 C   sT   g }| j D ]\}}|r|d|t| q|| qd|}|r(d| S dS )N{}={}z; r]   r#   )r  r   r3   r   r,   )r   r  r  r   r   r   r   r.   &  s   
zMimeParameters.__str__N)r4   rT   rU   rP   rV   rX   r  r.   r   r   r   r   r	    s    
Er	  c                   @   r   )ParameterizedHeaderValueFc                 C   s&   t | D ]}|jdkr|j  S qi S )Nr
  )reversedrP   r  r   r   r   r   r  7  s
   

zParameterizedHeaderValue.paramsN)r4   rT   rU   rV   rX   r  r   r   r   r   r!  1  s    r!  c                   @   s   e Zd ZdZdZdZdZdS )ContentTypezcontent-typeFtextZplainN)r4   rT   rU   rP   r>   maintypesubtyper   r   r   r   r#  ?  rz   r#  c                   @   s   e Zd ZdZdZdZdS )ContentDispositionzcontent-dispositionFN)r4   rT   rU   rP   r>   content_dispositionr   r   r   r   r'  F      r'  c                   @   s   e Zd ZdZdZdZdS )ContentTransferEncodingzcontent-transfer-encodingFZ7bitN)r4   rT   rU   rP   r>   rw   r   r   r   r   r*  L  r)  r*  c                   @   rr   )HeaderLabelzheader-labelFNr   r   r   r   r   r+  R  rt   r+  c                   @   s   e Zd ZdZdZdd ZdS )MsgIDzmsg-idFc                 C   s   t | |j S r   )r   lineseprG   r   r   r   rH   [  re   z
MsgID.foldN)r4   rT   rU   rP   r>   rH   r   r   r   r   r,  W  s    r,  c                   @   rf   )	MessageIDz
message-idNri   r   r   r   r   r.  `  rj   r.  c                   @   rf   )InvalidMessageIDzinvalid-message-idNri   r   r   r   r   r/  d  rj   r/  c                   @   rf   )HeaderheaderNri   r   r   r   r   r0  h  rj   r0  c                       sr   e Zd ZdZdZdZ fddZ fddZdd Ze	dd	 Z
d fdd	Zdd Ze	dd Zdd Z  ZS )TerminalTc                    s   t  | |}||_g |_|S r   )r   __new__rP   r   )clsr   rP   r   r    r   r   r3  v  s   zTerminal.__new__c                    r0   r1   r2   r-   r    r   r   r5   |  s   zTerminal.__repr__c                 C   s   t | jjd | j  d S )N/)rK   r!   r4   rP   r-   r   r   r   rN     s   zTerminal.pprintc                 C   s
   t | jS r   )listr   r-   r   r   r   r8     r   zTerminal.all_defectsr#   c              	      s6   d || jj| jt  | jsdgS d | jgS )Nz{}{}/{}({}){}r#   z {})r3   r!   r4   rP   r   r5   r   rM   r    r   r   rO     s   
zTerminal._ppc                 C   r   r   r   r-   r   r   r   pop_trailing_ws  r^   zTerminal.pop_trailing_wsc                 C   s   g S r   r   r-   r   r   r   rB     r^   zTerminal.commentsc                 C   s   t | | jfS r   )r   rP   r-   r   r   r   __getnewargs__  s   zTerminal.__getnewargs__rS   )r4   rT   rU   r>   rW   rV   r3  r5   rN   rX   r8   rO   r7  rB   r8  rY   r   r   r    r   r2  p  s    
	
r2  c                   @       e Zd Zedd Zdd ZdS )WhiteSpaceTerminalc                 C   r[   r\   r   r-   r   r   r   r     r^   zWhiteSpaceTerminal.valuec                 C   r[   )NTr   r-   r   r   r   r<        z!WhiteSpaceTerminal.startswith_fwsNr4   rT   rU   rX   r   r<   r   r   r   r   r:        
r:  c                   @   r9  )ValueTerminalc                 C   s   | S r   r   r-   r   r   r   r     r^   zValueTerminal.valuec                 C   r[   )NFr   r-   r   r   r   r<     r;  zValueTerminal.startswith_fwsNr<  r   r   r   r   r>    r=  r>  c                   @   r9  )EWWhiteSpaceTerminalc                 C   r[   r   r   r-   r   r   r   r     r^   zEWWhiteSpaceTerminal.valuec                 C   r[   r   r   r-   r   r   r   r.     r;  zEWWhiteSpaceTerminal.__str__N)r4   rT   rU   rX   r   r.   r   r   r   r   r?    r=  r?  c                   @   s   e Zd ZdS )_InvalidEwErrorN)r4   rT   rU   r   r   r   r   r@    s    r@  r   ,list-separatorr   zroute-component-markerz([{}]+)r#   z[^{}]+z[\x00-\x20\x7F]c                 C   sD   	 t | }|r| jt| t| r | jtd d S d S )Nz*Non-ASCII characters found in header token)_non_printable_finderr   r   r   ZNonPrintableDefectr   r  r  )xtextZnon_printablesr   r   r   _validate_xtext  s   


rE  c                 C   s   	 t | d^}}g }d}d}tt|D ]&}|| dkr&|r#d}d}nd}q|r+d}n|| |v r3 n|||  q|d }d|d||d  g| |fS )Nr   Fr   Tr#   )_wsp_splitterranger   r   r,   )r   endcharsfragment	remainderZvcharsescapehad_qpposr   r   r   _get_ptext_to_endchars  s&   $rN  c                 C   s0   	 |   }t| d t| t|  d}||fS )Nfws)r   r:  r   )r   ZnewvaluerO  r   r   r   get_fws  s   rP  vtextc              	   C   s  	 t  }| dstd| | dd  dd^}}|| dd  kr-td| d|}t|dkrY|d tv rY|d tv rY|	ddk rY|dd^}}|d | }t| dkrj|j
td	 | |_d|} ztd| d \}}}	}
W n ttfy   td
|jw ||_|	|_|j
|
 |r|d tv rt|\}}|| qt|d^}}t||}t| || d|}|s| r| d tvr|j
td || fS )N=?z"expected encoded word but found {}r   z?=r   r#   r   ?zwhitespace inside encoded wordz!encoded word format invalid: '{}'z.missing trailing whitespace after encoded-word)ru   
startswithr   HeaderParseErrorr3   r   r,   r   r   countr   r   r  rw   _ewr  
ValueErrorKeyErrorr@  rx   ry   rA   WSPrP  rF  r>  rE  )r   Zterminal_typeZewr   rJ  Zremstrrestr$  rx   ry   r   rC   charsrQ  r   r   r   get_encoded_word  sd   









r]  c                 C   sB  	 t  }| r| d tv rt| \}} || qd}| druz	t| d\}} W n ty3   d}Y nB tjy<   Y n9w d}t	|dkrW|d j
dkrW|jtd d}|rot	|d	kro|d
 j
dkrot|d d|d< || qt| d	^}}|rt|r| d^}}t|d}t| || d|} | s|S )Nr   TrR  ZutextFr   rO  z&missing whitespace before encoded wordr   rv   r#   )rg   rZ  rP  r   rT  r]  r@  r   rU  r   rP   r   r  r?  rF  rfc2047_matchersearch	partitionr>  rE  r,   )r   rh   rC   valid_ewZhave_wsr   rJ  rQ  r   r   r   get_unstructuredI  sN   






)rc  c                 C   ,   	 t | d\}} }t|d}t| || fS )Nz()r   )rN  r:  rE  r   r   _r   r   r   get_qp_ctext  s
   
rg  c                 C   rd  )Nr   r   )rN  r>  rE  re  r   r   r   get_qcontent  s
   	
rh  c                 C   P   	 t | }|std| | }| t|d  } t|d}t| || fS )Nzexpected atext but found '{}'atext)_non_atom_end_matcherr   rU  r3   r   r   r>  rE  )r   mrj  r   r   r   	get_atext  s   
rm  c                 C   sp  	 | d dkrt d| t }| dd  } | r+| d dkr+t| \}} || | r| d dkr| d tv r@t| \}} nT| d d dkrd}zt| \}} |j	t 
d d	}W n t jym   t| \}} Y nw |rt|dkr|d
 jdkr|d jdkrt|d
 d|d
< nt| \}} || | r| d dks3| s|j	t 
d || fS || dd  fS )Nr   r   zexpected '"' but found '{}'r   r   rR  Fz!encoded word inside quoted stringTr   rO  r^  rv   z"end of header inside quoted string)r   rU  r3   r   rh  r   rZ  rP  r]  r   r  r   rP   r?  )r   Zbare_quoted_stringrC   rb  r   r   r   get_bare_quoted_string  sP   



rn  c                 C   s   	 | r| d dkrt d| t }| dd  } | rO| d dkrO| d tv r/t| \}} n| d dkr<t| \}} nt| \}} || | rO| d dks"| s^|j	t 
d || fS || dd  fS )Nr   r   zexpected '(' but found '{}'r   r   zend of header inside comment)r   rU  r3   r   rZ  rP  get_commentrg  r   r   r  )r   ra   rC   r   r   r   ro    s*   

ro  c                 C   s`   	 t  }| r,| d tv r,| d tv rt| \}} nt| \}} || | r,| d tv s|| fS r;   )rn   CFWS_LEADERrZ  rP  ro  r   )r   ro   rC   r   r   r   get_cfws   s   
rq  c                 C   sr   	 t  }| r| d tv rt| \}} || t| \}} || | r5| d tv r5t| \}} || || fS r;   )r|   rp  rq  r   rn  )r   Zquoted_stringrC   r   r   r   get_quoted_string  s   


rr  c                 C   s   	 t  }| r| d tv rt| \}} || | r'| d tv r'td| | drEzt	| \}} W n tjyD   t
| \}} Y nw t
| \}} || | rc| d tv rct| \}} || || fS )Nr   zexpected atom but found '{}'rR  )rp   rp  rq  r   	ATOM_ENDSr   rU  r3   rT  r]  rm  )r   rq   rC   r   r   r   get_atom  s*   



rt  c                 C   s   	 t  }| r| d tv rtd| | rB| d tvrBt| \}} || | r:| d dkr:|t | dd  } | rB| d tvs|d tu rRtdd|  || fS )Nr   z8expected atom at a start of dot-atom-text but found '{}'r   r   r   z4expected atom at end of dot-atom-text but found '{}')r   rs  r   rU  r3   rm  r   r   )r   Zdot_atom_textrC   r   r   r   get_dot_atom_text:  s$   


ru  c                 C   s   	 t  }| d tv rt| \}} || | dr3zt| \}} W n tjy2   t| \}} Y nw t| \}} || | rQ| d tv rQt| \}} || || fS )Nr   rR  )	r   rp  rq  r   rT  r]  r   rU  ru  )r   Zdot_atomrC   r   r   r   get_dot_atomM  s"   



rv  c                 C   s   	 | d t v rt| \}} nd }| std| d dkr$t| \}} n| d tv r2td| t| \}} |d urC|g|d d< || fS )Nr   z5Expected 'atom' or 'quoted-string' but found nothing.r   z1Expected 'atom' or 'quoted-string' but found '{}')rp  rq  r   rU  rr  SPECIALSr3   rt  )r   leaderrC   r   r   r   get_wordf  s$   ry  c                 C   s  	 t  }zt| \}} || W n tjy$   |jtd Y nw | r| d tvr| d dkrH|t |jt	d | dd  } n/zt| \}} W n! tjyq   | d t
v rnt| \}} |jt	d n Y nw || | r| d tvs-|| fS )Nzphrase does not start with wordr   r   zperiod in 'phrase'r   zcomment found without atom)rk   ry  r   r   rU  r   r  PHRASE_ENDSr   ObsoleteHeaderDefectrp  rq  )r   rl   rC   r   r   r   
get_phrase  s>   





r|  c                 C   sn  	 t  }d }| d tv rt| \}} | std| zt| \}} W n- tjyQ   zt| \}} W n tjyN   | d dkrI| d tv rI t	 }Y nw Y nw |d ur]|g|d d< |
| | r| d dksp| d tvrtt||  \}} |jdkr|j
td n	|j
td ||d< z|jd W || fS  ty   |j
td Y || fS w )	Nr   z"expected local-part but found '{}'r   invalid-obs-local-partz<local-part is not dot-atom, quoted-string, or obs-local-partz,local-part is not a dot-atom (contains CFWS)asciiz)local-part contains non-ASCII characters))r   rp  rq  r   rU  r3   rv  ry  rz  r   r   get_obs_local_partr   rP   r   r  r{  r   encoder  ZNonASCIILocalPartDefect)r   r   rx  rC   obs_local_partr   r   r   get_local_part  sV   





r  c                 C   s  	 t  }d}| r| d dks| d tvr| d dkr3|r%|jtd |t d}| dd  } q| d dkrU|t| d d | dd  } |jtd	 d}q|rg|d
 jdkrg|jtd z
t	| \}} d}W n tj
y   | d tvr t| \}} Y nw || | r| d dks| d tvs|d jdks|d jdkr|d jdkr|jtd |d
 jdks|d
 jdkr|d jdkr|jtd |jrd|_|| fS )NFr   r   r   zinvalid repeated '.'Tr   misplaced-specialz/'\' character outside of quoted-string/ccontentr   r   zmissing '.' between wordsro   z!Invalid leading '.' in local partr^  z"Invalid trailing '.' in local partr}  )r   rz  r   r   r   r  r   r>  rP   ry  rU  rp  rq  )r   r  Zlast_non_ws_was_dotrC   r   r   r   r    sh   






r  c                 C   sB   	 t | d\}} }t|d}|r|jtd t| || fS )Nz[]r   z(quoted printable found in domain-literal)rN  r>  r   r   r   r{  rE  )r   r   rL  r   r   r   	get_dtext  s   

r  c                 C   s,   | rdS | td | tdd dS )NFz"end of input inside domain-literal]domain-literal-endT)r   r   r  r>  )r   domain_literalr   r   r   _check_for_early_dl_end  s   r  c                 C   sf  	 t  }| d tv rt| \}} || | std| d dkr*td| | dd  } t| |r9|| fS |tdd | d t	v rRt
| \}} || t| \}} || t| |rf|| fS | d t	v rwt
| \}} || t| |r|| fS | d dkrtd| |tdd	 | dd  } | r| d tv rt| \}} || || fS )
Nr   zexpected domain-literal[z6expected '[' at start of domain-literal but found '{}'r   zdomain-literal-startr  z4expected ']' at end of domain-literal but found '{}'r  )r   rp  rq  r   r   rU  r3   r  r>  rZ  rP  r  )r   r  rC   r   r   r   get_domain_literal   sJ   








r  c                 C   st  	 t  }d }| d tv rt| \}} | std| | d dkr<t| \}} |d ur3|g|d d< || || fS zt| \}} W n tjyT   t	| \}} Y nw | rb| d dkrbtd|d urm|g|d d< || | r| d dkr|j
td |d jdkr|d |d d < | r| d dkr|t t	| d	d  \}} || | r| d dks|| fS )
Nr   zexpected domain but found '{}'r  r   zInvalid Domainr   z(domain is not a dot-atom (contains CFWS)r   r   )r   rp  rq  r   rU  r3   r  r   rv  rt  r   r{  rP   r   )r   r   rx  rC   r   r   r   
get_domainG  sJ   





r  c                 C   s~   	 t  }t| \}} || | r| d dkr$|jtd || fS |tdd t| dd  \}} || || fS )Nr   r   z#addr-spec local part with no domainaddress-at-symbolr   )r   r  r   r   r   r  r>  r  )r   r   rC   r   r   r   get_addr_specm  s   


r  c                 C   s  	 t  }| rC| d dks| d tv rC| d tv r$t| \}} || n| d dkr5|t | dd  } | rC| d dks| d tv s| rK| d dkrStd| |t t	| dd  \}} || | r| d dkr|t | dd  } | s}n3| d tv rt| \}} || | d dkr|t t	| dd  \}} || | r| d dkso| std| d dkrtd| |t
dd	 || dd  fS )
Nr   rA  r   r   z(expected obs-route domain but found '{}'z%end of header while parsing obs-route:z4expected ':' marking end of obs-route but found '{}'zend-of-obs-route-marker)r   rp  rq  r   ListSeparatorr   rU  r3   RouteComponentMarkerr  r>  )r   Z	obs_routerC   r   r   r   get_obs_route}  sL   







r  c                 C   s  	 t  }| d tv rt| \}} || | r| d dkr%td| |tdd | dd  } | d dkrT|tdd |jt	d | dd  } || fS zt
| \}} W n7 tjy   zt| \}} |jtd	 W n tjy   td
| w || t
| \}} Y nw || | r| d dkr| dd  } n	|jt	d |tdd | r| d tv rt| \}} || || fS )Nr   <z"expected angle-addr but found '{}'zangle-addr-startr   >zangle-addr-endznull addr-spec in angle-addrz*obsolete route specification in angle-addrz.expected addr-spec or obs-route but found '{}'z"missing trailing '>' on angle-addr)r   rp  rq  r   r   rU  r3   r>  r   r  r  r  r{  )r   Z
angle_addrrC   r   r   r   get_angle_addr  sZ   








r  c                 C   s>   	 t  }t| \}} ||d d   |jd d  |_|| fS r   )r   r|  rA   r   )r   r   rC   r   r   r   get_display_name  s   r  c                 C   s   	 t  }d }| d tv rt| \}} | std|| d dkrT| d tv r0td| t| \}} | s@td||d urO|g|d d d< d }|| t	| \}} |d ure|g|d d< || || fS )Nr   z!expected name-addr but found '{}'r  )
r   rp  rq  r   rU  r3   rz  r  r   r  )r   Z	name_addrrx  rC   r   r   r   get_name_addr  s8   

r  c                 C   s   	 t  }zt| \}} W n# tjy/   zt| \}} W n tjy,   td| w Y nw tdd |jD r=d|_|	| || fS )Nzexpected mailbox but found '{}'c                 s       | ]	}t |tjV  qd S r   )r   r   r  r&   r   r   r   r)         zget_mailbox.<locals>.<genexpr>r   )
r   r  r   rU  r  r3   anyr8   rP   r   )r   r   rC   r   r   r   get_mailbox  s(   
r  c                 C   st   	 t  }| r6| d |vr6| d tv r#|t| d d | dd  } nt| \}} || | r6| d |vs|| fS )Nr   r  r   )r   rz  r   r>  r|  )r   rH  Zinvalid_mailboxrC   r   r   r   get_invalid_mailbox     
r  c                 C   s  	 t  }| r| d dkrzt| \}} || W n tjy   d }| d tv rgt| \}} | r7| d dv rF|| |jtd nQt	| d\}} |d urX|g|d d< || |jt
d n0| d dkrw|jtd n t	| d\}} |d ur|g|d d< || |jt
d Y nw | r| d dvr|d }d|_t	| d\}} || |jt
d | r| d dkr|t | d	d  } | r| d dks|| fS )
Nr   ;z,;zempty element in mailbox-listzinvalid mailbox in mailbox-listrA  r   r   r   )r   r  r   r   rU  rp  rq  r   r{  r  r  rP   rA   r  )r   Zmailbox_listrC   rx  r   r   r   r   get_mailbox_list(  s`   









)r  c                 C   s  	 t  }| s|jtd || fS d }| rF| d tv rFt| \}} | s7|jtd || || fS | d dkrF|| || fS t| \}} t|j	dkrn|d ur\|| |
| |jtd || fS |d ury|g|d d< || || fS )Nzend of header before group-listr   zend of header in group-listr  zgroup-list with empty entries)r   r   r   r   r  rp  rq  r  r   r   rA   r{  )r   Z
group_listrx  rC   r   r   r   get_group_lista  s@   







r  c                 C   s  	 t  }t| \}} | r| d dkrtd| || |tdd | dd  } | rE| d dkrE|tdd || dd  fS t| \}} || | s\|jt	d n| d dkrjtd	| |tdd | dd  } | r| d t
v rt| \}} || || fS )
Nr   r  z8expected ':' at end of group display name but found '{}'zgroup-display-name-terminatorr   r  zgroup-terminatorzend of header in groupz)expected ';' at end of group but found {})r   r  r   rU  r3   r   r>  r  r   r  rp  rq  )r   r   rC   r   r   r   	get_group  s:   



r  c                 C   sr   	 t  }zt| \}} W n# tjy/   zt| \}} W n tjy,   td| w Y nw || || fS )Nzexpected address but found '{}')r   r  r   rU  r  r3   r   )r   r   rC   r   r   r   get_address  s    
r  c              
   C   s  	 t  }| rzt| \}} || W n tjy } zd }| d tv ret| \}} | r2| d dkrA|| |jtd nWt	| d\}} |d urS|g|d d< |t
|g |jtd n3| d dkru|jtd n#t	| d\}} |d ur|g|d d< |t
|g |jtd W Y d }~nd }~ww | r| d dkr|d d }d|_t	| d\}} || |jtd | r|tdd | d	d  } | s|| fS )
Nr   rA  z"address-list entry with no contentzinvalid address in address-listzempty element in address-listr   r   rB  r   )r   r  r   r   rU  rp  rq  r   r{  r  r   r  rP   rA   r>  )r   Zaddress_listrC   errrx  r   r   r   r   get_address_list  s`   	






)r  c                 C   s   	 t  }| std| | d dkrtd| |tdd | dd  } t| \}} || | r=| d dkrEtd| |tdd	 || dd  fS )
Nz'expected no-fold-literal but found '{}'r   r  z;expected '[' at the start of no-fold-literal but found '{}'zno-fold-literal-startr   r  z9expected ']' at the end of no-fold-literal but found '{}'zno-fold-literal-end)r   r   rU  r3   r   r>  r  )r   Zno_fold_literalrC   r   r   r   get_no_fold_literal  s,   
r  c                 C   sr  	 t  }| r| d tv rt| \}} || | r| d dkr'td| |tdd | dd  } zt| \}} W n, tjyi   zt	| \}} |j
td W n tjyf   td| w Y nw || | rw| d dkr|j
td	 | r| d d
kr|td
d | dd  } || fS |tdd | dd  } zt| \}} W nH tjy   zt| \}} W n5 tjy } z(zt| \}} |j
td W n tjy   td| w W Y d }~nd }~ww Y nw || | r| d d
kr| dd  } n	|j
td |td
d | r5| d tv r5t| \}} || || fS )Nr   r  zexpected msg-id but found '{}'zmsg-id-startr   zobsolete id-left in msg-idz4expected dot-atom-text or obs-id-left but found '{}'r   zmsg-id with no id-rightr  z
msg-id-endr  zobsolete id-right in msg-idzFexpected dot-atom-text, no-fold-literal or obs-id-right but found '{}'zmissing trailing '>' on msg-id)r,  rp  rq  r   r   rU  r3   r>  ru  r  r   r{  r  r  r  )r   Zmsg_idrC   er   r   r   
get_msg_id  s   










r  c              
   C   s   	 t  }zt| \}} || W n( tjy9 } zt| }t|}|jtd	| W Y d }~|S d }~ww | rH|jtd	|  |S )NzInvalid msg-id: {!r}zUnexpected {!r})
r.  r  r   r   rU  rc  r/  r   r  r3   )r   Z
message_idrC   exr   r   r   parse_message_idS  s&   
r  c                 C   s  	 t  }| s|jtd |S | d tv r-t| \}} || | s-|jtd d}| rW| d dkrW| d tvrW|| d 7 }| dd  } | rW| d dkrW| d tvs=| sp|jtd	| |t
|d nt||_|t
|d	 | r| d tv rt| \}} || | r| d dkr|jd ur|jtd
 | r|t
| d |S |t
dd | dd  } | r| d tv rt| \}} || | s|jd ur|jtd
 |S d}| r| d tvr|| d 7 }| dd  } | r| d tvs| s |jtd	| |t
|d nt||_|t
|d	 | rB| d tv rBt| \}} || | rV|jtd |t
| d |S )Nz%Missing MIME version number (eg: 1.0)r   z0Expected MIME version number but found only CFWSr#   r   r   z1Expected MIME major version number but found {!r}rD  digitsz0Incomplete MIME version; found only major numberzversion-separatorz1Expected MIME minor version number but found {!r}z'Excess non-CFWS text after MIME version)r   r   r   r   HeaderMissingRequiredValuerp  rq  isdigitr  r3   r>  intr   r   )r   Zmime_versionrC   r  r   r   r   parse_mime_versiono  s   















r  c                 C   st   	 t  }| r6| d dkr6| d tv r#|t| d d | dd  } nt| \}} || | r6| d dks|| fS )Nr   r  r  r   )r   rz  r   r>  r|  )r   Zinvalid_parameterrC   r   r   r   get_invalid_parameter  r  r  c                 C   ri  )Nzexpected ttext but found '{}'ttext)_non_token_end_matcherr   rU  r3   r   r   r>  rE  )r   rl  r  r   r   r   	get_ttext     
r  c                 C      	 t  }| r| d tv rt| \}} || | r'| d tv r'td| t| \}} || | rE| d tv rEt| \}} || || fS Nr   zexpected token but found '{}')	rs   rp  rq  r   
TOKEN_ENDSr   rU  r3   r  )r   ZmtokenrC   r   r   r   	get_token     


r  c                 C   ri  )Nz expected attrtext but found {!r}r  )_non_attribute_end_matcherr   rU  r3   r   r   r>  rE  r   rl  r  r   r   r   get_attrtext  r  r  c                 C   r  r  )	r  rp  rq  r   ATTRIBUTE_ENDSr   rU  r3   r  r   r  rC   r   r   r   get_attribute	  r  r  c                 C   ri  )Nz)expected extended attrtext but found {!r}extended-attrtext)#_non_extended_attribute_end_matcherr   rU  r3   r   r   r>  rE  r  r   r   r   get_extended_attrtext	  s   
r  c                 C   r  r  )	r  rp  rq  r   EXTENDED_ATTRIBUTE_ENDSr   rU  r3   r  r  r   r   r   get_extended_attribute+	  s   


r  c                 C   s   	 t  }| r| d dkrtd| |tdd | dd  } | r*| d  s2td| d}| rP| d  rP|| d 7 }| dd  } | rP| d  s<|d dkrc|dkrc|jtd	 t	||_
|t|d
 || fS )Nr   *zExpected section but found {}zsection-markerr   z$Expected section number but found {}r#   0z'section number has an invalid leading 0r  )r  r   rU  r3   r   r>  r  r   r  r  r   )r   r  r  r   r   r   get_sectionA	  s0   

r  c                 C   s   	 t  }| stdd }| d tv rt| \}} | s#td|| d dkr0t| \}} nt| \}} |d urA|g|d d< || || fS )Nz&Expected value but found end of stringr   z Expected value but found only {}r   )	r  r   rU  rp  rq  r3   rr  r  r   )r   vrx  rC   r   r   r   	get_value_	  s$   

r  c                 C   sz  	 t  }t| \}} || | r| d dkr'|jtd| || fS | d dkrfzt| \}} d|_|| W n
 tj	yG   Y nw | sOt	d| d dkrf|t
dd | dd  } d|_| d d	krqt	d
|t
d	d | dd  } d }| r| d tv rt| \}} || d }|}|jr| r| d dkrt| \}}|j}d}|jdkr|r|d dkrd}n#t|\}}	|	r|	d dkrd}nzt|\}}	W n   Y n|	sd}|r|jtd || |D ]}
|
jdkr	g |
d d < |
} nq|} nd }|jtd | r%| d dkr%d }nt| \}} |jr5|jdkrX| r?| d dkrO|| |d urK|} || fS |jtd | ss|jtd || |d u rr|| fS nw|d ur|D ]}
|
jdkr nqz|
jdk ||
 |
j|_| d dkrt	d| |t
dd | dd  } | r| d dkrt| \}} || |j|_| r| d dkrt	d| |t
dd | dd  } |d ur't }| r$| d tv rt| \}} n| d dkrt
dd}| dd  } nt| \}} || | s|}nt| \}} || |d ur9|} || fS )Nr   r  z)Parameter contains name ({}) but no valuer  TzIncomplete parameterzextended-parameter-markerr   =zParameter not followed by '='parameter-separatorr   F'z5Quoted string value for extended parameter is invalidr   zZParameter marked as extended but appears to have a quoted string value that is non-encodedzcApparent initial-extended-value but attribute was not marked as extended or was not initial sectionz(Missing required charset/lang delimitersr  r  z=Expected RFC2231 char/lang encoding delimiter, but found {!r}zRFC2231-delimiterz;Expected RFC2231 char/lang encoding delimiter, but found {}ZDQUOTE)r   r  r   r   r   r  r3   r  r   rU  r>  r   rp  rq  rr  r   r   r  r  rP   r  r   rx   ry   r  rZ  rP  rh  )r   r  rC   rx  rJ  ZappendtoZqstringZinner_valueZ
semi_validr[  tr  r   r   r   get_parameteru	  s   





















	

r  c              
   C   sn  	 t  }| rzt| \}} || W ni tjy| } z\d }| d tv r*t| \}} | s9|| |W  Y d }~S | d dkrR|d urH|| |jtd n t	| \}} |ra|g|d d< || |jtd
| W Y d }~nd }~ww | r| d dkr|d }d|_t	| \}} || |jtd
| | r|tdd | d	d  } | s|S )
Nr   r  zparameter entry with no contentzinvalid parameter {!r}r   r   z)parameter with invalid trailing text {!r}r  r   )r	  r  r   r   rU  rp  rq  r   r  r  r3   rP   rA   r>  )r   Zmime_parametersrC   r  rx  r  r   r   r   parse_mime_parameters
  sR   






$r  c                 C   s   	 |r3|d dkr3|d t v r | t|d d |dd  }nt|\}}| | |r3|d dks	|s7d S | tdd | t|dd   d S )Nr   r  r  r   r  )rz  r   r>  r|  r  )Z	tokenlistr   rC   r   r   r   _find_mime_parameters7
  s   
r  c              
   C   s  	 t  }d}| s|jtd |S zt| \}} W n tjy8   |jtd|  t	||  | Y S w || | rF| d dkrX|jtd | rVt	||  |S |j
  |_|tdd | dd  } zt| \}} W n tjy   |jtd	|  t	||  | Y S w || |j
  |_| s|S | d d
kr|jtd|  |`|`t	||  |S |td
d |t| dd   |S )NFz"Missing content type specificationz(Expected content maintype but found {!r}r   r5  zInvalid content typezcontent-type-separatorr   z'Expected content subtype but found {!r}r  z<Only parameters are valid after content type, but found {!r}r  )r#  r   r   r   r  r  rU  r  r3   r  r   r  lowerr%  r>  r&  r  )r   ZctypeZrecoverrC   r   r   r   parse_content_type_headerG
  sh   










r  c              
   C   s   	 t  }| s|jtd |S zt| \}} W n tjy6   |jtd|  t	||  | Y S w || |j
  |_| sH|S | d dkra|jtd|  t	||  |S |tdd |t| dd   |S )NzMissing content dispositionz+Expected content disposition but found {!r}r   r  zCOnly parameters are valid after content disposition, but found {!r}r  r   )r'  r   r   r   r  r  rU  r  r3   r  r   r  r  r(  r>  r  )r   Zdisp_headerrC   r   r   r    parse_content_disposition_header
  s<   





r  c              
   C   s   	 t  }| s|jtd |S zt| \}} W n tjy/   |jtd|  Y nw || |j	
  |_| sA|S | rp|jtd | d tv rc|t| d d | dd  } nt| \}} || | sC|S )Nz!Missing content transfer encodingz1Expected content transfer encoding but found {!r}z*Extra text after content transfer encodingr   r  r   )r*  r   r   r   r  r  rU  r  r3   r   r  r  rw   rz  r>  r|  )r   Z
cte_headerrC   r   r   r   &parse_content_transfer_encoding_header
  s:   





	r  c                 C   sD   d}| r | d r | d d t v r | d d }| d d d | d< |S )Nr#   r   )rZ  )linesZwspr   r   r   _steal_trailing_WSP_if_exists
  s
   r  c                C   s  	 |j ptj}|jrdnd}dg}d }d}d}tdd}t| }	|	rl|	d}
|
|u r1|d8 }q t|
}|sI|
jdv rCt	
| }nt
| }z	|| |}W n tyl   td	d
 |
jD rfd}nd}d}Y nw |
jdkrzt|
||| q |r|s|
jsd}d }|
jr|
j|dd t|j  }|j|vrt||t|d  krt|}|| |d  |7  < q t|
dst|
|	 }	n
t|||||
j|}d}q t||t|d  kr|d  |7  < q |
jr	t|d |kr	t|}|s|
 r	|||  d }q t|
ds>t|
}|
jdkr,tddgdd |D  tddg }|
js9|d7 }|| ||	 }	q |
jrN|sN|	d|
 d}q t|}|sZ|
 rb|||  n|d  |7  < |	s#|j||j S )Nutf-8r   r#   r   Fwrap_as_ew_blockedr   )r   rQ  c                 s   r  r   )r   r   r  r&   r   r   r   r)   
  r  z%_refold_parse_tree.<locals>.<genexpr>unknown-8bitTr
  rD   r   r  r   r   r   c                 S   s   g | ]	}t t|d qS )r   )r>  r   )r'   pr   r   r   rc   1  s    z&_refold_parse_tree.<locals>.<listcomp>)Zmax_line_lengthsysmaxsizeutf8r2  r6  r   r   rP   
SPECIALSNL
isdisjointNLSETr  r  r  r8   _fold_mime_parametersr>   rV   rH   r   r-  r  r   rQ   _fold_as_ewrW   r<   r>  insertr,   )Z
parse_treerE   maxlenr  r  last_ewr  Zwant_encodingZend_ew_not_allowedr  r?   tstrrx   Zencoded_partnewlineZnewpartsr   r   r   rF   
  s   




	






erF   c                 C   s  	 |d ur|rt t|d |d  |  } |d d | |d< | d tv rF| d }| dd  } t|d |kr>|t| |d  |7  < d}| d tv rX| d }| d d } |d u rbt|d n|}|dkrjdn|}	t|	d }
|
d |kr}td| r|t|d  }||
 }|dkr|d	 q}| d | }tj	||	d
}t|| }|dkr|d d }tj	||	d
}t|| }|dks|d  |7  < | t|d  } | r|d	 t|d }| s|d  |7  < |r|S d S )Nr   r   r   r#   r   r     z3max_line_length is too small to fit an encoded wordr]   )rx   )
r   rc  rZ  r   r   r  r   rU  rW  r  )Z	to_encoder  r  r  rW   rx   Zleading_wspZtrailing_wspZnew_last_ewZ	encode_as
chrome_lenZremaining_spaceZ
text_spaceZto_encode_wordZencoded_wordZexcessr   r   r   r  H  sZ   


r  c              	   C   s  	 | j D ]\}}|d  ds|d  d7  < |}d}z	|| d}W n ty=   d}t|r9d}d}nd}Y nw |rQtjj	|d	|d
}	d
|||	}
nd
|t|}
t|d t|
 d |k rr|d d |
 |d< qt|
d |kr|d|
  qd}|d }|rt|tt| d t| }||d krd}|| d  }}	 |d | }tjj	|d	|d
}	t|	|krn|d8 }q|d
||||	 d	}|d7 }||d  }|r|d  d7  < |sqd S )Nr   r  strictFTr  r  r  r#   )safer   z
{}*={}''{}r   r   r]   r   r   z''r   N   z {}*{}*={}{})r  r   r  r  r  r   r  r  r  r   r3   r   r   r   r   )r?   r  r  r  r  r   rx   Zerror_handlerZencoding_requiredZencoded_valuer  r  Zextra_chromer  Z
splitpointZmaxcharspartialr   r   r   r    sp   

 r  )rQ  )rer  r  stringr   operatorr   Zemailr   rW  r   r   r   rZ  rp  rw  rs  r   rz  Z	TSPECIALSr  Z	ASPECIALSr  r  r  r  r   r   compileVERBOSE	MULTILINEr_  r6  r   rZ   rg   rk   rm   rn   rp   rs   ru   r|   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r  r  r  r	  r!  r#  r'  r*  r+  r,  r.  r/  r0  r   r2  r:  r>  r?  rU  r@  r   r  r  r3   r,   r   rF  rK  matchrk  findallrC  r  r  r  rE  rN  rP  r]  rc  rg  rh  rm  rn  ro  rq  rr  rt  ru  rv  ry  r|  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  rF   r  r  r   r   r   r   <module>   sF   E
C"	
!*$
V	+







1C+"&'/'&).9%7ED 49/tA