a
    #Rh                 	   @   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   B/opt/python-3.9.24/usr/lib/python3.9/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   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   r1      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   r2      s    zTokenList.all_defectsc                 C   s   | d   S Nr   )startswith_fwsr+   r   r   r   r5      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   r6      s    zTokenList.as_ew_allowedc                 C   s   g }| D ]}| |j q|S r   )extendcomments)r   r:   tokenr   r   r   r:      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   rB   r   r   r   pprint   s    zTokenList.pprintc                 C   s   d | j|dS )Nr
   rA   )r*   _pprE   r   r   r   rD      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{}{}/{}(rG   z*    !! invalid element in token list: {!r}z    z Defects: {}r"   z{}){})r/   r!   r0   
token_typehasattrrG   r   )r   rB   r;   extrar   r   r   rG      s    

zTokenList._pp)r"   )r"   )r"   )r0   
__module____qualname__rH   syntactic_breakew_combine_allowedr   r,   r1   propertyr   r2   r5   r6   r:   r@   rF   rD   rG   __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   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)rH   contentr$   r   r   r   
<listcomp>   r(   z0WhiteSpaceTokenList.comments.<locals>.<listcomp>r   r+   r   r   r   r:      s    zWhiteSpaceTokenList.commentsN)r0   rK   rL   rO   r   r:   r   r   r   r   rQ      s   
rQ   c                   @   s   e Zd ZdZdS )UnstructuredTokenListunstructuredNr0   rK   rL   rH   r   r   r   r   rW      s   rW   c                   @   s   e Zd ZdZdS )PhrasephraseNrY   r   r   r   r   rZ      s   rZ   c                   @   s   e Zd ZdZdS )WordZwordNrY   r   r   r   r   r\      s   r\   c                   @   s   e Zd ZdZdS )CFWSListcfwsNrY   r   r   r   r   r]      s   r]   c                   @   s   e Zd ZdZdS )AtomatomNrY   r   r   r   r   r_      s   r_   c                   @   s   e Zd ZdZdZdS )Tokenr;   FN)r0   rK   rL   rH   Zencode_as_ewr   r   r   r   ra      s   ra   c                   @   s   e Zd ZdZdZdZdZdS )EncodedWordencoded-wordN)r0   rK   rL   rH   ctecharsetlangr   r   r   r   rb      s   rb   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rH   r   r   r&   r   r   r   rU      s    
zQuotedString.contentc                 C   s>   g }| D ]*}|j dkr&|t| q||j qd|S )Nrj   r"   )rH   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 ri   rk   r   r;   r   r   r   stripped_value   s    
zQuotedString.stripped_valueN)r0   rK   rL   rH   rO   rU   ro   rq   r   r   r   r   rg      s   

	rg   c                   @   s$   e Zd ZdZdd Zedd ZdS )BareQuotedStringrj   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)r0   rK   rL   rH   r,   rO   r   r   r   r   r   rr     s   rr   c                   @   s8   e Zd ZdZdd Zdd Zedd Zedd	 Zd
S )CommentrT   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   rV     r(   z#Comment.__str__.<locals>.<listcomp>))r*   r3   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 )NrT   r   r   r   z\(ru   z\))rH   r   r   )r   r   r   r   r   rt     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   rU   #  s    zComment.contentc                 C   s   | j gS r   )rU   r+   r   r   r   r:   '  s    zComment.commentsN)	r0   rK   rL   rH   r,   rt   rO   rU   r:   r   r   r   r   rs     s   
rs   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rH   r$   r   r   r   rV   1  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 rw   NrH   	mailboxesr$   r   r   r   r'   5  s   z(AddressList.mailboxes.<locals>.<genexpr>r3   r+   r   r   r   r|   3  s
    zAddressList.mailboxesc                 C   s   t dd | D g S )Nc                 s   s   | ]}|j d kr|jV  qdS rz   rH   all_mailboxesr$   r   r   r   r'   :  s   z,AddressList.all_mailboxes.<locals>.<genexpr>r}   r+   r   r   r   r   8  s
    zAddressList.all_mailboxesN)r0   rK   rL   rH   rO   ry   r|   r   r   r   r   r   rv   +  s   

