
    z%iD                     L   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 dd	lmZ  ej$                  d
       ej&                  ZdZdZ eed      rddlZd
Zej0                  j3                  ej0                  j5                  e      xs ej8                  d      Zej0                  j3                  ej0                  j5                  e      xs ej8                  d      Z eed      ZdZ dZ! G d dejD                        Z# G d dejH                  ejJ                        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" Z.e/d#k(  r ej`                          yy)$zTest script for poplib module.    N)TestCase
skipUnless)support)hashlib_helper)socket_helper)threading_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yy)DummyPOP3Handlerzpython-testlib-pop-server)UIDLIMPLEMENTATIONFc                     t         j                  j                  | |       | j                  d       g | _        | j                  d       d| _        d| _        y )N   
(+OK dummy pop3 server ready. <timestamp>F)r	   
async_chat__init__set_terminator	in_bufferpush
tls_activetls_startingselfconns     D/home/uftp/.pyenv/versions/3.12.0/lib/python3.12/test/test_poplib.pyr   zDummyPOP3Handler.__init__7   sI    $$T40G$		<=!    c                 :    | j                   j                  |       y N)r   appendr   datas     r   collect_incoming_dataz&DummyPOP3Handler.collect_incoming_data?   s    d#r   c                 \   dj                  | j                        }t        |d      }g | _        |j                  d      d   j	                         }|j                  d      }|dk7  r	||dz   d  }nd}t        | d|z         rt        | d|z         } ||       y | j                  d	|z         y )
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_terminatorB   s    xx'4&jjoa &&(		#B;uqyz"CC4#&T6C<0F3KII<cABr   c                       r!    r   s    r   handle_errorzDummyPOP3Handler.handle_errorR       r   c                 h    t         j                  j                  | |j                  d      dz          y )Nr'   r   )r	   r   r   encoder#   s     r   r   zDummyPOP3Handler.pushU   s&      t{{<'@7'JKr   c                 &    | j                  |       y r!   r   r   r7   s     r   cmd_echozDummyPOP3Handler.cmd_echoX   s    		#r   c                 R    |dk7  r| j                  d       | j                  d       y )Nguidoz-ERR no such userz+OK password requiredrB   rC   s     r   cmd_userzDummyPOP3Handler.cmd_user\   s#    '>II)*		)*r   c                 R    |dk7  r| j                  d       | j                  d       y )Npythonz-ERR wrong passwordz+OK 10 messagesrB   rC   s     r   cmd_passzDummyPOP3Handler.cmd_passa   s#    (?II+,		#$r   c                 &    | j                  d       y )Nz
+OK 10 100rB   rC   s     r   cmd_statzDummyPOP3Handler.cmd_statf   s    		,r   c                     |r| j                  d|d|       y | j                  d       t        j                  j                  | t               y )Nz+OK r(   z+OK)r   r	   r   	LIST_RESPrC   s     r   cmd_listzDummyPOP3Handler.cmd_listi   s8    IIS#./IIe$$T95r   c                     | j                  dt        t              z         t        j                  j                  | t               y )Nz+OK %s bytes)r   len	RETR_RESPr	   r   rC   s     r   cmd_retrzDummyPOP3Handler.cmd_retrr   s-    		.#i.01  y1r   c                 &    | j                  d       y )Nz +OK message marked for deletion.rB   rC   s     r   cmd_delezDummyPOP3Handler.cmd_delex   s    		45r   c                 &    | j                  d       y Nz+OK done nothing.rB   rC   s     r   cmd_noopzDummyPOP3Handler.cmd_noop{       		%&r   c                 &    | j                  d       y rW   rB   rC   s     r   cmd_rpopzDummyPOP3Handler.cmd_rpop~   rY   r   c                 &    | j                  d       y rW   rB   rC   s     r   cmd_apopzDummyPOP3Handler.cmd_apop   rY   r   c                 F    | j                  d       | j                          y )Nz+OK closing.)r   close_when_donerC   s     r   cmd_quitzDummyPOP3Handler.cmd_quit   s    		.!r   c                 ^    t        | j                        }| j                  st        rg |d<   |S NSTLS)dictCAPASr   SUPPORTS_SSL)r   _capass     r   
_get_capaszDummyPOP3Handler._get_capas   s'    djj!<F6Nr   c                     | j                  d       | j                         r\| j                         j                         D ];  \  }}|g}|r|j                  |       | j                  dj	                  |             = | j                  d       y )Nz+OK Capability list followsr(   .)r   rh   itemsextendr-   )r   r7   capparams_lns        r   cmd_capazDummyPOP3Handler.cmd_capa   ss    		/0??#0668 )VeJJv&		#((3-(	)
 			#r   c                 L    | j                  | j                  rd       y d       y )Nz+OK I know RFC6856z-ERR What is UTF8?!)r   enable_UTF8rC   s     r   cmd_utf8zDummyPOP3Handler.cmd_utf8   s$    		%% ' 	.,	.r   c                    | j                   du r| j                  d       t        j                  t        j                        }|j                  t               |j                  | j                  ddd      }| j                          | j                  |       d| _         d| _        g | _        | j                          y | j                  d       y )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   r7   contexttls_socks       r   cmd_stlszDummyPOP3Handler.cmd_stls   s    %'		56..)@)@A''1"..t{{;?GLDI / K   ")"&$(!!#&&(		FGr   c                 Z   	 | j                   j                          d| _        d| _        y # t        j
                  $ r}|j                  d   t        j                  t        j                  fv rY d }~y |j                  d   t        j                  k(  r| j                         cY d }~S d|j                  d   v sd|j                  d   v r| j                         cY d }~S  d }~wt        $ r?}|j                  d   t        j                  k(  r| j                         cY d }~S Y d }~y d }~ww xY w)NTFr   SSLV3_ALERT_BAD_CERTIFICATEr*   SSLV3_ALERT_CERTIFICATE_UNKNOWN)r~   do_handshaker   r   rx   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    *((*  #'$)!! << 
88A;3#:#:#&#;#;#= =XXa[C$5$55,,..3sxx{B7388A;F,,.. /88A;%"4"44,,.. 5/sD   + D*/C2/C!D*'1CD*CD*+/D%D*%D*c                     | j                   r| j                          y 	 t        j                  j	                  |        y # t
        j                  $ r | j                          Y y w xY wr!   )r   r   r	   r   handle_readrx   SSLEOFErrorr   r<   s    r   r   zDummyPOP3Handler.handle_read   sO      &&((''33D9 (%%'(s   ? #A%$A%N)__name__
__module____qualname__re   rr   r   r%   r9   r=   r   rD   rG   rJ   rL   rO   cmd_uidlrS   cmd_toprU   rX   r[   r]   r`   rh   rp   rs   rf   r   r   r   r;   r   r   r   r   2   s    ,G+HIEK"$C L+
%
 6 H2 G6'''.
 	H$	**	(S r   r   c                   \    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y	)
DummyPOP3Serverc                    t         j                  j                  |        t        j                  j                  |        d| _        | j                  |t        j                         | j                  |       | j                  d       d| _        t        j                         | _        | j                  j                         d d \  | _        | _        d | _        y )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12		'A$>>+#{{668!<	49 $r   c                     | j                   rJ t        j                         | _        t        j                  j                  |        | j                  j                          y r!   )r   r   Event_DummyPOP3Server__flagr   startwaitr<   s    r   r   zDummyPOP3Server.start   s>    ;;oo't$r   c                    d| _         | j                  j                          	 | j                   rYt        j                  rI| j
                  5  t        j                  dd       d d d        | j                   rt        j                  rIt        j                  d       y # 1 sw Y   =xY w# t        j                  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++("5"5%% 8MM#Q78 ++("5"5 $/8 8 $/s#   (B+ B#$B+ B($B+ +Cc                 N    | j                   sJ d| _         | j                          y NF)r   r-   r<   s    r   stopzDummyPOP3Server.stop   s    {{		r   c                 0    | j                  |      | _        y r!   )handlerr   )r   r   addrs      r   handle_acceptedzDummyPOP3Server.handle_accepted   s     $T 2r   c                 $    | j                          y r!   )closer<   s    r   handle_connectzDummyPOP3Server.handle_connect   s    

r   c                      y)Nr   r;   r<   s    r   writablezDummyPOP3Server.writable   s    r   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
3 Kr   r   c                      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y)TestPOP3Classc                 D    | j                  |j                  d             y )N   +OK)
assertTrue
startswithr   resps     r   assertOKzTestPOP3Class.assertOK  s    /0r   c                    t        t        t        f      | _        | j                  j	                          t        j                  | j                  j                  | j                  j                  t        j                        | _        y Nr   )r   HOSTPORTserverr   poplibPOP3r   r   test_supportLOOPBACK_TIMEOUTclientr<   s    r   setUpzTestPOP3Class.setUp  sT    %tTl3kk$++"2"2DKK4D4D*6*G*GIr   c                 z    | j                   j                          | j                  j                          d | _        y r!   )r   r   r   r   r<   s    r   tearDownzTestPOP3Class.tearDown  s)    r   c                 X    | j                  | j                  j                         d       y )Ns(   +OK dummy pop3 server ready. <timestamp>)assertEqualr   
getwelcomer<   s    r   test_getwelcomezTestPOP3Class.test_getwelcome  s#    //1D	Fr   c                 n    | j                  t        j                  | j                  j                  d       y )Nz	echo -err)assertRaisesr   error_protor   	_shortcmdr<   s    r   test_exceptionszTestPOP3Class.test_exceptions  s$    &,,dkk.C.C[Qr   c                     | j                  | j                  j                  d             | j                  t        j
                  | j                  j                  d       y )NrF   invalid)r   r   userr   r   r   r<   s    r   	test_userzTestPOP3Class.test_user  s?    dkk&&w/0&,,dkk.>.>	Jr   c                     | j                  | j                  j                  d             | j                  t        j
                  | j                  j                  d       y )NrI   r   )r   r   pass_r   r   r   r   r<   s    r   
test_pass_zTestPOP3Class.test_pass_  s?    dkk''12&,,dkk.>.>	Jr   c                 X    | j                  | j                  j                         d       y )N)
   d   )r   r   statr<   s    r   	test_statzTestPOP3Class.test_stat!  s    ))+Y7r   c                     | j                  | j                  j                         dd  g ddf       | j                  | j                  j                  d      j	                  d             y )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$  sY    ))+AB/B	 	((-66yABr   c                 l    dg ddf}| j                   j                  d      }| j                  ||       y )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*  s<    $8 	
 kku%h'r   c                     | j                  t        j                  | j                  j                  dt        j
                  dz   dz  z         y )Nzecho +%sr   a)r   r   r   r   r   _MAXLINEr<   s    r   test_too_long_linesz!TestPOP3Class.test_too_long_lines3  s;    &,,dkk.C.C$2)=(DE	Gr   c                 X    | j                  | j                  j                  d             y Nr  )r   r   deler<   s    r   	test_delezTestPOP3Class.test_dele7      dkk&&u-.r   c                 V    | j                  | j                  j                                y r!   )r   r   noopr<   s    r   	test_noopzTestPOP3Class.test_noop:  s    dkk&&()r   c                 X    | j                  | j                  j                  d             y r  )r   r   rpopr<   s    r   	test_rpopzTestPOP3Class.test_rpop=  r  r   md5T)opensslc                 Z    | j                  | j                  j                  dd             y )Nr  dummypassword)r   r   apopr<   s    r   test_apop_normalzTestPOP3Class.test_apop_normal@  s    dkk&&uo>?r   c                     dddz  z   }t        j                  | j                  d|      5  | j                  t        j
                  | j                  j                  dd       d d d        y # 1 sw Y   y xY w)Nr      <i@B welcomer  kb)r   	swap_attrr   r   r   r   r  )r   evil_welcomes     r   test_apop_REDOSzTestPOP3Class.test_apop_REDOSD  se     0##DKKLI 	Of00$++2B2BCN	O 	O 	Os   7A**A3c                 j    dg ddf}| j                  | j                  j                  dd      |       y )Nr   r  r  r*   )r   r   top)r   r  s     r   test_topzTestPOP3Class.test_topO  s7    %4 	
 	A.9r   c                 n    | j                   j                          | j                   j                  d       y r  )r   uidlr<   s    r   	test_uidlzTestPOP3Class.test_uidlW  s$    r   c                     d| j                   j                  _        | j                  t        j
                  | j                  j                         y r   )r   r   rr   r   r   r   r   utf8r<   s    r   test_utf8_raises_if_unsupportedz-TestPOP3Class.test_utf8_raises_if_unsupported[  s4    */'&,,dkk.>.>?r   c                     d| j                   j                  _        d}| j                  j	                         }| j                  ||       y )NTs   +OK I know RFC6856)r   r   rr   r   r*  r   )r   r  results      r   	test_utf8zTestPOP3Class.test_utf8_  s;    *.'(!!#*r   c                 z    | j                   j                         }| j                  d|j                         v        y )Nr   r   capar   keysr   r1  s     r   	test_capazTestPOP3Class.test_capae  s,    {{!(DIIK78r   c                     | j                   j                         }| j                  |       | j                  | j                   j                         | j                  | j                   j
                         y r!   )r   quitr   assertIsNonesockfiler   s     r   	test_quitzTestPOP3Class.test_quiti  sP    {{!$++**+$++**+r   c                 z    | j                   j                         }| j                  d|j                         v        y rb   r0  r3  s     r   test_stls_capazTestPOP3Class.test_stls_capao  s+    {{!$))+-.r   c                 `    d}| j                   j                         }| j                  ||       y )N   +OK Begin TLS negotiation)r   stlsr   )r   r  r   s      r   	test_stlszTestPOP3Class.test_stlst  s)    /{{!x(r   c                 ~   d}t        j                  t         j                        }|j                  t               | j                  |j                  t         j                         | j                  |j                  d       | j                  t         j                        5  | j                  j                  |      }d d d        t        j                  d| j                  j                   t"        j$                        | _        | j                  j                  |      }| j                  ||       y # 1 sw Y   wxY w)Nr>  Tr   	localhostr   )rx   ry   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_contextz  s    /nnS445!!&)#*;*;<++T2s334 	1;;##C#0D	1kk+t{{/?/?*6*G*GI{{,x(	1 	1s    D33D<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.  r4  r:  requires_sslr<  r@  rL  r;   r   r   r   r     s    1IFRKK8C(G/*/ (^''t<@ =@ (^''t<O =O: @+9, / / ) )
 ) )r   r   )SSLConnectionc                       e Zd Zd Zy)DummyPOP3_SSLHandlerc                     t         j                  j                  | |       | j                          | j	                  d       g | _        | j                  d       d| _        d| _        y )Nr   r   TF)	r	   r   r   secure_connectionr   r   r   r   r   r   s     r   r   zDummyPOP3_SSLHandler.__init__  sU    ((t4""$(DNII@A"DO %Dr   N)r   r   r   r   r;   r   r   rQ  rQ    s    	&r   rQ  c                   .    e Zd Zd Zd Zd Zd ZeZd Zy)TestPOP3_SSLClassc                    t        t        t        f      | _        t        | j                  _        | j                  j                          t        j                  | j                  j                  | j                  j                        | _        y r!   )r   r   r   r   rQ  r   r   r   r   r   r   r   r<   s    r   r   zTestPOP3_SSLClass.setUp  sT    %tTl32oodkk&6&68H8HIr   c                 D    | j                  dt        j                         y )Nr   )assertInr   __all__r<   s    r   test__all__zTestPOP3_SSLClass.test__all__  s    j&..1r   c                 x   t        j                  t         j                        }d|_        t         j                  |_        | j                  j                          t        j                  | j                  j                  | j                  j                  |      | _        | j                  | j                  j                  t         j                         | j!                  | j                  j                  j"                  |       | j%                  | j                  j'                         j)                  d             y )NFrB  r   )rx   ry   rD  rI  	CERT_NONErG  r   r6  r   r   r   r   r   assertIsInstancer8  	SSLSocketassertIsr   r   r  r   )r   rK  s     r   test_contextzTestPOP3_SSLClass.test_context  s    nnS445"--oodkk&6&68H8H035dkk..>dkk&&..4((*55f=>r   c                 l    | j                  t        j                  | j                  j                         y r!   r   r   r   r   r?  r<   s    r   r@  zTestPOP3_SSLClass.test_stls  "    &,,dkk.>.>?r   c                 z    | j                   j                         }| j                  d|j                         v        y rb   r   r1  assertFalser2  r3  s     r   r<  z TestPOP3_SSLClass.test_stls_capa  s-    {{!499;./r   N)	r   r   r   r   rZ  r`  r@  rL  r<  r;   r   r   rU  rU    s%    J2
?@ "0r   rU  c                   (    e Zd Zd Zd Zd ZeZd Zy)TestPOP3_TLSClassc                 F   t        t        t        f      | _        | j                  j	                          t        j                  | j                  j                  | j                  j                  t        j                        | _        | j                  j                          y r   )r   r   r   r   r   r   r   r   r   r   r   r   r?  r<   s    r   r   zTestPOP3_TLSClass.setUp  sd    %tTl3kk$++"2"2DKK4D4D*6*G*GIr   c                 :   | j                   j                  1| j                   j                  	 | j                   j                          | j                  j                          d | _        y # t        j
                  $ r | j                   j                          Y Qw xY wr!   )	r   r9  r8  r6  r   r   r   r   r   r<   s    r   r   zTestPOP3_TLSClass.tearDown  sx    ;;'DKK,<,<,H$  " 	 %% $ !!#	$s   A* *-BBc                 l    | j                  t        j                  | j                  j                         y r!   rb  r<   s    r   r@  zTestPOP3_TLSClass.test_stls  rc  r   c                 z    | j                   j                         }| j                  d|j                         v        y )Ns   STLSre  r3  s     r   r<  z TestPOP3_TLSClass.test_stls_capa  s-    {{!DIIK/0r   N)r   r   r   r   r   r@  rL  r<  r;   r   r   rh  rh    s    @ "1r   rh  c                   0    e Zd Zd Zd Zd Zd Zd Zd Zy)TestTimeoutsc                 $   t        j                         | _        t        j                  t        j                  t        j
                        | _        | j                  j                  d       t        j                  | j                        | _
        t        j                  | j                  | j                  | j                  f      | _        d| j                  _        | j                  j                          | j                  j!                          y )N<   )targetr   T)r   r   evtr~   r   r   r8  
