<!DOCTYPE html>
<html lang="en">

<head>
    <meta charset="UTF-8">
    <meta http-equiv="X-UA-Compatible" content="IE=edge">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <link href="https://cdn.jsdelivr.net/npm/bootstrap@5.3.0-alpha1/dist/css/bootstrap.min.css" rel="stylesheet"
        integrity="sha384-GLhlTQ8iRABdZLl6O3oVMWSktQOp6b7In1Zl3/Jr59b6EGGoI1aFkw7cmDA6j6gD" crossorigin="anonymous">
    <link rel="stylesheet" href="https://cdnjs.cloudflare.com/ajax/libs/font-awesome/6.3.0/css/all.min.css"
        integrity="sha512-SzlrxWUlpfuzQ+pcUCosxcglQRNAq/DZjVsC0lE40xsADsfeQoEypE+enwcOiGjk/bSuGGKHEyjSoQ1zVisanQ=="
        crossorigin="anonymous" referrerpolicy="no-referrer" />
</head>
</html>
U
    if                 	   @   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   ?/opt/alt/python38/lib64/python3.8/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|| 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>   s     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%      s      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%      s     z(TokenList.all_defects.<locals>.<genexpr>)sumr   r(   r   r   r   r/      s    zTokenList.all_defectsc                 C   s   | d   S Nr   )startswith_fwsr(   r   r   r   r2      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%      s     z*TokenList.as_ew_allowed.<locals>.<genexpr>)allr(   r   r   r   r3      s    zTokenList.as_ew_allowedc                 C   s   g }| D ]}| |j q|S r   )extendcomments)r   r7   tokenr   r   r   r7      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'   _pprB   r   r   r   rA      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{}{}/{}(rD   z*    !! invalid element in token list: {!r}z    z Defects: {}r    z{}){})r,   r   r-   
token_typehasattrrD   r   )r   r?   r8   Zextrar   r   r   rD      s    

zTokenList._pp)r    )r    )r    )r-   
__module____qualname__rE   syntactic_breakew_combine_allowedr   r)   r.   propertyr   r/   r2   r3   r7   r=   rC   rA   rD   __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)rE   contentr"   r   r   r   
<listcomp>   s     
 z0WhiteSpaceTokenList.comments.<locals>.<listcomp>r   r(   r   r   r   r7      s    zWhiteSpaceTokenList.commentsN)r-   rG   rH   rK   r   r7   r   r   r   r   rM      s   
rM   c                   @   s   e Zd ZdZdS )UnstructuredTokenListunstructuredNr-   rG   rH   rE   r   r   r   r   rS      s   rS   c                   @   s   e Zd ZdZdS )PhrasephraseNrU   r   r   r   r   rV      s   rV   c                   @   s   e Zd ZdZdS )WordZwordNrU   r   r   r   r   rX      s   rX   c                   @   s   e Zd ZdZdS )CFWSListcfwsNrU   r   r   r   r   rY      s   rY   c                   @   s   e Zd ZdZdS )AtomatomNrU   r   r   r   r   r[      s   r[   c                   @   s   e Zd ZdZdZdS )Tokenr8   FN)r-   rG   rH   rE   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-   rG   rH   rE   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rE   r   r   r$   r   r   r   rQ      s    
zQuotedString.contentc                 C   s>   g }| D ]*}|j dkr&|t| q||j qd|S )Nrf   r    )rE   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 re   rg   r   r8   r   r   r   stripped_value   s    
zQuotedString.stripped_valueN)r-   rG   rH   rE   rK   rQ   rk   rm   r   r   r   r   rc      s   

	rc   c                   @   s$   e Zd ZdZdd Zedd ZdS )BareQuotedStringrf   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%     s     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%     s     z)BareQuotedString.value.<locals>.<genexpr>r&   r(   r   r   r   r     s    zBareQuotedString.valueN)r-   rG   rH   rE   r)   rK   r   r   r   r   r   rn      s   rn   c                   @   s8   e Zd ZdZdd Zdd Zedd Zedd	 Zd