rv   c                   @   s4   e Zd ZdZedd Zedd Zedd ZdS )	Addressrw   c                 C   s   | d j dkr| d jS d S )Nr   grouprH   display_namer+   r   r   r   r   B  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-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r0| d gS | d jS r   r~   r+   r   r   r   r   O  s
    

zAddress.all_mailboxesN)r0   rK   rL   rH   rO   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dS )MailboxListmailbox-listc                 C   s   dd | D S )Nc                 S   s   g | ]}|j d kr|qS )r   rx   r$   r   r   r   rV   ]  r(   z)MailboxList.mailboxes.<locals>.<listcomp>r   r+   r   r   r   r|   [  s    zMailboxList.mailboxesc                 C   s   dd | D S )Nc                 S   s   g | ]}|j d v r|qS ))r   r   rx   r$   r   r   r   rV   a  s   
z-MailboxList.all_mailboxes.<locals>.<listcomp>r   r+   r   r   r   r   _  s    zMailboxList.all_mailboxesNr0   rK   rL   rH   rO   r|   r   r   r   r   r   r   W  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   r{   r+   r   r   r   r|   i  s    zGroupList.mailboxesc                 C   s    | r| d j dkrg S | d jS r   r~   r+   r   r   r   r   o  s    zGroupList.all_mailboxesNr   r   r   r   r   r   e  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   r{   r+   r   r   r   r|   z  s    zGroup.mailboxesc                 C   s   | d j dkrg S | d jS r   r~   r+   r   r   r   r     s    zGroup.all_mailboxesc                 C   s
   | d j S r4   )r   r+   r   r   r   r     s    zGroup.display_nameN)r0   rK   rL   rH   rO   r|   r   r   r   r   r   r   r   v  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
r0   rK   rL   rH   rO   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)rH   r   rl   r   r   r   r     s    
zAngleAddr.local_partc                 C   s"   | D ]}|j dkr|j  S qd S r   rH   r   rl   r   r   r   r     s    
zAngleAddr.domainc                 C   s"   | D ]}|j dkr|j  S qd S )N	obs-route)rH   domainsrl   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<>)rH   r   r   r   rl   r   r   r   r     s    

zAngleAddr.addr_specN)	r0   rK   rL   rH   rO   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   rV     r(   z$ObsRoute.domains.<locals>.<listcomp>r   r+   r   r   r   r     s    zObsRoute.domainsN)r0   rK   rL   rH   rO   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 r4   r   r+   r   r   r   r     s    zMailbox.local_partc                 C   s
   | d j S r4   r   r+   r   r   r   r     s    zMailbox.domainc                 C   s   | d j dkr| d jS d S r   )rH   r   r+   r   r   r   r     s    zMailbox.routec                 C   s
   | d j S r4   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)r0   rK   rL   rH   r6   rO   r   rP   r   r   r    r   r     s   r   c                   @   s   e Zd ZdZdS )DotAtomdot-atomNrY   r   r   r   r   r     s   r   c                   @   s   e Zd ZdZdZdS )DotAtomTextzdot-atom-textTNr0   rK   rL   rH   r6   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 r4   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)
r0   rK   rL   rH   r6   rO   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   0  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   rH   pop)r   rn   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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 )	NFTrh   r   r"   r^   rS   r   )r   rH   r   r   r   r   r   )r   rt   r&   preZpostr    r   r   r   L  s    
  zDisplayName.value)	r0   rK   rL   rH   rN   rO   r   r   rP   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 d S )Nr   rh   )rH   ro   r   r+   r   r   r   r   e  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   )DOTrH   r   
