<!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>
3
2a                @   sf  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 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 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 d.d/ d/eZ)G d0d1 d1eZ*G d2d3 d3eZ+G d4d5 d5eZ,G d6d7 d7eZ-G d8d9 d9eZ.G d:d; d;eZ/G d<d= d=eZ0G d>d? d?eZ1G d@dA dAeZ2G dBdC dCeZ3G dDdE dEeZ4G dFdG dGeZ5G dHdI dIeZ6G dJdK dKeZ7G dLdM dMeZ8G dNdO dOeZ9G dPdQ dQeZ:G dRdS dSe:Z;G dTdU dUeZ<G dVdW dWeZ=G dXdY dYeZ>G dZd[ d[eZ?G d\d] d]eZ@G d^d_ d_e@ZAG d`da dae@ZBG dbdc dceZCG ddde deeZDG dfdg dgeZEG dhdi dieFZGG djdk dkeGZHG dldm dmeGZIG dndo doeHZJeIddpZKeIdqdrZLeIdsdtZMe jNdujOdvjPejQZRe jNdwjOdvjPejSdxdyjSdzd{jTZUe jNd|jVZWe jNdwjOdvjPejSdxdyjSdzd{jTZXe jNdwjOdvjPejSdxdyjSdzd{jTZYe jNdwjOdvjPejSdxdyjSdzd{jTZZd}d~ Z[dd Z\dd Z]dd Z^dd Z_dd Z`dd Zadd Zbdd Zcdd 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 ZdS )    N)	hexdigits)OrderedDict)
itemgetter)_encoded_words)errors)utilsz 	(z()<>@,:;.\"[].z."(z/?=z*'%%c             C   s    dt | jddjdd d S )N"\z\\z\")strreplace)value r   9/opt/alt/python36/lib64/python3.6/_header_value_parser.pyquote_string`   s    r   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   m   s    zTokenList.__init__c             C   s   dj dd | D S )N c             s   s   | ]}t |V  qd S )N)r   ).0xr   r   r   	<genexpr>r   s    z$TokenList.__str__.<locals>.<genexpr>)join)r   r   r   r   __str__q   s    zTokenList.__str__c                s   dj | jjt j S )Nz{}({}))formatr   __name__r   __repr__)r   )r   r   r   r#   t   s    
zTokenList.__repr__c             C   s   dj dd | D S )Nr   c             s   s   | ]}|j r|j V  qd S )N)r   )r   r   r   r   r   r   z   s    z"TokenList.value.<locals>.<genexpr>)r   )r   r   r   r   r   x   s    zTokenList.valuec             C   s   t dd | D | jS )Nc             s   s   | ]}|j V  qd S )N)all_defects)r   r   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 j  S )Nr   )startswith_fws)r   r   r   r   r&      s    zTokenList.startswith_fwsc             C   s   t dd | D S )Nc             s   s   | ]}|j V  qd S )N)as_ew_allowed)r   partr   r   r   r      s    z*TokenList.as_ew_allowed.<locals>.<genexpr>)all)r   r   r   r   r'      s    zTokenList.as_ew_allowedc             C   s"   g }x| D ]}|j |j q
W |S )N)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   r0   r   r   r   pprint   s    zTokenList.pprintc             C   s   dj | j|dS )N
)r0   )r   _pp)r   r0   r   r   r   r2      s    zTokenList.ppstrc             c   s~   dj || jj| jV  x<| D ]4}t|ds<|dj | V  q|j|d E d H  qW | jrhdj | j}nd}dj ||V  d S )Nz{}{}/{}(r5   z*    !! invalid element in token list: {!r}z    z Defects: {}r   z{}){})r!   r   r"   
token_typehasattrr5   r   )r   r0   r,   Zextrar   r   r   r5      s    


zTokenList._pp)r   )r   )r   )r"   
__module____qualname__r6   syntactic_breakew_combine_allowedr   r    r#   propertyr   r$   r&   r'   r+   r/   r3   r2   r5   __classcell__r   r   )r   r   r   g   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)r6   content)r   r   r   r   r   
<listcomp>   s    z0WhiteSpaceTokenList.comments.<locals>.<listcomp>r   )r   r   r   r   r+      s    zWhiteSpaceTokenList.commentsN)r"   r8   r9   r<   r   r+   r   r   r   r   r>      s   r>   c               @   s   e Zd ZdZdS )UnstructuredTokenListunstructuredN)r"   r8   r9   r6   r   r   r   r   rC      s   rC   c               @   s   e Zd ZdZdS )PhrasephraseN)r"   r8   r9   r6   r   r   r   r   rE      s   rE   c               @   s   e Zd ZdZdS )WordZwordN)r"   r8   r9   r6   r   r   r   r   rG      s   rG   c               @   s   e Zd ZdZdS )CFWSListcfwsN)r"   r8   r9   r6   r   r   r   r   rH      s   rH   c               @   s   e Zd ZdZdS )AtomatomN)r"   r8   r9   r6   r   r   r   r   rJ      s   rJ   c               @   s   e Zd ZdZdZdS )Tokenr,   FN)r"   r8   r9   r6   Zencode_as_ewr   r   r   r   rL      s   rL   c               @   s   e Zd ZdZdZdZdZdS )EncodedWordzencoded-wordN)r"   r8   r9   r6   ctecharsetlangr   r   r   r   rM      s   rM   c               @   s4   e Zd ZdZedd Zedd Zedd ZdS )	QuotedStringzquoted-stringc             C   s"   x| D ]}|j dkr|jS qW d S )Nzbare-quoted-string)r6   r   )r   r   r   r   r   rA      s    

zQuotedString.contentc             C   sB   g }x2| D ]*}|j dkr(|jt| q
|j|j q
W dj|S )Nzbare-quoted-stringr   )r6   appendr   r   r   )r   resr   r   r   r   quoted_value   s    

zQuotedString.quoted_valuec             C   s"   x| D ]}|j dkr|jS qW d S )Nzbare-quoted-string)r6   r   )r   r,   r   r   r   stripped_value   s    

zQuotedString.stripped_valueN)r"   r8   r9   r6   r<   rA   rT   rU   r   r   r   r   rQ      s   
rQ   c               @   s$   e Zd ZdZdd Zedd ZdS )BareQuotedStringzbare-quoted-stringc             C   s   t djdd | D S )Nr   c             s   s   | ]}t |V  qd S )N)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j dd | D S )Nr   c             s   s   | ]}t |V  qd S )N)r   )r   r   r   r   r   r      s    z)BareQuotedString.value.<locals>.<genexpr>)r   )r   r   r   r   r      s    zBareQuotedString.valueN)r"   r8   r9   r6   r    r<   r   r   r   r   r   rV      s   rV   c               @   s8   e Zd ZdZdd Zdd Zedd Zedd	 Zd
S )Commentr@   c                s(   dj tdg fdd D dggg S )Nr   r   c                s   g | ]} j |qS r   )quote)r   r   )r   r   r   rB   	  s    z#Comment.__str__.<locals>.<listcomp>))r   r%   )r   r   )r   r   r      s
    zComment.__str__c             C   s2   |j dkrt|S t|jddjddjddS )Nr@   r   z\\r   z\(rY   z\))r6   r   r   )r   r   r   r   r   rX     s
    
