a
    "hŢ                 	   @   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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 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 dYe ZBG dZd[ d[e ZCG d\d] d]e ZDG d^d_ d_e ZEG d`da dae ZFG dbdc dceFZGG ddde deeFZHG dfdg dge ZIG dhdi die ZJG djdk dke ZKG dldm dmeKZLG dndo doeLZMG dpdq dqe ZNG drds dseOZPG dtdu duePZQG dvdw dwePZRG dxdy dyeQZSG dzd{ d{e
jTZUeRd
d|ZVeRd}d~ZWeRddZXe dYdZej[Z\e dYe ]dZej^Z_e dj`Zae dYe ]dZej^Zbe dYe ]dZej^Zce dYe ]dZej^Zddd Zedd Zfdd Zgdd Zhdd 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 ZdS )    N)	hexdigits)
itemgetter)_encoded_words)errors)utilsz 	(z()<>@,:;.\"[].z."(z/?=z*'%%
c                 C   s    dt | dddd d S )N"\\\z\")strreplacevalue r   B/opt/python-3.9.21/usr/lib/python3.9/email/_header_value_parser.pyquote_stringb   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   s   d dd | D S )N c                 s   s   | ]}t |V  qd S r   r   .0xr   r   r   	<genexpr>       z$TokenList.__str__.<locals>.<genexpr>joinr   r   r   r   __str__   s    zTokenList.__str__c                    s   d | jjt  S Nz{}({})formatr   __name__r   __repr__r)   r   r   r   r/      s    
zTokenList.__repr__c                 C   s   d dd | D S )Nr    c                 s   s   | ]}|j r|j V  qd S r   r   r"   r   r   r   r%      r&   z"TokenList.value.<locals>.<genexpr>r'   r)   r   r   r   r      s    zTokenList.valuec                 C   s   t dd | D | jS )Nc                 s   s   | ]}|j V  qd S r   )all_defectsr"   r   r   r   r%      r&   z(TokenList.all_defects.<locals>.<genexpr>)sumr   r)   r   r   r   r0      s    zTokenList.all_defectsc                 C   s   | d   S Nr   )startswith_fwsr)   r   r   r   r3      s    zTokenList.startswith_fwsc                 C   s   t dd | D S )Nc                 s   s   | ]}|j V  qd S r   )as_ew_allowed)r#   partr   r   r   r%      r&   z*TokenList.as_ew_allowed.<locals>.<genexpr>)allr)   r   r   r   r4      s    zTokenList.as_ew_allowedc                 C   s   g }| D ]}| |j q|S r   )extendcomments)r   r8   tokenr   r   r   r8      s    zTokenList.commentsc                C   s   t | |dS )Npolicy)_refold_parse_treer   r;   r   r   r   fold   s    zTokenList.foldr    c                 C   s   t | j|d d S )Nindent)printppstrr   r@   r   r   r   pprint   s    zTokenList.pprintc                 C   s   d | j|dS )Nr
   r?   )r(   _pprC   r   r   r   rB      s    zTokenList.ppstrc                 c   sz   d || jj| jV  | D ]4}t|ds:|d | V  q||d E d H  q| jrdd | j}nd}d ||V  d S )Nz{}{}/{}(rE   z*    !! invalid element in token list: {!r}z    z Defects: {}r    z{}){})r-   r   r.   
token_typehasattrrE   r   )r   r@   r9   extrar   r   r   rE      s    

zTokenList._pp)r    )r    )r    )r.   
__module____qualname__rF   syntactic_breakew_combine_allowedr   r*   r/   propertyr   r0   r3   r4   r8   r>   rD   rB   rE   __classcell__r   r   r   r   r   u   s&   





r   c                   @   s$   e Zd Zedd Zedd ZdS )WhiteSpaceTokenListc                 C   s   dS N r   r)   r   r   r   r      s    zWhiteSpaceTokenList.valuec                 C   s   dd | D S )Nc                 S   s   g | ]}|j d kr|jqS )comment)rF   contentr"   r   r   r   
<listcomp>   r&   z0WhiteSpaceTokenList.comments.<locals>.<listcomp>r   r)   r   r   r   r8      s    zWhiteSpaceTokenList.commentsN)r.   rI   rJ   rM   r   r8   r   r   r   r   rO      s   
rO   c                   @   s   e Zd ZdZdS )UnstructuredTokenListunstructuredNr.   rI   rJ   rF   r   r   r   r   rU      s   rU   c                   @   s   e Zd ZdZdS )PhrasephraseNrW   r   r   r   r   rX      s   rX   c                   @   s   e Zd ZdZdS )WordZwordNrW   r   r   r   r   rZ      s   rZ   c                   @   s   e Zd ZdZdS )CFWSListcfwsNrW   r   r   r   r   r[      s   r[   c                   @   s   e Zd ZdZdS )AtomatomNrW   r   r   r   r   r]      s   r]   c                   @   s   e Zd ZdZdZdS )Tokenr9   FN)r.   rI   rJ   rF   Zencode_as_ewr   r   r   r   r_      s   r_   c                   @   s   e Zd ZdZdZdZdZdS )EncodedWordencoded-wordN)r.   rI   rJ   rF   ctecharsetlangr   r   r   r   r`      s   r`   c                   @   s4   e Zd ZdZedd Zedd Zedd ZdS )	QuotedStringquoted-stringc                 C   s"   | D ]}|j dkr|j  S qd S Nbare-quoted-stringrF   r   r   r$   r   r   r   rS      s    
zQuotedString.contentc                 C   s>   g }| D ]*}|j dkr&|t| q||j qd|S )Nrh   r    )rF   appendr   r   r(   )r   resr$   r   r   r   quoted_value   s    
zQuotedString.quoted_valuec                 C   s"   | D ]}|j dkr|j  S qd S rg   ri   r   r9   r   r   r   stripped_value   s    
zQuotedString.stripped_valueN)r.   rI   rJ   rF   rM   rS   rm   ro   r   r   r   r   re      s   

	re   c                   @   s$   e Zd ZdZdd Zedd ZdS )BareQuotedStringrh   c                 C   s   t ddd | D S )Nr    c                 s   s   | ]}t |V  qd S 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   s   d dd | D S )Nr    c                 s   s   | ]}t |V  qd S r   r!   r"   r   r   r   r%     r&   z)BareQuotedString.value.<locals>.<genexpr>r'   r)   r   r   r   r     s    zBareQuotedString.valueN)r.   rI   rJ   rF   r*   rM   r   r   r   r   r   rp      s   rp   c                   @   s8   e Zd ZdZdd Zdd Zedd Zedd	 Zd
S )CommentrR   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   rT     r&   z#Comment.__str__.<locals>.<listcomp>))r(   r1   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 )NrR   r   r   r   z\(rs   z\))rF   r   r   )r   r   r   r   r   rr     s    
zComment.quotec                 C   s   d dd | D S )Nr    c                 s   s   | ]}t |V  qd S r   r!   r"   r   r   r   r%     r&   z"Comment.content.<locals>.<genexpr>r'   r)   r   r   r   rS     s    zComment.contentc                 C   s   | j gS r   )rS   r)   r   r   r   r8     s    zComment.commentsN)	r.   rI   rJ   rF   r*   rr   rM   rS   r8   r   r   r   r   rq   	  s   
rq   c                   @   s4   e Zd ZdZedd Zedd Zedd ZdS )	AddressListzaddress-listc                 C   s   dd | D S )Nc                 S   s   g | ]}|j d kr|qS )addressrF   r"   r   r   r   rT   )  r&   z)AddressList.addresses.<locals>.<listcomp>r   r)   r   r   r   	addresses'  s    zAddressList.addressesc                 C   s   t dd | D g S )Nc                 s   s   | ]}|j d kr|jV  qdS ru   NrF   	mailboxesr"   r   r   r   r%   -  s   z(AddressList.mailboxes.<locals>.<genexpr>r1   r)   r   r   r   rz   +  s
    zAddressList.mailboxesc                 C   s   t dd | D g S )Nc                 s   s   | ]}|j d kr|jV  qdS rx   rF   all_mailboxesr"   r   r   r   r%   2  s   z,AddressList.all_mailboxes.<locals>.<genexpr>r{   r)   r   r   r   r}   0  s
    zAddressList.all_mailboxesN)r.   rI   rJ   rF   rM   rw   rz   r}   r   r   r   r   rt   #  s   

rt   c                   @   s4   e Zd ZdZedd Zedd Zedd ZdS )	Addressru   c                 C   s   | d j dkr| d jS d S )Nr   grouprF   display_namer)   r   r   r   r   :  s    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-mailboxry   r)   r   r   r   rz   ?  s
    
zAddress.mailboxesc                 C   s:   | d j dkr| d gS | d j dkr0| d gS | d jS r   r|   r)   r   r   r   r}   G  s
    

zAddress.all_mailboxesN)r.   rI   rJ   rF   rM   r   rz   r}   r   r   r   r   r~   6  s   

r~   c                   @   s(   e Zd ZdZedd Zedd ZdS )MailboxListmailbox-listc                 C   s   dd | D S )Nc                 S   s   g | ]}|j d kr|qS )r   rv   r"   r   r   r   rT   U  r&   z)MailboxList.mailboxes.<locals>.<listcomp>r   r)   r   r   r   rz   S  s    zMailboxList.mailboxesc                 C   s   dd | D S )Nc                 S   s   g | ]}|j d v r|qS ))r   r   rv   r"   r   r   r   rT   Y  s   
z-MailboxList.all_mailboxes.<locals>.<listcomp>r   r)   r   r   r   r}   W  s    zMailboxList.all_mailboxesNr.   rI   rJ   rF   rM   rz   r}   r   r   r   r   r   O  s
   
r   c                   @   s(   e Zd ZdZedd Zedd ZdS )	GroupList
group-listc                 C   s    | r| d j dkrg S | d jS Nr   r   ry   r)   r   r   r   rz   a  s    zGroupList.mailboxesc                 C   s    | r| d j dkrg S | d jS r   r|   r)   r   r   r   r}   g  s    zGroupList.all_mailboxesNr   r   r   r   r   r   ]  s
   
r   c                   @   s4   e Zd ZdZedd Zedd Zedd ZdS )	Groupr   c                 C   s   | d j dkrg S | d jS N   r   ry   r)   r   r   r   rz   r  s    zGroup.mailboxesc                 C   s   | d j dkrg S | d jS r   r|   r)   r   r   r   r}   x  s    zGroup.all_mailboxesc                 C   s
   | d j S r2   )r   r)   r   r   r   r   ~  s    zGroup.display_nameN)r.   rI   rJ   rF   rM   rz   r}   r   r   r   r   r   r   n  s   

r   c                   @   sL   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     s    zNameAddr.display_namec                 C   s
   | d j S N
local_partr)   r   r   r   r     s    zNameAddr.local_partc                 C   s
   | d j S r   domainr)   r   r   r   r     s    zNameAddr.domainc                 C   s
   | d j S r   )router)   r   r   r   r     s    zNameAddr.routec                 C   s
   | d j S r   	addr_specr)   r   r   r   r     s    zNameAddr.addr_specN
r.   rI   rJ   rF   rM   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   s"   | D ]}|j dkr|j  S qd S N	addr-spec)rF   r   rj   r   r   r   r     s    
zAngleAddr.local_partc                 C   s"   | D ]}|j dkr|j  S qd S r   rF   r   rj   r   r   r   r     s    
zAngleAddr.domainc                 C   s"   | D ]}|j dkr|j  S qd S )N	obs-route)rF   domainsrj   r   r   r   r     s    
zAngleAddr.routec                 C   s<   | D ]2}|j dkr|jr"|j  S t|j|j   S qdS )Nr   z<>)rF   r   r   r   rj   r   r   r   r     s    

zAngleAddr.addr_specN)	r.   rI   rJ   rF   rM   r   r   r   r   r   r   r   r   r     s   


r   c                   @   s   e Zd ZdZedd ZdS )ObsRouter   c                 C   s   dd | D S )Nc                 S   s   g | ]}|j d kr|jqS r   r   r"   r   r   r   rT     r&   z$ObsRoute.domains.<locals>.<listcomp>r   r)   r   r   r   r     s    zObsRoute.domainsN)r.   rI   rJ   rF   rM   r   r   r   r   r   r     s   r   c                   @   sL   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 )Mailboxr   c                 C   s   | d j dkr| d jS d S Nr   r   r   r)   r   r   r   r     s    zMailbox.display_namec                 C   s
   | d j S r2   r   r)   r   r   r   r     s    zMailbox.local_partc                 C   s
   | d j S r2   r   r)   r   r   r   r     s    zMailbox.domainc                 C   s   | d j dkr| d jS d S r   )rF   r   r)   r   r   r   r     s    zMailbox.routec                 C   s
   | d j S r2   r   r)   r   r   r   r     s    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   s   d S r   r   r)   r   r   r   r     s    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                    s   d t j S Nr    r(   r   r   splitr)   r   r   r   r     s    zDomain.domain)r.   rI   rJ   rF   r4   rM   r   rN   r   r   r   r   r     s   r   c                   @   s   e Zd ZdZdS )DotAtomdot-atomNrW   r   r   r   r   r     s   r   c                   @   s   e Zd ZdZdZdS )DotAtomTextzdot-atom-textTNr.   rI   rJ   rF   r4   r   r   r   r   r     s   r   c                   @   s   e Zd ZdZdZdS )NoFoldLiteralzno-fold-literalFNr   r   r   r   r   r     s   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   s
   | d j S r2   r   r)   r   r   r   r     s    zAddrSpec.local_partc                 C   s   t | dk rd S | d jS )N   r   )r   r   r)   r   r   r   r     s    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rH|d | j S |S )N@)setr   r   DOT_ATOM_ENDSr   r   )r   ZnamesetZlpr   r   r   r     s    

zAddrSpec.addr_specN)
r.   rI   rJ   rF   r4   rM   r   r   r   r   r   r   r   r   r     s   


r   c                   @   s   e Zd ZdZdZdS )ObsLocalPartzobs-local-partFNr   r   r   r   r   r   (  s   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r4|d n*|d d jdkr^t |d dd  |d< |d jdkrv|  n*|d d jdkrt |d d d |d< |jS )Nr   r\   r   r   )r   r   r   rF   pop)r   rl   r   r   r   r   3  s    
zDisplayName.display_namec                    s   d}| j rd}n| D ]}|jdkrd}qt| dkr|rd }}| d jdks`| d d jdkrdd}| d jdks| d d jdkrd}|t| j | S t jS d S )	NFTrf   r   r    r\   rQ   r   )r   rF   r   r   r   r   r   )r   rr   r$   preZpostr   r   r   r   D  s    
  zDisplayName.value)	r.   rI   rJ   rF   rL   rM   r   r   rN   r   r   r   r   r   .  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 d S )Nr   rf   )rF   rm   r   r)   r   r   r   r   ]  s    