isinstancerm   r   )r   rn   lastZ
last_is_tltokZis_tlr   r   r   r   l  s(    


zLocalPart.local_partN)r0   rK   rL   rH   r6   rO   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                    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ptextrk   rl   r   r   r   ip  s    
zDomainLiteral.ip)	r0   rK   rL   rH   r6   rO   r   r   rP   r   r   r    r   r     s   r   c                   @   s   e Zd ZdZdZdZdS )MIMEVersionzmime-versionN)r0   rK   rL   rH   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   rh   rj   r"   )rH   rq   rp   r   r   r   param_value  s    




zParameter.param_valueN)
r0   rK   rL   rH   r   extendedre   rO   r   r   r   r   r   r   r     s   
r   c                   @   s   e Zd ZdZdS )InvalidParameterinvalid-parameterNrY   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)rH   endswithr   rp   r   r   r   rq     s    zAttribute.stripped_valueNr0   rK   rL   rH   rO   rq   r   r   r   r   r     s   r   c                   @   s   e Zd ZdZdZdS )SectionsectionN)r0   rK   rL   rH   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   )rh   r   zextended-attribute)rH   r   rq   r   rp   r   r   r   rq     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"   )rH   r   r   striprm   r   itemssortedr   re   r   r   r   r   InvalidHeaderDefectr   urllibparseunquote_to_bytesUnicodeEncodeErrorunquotedecodeLookupErrorr   _has_surrogatesUndecodableBytesDefectr*   )r   paramsr;   namepartsZfirst_paramre   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; rS   r"   )r   rm   r/   r   r*   )r   r   r   r   r   r   r   r,   &  s    
zMimeParameters.__str__N)r0   rK   rL   rH   rM   rO   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   )reversedrH   r   rp   r   r   r   r   7  s    
zParameterizedHeaderValue.paramsN)r0   rK   rL   rM   rO   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)r0   rK   rL   rH   r6   maintypesubtyper   r   r   r   r   ?  s   r   c                   @   s   e Zd ZdZdZdZdS )ContentDispositionzcontent-dispositionFN)r0   rK   rL   rH   r6   content_dispositionr   r   r   r   r   F  s   r   c                   @   s   e Zd ZdZdZdZdS )ContentTransferEncodingzcontent-transfer-encodingFZ7bitN)r0   rK   rL   rH   r6   rd   r   r   r   r   r   L  s   r   c                   @   s   e Zd ZdZdZdS )HeaderLabelzheader-labelFNr   r   r   r   r   r   R  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    z
MsgID.foldN)r0   rK   rL   rH   r6   r@   r   r   r   r   r   W  s   r   c                   @   s   e Zd ZdZdS )	MessageIDz
message-idNrY   r   r   r   r   r   `  s   r   c                   @   s   e Zd ZdZdS )InvalidMessageIDzinvalid-message-idNrY   r   r   r   r   r   d  s   r   c                   @   s   e Zd ZdZdS )HeaderheaderNrY   r   r   r   r   r  h  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__rH   r   )clsr   rH   r   r    r   r   r  v  s    zTerminal.__new__c                    s   d | jjt  S r-   r.   r+   r    r   r   r1   |  s    zTerminal.__repr__c                 C   s   t | jjd | j  d S )N/)rC   r!   r0   rH   r+   r   r   r   rF     s    zTerminal.pprintc                 C   s
   t | jS r   )listr   r+   r   r   r   r2     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!   r0   rH   r   r1   r   rE   r    r   r   rG     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   r:     s    zTerminal.commentsc                 C   s   t | | jfS r   )r   rH   r+   r   r   r   __getnewargs__  s    zTerminal.__getnewargs__)r"   )r0   rK   rL   r6   rN   rM   r  r1   rF   rO   r2   rG   r  r:   r	  rP   r   r   r    r   r  p  s   
	
r  c                   @   s    e Zd Zedd Zdd ZdS )WhiteSpaceTerminalc                 C   s   dS rR   r   r+   r   r   r   r     s    zWhiteSpaceTerminal.valuec                 C   s   dS )NTr   r+   r   r   r   r5     s    z!WhiteSpaceTerminal.startswith_fwsNr0   rK   rL   rO   r   r5   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   r5     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)r0   rK   rL   rO   r   r,   r   r   r   r   r    s   
r  c                   @   s   e Zd ZdS )_InvalidEwErrorN)r0   rK   rL   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   rm   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   rm   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  vtextc              	   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||}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: '{}'z.missing trailing whitespace after encoded-word)rb   
startswithr   HeaderParseErrorr/   r   r*   r   r   countr   rm   r   rd   _ewr   
ValueErrorKeyErrorr  re   rf   r9   WSPr  r  r  r  )r   Zterminal_typeZewr   r  Zremstrrestr   re   rf   r   r;   charsr  r   r   r   get_encoded_word  sd    











r+  c                 C   sD  t  }| r@| d tv r0t| \}} || qd}| drzt| d\}} W n( tyf   d}Y n tjyx   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   ZutextFr   r  z&missing whitespace before encoded wordr   rc   r"   )rW   r(  r  rm   r"  r+  r  r   r#  r   rH   r   r   r  r  rfc2047_matchersearch	partitionr  r  r*   )r   rX   r;   valid_ewZhave_wsr   r  r  r   r   r   get_unstructuredI  sH    





r1  c                 C   s*   t | d\}} }t|d}t| || fS )Nz()r   )r  r
  r  r   r   _r   r   r   get_qp_ctext  s    
r4  c                 C   s*   t | d\}} }t|d}t| || fS )Nr   r   )r  r  r  r2  r   r   r   get_qcontent  s    

r5  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   mr6  r   r   r   	get_atext  s    
r9  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,  rc   z"end of header inside quoted string)r   r#  r/   rr   r5  rm   r(  r  r+  r   r   r   rH   r  )r   Zbare_quoted_stringr;   r0  r   r   r   get_bare_quoted_string  sJ    



r:  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   ru   zend of header inside comment)r   r#  r/   rs   r(  r  get_commentr4  rm   r   r   )r   rT   r;   r   r   r   r;    s&    
r;  c                 C   sP   t  }| rH| d tv rH| d tv r0t| \}} nt| \}} || q|| fS r4   )r]   CFWS_LEADERr(  r  r;  rm   )r   r^   r;   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 r4   )rg   r<  r=  rm   r:  )r   Zquoted_stringr;   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=  rm   	ATOM_ENDSr   r#  r/   r"  r+  r9  )r   r`   r;   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/   r9  rm   r   )r   Zdot_atom_textr;   r   r   r   get_dot_atom_text:  s     