zComment.quotec             C   s   dj dd | D S )Nr   c             s   s   | ]}t |V  qd S )N)r   )r   r   r   r   r   r     s    z"Comment.content.<locals>.<genexpr>)r   )r   r   r   r   rA     s    zComment.contentc             C   s   | j gS )N)rA   )r   r   r   r   r+     s    zComment.commentsN)	r"   r8   r9   r6   r    rX   r<   rA   r+   r   r   r   r   rW     s
   rW   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)r6   )r   r   r   r   r   rB   "  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 )r[   N)r6   	mailboxes)r   r   r   r   r   r   &  s   z(AddressList.mailboxes.<locals>.<genexpr>)r%   )r   r   r   r   r]   $  s    zAddressList.mailboxesc             C   s   t dd | D g S )Nc             s   s   | ]}|j d kr|jV  qdS )r[   N)r6   all_mailboxes)r   r   r   r   r   r   +  s   z,AddressList.all_mailboxes.<locals>.<genexpr>)r%   )r   r   r   r   r^   )  s    zAddressList.all_mailboxesN)r"   r8   r9   r6   r<   r\   r]   r^   r   r   r   r   rZ     s   rZ   c               @   s4   e Zd ZdZedd Zedd Zedd ZdS )	Addressr[   c             C   s   | d j dkr| d jS d S )Nr   group)r6   display_name)r   r   r   r   ra   3  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   mailboxzinvalid-mailbox)r6   r]   )r   r   r   r   r]   8  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 )Nr   rb   zinvalid-mailbox)r6   r^   )r   r   r   r   r^   @  s
    