zLocalPart.valuec                 C   s   t g}t }d}| d t g D ]}|jdkr,q|r\|jdkr\|d jdkr\t|d d |d< t|t}|r|jdkr|d jdkr|t|dd   n
|| |d }|}qt|dd }|jS )NFr   r\   dotr   r   )DOTrF   r   
isinstancerk   r   )r   rl   lastZ
last_is_tltokZis_tlr   r   r   r   d  s(    


zLocalPart.local_partN)r.   rI   rJ   rF   r4   rM   r   r   r   r   r   r   r   X  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                    s   d t j S r   r   r)   r   r   r   r     s    zDomainLiteral.domainc                 C   s"   | D ]}|j dkr|j  S qd S )Nptextri   rj   r   r   r   ip  s    
zDomainLiteral.ip)	r.   rI   rJ   rF   r4   rM   r   r   rN   r   r   r   r   r   |  s   r   c                   @   s   e Zd ZdZdZdZdS )MIMEVersionzmime-versionN)r.   rI   rJ   rF   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r|D ]4}|j dkr*|D ] }|j dkr<|j      S q<q*qdS )Nr   rf   rh   r    )rF   ro   rn   r   r   r   param_value  s    




zParameter.param_valueN)
r.   rI   rJ   rF   r   extendedrc   rM   r   r   r   r   r   r   r     s   
r   c                   @   s   e Zd ZdZdS )InvalidParameterinvalid-parameterNrW   r   r   r   r   r     s   r   c                   @   s   e Zd ZdZedd ZdS )	Attribute	attributec                 C   s$   | D ]}|j dr|j  S qd S )Nattrtext)rF   endswithr   rn   r   r   r   ro     s    zAttribute.stripped_valueNr.   rI   rJ   rF   rM   ro   r   r   r   r   r     s   r   c                   @   s   e Zd ZdZdZdS )SectionsectionN)r.   rI   rJ   rF   r   r   r   r   r   r     s   r   c                   @   s   e Zd ZdZedd ZdS )Valuer   c                 C   s2   | d }|j dkr| d }|j dr,|jS | jS )Nr   r\   r   )rf   r   zextended-attribute)rF   r   ro   r   rn   r   r   r   ro     s    
zValue.stripped_valueNr   r   r   r   r   r     s   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 ]T}|j dsq|d j dkr*q|d j }||vrHg ||< || |j|f q| D ]~\}}t|tdd}|d d }|j	}|j
st|dkr|d d dkr|d d jtd |d d }g }d}|D ]\}	}
|	|kr(|
j
s|
jtd qn|
jtd |d7 }|
j}|
j
rztj|}W n$ tyr   tjj|d	d
}Y nT0 z||d}W n$ ttfy   |dd}Y n0 t|r|
jt  || qd|}||fV  qfd 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    )rF   r   r   striprk   r   itemssortedr   rc   r   r   r   r   InvalidHeaderDefectr   urllibparseunquote_to_bytesUnicodeEncodeErrorunquotedecodeLookupErrorr   _has_surrogatesUndecodableBytesDefectr(   )r   paramsr9   namepartsZfirst_paramrc   Zvalue_partsir   paramr   r   r   r   r     s`    



zMimeParameters.paramsc                 C   sT   g }| j D ].\}}|r.|d|t| q
|| q
d|}|rPd| S dS )N{}={}z; rQ   r    )r   rk   r-   r   r(   )r   r   r   r   r   r   r   r*     s    
zMimeParameters.__str__N)r.   rI   rJ   rF   rK   rM   r   r*   r   r   r   r   r     s
   
Er   c                   @   s   e Zd ZdZedd ZdS )ParameterizedHeaderValueFc                 C   s&   t | D ]}|jdkr|j  S qi S )Nr   )reversedrF   r   rn   r   r   r   r   /  s    
zParameterizedHeaderValue.paramsN)r.   rI   rJ   rK   rM   r   r   r   r   r   r   )  s   r   c                   @   s   e Zd ZdZdZdZdZdS )ContentTypezcontent-typeFtextZplainN)r.   rI   rJ   rF   r4   maintypesubtyper   r   r   r   r   7  s   r   c                   @   s   e Zd ZdZdZdZdS )ContentDispositionzcontent-dispositionFN)r.   rI   rJ   rF   r4   content_dispositionr   r   r   r   r   >  s   r   c                   @   s   e Zd ZdZdZdZdS )ContentTransferEncodingzcontent-transfer-encodingFZ7bitN)r.   rI   rJ   rF   r4   rb   r   r   r   r   r   D  s   r   c                   @   s   e Zd ZdZdZdS )HeaderLabelzheader-labelFNr   r   r   r   r   r   J  s   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   linesepr=   r   r   r   r>   S  s    z
MsgID.foldN)r.   rI   rJ   rF   r4   r>   r   r   r   r   r   O  s   r   c                   @   s   e Zd ZdZdS )	MessageIDz
message-idNrW   r   r   r   r   r   X  s   r   c                   @   s   e Zd ZdZdS )InvalidMessageIDzinvalid-message-idNrW   r   r   r   r   r   \  s   r   c                   @   s   e Zd ZdZdS )HeaderheaderNrW   r   r   r   r   r   `  s   r   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__rF   r   )clsr   rF   r   r   r   r   r  n  s    zTerminal.__new__c                    s   d | jjt  S r+   r,   r)   r   r   r   r/   t  s    zTerminal.__repr__c                 C   s   t | jjd | j  d S )N/)rA   r   r.   rF   r)   r   r   r   rD   w  s    zTerminal.pprintc                 C   s
   t | jS r   )listr   r)   r   r   r   r0   z  s    zTerminal.all_defectsr    c              	      s2   d || jj| jt  | js"dn