rA  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=  rm   r"  r+  r   r#  rA  )r   Zdot_atomr;   r   r   r   get_dot_atomM  s    



rB  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   leaderr;   r   r   r   get_wordf  s"    rE  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)rZ   rE  rm   r   r#  r   r   PHRASE_ENDSr   ObsoleteHeaderDefectr<  r=  )r   r[   r;   r   r   r   
get_phrase  s4    



rH  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/   rB  rE  rF  r   rm   get_obs_local_partr   rH   r   r   rG  r   encoder   ZNonASCIILocalPartDefect)r   r   rD  r;   obs_local_partr   r   r   get_local_part  sJ    
 


rN  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 partrI  )r   rF  r   rm   r   r   r   r  rH   rE  r#  r<  r=  )r   rM  Zlast_non_ws_was_dotr;   r   r   r   rK    sj     





rK  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   rm   r   rG  r  )r   r   r  r   r   r   	get_dtext  s    

rP  c                 C   s,   | rdS | td | tdd dS )NFz"end of input inside domain-literal]domain-literal-endT)rm   r   r   r  )r   domain_literalr   r   r   _check_for_early_dl_end  s    rT  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-startrQ  z4expected ']' at end of domain-literal but found '{}'rR  )r   r<  r=  rm   r   r#  r/   rT  r  r(  r  rP  )r   rS  r;   r   r   r   get_domain_literal   sH    








rV  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 '{}'rU  r   zInvalid Domainr   z(domain is not a dot-atom (contains CFWS)r   r   )r   r<  r=  r   r#  r/   rV  rm   rB  r@  r   rG  rH   r   )r   r   rD  r;   r   r   r   
get_domainG  sD    