zAddress.all_mailboxesN)r"   r8   r9   r6   r<   ra   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 )MailboxListzmailbox-listc             C   s   dd | D S )Nc             S   s   g | ]}|j d kr|qS )rb   )r6   )r   r   r   r   r   rB   N  s    z)MailboxList.mailboxes.<locals>.<listcomp>r   )r   r   r   r   r]   L  s    zMailboxList.mailboxesc             C   s   dd | D S )Nc             S   s   g | ]}|j dkr|qS )rb   invalid-mailbox)rb   rd   )r6   )r   r   r   r   r   rB   R  s    z-MailboxList.all_mailboxes.<locals>.<listcomp>r   )r   r   r   r   r^   P  s    zMailboxList.all_mailboxesN)r"   r8   r9   r6   r<   r]   r^   r   r   r   r   rc   H  s   rc   c               @   s(   e Zd ZdZedd Zedd ZdS )	GroupListz
group-listc             C   s"   |  s| d j dkrg S | d jS )Nr   zmailbox-list)r6   r]   )r   r   r   r   r]   Z  s    zGroupList.mailboxesc             C   s"   |  s| d j dkrg S | d jS )Nr   zmailbox-list)r6   r^   )r   r   r   r   r^   `  s    zGroupList.all_mailboxesN)r"   r8   r9   r6   r<   r]   r^   r   r   r   r   re   V  s   re   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   z
group-list)r6   r]   )r   r   r   r   r]   k  s    zGroup.mailboxesc             C   s   | d j dkrg S | d jS )Nrg   z
group-list)r6   r^   )r   r   r   r   r^   q  s    zGroup.all_mailboxesc             C   s
   | d j S )Nr   )ra   )r   r   r   r   ra   w  s    zGroup.display_nameN)r"   r8   r9   r6   r<   r]   r^   ra   r   r   r   r   rf   g  s   rf   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 )NameAddrz	name-addrc             C   s   t | dkrd S | d jS )N   r   )lenra   )r   r   r   r   ra     s    zNameAddr.display_namec             C   s
   | d j S )Nri   )
local_part)r   r   r   r   rl     s    zNameAddr.local_partc             C   s
   | d j S )Nri   rk   )domain)r   r   r   r   rm     s    zNameAddr.domainc             C   s
   | d j S )Nri   rk   )route)r   r   r   r   rn     s    zNameAddr.routec             C   s
   | d j S )Nri   rk   )	addr_spec)r   r   r   r   ro     s    zNameAddr.addr_specN)
r"   r8   r9   r6   r<   ra   rl   rm   rn   ro   r   r   r   r   rh   |  s   rh   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"   x| D ]}|j dkr|jS qW d S )Nz	addr-spec)r6   rl   )r   r   r   r   r   rl     s    

zAngleAddr.local_partc             C   s"   x| D ]}|j dkr|jS qW d S )Nz	addr-spec)r6   rm   )r   r   r   r   r   rm     s    

zAngleAddr.domainc             C   s"   x| D ]}|j dkr|jS qW d S )Nz	obs-route)r6   domains)r   r   r   r   r   rn     s    

zAngleAddr.routec             C   s<   x6| D ]*}|j dkr|jr |jS t|j|j S qW dS d S )Nz	addr-specz<>)r6   rl   ro   r   )r   r   r   r   r   ro     s    

zAngleAddr.addr_specN)	r"   r8   r9   r6   r<   rl   rm   rn   ro   r   r   r   r   rp     s
   rp   c               @   s   e Zd ZdZedd ZdS )ObsRoutez	obs-routec             C   s   dd | D S )Nc             S   s   g | ]}|j d kr|jqS )rm   )r6   rm   )r   r   r   r   r   rB     s    z$ObsRoute.domains.<locals>.<listcomp>r   )r   r   r   r   rq     s    zObsRoute.domainsN)r"   r8   r9   r6   r<   rq   r   r   r   r   rr     s   rr   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 )Mailboxrb   c             C   s   | d j dkr| d jS d S )Nr   z	name-addr)r6   ra   )r   r   r   r   ra     s    zMailbox.display_namec             C   s
   | d j S )Nr   )rl   )r   r   r   r   rl     s    zMailbox.local_partc             C   s
   | d j S )Nr   )rm   )r   r   r   r   rm     s    zMailbox.domainc             C   s   | d j dkr| d jS d S )Nr   z	name-addr)r6   rn   )r   r   r   r   rn     s    zMailbox.routec             C   s
   | d j S )Nr   )ro   )r   r   r   r   ro     s    zMailbox.addr_specN)
r"   r8   r9   r6   r<   ra   rl   rm   rn   ro   r   r   r   r   rs     s   rs   c               @   s,   e Zd ZdZedd Ze Z Z ZZ	dS )InvalidMailboxzinvalid-mailboxc             C   s   d S )Nr   )r   r   r   r   ra     s    zInvalidMailbox.display_nameN)
r"   r8   r9   r6   r<   ra   rl   rm   rn   ro   r   r   r   r   rt     s   rt   c                   s(   e Zd ZdZdZe fddZ  ZS )Domainrm   Fc                s   dj t jj S )Nr   )r   r   r   split)r   )r   r   r   rm     s    zDomain.domain)r"   r8   r9   r6   r'   r<   rm   r=   r   r   )r   r   ru     s   ru   c               @   s   e Zd ZdZdS )DotAtomzdot-atomN)r"   r8   r9   r6   r   r   r   r   rw     s   rw   c               @   s   e Zd ZdZdZdS )DotAtomTextzdot-atom-textTN)r"   r8   r9   r6   r'   r   r   r   r   rx     s   rx   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 )AddrSpecz	addr-specFc             C   s
   | d j S )Nr   )rl   )r   r   r   r   rl     s    zAddrSpec.local_partc             C   s   t | dk rd S | d jS )N   ri   rk   )rj   rm   )r   r   r   r   rm     s    zAddrSpec.domainc             C   s<   t | dk r| d jS | d jj | d j | d jj  S )Nrz   r   ri   rg   )rj   r   rstriplstrip)r   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@)setrl   rj   DOT_ATOM_ENDSr   rm   )r   ZnamesetZlpr   r   r   ro     s    

zAddrSpec.addr_specN)
r"   r8   r9   r6   r'   r<   rl   rm   r   ro   r   r   r   r   ry     s   ry   c               @   s   e Zd ZdZdZdS )ObsLocalPartzobs-local-partFN)r"   r8   r9   r6   r'   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 | }|d jdkr"|jd n*|d d jdkrLt |d dd  |d< |d jdkrd|j  n*|d d jdkrt |d d d |d	< |jS )
Nr   rI   ri   rk   rk   rk   rk   rk   rk   )r   r6   popr   )r   rS   r   r   r   ra   )  s    
zDisplayName.display_namec                s   d}| j rd}nx| D ]}|jdkrd}qW |rd }}| d jdksX| d d jdkr\d}| d	 jdks|| d
 d jdkrd}|t| j | S t jS d S )NFTzquoted-stringr   r   rI   r?   ri   rk   rk   rk   )r   r6   r   ra   r   r   )r   rX   r   ZpreZpost)r   r   r   r   8  s    

  zDisplayName.value)	r"   r8   r9   r6   r;   r<   ra   r   r=   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   zquoted-string)r6   rT   r   )r   r   r   r   r   Q  s    
zLocalPart.valuec             C   s   t g}t }d}x| 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|jt|dd   n
|j| |d	 }|}qW t|dd
 }|jS )NFr   rI   dotri   rk   rk   rk   rk   rk   )DOTr6   r   
isinstancerR   r   )r   rS   ZlastZ
last_is_tltokZis_tlr   r   r   rl   X  s$    


zLocalPart.local_partN)r"   r8   r9   r6   r'   r<   r   rl   r   r   r   r   r   L  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j t jj S )Nr   )r   r   r   rv   )r   )r   r   r   rm   u  s    zDomainLiteral.domainc             C   s"   x| D ]}|j dkr|jS qW d S )Nptext)r6   r   )r   r   r   r   r   ipy  s    

zDomainLiteral.ip)	r"   r8   r9   r6   r'   r<   rm   r   r=   r   r   )r   r   r   p  s   r   c               @   s   e Zd ZdZdZdZdS )MIMEVersionzmime-versionN)r"   r8   r9   r6   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	parameterFzus-asciic             C   s   | j r| d jS dS )Nri   r   )	sectionednumber)r   r   r   r   section_number  s    zParameter.section_numberc             C   sb   x\| D ]T}|j dkr|jS |j dkrx4|D ],}|j dkr*x|D ]}|j dkr>|jS q>W q*W qW dS )Nr   zquoted-stringzbare-quoted-stringr   )r6   rU   )r   r,   r   r   r   param_value  s    






zParameter.param_valueN)
r"   r8   r9   r6   r   extendedrO   r<   r   r   r   r   r   r   r     s   r   c               @   s   e Zd ZdZdS )InvalidParameterzinvalid-parameterN)r"   r8   r9   r6   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$   x| D ]}|j jdr|jS qW d S )Nattrtext)r6   endswithr   )r   r,   r   r   r   rU     s    
zAttribute.stripped_valueN)r"   r8   r9   r6   r<   rU   r   r   r   r   r     s   r   c               @   s   e Zd ZdZdZdS )SectionsectionN)r"   r8   r9   r6   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 jdr,|jS | jS )Nr   rI   ri   quoted-stringr   extended-attribute)r   r   r   )r6   r   rU   r   )r   r,   r   r   r   rU     s    
zValue.stripped_valueN)r"   r8   r9   r6   r<   rU   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 )MimeParameterszmime-parametersFc             c   s  t  }x\| D ]T}|jjdsq|d jdkr.q|d jj }||krLg ||< || j|j|f qW x|j D ]\}}t|t	dd}|d d }|j
}|j rt|dkr|d d dkr|d d jjtjd |d d }g }d}x|D ]\}	}
|	|kr6|
js$|
jjtjd qn|
jjtjd |d7 }|
j}|
jrytjj|}W n& tk
r   tjj|d	d
}Y nRX y|j|d}W n" tk
r   |jdd}Y nX tj|r|
jjtj  |j| qW dj|}||fV  qpW d S )Nr   r   r   )keyri   z.duplicate parameter name; duplicate(s) ignoredz+duplicate parameter name; duplicate ignoredz(inconsistent RFC2231 parameter numberingzlatin-1)encodingsurrogateescapezus-asciir   )r   r6   r   r   striprR   r   itemssortedr   rO   r   rj   r   r   InvalidHeaderDefectr   urllibparseZunquote_to_bytesUnicodeEncodeErrorZunquotedecodeLookupErrorr   _has_surrogatesUndecodableBytesDefectr   )r   paramsr,   namepartsZfirst_paramrO   Zvalue_partsir   paramr   r   r   r   r     sZ    




zMimeParameters.paramsc             C   sX   g }x8| j D ].\}}|r0|jdj|t| q|j| qW dj|}|rTd| S dS )Nz{}={}z; r?   r   )r   rR   r!   r   r   )r   r   r   r   r   r   r   r      s    
zMimeParameters.__str__N)r"   r8   r9   r6   r:   r<   r   r    r   r   r   r   r     s   Fr   c               @   s   e Zd ZdZedd ZdS )ParameterizedHeaderValueFc             C   s&   x t | D ]}|jdkr
|jS q
W i S )Nzmime-parameters)reversedr6   r   )r   r,   r   r   r   r   #  s    

zParameterizedHeaderValue.paramsN)r"   r8   r9   r:   r<   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"   r8   r9   r6   r'   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)r"   r8   r9   r6   r'   content_dispositionr   r   r   r   r   3  s   r   c               @   s   e Zd ZdZdZdZdS )ContentTransferEncodingzcontent-transfer-encodingFZ7bitN)r"   r8   r9   r6   r'   rN   r   r   r   r   r   :  s   r   c               @   s   e Zd ZdZdZdS )HeaderLabelzheader-labelFN)r"   r8   r9   r6   r'   r   r   r   r   r   A  s   r   c               @   s   e Zd ZdZdS )HeaderheaderN)r"   r8   r9   r6   r   r   r   r   r   G  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  j| |}||_g |_|S )N)r   __new__r6   r   )clsr   r6   r   )r   r   r   r   V  s    zTerminal.__new__c                s   dj | jjt j S )Nz{}({}))r!   r   r"   r   r#   )r   )r   r   r   r#   \  s    zTerminal.__repr__c             C   s   t | jjd | j  d S )N/)r1   r   r"   r6   )r   r   r   r   r3   _  s    zTerminal.pprintc             C   s
   t | jS )N)listr   )r   r   r   r   r$   b  s    zTerminal.all_defectsr   c                s2   dj || jj| jt j | js"dn
dj | jgS )Nz{}{}/{}({}){}r   z {})r!   r   r"   r6   r   r#   r   )r   r0   )r   r   r   r5   f  s    zTerminal._ppc             C   s   d S )Nr   )r   r   r   r   pop_trailing_wso  s    zTerminal.pop_trailing_wsc             C   s   g S )Nr   )r   r   r   r   r+   s  s    zTerminal.commentsc             C   s   t | | jfS )N)r   r6   )r   r   r   r   __getnewargs__w  s    zTerminal.__getnewargs__)r   )r"   r8   r9   r'   r;   r:   r   r#   r3   r<   r$   r5   r   r+   r   r=   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 )Nr?   r   )r   r   r   r   r   }  s    zWhiteSpaceTerminal.valuec             C   s   dS )NTr   )r   r   r   r   r&     s    z!WhiteSpaceTerminal.startswith_fwsN)r"   r8   r9   r<   r   r&   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 )Nr   )r   r   r   r   r     s    zValueTerminal.valuec             C   s   dS )NFr   )r   r   r   r   r&     s    zValueTerminal.startswith_fwsN)r"   r8   r9   r<   r   r&   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 )Nr   r   )r   r   r   r   r     s    zEWWhiteSpaceTerminal.valuec             C   s   dS )Nr   r   )r   r   r   r   r      s    zEWWhiteSpaceTerminal.__str__N)r"   r8   r9   r<   r   r    r   r   r   r   r     s   r   r   ,zlist-separatorr}   zroute-component-markerz([{}]+)r   z[^{}]+r   z\\]z\]z[\x00-\x20\x7F]c             C   s>   t | }|r| jjtj| tj| r:| jjtjd d S )Nz*Non-ASCII characters found in header token)_non_printable_finderr   rR   r   ZNonPrintableDefectr   r   r   )xtextZnon_printablesr   r   r   _validate_xtext  s    

r   c             C   s   t | d^}}g }d}d}xbtt|D ]J}|| dkrL|rFd}d}nd}q(|rVd}n|| |krdP |j||  q(W |d }dj|dj||d  g| |fS )Nri   Fr   Tr   )_wsp_splitterrangerj   rR   r   )r   endcharsZfragment	remainderZvcharsescapehad_qpposr   r   r   _get_ptext_to_endchars  s$    	r   c             C   s.   | j  }t| d t| t|  d}||fS )Nfws)r|   r   rj   )r   Znewvaluer   r   r   r   get_fws  s    r   c             C   s  t  }| jds tjdj| | dd  jdd^}}|| dd  krXtjdj| dj|}t|dkr|d tkr|d tkr|jdd^}}|d | }t|j dkr|j	j
tjd | |_dj|} ytjd| d \}}}}	W n( tk
r   tjd	j|jY nX ||_||_|j	j|	 xh|r|d tkrdt|\}
}|j
|
 q6t|d^}}t|d
}t| |j
| dj|}q6W || fS )Nz=?z"expected encoded word but found {}rg   z?=ri   r   r   zwhitespace inside encoded wordz!encoded word format invalid: '{}'vtext)rM   
startswithr   HeaderParseErrorr!   rv   r   rj   r   r   rR   r   rN   _ewr   
ValueErrorrO   rP   r*   WSPr   r   r   r   )r   Zewr   r   Zremstrrestr   rO   rP   r   r,   charsr   r   r   r   get_encoded_word  sH    

$




r   c             C   s  t  }x| r| d tkr4t| \}} |j| q
| jdryt| \}} W n tjk
rd   Y nrX d}t|dkr|d j	dkr|j
jtjd d}|rt|dkr|d j	d	krt|d d|d< |j| q
t| d^}}t|d
}t| |j| dj|} q
W |S )Nr   z=?Tri   r   z&missing whitespace before encoded wordFrg   zencoded-wordr   r   rk   rk   rk   )rC   r   r   rR   r   r   r   r   rj   r6   r   r   r   r   r   r   r   )r   rD   r,   Zhave_wsr   r   r   r   r   r   get_unstructured  s:    






r   c             C   s*   t | d\}} }t|d}t| || fS )Nz()r   )r   r   r   )r   r   _r   r   r   get_qp_ctextW  s    
r   c             C   s*   t | d\}} }t|d}t| || fS )Nr   r   )r   r   r   )r   r   r   r   r   r   get_qcontenth  s    

r   c             C   sN   t | }|stjdj| |j }| t|d  } t|d}t| || fS )Nzexpected atext but found '{}'atext)_non_atom_end_matcherr   r   r!   r`   rj   r   r   )r   mr   r   r   r   	get_atextw  s    
r   c             C   s  | d dkrt jdj| t }| dd  } | d dkrPt| \}} |j| x| r| d dkr| d tkr|t| \}} nd| d d dkry"t| \}} |j	jt j
d W q t jk
r   t| \}} Y qX nt| \}} |j| qRW | s|j	jt j
d || fS || dd  fS )	Nr   r   zexpected '"' but found '{}'ri   rg   z=?z!encoded word inside quoted stringz"end of header inside quoted string)r   r   r!   rV   r   rR   r   r   r   r   r   )r   Zbare_quoted_stringr,   r   r   r   get_bare_quoted_string  s2    


