B
    u9aŠC  ã               @   sr  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Zd dlmZm	Z	 d dl
mZ ejZd ZdZee dƒr°d 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„ dejƒZG dd„ dejejƒZ G dd„ deƒZ!erd dl"m#Z# G dd„ de#eƒZ$eG dd„ de!ƒƒZ%eG dd„ de!ƒƒZ&G dd„ deƒZ'dd„ Z(e)dkrne(ƒ  dS )é    N)ÚTestCaseÚ
skipUnless)ÚsupportFÚPOP3_SSLTz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               @   sØ   e Zd Zg dgdœZdZdd„ Zdd„ Zdd	„ Zd
d„ Zdd„ Z	dd„ Z
dd„ Zdd„ Zdd„ Zdd„ ZeZdd„ ZeZdd„ Zdd„ Zdd„ Zd d!„ Zd"d#„ Zd$d%„ Zd&d'„ Zd(d)„ ZerÔd*d+„ Zd,d-„ Zd.d/„ Zd0S )1ÚDummyPOP3Handlerzpython-testlib-pop-server)ZUIDLÚIMPLEMENTATIONFc             C   s8   t j | |¡ |  d¡ g | _|  d¡ d| _d| _d S )Ns   
z(+OK dummy pop3 server ready. <timestamp>F)ÚasynchatÚ
async_chatÚ__init__Úset_terminatorÚ	in_bufferÚpushÚ
tls_activeÚtls_starting)ÚselfÚconn© r   ú!/usr/lib/python3.7/test_poplib.pyr
   0   s    

zDummyPOP3Handler.__init__c             C   s   | j  |¡ d S )N)r   Úappend)r   Údatar   r   r   Úcollect_incoming_data8   s    z&DummyPOP3Handler.collect_incoming_datac             C   sŽ   d  | j¡}t|dƒ}g | _| d¡d  ¡ }| d¡}|dkrR||d d … }nd}t| d| ƒr|t| d| ƒ}||ƒ n|  d	| ¡ d S )
Nó    z
ISO-8859-1ú r   éÿÿÿÿé   Ú Zcmd_z$-ERR unrecognized POP3 command "%s".)	Újoinr   ÚstrÚsplitÚlowerÚfindÚhasattrÚgetattrr   )r   ÚlineÚcmdZspaceÚargÚmethodr   r   r   Úfound_terminator;   s    


z!DummyPOP3Handler.found_terminatorc              C   s   ‚ d S )Nr   )r   r   r   r   Úhandle_errorK   s    zDummyPOP3Handler.handle_errorc             C   s   t j | | d¡d ¡ d S )Nz
ISO-8859-1s   
)r   r	   r   Úencode)r   r   r   r   r   r   N   s    zDummyPOP3Handler.pushc             C   s   |   |¡ d S )N)r   )r   r%   r   r   r   Úcmd_echoQ   s    zDummyPOP3Handler.cmd_echoc             C   s    |dkr|   d¡ |   d¡ d S )NÚguidoz-ERR no such userz+OK password required)r   )r   r%   r   r   r   Úcmd_userU   s    
zDummyPOP3Handler.cmd_userc             C   s    |dkr|   d¡ |   d¡ d S )NÚpythonz-ERR wrong passwordz+OK 10 messages)r   )r   r%   r   r   r   Úcmd_passZ   s    
zDummyPOP3Handler.cmd_passc             C   s   |   d¡ d S )Nz
+OK 10 100)r   )r   r%   r   r   r   Úcmd_stat_   s    zDummyPOP3Handler.cmd_statc             C   s4   |r|   d||f ¡ n|   d¡ tj  | t¡ d S )Nz	+OK %s %sz+OK)r   r   r	   Ú	LIST_RESP)r   r%   r   r   r   Úcmd_listb   s    
zDummyPOP3Handler.cmd_listc             C   s$   |   dttƒ ¡ tj  | t¡ d S )Nz+OK %s bytes)r   ÚlenÚ	RETR_RESPr   r	   )r   r%   r   r   r   Úcmd_retrk   s    zDummyPOP3Handler.cmd_retrc             C   s   |   d¡ d S )Nz +OK message marked for deletion.)r   )r   r%   r   r   r   Úcmd_deleq   s    zDummyPOP3Handler.cmd_delec             C   s   |   d¡ d S )Nz+OK done nothing.)r   )r   r%   r   r   r   Úcmd_noopt   s    zDummyPOP3Handler.cmd_noopc             C   s   |   d¡ d S )Nz+OK done nothing.)r   )r   r%   r   r   r   Úcmd_rpopw   s    zDummyPOP3Handler.cmd_rpopc             C   s   |   d¡ d S )Nz+OK done nothing.)r   )r   r%   r   r   r   Úcmd_apopz   s    zDummyPOP3Handler.cmd_apopc             C   s   |   d¡ |  ¡  d S )Nz+OK closing.)r   Zclose_when_done)r   r%   r   r   r   Úcmd_quit}   s    
zDummyPOP3Handler.cmd_quitc             C   s    t | jƒ}| jstrg |d< |S )NÚSTLS)ÚdictÚCAPASr   ÚSUPPORTS_SSL)r   Z_capasr   r   r   Ú
_get_capas   s    