d | jgS )Nz{}{}/{}({}){}r    z {})r-   r   r.   rF   r   r/   r   rC   r   r   r   rE   ~  s    zTerminal._ppc                 C   s   d S r   r   r)   r   r   r   pop_trailing_ws  s    zTerminal.pop_trailing_wsc                 C   s   g S r   r   r)   r   r   r   r8     s    zTerminal.commentsc                 C   s   t | | jfS r   )r   rF   r)   r   r   r   __getnewargs__  s    zTerminal.__getnewargs__)r    )r.   rI   rJ   r4   rL   rK   r  r/   rD   rM   r0   rE   r  r8   r  rN   r   r   r   r   r  h  s   
	
r  c                   @   s    e Zd Zedd Zdd ZdS )WhiteSpaceTerminalc                 C   s   dS rP   r   r)   r   r   r   r     s    zWhiteSpaceTerminal.valuec                 C   s   dS )NTr   r)   r   r   r   r3     s    z!WhiteSpaceTerminal.startswith_fwsNr.   rI   rJ   rM   r   r3   r   r   r   r   r    s   
r  c                   @   s    e Zd Zedd Zdd ZdS )ValueTerminalc                 C   s   | S r   r   r)   r   r   r   r     s    zValueTerminal.valuec                 C   s   dS )NFr   r)   r   r   r   r3     s    zValueTerminal.startswith_fwsNr	  r   r   r   r   r
    s   