r   c             C   s   | r | d dkr t jdj| t }| dd  } x^| r| d dkr| d tkr^t| \}} n&| d dkrxt| \}} nt| \}} |j| q4W | s|j	jt j
d || fS || dd  fS )Nr   r   zexpected '(' but found '{}'ri   rY   zend of header inside comment)r   r   r!   rW   r   r   get_commentr   rR   r   r   )r   r@   r,   r   r   r   r     s"    
r   c             C   sT   t  }xD| rJ| d tkrJ| d tkr2t| \}} nt| \}} |j| qW || fS )Nr   )rH   CFWS_LEADERr   r   r   rR   )r   rI   r,   r   r   r   get_cfws  s    r   c             C   sp   t  }| r,| d tkr,t| \}} |j| t| \}} |j| | rh| d tkrht| \}} |j| || fS )Nr   )rQ   r   r   rR   r   )r   Zquoted_stringr,   r   r   r   get_quoted_string  s    


r   c             C   s   t  }| r,| d tkr,t| \}} |j| | rL| d tkrLtjdj| | jdryt	| \}} W q tjk
r   t
| \}} Y qX nt
| \}} |j| | r| d tkrt| \}} |j| || fS )Nr   zexpected atom but found '{}'z=?)rJ   r   r   rR   	ATOM_ENDSr   r   r!   r   r   r   )r   rK   r,   r   r   r   get_atom  s$    



