
    <edF                     t   d Z ddlZddlZddlZddlZddlZddlZddlmZmZ ddl	m
Z ddlmZ ddlmZ ddlmZ ddlmZ  ej        d	          Z ej        d
          Z ej        d           ej        ZdZdZ eed          rzddlZdZej                            ej                            e          pej        d          Zej                            ej                            e          pej        d          Z  eed          Z!dZ"dZ# G d dej$                  Z% G d dej&        ej'                  Z( G d de          Z)erddl*m+Z+  G d de+e%          Z,e! G d de)                      Z-e! G d d e)                      Z. G d! d"e          Z/d# Z0e1d$k    r ej2                     dS dS )%zTest script for poplib module.    N)TestCase
skipUnless)support)hashlib_helper)socket_helper)threading_helper)warnings_helperasynchatasyncoreT)moduleFPOP3_SSLzkeycert3.pemzpycacert.pemzSSL not supporteds   1 1
2 2
3 3
4 4
5 5
.
st   From: postmaster@python.org
Content-Type: text/plain
MIME-Version: 1.0
Subject: Dummy

line1
line2
line3
.
c                       e Zd Zg dgdZdZd Zd Zd Zd Zd Z	d	 Z
d
 Zd Zd Zd ZeZd ZeZd Zd Zd Zd Zd Zd Zd Zd Zerd Zd Zd ZdS dS )DummyPOP3Handlerzpython-testlib-pop-server)UIDLIMPLEMENTATIONFc                     t           j                            | |           |                     d           g | _        |                     d           d| _        d| _        d S )N   
(+OK dummy pop3 server ready. <timestamp>F)r
   