r
  c                   @   s    e Zd Zedd Zdd ZdS )EWWhiteSpaceTerminalc                 C   s   dS r   r   r)   r   r   r   r     s    zEWWhiteSpaceTerminal.valuec                 C   s   dS r   r   r)   r   r   r   r*     s    zEWWhiteSpaceTerminal.__str__N)r.   rI   rJ   rM   r   r*   r   r   r   r   r    s   
r  c                   @   s   e Zd ZdS )_InvalidEwErrorN)r.   rI   rJ   r   r   r   r   r    s   r  r   ,list-separatorr   zroute-component-markerz([{}]+)r    z[^{}]+z[\x00-\x20\x7F]c                 C   s>   t | }|r| jt| t| r:| jtd d S )Nz*Non-ASCII characters found in header token)_non_printable_finderr   rk   r   ZNonPrintableDefectr   r   r   )xtextZnon_printablesr   r   r   _validate_xtext  s    

r  c                 C   s   t | d^}}g }d}d}tt|D ]L}|| dkrJ|rDd}d}nd}q&|rTd}n|| |v rd q||||  q&|d }d|d||d  g| |fS )Nr   Fr   Tr    )_wsp_splitterranger   rk   r(   )r   endcharsfragment	remainderZvcharsescapehad_qpposr   r   r   _get_ptext_to_endchars  s$    	r  c                 C   s.   |   }t| d t| t|  d}||fS )Nfws)r   r  r   )r   Znewvaluer  r   r   r   get_fws  s    r  c              	   C   s  t  }| ds td| | dd  dd^}}|| dd  krXtd| d|}t|dkr|d tv r|d tv r|	ddk r|dd^}}|d | }t| dkr|j
td	 | |_d|} ztd| d \}}}}	W n( ttfy(   td
|jY n0 ||_||_|j
|	 |r|d tv rpt|\}
}||
 qBt|d^}}t|d}t| || d|}qB| 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: '{}'vtextz.missing trailing whitespace after encoded-word)r`   
startswithr   HeaderParseErrorr-   r   r(   r   r   countr   rk   r   rb   _ewr   
ValueErrorKeyErrorr  rc   rd   r7   WSPr  r  r
  r  )r   Zewr   r  Zremstrrestr   rc   rd   r   r9   charsr  r   r   r   get_encoded_word  sd    











r)  c                 C   sB  t  }| r>| d tv r0t| \}} || qd}| drzt| \}} W n( tyd   d}Y n tjyv   Y nr0 d}t	|dkr|d j
dkr|jtd d}|rt	|dkr|d	 j
d
krt|d d|d< || qt| d^}}|rt|r| d^}}t|d}t| || d|} q|S )Nr   Tr  Fr   r  z&missing whitespace before encoded wordr   ra   r  r    )rU   r&  r  rk   r   r)  r  r   r!  r   rF   r   r   r  r  rfc2047_matchersearch	partitionr
  r  r(   )r   rV   r9   valid_ewZhave_wsr   r  r  r   r   r   get_unstructuredA  sH    





r/  c                 C   s*   t | d\}} }t|d}t| || fS )Nz()r   )r  r  r  r   r   _r   r   r   get_qp_ctext  s    
r2  c                 C   s*   t | d\}} }t|d}t| || fS )Nr   r   )r  r
  r  r0  r   r   r   get_qcontent  s    

r3  c                 C   sN   t | }|std| | }| t|d  } t|d}t| || fS )Nzexpected atext but found '{}'atext)_non_atom_end_matcherr   r!  r-   r   r   r
  r  )r   mr4  r   r   r   	get_atext  s    
r7  c                 C   sp  | d dkrt d| t }| dd  } | rT| d dkrTt| \}} || | r@| d dkr@| d tv rt| \}} n| d d dkr(d}z&t| \}} |j	t 
d d	}W n  t jy   t| \}} Y n0 |r4t|dkr4|d
 jdkr4|d jdkr4t|d
 d|d
< nt| \}} || qT| s`|j	t 
d || fS || dd  fS )Nr   r   zexpected '"' but found '{}'r   r   r  Fz!encoded word inside quoted stringTr   r  r*  ra   z"end of header inside quoted string)r   r!  r-   rp   r3  rk   r&  r  r)  r   r   r   rF   r  )r   Zbare_quoted_stringr9   r.  r   r   r   get_bare_quoted_string  sJ    