r   c             C   s   t  }|  s| d tkr(tjdj| xP| rx| d tkrxt| \}} |j| | r*| d dkr*|jt | dd  } q*W |d tkrtjdjd|  || fS )Nr   z8expected atom at a start of dot-atom-text but found '{}'r	   ri   z4expected atom at end of dot-atom-text but found '{}'rk   )rx   r   r   r   r!   r   rR   r   )r   Zdot_atom_textr,   r   r   r   get_dot_atom_text  s    

r   c             C   s   t  }| d tkr(t| \}} |j| | jdrhyt| \}} W qt tjk
rd   t| \}} Y qtX nt| \}} |j| | r| d tkrt| \}} |j| || fS )Nr   z=?)	rw   r   r   rR   r   r   r   r   r   )r   Zdot_atomr,   r   r   r   get_dot_atom  s    



r   c             C   s   | d t krt| \}} nd }| d dkr8t| \}} n*| d tkrVtjdj| nt| \}} |d k	rx|g|d d< || fS )Nr   r   z1Expected 'atom' or 'quoted-string' but found '{}')r   r   r   SPECIALSr   r   r!   r   )r   leaderr,   r   r   r   get_word(  s    
r   c             C   s   t  }yt| \}} |j| W n( tjk
rH   |jjtjd Y nX x| r| d tkr| d dkr|jt |jjtj	d | dd  } qLyt| \}} W nD tjk
r   | d t
krt| \}} |jjtj	d n Y nX |j| qLW || fS )Nzphrase does not start with wordr   r	   zperiod in 'phrase'ri   zcomment found without atom)rE   r   rR   r   r   r   r   PHRASE_ENDSr   ObsoleteHeaderDefectr   r   )r   rF   r,   r   r   r   
get_phraseG  s.    




r   c             C   st  t  }d }| d tkr"t| \}} | s6tjdj| yt| \}} W n^ tjk
r   y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< |j
| | o| d dks| d tkr2tt||  \}} |jdkr|jj
tjd n|jj
tjd ||d< y|jjd W n( tk
rj   |jj
tjd Y nX || fS )	Nr   z"expected local-part but found '{}'r   zinvalid-obs-local-partz<local-part is not dot-atom, quoted-string, or obs-local-partz,local-part is not a dot-atom (contains CFWS)asciiz)local-part contains non-ASCII characters))r   r   r   r   r   r!   r   r   r   r   rR   get_obs_local_partr   r6   r   r   r   r   encoder   ZNonASCIILocalPartDefect)r   rl   r   r,   obs_local_partr   r   r   get_local_partm  sB    




r   c             C   s  t  }d}x| o(| d dks,| d tkr*| d dkrl|rN|jjtjd |jt d}| dd  } qnD| d dkr|jt| d d | dd  } |jjtjd	 d}q|r|d jd
kr|jjtjd yt	| \}} d}W n4 tj
k
r   | d tkr t| \}} Y nX |j| qW |d jd
ks\|d jdkrn|d jd
krn|jjtjd |d jd
ks|d jdkr|d jd
kr|jjtjd |jrd|_|| fS )NFr   r   r	   zinvalid repeated '.'Tri   zmisplaced-specialz/'\' character outside of quoted-string/ccontentr   zmissing '.' between wordsrI   z!Invalid leading '.' in local partrg   z"Invalid trailing '.' in local partzinvalid-obs-local-partrk   rk   rk   r   )r   r   r   rR   r   r   r   r   r6   r   r   r   r   )r   r   Zlast_non_ws_was_dotr,   r   r   r   r     sV    "





r   c             C   s@   t | d\}} }t|d}|r0|jjtjd t| || fS )Nz[]r   z(quoted printable found in domain-literal)r   r   r   rR   r   r   r   )r   r   r   r   r   r   	get_dtext  s    

r   c             C   s,   | rdS |j tjd |j tdd dS )NFz"end of input inside domain-literalr   zdomain-literal-endT)rR   r   r   r   )r   domain_literalr   r   r   _check_for_early_dl_end  s    r   c             C   sl  t  }| d tkr(t| \}} |j| | s6tjd| d dkrRtjdj| | dd  } t| |rp|| fS |jtdd | d t	krt
| \}} |j| t| \}} |j| t| |r|| fS | d t	krt
| \}} |j| t| |r || fS | d dkrtjdj| |jtdd	 | dd  } | rd| d tkrdt| \}} |j| || fS )
Nr   zexpected domain-literal[z6expected '[' at start of domain-literal but found '{}'ri   zdomain-literal-startr   z4expected ']' at end of domain-literal but found '{}'zdomain-literal-end)r   r   r   rR   r   r   r!   r   r   r   r   r   )r   r   r,   r   r   r   get_domain_literal  sD    







