
    2\hM             	       $   	 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          z  Z ed	          Zeez  Ze ed
          z
  Ze ed          z
  Ze ed          z   ed
          z
  Zeez  Ze ed          z  Zeez  Ze ed          z
  ZddhZeez  Zd Zd Z e j        de j        e j        z            Z G d de           Z! G d de!          Z" G d de!          Z# G d de!          Z$ G d de!          Z% G d de"          Z& G d  d!e!          Z' G d" d#e!          Z( G d$ d%e!          Z) G d& d'e!          Z* G d( d)e*          Z+ G d* d+e"          Z, G d, d-e!          Z- G d. d/e!          Z. G d0 d1e!          Z/ G d2 d3e!          Z0 G d4 d5e!          Z1 G d6 d7e!          Z2 G d8 d9e!          Z3 G d: d;e!          Z4 G d< d=e!          Z5 G d> d?e!          Z6 G d@ dAe!          Z7 G dB dCe!          Z8 G dD dEe!          Z9 G dF dGe!          Z: G dH dIe!          Z; G dJ dKe!          Z< G dL dMe$          Z= G dN dOe!          Z> G dP dQe!          Z? G dR dSe!          Z@ G dT dUe!          ZA G dV dWeA          ZB G dX dYe!          ZC G dZ d[e!          ZD G d\ d]e!          ZE G d^ d_e!          ZF G d` dae!          ZG G db dceG          ZH G dd deeG          ZI G df dge!          ZJ G dh die!          ZK G dj dke!          ZL G dl dmeL          ZM G dn doeM          ZN G dp dqe!          ZO G dr dseP          ZQ G dt dueQ          ZR G dv dweQ          ZS G dx dyeR          ZT G dz d{e
jU                  ZV eSd
d|          ZW eSd}d~          ZXdeX_Y        deX_Z         eSdd          Z[ e j        d\                    d]                    e                              j^        Z_ e j        d\                     e j`        d]                    e                                        ja        Zb e j        d          jc        Zd e j        d\                     e j`        d]                    e                                        ja        Ze e j        d\                     e j`        d]                    e                                        ja        Zf e j        d\                     e j`        d]                    e                                        ja        Zgd Zhd Zid ZjddZkd Zld Zmd Znd Zod Zpd Zqd Zrd Zsd Ztd Zud Zvd Zwd Zxd Zyd Zzd Z{d Z|d Z}d Z~d Zd Zd Zd Zd Zd Zd Zd Zd Zd Zd Zd Zd Zd Zd Zd Zd Zd Zd Zd Zd Zd Zd Zd Zd Zd Zd Zd Zd Zd Zd Zd Zd Zd Zd ZdS )    N)	hexdigits)
itemgetter)_encoded_words)errors)utilsz 	(z()<>@,:;.\"[].z."(z/?=z*'%%
c                 r    	 t          |                               dd                              dd          S )N\\\"z\")strreplacevalues    D/opt/python-3.11.14/usr/lib/python3.11/email/_header_value_parser.pymake_quoted_pairsr   c   s1    Eu::dF++33C???    c                 ,    t          |           }d| dS )Nr   )r   )r   escapeds     r   quote_stringr   h   s    &&Gw>>>r   z
   =\?            # literal =?
   [^?]*          # charset
   \?             # literal ?
   [qQbB]         # literal 'q' or 'b', case insensitive
   \?             # literal ?
  .*?             # encoded word
  \?=             # literal ?=
c                        e Zd ZdZdZdZ fdZd Z fdZe	d             Z
e	d             Zd Ze	d	             Ze	d
             Zd ZddZddZddZ xZS )	TokenListNTc                 H     t                      j        |i | g | _        d S N)super__init__defects)selfargskw	__class__s      r   r    zTokenList.__init__   s*    $%"%%%r   c                 @    d                     d | D                       S )N c              3   4   K   | ]}t          |          V  d S r   r   .0xs     r   	<genexpr>z$TokenList.__str__.<locals>.<genexpr>   (      ,,!s1vv,,,,,,r   joinr"   s    r   __str__zTokenList.__str__   s#    ww,,t,,,,,,r   c                     d                     | j        j        t                                                                S Nz{}({})formatr%   __name__r   __repr__r"   r%   s    r   r8   zTokenList.__repr__   s3    t~6"WW--//1 1 	1r   c                 @    d                     d | D                       S )Nr'   c              3   2   K   | ]}|j         	|j         V  d S r   r   r*   s     r   r-   z"TokenList.value.<locals>.<genexpr>   s+      8818qw888888r   r/   r1   s    r   r   zTokenList.value   s#    ww88888888r   c                 @    t          d | D             | j                  S )Nc              3   $   K   | ]}|j         V  d S r   )all_defectsr*   s     r   r-   z(TokenList.all_defects.<locals>.<genexpr>   s$      00aAM000000r   )sumr!   r1   s    r   r>   zTokenList.all_defects   s#    004000$,???r   c                 6    | d                                          S Nr   )startswith_fwsr1   s    r   rB   zTokenList.startswith_fws   s    Aw%%'''r   c                 6    	 t          d | D                       S )Nc              3   $   K   | ]}|j         V  d S r   )as_ew_allowed)r+   parts     r   r-   z*TokenList.as_ew_allowed.<locals>.<genexpr>   s%      77$4%777777r   )allr1   s    r   rE   zTokenList.as_ew_allowed   s"    O77$777777r   c                 H    g }| D ]}|                     |j                   |S r   )extendcomments)r"   rJ   tokens      r   rJ   zTokenList.comments   s2     	, 	,EOOEN++++r   c                $    t          | |          S )Npolicy)_refold_parse_treer"   rN   s     r   foldzTokenList.fold   s    !$v6666r   r'   c                 L    t          |                     |                     d S )Nindent)printppstrr"   rT   s     r   pprintzTokenList.pprint   s$    djjj''(((((r   c                 T    d                     |                     |                    S )Nr   rS   )r0   _pprW   s     r   rV   zTokenList.ppstr   s"    yy00111r   c              #   n  K   d                     || j        j        | j                  V  | D ]K}t	          |d          s|d                     |          z   V  -|                    |dz             E d {V  L| j        rd                     | j                  }nd}d                     ||          V  d S )Nz{}{}/{}(rZ   z*    !! invalid element in token list: {!r}z    z Defects: {}r'   z{}){})r6   r%   r7   
token_typehasattrrZ   r!   )r"   rT   rK   extras       r   rZ   zTokenList._pp   s      N#O  	 	 	  	4 	4E5%(( 4 !55;VE]]C D D D D !99VF]3333333333< 	"))$,77EEEnnVU+++++++r   r'   )r7   
__module____qualname__r\   syntactic_breakew_combine_allowedr    r2   r8   propertyr   r>   rB   rE   rJ   rQ   rX   rV   rZ   __classcell__r%   s   @r   r   r   }   s9       JO    - - -1 1 1 1 1 9 9 X9 @ @ X@( ( ( 8 8 X8   X7 7 7) ) ) )2 2 2 2, , , , , , , ,r   r   c                   :    e Zd Zed             Zed             ZdS )WhiteSpaceTokenListc                     dS N  r1   s    r   r   zWhiteSpaceTokenList.value       sr   c                     d | D             S )Nc                 2    g | ]}|j         d k    |j        S )comment)r\   contentr*   s     r   
<listcomp>z0WhiteSpaceTokenList.comments.<locals>.<listcomp>   s&    CCCa1<+B+B	+B+B+Br   rl   r1   s    r   rJ   zWhiteSpaceTokenList.comments   s    CC4CCCCr   N)r7   r`   ra   rd   r   rJ   rl   r   r   rh   rh      sM          X D D XD D Dr   rh   c                       e Zd ZdZdS )UnstructuredTokenListunstructuredNr7   r`   ra   r\   rl   r   r   rt   rt      s        JJJr   rt   c                       e Zd ZdZdS )PhrasephraseNrv   rl   r   r   rx   rx              JJJr   rx   c                       e Zd ZdZdS )WordwordNrv   rl   r   r   r|   r|              JJJr   r|   c                       e Zd ZdZdS )CFWSListcfwsNrv   rl   r   r   r   r      r~   r   r   c                       e Zd ZdZdS )AtomatomNrv   rl   r   r   r   r      r~   r   r   c                       e Zd ZdZdZdS )TokenrK   FN)r7   r`   ra   r\   encode_as_ewrl   r   r   r   r      s        JLLLr   r   c                       e Zd ZdZdZdZdZdS )EncodedWordencoded-wordN)r7   r`   ra   r\   ctecharsetlangrl   r   r   r   r      s"        J
CGDDDr   r   c                   T    e Zd ZdZed             Zed             Zed             ZdS )QuotedStringquoted-stringc                 8    | D ]}|j         dk    r	|j        c S d S Nbare-quoted-stringr\   r   r"   r,   s     r   rq   zQuotedString.content   s9     	 	A|333w 4	 	r   c                     g }| D ]J}|j         dk    r#|                    t          |                     0|                    |j                   Kd                    |          S )Nr   r'   )r\   appendr   r   r0   )r"   resr,   s      r   quoted_valuezQuotedString.quoted_value   sf     	$ 	$A|333