zDummyPOP3Handler._get_capasc             C   s^   |   d¡ |  ¡ rPx<|  ¡  ¡ D ],\}}|g}|r<| |¡ |   d |¡¡ q W |   d¡ d S )Nz+OK Capability list followsr   Ú.)r   r>   ÚitemsÚextendr   )r   r%   ZcapÚparamsZ_lnr   r   r   Úcmd_capa‡   s    

zDummyPOP3Handler.cmd_capac             C   s   |   | jrdnd¡ d S )Nz+OK I know RFC6856z-ERR What is UTF8?!)r   Úenable_UTF8)r   r%   r   r   r   Úcmd_utf8‘   s    
zDummyPOP3Handler.cmd_utf8c             C   sv   | j dkrh|  d¡ t ¡ }| t¡ |j| jdddd}|  ¡  |  	|¡ d| _ d| _
g | _|  ¡  n
|  d¡ d S )NFz+OK Begin TLS negotiationT)Zserver_sideZdo_handshake_on_connectZsuppress_ragged_eofsz*-ERR Command not permitted when TLS active)r   r   ÚsslÚ
SSLContextZload_cert_chainÚCERTFILEZwrap_socketÚsocketZdel_channelZ
set_socketr   r   Ú_do_tls_handshake)r   r%   ÚcontextZtls_sockr   r   r   Úcmd_stls˜   s    




zDummyPOP3Handler.cmd_stlsc          
   C   sÔ   y| j  ¡  W n´ tjk
rŠ } z\|jd tjtjfkr<d S |jd tjkrT|  ¡ S d|jd kspd|jd krx|  ¡ S ‚ W d d }~X Y nF t	k
rÂ } z|jd t
jkr²|  ¡ S W d d }~X Y nX d| _d| _d S )Nr   ZSSLV3_ALERT_BAD_CERTIFICATEr   ZSSLV3_ALERT_CERTIFICATE_UNKNOWNTF)rI   Zdo_handshakerF   ZSSLErrorÚargsZSSL_ERROR_WANT_READZSSL_ERROR_WANT_WRITEZSSL_ERROR_EOFÚhandle_closeÚOSErrorÚerrnoZECONNABORTEDr   r   )r   Úerrr   r   r   rJ   ª   s"    
z"DummyPOP3Handler._do_tls_handshakec             C   sD   | j r|  ¡  n0ytj | ¡ W n tjk
r>   |  ¡  Y nX d S )N)r   rJ   r   r	   Úhandle_readrF   ZSSLEOFErrorrN   )r   r   r   r   rR   ¿   s    
zDummyPOP3Handler.handle_readN)Ú__name__Ú
__module__Ú__qualname__r<   rD   r
   r   r'   r(   r   r*   r,   r.   r/   r1   Zcmd_uidlr4   Zcmd_topr5   r6   r7   r8   r9   r>   rC   rE   r=   rL   rJ   rR   r   r   r   r   r   +   s6   