S )CommentrP   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   rR     s     z#Comment.__str__.<locals>.<listcomp>))r'   r0   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 )NrP   r   r   r   z\(rq   z\))rE   r   r   )r   r   r   r   r   rp     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%     s     z"Comment.content.<locals>.<genexpr>r&   r(   r   r   r   rQ     s    zComment.contentc                 C   s   | j gS r   )rQ   r(   r   r   r   r7     s    zComment.commentsN)	r-   rG   rH   rE   r)   rp   rK   rQ   r7   r   r   r   r   ro   	  s   
ro   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rE   r"   r   r   r   rR   )  s     
 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 rs   NrE   	mailboxesr"   r   r   r   r%   -  s    
z(AddressList.mailboxes.<locals>.<genexpr>r0   r(   r   r   r   rx   +  s
    zAddressList.mailboxesc                 C   s   t dd | D g S )Nc                 s   s   | ]}|j d kr|jV  qdS rv   rE   all_mailboxesr"   r   r   r   r%   2  s    
z,AddressList.all_mailboxes.<locals>.<genexpr>ry   r(   r   r   r   r{   0  s
    zAddressList.all_mailboxesN)r-   rG   rH   rE   rK   ru   rx   r{   r   r   r   r   rr   #  s   

rr   c                   @   s4   e Zd ZdZedd Zedd Zedd ZdS )	Addressrs   c                 C   s   | d j dkr| d jS d S )Nr   grouprE   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-mailboxrw   r(   r   r   r   rx   ?  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   rz   r(   r   r   r   r{   G  s
    

zAddress.all_mailboxesN)r-   rG   rH   rE   rK   r   rx   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   rt   r"   r   r   r   rR   U  s     
 z)MailboxList.mailboxes.<locals>.<listcomp>r   r(   r   r   r   rx   S  s    zMailboxList.mailboxesc                 C   s   dd | D S )Nc                 S   s   g | ]}|j d kr|qS ))r   r   rt   r"   r   r   r   rR   Y  s    
z-MailboxList.all_mailboxes.<locals>.<listcomp>r   r(   r   r   r   r{   W  s    zMailboxList.all_mailboxesNr-   rG   rH   rE   rK   rx   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   rw   r(   r   r   r   rx   a  s    zGroupList.mailboxesc                 C   s    | r| d j dkrg S | d jS r   rz   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   rw   r(   r   r   r   rx   r  s    zGroup.mailboxesc                 C   s   | d j dkrg S | d jS r   rz   r(   r   r   r   r{   x  s    zGroup.all_mailboxesc                 C   s
   | d j S r1   )r   r(   r   r   r   r   ~  s    zGroup.display_nameN)r-   rG   rH   rE   rK   rx   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-   rG   rH   rE   rK   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)rE   r   rh   r   r   r   r     s    
zAngleAddr.local_partc                 C   s"   | D ]}|j dkr|j  S qd S r   rE   r   rh   r   r   r   r     s    
zAngleAddr.domainc                 C   s"   | D ]}|j dkr|j  S qd S )N	obs-route)rE   domainsrh   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<>)rE   r   r   r   rh   r   r   r   r     s    

zAngleAddr.addr_specN)	r-   rG   rH   rE   rK   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   rR     s     
 z$ObsRoute.domains.<locals>.<listcomp>r   r(   r   r   r   r     s    zObsRoute.domainsN)r-   rG   rH   rE   rK   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 r1   r   r(   r   r   r   r     s    zMailbox.local_partc                 C   s
   | d j S r1   r   r(   r   r   r   r     s    zMailbox.domainc                 C   s   | d j dkr| d jS d S r   )rE   r   r(   r   r   r   r     s    zMailbox.routec                 C   s
   | d j S r1   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-   rG   rH   rE   r3   rK   r   rL   r   r   r   r   r     s   r   c                   @   s   e Zd ZdZdS )DotAtomdot-atomNrU   r   r   r   r   r     s   r   c                   @   s   e Zd ZdZdZdS )DotAtomTextzdot-atom-textTNr-   rG   rH   rE   r3   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 r1   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 k	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-   rG   rH   rE   r3   rK   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   rZ   r   r   )r   r   r   rE   pop)r   rj   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 )	NFTrd   r   r    rZ   rO   r   )r   rE   r   r   r   r   r   )r   rp   r$   ZpreZpostr   r   r   r   D  s    
  zDisplayName.value)	r-   rG   rH   rE   rJ   rK   r   r   rL   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   rd   )rE   rk   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   rZ   dotr   r   )DOTrE   r   
