
    F\h>                    
   S r SSKrSSKrSSKrSSKrSSKrSSKrSSKrSSKrSSK	rSSK
rSSKrSSKrSSKJr   SSKr/ SQr\R$                  R'                  S5      r " S S5      r " S S	\5      r " S
 S\5      r " S S\5      r " S S\5      r " S S\5      r " S S\5      r " S S\5      r " S S\R8                  R:                  5      r " S S\5      r " S S\5      r " S S\5      r  " S S\5      r! " S  S!\5      r" " S" S#\5      r# " S$ S%5      r$ " S& S'\$5      r%S8S( jr&S) r'S* r(S+ r)S, r*S- r+ " S. S/\,5      r- " S0 S1\-5      r. " S2 S3\-5      r/ " S4 S5\-5      r0 " S6 S7\-5      r1g! \ a    Sr GNCf = f)9zDRead/write support for Maildir, mbox, MH, Babyl, and MMDF mailboxes.    N)GenericAlias)MailboxMaildirmboxMHBabylMMDFMessageMaildirMessagemboxMessage	MHMessageBabylMessageMMDFMessageErrorNoSuchMailboxErrorNotEmptyErrorExternalClashErrorFormatErrorasciic                       \ rS rSrSrS%S jrS rS rS rS r	S	 r
S&S
 jrS rS rS rS rS rS rS rS rS rS rS rS rS rS rS rS&S jrS rS&S jrS rS rS r S  r!S! r"S"r#S'S# jr$\%" \&5      r'S$r(g)(r   "   z*A group of messages in a particular place.Nc                     [         R                  R                  [         R                  R                  U5      5      U l        X l        g)zInitialize a Mailbox instance.N)ospathabspath
expanduser_path_factoryselfr   factorycreates       /usr/lib/python3.13/mailbox.py__init__Mailbox.__init__%   s*    WW__RWW%7%7%=>
    c                     [        S5      e)$Add message and return assigned key.&Method must be implemented by subclassNotImplementedErrorr    messages     r#   addMailbox.add*       !"JKKr&   c                     [        S5      e)=Remove the keyed message; raise KeyError if it doesn't exist.r)   r*   r    keys     r#   removeMailbox.remove.   r0   r&   c                 &    U R                  U5        g N)r5   r3   s     r#   __delitem__Mailbox.__delitem__2   s    Cr&   c                 H     U R                  U5        g! [         a     gf = fz'If the keyed message exists, remove it.N)r5   KeyErrorr3   s     r#   discardMailbox.discard5   s%    	KK 		s    
!!c                     [        S5      e)>Replace the keyed message; raise KeyError if it doesn't exist.r)   r*   r    r4   r-   s      r#   __setitem__Mailbox.__setitem__<   r0   r&   c                 J     U R                  U5      $ ! [         a    Us $ f = f)z9Return the keyed message, or default if it doesn't exist.)__getitem__r=   )r    r4   defaults      r#   getMailbox.get@   s,    	##C(( 	N	s    ""c                     U R                   (       d  U R                  U5      $ [        R                  " U R	                  U5      5       nU R                  U5      sSSS5        $ ! , (       d  f       g= f)z=Return the keyed message; raise KeyError if it doesn't exist.N)r   get_message
contextlibclosingget_file)r    r4   files      r#   rF   Mailbox.__getitem__G   sK    }}##C((##DMM#$674}}T* 877s   A##
A1c                     [        S5      e)4Return a Message representation or raise a KeyError.r)   r*   r3   s     r#   rK   Mailbox.get_messageO   r0   r&   c                 h    [         R                  " U R                  U5      5      R                  5       $ )zReturn a string representation or raise a KeyError.

Uses email.message.Message to create a 7bit clean string
representation of the message.emailmessage_from_bytes	get_bytes	as_stringr3   s     r#   
get_stringMailbox.get_stringS   s'    
 ''s(;<FFHHr&   c                     [        S5      e)z8Return a byte string representation or raise a KeyError.r)   r*   r3   s     r#   rX   Mailbox.get_bytesZ   r0   r&   c                     [        S5      e)6Return a file-like representation or raise a KeyError.r)   r*   r3   s     r#   rN   Mailbox.get_file^   r0   r&   c                     [        S5      e)Return an iterator over keys.r)   r*   r    s    r#   iterkeysMailbox.iterkeysb   r0   r&   c                 4    [        U R                  5       5      $ )zReturn a list of keys.)listrd   rc   s    r#   keysMailbox.keysf   s    DMMO$$r&   c              #   n   #    U R                  5        H  n X   nUv   M     g! [         a     M  f = f7f)z%Return an iterator over all messages.Nrd   r=   r    r4   values      r#   
itervaluesMailbox.itervaluesj   s;     ==?C	 K #  s   5$	5
2525c                 "    U R                  5       $ r8   )rn   rc   s    r#   __iter__Mailbox.__iter__s   s      r&   c                 4    [        U R                  5       5      $ )z,Return a list of messages. Memory intensive.)rg   rn   rc   s    r#   valuesMailbox.valuesv   s    DOO%&&r&   c              #   p   #    U R                  5        H  n X   nX4v   M     g! [         a     M  f = f7f)z.Return an iterator over (key, message) tuples.Nrk   rl   s      r#   	iteritemsMailbox.iteritemsz   s>     ==?C	 , #  s   6%
6
3636c                 4    [        U R                  5       5      $ )z9Return a list of (key, message) tuples. Memory intensive.)rg   rw   rc   s    r#   itemsMailbox.items   s    DNN$%%r&   c                     [        S5      e)9Return True if the keyed message exists, False otherwise.r)   r*   r3   s     r#   __contains__Mailbox.__contains__   r0   r&   c                     [        S5      e)*Return a count of messages in the mailbox.r)   r*   rc   s    r#   __len__Mailbox.__len__   r0   r&   c                 T    U R                  5        H  nU R                  U5        M     g)zDelete all messages.N)rh   r>   r3   s     r#   clearMailbox.clear   s    99;CLL r&   c                 V     X   nU R                  U5        U$ ! [          a    Us $ f = f)z3Delete the keyed message and return it, or default.)r=   r>   )r    r4   rG   results       r#   popMailbox.pop   s7    	YF 	S  	N	s    ((c                 j    U R                  5        H  nXR                  U5      4s  $    [        S5      e)z6Delete an arbitrary (key, message) pair and return it.zNo messages in mailbox)rd   r   r=   r3   s     r#   popitemMailbox.popitem   s1    ==?C#'' # 344r&   c                     [        US5      (       a  UR                  5       nO$[        US5      (       a  UR                  5       nOUnSnU H
  u  pE XPU'   M     U(       a  [        S5      eg! [         a    Sn M0  f = f)z4Change the messages that correspond to certain keys.rw   rz   FTzNo message with key(s)N)hasattrrw   rz   r=   )r    argsourcebad_keyr4   r-   s         r#   updateMailbox.update   s    3$$]]_FS'""YY[FF"LC#S	 #
 344   s   A,,A<;A<c                     [        S5      e)&Write any pending changes to the disk.r)   r*   rc   s    r#   flushMailbox.flush   r0   r&   c                     [        S5      e)Lock the mailbox.r)   r*   rc   s    r#   lockMailbox.lock   r0   r&   c                     [        S5      e)#Unlock the mailbox if it is locked.r)   r*   rc   s    r#   unlockMailbox.unlock   r0   r&   c                     [        S5      e)Flush and close the mailbox.r)   r*   rc   s    r#   closeMailbox.close   r0   r&   c                 X     UR                  S5      $ ! [         a    [        S5      ef = f)Nr   z?String input must be ASCII-only; use bytes or a Message instead)encodeUnicodeError
ValueErrorr,   s     r#   _string_to_bytesMailbox._string_to_bytes   s7    	2>>'** 	2 1 2 2	2s    )Fc                    [        U[        R                  R                  5      (       a  [        R
                  " 5       n[        R                  R                  XCS5      nUR                  U5        UR                  S5        UR                  5       nUR                  S[        5      nUR                  U5        U R                  (       a1  UR                  [        5      (       d  UR                  [        5        g
