
    0hhS                     ^   S SK r S SKrS SKJr  S SKJ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rS SKrS SKJr  S SKJrJr  S SKJr  S SKJr  S SKJr  S SKJr  S S	KJ r   S S
KJ!r!  \RD                  " SS9  \RF                  r#\RH                  S:X  a  S r%\%\ RL                  l%        S r' " S S5      r( " S S\(\RR                  5      r* " S S\(\RR                  5      r+S r,Sr-Sr. " S S\RR                  5      r/ " S S\RR                  5      r0 " S S\RR                  5      r1 " S S \RR                  5      r2 " S! S"\RR                  5      r3S#S$S%S&.r4S'r5S(r6S)S*/S+/S,.r7 " S- S.\85      r9 " S/ S0\ RL                  5      r: " S1 S2\ Rv                  5      r< " S3 S4\RR                  5      r= " S5 S6\<5      r> " S7 S8\RR                  5      r?\" S9S:S;9r@ " S< S=\:5      rA " S> S?\<5      rB " S@ SA\RR                  5      rC\DSB:X  a  \R                  " 5         gg)C    N)EmailMessage)body_encode)supportmock_socket)hashlib_helper)socket_helper)threading_helper)asyncore)smtpd)MockT)moduledarwinc                     g N selfs    :/opt/python-3.13.8/usr/lib/python3.13/test/test_smtplib.pyhandle_exptr   %   s        c                    UR                  5         U R                  5          UR                  5       u  p4SnU(       aR  US:  aL  [        R                  " / U// 5      u  pgnU(       a  UR	                  U5      n	XS  nUS-  nU(       a  US:  a  ML  UR                  5         UR                  5         U R                  5         g ! [         a     N-f = f! UR                  5         U R                  5         f = f)Ni  r      )listensetacceptselectsendcloseTimeoutError)
evtbufservconnaddrnrwesents
             r   serverr*   *   s    KKMGGI[[]
 a!emmB3GA!yy~%jFA a!e 	



	   	

	s/   C  AC C  
C
C CC "C2c                   b    \ 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)GeneralTests@   c                 0    [         [        l        SU l        g )N   )r   smtplibsocketportr   s    r   setUpGeneralTests.setUpB   s    $	r   c                 "    [         [        l         g r   )r1   r0   r   s    r   tearDownGeneralTests.tearDownF   s	    r   c                 X    SnSnU R                  U[        R                  " U5      5        g )Nzabc
.jklfoo
..bluezabc
..jkl
foo
...blue)assertEqualr0   	quotedata)r   teststrexpecteds      r   testQuoteDataGeneralTests.testQuoteDataK   s'    -37#4#4W#=>r   c                     [         R                  " S5        U R                  [        U R                  5      nUR                  5         g )N   220 Hola mundor   
reply_withclientHOSTr2   r   r   rC   s     r   
testBasic1GeneralTests.testBasic1P   s.    01T499-r   c                     [         R                  " S5        U R                  [        U R                  SS9nU R                  UR                  S5        UR                  5         g )Nr@   )z	127.0.0.1iM  )source_address)r   rB   rC   rD   r2   r9   rI   r   rE   s     r   testSourceAddressGeneralTests.testSourceAddressV   sP    01T499,?  A..0DEr   c                     [         R                  " S5        U R                  [        < SU R                  < 35      nUR                  5         g )Nr@   :rA   rE   s     r   
testBasic2GeneralTests.testBasic2^   s1    01dii89r   c                     [         R                  " S5        U R                  [        U R                  SS9nU R                  UR                  S5        UR                  5         g )Nr@   testhost)local_hostname)r   rB   rC   rD   r2   r9   rR   r   rE   s     r   testLocalHostNameGeneralTests.testLocalHostNamed   sH    01T499ZH..
;r   c                    [         R                  " S5        U R                  [         R                  " 5       5        [         R                  " S5        U R                  [         R                  " 5       S5         U R                  [        U R                  5      n[         R                  " S 5        U R                  UR                  R                  5       S5        UR                  5         g ! [         R                  " S 5        f = f)Nr@      )r   rB   assertIsNonegetdefaulttimeoutsetdefaulttimeoutr9   rC   rD   r2   sock
gettimeoutr   rE   s     r   testTimeoutDefaultGeneralTests.testTimeoutDefaultk   s    01+779:%%b)668"=	0[[tyy1F))$///126 ))$/s   7 C( (D c                    [         R                  " S5        U R                  [        R                  " 5       5        [        R
                  " S5         U R                  [        U R                  S S9n[        R
                  " S 5        U R                  UR                  R                  5       5        UR                  5         g ! [        R
                  " S 5        f = fNr@   rV   timeout)r   rB   rW   r1   rX   rY   rC   rD   r2   rZ   r[   r   rE   s     r   testTimeoutNoneGeneralTests.testTimeoutNonew   s    01&2245  $	+[[tyy$[?F$$T*&++0023 $$T*s   C Cc                     [         R                  " S5        U R                  [        5         U R	                  [
        U R                  SS9  S S S 5        g ! , (       d  f       g = f)Nr@   r   r`   )r   rB   assertRaises
ValueErrorrC   rD   r2   r   s    r   testTimeoutZeroGeneralTests.testTimeoutZero   sA    01z*KKdiiK3 +**s    A
A#c                     [         R                  " S5        U R                  [        U R                  SS9nU R                  UR                  R                  5       S5        UR                  5         g r_   )	r   rB   rC   rD   r2   r9   rZ   r[   r   rE   s     r   testTimeoutValueGeneralTests.testTimeoutValue   sO    01T499b9//126r   c                    [         R                  " S5        U R                  5       nUR                  S5        [        R
                  " 5        nUR                  [        U R                  5        S S S 5        UR                  5         [        R                  " S[        R                  5      nU R                  WR                  5       U5        g ! , (       d  f       Nd= f)N   220 Hello worldr   z	^connect:r   rB   rC   set_debuglevelr   captured_stderrconnectrD   r2   r   recompile	MULTILINEassertRegexgetvaluer   rC   stderrr<   s       r   test_debuglevelGeneralTests.test_debuglevel   s    12a $$&&NN4+ '::lBLL9*H5	 '&   !C
Cc                    [         R                  " S5        U R                  5       nUR                  S5        [        R
                  " 5        nUR                  [        U R                  5        S S S 5        UR                  5         [        R                  " S[        R                  5      nU R                  WR                  5       U5        g ! , (       d  f       Nd= f)Nrm      z#^\d{2}:\d{2}:\d{2}\.\d{6} connect: rn   rw   s       r   test_debuglevel_2GeneralTests.test_debuglevel_2   s    12a $$&&NN4+ '::D ll,*H5 '&r{   )r2   N)__name__
__module____qualname____firstlineno__r3   r6   r=   rF   rJ   rN   rS   r\   rb   rg   rj   ry   r~   __static_attributes__r   r   r   r,   r,   @   sC     
?

	4
6	6r   r,   c                   ,    \ rS rSr\R
                  rSrg)SMTPGeneralTests   r   N)r   r   r   r   r0   SMTPrC   r   r   r   r   r   r      s    \\Fr   r   c                      ^  \ rS rSr\R
                  r\R                  " \	" \
S5      S5      S 5       rU 4S jrSrU =r$ )LMTPGeneralTests   AF_UNIXz test requires Unix domain socketc                 @   Sn[         R                  " S5         U R                  XR                  5      n[         R                  " S 5        U R                  UR                  R                  5       5        UR                  5         g ! [         R                  " S 5        f = f)N!/some/local/lmtp/delivery/programrm   )	r   rB   rC   r2   rY   rW   rZ   r[   r   )r   
local_hostrC   s      r   "testUnixDomainSocketTimeoutDefault3LMTPGeneralTests.testUnixDomainSocketTimeoutDefault   sq    8
12	0[[YY7F))$/&++0023 ))$/s   B Bc                    > [         TU ]  5         SnU R                  [        5         U R	                  USS9  S S S 5        g ! , (       d  f       g = f)Nr   r   r`   )superrg   re   rf   rC   )r   r   	__class__s     r   rg    LMTPGeneralTests.testTimeoutZero   s=    !8
z*KK
AK. +**s   A
Ar   )r   r   r   r   r0   LMTPrC   unittest
skipUnlesshasattrr1   r   rg   r   __classcell__r   s   @r   r   r      s>    \\F35WX Y/ /r   r   c                 4   UR                  5          [        [        S5      (       a  [        R                  nO[        R
                  nSn[        R                  (       ae  US:  a_  U" S[        R                  5        UR                  5       (       a  U R                  5         O"US-  n[        R                  (       a  US:  a  M_  UR                  5       (       d&  [        R                  " S5        U R                  5         [        R                  " 5         UR                  5         g ! [         a     Nmf = f! UR                  5       (       d&  [        R                  " S5        U R                  5         [        R                  " 5         UR                  5         f = f)Npolli  r   {Gz?r   g      ?)r   r   r   r
   poll2r   
socket_mapis_setr   r   timesleep	close_all)r"   serv_evt
client_evtpoll_funr%   s        r   debugging_serverr      s   LLN66""~~H}}H!!a!eT8../   ""

FA !!a!e   ""JJsOJJL     ""JJsOJJLs1   BD% !D5 " D% %
D2/D5 1D22D5 5A"Fz&---------- MESSAGE FOLLOWS ----------
z&------------ END MESSAGE ------------
c                       \ 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S rS rS rS rS rS rSrg)DebuggingServerTests   Nc                    [         R                  " 5       U l        [        R                  U l        [        R                  [        l        [        R                  U l	        [        R                  " 5       U l        U R                  [        l        [        R                  " 5       U l        [        R                  " 5       U l        ["        R$                  U l        [        R                  " 5       ["        l        ["        R(                  " [*        S4SSS9U l        U R,                  R                  R/                  5       S S u  U l        U l        U R,                  U R                  U R                   4n[        R4                  " [6        US9U l        U R8                  R;                  5         U R                  R=                  5         U R                  R?                  5         g )Nr   nowhereTdecode_datar}   targetargs) r	   threading_setup
thread_keyr1   getfqdnreal_getfqdnr   sysstdout
old_stdoutioStringIOoutput	threadingEventr   r   r   DEBUGSTREAMold_DEBUGSTREAMDebuggingServerrD   r"   getsocknamehostr2   Threadr   threadstartwaitclearr   	serv_argss     r   r3   DebuggingServerTests.setUp   s,   *::<"NN$,,**kkm[[
!)#//+$00KKM))4)_6:<	  $yy//;;=bqA	49YYt?	&&.>YO 	r   c                    U R                   [        l        U R                  R	                  5         U R
                  R                  5         [        R                  " U R                  5        U R                  [        l        [        R                  R                  5         U R                   [        l        U ?	U R#                  5         [        R$                  " U R&                  6   g r   )r   r1   r   r   r   r   r   r	   join_threadr   r   r   r   r   r   r   r   
doCleanupsthreading_cleanupr   r   s    r   r6   DebuggingServerTests.tearDown  s    **$$T[[1__
! 00K**DOO<r   c                     U R                   R                  5       n[        R                  " SSU[        R                  [        R
                  -  S9$ )Nz(.*?)^X-Peer:\s*\S+\n(.*)z\1\2)flags)r   rv   rr   subrt   DOTALL)r   test_outputs     r   get_output_without_xpeer-DebuggingServerTests.get_output_without_xpeer  s>    kk**,vv2G!bii)?A 	Ar   c                     [         R                  " [        U R                  S[        R
                  S9nUR                  5         g N	localhostrR   ra   r0   r   rD   r2   r   LOOPBACK_TIMEOUTquitr   smtps     r   	testBasicDebuggingServerTests.testBasic  ,    ||D$))K$+$<$<>		r   c                 $   [         R                  " 5       n [        R                  " U R                  U R
                  S[        R                  U R                  U4S9nU R                  UR                  5        U R                  UR                  U R                  U45        U R                  UR                  S5        UR                  5         g ! [         a8  nUR                  [        R                   :X  a  U R#                  SU-  5        e S nAff = f)Nr   )rR   ra   rI   zcouldn't bind to source port %d)r   find_unused_portr0   r   r   r2   r   r   
addCleanupr   r9   rI   rR   r   OSErrorerrno
EADDRINUSEskipTest)r   src_portr   r(   s       r   rJ   &DebuggingServerTests.testSourceAddress   s     113	<<		499[(/(@(@04		8/DFD OODJJ'T00499h2GHT00+>IIK 	ww%***?(JK	s   B5C 
D3D

Dc                    [         R                  " [        U R                  S[        R
                  S9nU R                  UR                  5        SnU R                  UR                  5       U5        UR                  5         g Nr   r      s   OK)r0   r   rD   r2   r   r   r   r   r9   noopr   r   r   r<   s      r   testNOOPDebuggingServerTests.testNOOP0  W    ||D$))K$+$<$<>

#h/		r   c                    [         R                  " [        U R                  S[        R
                  S9nU R                  UR                  5        SnU R                  UR                  5       U5        UR                  5         g r   )r0   r   rD   r2   r   r   r   r   r9   rsetr   r   s      r   testRSETDebuggingServerTests.testRSET8  r   r   c                    [         R                  " [        U R                  S[        R
                  S9nU R                  UR                  5        SnU R                  UR                  5       U5        UR                  5         g )Nr   r   )r   s   
SIZE 33554432
HELP)r0   r   rD   r2   r   r   r   r   r9   ehlor   r   s      r   testELHODebuggingServerTests.testELHO@  sW    ||D$))K$+$<$<>

#2h/		r   c                 &   [         R                  " [        U R                  S[        R
                  S9nU R                  UR                  5        SnUR                  S5        U R                  UR                  5       U5        UR                  5         g )Nr   r   )i  s   EXPN not implementedEXPN)r0   r   rD   r2   r   r   r   r   putcmdr9   getreplyr   r   s      r   testEXPNNotImplemented+DebuggingServerTests.testEXPNNotImplementedI  sc    ||D$))K$+$<$<>

#1F(3		r   c                    [         R                  " [        U R                  S[        R
                  S9nU R                  UR                  5        U R                  [        5       nUR                  S5        S S S 5        U R                  S[        WR                  5      5        UR                  5         g ! , (       d  f       ND= f)Nr   r   zhelo
X-INJECTEDprohibited newline characters)r0   r   rD   r2   r   r   r   r   re   rf   r  assertInstr	exceptionr   )r   r   excs      r   &test_issue43124_putcmd_escapes_newline;DebuggingServerTests.test_issue43124_putcmd_escapes_newlineS  s    ||D$))K$+$<$<>

#z*cKK*+ +5s3==7IJ		 +*s   $B44
Cc                 H   [         R                  " [        U R                  S[        R
                  S9nU R                  UR                  5        SnU R                  UR                  S5      U5        U R                  UR                  S5      U5        UR                  5         g )Nr   r   )   s>   Cannot VRFY user, but will accept message and attempt deliverynobody@nowhere.com)r0   r   rD   r2   r   r   r   r   r9   vrfyverifyr   r   s      r   testVRFYDebuggingServerTests.testVRFY]  sw    ||D$))K$+$<$<>

#2#78(C%9:HE		r   c                 $   [         R                  " [        U R                  S[        R
                  S9nU R                  UR                  5        UR                  5         SnU R                  UR                  5       U5        UR                  5         g )Nr   r   )i  s   Duplicate HELO/EHLO)r0   r   rD   r2   r   r   r   r   helor9   r   r   s      r   testSecondHELO#DebuggingServerTests.testSecondHELOg  sb     ||D$))K$+$<$<>

#		0h/		r   c                     [         R                  " [        U R                  S[        R
                  S9nU R                  UR                  5        U R                  UR                  5       S5        UR                  5         g )Nr   r   s@   Supported commands: EHLO HELO MAIL RCPT DATA RSET NOOP QUIT VRFY)r0   r   rD   r2   r   r   r   r   r9   helpr   r   s     r   testHELPDebuggingServerTests.testHELPr  sY    ||D$))K$+$<$<>