isinstanceri   r   )r   rj   ZlastZ
last_is_tltokZis_tlr   r   r   r   d  s(    


zLocalPart.local_partN)r-   rG   rH   rE   r3   rK   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ptextrg   rh   r   r   r   ip  s    
zDomainLiteral.ip)	r-   rG   rH   rE   r3   rK   r   r   rL   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-   rG   rH   rE   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   rd   rf   r    )rE   rm   rl   r   r   r   param_value  s    




zParameter.param_valueN)
r-   rG   rH   rE   r   extendedra   rK   r   r   r   r   r   r   r     s   
r   c                   @   s   e Zd ZdZdS )InvalidParameterinvalid-parameterNrU   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)rE   endswithr   rl   r   r   r   rm     s    zAttribute.stripped_valueNr-   rG   rH   rE   rK   rm   r   r   r   r   r     s   r   c                   @   s   e Zd ZdZdZdS )SectionsectionN)r-   rG   rH   rE   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   rZ   r   )rd   r   zextended-attribute)rE   r   rm   r   rl   r   r   r   rm     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 }||k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k
rt   tjj|d	d
}Y nRX z||d}W n" tk
r   |dd}Y nX 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    )rE   r   r   stripri   r   itemssortedr   ra   r   r   r   r   InvalidHeaderDefectr   urllibparseZunquote_to_bytesUnicodeEncodeErrorZunquotedecodeLookupErrorr   _has_surrogatesUndecodableBytesDefectr'   )r   paramsr8   namepartsZfirst_paramra   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; rO   r    )r   ri   r,   r   r'   )r   r   r   r   r   r   r   r)     s    
zMimeParameters.__str__N)r-   rG   rH   rE   rI   rK   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   )reversedrE   r   rl   r   r   r   r   /  s    
zParameterizedHeaderValue.paramsN)r-   rG   rH   rI   rK   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-   rG   rH   rE   r3   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-   rG   rH   rE   r3   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-   rG   rH   rE   r3   r`   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-   rG   rH   rE   r3   r=   r   r   r   r   r   O  s   r   c                   @   s   e Zd ZdZdS )	MessageIDz
message-idNrU   r   r   r   r   r   X  s   r   c                   @   s   e Zd ZdZdS )InvalidMessageIDzinvalid-message-idNrU   r   r   r   r   r   \  s   r   c                   @   s   e Zd ZdZdS )HeaderheaderNrU   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__rE   r   )clsr   rE   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/)r@   r   r-   rE   r(   r   r   r   rC   w  s    zTerminal.pprintc                 C   s
   t | jS r   )listr   r(   r   r   r   r/   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-   rE   r   r.   r   rB   r   r   r   rD   ~  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   r7     s    zTerminal.commentsc                 C   s   t | | jfS r   )r   rE   r(   r   r   r   __getnewargs__  s    zTerminal.__getnewargs__)r    )r-   rG   rH   r3   rJ   rI   r   r.   rC   rK   r/   rD   r   r7   r  rL   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 rN   r   r(   r   r   r   r     s    zWhiteSpaceTerminal.valuec                 C   s   dS )NTr   r(   r   r   r   r2     s    z!WhiteSpaceTerminal.startswith_fwsNr-   rG   rH   rK   r   r2   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   r2     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-   rG   rH   rK   r   r)   r   r   r   r   r    s   
r  c                   @   s   e Zd ZdS )_InvalidEwErrorN)r-   rG   rH   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   ri   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|| |krd q||||  q&|d }d|d||d  g| |fS )Nr   Fr   Tr    )_wsp_splitterranger   ri   r'   )r   endcharsZ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kr|d tk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k
r*   td
|jY nX ||_||_|j
|	 |r|d tkrrt|\}
}||
 qDt|d^}}t|d}t| || d|}qD| r| d tk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   ri   r   r`   _ewr   
ValueErrorKeyErrorr  ra   rb   r6   WSPr  r  r  r  )r   Zewr   r  Zremstrrestr   ra   rb   r   r8   charsr  r   r   r   get_encoded_word  sd    











r"  c                 C   sF  t  }| rB| d tkr0t| \}} || qd}| drzt| \}} W n, tk
rf   d}Y n tjk
rz   Y nrX 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   r_   r  r    )rS   r  r  ri   r  r"  r  r   r  r   rE   r   r   r  r  rfc2047_matchersearch	partitionr  r  r'   )r   rT   r8   valid_ewZhave_wsr   r  r  r   r   r   get_unstructuredA  sJ    


 


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    
r+  c                 C   s*   t | d\}} }t|d}t| || fS )Nr   r   )r  r  r  r)  r   r   r   get_qcontent  s    