r  c             C   st  t  }d }| d tkr"t| \}} | s6tjdj| | d dkrvt| \}} |d k	rd|g|d d< |j| || fS yt| \}} W n" tjk
r   t	| \}} Y nX | r| d dkrtjd|d k	r|g|d d< |j| | o| d dkrl|j
jtjd |d jdkr(|d |d d < xB| rj| d dkrj|jt t	| d	d  \}} |j| q*W || fS )
Nr   zexpected domain but found '{}'r  r}   zInvalid Domainr	   z(domain is not a dot-atom (contains CFWS)zdot-atomri   )ru   r   r   r   r   r!   r  rR   r   r   r   r   r6   r   )r   rm   r   r,   r   r   r   
get_domain  s@    




r  c             C   s~   t  }t| \}} |j| |  s.| d dkrH|jjtjd || fS |jtdd t| dd  \}} |j| || fS )Nr   r}   z"add-spec local part with no domainzaddress-at-symbolri   )ry   r   rR   r   r   r   r   r  )r   ro   r,   r   r   r   get_addr_spec,  s    


r  c             C   s  t  }xf| rl| d dks$| d tkrl| d tkrHt| \}} |j| q| d dkr|jt | dd  } qW |  s| d dkrtjdj| |jt t	| dd  \}} |j| x| o| d dkrB|jt | dd  } | sP | d tkrt| \}} |j| | d dkr|jt t	| dd  \}} |j| qW | sTtjd| d dkrrtjdj| |jt
dd	 || dd  fS )
Nr   r   ri   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)rr   r   r   rR   ListSeparatorr   r   r!   RouteComponentMarkerr  r   )r   Z	obs_router,   r   r   r   get_obs_route<  sB    






r  c             C   s  t  }| d tkr(t| \}} |j| |  s:| d dkrJtjdj| |jtdd | dd  } | d dkr|jtdd |jjtj	d | dd  } || fS yt
| \}} W nz tjk
r2   y"t| \}} |jjtjd	 W n( tjk
r   tjd
j| Y nX |j| t
| \}} Y nX |j| | r`| d dkr`| dd  } n|jjtj	d |jtdd | r| d tkrt| \}} |j| || fS )Nr   <z"expected angle-addr but found '{}'zangle-addr-startri   >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)rp   r   r   rR   r   r   r!   r   r   r   r  r  r   )r   Z
angle_addrr,   r   r   r   get_angle_addre  sJ    






r  c             C   s<   t  }t| \}} |j|d d   |jd d  |_|| fS )N)r   r   r*   r   )r   ra   r,   r   r   r   get_display_name  s
    r  c             C   s   t  }d }| d tkr6t| \}} | s6tjdj|| d dkr| d tkr^tjdj| t| \}} | s~tjdj||d k	r|g|d d d< d }|j| t	| \}} |d k	r|g|d d< |j| || fS )Nr   z!expected name-addr but found '{}'r	  )
rh   r   r   r   r   r!   r   r  rR   r  )r   Z	name_addrr   r,   r   r   r   get_name_addr  s0    

r  c             C   s   t  }yt| \}} W nN tjk
rd   yt| \}} W n& tjk
r^   tjdj| Y nX Y nX tdd |jD rd|_|j	| || fS )Nzexpected mailbox but found '{}'c             s   s   | ]}t |tjV  qd S )N)r   r   r   )r   r   r   r   r   r     s   zget_mailbox.<locals>.<genexpr>zinvalid-mailbox)
rs   r  r   r   r  r!   anyr$   r6   rR   )r   rb   r,   r   r   r   get_mailbox  s    
r  c             C   sh   t  }xX| r^| d |kr^| d tkrF|jt| d d | dd  } qt| \}} |j| qW || fS )Nr   zmisplaced-specialri   )rt   r   rR   r   r   )r   r   Zinvalid_mailboxr,   r   r   r   get_invalid_mailbox  s    r  c             C   s  t  }x| o| d dkryt| \}} |j| W n tjk
r@   d }| d tkrt| \}} |  sz| d dkr|j| |jjtjd n@t	| d\}} |d k	r|g|d d< |j| |jjtj
d nb| d dkr|jjtjd nBt	| d\}} |d k	r |g|d d< |j| |jjtj
d Y nX | r| d dkr|d	 }d|_t	| d\}} |j| |jjtj
d | r
| d dkr
|jt | dd  } q
W || fS )
Nr   ;z,;zempty element in mailbox-listzinvalid mailbox in mailbox-listr   ri   zinvalid-mailboxrk   )rc   r  rR   r   r   r   r   r   r   r  r   r6   r*   r  )r   Zmailbox_listr,   r   rb   r   r   r   get_mailbox_list  sN    













r  c             C   s  t  }| s$|jjtjd || fS d }| r| d tkrt| \}} | sl|jjtjd |j| || fS | d dkr|j| || fS t| \}} t|j	dkr|d k	r|j| |j
| |jjtjd || fS |d k	r|g|d d< |j| || fS )Nzend of header before group-listr   zend of header in group-listr  zgroup-list with empty entries)re   r   rR   r   r   r   r   r  rj   r^   r*   r   )r   Z
group_listr   r,   r   r   r   get_group_list   s8    







r  c             C   s"  t  }t| \}} |  s$| d dkr4tjdj| |j| |jtdd | dd  } | r| d dkr|jtdd || dd  fS t| \}} |j| | s|jjtj	d n| d dkrtjd	j| |jtdd | dd  } | r| d t
krt| \}} |j| || fS )
Nr   r  z8expected ':' at end of group display name but found '{}'zgroup-display-name-terminatorri   r  zgroup-terminatorzend of header in groupz)expected ';' at end of group but found {})rf   r  r   r   r!   rR   r   r  r   r   r   r   )r   r`   r,   r   r   r   	get_groupE  s2    




r  c             C   sx   t  }yt| \}} W nN tjk
rd   yt| \}} W n& tjk
r^   tjdj| Y nX Y nX |j| || fS )Nzexpected address but found '{}')r_   r  r   r   r  r!   rR   )r   r[   r,   r   r   r   get_addressc  s    
r  c             C   s  t  }x| ryt| \}} |j| W n$ tjk
rP } zd }| d tkrt| \}} |  sr| d dkr|j| |jjtjd nFt	| d\}} |d k	r|g|d d< |jt
|g |jjtjd nh| d dkr|jjtjd nHt	| d\}} |d k	r|g|d d< |jt
|g |jjtjd W Y d d }~X nX | r| d dkr|d	 d }d|_t	| d\}} |j| |jjtjd | r
|jtdd | dd  } q
W || fS )
Nr   r   z"address-list entry with no contentzinvalid address in address-listzempty element in address-listri   zinvalid-mailboxzlist-separatorrk   )rZ   r  rR   r   r   r   r   r   r   r  r_   r   r6   r*   r   )r   Zaddress_listr,   errr   rb   r   r   r   get_address_list  sN    












r  c             C   s  t  }| s |jjtjd |S | d tkrXt| \}} |j| | sX|jjtjd d}x8| r| d dkr| d tkr|| d 7 }| dd  } q^W |j s|jjtjdj	| |jt
|d nt||_|jt
|d	 | o| d tkr
t| \}} |j| |  s | d dkrX|jd k	r>|jjtjd
 | rT|jt
| d |S |jt
dd | dd  } | r| d tkrt| \}} |j| | s|jd k	r|jjtjd
 |S d}x2| r| d tkr|| d 7 }| dd  } qW |j s2|jjtjdj	| |jt
|d nt||_|jt
|d	 | rv| d tkrvt| \}} |j| | r|jjtjd |jt
| d |S )Nz%Missing MIME version number (eg: 1.0)r   z0Expected MIME version number but found only CFWSr   r	   ri   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   rR   r   HeaderMissingRequiredValuer   r   isdigitr   r!   r   intr   r   )r   Zmime_versionr,   r  r   r   r   parse_mime_version  sv    













r  c             C   sh   t  }xX| r^| d dkr^| d tkrF|jt| d d | dd  } qt| \}} |j| qW || fS )Nr   r  zmisplaced-specialri   )r   r   rR   r   r   )r   Zinvalid_parameterr,   r   r   r   get_invalid_parameter  s    r  c             C   sN   t | }|stjdj| |j }| t|d  } t|d}t| || fS )Nzexpected ttext but found '{}'ttext)_non_token_end_matcherr   r   r!   r`   rj   r   r   )r   r   r  r   r   r   	get_ttext  s    	
r   c             C   s   t  }| r,| d tkr,t| \}} |j| | rL| d tkrLtjdj| t| \}} |j| | r| d tkrt| \}} |j| || fS )Nr   zexpected token but found '{}')	rL   r   r   rR   
TOKEN_ENDSr   r   r!   r   )r   Zmtokenr,   r   r   r   	get_token'  s    	


