§
    Ètºfì2  ã                   óÀ  — d Z ddlZddlZddlZ	 ddlZn# e$ r dZY nw xY wddlmZ ddlm	Z	m
Z
 ddlmZmZ ddlmZmZ ddlmZmZmZmZmZmZmZmZmZmZmZ ddlmZ dd	lm Z  dd
l!m"Z"  ee	j#         $                    e
¦  «         d¦  «         G d„ de"¦  «        ¦   «         Z% ee	j#         $                    e
¦  «         d¦  «         G d„ de"¦  «        ¦   «         Z&dS )z
Whitebox tests for TCP APIs.
é    N)ÚskipIf)Ú
interfacesÚreactor)ÚgatherResultsÚmaybeDeferred)ÚProtocolÚServerFactory)Ú_ACCEPT_ERRORSÚEAGAINÚECONNABORTEDÚEINPROGRESSÚEMFILEÚENFILEÚENOBUFSÚENOMEMÚEPERMÚEWOULDBLOCKÚPort)Úlog)Úplatform)ÚTestCasez?This test only applies to reactors that implement IReactorFDsetc                   ót   — e Zd ZdZdZd„ Zd„ Zd„ Z e e	j
        ¦   «         dk    d¦  «        d„ ¦   «         Zd	S )
ÚPlatformAssumptionsTestsz4
    Test assumptions about platform behaviors.
    i    c                 ó  — g | _         t          �{ddlm} t	           |¦   «         ¦  «        dz   }t          j        t          j        ¦  «        | _        t          j        t          j        || j        d         f¦  «         |dz   | _	        d S d S )Nr   )Ú_listOpenFDsé   é   éd   )