r,  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   mr-  r   r   r   	get_atext  s    
r0  c                 C   sr  | d dkrt d| t }| dd  } | rT| d dkrTt| \}} || | rB| d dkrB| d tkrt| \}} n| d d dkr*d}z&t| \}} |j	t 
d d	}W n" t jk
r   t| \}} Y nX |r6t|dkr6|d
 jdkr6|d jdkr6t|d
 d|d
< nt| \}} || qT| sb|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#  r_   z"end of header inside quoted string)r   r  r,   rn   r,  ri   r  r  r"  r   r   r   rE   r  )r   Zbare_quoted_stringr8   r'  r   r   r   get_bare_quoted_string  sL    

 

r1  c                 C   s   | r | d dkr t d| t }| dd  } | r| d dkr| d tk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   rq   zend of header inside comment)r   r  r,   ro   r  r  get_commentr+  ri   r   r   )r   rP   r8   r   r   r   r2    s&    
r2  c                 C   sP   t  }| rH| d tkrH| d tkr0t| \}} nt| \}} || q|| fS r1   )rY   CFWS_LEADERr  r  r2  ri   )r   rZ   r8   r   r   r   get_cfws  s    r4  c                 C   sp   t  }| r,| d tkr,t| \}} || t| \}} || | rh| d tkrht| \}} || || fS r1   )rc   r3  r4  ri   r1  )r   Zquoted_stringr8   r   r   r   get_quoted_string  s    


r5  c                 C   s   t  }| r,| d tkr,t| \}} || | rL| d tkrLtd| | drzt	| \}} W q tjk
r   t
| \}} Y qX nt
| \}} || | r| d tkrt| \}} || || fS )Nr   zexpected atom but found '{}'r  )r[   r3  r4  ri   	ATOM_ENDSr   r  r,   r  r"  r0  )r   r\   r8   r   r   r   get_atom  s&    



r7  c                 C   s   t  }| r| d tkr&td| | rt| d tkrtt| \}} || | r&| d dkr&|t | dd  } q&|d tk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   r6  r   r  r,   r0  ri   r   )r   Zdot_atom_textr8   r   r   r   get_dot_atom_text2  s     

r8  c                 C   s   t  }| d tkr(t| \}} || | drhzt| \}} W qt tjk
rd   t| \}} Y qtX nt| \}} || | r| d tkrt| \}} || || fS )Nr   r  )	r   r3  r4  ri   r  r"  r   r  r8  )r   Zdot_atomr8   r   r   r   get_dot_atomE  s    



r9  c                 C   s   | d t krt| \}} nd }| s,td| d dkrFt| \}} n*| d tkrdtd| nt| \}} |d k	r|g|d d< || fS )Nr   z5Expected 'atom' or 'quoted-string' but found nothing.r   z1Expected 'atom' or 'quoted-string' but found '{}')r3  r4  r   r  r5  SPECIALSr,   r7  )r   leaderr8   r   r   r   get_word^  s"    r<  c                 C   s   t  }zt| \}} || W n( tjk
rH   |jtd Y nX | r| d tkr| d dkr|t |jt	d | dd  } qJzt| \}} W nD tjk
r   | d t
krt| \}} |jt	d n Y nX || qJ|| fS )Nzphrase does not start with wordr   r   zperiod in 'phrase'r   zcomment found without atom)rV   r<  ri   r   r  r   r   PHRASE_ENDSr   ObsoleteHeaderDefectr3  r4  )r   rW   r8   r   r   r   
get_phrase  s4    



r?  c                 C   sv  t  }d }| d tkr"t| \}} | s6td| zt| \}} W n^ tjk
r   zt| \}} W n6 tjk
r   | d dkr| d tkr t	 }Y nX Y nX |d k	r|g|d d< |
| | r4| d dks| d tkr4tt||  \}} |jdkr|j
td n|j
td ||d< z|jd W n( tk
rl   |j
td Y nX || 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   r3  r4  r   r  r,   r9  r<  r=  r   ri   get_obs_local_partr   rE   r   r   r>  r   encoder   ZNonASCIILocalPartDefect)r   r   r;  r8   obs_local_partr   r   r   get_local_part  sJ    
 