settimeoutr   	bind_portr   r   r   threadr   r   r   r<   s    r   r   zTestTimeouts.setUp  s    ??$MM&..&2D2DE			R !++DII6	&&dkk499@UV!r   c                 F    | j                   j                          d | _         y r!   )ru  r-   r<   s    r   r   zTestTimeouts.tearDown  s    r   c                    |j                          |j                          	 |j                         \  }}|j                  d       |j	                          |j	                          y # t
        $ r Y w xY w# |j	                          w xY w)Ns   + Hola mundo
)r   r   acceptsendr   TimeoutError)r   rr  servr   r   s        r   r   zTestTimeouts.server  si    		JD$II'(JJL JJL  		 JJLs#   4A' '	A30A6 2A33A6 6Bc                    | j                  t        j                                t        j                  t        j
                         	 t        j                  t        | j                        }t        j                  d        | j                  |j                  j                         t        j
                         |j                          y # t        j                  d        w xY wr!   )r7  r~   getdefaulttimeoutsetdefaulttimeoutr   r   r   r   r   r   r   r8  
gettimeoutr   r   pops     r   testTimeoutDefaultzTestTimeouts.testTimeoutDefault  s    &2245  !>!>?	+++dDII.C$$T*,,.0M0MN		 $$T*s   $C
 