3q66""""

17####wws||r   c                 8    | D ]}|j         dk    r	|j        c S d S r   r   r"   rK   s     r   stripped_valuezQuotedString.stripped_value   s=     	# 	#E#777{""" 8	# 	#r   N)r7   r`   ra   r\   rd   rq   r   r   rl   r   r   r   r      sh         J  X
   X # # X# # #r   r   c                   .    e Zd ZdZd Zed             ZdS )BareQuotedStringr   c                 Z    t          d                    d | D                                 S )Nr'   c              3   4   K   | ]}t          |          V  d S r   r)   r*   s     r   r-   z+BareQuotedString.__str__.<locals>.<genexpr>
  s(      #9#9qCFF#9#9#9#9#9#9r   )r   r0   r1   s    r   r2   zBareQuotedString.__str__	  s+    BGG#9#9D#9#9#999:::r   c                 @    d                     d | D                       S )Nr'   c              3   4   K   | ]}t          |          V  d S r   r)   r*   s     r   r-   z)BareQuotedString.value.<locals>.<genexpr>  r.   r   r/   r1   s    r   r   zBareQuotedString.value  #    ww,,t,,,,,,r   N)r7   r`   ra   r\   r2   rd   r   rl   r   r   r   r     sC        %J; ; ; - - X- - -r   r   c                   J    e Zd ZdZd Zd Zed             Zed             ZdS )Commentrp   c                 l     d                     t          dg fd D             dggg                     S )Nr'   r   c                 :    g | ]}                     |          S rl   )quote)r+   r,   r"   s     r   rr   z#Comment.__str__.<locals>.<listcomp>  s#    999qTZZ]]999r   ))r0   r?   r1   s   `r   r2   zComment.__str__  sP    wws E9999D999 E  "	# # $ $ 	$r   c                     |j         dk    rt          |          S t          |                              dd                              dd                              dd          S )Nrp   r   r   r   z\(r   z\))r\   r   r   )r"   r   s     r   r   zComment.quote  sc    y((u::5zz!!$//77"%u. ..5g"%u/. /.	.r   c                 @    d                     d | D                       S )Nr'   c              3   4   K   | ]}t          |          V  d S r   r)   r*   s     r   r-   z"Comment.content.<locals>.<genexpr>%  r.   r   r/   r1   s    r   rq   zComment.content#  r   r   c                     | j         gS r   )rq   r1   s    r   rJ   zComment.comments'  s    ~r   N)	r7   r`   ra   r\   r2   r   rd   rq   rJ   rl   r   r   r   r     sm        J$ $ $. . . - - X-   X  r   r   c                   T    e Zd ZdZed             Zed             Zed             ZdS )AddressListzaddress-listc                     d | D             S )Nc                 (    g | ]}|j         d k    |S )addressr\   r*   s     r   rr   z)AddressList.addresses.<locals>.<listcomp>1  $    ;;;a1<#:#:#:#:#:r   rl   r1   s    r   	addresseszAddressList.addresses/      ;;4;;;;r   c                 6    t          d | D             g           S )Nc              3   :   K   | ]}|j         d k    |j        V  dS r   Nr\   	mailboxesr*   s     r   r-   z(AddressList.mailboxes.<locals>.<genexpr>5  s<       > >Q\9%<%< K%<%<%<%<> >r   r?   r1   s    r   r   zAddressList.mailboxes3  6     > >!> > >?AC C 	Cr   c                 6    t          d | D             g           S )Nc              3   :   K   | ]}|j         d k    |j        V  dS r   r\   all_mailboxesr*   s     r   r-   z,AddressList.all_mailboxes.<locals>.<genexpr>:  s<       > >Q\9%<%< O%<%<%<%<> >r   r   r1   s    r   r   zAddressList.all_mailboxes8  r   r   N)r7   r`   ra   r\   rd   r   r   r   rl   r   r   r   r   +  sp        J< < X< C C XC C C XC C Cr   r   c                   T    e Zd ZdZed             Zed             Zed             ZdS )Addressr   c                 B    | d         j         dk    r| d         j        S d S )Nr   groupr\   display_namer1   s    r   r   zAddress.display_nameB  s)    7((7'' )(r   c                 v    | d         j         dk    r	| d         gS | d         j         dk    rg S | d         j        S Nr   mailboxinvalid-mailboxr   r1   s    r   r   zAddress.mailboxesG  sE    7**G9!W#444IAw  r   c                     | d         j         dk    r	| d         gS | d         j         dk    r	| d         gS | d         j        S r   r   r1   s    r   r   zAddress.all_mailboxesO  sL    7**G9!W#444G9Aw$$r   N)r7   r`   ra   r\   rd   r   r   r   rl   r   r   r   r   >  sh        J( ( X( ! ! X! % % X% % %r   r   c                   >    e Zd ZdZed             Zed             ZdS )MailboxListmailbox-listc                     d | D             S )Nc                 (    g | ]}|j         d k    |S )r   r   r*   s     r   rr   z)MailboxList.mailboxes.<locals>.<listcomp>]  r   r   rl   r1   s    r   r   zMailboxList.mailboxes[  r   r   c                     d | D             S )Nc                 $    g | ]}|j         d v |S ))r   r   r   r*   s     r   rr   z-MailboxList.all_mailboxes.<locals>.<listcomp>a  s/     ? ? ?a|=== ===r   rl   r1   s    r   r   zMailboxList.all_mailboxes_  s"    ? ?4 ? ? ? 	?r   Nr7   r`   ra   r\   rd   r   r   rl   r   r   r   r   W  sM        J< < X< ? ? X? ? ?r   r   c                   >    e Zd ZdZed             Zed             ZdS )	GroupList
group-listc                 F    | r| d         j         dk    rg S | d         j        S Nr   r   r   r1   s    r   r   zGroupList.mailboxesi  s-     	tAw)^;;IAw  r   c                 F    | r| d         j         dk    rg S | d         j        S r   r   r1   s    r   r   zGroupList.all_mailboxeso  s-     	tAw)^;;IAw$$r   Nr   rl   r   r   r   r   e  sM        J! ! X!
 % % X% % %r   r   c                   T    e Zd ZdZed             Zed             Zed             ZdS )Groupr   c                 B    | d         j         dk    rg S | d         j        S N   r   r   r1   s    r   r   zGroup.mailboxesz  s&    7--IAw  r   c                 B    | d         j         dk    rg S | d         j        S r   r   r1   s    r   r   zGroup.all_mailboxes  s&    7--IAw$$r   c                     | d         j         S rA   )r   r1   s    r   r   zGroup.display_name  s    Aw##r   N)r7   r`   ra   r\   rd   r   r   r   rl   r   r   r   r   v  sh        J! ! X!
 % % X%
 $ $ X$ $ $r   r   c                       e Zd ZdZed             Zed             Zed             Zed             Zed             Z	dS )NameAddr	name-addrc                 F    t          |           dk    rd S | d         j        S N   r   )lenr   r1   s    r   r   zNameAddr.display_name  s#    t99>>4Aw##r   c                     | d         j         S N
local_partr1   s    r   r   zNameAddr.local_part  s    Bx""r   c                     | d         j         S r   domainr1   s    r   r   zNameAddr.domain  s    Bxr   c                     | d         j         S r   )router1   s    r   r   zNameAddr.route  s    Bx~r   c                     | d         j         S r   	addr_specr1   s    r   r   zNameAddr.addr_spec  s    Bx!!r   N
r7   r`   ra   r\   rd   r   r   r   r   r   rl   r   r   r   r     s        J$ $ X$
 # # X#   X   X " " X" " "r   r   c                   j    e Zd ZdZed             Zed             Zed             Zed             ZdS )	AngleAddrz
angle-addrc                 8    | D ]}|j         dk    r	|j        c S d S N	addr-spec)r\   r   r   s     r   r   zAngleAddr.local_part  s;     	$ 	$A|{**|### +	$ 	$r   c                 8    | D ]}|j         dk    r	|j        c S d S r   r\   r   r   s     r   r   zAngleAddr.domain  s8     	  	 A|{**x +	  	 r   c                 8    | D ]}|j         dk    r	|j        c S d S )N	obs-route)r\   domainsr   s     r   r   zAngleAddr.route  s;     	! 	!A|{**y    +	! 	!r   c                     | D ];}|j         dk    r.|j        r	|j        c S t          |j                  |j        z   c S <dS )Nr   z<>)r\   r   r   r   r   s     r   r   zAngleAddr.addr_spec  s`     	 	A|{**< D;&&&'55CCCC	 + 4r   N)	r7   r`   ra   r\   rd   r   r   r   r   rl   r   r   r   r     s        J$ $ X$
     X 
 ! ! X!
   X  r   r   c                   (    e Zd ZdZed             ZdS )ObsRouter   c                     d | D             S )Nc                 2    g | ]}|j         d k    |j        S r   r   r*   s     r   rr   z$ObsRoute.domains.<locals>.<listcomp>  s&    CCCQ!,(*B*B*B*B*Br   rl   r1   s    r   r   zObsRoute.domains  s    CC$CCCCr   N)r7   r`   ra   r\   rd   r   rl   r   r   r  r    s7        JD D XD D Dr   r  c                       e Zd ZdZed             Zed             Zed             Zed             Zed             Z	dS )Mailboxr   c                 B    | d         j         dk    r| d         j        S d S Nr   r   r   r1   s    r   r   zMailbox.display_name  s)    7,,7'' -,r   c                     | d         j         S rA   r   r1   s    r   r   zMailbox.local_part      Aw!!r   c                     | d         j         S rA   r   r1   s    r   r   zMailbox.domain  s    Aw~r   c                 B    | d         j         dk    r| d         j        S d S r	  )r\   r   r1   s    r   r   zMailbox.route  s(    7,,7=  -,r   c                     | d         j         S rA   r   r1   s    r   r   zMailbox.addr_spec  s    Aw  r   Nr   rl   r   r   r  r    s        J( ( X( " " X"   X ! ! X! ! ! X! ! !r   r  c                   8    e Zd ZdZed             ZexZxZxZZ	dS )InvalidMailboxr   c                     d S r   rl   r1   s    r   r   zInvalidMailbox.display_name      tr   Nr   rl   r   r   r  r    sB        "J  X /;:J::%)))r   r  c                   6     e Zd ZdZdZe fd            Z xZS )Domainr   Fc                 t    d                     t                      j                                                  S Nr'   r0   r   r   splitr9   s    r   r   zDomain.domain  '    wwuww}**,,---r   )r7   r`   ra   r\   rE   rd   r   re   rf   s   @r   r  r    sL        JM. . . . X. . . . .r   r  c                       e Zd ZdZdS )DotAtomdot-atomNrv   rl   r   r   r  r    s        JJJr   r  c                       e Zd ZdZdZdS )DotAtomTextzdot-atom-textTNr7   r`   ra   r\   rE   rl   r   r   r  r    s         JMMMr   r  c                       e Zd ZdZdZdS )NoFoldLiteralzno-fold-literalFNr  rl   r   r   r!  r!  
  s        "JMMMr   r!  c                   n    e Zd ZdZdZed             Zed             Zed             Zed             Z	dS )AddrSpecr   Fc                     | d         j         S rA   r   r1   s    r   r   zAddrSpec.local_part  r  r   c                 F    t          |           dk     rd S | d         j        S )N   r   )r   r   r1   s    r   r   zAddrSpec.domain  s"    t99q==4Bxr   c                     t          |           dk     r| d         j        S | d         j                                        | d         j        z   | d         j                                        z   S )Nr&  r   r   r   )r   r   rstriplstripr1   s    r   r   zAddrSpec.value  sW    t99q==7= Aw}##%%d1gm3DGM4H4H4J4JJJr   c                     t          | j                  }t          |          t          |t          z
            k    rt	          | j                  }n| j        }| j        |dz   | j        z   S |S )N@)setr   r   DOT_ATOM_ENDSr   r   )r"   namesetlps      r   r   zAddrSpec.addr_spec$  se    do&&w<<#gm34444do..BBB;"8dk))	r   N)
r7   r`   ra   r\   rE   rd   r   r   r   r   rl   r   r   r#  r#    s        JM" " X"   X
 K K XK
   X  r   r#  c                       e Zd ZdZdZdS )ObsLocalPartzobs-local-partFNr  rl   r   r   r1  r1  0  s        !JMMMr   r1  c                   L     e Zd ZdZdZed             Ze fd            Z xZS )DisplayNamezdisplay-nameFc                    t          |           }t          |          dk    r|j        S |d         j        dk    r|                    d           n7|d         d         j        dk    r t          |d         dd                    |d<   |d         j        dk    r|                                 n7|d         d         j        dk    r t          |d         d d                   |d<   |j        S )Nr   r   r   r   )r   r   r   r\   pop)r"   r   s     r   r   zDisplayName.display_name;  s    oos88q==9q6&&GGAJJJJ1vay#v--"3q6!"":..Ar7''GGIIII2wr{%//#CGCRCL11Byr   c                 t   d}| j         rd}n| D ]}|j        dk    rd}t          |           dk    rt|rrdx}}| d         j        dk    s| d         d         j        dk    rd}| d         j        dk    s| d         d         j        dk    rd}|t          | j                  z   |z   S t                      j        S )	NFTr   r   r'   r   rk   r   )r!   r\   r   r   r   r   r   )r"   r   r,   prepostr%   s        r   r   zDisplayName.valueL  s    < 	!EE ! !<?22 Et99>>e>OC$Aw!6))T!WQZ-BF-J-JBx"F**d2hrl.Ev.M.M|D$5666t;;77= r   )	r7   r`   ra   r\   rc   rd   r   r   re   rf   s   @r   r3  r3  6  sh        J  X  ! ! ! ! X! ! ! ! !r   r3  c                   B    e Zd ZdZdZed             Zed             ZdS )	LocalPartz