rE  c                 C   s  t  }d}| r(| d dks*| d tk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 n4 tj
k
r   | d tkr
 t| \}} Y nX || q
|d jdksX|d jdkrj|d jdkrj|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 wordsrZ   z!Invalid leading '.' in local partr#  z"Invalid trailing '.' in local partr@  )r   r=  r   ri   r   r   r   r  rE   r<  r  r3  r4  )r   rD  Zlast_non_ws_was_dotr8   r   r   r   rB    sj     





rB  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   ri   r   r>  r  )r   r   r  r   r   r   	get_dtext  s    

rG  c                 C   s,   | rdS | td | tdd dS )NFz"end of input inside domain-literal]domain-literal-endT)ri   r   r   r  )r   domain_literalr   r   r   _check_for_early_dl_end  s    rK  c                 C   sj  t  }| d tkr(t| \}} || | s6td| d dkrRtd| | dd  } t| |rp|| fS |tdd | d t	krt
| \}} || t| \}} || t| |r|| fS | d t	krt
| \}} || t| |r|| fS | d dkrtd| |tdd	 | dd  } | rb| d tkrbt| \}} || || fS )
Nr   zexpected domain-literal[z6expected '[' at start of domain-literal but found '{}'r   zdomain-literal-startrH  z4expected ']' at end of domain-literal but found '{}'rI  )r   r3  r4  ri   r   r  r,   rK  r  r  r  rG  )r   rJ  r8   r   r   r   get_domain_literal  sH    








rM  c                 C   sr  t  }d }| d tkr"t| \}} | s6td| | d dkrvt| \}} |d k	rd|g|d d< || || fS zt| \}} W n" tjk
r   t	| \}} Y nX | r| d dkrtd|d k	r|g|d d< || | rj| d dkrj|j
td |d jdkr*|d |d d < | rj| d dkrj|t t	| d	d  \}} || q*|| fS )
Nr   zexpected domain but found '{}'rL  r   zInvalid Domainr   z(domain is not a dot-atom (contains CFWS)r   r   )r   r3  r4  r   r  r,   rM  ri   r9  r7  r   r>  rE   r   )r   r   r;  r8   r   r   r   
get_domain?  sD    




rN  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   rE  ri   r   r   r   r  rN  )r   r   r8   r   r   r   get_addr_spece  s    


rP  c                 C   s  t  }| rj| d dks"| d tkrj| d tk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k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   r3  r4  ri   ListSeparatorr   r  r,   RouteComponentMarkerrN  r  )r   Z	obs_router8   r   r   r   get_obs_routeu  sF    






rT  c                 C   s  t  }| d tk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 nz tjk
r0   z"t| \}} |jtd	 W n( tjk
r   td
| Y nX || t
| \}} Y nX || | r^| d dkr^| dd  } n|jt	d |tdd | r| d tk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   r3  r4  ri   r   r  r,   r  r   r   rP  rT  r>  )r   Z
angle_addrr8   r   r   r   get_angle_addr  sT    








rW  c                 C   s<   t  }t| \}} ||d d   |jd d  |_|| fS r   )r   r?  r6   r   )r   r   r8   r   r   r   get_display_name  s
    rX  c                 C   s   t  }d }| d tkr6t| \}} | s6td|| d dkr| d tkr^td| t| \}} | s~td||d k	r|g|d d d< d }|| t	| \}} |d k	r|g|d d< || || fS )Nr   z!expected name-addr but found '{}'rU  )
r   r3  r4  r   r  r,   r=  rX  ri   rW  )r   Z	name_addrr;  r8   r   r   r   get_name_addr  s6    

rY  c                 C   s   t  }zt| \}} W nN tjk
rd   zt| \}} W n& tjk
r^   td| Y nX Y nX tdd |jD rd|_|	| || 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   rY  r   r  rP  r,   anyr/   rE   ri   )r   r   r8   r   r   r   get_mailbox  s     
r[  c                 C   sd   t  }| r\| d |kr\| d tkrD|t| d d | dd  } qt| \}} || q|| fS )Nr   rF  r   )r   r=  ri   r  r?  )r   r  Zinvalid_mailboxr8   r   r   r   get_invalid_mailbox  s    r\  c                 C   s  t  }| r| d dkrzt| \}} || W n tjk
r<   d }| d tkrt| \}} | rv| d dkr|| |jtd n@t	| d\}} |d k	r|g|d d< || |jt
d nb| d dkr|jtd nBt	| d\}} |d k	r|g|d d< || |jt
d Y nX | r| d dk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   r[  ri   r   r  r3  r4  r   r>  r\  r   rE   r6   rR  )r   Zmailbox_listr8   r;  r   r   r   r   get_mailbox_list   sX    