# 'G 	H		r   c                 .   Sn[         R                  " [        U R                  S[        R
                  S9nU R                  UR                  5        UR                  SSU5        [        R                  " S5        UR                  5         U R                  R                  5         U R                  R                  5         U R                   R#                  5         [$        < U< S[&        < 3nU R)                  U R                   R+                  5       U5        g )NA test messager   r   JohnSallyr   
r0   r   rD   r2   r   r   r   r   sendmailr   r   r   r   r   r   r   r   flush	MSG_BEGINMSG_ENDr9   rv   r   mr   mexpects       r   testSendDebuggingServerTests.testSendz  s    ||D$))K$+$<$<>

#fgq) 	

4		 )1g6--/9r   c                 L   Sn[         R                  " [        U R                  S[        R
                  S9nU R                  UR                  5        UR                  SSU5        [        R                  " S5        UR                  5         U R                  R                  5         U R                  R                  5         U R                   R#                  5         [$        < UR'                  S5      < S[(        < 3nU R+                  U R                   R-                  5       U5        g )	Ns   A test messager   r   r  r   r   asciir!  )r0   r   rD   r2   r   r   r   r   r#  r   r   r   r   r   r   r   r   r$  r%  decoder&  r9   rv   r'  s       r   testSendBinary#DebuggingServerTests.testSendBinary  s    ||D$))K$+$<$<>

#fgq)

4		 )188G+<gF--/9r   c                 .   Sn[         R                  " [        U R                  S[        R
                  S9nU R                  UR                  5        UR                  SSU5        [        R                  " S5        UR                  5         U R                  R                  5         U R                  R                  5         U R                   R#                  5         [$        < U< S[&        < 3nU R)                  U R                   R+                  5       U5        g )Nz.A test
.mes.sage.r   r   r  r   r   r!  r"  r'  s       r   testSendNeedingDotQuote,DebuggingServerTests.testSendNeedingDotQuote  s    !||D$))K$+$<$<>

#fgq)

4		 )1g6--/9r   c                    Sn[         R                  " [        U R                  S[        R
                  S9nU R                  UR                  5        U R                  [        5       nUR                  SSU5        S S S 5        U R                  S[        WR                  5      5        [        R                  " S5        UR!                  5         ["        R$                  R'                  5       nU R)                  SU5        g ! , (       d  f       N= f)	Nwazzuuup
linetwozhi
X-INJECTEDr   	hi@me.com
you@me.comz2prohibited newline characters: ehlo hi\nX-INJECTEDr   z
X-INJECTED)r0   r   rD   r2   r   r   r   r   re   rf   r#  r  r	  r
  r   r   r   r   r   rv   assertNotIn)r   r(  r   r  debugouts        r   $test_issue43124_escape_localhostname9DebuggingServerTests.test_issue43124_escape_localhostname  s      ||D$))<L$+$<$<>

#z*cMM+|Q7 +A	

 	

4		$$--/x0 +*s   &C>>
Dc                    Sn[         R                  " [        U R                  S[        R
                  S9nU R                  UR                  5        UR                  SSU5        U R                  [        5       nUR                  SSS/5        S S S 5        [        WR                  5      nU R                  SU5        U R                  S	U5        [        R                   " S
5        UR#                  5         [$        R&                  R)                  5       nU R+                  SU5        U R+                  SU5        U R+                  SU5        U R+                  SU5        g ! , (       d  f       N= f)Nr5  r   r   r6  r7  zX-OPTION
X-INJECTED-1zX-OPTION2
X-INJECTED-2r  z.X-OPTION\nX-INJECTED-1 X-OPTION2\nX-INJECTED-2r   zX-OPTIONz	X-OPTION2zX-INJECTED-1zX-INJECTED-2)r0   r   rD   r2   r   r   r   r   r#  re   rf   mailr	  r
  r  r   r   r   r   r   rv   r8  )r   r(  r   r  msgr9  s         r   test_issue43124_escape_options3DebuggingServerTests.test_issue43124_escape_options  s     ||$))K,,. 	

#k<3z*cIIk$<>W#XY +#-- 5s;H#N

4		$$--/X.h/22 +*s   9E
E*c                    Sn[         R                  " [        U R                  S[        R
                  S9nU R                  UR                  5        UR                  SSU5        [        R                  " S5        UR                  5         U R                  R                  5         U R                  R                  5         U R                   R#                  5         [$        < U< S[&        < 3nU R)                  U R                   R+                  5       U5        [,        R.                  R+                  5       n[0        R2                  " S[0        R4                  5      nU R7                  XE5        g )	Nr  r   r   z<>r   r   r!  z^sender: <>$)r0   r   rD   r2   r   r   r   r   r#  r   r   r   r   r   r   r   r   r$  r%  r&  r9   rv   r   r   rr   rs   rt   ru   )r   r(  r   r)  r9  senders         r   testSendNullSender'DebuggingServerTests.testSendNullSender  s    ||D$))K$+$<$<>

#dGQ'

4		 )1g6--/9$$--/NBLL9*r   c                    [         R                  R                  R                  S5      n[        R
                  " [        U R                  S[        R                  S9nU R                  UR                  5        UR                  USSS9  [        R                  " S5        UR                  5         U R                   R#                  5         U R$                  R'                  5         U R(                  R+                  5         U R-                  5       nUS	 [.        < UR1                  5       < S	[2        < 3nU R5                  X45        g )
Nr  r   r   r  r   	from_addrto_addrsr   X-Peerr!  )emailmimetextMIMETextr0   r   rD   r2   r   r   r   r   send_messager   r   r   r   r   r   r   r   r$  r   r%  	as_stringr&  r9   )r   r(  r   r   r)  s        r   testSendMessage$DebuggingServerTests.testSendMessage  s    JJOO$$%56||D$))K$+$<$<>

#!v@

4		
 335hK )1;;='B.r   c                 $   [         R                  R                  R                  S5      nSUS'   SUS'   SUS'   SUS	'   [        R
                  " [        U R                  S
[        R                  S9nU R                  UR                  5        UR                  U5        [        R                  " S5        UR                  5         U R!                  US	   S5        U R"                  R%                  5         U R&                  R)                  5         U R*                  R-                  5         U R/                  5       nUS	 US		 [0        < UR3                  5       < S[4        < 3nU R!                  X45        [6        R8                  R;                  5       n[<        R>                  " S[<        R@                  5      nU RC                  XV5        S HH  n[<        R>                  " SRE                  U5      [<        R@                  5      nU RC                  XX5        MJ     g )Nr  foo@bar.comFromr  ToSally, FredCC?John Root <root@localhost>, "Dinsdale" <warped@silly.walks.com>Bccr   r   r   rI  r!  ^sender: foo@bar.com$)r  r   Fredzroot@localhostzwarped@silly.walks.com^recips: .*'{}'.*$)#rJ  rK  rL  rM  r0   r   rD   r2   r   r   r   r   rN  r   r   r   r9   r   r   r   r   r   r$  r   r%  rO  r&  r   r   rv   rr   rs   rt   ru   format	r   r(  r   r   r)  r9  rB  r$   to_addrs	            r   testSendMessageWithAddresses1DebuggingServerTests.testSendMessageWithAddresses  s   JJOO$$%56!&	$$T%||D$))K$+$<$<>

#!

4		5 $? 	@ 	335hKeH )1;;='B.$$--/3R\\B*/Djj!6!=!=d!C!#/GX/	/r   c                    [         R                  R                  R                  S5      nSUS'   SUS'   [        R
                  " [        U R                  S[        R                  S9nU R                  UR                  5        UR                  U5        [        R                  " S5        UR                  5         U R                   R#                  5         U R$                  R'                  5         U R(                  R+                  5         U R-                  5       nUS		 [.        < UR1                  5       < S
[2        < 3nU R5                  X45        [6        R8                  R;                  5       n[<        R>                  " S[<        R@                  5      nU RC                  XV5        S HH  n[<        R>                  " SRE                  U5      [<        R@                  5      nU RC                  XX5        MJ     g )Nr  rS  rT  John, DinsdalerU  r   r   r   rI  r!  rZ  r  Dinsdaler\  #rJ  rK  rL  rM  r0   r   rD   r2   r   r   r   r   rN  r   r   r   r   r   r   r   r   r$  r   r%  rO  r&  r9   r   r   rv   rr   rs   rt   ru   r]  r^  s	            r    testSendMessageWithSomeAddresses5DebuggingServerTests.testSendMessageWithSomeAddresses(  sX   JJOO$$%56!&	"$||D$))K$+$<$<>

#!

4		335hK )1;;='B.$$--/3R\\B*(Djj!6!=!=d!C!#/GX/ )r   c                 L   [         R                  R                  R                  S5      nSUS'   SUS'   [        R
                  " [        U R                  S[        R                  S9nU R                  UR                  5        UR                  USS	S
9  [        R                  " S5        UR                  5         U R                   R#                  5         U R$                  R'                  5         U R(                  R+                  5         U R-                  5       nUS	 [.        < UR1                  5       < S[2        < 3nU R5                  X45        [6        R8                  R;                  5       n[<        R>                  " S[<        R@                  5      nU RC                  XV5        S HH  n[<        R>                  " SRE                  U5      [<        R@                  5      nU RG                  XX5        MJ     [<        R>                  " S[<        R@                  5      n	U RC                  XY5        g )Nr  rS  rT  rc  rU  r   r   zjoe@example.comzfoo@example.netrF  r   rI  r!  z^sender: joe@example.com$rd  r\  z^recips: .*'foo@example.net'.*$)$rJ  rK  rL  rM  r0   r   rD   r2   r   r   r   r   rN  r   r   r   r   r   r   r   r   r$  r   r%  rO  r&  r9   r   r   rv   rr   rs   rt   ru   r]  assertNotRegex)
r   r(  r   r   r)  r9  rB  r$   r_  recips
             r   %testSendMessageWithSpecifiedAddresses:DebuggingServerTests.testSendMessageWithSpecifiedAddressesE  s   JJOO$$%56!&	"$||D$))K$+$<$<>

#!'8CTU

4		335hK )1;;='B.$$--/7F*(Djj!6!=!=d!C!#/G2 ) 

=r||L)r   c                    [         R                  R                  R                  S5      nSUS'   SUS'   SUS'   [        R
                  " [        U R                  S[        R                  S	9nU R                  UR                  5        UR                  U5        [        R                  " S
5        UR                  5         U R                   R#                  5         U R$                  R'                  5         U R(                  R+                  5         U R-                  5       nUS	 [.        < UR1                  5       < S[2        < 3nU R5                  X45        [6        R8                  R;                  5       n[<        R>                  " S[<        R@                  5      nU RC                  XV5        S HH  n[<        R>                  " SRE                  U5      [<        R@                  5      nU RC                  XX5        MJ     g )Nr  zBernard, BiancarT  z#the_rescuers@Rescue-Aid-Society.comSenderrc  rU  r   r   r   rI  r!  z-^sender: the_rescuers@Rescue-Aid-Society.com$rd  r\  rf  r^  s	            r   testSendMessageWithMultipleFrom4DebuggingServerTests.testSendMessageWithMultipleFromd  sa   JJOO$$%56%&	;("$||D$))K$+$<$<>

#!

4		335hK )1;;='B.$$--/KR\\Z*(Djj!6!=!=d!C!#/GX/ )r   c                 (   [         R                  R                  R                  S5      nSUS'   SUS'   SUS'   SUS	'   S
US'   SUS'   SUS'   SUS'   [        R
                  " [        U R                  S[        R                  S9nU R                  UR                  5        UR                  U5        [        R                  " S5        UR                  5         U R                   R#                  5         U R$                  R'                  5         U R(                  R+                  5         US		 US	 U R-                  5       nUS	 [.        < UR1                  5       < S[2        < 3nU R5                  X45        [6        R8                  R;                  5       n[<        R>                  " S[<        R@                  5      nU RC                  XV5        S HH  n[<        R>                  " SRE                  U5      [<        R@                  5      nU RC                  XX5        MJ     g )Nr  rS  rT  r  rU  rV  rW  rX  rY  Thu, 1 Jan 1970 17:42:00 +0000Resent-Dateholy@grail.netResent-From&Martha <my_mom@great.cooker.com>, Jeff	Resent-Todoe@losthope.net
Resent-Bccr   r   r   rI  r!  z^sender: holy@grail.net$)zmy_mom@great.cooker.comJeffry  r\  rf  r^  s	            r   testSendMessageResent*DebuggingServerTests.testSendMessageResent  s   JJOO$$%56!&	$$T%;-+-A+,,||D$))K$+$<$<>

#!

4		eHlO335hK )1;;='B.$$--/6E*KDjj!6!=!=d!C!#/GX/ Lr   c                     [         R                  R                  R                  S5      nSUS'   SUS'   SUS'   SUS	'   S
US'   SUS'   SUS'   SUS'   SUS'   SUS'   SUS'   [        R
                  " [        U R                  S[        R                  S9nU R                  UR                  5        U R                  [        5         UR                  U5        S S S 5        UR                  5         g ! , (       d  f       N= f)Nr  rS  rT  r  rU  rV  rW  rX  rY  rs  rt  ru  rv  rw  rx  ry  rz  zThu, 2 Jan 1970 17:42:00 +0000r   r   )rJ  rK  rL  rM  r0   r   rD   r2   r   r   r   r   re   rf   rN  r   r(  r   s      r   #testSendMessageMultipleResentRaises8DebuggingServerTests.testSendMessageMultipleResentRaises  s    JJOO$$%56!&	$$T%;-+-A+,,;-)+C-||D$))K$+$<$<>