async_chat__init__set_terminator	in_bufferpush
tls_activetls_startingselfconns     '/usr/lib/python3.11/test/test_poplib.pyr   zDummyPOP3Handler.__init__:   s^    $$T4000G$$$		<===!    c                 :    | j                             |           d S N)r   appendr   datas     r   collect_incoming_dataz&DummyPOP3Handler.collect_incoming_dataB   s    d#####r    c                    d                     | j                  }t          |d          }g | _        |                    d          d                                         }|                    d          }|dk    r||dz   d          }nd}t          | d|z             r t          | d|z             } ||           d S |                     d	|z             d S )
Nr    
ISO-8859-1 r       cmd_z$-ERR unrecognized POP3 command "%s".)	joinr   strsplitlowerfindhasattrgetattrr   )r   linecmdspaceargmethods         r   found_terminatorz!DummyPOP3Handler.found_terminatorE   s    xx''4&&jjooa &&((		#B;;uqyzz"CCC4#&& 	CT6C<00FF3KKKKKII<cABBBBBr    c                       r"    r   s    r   handle_errorzDummyPOP3Handler.handle_errorU       r    c                 r    t           j                            | |                    d          dz              d S )Nr(   r   )r
   r   r   encoder$   s     r   r   zDummyPOP3Handler.pushX   s2      t{{<'@'@7'JKKKKKr    c                 0    |                      |           d S r"   r   r   r8   s     r   cmd_echozDummyPOP3Handler.cmd_echo[   s    		#r    c                 f    |dk    r|                      d           |                      d           d S )Nguidoz-ERR no such userz+OK password requiredrC   rD   s     r   cmd_userzDummyPOP3Handler.cmd_user_   s7    '>>II)***		)*****r    c                 f    |dk    r|                      d           |                      d           d S )Npythonz-ERR wrong passwordz+OK 10 messagesrC   rD   s     r   cmd_passzDummyPOP3Handler.cmd_passd   s7    (??II+,,,		#$$$$$r    c                 0    |                      d           d S )Nz
+OK 10 100rC   rD   s     r   cmd_statzDummyPOP3Handler.cmd_stati   s    		,r    c                     |r|                      d|d|           d S |                      d           t          j                             | t                     d S )Nz+OK r)   z+OK)r   r
   r   	LIST_RESPrD   s     r   cmd_listzDummyPOP3Handler.cmd_listl   s`     	6IIISSS##./////IIe$$T955555r    c                     |                      dt          t                    z             t          j                             | t                     d S )Nz+OK %s bytes)r   len	RETR_RESPr
   r   rD   s     r   cmd_retrzDummyPOP3Handler.cmd_retru   s>    		.#i..0111  y11111r    c                 0    |                      d           d S )Nz +OK message marked for deletion.rC   rD   s     r   cmd_delezDummyPOP3Handler.cmd_dele{   s    		455555r    c                 0    |                      d           d S Nz+OK done nothing.rC   rD   s     r   cmd_noopzDummyPOP3Handler.cmd_noop~       		%&&&&&r    c                 0    |                      d           d S rX   rC   rD   s     r   cmd_rpopzDummyPOP3Handler.cmd_rpop   rZ   r    c                 0    |                      d           d S rX   rC   rD   s     r   cmd_apopzDummyPOP3Handler.cmd_apop   rZ   r    c                 X    |                      d           |                                  d S )Nz+OK closing.)r   close_when_donerD   s     r   cmd_quitzDummyPOP3Handler.cmd_quit   s,    		.!!!r    c                 T    t          | j                  }| j        st          rg |d<   |S NSTLS)dictCAPASr   SUPPORTS_SSL)r   _capass     r   
_get_capaszDummyPOP3Handler._get_capas   s0    dj!! 	 < 	 F6Nr    c                 ^   |                      d           |                                 rn|                                                                 D ]G\  }}|g}|r|                    |           |                      d                    |                     H|                      d           d S )Nz+OK Capability list followsr)   .)r   ri   itemsextendr.   )r   r8   capparams_lns        r   cmd_capazDummyPOP3Handler.cmd_capa   s    		/000?? 	)#006688 ) )Ve 'JJv&&&		#((3--((((		#r    c                 B    |                      | j        rdnd           d S )Nz+OK I know RFC6856z-ERR What is UTF8?!)r   enable_UTF8rD   s     r   cmd_utf8zDummyPOP3Handler.cmd_utf8   s6    		%-&&,	. 	. 	. 	. 	.r    c                    | j         du r|                     d           t          j        t          j                  }|                    t                     |                    | j        ddd          }| 	                                 | 
                    |           d| _         d| _        g | _        |                                  d S |                     d           d S )NFz+OK Begin TLS negotiationT)server_sidedo_handshake_on_connectsuppress_ragged_eofsz*-ERR Command not permitted when TLS active)r   r   ssl
SSLContextPROTOCOL_TLS_SERVERload_cert_chainCERTFILEwrap_socketsocketdel_channel
set_socketr   r   _do_tls_handshake)r   r8   contexttls_socks       r   cmd_stlszDummyPOP3Handler.cmd_stls   s    %''		5666.)@AA''111"..t{;?GLDI / K K   """)))"&$(!!#&&(((((		FGGGGGr    c                 @   	 | j                                          d| _        d| _        d S # t          j        $ r}|j        d         t          j        t          j        fv rY d }~d S |j        d         t          j	        k    r| 
                                cY d }~S d|j        d         v sd|j        d         v r| 
                                cY d }~S  d }~wt          $ r?}|j        d         t          j        k    r| 
                                cY d }~S Y d }~d S d }~ww xY w)NTFr   SSLV3_ALERT_BAD_CERTIFICATEr+   SSLV3_ALERT_CERTIFICATE_UNKNOWN)r   do_handshaker   r   ry   SSLErrorargsSSL_ERROR_WANT_READSSL_ERROR_WANT_WRITESSL_ERROR_EOFhandle_closeOSErrorerrnoECONNABORTED)r   errs     r   r   z"DummyPOP3Handler._do_tls_handshake   s_   *((***  #'$)!!!! < 
 
 
8A;3#:#&#;#= = =FFFFFXa[C$555,,........3sx{BB738A;FF,,........ / / /8A;%"444,,........ 544444/sD   + D%C%.CD1C
DCD.DDDc                     | j         r|                                  d S 	 t          j                            |            d S # t
          j        $ r |                                  Y d S w xY wr"   )r   r   r
   r   handle_readry   SSLEOFErrorr   r=   s    r   r   zDummyPOP3Handler.handle_read   s      (&&(((((('33D99999 ( ( (%%''''''(s   A   #A'&A'N)__name__
__module____qualname__rf   rs   r   r&   r:   r>   r   rE   rH   rK   rM   rP   cmd_uidlrT   cmd_toprV   rY   r\   r^   ra   ri   rq   rt   rg   r   r   r   r<   r    r   r   r   5   s       ,G+HIIEK" " "$ $ $C C C   L L L  + + +
% % %
     6 6 6 H2 2 2 G6 6 6' ' '' ' '' ' '      . . .
  0(	H 	H 	H$	* 	* 	**	( 	( 	( 	( 	(S0( 0(r    r   c                   T    e Zd ZeZej        fdZd Zd Z	d Z
d Zd ZeZd Zd Zd	S )
DummyPOP3Serverc                    t           j                            |            t          j                            |            d| _        |                     |t          j                   | 	                    |           | 
                    d           d| _        t          j                    | _        | j                                        d d         \  | _        | _        d | _        d S )NT   F   )	threadingThreadr   r   
dispatcherdaemoncreate_socketr   SOCK_STREAMbindlistenactiveLockactive_lockgetsocknamehostporthandler_instance)r   addressafs      r   r   zDummyPOP3Server.__init__   s    !!$'''$$T***2v1222		'A$>++#{6688!<	49 $r    c                     t          j                    | _        t           j                            |            | j                                         d S r"   )r   Event_DummyPOP3Server__flagr   startwaitr=   s    r   r   zDummyPOP3Server.start   sB    o''t$$$r    c                    d| _         | j                                         	 | j         rZt          j        rN| j        5  t                              dd           d d d            n# 1 swxY w Y   | j         rt          j        Nt                              d           d S # t                              d           w xY w)NTg?r+   )timeoutcount)
ignore_all)r   r   setr   
socket_mapr   loop	close_allr=   s    r   runzDummyPOP3Server.run   s    	0+ 8("5 8% 8 8MM#QM7778 8 8 8 8 8 8 8 8 8 8 8 8 8 8 + 8("5 8 $/////H$////s.   B  A%B  %A))B  ,A)-B   B=c                 <    d| _         |                                  d S NF)r   r.   r=   s    r   stopzDummyPOP3Server.stop   s    		r    c                 :    |                      |          | _        d S r"   )handlerr   )r   r   addrs      r   handle_acceptedzDummyPOP3Server.handle_accepted   s     $T 2 2r    c                 .    |                                   d S r"   )closer=   s    r   handle_connectzDummyPOP3Server.handle_connect   s    

r    c                     dS )Nr   r<   r=   s    r   writablezDummyPOP3Server.writable   s    qr    c                       r"   r<   r=   s    r   r>   zDummyPOP3Server.handle_error  r?   r    N)r   r   r   r   r   r   AF_INETr   r   r   r   r   r   r   r   r>   r<   r    r   r   r      s        G#)> 
% 
% 
% 
%  0 0 0  
3 3 3   K      r    r   c                   4   e Zd Zd Zd Zd Zd Zd Zd Zd Z	d Z
d	 Zd
 Zd Zd Zd Zd Z ej        dd          d             Z ej        dd          d             Zd Zd Zd Zd Zd Zd Zed             Zed             Zed             ZdS )TestPOP3Classc                 V    |                      |                    d                     d S )N   +OK)
assertTrue
startswithr   resps     r   assertOKzTestPOP3Class.assertOK  s&    //00000r    c                     t          t          t          f          | _        | j                                         t          j        | j        j        | j        j        t          j
                  | _        d S Nr   )r   HOSTPORTserverr   poplibPOP3r   r   test_supportLOOPBACK_TIMEOUTclientr=   s    r   setUpzTestPOP3Class.setUp	  s\    %tTl33k$+"2DK4D*6*GI I Ir    c                 x    | j                                          | j                                         d | _        d S r"   )r   r   r   r   r=   s    r   tearDownzTestPOP3Class.tearDown  s5    r    c                 `    |                      | j                                        d           d S )Ns(   +OK dummy pop3 server ready. <timestamp>)assertEqualr   