r   c               @   sZ   e Zd ZeZejfdd„Zdd„ Zdd„ Z	dd„ Z
d	d
„ Zdd„ ZeZdd„ Zdd„ ZdS )ÚDummyPOP3Serverc             C   st   t j | ¡ tj | ¡ d| _|  |tj¡ |  	|¡ |  
d¡ d| _t  ¡ | _| j ¡ d d… \| _| _d | _d S )NTé   Fé   )Ú	threadingÚThreadr
   ÚasyncoreÚ
dispatcherÚdaemonZcreate_socketrI   ÚSOCK_STREAMZbindÚlistenÚactiveZLockÚactive_lockZgetsocknameÚhostÚportÚhandler_instance)r   ZaddressÚafr   r   r   r
   Ì   s    


zDummyPOP3Server.__init__c             C   s$   t  ¡ | _t j | ¡ | j ¡  d S )N)rY   ÚEventÚ_DummyPOP3Server__flagrZ   ÚstartÚwait)r   r   r   r   rh   Ø   s    
zDummyPOP3Server.startc          	   C   sZ   d| _ | j ¡  z6x0| j rBtjrB| j tjddd W d Q R X qW W d tjdd X d S )NTgš™™™™™¹?r   )ÚtimeoutÚcount)Z
ignore_all)r`   rg   Úsetr[   Z
socket_mapra   ZloopZ	close_all)r   r   r   r   ÚrunÞ   s    
 zDummyPOP3Server.runc             C   s   d| _ |  ¡  d S )NF)r`   r   )r   r   r   r   Ústopè   s    zDummyPOP3Server.stopc             C   s   |   |¡| _d S )N)Úhandlerrd   )r   r   Úaddrr   r   r   Úhandle_acceptedí   s    zDummyPOP3Server.handle_acceptedc             C   s   |   ¡  d S )N)Úclose)r   r   r   r   Úhandle_connectð   s    zDummyPOP3Server.handle_connectc             C   s   dS )Nr   r   )r   r   r   r   Úwritableô   s    zDummyPOP3Server.writablec              C   s   ‚ d S )Nr   )r   r   r   r   r(   ÷   s    zDummyPOP3Server.handle_errorN)rS   rT   rU   r   ro   rI   ÚAF_INETr
   rh   rm   rn   rq   rs   rR   rt   r(   r   r   r   r   rV   È   s   
rV   c               @   sà   e Zd Zdd„ Zdd„ Zdd„ Zdd„ Zd	d
„ Zdd„ Zdd„ Z	dd„ Z
dd„ Zdd„ Zdd„ Zdd„ Zdd„ Zdd„ Zdd„ Zdd „ Zd!d"„ Zd#d$„ Zd%d&„ Zd'd(„ Zd)d*„ Zd+d,„ Zed-d.„ ƒZed/d0„ ƒZed1d2„ ƒZd3S )4ÚTestPOP3Classc             C   s   |   | d¡¡ d S )Ns   +OK)Ú
assertTrueÚ
startswith)r   Úrespr   r   r   ÚassertOKü   s    zTestPOP3Class.assertOKc             C   s6   t ttfƒ| _| j ¡  tj| jj| jjdd| _	d S )Né   )rj   )
rV   ÚHOSTÚPORTÚserverrh   ÚpoplibÚPOP3rb   rc   Úclient)r   r   r   r   ÚsetUpÿ   s    
zTestPOP3Class.setUpc             C   s   | j  ¡  | j ¡  d | _d S )N)r   rr   r~   rn   )r   r   r   r   ÚtearDown  s    

zTestPOP3Class.tearDownc             C   s   |   | j ¡ d¡ d S )Ns(   +OK dummy pop3 server ready. <timestamp>)ÚassertEqualr   Z
getwelcome)r   r   r   r   Útest_getwelcome
  s    zTestPOP3Class.test_getwelcomec             C   s   |   tj| jjd¡ d S )Nz	echo -err)ÚassertRaisesr   Úerror_protor   Ú	_shortcmd)r   r   r   r   Útest_exceptions  s    zTestPOP3Class.test_exceptionsc             C   s*   |   | j d¡¡ |  tj| jjd¡ d S )Nr+   Úinvalid)rz   r   Úuserr†   r   r‡   )r   r   r   r   Ú	test_user  s    zTestPOP3Class.test_userc             C   s*   |   | j d¡¡ |  tj| jjd¡ d S )Nr-   rŠ   )rz   r   Zpass_r†   r   r‡   r‹   )r   r   r   r   Ú