#z*a  +

 +*s   C//
C=)r   r   r   r   r   r2   r   r"   r   r   r   ) r   r   r   r   maxDiffr3   r6   r   r   rJ   r   r   r   r  r  r  r  r  r*  r/  r2  r:  r?  rC  rP  r`  rg  rl  rp  r|  r  r   r   r   r   r   r      s    G6= A
 	:&: :"1(32+&/,"0H0:*>0<#0Jr   r   c                   &    \ rS rSrS rS rS rSrg)NonConnectingTestsi  c                     [         R                  " 5       nU R                  [         R                  UR                  5        U R                  [         R                  UR
                  S5        g )Nztest msg)r0   r   re   SMTPServerDisconnectedr   r   r   s     r   testNotConnected#NonConnectingTests.testNotConnected  sH    
 ||~'88$))D'88))Z	1r   c                     U R                  [        [        R                  SS5        U R                  [        [        R                  S5        g )Nr   boguszlocalhost:bogus)re   r   r0   r   r   s    r   testNonnumericPort%NonConnectingTests.testNonnumericPort  s6    '7<<%w	0'7<<+	-r   c                     [         R                  " 5        nU R                  UR                  5        S S S 5        g ! , (       d  f       g = fr   )r0   r   rW   rZ   r   s     r   testSockAttributeExists*NonConnectingTests.testSockAttributeExists  s+     \\^tdii( ^^s	   ;
A	r   N)r   r   r   r   r  r  r  r   r   r   r   r  r    s    1-)r   r  c                   &    \ rS rSrS rS rS rSrg)DefaultArgumentsTestsi  c                 
   [        5       U l        SU R                  S'   [        R                  " 5       U l        [        SS9U R                  l        [        5       [        5       sU R                  l        U R                  l        g )N   Páolo <főo@bar.com>rT  )   OK)return_value)	r   r>  r0   r   r   r   r   has_extnr#  r   s    r   r3   DefaultArgumentsTests.setUp  sT    >2LLN	;7		15.		DII.r   c                    SnU R                   R                  U R                  5        U R                   R                  U R                  5        U R                  U R                   R                  R
                  S   S   S   U5        U R                  U R                   R                  R
                  S   S   S   U5        g )N)SMTPUTF8BODY=8BITMIMEr      r   r   rN  r>  r9   r#  call_args_list)r   expected_mail_optionss     r   rP  %DefaultArgumentsTests.testSendMessage  s     =		txx(		txx(++::1=a@C.	0++::1=a@C.	0r   c                     S/nSnU R                   R                  U R                  S S U5        U R                  US/5        U R                  U R                   R                  R
                  S   S   S   U5        g )NSTARTTLS)r  r  r  r   r  r  )r   mail_optionsr  s      r   testSendMessageWithMailOptions4DefaultArgumentsTests.testSendMessageWithMailOptions  so    "| I		txxt\B