local-partFc                 X    | d         j         dk    r| d         j        S | d         j        S )Nr   r   )r\   r   r   r1   s    r   r   zLocalPart.valuee  s-    7007''7= r   c                 
   t           g}t           }d}| d         t           gz   D ]}|j        dk    r|r6|j        dk    r+|d         j        dk    rt          |d d                   |d<   t          |t                    }|rG|j        dk    r<|d         j        dk    r+|                    t          |dd                               n|                    |           |d         }|}t          |dd                   }|j        S )NFr   r   dotr   r   )DOTr\   r   
isinstancer   r   )r"   r   last
last_is_tltokis_tls         r   r   zLocalPart.local_partl  s    e
7cU? 	 	C~'' /s~66H'611#D"I..BsI..E  $/U22F%//

9SW--....

3r7DJJAbD	""yr   N)r7   r`   ra   r\   rE   rd   r   r   rl   r   r   r:  r:  `  sR        JM! ! X!   X  r   r:  c                   L     e Zd ZdZdZe fd            Zed             Z xZS )DomainLiteralzdomain-literalFc                 t    d                     t                      j                                                  S r  r  r9   s    r   r   zDomainLiteral.domain  r  r   c                 8    | D ]}|j         dk    r	|j        c S d S )Nptextr   r   s     r   ipzDomainLiteral.ip  s8     	 	A|w&&w '	 	r   )	r7   r`   ra   r\   rE   rd   r   rI  re   rf   s   @r   rE  rE    sg        !JM. . . . X.   X    r   rE  c                       e Zd ZdZdZdZdS )MIMEVersionzmime-versionN)r7   r`   ra   r\   majorminorrl   r   r   rK  rK    s        JEEEEr   rK  c                   J    e Zd ZdZdZdZdZed             Zed             Z	dS )	Parameter	parameterFus-asciic                 .    | j         r| d         j        ndS r   )	sectionednumberr1   s    r   section_numberzParameter.section_number  s     "&6tAw~~Q6r   c                     | D ]N}|j         dk    r	|j        c S |j         dk    r-|D ]*}|j         dk    r|D ]}|j         dk    r|j        c c c S +OdS )Nr   r   r   r'   )r\   r   r   s     r   param_valuezParameter.param_value  s      	< 	<E7**++++?22" < <E'+???%* < <E$/7::','; ; ; ; ; ; ; ;  ;rr   N)
r7   r`   ra   r\   rS  extendedr   rd   rU  rW  rl   r   r   rO  rO    s\        JIHG7 7 X7
   X  r   rO  c                       e Zd ZdZdS )InvalidParameterinvalid-parameterNrv   rl   r   r   rZ  rZ    s        $JJJr   rZ  c                   (    e Zd ZdZed             ZdS )	Attribute	attributec                 V    | D ]%}|j                             d          r	|j        c S &d S )Nattrtext)r\   endswithr   r   s     r   r   zAttribute.stripped_value  sG     	# 	#E((44 #{"""#	# 	#r   Nr7   r`   ra   r\   rd   r   rl   r   r   r]  r]    s2        J# # X# # #r   r]  c                       e Zd ZdZdZdS )SectionsectionN)r7   r`   ra   r\   rT  rl   r   r   rd  rd    s        JFFFr   rd  c                   (    e Zd ZdZed             ZdS )Valuer   c                     | d         }|j         dk    r| d         }|j                             d          r|j        S | j        S )Nr   r   r   )r   r^  zextended-attribute)r\   ra  r   r   r   s     r   r   zValue.stripped_value  sS    Qv%%GE$$DF F 	(''zr   Nrb  rl   r   r   rg  rg    s2        J  X  r   rg  c                   2    e Zd ZdZdZed             Zd ZdS )MimeParametersmime-parametersFc              #     K   i }| D ]y}|j                             d          s|d         j         dk    r/|d         j                                        }||vrg ||<   ||                             |j        |f           z|                                D ]4\  }}t          |t          d                    }|d         d         }|j	        }|j
        sgt          |          dk    rT|d         d         dk    rB|d         d         j                            t          j        d                     |d d         }g }d}|D ]j\  }	}
|	|k    r`|
j
        s-|
j                            t          j        d                     @|
j                            t          j        d                     |dz  }|
j        }|
j
        r	 t           j                            |          }	 |                    |d	          }n-# t(          t*          f$ r |                    d
d	          }Y nw xY wt-          j        |          r+|
j                            t          j                               n1# t*          $ r$ t           j                            |d          }Y nw xY w|                    |           ld                    |          }||fV  6d S )NrP  r   r^  )keyr   z.duplicate parameter name; duplicate(s) ignoredz+duplicate parameter name; duplicate ignoredz(inconsistent RFC2231 parameter numberingsurrogateescaperQ  zlatin-1)encodingr'   )r\   ra  r   stripr   rU  itemssortedr   r   rX  r   r!   r   InvalidHeaderDefectrW  urllibparseunquote_to_bytesdecodeLookupErrorUnicodeEncodeErrorr   _has_surrogatesUndecodableBytesDefectunquoter0   )r"   paramsrK   namepartsfirst_paramr   value_partsirU  paramr   s               r   r}  zMimeParameters.params  sF       	? 	?E#,,[99 Qx"k118>''))D6!!!t4L!5u =>>>>!<<>> 3	 3	KD%5jmm444E(1+K!)G ' &CJJNN8A;!##!HQK'..v/IH0J 0J K K K!"1"IE KA). !* !*%!Q&& !> I,,V-GI.K .K L L L ,,V-GF.H .H I I IQ)> RR & = =e D DP$)LL:K$L$LEE +-?@ P P P
 %*LL=N$O$OEEEP !077 R!M001N1P1PQQQ . P P P !' 4 4UY 4 O O	P  ""5))))GGK((E+g3	 3	s$   I&"G99'H#"H#&+JJc           	          g }| j         D ]S\  }}|r7|                    d                    |t          |                               >|                    |           Td                    |          }|rd|z   ndS )N{}={}z; rk   r'   )r}  r   r6   r   r0   )r"   r}  r~  r   s       r   r2   zMimeParameters.__str__&  s    ; 	$ 	$KD% $gnnT<3F3FGGHHHHd####6""%-sV||2-r   N)r7   r`   ra   r\   rb   rd   r}  r2   rl   r   r   rj  rj    sJ        "JOC C XCJ. . . . .r   rj  c                   (    e Zd ZdZed             ZdS )ParameterizedHeaderValueFc                 R    t          |           D ]}|j        dk    r	|j        c S i S )Nrk  )reversedr\   r}  r   s     r   r}  zParameterizedHeaderValue.params7  s>    d^^ 	$ 	$E#444|### 5	r   N)r7   r`   ra   rb   rd   r}  rl   r   r   r  r  1  s4         O  X  r   r  c                       e Zd ZdZdZdZdZdS )ContentTypezcontent-typeFtextplainN)r7   r`   ra   r\   rE   maintypesubtyperl   r   r   r  r  ?  s"        JMHGGGr   r  c                       e Zd ZdZdZdZdS )ContentDispositionzcontent-dispositionFN)r7   r`   ra   r\   rE   content_dispositionrl   r   r   r  r  F  s         &JMr   r  c                       e Zd ZdZdZdZdS )ContentTransferEncodingzcontent-transfer-encodingF7bitN)r7   r`   ra   r\   rE   r   rl   r   r   r  r  L  s        ,JM
CCCr   r  c                       e Zd ZdZdZdS )HeaderLabelzheader-labelFNr  rl   r   r   r  r  R  s        JMMMr   r  c                       e Zd ZdZdZd ZdS )MsgIDzmsg-idFc                 0    t          |           |j        z   S r   )r   lineseprP   s     r   rQ   z
MsgID.fold[  s    4yy6>))r   N)r7   r`   ra   r\   rE   rQ   rl   r   r   r  r  W  s-        JM* * * * *r   r  c                       e Zd ZdZdS )	MessageIDz
message-idNrv   rl   r   r   r  r  `  s        JJJr   r  c                       e Zd ZdZdS )InvalidMessageIDzinvalid-message-idNrv   rl   r   r   r  r  d  s        %JJJr   r  c                       e Zd ZdZdS )HeaderheaderNrv   rl   r   r   r  r  h  rz   r   r  c                   ~     e Zd ZdZdZdZ fdZ fdZd Ze	d             Z
d fd	Zd Ze	d	             Zd
 Z xZS )TerminalTc                 h    t                                          | |          }||_        g |_        |S r   )r   __new__r\   r!   )clsr   r\   r"   r%   s       r   r  zTerminal.__new__v  s-    wwsE**$r   c                     d                     | j        j        t                                                                S r4   r5   r9   s    r   r8   zTerminal.__repr__|  s,    t~68H8H8J8JKKKr   c                 N    t          | j        j        dz   | j        z              d S )N/)rU   r%   r7   r\   r1   s    r   rX   zTerminal.pprint  s'    dn%+do=>>>>>r   c                 *    t          | j                  S r   )listr!   r1   s    r   r>   zTerminal.all_defects  s    DL!!!r   r'   c           	          d                     || j        j        | j        t	                                                      | j        sdnd                     | j                            gS )Nz{}{}/{}({}){}r'   z {})r6   r%   r7   r\   r   r8   r!   )r"   rT   r%   s     r   rZ   zTerminal._pp  s_    &&N#OGGlBBBT\(B(B   	r   c                     d S r   rl   r1   s    r   pop_trailing_wszTerminal.pop_trailing_ws  r  r   c                     g S r   rl   r1   s    r   rJ   zTerminal.comments  s    	r   c                 .    t          |           | j        fS r   )r   r\   r1   s    r   __getnewargs__zTerminal.__getnewargs__  s    4yy$/**r   r_   )r7   r`   ra   rE   rc   rb   r  r8   rX   rd   r>   rZ   r  rJ   r  re   rf   s   @r   r  r  p  s        MO    L L L L L? ? ? " " X"          X+ + + + + + +r   r  c                   *    e Zd Zed             Zd ZdS )WhiteSpaceTerminalc                     dS rj   rl   r1   s    r   r   zWhiteSpaceTerminal.value  rm   r   c                     dS )NTrl   r1   s    r   rB   z!WhiteSpaceTerminal.startswith_fws  s    tr   Nr7   r`   ra   rd   r   rB   rl   r   r   r  r    s<          X    r   r  c                   *    e Zd Zed             Zd ZdS )ValueTerminalc                     | S r   rl   r1   s    r   r   zValueTerminal.value  s    r   c                     dS )NFrl   r1   s    r   rB   zValueTerminal.startswith_fws  s    ur   Nr  rl   r   r   r  r    s<          X    r   r  c                   *    e Zd Zed             Zd ZdS )EWWhiteSpaceTerminalc                     dS r  rl   r1   s    r   r   zEWWhiteSpaceTerminal.value  s    rr   c                     dS r  rl   r1   s    r   r2   zEWWhiteSpaceTerminal.__str__  s    rr   N)r7   r`   ra   rd   r   r2   rl   r   r   r  r    s<          X    r   r  c                       e Zd ZdS )_InvalidEwErrorN)r7   r`   ra   rl   r   r   r  r    s        ;;r   r  r=  ,zlist-separatorFr+  zroute-component-markerz([{}]+)r'   z[^{}]+z[\x00-\x20\x7F]c                    	 t          |           }|r,| j                            t          j        |                     t          j        |           r.| j                            t          j        d                     d S d S )Nz*Non-ASCII characters found in header token)_non_printable_finderr!   r   r   NonPrintableDefectr   rz  r{  )xtextnon_printabless     r   _validate_xtextr    s    J*511N HV6~FFGGGU## ;V:8: : 	; 	; 	; 	; 	;; ;r   c                 n   	 t          | d          ^}}g }d}d}t          t          |                    D ]D}||         dk    r