ÚopenSocketsÚresourceÚtwisted.internet.processr   ÚlenÚ	getrlimitÚRLIMIT_NOFILEÚoriginalFileLimitÚ	setrlimitÚsocketLimit)Úselfr   ÚnewLimits      ú^/var/www/surfInsights/venv3-11/lib/python3.11/site-packages/twisted/test/test_tcp_internals.pyÚsetUpzPlatformAssumptionsTests.setUp4   s˜   € ØˆÔÝÐð >Ð=Ð=Ð=Ð=Ð=å˜<˜<™>œ>Ñ*Ô*¨QÑ.ˆHÝ%-Ô%7½Ô8NÑ%OÔ%OˆDÔ"ÝÔÝÔ&¨°4Ô3IÈ!Ô3LÐ(Mñô ð ð  (¨#™~ˆDÔÐÐð  Ðó    c                 óJ  — | j         r2| j                              ¦   «                              ¦   «          | j         °2t          �bt          j        t          j        ¦  «        d         }t          | j        d         |¦  «        }t          j        t          j        ||f¦  «         d S d S )Nr   r   )	r   ÚpopÚcloser    r#   r$   Úminr%   r&   )r(   ÚcurrentHardLimitÚnewSoftLimits      r*   ÚtearDownz!PlatformAssumptionsTests.tearDownF   sž   € ØÔð 	+ØÔ× Ò Ñ"Ô"×(Ò(Ñ*Ô*Ð*ð Ôð 	+åÐõ
  (Ô1µ(Ô2HÑIÔIÈ!ÔLÐÝ˜tÔ5°aÔ8Ð:JÑKÔKˆLÝÔ�xÔ5¸ÐFVÐ7WÑXÔXÐXÐXÐXð  Ðr,   c                 ó`   — t          j         ¦   «         }| j                             |¦  «         |S )z|
        Create and return a new socket object, also tracking it so it can be
        closed in the test tear down.
        )Úsocketr   Úappend)r(   Úss     r*   r5   zPlatformAssumptionsTests.socketR   s+   € õ
 ŒM‰OŒOˆØÔ×Ò Ñ"Ô"Ð"Øˆr,   Úwin32zhWindows requires an unacceptably large amount of resources to provoke this behavior in the naive manner.c                 óú  — |                       ¦   «         }|                     d¦  «         |                     ¦   «         d         }|                     d¦  «         |                       ¦   «         }|                     d¦  «         t          | j        ¦  «        D ]K}	 |                       ¦   «          Œ# t          $ r'}|j        d         t          t          fv rY d}~ n‚ d}~ww xY w|                      d¦  «         |                      |                     d|f¦  «        dt          f¦  «         |                      t           j        |j        ¦  «        }|                      |j        d         t          t          f¦  «         dS )	z˜
        Test that the platform accept(2) call fails with either L{EMFILE} or
        L{ENOBUFS} when there are too many file descriptors open.
        )ú	127.0.0.1r   r   é   Fr   Nz7Could provoke neither EMFILE nor ENOBUFS from platform.r:   )r5   ÚbindÚgetsocknameÚlistenÚsetblockingÚranger'   ÚOSErrorÚargsr   r   ÚfailÚassertInÚ
connect_exr   ÚassertRaisesÚerrorÚaccept)r(   ÚportÚserverPortNumberÚclientÚiÚeÚexcs          r*   Útest_acceptOutOfFilesz.PlatformAssumptionsTests.test_acceptOutOfFiles[   sq  € ð �{Š{‰}Œ}ˆØ�	Š	Ð"Ñ#Ô#Ð#Ø×+Ò+Ñ-Ô-¨aÔ0ÐØ�Š�A‰Œˆð —’‘”ˆØ×Ò˜5Ñ!Ô!Ð!õ �tÔ'Ñ(Ô(ð 	Qð 	QˆAðØ—’‘”��øÝð ð ð Ø”6˜!”9¥­Ð 1Ð1Ð1à�E�E�E�E�Eð øøøøðøøøð �IŠIÐOÑPÔPÐPð 	�ŠØ×Ò˜{Ð,<Ð=Ñ>Ô>ÀÅKÐ@Pñ	
ô 	
ð 	
ð
 ×Ò¥¤¨d¬kÑ:Ô:ˆØ�Š�c”h˜q”k¥F­GÐ#4Ñ5Ô5Ð5Ð5Ð5s   ÂB.Â.
CÂ8CÃCÃCN)Ú__name__Ú
__module__Ú__qualname__Ú__doc__r'   r+   r3   r5   r   r   ÚgetTyperO   © r,   r*   r   r   )   s—   € € € € € ð
ð ð €Kð.ð .ð .ð$
Yð 
Yð 
Yðð ð ð €VØˆÔÑÔ˜gÒ%ð	5ñô ð
%6ð %6ñô ð
%6ð %6ð %6r,   r   c                   óˆ  — e Zd ZdZd„ Zd„ Zd„ Zd„ Zd„ Zd„ Z	d„ Z
 e ej        ¦   «         d	k    d
¦  «        d„ ¦   «         Z e ej        ¦   «         d	k    d¦  «        d„ ¦   «         Z eej                             d¦  «        dk    d¦  «        d„ ¦   «         Z e ej        ¦   «         d	k    d¦  «        d„ ¦   «         Zd„ ZdS )ÚSelectReactorTestsz7
    Tests for select-specific failure conditions.
    c                 ó^   — g | _         g | _        t          j        | j        j        ¦  «         d S ©N)ÚportsÚmessagesr   ÚaddObserverr6   ©r(   s    r*   r+   zSelectReactorTests.setUp‘   s+   € ØˆŒ
ØˆŒÝŒ˜œÔ,Ñ-Ô-Ð-Ð-Ð-r,   c                 óz   — t          j        | j        j        ¦  «         t	          d„ | j        D ¦   «         ¦  «        S )Nc                 ó6   — g | ]}t          |j        ¦  «        ‘ŒS rU   )r   ÚstopListening)Ú.0Úps     r*   ú
<listcomp>z/SelectReactorTests.tearDown.<locals>.<listcomp>˜   s"   € ÐQÐQÐQÀ�m¨A¬OÑ<Ô<ÐQÐQÐQr,   )r   ÚremoveObserverr[   r6   r   rZ   r]   s    r*   r3   zSelectReactorTests.tearDown–   s7   € ÝÔ˜4œ=Ô/Ñ0Ô0Ð0ÝÐQÐQÀdÄjÐQÑQÔQÑRÔRÐRr,   c                 ó†   — t          |||¬¦  «        }|                     ¦   «          | j                             |¦  «         |S )z
        Create, start, and return a new L{Port}, also tracking it so it can
        be stopped in the test tear down.
        ©Ú	interface)r   ÚstartListeningrZ   r6   )r(   Ú
portNumberÚfactoryrg   rb   s        r*   rI   zSelectReactorTests.portš   sE   € õ
 �˜W°	Ð:Ñ:Ô:ˆØ	×ÒÑÔÐØŒ
×Ò˜!ÑÔÐØˆr,   c                 ó„  ‡‡‡—  G ˆfd„d¦  «        }t          ¦   «         }|                      d|d¬¦  «        }|                      |d |¦   «         ¦  «         |                     ¦   «          dŠt          j        ‰         Šˆˆfd„| j        D ¦   «         }|                      t          |¦  «        dd	| j        ›�¦  «         d
S )a¢  
        Test behavior in the face of an exception from C{accept(2)}.

        On any exception which indicates the platform is unable or unwilling
        to allocate further resources to us, the existing port should remain
        listening, a message should be logged, and the exception should not
        propagate outward from doRead.

        @param socketErrorNumber: The errno to simulate from accept.
        c                   ó   •— e Zd ZdZˆ fd„ZdS )ú9SelectReactorTests._acceptFailureTest.<locals>.FakeSocketzI
            Pretend to be a socket in an overloaded system.
            c                 óH   •— t          ‰t          j        ‰¦  «        ¦  «        ‚rY   )rA   ÚosÚstrerror)r(   ÚsocketErrorNumbers    €r*   rH   z@SelectReactorTests._acceptFailureTest.<locals>.FakeSocket.acceptµ   s   ø€ ÝÐ/µ´Ð=NÑ1OÔ1OÑPÔPÐPr,   N©rP   rQ   rR   rS   rH   )rq   s   €r*   Ú
FakeSocketrm   °   s?   ø€ € € € € ðð ðQð Qð Qð Qð Qð Qð Qr,   rs   r   r:   rf   r5   z/Could not accept new connection ({acceptError})c                 ót   •— g | ]4}|                      d ¦  «        ‰k    o|                      d¦  «        ‰k    ‘Œ5S )Ú
log_formatÚacceptError)Úget)ra   ÚmsgÚexpectedErrorCodeÚexpectedFormats     €€r*   rc   z9SelectReactorTests._acceptFailureTest.<locals>.<listcomp>À   sW   ø€ ð 
ð 
ð 
ð
 ð —’˜Ñ%Ô%¨Ò7ð @Ø—G’G˜MÑ*Ô*Ð.?Ò?ð
ð 
ð 
r,   z)Log event for failed accept not found in N)	r	   rI   ÚpatchÚdoReadÚerrnoÚ	errorcoder[   ÚassertGreaterr"   )r(   rq   rs   rj   rI   ÚmatchingMessagesry   rz   s    `    @@r*   Ú_acceptFailureTestz%SelectReactorTests._acceptFailureTest¤   s  øøø€ ð	Qð 	Qð 	Qð 	Qð 	Qð 	Qð 	Qñ 	Qô 	Qð 	Qõ  ‘/”/ˆØ�yŠy˜˜G¨{ˆyÑ;Ô;ˆØ�
Š
�4˜ : :¡<¤<Ñ0Ô0Ð0à�Š‰ŒˆàJˆÝ!œOÐ,=Ô>Ðð
ð 
ð 
ð 
ð 
ð
 ”}ð
ñ 
ô 
Ðð 	×ÒÝÐ Ñ!Ô!ØˆAØ@DÄÀÐOñ	
ô 	
ð 	
ð 	
ð 	
r,   c                 ó6   — |                       t          ¦  «        S )a*  
        C{accept(2)} can fail with C{EMFILE} when there are too many open file
        descriptors in the process.  Test that this doesn't negatively impact
        any other existing connections.

        C{EMFILE} mainly occurs on Linux when the open file rlimit is
        encountered.
        )r�   r   r]   s    r*   Útest_tooManyFilesFromAcceptz.SelectReactorTests.test_tooManyFilesFromAcceptÍ   ó   € ð ×&Ò&¥vÑ.Ô.Ð.r,   c                 ó6   — |                       t          ¦  «        S )zö
        Similar to L{test_tooManyFilesFromAccept}, but test the case where
        C{accept(2)} fails with C{ENOBUFS}.

        This mainly occurs on Windows and FreeBSD, but may be possible on
        Linux and other platforms as well.
        )r�   r   r]   s    r*   Útest_noBufferSpaceFromAcceptz/SelectReactorTests.test_noBufferSpaceFromAcceptØ   s   € ð ×&Ò&¥wÑ/Ô/Ð/r,   c                 ó6   — |                       t          ¦  «        S )zù
        Similar to L{test_tooManyFilesFromAccept}, but test the case where
        C{accept(2)} fails with C{ECONNABORTED}.

        It is not clear whether this is actually possible for TCP
        connections on modern versions of Linux.
        )r�   r   r]   s    r*   Ú test_connectionAbortedFromAcceptz3SelectReactorTests.test_connectionAbortedFromAcceptâ   s   € ð ×&Ò&¥|Ñ4Ô4Ð4r,   r8   z(Windows accept(2) cannot generate ENFILEc                 ó6   — |                       t          ¦  «        S )zà
        Similar to L{test_tooManyFilesFromAccept}, but test the case where
        C{accept(2)} fails with C{ENFILE}.

        This can occur on Linux when the system has exhausted (!) its supply
        of inodes.
        )r�   r   r]   s    r*   Útest_noFilesFromAcceptz)SelectReactorTests.test_noFilesFromAcceptì   r„   r,   z(Windows accept(2) cannot generate ENOMEMc                 ó6   — |                       t          ¦  «        S )a³  
        Similar to L{test_tooManyFilesFromAccept}, but test the case where
        C{accept(2)} fails with C{ENOMEM}.

        On Linux at least, this can sensibly occur, even in a Python program
        (which eats memory like no ones business), when memory has become
        fragmented or low memory has been filled (d_alloc calls
        kmem_cache_alloc calls kmalloc - kmalloc only allocates out of low
        memory).
        )r�   r   r]   s    r*   Útest_noMemoryFromAcceptz*SelectReactorTests.test_noMemoryFromAccept÷   s   € ð ×&Ò&¥vÑ.Ô.Ð.r,   ÚINFRASTRUCTUREÚAZUREPIPELINESz(Hangs on Azure Pipelines due to firewallc                 ó€  ‡‡— t          ¦   «         }t          |_        |                      d|d¬¦  «        Š|                      ‰j        ¦  «         g Šˆfd„}|                      |¦  «         ˆfd„}‰                      |¦   «         ¦  «         d‰_        ‰                     ¦   «          |  	                    ‰j        d¦  «         ‰                      |¦   «         ¦  «         ‰                     ¦   «          |  
                    ‰j        d¦  «         ‰                     ¦   «          |  
                    ‰j        d¦  «         dS )zð
        L{tcp.Port.doRead} increases the number of consecutive
        C{accept} calls it performs if all of the previous C{accept}
        calls succeed; otherwise, it reduces the number to the amount
        of successful calls.
        r   r:   rf   c                  ó:   •— ‰D ]} |                       ¦   «          Œd S rY   )r/   )rK   Úclientss    €r*   ÚcloseAllz7SelectReactorTests.test_acceptScaling.<locals>.closeAll  s+   ø€ Ø!ð ð �Ø—’‘”��ðð r,   c                  ó¶   •— t          j         t           j        t           j        ¦  «        } |                      d‰                     ¦   «         j        f¦  «         | S )Nr:   )r5   ÚAF_INETÚSOCK_STREAMÚconnectÚgetHostrI   )rK   rI   s    €r*   r–   z6SelectReactorTests.test_acceptScaling.<locals>.connect  s@   ø€ Ý”]¥6¤>µ6Ô3EÑFÔFˆFØ�NŠN˜K¨¯ª©¬Ô)<Ð=Ñ>Ô>Ð>ØˆMr,   r   N)r	   r   ÚprotocolrI   Ú