|4++::1=a@C.	0r   )r>  r   N)r   r   r   r   r3   rP  r  r   r   r   r   r  r    s    @00r   r  c                   &    \ rS rSrS rS rS rSrg)BadHELOServerTestsi  c                     [         [        l        [         R                  " S5        [        R
                  U l        [        R                  " 5       U l	        U R                  [        l        SU l
        g )Ns   199 no hello for you!r/   )r   r0   r1   rB   r   r   r   r   r   r   r2   r   s    r   r3   BadHELOServerTests.setUp  sB    $78**kkm[[
	r   c                 L    [         [        l         U R                  [        l        g r   )r1   r0   r   r   r   r   s    r   r6   BadHELOServerTests.tearDown  s    __
r   c                     U R                  [        R                  [        R                  [        U R
                  SS5        g Nr   r  )re   r0   SMTPConnectErrorr   rD   r2   r   s    r   testFailingHELO"BadHELOServerTests.testFailingHELO   s+    '22GLL $))[!	=r   )r   r   r2   N)r   r   r   r   r3   r6   r  r   r   r   r   r  r    s    %=r   r  c                   V    \ rS rSrSS\R
                  -  S-  -   S-   rS rS rS r	S	r
g
)TooLongLineTestsi  s   250 OK   .r}      
c                    [         R                  " 5       U l        [        R                  U l        [        R                  " 5       U l        U R                  [        l        [        R                  " 5       U l        [        R                  " [        R                  [        R                  5      U l        U R                  R!                  S5        ["        R$                  " U R                  5      U l        U R                  U R(                  U R                  4n[        R*                  " [,        US9U l        U R.                  R1                  5         U R                  R3                  5         U R                  R5                  5         g )N   r   )r	   r   r   r   r   r   r   r   r   r   r   r    r1   AF_INETSOCK_STREAMrZ   
settimeoutr   	bind_portr2   respdatar   r*   r   r   r   r   )r   servargss     r   r3   TooLongLineTests.setUp  s    *::<**kkm[[
??$MM&..&2D2DE			R !++DII6	HHdmmTYY7&&f8Dr   c                     U R                   R                  5         U R                  [        l        [
        R                  " U R                  5        U ?U R                  5         [
        R                  " U R                  6   g r   )r    r   r   r   r   r	   r   r   r   r   r   r   s    r   r6   TooLongLineTests.tearDown  sM    __
$$T[[1K**DOO<r   c                     U R                  [        R                  [        R                  [        U R
                  SS5        g r  )re   r0   SMTPResponseExceptionr   rD   r2   r   s    r   testLineTooLong TooLongLineTests.testLineTooLong   s+    '77		;	;r   )r    r   r   r2   rZ   r   r   N)r   r   r   r   r0   _MAXLINEr  r3   r6   r  r   r   r   r   r  r    s0    D7#3#33a785@H =;r   r  zJohn AzSally BzRuth C)Mr.A@somewhere.comMs.B@xn--fo-fka.comMrs.C@somewhereesle.com)r  somepasswordz<PENCeUxFREJoU0NnbmhNWitOMjNGNndAZWx3b29kLmlubm9zb2Z0LmNvbT4=r  r  r  )zlist-1zlist-2c                       \ rS rSrSrg)ResponseExceptioni2  r   N)r   r   r   r   r   r   r   r   r  r  2  s    Dr   r  c                      ^  \ rS rSrSrSrSrSrSrSr	Sr
SrSrU 4S jrU 4S jrS rS rS	 rSS
 jrSS jrSS jrSS jrS rS rS rU 4S jrU 4S jrU 4S jrU 4S jrU 4S jrS rSrU =r $ )SimSMTPChanneli3  Nr   c   c                    > SR                  U Vs/ s H  nSR                  U5      PM     sn5      U l        / U l        [        [
        U ]  " U0 UD6  g s  snf )N z	250-{0}
)joinr]  _extrafeaturesall_received_linesr   r  __init__)r   extra_featuresr   kwxr   s        r   r  SimSMTPChannel.__init__?  sT     gg/=?~!m""1%~?A"$nd,d9b9 @s   Ac                 
  > U R                   U R                  :X  aa  U R                  R                  U R                  5      n[        S[        U5      [        R                  S9  / U l         U R                  U5        g U R                  R!                  U R                  5        ["        TU ]I  5         g ! [         aG  nU R                  U l         U R                  UR                  < SUR                  < 35         S nAg S nAff = f)NzData:)file )
smtp_stateAUTH_emptystringr  received_linesprintreprr   r   auth_objectr  COMMANDpush	smtp_code
smtp_errorr  appendr   found_terminator)r   liner(   r   s      r   r  SimSMTPChannel.found_terminatorF  s    ??dii'$$))$*=*=>D'4:E,=,=>"$DA  & &&t':':; " % A"&,,		Q[[!,,?@@As   +B1 1
D;=C==Dc                    U R                   (       d  U R                  S5        g U R                  (       a  SU R                  ;  a  U R                  S5        g U R                  b  U R                  S5        g UR                  5       n[        U5      S;  a  U R                  S5        g SUS   R                  5       R                  S	S
5      -  n [        X5      U l
        U R                  U l        U R                  [        U5      S:X  a
  US   5        g S 5        g ! [         a#    U R                  SR                  U5      5         g f = f)Nz503 Error: send EHLO firstr  z(500 Error: command "AUTH" not recognizedz3503 Bad sequence of commands: already authenticated)r   r}   z/501 Syntax: AUTH <mechanism> [initial-response]z_auth_%sr   -_zQ504 Command parameter not implemented: unsupported  authentication mechanism {!r}r}   r   )seen_greetingr  extended_smtpr  authenticated_usersplitlenlowerreplacegetattrr  AttributeErrorr]  r  r  )r   argr   auth_object_names       r   	smtp_AUTHSimSMTPChannel.smtp_AUTHU  s   !!II23!!V43F3F%FII@A"".IIEGyy{t9F"IIGH%Q(?(?S(II	&t>D
 ))CINa==  	II 77=v>N7OQ	s   D *EEc                     U(       a  Xl         U R                  S5        OU R                  S5        U R                  U l        g )Nz235 Authentication Succeededz&535 Authentication credentials invalid)r  r  r  r  )r   uservalids      r   _authenticatedSimSMTPChannel._authenticatedn  s0    &*#II45II>?,,r   c                 j    [         R                  " UR                  S5      5      R                  S5      $ )Nr-  utf-8)base64decodebytesencoder.  )r   strings     r   _decode_base64SimSMTPChannel._decode_base64v  s'    !!&--"89@@IIr   c                    Uc  U R                  S5        g U R                  U5      n UR                  S5      Gt p4nU R                  XE[        S   :H  5        g ! [         a*  nU R                  SR	                  X&5      5         S nAg S nAff = f)Nz334  =535 Splitting response {!r} into user and password failed: {}r   )r  r  r  rf   r]  r  sim_auth)r   r  logpassr  r  passwordr(   s          r   _auth_plainSimSMTPChannel._auth_plainy  s    ;IIf))#.G%,]]4%8"(
 (1+&=>	  		 ((.w(:<s   A 
B" BBc                    Uc  U R                  S5        g [        U S5      (       d(  U R                  U5      U l        U R                  S5        g U R                  U5      nU R	                  U R                  U[
        S   :H  5        U ?g )Nz334 VXNlcm5hbWU6_auth_login_userz334 UGFzc3dvcmQ6r   )r  r   r  r  r  r
  )r   r  r  s      r   _auth_loginSimSMTPChannel._auth_login  sw    ;II()122$($7$7$<D!II()**3/H 5 5x8A;7NO%r   c                 &    U R                  S5        g )Nz334 QnVHZ1liVWdHeQ==)r  r   r  s     r   _auth_buggySimSMTPChannel._auth_buggy  s     			()r   c                 8   Uc%  U R                  SR                  [        5      5        g U R                  U5      n UR	                  5       u  p4[        S   R                  S5      nU R                  [        5      R                  S5      n [        R                  " XgS5      R                  5       nU R                  X4U:H  5        g ! [
         a*  nU R                  SR                  X%5      5         S nAg S nAff = f! [
         a    U R                  S5         g f = f)Nz334 {}r	  r   r-  md5z504 CRAM-MD5 is not supported)r  r]  sim_cram_md5_challenger  r  rf   r
  r  hmacHMAC	hexdigestr  )	r   r  r  r  hashed_passr(   pwdr>  valid_hashed_passs	            r   _auth_cram_md5SimSMTPChannel._auth_cram_md5  s    ;IIhoo&<=>))#.G$+MMO!
 1+$$W-C%%&<=DDWMC$(IIc$>$H$H$J! 5F&FG  		 ''-vg'9;  		9:s)   C 
%C; 
C8 C33C8;DDc                 f    SnX R                   -   S-   nU R                  U5        Xl        SU l        g )NzH250-testhost
250-EXPN
250-SIZE 20000000
250-STARTTLS
250-DELIVERBY
z250 HELPT)r  r  r  r  )r   r  resps      r   	smtp_EHLOSimSMTPChannel.smtp_EHLO  s7    $
 )))J6		$ !r   c                     U[         ;   a5  U R                  S[         U   < S[        R                  " U5      < 35        g U R                  SU-  5        g )N250 r  z550 No such user: %s)	sim_usersr  r0   	quoteaddrr  s     r   	smtp_VRFYSimSMTPChannel.smtp_VRFY  s<    )IIYs^W5F5Fs5KLMII,s23r   c                 j   UR                  5       nU[        ;   a  [        U   n[        U5       Ho  u  pE[        R                  " U5      nU[        U5      S-
  :  a"  U R                  S[        U   < SU< 35        MO  U R                  S[        U   < SU< 35        Mq     g U R                  S5        g )Nr   z250-r  r'  z550 No access for you!)r  	sim_lists	enumerater0   r)  r  r  r(  )r   r  	list_name	user_listr%   
user_emailquoted_addrs          r   	smtp_EXPNSimSMTPChannel.smtp_EXPN  s    IIK		!!),I!*9!5%//
;s9~))IIYz-BKPQIIYz-BKPQ "6 II./r   c                    > U R                   c  [        [        U ]  U5        g U R	                  U R                   5        U R                  5         g r   )quit_responser   r  	smtp_QUITr  close_when_doner   r  r   s     r   r7  SimSMTPChannel.smtp_QUIT  s<    %.$1#6IId(()  "r   c                    > U R                   c  [        TU ]	  U5        g U R                  U R                   5        U R                  (       a  U R                  5         g g r   )mail_responser   	smtp_MAILr  
disconnectr8  r9  s     r   r=  SimSMTPChannel.smtp_MAIL  sF    %Gc"IId(()$$& r   c                    > U R                   c  [        TU ]	  U5        g U =R                  S-  sl        U R	                  U R                   U R                  S-
     5        g Nr   )rcpt_responser   	smtp_RCPT
rcpt_countr  r9  s     r   rC  SimSMTPChannel.smtp_RCPT  sM    %Gc"1		$$$T__Q%678r   c                 N   > U =R                   S-  sl         [        TU ]	  U5        g rA  )
rset_countr   	smtp_RSETr9  s     r   rH  SimSMTPChannel.smtp_RSET  s    1#r   c                 v   > U R                   c  [        TU ]	  U5        g U R                  U R                   5        g r   )data_responser   	smtp_DATAr  r9  s     r   rL  SimSMTPChannel.smtp_DATA  s.    %Gc"IId(()r   c                     e r   r   r   s    r   handle_errorSimSMTPChannel.handle_error      r   )	r  r  r  r  r  r  r  r  r  r   )!r   r   r   r   r6  r<  rB  rK  rD  rG  r>  r  r  r  r  r  r  r  r  r  r  r   r$  r*  r3  r7  r=  rC  rH  rL  rO  r   r   r   s   @r   r  r  3  s    MMMMJJJD:#>2'J?&*
H*	"40#'9* r   r  c                   6    \ rS rSr\rS rS rS rS r	S r
Srg)	SimSMTPServeri  c                 h    / U l         0 U l        [        R                  R                  " U /UQ70 UD6  g r   )_extra_features
_addressesr   
SMTPServerr  r   r   r  s      r   r  SimSMTPServer.__init__  s/    !!!$444r   c                 Z    U R                  U R                  XUU R                  S9U l        g )Nr   )channel_classrU  _decode_data_SMTPchannelr   r#   r$   s      r   handle_acceptedSimSMTPServer.handle_accepted  s0     ..  $d)) / +r   c                 <    X R                   S'   X0R                   S'   g )Nfromtos)rV  )r   peermailfromrcpttosdatas        r   process_messageSimSMTPServer.process_message  s    "*!(r   c                 :    U R                   R                  U5        g r   )rU  r  )r   features     r   add_featureSimSMTPServer.add_feature  s    ##G,r   c                     e r   r   r   s    r   rO  SimSMTPServer.handle_error  rQ  r   )r]  rV  rU  N)r   r   r   r   r  r[  r  r_  rh  rl  rO  r   r   r   r   rS  rS    s     "M5
+
)-r   rS  c                      \ 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\R                   " SSS9S 5       r\R&                  " S5      \R&                  " SS5      S 5       5       r\R&                  " SS5      S 5       r\R                   " SSS9S 5       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%)&SMTPSimTestsi  c                    [         R                  " 5       U l        [        R                  U l        [        R                  [        l        [        R                  " 5       U l	        [        R                  " 5       U l
        [        [        S4SSS9U l        U R                  R                  R                  5       S   U l        U R                  U R                  U R                  4n[        R                   " ["        US9U l        U R$                  R'                  5         U R                  R)                  5         U R                  R+                  5         g Nr   r   Tr   r   r   )r	   r   r   r1   r   r   r   r   r   r   r   rS  rD   r"   r   r2   r   r   r   r   r   r   r   s     r   r3   SMTPSimTests.setUp  s    *::<"NN$,,!)#//+!4)_$O	II$$00215	YYt?	&&.>YO 	r   c                 4   U R                   [        l        U R                  R	                  5         U R
                  R                  5         [        R                  " U R                  5        U ?	U R                  5         [        R                  " U R                  6   g r   r   r1   r   r   r   r   r   r	   r   r   r   r   r   r   s    r   r6   SMTPSimTests.tearDown  b    **$$T[[1K**DOO<r   c                     [         R                  " [        U R                  S[        R
                  S9nUR                  5         g r   r   r   s     r   r   SMTPSimTests.testBasic*  r   r   c                    [         R                  " [        U R                  S[        R
                  S9nU R                  UR                  0 5        SSSSSS.nUR                  5         U R                  UR                  U5        U H#  nU R                  UR                  U5      5        M%     U R                  UR                  S5      5        UR                  5         g )Nr   r   r  20000000)expnsizestarttls	deliverbyr  zunsupported-feature)r0   r   rD   r2   r   r   r9   esmtp_featuresr   
assertTruer  assertFalser   )r   r   expected_featuresks       r   testEHLOSMTPSimTests.testEHLO0  s    ||D$))K$+$<$<> 	,,b1 %'%/)+*,%'	 			,,.?@"AOODMM!,- #'<=>		r   c           	         [         R                  " [        U R                  S[        R
                  S9n[        R                  5        HO  u  p#S[        U< S[         R                  " U5      < 3S5      4nU R                  UR                  U5      U5        MQ     SnSSU-  R                  S5      4nU R                  UR                  U5      U5        UR                  5         g )	Nr   r   r   r  r-  r  &  zNo such user: %s)r0   r   rD   r2   r   r   r(  itemsbytesr)  r9   r  r  r   )r   r   	addr_specnameexpected_knownuexpected_unknowns          r   r  SMTPSimTests.testVRFYF  s    ||D$))K$+$<$<>  )0OI!5*.0A0A)0L*N)0$2 3N TYYy1>B	  1 !"4q"8!@!@!IJ1'78		r   c           	         [         R                  " [        U R                  S[        R
                  S9n[        R                  5        H  u  p#/ nU H6  nUR                  [        U   < S[         R                  " U5      < 35        M8     S[        SR                  U5      S5      4nU R                  UR                  U5      U5        M     SnSnU R                  UR                  U5      U5        UR                  5         g )	Nr   r   r  r   r!  r-  zPSU-Members-List)r  s   No access for you!)r0   r   rD   r2   r   r   r-  r  r  r(  r)  r  r  r9   r}  r   )	r   r   listnamemembersusersr(  r  r  r  s	            r   testEXPNSMTPSimTests.testEXPNU  s    ||D$))K$+$<$<> "+!2HE	!g6G6G6JKL !55)97#CDNTYYx0.A "3 71'78		r   c                 $   U R                   R                  S5        [        R                  " [        U R
                  S[        R                  S9nUR                  [        S   [        S   5      nU R                  US5        UR                  5         g )N
AUTH PLAINr   r   r   r      s   Authentication Succeededr"   rl  r0   r   rD   r2   r   r   loginr
  r9   r   r   r   r#  s      r   testAUTH_PLAINSMTPSimTests.testAUTH_PLAINe  g    		l+||D$))K$+$<$<>zz(1+x{3AB

r   c                 $   U R                   R                  S5        [        R                  " [        U R
                  S[        R                  S9nUR                  [        S   [        S   5      nU R                  US5        UR                  5         g )N
AUTH LOGINr   r   r   r   r  r  r  s      r   testAUTH_LOGINSMTPSimTests.testAUTH_LOGINm  r  r   c                 v   U R                   R                  S5        [        R                  " [        U R
                  S[        R                  S9 n[        u  Ul	        Ul
        UR                  S5        UR                  SUR                  SS9nU R                  US5        S S S 5        g ! , (       d  f       g = f)	Nr  r   r   test_auth_loginLOGINTinitial_response_okr  r"   rl  r0   r   rD   r2   r   r   r
  r  r  r   auth
auth_loginr9   r  s      r   "testAUTH_LOGIN_initial_response_ok/SMTPSimTests.testAUTH_LOGIN_initial_response_oku  s    		l+\\$		+")":":<?C'/$DIt}II'(99Wdoo49PDT#EF< < <   AB**
B8c                 v   U R                   R                  S5        [        R                  " [        U R
                  S[        R                  S9 n[        u  Ul	        Ul
        UR                  S5        UR                  SUR                  SS9nU R                  US5        S S S 5        g ! , (       d  f       g = f)	Nr  r   r   r  r  Fr  r  r  r  s      r   %testAUTH_LOGIN_initial_response_notok2SMTPSimTests.testAUTH_LOGIN_initial_response_notok~  s    		l+\\$		+")":":<?C'/$DIt}II'(99Wdoo59QDT#EF< < <r  c                   ^  T R                   R                  S5        S
U 4S jjn[        R                  " [        T R
                  S[        R                  S9n [        u  Ul	        Ul
        UR                  S5        SnT R                  [        R                  U5       nUR                  SUSS	9  S S S 5        UR                  5         g ! , (       d  f       N= f! UR                  5         f = f)Nz
AUTH BUGGYc                 *   > TR                  SU 5        g)Ns
   BuGgYbUgGyr  )r9   )	challenger   s    r   
auth_buggy/SMTPSimTests.testAUTH_BUGGY.<locals>.auth_buggy  s    ]I6r   r   r   test_auth_buggyz&^Server AUTH mechanism infinite loop.*BUGGYFr  r   )r"   rl  r0   r   rD   r2   r   r   r
  r  r  r   assertRaisesRegexSMTPExceptionr  r   )r   r  r   expectcms   `    r   testAUTH_BUGGYSMTPSimTests.testAUTH_BUGGY  s    		l+	 ||$))K,,
	'/$DIt}II'(>F''(=(=vF"		':5	I G JJL GF JJLs%   AC C
1C 

CC C-r  T)opensslc                 $   U R                   R                  S5        [        R                  " [        U R
                  S[        R                  S9nUR                  [        S   [        S   5      nU R                  US5        UR                  5         g )NAUTH CRAM-MD5r   r   r   r   r  r  r  s      r   testAUTH_CRAM_MD5SMTPSimTests.testAUTH_CRAM_MD5  sg    		o.||D$))K$+$<$<>zz(1+x{3AB

r   z	hmac.HMACzsmtplib._have_cram_md5_supportFc                    U R                   R                  S5        [        R                  " [        U R
                  S[        R                  S9nU R                  UR                  5        [        R                  " S5      nU R                  [        R                  U5         UR                  [        S   [        S   5        S S S 5        UR!                  5         g ! , (       d  f       N= f)Nr  r   r   z(No suitable authentication method found.r   r   )r"   rl  r0   r   rD   r2   r   r   r   r   rr   escaper  r  r  r
  assert_not_called)r   hmac_constructorr   r>  s       r   testAUTH_CRAM_MD5_blocked&SMTPSimTests.testAUTH_CRAM_MD5_blocked  s     			o.||D$))K$+$<$<>

#iiBC##G$9$93?JJx{HQK0 @**, @?s    !C
C(c                 t   U R                   R                  S5        [        R                  " [        U R
                  S[        R                  S9nU R                  UR                  5        [        R                  R                  US5       n[        R                  R                  USUR                  S9 nUR                  [        S   [        S   5      nS S S 5        S S S 5        WR!                  5         WR#                  5         U R%                  WS	5        g ! , (       d  f       NI= f! , (       d  f       NR= f)
NzAUTH CRAM-MD5 PLAINr   r   auth_cram_md5
auth_plain)wrapsr   r   r  )r"   rl  r0   r   rD   r2   r   r   r   r   mockpatchobjectr  r  r
  assert_called_oncer  r9   )r   r   smtp_auth_cram_md5smtp_auth_plainr#  s        r   &testAUTH_CRAM_MD5_blocked_and_fallback3SMTPSimTests.testAUTH_CRAM_MD5_blocked_and_fallback  s     			34||D$))K$+$<$<>

#JJdO48JJJl$//   ::hqk8A;7D	 5 	**,,,.AB  54s$   
*D)4!DD)
D&	"D))
D7c                 $   U R                   R                  S5        [        R                  " [        U R
                  S[        R                  S9nUR                  [        S   [        S   5      nU R                  US5        UR                  5         g )NzAUTH BOGUS PLAIN LOGIN CRAM-MD5r   r   r   r   r  r  r  s      r   testAUTH_multipleSMTPSimTests.testAUTH_multiple  sj     			?@||D$))K$+$<$<>zz(1+x{3AB

r   c           	         SS1n [         R                  " 5         UR                  S5        U H-  nU R                  R                  SR                  U5      5        M/     U H  nU R                  US9   [        R                  " [        U R                  S[        R                  S9nUR                  S5        [        S	   [        S
   sUl        Ul        SUR%                  5       R'                  SS5      -   nUR)                  U[+        X45      5      nU R-                  US5        UR/                  5         S S S 5        M     g ! [         a     GN#f = f! , (       d  f       GM  = f)NPLAINr  zCRAM-MD5zAUTH {})	mechanismr   r   foor   r   auth_r  r  r  )hashlibr  addrf   r"   rl  r]  subTestr0   r   rD   r2   r   r   r   r
  r  r  r  r  r  r  r9   r   )r   	supportedr  r   methodr#  s         r   test_auth_functionSMTPSimTests.test_auth_function  s"   g&		&KKM MM*%"III!!)"2"29"=> #"I	2||D$))3>,3,D,DF 		% +3A;(	4= 9??#4#<#<S##FFyyGD,AB  'IJ

 32 #  		 32s   E 3CE
EE
E#	c                 2   [         R                  " [        U R                  S[        R
                  S9nUR                  5       u  p#U R                  US5        U R                  SUR                  5        UR                  5         U R                  SUR                  5        UR                  [        U R                  5        U R                  SUR                  5        UR                  5         U R                  SUR                  5        UR                  5         g )Nr   r   r   r~  )r0   r   rD   r2   r   r   r   r9   r  r  r   r8  rq   ehlo_or_helo_if_neededr   r   codemessages       r   test_quit_resets_greeting&SMTPSimTests.test_quit_resets_greeting  s    ||D$))+6$+$<$<> 		s#fd112		!4!45T499%!4!45##%fd112		r   c                    [         R                  " [        U R                  5       nUR	                  5       u  p#U R                  US5        S S S 5        U R                  [         R                  WR                  S5        [         R                  " [        U R                  5       nUR                  5         S S S 5        U R                  [         R                  UR                  S5        g ! , (       d  f       N= f! , (       d  f       NK= f)Nr   s   foo)
r0   r   rD   r2   r   r9   re   r  r   r   r  s       r   test_with_statement SMTPSimTests.test_with_statement  s    \\$		*d IIKMDT3' + 	'88$))VL\\$		*dJJL +'88$))VL +* +*s   %C(#C9(
C69
Dc                    U R                  [        R                  5       n[        R                  " [        U R
                  5       nUR                  5         SU R                  R                  l	        S S S 5        S S S 5        U R                  WR                  R                  S5        U R                  UR                  R                  S5        g ! , (       d  f       Nc= f! , (       d  f       Nl= f)Nz421 QUIT FAILED  s   QUIT FAILED)re   r0   r  r   rD   r2   r   r"   r]  r6  r9   r
  r  r  )r   errorr   s      r    test_with_statement_QUIT_failure-SMTPSimTests.test_with_statement_QUIT_failure  s    w<<=dDII.$		7H		&&4 / > 	22C833^D	 /. >=s#   &C ,C2C 
C	C  
C.c                    [         R                  " [        U R                  S[        R
                  S9nUR                  5         SU R                  R                  l	        SU R                  R                  l
        U R                  [         R                  5         UR                  SSS5        S S S 5        U R                  UR                  5        g ! , (       d  f       N*= f)Nr   r   z451 Requested action abortedTr  r   test message)r0   r   rD   r2   r   r   r   r"   r]  r<  r>  re   SMTPSenderRefusedr#  rW   rZ   r   s     r   test__rest_from_mail_cmd%SMTPSimTests.test__rest_from_mail_cmd	  s    ||D$))K$+$<$<>		/M		,,0		)w889MM&'>: :$))$ :9s   C
Cc                    [         R                  " [        U R                  S[        R
                  S9nUR                  5         SU R                  R                  l	        U R                  [         R                  5         UR                  SSS5        S S S 5        U R                  UR                  5        U R                  U R                  R                  R                   S5        g ! , (       d  f       NZ= f)Nr   r   z421 closing connectionr  r   r  r   )r0   r   rD   r2   r   r   r   r"   r]  r<  re   r  r#  rW   rZ   r9   rG  r   s     r   test_421_from_mail_cmd#SMTPSimTests.test_421_from_mail_cmd  s    ||D$))K$+$<$<>		/G		,w889MM&'>: :$))$//::A> :9s   >C&&
C4c                 L   [         R                  " [        U R                  S[        R
                  S9nUR                  5         SS/U R                  R                  l	        U R                  [         R                  5       nUR                  S/ SQS5        S S S 5        U R                  UR                  5        U R                  U R                  R                  R                   S5        U R#                  WR$                  R&                  S   S	S
05        g ! , (       d  f       N= f)Nr   r   z250 accepted421 closingr  )r   FrankGeorger  r   r   )r  s   closing)r0   r   rD   r2   r   r   r   r"   r]  rB  re   SMTPRecipientsRefusedr#  rW   rZ   r9   rG  assertDictEqualr
  r   )r   r   r&   s      r   test_421_from_rcpt_cmd#SMTPSimTests.test_421_from_rcpt_cmd  s    ||D$))K$+$<$<>		0>/N		,w<<=MM&">O >$))$//::A>Q[[--a07<M2NO	 >=s    D
D#c                     " S S[         5      nXR                  l        [        R                  " [
        U R                  S[        R                  S9nUR                  5         U R                  [        R                  5         UR                  SS/S5        S S S 5        U R                  UR                  5        U R                  U R                  R                   R"                  S5        g ! , (       d  f       NZ= f)	Nc                   (   ^  \ rS rSrU 4S jrSrU =r$ )=SMTPSimTests.test_421_from_data_cmd.<locals>.MySimSMTPChanneli*  c                 z   > U R                   U R                  :X  a  U R                  S5        g [        TU ]  5         g )Nr  )r  DATAr  r   r  )r   r   s    r   r  NSMTPSimTests.test_421_from_data_cmd.<locals>.MySimSMTPChannel.found_terminator+  s*    ??dii/IIm,G,.r   r   )r   r   r   r   r  r   r   r   s   @r   MySimSMTPChannelr  *  s    / /r   r  r   r   zJohn@foo.orgzSally@foo.orgr  r   )r  r"   r[  r0   r   rD   r2   r   r   r   re   SMTPDataErrorr#  rW   rZ   r9   r]  rD  )r   r  r   s      r   test_421_from_data_cmd#SMTPSimTests.test_421_from_data_cmd)  s    	/~ 	/ #3		||D$))K$+$<$<>		w445MM.?*;^L 6$))$//::A> 65s   C++
C9c           	         [         R                  " [        U R                  S[        R
                  S9nU R                  UR                  5        UR                  5         U R                  UR                  5        U R                  UR                  S5      5        U R                  [         R                  UR                  SSSSS/S	9  U R                  [         R                  UR                   SSS/S
9  g )Nr   r   smtputf8r  r   r  r  r  r  options)r0   r   rD   r2   r   r   r   r   r   r  
does_esmtpr  r  re   SMTPNotSupportedErrorr#  r=  r   s     r   4test_smtputf8_NotSupportedError_if_no_server_supportASMTPSimTests.test_smtputf8_NotSupportedError_if_no_server_support9  s    ||$))K,,. 	

#		(z23))MMGR
.K 	 	M 	))IIv'D 	 	Fr   c                 (   [         R                  " [        U R                  S[        R
                  S9nU R                  UR                  5        U R                  [        UR                  SSS5        U R                  [        UR                  S5        g )Nr   r   Aliceu   Böbr  u   Älice)r0   r   rD   r2   r   r   r   r   re   UnicodeEncodeErrorr#  r=  r   s     r   "test_send_unicode_without_SMTPUTF8/SMTPSimTests.test_send_unicode_without_SMTPUTF8I  sh    ||$))K,,. 	

#,dmmWfbQ,diiBr   c                 f   [        5       nSUS'   SUS'   SUS'   [        R                  " [        U R                  S[
        R                  S9nU R                  UR                  5        U R                  [        R                  5         UR                  U5        S S S 5        g ! , (       d  f       g = f)	Nr  rT  re  rU     Nudge nudge, wink, wink ὠ9Subjectr   r   )r   r0   r   rD   r2   r   r   r   r   re   r  rN  )r   r>  r   s      r   9test_send_message_error_on_non_ascii_addrs_if_no_smtputf8FSMTPSimTests.test_send_message_error_on_non_ascii_addrs_if_no_smtputf8Q  s     n-FD	:I||$))K,,. 	

#w<<=c" >==s   B""
B0c                 $   [         R                  " [        U R                  S[        R
                  S9nU R                  UR                  5        [        5       n[        R                  R                  S5      US'   [        R                  R                  S5      US'   U R                  UR                  U5      0 5        U R                  U R                  R                   S   S5        U R                  U R                  R                   S	   S
/5        g )Nr   r   )u   Michaëlmichael@example.comrT  )u   Renérene@example.comrU  rb  r$  rc  r%  )r0   r   rD   r2   r   r   r   r   r   rJ  utils
formataddrr  rN  r9   r"   rV  )r   r   r  s      r   1test_name_field_not_included_in_envelop_addresses>SMTPSimTests.test_name_field_not_included_in_envelop_addresses_  s    ||$))K,,. 	

#.++001TU../LMT..w7<--f57LM--e47I6JKr   c                    Sn[         R                  " [        U R                  S[        R
                  S9nU R                  UR                  5        UR                  SSU5        U R                  S/U R                  R                  R                  5        U R                  S/U R                  R                  R                  5        g )Nr  r   r   r  r   zmail from:<John> size=14zrcpt to:<Sally>)r0   r   rD   r2   r   r   r   r   r#  r  r"   r]  r  r  s      r    test_lowercase_mail_from_rcpt_to-SMTPSimTests.test_lowercase_mail_from_rcpt_ton  s    ||$))K,,. 	

#fgq)12DII4J4J4]4]^()499+A+A+T+TUr   r   r2   r   r"   r   r   r   N)%r   r   r   r   r3   r6   r   r  r  r  r  r  r  r  r  r   requires_hashdigestr  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r!  r(  r+  r   r   r   r   rq  rq    s   $	=, GG( ''t< = 
ZZ	ZZ0%8- 9 - 
ZZ0%8C 9C" ''t< =,ME%?	P? F C#L
Vr   rq  c                   .    \ rS rSrS rS r  SS jrSrg)SimSMTPUTF8Serveri{  c                 ^    SS/U l         [        R                  R                  " U /UQ70 UD6  g )Nr  8BITMIME)rU  r   rW  r  rX  s      r   r  SimSMTPUTF8Server.__init__}  s/     !+J7!!$444r   c           	      p    U R                  U R                  XUU R                  U R                  S9U l        g )Nr   enable_SMTPUTF8)r[  rU  r\  r6  r]  r^  s      r   r_  !SimSMTPUTF8Server.handle_accepted  s9     ..  $d)) 00 / 
r   Nc                 L    Xl         X l        X0l        X@l        XPl        X`l        g r   )	last_peerlast_mailfromlast_rcpttoslast_messagelast_mail_optionslast_rcpt_options)r   rd  re  rf  rg  r  rcpt_optionss          r   rh  !SimSMTPUTF8Server.process_message  s%    %# !-!-r   )r]  rU  r=  r:  r<  r9  r>  r;  )NN)r   r   r   r   r  r_  rh  r   r   r   r   r0  r0  {  s    5
 KOJN.r   r0  c                   <    \ rS rSrSrS rS rS rS rS r	S r
S	rg)
SMTPUTF8SimTestsi  Nc                    [         R                  " 5       U l        [        R                  U l        [        R                  [        l        [        R                  " 5       U l	        [        R                  " 5       U l
        [        [        S4SSSS9U l        U R                  R                  R                  5       S   U l        U R                  U R                  U R                  4n[        R                   " ["        US9U l        U R$                  R'                  5         U R                  R)                  5         U R                  R+                  5         g )Nr   r   FTr5  r   r   )r	   r   r   r1   r   r   r   r   r   r   r   r0  rD   r"   r   r2   r   r   r   r   r   r   r   s     r   r3   SMTPUTF8SimTests.setUp  s    *::<"NN$,,!)#//+%tQi276:<	 II$$00215	YYt?	&&.>YO 	r   c                 4   U R                   [        l        U R                  R	                  5         U R
                  R                  5         [        R                  " U R                  5        U ?	U R                  5         [        R                  " U R                  6   g r   rv  r   s    r   r6   SMTPUTF8SimTests.tearDown  rx  r   c                 6   [         R                  " [        U R                  S[        R
                  S9nU R                  UR                  5        UR                  5         U R                  UR                  5        U R                  UR                  S5      5        g )Nr   r   r  )r0   r   rD   r2   r   r   r   r   r   r  r  r  r   s     r   $test_test_server_supports_extensions5SMTPUTF8SimTests.test_test_server_supports_extensions  sd    ||$))K,,. 	

#		(j12r   c                    SR                  S5      n[        R                  " [        U R                  S[
        R                  S9nU R                  UR                  5        UR                  SSUSS/S	9  U R                  U R                  R                  S5        U R                  U R                  R                  S/5        U R                  U R                  R                  U5        U R                  SU R                  R                   5        U R                  SU R                  R                   5        U R                  U R                  R"                  / 5        g )
N$   ¡a test message containing unicode!r   r   r   u   Jőhnu   Sállyr  r  r  )r  r0   r   rD   r2   r   r   r   r   r#  r9   r"   r:  r;  r<  r  r=  r>  r  s      r   ,test_send_unicode_with_SMTPUTF8_via_sendmail=SMTPUTF8SimTests.test_send_unicode_with_SMTPUTF8_via_sendmail  s    299'B||$))K,,. 	

#gx$3Z#@ 	 	B00'://(<//3otyy'B'BCj$))"="=>44b9r   c                 t   SR                  S5      n[        R                  " [        U R                  S[
        R                  S9nU R                  UR                  5        UR                  5         U R                  UR                  SSS/S9S	5        U R                  UR                  S
5      S	5        U R                  UR                  U5      S	5        U R                  U R                  R                  S5        U R                  U R                  R                   S
/5        U R                  U R                  R"                  U5        U R%                  SU R                  R&                  5        U R%                  SU R                  R&                  5        U R                  U R                  R(                  / 5        g )NrK  r   r   r   u   Jőr  r  r  r   u   János)r  r0   r   rD   r2   r   r   r   r   r   r9   r=  rcptrg  r"   r:  r;  r<  r  r=  r>  r  s      r   1test_send_unicode_with_SMTPUTF8_via_low_level_APIBSMTPUTF8SimTests.test_send_unicode_with_SMTPUTF8_via_low_level_API  sB   299'B||$))K,,. 	

#		IIeoz%BIC	 	8,l;1|400%8//(<//3otyy'B'BCj$))"="=>44b9r   c                 H   [        5       nSUS'   SUS'   SUS'   UR                  S5        [        R                  " S5      n[        R
                  " [        U R                  S	[        R                  S
9nU R                  UR                  5        U R                  UR                  U5      0 5        U R                  U R                  R                  S5        U R                  U R                  R                   S/5        U R                  U R                  R"                  R%                  5       U5        U R'                  SU R                  R(                  5        U R'                  SU R                  R(                  5        U R                  U R                  R*                  / 5        g )Nr  rT  re  rU  r  r   u1   oh là là, know what I mean, know what I mean?

u<              From: Páolo <főo@bar.com>
            To: Dinsdale
            Subject: Nudge nudge, wink, wink ὠ9
            Content-Type: text/plain; charset="utf-8"
            Content-Transfer-Encoding: 8bit
            MIME-Version: 1.0

            oh là là, know what I mean, know what I mean?
            r   r   u   főo@bar.comr  r  )r   set_contenttextwrapdedentr0   r   rD   r2   r   r   r   r   r9   rN  r"   r:  r;  r<  r.  r  r=  r>  )r   r>  r<   r   s       r   2test_send_message_uses_smtputf8_if_addrs_non_asciiCSMTPUTF8SimTests.test_send_message_uses_smtputf8_if_addrs_non_ascii  s<   n-FD	:I 	MN ?? 	$ 	 ||$))K,,. 	

#**3/400.A//*>//668(Cotyy'B'BCj$))"="=>44b9r   r-  )r   r   r   r   r  r3   r6   rH  rL  rP  rV  r   r   r   r   rB  rB    s%    G(	=3::&:r   rB  s    psu doesnotexistr  )eolc                       \ rS rSrS rSrg)!SimSMTPAUTHInitialResponseChanneli  c                     UR                  5       nUS   R                  5       S:X  a.  [        U5      S:X  a  US   [        :X  a  U R	                  S5        g U R	                  S5        g )Nr   plainr}   r   z235 Okz571 Bad authentication)r  r  r  EXPECTED_RESPONSEr  )r   r  r   s      r   r  +SimSMTPAUTHInitialResponseChannel.smtp_AUTH  sW     yy{7==?g%4yA~ 7//IIh'		*+r   r   N)r   r   r   r   r  r   r   r   r   rZ  rZ    s    ,r   rZ  c                       \ rS rSr\rSrg) SimSMTPAUTHInitialResponseServeri  r   N)r   r   r   r   rZ  r[  r   r   r   r   r`  r`    s    5Mr   r`  c                   ,    \ rS rSrS rS rS rS rSrg)SMTPAUTHInitialResponseSimTestsi  c                    [         R                  " 5       U l        [        R                  U l        [        R                  [        l        [        R                  " 5       U l	        [        R                  " 5       U l
        [        [        S4SSS9U l        U R                  R                  R                  5       S   U l        U R                  U R                  U R                  4n[        R                   " ["        US9U l        U R$                  R'                  5         U R                  R)                  5         U R                  R+                  5         g rs  )r	   r   r   r1   r   r   r   r   r   r   r   r`  rD   r"   r   r2   r   r   r   r   r   r   r   s     r   r3   %SMTPAUTHInitialResponseSimTests.setUp  s    *::<"NN$,,!)#//+41ID:	 II$$00215	YYt?	&&.>YO 	r   c                 4   U R                   [        l        U R                  R	                  5         U R
                  R                  5         [        R                  " U R                  5        U ?	U R                  5         [        R                  " U R                  6   g r   rv  r   s    r   r6   (SMTPAUTHInitialResponseSimTests.tearDown-  rx  r   c                     U R                   R                  S5        [        R                  " [        U R
                  S[        R                  S9nUR                  SS5        UR                  5         g )Nr  r   r   psudoesnotexist)
r"   rl  r0   r   rD   r2   r   r   r  r   r   s     r   %testAUTH_PLAIN_initial_response_loginESMTPAUTHInitialResponseSimTests.testAUTH_PLAIN_initial_response_login8  sL    		l+||D$))K$+$<$<>

5.)

r   c                 <   U R                   R                  S5        [        R                  " [        U R
                  S[        R                  S9nSUl        SUl	        UR                  SUR                  5      u  p#UR                  5         U R                  US5        g )Nr  r   r   rh  ri  r\  r  )r"   rl  r0   r   rD   r2   r   r   r  r  r  r  r   r9   )r   r   r  responses       r   $testAUTH_PLAIN_initial_response_authDSMTPAUTHInitialResponseSimTests.testAUTH_PLAIN_initial_response_auth?  sr    		l+||D$))K$+$<$<>	&7DOO<

s#r   r-  N)	r   r   r   r   r3   r6   rj  rn  r   r   r   r   rb  rb    s    &	=$r   rb  __main__)Fr  email.mime.textrJ  email.messager   email.base64mimer   encode_base64email.utilsr  r  r1   r0   r   rr   r   r   r   r   rT  r   r   unittest.mockr  testr   r   test.supportr   r   r	   r
   r   r   requires_working_socketrD   platformr   SMTPChannelr*   r,   TestCaser   r   r   r%  r&  r   r  r  r  r  r(  r
  r  r-  	Exceptionr  r  rW  rS  rq  r0  rB  r]  rZ  r`  rb  r   mainr   r   r   <module>r     s)     & 9      	 	 
        % ' & ) !     t ,<<8$/E!,`6 `6F|X%6%6 
/|X%6%6 /,> 6	
3S8,, Sj)** )60H-- 08=** =&;x(( ;@ #+#,'/	
 2; +,EF,.	
 )	 (zU&& zzE$$ 6mV8$$ mV`. .4l:x(( l:^ ""8bA , ,6} 6.$h&7&7 .$b zMMO r   