|rd}d}nd}|rd}n||         |v r n!|                    ||                    E|dz   }d                    |          d                    ||d          g|z             |fS )Nr   Fr   Tr'   )_wsp_splitterranger   r   r0   )r   endcharsfragment	remaindervcharsescapehad_qpposs           r   _get_ptext_to_endcharsr    s     )22HyFFFS]]##  C=D    	FFc]h&&Ehsm$$$$Ag776??BGGXcdd^$4y$@AA6IIr   c                     	 |                                  }t          | d t          |           t          |          z
           d          }||fS )Nfws)r)  r  r   )r   newvaluer  s      r   get_fwsr    sK     ||~~H
U#<CJJs8}}$<#<=u
E
EC=r   vtextc                    	 t                      }|                     d          s't          j        d                    |                     | dd                              dd          ^}}|| dd          k    r't          j        d                    |                     d                    |          }t          |          dk    rW|d         t          v rH|d         t          v r9|	                    d          dk     r |                    dd          ^}}|dz   |z   }t          |                                          dk    r,|j
                            t          j        d	                     | |_        d                    |          } 	 t          j        d|z   dz             \  }}}	}
n<# t           t"          f$ r( t%          d
                    |j                            w xY w||_        |	|_        |j
                            |
           |r|d         t,          v r(t/          |          \  }}|                    |           9t1          |d          ^}}t3          ||          }t5          |           |                    |           d                    |          }|| r;| d         t,          vr,|j
                            t          j        d                     || fS )N=?z"expected encoded word but found {}r   z?=r   r'   r   ?zwhitespace inside encoded wordz!encoded word format invalid: '{}'z.missing trailing whitespace after encoded-word)r   
startswithr   HeaderParseErrorr6   r  r0   r   r   countr!   r   rs  r   _ewrw  
ValueErrorKeyErrorr  r   r   rI   WSPr  r  r  r  )r   terminal_typeewrB  r  remstrrestr  r   r   r!   rK   charsr  s                 r   get_encoded_wordr    s    
BD!! @%077>>@ @ 	@ABBioodA..OC)
eABBi%077>>@ @ 	@WWYFFaq	Yq	Y		#!<<a00yDj4
399;;!

&4,. . 	/ 	/ 	/BFGGIE@'*z$*t2C'D'D$gtWW! @ @ @/66rv>>@ @ 	@@ BJBGJg
 	"7c>>!$--KE4IIe)$22	e]33
		%wwy!!  	"  ?q$$

&4<> > 	? 	? 	?u9s   F. .9G'c                    	 t                      }| r| d         t          v r(t          |           \  }} |                    |           :d}|                     d          r	 t          | d          \  }} d}t          |          dk    r?|d         j        dk    r.|j                            t          j
        d                     d}|r=t          |          d	k    r*|d
         j        dk    rt          |d         d          |d<   |                    |           # t          $ r d}Y nt          j        $ r Y nw xY wt          | d	          ^}}|r1t                              |          r|                     d          ^}}t%          |d          }t'          |           |                    |           d                    |          } | |S )Nr   Tr  utextr   r  z&missing whitespace before encoded wordFr   r   r'   )rt   r  r  r   r  r  r   r\   r!   r   rs  r  r  r  r  rfc2047_matchersearch	partitionr  r  r0   )r   ru   rK   valid_ewhave_wsrB  r  r  s           r   get_unstructuredr  K  s)   , )**L
 (#8s??"5>>LE5&&&D!! 	/w??u |$$q((#B'2e;;$,33F4ND5F 5F G G G"' 5s<00144#B'2nDD+?(,e,5 ,5R(##E***% # ! ! ! *    " (q11i  	4..s33 	4#ood33OC)c7++E"""	""Q  (#R s   "D D>-D>=D>c                 r    	 t          | d          \  }} }t          |d          }t          |           || fS )Nz()rH  )r  r  r  r   rH  _s      r   get_qp_ctextr    sE    
 -UD99OE5!ug..EE%<r   c                 r    	 t          | d          \  }} }t          |d          }t          |           || fS )Nr   rH  )r  r  r  r  s      r   get_qcontentr    sE     -UC88OE5!%))EE%<r   c                    	 t          |           }|s't          j        d                    |                     |                                }| t          |          d          } t          |d          }t          |           || fS )Nzexpected atext but found '{}'atext)_non_atom_end_matcherr   r  r6   r   r   r  r  )r   mr  s      r   	get_atextr    s    
 	e$$A ;%+22599; ; 	;GGIIE#e**++E%))EE%<r   c                    	 | d         dk    r't          j        d                    |                     t                      }| dd          } | r3| d         dk    r't	          |           \  }} |                    |           | r/| d         dk    r"| d         t          v rt          |           \  }} n| d d         dk    rd}	 t          |           \  }} |j	                            t          j
        d                     d	}n'# t           j        $ r t	          |           \  }} Y nw xY w|rNt          |          dk    r;|d
         j        dk    r*|d         j        dk    rt          |d
         d          |d
<   nt	          |           \  }} |                    |           | r| d         dk    "| s0|j	                            t          j
        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  r6   r   r  r   r  r  r  r!   rs  r   r\   r  )r   bare_quoted_stringrK   r  s       r   get_bare_quoted_stringr    sJ    Qx3%*11%88: : 	:)++!""IE )qS#E**u!!%(((
 )E!HOO8s??"5>>LE552A2Y$H3/66u"*11&2L739 39 : : :* 3 3 3+E22uuu3  7C 233a77&r*5>>*2.9^KK-A*2..7 .7&r* (..LE5!!%(((+  )E!HOO,  )"))&*D0+2 +2 	3 	3 	3!5((uQRRy((s   A D !D*)D*c                 "   	 | r3| d         dk    r't          j        d                    |                     t                      }| dd          } | r| d         dk    rv| d         t          v rt          |           \  }} n1| d         dk    rt          |           \  }} nt          |           \  }} |                    |           | r| d         dk    v| s0|j	                            t          j
        d                     || fS || dd          fS )Nr   r   zexpected '(' but found '{}'r   r   zend of header inside comment)r   r  r6   r   r  r  get_commentr  r   r!   rs  )r   rp   rK   s      r   r  r    s7   
  9qS%)00779 9 	9iiG!""IE
 E!HOO8s??"5>>LE551X__&u--LE55'..LE5u  E!HOO  v9* ,  , 	- 	- 	-~E!""Ir   c                     	 t                      }| ri| d         t          v rZ| d         t          v rt          |           \  }} nt	          |           \  }} |                    |           | r| d         t          v Z|| fS rA   )r   CFWS_LEADERr  r  r  r   )r   r   rK   s      r   get_cfwsr    s     ::D
 E!H++8s??"5>>LE55&u--LE5E  E!H++ ;r   c                 V   	 t                      }| r6| d         t          v r't          |           \  }} |                    |           t	          |           \  }} |                    |           | r6| d         t          v r't          |           \  }} |                    |           || fS rA   )r   r  r  r   r  )r   quoted_stringrK   s      r   get_quoted_stringr    s     !NNM $q[((uU###)%00LE5 $q[((uU###%r   c                 f   	 t                      }| r6| d         t          v r't          |           \  }} |                    |           | r6| d         t          v r't          j        d                    |                     |                     d          r;	 t          |           \  }} n9# t
          j        $ r t          |           \  }} Y nw xY wt          |           \  }} |                    |           | r6| d         t          v r't          |           \  }} |                    |           || fS )Nr   zexpected atom but found '{}'r  )r   r  r  r   	ATOM_ENDSr   r  r6   r  r  r  )r   r   rK   s      r   get_atomr
  !  sN    66D q[((uE :qY&&%*11%88: : 	: (	,+E22LE55& 	, 	, 	, %U++LE555	,
 !''uKK q[((uE;s   B) )!CCc                     	 t                      }| r| d         t          v r't          j        d                    |                     | ry| d         t          vrjt          |           \  }} |                    |           | r0| d         dk    r$|                    t                     | dd          } | r| d         t          vj|d         t          u r*t          j        d                    d| z                       || fS )Nr   z8expected atom at a start of dot-atom-text but found '{}'r	   r   r   z4expected atom at end of dot-atom-text but found '{}')r  r	  r   r  r6   r  r   r>  )r   dot_atom_textrK   s      r   get_dot_atom_textr  <  s     MMM :E!H	))% '++16%==: : 	:
 E!HI-- ''uU### 	U1X__  %%%!""IE  E!HI-- RC% '#VCI..0 0 	0%r   c                    	 t                      }| d         t          v r't          |           \  }} |                    |           |                     d          r;	 t          |           \  }} n9# t          j        $ r t          |           \  }} Y nw xY wt          |           \  }} |                    |           | r6| d         t          v r't          |           \  }} |                    |           || fS )Nr   r  )	r  r  r  r   r  r  r   r  r  )r   dot_atomrK   s      r   get_dot_atomr  O  s   
 yyHQx;u 0	4+E22LE55& 	4 	4 	4 -U33LE555	4
 )//uOOE q[((uU?s   A/ /!BBc                 b   	 | d         t           v rt          |           \  }} nd }| st          j        d          | d         dk    rt	          |           \  }} nH| d         t
          v r't          j        d                    |                     t          |           \  }} ||g|d d<   || fS )Nr   z5Expected 'atom' or 'quoted-string' but found nothing.r   z1Expected 'atom' or 'quoted-string' but found '{}')r  r  r   r  r  SPECIALSr6   r
  )r   leaderrK   s      r   get_wordr  h  s     Qx;  E%CE E 	EQx}}(//uu	qX		% '77=ve}}F F 	F  uHbqb	%<r   c                    	 t                      }	 t          |           \  }} |                    |           nA# t          j        $ r/ |j                            t          j        d                     Y nw xY w| r
| d         t          vr| d         dk    rQ|                    t                     |j                            t          j	        d                     | dd          } n	 t          |           \  }} nd# t          j        $ rR | d         t          v r?t          |           \  }} |j                            t          j	        d                     n Y nw xY w|                    |           | r| d         t          v|| fS )Nzphrase does not start with wordr   r	   zperiod in 'phrase'r   zcomment found without atom)rx   r  r   r   r  r!   rs  PHRASE_ENDSr>  ObsoleteHeaderDefectr  r  )r   ry   rK   s      r   
get_phraser    s   
 XXF0ue" 0 0 0f8-/ / 	0 	0 	0 	0 	00  !E!HK//8S==MM#N!!&"=$#& #& ' ' '!""IEE'uu*   8{**#+E??LE5N))&*E4+6 +6 7 7 7 7 7 7 MM%   !  !E!HK//" 5=s"   '9 ;A76A7*C= =AEEc                    	 t                      }d }| d         t          v rt          |           \  }} | s't          j        d                    |                     	 t          |           \  }} nh# t          j        $ rV 	 t          |           \  }} n?# t          j        $ r- | d         dk    r| d         t          v r t                      }Y nw xY wY nw xY w||g|d d<   |
                    |           | r| d         dk    s| d         t          vrt          t          |          | z             \  }} |j        dk    r-|j        
                    t          j        d                     n,|j        
                    t          j        d                     ||d<   	 |j                            d           n<# t&          $ r/ |j        
                    t          j        d                     Y nw xY w|| fS )	Nr   z"expected local-part but found '{}'r   invalid-obs-local-partz<local-part is not dot-atom, quoted-string, or obs-local-partz,local-part is not a dot-atom (contains CFWS)asciiz)local-part contains non-ASCII characters))r:  r  r  r   r  r6   r  r  r  r   r   get_obs_local_partr   r\   r!   rs  r  r   encodery  NonASCIILocalPartDefect)r   r   r  rK   obs_local_parts        r   get_local_partr     sl    JFQx;  @%077>>@ @ 	@ #E**uu"      	 #E??LE55& 	  	  	 Qx4E!H$;$;KKEEE	   Hbqb	e '%(D..E!HK$?$? 23z??U3J K K$(@@@%%f&@N'P 'P Q Q Q Q %%f&A>'@ '@ A A A&