r8  c                 C   s   | r | d dkr t d| t }| dd  } | r| d dkr| d tv r\t| \}} n&| d dkrvt| \}} nt| \}} || q2| s|j	t 
d || fS || dd  fS )Nr   r   zexpected '(' but found '{}'r   rs   zend of header inside comment)r   r!  r-   rq   r&  r  get_commentr2  rk   r   r   )r   rR   r9   r   r   r   r9    s&    
r9  c                 C   sP   t  }| rH| d tv rH| d tv r0t| \}} nt| \}} || q|| fS r2   )r[   CFWS_LEADERr&  r  r9  rk   )r   r\   r9   r   r   r   get_cfws  s    r;  c                 C   sp   t  }| r,| d tv r,t| \}} || t| \}} || | rh| d tv rht| \}} || || fS r2   )re   r:  r;  rk   r8  )r   Zquoted_stringr9   r   r   r   get_quoted_string  s    


r<  c                 C   s   t  }| r,| d tv r,t| \}} || | rL| d tv rLtd| | drzt	| \}} W q tjy   t
| \}} Y q0 nt
| \}} || | r| d tv rt| \}} || || fS )Nr   zexpected atom but found '{}'r  )r]   r:  r;  rk   	ATOM_ENDSr   r!  r-   r   r)  r7  )r   r^   r9   r   r   r   get_atom  s&    



r>  c                 C   s   t  }| r| d tv r&td| | rt| d tvrtt| \}} || | r&| d dkr&|t | dd  } q&|d tu rt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   r=  r   r!  r-   r7  rk   r   )r   Zdot_atom_textr9   r   r   r   get_dot_atom_text2  s     

r?  c                 C   s   t  }| d tv r(t| \}} || | drfzt| \}} W qr tjyb   t| \}} Y qr0 nt| \}} || | r| d tv rt| \}} || || fS )Nr   r  )	r   r:  r;  rk   r   r)  r   r!  r?  )r   Zdot_atomr9   r   r   r   get_dot_atomE  s    



r@  c                 C   s   | d t v rt| \}} nd }| s,td| d dkrFt| \}} n*| d tv rdtd| nt| \}} |d ur|g|d d< || fS )Nr   z5Expected 'atom' or 'quoted-string' but found nothing.r   z1Expected 'atom' or 'quoted-string' but found '{}')r:  r;  r   r!  r<  SPECIALSr-   r>  )r   leaderr9   r   r   r   get_word^  s"    rC  c                 C   s   t  }zt| \}} || W n& tjyF   |jtd Y n0 | r| d tvr| d dkr|t |jt	d | dd  } qHzt| \}} W nB tjy   | d t
v rt| \}} |jt	d n Y n0 || qH|| fS )Nzphrase does not start with wordr   r   zperiod in 'phrase'r   zcomment found without atom)rX   rC  rk   r   r!  r   r   PHRASE_ENDSr   ObsoleteHeaderDefectr:  r;  )r   rY   r9   r   r   r   
get_phrase  s4    



rF  c                 C   sp  t  }d }| d tv r"t| \}} | s6td| zt| \}} W nZ tjy   zt| \}} W n4 tjy   | d dkr| d tv r t	 }Y n0 Y n0 |d ur|g|d d< |
| | r0| d dks| d tvr0tt||  \}} |jdkr|j
td n|j
td ||d< z|jd W n& tyf   |j
td Y n0 || fS )	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   r:  r;  r   r!  r-   r@  rC  rD  r   rk   get_obs_local_partr   rF   r   r   rE  r   encoder   ZNonASCIILocalPartDefect)r   r   rB  r9   obs_local_partr   r   r   get_local_part  sJ    
 


rL  c                 C   s  t  }d}| r&| d dks*| d tvr&| d dkrj|rL|jtd |t d}| dd  } q
nD| d dkr|t| d d | dd  } |jtd	 d}q
|r|d
 jdkr|jtd zt	| \}} d}W n2 tj
y   | d tvr t| \}} Y n0 || q
|d jdksV|d jdkrh|d jdkrh|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 wordsr\   z!Invalid leading '.' in local partr*  z"Invalid trailing '.' in local partrG  )r   rD  r   rk   r   r   r   r
  rF   rC  r!  r:  r;  )r   rK  Zlast_non_ws_was_dotr9   r   r   r   rI    sj     





rI  c                 C   s@   t | d\}} }t|d}|r0|jtd t| || fS )Nz[]r   z(quoted printable found in domain-literal)r  r
  r   rk   r   rE  r  )r   r   r  r   r   r   	get_dtext  s    

rN  c                 C   s,   | rdS | td | tdd dS )NFz"end of input inside domain-literal]domain-literal-endT)rk   r   r   r
  )r   domain_literalr   r   r   _check_for_early_dl_end  s    rR  c                 C   sj  t  }| d tv r(t| \}} || | s6td| d dkrRtd| | dd  } t| |rp|| fS |tdd | d t	v rt
| \}} || t| \}} || t| |r|| fS | d t	v rt
| \}} || t| |r|| fS | d dkrtd| |tdd	 | dd  } | rb| d tv rbt| \}} || || fS )
Nr   zexpected domain-literal[z6expected '[' at start of domain-literal but found '{}'r   zdomain-literal-startrO  z4expected ']' at end of domain-literal but found '{}'rP  )r   r:  r;  rk   r   r!  r-   rR  r
  r&  r  rN  )r   rQ  r9   r   r   r   get_domain_literal  sH    