getwelcomer=   s    r   test_getwelcomezTestPOP3Class.test_getwelcome  s<    //11D	F 	F 	F 	F 	Fr    c                 \    |                      t          j        | j        j        d           d S )Nz	echo -err)assertRaisesr   error_protor   	_shortcmdr=   s    r   test_exceptionszTestPOP3Class.test_exceptions  s(    &,dk.C[QQQQQr    c                     |                      | j                            d                     |                     t          j        | j        j        d           d S )NrG   invalid)r   r   userr   r   r   r=   s    r   	test_userzTestPOP3Class.test_user  sJ    dk&&w//000&,dk.>	JJJJJr    c                     |                      | j                            d                     |                     t          j        | j        j        d           d S )NrJ   r   )r   r   pass_r   r   r   r   r=   s    r   
test_pass_zTestPOP3Class.test_pass_   sJ    dk''11222&,dk.>	JJJJJr    c                 `    |                      | j                                        d           d S )N)
   d   )r   r   statr=   s    r   	test_statzTestPOP3Class.test_stat$  s,    ))++Y77777r    c                     |                      | j                                        dd          g ddf           |                     | j                            d                              d                     d S )Nr+   )s   1 1s   2 2s   3 3s   4 4s   5 5   1s   OK 1 1)r   r   listr   endswithr=   s    r   	test_listzTestPOP3Class.test_list'  s|    ))++ABB/BBB	 	 	 	((--66yAABBBBBr    c                 t    dg ddf}| j                             d          }|                     ||           d S )N   +OK 116 bytess   From: postmaster@python.orgs   Content-Type: text/plains   MIME-Version: 1.0s   Subject: Dummyr    s   line1s   line2s   line3q   foo)r   retrr   )r   expectedr  s      r   	test_retrzTestPOP3Class.test_retr-  sS    $8 8 8 	
 ku%%h'''''r    c                     |                      t          j        | j        j        dt          j        dz   dz  z             d S )Nzecho +%sr   a)r   r   r   r   r   _MAXLINEr=   s    r   test_too_long_linesz!TestPOP3Class.test_too_long_lines6  sI    &,dk.C$2)=(DE	G 	G 	G 	G 	Gr    c                 `    |                      | j                            d                     d S Nr  )r   r   deler=   s    r   	test_delezTestPOP3Class.test_dele:  *    dk&&u--.....r    c                 ^    |                      | j                                                   d S r"   )r   r   noopr=   s    r   	test_noopzTestPOP3Class.test_noop=  s(    dk&&(()))))r    c                 `    |                      | j                            d                     d S r  )r   r   rpopr=   s    r   	test_rpopzTestPOP3Class.test_rpop@  r  r    md5T)opensslc                 b    |                      | j                            dd                     d S )Nr  dummypassword)r   r   apopr=   s    r   test_apop_normalzTestPOP3Class.test_apop_normalC  s,    dk&&uo>>?????r    c                     dddz  z   }t          j        | j        d|          5  |                     t          j        | j        j        dd           d d d            d S # 1 swxY w Y   d S )Nr      <i@B welcomer	  kb)r   	swap_attrr   r   r   r   r  )r   evil_welcomes     r   test_apop_REDOSzTestPOP3Class.test_apop_REDOSG  s     0#DKLII 	O 	Of0$+2BCNNN	O 	O 	O 	O 	O 	O 	O 	O 	O 	O 	O 	O 	O 	O 	O 	O 	O 	Os   -AA"%A"c                 r    dg ddf}|                      | j                            dd          |           d S )Nr  r  r  r+   )r   r   top)r   r  s     r   test_topzTestPOP3Class.test_topR  sN    %4 4 4 	
 	A..99999r    c                 l    | j                                          | j                             d           d S r  )r   uidlr=   s    r   	test_uidlzTestPOP3Class.test_uidlZ  s2    r    c                 |    d| j         j        _        |                     t          j        | j        j                   d S r   )r   r   rs   r   r   r   r   utf8r=   s    r   test_utf8_raises_if_unsupportedz-TestPOP3Class.test_utf8_raises_if_unsupported^  s3    */'&,dk.>?????r    c                     d| j         j        _        d}| j                                        }|                     ||           d S )NTs   +OK I know RFC6856)r   r   rs   r   r+  r   )r   r  results      r   	test_utf8zTestPOP3Class.test_utf8b  sC    *.'(!!##*****r    c                     | j                                         }|                     d|                                v            d S )Nr   r   capar   keysr   r2  s     r   	test_capazTestPOP3Class.test_capah  s;    {!!(DIIKK788888r    c                     | j                                         }|                     |           |                     | j         j                   |                     | j         j                   d S r"   )r   quitr   assertIsNonesockfiler   s     r   	test_quitzTestPOP3Class.test_quitl  s_    {!!$+*+++$+*+++++r    c                     | j                                         }|                     d|                                v            d S rc   r1  r4  s     r   test_stls_capazTestPOP3Class.test_stls_capar  s:    {!!$))++-.....r    c                 h    d}| j                                         }|                     ||           d S )N   +OK Begin TLS negotiation)r   stlsr   )r   r  r   s      r   	test_stlszTestPOP3Class.test_stlsw  s6    /{!!x(((((r    c                 `   d}t          j        t           j                  }|                    t                     |                     |j        t           j                   |                     |j        d           | 	                    t           j
                  5  | j                            |          }d d d            n# 1 swxY w Y   t          j        d| j        j        t"          j                  | _        | j                            |          }|                     ||           d S )Nr?  Tr   	localhostr   )ry   rz   PROTOCOL_TLS_CLIENTload_verify_locationsCAFILEr   verify_modeCERT_REQUIREDcheck_hostnamer   CertificateErrorr   r@  r   r   r   r   r   r   )r   r  ctxr   s       r   test_stls_contextzTestPOP3Class.test_stls_context}  sC   /nS455!!&)))#*;<<<+T222s344 	1 	1;##C#00D	1 	1 	1 	1 	1 	1 	1 	1 	1 	1 	1 	1 	1 	1 	1k+t{/?*6*GI I I{,,x(((((s   CC	CN)r   r   r   r   r   r   r   r   r   r   r   r   r  r  r  r  r  r   requires_hashdigestr  r#  r&  r)  r,  r/  r5  r;  requires_sslr=  rA  rM  r<   r    r   r   r     s       1 1 1I I I  F F FR R RK K KK K K8 8 8C C C( ( (G G G/ / /* * */ / / (^'t<<<@ @ =<@ (^'t<<<O O =<O: : :     @ @ @+ + +9 9 9, , , / / \/ ) ) \)
 ) ) \) ) )r    r   )SSLConnectionc                       e Zd Zd ZdS )DummyPOP3_SSLHandlerc                     t           j                            | |           |                                  |                     d           g | _        |                     d           d| _        d| _        d S )Nr   r   TF)	r
   r   r   secure_connectionr   r   r   r   r   r   s     r   r   zDummyPOP3_SSLHandler.__init__  sp    ((t444""$$$(((DNII@AAA"DO %Dr    N)r   r   r   r   r<   r    r   rR  rR    s#        	& 	& 	& 	& 	&r    rR  c                   0    e Zd Zd Zd Zd Zd ZeZd ZdS )TestPOP3_SSLClassc                     t          t          t          f          | _        t          | j        _        | j                                         t          j        | j        j	        | j        j
                  | _        d S r"   )r   r   r   r   rR  r   r   r   r   r   r   r   r=   s    r   r   zTestPOP3_SSLClass.setUp  sT    %tTl332odk&68HIIr    c                 F    |                      dt          j                   d S )Nr   )assertInr   __all__r=   s    r   test__all__zTestPOP3_SSLClass.test__all__  s    j&.11111r    c           	         t          j        t           j                  }d|_        t           j        |_        |                     t          t          j	        | j
        j        | j
        j        t          |           |                     t          t          j	        | j
        j        | j
        j        t          |           |                     t          t          j	        | j
        j        | j
        j        t          t          |           | j                                         t          j	        | j
        j        | j
        j        |          | _        |                     | j        j        t           j                   |                     | j        j        j        |           |                     | j                                                            d                     d S )NF)keyfiler   )certfiler   )r]  r^  r   rC  r   )ry   rz   rE  rJ  	CERT_NONErH  r   