1>(((( > > >!!&"@;#= #= 	> 	> 	> 	> 	>> usH   A0 0C BC9CCCCC F; ;6G43G4c                     	 t                      }d}| r| d         dk    s| d         t          vr| d         dk    rU|r,|j                            t	          j        d                     |                    t                     d}| dd          } | d         dk    rb|                    t          | d         d                     | dd          } |j                            t	          j        d	                     d}|r=|d
         j        dk    r,|j                            t	          j        d                     	 t          |           \  }} d}n7# t          j
        $ r% | d         t          vr t          |           \  }} Y nw xY w|                    |           | r| d         dk    | d         t          v|d         j        dk    s"|d         j        dk    r=|d         j        dk    r,|j                            t	          j        d                     |d
         j        dk    s"|d
         j        dk    r=|d         j        dk    r,|j                            t	          j        d                     |j        rd|_        || fS )NFr   r   r	   zinvalid repeated '.'Tr   misplaced-specialz/'\' character outside of quoted-string/ccontentr   r=  zmissing '.' between wordsr   z!Invalid leading '.' in local partr  z"Invalid trailing '.' in local partr  )r1  r  r!   r   r   rs  r>  r  r\   r  r  r  r  )r   r  last_non_ws_was_dotrK   s       r   r  r    s   !^^N
 %U1Xt^^uQx{'B'B8s??" -&--f.H*/, /, - - -!!#&&&"&!""IE1Xt^^!!-a0C#E #E F F F!""IE"))&*DB+D +D E E E"' 	.nR0;uDD"))&*D++- +- . . .	+#E??LE5"'& 	+ 	+ 	+Qx{**#E??LE555	+ 	e$$$7  %U1Xt^^uQx{'B'B8 	q$--1(&001(%//%%f&@/'1 '1 	2 	2 	2r%..2)6112)500%%f&@0'2 '2 	3 	3 	3 =$<!5  s    E 1F	F	c                     	 t          | d          \  }} }t          |d          }|r,|j                            t	          j        d                     t          |           || fS )Nz[]rH  z(quoted printable found in domain-literal)r  r  r!   r   r   r  r  )r   rH  r  s      r   	get_dtextr%    sz    
 2%>>E5&%))E 9V868 8 	9 	9 	9E%<r   c                     | rdS |                     t          j        d                     |                     t          dd                     dS )NFz"end of input inside domain-literal]domain-literal-endT)r   r   rs  r  )r   domain_literals     r   _check_for_early_dl_endr*    s]     u&4,. . / / /--ABBCCC4r   c                 N   	 t                      }| d         t          v r't          |           \  }} |                    |           | st	          j        d          | d         dk    r't	          j        d                    |                     | dd          } t          | |          r|| fS |                    t          dd                     | d         t          v r't          |           \  }} |                    |           t          |           \  }} |                    |           t          | |          r|| fS | d         t          v r't          |           \  }} |                    |           t          | |          r|| fS | d         dk    r't	          j        d                    |                     |                    t          dd	                     | dd          } | r6| d         t          v r't          |           \  }} |                    |           || fS )
Nr   zexpected domain-literal[z6expected '[' at start of domain-literal but found '{}'r   zdomain-literal-startr'  z4expected ']' at end of domain-literal but found '{}'r(  )rE  r  r  r   r   r  r6   r*  r  r  r  r%  )r   r)  rK   s      r   get_domain_literalr-  "  s;    #__NQx;ue$$$ A%&?@@@Qx3% '!!'0 0 	0!""IEun55 %u$$--CDDEEEQx3u~~ue$$$U##LE5%   un55 %u$$Qx3u~~ue$$$un55 %u$$Qx3% '!!'0 0 	0--ABBCCC!""IE %q[((ue$$$5  r   c                    	 t                      }d }| d         t          v rt          |           \  }} | s't          j        d                    |                     | d         dk    r5t          |           \  }} ||g|d d<   |                    |           || fS 	 t          |           \  }} n'# t          j        $ r t          |           \  }} Y nw xY w| r | d         dk    rt          j        d          ||g|d d<   |                    |           | r| d         dk    r|j
                            t          j        d                     |d         j        dk    r|d         |d d <   | rc| d         dk    rW|                    t                     t          | d	d                    \  }} |                    |           | r| d         dk    W|| fS )
Nr   zexpected domain but found '{}'r,  r+  zInvalid Domainr	   z(domain is not a dot-atom (contains CFWS)r  r   )r  r  r  r   r  r6   r-  r   r  r
  r!   r  r\   r>  )r   r   r  rK   s       r   
get_domainr/  I  s    XXFFQx;  <%,33E::< < 	<Qx3)%00uE"1"Ieu}'#E**uu" ' ' 'uuu' 8qS%&6777Hbqb	
MM% !qSf968 8 	9 	9 	9!9:--q	F111I 	!aCMM##E!""I..LE5MM%     	!aC 5=s   B1 1!CCc                    	 t                      }t          |           \  }} |                    |           | r| d         dk    r0|j                            t	          j        d                     || fS |                    t          dd                     t          | dd                    \  }} |                    |           || fS )Nr   r+  z#addr-spec local part with no domainaddress-at-symbolr   )r#  r   r   r!   r   rs  r  r/  )r   r   rK   s      r   get_addr_specr2  o  s     

I!%((LE5U  E!HOO  !;1"3 "3 	4 	4 	4%]3(;<<===eABBi((LE5Uer   c                    	 t                      }| r| d         dk    s| d         t          v r| d         t          v r(t          |           \  }} |                    |           n0| d         dk    r$|                    t                     | dd          } | r| d         dk    u| d         t          v | r| d         dk    r't          j        d                    |                     |                    t                     t          | dd                    \  }} |                    |           | r| d         dk    r|                    t                     | dd          } | sn| d         t          v r't          |           \  }} |                    |           | d         dk    rI|                    t                     t          | dd                    \  }} |                    |           | r| d         dk    | st          j        d          | d         dk    r't          j        d                    |                     |                    t          dd	                     || dd          fS )
Nr   r  r   r+  z(expected obs-route domain but found '{}'z%end of header while parsing obs-route:z4expected ':' marking end of obs-route but found '{}'zend-of-obs-route-marker)r  r  r  r   ListSeparatorr   r  r6   RouteComponentMarkerr/  r  )r   	obs_routerK   s      r   get_obs_router8    s    