addCleanupr`   r6   ÚnumberAcceptsr|   r   ÚassertEqual)r(   rj   r’   r–   r‘   rI   s       @@r*   Útest_acceptScalingz%SelectReactorTests.test_acceptScaling  sD  øø€ õ  ‘/”/ˆÝ#ˆÔØ�yŠy˜˜G¨{ˆyÑ;Ô;ˆØ�Š˜Ô*Ñ+Ô+Ð+àˆð	ð 	ð 	ð 	ð 	ð 	�Š˜Ñ!Ô!Ð!ð	ð 	ð 	ð 	ð 	ð
 	�Š�w�w‘y”yÑ!Ô!Ð!ØˆÔØ�Š‰ŒˆØ×Ò˜4Ô-¨qÑ1Ô1Ð1à�Š�w�w‘y”yÑ!Ô!Ð!Ø�Š‰Œˆð 	×Ò˜Ô+¨QÑ/Ô/Ð/à�Š‰Œˆð 	×Ò˜Ô+¨QÑ/Ô/Ð/Ð/Ð/r,   z'Windows accept(2) cannot generate EPERMc                 ó  ‡ ‡‡— dŠdgŠ G ˆˆˆ fd„d¦  «        }t          ‰¦  «        D ]/}‰                      t          j         |¦   «         j        ¦  «         Œ0‰                      ‰ j         |¦   «         j        ¦  «         dgŠt          ¦   «         }‰                      d|d¬¦  «        }d|_        ‰  	                    |d |¦   «         ¦  «         | 
                    ¦   «          ‰                      |j        d¦  «         d	S )
z»
        C{accept(2)} returning C{EPERM} is treated as a transient
        failure and the call retried no more than the maximum number
        of consecutive C{accept(2)} calls.
        é{   r   c                   ó"   •— e Zd ZdZˆ ˆˆfd„ZdS )úLSelectReactorTests.test_permissionFailure.<locals>.FakeSocketWithAcceptLimitú«
            Pretend to be a socket in an overloaded system whose
            C{accept} method can only be called
            C{maximumNumberOfAccepts} times.
            c                 ó¾   •— ‰dxx         dz  cc<   ‰d         ‰k    r‰                      d¦  «         t          t          t          j        t          ¦  «        ¦  «        ‚)Nr   r   z(Maximum number of accept calls exceeded.)rC   rA   r   ro   rp   )ÚoselfÚacceptCallsÚmaximumNumberOfAcceptsr(   s    €€€r*   rH   zSSelectReactorTests.test_permissionFailure.<locals>.FakeSocketWithAcceptLimit.acceptC  sV   ø€ Ø˜A��” !Ñ#��‘Ø˜q”>Ð$:Ò:Ð:Ø—I’IÐHÑIÔIÐIÝ�e¥R¤[µÑ%7Ô%7Ñ8Ô8Ð8r,   Nrr   )r¤   r¥   r(   s   €€€r*   ÚFakeSocketWithAcceptLimitr    <  sB   ø€ € € € € ðð ð9ð 9ð 9ð 9ð 9ð 9ð 9ð 9ð 9r,   r¦   r:   rf   r5   r   N)r@   rF   r5   rG   rH   ÚfailureExceptionr	   rI   rš   r{   r|   ÚassertEquals)r(   r¦   Ú_rj   rI   r¤   r¥   s   `    @@r*   Útest_permissionFailurez)SelectReactorTests.test_permissionFailure2  s9  øøø€ ð "%ÐØ�cˆð	9ð 	9ð 	9ð 	9ð 	9ð 	9ð 	9ð 	9ð 	9ñ 	9ô 	9ð 	9õ Ð-Ñ.Ô.ð 	Pð 	PˆAØ×Ò�fœlÐ,EÐ,EÑ,GÔ,GÔ,NÑOÔOÐOÐOà×Ò˜$Ô/Ð1JÐ1JÑ1LÔ1LÔ1SÑTÔTÐTà�cˆå‘/”/ˆØ�yŠy˜˜G¨{ˆyÑ;Ô;ˆØ ˆÔØ�
Š
�4˜Ð#<Ð#<Ñ#>Ô#>Ñ?Ô?Ð?ð 	�Š‰Œˆð 	×Ò˜$Ô,¨aÑ0Ô0Ð0Ð0Ð0r,   c                 ób  ‡— t          t          ¦  «        }|                     t          t          t
          g¦  «         t          d„ |D ¦   «         ¦  «        dz   Š G ˆfd„d¦  «        }t          ¦   «         }|                      d|d¬¦  «        }|  	                    |d |¦   «         ¦  «         | 
                    ¦   «          |                      t          j        ¦  «        }|                      dt          |¦  «        ¦  «         |                      |d         j        j        d         ‰¦  «         d	S )
z}
        A C{socket.error} raised by C{accept(2)} whose C{errno} is
        unknown to the recovery logic is logged.
        c              3   óD   K  — | ]}t          |t          ¦  «        ¯|V — Œd S rY   )Ú
isinstanceÚint)ra   rG   s     r*   ú	<genexpr>zBSelectReactorTests.test_unknownSocketErrorRaise.<locals>.<genexpr>g  s1   è è € ÐIÐI˜%µ*¸UÅCÑ2HÔ2HÐI�ÐIÐIÐIÐIÐIÐIr,   r   c                   ó   •— e Zd ZdZˆ fd„ZdS )úYSelectReactorTests.test_unknownSocketErrorRaise.<locals>.FakeSocketWithUnknownAcceptErrorr¡   c                 ó$   •— t          ‰d¦  «        ‚)Nzunknown socket error message)rA   )r£   ÚunknownAcceptErrors    €r*   rH   z`SelectReactorTests.test_unknownSocketErrorRaise.<locals>.FakeSocketWithUnknownAcceptError.acceptq  s   ø€ ÝÐ0Ð2PÑQÔQÐQr,   Nrr   )r³   s   €r*   Ú FakeSocketWithUnknownAcceptErrorr±   j  s?   ø€ € € € € ðð ðRð Rð Rð Rð Rð Rð Rr,   r´   r   r:   rf   r5   N)Úlistr
   Úextendr   r   r   Úmaxr	   rI   r{   r|   ÚflushLoggedErrorsr5   rG   r›   r"   ÚvaluerB   )r(   ÚknownErrorsr´   rj   rI   Úfailuresr³   s         @r*   Útest_unknownSocketErrorRaisez/SelectReactorTests.test_unknownSocketErrorRaise^  s;  ø€ õ
 �>Ñ*Ô*ˆØ×Ò�F¥E­;Ð7Ñ8Ô8Ð8õ ÐIÐI ;ÐIÑIÔIÑIÔIÈAÑMð 	ð	Rð 	Rð 	Rð 	Rð 	Rð 	Rð 	Rñ 	Rô 	Rð 	Rõ  ‘/”/ˆØ�yŠy˜˜G¨{ˆyÑ;Ô;ˆØ�
Š
�4˜Ð#CÐ#CÑ#EÔ#EÑFÔFÐFà�Š‰Œˆà×)Ò)­&¬,Ñ7Ô7ˆØ×Ò˜�C ™MœMÑ*Ô*Ð*Ø×Ò˜ !œÔ*Ô/°Ô2Ð4FÑGÔGÐGÐGÐGr,   N)rP   rQ   rR   rS   r+   r3   rI   r�   rƒ   r†   rˆ   r   r   rT   rŠ   rŒ   ro   Úenvironrw   rœ   rª   r¼   rU   r,   r*   rW   rW   ˆ   s—  € € € € € ð
ð ð.ð .ð .ð
Sð Sð Sðð ð ð'
ð '
ð '
ðR	/ð 	/ð 	/ð0ð 0ð 0ð5ð 5ð 5ð €VÐˆHÔÑÔ 'Ò)Ð+UÑVÔVð/ð /ñ WÔVð/ð €VÐˆHÔÑÔ 'Ò)Ð+UÑVÔVð/ð /ñ WÔVð/ð €VØ
Œ
�ŠÐ'Ñ(Ô(Ð,<Ò<Ø2ñô ð'0ð '0ñ	ô ð'0ðR €VÐˆHÔÑÔ 'Ò)Ð+TÑUÔUð)1ð )1ñ VÔUð)1ðVHð Hð Hð Hð Hr,   rW   )'rS   r}   ro   r5   r    ÚImportErrorÚunittestr   Útwisted.internetr   r   Útwisted.internet.deferr   r   Útwisted.internet.protocolr   r	   Útwisted.internet.tcpr
   r   r   r   r   r   r   r   r   r   r   Útwisted.pythonr   Útwisted.python.runtimer   Útwisted.trial.unittestr   ÚIReactorFDSetÚ
providedByr   rW   rU   r,   r*   ú<module>rÉ      s[  ððð ð
 €€€Ø 	€	€	€	Ø €€€ðØ€O€O€O€OøØð ð ð Ø€H€H€Hðøøøð Ð Ð Ð Ð Ð à 0Ð 0Ð 0Ð 0Ð 0Ð 0Ð 0Ð 0Ø ?Ð ?Ð ?Ð ?Ð ?Ð ?Ð ?Ð ?Ø =Ð =Ð =Ð =Ð =Ð =Ð =Ð =ðð ð ð ð ð ð ð ð ð ð ð ð ð ð ð ð ð ð ð ð ð ð ð ð ð ð Ð Ð Ð Ð Ð Ø +Ð +Ð +Ð +Ð +Ð +Ø +Ð +Ð +Ð +Ð +Ð +ð €ØÔ ×+Ò+¨GÑ4Ô4Ð4ØEñô ðX6ð X6ð X6ð X6ð X6˜xñ X6ô X6ñ	ô ðX6ðv €ØÔ ×+Ò+¨GÑ4Ô4Ð4ØEñô ðpHð pHð pHð pHð pH˜ñ pHô pHñ	ô ðpHð pHð pHs   � •ž