test_pass_  s    zTestPOP3Class.test_pass_c             C   s   |   | j ¡ d¡ d S )N)é
   éd   )r„   r   Ústat)r   r   r   r   Ú	test_stat  s    zTestPOP3Class.test_statc             C   sD   |   | j ¡ dd … dddddg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   Úlistrw   Úendswith)r   r   r   r   Ú	test_list  s    zTestPOP3Class.test_listc          	   C   s6   ddddddddd	gd
f}| j  d¡}|  ||¡ d S )Ns   +OK 116 bytess   From: postmaster@python.orgs   Content-Type: text/plains   MIME-Version: 1.0s   Subject: Dummyr   s   line1s   line2s   line3éq   Úfoo)r   Zretrr„   )r   Úexpectedr˜   r   r   r   Ú	test_retr"  s    
zTestPOP3Class.test_retrc             C   s&   |   tj| jjdtjd d  ¡ d S )Nzecho +%srŽ   Úa)r†   r   r‡   r   rˆ   Z_MAXLINE)r   r   r   r   Útest_too_long_lines+  s    z!TestPOP3Class.test_too_long_linesc             C   s   |   | j d¡¡ d S )Nr˜   )rz   r   Zdele)r   r   r   r   Ú	test_dele/  s    zTestPOP3Class.test_delec             C   s   |   | j ¡ ¡ d S )N)rz   r   Únoop)r   r   r   r   Ú	test_noop2  s    zTestPOP3Class.test_noopc             C   s   |   | j d¡¡ d S )Nr˜   )rz   r   Zrpop)r   r   r   r   Ú	test_rpop5  s    zTestPOP3Class.test_rpopc             C   s   |   | j dd¡¡ d S )Nr˜   Zdummypassword)rz   r   Úapop)r   r   r   r   Útest_apop_normal8  s    zTestPOP3Class.test_apop_normalc          	   C   sB   ddd  }t  | jd|¡ |  tj| jjdd¡ W d Q R X d S )Ns   +OKó   <i@B Zwelcomer›   Zkb)Útest_supportZ	swap_attrr   r†   r   r‡   r¡   )r   Zevil_welcomer   r   r   Útest_apop_REDOS;  s    zTestPOP3Class.test_apop_REDOSc          	   C   s4   ddddddddd	gd
f}|   | j dd¡|¡ d S )Ns   +OK 116 bytess   From: postmaster@python.orgs   Content-Type: text/plains   MIME-Version: 1.0s   Subject: Dummyr   s   line1s   line2s   line3r—   r   )r„   r   Útop)r   r™   r   r   r   Útest_topE  s    zTestPOP3Class.test_topc             C   s   | j  ¡  | j  d¡ d S )Nr˜   )r   Zuidl)r   r   r   r   Ú	test_uidlM  s    
zTestPOP3Class.test_uidlc             C   s    d| j j_|  tj| jj¡ d S )NF)r~   ro   rD   r†   r   r‡   r   Úutf8)r   r   r   r   Útest_utf8_raises_if_unsupportedQ  s    
z-TestPOP3Class.test_utf8_raises_if_unsupportedc             C   s(   d| j j_d}| j ¡ }|  ||¡ d S )NTs   +OK I know RFC6856)r~   ro   rD   r   r©   r„   )r   r™   Úresultr   r   r   Ú	test_utf8U  s    

zTestPOP3Class.test_utf8c             C   s    | j  ¡ }|  d| ¡ k¡ d S )Nr   )r   Úcaparw   Úkeys)r   r­   r   r   r   Ú	test_capa[  s    
zTestPOP3Class.test_capac             C   s4   | j  ¡ }|  |¡ |  | j j¡ |  | j j¡ d S )N)r   Úquitrw   ÚassertIsNoneÚsockÚfile)r   ry   r   r   r   Ú	test_quit_  s    