r^  c                 C   s  t  }| s$|jtd || fS d }| r| d tkrt| \}} | sl|jtd || || fS | d dkr|| || fS t| \}} t|j	dkr|d k	r|| |
| |jtd || fS |d k	r|g|d d< || || fS )Nzend of header before group-listr   zend of header in group-listr]  zgroup-list with empty entries)r   r   ri   r   r   r3  r4  r^  r   r{   r6   r>  )r   Z
group_listr;  r8   r   r   r   get_group_listY  s>    







r_  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
krt| \}} || || fS )
Nr   rQ  z8expected ':' at end of group display name but found '{}'zgroup-display-name-terminatorr   r]  zgroup-terminatorzend of header in groupz)expected ';' at end of group but found {})r   rX  r   r  r,   ri   r  r_  r   r   r3  r4  )r   r}   r8   r   r   r   	get_group~  s8    



r`  c                 C   sx   t  }zt| \}} W nN tjk
rd   zt| \}} W n& tjk
r^   td| Y nX Y nX || || fS )Nzexpected address but found '{}')r|   r`  r   r  r[  r,   ri   )r   rs   r8   r   r   r   get_address  s    
ra  c              
   C   s  t  }| rzt| \}} || W n  tjk
rH } zd }| d tkrt| \}} | rj| d dkr|| |jtd nFt	| d\}} |d k	r|g|d d< |t
|g |jtd nh| d dkr|jtd nHt	| d\}} |d k	r|g|d d< |t
|g |jtd W 5 d }~X Y nX | 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   )rr   ra  ri   r   r  r3  r4  r   r>  r\  r|   r   rE   r6   r  )r   Zaddress_listr8   errr;  r   r   r   r   get_address_list  sX    