rW  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   rN  rm   r   r   r   r  rW  )r   r   r;   r   r   r   get_addr_specm  s    


rY  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=  rm   ListSeparatorr   r#  r/   RouteComponentMarkerrW  r  )r   Z	obs_router;   r   r   r   get_obs_route}  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=  rm   r   r#  r/   r  r   r   rY  r]  rG  )r   Z
angle_addrr;   r   r   r   get_angle_addr  sT    








r`  c                 C   s<   t  }t| \}} ||d d   |jd d  |_|| fS r   )r   rH  r9   r   )r   r   r;   r   r   r   get_display_name  s
    ra  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/   rF  ra  rm   r`  )r   Z	name_addrrD  r;   r   r   r   get_name_addr  s6    

rb  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   rb  r   r#  rY  r/   anyr2   rH   rm   )r   r   r;   r   r   r   get_mailbox  s     
rd  c                 C   sd   t  }| r\| d |vr\| d tv rD|t| d d | dd  } qt| \}} || q|| fS )Nr   rO  r   )r   rF  rm   r  rH  )r   r  Zinvalid_mailboxr;   r   r   r   get_invalid_mailbox  s    re  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   rd  rm   r   r#  r<  r=  r   rG  re  r   rH   r9   r[  )r   Zmailbox_listr;   rD  r   r   r   r   get_mailbox_list(  sX    










rg  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-listrf  zgroup-list with empty entries)r   r   rm   r   r   r<  r=  rg  r   r   r9   rG  )r   Z
group_listrD  r;   r   r   r   get_group_lista  s>    







rh  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   rZ  z8expected ':' at end of group display name but found '{}'zgroup-display-name-terminatorr   rf  zgroup-terminatorzend of header in groupz)expected ';' at end of group but found {})r   ra  r   r#  r/   rm   r  rh  r   r   r<  r=  )r   r   r;   r   r   r   	get_group  s8    



ri  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   ri  r   r#  rd  r/   rm   )r   rw   r;   r   r   r   get_address  s    
rj  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   )rv   rj  rm   r   r#  r<  r=  r   rG  re  r   r   rH   r9   r  )r   Zaddress_listr;   errrD  r   r   r   r   get_address_list  sX    








rl  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   rU  z;expected '[' at the start of no-fold-literal but found '{}'zno-fold-literal-startr   rQ  z9expected ']' at the end of no-fold-literal but found '{}'zno-fold-literal-end)r   r   r#  r/   rm   r  rP  )r   Zno_fold_literalr;   r   r   r   get_no_fold_literal  s.    
rm  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-endrX  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=  rm   r   r#  r/   r  rA  rK  r   rG  r   rm  rW  )r   Zmsg_idr;   er   r   r   
get_msg_id  s~    






&


ro  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   ro  rm   r   r#  r1  r   r   r   r/   )r   Z
message_idr;   exr   r   r   parse_message_idS  s    
rq  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   rm   r   HeaderMissingRequiredValuer<  r=  isdigitr   r/   r  intr   r   )r   Zmime_versionr;   rr  r   r   r   parse_mime_versiono  s    