zTestPOP3Class.test_quitc             C   s    | j  ¡ }|  d| ¡ k¡ d S )Nr:   )r   r­   rw   r®   )r   r­   r   r   r   Útest_stls_capae  s    
zTestPOP3Class.test_stls_capac             C   s   d}| j  ¡ }|  ||¡ d S )Ns   +OK Begin TLS negotiation)r   Ústlsr„   )r   r™   ry   r   r   r   Ú	test_stlsj  s    
zTestPOP3Class.test_stlsc          	   C   s’   d}t  t j¡}| t¡ |  |jt j¡ |  |jd¡ |  	t j
¡ | jj|d}W d Q R X tjd| jjdd| _| jj|d}|  ||¡ d S )Ns   +OK Begin TLS negotiationT)rK   Z	localhostr{   )rj   )rF   rG   ÚPROTOCOL_TLS_CLIENTZload_verify_locationsÚCAFILEr„   Úverify_modeZCERT_REQUIREDÚcheck_hostnamer†   ZCertificateErrorr   r¶   r   r€   r~   rc   )r   r™   Úctxry   r   r   r   Útest_stls_contextp  s    
zTestPOP3Class.test_stls_contextN)rS   rT   rU   rz   r‚   rƒ   r…   r‰   rŒ   r   r‘   r–   rš   rœ   r   rŸ   r    r¢   r¥   r§   r¨   rª   r¬   r¯   r´   Úrequires_sslrµ   r·   r½   r   r   r   r   rv   û   s2   	
rv   )ÚSSLConnectionc               @   s   e Zd Zdd„ ZdS )ÚDummyPOP3_SSLHandlerc             C   s@   t j | |¡ |  ¡  |  d¡ g | _|  d¡ d| _d| _d S )Ns   
z(+OK dummy pop3 server ready. <timestamp>TF)	r   r	   r
   Zsecure_connectionr   r   r   r   r   )r   r   r   r   r   r
   ƒ  s    

zDummyPOP3_SSLHandler.__init__N)rS   rT   rU   r
   r   r   r   r   rÀ     s   rÀ   c               @   s8   e Zd Zdd„ Zdd„ Zdd„ Zdd„ ZeZd	d
„ ZdS )ÚTestPOP3_SSLClassc             C   s:   t ttfƒ| _t| j_| j ¡  t | jj	| jj
¡| _d S )N)rV   r|   r}   r~   rÀ   ro   rh   r   r   rb   rc   r   )r   r   r   r   r‚   ‘  s    
zTestPOP3_SSLClass.setUpc             C   s   |   dtj¡ d S )Nr   )ZassertInr   Ú__all__)r   r   r   r   Útest__all__—  s    zTestPOP3_SSLClass.test__all__c          	   C   sÞ   t  t j¡}d|_t j|_| jttj	| j
j| j
jt|d | jttj	| j
j| j
jt|d | jttj	| j
j| j
jtt|d | j ¡  tj	| j
j| j
j|d| _|  | jjt j¡ |  | jjj|¡ |  | j ¡  d¡¡ d S )NF)ÚkeyfilerK   )ÚcertfilerK   )rÄ   rÅ   rK   )rK   s   +OK)rF   rG   r¸   r»   Z	CERT_NONErº   r†   Ú
ValueErrorr   r   r~   rb   rc   rH   r   r°   ZassertIsInstancer²   Z	SSLSocketZassertIsrK   rw   rž   rx   )r   r¼   r   r   r   Útest_contextš  s     