ValueErrorr   r   r   r   r   r}   r   r7  assertIsInstancer9  	SSLSocketassertIsr   r   r  r   )r   rL  s     r   test_contextzTestPOP3_SSLClass.test_context  s|   nS455"-*fot{7G K,h 	 	M 	M 	M*fot{7G K,x 	 	N 	N 	N*fot{7G K,h%-s 	 	< 	< 	< 	odk&68H035 5 5dk.>>>dk&.444((**55f==>>>>>r    c                 Z    |                      t          j        | j        j                   d S r"   r   r   r   r   r@  r=   s    r   rA  zTestPOP3_SSLClass.test_stls  &    &,dk.>?????r    c                     | j                                         }|                     d|                                v            d S rc   r   r2  assertFalser3  r4  s     r   r=  z TestPOP3_SSLClass.test_stls_capa  s<    {!!499;;./////r    N)	r   r   r   r   r[  rd  rA  rM  r=  r<   r    r   rV  rV    sm        J J J2 2 2? ? ?&@ @ @ "0 0 0 0 0r    rV  c                   *    e Zd Zd Zd Zd ZeZd ZdS )TestPOP3_TLSClassc                    t          t          t          f          | _        | j                                         t          j        | j        j        | j        j        t          j
                  | _        | j                                         d S r   )r   r   r   r   r   r   r   r   r   r   r   r   r@  r=   s    r   r   zTestPOP3_TLSClass.setUp  sr    %tTl33k$+"2DK4D*6*GI I Ir    c                    | j         j        U| j         j        I	 | j                                          n.# t          j        $ r | j                                          Y nw xY w| j                                         d | _        d S r"   )	r   r:  r9  r7  r   r   r   r   r   r=   s    r   r   zTestPOP3_TLSClass.tearDown  s    ;'DK,<,H$  """"% $ $ $ !!#####	$
 	s   4 (AAc                 Z    |                      t          j        | j        j                   d S r"   rf  r=   s    r   rA  zTestPOP3_TLSClass.test_stls  rg  r    c                     | j                                         }|                     d|                                v            d S )Ns   STLSri  r4  s     r   r=  z TestPOP3_TLSClass.test_stls_capa  s<    {!!DIIKK/00000r    N)r   r   r   r   r   rA  rM  r=  r<   r    r   rl  rl    s[            @ @ @ "1 1 1 1 1r    rl  c                   2    e Zd Zd Zd Zd Zd Zd Zd ZdS )TestTimeoutsc                    t          j                    | _        t          j        t          j        t          j                  | _        | j                            d           t          j	        | j                  | _
        t          j        | j        | j        | j        f          | _        d| j        _        | j                                         | j                                         d S )N<   )targetr   T)r   r   evtr   r   r   r9  