rc  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   rL  z;expected '[' at the start of no-fold-literal but found '{}'zno-fold-literal-startr   rH  z9expected ']' at the end of no-fold-literal but found '{}'zno-fold-literal-end)r   r   r  r,   ri   r  rG  )r   Zno_fold_literalr8   r   r   r   get_no_fold_literal  s.    
rd  c                 C   s  t  }| r,| d tkr,t| \}} || | r<| d dkrLtd| |tdd | dd  } zt| \}} W n` tjk
r   z"t	| \}} |j
td W n& tjk
r   td| Y nX Y nX || | r| d dkr@|j
td	 | r8| d d
kr8|td
d | dd  } || fS |tdd | dd  } zt| \}} W n tjk
r   zt| \}} W nr tjk
r } zPz"t| \}} |j
td W n( tjk
r   td| Y nX W 5 d }~X Y nX Y nX || | r6| d d
kr6| dd  } n|j
td |td
d | r| d tkrt| \}} || || fS )Nr   rU  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-rightrV  z
msg-id-endrO  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   r3  r4  ri   r   r  r,   r  r8  rB  r   r>  r   rd  rN  )r   Zmsg_idr8   er   r   r   
get_msg_id  s~    






"


rf  c              
   C   s   t  }zt| \}} || W nL tjk
rl } z,t| }t|}|jtd	| W 5 d }~X Y nX | r|jtd	|  |S )NzInvalid msg-id: {!r}zUnexpected {!r})
r   rf  ri   r   r  r(  r   r   r   r,   )r   Z
message_idr8   Zexr   r   r   parse_message_idK  s    
rg  c                 C   s  t  }| s |jtd |S | d tkrXt| \}} || | sX|jtd d}| r| d dkr| d tkr|| d 7 }| dd  } q\| s|jtd	| |t
|d nt||_|t
|d	 | r| d tkrt| \}} || | r| d dkrT|jd k	r:|jtd
 | rP|t
| d |S |t
dd | dd  } | r| d tkrt| \}} || | s|jd k	r|jtd
 |S d}| r| d tkr|| d 7 }| dd  } q| s*|jtd	| |t
|d nt||_|t
|d	 | rn| d tk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   ri   r   HeaderMissingRequiredValuer3  r4  isdigitr   r,   r  intr   r   )r   Zmime_versionr8   rh  r   r   r   parse_mime_versiong  s    













rl  c                 C   sd   t  }| r\| d dkr\| d tkrD|t| d d | dd  } qt| \}} || q|| fS )Nr   r]  rF  r   )r   r=  ri   r  r?  )r   Zinvalid_parameterr8   r   r   r   get_invalid_parameter  s    rm  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   r/  rn  r   r   r   	get_ttext  s    	
rp  c                 C   s   t  }| r,| d tkr,t| \}} || | rL| d tkrLtd| t| \}} || | r| d tkrt| \}} || || fS Nr   zexpected token but found '{}')	r]   r3  r4  ri   
TOKEN_ENDSr   r  r,   rp  )r   Zmtokenr8   r   r   r   	get_token  s    	


rs  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   r/  r   r   r   r   get_attrtext  s    	
rv  c                 C   s   t  }| r,| d tkr,t| \}} || | rL| d tkrLtd| t| \}} || | r| d tkrt| \}} || || fS rq  )	r   r3  r4  ri   ATTRIBUTE_ENDSr   r  r,   rv  r   r   r8   r   r   r   get_attribute  s    	


ry  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  ru  r   r   r   get_extended_attrtext	  s    
r|  c                 C   s   t  }| r,| d tkr,t| \}} || | rL| d tkrLtd| t| \}} || | r| d tkrt| \}} || || fS rq  )	r   r3  r4  ri   EXTENDED_ATTRIBUTE_ENDSr   r  r,   r|  rx  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 0rh  )r   r   r  r,   ri   r  rj  r   ZInvalidHeaderErrorrk  r   )r   r   rh  r   r   r   get_section9	  s,    	

r  c                 C   s   t  }| stdd }| d tkr0t| \}} | sDtd|| d dkr^t| \}} nt| \}} |d k	r|g|d d< || || fS )Nz&Expected value but found end of stringr   z Expected value but found only {}r   )	r   r   r  r3  r4  r,   r5  r~  ri   )r   vr;  r8   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	k
r   Y nX | 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kr,t| \}} || d }|}|jrF| rF| d dkrFt| \}}|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X |	sd}|r0|jtd || |D ](}
|
jdkr g |
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 k	r|} || fS |jtd | s|jtd || |d kr|| fS n|d k	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 k	rdt }| r^| d tkrt| \}} n2| d dkrDt
dd}| dd  } nt| \}} || q|}nt| \}} || |d k	r|} || fS )Nr   r]  z)Parameter contains name ({}) but no valuer  TzIncomplete parameterzextended-parameter-markerr   =zParameter not followed by '='parameter-separatorr   F'z5Quoted string value for extended parameter is invalidrf   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 delimitersrz  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   ry  ri   r   r   r   r,   r  r   r  r  r   r3  r4  r5  rm   r   rv  r|  rE   r  r   ra   rb   r   r  r  r,  )r   r   r8   r;  r  ZappendtoZqstringZinner_valueZ
semi_validr   tr  r   r   r   get_parameterm	  s    























r  c              
   C   sj  t  }| rfzt| \}} || W n tjk
r } zd }| d tkrVt| \}} | sp|| | W Y xS | d dkr|d k	r|| |jtd n@t	| \}} |r|g|d d< || |jtd
| W 5 d }~X Y nX | rD| d dkrD|d }d|_t	| \}} || |jtd
| | r|tdd | d	d  } q|S )
Nr   r]  zparameter entry with no contentzinvalid parameter {!r}r   r   z)parameter with invalid trailing text {!r}r  r   )r   r  ri   r   r  r3  r4  r   r   rm  r,   rE   r6   r  )r   Zmime_parametersr8   rb  r;  r   r   r   r   parse_mime_parameters	  sJ    






r  c                 C   s   |rV|d dkrV|d t kr>| t|d d |dd  }q t|\}}| | q |s^d S | tdd | t|dd   d S )Nr   r]  rF  r   r  )r=  ri   r  r?  r  )Z	tokenlistr   r8   r   r   r   _find_mime_parameters/
  s    r  c              
   C   s  t  }d}| s$|jtd |S zt| \}} W n< tjk
rp   |jtd|  t	||  | Y S X || | r| d dkr|jtd | rt	||  |S |j
  |_|tdd | dd  } zt| \}} W n> tjk
r*   |jtd	|  t	||  | Y S X || |j
  |_| sP|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}r]  z<Only parameters are valid after content type, but found {!r}r  )r   r   ri   r   ri  rs  r  r   r,   r  r   r   lowerr   r  r   r  )r   ZctypeZrecoverr8   r   r   r   parse_content_type_header?
  sd    












r  c              
   C   s   t  }| s |jtd |S zt| \}} W n< tjk
rl   |jtd|  t	||  | Y S X || |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   r]  zCOnly parameters are valid after content disposition, but found {!r}r  r   )r   r   ri   r   ri  rs  r  r   r,   r  r   r   r  r   r  r  )r   Zdisp_headerr8   r   r   r    parse_content_disposition_headerx
  s:    






r  c              
   C   s   t  }| s |jtd |S zt| \}} W n. tjk
r^   |jtd|  Y nX || |j	
  |_| s|S | r|jtd | d tk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   rF  r   )r   r   ri   r   ri  rs  r  r   r,   r   r   r  r`   r=  r  r?  )r   Z