C!c                    | j                  t        j                                t        j                  d       	 t	        j
                  t        | j                  d       }t        j                  d        | j                  |j                  j                                |j                          y # t        j                  d        w xY w)N   r   )r7  r~   r}  r~  r   r   r   r   r8  r  r   r  s     r   testTimeoutNonezTestTimeouts.testTimeoutNone  s    &2245  $	+++dDIIt<C$$T*#((--/0		 $$T*s   &B/ /Cc                    t        j                  t        | j                  t        j
                        }| j                  |j                  j                         t        j
                         |j                          | j                  t              5  t        j                  t        | j                  d       d d d        y # 1 sw Y   y xY w)Nr   r   )r   r   r   r   r   r   r   r8  r  r   r   
ValueErrorr  s     r   testTimeoutValuezTestTimeouts.testTimeoutValue  s    kk$		<3P3PQ,,.0M0MN		z* 	4KKdii3	4 	4 	4s   'CCN)	r   r   r   r   r   r   r  r  r  r;   r   r   rn  rn    s     

4r   rn  c                  t    t        j                         } t        j                  t         j                  g|   y r!   )r   threading_setupunittestaddModuleCleanupthreading_cleanup)thread_infos    r   setUpModuler    s*    "224K.@@O;Or   __main__)1__doc__r   r~   osr   r   r  r   r   testr   r   test.supportr   r   r   r	   r
   requires_working_socketr   r   rf   r2   rx   pathr-   dirname__file__curdirr|   rF  rN  rN   rR   r   r   r   r   r   r   test.test_ftplibrO  rQ  rU  rh  rn  r  r   mainr;   r   r   <module>r     s   $
   	    ) ( ' & ) ! ! % $ $D 1
6:Lww||BGGOOH5BNSHWW\\"''//(3@ryy.QF,(;< 8			[(x** [(z0h))9+;+; 0fD)H D)N .	&}.> 	& 0 0 0D 1 1 1B648 64rP
 zHMMO r   