rT  c                 C   sp  t  }d }| d tv r"t| \}} | s6td| | d dkrvt| \}} |d urd|g|d d< || || fS zt| \}} W n  tjy   t	| \}} Y n0 | r| d dkrtd|d ur|g|d d< || | rh| d dkrh|j
td |d jdkr(|d |d d < | rh| d dkrh|t t	| d	d  \}} || q(|| fS )
Nr   zexpected domain but found '{}'rS  r   zInvalid Domainr   z(domain is not a dot-atom (contains CFWS)r   r   )r   r:  r;  r   r!  r-   rT  rk   r@  r>  r   rE  rF   r   )r   r   rB  r9   r   r   r   
get_domain?  sD    




rU  c                 C   s|   t  }t| \}} || | r,| d dkrF|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   rL  rk   r   r   r   r
  rU  )r   r   r9   r   r   r   get_addr_spece  s    


rW  c                 C   s  t  }| rj| d dks"| d tv rj| d tv rFt| \}} || q| d dkr|t | dd  } q| rz| d dkrtd| |t t	| dd  \}} || | r>| d dkr>|t | dd  } | sq>| d tv rt| \}} || | d dkr|t t	| dd  \}} || q| sNtd| d dkrltd| |t
dd	 || dd  fS )
Nr   r  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   r:  r;  rk   ListSeparatorr   r!  r-   RouteComponentMarkerrU  r
  )r   Z	obs_router9   r   r   r   get_obs_routeu  sF    






r[  c                 C   s  t  }| d tv r(t| \}} || | r8| d dkrHtd| |tdd | dd  } | d dkr|tdd |jt	d | dd  } || fS zt
| \}} W nv tjy,   z"t| \}} |jtd	 W n& tjy   td
| Y n0 || t
| \}} Y n0 || | rZ| d dkrZ| 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   r:  r;  rk   r   r!  r-   r
  r   r   rW  r[  rE  )r   Z
angle_addrr9   r   r   r   get_angle_addr  sT    








r^  c                 C   s<   t  }t| \}} ||d d   |jd d  |_|| fS r   )r   rF  r7   r   )r   r   r9   r   r   r   get_display_name  s
    r_  c                 C   s   t  }d }| d tv r6t| \}} | s6td|| d dkr| d tv r^td| t| \}} | s~td||d ur|g|d d d< d }|| t	| \}} |d ur|g|d d< || || fS )Nr   z!expected name-addr but found '{}'r\  )
r   r:  r;  r   r!  r-   rD  r_  rk   r^  )r   Z	name_addrrB  r9   r   r   r   get_name_addr  s6    

r`  c                 C   s   t  }zt| \}} W nJ tjy`   zt| \}} W n$ tjyZ   td| Y n0 Y n0 tdd |jD r|d|_|	| || fS )Nzexpected mailbox but found '{}'c                 s   s   | ]}t |tjV  qd S r   )r   r   r   r"   r   r   r   r%     s   zget_mailbox.<locals>.<genexpr>r   )
r   r`  r   r!  rW  r-   anyr0   rF   rk   )r   r   r9   r   r   r   get_mailbox  s     
rb  c                 C   sd   t  }| r\| d |vr\| d tv rD|t| d d | dd  } qt| \}} || q|| fS )Nr   rM  r   )r   rD  rk   r
  rF  )r   r  Zinvalid_mailboxr9   r   r   r   get_invalid_mailbox  s    rc  c                 C   s  t  }| r| d dkrzt| \}} || W n tjy:   d }| d tv rt| \}} | rt| d dv r|| |jtd n@t	| d\}} |d ur|g|d d< || |jt
d nb| d dkr|jtd nBt	| d\}} |d ur|g|d d< || |jt
d Y n0 | r| d dvr|d }d|_t	| d\}} || |jt
d | r| d dkr|t | d	d  } q|| fS )
Nr   ;z,;zempty element in mailbox-listzinvalid mailbox in mailbox-listr  r   r   r   )r   rb  rk   r   r!  r:  r;  r   rE  rc  r   rF   r7   rY  )r   Zmailbox_listr9   rB  r   r   r   r   get_mailbox_list   sX    










re  c                 C   s  t  }| s$|jtd || fS d }| r| d tv rt| \}} | sl|jtd || || fS | d dkr|| || fS t| \}} t|j	dkr|d ur|| |
| |jtd || fS |d ur|g|d d< || || fS )Nzend of header before group-listr   zend of header in group-listrd  zgroup-list with empty entries)r   r   rk   r   r   r:  r;  re  r   r}   r7   rE  )r   Z
group_listrB  r9   r   r   r   get_group_listY  s>    







rf  c                 C   s   t  }t| \}} | r"| d dkr2td| || |tdd | dd  } | r| d dkr|tdd || dd  fS t| \}} || | s|jt	d n| d dkrtd	| |tdd | dd  } | r| d t
v rt| \}} || || fS )
Nr   rX  z8expected ':' at end of group display name but found '{}'zgroup-display-name-terminatorr   rd  zgroup-terminatorzend of header in groupz)expected ';' at end of group but found {})r   r_  r   r!  r-   rk   r
  rf  r   r   r:  r;  )r   r   r9   r   r   r   	get_group~  s8    



rg  c                 C   st   t  }zt| \}} W nJ tjy`   zt| \}} W n$ tjyZ   td| Y n0 Y n0 || || fS )Nzexpected address but found '{}')r~   rg  r   r!  rb  r-   rk   )r   ru   r9   r   r   r   get_address  s    
rh  c              
   C   s  t  }| rzt| \}} || W n$ tjyL } zd }| d tv rt| \}} | rj| d dkr|| |jtd nFt	| d\}} |d ur|g|d d< |t
|g |jtd nh| d dkr|jtd nHt	| d\}} |d ur|g|d d< |t
|g |jtd W Y d }~n
d }~0 0 | r| d dkr|d d }d|_t	| d\}} || |jtd | r|tdd | d	d  } q|| fS )
Nr   r  z"address-list entry with no contentzinvalid address in address-listzempty element in address-listr   r   r  r   )rt   rh  rk   r   r!  r:  r;  r   rE  rc  r~   r   rF   r7   r
  )r   Zaddress_listr9   errrB  r   r   r   r   get_address_list  sX    








rj  c                 C   s   t  }| std| | d dkr6td| |tdd | dd  } t| \}} || | rx| d dkrtd| |tdd	 || dd  fS )
Nz'expected no-fold-literal but found '{}'r   rS  z;expected '[' at the start of no-fold-literal but found '{}'zno-fold-literal-startr   rO  z9expected ']' at the end of no-fold-literal but found '{}'zno-fold-literal-end)r   r   r!  r-   rk   r
  rN  )r   Zno_fold_literalr9   r   r   r   get_no_fold_literal  s.    