g
g
[        U[         ["        [        R$                  45      (       a  [        U[        R$                  5      (       a,  [&        R(                  " S[*        S5        UR-                  5       n[        U[         5      (       a  U R/                  U5      nU(       a  UR                  SS5      nUR                  S[        5      nUR                  U5        U R                  (       a1  UR                  [        5      (       d  UR                  [        5        g
g
g
[1        US5      (       Ga,  [1        US5      (       a(  [&        R(                  " S	[*        S5        UR2                  nS
n UR5                  5       nUR                  S5      (       a	  US
S S-   nOUR                  S5      (       a  US
S S-   nU(       d  OPU(       a  UR7                  S5      (       a  SUSS
 -   nUR                  S[        5      nUR                  U5        UnM  U R                  (       a9  U(       a1  UR                  [        5      (       d  UR                  [        5        g
g
g
g
[9        S[;        U5      -  5      e)z%Dump message contents to target file.r      
8Use of StringIO input is deprecated, use BytesIO instead   s   
From s   
>From readbufferDUse of text mode files is deprecated, use a binary mode file insteadN   
      From s   >From    Invalid message type: %s)
isinstancerV   r-   r
   ioBytesIO	generatorBytesGeneratorflattenseekr   replacelinesepwrite_append_newlineendswithstrbytesStringIOwarningswarnDeprecationWarninggetvaluer   r   r   readline
startswith	TypeErrortype)	r    r-   targetmangle_from_r   gendatalastlinelines	            r#   _dump_messageMailbox._dump_message   s    gu}}4455ZZ\F//00qICKK KKN;;=D<<w/DLL##DMM',B,BW% -C# #ubkk!:;;'2;;// *+=qB!**,'3''//8!//*kBooeW5GLL!##G,<,<W,E,EW% -F# Wf%%w)) 56H!M!..H'')==))9u,D]]5))9u,DDOOH$=$=$tABx/D||E73T"  ##9J9J79S9SW% :T# 6gFGGr&   )r   r   NTr8   F))__name__
__module____qualname____firstlineno____doc__r$   r.   r5   r9   r>   rC   rH   rF   rK   rZ   rX   rN   rd   rh   rn   rq   rt   rw   rz   r~   r   r   r   r   r   r   r   r   r   r   r   r   classmethodr   __class_getitem____static_attributes__ r&   r#   r   r   "   s    4 
LLL+LILLL%!'&LL
55"LLLL2 O4Hl $L1r&   r   c                       \ rS rSrSrSrS(S jrS rS rS r	S	 r
S
 rS rS rS rS\4S jrS rS\4S jrS\4S jrS\4S jrS rS rS rS rS rS rS rS rS rS rS  rS! r S"r!S# r"S$ r#S% r$S& r%S'r&g))r   i  zA qmail-style Maildir mailbox.:Nc                    [         R                  XX#5        [        R                  R	                  U R
                  S5      [        R                  R	                  U R
                  S5      [        R                  R	                  U R
                  S5      S.U l        [        R                  R                  U R
                  5      (       dv  U(       aZ  [        R                  " U R
                  S5        U R                  R                  5        H  n[        R                  " US5        M     O[        U R
                  5      e0 U l        SSS.U l        SU l        SU l        g	)
zInitialize a Maildir instance.tmpnewcur)r   r   r     r   )r   r   g?N)r   r$   r   r   joinr   _pathsexistsmkdirrt   r   _toc_toc_mtimes
_last_read_skewfactor)r    dirnamer!   r"   r   s        r#   r$   Maildir.__init__  s    877<<

E277<<

E277<<

E2
 ww~~djj))U+ KK..0DHHT5) 1 )44	#$Q/r&   c                     U R                  5       n U R                  X5        [        U5        [        U[        5      (       a?  UR                  5       nU R                  UR                  5       -   nX@R                  :X  a  SnOSnSn[        R                  R                  UR                  5      R                  U R                  5      S   n[        R                  R!                  U R"                  X5U-   5      n[        U[        5      (       aX  [        R$                  " UR                  [        R                  R'                  UR                  5      UR)                  5       45          [        R*                  " UR                  U5        [        R
                  " UR                  5        U$ ! [         a2    UR                  5         [        R
                  " UR                  5        e f = f! [,        [.        4 a%    [        R0                  " UR                  U5         U$ f = f! [2         aR  n[        R
                  " UR                  5        UR4                  [4        R6                  :X  a  [9        SU-  5      ee SnAff = f)r(    r   r   z$Name clash with existing message: %sN)_create_tmpr   BaseExceptionr   r   r5   name_sync_closer   r   
get_subdircolonget_infor   basenamesplitr   r   utimegetatimeget_datelinkAttributeErrorPermissionErrorrenameOSErrorerrnoEEXISTr   )r    r-   tmp_filesubdirsuffixuniqdestes           r#   r.   Maildir.add$  s   ##%	w1
 	Hg~..'')FZZ'"2"2"44F#FFww.44TZZ@Cww||DJJv>g~..HHX]]gg&&x}}5w7G7G7IJL
	)t, 		(--( G  	NNIIhmm$	0 #O4 /		(--. /  	IIhmm$ww%,,&()O+/*0 1 1 	sB   F* '!G)  H! *<G&)1HH! HH! !
I=+AI88I=c                     [         R                  " [         R                  R                  U R                  U R                  U5      5      5        gr2   N)r   r5   r   r   r   _lookupr3   s     r#   r5   Maildir.removeN  s*    
		"'',,tzz4<<+<=>r&   c                 T     U R                  U5        g! [        [        4 a     gf = fr<   )r5   r=   FileNotFoundErrorr3   s     r#   r>   Maildir.discardR  s+    	KK+, 		s    ''c                    U R                  U5      nU R                  U5      nU R                  U5      n[        U[        5      (       a  UnOUn[        R
                  R                  U5      nU R                  U;   a,  U R                  UR                  U R                  5      S   -   nOSnU R                  U5        [        R
                  R                  U R                  U5      n	[        R
                  R                  U R                  XqU-   5      n
[        U[        5      (       aD  [        R                  " U	[        R
                  R                  U	5      UR                  5       45        [        R                  " X5        g)rA   r   r   N)r  r.   r   r   r   r   r   r   r   r>   r   r   r   r   r  r  )r    r4   r-   old_subpathtemp_keytemp_subpathdominant_subpathr
  r  tmp_pathnew_paths              r#   rC   Maildir.__setitem__Z  s   ll3'88G$||H-g~..+  +!12::))ZZ"2"8"8"DR"HHFFS77<<

L977<<

F&LAg~..HHXgg&&x0'2B2B2DEG
 			(%r&   c                    U R                  U5      n[        [        R                  R	                  U R
                  U5      S5       nU R                  (       a  U R                  U5      nO[        U5      nSSS5        [        R                  R                  U5      u  pVWR                  U5        U R                  U;   a-  UR                  UR                  U R                  5      S   5        UR                  [        R                  R                  [        R                  R	                  U R
                  U5      5      5        U$ ! , (       d  f       N= f)rR   rbNr   )r  openr   r   r   r   r   r   r   
set_subdirr   set_infoset_dategetmtime)r    r4   subpathfmsgr
  r   s          r#   rK   Maildir.get_messageu  s    ,,s#"'',,tzz73T:a}}mmA&$Q'	 ;
 ww}}W-v::LLDJJ/34RWW%%bggll4::w&GHI
 ;:s   /E
Ec                    [        [        R                  R                  U R                  U R                  U5      5      S5       nUR                  5       R                  [        S5      sSSS5        $ ! , (       d  f       g= f)2Return a bytes representation or raise a KeyError.r   r   N)	r!  r   r   r   r   r  r   r   r   r    r4   r'  s      r#   rX   Maildir.get_bytes  sM    "'',,tzz4<<+<=tD668##GU3 EDDs   $A22
B c                     [        [        R                  R                  U R                  U R                  U5      5      S5      n[        U5      $ )r_   r   )r!  r   r   r   r   r  
_ProxyFiler,  s      r#   rN   Maildir.get_file  s4    djj$,,s*;<dC!}r&   c                     U R                  U5      nU R                  U;   a  UR                  U R                  5      S   $ g)z+Get the keyed message's "info" as a string.r   r   )r  r   r   )r    r4   r&  s      r#   r   Maildir.get_info  s7    ,,s#:: ==,R00r&   infoc                    [        U[        5      (       d  [        S[        U5       35      eU R	                  U5      nUR                  U R                  5      S   nU(       a  X@R                  U-   -  nXC:X  a  g[        R                  R                  U R                  U5      n[        R                  R                  U R                  U5      n[        R                  " XV5        X@R                  U'   g)z&Set the keyed message's "info" string.zinfo must be a string: r   N)r   r   r   r   r  r   r   r   r   r   r   r  r   )r    r4   r3  r  new_subpathold_pathr  s          r#   r#  Maildir.set_info  s    $$$5d4j\BCCll3'!''

3A6::,,K%77<<

K877<<

K8
		(%$		#r&   c                 \    U R                  U5      nUR                  S5      (       a  USS $ g)zHReturn as a string the standard flags that are set on the keyed message.2,   Nr   )r   r   )r    r4   r3  s      r#   	get_flagsMaildir.get_flags  s-    }}S!??4  8Or&   flagsc                     [        U[        5      (       d  [        S[        U5       35      eU R	                  USSR                  [        [        U5      5      5      -   5        g)z>Set the given flags and unset all others on the keyed message.zflags must be a string: r9  r   N)r   r   r   r   r#  r   sortedset)r    r4   r=  s      r#   	set_flagsMaildir.set_flags  sK    %%%6tE{mDEEc4"''&U*<"==>r&   flagc           
          [        U[        5      (       d  [        S[        U5       35      eU R	                  USR                  [        U R                  U5      5      [        U5      -  5      5        g)zCSet the given flag(s) without changing others on the keyed message.flag must be a string: r   N)r   r   r   r   rA  r   r@  r;  r    r4   rC  s      r#   add_flagMaildir.add_flag  sT    $$$5d4j\BCCsBGGCs(;$<s4y$HIJr&   c           
         [        U[        5      (       d  [        S[        U5       35      eU R	                  U5      (       aF  U R                  USR                  [        U R	                  U5      5      [        U5      -
  5      5        gg)zLUnset the given string flag(s) without changing others on the keyed message.rE  r   N)r   r   r   r   r;  rA  r   r@  rF  s      r#   remove_flagMaildir.remove_flag  sh    $$$5d4j\BCC>>#NN3DNN3,?(@3t9(L MN r&   c              #      #    U R                  5         U R                   H  n U R                  U5        Uv   M     g! [         a     M+  f = f7frb   N)_refreshr   r  r=   r3   s     r#   rd   Maildir.iterkeys  sG     99CS! I   s%    A=	A
AA
AAc                 >    U R                  5         XR                  ;   $ r}   )rN  r   r3   s     r#   r~   Maildir.__contains__  s    iir&   c                 L    U R                  5         [        U R                  5      $ r   )rN  lenr   rc   s    r#   r   Maildir.__len__  s    499~r&   c                     g)"Write any pending changes to disk.Nr   rc   s    r#   r   Maildir.flush  s     	r&   c                     g)r   Nr   rc   s    r#   r   Maildir.lock      r&   c                     g)r   Nr   rc   s    r#   r   Maildir.unlock  r\  r&   c                     gr   Nr   rc   s    r#   r   Maildir.close  r\  r&   c                 T   / n[         R                  " U R                  5       H  n[        U5      S:  d  M  US   S:X  d  M  [         R                  R                  [         R                  R                  U R                  U5      5      (       d  Mm  UR                  USS 5        M     U$ )Return a list of folder names.   r   .N)r   listdirr   rU  r   isdirr   appendr    r   entrys      r#   list_foldersMaildir.list_folders  sr    ZZ

+E5zA~%(c/ww}}RWW\\$**e<==eABi( , r&   c                     [        [        R                  R                  U R                  SU-   5      U R
                  SS9$ )z/Return a Maildir instance for the named folder.re  Fr!   r"   )r   r   r   r   r   r   r    folders     r#   
get_folderMaildir.get_folder  s2    rww||DJJf=#}}#% 	%r&   c                    [         R                  R                  U R                  SU-   5      n[	        X R
                  S9n[         R                  R                  US5      n[         R                  R                  U5      (       dK  [         R                  " [         R                  " U[         R                  [         R                  -  S5      5        U$ )z>Create a folder and return a Maildir instance representing it.re  r!   maildirfolder  )r   r   r   r   r   r   r   r   r!  O_CREATO_WRONLY)r    rp  r   r   maildirfolder_paths        r#   
add_folderMaildir.add_folder  s    ww||DJJf5}}5WW\\$@ww~~011HHRWW/bkk1I r&   c                    [         R                  R                  U R                  SU-   5      n[         R                  " [         R                  R                  US5      5      [         R                  " [         R                  R                  US5      5      -    H)  n[        U5      S:  d  US   S:w  d  M  [        SU-  5      e   [         R                  " U5       Ho  nUS:w  d  M  US:w  d  M  US:w  d  M  [         R                  R                  [         R                  R                  X#5      5      (       d  M^  [        SU< S	U< 35      e   [         R                  " US
S9 H~  u  pEnU H6  n[         R                  " [         R                  R                  XC5      5        M8     U H6  n[         R                  " [         R                  R                  XC5      5        M8     M     [         R                  " U5        g)-Delete the named folder, which must be empty.re  r   r   rd  r   zFolder contains message(s): %sr   zFolder contains subdirectory 'z': F)topdownN)r   r   r   r   rf  rU  r   rg  walkr5   rmdir)r    rp  r   rj  rootdirsfiless          r#   remove_folderMaildir.remove_folder  sT   ww||DJJf5ZZT5 9:ZZT5 9:;E5zA~qS#$Dv$MNN; ZZ%E~%5.Ue^ww}}RWW\\$677#%+U%4 5 5 &
 "$u!=D		"'',,t34 d23  ">
 	r&   c                    [         R                   " 5       n[        R                  " [        R                  R	                  U R
                  S5      5       Hl  n[        R                  R	                  U R
                  SU5      nU[        R                  R                  U5      -
  S:  d  MV  [        R                  " U5        Mn     g)zDelete old files in "tmp".r   i@ N)timer   rf  r   r   r   r   r5   )r    nowrj  r   s       r#   cleanMaildir.clean  su    iikZZTZZ ?@E77<<

E59DRWW%%d++f4		$ Ar&   rd  c           	      ~   [         R                   " 5       n[        R                  " 5       nSU;   a  UR                  SS5      nSU;   a  UR                  SS5      n[	        U5      < S[	        US-  S-  5      < S[
        R                  " 5       < S	[        R                  < S
U< 3	n[
        R                  R                  U R                  SU5      n [
        R                  " U5        [!        SU-  5      e! [         a9    [        =R                  S-  sl         [        U5      s $ ! [         a      NLf = ff = f)z=Create a file in the tmp subdirectory and open and return it./z\057r   z\072z.Mrd  g    .APQre  r   z&Name clash prevented file creation: %s)r  socketgethostnamer   intr   getpidr   _countr   r   r   statr  _create_carefullyFileExistsErrorr   )r    r  hostnamer  r   s        r#   r   Maildir._create_tmp  s    iik%%'(?''W5H(?''W5H$'Hc#'C-.@"))+$+NNH>ww||DJJt4	GGDM !!I!%"& ' 	' ! 	NNaN(.." 		s0   C9 9#D<
D*'D<*
D84D<7D88D<c                 N   [         R                   " 5       U R                  -
  SU R                  -   :  ak  SnU R                   HQ  n[        R
                  R                  U R                  U   5      nX0R                  U   :  a  SnX0R                  U'   MS     U(       d  g0 U l        U R                   H  nU R                  U   n[        R                  " U5       H  nUR                  S5      (       a  M  [        R
                  R                  XE5      n[        R
                  R                  U5      (       a  M`  UR                  U R                  5      S   n[        R
                  R                  X%5      U R                  U'   M     M     [         R                   " 5       U l        g)z!Update table of contents mapping.r:  FTNre  r   )r  r   r   r   r   r   r%  r   r   rf  r   r   rg  r   r   )r    refreshr
  mtimer   rj  pr  s           r#   rN  Maildir._refresh4  s8    99;(1t/?/?+??G**((V)<=++F33"G+0  (	 +
 	&&F;;v&DD)##C((GGLL-77==##{{4::.q1"$'',,v"=		$ * ' ))+r&   c                 p    [         R                  R                  [         R                  R                  U R                  U R
                  U   5      5      (       a  U R
                  U   $  U R                  5          U R
                  U   $ ! [         a     N,f = f! [         a    [        SU-  5      Sef = f)z=Use TOC to return subpath for given key, or raise a KeyError.No message with key: %sN)r   r   r   r   r   r   r=   rN  r3   s     r#   r  Maildir._lookupZ  s    	ww~~bggll4::tyy~FGGyy~% H 		F99S>!	  		
  	F4s:;E	Fs   A'B <B 
BBB5c                     [        U S5      (       d  U R                  5       U l          U [        U R                  5         $ ! [         a     g[
         a     M2  f = f)z0Return the next message in a one-time iteration._onetime_keysN)r   rd   r  nextStopIterationr=   rc   s    r#   r  Maildir.nexth  sX    t_--!%DD!3!3455   s   A 
A	AA)r   r  r   r   r   r   r   )'r   r   r   r   r   r   r$   r.   r5   r>   rC   rK   rX   rN   r   r   r#  r;  rA  rG  rJ  rd   r~   r   r   r   r   r   rk  rq  rz  r  r  r  r   rN  r  r  r   r   r&   r#   r   r     s    (E((T?&64

%# %?C ?K# KOS O 

%&  F'0$&LF
r&   r   c                       \ rS rSrSrSS jrS rS rS rS r	S	 r
S
 rS rS rS rS rS rS rS rSS jrS rSrg)_singlefileMailboxiu  zA single-file mailbox.Nc                     [         R                  XX#5         [        U R                  S5      nX@l
        SU l        SU l        SU l        SU l        SU l        SU l        g! [         a  nUR
                  [
        R                  :X  a7  U(       a  [        U R                  S5      n SnAN{[        U R                  5      eUR
                  [
        R                  [
        R                  4;   a  [        U R                  S5      n SnANe SnAff = f)z!Initialize a single-file mailbox.rb+zwb+r   Nr   F)r   r$   r!  r   r  r  ENOENTr   EACCESEROFS_filer   	_next_key_pending_pending_sync_locked_file_length)r    r   r!   r"   r'  r  s         r#   r$   _singlefileMailbox.__init__x  s    W5	TZZ'A 
	" !  		ww%,,&TZZ/A,TZZ88U\\5;;77T*		s$   A 
D);D)ADDDc                     U R                  5         U R                  U5      U R                  U R                  '   U =R                  S-  sl        SU l        U R                  S-
  $ )r(   rd  T)r  _append_messager   r  r  r,   s     r#   r.   _singlefileMailbox.add  sO    $($8$8$A		$..!! "~~!!r&   c                 N    U R                  U5        U R                  U	 SU l        g)r2   TN)r  r   r  r3   s     r#   r5   _singlefileMailbox.remove  s     SIIcNr&   c                 p    U R                  U5        U R                  U5      U R                  U'   SU l        g)rA   TN)r  r  r   r  rB   s      r#   rC   _singlefileMailbox.__setitem__  s-    S--g6		#r&   c              #   t   #    U R                  5         U R                  R                  5        Sh  vN   g N7frM  )r  r   rh   rc   s    r#   rd   _singlefileMailbox.iterkeys  s"     99>>###s   .868c                 >    U R                  5         XR                  ;   $ rQ  )r  r   r3   s     r#   r~   _singlefileMailbox.__contains__  s    iir&   c                 L    U R                  5         [        U R                  5      $ rT  )r  rU  r   rc   s    r#   r   _singlefileMailbox.__len__  s    499~r&   c                 `    U R                   (       d  [        U R                  5        SU l         gg)r   TN)r  
_lock_filer  rc   s    r#   r   _singlefileMailbox.lock  s!    ||tzz"DL r&   c                 `    U R                   (       a  [        U R                  5        SU l         ggr   FN)r  _unlock_filer  rc   s    r#   r   _singlefileMailbox.unlock  s!    <<$ DL r&   c           	      d   U R                   (       d.  U R                  (       a  [        U R                  5        SU l        gU R                  c   eU R                  R                  SS5        U R                  R                  5       nXR                  :w  a  [        SU R                  U4-  5      e[        U R                  5      n 0 nU R                  U5        [        U R                  R                  5       5       H  nU R                  U   u  pVU R                  R                  U5        U R                  U5        UR                  5       n U R                  R                  [!        SX`R                  R                  5       -
  5      5      nU(       d  OUR#                  U5        MZ  XrR                  5       4X4'   U R%                  U5        M     UR                  5       U l        [/        U5        U R                  R'                  5         [(        R0                  " U R                  5      n	[(        R2                  " UR,                  U	R4                  5         [(        R6                  " UR,                  U	R8                  U	R:                  5         [(        R@                  " UR,                  U R                  5        [E        U R                  S5      U l        X0l        SU l         SU l        U RF                  (       a  [I        U R                  SS9  gg!   UR'                  5         [(        R*                  " UR,                  5        e = f! [<        [>        4 a     Nf = f! [B         aN    [(        R*                  " U R                  5        [(        R@                  " UR,                  U R                  5         Nf = f)	rX  FNr   r:  z4Size of mailbox file changed (expected %i, found %i)   r  )dotlock)%r  r  _sync_flushr  r   r   tellr  r   _create_temporaryr   _pre_mailbox_hookr?  rh   _pre_message_hookr   minr   _post_message_hookr   r   r5   r   r   r  chmodst_modechownst_uidst_gidr  r  r  r  r!  r  r  )
r    cur_lennew_filenew_tocr4   startstop	new_startr   r3  s
             r#   r   _singlefileMailbox.flush  s   }}!! DJJ'%*"
 yy$$$ 	

1**//#'''$ &?&*&7&7%A&B C C %TZZ0	G""8,diinn./"iin

&&&x0$MMO	!ZZ__S15

8I1I.K LF!NN6*  !*==?;''1 0 !)D
 	H

wwtzz"
-	HHX]]DKK=	1IIhmmTZZ0 $**e,
	"<<tzz51 /	NNIIhmm$ ( 		  	1IIdjj!IIhmmTZZ0	1s2   DL 6M 
+M 3L>MMAN/.N/c                     g),Called before writing the mailbox to file f.Nr   r    r'  s     r#   r  $_singlefileMailbox._pre_mailbox_hook  r\  r&   c                     g)-Called before writing each message to file f.Nr   r  s     r#   r  $_singlefileMailbox._pre_message_hook  r\  r&   c                     g,Called after writing each message to file f.Nr   r  s     r#   r  %_singlefileMailbox._post_message_hook  r\  r&   c                     U R                  5          U R                  (       a  U R                  5         U R                  R	                  5         g! U R                  R	                  5         f = f!  U R                  (       a  U R                  5         U R                  R	                  5         f ! U R                  R	                  5         f = f= fr`  )r   r  r   r  r   rc   s    r#   r   _singlefileMailbox.close  s|    	#JJL#<<KKM

  "

  "	#<<KKM

  "

  "s.   A. !A A+.C0!B,C,CCc                     U R                   c  U R                  5         Ub   U R                   U   $ g! [         a    [        SU-  5      Sef = f)z'Return (start, stop) or raise KeyError.Nr  )r   _generate_tocr=   r3   s     r#   r  _singlefileMailbox._lookup  s\    99 ?Jyy~%   J83>?TIJs	   2 Ac                 R   U R                   R                  SS5        U R                   R                  5       n[        U R                  5      S:X  a,  U R
                  (       d  U R                  U R                   5         U R                  U R                   5        U R                  U5      nU R                  U R                   5        U R                   R                  5         U R                   R                  5       U l        U$ ! [         a    U R                   R                  U5        e f = f)z;Append message to mailbox and return (start, stop) offsets.r   r:  )r  r   r  rU  r   r  r  r  _install_messager  r   truncater   r  )r    r-   beforeoffsetss       r#   r  "_singlefileMailbox._append_message%  s    

1"tyy>Qt}}
 ""4::.	""4::.++G4G##DJJ/ 	

 JJOO-  	JJ'	s   =AC? ?'D&)r  r  r  r  r  r  r   r   r8   )r   r   r   r   r   r$   r.   r5   rC   rd   r~   r   r   r   r   r  r  r  r   r  r  r   r   r&   r#   r  r  u  sX     !."$
 

 !B2H	#Jr&   r  c                   F    \ rS rSrSrSrS rSS jrSS jrSS jr	S r
S	rg
)	_mboxMMDFi<  zAn mbox or MMDF mailbox.Tc                    U R                  U5      u  p#U R                  R                  U5        U R                  R                  5       R	                  [
        S5      R                  S5      nU R                  R                  X0R                  R                  5       -
  5      nU R                  UR	                  [
        S5      5      nUR                  U5        UR                  USS 5        U$ )rR   r&   r   r   r   N)r  r  r   r   r   r   decoder   r  _message_factoryset_unixfromset_from)r    r4   r  r  	from_linestringr(  s          r#   rK   _mboxMMDF.get_messageA  s    ll3'

JJ'')11'3?FFwO	

(9!9:##FNN7E$BC#Yqr]#
r&   c                 f    [         R                  " U R                  X5      5      R                  US9$ )3Return a string representation or raise a KeyError.)unixfromrU   )r    r4   from_s      r#   rZ   _mboxMMDF.get_stringL  s.    ''NN3&((1	5	(A	Br&   c                 6   U R                  U5      u  p4U R                  R                  U5        U(       d  U R                  R                  5         U R                  R	                  X@R                  R                  5       -
  5      nUR                  [        S5      $ )r  r   )r  r  r   r   r   r  r   r   )r    r4   r  r  r  r  s         r#   rX   _mboxMMDF.get_bytesQ  sf    ll3'

JJ!

(9!9:~~gu--r&   c                     U R                  U5      u  p4U R                  R                  U5        U(       d  U R                  R                  5         [	        U R                  U R                  R                  5       U5      $ )r_   )r  r  r   r   _PartialFiler  )r    r4   r  r  r  s        r#   rN   _mboxMMDF.get_fileZ  sS    ll3'

JJ!DJJ

(94@@r&   c                    Sn[        U[        5      (       a  U R                  U5      n[        U[        5      (       a?  UR	                  S5      (       a)  UR                  S5      nUS:w  a  USU nXS-   S nOUnSnO[        U[        5      (       a%  UR                  5       R                  S5      nSU-   nOM[        U[        R                  R                  5      (       a$  UR                  5       nUb  UR                  S5      nUc:  S[        R                  " [        R                  " 5       5      R                  5       -   nU R                   R#                  5       nU R                   R%                  U[&        -   5        U R)                  XR                   U R*                  5        U R                   R#                  5       nXV4$ )	z1Format a message and blindly write to self._file.Nr   r   r   rd  r&   r   s   From MAILER-DAEMON )r   r   r   r   r   find_mboxMMDFMessageget_fromr   rV   r-   r
   get_unixfromr  asctimegmtimer  r  r   r   r   _mangle_from_)r    r-   r  newlineauthorr  r  s          r#   r  _mboxMMDF._install_messageb  sg   	gs##++G4Ggu%%'*<*<X*F*Fll5)G"}#HW-	!A+,/#	!122%%'..w7F 6)I!6!677,,.I$%,,W5	.dkkm1L1S1S1UUI

!

W,-7JJ0B0BCzz }r&   r   Nr   )r   r   r   r   r   r  rK   rZ   rX   rN   r  r   r   r&   r#   r  r  <  s%    "M	B
.Ar&   r  c                   6    \ rS rSrSrSrSrS	S jrS rS r	Sr
g)
r   i  zA classic mbox mailbox.TNc                 F    [         U l        [        R                  XX#5        g)zInitialize an mbox mailbox.N)r   r  r  r$   r   s       r#   r$   mbox.__init__       +4w7r&   c                 .    UR                  [        5        gr  r   r   r  s     r#   r  mbox._post_message_hook  s    	r&   c                    / / p!SnU R                   R                  S5         U R                   R                  5       nU R                   R                  5       nUR	                  S5      (       af  [        U5      [        U5      :  a:  U(       a"  UR                  U[        [        5      -
  5        OUR                  U5        UR                  U5        SnOQU(       d;  U(       a"  UR                  U[        [        5      -
  5        OUR                  U5        OU[        :X  a  SnOSnGM  [        [        [        X5      5      5      U l        [        U R                  5      U l        U R                   R                  5       U l        g)0Generate key-to-(start, stop) table of contents.Fr   Tr   N)r  r   r  r   r   rU  rh  r   dict	enumeratezipr   r  r  )r    startsstopslast_was_emptyline_posr   s         r#   r  mbox._generate_toc  s   B

zz(H::&&(Dx((u:F+%XG%<=
 X.h'!&!LLCL!89LL*!%!&/ 0 3v#567	TYY JJOO-r&   r  r  r  r   r   )r   r   r   r   r   r  r   r$   r  r  r   r   r&   r#   r   r     s     !M O8
.r&   r   c                   4    \ rS rSrSrS	S jrS rS rS rSr	g)
r	   i  zAn MMDF mailbox.Nc                 F    [         U l        [        R                  XX#5        g)zInitialize an MMDF mailbox.N)r   r  r  r$   r   s       r#   r$   MMDF.__init__  r  r&   c                 4    UR                  S[        -   5        g)r     Nr  r  s     r#   r  MMDF._pre_message_hook  s    	#g-.r&   c                 B    UR                  [        S-   [        -   5        g)r  r)  Nr  r  s     r#   r  MMDF._post_message_hook  s    	--78r&   c                    / / p!U R                   R                  S5        Sn UnU R                   R                  5       nU R                   R                  5       nUR	                  S[
        -   5      (       a  UR                  U5         UnU R                   R                  5       nU R                   R                  5       nUS[
        -   :X  a"  UR                  U[        [
        5      -
  5        O#U(       d  UR                  U5        O
M  U(       d  OM  [        [        [        X5      5      5      U l        [        U R                  5      U l        U R                   R                  SS5        U R                   R                  5       U l        g)r  r   r)  r:  N)r  r   r   r  r   r   rh  rU  r  r  r  r   r  r  )r    r  r   next_posr"  r   s         r#   r  MMDF._generate_toc  s)   B

H::&&(Dzz(H2W<==h''H::..0D#zz0H2W<<XG%<=!X.  # $ 3v#567	TYY

1 JJOO-r&   r$  r   )
r   r   r   r   r   r$   r  r  r  r   r   r&   r#   r	   r	     s    8
/9.r&   r	   c                       \ rS rSrSrSS jrS rS rS rS r	S	 r
S
 rS rS rS rS rS rS rS rS rS rS rS rS rS rS rS rS rSrg)r   i  zAn MH mailbox.Nc                    [         R                  XX#5        [        R                  R	                  U R
                  5      (       d  U(       a  [        R                  " U R
                  S5        [        R                  " [        R                  " [        R                  R                  U R
                  S5      [        R                  [        R                  -  [        R                  -  S5      5        O[        U R
                  5      eSU l        g)zInitialize an MH instance.r   .mh_sequencesi  FN)r   r$   r   r   r   r   r   r   r!  r   rw  O_EXCLrx  r   r  r   s       r#   r$   MH.__init__  s    W5ww~~djj))U+djj/!J!#bii!7"++!EuN O )44r&   c                    U R                  5       n[        U5      S:X  a  SnO[        U5      S-   n[        R                  R                  U R                  [        U5      5      n[        U5      nSn U R                  (       a  [        U5          U R                  X5        [!        U["        5      (       a  U R%                  X5        U R                  (       a  [        U5        U(       d  [        U5        U$ ! [         aA    U R                  (       a  [        U5        [        U5        Sn[        R                  " U5        e f = f! U R                  (       a  [        U5        f f = f! U(       d  [        U5        f f = f)r(   r   rd  FT)rh   rU  maxr   r   r   r   r   r  r  r  r   r   r  r   r5   r   r   _dump_sequences)r    r-   rh   new_keyr  r'  closeds          r#   r.   MH.add  s   yy{t9>G$i!mG77<<

CL9h'	||1$	&&w2 gy11((:<< OA! % ||$QN!FIIh' << O   A s7   2E' C7 !&E E' 7AEE E$$E' 'E<c                 N   [         R                  R                  U R                  [	        U5      5      n [        US5      nUR                  5         [         R                  " U5        g! [         a2  nUR                  [        R                  :X  a  [        SU-  5      ee SnAff = f)r2   r  r  N)r   r   r   r   r   r!  r   r5   r  r  r  r=   )r    r4   r   r'  r  s        r#   r5   	MH.remove  s{    ww||DJJC1		T5!A GGIIIdO  	ww%,,&83>??		s   A( (
B$2-BB$c                    [         R                  R                  U R                  [	        U5      5      n [        US5      n U R                  (       a  [        U5         [         R                  " [         R
                  " U[         R                  [         R                  -  5      5        U R                  X$5        [!        U["        5      (       a  U R%                  X!5        U R                  (       a  ['        U5        [)        U5        g! [         a2  nUR                  [        R                  :X  a  [        SU-  5      ee SnAff = f! U R                  (       a  ['        U5        f f = f! [)        U5        f = f)rA   r  r  N)r   r   r   r   r   r!  r  r  r  r=   r  r  r   rx  O_TRUNCr   r   r   r7  r  r   )r    r4   r-   r   r'  r  s         r#   rC   MH.__setitem__  s    ww||DJJC1	T5!A	||1$r{{RZZ'?@A""7.gy11((6<< ON#  	ww%,,&83>??		 << O   Ns<   D E) BE  E) 
E-D??EE&&E) )E6c                 "    U R                   (       a>  [        [        R                  R	                  U R
                  [        U5      5      S5      nO>[        [        R                  R	                  U R
                  [        U5      5      S5      n U   U R                   (       a  [        U5         [        U5      nU R                   (       a  [        U5        SSS5        U R                  5       R                  5        H  u  pVX;   d  M  WR!                  U5        M     W$ ! [         a2  nUR                  [        R                  :X  a  [        SU-  5      ee SnAff = f! U R                   (       a  [        U5        f f = f! , (       d  f       N= f)rR   r  r   r  N)r  r!  r   r   r   r   r   r  r  r  r=   r  r   r  get_sequencesrz   add_sequence)r    r4   r'  r  r(  r   key_lists          r#   rK   MH.get_message7  s   		||djj#c(;UCdjj#c(;TB ||1$l<< O  #00288:ND  & ; 
!  	ww%,,&83>??		 << O   QsB   AD =D F /E:F 
E)-EEE==F  
Fc                     U R                   (       a>  [        [        R                  R	                  U R
                  [        U5      5      S5      nO>[        [        R                  R	                  U R
                  [        U5      5      S5      n U   U R                   (       a  [        U5         UR                  5       R                  [        S5      U R                   (       a  [        U5        sSSS5        $ ! [         a2  nUR                  [        R                  :X  a  [        SU-  5      ee SnAff = f! U R                   (       a  [        U5        f f = f! , (       d  f       g= f)r+  r  r   r  Nr   )r  r!  r   r   r   r   r   r  r  r  r=   r  r   r   r   r  r    r4   r'  r  s       r#   rX   MH.get_bytesP  s    		||djj#c(;UCdjj#c(;TB ||1$vvx''7<< O Q  	ww%,,&83>??		 << O   QsB   AC8 =C8 E/#D7E8
D4-D//D47EE
E'c                     [        [        R                  R                  U R                  [        U5      5      S5      n[        U5      $ ! [         a2  nUR                  [        R                  :X  a  [        SU-  5      ee SnAff = f)r_   r   r  N)r!  r   r   r   r   r   r  r  r  r=   r/  rF  s       r#   rN   MH.get_filee  sl    	RWW\\$**c#h7>A !}  	ww%,,&83>??		s   =A
 

B-BBc                 t    [        [        S [        R                  " U R                  5       5       5      5      $ )rb   c              3   f   #    U  H'  nUR                  5       (       d  M  [        U5      v   M)     g 7fr8   )isdigitr  ).0rj  s     r#   	<genexpr>MH.iterkeys.<locals>.<genexpr>r  s(      :3I%). &3u::3Is   11)iterr?  r   rf  r   rc   s    r#   rd   MH.iterkeysp  s/    F :2::djj3I : : ; 	;r&   c                     [         R                  R                  [         R                  R                  U R                  [        U5      5      5      $ rQ  )r   r   r   r   r   r   r3   s     r#   r~   MH.__contains__u  s,    ww~~bggll4::s3x@AAr&   c                 F    [        [        U R                  5       5      5      $ rT  )rU  rg   rd   rc   s    r#   r   
MH.__len__y  s    4())r&   c                    U(       a  SOSnU(       a  SS0O0 n[         R                  R                  U R                  S5      n  [	        USU-   40 UD6$ ! [
         a     Of = f [	        USU-   40 UD6$ ! [         a     Of = fMD  )Nr   bencodingASCIIr2  zr+zx+)r   r   r   r   r!  r  r  )r    textmodekwargsr   s        r#   _open_mh_sequences_fileMH._open_mh_sequences_file}  s    rs*.*g&Bww||DJJ8D$+888$ D$+888"  s$   A 
A"!A"&A6 6
BBc                     U R                   (       d1  U R                  SS9U l        [        U R                  5        SU l         gg)r   FrZ  TN)r  r]  r  r  rc   s    r#   r   MH.lock  s6    ||5555ADJtzz"DL r&   c                     U R                   (       a4  [        U R                  5        [        U R                  5        U ?SU l         ggr  )r  r  r  r   rc   s    r#   r   	MH.unlock  s2    <<$

#
 DL	 r&   c                     g)r   Nr   rc   s    r#   r   MH.flush  r\  r&   c                 H    U R                   (       a  U R                  5         ggr`  )r  r   rc   s    r#   r   MH.close  s    <<KKM r&   c                    / n[         R                  " U R                  5       Hb  n[         R                  R	                  [         R                  R                  U R                  U5      5      (       d  MQ  UR                  U5        Md     U$ )rc  )r   rf  r   r   rg  r   rh  ri  s      r#   rk  MH.list_folders  sW    ZZ

+Eww}}RWW\\$**e<==e$ , r&   c                 |    [        [        R                  R                  U R                  U5      U R
                  SS9$ )z+Return an MH instance for the named folder.Frn  r   r   r   r   r   r   ro  s     r#   rq  MH.get_folder  s-    "'',,tzz62--7 	7r&   c                 z    [        [        R                  R                  U R                  U5      U R
                  S9$ )z:Create a folder and return an MH instance representing it.rt  rk  ro  s     r#   rz  MH.add_folder  s+    "'',,tzz62--) 	)r&   c                 f   [         R                  R                  U R                  U5      n[         R                  " U5      nUS/:X  a5  [         R
                  " [         R                  R                  US5      5        OU/ :X  a  O[        SU R                  -  5      e[         R                  " U5        g)r}  r2  zFolder not empty: %sN)r   r   r   r   rf  r5   r   r  )r    rp  r   entriess       r#   r  MH.remove_folder  sx    ww||DJJ/**T"''IIbggll49:] 6 CDD
r&   c           
          0 n [        [        R                  R                  U R                  S5      SSS9nU   [        U R                  5       5      nU H  n UR                  S5      u  pV[        5       nUR                  5        Hk  nUR                  5       (       a  UR                  [        U5      5        M4  S UR                  S5       5       u  pUR                  [        XS-   5      5        Mm     [        U5       Vs/ s H  nX;   d  M
  UPM     snX'   [        X   5      S	:X  a  X	 M  M     SSS5        U$ ! [
         a    Us $ f = fs  snf ! [          a    [#        S
UR%                  5       -  5      ef = f! , (       d  f       U$ = f)z=Return a name-to-key-list dictionary to define each sequence.r2  rrY  )rX  r   c              3   8   #    U  H  n[        U5      v   M     g 7fr8   )r  )rM  xs     r#   rN  #MH.get_sequences.<locals>.<genexpr>  s     *K?a3q66?s   -rd  r   z"Invalid sequence specification: %sN)r!  r   r   r   r   r  r@  rh   r   rL  r.   r  r   ranger?  rU  r   r   rstrip)r    resultsr'  all_keysr   r   contentsrh   specr  r  r4   s               r#   rA  MH.get_sequences  sa   	RWW\\$**o>gVA 499;'H5%)ZZ_ND5D ( 0<<>> HHSY/*K4::c?*KKE KKeAX(>? !1 5;4L %=LS,/O &)L %=GM7=)Q.#M /  & + ! 	N	%= " 5%&J&*kkm'4 5 55! Q& sM   3D= E>B)E	EEE-E>=EEE'E;;E>>
Fc                    U R                  SS9n [        R                  " [        R                  " UR                  [        R
                  [        R                  -  5      5        UR                  5        H  u  p4[        U5      S:X  a  M  UR                  US-   5        SnSn[        [        U5      5       H_  nUS-
  U:X  a  U(       d  SnUR                  S5        O6U(       a  SnUR                  U< S	U< 35        OUR                  S
U-  5        UnMa     U(       a  UR                  [        U5      S-   5        M  UR                  S5        M     [        U5        g! [        U5        f = f)z:Set sequences using the given name-to-key-list dictionary.Tr`  r   r   NFrd  rw   z %s
)r]  r   r   r!  r   rx  r>  rz   rU  r   r?  r@  r   r   )r    	sequencesr'  r   rh   prev
completingr4   s           r#   set_sequencesMH.set_sequences  s   ((d(3	HHRWWQVVR[[2::%=>?'oo/
t9>s
#"
!#d),CQw$))-JGGCL#%*
4 56,D - GGCI,-GGDM) 0, NKNs   EE! !E.c                     U R                  5       nSn/ nU R                  5        H  nUS-
  U:w  a  UR                  XBS-   45         [        R                  " [        R
                  R                  U R                  [        U5      5      [        R
                  R                  U R                  [        US-   5      5      5        [        R                  " [        R
                  R                  U R                  [        U5      5      5        US-  nM     US-   U l        [        U5      S:X  a  gUR                  5        H*  u  pVU H  u  pxXv;   d  M  XUR!                  U5      '   M!     M,     U R#                  U5        g! [        [        4 a    [        R                  " [        R
                  R                  U R                  [        U5      5      [        R
                  R                  U R                  [        US-   5      5      5         GNf = f)z?Re-name messages to eliminate numbering gaps. Invalidates keys.r   rd  N)rA  rd   rh  r   r  r   r   r   r   unlinkr  r  r  r  rU  rz   indexr  )	r    r  r  changesr4   r   rC  oldr   s	            r#   packMH.pack  s|   &&(	==?CQw$AX/BGGBGGLLSX>GGLLS]CE IIbggll4::s3x@AAID # w<1'oo/ND#?47X^^C01 $ 0 	9% '8 GIIbggll4::s3x@ ggll4::s4!8}EGGs   A<E==BHHc                 "   UR                  5       nU R                  5       nUR                  5        H5  u  pVXS;   a  UR                  U5        M  X&;   d  M$  XfR                  U5      	 M7     U H  nXt;  d  M
  U/XG'   M     U R	                  U5        g)z;Inspect a new MHMessage and update sequences appropriately.N)rA  rz   rh  r  r  )r    r-   r4   pending_sequencesall_sequencesr   rC  sequences           r#   r7  MH._dump_sequences  s    #113**,+113ND($^^C01	 4
 *H,+.%' * 	=)r&   )r  r  r  r   )r   r   r   r   r   r$   r.   r5   rC   rK   rX   rN   rd   r~   r   r]  r   r   r   r   rk  rq  rz  r  rA  r  r  r7  r   r   r&   r#   r   r     sz    
 D02$*	;
B* !
7
)

8:&4*r&   r   c                   ~    \ rS rSrSr\" 1 Sk5      rSS jrS rS r	S r
S	 rS
 rS rS rS rS rS rS rS rSrg)r   i#  zAn Rmail-style Babyl mailbox.>   filededitedresentunseendeletedanswered	forwardedNc                 >    [         R                  XX#5        0 U l        g)zInitialize a Babyl mailbox.N)r  r$   _labelsr   s       r#   r$   Babyl.__init__)  s    ##D@r&   c                     [         R                  X5      n[        U[        5      (       a  UR	                  5       U R
                  U'   U$ )r(   )r  r.   r   r   
get_labelsr  )r    r-   r4   s      r#   r.   	Babyl.add.  s;     $$T3g|,, ' 2 2 4DLL
r&   c                 h    [         R                  X5        XR                  ;   a  U R                  U	 ggr  )r  r5   r  r3   s     r#   r5   Babyl.remove5  s+    !!$,,,S! r&   c                     [         R                  XU5        [        U[        5      (       a  UR	                  5       U R
                  U'   gg)rA   N)r  rC   r   r   r  r  rB   s      r#   rC   Babyl.__setitem__;  s;    &&t':g|,, ' 2 2 4DLL -r&   c                    U R                  U5      u  p#U R                  R                  U5        U R                  R                  5         [        R
                  " 5       n U R                  R                  5       nUS[        -   :X  d  U(       d  O'UR                  UR                  [        S5      5        MV  [        R
                  " 5       n U R                  R                  5       nU[        :X  d  U(       d  O'UR                  UR                  [        S5      5        MS  X0R                  R                  5       -
  nUS:  d   eU R                  R                  U5      nUR                  [        S5      n[        UR                  5       U-   5      n	U	R                  UR                  5       5        XR                  ;   a  U	R                  U R                  U   5        U	$ )rR      *** EOOH ***r   r   )r  r  r   r   r   r   r   r   r   r  r   r   r   set_visibler  
set_labels)
r    r4   r  r  original_headersr   visible_headersnbodyr(  s
             r#   rK   Babyl.get_messageA  sc   ll3'



::<::&&(D00""4<<#?@	 
 **,::&&(Dwd!!$,,w">?	  ::??$$Avvzzq!||GU++446=>0023,,NN4<<,-
r&   c                    U R                  U5      u  p#U R                  R                  U5        U R                  R                  5         [        R
                  " 5       n U R                  R                  5       nUS[        -   :X  d  U(       d  O'UR                  UR                  [        S5      5        MV   U R                  R                  5       nU[        :X  d  U(       d  OM.  UR                  5       nX0R                  R                  5       -
  nUS:  d   eU R                  R                  U5      nUR                  [        S5      nXh-   $ )r  r  r   r   )r  r  r   r   r   r   r   r   r   r   r  r   )	r    r4   r  r  r  r   headersr  r   s	            r#   rX   Babyl.get_bytes]  s   ll3'



::<::&&(D00""4<<#?@	 
 ::&&(Dwd  #++-::??$$Avvzzq!||GU+~r&   c                 t    [         R                  " U R                  U5      R                  S[        5      5      $ )r_   r   )r   r   rX   r   r   r3   s     r#   rN   Babyl.get_files  s'    zz$..-55eWEFFr&   c                     U R                  5         [        5       nU R                  R                  5        H  nUR	                  U5        M     UR                  U R                  5        [        U5      $ )z4Return a list of user-defined labels in the mailbox.)r  r@  r  rt   r   difference_update_special_labelsrg   )r    labels
label_lists      r#   r  Babyl.get_labelsw  sS    ,,--/JMM*% 0  !5!56F|r&   c                 f   / / p!U R                   R                  S5        Sn/ n UnU R                   R                  5       nU R                   R                  5       nUS[        -   :X  a  [        U5      [        U5      :  a!  UR                  U[        [        5      -
  5        UR                  U5        U R                   R                  5       SS R                  S5       Vs/ s H*  nUR                  5       (       d  M  UR                  5       PM,     nnUR                  U5        OvUS:X  d  US[        -   :X  a:  [        U5      [        U5      :  a!  UR                  U[        [        5      -
  5        O)U(       d"  UR                  U[        [        5      -
  5        OGMy  [        [        [        X5      5      5      U l        [        [        U5      5      U l        [        U R                  5      U l        U R                   R                  SS5        U R                   R                  5       U l        gs  snf )r  r   s   rd  N   ,   r:  )r  r   r   r  r   rU  rh  r   stripr  r  r  r   r  r  r  )	r    r  r   r.  label_listsr"  r   labelr  s	            r#   r  Babyl._generate_toc  s   B

H::&&(Dzz(H{W,,u:F+LLCL!89h'+/::+>+>+@+D+J+J4+P:+P -2+0;;= (%++-+P  : ""6*DGg,=$=u:F+LLCL!89XG45# $ 3v#567	Ik23TYY

1 JJOO-:s   H.<H.c                     S[         -   nUS[         -   -  nU R                  5       nS U 5       nUSSR                  U5      -   [         -   -  nUS-  nUR                  U5        g)r  s   BABYL OPTIONS:s
   Version: 5c              3   @   #    U  H  oR                  5       v   M     g 7fr8   )r   )rM  r  s     r#   rN  *Babyl._pre_mailbox_hook.<locals>.<genexpr>  s     5fU,,..fs   s   Labels:r  r  N)r   r  r   r   )r    r'  babylr  s       r#   r  Babyl._pre_mailbox_hook  sc    !G+(("5f5dii//'99	r&   c                 4    UR                  S[        -   5        g)r     Nr  r  s     r#   r  Babyl._pre_message_hook  s    	'!"r&   c                 4    UR                  [        S-   5        g)r  r  Nr  r  s     r#   r  Babyl._post_message_hook  s    	'!"r&   c                    U R                   R                  5       n[        U[        5      (       Ga  / n/ nUR	                  5        H6  nXPR
                  ;   a  UR                  U5        M%  UR                  U5        M8     U R                   R                  S5        U H/  nU R                   R                  SUR                  5       -   5        M1     U R                   R                  S5        U H2  nU R                   R                  SUR                  5       -   S-   5        M4     U R                   R                  [        5        O"U R                   R                  S[        -   5        [        U[        R                  R                  5      (       Ga1  [        R                  " 5       n[        R                  R!                  USS5      nUR#                  U5        UR%                  S5         UR'                  5       nU R                   R                  UR)                  S
[        5      5        US
:X  d  U(       d  OMO  U R                   R                  S[        -   5        [        U[        5      (       a  [        R                  " 5       n	[        R                  R!                  U	SS5      n
U
R#                  UR+                  5       5         U	R'                  5       nU R                   R                  UR)                  S
[        5      5        US
:X  d  U(       d  OcMO  UR%                  S5         UR'                  5       nU R                   R                  UR)                  S
[        5      5        US
:X  d  U(       d  OMO   UR-                  S5      nU(       d  GOU R                   R                  UR)                  S
[        5      5        MK  [        U[.        [0        [        R2                  45      (       Ga  [        U[        R2                  5      (       a,  [4        R6                  " S[8        S5        UR;                  5       n[        U[0        5      (       a  U R=                  U5      nUR?                  S5      S-   nUS-
  S:w  a  U R                   R                  USU R)                  S
[        5      5        U R                   R                  S[        -   5        U R                   R                  USU R)                  S
[        5      5        U R                   R                  XS R)                  S
[        5      5        GO6U R                   R                  S[        -   [        -   5        U R                   R                  UR)                  S
[        5      5        GO[A        US5      (       Ga  [A        US5      (       a(  [4        R6                  " S[8        S5        URB                  nUR                  5       nS	n UR'                  5       nURE                  S5      (       a	  USS S
-   nOURE                  S5      (       a  USS S
-   nU R                   R                  UR)                  S
[        5      5        US
:X  d  U(       d>  U(       a6  SnU R                   R                  S[        -   5        UR%                  U5        OOM   UR'                  5       nU(       d  OURE                  S5      (       a  USS [        -   nOEURE                  S5      (       a  USS [        -   nO"URE                  S
5      (       a  USS [        -   nU R                   R                  U5        M  [G        S[I        U5      -  5      eU R                   R                  5       nX/4$ )z0Write message contents and return (start, stop).   1s   , s   ,,    r  s   1,,Fr   Tr   r  r  r   r   s   

r:  r   Nr   r   r   r   r   r   r   )%r  r  r   r   r  r  rh  r   r   r   rV   r-   r
   r   r   r   r   r   r   r   r   get_visibler   r   r   r   r   r   r   r   r   r	  r   r   r   r   r   )r    r-   r  special_labelsr  r  orig_bufferorig_generatorr   
vis_buffervis_generatorr   
body_startoriginal_pos
first_passr  s                   r#   r  Babyl._install_message  s   

!g|,,NF ++-000"))%0MM%(	 .
 JJT"'

  !78 (JJU#

  !6!=>  JJW%JJVg-.gu}}4455**,K"__;;KPQRN""7+Q"++-

  eW!=>5=	 
 JJ_w67'<00ZZ\
 % > >z5RS T%%g&9&9&;<%..0DJJ$$T\\%%ABu}D	    #&//1DJJ$$T\\%%ABu}D	 
 $))$/

  w!?@	 
 %bkk!:;;'2;;// *+=qB!**,'3''//8 g.2JA~#

  *!5!=!=eW!MN

  7!:;

  *!5!=!=eW!MN

  !5!=!=eW!MN

  7!:W!DE

  !@AWj))w)) 56H!M!.."<<>LJ'')==))9u,D]]5))9u,D

  eW!=>5=!%*


((7)BC\2  '')==))9w.D]]5))9w.D]]5))9w.D

  &  6gFGGzz }r&   )r  r  r  r   r   )r   r   r   r   r   	frozensetr  r$   r.   r5   rC   rK   rX   rN   r  r  r  r  r  r  r   r   r&   r#   r   r   #  sY    ' !B CO
"58,G.<##ir&   r   c                   .    \ rS rSrSrSS jrS rS rSrg)	r
   i  z0Message with mailbox-format-specific properties.Nc                 Z   [        U[        R                  R                  5      (       aM  U R	                  [
        R                  " U5      5        [        U[        5      (       a  UR                  U 5        gg[        U[        5      (       a&  U R	                  [        R                  " U5      5        g[        U[        5      (       a&  U R	                  [        R                  " U5      5        g[        U[        R                  5      (       a&  U R	                  [        R                  " U5      5        g[        US5      (       a&  U R	                  [        R                   " U5      5        gUc*  [        R                  R                  R#                  U 5        g[%        S['        U5      -  5      e)zInitialize a Message instance.r   Nr   )r   rV   r-   r
   _become_messagecopydeepcopy_explain_tor   rW   r   message_from_stringr   TextIOWrappermessage_from_filer   message_from_binary_filer$   r   r   r,   s     r#   r$   Message.__init__  s    gu}}4455  w!78'7++##D) ,''  !9!9'!BC%%  !:!:7!CD!1!122  !8!8!ABWf%%  !?!?!HI_MM!!**406gFGGr&   c                     [        US/ 5      nUR                   H&  nX2;  d  M
  UR                  U   U R                  U'   M(     g)z0Assume the non-format-specific state of message._type_specific_attributesN)getattr__dict__)r    r-   type_specificr   s       r#   r  Message._become_message2  s@    )DbI$$D(&-&6&6t&<d# %r&   c                 D    [        U[        5      (       a  g[        S5      e)z:Copy format-specific state to message insofar as possible.Nz Cannot convert to specified type)r   r
   r   r,   s     r#   r  Message._explain_to9  s    gw''>??r&   r   r8   )	r   r   r   r   r   r$   r  r  r   r   r&   r#   r
   r
     s    :H&=@r&   r
   c                   l    \ rS rSrSr/ SQrSS jrS rS rS r	S	 r
S
 rS rS rS rS rS rS rSrg)r   iA  z)Message with Maildir-specific properties.)_subdir_info_dateNc                 ~    SU l         SU l        [        R                  " 5       U l        [        R                  X5        g)z%Initialize a MaildirMessage instance.r   r   N)r  r  r  r  r
   r$   r,   s     r#   r$   MaildirMessage.__init__F  s+    
YY[
'r&   c                     U R                   $ )zReturn 'new' or 'cur'.)r  rc   s    r#   r   MaildirMessage.get_subdirM  s    ||r&   c                 D    US:X  d  US:X  a  Xl         g[        SU-  5      e)zSet subdir to 'new' or 'cur'.r   r   z!subdir must be 'new' or 'cur': %sN)r  r   )r    r
  s     r#   r"  MaildirMessage.set_subdirQ  s%    U?fo!L@6IJJr&   c                 b    U R                   R                  S5      (       a  U R                   SS $ g)*Return as a string the flags that are set.r9  r:  Nr   )r  r   rc   s    r#   r;  MaildirMessage.get_flagsX  s*    ::  &&::ab>!r&   c                 H    SSR                  [        U5      5      -   U l        g))Set the given flags and unset all others.r9  r   N)r   r?  r  )r    r=  s     r#   rA  MaildirMessage.set_flags_  s    BGGF5M22
r&   c                     U R                  SR                  [        U R                  5       5      [        U5      -  5      5        gz.Set the given flag(s) without changing others.r   NrA  r   r@  r;  r    rC  s     r#   rG  MaildirMessage.add_flagc  ,    rwws4>>#34s4y@ABr&   c                     U R                  5       (       aD  U R                  SR                  [        U R                  5       5      [        U5      -
  5      5        gg)7Unset the given string flag(s) without changing others.r   N)r;  rA  r   r@  r  s     r#   rJ  MaildirMessage.remove_flagg  s>    >>NN2773t~~'7#83t9#DEF r&   c                     U R                   $ )z<Return delivery date of message, in seconds since the epoch.)r  rc   s    r#   r  MaildirMessage.get_datel      zzr&   c                 `     [        U5      U l        g! [         a    [        SU-  5      Sef = f)z9Set delivery date of message, in seconds since the epoch.zcan't convert to float: %sN)floatr  r   r   )r    dates     r#   r$  MaildirMessage.set_datep  s7    	KtDJ 	K84?@dJ	Ks    -c                     U R                   $ )z%Get the message's "info" as a string.)r  rc   s    r#   r   MaildirMessage.get_infow  r  r&   c                 h    [        U[        5      (       a  Xl        g[        S[	        U5      -  5      e)z Set the message's "info" string.zinfo must be a string: %sN)r   r   r  r   r   )r    r3  s     r#   r#  MaildirMessage.set_info{  s)    dC  J7$t*DEEr&   c                    [        U[        5      (       a^  UR                  U R                  5       5        UR	                  U R                  5       5        UR                  U R                  5       5        g[        U[        5      (       a  [        U R                  5       5      nSU;   a  UR                  S5        U R                  5       S:X  a  UR                  S5        SU;   a  UR                  S5        SU;   a  UR                  S5        SU;   a  UR                  S5        UR                  S	[        R                  " U R                  5       5      5        g[        U[        5      (       a`  [        U R                  5       5      nSU;  a  UR                  S
5        SU;   a  UR                  S5        SU;   a  UR                  S5        gg[        U[         5      (       aw  [        U R                  5       5      nSU;  a  UR#                  S
5        SU;   a  UR#                  S5        SU;   a  UR#                  S5        SU;   a  UR#                  S5        gg[        U[$        5      (       a  g['        S[)        U5      -  5      e)z;Copy Maildir-specific state to message insofar as possible.SRr   OTDFAMAILER-DAEMONr  repliedflaggedr  r  r  r  $Cannot convert to specified type: %sN)r   r   rA  r;  r"  r   r$  r  r
  r@  rG  r  r  r  r   rB  r   	add_labelr
   r   r   )r    r-   r=  s      r#   r  MaildirMessage._explain_to  s   g~..dnn./t01T]]_-!122()Ee|  % E)  %e|  %e|  %e|  %_dkk$--/.JK++()E%$$X.e|$$Y/e|$$Y/ ..()E%!!(+e|!!),e|!!*-e|!!+. ))B M* + +r&   )r  r  r  r8   )r   r   r   r   r   r  r$   r   r"  r;  rA  rG  rJ  r  r$  r   r#  r  r   r   r&   r#   r   r   A  sL    3 =(K3CG
KF)+r&   r   c                   V    \ rS rSrSrS/rSS jrS rSS jrS r	S	 r
S
 rS rS rSrg)r
  i  z/Message with mbox- or MMDF-specific properties._fromNc                    U R                  SS5        [        U[        R                  R                  5      (       a=  UR                  5       nUb*  UR                  S5      (       a  U R                  USS 5        [        R                  X5        g)z'Initialize an mboxMMDFMessage instance.r  TNzFrom r   )r  r   rV   r-   r
   r  r   r$   )r    r-   r   s      r#   r$   _mboxMMDFMessage.__init__  sk    ot,gu}}4455++-H#(;(;G(D(Dhqrl+'r&   c                     U R                   $ )z Return contents of "From " line.r  rc   s    r#   r  _mboxMMDFMessage.get_from  r  r&   c                     Ub6  USL a  [         R                  " 5       nUS[         R                  " U5      -   -  nXl        g)z>Set "From " line, formatting and appending time_ if specified.NTr  )r  r  r  r  )r    r  time_s      r#   r  _mboxMMDFMessage.set_from  s7    }S4<<...E
r&   c                 L    U R                  SS5      U R                  SS5      -   $ )r  Statusr   X-Status)rH   rc   s    r#   r;  _mboxMMDFMessage.get_flags  s#    xx"%R(@@@r&   c                    [        U5      nSu  p#S H  nXA;   d  M
  X$-  nUR                  U5        M!     S H  nXA;   d  M
  X4-  nUR                  U5        M!     USR                  [        U5      5      -  n U R	                  SU5         U R	                  SU5        g! [
         a    U R                  SU5         N2f = f! [
         a    U R                  SU5         gf = f)r  )r   r   )r  r  )r  r  r  r   r(  r)  N)r@  r5   r   r?  replace_headerr=   
add_header)r    r=  status_flagsxstatus_flagsrC  s        r#   rA  _mboxMMDFMessage.set_flags  s    E
&,#D}$T"  $D}%T" $ 	//	4,7	7
M:  	4OOHl3	4  	7OOJ6	7s$   8B C  B=<B= CCc                     U R                  SR                  [        U R                  5       5      [        U5      -  5      5        gr  r  r  s     r#   rG  _mboxMMDFMessage.add_flag  r   r&   c                     SU ;   d  SU ;   aD  U R                  SR                  [        U R                  5       5      [        U5      -
  5      5        gg)r  r(  r)  r   Nr  r  s     r#   rJ  _mboxMMDFMessage.remove_flag  s@    tzT1NN2773t~~'7#83t9#DEF  2r&   c                 >   [        U[        5      (       a  [        U R                  5       5      nSU;   a  UR	                  S5        SU;   a  UR                  S5        SU;   a  UR                  S5        SU;   a  UR                  S5        SU;   a  UR                  S5        US		 US
	 SR                  U R                  5       R                  5       SS 5      n UR                  [        R                  " [        R                  " US5      5      5        g[        U[         5      (       a?  UR#                  U R                  5       5        UR%                  U R                  5       5        g[        U[&        5      (       ae  [        U R                  5       5      nSU;  a  UR)                  S5        SU;   a  UR)                  S5        SU;   a  UR)                  S5        US		 US
	 g[        U[*        5      (       ae  [        U R                  5       5      nSU;  a  UR-                  S5        SU;   a  UR-                  S5        SU;   a  UR-                  S5        US		 US
	 g[        U[.        5      (       a  g[1        S[3        U5      -  5      e! [        [        4 a     gf = f)zACopy mbox- or MMDF-specific state to message insofar as possible.r  r   r  r  r  r  r  r  statuszx-statusr  Nz%a %b %d %H:%M:%S %Yr  r  r  r  r  r  )r   r   r@  r;  r"  rG  r   r  r   r$  calendartimegmr  strptimer   OverflowErrorr
  rA  r  r   rB  r   r  r
   r   r   )r    r-   r=  
maybe_dates       r#   r  _mboxMMDFMessage._explain_to  sH   g~..()Ee|""5)e|  %e|  %e|  %e|  %!
#$--/"7"7"9"#">?J  z6L2N "O P !122dnn./T]]_-++()E%$$X.e|$$Y/e|$$Y/!
#..()E%!!(+e|!!),e|!!*-!
#))B M* + +9 . s   :J	 	JJr"  r8   )r   r   r   r   r   r  r$   r  r  r;  rA  rG  rJ  r  r   r   r&   r#   r
  r
    s8    9!(	(A7,CG
1+r&   r
  c                       \ rS rSrSrSrg)r   i  z&Message with mbox-specific properties.r   Nr   r   r   r   r   r   r   r&   r#   r   r         0r&   r   c                   F    \ rS rSrSrS/rSS jrS rS rS r	S	 r
S
 rSrg)r   i#  z$Message with MH-specific properties.
_sequencesNc                 <    / U l         [        R                  X5        g)z!Initialize an MHMessage instance.N)rB  r
   r$   r,   s     r#   r$   MHMessage.__init__(  s    'r&   c                      U R                   SS $ )z4Return a list of sequences that include the message.NrB  rc   s    r#   rA  MHMessage.get_sequences-  s    q!!r&   c                 $    [        U5      U l        g)z3Set the list of sequences that include the message.N)rg   rB  )r    r  s     r#   r  MHMessage.set_sequences1  s    y/r&   c                     [        U[        5      (       a,  XR                  ;  a  U R                  R                  U5        gg[	        S[        U5      -  5      e)z8Add sequence to list of sequences including the message.zsequence type must be str: %sN)r   r   rB  rh  r   r   r    r  s     r#   rB  MHMessage.add_sequence5  sG    h$$.&&x0 / ;d8nLMMr&   c                 \     U R                   R                  U5        g! [         a     gf = f)zARemove sequence from the list of sequences including the message.N)rB  r5   r   rK  s     r#   remove_sequenceMHMessage.remove_sequence=  s+    	OO""8, 		    
++c                    [        U[        5      (       a  [        U R                  5       5      nSU;   a  UR	                  S5        O"UR	                  S5        UR                  S5        SU;   a  UR                  S5        SU;   a  UR                  S5        gg[        U[        5      (       ar  [        U R                  5       5      nSU;  a  UR                  S5        OUR                  S	5        SU;   a  UR                  S5        SU;   a  UR                  S
5        gg[        U[        5      (       a)  U R                  5        H  nUR                  U5        M     g[        U[        5      (       aI  [        U R                  5       5      nSU;   a  UR                  S5        SU;   a  UR                  S5        gg[        U[        5      (       a  g[        S[        U5      -  5      e)z6Copy MH-specific state to message insofar as possible.r  r   r  r  r  r  r  ROr  r  r  r  N)r   r   r@  rA  r"  rG  r
  r   rB  r   r  r
   r   r   )r    r-   r  r  s       r#   r  MHMessage._explain_toD  s   g~..D..01I9$""5)""5)  %I%  %I%  % &!122D..01Iy(  &  %I%  %I%  % &++ ..0$$X. 1..D..01I9$!!(+I%!!*- &))B M* + +r&   rF  r8   )r   r   r   r   r   r  r$   rA  r  rB  rN  r  r   r   r&   r#   r   r   #  s,    .!-(
"*N$+r&   r   c                   Z    \ rS rSrSrSS/rSS jrS rS rS	 r	S
 r
S rS rS rS rSrg)r   ik  z'Message with Babyl-specific properties.r  _visibleNc                 Z    / U l         [        5       U l        [        R                  X5        g)z#Initialize a BabylMessage instance.N)r  r
   rU  r$   r,   s     r#   r$   BabylMessage.__init__p  s     	'r&   c                      U R                   SS $ )z'Return a list of labels on the message.N)r  rc   s    r#   r  BabylMessage.get_labelsv  s    ||Ar&   c                 $    [        U5      U l        g)z&Set the list of labels on the message.N)rg   r  )r    r  s     r#   r  BabylMessage.set_labelsz  s    F|r&   c                     [        U[        5      (       a,  XR                  ;  a  U R                  R                  U5        gg[	        S[        U5      -  5      e)z+Add label to list of labels on the message.zlabel must be a string: %sN)r   r   r  rh  r   r   r    r  s     r#   r  BabylMessage.add_label~  sG    eS!!LL(##E* ) 84;FGGr&   c                 \     U R                   R                  U5        g! [         a     gf = f)z4Remove label from the list of labels on the message.N)r  r5   r   r]  s     r#   remove_labelBabylMessage.remove_label  s+    	LL& 		rP  c                 ,    [        U R                  5      $ )z3Return a Message representation of visible headers.r
   rU  rc   s    r#   r  BabylMessage.get_visible  s    t}}%%r&   c                 $    [        U5      U l        g)z2Set the Message representation of visible headers.Nrc  )r    visibles     r#   r  BabylMessage.set_visible  s    (r&   c                    U R                   R                  5        H5  nX;   a   U R                   R                  XU   5        M(  U R                   U	 M7     S H,  nX;   d  M
  XR                   ;  d  M  X   U R                   U'   M.     g)z9Update and/or sensibly generate a set of visible headers.)DateFromzReply-ToToCCSubjectN)rU  rh   r,  )r    headers     r#   update_visibleBabylMessage.update_visible  sl    mm((*F~,,V&\BMM&)	 +
 JF~&"=(,f% Jr&   c                 J   [        U[        5      (       a  [        U R                  5       5      nSU;   a  UR	                  S5        O"UR	                  S5        UR                  S5        SU;   d  SU;   a  UR                  S5        SU;   a  UR                  S5        S	U;   a  UR                  S
5        gg[        U[        5      (       ar  [        U R                  5       5      nSU;  a  UR                  S5        OUR                  S5        S	U;   a  UR                  S5        SU;   a  UR                  S5        gg[        U[        5      (       aI  [        U R                  5       5      nSU;   a  UR                  S5        SU;   a  UR                  S5        gg[        U[        5      (       aH  UR                  U R                  5       5        U R                  5        H  nUR                  U5        M     g[        U[        5      (       a  g[        S[        U5      -  5      e)z9Copy Babyl-specific state to message insofar as possible.r  r   r  r  r  r  r  r  r  r  rR  r  r  r  r  r  N)r   r   r@  r  r"  rG  r
  r   rB  r   r  r  r  r
   r   r   )r    r-   r  r  s       r#   r  BabylMessage._explain_to  s   g~..*+F6!""5)""5)  %f$F(:  %V#  %F"  % #!122*+Fv%  &  %F"  %V#  % $++*+F6!$$X.V#$$Y/ $.. 0 0 23*!!%( +))B M* + +r&   )r  rU  r8   )r   r   r   r   r   r  r$   r  r  r  r`  r  r  ro  r  r   r   r&   r#   r   r   k  s>    1!*J 7($H&)	5'+r&   r   c                       \ rS rSrSrSrg)r   i  z&Message with MMDF-specific properties.r   Nr?  r   r&   r#   r   r     r@  r&   r   c                       \ rS rSrSrSS jrSS jrSS jrSS jrSS jr	S	 r
S
 rSS jrS rS rS rS rS rS rS rS r\S 5       r\" \5      rSrg)r/  i  zA read-only wrapper of a file.Nc                 N    Xl         Uc  UR                  5       U l        gX l        g)zInitialize a _ProxyFile.N)r  r  _pos)r    r'  poss      r#   r$   _ProxyFile.__init__  s    
;DIIr&   c                 L    U R                  XR                  R                  5      $ zRead bytes.)_readr  r   r    sizes     r#   r   _ProxyFile.read  s    zz$

00r&   c                 L    U R                  XR                  R                  5      $ rz  )r{  r  read1r|  s     r#   r  _ProxyFile.read1  s    zz$

 0 011r&   c                 L    U R                  XR                  R                  5      $ )zRead a line.)r{  r  r   r|  s     r#   r   _ProxyFile.readline  s    zz$

 3 344r&   c                 v    / nU  H0  nUR                  U5        Uc  M  U[        U5      -  nUS::  d  M/    U$    U$ )zRead multiple lines.r   )rh  rU  )r    sizehintr   r   s       r#   	readlines_ProxyFile.readlines  sG    DMM$#CI%q=  r&   c              #   v   #    U R                  5       =n(       a  Uv   U R                  5       =n(       a  M  gg7f)zIterate over lines.N)r   )r    r   s     r#   rq   _ProxyFile.__iter__  s1     mmo%d%J mmo%d%%s   399c                     U R                   $ )zReturn the position.)rv  rc   s    r#   r  _ProxyFile.tell  s    yyr&   c                     US:X  a%  U R                   R                  U R                  5        U R                   R                  X5        U R                   R                  5       U l        g)zChange position.rd  Nr  r   rv  r  r    offsetwhences      r#   r   _ProxyFile.seek  s?    Q;JJOODII&

'JJOO%	r&   c                     [        U S5      (       a9   [        U R                  S5      (       a  U R                  R                  5         U ?gg! U ?f = f)zClose the file.r  r   N)r   r  r   rc   s    r#   r   _ProxyFile.close   sH    4!!4::w//JJ$$&J "
 Js   5A Ac                     Uc  SnU R                   R                  U R                  5        U" U5      nU R                   R                  5       U l        U$ )z"Read size bytes using read_method.r   r  )r    r}  read_methodr   s       r#   r{  _ProxyFile._read	  sA    <D

		"T"JJOO%	r&   c                     U $ )z$Context management protocol support.r   rc   s    r#   	__enter___ProxyFile.__enter__  s    r&   c                 $    U R                  5         g r8   )r   )r    excs     r#   __exit___ProxyFile.__exit__  s    

r&   c                 6    U R                   R                  5       $ r8   )r  readablerc   s    r#   r  _ProxyFile.readable      zz""$$r&   c                 6    U R                   R                  5       $ r8   )r  writablerc   s    r#   r  _ProxyFile.writable  r  r&   c                 6    U R                   R                  5       $ r8   )r  seekablerc   s    r#   r  _ProxyFile.seekable  r  r&   c                 6    U R                   R                  5       $ r8   )r  r   rc   s    r#   r   _ProxyFile.flush"  s    zz!!r&   c                     [        U S5      (       d  g[        U R                  S5      (       d  gU R                  R                  $ )Nr  Tr9  F)r   r  r9  rc   s    r#   r9  _ProxyFile.closed%  s6    tW%%tzz8,,zz   r&   )r  rv  r8   r   )r   r   r   r   r   r$   r   r  r   r  rq   r  r   r   r{  r  r  r  r  r  r   propertyr9  r   r   r   r   r   r&   r#   r/  r/    sv    (125	
&%%%" ! ! $L1r&   r/  c                   >    \ rS rSrSrS
S jrS rSS jrS rS r	S	r
g)r  i0  z&A read-only wrapper of part of a file.Nc                 H    [         R                  XU5        X l        X0l        g)zInitialize a _PartialFile.N)r/  r$   _start_stop)r    r'  r  r  s       r#   r$   _PartialFile.__init__3  s    DU+
r&   c                 F    [         R                  U 5      U R                  -
  $ )z*Return the position with respect to start.)r/  r  r  rc   s    r#   r  _PartialFile.tell9  s    t$t{{22r&   c                     US:X  a  U R                   U l        SnOUS:X  a  U R                  U l        Sn[        R	                  XU5        g)z8Change position, possibly with respect to start or stop.r   rd  r:  N)r  rv  r  r/  r   r  s      r#   r   _PartialFile.seek=  s>    Q;DIFq[

DIFf-r&   c                     U R                   U R                  -
  nUS::  a  gUb  US:  d  X:  a  Un[        R                  XU5      $ )z;Read size bytes using read_method, honoring start and stop.r   r&   )r  rv  r/  r{  )r    r}  r  	remainings       r#   r{  _PartialFile._readG  sF    JJ*	><4!8t'7DK88r&   c                 ,    [        U S5      (       a  U ?g g )Nr  )r   r  rc   s    r#   r   _PartialFile.closeP  s     4!!
 "r&   )rv  r  r  )NNr  )r   r   r   r   r   r$   r  r   r{  r   r   r   r&   r#   r  r  0  s    03.9r&   r  c                    Sn [         (       a7   [         R                  " U [         R                  [         R                  -  5        U(       a|   [        U R                  S-   5      nUR                  5           [        R                  " UR                  U R                  S-   5        Sn[        R                  " UR                  5        gg! [         a[  nUR
                  [
        R                  [
        R                  [
        R                  4;   a  [        SU R                  -  5      ee SnAff = f! [         a9  nUR
                  [
        R                  [
        R                  4;   a   SnAge SnAff = f! [         ["        4 a3    [        R$                  " UR                  U R                  S-   5        Sn gf = f! [&         a9    [        R(                  " UR                  5        [        SU R                  -  5      ef = f!   [         (       a%  [         R                  " U [         R*                  5        U(       a#  [        R(                  " U R                  S-   5        e = f)z(Lock file f using lockf and dot locking.Fzlockf: lock unavailable: %sN.lockTzdot lock unavailable: %s)fcntllockfLOCK_EXLOCK_NBr  r  EAGAINr  r  r   r   r  r   r   r  r  r  r  r  r  r5   LOCK_UN)r'  r  dotlock_doner  pre_locks        r#   r  r  W  s   L%5Au}}u}}<= ,QVVg-=> 1-GGHMM166G+;<#'L
 IIhmm,#   77u||U\\5;;GG,-J-.VV.4 5 5   77u||U[[99	 '8 (IIhmmQVVg-=>#'L(
 # 1		(--(()C)**0 1 115KK5==)IIaffw&'s   H 6C
 H (D2 80E8 ( F> 

D/AD**D//H 2
E5<.E0*H /E00E55H 8A F;8F> :F;;F> >AHH AI!c                    [         (       a%  [         R                  " U [         R                  5        [        R                  R                  U R                  S-   5      (       a$  [        R                  " U R                  S-   5        gg)z*Unlock file f using lockf and dot locking.r  N)r  r  r  r   r   r   r   r5   r'  s    r#   r  r    sO    uAu}}%	ww~~affw&''
		!&&7"# (r&   c                    [         R                  " U [         R                  [         R                  -  [         R                  -  S5      n [        U S5      [         R
                  " U5        $ ! [         R
                  " U5        f = f)zCCreate a file if it doesn't exist and open for reading and writing.rv  r  )r   r!  rw  r3  O_RDWRr   )r   fds     r#   r  r    sP    	rzzBII-		95	ABD% 
s   
A, ,Bc           
          [        U < S[        [        R                  " 5       5      < S[        R                  " 5       < S[
        R                  " 5       < 35      $ )zBCreate a temp file based on path and open for reading and writing.re  )r  r  r  r  r  r   r  )r   s    r#   r  r    s8    dC		4D.4.@.@.B.0iik; < <r&   c                     U R                  5         [        [        S5      (       a%  [        R                  " U R	                  5       5        gg)z0Ensure changes to file f are physically on disk.fsyncN)r   r   r   r  filenor  s    r#   r  r    s/    GGIr7
 r&   c                 :    [        U 5        U R                  5         g)z:Close file f, ensuring all changes are physically on disk.N)r  r   r  s    r#   r   r     s    NGGIr&   c                       \ rS rSrSrSrg)r   i  z"Raised for module-specific errors.r   Nr?  r   r&   r#   r   r     s    ,r&   r   c                       \ rS rSrSrSrg)r   i  z:The specified mailbox does not exist and won't be created.r   Nr?  r   r&   r#   r   r     s    Dr&   r   c                       \ rS rSrSrSrg)r   i  z>The specified mailbox is not empty and deletion was requested.r   Nr?  r   r&   r#   r   r     s    Hr&   r   c                       \ rS rSrSrSrg)r   i  z)Another process caused an action to fail.r   Nr?  r   r&   r#   r   r         3r&   r   c                       \ rS rSrSrSrg)r   i  z)A file appears to have an invalid format.r   Nr?  r   r&   r#   r   r     r  r&   r   )T)2r   r   r  r8  r  r  r  r   rV   email.messageemail.generatorr   rL   typesr   r  ImportError__all__r   r   r   r   r  r  r   r	   r   r   r-   r
   r   r
  r   r   r   r   r/  r  r  r  r  r  r  r   	Exceptionr   r   r   r   r   r   r&   r#   <module>r     s   J 
          	  A
 **

G
$f2 f2Rgg gTC CN@" @F1.9 1.h*.9 *.Z@* @*F
v vr"@emm## "@Jj+W j+Zn+w n+b1" 1E+ E+P\+7 \+~1" 1_2 _2D$: $N(T$<-I -E EIE I4 44% 4mD  Es   E6 6FF