I
 U1Xs]]eAh+&=&=8{""#E??LE5U####1X__]+++!""IE  U1Xs]]eAh+&=&=  FE!HOO%6==eDDF F 	F)***eABBi((LE5U
 $E!HcMM'''abb	 	8{""#E??LE5U###8s??1222%eABBi00LE5U###  $E!HcMM  O%&MNNNQx3% (''-ve}}6 6 	6]3(ABBCCCeABBir   c                 (   	 t                      }| d         t          v r't          |           \  }} |                    |           | r| d         dk    r't	          j        d                    |                     |                    t          dd                     | dd          } | d         dk    r]|                    t          dd                     |j                            t	          j	        d                     | dd          } || fS 	 t          |           \  }} n# t          j        $ r 	 t          |           \  }} |j                            t	          j        d	                     n:# t          j        $ r( t	          j        d
                    |                     w xY w|                    |           t          |           \  }} Y nw xY w|                    |           | r| d         dk    r| dd          } n,|j                            t	          j	        d                     |                    t          dd                     | r6| d         t          v r't          |           \  }} |                    |           || fS )Nr   <z"expected angle-addr but found '{}'zangle-addr-startr   >zangle-addr-endznull addr-spec in angle-addrz*obsolete route specification in angle-addrz.expected addr-spec or obs-route but found '{}'z"missing trailing '>' on angle-addr)r   r  r  r   r   r  r6   r  r!   rs  r2  r8  r  )r   
angle_addrrK   s      r   get_angle_addrr=    s    JQx;u%    @E!HOO%077>>@ @ 	@mC);<<===!""IE Qx3--=>>???!!&"<*#, #, 	- 	- 	-abb	5  ,$U++uu" 	, 	, 	,	P(//LE5%%f&A<'> '> ? ? ? ?& 	P 	P 	P)@GGNNP P P	P 	%   $U++uuu	, e 3qSabb	!!&"<0#2 #2 	3 	3 	3mC)9::;;; !q[((u%   us*   D% %G5>E43G47F++*GGc                     	 t                      }t          |           \  }} |                    |d d                     |j        d d          |_        || fS r   )r3  r  rI   r!   )r   r   rK   s      r   get_display_namer?    s]     ==Le$$LE5aaa!!! =+Lr   c                 j   	 t                      }d }| d         t          v r;t          |           \  }} | s't          j        d                    |                    | d         dk    r| d         t          v r't          j        d                    |                     t          |           \  }} | s't          j        d                    |                    ||g|d         d d<   d }|                    |           t          |           \  }} ||g|d d<   |                    |           || fS )Nr   z!expected name-addr but found '{}'r:  )
r   r  r  r   r  r6   r  r?  r   r=  )r   	name_addrr  rK   s       r   get_name_addrrB    sf    

IFQx;  	D)3::6BBD D DQx38{"")3::5AAC C C'..u 	C)3::5AAC C C"8E!HRaRLF!%((LE5Hbqb	Uer   c                    	 t                      }	 t          |           \  }} nc# t          j        $ rQ 	 t	          |           \  }} n:# t          j        $ r( t          j        d                    |                     w xY wY nw xY wt          d |j        D                       rd|_        |	                    |           || fS )Nzexpected mailbox but found '{}'c              3   J   K   | ]}t          |t          j                  V  d S r   )r?  r   rs  r*   s     r   r-   zget_mailbox.<locals>.<genexpr>  sC       3 3 a344 3 3 3 3 3 3r   r   )
r  rB  r   r  r2  r6   anyr>   r\   r   )r   r   rK   s      r   get_mailboxrF    s   
 iiGA$U++uu" A A A	A(//LE55& 	A 	A 	A)188??A A A	A 5A  3 3 % 13 3 3 3 3 /.NN5E>&   $ BAB7A>>BBc                 ,   	 t                      }| r| d         |vrv| d         t          v r4|                    t          | d         d                     | dd          } n't	          |           \  }} |                    |           | r
| d         |vv|| fS )Nr   r"  r   )r  r  r   r  r  )r   r  invalid_mailboxrK   s       r   get_invalid_mailboxrJ    s     %&&O
 *E!HH,,8{""""=q1D$F $F G G G!""IEE%e,,LE5""5)))  *E!HH,, E!!r   c                    	 t                      }| rd| d         dk    rW	 t          |           \  }} |                    |           n}# t          j        $ rj d }| d         t
          v rt          |           \  }} | r
| d         dv rB|                    |           |j                            t          j        d                     nt          | d          \  }} ||g|d d<   |                    |           |j                            t          j
        d                     n| d         dk    r-|j                            t          j        d                     n^t          | d          \  }} ||g|d d<   |                    |           |j                            t          j
        d                     Y nw xY w| rm| d         dvrc|d         }d|_        t          | d          \  }} |                    |           |j                            t          j
        d                     | r0| d         dk    r$|                    t                     | d	d          } | r| d         dk    W|| fS )
Nr   ;z,;zempty element in mailbox-listzinvalid mailbox in mailbox-listr  r   r   r   )r   rF  r   r   r  r  r  r!   r  rJ  rs  r\   rI   r5  )r   mailbox_listrK   r  r   s        r   get_mailbox_listrN  *  s   
 ==L
 (E!HOO	8&u--LE5&&&&& 	8 	8 	8FQx;&& ( 
<aD 0 0 ''/// (//0K719 19 : : : : $7ud#C#CLE5)%+Hbqb	 ''... (//0J91; 1; < < < <qS$++F,G3-5 -5 6 6 6 6  35$??u%!'E"1"I##E***$++F,F5-7 -7 8 8 8/	82  	4U1XT)) #2&G!2G.ud;;LE5NN5!!! ''(B1)3 )3 4 4 4 	U1X__...!""IEQ  (E!HOOR s   'A
 
E7GGc                    	 t                      }| s0|j                            t          j        d                     || fS d }| r| d         t
          v r~t          |           \  }} | sE|j                            t          j        d                     |                    |           || fS | d         dk    r|                    |           || fS t          |           \  }} t          |j	                  dk    r\||                    |           |
                    |           |j                            t          j        d                     || fS ||g|d d<   |                    |           || fS )Nzend of header before group-listr   zend of header in group-listrL  zgroup-list with empty entries)r   r!   r   r   rs  r  r  rN  r   r   rI   r  )r   
group_listr  rK   s       r   get_group_listrQ  c  s    J !!!&"<-#/ #/ 	0 	0 	05  F %q[((  	% %%f&@-'/ '/ 0 0 0f%%%u$$8s??f%%%u$$#E**LE5
5""f%%%%   !!&"=+#- #- 	. 	. 	.5  Hbqb	eur   c                    	 t                      }t          |           \  }} | r| d         dk    r't          j        d                    |                     |                    |           |                    t          dd                     | dd          } | r;| d         dk    r/|                    t          dd                     || dd          fS t          |           \  }} |                    |           | s-|j                            t          j	        d                     n3| d         dk    r't          j        d	                    |                     |                    t          dd                     | dd          } | r6| d         t          v r't          |           \  }} |                    |           || fS )
Nr   r4  z8expected ':' at end of group display name but found '{}'zgroup-display-name-terminatorr   rL  zgroup-terminatorzend of header in groupz)expected ';' at end of group but found {})r   r?  r   r  r6   r   r  rQ  r!   rs  r  r  )r   r   rK   s      r   	get_grouprS    s    GGE#E**LE5 9E!HOO% '**0&--9 9 	9	LL	LLs$CDDEEE!""IE  qS]3(:;;<<<eABBi!%((LE5	LL GV7$& & 	' 	' 	' 	'	qS%7>>uEEG G 	G	LLs$677888!""IE q[((uU%<r   c                 @   	 t                      }	 t          |           \  }} nc# t          j        $ rQ 	 t	          |           \  }} n:# t          j        $ r( t          j        d                    |                     w xY wY nw xY w|                    |           || fS )Nzexpected address but found '{}')r   rS  r   r  rF  r6   r   )r   r   rK   s      r   get_addressrU    s      iiGA ''uu" A A A	A&u--LE55& 	A 	A 	A)188??A A A	A 5A NN5E>rG  c                    	 t                      }| rm	 t          |           \  }} |                    |           n# t          j        $ r}d }| d         t
          v rt          |           \  }} | r| d         dk    rC|                    |           |j                            t          j        d                     nt          | d          \  }} ||g|d d<   |                    t          |g                     |j                            t          j        d                     n| d         dk    r-|j                            t          j        d                     nlt          | d          \  }} ||g|d d<   |                    t          |g                     |j                            t          j        d                     Y d }~nd }~ww xY w| ru| d         dk    ri|d         d         }d|_        t          | d          \  }} |                    |           |j                            t          j        d                     | r$|                    t                     | dd          } | m|| fS )	Nr   r  z"address-list entry with no contentzinvalid address in address-listzempty element in address-listr   r   r   )r   rU  r   r   r  r  r  r!   r  rJ  r   rs  r\   rI   r5  )r   address_listrK   errr  r   s         r   get_address_listrY    s    ==L
 (	8&u--LE5&&&&& 	8 	8 	8FQx;&& ( 
<aC ''/// (//0K<1> 1> ? ? ? ? $7uc#B#BLE5)%+Hbqb	 ''(8(8999 (//0J91; 1; < < < <qS$++F,G3-5 -5 6 6 6 6  35#>>u%!'E"1"I##GUG$4$4555$++F,F5-7 -7 8 8 8/	82  	4U1X__ #2&q)G!2G.uc::LE5NN5!!! ''(B1)3 )3 4 4 4 	...!""IEQ  (R s   '= GFGGc                 H   	 t                      }| s't          j        d                    |                     | d         dk    r't          j        d                    |                     |                    t          dd                     | dd          } t          |           \  }} |                    |           | r| d         dk    r't          j        d                    |                     |                    t          dd	                     || dd          fS )
Nz'expected no-fold-literal but found '{}'r   r,  z;expected '[' at the start of no-fold-literal but found '{}'zno-fold-literal-startr   r'  z9expected ']' at the end of no-fold-literal but found '{}'zno-fold-literal-end)r!  r   r  r6   r   r  r%  )r   no_fold_literalrK   s      r   get_no_fold_literalr\    s4   #ooO E%5<<UCCE E 	EQx3%#VE]], , 	, =.EFFGGG!""IEU##LE55!!! ,E!HOO%#VE]], , 	, =.CDDEEEE!""I%%r   c                 (   	 t                      }| r6| d         t          v r't          |           \  }} |                    |           | r| d         dk    r't	          j        d                    |                     |                    t          dd                     | dd          } 	 t          |           \  }} n# t          j        $ r} 	 t          |           \  }} |j
                            t	          j        d                     n:# t          j        $ r( t	          j        d                    |                     w xY wY nw xY w|                    |           | r| d         dk    rk|j
                            t	          j        d	                     | r9| d         d
k    r-|                    t          d
d                     | dd          } || fS |                    t          dd                     | dd          } 	 t          |           \  }} n# t          j        $ r 	 t          |           \  }} n# t          j        $ r}	 t          |           \  }} |j
                            t	          j        d                     n:# t          j        $ r( t	          j        d                    |                     w xY wY d }~nd }~ww xY wY nw xY w|                    |           | r| d         d
k    r| dd          } n,|j
                            t	          j        d                     |                    t          d
d                     | r6| d         t          v r't          |           \  }} |                    |           || fS )Nr   r:  zexpected msg-id but found '{}'zmsg-id-startr   zobsolete id-left in msg-idz4expected dot-atom-text or obs-id-left but found '{}'r+  zmsg-id with no id-rightr;  z
msg-id-endr1  zobsolete id-right in msg-idzFexpected dot-atom-text, no-fold-literal or obs-id-right but found '{}'zmissing trailing '>' on msg-id)r  r  r  r   r   r  r6   r  r  r  r!   r  rs  r\  r/  )r   msg_idrK   es       r   
get_msg_idr`    s   
 WWF q[((ue <E!HOO%,33E::< < 	<
MM-^44555!""IE1(//uu" 	1 	1 	1	1-e44LE5N!!&"=,#. #. / / / /& 	1 	1 	1)""(&--1 1 1	1/ /		1 MM% 	E!HOOf8%' ' 	( 	( 	(
  	U1X__MM-\::;;;!""IEu}
MM-%899:::!""IE5(//uu" 5 5 5
	5.u55LE55& 	5 	5 	55)%00u%%f&A1'3 '3 4 4 4 4* 5 5 5-&&,fUmm5 5 554 4 4 4 4	55 MM% /qSabb	f8,. . 	/ 	/ 	/
MM-\22333 q[((ue5=sx   +B> >E
>DE
7EE
	E
	H K,H?>K?K>JK7KKKKKKc                    	 t                      }	 t          |           \  }} |                    |           | r?|j                            t	          j        d                    |                                ny# t          j        $ rg}t          |           }t          |          }|j                            t	          j        d                    |                               Y d }~nd }~ww xY w|S )NzUnexpected {!r}zInvalid msg-id: {!r})
r  r`  r   r!   r   rs  r6   r  r  r  )r   
message_idrK   exs       r   parse_message_idrd  U  s#   J2!%((u%     	2%%f&@!((//'1 '1 2 2 2 " K K K ''%e,,
!!&'='D'DR'H'HII	K 	K 	K 	K 	K 	K 	K 	KK s   'A: :C0	AC++C0c                    	 t                      }| s.|j                            t          j        d                     |S | d         t
          v rUt          |           \  }} |                    |           | s,|j                            t          j        d                     d}| rM| d         dk    rA| d         t
          vr2|| d         z  }| dd          } | r| d         dk    r| d         t
          v2|                                sc|j                            t          j        d	                    |                               |                    t          |d                     n7t          |          |_        |                    t          |d	                     | r6| d         t
          v r't          |           \  }} |                    |           | r| d         dk    rZ|j        ,|j                            t          j        d
                     | r#|                    t          | d                     |S |                    t          dd                     | dd          } | r6| d         t
          v r't          |           \  }} |                    |           | s5|j        ,|j                            t          j        d
                     |S d}| r5| d         t
          vr&|| d         z  }| dd          } | r| d         t
          v&|                                sc|j                            t          j        d	                    |                               |                    t          |d                     n7t          |          |_        |                    t          |d	                     | r6| d         t
          v r't          |           \  }} |                    |           | rO|j                            t          j        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)rK  r!   r   r   HeaderMissingRequiredValuer  r  isdigitrs  r6   r  intrL  rM  )r   mime_versionrK   rf  s       r   parse_mime_versionrk  q  s   
 ==L ##F$E3%5 %5 	6 	6 	6Qx;uE""" 	E ''(IB)D )D E E EF
 E!HOOa(C(C%(abb	  E!HOOa(C(C >> =##F$>?FFvNN%P %P 	Q 	Q 	QM&'::;;;; [[M&(;;<<< #q[((uE""" E!HOO) ''(BB)D )D E E E 	?eW = =>>>c+>??@@@!""IE #q[((uE""" ) ''(BB)D )D E E EF
 E!HK//%(abb	  E!HK// >> =##F$>?FFvNN%P %P 	Q 	Q 	QM&'::;;;; [[M&(;;<<< #q[((uE""" ;##F$>5%7 %7 	8 	8 	8M%99:::r   c                 4   	 t                      }| r| d         dk    rx| d         t          v r4|                    t          | d         d                     | dd          } n't	          |           \  }} |                    |           | r| d         dk    x|| fS )Nr   rL  r"  r   )rZ  r  r   r  r  )r   invalid_parameterrK   s      r   get_invalid_parameterrn    s     )**
 ,E!HOO8{""$$]583F&H &H I I I!""IEE%e,,LE5$$U+++  ,E!HOO e##r   c                    	 t          |           }|s't          j        d                    |                     |                                }| t          |          d          } t          |d          }t          |           || fS )Nzexpected ttext but found '{}'ttext)_non_token_end_matcherr   r  r6   r   r   r  r  )r   r  rp  s      r   	get_ttextrr    s     	u%%A ;%+22599; ; 	;GGIIE#e**++E%))EE%<r   c                    	 t                      }| r6| d         t          v r't          |           \  }} |                    |           | r6| d         t          v r't          j        d                    |                     t          |           \  }} |                    |           | r6| d         t          v r't          |           \  }} |                    |           || fS Nr   zexpected token but found '{}')	r   r  r  r   
TOKEN_ENDSr   r  r6   rr  )r   mtokenrK   s      r   	get_tokenrw    s     WWF q[((ue ;qZ''%+22599; ; 	;U##LE5
MM% q[((ue5=r   c                    	 t          |           }|s't          j        d                    |                     |                                }| t          |          d          } t          |d          }t          |           || fS )Nz expected attrtext but found {!r}r`  )_non_attribute_end_matcherr   r  r6   r   r   r  r  r   r  r`  s      r   get_attrtextr{    s     	#5))A >%.55e<<> > 	>wwyyH#h--..!EXz22HHU?r   c                    	 t                      }| r6| d         t          v r't          |           \  }} |                    |           | r6| d         t          v r't          j        d                    |                     t          |           \  }} |                    |           | r6| d         t          v r't          |           \  }} |                    |           || fS rt  )	r]  r  r  r   ATTRIBUTE_ENDSr   r  r6   r{  r   r^  rK   s      r   get_attributer  	  s     I  q[((u ;q^++%+22599; ; 	;&&LE5U  q[((uer   c                    	 t          |           }|s't          j        d                    |                     |                                }| t          |          d          } t          |d          }t          |           || fS )Nz)expected extended attrtext but found {!r}extended-attrtext)#_non_extended_attribute_end_matcherr   r  r6   r   r   r  r  rz  s      r   get_extended_attrtextr  	  s     	,E22A G%7>>uEEG G 	GwwyyH#h--..!EX':;;HHU?r   c                    	 t                      }| r6| d         t          v r't          |           \  }} |                    |           | r6| d         t          v r't          j        d                    |                     t          |           \  }} |                    |           | r6| d         t          v r't          |           \  }} |                    |           || fS rt  )	r]  r  r  r   EXTENDED_ATTRIBUTE_ENDSr   r  r6   r  r~  s      r   get_extended_attributer  -	  s     I  q[((u ;q444%+22599; ; 	;(//LE5U  q[((uer   c                    	 t                      }| r| d         dk    r't          j        d                    |                     |                    t          dd                     | dd          } | r| d                                         s't          j        d                    |                     d}| rK| d                                         r1|| d         z  }| dd          } | r| d                                         1|d         dk    r2|dk    r,|j                            t          j        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 0rf  )rd  r   r  r6   r   r  rh  r!   rs  ri  rT  )r   re  rf  s      r   get_sectionr  C	  s    iiG 0E!HOO%&E&L&L(-'/ '/ 0 0 	0NN=&677888!""IE @a((** @% '117@ @ 	@F
 E!H$$&& %(abb	  E!H$$&&  ayCFcMMv99 ;  ; 	< 	< 	<[[GNNN=22333E>r   c                    	 t                      }| st          j        d          d }| d         t          v rt	          |           \  }} | s't          j        d                    |                    | d         dk    rt          |           \  }} nt          |           \  }} ||g|d d<   |                    |           || fS )Nz&Expected value but found end of stringr   z Expected value but found only {}r   )	rg  r   r  r  r  r6   r  r  r   )r   vr  rK   s       r   	get_valuer  a	  s     	A P%&NOOOFQx;  @% '006v@ @ 	@Qx3(//uu-e44uHbqb	HHUOOOe8Or   c                 T   	 t                      }t          |           \  }} |                    |           | r| d         dk    rC|j                            t	          j        d                    |                               || fS | d         dk    r	 t          |           \  }} d|_        |                    |           n# t          j	        $ r Y nw xY w| st	          j	        d          | d         dk    r4|                    t          dd                     | dd          } d|_        | d         d	k    rt	          j	        d
          |                    t          d	d                     | dd          } d }| r6| d         t          v r't          |           \  }} |                    |           d }|}|j        r| r| d         dk    rt          |           \  }}|j        }d}|j        dk    r4|r|d         dk    rd}nBt#          |          \  }}	|	r|	d         dk    rd}n	 t%          |          \  }}	|	sd}n#  Y nxY w|r_|j                            t	          j        d                     |                    |           |D ]}
|
j        dk    rg |
d d <   |
} n|} n.d }|j                            t	          j        d                     | r| d         dk    rd }nt)          |           \  }} |j        r|j        dk    rW| r| d         dk    r|                    |           ||} || fS |j                            t	          j        d                     | sI|j                            t	          j        d                     |                    |           ||| fS nC|>|D ]}
|
j        dk    r n|
j        dk     |                    |
           |
j        |_        | d         dk    r't	          j	        d                    |                     |                    t          dd                     | dd          } | rt| d         dk    rht#          |           \  }} |                    |           |j        |_        | r| d         dk    r't	          j	        d                    |                     |                    t          dd                     | dd          } |t1                      }| rr| d         t2          v rt5          |           \  }} n9| d         dk    rt          dd          }| dd          } nt7          |           \  }} |                    |           | r|}nt)          |           \  }} |                    |           ||} || fS )Nr   rL  z)Parameter contains name ({}) but no valuer  TzIncomplete parameterzextended-parameter-markerr   =zParameter not followed by '='parameter-separatorr   F'z5Quoted string value for extended parameter is invalidr   zZParameter marked as extended but appears to have a quoted string value that is non-encodedzcApparent initial-extended-value but attribute was not marked as extended or was not initial sectionz(Missing required charset/lang delimitersr  r`  z=Expected RFC2231 char/lang encoding delimiter, but found {!r}zRFC2231-delimiterz;Expected RFC2231 char/lang encoding delimiter, but found {}DQUOTE)rO  r  r   r!   r   rs  r6   r  rS  r  r  rX  r  r  r  r   rU  r{  r  r\   r  r   r   r   rg  r  r  r  )r   r  rK   r  r  appendtoqstringinner_value
semi_validr  tr  s               r   get_parameterr  w	  s    KKE ''LE5	LL E!HOOV7 9%%+VE]]4 4 	5 	5 	5e|Qx3	&u--LE5"EOLL& 	 	 	D	 	B)*@AAA8s??LLs,GHHIII!""IE!ENQx3%&EFFF	LLs$9::;;;!""IEF q[((uUIH~ $<% $<E!HOO /u55,
1$$ &{1~44!

*;77t &DGsNN!%J&3K@@t  &!%J	  	<M  !;G"I "I J J JLL!!!  <#777AaaaD HE 8  EEIM  !;:"; "; < < <  (qS ''u> 	FU1A55 	 aCOOE"""$!%<V7DE E 	F 	F 	F  V768 8 	9 	9 	9%<    <#666E 7LJ&&OOAGEM8s??) +FFLfUmmU U Uc+>??@@@abb	 	KU1X__'..LE5OOE"""EJ KE!HOO- /<<BF5MMK K Kc+>??@@@abb	GG 	Qx3&u~~uuqS%c844abb	+E22uHHUOOO  	  ''uOOE%<s   .C CC-I Ic                 $   	 t                      }| r	 t          |           \  }} |                    |           n# t          j        $ r}d }| d         t
          v rt          |           \  }} | s|                    |           |cY d }~S | d         dk    rD||                    |           |j                            t          j        d                     npt          |           \  }} |r|g|d d<   |                    |           |j                            t          j        d
                    |                               Y d }~nd }~ww xY w| r| d         dk    ru|d         }d|_        t          |           \  }} |                    |           |j                            t          j        d
                    |                               | r-|                    t          dd                     | d	d          } | |S )
Nr   rL  zparameter entry with no contentzinvalid parameter {!r}r   r[  z)parameter with invalid trailing text {!r}r  r   )rj  r  r   r   r  r  r  r!   rs  rn  r6   r\   rI   r  )r   mime_parametersrK   rX  r  r  s         r   parse_mime_parametersr  
  sl    %&&O
 #	=(//LE5""5))))& 	= 	= 	=FQx;&& ( '&&v...&&&&&&&Qx3%#**6222'..v/I507 07 8 8 8 8  5U;;u )!'E"1"I&&u---'..v/I,33E::0< 0< = = =#	=&  	LU1X__ $B'E2E077LE5LL#**6+E;BB5II,K ,K L L L 	""=6K#L#LMMM!""IEG  #H s"   '= E;EEC EEc                    	 |r|d         dk    rx|d         t           v r4|                     t          |d         d                     |dd          }n't          |          \  }}|                     |           |r|d         dk    x|sd S |                     t          dd                     |                     t	          |dd                               d S )Nr   rL  r"  r   r  )r  r   r  r  r  )	tokenlistr   rK   s      r   _find_mime_parametersr  9
  s      $E!HOO8{""]585HIIJJJ!""IEE%e,,LE5U###  $E!HOO  ]3(=>>???*595566666r   c                    	 t                      }d}| s.|j                            t          j        d                     |S 	 t          |           \  }} nf# t          j        $ rT |j                            t          j        d                    |                                t          ||            |cY S w xY w|                    |           | r| d         dk    r@|j                            t          j        d                     | rt          ||            |S |j
                                                                        |_        |                    t          dd                     | dd          } 	 t          |           \  }} nf# t          j        $ rT |j                            t          j        d	                    |                                t          ||            |cY S w xY w|                    |           |j
                                                                        |_        | s|S | d         d
k    rU|j                            t          j        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}rL  z<Only parameters are valid after content type, but found {!r}r  )r  r!   r   r   rg  rw  r  rs  r6   r  r   rp  lowerr  r  r  r  )r   ctyperecoverrK   s       r   parse_content_type_headerr  I
  s    MMEG V>02 2 	3 	3 	3 ''uu"   V76==eDDF F 	G 	G 	GeU+++	
 
LL  E!HOOV7"$ $ 	% 	% 	% 	0!%///[&&((..00EN	LLs$<==>>>!""IE ''uu"   V75<<UCCE E 	F 	F 	FeU+++	
 
LLK%%''--//EM Qx3V7( ( 	) 	) 	) NEMeU+++	LLs$9::;;;	LL&uQRRy11222Ls&   A A B98B9=F A G32G3c                 ^   	 t                      }| s.|j                            t          j        d                     |S 	 t          |           \  }} nf# t          j        $ rT |j                            t          j        d                    |                                t          ||            |cY S w xY w|                    |           |j
                                                                        |_        | s|S | d         dk    rQ|j                            t          j        d                    |                                t          ||            |S |                    t          dd                     |                    t          | dd                               |S )NzMissing content dispositionz+Expected content disposition but found {!r}r   rL  zCOnly parameters are valid after content disposition, but found {!r}r  r   )r  r!   r   r   rg  rw  r  rs  r6   r  r   rp  r  r  r  r  )r   disp_headerrK   s      r    parse_content_disposition_headerr  
  s    %&&K ""6#D)$+ $+ 	, 	, 	, ''uu"   ""6#=9@@GG$I $I 	J 	J 	Jk5111	
 u&+k&7&7&9&9&?&?&A&AK# Qx3""6#=$( $( 	) 	) 	) 	k5111}S*?@@AAA,U122Y77888s   A A B76B7c                    	 t                      }| s.|j                            t          j        d                     |S 	 t          |           \  }} |                    |           |j                                                                        |_	        nT# t          j
        $ rB |j                            t          j        d                    |                                Y nw xY w| s|S | r|j                            t          j        d                     | d         t          v r4|                    t          | d         d                     | dd          } n't          |           \  }} |                    |           | |S )Nz!Missing content transfer encodingz1Expected content transfer encoding but found {!r}z*Extra text after content transfer encodingr   r"  r   )r  r!   r   r   rg  rw  r   rp  r  r   r  rs  r6   r  r  r  )r   
cte_headerrK   s      r   &parse_content_transfer_encoding_headerr  
  s    )**J !!&"C/#1 #1 	2 	2 	25 ''u
 	%   **,,2244
 " P P P!!&"<?FFuMM#O #O 	P 	P 	P 	P 	PP  
 %!!&"<8#: #: 	; 	; 	;8{""mE!H6IJJKKK!""IEE%e,,LE5e$$$  % s   B AC*)C*c                     d}| r>| d         r6| d         d         t           v r!| d         d         }| d         d d         | d<   |S )Nr'   r   )r  )lineswsps     r   _steal_trailing_WSP_if_existsr  
  sS    
C #r #uRy}33Bim"IcrcNb	Jr   c                   	 |j         pt          j        }|j        rdnd}dg}d }d }d}d}t	          dd          }	t          |           }
|
r|
                    d          }||	u r|dz  }"t          |          }|s@|j        dv rt          
                    |           }nt          
                    |           }	 |                    |           |}n5# t          $ r( t          d	 |j        D                       rd
}nd}d}Y nw xY w|j        dk    rt!          ||||           |r|s|j        sd}d }|j        r|                    |          d t)          |j                            }|j        |vr_t)          |          |t)          |d                   z
  k    r$t-          |          }|                    |           |dxx         |z  cc<   t1          |d          st          |          |
z   }
d}|j        r;|||k    r|d
k    s|dk    r|dk    rd }t3          |||||j        |          }|}d}d }d}t)          |          |t)          |d                   z
  k    r|dxx         |z  cc<   7|j        rWt)          |          dz   |k    rAt-          |          }|s|                                r|                    ||z              d }t1          |d          srt          |          }|j        dk    r0t9          dd          gd |D             z   t9          dd          gz   }|j        s|dz  }|                    |	           ||
z   }
|j        r|s|
                    d|           d}:t-          |          }|s|                                r|                    ||z              n|dxx         |z  cc<   |
|j                            |          |j        z   S )Nutf-8rQ  r'   r   Fwrap_as_ew_blockedr   )rH  r  c              3   J   K   | ]}t          |t          j                  V  d S r   )r?  r   r{  r*   s     r   r-   z%_refold_parse_tree.<locals>.<genexpr>
  sC       . . a!>?? . . . . . .r   unknown-8bitTrk  rM   r   r  r   r   rH  c                 H    g | ]}t          t          |          d            S )rH  )r  r   )r+   ps     r   rr   z&_refold_parse_tree.<locals>.<listcomp>C  s;     ( ( ( ##4Q#7#7AA ( ( (r   )max_line_lengthsysmaxsizeutf8r  r  r5  r   r\   
SPECIALSNL
isdisjointNLSETr  ry  rE  r>   _fold_mime_parametersrE   rb   rQ   r   r  r  r   r]   _fold_as_ewrc   rB   r  insertr0   )
parse_treerN   maxlenro  r  last_ewlast_charsetr  want_encodingend_ew_not_allowedr  rF   tstrr   encoded_partnewlinenewpartss                    r   rO   rO   
  s    #2s{F +5ww:HDEGLM!"&:;;E
 syy||%%%!#4yy 	;"444$.$9$9$$?$? ? %*$4$4T$:$: :	!KK!!!GG! 	! 	! 	! . . ,. . . . . "( " MMM	! ?///!$vx@@@ )	&!3 )	&% ! %' 
!#'99F9#;#;<Qc&.>Q>Q=Q<Q#RL~\99|,,vE"I/FFF&CE&J&JG!LL111b			\1			 
 4** &T

U* %# & '|++!^33!W,,J1F1F"G%dE67&*&=wH H& %  % t99U2Y///"IIIIII   	D		A''3E::G $--// Wt^,,,tX&& 	DzzH"666
 #3001( (&( ( (( #30012 
 % 4"a'" 2333u$E 	&8 	 LLD!!! M/66 	d))++ 	LL4(((( "IIIIIIg  sh >u%%66s   >C /DDc                 z   	 |B|r@t          t          |d         |d          | z                       } |d         d |         |d<   | d         t          v r]| d         }| dd          } t          |d                   |k    r"|                    t          |                     |dxx         |z  cc<   d}| d         t          v r| d         }| d d         } |t          |d                   n|}|dk    rdn|}	t          |	          dz   }
|
dz   |k    rt          j        d          | r|t          |d                   z
  }||
z
  }|dk    r|                    d	           ;| d |         }t          j	        ||	
          }t          |          |z
  }|dk    r8|d d         }t          j	        ||	
          }t          |          |z
  }|dk    8|dxx         |z  cc<   | t          |          d          } | r*|                    d	           t          |d                   }| |dxx         |z  cc<   |r|nd S )Nr   r   r   r'   rQ  r     z3max_line_length is too small to fit an encoded wordrk   )r   )
r   r  r  r   r   r  r   r  r  r  )	to_encoder  r  r  rc   r   leading_wsptrailing_wspnew_last_ew	encode_as
chrome_lenremaining_space
text_spaceto_encode_wordencoded_wordexcesss                   r   r  r  Z  s   	 1U2Ywxx09<==? ?	"Ihwh'b	|s  labbM	b	NNf$$LL6u==>>>b			[ 			L} }crcN	$+O#eBi...K"j00gI Y!#JQ6!!%AC C 	C  ) 3uRy>>1$z1
??LL";J;/z.)DDD\""_4qjj ,CRC0N:niHHHL&&8F qjj 	b			\!			c.11223	 	)LLeBi..K+  ), 
"IIIIII,6;;$6r   c           	         	 | j         D ]O\  }}|d                                                             d          s|dxx         dz  cc<   |}d}	 |                    |           d}n-# t          $ r  d}t          j        |          rd}d}nd}Y nw xY w|r:t          j        	                    |d	|
          }	d
                    |||	          }
n#d
                    |t          |                    }
t          |d                   t          |
          z   dz   |k     r|d         dz   |
z   |d<   +t          |
          dz   |k    r|                    d|
z              [d}|dz   }|rt          |          t          t          |                    z   dz   t          |          z   }||dz   k    rd}||z
  dz
  x}}	 |d |         }t          j        	                    |d	|
          }	t          |	          |k    rn|dz  }F|                    d
                    ||||	                     d	}|dz  }||d          }|r|dxx         dz  cc<   |Qd S )Nr   rL  strictFTr  rn  r  r'   )safer   z
{}*={}''{}r  r   rk   r   r   z''r&  N   z {}*{}*={}{})r}  r(  ra  r  ry  r   rz  rt  ru  r   r6   r   r   r   r   )rF   r  r  ro  r~  r   r   error_handlerencoding_requiredencoded_valuer  re  extra_chromer  
splitpointmaxcharspartials                    r   r  r    s    { :! :!e Ry!!**3// 	"IIIIII 		"LL""" %! 	" 	" 	" $$U++ "( 1!	"  	="L..B} / 6 6M&&tWmDDDD>>$U(;(;<<DuRy>>CII%)F22b	C$.E"IYY]f$$LLt$$$ ~ 	!TSW%6%66:S=N=NNJa''
 $*Z$7!$;;J , & 2 2"] !3 !< !<}%%11a
  LL..g|]< < = = =LqLG*++&E !b			S 			-  	!I:! :!s   A))'BB)r  )rer  rt  stringr   operatorr   emailr   r  r   r   r,  r  r  r  r	  r-  r  	TSPECIALSru  	ASPECIALSr}  r  r  r  r   r   compileVERBOSE	MULTILINEr  r  r   rh   rt   rx   r|   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r  r  r  r  r  r  r!  r#  r1  r3  r:  rE  rK  rO  rZ  r]  rd  rg  rj  r  r  r  r  r  r  r  r  r  r   r  r  r  r  r  r  r>  r5  rE   rb   r6  r6   r0   r  r  r  matchr  findallr  rq  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/  r2  r8  r=  r?  rB  rF  rJ  rN  rQ  rS  rU  rY  r\  r`  rd  rk  rn  rr  rw  r{  r  r  r  r  r  r  r  r  r  r  r  r  rO   r  r  rl   r   r   <module>r     s  CJ 
			 



              ' ' ' ' ' '             
c%jjCCHHn3  sN	CCHH$U#E

"cc#hh.	_
E

"	S(33s883 	t
@ @ @
   "*  Z",   @, @, @, @, @, @, @, @,FD D D D D) D D D         I          Y       9       "       9       I   
    )   # # # # #9 # # #6	- 	- 	- 	- 	-| 	- 	- 	-    !   4C C C C C) C C C&% % % % %i % % %2? ? ? ? ?) ? ? ?% % % % %	 % % %"$ $ $ $ $I $ $ $*" " " " "y " " "6    	   DD D D D Dy D D D! ! ! ! !i ! ! !6; ; ; ; ;Y ; ; ;. . . . .Y . . .    i       )   
    I   
    y   B    9   '! '! '! '! '!& '! '! '!T! ! ! ! !	 ! ! !H    I        )       	   8% % % % %y % % %
# # # # #	 # # #    i       I   S. S. S. S. S.Y S. S. S.l    y       *       1       i       )   
* * * * *I * * *       & & & & &y & & &    Y   (+ (+ (+ (+ (+s (+ (+ (+V           H       -   < < < < <f- < < < mCc#344#  % $}S*BCC . 
:,,RWWS\\::;;A"
9#3#3BIbggi  !!$# $# $ $$) "
#566> #I$4$4BIbggj!!""%$ %$ % %%* 'RZ	(8(8BIbggn%%&&)( )( ) )). &0bj1A1ABIbgg-..//21 21 '2 '227 $; ; ;J J J<
 
 
/ / / /bA A AF  "     )) )) ))V  2       $  6     &  2     D$ $ $L% % %N-! -! -!^  (  %! %! %!N$ $ $L   '  '  ' R, , ,\    <  *" " "$6 6 6r# # #J  <  :4 4 4n& & &,B B BJ  8B B BH$ $ $$  &  .  &  .  $  ,  <  ,L L L\2 2 2h7 7 7 7 7 7r  <  ^  B7 B7 B7H?7 ?7 ?7BI! I! I! I! I!r   