settimeoutr   	bind_portr   r   r   threadr   r   r   r=   s    r   r   zTestTimeouts.setUp  s    ?$$M&.&2DEE		R   !+DI66	&dk49@UVVV!r    c                 F    | j                                          d | _         d S r"   )ry  r.   r=   s    r   r   zTestTimeouts.tearDown  s!    r    c                 T   |                                  |                                 	 |                                \  }}|                    d           |                                 n# t
          $ r Y nw xY w|                                 d S # |                                 w xY w)Ns   + Hola mundo
)r   r   acceptsendr   TimeoutError)r   rv  servr   r   s        r   r   zTestTimeouts.server  s    				JD$II'(((JJLLLL 	 	 	D	 JJLLLLLDJJLLLLs*   A A+ *B +
A85B 7A88B B'c                    |                      t          j                               t          j        t          j                   	 t          j        t          | j	                  }t          j        d            n# t          j        d            w xY w| 
                    |j                                        t          j                   |                                 d S r"   )r8  r   getdefaulttimeoutsetdefaulttimeoutr   r   r   r   r   r   r   r9  
gettimeoutr   r   pops     r   testTimeoutDefaultzTestTimeouts.testTimeoutDefault  s    &244555 !>???	++dDI..C$T****F$T****,,..0MNNN		s   A: :Bc                    |                      t          j                               t          j        d           	 t	          j        t          | j        d           }t          j        d            n# t          j        d            w xY w|                      |j        	                                           |
                                 d S )N   r   )r8  r   r  r  r   r   r   r   r9  r  r   r  s     r   testTimeoutNonezTestTimeouts.testTimeoutNone  s    &244555 $$$	++dDIt<<<C$T****F$T****#(--//000		s   !A2 2Bc                    t          j        t          | j        t          j                  }|                     |j                                        t          j                   |	                                 | 
                    t                    5  t          j        t          | j        d           d d d            d S # 1 swxY w Y   d S )Nr   r   )r   r   r   r   r   r   r   r9  r  r   r   r`  r  s     r   testTimeoutValuezTestTimeouts.testTimeoutValue  s    k$	<3PQQQ,,..0MNNN		z** 	4 	4Kdi3333	4 	4 	4 	4 	4 	4 	4 	4 	4 	4 	4 	4 	4 	4 	4 	4 	4 	4s   "C  CCN)	r   r   r   r   r   r   r  r  r  r<   r    r   rr  rr    sn            

 
 
    4 4 4 4 4r    rr  c                  d    t          j                    } t          j        t           j        g| R   d S r"   )r   threading_setupunittestaddModuleCleanupthreading_cleanup)thread_infos    r   setUpModuler     s3    "244K.@O;OOOOOOr    __main__)3__doc__r   r   osr   r   r  r   r   testr   r   test.supportr   r   r   r	   import_deprecatedr
   r   requires_working_socketr   r   rg   r3   ry   pathr.   dirname__file__curdirr}   rG  rO  rO   rS   r   r   r   r   r   r   test.test_ftplibrP  rR  rV  rl  rr  r  r   mainr<   r    r   <module>r     sU   $ $
   				       ) ) ) ) ) ) ) ) ( ( ( ( ( ( ' ' ' ' ' ' & & & & & & ) ) ) ) ) ) ( ( ( ( ( ( -?,Z88,?,Z88 % $D 1 1 1 1
76: RJJJLw||BGOOH55BNSSHW\\"'//(33@ry.QQFz,(;<< 8			[( [( [( [( [(x* [( [( [(z0 0 0 0 0h)9+; 0 0 0fD) D) D) D) D)H D) D) D)N  &......	& 	& 	& 	& 	&}.> 	& 	& 	& &0 &0 &0 &0 &0 &0 &0 &0R 1 1 1 1 1 1 1 1B64 64 64 64 648 64 64 64rP P P
 zHMOOOOO r    