r"  c             C   sN   t | }|stjdj| |j }| t|d  } t|d}t| || fS )Nz expected attrtext but found {!r}r   )_non_attribute_end_matcherr   r   r!   r`   rj   r   r   )r   r   r   r   r   r   get_attrtext>  s    	
r$  c             C   s   t  }| r,| d tkr,t| \}} |j| | rL| d tkrLtjdj| t| \}} |j| | r| d tkrt| \}} |j| || fS )Nr   zexpected token but found '{}')	r   r   r   rR   ATTRIBUTE_ENDSr   r   r!   r$  )r   r   r,   r   r   r   get_attributeQ  s    	


r&  c             C   sN   t | }|stjdj| |j }| t|d  } t|d}t| || fS )Nz)expected extended attrtext but found {!r}zextended-attrtext)#_non_extended_attribute_end_matcherr   r   r!   r`   rj   r   r   )r   r   r   r   r   r   get_extended_attrtexth  s    
r(  c             C   s   t  }| r,| d tkr,t| \}} |j| | rL| d tkrLtjdj| t| \}} |j| | r| d tkrt| \}} |j| || fS )Nr   zexpected token but found '{}')	r   r   r   rR   EXTENDED_ATTRIBUTE_ENDSr   r   r!   r(  )r   r   r,   r   r   r   get_extended_attributez  s    


r*  c             C   s   t  }|  s| d dkr(tjdj| |jtdd | dd  } |  sX| d j  rhtjdj| d}x,| r| d j r|| d 7 }| dd  } qnW |d dkr|dkr|jjtjd	 t	||_
|jt|d
 || fS )Nr   *zExpected section but found {}zsection-markerri   z$Expected section number but found {}r   0z'section number has an invalid leading 0r  )r   r   r   r!   rR   r   r  r   ZInvalidHeaderErrorr  r   )r   r   r  r   r   r   get_section  s&    	

r-  c             C   s   t  }| stjdd }| d tkr0t| \}} | sDtjdj|| d dkr^t| \}} nt| \}} |d k	r|g|d d< |j| || 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*  rR   )r   vr   r,   r   r   r   	get_value  s     

r/  c             C   s  t  }t| \}} |j| |  s.| d dkrN|jjtjdj| || fS | d dkry t| \}} d|_|j| W n tj	k
r   Y nX | stj	d| d dkr|jt
dd | dd  } d|_| d d	krtj	d
|jt
d	d | dd  } d }| r.| d tkr.t| \}} |j| d }|}|jrH| rH| d dkrHt| \}}|j}d}|jdkr|r|d dkrd}n$t|\}}	|	r|	d dkrd}n(yt|\}}	W n   Y nX |	sd}|r2|jjtjd |j| x,|D ]$}
|
jdkrg |
d d < |
}P qW |} nd }|jjtjd | rb| d dkrbd }nt| \}} |j s|jdkr|  s| d dkr|j| |d k	r|} || fS |jjtjd | s|jjtjd |j| |d kr|| fS n|d k	rFx|D ]}
|
jdkrP qW |
jdk |j|
 |
j|_| d dkrdtj	dj| |jt
dd | dd  } | r| d dkrt| \}} |j| |j|_|  s| d dkrtj	dj| |jt
dd | dd  } |d k	rpt }xd| rh| d tkr(t| \}} n2| d dkrNt
dd}| dd  } nt| \}} |j| qW |}nt| \}} |j| |d k	r|} || fS )Nr   r  z)Parameter contains name ({}) but no valuer+  TzIncomplete parameterzextended-parameter-markerri   =zParameter not followed by '='zparameter-separatorr   F'z5Quoted string value for extended parameter is invalidzbare-quoted-stringzZParameter 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 delimiterszextended-attrtextr   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&  rR   r   r   r   r!   r-  r   r   r   r   r   r   r   rU   r   r$  r(  r6   r/  r   rO   rP   r   r   r   r   )r   r   r,   r   r   ZappendtoZqstringZinner_valueZ
semi_validr   tr.  r   r   r   get_parameter  s    
























r3  c             C   sh  t  }xZ| rbyt| \}} |j| W n tjk
r } zd }| d tkrZt| \}} | sl|j| |S | d dkr|d k	r|j| |jjtjd n@t	| \}} |r|g|d d< |j| |jjtjdj
| W Y d d }~X nX | r@| d dkr@|d	 }d|_t	| \}} |j| |jjtjdj
| | r
|jtdd | dd  } q
W |S )
Nr   r  zparameter entry with no contentzinvalid parameter {!r}ri   zinvalid-parameterz)parameter with invalid trailing text {!r}zparameter-separatorrk   )r   r3  rR   r   r   r   r   r   r   r  r!   r6   r*   r   )r   Zmime_parametersr,   r  r   r   r   r   r   parse_mime_parametersR	  sD    






 