zTestPOP3_SSLClass.test_contextc             C   s   |   tj| jj¡ d S )N)r†   r   r‡   r   r¶   )r   r   r   r   r·   ­  s    zTestPOP3_SSLClass.test_stlsc             C   s    | j  ¡ }|  d| ¡ k¡ d S )Nr:   )r   r­   ÚassertFalser®   )r   r­   r   r   r   rµ   ²  s    
z TestPOP3_SSLClass.test_stls_capaN)	rS   rT   rU   r‚   rÃ   rÇ   r·   r½   rµ   r   r   r   r   rÁ     s   rÁ   c               @   s0   e Zd Zdd„ Zdd„ Zdd„ ZeZdd„ Zd	S )
ÚTestPOP3_TLSClassc             C   s@   t ttfƒ| _| j ¡  tj| jj| jjdd| _	| j	 
¡  d S )Nr{   )rj   )rV   r|   r}   r~   rh   r   r€   rb   rc   r   r¶   )r   r   r   r   r‚   »  s    
zTestPOP3_TLSClass.setUpc             C   s\   | j jd k	rH| j jd k	rHy| j  ¡  W n  tjk
rF   | j  ¡  Y nX | j ¡  d | _d S )N)	r   r³   r²   r°   r   r‡   rr   r~   rn   )r   r   r   r   rƒ   Á  s    
zTestPOP3_TLSClass.tearDownc             C   s   |   tj| jj¡ d S )N)r†   r   r‡   r   r¶   )r   r   r   r   r·   Î  s    zTestPOP3_TLSClass.test_stlsc             C   s    | j  ¡ }|  d| ¡ k¡ d S )Ns   STLS)r   r­   rÈ   r®   )r   r­   r   r   r   rµ   Ó  s    
z TestPOP3_TLSClass.test_stls_capaN)rS   rT   rU   r‚   rƒ   r·   r½   rµ   r   r   r   r   rÉ   ·  s
   rÉ   c               @   s<   e Zd Zdd„ Zdd„ Zdd„ Zdd„ Zd	d
„ Zdd„ ZdS )ÚTestTimeoutsc             C   sp   t  ¡ | _t tjtj¡| _| j d¡ t 	| j¡| _
t j| j| j| jfd| _d| j_| j ¡  | j ¡  d S )Né<   )ÚtargetrM   T)rY   rf   ÚevtrI   ru   r^   r²   Z
settimeoutr¤   Z	bind_portrc   rZ   r~   Úthreadr]   rh   ri   )r   r   r   r   r‚   Ú  s    

zTestTimeouts.setUpc             C   s   | j  ¡  d | _ d S )N)rÎ   r   )r   r   r   r   rƒ   ä  s    
zTestTimeouts.tearDownc             C   s^   |  ¡  | ¡  z>y"| ¡ \}}| d¡ | ¡  W n tjk
rJ   Y nX W d | ¡  X d S )Ns   + Hola mundo
)r_   rl   ZacceptÚsendrr   rI   rj   )r   rÍ   Zservr   rp   r   r   r   r~   é  s    

zTestTimeouts.serverc          	   C   sV   |   t ¡ ¡ t d¡ zt t| j¡}W d t d ¡ X |  |j	 
¡ d¡ | ¡  d S )Né   )r±   rI   ÚgetdefaulttimeoutÚsetdefaulttimeoutr   r€   r|   rc   r„   r²   Ú
gettimeoutrr   )r   Úpopr   r   r   ÚtestTimeoutDefaultõ  s    
zTestTimeouts.testTimeoutDefaultc          	   C   sX   |   t ¡ ¡ t d¡ ztjt| jd d}W d t d ¡ X |   |j 	¡ ¡ | 
¡  d S )NrÐ   )rj   )r±   rI   rÑ   rÒ   r   r€   r|   rc   r²   rÓ   rr   )r   rÔ   r   r   r   ÚtestTimeoutNoneÿ  s    
zTestTimeouts.testTimeoutNonec             C   s0   t jt| jdd}|  |j ¡ d¡ | ¡  d S )NrÐ   )rj   )r   r€   r|   rc   r„   r²   rÓ   rr   )r   rÔ   r   r   r   ÚtestTimeoutValue	  s    zTestTimeouts.testTimeoutValueN)	rS   rT   rU   r‚   rƒ   r~   rÕ   rÖ   r×   r   r   r   r   rÊ   Ø  s   


rÊ   c              C   s4   t tttg} t ¡ }ztj| Ž  W d tj|Ž  X d S )N)rv   rÊ   rÁ   rÉ   r¤   Zthreading_setupZrun_unittestZthreading_cleanup)ZtestsÚthread_infor   r   r   Ú	test_main  s    rÙ   Ú__main__)*r   r[   r   rI   ÚosrP   rY   Zunittestr   r   Ztestr   r¤   r|   r}   r=   r!   rF   Úpathr   ÚdirnameÚ__file__ÚcurdirrH   r¹   r¾   r0   r3   r	   r   r\   rZ   rV   rv   Ztest.test_ftplibr¿   rÀ   rÁ   rÉ   rÊ   rÙ   rS   r   r   r   r   Ú<module>   sF   

	 3 ) 7