rv  c                 C   sd   t  }| r\| d dkr\| d tv rD|t| d d | dd  } qt| \}} || q|| fS )Nr   rf  rO  r   )r   rF  rm   r  rH  )r   Zinvalid_parameterr;   r   r   r   get_invalid_parameter  s    rw  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   r8  rx  r   r   r   	get_ttext  s    	
rz  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 '{}')	ra   r<  r=  rm   
TOKEN_ENDSr   r#  r/   rz  )r   Zmtokenr;   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   r8  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 r{  )	r   r<  r=  rm   ATTRIBUTE_ENDSr   r#  r/   r  r   r   r;   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 r{  )	r   r<  r=  rm   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 0rr  )r   r   r#  r/   rm   r  rt  r   ZInvalidHeaderErrorru  r   )r   r   rr  r   r   r   get_sectionA	  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  rm   )r   vrD  r;   r   r   r   	get_value_	  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   rf  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 invalidrj   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  rm   r   r   r   r/   r  r   r#  r  r   r<  r=  r>  rq   r   r  r  rH   r  r   re   rf   r   r(  r  r5  )r   r   r;   rD  r  ZappendtoZqstringZinner_valueZ
semi_validr)  tr  r   r   r   get_parameteru	  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   rf  zparameter entry with no contentzinvalid parameter {!r}r   r   z)parameter with invalid trailing text {!r}r  r   )r   r  rm   r   r#  r<  r=  r   r   rw  r/   rH   r9   r  )r   Zmime_parametersr;   rk  rD  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   rf  rO  r   r  )rF  rm   r  rH  r  )Z	tokenlistr   r;   r   r   r   _find_mime_parameters7
  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}rf  z<Only parameters are valid after content type, but found {!r}r  )r   r   rm   r   rs  r}  r#  r   r/   r  r   r   lowerr   r  r   r  )r   ZctypeZrecoverr;   r   r   r   parse_content_type_headerG
  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   rf  zCOnly parameters are valid after content disposition, but found {!r}r  r   )r   r   rm   r   rs  r}  r#  r   r/   r  r   r   r  r   r  r  )r   Zdisp_headerr;   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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   rO  r   )r   r   rm   r   rs  r}  r#  r   r/   r   r   r  rd   rF  r  rH  )r   Z
cte_headerr;   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v 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st|
}|
jdkrhtddgdd |D  tddg }|
js|d7 }|| ||	 }	q>|
jr|s|	d|
 d}q>t|}|s|
 r|||  q>|d  |7  < q>|j||j S )Nutf-8r   r"   r   Fwrap_as_ew_blockedr   )r   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   rL  rj   r   r   c                 S   s   g | ]}t t|d qS )r   )r  r   )r%   pr   r   r   rV   1  s   z&_refold_parse_tree.<locals>.<listcomp>)Zmax_line_lengthsysmaxsizeutf8r  r  r   r   rH   
SPECIALSNL
isdisjointNLSETrL  r   rc  r2   _fold_mime_parametersr6   rM   r@   r   r   r  rm   rI   _fold_as_ewrN   r5   r  insertr*   )Z
parse_treer=   maxlenr   r  last_ewr  Zwant_encodingZend_ew_not_allowedr   r7   tstrre   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 wordrS   )re   )
r   r1  r(  r   rm   r  r   r#  r%  rL  )Z	to_encoder  r  r  rN   re   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  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   rf  strictFTr  r   r  r"   )safer   z
{}*={}''{}r   r   rS   r   r   z''r   N   z {}*{}*={}{})r   r   r   rL  r   r   r   r   r   rt   r/   r   r   rm   r   )r7   r  r  r   r   r   re   Zerror_handlerZencoding_requiredZencoded_valuer  r   Zextra_chromer  Z
splitpointZmaxcharspartialr   r   r   r    s`    


 r  )r  )rer  r   stringr   operatorr   Zemailr   r%  r   r   r   r(  r<  rC  r?  r   rF  Z	TSPECIALSr|  Z	ASPECIALSr  r  r  r  r   r   compileVERBOSE	MULTILINEr-  r  r   rQ   rW   rZ   r\   r]   r_   ra   rb   rg   rr   rs   rv   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   r[  r\  r/   r*   r   r  r  matchr7  findallr  ry  r~  r  r  r  r  r+  r1  r4  r5  r9  r:  r;  r=  r>  r@  rA  rB  rE  rH  rN  rK  rP  rT  rV  rW  rY  r]  r`  ra  rb  rd  re  rg  rh  ri  rj  rl  rm  ro  rq  rv  rw  rz  r}  r  r  r  r  r  r  r  r  r  r  r  r  r  r>   r  r  r   r   r   r   <module>F   s2  
C"	
!*$
V	+







1C+"&'/'&).9%7ED 49/tA