r4  c             C   s   xX|rX|d dkrX|d t kr@| jt|d d |dd  }qt|\}}| j| qW |sbd S | jtdd | jt|dd   d S )Nr   r  zmisplaced-specialri   zparameter-separator)r   rR   r   r   r4  )Z	tokenlistr   r,   r   r   r   _find_mime_parameters	  s    r5  c             C   s  t  }d}| s$|jjtjd |S yt| \}} W n8 tjk
rl   |jjtjdj|  t	||  |S X |j| |  s| d dkr|jjtjd | rt	||  |S |j
j j |_|jtdd | dd  } yt| \}} W n: tjk
r$   |jjtjd	j|  t	||  |S X |j| |j
j j |_| sJ|S | d d
kr|jjtjdj|  |`|`t	||  |S |jtd
d |jt| dd   |S )NFz"Missing content type specificationz(Expected content maintype but found {!r}r   r   zInvalid content typezcontent-type-separatorri   z'Expected content subtype but found {!r}r  z<Only parameters are valid after content type, but found {!r}zparameter-separator)r   r   rR   r   r  r"  r   r   r!   r5  r   r   lowerr   r   r   r4  )r   ZctypeZrecoverr,   r   r   r   parse_content_type_header	  sX    











r7  c             C   s   t  }| s |jjtjd |S yt| \}} W n8 tjk
rh   |jjtjdj|  t	||  |S X |j| |j
j j |_| s|S | d dkr|jjtjdj|  t	||  |S |jtdd |j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}zparameter-separatorri   )r   r   rR   r   r  r"  r   r   r!   r5  r   r   r6  r   r   r4  )r   Zdisp_headerr,   r   r   r    parse_content_disposition_header	  s2    






r8  c             C   s   t  }| s |jjtjd |S yt| \}} W n. tjk
r^   |jjtjdj|  Y nX |j| |j	j
 j |_| s|S x^| r|jjtjd | d tkr|jt| d d | dd  } qt| \}} |j| qW |S )Nz!Missing content transfer encodingz1Expected content transfer encoding but found {!r}z*Extra text after content transfer encodingr   zmisplaced-specialri   )r   r   rR   r   r  r"  r   r   r!   r   r   r6  rN   r   r   r   )r   Z
cte_headerr,   r   r   r   &parse_content_transfer_encoding_header	  s.    



r9  c             C   sD   d}| r@| d r@| d d t kr@| d d }| d d d	 | d
< |S )Nr   ri   rk   rk   rk   rk   rk   rk   rk   rk   )r   )linesZwspr   r   r   _steal_trailing_WSP_if_exists
  s
    r;  c            C   s  |j ptd}|jrdnd}dg}d }d}d}tdd}t| }	xH|	r|	jd}
|
|krf|d8 }qDt|
}y|j| |}W n6 tk
r   t	d	d
 |
j
D rd}nd}d}Y nX |
jdkrt|
||| qD|o| r|
jsTd}d }|
jrT|
j|dd d }|j|krTt||t|d  krBt|}|j| |d  |7  < qDt|
dsnt|
|	 }	nt|||||
j|}d}qDt||t|d  kr|d  |7  < qD|
jrt|d |krt|}|s|
j r|j||  qDt|
ds.t|
}|
js$|d7 }|j| ||	 }	qD|
jrP| rP|	jd|
 d}qDt|}|sh|
j rx|j||  qD|d  |7  < qDW |jj||j S )Nz+infzutf-8zus-asciir   r   Fwrap_as_ew_blockedri   c             s   s   | ]}t |tjV  qd S )N)r   r   r   )r   r   r   r   r   r   :
  s   z%_refold_parse_tree.<locals>.<genexpr>zunknown-8bitTzmime-parameters)r-   r   rk   rk   rk   rk   rk   rk   )Zmax_line_lengthfloatutf8r   r   r   r   r   r   r  r$   r6   _fold_mime_parametersr'   r:   r/   lineseprj   r;  rR   r7   _fold_as_ewr;   r&   insertr   )Z
parse_treer-   maxlenr   r:  last_ewr<  Zwant_encodingZend_ew_not_allowedr   r(   tstrrO   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|j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jdx| r|t|d  }||
 }|dkr2|jd  q| d | }tj	||	d	}t|| }x6|dkr|d d }tj	||	d	}t|| }qZW |d  |7  < | t|d  } |  r|jd t|d } qW |d  |7  < |r|S d S )Nri   r   r   zus-asciizutf-8   z3max_line_length is too small to fit an encoded wordr?   )rO   rk   rk   rk   rk   rk   rk   rk   rk   rk   rk   rk   rk   rk   rk   )
r   r   r   rj   rR   r;  r   r   r   r   )Z	to_encoder:  rC  rD  r;   rO   Zleading_wspZtrailing_wspZnew_last_ewZ	encode_as
chrome_lenZremaining_spaceZ
text_spaceZto_encode_wordZencoded_wordZexcessr   r   r   rA  
  sP    


rA  c             C   s  x| j D ]\}}|d j jds6|d  d7  < |}d}y|j| d}W n0 tk
r   d}tj|rxd}d}nd}Y nX |rtjj	|d	|d
}	dj
|||	}
ndj
|t|}
t|d t|
 d |k r|d d |
 |d< q
n"t|
d |kr|jd|
  q
d}|d }x|rt|tt| d t| }||d krTd}|| d  }}x<|d | }tjj	|d	|d
}	t|	|krP |d8 }qfW |jdj
||||	 d	}|d7 }||d  }|r|d  d7  < qW q
W d S )Nri   r  strictFTzunknown-8bitr   zutf-8r   )Zsafer   z
{}*={}''{}z{}={}r?   rg   r   z''rz   N   z {}*{}*={}{}rk   rk   rk   rk   rk   rk   )r   r{   r   r   r   r   r   r   r   rX   r!   r   rj   rR   r   )r(   r:  rC  r   r   r   rO   Zerror_handlerZencoding_requiredZencoded_valuerE  r   Zextra_chromerH  Z
splitpointZmaxcharspartialr   r   r   r?  
  s\    


 r?  )rer   stringr   collectionsr   operatorr   Zemailr   r   r   r   r~   r   r   r   r   r   r   Z	TSPECIALSr!  Z	ASPECIALSr%  r)  r   r   r   r>   rC   rE   rG   rH   rJ   rL   rM   rQ   rV   rW   rZ   r_   rc   re   rf   rh   rp   rr   rs   rt   ru   rw   rx   ry   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r  r  compiler!   r   rv   r   r   matchr   findallr   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/  r3  r4  r5  r7  r8  r9  r;  r.   rA  r?  r   r   r   r   <module>F   s  C"	
!($
V	+




   

*8"&'/'&).9%>D 49/cA