cte_headerr8   r   r   r   &parse_content_transfer_encoding_header
  s4    



r  c                 C   sD   d}| r@| d r@| d d t k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}
|
|kr`|d8 }q>t|
}|s|
jdkrt	
| }nt
| }z|| |}W n6 tk
r   td	d
 |
jD rd}nd}d}Y nX |
jdkrt|
||| q>|r|s|
js~d}d }|
jr~|
j|dd t|j  }|j|kr~t||t|d  krlt|}|| |d  |7  < q>t|
dst|
|	 }	nt|||||
j|}d}q>t||t|d  kr|d  |7  < q>|
jr$t|d |kr$t|}|s|
 r$|||  d }q>t|
ds\t|
}|
jsR|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   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   r9   r   rC  )Zmax_line_lengthsysmaxsizeutf8r   r   r   r   rE   
SPECIALSNL
isdisjointNLSETrC  r   rZ  r/   _fold_mime_parametersr3   rI   r=   r   r   r  ri   rF   _fold_as_ewrJ   r2   insertr'   )Z
parse_treer:   maxlenr   r  last_ewr  Zwant_encodingZend_ew_not_allowedr   r4   tstrra   Zencoded_partnewlineZnewpartsr   r   r   r;   
  s    







 
r;   c                 C   s  |d k	r<|r<t t|d |d  |  } |d d | |d< | d tkr| d }| dd  } t|d |krz|t| |d  |7  < d}| d tkr| d }| d d } |d k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 wordrO   )ra   )
r   r(  r  r   ri   r  r   r  r  rC  )Z	to_encoder  r  r  rJ   ra   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 n0 tk
r|   d}t|rtd}d}nd}Y nX |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rLd}|| d  }}|d | }tjj	|d	|d
}	t|	|krq|d8 }q\|d
||||	 d	}|d7 }||d  }|r|d  d7  < qqd S )Nr   r]  strictFTr  r   r  r    )Zsafer   z
{}*={}''{}r   r   rO   r   r   z''r   N   z {}*{}*={}{})r   r   r   rC  r   r   r   r   r   rp   r,   r   r   ri   r   )r4   r  r  r   r   r   ra   Zerror_handlerZencoding_requiredZencoded_valuer  r   Zextra_chromer  Z
splitpointZmaxcharspartialr   r   r   r  x  sn    


        r  )rer  r   stringr   operatorr   Zemailr   r  r   r   r   r  r3  r:  r6  r   r=  Z	TSPECIALSrr  Z	ASPECIALSrw  r}  r  r  r   compileVERBOSE	MULTILINEr$  r   r   rM   rS   rV   rX   rY   r[   r]   r^   rc   rn   ro   rr   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   rR  rS  r,   r'   r   r  r  matchr.  findallr	  ro  rt  r{  r  r  r  r"  r(  r+  r,  r0  r1  r2  r4  r5  r7  r8  r9  r<  r?  rE  rB  rG  rK  rM  rN  rP  rT  rW  rX  rY  r[  r\  r^  r_  r`  ra  rc  rd  rf  rg  rl  rm  rp  rs  rv  ry  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