rk  c                 C   s  t  }| r,| d tv r,t| \}} || | r<| d dkrLtd| |tdd | dd  } zt| \}} W n\ tjy   z"t	| \}} |j
td W n$ tjy   td| Y n0 Y n0 || | r| d dkr<|j
td	 | r4| d d
kr4|td
d | dd  } || fS |tdd | dd  } zt| \}} W n tjy   zt| \}} W nr tjy } zVz"t| \}} |j
td W n& tjy   td| Y n0 W Y d }~n
d }~0 0 Y n0 || | r0| d d
kr0| dd  } n|j
td |td
d | r|| d tv r|t| \}} || || 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-endrV  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   r:  r;  rk   r   r!  r-   r
  r?  rI  r   rE  r   rk  rU  )r   Zmsg_idr9   er   r   r   
get_msg_id  s~    






&


rm  c              
   C   s   t  }zt| \}} || W nN tjyn } z4t| }t|}|jtd	| W Y d }~n&d }~0 0 | r|jtd	|  |S )NzInvalid msg-id: {!r}zUnexpected {!r})
r   rm  rk   r   r!  r/  r   r   r   r-   )r   Z
message_idr9   exr   r   r   parse_message_idK  s    
ro  c                 C   s  t  }| s |jtd |S | d tv rXt| \}} || | sX|jtd d}| r| d dkr| d tvr|| d 7 }| dd  } q\| s|jtd	| |t
|d nt||_|t
|d	 | r| d tv rt| \}} || | r| d dkrT|jd ur:|jtd
 | rP|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  } q| s*|jtd	| |t
|d nt||_|t
|d	 | rn| d tv rnt| \}} || | r|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}r  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   rk   r   HeaderMissingRequiredValuer:  r;  isdigitr   r-   r
  intr   r   )r   Zmime_versionr9   rp  r   r   r   parse_mime_versiong  s    













rt  c                 C   sd   t  }| r\| d dkr\| d tv rD|t| d d | dd  } qt| \}} || q|| fS )Nr   rd  rM  r   )r   rD  rk   r
  rF  )r   Zinvalid_parameterr9   r   r   r   get_invalid_parameter  s    ru  c                 C   sN   t | }|std| | }| t|d  } t|d}t| || fS )Nzexpected ttext but found '{}'ttext)_non_token_end_matcherr   r!  r-   r   r   r
  r  )r   r6  rv  r   r   r   	get_ttext  s    	
rx  c                 C   s   t  }| r,| d tv r,t| \}} || | rL| d tv rLtd| t| \}} || | r| d tv rt| \}} || || fS Nr   zexpected token but found '{}')	r_   r:  r;  rk   
TOKEN_ENDSr   r!  r-   rx  )r   Zmtokenr9   r   r   r   	get_token  s    	


r{  c                 C   sN   t | }|std| | }| t|d  } t|d}t| || fS )Nz expected attrtext but found {!r}r   )_non_attribute_end_matcherr   r!  r-   r   r   r
  r  r   r6  r   r   r   r   get_attrtext  s    	
r~  c                 C   s   t  }| r,| d tv r,t| \}} || | rL| d tv rLtd| t| \}} || | r| d tv rt| \}} || || fS ry  )	r   r:  r;  rk   ATTRIBUTE_ENDSr   r!  r-   r~  r   r   r9   r   r   r   get_attribute  s    	


r  c                 C   sN   t | }|std| | }| t|d  } t|d}t| || fS )Nz)expected extended attrtext but found {!r}extended-attrtext)#_non_extended_attribute_end_matcherr   r!  r-   r   r   r
  r  r}  r   r   r   get_extended_attrtext	  s    
r  c                 C   s   t  }| r,| d tv r,t| \}} || | rL| d tv rLtd| t| \}} || | r| d tv rt| \}} || || fS ry  )	r   r:  r;  rk   EXTENDED_ATTRIBUTE_ENDSr   r!  r-   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  } | rR| d  sbtd| d}| r| d  r|| d 7 }| dd  } qf|d dkr|dkr|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 0rp  )r   r   r!  r-   rk   r
  rr  r   ZInvalidHeaderErrorrs  r   )r   r   rp  r   r   r   get_section9	  s,    	

r  c                 C   s   t  }| stdd }| d tv r0t| \}} | sDtd|| d dkr^t| \}} nt| \}} |d ur|g|d d< || || fS )Nz&Expected value but found end of stringr   z Expected value but found only {}r   )	r   r   r!  r:  r;  r-   r<  r  rk   )r   vrB  r9   r   r   r   	get_valueW	  s"    

r  c                 C   s  t  }t| \}} || | r,| d dkrL|jtd| || fS | d dkrz t| \}} d|_|| W n tj	y   Y n0 | st	d| d dkr|t
dd | dd  } d|_| d d	krt	d
|t
d	d | dd  } d }| r*| d tv r*t| \}} || d }|}|jrD| rD| d dkrDt| \}}|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0 |	sd}|r.|jtd || |D ](}
|
jdkrg |
d d < |
} q(q|} nd }|jtd | r^| d dkr^d }nt| \}} |jr~|jdkr| r| d dkr|| |d ur|} || fS |jtd | s|jtd || |d u r|| fS n|d ur>|D ]}
|
jdkr q"q|
jdk ||
 |
j|_| d dkr\t	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rbt }| r\| d tv rt| \}} n2| d dkrBt
dd}| dd  } nt| \}} || q|}nt| \}} || |d ur|} || fS )Nr   rd  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 invalidrh   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  rk   r   r   r   r-   r  r   r!  r
  r   r:  r;  r<  ro   r   r~  r  rF   r  r   rc   rd   r   r&  r  r3  )r   r   r9   rB  r  ZappendtoZqstringZinner_valueZ
semi_validr'  tr  r   r   r   get_parameterm	  s    























r  c              
   C   sp  t  }| rlzt| \}} || W n tjy } zd }| d tv rTt| \}} | sr|| |W  Y d }~S | d dkr|d ur|| |jtd n@t	| \}} |r|g|d d< || |jtd
| W Y d }~n
d }~0 0 | rJ| d dkrJ|d }d|_t	| \}} || |jtd
| | r|tdd | d	d  } q|S )
Nr   rd  zparameter entry with no contentzinvalid parameter {!r}r   r   z)parameter with invalid trailing text {!r}r  r   )r   r  rk   r   r!  r:  r;  r   r   ru  r-   rF   r7   r
  )r   Zmime_parametersr9   ri  rB  r   r   r   r   parse_mime_parameters	  sJ    






r  c                 C   s   |rV|d dkrV|d t v r>| t|d d |dd  }q t|\}}| | q |s^d S | tdd | t|dd   d S )Nr   rd  rM  r   r  )rD  rk   r
  rF  r  )Z	tokenlistr   r9   r   r   r   _find_mime_parameters/
  s    r  c              
   C   s  t  }d}| s$|jtd |S zt| \}} W n: tjyn   |jtd|  t	||  | Y S 0 || | r| d dkr|jtd | rt	||  |S |j
  |_|tdd | dd  } zt| \}} W n< tjy&   |jtd	|  t	||  | Y S 0 || |j
  |_| sL|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   r  zInvalid content typezcontent-type-separatorr   z'Expected content subtype but found {!r}rd  z<Only parameters are valid after content type, but found {!r}r  )r   r   rk   r   rq  r{  r!  r   r-   r  r   r   lowerr   r
  r   r  )r   ZctypeZrecoverr9   r   r   r   parse_content_type_header?
  sd    












r  c              
   C   s   t  }| s |jtd |S zt| \}} W n: tjyj   |jtd|  t	||  | Y S 0 || |j
  |_| s|S | d dkr|jtd|  t	||  |S |tdd |t| dd   |S )NzMissing content dispositionz+Expected content disposition but found {!r}r   rd  zCOnly parameters are valid after content disposition, but found {!r}r  r   )r   r   rk   r   rq  r{  r!  r   r-   r  r   r   r  r   r
  r  )r   Zdisp_headerr9   r   r   r    parse_content_disposition_headerx
  s:    






r  c              
   C   s   t  }| s |jtd |S zt| \}} W n, tjy\   |jtd|  Y n0 || |j	
  |_| s|S | r|jtd | d tv r|t| d d | dd  } qt| \}} || q|S )Nz!Missing content transfer encodingz1Expected content transfer encoding but found {!r}z*Extra text after content transfer encodingr   rM  r   )r   r   rk   r   rq  r{  r!  r   r-   r   r   r  rb   rD  r
  rF  )r   Z
cte_headerr9   r   r   r   &parse_content_transfer_encoding_header
  s4    



r  c                 C   sD   d}| r@| d r@| d d t v r@| d d }| d d d | d< |S )Nr    r   )r&  )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| }	|	r|	d}
|
|u r`|d8 }q>t|
}|s|
jdkrt	
| }nt
| }z|| |}W n4 ty   td	d
 |
jD rd}nd}d}Y n0 |
jdkrt|
||| q>|r|s|
js|d}d }|
jr||
j|dd t|j  }|j|vr|t||t|d  krjt|}|| |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sZt|
}|
jsP|d7 }|| ||	 }	q>|
jrz|sz|	d|
 d}q>t|}|s|
 r|||  q>|d  |7  < q>|j||j S )Nutf-8r   r    r   Fwrap_as_ew_blockedr   r   c                 s   s   | ]}t |tjV  qd S r   )r   r   r   r"   r   r   r   r%   
  s   z%_refold_parse_tree.<locals>.<genexpr>unknown-8bitTr   r:   r   rJ  )Zmax_line_lengthsysmaxsizeutf8r  r  r   r   rF   
SPECIALSNL
isdisjointNLSETrJ  r   ra  r0   _fold_mime_parametersr4   rK   r>   r   r   r  rk   rG   _fold_as_ewrL   r3   insertr(   )Z
parse_treer;   maxlenr   r  last_ewr  Zwant_encodingZend_ew_not_allowedr   r5   tstrrc   Zencoded_partnewlineZnewpartsr   r   r   r<   
  s    








r<   c                 C   s  |d ur<|r<t t|d |d  |  } |d d | |d< | d tv r| d }| dd  } t|d |krz|t| |d  |7  < d}| d tv r| d }| d d } |d u rt|d n|}|dkrdn|}	t|	d }
|
d |krtd| r|t|d  }||
 }|dkr,|d	 q| d | }tj	||	d
}t|| }|dkr|d d }tj	||	d
}t|| }qR|d  |7  < | t|d  } | r|d	 t|d }q|d  |7  < |r|S d S )Nr   r   r   r    r   r     z3max_line_length is too small to fit an encoded wordrQ   )rc   )
r   r/  r&  r   rk   r  r   r!  r#  rJ  )Z	to_encoder  r  r  rL   rc   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  7  sT    



r  c              	   C   s  | j D ]\}}|d  ds2|d  d7  < |}d}z|| d}W n. tyz   d}t|rrd}d}nd}Y n0 |rtjj	|d	|d
}	d
|||	}
nd
|t|}
t|d t|
 d |k r|d d |
 |d< qn"t|
d |kr|d|
  qd}|d }|rt|tt| d t| }||d krJd}|| d  }}|d | }tjj	|d	|d
}	t|	|krq|d8 }qZ|d
||||	 d	}|d7 }||d  }|r|d  d7  < qqd S )Nr   rd  strictFTr  r   r  r    )safer   z
{}*={}''{}r   r   rQ   r   r   z''r   N   z {}*{}*={}{})r   r   r   rJ  r   r   r   r   r   rr   r-   r   r   rk   r   )r5   r  r  r   r   r   rc   Zerror_handlerZencoding_requiredZencoded_valuer  r   Zextra_chromer  Z
splitpointZmaxcharspartialr   r   r   r  x  s`    


 r  )rer  r   stringr   operatorr   Zemailr   r#  r   r   r   r&  r:  rA  r=  r   rD  Z	TSPECIALSrz  Z	ASPECIALSr  r  r  r  r   compileVERBOSE	MULTILINEr+  r  r   rO   rU   rX   rZ   r[   r]   r_   r`   re   rp   rq   rt   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  r!  r  r   rY  rZ  r-   r(   r   r  r  matchr5  findallr  rw  r|  r  r  r  r  r)  r/  r2  r3  r7  r8  r9  r;  r<  r>  r?  r@  rC  rF  rL  rI  rN  rR  rT  rU  rW  r[  r^  r_  r`  rb  rc  re  rf  rg  rh  rj  rk  rm  ro  rt  ru  rx  r{  r~  r  r  r  r  r  r  r  r  r  r  r  r  r<   r  r  r   r   r   r   <module>F   s0  
C"	
!*$
V	+






1C+"&'/'&).9%7ED 49/kA