Ë
    ojÛ! ã                  óÊ  — d Z ddlm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
 ddlmZ ddlmZ ddlmZmZ ddlmZ dd	lmZ dd
lmZmZ ddlmZ ddlmZmZmZ ddlm Z  ddl!m"Z"m#Z# ddl$m%Z%m&Z&m'Z'm(Z( ddl)m*Z* ddl+m,Z, ddl-m.Z.m/Z/ ddl0m1Z1 ddl2m3Z3 ddl4m5Z5m6Z6m7Z7 ddl8m9Z9 ddl:m;Z;m<Z<m=Z= ddl>m?Z?m@Z@mAZA ddlBmCZCmDZD 	 ddlEmFZFmGZG d„ ZI G d„ deD«      ZJ G d„ d«      ZK G d „ d!eC«      ZL G d"„ d#eC«      ZM G d$„ d%eD«      ZN ee1jž                  e1j                   e1j¢                  «       G d&„ d'«      «       ZR ee1jž                  e1j                   «       G d(„ d)«      «       ZS G d*„ d+e1j¨                  «      ZU G d,„ d-eUe1j¬                  «      ZW G d.„ d/e1j°                  «      ZY G d0„ d1e1j´                  «      Z[ G d2„ d3«      Z\ G d4„ d5e\eD«      Z] G d6„ d7eC«      Z^ G d8„ d9e\eD«      Z_ ee"«       G d:„ d;«      «       Z` G d<„ d=«      Za G d>„ d?e\eD«      Zb G d@„ dAeD«      Zc G dB„ dCe\eD«      Zd G dD„ dEeD«      Ze G dF„ dGe1j´                  «      Zf G dH„ dIe\eD«      Zg G dJ„ dK«      Zh G dL„ dMeh«      Zi G dN„ dOeieC«      Zj G dP„ dQeieC«      Zk G dR„ dSeheC«      Zl G dT„ dUeheC«      Zm G dV„ dWeheC«      Zn G dX„ dYeheD«      Zo G dZ„ d[eheC«      Zp G d\„ d]eheC«      Zq G d^„ d_e1j°                  «      Zr ee1jæ                  «       G d`„ dae=jè                  «      «       Zu G db„ dceDe\«      Zv G dd„ deeD«      Zw G df„ dgeDe\«      Zx G dh„ die\eD«      Zy ee1jô                  «       G dj„ dkeDe\«      «       Z{ G dl„ dm«      Z| ee1jú                  «       G dn„ do«      «       Z~ ee1jþ                  «       G dp„ dq«      «       Z€ G dr„ dseD«      Z� eeF dt«       e e'�j                  e(d«       du«       G dv„ dwe\eD«      «       «       Zƒ G dx„ dyeR«      Z„ G dz„ d{e\eD«      Z… G d|„ d}eD«      Z† G d~„ d«      Z‡ G d€„ d�eD«      Zˆ G d‚„ dƒeD«      Z‰ G d„„ d…«      ZŠ G d†„ d‡eŠeC«      Z‹ G dˆ„ d‰eŠeD«      ZŒ G dŠ„ d‹eC«      Z�y# eH$ r dZFdZGY �Œ“w xY w)Œz"
Test case for twisted.mail.imap4
é    )ÚannotationsN)ÚOrderedDict©ÚBytesIO)Úchain)ÚOptionalÚType)ÚskipIf)Úimplementer)ÚverifyClassÚverifyObject)Ú'InMemoryUsernamePasswordDatabaseDontUse)ÚCramMD5CredentialsÚIUsernameHashedPasswordÚIUsernamePassword©ÚUnauthorizedLogin)ÚIRealmÚPortal)ÚdeferÚerrorÚ
interfacesÚreactor)ÚDeferred)ÚClock)ÚStringTransportÚ StringTransportWithDisconnection)Úimap4)Ú
MessageSet)ÚIChallengeResponseÚIClientAuthenticationÚICloseableMailboxIMAP)Úloopback)ÚfailureÚlogÚutil)Ú	iterbytesÚnativeStringÚnetworkString)ÚSynchronousTestCaseÚTestCase)ÚClientTLSContextÚServerTLSContextc                ó   — | fd„S )Nc                ó   —  |«       S ©N© )ÚresultÚfs     ú=/usr/lib/python3/dist-packages/twisted/mail/test/test_imap.pyú<lambda>zstrip.<locals>.<lambda>:   s   € ™q›s€ ó    r1   )r3   s    r4   Ústripr7   9   s   € ØÒ"Ð"r6   c                  ód   — e Zd Zddgddgddgddgd	d
ggZd„ Zd„ Zd„ Zd„ Zd„ Zd„ Z	d„ Z
d„ Zd„ Zy)ÚIMAP4UTF7TestsúHello worldó   Hello worldzHello & worlds   Hello &- worldõ   HelloÃ¿worldó   Hello&AP8-worldu   Ã¿Ã¾Ã½Ã¼s   &AP8A,gD9APw-u   ~peter/mail/æ—¥æœ¬èªž/å�°åŒ—s   ~peter/mail/&ZeVnLIqe-/&U,BTFw-c                ój   — d}| j                  |j                  dd«      |j                  d«      «       y)z²
        Specifying an error policy to C{unicode.encode} with the
        I{imap4-utf-7} codec should produce the same result as not
        specifying the error policy.
        r:   úimap4-utf-7ÚstrictN©ÚassertEqualÚencode©ÚselfÚtexts     r4   Útest_encodeWithErrorsz$IMAP4UTF7Tests.test_encodeWithErrorsI   s0   € ð ˆØ×ÑØ�K‰K˜ xÓ0°$·+±+¸mÓ2Lõ	
r6   c                ój   — d}| j                  |j                  dd«      |j                  d«      «       y)zO
        Similar to L{test_encodeWithErrors}, but for C{bytes.decode}.
        r;   r?   r@   N©rB   Údecode©rE   Úbytess     r4   Útest_decodeWithErrorsz$IMAP4UTF7Tests.test_decodeWithErrorsT   s0   € ð ˆØ×ÑØ�L‰L˜¨Ó1°5·<±<ÀÓ3Nõ	
r6   c                óJ   — d}| j                  |j                  d«      d«       y)z�
        Unicode strings that contain an ampersand (C{&}) can be
        encoded to bytes with the I{imap4-utf-7} codec.
        u
   &Hello&Â½&r?   s   &-Hello&-&AL0-&-NrA   rD   s     r4   Útest_encodeAmpersandz#IMAP4UTF7Tests.test_encodeAmpersand]   s&   € ð
 6ˆØ×ÑØ�K‰K˜Ó&Øõ	
r6   c                óF   — | j                  dj                  d«      d«       y)zŠ
        An I{imap4-utf-7} encoded string that does not shift back to
        ASCII (i.e., it lacks a final C{-}) can be decoded.
        s   &AL0r?   õ   Â½NrI   ©rE   s    r4   Ú!test_decodeWithoutFinalASCIIShiftz0IMAP4UTF7Tests.test_decodeWithoutFinalASCIIShifth   s!   € ð
 	×ÑØ�N‰N˜=Ó)Ø*õ	
r6   c                óŒ   —  t        j                  d«      t        d«      «      }| j                  |j	                  «       d«       y)zl
        C{codecs.getreader('imap4-utf-7')} returns the I{imap4-utf-7} stream
        reader class.
        r?   r=   r<   N)ÚcodecsÚ	getreaderr   rB   Úread)rE   Úreaders     r4   Útest_getreaderzIMAP4UTF7Tests.test_getreaderr   s8   € ð
 1”×!Ñ! -Ó0´Ð9KÓ1LÓMˆØ×Ñ˜Ÿ™›Ð(8Õ9r6   c                ó°   — t        «       } t        j                  d«      |«      }|j                  d«       | j	                  |j                  «       d«       y)zl
        C{codecs.getwriter('imap4-utf-7')} returns the I{imap4-utf-7} stream
        writer class.
        r?   r<   r=   N)r   rU   Ú	getwriterÚwriterB   Úgetvalue)rE   ÚoutputÚwriters      r4   Útest_getwriterzIMAP4UTF7Tests.test_getwriterz   sG   € ô
 “ˆØ0”×!Ñ! -Ó0°Ó8ˆØ�‰Ð%Ô&Ø×Ñ˜Ÿ™Ó*Ð,>Õ?r6   c                ón   — | j                   D ]&  \  }}| j                  |j                  d«      |«       Œ( y)zœ
        The I{imap4-utf-7} can be used to encode a unicode string into a byte
        string according to the IMAP4 modified UTF-7 encoding rules.
        r?   N)ÚtestsrB   rC   ©rE   Úinputr^   s      r4   Útest_encodezIMAP4UTF7Tests.test_encode„   s6   € ð
 "ŸZ™Zò 	B‰MˆE�6Ø×Ñ˜UŸ\™\¨-Ó8¸&ÕAñ	Br6   c                ón   — | j                   D ]&  \  }}| j                  ||j                  d«      «       Œ( y)zœ
        The I{imap4-utf-7} can be used to decode a byte string into a unicode
        string according to the IMAP4 modified UTF-7 encoding rules.
        r?   N)rb   rB   rJ   rc   s      r4   Útest_decodezIMAP4UTF7Tests.test_decodeŒ   s6   € ð
 "ŸZ™Zò 	B‰MˆE�6Ø×Ñ˜U F§M¡M°-Ó$@ÕAñ	Br6   c                ó¬  — t        t        dd«      t        dd«      «      D ]o  }t        |«      j                  «       }| j	                  |t        |«      j                  d«      «       | j	                  t        |«      |j                  d«      «       Œq | j	                  dj                  d«      d«       | j	                  dj                  d«      d«       y)	z™
        The IMAP4 modified UTF-7 implementation encodes all printable
        characters which are in ASCII using the corresponding ASCII byte.
        é    é&   é'   é   r?   ú&s   &-N)r   ÚrangeÚchrrC   rB   rJ   )rE   ÚoÚcharbytes      r4   Útest_printableSingletonsz'IMAP4UTF7Tests.test_printableSingletons”   s§   € ô ”u˜T 4Ó(¬%°°dÓ*;Ó<ò 	EˆAÜ˜1“v—}‘}“ˆHØ×Ñ˜X¤s¨1£v§}¡}°]Ó'CÔDØ×ÑœS ›V X§_¡_°]Ó%CÕDð	Eð 	×Ñ˜Ÿ™ MÓ2°EÔ:Ø×Ñ˜Ÿ™ mÓ4°cÕ:r6   N)Ú__name__Ú
__module__Ú__qualname__rb   rG   rM   rO   rS   rY   r`   re   rg   rr   r1   r6   r4   r9   r9   =   sg   „ à	˜Ð'Ø	Ð+Ð,Ø	Ð-Ð.Ø	Ð-Ð.à9Ø.ð	
ð	€Eò	
ò
ò	
ò
ò:ò@òBòBó;r6   r9   c                  ó$   — e Zd Zd„ Zd„ Zd„ Zd„ Zy)ÚBufferingConsumerc                ó   — g | _         y r0   )ÚbufferrR   s    r4   Ú__init__zBufferingConsumer.__init__£   s	   € Øˆ�r6   c                óˆ   — | j                   j                  |«       | j                  r| j                  j                  «        y y r0   )ry   ÚappendÚconsumerÚresumeProducingrK   s     r4   r\   zBufferingConsumer.write¦   s0   € Ø�‰×Ñ˜5Ô!Ø�=Š=Ø�M‰M×)Ñ)Õ+ð r6   c                óF   — || _         | j                   j                  «        y r0   )r}   r~   )rE   r}   Ú	streamings      r4   ÚregisterProducerz"BufferingConsumer.registerProducer«   s   € Ø ˆŒØ�‰×%Ñ%Õ'r6   c                ó   — d | _         y r0   )r}   rR   s    r4   ÚunregisterProducerz$BufferingConsumer.unregisterProducer¯   s	   € Øˆ�r6   N)rs   rt   ru   rz   r\   r�   rƒ   r1   r6   r4   rw   rw   ¢   s   „ òò,ò
(ór6   rw   c                  ó*   — e Zd Zd„ Zd„ Zd„ Zd„ Zd„ Zy)ÚMessageProducerTestsc                óü   ‡ ‡‡‡— dŠt        «       }d|d<   d|d<   d|d<   d|d	<   t        |d
d ‰dd «      }t        «       Št        j                  |«      Š‰j                  ‰«      }ˆˆˆˆ fd„}|j                  |«      S )Ns   This is body text.  Rar.úsender@hostÚfromúrecipient@domainÚtoúbooga booga booÚsubjectú
text/plainúcontent-typer1   é{   c                ó†   •— ‰j                  | ‰«       ‰j                  dj                  ‰j                  «      d‰z   «       y )Nr6   sf   {119}
From: sender@host
To: recipient@domain
Subject: booga booga boo
Content-Type: text/plain

)ÚassertIdenticalrB   Újoinry   )r2   ÚbodyÚcÚprE   s    €€€€r4   Ú
cbProducedz7MessageProducerTests.testSinglePart.<locals>.cbProducedÂ   s@   ø€ Ø× Ñ  ¨Ô+Ø×ÑØ—‘˜Ÿ™Ó"ðð
 ñõr6   ©r   ÚFakeyMessagerw   r   ÚMessageProducerÚbeginProducingÚaddCallback)rE   ÚheadersÚmsgÚdr–   r“   r”   r•   s   `    @@@r4   ÚtestSinglePartz#MessageProducerTests.testSinglePart´   s‡   û€ Ø*ˆÜ“-ˆØ'ˆ�‰Ø*ˆ�‰Ø.ˆ�	ÑØ".ˆ�Ñä˜7 B¨¨d°C¸Ó>ˆäÓˆÜ×!Ñ! #Ó&ˆØ×Ñ˜QÓˆ÷
	ð �}‰}˜ZÓ(Ð(r6   c                óF  ‡ ‡‡‡	— d}dŠt        «       }d|d<   d|d<   d|d<   d	|d
<   t        «       }d|d<   d|d
<   t        |dd |dt        |dd ‰d d «      g«      }t        «       Št        j                  |«      Š	‰	j                  ‰«      }ˆˆˆ	ˆ fd„}|j                  |«      S )Nr6   ó&   Contained body message text.  Squarge.r‡   rˆ   r‰   rŠ   r‹   rŒ   ú%multipart/alternative; boundary="xyz"rŽ   úthis is subject textr�   r1   r�   c                óŒ   •— ‰j                  | ‰«       ‰j                  dj                  ‰j                  «      d‰z   dz   «       y )Nr6   sÅ   {239}
From: sender@host
To: recipient@domain
Subject: booga booga boo
Content-Type: multipart/alternative; boundary="xyz"


--xyz
Subject: this is subject text
Content-Type: text/plain

ó   
--xyz--
©ÚfailUnlessIdenticalrB   r’   ry   ©r2   r”   Ú	innerBodyr•   rE   s    €€€€r4   r–   z<MessageProducerTests.testSingleMultiPart.<locals>.cbProducedé   sJ   ø€ Ø×$Ñ$ V¨QÔ/à×ÑØ—‘˜Ÿ™Ó"ð
ð $ñ
$ð '9ñ
9õr6   r—   ©
rE   Ú	outerBodyrœ   ÚinnerHeadersr�   rž   r–   r”   r©   r•   s
   `      @@@r4   ÚtestSingleMultiPartz(MessageProducerTests.testSingleMultiPartÐ   sÃ   û€ Øˆ	Ø=ˆ	Ü“-ˆØ'ˆ�‰Ø*ˆ�‰Ø.ˆ�	ÑØ"Iˆ�Ñä"“}ˆØ"8ˆ�YÑØ'3ˆ�^Ñ$ÜØØØØØÜ˜,¨¨D°)¸TÀ4ÓHÐIó
ˆô ÓˆÜ×!Ñ! #Ó&ˆØ×Ñ˜QÓˆ÷	ð$ �}‰}˜ZÓ(Ð(r6   c                ó”  ‡ ‡‡	‡
‡— d}dŠ	dŠ
t        «       }d|d<   d|d<   d|d	<   d
|d<   t        «       }d|d	<   d|d<   t        «       }d|d	<   d|d<   t        |dd |dt        |dd ‰	d d «      t        |dd ‰
d d «      g«      }t        «       Št        j                  |«      Š‰j                  ‰«      }ˆˆ	ˆ
ˆˆ fd„}|j                  |«      S )Nr6   r¡   ó.   Secondary <i>message</i> text of squarge body.r‡   rˆ   r‰   rŠ   r‹   rŒ   r¢   rŽ   r£   r�   ú<b>this is subject</b>ú	text/htmlr1   r�   c                ó˜   •— ‰j                  | ‰«       ‰j                  dj                  ‰j                  «      d‰z   dz   ‰z   dz   «       y )Nr6   sÅ   {354}
From: sender@host
To: recipient@domain
Subject: booga booga boo
Content-Type: multipart/alternative; boundary="xyz"


--xyz
Subject: this is subject text
Content-Type: text/plain

sE   
--xyz
Subject: <b>this is subject</b>
Content-Type: text/html

r¥   r¦   )r2   r”   Ú
innerBody1Ú
innerBody2r•   rE   s    €€€€€r4   r–   z>MessageProducerTests.testMultipleMultiPart.<locals>.cbProduced  s^   ø€ Ø×$Ñ$ V¨QÔ/à×ÑØ—‘˜Ÿ™Ó"ð
ð %ñ
%ð(ñð %ñ%ð (:ñ:õr6   r—   )rE   r«   rœ   r¬   ÚinnerHeaders2r�   rž   r–   r”   r³   r´   r•   s   `       @@@@r4   ÚtestMultipleMultiPartz*MessageProducerTests.testMultipleMultiPartý   sü   ü€ Øˆ	Ø>ˆ
ØFˆ
Ü“-ˆØ'ˆ�‰Ø*ˆ�‰Ø.ˆ�	ÑØ"Iˆ�ÑÜ"“}ˆØ"8ˆ�YÑØ'3ˆ�^Ñ$Ü#›ˆØ#;ˆ�iÑ Ø(3ˆ�nÑ%ÜØØØØØä˜\¨2¨t°ZÀÀtÓLÜ˜]¨B°°jÀ$ÈÓMðó

ˆô ÓˆÜ×!Ñ! #Ó&ˆØ×Ñ˜QÓˆ÷	ð 	ð* �}‰}˜ZÓ(Ð(r6   c                óV  ‡ ‡‡‡	— d}dŠt        «       }d|d<   d|d<   d|d<   d	|d
<   t        «       }d|d<   d|d
<   t        |dd|dt        |dd‰dd«      g«      }t        «       Št        j                  |«      Š	d„ ‰	_        ‰	j                  ‰«      }ˆˆˆ	ˆ fd„}|j                  |«      S )z>
        A boundary is generated if none is provided.
        r6   r¡   r‡   rˆ   r‰   rŠ   r‹   rŒ   úmultipart/alternativerŽ   r£   r�   r1   Nr�   c                 ó,   — t        j                  d«      S )Nz$aaaaaaaa-aaaa-aaaa-aaaa-aaaaaaaaaaaa)ÚuuidÚUUIDr1   r6   r4   r5   z?MessageProducerTests.test_multiPartNoBoundary.<locals>.<lambda>M  s   € œ4Ÿ9™9Ð%KÓL€ r6   c                óŒ   •— ‰j                  | ‰«       ‰j                  dj                  ‰j                  «      d‰z   dz   «       y )Nr6   s	  {341}
From: sender@host
To: recipient@domain
Subject: booga booga boo
Content-Type: multipart/alternative; boundary="----=aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa"


------=aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
Subject: this is subject text
Content-Type: text/plain

s-   
------=aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa--
r¦   r¨   s    €€€€r4   r–   zAMessageProducerTests.test_multiPartNoBoundary.<locals>.cbProducedQ  sL   ø€ Ø×$Ñ$ V¨QÔ/Ø×ÑØ—‘˜Ÿ™Ó"ðð ñð GñGõr6   )r   r˜   rw   r   r™   Ú_uuid4rš   r›   rª   s
   `      @@@r4   Útest_multiPartNoBoundaryz-MessageProducerTests.test_multiPartNoBoundary3  sÌ   û€ ð ˆ	Ø=ˆ	Ü“-ˆØ'ˆ�‰Ø*ˆ�‰Ø.ˆ�	ÑØ"9ˆ�Ñä"“}ˆØ"8ˆ�YÑØ'3ˆ�^Ñ$ÜØØØØØÜ˜,¨¨D°)¸TÀ4ÓHÐIó
ˆô ÓˆÜ×!Ñ! #Ó&ˆÙLˆŒà×Ñ˜QÓˆ÷	ð* �}‰}˜ZÓ(Ð(r6   c                óF  ‡ ‡‡‡	— d}dŠt        «       }d|d<   d|d<   d|d<   d	|d
<   t        «       }d|d<   d|d
<   t        |dd|dt        |dd‰dd«      g«      }t        «       Št        j                  |«      Š	‰	j                  ‰«      }ˆˆˆ	ˆ fd„}|j                  |«      S )z>
        A boundary without does not have them added.
        r6   r¡   r‡   rˆ   r‰   rŠ   r‹   rŒ   z#multipart/alternative; boundary=xyzrŽ   r£   r�   r1   Nr�   c                óŒ   •— ‰j                  | ‰«       ‰j                  dj                  ‰j                  «      d‰z   dz   «       y )Nr6   sÃ   {237}
From: sender@host
To: recipient@domain
Subject: booga booga boo
Content-Type: multipart/alternative; boundary=xyz


--xyz
Subject: this is subject text
Content-Type: text/plain

r¥   r¦   r¨   s    €€€€r4   r–   z?MessageProducerTests.test_multiPartNoQuotes.<locals>.cbProduced„  sJ   ø€ Ø×$Ñ$ V¨QÔ/Ø×ÑØ—‘˜Ÿ™Ó"ðð $ñ$ð '9ñ9õr6   r—   rª   s
   `      @@@r4   Útest_multiPartNoQuotesz+MessageProducerTests.test_multiPartNoQuotesh  sÅ   û€ ð ˆ	Ø=ˆ	Ü“-ˆØ'ˆ�‰Ø*ˆ�‰Ø.ˆ�	ÑØ"Gˆ�Ñä"“}ˆØ"8ˆ�YÑØ'3ˆ�^Ñ$ÜØØØØØÜ˜,¨¨D°)¸TÀ4ÓHÐIó
ˆô ÓˆÜ×!Ñ! #Ó&ˆØ×Ñ˜QÓˆ÷	ð& �}‰}˜ZÓ(Ð(r6   N)rs   rt   ru   rŸ   r­   r¶   r¾   rÁ   r1   r6   r4   r…   r…   ³   s   „ ò)ò8+)òZ4)òl3)ój/)r6   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d„ Zd„ Zd„ Zd„ Zd„ Zy)ÚMessageSetTestsz"
    Tests for L{MessageSet}.
    c                ó  — t        «       }t        «       }| j                  ||«       | j                  |d«       |dz   }| j                  t        |«      d«       | j                  t	        |«      dg«       |dz   }| j                  t        |«      d«       | j                  t	        |«      g d¢«       |dz   }| j                  ||«       | j                  t	        ||z   «      g d¢«       |j                  d«       | j                  t        |«      d«       | j                  t	        |«      g d¢«       | j                  ||«       |j                  d	d
«       | j                  t        |«      d«       | j                  t	        |«      g d¢«       y)a4  
        Test the following properties of L{MessageSet} addition and
        equality:

            1. Two empty L{MessageSet}s are equal to each other;

            2. A L{MessageSet} is not equal to any other object;

            2. Adding a L{MessageSet} and another L{MessageSet} or an
               L{int} representing a single message or a sequence of
               L{int}s representing a sequence of message numbers
               produces a new L{MessageSet} that:

            3. Has a length equal to the number of messages within
               each sequence of message numbers;

            4. Yields each message number in ascending order when
               iterated over;

            6. L{MessageSet.add} with a single message or a start and
               end message satisfies 3 and 4 above.
        r1   é   ©rÅ   é   rÇ   ©rÅ   é   rÇ   é   é   )rÅ   rÉ   rÇ   rÊ   é   é   é   )rÅ   rÉ   rÇ   rÊ   rÌ   rÎ   rÍ   N)r   rB   ÚassertNotEqualÚlenÚlistÚadd)rE   Úm1Úm2s      r4   Ú!test_equalityIterationAndAdditionz1MessageSetTests.test_equalityIterationAndAdditionŸ  s@  € ô. ‹\ˆÜ‹\ˆà×Ñ˜˜RÔ Ø×Ñ˜B Ô#à�!‰VˆØ×Ñœ˜R› !Ô$Ø×Ñœ˜b› A 3Ô'à�&‰[ˆØ×Ñœ˜R› !Ô$Ø×Ñœ˜b›¢9Ô-à�&‰[ˆØ×Ñ˜˜RÔ Ø×Ñœ˜b 2™g›ª	Ô2à
�‰ˆqŒ	Ø×Ñœ˜R› !Ô$Ø×Ñœ˜b›¢<Ô0à×Ñ˜B Ô#à
�‰ˆq�!ŒØ×Ñœ˜R› !Ô$Ø×Ñœ˜b›Ò#8Õ9r6   c                óN   — | j                  t        t        t        dd«      «       y)z…
        A L{MessageSet} that has a range that ends with L{None} raises
        a L{TypeError} when its length is requested.
        rÅ   N)ÚassertRaisesÚ	TypeErrorrÐ   r   rR   s    r4   Útest_lengthWithWildcardRangez,MessageSetTests.test_lengthWithWildcardRangeÒ  s   € ð
 	×Ñœ)¤S¬*°Q¸Ó*=Õ>r6   c                ó.   — t        t        dd«      «       y)zD
        L{MessageSet.__repr__} does not raise an exception
        rÅ   rÉ   N)Úreprr   rR   s    r4   Útest_reprSanityzMessageSetTests.test_reprSanityÙ  s   € ô 	ŒZ˜˜1ÓÕr6   c                ó  — t        j                  d«      t        j                  d«      t        j                  dd«      t        j                  dd«      g}g d¢}t        ||«      D ]   \  }}| j                  t	        |«      |«       Œ" y)z¬
        In a L{MessageSet}, in the presence of wildcards, if the
        highest message id is known, the wildcard should get replaced
        by that high value.
        ó   *ó   1:*s   3:*rÌ   s   *:2)Ú*ú1:*z3:6z2:6N©r   ÚparseIdListÚziprB   Ústr©rE   ÚinputsÚoutputsÚirp   s        r4   Ú&test_stringRepresentationWithWildcardsz6MessageSetTests.test_stringRepresentationWithWildcardsß  s~   € ô ×Ñ˜dÓ#Ü×Ñ˜fÓ%Ü×Ñ˜f aÓ(Ü×Ñ˜f aÓ(ð	
ˆò
ˆô ˜ Ó(ò 	(‰DˆAˆqØ×ÑœS ›V QÕ'ñ	(r6   c                ó¾   — t        j                  d«      t        j                  d«      g}ddg}t        ||«      D ]   \  }}| j                  t	        |«      |«       Œ" y)z÷
        In a L{MessageSet}, inverting the high and low numbers in a
        range doesn't affect the meaning of the range.  For example,
        3:2 displays just like 2:3, because according to the RFC they
        have the same meaning.
        ó   2:3s   3:2ú2:3Nrâ   ræ   s        r4   Ú&test_stringRepresentationWithInversionz6MessageSetTests.test_stringRepresentationWithInversionö  sf   € ô ×Ñ˜fÓ%Ü×Ñ˜fÓ%ð
ˆð Øð
ˆô
 ˜ Ó(ò 	(‰DˆAˆqØ×ÑœS ›V QÕ'ñ	(r6   c                ó¾   — t        d«      }| j                  t        |«      d«       | j                  t        |«      d«       | j                  t	        |«      dg«       y)zþ
        Creating a L{MessageSet} with a single message number adds
        only that message to the L{MessageSet}; its serialized form
        includes only that message number, its length is one, and it
        yields only that message number.
        rÅ   Ú1N©r   rB   rå   rÐ   rÑ   ©rE   Úms     r4   Ú"test_createWithSingleMessageNumberz2MessageSetTests.test_createWithSingleMessageNumber
  sK   € ô �q‹MˆØ×Ñœ˜Q› Ô%Ø×Ñœ˜Q› Ô#Ø×Ñœ˜a› 1 #Õ&r6   c                óÂ   — t        dd«      }| j                  t        |«      d«       | j                  t        |«      d«       | j                  t	        |«      g d¢«       y)a?  
        Creating a L{MessageSet} with both a start and end message
        number adds the sequence between to the L{MessageSet}; its
        serialized form consists that range, its length is the length
        of the sequence, and it yields the message numbers inclusively
        between the start and end.
        rÅ   é
   z1:10)
rÅ   rÉ   rÇ   rË   rÊ   rÌ   rÎ   rÍ   é	   rö   Nrñ   rò   s     r4   Útest_createWithSequencez'MessageSetTests.test_createWithSequence  sM   € ô �q˜"ÓˆØ×Ñœ˜Q› Ô(Ø×Ñœ˜Q› Ô$Ø×Ñœ˜a›Ò"AÕBr6   c                ó¼   — t        d«      }| j                  t        |«      d«       | j                  t        |«      d«       | j	                  t
        t        |«       y)zÿ
        Creating a L{MessageSet} with a single L{None}, representing
        C{*}, adds C{*} to the range; its serialized form includes
        only C{*}, its length is one, but it cannot be iterated over
        because its endpoint is unknown.
        Nrà   rÅ   )r   rB   rå   rÐ   r×   rØ   rÑ   rò   s     r4   Útest_createWithSingleWildcardz-MessageSetTests.test_createWithSingleWildcard#  sH   € ô �tÓˆØ×Ñœ˜Q› Ô%Ø×Ñœ˜Q› Ô#Ø×Ñœ)¤T¨1Õ-r6   c                óÀ   — t        d«      }d|_        | j                  t        |«      dg«       t        dd«      }d|_        | j                  t        |«      g d¢«       y)z�
        Setting L{MessageSet.last} replaces L{None}, representing
        C{*}, with that number, making that L{MessageSet} iterable.
        Nrö   rÇ   rÅ   rÈ   )r   ÚlastrB   rÑ   )rE   ÚsingleMessageReplacedÚrangeReplaceds      r4   Útest_setLastSingleWildcardz*MessageSetTests.test_setLastSingleWildcard/  sY   € ô
 !+¨4Ó 0ÐØ%'ÐÔ"Ø×ÑœÐ3Ó4°r°dÔ;ä" 1 dÓ+ˆØˆÔØ×Ñœ˜mÓ,ªiÕ8r6   c                óˆ   — t        dd«      }|j                  dd«       d|_        | j                  t	        |«      g d¢«       y)zL
        Setting L{MessageSet.last} replaces L{None} in all ranges.
        rÅ   NrÉ   rÊ   ©rÅ   rÉ   rÇ   rË   rÊ   )r   rÒ   rü   rB   rÑ   rò   s     r4   Útest_setLastWithWildcardRangez-MessageSetTests.test_setLastWithWildcardRange<  s8   € ô �q˜$ÓˆØ	�‰ˆa�ŒØˆŒØ×Ñœ˜a›¢/Õ2r6   c                óŒ   — t        dd«      }d|_        | j                  t        «      5  d|_        ddd«       y# 1 sw Y   yxY w)z9
        L{MessageSet.last} cannot be set twice.
        rÅ   NrÉ   rÇ   )r   rü   r×   Ú
ValueErrorrò   s     r4   Útest_setLastTwiceFailsz&MessageSetTests.test_setLastTwiceFailsE  sA   € ô �q˜$ÓˆØˆŒØ×ÑœzÓ*ñ 	ØˆAŒF÷	÷ 	ñ 	ús	   ©:ºAc                ó"  — t        d«      }d|_        |j                  d«       | j                  t	        |«      ddg«       | j                  t	        |dz   «      g d¢«       |j                  dd«       | j                  t	        |«      g d¢«       y)a  
        Adding a L{None}, representing C{*}, or a sequence that
        includes L{None} to a L{MessageSet} whose
        L{last<MessageSet.last>} property has been set replaces all
        occurrences of L{None} with the value of
        L{last<MessageSet.last>}.
        rÅ   rË   N)NrÊ   )rÅ   rË   rÊ   rÇ   )rÅ   rÇ   rË   )r   rü   rÒ   rB   rÑ   )rE   ÚhasLasts     r4   Útest_lastOverridesNoneInAddz+MessageSetTests.test_lastOverridesNoneInAddN  st   € ô ˜Q“-ˆØˆŒà�‰�DÔØ×Ñœ˜g›¨¨A¨Ô/à×Ñœ˜g¨	Ñ1Ó2²IÔ>à�‰�A�tÔØ×Ñœ˜g›ª	Õ2r6   c                ób   — t        dd«      }d|_        | j                  |j                  d«       y)zF
        Accessing L{MessageSet.last} returns the last value.
        rÅ   NrÉ   )r   rü   rB   rò   s     r4   Útest_getLastzMessageSetTests.test_getLasta  s+   € ô �q˜$ÓˆØˆŒØ×Ñ˜Ÿ™ Õ#r6   c                ó>  — t        «       }|j                  d«       | j                  t        |«      dg«       t        «       }|j                  d«       | j                  t	        |«      d«       t        «       }|j                  d«       | j                  t        |«      g d¢«       t        «       }|j                  d«       | j                  t	        |«      d«       t        «       }|j                  t        dd«      «       | j                  t        |«      g d¢«       y)zó
        L{MessageSet.extend} accepts as its arugment an L{int} or
        L{None}, or a sequence L{int}s or L{None}s of length two, or
        another L{MessageSet}, combining its argument with its
        instance's existing ranges.
        rÅ   Nrà   rÆ   rÈ   ©NNrÇ   )r   ÚextendrB   rÑ   rå   )rE   ÚextendWithIntÚextendWithNoneÚextendWithSequenceOfIntsÚextendWithSequenceOfNonesÚextendWithMessageSets         r4   Útest_extendzMessageSetTests.test_extendi  så   € ô #›ˆØ×Ñ˜QÔØ×Ñœ˜mÓ,¨q¨cÔ2ä#›ˆØ×Ñ˜dÔ#Ø×Ñœ˜^Ó,¨cÔ2ä#-£<Ð Ø ×'Ñ'¨Ô/Ø×ÑœÐ6Ó7ºÔCä$.£LÐ!Ø!×(Ñ(¨Ô6Ø×ÑœÐ6Ó7¸Ô=ä)›|ÐØ×#Ñ#¤J¨q°!Ó$4Ô5Ø×ÑœÐ2Ó3²YÕ?r6   c                ó†  — t        dd«      }t        dd«      t        dd«      z   }| j                  d|«       | j                  d|«       |dz   }| j                  t        «      5  d|v  ddd«       |dz   }|j                  dd«       | j                  t        «      5  d|v  ddd«       y# 1 sw Y   ŒCxY w# 1 sw Y   yxY w)	z¨
        A L{MessageSet} contains a number if the number falls within
        one of its ranges, and raises L{TypeError} if any range
        contains L{None}.
        rÅ   rÎ   rË   rÌ   rÊ   N)rö   é   rÍ   )r   ÚassertInÚassertNotInr×   rØ   rÒ   )rE   ÚhasFiveÚdoesNotHaveFiveÚhasFiveButHasNoneÚhasFiveButHasNoneInSequences        r4   Útest_containszMessageSetTests.test_contains„  sÊ   € ô ˜Q Ó"ˆÜ$ Q¨Ó*¬Z¸¸1Ó-=Ñ=ˆà�‰�a˜Ô!Ø×Ñ˜˜OÔ,à# d™NÐØ×ÑœyÓ)ñ 	#ØÐ"Ñ"÷	#ð '.°Ñ&8Ð#Ø#×'Ñ'¨¨4Ô0Ø×ÑœyÓ)ñ 	-ØÐ,Ñ,÷	-ð 	-÷	#ð 	#ú÷
	-ð 	-ús   Á$B+ÂB7Â+B4Â7C c                óî  — t        dd«      }t        dd«      }||z   }|t        dd«      z   }| j                  t        |dz   «      g d¢«       | j                  t        |d	z   «      g d
¢«       | j                  t        |dz   «      g d¢«       | j                  t        |dz   «      g d¢«       | j                  t        |d	z   «      g d¢«       | j                  t        |t        d«      z   «      g d¢«       y)zÖ
        Adding a sequence of message numbers to a L{MessageSet} that
        begins or ends immediately before or after an existing
        sequence in that L{MessageSet}, or overlaps one, merges the two.
        rÅ   rÇ   rÌ   rÍ   rÊ   rÎ   )rÉ   rË   )rÅ   rÉ   rÇ   rË   )rÇ   rÊ   r  )rÊ   rÎ   )rÊ   rÌ   rÎ   rÍ   )rË   rÌ   )rË   rÊ   rÌ   rÎ   rÍ   )rÅ   rÉ   rÇ   rË   rÊ   rÌ   rÎ   rÍ   rË   )rÅ   rÉ   rÇ   rË   rÊ   rÌ   rÎ   N)r   rB   rÑ   )rE   Ú
mergeAfterÚmergeBeforeÚmergeBetweenSequenceÚmergeBetweenNumbers        r4   Útest_rangesMergedz!MessageSetTests.test_rangesMerged™  sà   € ô    1Ó%ˆ
Ü   AÓ&ˆà)¨KÑ7ÐØ'¬*°Q¸Ó*:Ñ:Ðà×Ñœ˜j¨6Ñ1Ó2²LÔAØ×Ñœ˜j¨6Ñ1Ó2²OÔDà×Ñœ˜k¨FÑ2Ó3²\ÔBØ×Ñœ˜k¨FÑ2Ó3²_ÔEà×ÑœÐ2°VÑ;Ó<Ò>VÔWØ×ÑÜÐ#¤j°£mÑ3Ó4Ò6Kõ	
r6   c                óþ   — | j                  t        dd«      t        dd«      «       | j                  t        t        dd«      «      g d¢«       t        dd«      }d|_        | j                  t        |«      ddg«       y)aÔ  
        Test the C{seq-range} examples from Section 9, "Formal Syntax"
        of RFC 3501::

            Example: 2:4 and 4:2 are equivalent and indicate values
                     2, 3, and 4.

            Example: a unique identifier sequence range of
                     3291:* includes the UID of the last message in
                     the mailbox, even if that value is less than 3291.

        @see: U{http://tools.ietf.org/html/rfc3501#section-9}
        rÉ   rË   ©rÉ   rÇ   rË   iÛ  NiÚ  )rB   r   rÑ   rü   rò   s     r4   Útest_seq_rangeExamplesz&MessageSetTests.test_seq_rangeExamples±  si   € ð 	×Ñœ A qÓ)¬:°a¸Ó+;Ô<Ø×Ñœœj¨¨AÓ.Ó/²Ô;ä�t˜TÓ"ˆØˆŒØ×Ñœ˜a› 4¨ ,Õ/r6   c                óT  — t        d«      t        dd«      z   t        d«      z   t        dd«      z   }d|_        | j                  dj                  d	„ |D «       «      d
«       t        dd«      t        dd«      z   }d|_        | j                  dj                  d„ |D «       «      d«       y)a©  
        Test the C{sequence-set} examples from Section 9, "Formal
        Syntax" of RFC 3501.  In particular, L{MessageSet} reorders
        and coalesces overlaps::

            Example: a message sequence number set of
                     2,4:7,9,12:* for a mailbox with 15 messages is
                     equivalent to 2,4,5,6,7,9,12,13,14,15

            Example: a message sequence number set of *:4,5:7
                     for a mailbox with 10 messages is equivalent to
                     10,9,8,7,6,5,4,5,6,7 and MAY be reordered and
                     overlap coalesced to be 4,5,6,7,8,9,10.

        @see: U{http://tools.ietf.org/html/rfc3501#section-9}
        rÉ   rË   rÎ   r÷   r  Né   ú,c              3  ó2   K  — | ]  }t        |«      –— Œ y ­wr0   ©rå   ©Ú.0ré   s     r4   ú	<genexpr>z<MessageSetTests.test_sequence_setExamples.<locals>.<genexpr>Ý  s   è ø€ Ò9 ”S˜—VÑ9ùó   ‚z2,4,5,6,7,9,12,13,14,15rÊ   rö   c              3  ó2   K  — | ]  }t        |«      –— Œ y ­wr0   r*  r+  s     r4   r-  z<MessageSetTests.test_sequence_setExamples.<locals>.<genexpr>â  s   è ø€ Ò!B¨Q¤# a§&Ñ!Bùr.  z4,5,6,7,8,9,10)r   rü   rB   r’   )rE   ÚfromFifteenMessagesÚfromTenMessagess      r4   Útest_sequence_setExamplesz)MessageSetTests.test_sequence_setExamplesÇ  s¢   € ô$ �q‹MœJ q¨!Ó,Ñ,¬z¸!«}Ñ<¼zÈ"ÈdÓ?SÑSð 	ð $&ÐÔ Ø×ÑØ�H‰HÑ9Ð%8Ô9Ó9Ð;Tô	
ô % T¨1Ó-´
¸1¸aÓ0@Ñ@ˆØ!ˆÔØ×Ñ˜Ÿ™Ñ!B°/Ô!BÓBÐDTÕUr6   N)rs   rt   ru   Ú__doc__rÕ   rÙ   rÜ   rê   rî   rô   rø   rú   rÿ   r  r  r  r
  r  r  r"  r%  r2  r1   r6   r4   rÃ   rÃ   š  se   „ ñò1:òf?òò(ò.(ò(
'òCò
.ò9ò3òò3ò&$ò@ò6-ò*
ò00ó,Vr6   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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d„ Z d„ Z!d „ Z"d!„ Z#d"„ Z$d#„ Z%d$„ Z&d%„ Z'd&„ Z(d'„ Z)d(„ Z*d)„ Z+y*)+ÚIMAP4HelperTestszA
    Tests for various helper utilities in the IMAP4 module.
    c                óF   — t        t        j                  ddgd«      «       y)zI
        L{imap4.Command}'s C{repr} does not raise an exception.
        s   COMMANDs   argó   extraN)rÛ   r   ÚCommandrR   s    r4   Útest_commandReprz!IMAP4HelperTests.test_commandReprê  s   € ô 	ŒU�]‰]˜:¨ x°(Ó<Õ=r6   c                ó  ‡ ‡‡‡— dŠt        «       Št        ‰«      }t        j                  |«      Š‰j	                  ‰«      }ˆˆˆˆ fd„}ˆfd„}|j                  |«       |j                  |«       |j                  |«      S )Ns   xyzxyzxyzxyzxyzxyzxyzxyzxyzxyzc                óž   •— ‰j                  | ‰«       ‰j                  dt        ‰«      ‰fz  dj                  ‰j                  «      «       | S )Ns   {%d}
%br6   )r§   rB   rÐ   r’   ry   )r2   Úbr”   r•   rE   s    €€€€r4   r–   z6IMAP4HelperTests.test_fileProducer.<locals>.cbProduced÷  sB   ø€ Ø×$Ñ$ V¨QÔ/Ø×Ñ˜]¬c°!«f°a¨[Ñ8¸#¿(¹(À1Ç8Á8Ó:LÔMØˆMr6   c                ó(   •— ‰j                  «        | S r0   )r~   )r2   r•   s    €r4   ÚcbResumez4IMAP4HelperTests.test_fileProducer.<locals>.cbResumeü  s   ø€ ð ×ÑÔØˆMr6   )rw   r   r   ÚFileProducerrš   r›   )rE   r3   rž   r–   r>  r<  r”   r•   s   `    @@@r4   Útest_fileProducerz"IMAP4HelperTests.test_fileProducerð  sn   û€ Ø7ˆÜÓˆÜ�A‹JˆÜ×Ñ˜qÓ!ˆØ×Ñ˜QÓˆ÷	ô
	ð 	
�‰�jÔ!Ø	�‰�hÔð �}‰}˜ZÓ(Ð(r6   c                ó  — dg d¢ddggdg d¢g d¢gdg d	¢g d
¢gg}|D ]j  \  }}}t        j                  |d«      }|D ]"  }| j                  |j                  |«      «       Œ$ |D ]"  }| j	                  |j                  |«      «       Œ$ Œl y )Núfoo/%gum/bar©zfoo/barzoo/lalagum/barzfoo/gumx/barzfoo/gum/bazúfoo/xgum/barúfoo/gum/barúfoo/x%x/bar©ÚfooÚbarzfuz fuz fuzz	foo/*/barúfoo/xyz/barz
foo/xx/baz)úfoo/xyx/barú
foo/xx/barúfoo/xxxxxxxxxxxxxx/barúfoo/xyz*abc/bar©rJ  zfoo/abc/barzfoo/xyzab/cbarzfoo/xyza/bcbar©zfoo/xyzabc/barzfoo/xyz/abc/barzfoo/xyz/123/abc/barú/©r   ÚwildcardToRegexpÚassertFalseÚmatchÚ
assertTrue©rE   ÚcasesÚwildcardÚfailÚsucceedÚxs         r4   Útest_wildcardzIMAP4HelperTests.test_wildcard  s²   € ð ÚLØ Ð/ðð ÚWÚGðð "ÚRÚLðð
ˆð$ (-ò 	3Ñ#ˆH�d˜GÜ×-Ñ-¨h¸Ó<ˆHØò 4�Ø× Ñ  §¡°Ó!2Õ3ð4àò 3�Ø—‘ §¡¨qÓ 1Õ2ñ3ñ		3r6   c                ó  — dg d¢g d¢gdg d¢g d¢gdg d¢g d	¢gg}|D ]l  \  }}}t        j                  |d «      }|D ]#  }| j                  |j                  |«      |«       Œ% |D ]#  }| j	                  |j                  |«      |«       Œ% Œn y )
NrB  rC  )rD  rE  zfoo/x/gum/barrF  rG  )rK  rL  rM  zfoo/x/x/barrN  rO  rP  rR  rW  s         r4   Útest_wildcardNoDelimz%IMAP4HelperTests.test_wildcardNoDelim"  s±   € ð ÚLÚ@ðð ÚWÚVðð "ÚRÚLðð
ˆð$ (-ò 	6Ñ#ˆH�d˜GÜ×-Ñ-¨h¸Ó=ˆHØò 7�Ø× Ñ  §¡°Ó!2°AÕ6ð7àò 6�Ø—‘ §¡¨qÓ 1°1Õ5ñ6ñ		6r6   c           	     óÖ   — dddœdfg}|D ]\  \  }}t        j                  |«      }| j                  t        |j	                  d«      «      t        |j	                  d«      «      «       Œ^ y)zÊ
        L{imap4._formatHeaders} accepts a C{dict} of header name/value pairs and
        returns a string representing those headers in the standard multiline,
        C{":"}-separated format.
        ÚValue1ÚValue2)ÚHeader1ÚHeader2s"   Header2: Value2
Header1: Value1
TN)r   Ú_formatHeadersrB   ÚsortedÚ
splitlines)rE   rX  rd   Úexpectedr^   s        r4   Útest_headerFormatterz%IMAP4HelperTests.test_headerFormatter<  ss   € ð %°Ñ:Ø9ðð
ˆð  %ò 	‰OˆE�8Ü×)Ñ)¨%Ó0ˆFØ×ÑÜ�v×(Ñ(¨Ó.Ó/´¸×8KÑ8KÈDÓ8QÓ1Rõñ	r6   c                ó^  — g d¢}ddgddgg d¢g d¢g d¢g d¢g d	¢g d
¢g d¢g d¢dgddgdgg d¢dgg d¢dgg d¢dgg}g d¢}|D ]1  }| j                  t        j                  t        j                  |«       Œ3 t	        ||«      D ]*  \  }}| j                  t        j                  |«      |«       Œ, y )N)s   Hello Worlds   Hello "World!"s   World "Hello" "How are you?"s   "Hello world" How "are you?"s   foo bar "baz buz" NILs   foo bar "baz buz" "NIL"s   foo NIL "baz buz" bars   foo "NIL" "baz buz" bars   "NIL" bar "baz buz" foos   oo \"oo\" oos   "oo \"oo\" oo"ó   oo 	 oos	   "oo 	 oo"ó   oo \t oos
   "oo \t oo"ó   oo \o ooó
   "oo \o oo"rm  rn  ó   Helloó   Worlds   World!)rp  ro  s   How are you?)r;   s   Hows   are you?)ó   fooó   baró   baz buzN)rq  rr  rs  ó   NIL)rq  Nrs  rr  )rq  rt  rs  rr  )rt  rr  rs  rq  )ó   oos   "oo"ru  ó
   oo "oo" ooru  rk  )ru  s   \tru  rl  )ru  ó   \oru  rm  )s   "mismatched quotes   mismatched quote"s   mismatched"quotes   "oops here is" another")r×   r   ÚMismatchedQuotingÚsplitQuotedrä   rB   )rE   rX  ÚanswersÚerrorsÚsÚcaserh  s          r4   Útest_quotedSplitterz$IMAP4HelperTests.test_quotedSplitterO  sÔ   € ò
ˆð. �xÐ Ø�yÐ!Ú1Ú1Ú.Ú0Ú.Ú0Ú0Ú#ØˆOØ�EˆNØˆMÚ"ØˆNÚ"ØˆNÚ"ØˆNð'
ˆò,
ˆð ò 	MˆAØ×Ñœe×5Ñ5´u×7HÑ7HÈ!ÕLð	Mô " %¨Ó1ò 	@‰NˆD�(Ø×ÑœU×.Ñ.¨tÓ4°hÕ?ñ	@r6   c                ó  — g d¢g d¢g d¢ddgdg d¢dgddg d	¢gd
ddd
g d¢d
ddd
g	dg d¢ddgg}dgg d¢dgdgddgdgddggddgdgddgdgg}t        ||«      D ]*  \  }}| j                  t        j                  |«      |«       Œ, y )N)ó   aó   bó   có   dó   e)
r€  ó    ó   "r�  r‚  r…  r†  r…  rƒ  r„  )r€  r�  r‚  rƒ  r„  r€  )r�  r‚  rƒ  r�  )r‚  rƒ  r„  r†  r…  )r†  r…  r�  r‚  r…  r…  r†  s   abcde)r€  s   bc ó   des   abcr‡  s   bcds   abs   cdes   a s    es    bc  )rä   rB   r   ÚcollapseStrings)rE   rX  rz  r}  rh  s        r4   Útest_stringCollapserz%IMAP4HelperTests.test_stringCollapser‰  sÕ   € â*ÚHÚ  tÐ,ØÒ% tÐ,Ø�4Ò+Ð,Ø�4˜˜tÒ%7¸¸tÀTÈ4ÐPØÒ=¸tÀTÐJð
ˆð ˆJÚ!ØˆX�uÐØ�F�8˜TÐ"Ø�V�HÐØ�V�H˜eÐ$Ø�H�:˜uÐ%ð
ˆô " %¨Ó1ò 	D‰NˆD�(Ø×ÑœU×2Ñ2°4Ó8¸(ÕCñ	Dr6   c                óz  ‡ — dj                  dgdz  «      }ˆ fd„} |dt        |«      |fz  ddg d¢g|g«        |d	d
dgdddddddg d¢gg d¢gg d¢gg d¢gg d¢g d¢gd d dg
dddddgd d dddgg
«        |d d!g«        |d"d#g«        |d$d%g«        |d&d'g«        |d&d'g«        |d(d)d*g«        |d(d)d*g«       y )+Nó   
s   xxrË   c                óV   •— t        j                  | «      }‰j                  ||g«       y r0   )r   ÚparseNestedParensrB   )r}  rh  ÚparsedrE   s      €r4   Úcheckz0IMAP4HelperTests.test_parenParser.<locals>.check¤  s%   ø€ Ü×,Ñ,¨TÓ2ˆFØ×Ñ˜V h ZÕ0r6   s8   (BODY.PEEK[HEADER.FIELDS.NOT (subject bcc cc)] {%d}
%b)ó	   BODY.PEEKs   HEADER.FIELDS.NOT)s   subjects   bccs   ccs  (FLAGS (\Seen) INTERNALDATE "17-Jul-1996 02:44:25 -0700" RFC822.SIZE 4286 ENVELOPE ("Wed, 17 Jul 1996 02:23:25 -0700 (PDT)" "IMAP4rev1 WG mtg summary and minutes" (("Terry Gray" NIL gray cac.washington.edu)) (("Terry Gray" NIL gray cac.washington.edu)) (("Terry Gray" NIL gray cac.washington.edu)) ((NIL NIL imap cac.washington.edu)) ((NIL NIL minutes CNRI.Reston.VA.US) ("John Klensin" NIL KLENSIN INFOODS.MIT.EDU)) NIL NIL <B27397-0100000@cac.washington.edu>) BODY (TEXT PLAIN (CHARSET US-ASCII) NIL NIL 7BIT 3028 92))ó   FLAGSs   \Seens   INTERNALDATEs   17-Jul-1996 02:44:25 -0700s   RFC822.SIZEs   4286s   ENVELOPEs%   Wed, 17 Jul 1996 02:23:25 -0700 (PDT)s$   IMAP4rev1 WG mtg summary and minutes)s
   Terry GrayNs   grayó   cac.washington.edu)NNs   imapr’  )NNs   minutess   CNRI.Reston.VA.US)s   John KlensinNs   KLENSINs   INFOODS.MIT.EDUs#   <B27397-0100000@cac.washington.edu>ó   BODYs   TEXTó   PLAINó   CHARSETs   US-ASCIIs   7BITs   3028s   92s   ("oo \"oo\" oo")rv  s   ("oo \\ oo")s   oo \\ oos   ("oo \ oo")s   oo \ oos	   ("oo \o")s   oo \os   (oo \o)ru  rw  )r’   rÐ   )rE   r|  r�  s   `  r4   Útest_parenParserz!IMAP4HelperTests.test_parenParser¡  s5  ø€ Ø�L‰L˜%˜ 1™Ó%ˆô	1ñ 	ØIÌSÐQRËVÐUVÈKÑWØÐ0Ò2MÐNÐPQÐRô	
ñ 	ðJð Ø�ØØ-ØØØà<Ø;ÚJÐKÚJÐKÚJÐKÚAÐBâFÚOðð ØØ:ðð àØØ Ð-ØØØØØð	ð1"ô0	
ñd 	Ð# m _Ô5ÙÐ - Ô1Ùˆo ˜}Ô-áˆm˜i˜[Ô)Ùˆm˜i˜[Ô)Ùˆk˜E 6˜?Ô+Ùˆk˜E 6˜?Õ+r6   c           
     ó¾  — g d¢g d¢g d¢g d¢g d¢g d¢g d¢g d¢g d	¢g	}|D ]»  \  }}}|j                  d
«      }t        j                  «       }|j                  |«       | j	                  t        |j                  «      d«       | j                  t        |j                  d   t        ||«      «      «       | j	                  t        |j                  d   «      |«       Œ½ y )N)ÚENVELOPEÚEnvelopeÚenvelope)ÚFLAGSÚFlagsÚflags)ÚINTERNALDATEÚInternalDateÚinternaldate)úRFC822.HEADERÚRFC822Headerzrfc822.header)úRFC822.SIZEÚ
RFC822Sizezrfc822.size)úRFC822.TEXTÚ
RFC822Textzrfc822.text)ÚRFC822r§  Úrfc822)ÚUIDr©  Úuid)ÚBODYSTRUCTUREÚBodyStructureÚbodystructureÚasciirÅ   r   )rC   r   Ú_FetchParserÚparseStringrB   rÐ   r2   rV  Ú
isinstanceÚgetattrrå   )rE   rX  ÚinpÚoutpÚasStringr•   s         r4   Útest_fetchParserSimplez'IMAP4HelperTests.test_fetchParserSimpleð  s»   € â0Ú'Ú<Ú>Ú8Ú8Ú*Ú!Ú?ð

ˆð $)ò 	9ÑˆC��xØ—*‘*˜WÓ%ˆCÜ×"Ñ"Ó$ˆAØ�M‰M˜#ÔØ×ÑœS §¡›]¨AÔ.Ø�O‰OœJ q§x¡x°¡{´G¸A¸tÓ4DÓEÔFØ×ÑœS §¡¨!¡Ó-¨xÕ8ñ	9r6   c                óØ  — ddg d¢fgddg d¢fgddg d	¢fgg}|D ]É  \  }}t        j                  «       }|j                  |«       | j                  t	        |j
                  «      |d
   «       |j
                  D �cg c]*  }t        |«      j                  «       j                  d«      ‘Œ, }}|j                  «        |d   j                  «        | j                  ||d   «       ŒË y c c}w )Ns   ALLrË   )ó   flagsó   internaldateó   rfc822.sizeó   envelopes   FULLrÊ   )r¸  r¹  rº  r»  s   bodys   FASTrÇ   )r¸  r¹  rº  r   r®  rÅ   )
r   r¯  r°  rB   rÐ   r2   rå   ÚlowerrC   Úsort)rE   rX  r³  r´  r•   ÚtokenÚexpectedResults          r4   Útest_fetchParserMacrosz'IMAP4HelperTests.test_fetchParserMacros  så   € à�aÒQÐRÐSàØÒUÐVðð �qÒEÐFÐGð
ˆð ò 	6‰IˆC�Ü×"Ñ"Ó$ˆAØ�M‰M˜#ÔØ×ÑœS §¡›]¨D°©GÔ4ØNOÏhÉhÖWÀUœc %›j×.Ñ.Ó0×7Ñ7¸Õ@ÐWˆNÐWØ×ÑÔ!Ø�‰G�L‰LŒNØ×Ñ˜^¨T°!©WÕ5ñ	6ùò Xs   Á;/C'c                óZ  — t         j                  } |«       }|j                  d«       | j                  t	        |j
                  «      d«       | j                  t        |j
                  d   |j                  «      «       | j                  |j
                  d   j                  d«       | j                  |j
                  d   j                  d «       | j                  t        |j
                  d   «      d«        |«       }|j                  d«       | j                  t	        |j
                  «      d«       | j                  t        |j
                  d   |j                  «      «       | j                  |j
                  d   j                  d«       | j                  t        |j
                  d   «      d«        |«       }|j                  d«       | j                  t	        |j
                  «      d«       | j                  t        |j
                  d   |j                  «      «       | j                  |j
                  d   j                  d«       | j                  t        |j
                  d   «      d	«        |«       }|j                  d
«       | j                  t	        |j
                  «      d«       | j                  t        |j
                  d   |j                  «      «       | j                  |j
                  d   j                  d«       | j                  t        |j
                  d   j                  |j                  «      «       | j                  |j
                  d   j                  j                  d«       | j                  |j
                  d   j                  j                  d«       | j                  |j
                  d   j                  d«       | j                  t        |j
                  d   «      d«        |«       }|j                  d«       | j                  t	        |j
                  «      d«       | j                  t        |j
                  d   |j                  «      «       | j                  |j
                  d   j                  d«       | j                  t        |j
                  d   j                  |j                  «      «       | j                  |j
                  d   j                  j                  d«       | j                  |j
                  d   j                  j                  d«       | j                  |j
                  d   j                  d«       | j                  t        |j
                  d   «      d«        |«       }|j                  d«       | j                  t	        |j
                  «      d«       | j                  t        |j
                  d   |j                  «      «       | j                  |j
                  d   j                  d«       | j                  t        |j
                  d   j                  |j                  «      «       | j                  |j
                  d   j                  j                  d«       | j                  |j
                  d   j                  j                  g d¢«       | j                  |j
                  d   j                  d«       | j                  t!        |j
                  d   «      d«        |«       }|j                  d«       | j                  t	        |j
                  «      d«       | j                  t        |j
                  d   |j                  «      «       | j                  |j
                  d   j                  d«       | j                  t        |j
                  d   j                  |j                  «      «       | j                  |j
                  d   j                  j                  d«       | j                  |j
                  d   j                  j                  g d¢«       | j                  |j
                  d   j                  d«       | j                  t!        |j
                  d   «      d«        |«       }|j                  d«       | j                  t	        |j
                  «      d«       | j                  t        |j
                  d   |j                  «      «       | j                  |j
                  d   j                  d«       | j                  t        |j
                  d   j                  |j                  «      «       | j                  |j
                  d   j                  j                  d«       | j                  |j
                  d   j                  j                  g d¢«       | j                  |j
                  d   j                  d«       | j                  t!        |j
                  d   «      d«        |«       }|j                  d«       | j                  t	        |j
                  «      d«       | j                  t        |j
                  d   |j                  «      «       | j                  |j
                  d   j                  d«       | j                  t        |j
                  d   j"                  |j$                  «      «       | j                  |j
                  d   j&                  d«       | j                  |j
                  d   j(                  d«       | j                  |j
                  d   j*                  d«       | j                  |j
                  d   j                  d«       | j                  t!        |j
                  d   «      d«        |«       }|j                  d«       | j                  t	        |j
                  «      d«       | j                  t        |j
                  d   |j                  «      «       | j                  |j
                  d   j                  d«       | j                  t        |j
                  d   j                  |j                  «      «       | j                  |j
                  d   j&                  d«       | j                  |j
                  d   j                  j                  ddg«       | j                  |j
                  d   j(                  d«       | j                  |j
                  d   j*                  d«       | j                  |j
                  d   j                  d«       | j                  t!        |j
                  d   «      d«       y )Nr“  rÅ   r   FÚBODYr�  Ts   BODY[]zBODY[]s   BODY[HEADER]r1   zBODY[HEADER]s   BODY.PEEK[HEADER]s+   BODY[HEADER.FIELDS (Subject Cc Message-Id)])s   SUBJECTs   CCó
   MESSAGE-IDs0   BODY.PEEK[HEADER.FIELDS (Subject Cc Message-Id)]s4   BODY.PEEK[HEADER.FIELDS.NOT (Subject Cc Message-Id)]s/   BODY[HEADER.FIELDS.NOT (Subject Cc Message-Id)]s   BODY[1.MIME]<10.50>©r   rö   é2   s?   BODY.PEEK[1.3.9.11.HEADER.FIELDS.NOT (Message-Id Date)]<103.69>)r   rÉ   rÍ   rö   rÃ  s   DATEég   éE   s:   BODY[1.3.9.11.HEADER.FIELDS.NOT (Message-Id Date)]<103.69>)r   r¯  r°  rB   rÐ   r2   rV  r±  ÚBodyÚpeekÚheaderrå   ÚemptyÚHeaderÚnegateÚfieldsrL   ÚmimeÚMIMEÚpartÚpartialBeginÚpartialLength)rE   ÚPr•   s      r4   Útest_fetchParserBodyz%IMAP4HelperTests.test_fetchParserBody  s›	  € Ü×Ñˆá‹CˆØ	�‰�gÔØ×Ñœ˜QŸX™X›¨Ô*Ø�‰œ
 1§8¡8¨A¡;°·±Ó7Ô8Ø×Ñ˜Ÿ™ !™×)Ñ)¨5Ô1Ø×Ñ˜Ÿ™ !™×+Ñ+¨TÔ2Ø×Ñœ˜QŸX™X a™[Ó)¨6Ô2á‹CˆØ	�‰�lÔ#Ø×Ñœ˜QŸX™X›¨Ô*Ø�‰œ
 1§8¡8¨A¡;°·±Ó7Ô8Ø×Ñ˜Ÿ™ !™×)Ñ)¨4Ô0Ø×Ñœ˜QŸX™X a™[Ó)¨6Ô2á‹CˆØ	�‰�iÔ Ø×Ñœ˜QŸX™X›¨Ô*Ø�‰œ
 1§8¡8¨A¡;°·±Ó7Ô8Ø×Ñ˜Ÿ™ !™×*Ñ*¨DÔ1Ø×Ñœ˜QŸX™X a™[Ó)¨8Ô4á‹CˆØ	�‰�oÔ&Ø×Ñœ˜QŸX™X›¨Ô*Ø�‰œ
 1§8¡8¨A¡;°·±Ó7Ô8Ø×Ñ˜Ÿ™ !™×)Ñ)¨5Ô1Ø�‰œ
 1§8¡8¨A¡;×#5Ñ#5°q·x±xÓ@ÔAØ×Ñ˜Ÿ™ !™×+Ñ+×2Ñ2°DÔ9Ø×Ñ˜Ÿ™ !™×+Ñ+×2Ñ2°BÔ7Ø×Ñ˜Ÿ™ !™×*Ñ*¨EÔ2Ø×Ñœ˜QŸX™X a™[Ó)¨>Ô:á‹CˆØ	�‰Ð*Ô+Ø×Ñœ˜QŸX™X›¨Ô*Ø�‰œ
 1§8¡8¨A¡;°·±Ó7Ô8Ø×Ñ˜Ÿ™ !™×)Ñ)¨4Ô0Ø�‰œ
 1§8¡8¨A¡;×#5Ñ#5°q·x±xÓ@ÔAØ×Ñ˜Ÿ™ !™×+Ñ+×2Ñ2°DÔ9Ø×Ñ˜Ÿ™ !™×+Ñ+×2Ñ2°BÔ7Ø×Ñ˜Ÿ™ !™×*Ñ*¨EÔ2Ø×Ñœ˜QŸX™X a™[Ó)¨>Ô:á‹CˆØ	�‰ÐDÔEØ×Ñœ˜QŸX™X›¨Ô*Ø�‰œ
 1§8¡8¨A¡;°·±Ó7Ô8Ø×Ñ˜Ÿ™ !™×)Ñ)¨5Ô1Ø�‰œ
 1§8¡8¨A¡;×#5Ñ#5°q·x±xÓ@ÔAØ×Ñ˜Ÿ™ !™×+Ñ+×2Ñ2°EÔ:Ø×Ñ˜Ÿ™ !™×+Ñ+×2Ñ2Ò4VÔWØ×Ñ˜Ÿ™ !™×*Ñ*¨EÔ2Ø×ÑÜ�!—(‘(˜1‘+ÓÐ Nô	
ñ ‹CˆØ	�‰ÐIÔJØ×Ñœ˜QŸX™X›¨Ô*Ø�‰œ
 1§8¡8¨A¡;°·±Ó7Ô8Ø×Ñ˜Ÿ™ !™×)Ñ)¨4Ô0Ø�‰œ
 1§8¡8¨A¡;×#5Ñ#5°q·x±xÓ@ÔAØ×Ñ˜Ÿ™ !™×+Ñ+×2Ñ2°EÔ:Ø×Ñ˜Ÿ™ !™×+Ñ+×2Ñ2Ò4VÔWØ×Ñ˜Ÿ™ !™×*Ñ*¨EÔ2Ø×ÑÜ�!—(‘(˜1‘+ÓÐ Nô	
ñ ‹CˆØ	�‰ÐMÔNØ×Ñœ˜QŸX™X›¨Ô*Ø�‰œ
 1§8¡8¨A¡;°·±Ó7Ô8Ø×Ñ˜Ÿ™ !™×)Ñ)¨4Ô0Ø�‰œ
 1§8¡8¨A¡;×#5Ñ#5°q·x±xÓ@ÔAØ×Ñ˜Ÿ™ !™×+Ñ+×2Ñ2°DÔ9Ø×Ñ˜Ÿ™ !™×+Ñ+×2Ñ2Ò4VÔWØ×Ñ˜Ÿ™ !™×*Ñ*¨EÔ2Ø×ÑÜ�!—(‘(˜1‘+ÓÐ Rô	
ñ ‹CˆØ	�‰Ð,Ô-Ø×Ñœ˜QŸX™X›¨Ô*Ø�‰œ
 1§8¡8¨A¡;°·±Ó7Ô8Ø×Ñ˜Ÿ™ !™×)Ñ)¨5Ô1Ø�‰œ
 1§8¡8¨A¡;×#3Ñ#3°Q·V±VÓ<Ô=Ø×Ñ˜Ÿ™ !™×)Ñ)¨4Ô0Ø×Ñ˜Ÿ™ !™×1Ñ1°2Ô6Ø×Ñ˜Ÿ™ !™×2Ñ2°BÔ7Ø×Ñ˜Ÿ™ !™×*Ñ*¨EÔ2Ø×Ñœ˜qŸx™x¨™{Ó+Ð-CÔDá‹CˆØ	�‰ØNô	
ð 	×Ñœ˜QŸX™X›¨Ô*Ø�‰œ
 1§8¡8¨A¡;°·±Ó7Ô8Ø×Ñ˜Ÿ™ !™×)Ñ)¨4Ô0Ø�‰œ
 1§8¡8¨A¡;×#5Ñ#5°q·x±xÓ@ÔAØ×Ñ˜Ÿ™ !™×)Ñ)¨=Ô9Ø×Ñ˜Ÿ™ !™×+Ñ+×2Ñ2°]ÀGÐ4LÔMØ×Ñ˜Ÿ™ !™×1Ñ1°3Ô7Ø×Ñ˜Ÿ™ !™×2Ñ2°BÔ7Ø×Ñ˜Ÿ™ !™×*Ñ*¨EÔ2Ø×ÑÜ�!—(‘(˜1‘+ÓØIõ	
r6   c                óò  — t        j                  «       }|j                  d«       | j                  t	        |j
                  «      d«       | j                  |j
                  d   j                  d«       | j                  |j
                  d   |j                  «       | j                  |j
                  d   j                  |j                  «       | j                  t        |j
                  d   «      d«       y)z›
        Parsing a C{BODY} whose C{HEADER} values require quoting
        results in a object that perserves that quoting when
        serialized.
        s   BODY[HEADER.FIELDS ((Quoted)]rÅ   r   Fs   BODY[HEADER.FIELDS ("(Quoted")]N)r   r¯  r°  rB   rÐ   r2   rÉ  ÚassertIsInstancerÈ  rÊ  rÌ  rL   ©rE   r•   s     r4   Útest_fetchParserQuotedHeaderz-IMAP4HelperTests.test_fetchParserQuotedHeaderŒ  s±   € ô ×ÑÓ ˆØ	�‰Ð6Ô7Ø×Ñœ˜QŸX™X›¨Ô*Ø×Ñ˜Ÿ™ !™×)Ñ)¨5Ô1Ø×Ñ˜aŸh™h q™k¨1¯6©6Ô2Ø×Ñ˜aŸh™h q™k×0Ñ0°!·(±(Ô;Ø×Ñœ˜qŸx™x¨™{Ó+Ð-OÕPr6   c                ó–   — t        j                  «       }|j                  d«       | j                  t	        |j
                  «      «       y)z=
        Parsing an empty string results in no data.
        r6   N)r   r¯  r°  rT  rÐ   r2   rØ  s     r4   Útest_fetchParserEmptyStringz,IMAP4HelperTests.test_fetchParserEmptyStringš  s4   € ô ×ÑÓ ˆØ	�‰�cÔØ×Ñœ˜QŸX™X›Õ'r6   c                ón   — t        j                  «       }| j                  t        |j                  d«       y)z\
        Parsing a string with an unknown attribute raises an
        L{Exception}.
        s   UNKNOWNN©r   r¯  r×   Ú	Exceptionr°  rØ  s     r4   Ú test_fetchParserUnknownAttributez1IMAP4HelperTests.test_fetchParserUnknownAttribute¢  s(   € ô
 ×ÑÓ ˆØ×Ñœ) Q§]¡]°JÕ?r6   c                ón   — t        j                  «       }| j                  t        |j                  d«       y)zf
        Parsing a string that prematurely ends in whitespace raises an
        L{Exception}.
        s   BODY[HEADER.FIELDS  NrÝ  rØ  s     r4   Ú0test_fetchParserIncompleteStringEndsInWhitespacezAIMAP4HelperTests.test_fetchParserIncompleteStringEndsInWhitespaceª  ó)   € ô
 ×ÑÓ ˆØ×Ñœ) Q§]¡]Ð4KÕLr6   c                ón   — t        j                  «       }| j                  t        |j                  d«       y)z
        Parsing a string that contains an unexpected character rather
        than whitespace raises an L{Exception}.
        s   BODY[HEADER.FIELDS!]NrÝ  rØ  s     r4   Ú"test_fetchParserExpectedWhitespacez3IMAP4HelperTests.test_fetchParserExpectedWhitespace²  râ  r6   c                óò  — t        j                  «       }|j                  d«       | j                  t	        |j
                  «      d«       | j                  |j
                  d   |j                  «       | j                  |j
                  d   j                  d«       | j                  |j
                  d   j                  |j                  «       | j                  t        |j
                  d   «      d«       y)z:
        A C{BODY} can contain a C{TEXT} section.
        s
   BODY[TEXT]rÅ   r   FN)r   r¯  r°  rB   rÐ   r2   r×  rÈ  rÉ  rF   ÚTextrL   rØ  s     r4   Útest_fetchParserTextSectionz,IMAP4HelperTests.test_fetchParserTextSectionº  s¯   € ô ×ÑÓ ˆØ	�‰�mÔ$Ø×Ñœ˜QŸX™X›¨Ô*Ø×Ñ˜aŸh™h q™k¨1¯6©6Ô2Ø×Ñ˜Ÿ™ !™×)Ñ)¨5Ô1Ø×Ñ˜aŸh™h q™k×.Ñ.°·±Ô7Ø×Ñœ˜qŸx™x¨™{Ó+¨]Õ;r6   c                ón   — t        j                  «       }| j                  t        |j                  d«       y)z[
        Parsing a C{BODY} with an unknown section raises an
        L{Exception}.
        s   BODY[UNKNOWN]NrÝ  rØ  s     r4   Útest_fetchParserUnknownSectionz/IMAP4HelperTests.test_fetchParserUnknownSectionÆ  s)   € ô
 ×ÑÓ ˆØ×Ñœ) Q§]¡]Ð4DÕEr6   c                óØ   — t        j                  «       }| j                  t        |j                  d«       t        j                  «       }| j                  t        |j                  d«       y)ze
        Parsing a C{BODY} with an unterminated section list raises an
        L{Exception}.
        s   BODY[HEADERs   BODY[HEADER.FIELDS (SUBJECT)NrÝ  rØ  s     r4   Ú#test_fetchParserMissingSectionClosez4IMAP4HelperTests.test_fetchParserMissingSectionCloseÎ  sM   € ô
 ×ÑÓ ˆØ×Ñœ) Q§]¡]°NÔCÜ×ÑÓ ˆØ×Ñœ) Q§]¡]Ð4SÕTr6   c                óØ   — t        j                  «       }| j                  t        |j                  d«       t        j                  «       }| j                  t        |j                  d«       y)z½
        Parsing a C{BODY} whose C{HEADER.FIELDS} list does not begin
        with an open parenthesis (C{(}) or end with a close
        parenthesis (C{)}) raises an L{Exception}.
        s   BODY[HEADER.FIELDS Missing)]s   BODY[HEADER.FIELDS (Missing]NrÝ  rØ  s     r4   Ú(test_fetchParserHeaderMissingParenthesesz9IMAP4HelperTests.test_fetchParserHeaderMissingParenthesesØ  sN   € ô ×ÑÓ ˆØ×Ñœ) Q§]¡]Ð4SÔTÜ×ÑÓ ˆØ×Ñœ) Q§]¡]Ð4SÕTr6   c                ón   — t        j                  «       }| j                  t        |j                  d«       y)zk
        Parsing a C{BODY} with a range that lacks a period (C{.})
        raises an L{Exception}.
        s   BODY<01>NrÝ  rØ  s     r4   Útest_fetchParserDotlessPartialz/IMAP4HelperTests.test_fetchParserDotlessPartialã  s(   € ô
 ×ÑÓ ˆØ×Ñœ) Q§]¡]°KÕ@r6   c                ón   — t        j                  «       }| j                  t        |j                  d«       y)zŒ
        Parsing a C{BODY} with a partial range that's missing its
        closing greater than sign (C{>}) raises an L{EXCEPTION}.
        s   BODY<0NrÝ  rØ  s     r4   Útest_fetchParserUnclosedPartialz0IMAP4HelperTests.test_fetchParserUnclosedPartialë  s(   € ô
 ×ÑÓ ˆØ×Ñœ) Q§]¡]°IÕ>r6   c                ót   — dddt        d«      ddg}d}| j                  t        j                  |«      |«       y )NrH  rI  Úbazó   this is a file
ÚbuzÚbizs4   "foo" "bar" "baz" {16}
this is a file
 "buz" "biz")r   rB   r   ÚcollapseNestedLists)rE   ÚinputStructurer^   s      r4   Ú
test_fileszIMAP4HelperTests.test_filesó  sD   € àØØÜÐ)Ó*ØØð
ˆð Mˆà×Ñœ×2Ñ2°>ÓBÀFÕKr6   c                óÂ   — dt        j                  d«      dt        d«      dt        j                  d«      dg}d}| j                  t        j                  |«      |«       y )	Nrq  rr  s   bazrô  s   this is
quoteds   buzr6   sC   "foo" bar "baz" {16}
this is a file
 {15}
this is
quoted buz "")r   ÚDontQuoteMer   rB   r÷  rc   s      r4   Útest_quoteAvoiderz"IMAP4HelperTests.test_quoteAvoider  sa   € àÜ×Ñ˜fÓ%ØÜÐ)Ó*Ø Ü×Ñ˜fÓ%Øð
ˆðð 	ð 	×Ñœ×2Ñ2°5Ó9¸6ÕBr6   c                óp   — ddggfg}|D ]*  \  }}| j                  t        j                  |«      |«       Œ, y )Ns   ({10}
0123456789)s
   0123456789)rB   r   r�  )rE   rX  r}  rh  s       r4   Útest_literalszIMAP4HelperTests.test_literals  sH   € à$¨ Ð&7Ð8ð
ˆð $ò 	F‰NˆD�(Ø×ÑœU×4Ñ4°TÓ:¸HÕEñ	Fr6   c                óš  — t        j                  d¬«      t        j                  ddd¬«      t        j                  t        j                  d¬«      t        j                  d¬«      «      t        j                  d¬«      t        j                  t        j                  d¬«      t        j                  d¬«      t        j                  d¬«      «      t        j                  t        j                  t        j                  t        j                  dd	d
¬«      t        j                  ddd¬«      t        j                  dddd¬«      t        j                  t        j                  d¬«      «      «      «      t        j                  t        j                  d¬«      «      «      g}g d¢}t	        ||«      D ]  \  }}| j                  ||«       Œ y )NrÅ   )Úflagged)rf  Ú	unflaggedÚdeleted)r  Útoday)Úbefore)Úunseen)ÚnewÚ	yesterdayiè  )rf  ÚsinceÚsmallerÚtuesdayi'  )rf  r  Úlarger)rf  r  r  r  Úspam)rŒ   z1:5©rª  )ÚFLAGGEDz(DELETED UNFLAGGED)z(OR FLAGGED DELETED)z(BEFORE "today")z(OR DELETED (OR UNSEEN NEW))z¡(OR (NOT (OR (SINCE "yesterday" SMALLER 1000) (OR (BEFORE "tuesday" LARGER 10000) (OR (BEFORE "today" DELETED UNSEEN) (NOT (SUBJECT "spam")))))) (NOT (UID 1:5))))r   ÚQueryÚOrÚNoträ   rB   )rE   rç   rè   Úqueryrh  s        r4   Útest_queryBuilderz"IMAP4HelperTests.test_queryBuilder  s2  € ä�K‰K Ô"Ü�K‰K˜q¨A°qÔ9Ü�H‰H”U—[‘[¨Ô+¬U¯[©[ÀÔ-CÓDÜ�K‰K˜wÔ'Ü�H‰H”U—[‘[¨Ô+¬U¯[©[ÀÔ-BÄEÇKÁKÐTUÔDVÓWÜ�H‰HÜ—	‘	Ü—H‘HÜŸ™¨1°KÈÔNÜŸ™¨1°YÀuÔMÜŸ™¨1°QÀÈ'ÔRÜŸ	™	¤%§+¡+°fÔ"=Ó>ó	óô —	‘	œ%Ÿ+™+¨%Ô0Ó1ó
ð
ˆò&

ˆô  # 6¨7Ó3ò 	.‰OˆE�8Ø×Ñ˜U HÕ-ñ	.r6   c                óT   — t        j                  d¬«      }| j                  d|«       y)zê
        When passed the C{keyword} argument, L{imap4.Query} returns an unquoted
        string.

        @see: U{http://tools.ietf.org/html/rfc3501#section-9}
        @see: U{http://tools.ietf.org/html/rfc3501#section-6.4.4}
        Útwisted)Úkeywordz(KEYWORD twisted)N©r   r  rB   ©rE   r  s     r4   Útest_queryKeywordFlagWithQuotesz0IMAP4HelperTests.test_queryKeywordFlagWithQuotes@  s#   € ô —‘ IÔ.ˆØ×ÑÐ,¨eÕ4r6   c                óT   — t        j                  d¬«      }| j                  d|«       y)zì
        When passed the C{unkeyword} argument, L{imap4.Query} returns an
        unquoted string.

        @see: U{http://tools.ietf.org/html/rfc3501#section-9}
        @see: U{http://tools.ietf.org/html/rfc3501#section-6.4.4}
        r  )Ú	unkeywordz(UNKEYWORD twisted)Nr  r  s     r4   Ú!test_queryUnkeywordFlagWithQuotesz2IMAP4HelperTests.test_queryUnkeywordFlagWithQuotesK  s#   € ô —‘ iÔ0ˆØ×ÑÐ.°Õ6r6   c                ó|   — t        j                  t        j                  dd«      ¬«      }| j                  |d«       y)zŽ
        When passed a L{MessageSet}, L{imap4.Query} returns a query
        containing a quoted string representing the ID sequence.
        rÅ   N©Úmessagesz(MESSAGES "1:*"))r   r  r   rB   r  s     r4   Útest_queryWithMesssageSetz*IMAP4HelperTests.test_queryWithMesssageSetV  s0   € ô
 —‘¤U×%5Ñ%5°a¸Ó%>Ô?ˆØ×Ñ˜Ð 2Õ3r6   c                óT   — t        j                  d¬«      }| j                  |d«       y)zl
        When passed an L{int}, L{imap4.Query} returns a query
        containing a quoted integer.
        rÅ   r  z(MESSAGES "1")Nr  r  s     r4   Útest_queryWithIntegerz&IMAP4HelperTests.test_queryWithInteger^  s#   € ô
 —‘ QÔ'ˆØ×Ñ˜Ð 0Õ1r6   c                óŠ   — | j                  t        j                  t        j                  t        j                  d¬«      «       y)zq
        An L{imap4.Or} query with less than two arguments raises an
        L{imap4.IllegalQueryError}.
        rÅ   r  N)r×   r   ÚIllegalQueryErrorr  r  rR   s    r4   Útest_queryOrIllegalQueryz)IMAP4HelperTests.test_queryOrIllegalQueryf  s*   € ð
 	×Ñœ%×1Ñ1´5·8±8¼U¿[¹[ÐRSÔ=TÕUr6   c                ó.  — | j                  d|j                  «       › d�t        j                  d
i |di¤Ž«       | j                  d|j                  «       › d�t        j                  d
i |ddj	                  d„ t        d«      D «       «      ›d�i¤Ž«       y	)zÞ
        Helper to implement tests for value filtering of KEYWORD and UNKEYWORD
        queries.

        @param keyword: A native string giving the name of the L{imap4.Query}
            keyword argument to test.
        ú(z twistedrocks)ztwisted (){%*"\] rocksztwisted Ú c              3  ó2   K  — | ]  }t        |«      –— Œ y ­wr0   )ro   )r,  Úchs     r4   r-  z9IMAP4HelperTests._keywordFilteringTest.<locals>.<genexpr>�  s   è ø€ Ò;¨2œs 2ŸwÑ;ùr.  é!   z rocksNr1   )rB   Úupperr   r  r’   rn   )rE   r  s     r4   Ú_keywordFilteringTestz&IMAP4HelperTests._keywordFilteringTestm  s‘   € ð 	×ÑØ�—‘“Ð  Ð/Ü�K‰KÑ?˜7Ð$=Ð>Ñ?ô	
ð 	×ÑØ�—‘“Ð  Ð/Ü�K‰Kñ áØ—w‘wÑ;´°r³Ô;Õ;ð>ðñõ	
r6   c                ó&   — | j                  d«       y)aâ  
        When passed the C{keyword} argument, L{imap4.Query} returns an
        C{atom} that consists of one or more non-special characters.

        List of the invalid characters:

            ( ) { % * " \ ] CTL SP

        @see: U{ABNF definition of CTL and SP<https://tools.ietf.org/html/rfc2234>}
        @see: U{IMAP4 grammar<http://tools.ietf.org/html/rfc3501#section-9>}
        @see: U{IMAP4 SEARCH specification<http://tools.ietf.org/html/rfc3501#section-6.4.4>}
        r  N©r-  rR   s    r4   Útest_queryKeywordFlagz&IMAP4HelperTests.test_queryKeywordFlag†  s   € ð 	×"Ñ" 9Õ-r6   c                ó&   — | j                  d«       y)aä  
        When passed the C{unkeyword} argument, L{imap4.Query} returns an
        C{atom} that consists of one or more non-special characters.

        List of the invalid characters:

            ( ) { % * " \ ] CTL SP

        @see: U{ABNF definition of CTL and SP<https://tools.ietf.org/html/rfc2234>}
        @see: U{IMAP4 grammar<http://tools.ietf.org/html/rfc3501#section-9>}
        @see: U{IMAP4 SEARCH specification<http://tools.ietf.org/html/rfc3501#section-6.4.4>}
        r  Nr/  rR   s    r4   Útest_queryUnkeywordFlagz(IMAP4HelperTests.test_queryUnkeywordFlag•  s   € ð 	×"Ñ" ;Õ/r6   c                óz   — g d¢}|D ]2  }| j                  t        j                  t        j                  |d«       Œ4 y)z|
        Trying to parse an invalid representation of a sequence range raises an
        L{IllegalIdentifierError}.
        )s   *:*rq  s   4:s   bar:5é90  N©r×   r   ÚIllegalIdentifierErrorrã   ©rE   rç   rd   s      r4   Útest_invalidIdListParserz)IMAP4HelperTests.test_invalidIdListParser¤  s;   € ò
 3ˆàò 	ˆEØ×ÑÜ×,Ñ,¬e×.?Ñ.?ÀÈõñ	r6   c                óz   — g d¢}|D ]2  }| j                  t        j                  t        j                  |d«       Œ4 y)zó
        Zeroes and negative values are not accepted in id range expressions. RFC
        3501 states that sequence numbers and sequence ranges consist of
        non-negative numbers (RFC 3501 section 9, the seq-number grammar item).
        )s   0:5s   0:0s   *:0ó   0s   -3:5s   1:-2s   -1r4  Nr5  r7  s      r4   Ú#test_invalidIdListParserNonPositivez4IMAP4HelperTests.test_invalidIdListParserNonPositive°  s<   € ò Iˆàò 	ˆEØ×ÑÜ×,Ñ,¬e×.?Ñ.?ÀÈõñ	r6   c                ó˜  — g d¢}t        dd«      t        dd«      t        dd«      t        dd«      z   t        dd«      t        d«      t        dd«      t        d«      t        d«      z   t        d«      z   t        dd«      t        dd«      t        dd«      t        dd	«      z   t        d«      t        dd«      z   t        d«      t        dd«      z   t        d
d	«      z   t        dd«      t        d
«      z   t        d	d«      z   t        dd«      g}g d¢}t        ||«      D ]*  \  }}| j                  t        j                  |«      |«       Œ, t        ||«      D ]p  \  }}|€/| j                  t        t        t        j                  |«      «       Œ7t        t        j                  |«      «      }| j                  ||d|›d|›d|›�«       Œr y)zi
        The function to parse sequence ranges yields appropriate L{MessageSet}
        objects.
        )rß   s   5:*s   1:2,5:*rÞ   ó   1s   1,2s   1,3,5s   1:10s   1:10,11s	   1:5,10:20s   1,5:10s   1,5:10,15:20s   1:10,15,20:25ó   4:2rÅ   NrÊ   rÉ   rÇ   rö   é   é   r'  é   rË   )NNNrÅ   rÅ   rÉ   rÇ   rö   r?  é   rÎ   é   é   rÇ   zlen(z) = z != )r   rä   rB   r   rã   r×   rØ   rÐ   )rE   rç   rè   Úlengthsrd   rh  ÚLs          r4   Útest_parseIdListz!IMAP4HelperTests.test_parseIdList½  s¯  € ò

ˆô$ �q˜$ÓÜ�q˜$ÓÜ�q˜$Ó¤*¨Q°Ó"2Ñ2Ü�t˜TÓ"Ü�q‹MÜ�q˜!ÓÜ�q‹MœJ q›MÑ)¬J°q«MÑ9Ü�q˜"ÓÜ�q˜"ÓÜ�q˜!Óœz¨"¨bÓ1Ñ1Ü�q‹MœJ q¨"Ó-Ñ-Ü�q‹MœJ q¨"Ó-Ñ-´
¸2¸rÓ0BÑBÜ�q˜"Ó¤
¨2£Ñ.´¸BÀÓ1CÑCÜ�q˜!Óð
ˆò" Kˆä" 6¨7Ó3ò 	A‰OˆE�8Ø×ÑœU×.Ñ.¨uÓ5°xÕ@ð	Aô  # 6¨7Ó3ò 	Y‰OˆE�8ØÐØ×!Ñ!¤)¬S´%×2CÑ2CÀEÓ2JÕKäœ×)Ñ)¨%Ó0Ó1�Ø× Ñ   H°°U°I¸TÀ!ÀÀdÈ8È,Ð.WÕXñ	Yr6   c                óN   — | j                  t        t        j                  d«       y)zu
        L{imap4.parseTime} raises L{ValueError} when given a a time
        string whose format is invalid.
        ÚinvalidN©r×   r  r   Ú	parseTimerR   s    r4   Útest_parseTimeInvalidFormatz,IMAP4HelperTests.test_parseTimeInvalidFormatð  s   € ð
 	×Ñœ*¤e§o¡o°yÕAr6   c                ód   — g d¢}|D ]'  }| j                  t        t        j                  |«       Œ) y)zv
        L{imap4.parseTime} raises L{ValueError} when given a time
        string composed of invalid values.
        )zinvalid-July-2017z2-invalid-2017z2-July-invalidNrJ  )rE   ÚinvalidStringsrI  s      r4   Útest_parseTimeInvalidValuesz,IMAP4HelperTests.test_parseTimeInvalidValues÷  s2   € ò

ˆð
 &ò 	DˆGØ×Ñœj¬%¯/©/¸7ÕCñ	Dr6   c                ó   — t        «       }|j                  «       |j                  «       |j                  «       |j	                  «       |j                  «       dœ}t        j                  ||j                  «       «      }| j                  ||«       y)z«
        L{imap4.statusRequestHelper} builds a L{dict} mapping the
        requested status names to values extracted from the provided
        L{IMailboxIMAP}'s.
        )ÚMESSAGESÚRECENTÚUIDNEXTÚUIDVALIDITYÚUNSEENN)
ÚSimpleMailboxÚgetMessageCountÚgetRecentCountÚ
getUIDNextÚgetUIDValidityÚgetUnseenCountr   ÚstatusRequestHelperÚkeysrB   )rE   Úmboxrh  r2   s       r4   Útest_statusRequestHelperz)IMAP4HelperTests.test_statusRequestHelper  sx   € ô ‹ˆð ×,Ñ,Ó.Ø×)Ñ)Ó+Ø—‘Ó(Ø×.Ñ.Ó0Ø×)Ñ)Ó+ñ
ˆô ×*Ñ*¨4°·±³ÓAˆà×Ñ˜ 6Õ*r6   N),rs   rt   ru   r3  r9  r@  r]  r_  ri  r~  r‰  r–  r¶  rÀ  rÕ  rÙ  rÛ  rß  rá  rä  rç  ré  rë  rí  rï  rñ  rù  rü  rþ  r  r  r  r   r"  r%  r-  r0  r2  r8  r;  rG  rL  rO  r_  r1   r6   r4   r5  r5  å  sç   „ ñò>ò)ò03ò46ò4ò&8@òtDò0M,ò^9ò*6ò&r
òhQò(ò@òMòMò
<òFòUò	UòAò?òLòCò(Fò!.òF	5ò	7ò4ò2òVò
ò2.ò0ò
òò1YòfBòDó+r6   r5  c                  ó”   — e Zd ZU dZg Zded<   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d„Zd„ Zd„ Zd„ Zd„ Zd„ Zy)rV  ©z\Flag1ÚFlag2z\AnotherSysFlagÚLastFlagú+list[tuple[bytes, list[bytes], bytes, int]]r  r   rÅ   Fc                ó~   — g | _         | j                   j                  | _        | j                   j                  | _        y r0   ©Ú	listenersr|   ÚaddListenerÚremoveÚremoveListenerrR   s    r4   rz   zSimpleMailbox.__init__!  ó-   € ØˆŒØŸ>™>×0Ñ0ˆÔØ"Ÿn™n×3Ñ3ˆÕr6   c                ó   — | j                   S r0   ©r�  rR   s    r4   ÚgetFlagszSimpleMailbox.getFlags&  ó   € Ø�z‰zÐr6   c                 ó   — y)Né*   r1   rR   s    r4   rZ  zSimpleMailbox.getUIDValidity)  s   € Ør6   c                ó2   — t        | j                  «      dz   S ©NrÅ   ©rÐ   r  rR   s    r4   rY  zSimpleMailbox.getUIDNext,  s   € Ü�4—=‘=Ó! AÑ%Ð%r6   c                 ó   — y)Nr÷   r1   rR   s    r4   rW  zSimpleMailbox.getMessageCount/  ó   € Ør6   c                 ó   — y)NrÇ   r1   rR   s    r4   rX  zSimpleMailbox.getRecentCount2  rv  r6   c                 ó   — y)NrË   r1   rR   s    r4   r[  zSimpleMailbox.getUnseenCount5  rv  r6   c                ó   — | j                   S r0   ©ÚrwrR   s    r4   ÚisWriteablezSimpleMailbox.isWriteable8  s   € Ø�w‰wˆr6   c                 ó   — y r0   r1   rR   s    r4   ÚdestroyzSimpleMailbox.destroy;  ó   € Ør6   c                 ó   — y)NrQ  r1   rR   s    r4   ÚgetHierarchicalDelimiterz&SimpleMailbox.getHierarchicalDelimiter>  s   € Ør6   c                ó  — i }d|v r| j                  «       |d<   d|v r| j                  «       |d<   d|v r| j                  «       dz   |d<   d|v r| j                  «       |d<   d|v r| j                  «       |d<   t	        j
                  |«      S )NrQ  rR  rS  rÅ   rT  rU  ©rW  rX  ÚgetUIDr[  r   r[  ©rE   ÚnamesÚrs      r4   ÚrequestStatuszSimpleMailbox.requestStatusA  s›   € ØˆØ˜ÑØ ×0Ñ0Ó2ˆAˆj‰MØ�uÑØ×-Ñ-Ó/ˆAˆh‰KØ˜ÑØ×/Ñ/Ó1°AÑ5ˆAˆi‰LØ˜EÑ!Ø#Ÿ{™{›}ˆAˆmÑØ�uÑØ×-Ñ-Ó/ˆAˆh‰KÜ�}‰}˜QÓÐr6   Nc                ó¨   — | j                   j                  |||| j                  f«       | xj                  dz  c_        t        j                  d «      S rs  ©r  r|   ÚmUIDr   r[  ©rE   Úmessager�  Údates       r4   Ú
addMessagezSimpleMailbox.addMessageO  s=   € Ø�‰×Ñ˜g u¨d°D·I±IÐ>Ô?Ø�	Š	�Q‰�	Ü�}‰}˜TÓ"Ð"r6   c                óÎ   — g }| j                   D ]  }d|d   v sŒ|j                  |«       Œ |D ]  }| j                   j                  |«       Œ |D �cg c]  }|d   ‘Œ	 c}S c c}w )Nú\DeletedrÅ   rÇ   ©r  r|   ri  ©rE   Údeleteré   s      r4   ÚexpungezSimpleMailbox.expungeT  sm   € ØˆØ—‘ò 	!ˆAØ˜a ™dÒ"Ø—‘˜aÕ ð	!ð ò 	$ˆAØ�M‰M× Ñ  Õ#ð	$à$Ö%˜��!“Ò%Ð%ùÒ%ó   ÁA"c                ó   — d| _         y ©NT)ÚclosedrR   s    r4   ÚclosezSimpleMailbox.close]  s	   € Øˆ�r6   c                 ó   — y r0   r1   ©rE   r  rª  s      r4   ÚfetchzSimpleMailbox.fetch`  ó   € àr6   c                 ó   — y r0   r1   ©rE   r�  s     r4   r„  zSimpleMailbox.getUIDd  rž  r6   c                 ó   — y r0   r1   ©rE   r  r�  Úmoderª  s        r4   ÚstorezSimpleMailbox.storeh  rž  r6   r0   )rs   rt   ru   r�  r  Ú__annotations__r‹  r{  r™  rz   rn  rZ  rY  rW  rX  r[  r|  r~  r�  rˆ  r�  r•  rš  r�  r„  r¤  r1   r6   r4   rV  rV    sv   … à@€EØ<>€HÐ9Ó>Ø€DØ	
€BØ€Fò4ò
òò&òòòòòòò ó#ò
&òòòór6   rV  c                  ó’   — e Zd ZU dZdZg Zded<   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d„Zd„ Zd„ Zd„ Zd„ Zy)ÚUncloseableMailboxz*
    A mailbox that cannot be closed.
    ra  rd  r  r   rÅ   Fc                ó~   — g | _         | j                   j                  | _        | j                   j                  | _        y r0   rf  rR   s    r4   rz   zUncloseableMailbox.__init__y  rk  r6   c                ó   — | j                   S )zB
        The flags

        @return: A sequence of flags.
        rm  rR   s    r4   rn  zUncloseableMailbox.getFlags~  s   € ð �z‰zÐr6   c                 ó   — y)zF
        The UID validity value.

        @return: The value.
        rq  r1   rR   s    r4   rZ  z!UncloseableMailbox.getUIDValidity†  s   € ð r6   c                ó2   — t        | j                  «      dz   S )z:
        The next UID.

        @return: The UID.
        rÅ   rt  rR   s    r4   rY  zUncloseableMailbox.getUIDNextŽ  s   € ô �4—=‘=Ó! AÑ%Ð%r6   c                 ó   — y)zG
        The number of messages.

        @return: The number.
        r÷   r1   rR   s    r4   rW  z"UncloseableMailbox.getMessageCount–  ó   € ð r6   c                 ó   — y)úD
        The recent messages.

        @return: The number.
        rÇ   r1   rR   s    r4   rX  z!UncloseableMailbox.getRecentCountž  r­  r6   c                 ó   — y)r¯  rË   r1   rR   s    r4   r[  z!UncloseableMailbox.getUnseenCount¦  r­  r6   c                ó   — | j                   S )z`
        The recent messages.

        @return: Whether or not the mailbox is writable.
        rz  rR   s    r4   r|  zUncloseableMailbox.isWriteable®  s   € ð �w‰wˆr6   c                 ó   — y)z'
        Destroy this mailbox.
        Nr1   rR   s    r4   r~  zUncloseableMailbox.destroy¶  s   € ð 	r6   c                 ó   — y)zU
        Return the hierarchical delimiter.

        @return: The delimiter.
        rQ  r1   rR   s    r4   r�  z+UncloseableMailbox.getHierarchicalDelimiter¼  s   € ð r6   c                ó  — i }d|v r| j                  «       |d<   d|v r| j                  «       |d<   d|v r| j                  «       dz   |d<   d|v r| j                  «       |d<   d|v r| j                  «       |d<   t	        j
                  |«      S )zŽ
        Return the mailbox's status.

        @param names: The status items to include.

        @return: A L{dict} of status data.
        rQ  rR  rS  rÅ   rT  rU  rƒ  r…  s      r4   rˆ  z UncloseableMailbox.requestStatusÄ  s�   € ð ˆØ˜ÑØ ×0Ñ0Ó2ˆAˆj‰MØ�uÑØ×-Ñ-Ó/ˆAˆh‰KØ˜ÑØ×/Ñ/Ó1°AÑ5ˆAˆi‰LØ˜EÑ!Ø#Ÿ{™{›}ˆAˆmÑØ�uÑØ×-Ñ-Ó/ˆAˆh‰KÜ�}‰}˜QÓÐr6   Nc                ó¨   — | j                   j                  |||| j                  f«       | xj                  dz  c_        t        j                  d«      S )a  
        Add a message to the mailbox.

        @param message: The message body.

        @param flags: The message flags.

        @param date: The message date.

        @return: A L{Deferred} that fires when the message has been
            added.
        rÅ   NrŠ  rŒ  s       r4   r�  zUncloseableMailbox.addMessageÙ  s?   € ð 	�‰×Ñ˜g u¨d°D·I±IÐ>Ô?Ø�	Š	�Q‰�	Ü�}‰}˜TÓ"Ð"r6   c                óÎ   — g }| j                   D ]  }d|d   v sŒ|j                  |«       Œ |D ]  }| j                   j                  |«       Œ |D �cg c]  }|d   ‘Œ	 c}S c c}w )zj
        Delete messages marked for deletion.

        @return: A L{list} of deleted message IDs.
        r‘  rÅ   rÇ   r’  r“  s      r4   r•  zUncloseableMailbox.expungeê  so   € ð ˆØ—‘ò 	!ˆAØ˜a ™dÒ"Ø—‘˜aÕ ð	!ð ò 	$ˆAØ�M‰M× Ñ  Õ#ð	$à$Ö%˜��!“Ò%Ð%ùÒ%r–  c                 ó   — y r0   r1   rœ  s      r4   r�  zUncloseableMailbox.fetchø  rž  r6   c                 ó   — y r0   r1   r   s     r4   r„  zUncloseableMailbox.getUIDü  rž  r6   c                 ó   — y r0   r1   r¢  s        r4   r¤  zUncloseableMailbox.store   rž  r6   r0   )rs   rt   ru   r3  r�  r  r¥  r‹  r{  r™  rz   rn  rZ  rY  rW  rX  r[  r|  r~  r�  rˆ  r�  r•  r�  r„  r¤  r1   r6   r4   r§  r§  m  sy   … ñð A€EØ<>€HÐ9Ó>Ø€DØ	
€BØ€Fò4ò
òò&òòòòòòò ó*#ò"&òòór6   r§  c                  ó"   — e Zd ZdZeZd„ Zdd„Zy)ÚAccountWithoutNamespaceszL
    An in-memory account that does not provide L{INamespacePresenter}.
    c                ó"   — | j                  «       S r0   )ÚmailboxFactory)rE   ÚnameÚids      r4   Ú_emptyMailboxz&AccountWithoutNamespaces._emptyMailbox  s   € Ø×"Ñ"Ó$Ð$r6   c                óX   — t         j                  j                  | |«      }|�||_        |S r0   )r   ÚMemoryAccountÚselectr{  )rE   r¾  r{  r^  s       r4   rÃ  zAccountWithoutNamespaces.select  s,   € Ü×"Ñ"×)Ñ)¨$°Ó5ˆØÐØˆDŒGØˆr6   N©rÅ   )rs   rt   ru   r3  rV  r½  rÀ  rÃ  r1   r6   r4   r»  r»    s   „ ñð #€Nò%ôr6   r»  c                  ó   — e Zd ZdZy)ÚAccountzD
    An in-memory account that provides L{INamespacePresenter}.
    N©rs   rt   ru   r3  r1   r6   r4   rÆ  rÆ    s   „ òr6   rÆ  c                  ó(   — e Zd Z ed«      Zd„ Zd„ Zy)ÚSimpleServeró   testuserc                óü   — t        j                  j                  | g|¢­i |¤Ž t        | ¬«      }t	        |«      }t        «       }|j                  dd«       || _        || _        |j                  |«       d| _
        y )N©ÚaccountHolderrÊ  ó   password-testF)r   ÚIMAP4Serverrz   Ú	TestRealmr   r   ÚaddUserÚcheckerÚportalÚregisterCheckerÚtimeoutTest)rE   ÚargsÚkwÚrealmrÓ  r”   s         r4   rz   zSimpleServer.__init__  sn   € Ü×Ñ×"Ñ" 4Ð5¨$Ò5°"Ò5Ü¨Ô-ˆÜ˜“ˆÜ3Ó5ˆØ	�	‰	�+Ð/Ô0ØˆŒØˆŒØ×Ñ˜qÔ!Ø ˆÕr6   c                ó^   — | j                   ry t        j                  j                  | |«       y r0   )rÕ  r   rÏ  ÚlineReceived©rE   Úlines     r4   rÚ  zSimpleServer.lineReceived*  s$   € Ø×Òàä×Ñ×&Ñ& t¨TÕ2r6   N)rs   rt   ru   rÆ  Ú
theAccountrz   rÚ  r1   r6   r4   rÉ  rÉ    s   „ Ù˜Ó%€Jò	!ó3r6   rÉ  c                  ó,   — e Zd Zdd„Zd„ Zd„ Zd„ Zd„ Zy)ÚSimpleClientNc                ó`   — t         j                  j                  | |«       || _        g | _        y r0   )r   ÚIMAP4Clientrz   ÚdeferredÚevents)rE   râ  ÚcontextFactorys      r4   rz   zSimpleClient.__init__3  s&   € Ü×Ñ×"Ñ" 4¨Ô8Ø ˆŒØˆ�r6   c                ó:   — | j                   j                  d «       y r0   )râ  Úcallback)rE   Úcapss     r4   ÚserverGreetingzSimpleClient.serverGreeting8  s   € Ø�‰×Ñ˜tÕ$r6   c                ór   — | j                   j                  d|g«       | j                  j                  «        y )NÚmodeChanged©rã  r|   Ú	transportÚloseConnection)rE   Ú	writeables     r4   rê  zSimpleClient.modeChanged;  s)   € Ø�‰×Ñ˜M¨9Ð5Ô6Ø�‰×%Ñ%Õ'r6   c                ór   — | j                   j                  d|g«       | j                  j                  «        y )NÚflagsChangedrë  ©rE   ÚnewFlagss     r4   rð  zSimpleClient.flagsChanged?  s)   € Ø�‰×Ñ˜N¨HÐ5Ô6Ø�‰×%Ñ%Õ'r6   c                ót   — | j                   j                  d||g«       | j                  j                  «        y )NÚnewMessagesrë  )rE   ÚexistsÚrecents      r4   rô  zSimpleClient.newMessagesC  s+   € Ø�‰×Ñ˜M¨6°6Ð:Ô;Ø�‰×%Ñ%Õ'r6   r0   )rs   rt   ru   rz   rè  rê  rð  rô  r1   r6   r4   rß  rß  2  s   „ óò
%ò(ò(ó(r6   rß  c                  óN   — e Zd ZU dZded<   dZded<   d„ Zd„ Zd„ Zd	„ Z	d
„ Z
d„ Zy)ÚIMAP4HelperMixinNzOptional[ServerTLSContext]Ú	serverCTXzOptional[ClientTLSContext]Ú	clientCTXc                ó   — t        j                  «       }t        | j                  ¬«      | _        t        || j                  ¬«      | _        || _        g t        _
        t        d«      }t        |_        |t        _        y )N©rä  rÊ  )r   r   rÉ  rù  Úserverrß  rú  ÚclientÚ	connectedrV  r  rÆ  ÚmboxTyperÝ  )rE   rž   rÝ  s      r4   ÚsetUpzIMAP4HelperMixin.setUpL  sY   € Ü�N‰NÓˆÜ"°$·.±.ÔAˆŒÜ" 1°T·^±^ÔDˆŒØˆŒà!#ŒÔÜ˜[Ó)ˆ
Ü+ˆ
ÔØ",ŒÕr6   c                ó   — | ` | `| `y r0   )rý  rþ  rÿ  rR   s    r4   ÚtearDownzIMAP4HelperMixin.tearDownW  s   € ØˆKØˆKØ‰Nr6   c                óL   — | j                   j                  j                  «        y r0   )rþ  rì  rí  )rE   Úignores     r4   Ú_cbStopClientzIMAP4HelperMixin._cbStopClient\  s   € Ø�‰×Ñ×,Ñ,Õ.r6   c                óØ   — | j                   j                  j                  «        | j                  j                  j                  «        t	        j
                  |dt        | «      z   «       y )NúProblem with )rþ  rì  rí  rý  r%   Úerrrå   )rE   r$   s     r4   Ú
_ebGeneralzIMAP4HelperMixin._ebGeneral_  sE   € Ø�‰×Ñ×,Ñ,Ô.Ø�‰×Ñ×,Ñ,Ô.Ü�‰�˜¬3¨t«9Ñ4Õ5r6   c                óV   — t        j                  | j                  | j                  «      S r0   )r#   ÚloopbackAsyncrý  rþ  rR   s    r4   r#   zIMAP4HelperMixin.loopbackd  s   € Ü×%Ñ% d§k¡k°4·;±;Ó?Ð?r6   c                ó¨   —  |j                   t        j                  «       t        |j                  «      }t        |«      }| j                  ||«       y)a.  
        Assert that the provided failure is an L{IMAP4Exception} with
        the given message.

        @param failure: A failure whose value L{IMAP4Exception}
        @type failure: L{failure.Failure}

        @param expected: The expected failure message.
        @type expected: L{bytes}
        N)Útrapr   ÚIMAP4Exceptionrå   ÚvaluerÛ   rB   )rE   r$   rh  r�  s       r4   ÚassertClientFailureMessagez+IMAP4HelperMixin.assertClientFailureMessageg  s?   € ð 	ˆ�‰”U×)Ñ)Ô*Ü�g—m‘mÓ$ˆÜ˜“>ˆà×Ñ˜ (Õ+r6   )rs   rt   ru   rù  r¥  rú  r  r  r  r
  r#   r  r1   r6   r4   rø  rø  H  s7   … Ø,0€IÐ)Ó0Ø,0€IÐ)Ó0ò	-òò
/ò6ò
@ó,r6   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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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.d-„ Z/d.„ Z0d/„ Z1d0„ Z2d1„ Z3d2„ Z4d3„ Z5y4)5ÚIMAP4ServerTestsc                ó  ‡ ‡‡— i Šˆˆ fd„}‰ j                   j                  t        |«      «      j                  ‰ j                  «      }t        j                  ‰ j                  «       |g«      }d d d dœŠ|j                  ˆˆˆ fd„«      S )Nc                 ób   •— ˆˆfd„} ‰j                   j                  «       j                  | «      S )Nc                óp   •— ‰j                  | «       ‰j                  j                  j                  «        y r0   ©Úupdaterý  rì  rí  ©r”   rç  rE   s    €€r4   ÚgotCapszAIMAP4ServerTests.testCapability.<locals>.getCaps.<locals>.gotCaps~  ó$   ø€ Ø—‘˜A”Ø—‘×%Ñ%×4Ñ4Õ6r6   ©rþ  ÚgetCapabilitiesr›   ©r  rç  rE   s    €€r4   ÚgetCapsz0IMAP4ServerTests.testCapability.<locals>.getCaps}  ó(   ø€ õ7ð —;‘;×.Ñ.Ó0×<Ñ<¸WÓEÐEr6   )ó	   IMAP4rev1ó	   NAMESPACEó   IDLEc                ó(   •— ‰j                  ‰‰«      S r0   ©rB   )Ú_rç  rh  rE   s    €€€r4   r5   z1IMAP4ServerTests.testCapability.<locals>.<lambda>‡  s   ø€  t×'7Ñ'7¸À$Ó'G€ r6   )rÿ  r›   r7   Ú
addErrbackr
  r   ÚgatherResultsr#   )rE   r  Úd1rž   rç  rh  s   `   @@r4   ÚtestCapabilityzIMAP4ServerTests.testCapabilityz  sn   ú€ Øˆõ	Fð �^‰^×'Ñ'¬¨g«Ó7×BÑBÀ4Ç?Á?ÓSˆÜ×Ñ §¡£°"Ð 5Ó6ˆØ"&°dÀTÑJˆØ�}‰}ÕGÓHÐHr6   c                óR  ‡ ‡‡— i Št         ‰ j                  j                  d<   ˆˆ fd„}‰ j                  j	                  t        |«      «      j                  ‰ j                  «      }t        j                  ‰ j                  «       |g«      }d d d dgdœŠ|j	                  ˆˆˆ fd„«      S )Nó   CRAM-MD5c                 ób   •— ˆˆfd„} ‰j                   j                  «       j                  | «      S )Nc                óp   •— ‰j                  | «       ‰j                  j                  j                  «        y r0   r  r  s    €€r4   r  zIIMAP4ServerTests.testCapabilityWithAuth.<locals>.getCaps.<locals>.gotCapsŽ  r  r6   r  r  s    €€r4   r  z8IMAP4ServerTests.testCapabilityWithAuth.<locals>.getCaps�  r   r6   )r!  r"  r#  ó   AUTHc                ó(   •— ‰j                  ‰‰«      S r0   r%  )r&  rç  ÚexpCaprE   s    €€€r4   r5   z9IMAP4ServerTests.testCapabilityWithAuth.<locals>.<lambda>ž  s   ø€  t×'7Ñ'7¸ÀÓ'E€ r6   )r   rý  Úchallengersrÿ  r›   r7   r'  r
  r   r(  r#   )rE   r  r)  rž   rç  r1  s   `   @@r4   ÚtestCapabilityWithAuthz'IMAP4ServerTests.testCapabilityWithAuth‰  s�   ú€ ØˆÜ/Aˆ�‰×Ñ Ñ,õ	Fð �^‰^×'Ñ'¬¨g«Ó7×BÑBÀ4Ç?Á?ÓSˆÜ×Ñ §¡£°"Ð 5Ó6ˆð ØØØ!�]ñ	
ˆð �}‰}ÕEÓFÐFr6   c                óÞ   ‡ — d‰ _         ˆ fd„}‰ j                  j                  t        |«      «      j	                  ‰ j
                  «       ‰ j                  «       }|j                  ˆ fd„«      S )Nr   c                 ót   •— ˆfd„} ‰j                   j                  «       j                  t        | «      «       y )Nc                 ó   •— d‰ _         y rs  )Ú	loggedOutrR   s   €r4   ÚsetLoggedOutzAIMAP4ServerTests.testLogout.<locals>.logout.<locals>.setLoggedOut¤  s
   ø€ Ø!"�•r6   )rþ  Úlogoutr›   r7   )r8  rE   s    €r4   r9  z+IMAP4ServerTests.testLogout.<locals>.logout£  s*   ø€ ô#ð �K‰K×ÑÓ ×,Ñ,¬U°<Ó-@ÕAr6   c                ó<   •— ‰j                  ‰j                  d«      S rs  )rB   r7  ©r&  rE   s    €r4   r5   z-IMAP4ServerTests.testLogout.<locals>.<lambda>«  s   ø€  t×'7Ñ'7¸¿¹ÈÓ'J€ r6   )r7  rÿ  r›   r7   r'  r
  r#   )rE   r9  rž   s   `  r4   Ú
testLogoutzIMAP4ServerTests.testLogout   sR   ø€ ØˆŒô	Bð 	�‰×"Ñ"¤5¨£=Ó1×<Ñ<¸T¿_¹_ÔMØ�M‰M‹OˆØ�}‰}ÓJÓKÐKr6   c                óÞ   ‡ — d ‰ _         ˆ fd„}‰ j                  j                  t        |«      «      j	                  ‰ j
                  «       ‰ j                  «       }|j                  ˆ fd„«      S )Nc                 ób   •— ˆfd„} ‰j                   j                  «       j                  | «       y )Nc                ó\   •— | ‰_         ‰j                  j                  j                  «        y r0   )Ú	responsesrý  rì  rí  )r@  rE   s    €r4   ÚsetResponsesz=IMAP4ServerTests.testNoop.<locals>.noop.<locals>.setResponses±  s    ø€ Ø!*�”Ø—‘×%Ñ%×4Ñ4Õ6r6   )rþ  Únoopr›   )rA  rE   s    €r4   rB  z'IMAP4ServerTests.testNoop.<locals>.noop°  s%   ø€ ô7ð �K‰K×ÑÓ×*Ñ*¨<Õ8r6   c                ó<   •— ‰j                  ‰j                  g «      S r0   )rB   r@  r;  s    €r4   r5   z+IMAP4ServerTests.testNoop.<locals>.<lambda>¹  s   ø€  t×'7Ñ'7¸¿¹ÈÓ'K€ r6   )r@  rÿ  r›   r7   r'  r
  r#   )rE   rB  rž   s   `  r4   ÚtestNoopzIMAP4ServerTests.testNoop­  sQ   ø€ ØˆŒô	9ð 	�‰×"Ñ"¤5¨£;Ó/×:Ñ:¸4¿?¹?ÔKØ�M‰M‹OˆØ�}‰}ÓKÓLÐLr6   c                ó  ‡ — ˆ fd„}‰ j                   j                  t        |«      «      j                  ‰ j                  «      }t        j                  |‰ j                  «       g«      }|j                  ‰ j                  «      S )Nc                 ót   •— ‰j                   j                  dd«      } | j                  ‰j                  «       y ©NrÊ  rÎ  )rþ  Úloginr›   r  ©rž   rE   s    €r4   rH  z)IMAP4ServerTests.testLogin.<locals>.login¼  s,   ø€ Ø—‘×!Ñ! +Ð/?Ó@ˆAØ�M‰M˜$×,Ñ,Õ-r6   )	rÿ  r›   r7   r'  r
  r   r(  r#   Ú_cbTestLogin©rE   rH  r)  rž   s   `   r4   Ú	testLoginzIMAP4ServerTests.testLogin»  sa   ø€ ô	.ð �^‰^×'Ñ'¬¨e«Ó5×@Ñ@ÀÇÁÓQˆÜ×Ñ  T§]¡]£_Ð 5Ó6ˆØ�}‰}˜T×.Ñ.Ó/Ð/r6   c                ó¸   — | j                  | j                  j                  t        j                  «       | j                  | j                  j
                  d«       y ©NÚauth©rB   rý  ÚaccountrÉ  rÝ  Ústate©rE   Úignoreds     r4   rJ  zIMAP4ServerTests._cbTestLoginÄ  ó<   € Ø×Ñ˜Ÿ™×,Ñ,¬l×.EÑ.EÔFØ×Ñ˜Ÿ™×*Ñ*¨FÕ3r6   c                ó  ‡ — ˆ fd„}‰ j                   j                  t        |«      «      j                  ‰ j                  «      }‰ j                  «       }t        j                  ||g«      }|j                  ‰ j                  «      S )Nc                 ót   •— ‰j                   j                  dd«      } | j                  ‰j                  «       y ©NrÊ  s   wrong-password©rþ  rH  ÚaddBothr  rI  s    €r4   rH  z/IMAP4ServerTests.testFailedLogin.<locals>.loginÉ  ó,   ø€ Ø—‘×!Ñ! +Ð/@ÓAˆAØ�I‰I�d×(Ñ(Õ)r6   )	rÿ  r›   r7   r'  r
  r#   r   r(  Ú_cbTestFailedLogin©rE   rH  r)  Úd2rž   s   `    r4   ÚtestFailedLoginz IMAP4ServerTests.testFailedLoginÈ  se   ø€ ô	*ð �^‰^×'Ñ'¬¨e«Ó5×@Ñ@ÀÇÁÓQˆØ�]‰]‹_ˆÜ×Ñ  R Ó)ˆØ�}‰}˜T×4Ñ4Ó5Ð5r6   c                óœ   — | j                  | j                  j                  d «       | j                  | j                  j                  d«       y )NÚunauth)rB   rý  rQ  rR  rS  s     r4   r\  z#IMAP4ServerTests._cbTestFailedLoginÒ  s6   € Ø×Ñ˜Ÿ™×,Ñ,¨dÔ3Ø×Ñ˜Ÿ™×*Ñ*¨HÕ5r6   c                ó.  ‡ — d‰ j                   _        ˆ fd„}‰ j                  j                  t	        |«      «      j                  ‰ j                  «      }‰ j                  «       }t        j                  ||g«      }|j                  ‰ j                  «      S )zj
        Attempting to log into a server that has no L{Portal} results
        in a failed login.
        Nc                 ót   •— ‰j                   j                  dd«      } | j                  ‰j                  «       y rX  rY  rI  s    €r4   rH  z7IMAP4ServerTests.test_loginWithoutPortal.<locals>.loginÝ  r[  r6   )rý  rÓ  rÿ  r›   r7   r'  r
  r#   r   r(  r\  r]  s   `    r4   Útest_loginWithoutPortalz(IMAP4ServerTests.test_loginWithoutPortalÖ  ss   ø€ ð
 "ˆ�‰Ôô	*ð �^‰^×'Ñ'¬¨e«Ó5×@Ñ@ÀÇÁÓQˆØ�]‰]‹_ˆÜ×Ñ  R Ó)ˆØ�}‰}˜T×4Ñ4Ó5Ð5r6   c                ó\  ‡ — d„ }|‰ j                   j                  j                  _        ˆ fd„}‰ j                  j                  t        |«      «      j                  ‰ j                  «      }‰ j                  «       }t        j                  ||g«      }|j                  ‰ j                  «      S )zê
        The server responds with a C{BAD} response when its portal
        attempts to log a user in with checker that claims to support
        L{IAccount} but returns an an avatar interface that is not
        L{IAccount}.
        c                 ó   — ddd„ fS )NzNot IAccountzNot an accountc                  ó   — y r0   r1   r1   r6   r4   r5   zVIMAP4ServerTests.test_nonIAccountAvatar.<locals>.brokenRequestAvatar.<locals>.<lambda>ï  ó   � r6   r1   )r&  Ú__s     r4   ÚbrokenRequestAvatarzDIMAP4ServerTests.test_nonIAccountAvatar.<locals>.brokenRequestAvatarî  s   € Ø"Ð$4±lÐCÐCr6   c                 ót   •— ‰j                   j                  dd«      } | j                  ‰j                  «       y rG  rY  rI  s    €r4   rH  z6IMAP4ServerTests.test_nonIAccountAvatar.<locals>.loginó  s,   ø€ Ø—‘×!Ñ! +Ð/?Ó@ˆAØ�I‰I�d×(Ñ(Õ)r6   )rý  rÓ  rØ  ÚrequestAvatarrÿ  r›   r7   r'  r
  r#   r   r(  r\  )rE   rj  rH  r)  r^  rž   s   `     r4   Útest_nonIAccountAvatarz'IMAP4ServerTests.test_nonIAccountAvataræ  s†   ø€ ò	Dð 2Eˆ�‰×Ñ× Ñ Ô.ô	*ð �^‰^×'Ñ'¬¨e«Ó5×@Ñ@ÀÇÁÓQˆØ�]‰]‹_ˆÜ×Ñ  R Ó)ˆØ�}‰}˜T×4Ñ4Ó5Ð5r6   c                óô  ‡ ‡—  G d„ dt         «      Šˆfd„}|‰ j                  _        ˆ fd„}‰ j                  j	                  t        |«      «      }|j                  ‰ j                  d«       |j                  ˆˆ fd„«       }|j                  ‰ j                  «       |j                  ‰ j                  «       ‰ j                  «       }t        j                  ||g«      }|j	                  ‰ j                  «      S )z£
        Any exception raised by L{IMAP4Server.authenticateLogin} that
        is not L{UnauthorizedLogin} is logged results in a C{BAD}
        response.
        c                  ó   — e Zd ZdZy)úAIMAP4ServerTests.test_loginException.<locals>.UnexpectedExceptionú2
            An unexpected exception.
            NrÇ  r1   r6   r4   ÚUnexpectedExceptionrp    ó   „ òr6   rr  c                ó   •—  ‰d«      ‚)NÚWhoopsr1   )ÚuserÚpasswdrr  s     €r4   ÚraisesUnexpectedExceptionzGIMAP4ServerTests.test_loginException.<locals>.raisesUnexpectedException  s   ø€ Ù% hÓ/Ð/r6   c                 ó<   •— ‰ j                   j                  dd«      S rG  ©rþ  rH  rR   s   €r4   rH  z3IMAP4ServerTests.test_loginException.<locals>.login  ó   ø€ Ø—;‘;×$Ñ$ [Ð2BÓCÐCr6   s   Server error: Whoopsc                óF   •— ‰j                  ‰j                  ‰«      «       y r0   ©rV  ÚflushLoggedErrors)r&  rr  rE   s    €€r4   ÚassertErrorLoggedz?IMAP4ServerTests.test_loginException.<locals>.assertErrorLogged  s   ø€ à�O‰O˜D×2Ñ2Ð3FÓGÕHr6   )rÞ  rý  ÚauthenticateLoginrÿ  r›   r7   r'  r  r
  rZ  r  r#   r   r(  r\  )rE   rx  rH  r)  r  r^  rž   rr  s   `      @r4   Útest_loginExceptionz$IMAP4ServerTests.test_loginExceptionü  sÈ   ù€ ô	¤)ô 	ô
	0ð )Bˆ�‰Ô%ô	Dð �^‰^×'Ñ'¬¨e«Ó5ˆà
�‰�d×5Ñ5Ð7NÔOà	�‰ô	Ió 
ð	Ið 	�‰�d—o‘oÔ&Ø
�
‰
�4×%Ñ%Ô&à�]‰]‹_ˆÜ×Ñ  R Ó)ˆØ�}‰}˜T×4Ñ4Ó5Ð5r6   c                óB  ‡ — ddi‰ j                   j                  _        ˆ fd„}‰ j                  j	                  t        |«      «      j                  ‰ j                  «      }t        j                  ‰ j                  «       |g«      }|j	                  ‰ j                  «      S )Nó
   {test}useró   {test}passwordc                 óÌ   •— ‰j                   j                  dd«      } | j                  t        j                  dt        ‰«      z   «       | j                  ‰j                  «       y )Nrƒ  r„  r  )rþ  rH  r'  r%   r	  rå   r›   r  rI  s    €r4   rH  z9IMAP4ServerTests.testLoginRequiringQuoting.<locals>.login"  sG   ø€ Ø—‘×!Ñ! -Ð1BÓCˆAØ�L‰LœŸ™ /´C¸³IÑ"=Ô>Ø�M‰M˜$×,Ñ,Õ-r6   )rý  rÒ  Úusersrÿ  r›   r7   r'  r
  r   r(  r#   Ú_cbTestLoginRequiringQuotingrK  s   `   r4   ÚtestLoginRequiringQuotingz*IMAP4ServerTests.testLoginRequiringQuoting  sy   ø€ Ø%2Ð4EÐ$Fˆ�‰×ÑÔ!ô	.ð
 �^‰^×'Ñ'¬¨e«Ó5×@Ñ@ÀÇÁÓQˆÜ×Ñ §¡£°"Ð 5Ó6ˆØ�}‰}˜T×>Ñ>Ó?Ð?r6   c                ó¸   — | j                  | j                  j                  t        j                  «       | j                  | j                  j
                  d«       y rN  rP  rS  s     r4   r‡  z-IMAP4ServerTests._cbTestLoginRequiringQuoting+  rU  r6   c                ó–  ‡ — d ‰ _         ˆ fd„}ˆ fd„}‰ j                  j                  t        |«      «      }|j                  t        |«      «       |j	                  ‰ j
                  «       ‰ j                  «       }t        j                  ||g«      }|j                  ˆ fd„«       }|j                  ‰ j                  ddggg g g«       |S )Nc                 ó<   •— ‰ j                   j                  dd«      S rG  rz  rR   s   €r4   rH  z-IMAP4ServerTests.testNamespace.<locals>.login2  r{  r6   c                 ó`   •— ˆfd„} ‰j                   j                  «       j                  | «      S )Nc                ó6   •— | ‰_         ‰j                  d «       y r0   ©ÚnamespaceArgsr  ©rÖ  rE   s    €r4   ÚgotNamespacezGIMAP4ServerTests.testNamespace.<locals>.namespace.<locals>.gotNamespace6  ó   ø€ Ø%)�Ô"Ø×"Ñ" 4Õ(r6   ©rþ  Ú	namespacer›   ©r‘  rE   s    €r4   r”  z1IMAP4ServerTests.testNamespace.<locals>.namespace5  ó(   ø€ ô)ð —;‘;×(Ñ(Ó*×6Ñ6°|ÓDÐDr6   c                ó†   •— ‰j                   D ]&  }|D ]  }|D ]  }‰j                  |t        «       Œ Œ! Œ( ‰j                   S r0   )r�  r×  rå   )rT  Ú
namespacesÚpairr  rE   s       €r4   ÚassertAllPairsNativeStringszCIMAP4ServerTests.testNamespace.<locals>.assertAllPairsNativeStringsB  sT   ø€ à"×0Ñ0ò :�
Ø&ò :�DØ!%ò :˜Ø×-Ñ-¨e´SÕ9ñ:ñ:ð:ð ×%Ñ%Ð%r6   r(  rQ  )
r�  rÿ  r›   r7   r'  r
  r#   r   r(  rB   )rE   rH  r”  r)  r^  rž   rš  s   `      r4   ÚtestNamespacezIMAP4ServerTests.testNamespace/  s¯   ø€ Ø!ˆÔô	Dô	Eð �^‰^×'Ñ'¬¨e«Ó5ˆØ
�‰”u˜YÓ'Ô(Ø
�‰�d—o‘oÔ&Ø�]‰]‹_ˆÜ×Ñ  R Ó)ˆà	
�‰ó	&ó 
ð	&ð 	
�‰�d×&Ñ&¨2¨s¨)¨°b¸"Ð(=Ô>Øˆr6   c                óÄ  ‡ — t        d«      ‰ j                  _        d‰ _        ˆ fd„}ˆ fd„}‰ j                  j                  t        |«      «      }|j                  t        |«      «       |j                  ‰ j                  «       ‰ j                  «       }t        j                  ||g«      }|j                  ˆ fd„«       |j                  ‰ j                  g g g g«       |S )z–
        A mailbox that does not provide L{INamespacePresenter} returns
        empty L{list}s for its personal, shared, and user namespaces.
        rÊ  Nc                 ó<   •— ‰ j                   j                  dd«      S rG  rz  rR   s   €r4   rH  z<IMAP4ServerTests.test_mailboxWithoutNamespace.<locals>.loginU  r{  r6   c                 ó`   •— ˆfd„} ‰j                   j                  «       j                  | «      S )Nc                ó6   •— | ‰_         ‰j                  d «       y r0   rŽ  r�  s    €r4   r‘  zVIMAP4ServerTests.test_mailboxWithoutNamespace.<locals>.namespace.<locals>.gotNamespaceY  r’  r6   r“  r•  s    €r4   r”  z@IMAP4ServerTests.test_mailboxWithoutNamespace.<locals>.namespaceX  r–  r6   c                ó   •— ‰j                   S r0   )r�  r;  s    €r4   r5   z?IMAP4ServerTests.test_mailboxWithoutNamespace.<locals>.<lambda>d  s   ø€  × 2Ñ 2€ r6   )r»  rý  rÝ  r�  rÿ  r›   r7   r'  r
  r#   r   r(  rB   )rE   rH  r”  r)  r^  rž   s   `     r4   Útest_mailboxWithoutNamespacez-IMAP4ServerTests.test_mailboxWithoutNamespaceM  s°   ø€ ô
 ":¸+Ó!Fˆ�‰ÔØ!ˆÔô	Dô	Eð �^‰^×'Ñ'¬¨e«Ó5ˆØ
�‰”u˜YÓ'Ô(Ø
�‰�d—o‘oÔ&Ø�]‰]‹_ˆÜ×Ñ  R Ó)ˆØ	�‰Ó2Ô3Ø	�‰�d×&Ñ&¨¨R°¨Ô5Øˆr6   c                ó–  ‡ — t         j                  j                  d«       d ‰ _        ˆ fd„}ˆ fd„}‰ j                  j                  t        |«      «      }|j                  t        |«      «       |j                  ‰ j                  «       ‰ j                  «       }t        j                  ||g«      j                  ‰ j                  «      S )Nútest-mailboxc                 ó<   •— ‰ j                   j                  dd«      S rG  rz  rR   s   €r4   rH  z*IMAP4ServerTests.testSelect.<locals>.loginl  r{  r6   c                 ój   •— ˆfd„} ‰j                   j                  d«      }|j                  | «       |S )Nc                ó6   •— | ‰_         ‰j                  d «       y r0   )ÚselectedArgsr  r�  s    €r4   Úselectedz=IMAP4ServerTests.testSelect.<locals>.select.<locals>.selectedp  ó   ø€ Ø$(�Ô!Ø×"Ñ" 4Õ(r6   r£  )rþ  rÃ  r›   )r¨  rž   rE   s     €r4   rÃ  z+IMAP4ServerTests.testSelect.<locals>.selecto  s/   ø€ ô)ð —‘×"Ñ" >Ó2ˆAØ�M‰M˜(Ô#ØˆHr6   )rÉ  rÝ  Ú
addMailboxr§  rÿ  r›   r7   r'  r
  r#   r   r(  Ú_cbTestSelect)rE   rH  rÃ  r)  r^  s   `    r4   Ú
testSelectzIMAP4ServerTests.testSelecth  s•   ø€ Ü×Ñ×*Ñ*¨>Ô:Ø ˆÔô	Dô	ð �^‰^×'Ñ'¬¨e«Ó5ˆØ
�‰”u˜V“}Ô%Ø
�‰�d—o‘oÔ&Ø�]‰]‹_ˆÜ×"Ñ" B¨ 8Ó,×8Ñ8¸×9KÑ9KÓLÐLr6   c                ó  ‡ — ˆ fd„}ˆ fd„}‰ j                   j                  t        |«      «       ‰ j                   j                  t        |«      «       ‰ j                   j                  ‰ j                  d«       ‰ j                   j                  ‰ j
                  «       ‰ j                   j                  ‰ j                  «       t        j                  ‰ j                   ‰ j                  «       g«      }|j                  ˆ fd„«       }|S )zh
        A client that selects a mailbox that does not exist receives a
        C{NO} response.
        c                 ó<   •— ‰ j                   j                  dd«      S rG  rz  rR   s   €r4   rH  z9IMAP4ServerTests.test_selectWithoutMailbox.<locals>.login„  r{  r6   c                 ó:   •— ‰ j                   j                  d«      S )Nr£  ©rþ  rÃ  rR   s   €r4   rÃ  z:IMAP4ServerTests.test_selectWithoutMailbox.<locals>.select‡  ó   ø€ Ø—;‘;×%Ñ% nÓ5Ð5r6   ó   No such mailboxc                óP   •— ‰j                  ‰j                  j                  «       y r0   )ÚassertIsNonerý  r^  r;  s    €r4   ÚassertNoMailboxSelectedzKIMAP4ServerTests.test_selectWithoutMailbox.<locals>.assertNoMailboxSelected’  s   ø€ à×Ñ˜dŸk™k×.Ñ.Õ/r6   )
rÿ  r›   r7   r'  r  r  r
  r   r(  r#   )rE   rH  rÃ  ÚconnectionCompleterµ  s   `    r4   Útest_selectWithoutMailboxz*IMAP4ServerTests.test_selectWithoutMailbox~  sÅ   ø€ ô	Dô	6ð 	�‰×"Ñ"¤5¨£<Ô0Ø�‰×"Ñ"¤5¨£=Ô1Ø�‰×!Ñ! $×"AÑ"AÐCUÔVØ�‰×"Ñ" 4×#5Ñ#5Ô6Ø�‰×!Ñ! $§/¡/Ô2ä"×0Ñ0°$·.±.À$Ç-Á-Ã/Ð1RÓSÐà	×	'Ñ	'ó	0ó 
(ð	0ð "Ð!r6   c           	     óÎ   — t         j                  j                  d   }| j                  | j                  j
                  |«       | j                  | j                  ddddddœ«       y )NúTEST-MAILBOXr÷   rÇ   rq  ra  T©ÚEXISTSrR  rT  r›  ú
READ-WRITE)rÉ  rÝ  Ú	mailboxesrB   rý  r^  r§  ©rE   rT  r^  s      r4   r«  zIMAP4ServerTests._cbTestSelect˜  s]   € Ü×&Ñ&×0Ñ0°Ñ@ˆØ×Ñ˜Ÿ™×)Ñ)¨4Ô0Ø×ÑØ×ÑàØØ!ØMØ"ñõ		
r6   c                óš  ‡ — t         j                  j                  d«       d‰ _        ˆ fd„}ˆ fd„}‰ j                  j                  t        |«      «      }|j                  t        |«      «       |j                  ‰ j                  «       ‰ j                  «       }t        j                  ||g«      }|j                  ‰ j                  «      S )a‡  
        L{IMAP4Client.examine} issues an I{EXAMINE} command to the server and
        returns a L{Deferred} which fires with a C{dict} with as many of the
        following keys as the server includes in its response: C{'FLAGS'},
        C{'EXISTS'}, C{'RECENT'}, C{'UNSEEN'}, C{'READ-WRITE'}, C{'READ-ONLY'},
        C{'UIDVALIDITY'}, and C{'PERMANENTFLAGS'}.

        Unfortunately the server doesn't generate all of these so it's hard to
        test the client's handling of them here.  See
        L{IMAP4ClientExamineTests} below.

        See U{RFC 3501<http://www.faqs.org/rfcs/rfc3501.html>}, section 6.3.2,
        for details.
        r£  Nc                 ó<   •— ‰ j                   j                  dd«      S rG  rz  rR   s   €r4   rH  z,IMAP4ServerTests.test_examine.<locals>.login¸  r{  r6   c                 ój   •— ˆfd„} ‰j                   j                  d«      }|j                  | «       |S )Nc                ó6   •— | ‰_         ‰j                  d «       y r0   )ÚexaminedArgsr  r�  s    €r4   Úexaminedz@IMAP4ServerTests.test_examine.<locals>.examine.<locals>.examined¼  r©  r6   r£  )rþ  Úexaminer›   )rÄ  rž   rE   s     €r4   rÅ  z.IMAP4ServerTests.test_examine.<locals>.examine»  s/   ø€ ô)ð —‘×#Ñ# NÓ3ˆAØ�M‰M˜(Ô#ØˆHr6   )rÉ  rÝ  rª  rÃ  rÿ  r›   r7   r'  r
  r#   r   r(  Ú_cbTestExamine)rE   rH  rÅ  r)  r^  rž   s   `     r4   Útest_examinezIMAP4ServerTests.test_examine¦  sš   ø€ ô 	×Ñ×*Ñ*¨>Ô:Ø ˆÔô	Dô	ð �^‰^×'Ñ'¬¨e«Ó5ˆØ
�‰”u˜W“~Ô&Ø
�‰�d—o‘oÔ&Ø�]‰]‹_ˆÜ×Ñ  R Ó)ˆØ�}‰}˜T×0Ñ0Ó1Ð1r6   c           	     óÎ   — t         j                  j                  d   }| j                  | j                  j
                  |«       | j                  | j                  ddddddœ«       y )Nr¹  r÷   rÇ   rq  ra  Frº  )rÉ  rÝ  r½  rB   rý  r^  rÃ  r¾  s      r4   rÆ  zIMAP4ServerTests._cbTestExamineË  s]   € Ü×&Ñ&×0Ñ0°Ñ@ˆØ×Ñ˜Ÿ™×)Ñ)¨4Ô0Ø×ÑØ×ÑàØØ!ØMØ#ñõ		
r6   c                óR  ‡ ‡‡‡‡	— dŠ	dŠˆ fd„Šˆ fd„Šˆ fd„}ˆˆˆˆ ˆ	fd„}g ‰ _         ‰ j                  j                  t        |«      «      j                  t        |«      «      }‰ j	                  «       }t        j                  ||g«      }|j                  ‰ j                  ‰	‰«      S )N)Útestboxútest/boxztest/útest/box/boxÚINBOX)rÊ  rË  c                 ó<   •— ‰ j                   j                  d«       y rs  ©r2   r|   rR   s   €r4   Úcbz'IMAP4ServerTests.testCreate.<locals>.cbÝ  ó   ø€ Ø�K‰K×Ñ˜qÕ!r6   c                ó<   •— ‰j                   j                  d«       y ©Nr   rÏ  ©r$   rE   s    €r4   Úebz'IMAP4ServerTests.testCreate.<locals>.ebà  rÑ  r6   c                 ó<   •— ‰ j                   j                  dd«      S rG  rz  rR   s   €r4   rH  z*IMAP4ServerTests.testCreate.<locals>.loginã  r{  r6   c                 óî   •— ‰‰z   D ]F  } ‰j                   j                  | «      }|j                  t        ‰«      «      j	                  ‰«       ŒH j                  ‰j                  ‰j                  «       y r0   )rþ  Úcreater›   r7   r'  ÚaddCallbacksr  r
  )r¾  rž   rÐ  rÕ  rZ  rE   r[  s     €€€€€r4   rØ  z+IMAP4ServerTests.testCreate.<locals>.createæ  s_   ø€ Ø $™ò 8�Ø—K‘K×&Ñ& tÓ,�Ø—‘œe B›iÓ(×3Ñ3°BÕ7ð8ð �N‰N˜4×-Ñ-¨t¯©Õ?r6   )r2   rÿ  r›   r7   r#   r   r(  Ú_cbTestCreate)
rE   rH  rØ  r)  r^  rž   rÐ  rÕ  rZ  r[  s
   `     @@@@r4   Ú
testCreatezIMAP4ServerTests.testCreateÙ  s‘   ü€ ØKˆØ&ˆô	"ô	"ô	D÷	@ð 	@ð ˆŒØ�^‰^×'Ñ'¬¨e«Ó5×AÑAÄ%ÈÃ-ÓPˆØ�]‰]‹_ˆÜ×Ñ  R Ó)ˆØ�}‰}˜T×/Ñ/°¸$Ó?Ð?r6   c                ó<  — | j                  | j                  dgt        |«      z  dgt        |«      z  z   «       t        t        j
                  j                  «      }t        g d¢«      }| j                  ||D �cg c]  }|j                  «       ‘Œ c}«       y c c}w )NrÅ   r   )ÚinboxrÊ  rË  ÚtestrÌ  )rB   r2   rÐ   rf  rÉ  rÝ  r½  r,  )rE   rT  r[  rZ  r^  rz  Úas          r4   rÚ  zIMAP4ServerTests._cbTestCreateò  su   € Ø×Ñ˜Ÿ™ q c¬C°«LÑ&8¸A¸3ÄÀTÃ¹?Ñ&JÔKÜ”l×-Ñ-×7Ñ7Ó8ˆÜÒQÓRˆØ×Ñ˜°7Ö;¨a §¡¥	Ò;Õ<ùÒ;s   Á:B
c                ó®  ‡ — t         j                  j                  d«       ˆ fd„}ˆ fd„}‰ j                  j	                  t        |«      «      }|j                  t        |«      ‰ j                  «       |j                  ‰ j                  ‰ j                  «       ‰ j                  «       }t        j                  ||g«      }|j	                  ˆ fd„«       |S )Nú	delete/mec                 ó<   •— ‰ j                   j                  dd«      S rG  rz  rR   s   €r4   rH  z*IMAP4ServerTests.testDelete.<locals>.loginû  r{  r6   c                 ó:   •— ‰ j                   j                  d«      S ©Nrá  ©rþ  r”  rR   s   €r4   r”  z+IMAP4ServerTests.testDelete.<locals>.deleteþ  ó   ø€ Ø—;‘;×%Ñ% kÓ2Ð2r6   c                ój   •— ‰j                  t        t        j                  j                  «      g «      S r0   )rB   rÑ   rÉ  rÝ  r½  r;  s    €r4   r5   z-IMAP4ServerTests.testDelete.<locals>.<lambda>	  s&   ø€ �d×&Ñ&¤t¬L×,CÑ,C×,MÑ,MÓ'NÐPRÓS€ r6   ©rÉ  rÝ  rª  rÿ  r›   r7   rÙ  r
  r  r#   r   r(  )rE   rH  r”  r)  r^  rž   s   `     r4   Ú
testDeletezIMAP4ServerTests.testDeleteø  sŸ   ø€ Ü×Ñ×*Ñ*¨;Ô7ô	Dô	3ð �^‰^×'Ñ'¬¨e«Ó5ˆØ
�‰œ˜f› t§¡Ô7Ø
�‰˜×*Ñ*¨D¯O©OÔ<Ø�]‰]‹_ˆÜ×Ñ  R Ó)ˆØ	�‰ÛSô	
ð ˆr6   c                ó  ‡ — t         j                  j                  d«       t         j                  j                  d«       ˆ fd„}ˆ fd„}ˆ fd„}‰ j                  j	                  t        |«      «      }|j                  t        |«      ‰ j                  «       |j                  |«       |j                  ‰ j                  «       ‰ j                  «       }t        j                  ||g«      }|j	                  ˆ fd„«       |S )zñ
        Attempting to delete a mailbox with hierarchically inferior
        names fails with an informative error.

        @see: U{https://tools.ietf.org/html/rfc3501#section-6.3.4}

        @return: A L{Deferred} with assertions.
        r”  rá  c                 ó<   •— ‰ j                   j                  dd«      S rG  rz  rR   s   €r4   rH  zGIMAP4ServerTests.testDeleteWithInferiorHierarchicalNames.<locals>.login	  r{  r6   c                 ó:   •— ‰ j                   j                  d«      S ©Nr”  rå  rR   s   €r4   r”  zHIMAP4ServerTests.testDeleteWithInferiorHierarchicalNames.<locals>.delete	  ó   ø€ Ø—;‘;×%Ñ% hÓ/Ð/r6   c                ó¢   •—  | j                   t        j                  «       ‰j                  t	        | j
                  «      t	        d«      «       y )Ns-   Name "DELETE" has inferior hierarchical names)r  r   r  rB   rå   r  rÔ  s    €r4   ÚassertIMAPExceptionzUIMAP4ServerTests.testDeleteWithInferiorHierarchicalNames.<locals>.assertIMAPException	  s:   ø€ ØˆG�L‰Lœ×-Ñ-Ô.Ø×ÑÜ�G—M‘MÓ"ÜÐDÓEõr6   c                ón   •— ‰j                  t        t        j                  j                  «      ddg«      S )NÚDELETEz	DELETE/ME)rB   rf  rÉ  rÝ  r½  r;  s    €r4   r5   zJIMAP4ServerTests.testDeleteWithInferiorHierarchicalNames.<locals>.<lambda>,	  s-   ø€ �d×&Ñ&Ü”|×.Ñ.×8Ñ8Ó9¸HÀkÐ;Ró€ r6   )rÉ  rÝ  rª  rÿ  r›   r7   rÙ  r
  r'  r  r#   r   r(  )rE   rH  r”  rð  ÚloggedInÚ
loopedBackrž   s   `      r4   Ú'testDeleteWithInferiorHierarchicalNamesz8IMAP4ServerTests.testDeleteWithInferiorHierarchicalNames	  sÊ   ø€ ô 	×Ñ×*Ñ*¨8Ô4Ü×Ñ×*Ñ*¨;Ô7ô	Dô	0ô	ð —>‘>×-Ñ-¬e°E«lÓ;ˆØ×Ñœe F›m¨T¯_©_Ô=Ø×ÑÐ/Ô0Ø×Ñ˜d×0Ñ0Ô1à—]‘]“_ˆ
Ü×Ñ ¨:Ð 6Ó7ˆØ	�‰óô	
ð
 ˆr6   c                óª  ‡ — d ‰ _         ˆ fd„}ˆ fd„}ˆ fd„}‰ j                  j                  t        |«      «      }|j	                  t        |«      ‰ j
                  «       |j                  |«       |j	                  ‰ j                  ‰ j
                  «       ‰ j                  «       }t        j                  ||g«      }|j                  ˆ fd„«       |S )Nc                 ó<   •— ‰ j                   j                  dd«      S rG  rz  rR   s   €r4   rH  z6IMAP4ServerTests.testIllegalInboxDelete.<locals>.login5	  r{  r6   c                 ó:   •— ‰ j                   j                  d«      S )NrÝ  rå  rR   s   €r4   r”  z7IMAP4ServerTests.testIllegalInboxDelete.<locals>.delete8	  s   ø€ Ø—;‘;×%Ñ% gÓ.Ð.r6   c                ó   •— | ‰_         y r0   ©Ústashed©r2   rE   s    €r4   Ústashz6IMAP4ServerTests.testIllegalInboxDelete.<locals>.stash;	  s
   ø€ Ø!ˆD�Lr6   c                ój   •— ‰j                  t        ‰j                  t        j                  «      «      S r0   ©rV  r±  rû  r$   ÚFailurer;  s    €r4   r5   z9IMAP4ServerTests.testIllegalInboxDelete.<locals>.<lambda>E	  ó   ø€ �d—o‘o¤j°·±¼w¿¹Ó&OÓP€ r6   ©rû  rÿ  r›   r7   rÙ  r
  rZ  r  r#   r   r(  )rE   rH  r”  rý  r)  r^  rž   s   `      r4   ÚtestIllegalInboxDeletez'IMAP4ServerTests.testIllegalInboxDelete2	  s£   ø€ ØˆŒô	Dô	/ô	"ð �^‰^×'Ñ'¬¨e«Ó5ˆØ
�‰œ˜f› t§¡Ô7Ø
�
‰
�5ÔØ
�‰˜×*Ñ*¨D¯O©OÔ<Ø�]‰]‹_ˆÜ×Ñ  R Ó)ˆØ	�‰ÛPô	
ð ˆr6   c                ó�  ‡ — ˆ fd„}ˆ fd„}ˆ fd„}d ‰ _         ‰ j                  j                  t        |«      «      }|j                  t        |«      «      j	                  |«       |j                  ‰ j                  ‰ j                  «       ‰ j                  «       }t        j                  ||g«      }|j                  ˆ fd„«       |S )Nc                 ó<   •— ‰ j                   j                  dd«      S rG  rz  rR   s   €r4   rH  z5IMAP4ServerTests.testNonExistentDelete.<locals>.loginJ	  r{  r6   c                 ó:   •— ‰ j                   j                  d«      S rä  rå  rR   s   €r4   r”  z6IMAP4ServerTests.testNonExistentDelete.<locals>.deleteM	  ræ  r6   c                ó   •— | ‰_         y r0   ©r$   rÔ  s    €r4   ÚdeleteFailedz<IMAP4ServerTests.testNonExistentDelete.<locals>.deleteFailedP	  ó
   ø€ Ø"ˆD�Lr6   c                ót   •— ‰j                  t        ‰j                  j                  «      t        d«      «      S )Nr²  ©rB   rå   r$   r  r;  s    €r4   r5   z8IMAP4ServerTests.testNonExistentDelete.<locals>.<lambda>Z	  s)   ø€ �d×&Ñ&¤s¨4¯<©<×+=Ñ+=Ó'>ÄÐDVÓ@WÓX€ r6   )r$   rÿ  r›   r7   r'  rÙ  r  r
  r#   r   r(  )rE   rH  r”  r	  r)  r^  rž   s   `      r4   ÚtestNonExistentDeletez&IMAP4ServerTests.testNonExistentDeleteI	  sœ   ø€ ô	Dô	3ô	#ð ˆŒØ�^‰^×'Ñ'¬¨e«Ó5ˆØ
�‰”u˜V“}Ó%×0Ñ0°Ô>Ø
�‰˜×*Ñ*¨D¯O©OÔ<Ø�]‰]‹_ˆÜ×Ñ  R Ó)ˆØ	�‰ÛXô	
ð ˆr6   c                óJ  ‡ ‡— t        «       }d|_        t        j                  j	                  d|«       t        j                  j	                  d«       ˆ fd„}ˆ fd„}ˆ fd„}d ‰ _        ‰ j                  j                  t        |«      «      }|j                  t        |«      «      j                  |«       |j                  ‰ j                  ‰ j                  «       ‰ j                  «       }t        j                  ||g«      }t!        d«      Š|j                  ˆˆ fd„«       |S )	N)z	\Noselectr”  rá  c                 ó<   •— ‰ j                   j                  dd«      S rG  rz  rR   s   €r4   rH  z1IMAP4ServerTests.testIllegalDelete.<locals>.logind	  r{  r6   c                 ó:   •— ‰ j                   j                  d«      S rí  rå  rR   s   €r4   r”  z2IMAP4ServerTests.testIllegalDelete.<locals>.deleteg	  rî  r6   c                ó   •— | ‰_         y r0   r  rÔ  s    €r4   r	  z8IMAP4ServerTests.testIllegalDelete.<locals>.deleteFailedj	  r
  r6   s<   Hierarchically inferior mailboxes exist and \Noselect is setc                ób   •— ‰j                  t        ‰j                  j                  «      ‰«      S r0   r  )r&  rh  rE   s    €€r4   r5   z4IMAP4ServerTests.testIllegalDelete.<locals>.<lambda>v	  s#   ø€  × 0Ñ 0´°T·\±\×5GÑ5GÓ1HÈ(Ó S€ r6   )rV  r�  rÉ  rÝ  rª  r$   rÿ  r›   r7   r'  rÙ  r  r
  r#   r   r(  rå   )	rE   ró   rH  r”  r	  r)  r^  rž   rh  s	   `       @r4   ÚtestIllegalDeletez"IMAP4ServerTests.testIllegalDelete^	  sß   ù€ Ü‹OˆØ!ˆŒÜ×Ñ×*Ñ*¨8°QÔ7Ü×Ñ×*Ñ*¨;Ô7ô	Dô	0ô	#ð ˆŒØ�^‰^×'Ñ'¬¨e«Ó5ˆØ
�‰”u˜V“}Ó%×0Ñ0°Ô>Ø
�‰˜×*Ñ*¨D¯O©OÔ<Ø�]‰]‹_ˆÜ×Ñ  R Ó)ˆÜØPó
ˆð 	
�‰ÔSÔTØˆr6   c                ó®  ‡ — t         j                  j                  d«       ˆ fd„}ˆ fd„}‰ j                  j	                  t        |«      «      }|j                  t        |«      ‰ j                  «       |j                  ‰ j                  ‰ j                  «       ‰ j                  «       }t        j                  ||g«      }|j	                  ˆ fd„«       |S )NÚoldmboxc                 ó<   •— ‰ j                   j                  dd«      S rG  rz  rR   s   €r4   rH  z*IMAP4ServerTests.testRename.<locals>.login|	  r{  r6   c                 ó<   •— ‰ j                   j                  dd«      S )Ns   oldmboxs   newname©rþ  ÚrenamerR   s   €r4   r  z+IMAP4ServerTests.testRename.<locals>.rename	  s   ø€ Ø—;‘;×%Ñ% j°*Ó=Ð=r6   c                óˆ   •— ‰j                  t        t        j                  j                  j                  «       «      dg«      S )NÚNEWNAME)rB   rÑ   rÉ  rÝ  r½  r]  r;  s    €r4   r5   z-IMAP4ServerTests.testRename.<locals>.<lambda>ˆ	  s3   ø€ �d×&Ñ&Ü”\×,Ñ,×6Ñ6×;Ñ;Ó=Ó>ÀÀó€ r6   rè  ©rE   rH  r  r)  r^  rž   s   `     r4   Ú
testRenamezIMAP4ServerTests.testRenamey	  s¡   ø€ Ü×Ñ×*Ñ*¨9Ô5ô	Dô	>ð �^‰^×'Ñ'¬¨e«Ó5ˆØ
�‰œ˜f› t§¡Ô7Ø
�‰˜×*Ñ*¨D¯O©OÔ<Ø�]‰]‹_ˆÜ×Ñ  R Ó)ˆØ	�‰óô	
ð
 ˆr6   c                óª  ‡ — d ‰ _         ˆ fd„}ˆ fd„}ˆ fd„}‰ j                  j                  t        |«      «      }|j	                  t        |«      ‰ j
                  «       |j                  |«       |j	                  ‰ j                  ‰ j
                  «       ‰ j                  «       }t        j                  ||g«      }|j                  ˆ fd„«       |S )Nc                 ó<   •— ‰ j                   j                  dd«      S rG  rz  rR   s   €r4   rH  z6IMAP4ServerTests.testIllegalInboxRename.<locals>.login‘	  r{  r6   c                 ó<   •— ‰ j                   j                  dd«      S )NrÝ  Úfrotzr  rR   s   €r4   r  z7IMAP4ServerTests.testIllegalInboxRename.<locals>.rename”	  s   ø€ Ø—;‘;×%Ñ% g¨wÓ7Ð7r6   c                ó   •— | ‰_         y r0   rú  )ÚstuffrE   s    €r4   rý  z6IMAP4ServerTests.testIllegalInboxRename.<locals>.stash—	  s
   ø€ Ø ˆD�Lr6   c                ój   •— ‰j                  t        ‰j                  t        j                  «      «      S r0   rÿ  r;  s    €r4   r5   z9IMAP4ServerTests.testIllegalInboxRename.<locals>.<lambda>¡	  r  r6   r  )rE   rH  r  rý  r)  r^  rž   s   `      r4   ÚtestIllegalInboxRenamez'IMAP4ServerTests.testIllegalInboxRenameŽ	  s£   ø€ ØˆŒô	Dô	8ô	!ð �^‰^×'Ñ'¬¨e«Ó5ˆØ
�‰œ˜f› t§¡Ô7Ø
�
‰
�5ÔØ
�‰˜×*Ñ*¨D¯O©OÔ<Ø�]‰]‹_ˆÜ×Ñ  R Ó)ˆØ	�‰ÛPô	
ð ˆr6   c                óö  ‡ — t         j                  j                  d«       t         j                  j                  d«       ˆ fd„}ˆ fd„}‰ j                  j	                  t        |«      «      }|j                  t        |«      ‰ j                  «       |j                  ‰ j                  ‰ j                  «       ‰ j                  «       }t        j                  ||g«      }|j	                  ‰ j                  «      S )Nz
oldmbox/m1z
oldmbox/m2c                 ó<   •— ‰ j                   j                  dd«      S rG  rz  rR   s   €r4   rH  z6IMAP4ServerTests.testHierarchicalRename.<locals>.login©	  r{  r6   c                 ó<   •— ‰ j                   j                  dd«      S )Nr  Únewnamer  rR   s   €r4   r  z7IMAP4ServerTests.testHierarchicalRename.<locals>.rename¬	  s   ø€ Ø—;‘;×%Ñ% i°Ó;Ð;r6   )rÉ  rÝ  rØ  rÿ  r›   r7   rÙ  r
  r  r#   r   r(  Ú_cbTestHierarchicalRenamer  s   `     r4   ÚtestHierarchicalRenamez'IMAP4ServerTests.testHierarchicalRename¥	  s²   ø€ Ü×Ñ×&Ñ& |Ô4Ü×Ñ×&Ñ& |Ô4ô	Dô	<ð �^‰^×'Ñ'¬¨e«Ó5ˆØ
�‰œ˜f› t§¡Ô7Ø
�‰˜×*Ñ*¨D¯O©OÔ<Ø�]‰]‹_ˆÜ×Ñ  R Ó)ˆØ�}‰}˜T×;Ñ;Ó<Ð<r6   c                óê   — t         j                  j                  j                  «       }g d¢}t	        t        |«      «      }| j                  ||D �cg c]  }|j                  «       ‘Œ c}«       y c c}w )N)r)  z
newname/m1z
newname/m2)rÉ  rÝ  r½  r]  rÑ   rf  rB   r,  )rE   rT  Úmboxesrh  r|  s        r4   r*  z*IMAP4ServerTests._cbTestHierarchicalRename¶	  sS   € Ü×(Ñ(×2Ñ2×7Ñ7Ó9ˆÚ:ˆÜ”f˜V“nÓ%ˆØ×Ñ˜°XÖ!>° !§'¡'¥)Ò!>Õ?ùÒ!>s   ÁA0
c                óp  ‡ — ˆ fd„}ˆ fd„}‰ j                   j                  t        |«      «      }|j                  t        |«      ‰ j                  «       |j                  ‰ j
                  ‰ j                  «       ‰ j                  «       }t        j                  ||g«      }|j                  ˆ fd„«       |S )Nc                 ó<   •— ‰ j                   j                  dd«      S rG  rz  rR   s   €r4   rH  z-IMAP4ServerTests.testSubscribe.<locals>.login½	  r{  r6   c                 ó:   •— ‰ j                   j                  d«      S ©Nz	this/mbox)rþ  Ú	subscriberR   s   €r4   r2  z1IMAP4ServerTests.testSubscribe.<locals>.subscribeÀ	  s   ø€ Ø—;‘;×(Ñ(¨Ó5Ð5r6   c                óZ   •— ‰j                  t        j                  j                  dg«      S )Nú	THIS/MBOX©rB   rÉ  rÝ  Úsubscriptionsr;  s    €r4   r5   z0IMAP4ServerTests.testSubscribe.<locals>.<lambda>É	  ó%   ø€ �d×&Ñ&Ü×'Ñ'×5Ñ5¸°}ó€ r6   )	rÿ  r›   r7   rÙ  r
  r  r#   r   r(  )rE   rH  r2  r)  r^  rž   s   `     r4   ÚtestSubscribezIMAP4ServerTests.testSubscribe¼	  sŽ   ø€ ô	Dô	6ð �^‰^×'Ñ'¬¨e«Ó5ˆØ
�‰œ˜iÓ(¨$¯/©/Ô:Ø
�‰˜×*Ñ*¨D¯O©OÔ<Ø�]‰]‹_ˆÜ×Ñ  R Ó)ˆØ	�‰óô	
ð
 ˆr6   c                óž  ‡ — ddgt         j                  _        ˆ fd„}ˆ fd„}‰ j                  j	                  t        |«      «      }|j                  t        |«      ‰ j                  «       |j                  ‰ j                  ‰ j                  «       ‰ j                  «       }t        j                  ||g«      }|j	                  ˆ fd„«       |S )Nr4  ú	THAT/MBOXc                 ó<   •— ‰ j                   j                  dd«      S rG  rz  rR   s   €r4   rH  z/IMAP4ServerTests.testUnsubscribe.<locals>.loginÒ	  r{  r6   c                 ó:   •— ‰ j                   j                  d«      S r1  )rþ  ÚunsubscriberR   s   €r4   r=  z5IMAP4ServerTests.testUnsubscribe.<locals>.unsubscribeÕ	  s   ø€ Ø—;‘;×*Ñ*¨;Ó7Ð7r6   c                óZ   •— ‰j                  t        j                  j                  dg«      S )Nr:  r5  r;  s    €r4   r5   z2IMAP4ServerTests.testUnsubscribe.<locals>.<lambda>Þ	  r7  r6   )rÉ  rÝ  r6  rÿ  r›   r7   rÙ  r
  r  r#   r   r(  )rE   rH  r=  r)  r^  rž   s   `     r4   ÚtestUnsubscribez IMAP4ServerTests.testUnsubscribeÏ	  s¡   ø€ Ø1<¸kÐ0JŒ×ÑÔ-ô	Dô	8ð �^‰^×'Ñ'¬¨e«Ó5ˆØ
�‰œ˜kÓ*¨D¯O©OÔ<Ø
�‰˜×*Ñ*¨D¯O©OÔ<Ø�]‰]‹_ˆÜ×Ñ  R Ó)ˆØ	�‰óô	
ð
 ˆr6   c                óh  ‡ — t         j                  j                  d«       t         j                  j                  d«       t         j                  j                  d«       ˆ fd„}ˆ fd„}d ‰ _        ‰ j                  j                  t        |«      «      }|j                  t        |«      ‰ j                  «       |j                  |‰ j                  «       |j                  ‰ j                  ‰ j                  «       ‰ j                  «       }t        j                  ||g«      j                  ˆ fd„«      S )Núroot/subthingzroot/another-thingznon-root/subthingc                 ó<   •— ‰ j                   j                  dd«      S rG  rz  rR   s   €r4   rH  z*IMAP4ServerTests._listSetup.<locals>.loginé	  r{  r6   c                ó   •— | ‰_         y r0   ©Úlisted)rz  rE   s    €r4   rE  z+IMAP4ServerTests._listSetup.<locals>.listedì	  s
   ø€ Ø!ˆD�Kr6   c                ó   •— ‰j                   S r0   rD  r;  s    €r4   r5   z-IMAP4ServerTests._listSetup.<locals>.<lambda>õ	  s   ø€ À4Ç;Á;€ r6   )rÉ  rÝ  rª  rE  rÿ  r›   r7   rÙ  r
  r  r#   r   r(  )rE   r3   rH  rE  r)  r^  s   `     r4   Ú
_listSetupzIMAP4ServerTests._listSetupä	  sÙ   ø€ Ü×Ñ×*Ñ*¨?Ô;Ü×Ñ×*Ñ*Ð+?Ô@Ü×Ñ×*Ñ*Ð+>Ô?ô	Dô	"ð ˆŒØ�^‰^×'Ñ'¬¨e«Ó5ˆØ
�‰œ˜a› $§/¡/Ô2Ø
�‰˜ §¡Ô0Ø
�‰˜×*Ñ*¨D¯O©OÔ<Ø�]‰]‹_ˆÜ×"Ñ" B¨ 8Ó,×8Ñ8Ó9NÓOÐOr6   c                ó|   — |D ]6  }| j                  |d   t        d«       | j                  |d   t        d«       Œ8 |S )zÐ
        Assert a C{LIST} response's delimiter and mailbox are native
        strings.

        @param results: A list of tuples as returned by
            L{IMAP4Client.list} or L{IMAP4Client.lsub}.
        rÅ   zdelimiter %r is not a strrÉ   zmailbox %r is not a str)r×  rå   )rE   Úresultsr2   s      r4   Ú'assertListDelimiterAndMailboxAreStringsz8IMAP4ServerTests.assertListDelimiterAndMailboxAreStrings÷	  sJ   € ð ò 	MˆFØ×!Ñ! &¨¡)¬SÐ2MÔNØ×!Ñ! &¨¡)¬SÐ2KÕLð	Mð ˆr6   c                ó\   ‡ — ˆ fd„}‰ j                  |«      }|j                  ˆ fd„«       }|S )Nc                 ó<   •— ‰ j                   j                  dd«      S ©NÚrootú%)rþ  rÑ   rR   s   €r4   ÚmailboxListz.IMAP4ServerTests.testList.<locals>.mailboxList
  ó   ø€ Ø—;‘;×#Ñ# F¨CÓ0Ð0r6   c                ó&  •— t        t        j                  «      ddft        t        j                  «      ddfg}t        d«      D ]5  }| j	                  d«      \  }}}‰j                  t        |«      ||f|«       Œ7 ‰j                  | d| ›�«       y )NrQ  úROOT/SUBTHINGzROOT/ANOTHER-THINGrÉ   r   zMore results than expected: )rf  rV  r�  rn   Úpopr  rT  )rE  ÚexpectedContentsr&  r�  Ú	delimiterÚmailboxrE   s         €r4   ÚassertListContentsz5IMAP4ServerTests.testList.<locals>.assertListContents

  s˜   ø€ ô œ×+Ñ+Ó,¨c°?ÐCÜœ×+Ñ+Ó,¨cÐ3GÐHð Ðô
 ˜1“Xò �Ø,2¯J©J°q«MÑ)��y 'Ø—‘Ü˜E“] I¨wÐ7Ø$õðð ×Ñ˜VÐ'CÀFÀ:Ð%NÕOr6   )rG  r›   )rE   rP  rž   rX  s   `   r4   ÚtestListzIMAP4ServerTests.testList
  s7   ø€ ô	1ð �O‰O˜KÓ(ˆà	
�‰ó	Pó 
ð	Pð ˆr6   c                ó  ‡ — t         j                  j                  d«       ˆ fd„}‰ j                  |«      }|j	                  ‰ j
                  «       |j	                  ‰ j                  t        j                  ddfg«       |S )NrS  c                 ó<   •— ‰ j                   j                  dd«      S rM  )rþ  ÚlsubrR   s   €r4   r\  z'IMAP4ServerTests.testLSub.<locals>.lsub
  rQ  r6   rQ  )	rÉ  rÝ  r2  rG  r›   rJ  rB   rV  r�  )rE   r\  rž   s   `  r4   ÚtestLSubzIMAP4ServerTests.testLSub
  sg   ø€ Ü×Ñ×)Ñ)¨/Ô:ô	1ð �O‰O˜DÓ!ˆØ	�‰�d×BÑBÔCØ	�‰�d×&Ñ&¬-×*=Ñ*=¸sÀOÐ)TÐ(UÔVØˆr6   c                óþ  ‡ — t         j                  j                  d«       ˆ fd„}ˆ fd„}ˆ fd„}d ‰ _        ‰ j                  j                  t        |«      «      }|j                  t        |«      ‰ j                  «       |j                  |‰ j                  «       |j                  ‰ j                  ‰ j                  «       ‰ j                  «       }t        j                  ||g«      }|j                  ˆ fd„«       |S )NrA  c                 ó<   •— ‰ j                   j                  dd«      S rG  rz  rR   s   €r4   rH  z*IMAP4ServerTests.testStatus.<locals>.login*
  r{  r6   c                 ó@   •— ‰ j                   j                  dddd«      S )NrA  rQ  rS  rU  ©rþ  ÚstatusrR   s   €r4   rb  z+IMAP4ServerTests.testStatus.<locals>.status-
  s   ø€ Ø—;‘;×%Ñ% o°zÀ9ÈhÓWÐWr6   c                ó   •— | ‰_         y r0   ©Ústatusedrü  s    €r4   re  z-IMAP4ServerTests.testStatus.<locals>.statused0
  ó
   ø€ Ø"ˆD�Mr6   c                óD   •— ‰j                  ‰j                  ddddœ«      S )Nr÷   s   10rË   )rQ  rS  rU  )rB   re  r;  s    €r4   r5   z-IMAP4ServerTests.testStatus.<locals>.<lambda>;
  s"   ø€ �d×&Ñ&Ø—‘¨A¸%È1ÑMó€ r6   )rÉ  rÝ  rª  re  rÿ  r›   r7   rÙ  r
  r  r#   r   r(  )rE   rH  rb  re  r)  r^  rž   s   `      r4   Ú
testStatuszIMAP4ServerTests.testStatus'
  sÀ   ø€ Ü×Ñ×*Ñ*¨?Ô;ô	Dô	Xô	#ð ˆŒØ�^‰^×'Ñ'¬¨e«Ó5ˆØ
�‰œ˜f› t§¡Ô7Ø
�‰˜ $§/¡/Ô2Ø
�‰˜×*Ñ*¨D¯O©OÔ<Ø�]‰]‹_ˆÜ×Ñ  R Ó)ˆØ	�‰óô	
ð
 ˆr6   c                óÊ  ‡ — ˆ fd„}ˆ fd„}ˆ fd„}ˆ fd„}d x‰ _         ‰ _        ‰ j                  j                  t	        |«      «      }|j                  t	        |«      ‰ j                  «       |j                  ||«       |j                  ‰ j                  ‰ j                  «       ‰ j                  «       }t        j                  ||g«      j                  ‰ j                  «      S )Nc                 ó<   •— ‰ j                   j                  dd«      S rG  rz  rR   s   €r4   rH  z0IMAP4ServerTests.testFailedStatus.<locals>.loginB
  r{  r6   c                 ó@   •— ‰ j                   j                  dddd«      S )Nzroot/nonexistentrQ  rS  rU  ra  rR   s   €r4   rb  z1IMAP4ServerTests.testFailedStatus.<locals>.statusE
  s#   ø€ Ø—;‘;×%Ñ%Ø" J°	¸8óð r6   c                ó   •— | ‰_         y r0   rd  rü  s    €r4   re  z3IMAP4ServerTests.testFailedStatus.<locals>.statusedJ
  rf  r6   c                ó   •— | ‰_         y r0   r  rÔ  s    €r4   Úfailedz1IMAP4ServerTests.testFailedStatus.<locals>.failedM
  r
  r6   )re  r$   rÿ  r›   r7   rÙ  r
  r  r#   r   r(  Ú_cbTestFailedStatus)rE   rH  rb  re  rn  r)  r^  s   `      r4   ÚtestFailedStatusz!IMAP4ServerTests.testFailedStatusA
  s­   ø€ ô	Dô	ô
	#ô	#ð (,Ð+ˆŒ˜œØ�^‰^×'Ñ'¬¨e«Ó5ˆØ
�‰œ˜f› t§¡Ô7Ø
�‰˜ &Ô)Ø
�‰˜×*Ñ*¨D¯O©OÔ<Ø�]‰]‹_ˆÜ×"Ñ" B¨ 8Ó,×8Ñ8¸×9QÑ9QÓRÐRr6   c                óœ   — | j                  | j                  d «       | j                  | j                  j                  j                  d«       y )N)s   Could not open mailbox)rB   re  r$   r  rÖ  rS  s     r4   ro  z$IMAP4ServerTests._cbTestFailedStatusX
  s7   € Ø×Ñ˜Ÿ™¨Ô-Ø×Ñ˜Ÿ™×+Ñ+×0Ñ0Ð2NÕOr6   c                ó  ‡ ‡— t        j                  t        d«      Št        j                  j                  d«       ˆ fd„}t        j                  ˆˆ fd„«       }‰ j                  j                  t        |«      «      }|j                  t        |«      ‰ j                  «       |j                  ‰ j                  ‰ j                  «       ‰ j                  «       }t        j                  ||g«      }|j                  ‰ j                   ‰«      S )Núrfc822.messagerA  c                 ó<   •— ‰ j                   j                  dd«      S rG  rz  rR   s   €r4   rH  z.IMAP4ServerTests.testFullAppend.<locals>.login`
  r{  r6   c               3  óº   •K  — t        ‰d«      5 } ‰j                  j                  d| dd«      –—}t        j                  |«       d d d «       y # 1 sw Y   y xY w­w)NÚrbrA  )ú\SEENú\DELETEDz%Tue, 17 Jun 2003 11:22:16 -0600 (MDT))Úopenrþ  r|   r   ÚreturnValue©r�  r2   ÚinfilerE   s     €€r4   r|   z/IMAP4ServerTests.testFullAppend.<locals>.appendc
  s\   øè ø€ ä�f˜dÓ#ð * wØ#Ÿ{™{×1Ñ1Ø#ØØ+Ø;ó	 ñ �ô ×!Ñ! &Ô)÷*÷ *ñ *üs   ƒA�6AÁ	AÁAÁA)r&   ÚsibpathÚ__file__rÉ  rÝ  rª  r   ÚinlineCallbacksrÿ  r›   r7   rÙ  r
  r  r#   r(  Ú_cbTestFullAppend©rE   rH  r|   r)  r^  rž   r|  s   `     @r4   ÚtestFullAppendzIMAP4ServerTests.testFullAppend\
  sÆ   ù€ Ü—‘œhÐ(8Ó9ˆÜ×Ñ×*Ñ*¨?Ô;ô	Dô 
×	Ñ	ô	*ó 
ð	*ð �^‰^×'Ñ'¬¨e«Ó5ˆØ
�‰œ˜f› t§¡Ô7Ø
�‰˜×*Ñ*¨D¯O©OÔ<Ø�]‰]‹_ˆä×Ñ  R Ó)ˆà�}‰}˜T×3Ñ3°VÓ<Ð<r6   c                ó”  — t         j                  j                  d   }| j                  dt	        |j
                  «      «       | j                  ddgddf|j
                  d   dd  «       t        |d«      5 }| j                  |j                  «       |j
                  d   d   j                  «       «       d d d «       y # 1 sw Y   y xY w)NrS  rÅ   rw  rx  s%   Tue, 17 Jun 2003 11:22:16 -0600 (MDT)r   rv  ©	rÉ  rÝ  r½  rB   rÐ   r  ry  rW   r]   ©rE   rT  r|  Úmbr3   s        r4   r€  z"IMAP4ServerTests._cbTestFullAppendw
  sµ   € Ü×$Ñ$×.Ñ.¨Ñ?ˆØ×Ñ˜œC §¡Ó,Ô-Ø×ÑØ˜Ð$Ð&NÐPQÐRØ�K‰K˜‰N˜1˜2Ðô	
ô �&˜$Óð 	E 1Ø×Ñ˜QŸV™V›X r§{¡{°1¡~°aÑ'8×'AÑ'AÓ'CÔD÷	E÷ 	Eñ 	Eús   Á6?B>Â>Cc                ó  ‡ ‡— t        j                  t        d«      Št        j                  j                  d«       ˆ fd„}t        j                  ˆˆ fd„«       }‰ j                  j                  t        |«      «      }|j                  t        |«      ‰ j                  «       |j                  ‰ j                  ‰ j                  «       ‰ j                  «       }t        j                  ||g«      }|j                  ‰ j                   ‰«      S )Nrs  úPARTIAL/SUBTHINGc                 ó<   •— ‰ j                   j                  dd«      S rG  rz  rR   s   €r4   rH  z1IMAP4ServerTests.testPartialAppend.<locals>.login…
  r{  r6   c               3  ó^  •K  — t        ‰d«      5 } ‰j                  j                  t        j                  dt        dt        j                  j                  ‰«      fz  «      d‰j                  j                  | «      «      –—}t        j                  |«       d d d «       y # 1 sw Y   y xY w­w)Nrv  s   APPENDz)PARTIAL/SUBTHING (\SEEN) "Right now" {%d}r1   )ry  rþ  ÚsendCommandr   r8  r)   ÚosÚpathÚgetsizeÚ_IMAP4Client__cbContinueAppendr   rz  r{  s     €€r4   r|   z2IMAP4ServerTests.testPartialAppend.<locals>.appendˆ
  sœ   øè ø€ ä�f˜dÓ#ð * wØ#Ÿ{™{×6Ñ6Ü—M‘MØ!ô
 &ð#ä&(§g¡g§o¡o°fÓ&=Ð%?ñ@óð
 ØŸ™×BÑBØóó ñ �ô" ×!Ñ! &Ô)÷%*÷ *ñ *üs   ƒB-�BB!Â	B-Â!B*Â&B-)r&   r}  r~  rÉ  rÝ  rª  r   r  rÿ  r›   r7   rÙ  r
  r  r#   r(  Ú_cbTestPartialAppendr�  s   `     @r4   ÚtestPartialAppendz"IMAP4ServerTests.testPartialAppend�
  sÇ   ù€ Ü—‘œhÐ(8Ó9ˆÜ×Ñ×*Ñ*Ð+=Ô>ô	Dô 
×	Ñ	ô	*ó 
ð	*ð* �^‰^×'Ñ'¬¨e«Ó5ˆØ
�‰œ˜f› t§¡Ô7Ø
�‰˜×*Ñ*¨D¯O©OÔ<Ø�]‰]‹_ˆÜ×Ñ  R Ó)ˆØ�}‰}˜T×6Ñ6¸Ó?Ð?r6   c                ó’  — t         j                  j                  d   }| j                  dt	        |j
                  «      «       | j                  dgddf|j
                  d   dd  «       t        |d«      5 }| j                  |j                  «       |j
                  d   d   j                  «       «       d d d «       y # 1 sw Y   y xY w)Nrˆ  rÅ   rw  s	   Right nowr   rv  r„  r…  s        r4   r�  z%IMAP4ServerTests._cbTestPartialAppend¥
  s«   € Ü×$Ñ$×.Ñ.Ð/AÑBˆØ×Ñ˜œC §¡Ó,Ô-Ø×Ñ˜8˜* l°AÐ6¸¿¹ÀA¹ÀqÀrÐ8JÔKÜ�&˜$Óð 	E 1Ø×Ñ˜QŸV™V›X r§{¡{°1¡~°aÑ'8×'AÑ'AÓ'CÔD÷	E÷ 	Eñ 	Eús   Á5?B=Â=Cc                ó¨  ‡ — t         j                  j                  d«       ˆ fd„}ˆ fd„}ˆ fd„}‰ j                  j	                  t        |«      «      }|j                  t        |«      ‰ j                  «       |j                  t        |«      ‰ j                  «       |j                  ‰ j                  ‰ j                  «       ‰ j                  «       S )Nó   root/subthingc                 ó<   •— ‰ j                   j                  dd«      S rG  rz  rR   s   €r4   rH  z*IMAP4ServerTests._testCheck.<locals>.login¯
  r{  r6   c                 ó:   •— ‰ j                   j                  d«      S )Nr”  r°  rR   s   €r4   rÃ  z+IMAP4ServerTests._testCheck.<locals>.select²
  s   ø€ Ø—;‘;×%Ñ%Ð&6Ó7Ð7r6   c                 ó8   •— ‰ j                   j                  «       S r0   )rþ  r�  rR   s   €r4   r�  z*IMAP4ServerTests._testCheck.<locals>.checkµ
  ó   ø€ Ø—;‘;×$Ñ$Ó&Ð&r6   )
rÉ  rÝ  rª  rÿ  r›   r7   rÙ  r
  r  r#   )rE   rH  rÃ  r�  rž   s   `    r4   Ú
_testCheckzIMAP4ServerTests._testCheck¬
  s’   ø€ Ü×Ñ×*Ñ*Ð+;Ô<ô	Dô	8ô	'ð �N‰N×&Ñ&¤u¨U£|Ó4ˆØ	�‰”u˜V“} d§o¡oÔ6Ø	�‰”u˜U“| T§_¡_Ô5Ø	�‰�t×)Ñ)¨4¯?©?Ô;Ø�}‰}‹Ðr6   c                ó"   — | j                  «       S )zf
        Trigger the L{imap.IMAP4Server._cbSelectWork} callback
        by selecting an mbox.
        )r™  rR   s    r4   Ú
test_checkzIMAP4ServerTests.test_check¾
  s   € ð
 �‰Ó Ð r6   c                ó†   ‡ — dd„}ˆ fd„}‰ j                  t        d|«       ‰ j                  «       }|j                  |«      S )zr
        Trigger the L{imap.IMAP4Server._ebSelectWork} errback
        by failing when we select an mbox.
        c                ó,   — t        j                  d«      ‚)NÚencoding)r   ÚIllegalMailboxEncoding)rE   r¾  r{  s      r4   Ú
failSelectz3IMAP4ServerTests.test_checkFail.<locals>.failSelectË
  s   € Ü×.Ñ.¨zÓ:Ð:r6   c                ó~   •— ‰j                  «       }‰j                  |d   j                  j                  d   d«       y )NrÅ   r   s   SELECT failed: Server error)r~  rB   r  rÖ  )r  ÚfailuresrE   s     €r4   ÚcheckResponsez6IMAP4ServerTests.test_checkFail.<locals>.checkResponseÎ
  s7   ø€ Ø×-Ñ-Ó/ˆHØ×Ñ˜X a™[×.Ñ.×3Ñ3°AÑ6Ð8VÕWr6   rÃ  rÄ  )ÚpatchrÆ  r™  r›   )rE   r   r£  rž   s   `   r4   Útest_checkFailzIMAP4ServerTests.test_checkFailÅ
  s;   ø€ ó	;ô	Xð 	�
‰
”7˜H jÔ1Ø�O‰OÓˆØ�}‰}˜]Ó+Ð+r6   c                ó2  ‡ — t        «       }g d¢|_        t        j                  j	                  d|«       ˆ fd„}ˆ fd„}ˆ fd„}‰ j
                  j                  t        |«      «      }|j                  t        |«      ‰ j                  «       |j                  t        |«      ‰ j                  «       |j                  ‰ j                  ‰ j                  «       ‰ j                  «       }t        j                  ||g«      j                  ‰ j                  |«      S )N©)s	   Message 1)r‘  ÚAnotherFlagNr   ©s	   Message 2)r¨  NrÅ   )s	   Message 3)r‘  NrÉ   rW  c                 ó<   •— ‰ j                   j                  dd«      S rG  rz  rR   s   €r4   rH  z)IMAP4ServerTests.testClose.<locals>.loginß
  r{  r6   c                 ó:   •— ‰ j                   j                  d«      S )Ns   mailboxr°  rR   s   €r4   rÃ  z*IMAP4ServerTests.testClose.<locals>.selectâ
  ó   ø€ Ø—;‘;×%Ñ% jÓ1Ð1r6   c                 ó8   •— ‰ j                   j                  «       S r0   )rþ  rš  rR   s   €r4   rš  z)IMAP4ServerTests.testClose.<locals>.closeå
  r˜  r6   )rV  r  rÉ  rÝ  rª  rÿ  r›   r7   rÙ  r
  r  r#   r   r(  Ú_cbTestClose)rE   ró   rH  rÃ  rš  rž   r^  s   `      r4   Ú	testClosezIMAP4ServerTests.testCloseÖ
  sÌ   ø€ Ü‹Oˆò
ˆŒ
ô
 	×Ñ×*Ñ*¨9°aÔ8ô	Dô	2ô	'ð �N‰N×&Ñ&¤u¨U£|Ó4ˆØ	�‰”u˜V“} d§o¡oÔ6Ø	�‰”u˜U“| T§_¡_Ô5Ø	�‰�t×)Ñ)¨4¯?©?Ô;Ø�]‰]‹_ˆÜ×"Ñ" A r 7Ó+×7Ñ7¸×8IÑ8IÈ1ÓMÐMr6   c                óÂ   — | j                  t        |j                  «      d«       | j                  |j                  d   d«       | j                  |j                  «       y )NrÅ   r   r©  )rB   rÐ   r  rV  r™  ©rE   rT  ró   s      r4   r®  zIMAP4ServerTests._cbTestCloseï
  sC   € Ø×Ñœ˜QŸZ™Z›¨!Ô,Ø×Ñ˜Ÿ™ A™Ð(QÔRØ�‰˜Ÿ™Õ!r6   c                ó†  ‡ — t        «       }g d¢|_        t        j                  j	                  d|«       ˆ fd„}ˆ fd„}ˆ fd„}ˆ fd„}d ‰ _        ‰ j                  j                  t        |«      «      }|j                  t        |«      ‰ j                  «       |j                  t        |«      ‰ j                  «       |j                  |‰ j                  «       |j                  ‰ j                  ‰ j                  «       ‰ j                  «       }t        j                  ||g«      }|j                  ‰ j                  |«      S )Nr§  rW  c                 ó<   •— ‰ j                   j                  dd«      S rG  rz  rR   s   €r4   rH  z+IMAP4ServerTests.testExpunge.<locals>.loginý
  r{  r6   c                 ó:   •— ‰ j                   j                  d«      S )NrW  r°  rR   s   €r4   rÃ  z,IMAP4ServerTests.testExpunge.<locals>.select   s   ø€ Ø—;‘;×%Ñ% iÓ0Ð0r6   c                 ó8   •— ‰ j                   j                  «       S r0   )rþ  r•  rR   s   €r4   r•  z-IMAP4ServerTests.testExpunge.<locals>.expunge  s   ø€ Ø—;‘;×&Ñ&Ó(Ð(r6   c                ób   •— ‰j                  ‰j                  j                  d u «       | ‰_        y r0   )rT  rý  r^  rI  )rI  rE   s    €r4   Úexpungedz.IMAP4ServerTests.testExpunge.<locals>.expunged  s'   ø€ Ø×Ñ˜TŸ[™[×-Ñ-°Ð5Ô6Ø"ˆD�Lr6   )rV  r  rÉ  rÝ  rª  rI  rÿ  r›   r7   rÙ  r
  r  r#   r   r(  Ú_cbTestExpunge)	rE   ró   rH  rÃ  r•  r·  r)  r^  rž   s	   `        r4   ÚtestExpungezIMAP4ServerTests.testExpungeô
  sí   ø€ Ü‹Oˆò
ˆŒ
ô
 	×Ñ×*Ñ*¨9°aÔ8ô	Dô	1ô	)ô	#ð ˆŒØ�^‰^×'Ñ'¬¨e«Ó5ˆØ
�‰œ˜f› t§¡Ô7Ø
�‰œ˜g›¨¯©Ô8Ø
�‰˜ $§/¡/Ô2Ø
�‰˜×*Ñ*¨D¯O©OÔ<Ø�]‰]‹_ˆÜ×Ñ  R Ó)ˆØ�}‰}˜T×0Ñ0°!Ó4Ð4r6   c                óÈ   — | j                  t        |j                  «      d«       | j                  |j                  d   d«       | j                  | j                  ddg«       y )NrÅ   r   r©  rÉ   )rB   rÐ   r  rI  r±  s      r4   r¸  zIMAP4ServerTests._cbTestExpunge  sK   € Ø×Ñœ˜QŸZ™Z›¨!Ô,Ø×Ñ˜Ÿ™ A™Ð(QÔRà×Ñ˜Ÿ™¨¨1 vÕ.r6   N)6rs   rt   ru   r*  r3  r<  rD  rL  rJ  r_  r\  rd  rm  r�  rˆ  r‡  r›  r¡  r¬  r·  r«  rÇ  rÆ  rÛ  rÚ  ré  rõ  r  r  r  r  r%  r+  r*  r8  r?  rG  rJ  rY  r]  rh  rp  ro  r‚  r€  r‘  r�  r™  r›  r¥  r¯  r®  r¹  r¸  r1   r6   r4   r  r  y  s  „ òIòGò.LòMò0ò4ò6ò6ò6ò 6ò,!6òF
@ò4òò<ò6Mò,"ò4
ò#2òJ
ò@ò2=òò&%òNò.ò*ò6ò*ò.=ò"@òò&ò*Pò&òò0	òò4Sò.Pò=ò6Eò"@òHEòò$!ò,ò"Nò2"ò
5ó@/r6   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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d„ Z d„ Z!d „ Z"d!„ Z#d"„ Z$d#„ Z%d$„ Z&d%„ Z'd&„ Z(d'„ Z)d(„ Z*y))*ÚIMAP4ServerParsingTestsz6
    Test L{imap4.IMAP4Server}'s command parsing.
    c                óÒ   — t        «       | _        t        j                  «       | _        | j                  j                  | j                  «       | j                  j                  «        y r0   )r   rì  r   rÏ  rý  ÚmakeConnectionÚclearrR   s    r4   r  zIMAP4ServerParsingTests.setUp   sB   € Ü(Ó*ˆŒÜ×'Ñ'Ó)ˆŒØ�‰×"Ñ" 4§>¡>Ô2Ø�‰×ÑÕr6   c                ó„   — | j                   j                  t        j                  t	        j
                  «       «      «       y r0   ©rý  ÚconnectionLostr$   r   r   ÚConnectionDonerR   s    r4   r  z IMAP4ServerParsingTests.tearDown&  ó&   € Ø�‰×"Ñ"¤7§?¡?´5×3GÑ3GÓ3IÓ#JÕKr6   c                óè   ‡—  G d„ dt         «      Šˆfd„}d| j                  _        || j                  _        | j                  j	                  d«       | j                  | j                  ‰«      «       y)zO
        L{imap4.IMAP4Server} logs exceptions raised by parse methods.
        c                  ó   — e Zd ZdZy)úSIMAP4ServerParsingTests.test_parseMethodExceptionLogged.<locals>.UnhandledExceptionú1
            An unhandled exception.
            NrÇ  r1   r6   r4   ÚUnhandledExceptionrÇ  .  rs  r6   rÉ  c                ó   •— ‰‚r0   r1   )rÜ  rÉ  s    €r4   ÚraisesValueErrorzQIMAP4ServerParsingTests.test_parseMethodExceptionLogged.<locals>.raisesValueError3  s	   ø€ Ø$Ð$r6   Úcommandó   invalidN)rÞ  rý  Ú
parseStateÚparse_commandrÚ  rV  r~  )rE   rË  rÉ  s     @r4   Útest_parseMethodExceptionLoggedz7IMAP4ServerParsingTests.test_parseMethodExceptionLogged)  sX   ø€ ô
	¤ô 	ô
	%ð "+ˆ�‰ÔØ$4ˆ�‰Ô!à�‰× Ñ  Ô,à�‰˜×.Ñ.Ð/AÓBÕCr6   c                ó  — | j                   j                  d«       | j                  | j                  j	                  «       d«       | j                   j                  t        j                  t        j                  d«      «      «       y)z‚
        L{imap4.IMAP4Server.parse_command} sends a C{BAD} response to
        a line that includes a tag but no command.
        ó   001s   001 BAD Missing command
ÚDoneN)
rý  rÏ  rB   rì  r  rÂ  r$   r   r   rÃ  rR   s    r4   Útest_missingCommandz+IMAP4ServerParsingTests.test_missingCommand=  s]   € ð
 	�‰×!Ñ! &Ô)à×Ñ˜Ÿ™×-Ñ-Ó/Ð1OÔPà�‰×"Ñ"Ü�O‰OœE×0Ñ0°Ó8Ó9õ	
r6   c                óŽ   — | j                   j                  d«       | j                  | j                  j	                  «       d«       y)zf
        L{imap4.IMAP4Server.parse_command} sends a C{BAD} response to
        an empty line.
        r6   s   * BAD Null command
N)rý  rÏ  rB   rì  r  rR   s    r4   Útest_emptyLinez&IMAP4ServerParsingTests.test_emptyLineJ  s4   € ð
 	�‰×!Ñ! #Ô&à×Ñ˜Ÿ™×-Ñ-Ó/Ð1JÕKr6   c                ó   ‡— ˆfd„}|| j                   _        | j                   j                  dj                  |dg«      «       | j	                  | j
                  j                  «       dj                  ||g«      «       y)aV  
        Assert that the given exception results in the expected
        response.

        @param exception: The exception to raise.
        @type exception: L{Exception}

        @param tag: The IMAP tag.

        @type: L{bytes}

        @param expectedResponse: The expected bad response.
        @type expectedResponse: L{bytes}
        c                ó   •— ‰‚r0   r1   )ÚtagÚcmdÚrestÚ	exceptions      €r4   ÚraiseszDIMAP4ServerParsingTests.assertParseExceptionResponse.<locals>.raisesc  ó   ø€ ØˆOr6   r…  rÍ  N)rý  ÚdispatchCommandrÏ  r’   rB   rì  r  ©rE   rÜ  rÙ  ÚexpectedResponserÝ  s    `   r4   ÚassertParseExceptionResponsez4IMAP4ServerParsingTests.assertParseExceptionResponseS  sb   ø€ ô 	ð '-ˆ�‰Ô#à�‰×!Ñ! $§)¡)¨S°*Ð,=Ó">Ô?à×Ñ˜Ÿ™×-Ñ-Ó/°·±¸CÐAQÐ;RÓ1SÕTr6   c                óP   — | j                  t        j                  d«      dd«       y)zt
        When a parsing method raises L{IllegalClientResponse}, the
        server sends a C{BAD} response.
        úclient responserÒ  ó%   BAD Illegal syntax: client response
N)râ  r   ÚIllegalClientResponserR   s    r4   Ú'test_parsingRaisesIllegalClientResponsez?IMAP4ServerParsingTests.test_parsingRaisesIllegalClientResponsel  s'   € ð
 	×)Ñ)Ü×'Ñ'Ð(9Ó:ØØ6õ	
r6   c                óP   — | j                  t        j                  d«      dd«       y)zn
        When a parsing method raises L{IllegalOperation}, the server
        sends a C{NO} response.
        Ú	operationrÒ  ó!   NO Illegal operation: operation
N)râ  r   ÚIllegalOperationrR   s    r4   Ú*test_parsingRaisesIllegalOperationResponsezBIMAP4ServerParsingTests.test_parsingRaisesIllegalOperationResponsew  s&   € ð
 	×)Ñ)Ü×"Ñ" ;Ó/ØØ2õ	
r6   c                óP   — | j                  t        j                  d«      dd«       y)zt
        When a parsing method raises L{IllegalMailboxEncoding}, the
        server sends a C{NO} response.
        rž  rÒ  ó#   NO Illegal mailbox name: encoding
N)râ  r   rŸ  rR   s    r4   Ú(test_parsingRaisesIllegalMailboxEncodingz@IMAP4ServerParsingTests.test_parsingRaisesIllegalMailboxEncoding‚  s&   € ð
 	×)Ñ)Ü×(Ñ(¨Ó4ØØ4õ	
r6   c                óŽ   — | j                   j                  d«       | j                  | j                  j	                  «       d«       y)zi
        L{imap4.IMAP4Server} responds to an unsupported command with a
        C{BAD} response.
        s   001 HULLABALOOs   001 BAD Unsupported command
N)rý  rÚ  rB   rì  r  rR   s    r4   Útest_unsupportedCommandz/IMAP4ServerParsingTests.test_unsupportedCommand�  s5   € ð
 	�‰× Ñ Ð!2Ô3Ø×Ñ˜Ÿ™×-Ñ-Ó/Ð1SÕTr6   c                óÊ   — | j                   j                  d«       | j                  | j                  j	                  «       dt        d«      j                  d«      z   dz   «       y)z~
        L{imap4.IMAP4Server} responds with a C{BAD} response to a
        command with more arguments than expected.
        s   001 LOGIN A B Cs8   001 BAD Illegal syntax: Too many arguments for command: ó   Czutf-8r‹  N)rý  rÚ  rB   rì  r  rÛ   rC   rR   s    r4   Útest_tooManyArgumentsForCommandz7IMAP4ServerParsingTests.test_tooManyArgumentsForCommand•  s[   € ð
 	�‰× Ñ Ð!3Ô4Ø×ÑØ�N‰N× Ñ Ó"ð7ä�t“*×#Ñ# GÓ,ñ-ð ñõ	
r6   c                ód  ‡— ˆfd„}| j                  | j                  j                  d«       |f| j                  j                  dd z   | j                  _        | j                  j	                  |dd«       | j                  | j
                  j                  «       dj                  ||g«      «       y)aR  
        Assert that the given exception results in the expected
        response.

        @param exception: The exception to raise.
        @type exception: L{Exception}

        @param: The IMAP tag.

        @type: L{bytes}

        @param expectedResponse: The expected bad response.
        @type expectedResponse: L{bytes}
        c                ó   •— ‰‚r0   r1   )ÚserverInstancerÙ  rv  rw  rÜ  s       €r4   rÝ  zFIMAP4ServerParsingTests.assertCommandExceptionResponse.<locals>.raisesµ  rÞ  r6   ra  rÅ   Nó   LOGINs   user passwdr…  )rB   rý  rR  Úunauth_LOGINrß  rì  r  r’   rà  s    `   r4   ÚassertCommandExceptionResponsez6IMAP4ServerParsingTests.assertCommandExceptionResponse¥  sŠ   ø€ ô 	ð 	×Ñ˜Ÿ™×*Ñ*¨HÔ5à$* 9¨t¯{©{×/GÑ/GÈÈÐ/KÑ#Kˆ�‰Ô à�‰×#Ñ# C¨°>ÔBà×Ñ˜Ÿ™×-Ñ-Ó/°·±¸CÐAQÐ;RÓ1SÕTr6   c                óP   — | j                  t        j                  d«      dd«       y)zm
        When a command raises L{IllegalClientResponse}, the
        server sends a C{BAD} response.
        rä  rÒ  rå  N)rú  r   ræ  rR   s    r4   Ú'test_commandRaisesIllegalClientResponsez?IMAP4ServerParsingTests.test_commandRaisesIllegalClientResponseÀ  s'   € ð
 	×+Ñ+Ü×'Ñ'Ð(9Ó:ØØ6õ	
r6   c                óP   — | j                  t        j                  d«      dd«       y)zg
        When a command raises L{IllegalOperation}, the server sends a
        C{NO} response.
        ré  rÒ  rê  N)rú  r   rë  rR   s    r4   Ú*test_commandRaisesIllegalOperationResponsezBIMAP4ServerParsingTests.test_commandRaisesIllegalOperationResponseË  s&   € ð
 	×+Ñ+Ü×"Ñ" ;Ó/ØØ2õ	
r6   c                óP   — | j                  t        j                  d«      dd«       y)zm
        When a command raises L{IllegalMailboxEncoding}, the server
        sends a C{NO} response.
        rž  rÒ  rî  N)rú  r   rŸ  rR   s    r4   Ú(test_commandRaisesIllegalMailboxEncodingz@IMAP4ServerParsingTests.test_commandRaisesIllegalMailboxEncodingÖ  s&   € ð
 	×+Ñ+Ü×(Ñ(¨Ó4ØØ4õ	
r6   c                ó”   —  G d„ dt         «      }| j                   |d«      dd«       | j                  | j                  |«      «       y)z‚
        Wehn a command raises an unhandled exception, the server sends
        a C{BAD} response and logs the exception.
        c                  ó   — e Zd ZdZy)úXIMAP4ServerParsingTests.test_commandRaisesUnhandledException.<locals>.UnhandledExceptionrÈ  NrÇ  r1   r6   r4   rÉ  r  ç  rs  r6   rÉ  Ú	unhandledrÒ  s   BAD Server error: unhandled
N)rÞ  rú  rV  r~  )rE   rÉ  s     r4   Ú$test_commandRaisesUnhandledExceptionz<IMAP4ServerParsingTests.test_commandRaisesUnhandledExceptioná  sF   € ô	¤ô 	ð
 	×+Ñ+Ù˜{Ó+ØØ.ô	
ð 	�‰˜×.Ñ.Ð/AÓBÕCr6   c                ó°   — d| j                   _        | j                   j                  d«       | j                  | j                  j                  «       d«       y)zx
        A string literal whose length exceeds the maximum allowed
        length results in a C{BAD} response.
        rË   s   001 LOGIN {5}
sE   001 BAD Illegal syntax: Literal too long! I accept at most 4 octets
N)rý  Ú_literalStringLimitrÚ  rB   rì  r  rR   s    r4   Útest_stringLiteralTooLongz1IMAP4ServerParsingTests.test_stringLiteralTooLongô  sF   € ð
 +,ˆ�‰Ô'Ø�‰× Ñ Ð!5Ô6à×ÑØ�N‰N× Ñ Ó"ð.õ	
r6   c                ó|   — dD ]7  }| j                  t        j                  | j                  j                  |«       Œ9 y)zQ
        An empty string argument raises L{imap4.IllegalClientResponse}.
        )r6   r‹  r…  N©r×   r   ræ  rý  Úarg_astring)rE   rË  s     r4   Útest_arg_astringEmptyLinez1IMAP4ServerParsingTests.test_arg_astringEmptyLine  s8   € ð *ò 	ˆEØ×ÑÜ×+Ñ+¨T¯[©[×-DÑ-DÀeõñ	r6   c                ón   — | j                  t        j                  | j                  j                  d«       y)zh
        An unmatched quote in a string argument raises
        L{imap4.IllegalClientResponse}.
        s   "openNr
  rR   s    r4   Útest_arg_astringUnmatchedQuotesz7IMAP4ServerParsingTests.test_arg_astringUnmatchedQuotes  s)   € ð
 	×ÑÜ×'Ñ'¨¯©×)@Ñ)@À(õ	
r6   c                ón   — | j                  t        j                  | j                  j                  d«       y)zn
        An unmatched brace in a string literal's size raises
        L{imap4.IllegalClientResponse}.
        s   {0Nr
  rR   s    r4   Ú&test_arg_astringUnmatchedLiteralBracesz>IMAP4ServerParsingTests.test_arg_astringUnmatchedLiteralBraces  s'   € ð
 	×Ñœ%×5Ñ5°t·{±{×7NÑ7NÐPUÕVr6   c                ón   — | j                  t        j                  | j                  j                  d«       y)zc
        A non-integral string literal size raises
        L{imap4.IllegalClientResponse}.
        ó   {[object Object]}Nr
  rR   s    r4   Ú"test_arg_astringInvalidLiteralSizez:IMAP4ServerParsingTests.test_arg_astringInvalidLiteralSize  ó*   € ð
 	×ÑÜ×'Ñ'¨¯©×)@Ñ)@ÐBVõ	
r6   c                ón   — | j                  t        j                  | j                  j                  d«       y)z@
        An empty atom raises L{IllegalClientResponse}.
        r6   N©r×   r   ræ  rý  Úarg_atomrR   s    r4   Útest_arg_atomEmptyLinez.IMAP4ServerParsingTests.test_arg_atomEmptyLine$  s&   € ð 	×Ñœ%×5Ñ5°t·{±{×7KÑ7KÈSÕQr6   c                ón   — | j                  t        j                  | j                  j                  d«       y)zC
        A malformed atom raises L{IllegalClientResponse}.
        s    not an atom Nr  rR   s    r4   Útest_arg_atomMalformedAtomz2IMAP4ServerParsingTests.test_arg_atomMalformedAtom*  s*   € ð 	×ÑÜ×'Ñ'¨¯©×)=Ñ)=Ð?Oõ	
r6   c                ón   — | j                  t        j                  | j                  j                  d«       y)zN
        An empty parenthesized list raises L{IllegalClientResponse}.
        r6   N©r×   r   ræ  rý  Ú	arg_plistrR   s    r4   Útest_arg_plistEmptyLinez/IMAP4ServerParsingTests.test_arg_plistEmptyLine2  s&   € ð 	×Ñœ%×5Ñ5°t·{±{×7LÑ7LÈcÕRr6   c                óØ   — | j                  t        j                  | j                  j                  d«       | j                  t        j                  | j                  j                  d«       y)ze
        A parenthesized with unmatched parentheses raises
        L{IllegalClientResponse}.
        s   (foos   foo)Nr  rR   s    r4   Ú"test_arg_plistUnmatchedParenthesesz:IMAP4ServerParsingTests.test_arg_plistUnmatchedParentheses8  sH   € ð
 	×Ñœ%×5Ñ5°t·{±{×7LÑ7LÈgÔVØ×Ñœ%×5Ñ5°t·{±{×7LÑ7LÈgÕVr6   c                ón   — | j                  t        j                  | j                  j                  d«       y)zH
        An empty file literal raises L{IllegalClientResponse}.
        r6   N©r×   r   ræ  rý  Úarg_literalrR   s    r4   Útest_arg_literalEmptyLinez1IMAP4ServerParsingTests.test_arg_literalEmptyLine@  s'   € ð 	×Ñœ%×5Ñ5°t·{±{×7NÑ7NÐPSÕTr6   c                óØ   — | j                  t        j                  | j                  j                  d«       | j                  t        j                  | j                  j                  d«       y)zZ
        A literal with unmatched braces raises
        L{IllegalClientResponse}.
        s   {10s   10}Nr"  rR   s    r4   Útest_arg_literalUnmatchedBracesz7IMAP4ServerParsingTests.test_arg_literalUnmatchedBracesF  sJ   € ð
 	×Ñœ%×5Ñ5°t·{±{×7NÑ7NÐPVÔWØ×Ñœ%×5Ñ5°t·{±{×7NÑ7NÐPVÕWr6   c                ón   — | j                  t        j                  | j                  j                  d«       y)z\
        A non-integral literal size raises
        L{imap4.IllegalClientResponse}.
        r  Nr"  rR   s    r4   Ú"test_arg_literalInvalidLiteralSizez:IMAP4ServerParsingTests.test_arg_literalInvalidLiteralSizeN  r  r6   c                óh   — d}| j                   j                  |«      \  }}| j                  |d«       y)zH
        A sequence set returns the unparsed portion of a line.
        s   1:* blah blah blahs   blah blah blahN)rý  Ú
arg_seqsetrB   )rE   Úsequencer&  rÛ  s       r4   Útest_arg_seqsetReturnsRestz2IMAP4ServerParsingTests.test_arg_seqsetReturnsRestW  s2   € ð )ˆØ—+‘+×(Ñ(¨Ó2‰ˆˆ4Ø×Ñ˜Ð0Õ1r6   c                ón   — | j                  t        j                  | j                  j                  d«       y)zL
        An invalid sequence raises L{imap4.IllegalClientResponse}.
        s   x:yN)r×   r   ræ  rý  r*  rR   s    r4   Útest_arg_seqsetInvalidSequencez6IMAP4ServerParsingTests.test_arg_seqsetInvalidSequence_  s&   € ð 	×Ñœ%×5Ñ5°t·{±{×7MÑ7MÈvÕVr6   c                óŒ   — d}| j                   j                  |«      \  }}| j                  ||g«       | j                  |«       y)zJ
        A single flag that is not contained in a list is parsed.
        s   flagN)rý  Úarg_flaglistrB   rT  )rE   ÚflagrŽ  rÛ  s       r4   Útest_arg_flaglistOneFlagz0IMAP4ServerParsingTests.test_arg_flaglistOneFlage  sA   € ð ˆØ—{‘{×/Ñ/°Ó5‰ˆ�Ø×Ñ˜ $ Ô(Ø×Ñ˜Õr6   c                ón   — | j                  t        j                  | j                  j                  d«       y)zk
        A list of flags with unmatched parentheses raises
        L{imap4.IllegalClientResponse}.
        s   (invalidN©r×   r   ræ  rý  r0  rR   s    r4   Ú&test_arg_flaglistMismatchedParentehsesz>IMAP4ServerParsingTests.test_arg_flaglistMismatchedParentehsesn  s+   € ð
 	×ÑÜ×'Ñ'Ø�K‰K×$Ñ$Øõ	
r6   c                óØ   — | j                  t        j                  | j                  j                  d«       | j                  t        j                  | j                  j                  d«       y)zo
        A list of flags that contains a malformed flag raises
        L{imap4.IllegalClientResponse}.
        s	   (first  )s   (first  second)Nr4  rR   s    r4   Útest_arg_flaglistMalformedFlagz6IMAP4ServerParsingTests.test_arg_flaglistMalformedFlagy  sQ   € ð
 	×ÑÜ×'Ñ'¨¯©×)AÑ)AÀ?ô	
ð 	×ÑÜ×'Ñ'¨¯©×)AÑ)AÐCXõ	
r6   c                óŠ   — d}| j                   j                  |«      \  }}| j                  |«       | j                  ||«       y)z�
        A line that does not begin with an open parenthesis (C{(}) is
        parsed as L{None}, and the remainder is the whole line.
        s   not (N)rý  Ú	opt_plistr´  rB   )rE   rÜ  ÚplistÚ	remainders       r4   Ú$test_opt_plistMissingOpenParenthesisz<IMAP4ServerParsingTests.test_opt_plistMissingOpenParenthesis…  s@   € ð
 ˆØŸ;™;×0Ñ0°Ó6ÑˆˆyØ×Ñ˜%Ô Ø×Ñ˜ DÕ)r6   c                óŠ   — d}| j                   j                  |«      \  }}| j                  |«       | j                  ||«       y)zŠ
        A line that does not begin with a double quote (C{"}) is
        parsed as L{None}, and the remainder is the whole line.
        s   not "N)rý  Úopt_datetimer´  rB   )rE   rÜ  Údtr;  s       r4   Ú!test_opt_datetimeMissingOpenQuotez9IMAP4ServerParsingTests.test_opt_datetimeMissingOpenQuote�  s?   € ð
 ˆØŸ™×0Ñ0°Ó6‰ˆˆIØ×Ñ˜"ÔØ×Ñ˜ DÕ)r6   c                ór   — d}| j                  t        j                  | j                  j                  |«       y)zx
        A line that does not have a closing double quote (C{"}) raises
        L{imap4.IllegalClientResponse}.
        s   "21-Jul-2017 19:37:07 -0700N)r×   r   ræ  rý  r>  rÛ  s     r4   Ú"test_opt_datetimeMissingCloseQuotez:IMAP4ServerParsingTests.test_opt_datetimeMissingCloseQuote™  s,   € ð
 .ˆØ×Ñœ%×5Ñ5°t·{±{×7OÑ7OÐQUÕVr6   c                ór   — d}| j                  t        j                  | j                  j                  |«       y)z€
        A line that contains C{CHARSET} but no character set
        identifier raises L{imap4.IllegalClientResponse}.
        r•  N)r×   r   ræ  rý  Úopt_charsetrÛ  s     r4   Ú!test_opt_charsetMissingIdentifierz9IMAP4ServerParsingTests.test_opt_charsetMissingIdentifier¡  s,   € ð
 ˆØ×Ñœ%×5Ñ5°t·{±{×7NÑ7NÐPTÕUr6   c                óŒ   — d}| j                   j                  |«      \  }}| j                  |d«       | j                  |d«       y)zŒ
        A line that ends with a C{CHARSET} identifier is parsed as
        that identifier, and the remainder is the empty string.
        s   CHARSET UTF-8ó   UTF-8r6   N©rý  rD  rB   ©rE   rÜ  Ú
identifierr;  s       r4   Útest_opt_charsetEndOfLinez1IMAP4ServerParsingTests.test_opt_charsetEndOfLine©  sB   € ð
  ˆØ $§¡× 7Ñ 7¸Ó =Ñˆ
�IØ×Ñ˜ XÔ.Ø×Ñ˜ CÕ(r6   c                óŒ   — d}| j                   j                  |«      \  }}| j                  |d«       | j                  |d«       y)z¨
        A line that has additional data after a C{CHARSET} identifier
        is parsed as that identifier, and the remainder is that
        additional data.
        s   CHARSET UTF-8 remainderrG  s	   remainderNrH  rI  s       r4   Útest_opt_charsetWithRemainderz5IMAP4ServerParsingTests.test_opt_charsetWithRemainder³  sB   € ð *ˆØ $§¡× 7Ñ 7¸Ó =Ñˆ
�IØ×Ñ˜ XÔ.Ø×Ñ˜ LÕ1r6   N)+rs   rt   ru   r3  r  r  rÐ  rÔ  rÖ  râ  rç  rì  rï  rñ  rô  rú  rü  rþ  r   r  r  r  r  r  r  r  r  r  r   r$  r&  r(  r,  r.  r2  r5  r7  r<  r@  rB  rE  rK  rM  r1   r6   r4   r¼  r¼    sÚ   „ ñòòLòDò(
òLòUò2	
ò	
ò	
òUò
ò Uò6	
ò	
ò	
òDò&
òò
òWò
òRò
òSòWòUòXò
ò2òWòò	
ò

ò*ò*òWòVò)ó	2r6   r¼  c                  óX   — 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y)ÚIMAP4ServerSearchTestszS
    Tests for the behavior of the search_* functions in L{imap4.IMAP4Server}.
    c                óš   — t         j                  | «       dg| _        dg| _        dg| _        d| _        t        ddig ddd	d «      | _        y )
Nz10-Dec-2009z13-Dec-2009z16-Dec-2009r   rŽ  zMon, 13 Dec 2009 21:25:10 GMTz13 Dec 2009 00:00:00 GMTr(  éÒ  )rø  r  ÚearlierQueryÚsameDateQueryÚ
laterQueryÚseqr˜   r�   rR   s    r4   r  zIMAP4ServerSearchTests.setUpÄ  sX   € Ü×Ñ˜tÔ$Ø*˜OˆÔØ+˜_ˆÔØ(˜/ˆŒØˆŒÜØÐ4Ð5ØØ&ØØØó
ˆ�r6   c                ó,  — | j                  | j                  j                  | j                  | j                  | j
                  «      «       | j                  | j                  j                  | j                  | j                  | j
                  «      «       y)z�
        L{imap4.IMAP4Server.search_SENTBEFORE} returns True if the message date
        is earlier than the query date.
        N)rT  rý  Úsearch_SENTBEFORErR  rU  r�   rV  rT  rR   s    r4   Útest_searchSentBeforez,IMAP4ServerSearchTests.test_searchSentBeforeÓ  sf   € ð
 	×ÑØ�K‰K×)Ñ)¨$×*;Ñ*;¸T¿X¹XÀtÇxÁxÓPô	
ð 	�‰Ø�K‰K×)Ñ)¨$¯/©/¸4¿8¹8ÀTÇXÁXÓNõ	
r6   c                ó�  — | j                  | j                  j                  dg| j                  | j                  d«      «       | j                  | j                  j                  dg| j                  | j                  d«      «       | j                  | j                  j                  dg| j                  | j                  d«      «       y)zq
        L{imap4.IMAP4Server.search_UID} returns True if the message UID is in
        the search range.
        rì   )rÅ   rQ  s   2:*rÞ   N)rT  rý  Ú
search_UIDrU  r�   rV  rR   s    r4   Útest_searchWildcardz*IMAP4ServerSearchTests.test_searchWildcardß  sŒ   € ð
 	×ÑØ�K‰K×"Ñ" F 8¨T¯X©X°t·x±xÀÓKô	
ð 	�‰˜Ÿ™×.Ñ.°¨x¸¿¹À4Ç8Á8ÈYÓWÔXØ�‰˜Ÿ™×.Ñ.°¨v°t·x±xÀÇÁÈ9ÓUÕVr6   c                óˆ   — | j                  | j                  j                  dg| j                  | j                  d«      «       y)z›
        L{imap4.IMAP4Server.search_UID} should return True if there is a
        wildcard, because a wildcard means "highest UID in the mailbox".
        s   1235:*)rQ  rÅ   N)rV  rý  rZ  rU  r�   rR   s    r4   Útest_searchWildcardHighz.IMAP4ServerSearchTests.test_searchWildcardHighë  s2   € ð
 	�‰Ø�K‰K×"Ñ" I ;°·±¸$¿(¹(ÀIÓNõ	
r6   c                óh   — t        j                  d«      }| j                  t        |«      g d¢«       y)ú|
        L{imap4.IMAP4Server.search_SENTON} returns True if the message date is
        the same as the query date.
        r>  r$  N)r   rã   rB   rÑ   )rE   Úmsgsets     r4   Útest_reversedSearchTermsz/IMAP4ServerSearchTests.test_reversedSearchTermsô  s(   € ô
 ×"Ñ" 6Ó*ˆØ×Ñœ˜f›¢yÕ1r6   c                óÀ  — | j                  | j                  j                  | j                  | j                  | j
                  «      «       | j                  | j                  j                  | j                  | j                  | j
                  «      «       | j                  | j                  j                  | j                  | j                  | j
                  «      «       y)r_  N)	rT  rý  Úsearch_SENTONrR  rU  r�   rV  rS  rT  rR   s    r4   Útest_searchSentOnz(IMAP4ServerSearchTests.test_searchSentOnü  s—   € ð
 	×ÑØ�K‰K×%Ñ% d×&7Ñ&7¸¿¹À4Ç8Á8ÓLô	
ð 	�‰Ø�K‰K×%Ñ% d×&8Ñ&8¸$¿(¹(ÀDÇHÁHÓMô	
ð 	×Ñ˜Ÿ™×2Ñ2°4·?±?ÀDÇHÁHÈdÏhÉhÓWÕXr6   c                ó,  — | j                  | j                  j                  | j                  | j                  | j
                  «      «       | j                  | j                  j                  | j                  | j                  | j
                  «      «       y)z~
        L{imap4.IMAP4Server.search_SENTSINCE} returns True if the message date
        is later than the query date.
        N)rV  rý  Úsearch_SENTSINCErR  rU  r�   rT  rT  rR   s    r4   Útest_searchSentSincez+IMAP4ServerSearchTests.test_searchSentSince	  sf   € ð
 	�‰Ø�K‰K×(Ñ(¨×):Ñ):¸D¿H¹HÀdÇhÁhÓOô	
ð 	×ÑØ�K‰K×(Ñ(¨¯©¸$¿(¹(ÀDÇHÁHÓMõ	
r6   c                óD  — | j                  | j                  j                  dg| j                  z   dgz   | j                  z   | j
                  | j                  d«      «       | j                  | j                  j                  dg| j                  z   dgz   | j                  z   | j
                  | j                  d«      «       | j                  | j                  j                  dg| j                  z   dgz   | j                  z   | j
                  | j                  d«      «       y)z­
        L{imap4.IMAP4Server.search_OR} returns true if either of the two
        expressions supplied to it returns true and returns false if neither
        does.
        Ú	SENTSINCEr  ÚSENTONN)rV  rý  Ú	search_ORrR  rT  rU  r�   rT  rR   s    r4   Útest_searchOrz$IMAP4ServerSearchTests.test_searchOr  sõ   € ð 	�‰Ø�K‰K×!Ñ!Ø� × 1Ñ 1Ñ1°[°MÑAÀDÇOÁOÑSØ—‘Ø—‘Øó	ô	
ð 	�‰Ø�K‰K×!Ñ!Ø� §¡Ñ/°;°-Ñ?À$×BSÑBSÑSØ—‘Ø—‘Øó	ô	
ð 	×ÑØ�K‰K×!Ñ!Ø�
˜TŸ_™_Ñ,°¨}Ñ<¸t¿¹ÑNØ—‘Ø—‘Øó	õ	
r6   c                ó@  — | j                  | j                  j                  dg| j                  z   | j                  | j
                  d«      «       | j                  | j                  j                  dg| j                  z   | j                  | j
                  d«      «       y)z~
        L{imap4.IMAP4Server.search_NOT} returns the negation of the result
        of the expression supplied to it.
        ri  r  rj  N)rT  rý  Ú
search_NOTrR  rU  r�   rV  rT  rR   s    r4   Útest_searchNotz%IMAP4ServerSearchTests.test_searchNot4  s~   € ð
 	×ÑØ�K‰K×"Ñ"Ø� × 1Ñ 1Ñ1°4·8±8¸T¿X¹XÀ|óô	
ð
 	�‰Ø�K‰K×"Ñ"Ø�
˜TŸ_™_Ñ,¨d¯h©h¸¿¹À,óõ	
r6   c                óÀ  — | j                  | j                  j                  | j                  | j                  | j
                  «      «       | j                  | j                  j                  | j                  | j                  | j
                  «      «       | j                  | j                  j                  | j                  | j                  | j
                  «      «       y)z€
        L{imap4.IMAP4Server.search_BEFORE} returns True if the
        internal message date is before the query date.
        N)	rT  rý  Úsearch_BEFORErR  rU  r�   rS  rV  rT  rR   s    r4   Útest_searchBeforez(IMAP4ServerSearchTests.test_searchBeforeD  s—   € ð
 	×ÑØ�K‰K×%Ñ% d×&7Ñ&7¸¿¹À4Ç8Á8ÓLô	
ð 	×ÑØ�K‰K×%Ñ% d×&8Ñ&8¸$¿(¹(ÀDÇHÁHÓMô	
ð 	�‰˜Ÿ™×1Ñ1°$·/±/À4Ç8Á8ÈTÏXÉXÓVÕWr6   c                óÀ  — | j                  | j                  j                  | j                  | j                  | j
                  «      «       | j                  | j                  j                  | j                  | j                  | j
                  «      «       | j                  | j                  j                  | j                  | j                  | j
                  «      «       y)z�
        L{imap4.IMAP4Server.search_ON} returns True if the
        internal message date is the same as the query date.
        N)rT  rý  Ú	search_ONrR  rU  r�   rS  rT  rR   s    r4   Útest_searchOnz$IMAP4ServerSearchTests.test_searchOnQ  s�   € ð
 	×Ñ˜Ÿ™×.Ñ.¨t×/@Ñ/@À$Ç(Á(ÈDÏHÉHÓUÔVØ×Ñ˜Ÿ™×.Ñ.¨t×/AÑ/AÀ4Ç8Á8ÈTÏXÉXÓVÔWØ×Ñ˜Ÿ™×.Ñ.¨t¯©ÀÇÁÈ$Ï(É(ÓSÕTr6   c                óÀ  — | j                  | j                  j                  | j                  | j                  | j
                  «      «       | j                  | j                  j                  | j                  | j                  | j
                  «      «       | j                  | j                  j                  | j                  | j                  | j
                  «      «       y)z…
        L{imap4.IMAP4Server.search_SINCE} returns True if the
        internal message date is greater than the query date.
        N)	rV  rý  Úsearch_SINCErR  rU  r�   rS  rT  rT  rR   s    r4   Útest_searchSincez'IMAP4ServerSearchTests.test_searchSinceZ  s�   € ð
 	�‰˜Ÿ™×0Ñ0°×1BÑ1BÀDÇHÁHÈdÏhÉhÓWÔXØ�‰Ø�K‰K×$Ñ$ T×%7Ñ%7¸¿¹À4Ç8Á8ÓLô	
ð 	×Ñ˜Ÿ™×1Ñ1°$·/±/À4Ç8Á8ÈTÏXÉXÓVÕWr6   N)rs   rt   ru   r3  r  rX  r[  r]  ra  rd  rg  rl  ro  rr  ru  rx  r1   r6   r4   rO  rO  ¿  sH   „ ñò
ò

ò
Wò
ò2òYò

ò
ò>
ò XòUó	Xr6   rO  c                  ó"   — e Zd ZdZdZdd„Zd„ Zy)rÐ  z”
    A L{IRealm} for tests.

    @cvar theAccount: An C{Account} instance.  Tests can set this to
        ensure predictable account retrieval.
    Nc                ó6   ‡ ‡— ‰rˆfd„‰ _         yˆ fd„‰ _         y)ab  
        Create a realm for testing.

        @param accountHolder: (optional) An object whose C{theAccount}
            attribute will be returned instead of
            L{TestRealm.theAccount}.  Attribute access occurs on every
            avatar request, so any modifications to
            C{accountHolder.theAccount} will be reflected here.
        c                 ó   •— ‰ j                   S r0   ©rÝ  rÌ  s   €r4   r5   z$TestRealm.__init__.<locals>.<lambda>|  s   ø€  }×'?Ñ'?€ r6   c                 ó   •— ‰ j                   S r0   r|  rR   s   €r4   r5   z$TestRealm.__init__.<locals>.<lambda>~  s   ø€  t§¡€ r6   N)Ú_getAccount)rE   rÍ  s   ``r4   rz   zTestRealm.__init__q  s   ù€ ñ Û?ˆDÕã6ˆDÕr6   c                óF   — t         j                  | j                  «       d„ fS )Nc                  ó   — y r0   r1   r1   r6   r4   r5   z)TestRealm.requestAvatar.<locals>.<lambda>�  rh  r6   )r   ÚIAccountr~  )rE   ÚavatarIdÚmindr   s       r4   rl  zTestRealm.requestAvatar€  s   € Ü�~‰~˜t×/Ñ/Ó1±<Ð?Ð?r6   r0   )rs   rt   ru   r3  rÝ  rz   rl  r1   r6   r4   rÐ  rÐ  f  s   „ ñð €Jó7ó@r6   rÐ  c                  ó(   — e Zd ZeefZddiZd„ Zd„ Zy)ÚTestCheckerrÊ  ó   secretc                óê   — |j                   | j                  v r[t        j                  |j                  | j                  |j                      «      j                  | j                  |j                   «      S y r0   )Úusernamer†  r   ÚmaybeDeferredÚcheckPasswordr›   Ú_cbCheck)rE   Úcredentialss     r4   ÚrequestAvatarIdzTestChecker.requestAvatarId‰  s\   € Ø×Ñ 4§:¡:Ñ-Ü×&Ñ&Ø×)Ñ)¨4¯:©:°k×6JÑ6JÑ+Kóç‰k˜$Ÿ-™-¨×)=Ñ)=Ó>ð?ð .r6   c                ó   — |r|S t        «       ‚r0   r   )rE   r2   rˆ  s      r4   r‹  zTestChecker._cbCheck�  s   € ÙØˆOÜÓ!Ð!r6   N)	rs   rt   ru   r   r   ÚcredentialInterfacesr†  r�  r‹  r1   r6   r4   r…  r…  „  s"   „ Ø3Ð5FÐGÐà˜)Ð$€Eò?ó"r6   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d„ Zd„ Zd„ Zd„ Zd„ Zd„ Zy)ÚAuthenticatorTestsc                ó.  — t         j                  | «       t        «       }t        d«      |_        t        |«      | _        | j                  j                  t        «       «       | j                  | j                  _        d| _
        |j                  | _        y )NrÊ  r   )rø  r  rÐ  rÆ  rÝ  r   rÓ  rÔ  r…  rý  ÚauthenticatedrQ  )rE   rØ  s     r4   r  zAuthenticatorTests.setUp–  sh   € Ü×Ñ˜tÔ$ä“ˆÜ" ;Ó/ˆÔÜ˜U“mˆŒØ�‰×#Ñ#¤K£MÔ2Ø!Ÿ[™[ˆ�‰ÔàˆÔØ×'Ñ'ˆ�r6   c                ó
  — t        t        t        «       G d„ d«      «       } |«       }t        t        |«       t	        j
                  d|i«      }| j                  |_        t        «       }|j                  |«       | j                  |j                  t        j                  d«      «       | j                  d|j                  «       «       |j                  «        |j!                  d«       | j                  t#        j$                  |j'                  «       «      |j                  «       «       |j                  «        |j!                  t#        j$                  d«      dz   «       | j)                  |j                  «       d	«       y
)z¡
        L{imap4.IMAP4Server} accepts a L{dict} mapping challenge type
        names to L{twisted.mail.interfaces.IChallengeResponse}
        providers.
        c                  ó$   — e Zd Zd„ Zd„ Zd„ Zd„ Zy)ú>AuthenticatorTests.test_customChallengers.<locals>.SPECIALAuthc                 ó   — y)Nó   SPECIALr1   rR   s    r4   ÚgetChallengezKAuthenticatorTests.test_customChallengers.<locals>.SPECIALAuth.getChallenge«  ó   € Ø!r6   c                óB   — |j                  d d«      \  | _        | _        y rs  )Úsplitrˆ  Úpassword©rE   Úresponses     r4   ÚsetResponsezJAuthenticatorTests.test_customChallengers.<locals>.SPECIALAuth.setResponse®  s   € Ø/7¯~©~¸dÀAÓ/FÑ,�”˜t�}r6   c                 ó   — y©NFr1   rR   s    r4   ÚmoreChallengeszMAuthenticatorTests.test_customChallengers.<locals>.SPECIALAuth.moreChallenges±  s   € Ør6   c                ó&   — | j                   | _         y r0   )r�  )rE   r�  s     r4   rŠ  zLAuthenticatorTests.test_customChallengers.<locals>.SPECIALAuth.checkPassword´  s   € Ø $§¡�•r6   N)rs   rt   ru   r™  r   r£  rŠ  r1   r6   r4   ÚSPECIALAuthr–  ©  s   „ ò"òGòó.r6   r¥  r˜  úConnection done.s   AUTH=SPECIALs   001 AUTHENTICATE SPECIAL
s   username passwordr‹  s"   001 OK Authentication successful
N)r   r    r   r   r   rÏ  rÓ  r   r¾  Ú
addCleanuprÂ  r   rÃ  r  r  r¿  ÚdataReceivedÚbase64Ú	b64encoder™  rB   )rE   r¥  Úspecialrý  rì  s        r4   Útest_customChallengersz)AuthenticatorTests.test_customChallengers¢  s&  € ô 
Ô'Ô):Ó	;÷	.ð 	.ó 
<ð	.ñ “-ˆÜÔ'¨Ô1ä×"Ñ" J°Ð#<Ó=ˆØŸ™ˆŒä#Ó%ˆ	Ø×Ñ˜iÔ(Ø�‰˜×-Ñ-¬u×/CÑ/CÐDVÓ/WÔXà�‰�o y§¡Ó'8Ô9à�‰ÔØ×ÑÐ;Ô<à�‰”f×&Ñ& w×';Ñ';Ó'=Ó>À	ÇÁÓ@QÔRà�‰ÔØ×ÑœF×,Ñ,Ð-AÓBÀWÑLÔMà×Ñ˜Ÿ™Ó*Ð,SÕTr6   c                ód  — t        j                  «       }| j                  |_        t        «       }|j	                  |«       | j                  |j                  t        j                  d«      «       |j                  «        |j                  d«       | j                  |j                  «       d«       y)z_
        An unsupported C{AUTHENTICATE} method results in a negative
        response.
        r¦  s   001 AUTHENTICATE UNKNOWN
s(   001 NO AUTHENTICATE method unsupported
N)r   rÏ  rÓ  r   r¾  r§  rÂ  r   rÃ  r¿  r¨  rB   r  )rE   rý  rì  s      r4   Útest_unsupportedMethodz)AuthenticatorTests.test_unsupportedMethodÍ  s‡   € ô
 ×"Ñ"Ó$ˆØŸ™ˆŒä#Ó%ˆ	Ø×Ñ˜iÔ(Ø�‰˜×-Ñ-¬u×/CÑ/CÐDVÓ/WÔXà�‰Ôà×ÑÐ;Ô<Ø×ÑØ�O‰OÓÐLõ	
r6   c                óô  ‡ — t         j                  ‰ j                  j                  d<   t        j                  d«      }‰ j
                  j                  |«       d‰ j                  _        ˆ fd„}‰ j                  j                  t        |«      «      }|j                  ‰ j                  d«       |j                  ‰ j                  ‰ j                  «       t!        j"                  |‰ j%                  «       g«      S )zv
        An L{imap4.IMAP4Server} that is missing a L{Portal} responds
        negatively to an authentication
        rø  rÊ  Nc                 ó:   •— ‰ j                   j                  d«      S ©Nr†  ©rþ  ÚauthenticaterR   s   €r4   rO  z3AuthenticatorTests.test_missingPortal.<locals>.authì  ó   ø€ Ø—;‘;×+Ñ+¨IÓ6Ð6r6   s    Temporary authentication failure)r   ÚLOGINCredentialsrý  r2  ÚLOGINAuthenticatorrþ  ÚregisterAuthenticatorrÓ  rÿ  r›   r7   r'  r  rÙ  r  r
  r   r(  r#   )rE   ÚcAuthrO  rž   s   `   r4   Útest_missingPortalz%AuthenticatorTests.test_missingPortalà  sº   ø€ ô
 -2×,BÑ,Bˆ�‰×Ñ Ñ)ä×(Ñ(¨Ó5ˆØ�‰×)Ñ)¨%Ô0à!ˆ�‰Ôô	7ð �N‰N×&Ñ&¤u¨T£{Ó3ˆØ	�‰Ø×+Ñ+Ð-Pô	
ð 	
�‰�t×)Ñ)¨4¯?©?Ô;ä×"Ñ" A t§}¡}£Ð#7Ó8Ð8r6   c                ó~  ‡ — t        t        «       G d„ d«      «       }t        t        «       G d„ d«      «       } |«       }t        t        |«       |‰ j                  j
                  d<   ‰ j                  j                   |«       «       ˆ fd„}‰ j                  j                  t        |«      «      }|j                  ‰ j                  dt        |j                  «      z   j                  d«      «       |j!                  ‰ j"                  ‰ j$                  «       t'        j(                  |‰ j+                  «       g«      S )	z�
        When a challenger's
        L{getChallenge<IChallengeResponse.getChallenge>} method raises
        any exception, a C{NO} response is sent.
        c                  ó"   — e Zd ZdZd„ Zd„ Zd„ Zy)úRAuthenticatorTests.test_challengerRaisesException.<locals>.ValueErrorAuthChallenges   A challenge failurec                ó,   — t        | j                  «      ‚r0   )r  r�  rR   s    r4   r™  z_AuthenticatorTests.test_challengerRaisesException.<locals>.ValueErrorAuthChallenge.getChallenge  s   € Ü  §¡Ó.Ð.r6   c                 ó   — y©zw
                Never called.

                @param response: See L{IChallengeResponse.setResponse}
                Nr1   rž  s     r4   r   z^AuthenticatorTests.test_challengerRaisesException.<locals>.ValueErrorAuthChallenge.setResponse  rh  r6   c                 ó   — y©z/
                Never called.
                Nr1   rR   s    r4   r£  zaAuthenticatorTests.test_challengerRaisesException.<locals>.ValueErrorAuthChallenge.moreChallenges  rh  r6   N©rs   rt   ru   r�  r™  r   r£  r1   r6   r4   ÚValueErrorAuthChallenger¼  þ  s   „ à,ˆGò/òór6   rÃ  c                  ó   — e Zd Zd„ Zd„ Zy)úRAuthenticatorTests.test_challengerRaisesException.<locals>.ValueErrorAuthenticatorc                 ó   — y)Nó   ERRORr1   rR   s    r4   ÚgetNamezZAuthenticatorTests.test_challengerRaisesException.<locals>.ValueErrorAuthenticator.getName  s   € Ør6   c                 ó   — y)Ns   IGNOREDr1   )rE   ÚsecretÚchals      r4   ÚchallengeResponsezdAuthenticatorTests.test_challengerRaisesException.<locals>.ValueErrorAuthenticator.challengeResponse  rš  r6   N)rs   rt   ru   rÈ  rÌ  r1   r6   r4   ÚValueErrorAuthenticatorrÅ    s   „ ò ó"r6   rÍ  rÇ  c                 ó:   •— ‰ j                   j                  d«      S r±  r²  rR   s   €r4   rO  z?AuthenticatorTests.test_challengerRaisesException.<locals>.auth  r´  r6   zServer error: r®  )r   r    r!   r   rý  r2  rþ  r·  rÿ  r›   r7   r'  r  rå   r�  rC   rÙ  r  r
  r   r(  r#   )rE   rÃ  rÍ  ÚbadrO  rž   s   `     r4   Útest_challengerRaisesExceptionz1AuthenticatorTests.test_challengerRaisesException÷  s	  ø€ ô 
Ô'Ó	(÷	ð 	ó 
)ð	ô$ 
Ô*Ó	+÷	"ð 	"ó 
,ð	"ñ &Ó'ˆÜÔ'¨Ô-à,Cˆ�‰×Ñ Ñ)Ø�‰×)Ñ)Ñ*AÓ*CÔDô	7ð �N‰N×&Ñ&¤u¨T£{Ó3ˆØ	�‰Ø×+Ñ+Ø¤Ð$;×$CÑ$CÓ DÑD×LÑLÈWÓUô	
ð 	
�‰�t×)Ñ)¨4¯?©?Ô;ä×"Ñ" A t§}¡}£Ð#7Ó8Ð8r6   c                ó$  — t        t        «       G d„ d«      «       } |«       }t        t        |«       t        j                  «       }| j
                  |_        ||j                  d<   t        «       }|j                  |«       | j                  |j                  t        j                  d«      «       | j                  d|j                  «       «       |j                  «        |j!                  d«       | j                  t#        j$                  |j'                  «       «      |j                  «       «       |j                  «        |j!                  d«       | j)                  |j                  «       dj+                  d	|j,                  d
g«      «       y)z‰
        A client that responds with a challenge that cannot be decoded
        as Base 64 receives an L{IllegalClientResponse}.
        c                  ó"   — e Zd ZdZd„ Zd„ Zd„ Zy)úEAuthenticatorTests.test_authNotBase64.<locals>.NotBase64AuthChallenges   Malformed Response - not base64c                 ó   — y)Ns   SomeChallenger1   rR   s    r4   r™  zRAuthenticatorTests.test_authNotBase64.<locals>.NotBase64AuthChallenge.getChallenge5  s   € Ø'r6   c                 ó   — yr¿  r1   rž  s     r4   r   zQAuthenticatorTests.test_authNotBase64.<locals>.NotBase64AuthChallenge.setResponse8  rh  r6   c                 ó   — yrÁ  r1   rR   s    r4   r£  zTAuthenticatorTests.test_authNotBase64.<locals>.NotBase64AuthChallenge.moreChallenges?  rh  r6   NrÂ  r1   r6   r4   ÚNotBase64AuthChallengerÓ  1  s   „ à8ˆGò(òór6   r×  s	   NOTBASE64r¦  s   AUTH=NOTBASE64s   001 AUTHENTICATE NOTBASE64
s     Not base64
r6   s   001 NO Authentication failed: r‹  N)r   r    r   r   rÏ  rÓ  r2  r   r¾  r§  rÂ  r   rÃ  r  r  r¿  r¨  r©  rª  r™  rB   r’   r�  )rE   r×  Ú	notBase64rý  rì  s        r4   Útest_authNotBase64z%AuthenticatorTests.test_authNotBase64+  s8  € ô 
Ô'Ó	(÷	ð 	ó 
)ð	ñ$ +Ó,ˆ	ÜÔ'¨Ô3ä×"Ñ"Ó$ˆØŸ™ˆŒØ+Aˆ×Ñ˜<Ñ(ä#Ó%ˆ	Ø×Ñ˜iÔ(Ø�‰˜×-Ñ-¬u×/CÑ/CÐDVÓ/WÔXà�‰Ð'¨¯©Ó):Ô;à�‰ÔØ×ÑÐ=Ô>à�‰”f×&Ñ& y×'=Ñ'=Ó'?Ó@À)Ç/Á/ÓBSÔTà�‰ÔØ×ÑÐ2Ô3à×ÑØ�O‰OÓØ�H‰HÐ7¸×9JÑ9JÈGÐTÓUõ	
r6   c                óF  ‡ — t        «       }t        |«      }|‰ j                  _        t        j
                  x‰ j                  j                  d<   }t        t        |«       t	        j                  d«      }‰ j                  j                  |«       ˆ fd„}‰ j                  j                  t        |«      «      }|j                  ‰ j                   d«       |j#                  ‰ j$                  ‰ j&                  «       t)        j*                  ‰ j-                  «       |g«      }|S )zÔ
        A challenger that causes the login to fail
        L{UnhandledCredentials} results in an C{NO} response.

        @return: A L{Deferred} that fires when the authorization has
            failed.
        rø  rÊ  c                 ó:   •— ‰ j                   j                  d«      S r±  r²  rR   s   €r4   rO  z:AuthenticatorTests.test_unhandledCredentials.<locals>.auths  r´  r6   s+   Authentication failed: server misconfigured)rÐ  r   rý  rÓ  r   rµ  r2  r   r    r¶  rþ  r·  rÿ  r›   r7   r'  r  rÙ  r  r
  r   r(  r#   )rE   rØ  rÓ  Ú	loginCredr¸  rO  r)  rž   s   `       r4   Útest_unhandledCredentialsz,AuthenticatorTests.test_unhandledCredentials^  sà   ø€ ô “ˆÜ˜“ˆð $ˆ�‰Ôä8=×8NÑ8NÐNˆ�‰×Ñ Ñ)¨IäÔ&¨	Ô2ä×(Ñ(¨Ó5ˆØ�‰×)Ñ)¨%Ô0ô	7ð �^‰^×'Ñ'¬¨d«Ó4ˆØ
�‰Ø×+Ñ+Ø:ô	
ð 	�‰˜×*Ñ*¨D¯O©OÔ<Ü×Ñ §¡£°"Ð 5Ó6ˆØˆr6   c                óê  ‡ ‡
—  G d„ dt         «      Š
 G ˆ
fd„d«      }t        «       }t        |«      }|j                   |«       «       |‰ j                  _        t        j                  x‰ j                  j                  d<   }t        t        |«       t        j                  d«      }‰ j                  j                  |«       ˆ fd„}ˆ
ˆ fd„}‰ j                  j                  t!        |«      «      }|j#                  ‰ j$                  d	«       |j                  t!        |«      «       |j'                  ‰ j(                  ‰ j*                  «       t-        j.                  ‰ j1                  «       |g«      }	|	S )
zÇ
        If the portal raises an exception other than
        L{UnauthorizedLogin} or L{UnhandledCredentials}, the server
        responds with a C{BAD} response and the exception is logged.
        c                  ó   — e Zd ZdZy)úKAuthenticatorTests.test_unexpectedLoginFailure.<locals>.UnexpectedExceptionrq  NrÇ  r1   r6   r4   rr  rà  †  rs  r6   rr  c                  ó$   •— e Zd ZdZeefZˆ fd„Zy)úFAuthenticatorTests.test_unexpectedLoginFailure.<locals>.FailingCheckerzz
            A credentials checker whose L{requestAvatarId} method
            raises L{UnexpectedException}.
            c                ó   •—  ‰d«      ‚)NzUnexpected error.r1   )rE   rŒ  rr  s     €r4   r�  zVAuthenticatorTests.test_unexpectedLoginFailure.<locals>.FailingChecker.requestAvatarId“  s   ø€ Ù)Ð*=Ó>Ð>r6   N)rs   rt   ru   r3  r   r   r�  r�  )rr  s   €r4   ÚFailingCheckerrâ  ‹  s   ø„ ñð
 %<Ð=NÐ#OÐ õ?r6   rä  rø  rÊ  c                 ó:   •— ‰ j                   j                  d«      S r±  r²  rR   s   €r4   rO  z<AuthenticatorTests.test_unexpectedLoginFailure.<locals>.auth¢  r´  r6   c                 óF   •— ‰j                  ‰j                  ‰ «      «       y r0   r}  )rr  rE   s   €€r4   ÚassertUnexpectedExceptionLoggedzWAuthenticatorTests.test_unexpectedLoginFailure.<locals>.assertUnexpectedExceptionLogged¥  s   ø€ Ø�O‰O˜D×2Ñ2Ð3FÓGÕHr6   s'   Server error: login failed unexpectedly)rÞ  rÐ  r   rÔ  rý  rÓ  r   rµ  r2  r   r    r¶  rþ  r·  rÿ  r›   r7   r'  r  rÙ  r  r
  r   r(  r#   )rE   rä  rØ  rÓ  rÜ  r¸  rO  rç  r)  rž   rr  s   `         @r4   Útest_unexpectedLoginFailurez.AuthenticatorTests.test_unexpectedLoginFailure  s  ù€ ô	¤)ô 	÷
		?ó 		?ô “ˆÜ˜“ˆØ×Ñ™~Ó/Ô0Ø#ˆ�‰Ôä8=×8NÑ8NÐNˆ�‰×Ñ Ñ)¨IäÔ&¨	Ô2ä×(Ñ(¨Ó5ˆØ�‰×)Ñ)¨%Ô0ô	7õ	Ið �^‰^×'Ñ'¬¨d«Ó4ˆØ
�‰Ø×+Ñ+Ð-Wô	
ð 	�‰”uÐ<Ó=Ô>Ø
�‰˜×*Ñ*¨D¯O©OÔ<Ü×Ñ §¡£°"Ð 5Ó6ˆØˆr6   c                ó  ‡ — t         ‰ j                  j                  d<   t        j                  d«      }‰ j
                  j                  |«       ˆ fd„}ˆ fd„}‰ j                  j                  t        |«      «      }|j                  t        |«      ‰ j                  «       |j                  ‰ j                  ‰ j                  «       ‰ j                  «       }t        j                  ||g«      }|j                  ‰ j                   «      S )Nr,  rÊ  c                 ó:   •— ‰ j                   j                  d«      S r±  r²  rR   s   €r4   rO  z,AuthenticatorTests.testCramMD5.<locals>.auth¶  r´  r6   c                 ó   •— d‰ _         y rs  ©r“  rR   s   €r4   Úauthedz.AuthenticatorTests.testCramMD5.<locals>.authed¹  ó   ø€ Ø!"ˆDÕr6   )r   rý  r2  r   ÚCramMD5ClientAuthenticatorrþ  r·  rÿ  r›   r7   rÙ  r
  r  r#   r   r(  Ú_cbTestCramMD5)rE   r¸  rO  rí  r)  r^  rž   s   `      r4   ÚtestCramMD5zAuthenticatorTests.testCramMD5±  s¿   ø€ Ü/Aˆ�‰×Ñ Ñ,Ü×0Ñ0°Ó=ˆØ�‰×)Ñ)¨%Ô0ô	7ô	#ð �^‰^×'Ñ'¬¨d«Ó4ˆØ
�‰œ˜f› t§¡Ô7Ø
�‰˜×*Ñ*¨D¯O©OÔ<Ø�]‰]‹_ˆÜ×Ñ  R Ó)ˆØ�}‰}˜T×0Ñ0Ó1Ð1r6   c                óœ   — | j                  | j                  d«       | j                  | j                  j                  | j                  «       y rs  ©rB   r“  rý  rQ  rS  s     r4   rð  z!AuthenticatorTests._cbTestCramMD5Ã  ó6   € Ø×Ñ˜×+Ñ+¨QÔ/Ø×Ñ˜Ÿ™×,Ñ,¨d¯l©lÕ;r6   c                ó  ‡ — t         ‰ j                  j                  d<   t        j                  d«      }‰ j
                  j                  |«       ˆ fd„}ˆ fd„}ˆ fd„}‰ j                  j                  t        |«      «      }|j                  t        |«      t        |«      «       |j                  ‰ j                  ‰ j                  «       t        j                  ‰ j                  «       |g«      }|j                  ‰ j                   «      S )Nr,  rÊ  c                 ó:   •— ‰ j                   j                  d«      S ©Ns   not the secretr²  rR   s   €r4   Úmisauthz5AuthenticatorTests.testFailedCramMD5.<locals>.misauthÌ  ó   ø€ Ø—;‘;×+Ñ+Ð,=Ó>Ð>r6   c                 ó   •— d‰ _         y rs  rì  rR   s   €r4   rí  z4AuthenticatorTests.testFailedCramMD5.<locals>.authedÏ  rî  r6   c                 ó   •— d‰ _         y ©Néÿÿÿÿrì  rR   s   €r4   Ú	misauthedz7AuthenticatorTests.testFailedCramMD5.<locals>.misauthedÒ  ó   ø€ Ø!#ˆDÕr6   )r   rý  r2  r   rï  rþ  r·  rÿ  r›   r7   rÙ  r  r
  r   r(  r#   Ú_cbTestFailedCramMD5©rE   r¸  rø  rí  rþ  r)  rž   s   `      r4   ÚtestFailedCramMD5z$AuthenticatorTests.testFailedCramMD5Ç  sÁ   ø€ Ü/Aˆ�‰×Ñ Ñ,Ü×0Ñ0°Ó=ˆØ�‰×)Ñ)¨%Ô0ô	?ô	#ô	$ð �^‰^×'Ñ'¬¨g«Ó7ˆØ
�‰œ˜f›¤u¨YÓ'7Ô8Ø
�‰˜×*Ñ*¨D¯O©OÔ<Ü×Ñ §¡£°"Ð 5Ó6ˆØ�}‰}˜T×6Ñ6Ó7Ð7r6   c                óˆ   — | j                  | j                  d«       | j                  | j                  j                  d «       y rü  ró  rS  s     r4   r   z'AuthenticatorTests._cbTestFailedCramMD5Û  ó2   € Ø×Ñ˜×+Ñ+¨RÔ0Ø×Ñ˜Ÿ™×,Ñ,¨dÕ3r6   c                óH  ‡ — t         j                  x‰ j                  j                  d<   }t	        t
        |«       t        j                  d«      }‰ j                  j                  |«       ˆ fd„}ˆ fd„}‰ j                  j                  t        |«      «      }|j                  t        |«      ‰ j                  «       |j                  ‰ j                  ‰ j                  «       t        j                   ‰ j#                  «       |g«      }|j                  ‰ j$                  «      S )Nrø  rÊ  c                 ó:   •— ‰ j                   j                  d«      S r±  r²  rR   s   €r4   rO  z*AuthenticatorTests.testLOGIN.<locals>.authç  r´  r6   c                 ó   •— d‰ _         y rs  rì  rR   s   €r4   rí  z,AuthenticatorTests.testLOGIN.<locals>.authedê  rî  r6   )r   rµ  rý  r2  r   r    r¶  rþ  r·  rÿ  r›   r7   rÙ  r
  r  r   r(  r#   Ú_cbTestLOGIN)rE   rÜ  r¸  rO  rí  r)  rž   s   `      r4   Ú	testLOGINzAuthenticatorTests.testLOGINß  óÑ   ø€ Ü8=×8NÑ8NÐNˆ�‰×Ñ Ñ)¨IäÔ&¨	Ô2ä×(Ñ(¨Ó5ˆØ�‰×)Ñ)¨%Ô0ô	7ô	#ð �^‰^×'Ñ'¬¨d«Ó4ˆØ
�‰œ˜f› t§¡Ô7Ø
�‰˜×*Ñ*¨D¯O©OÔ<Ü×Ñ §¡£°"Ð 5Ó6ˆØ�}‰}˜T×.Ñ.Ó/Ð/r6   c                óœ   — | j                  | j                  d«       | j                  | j                  j                  | j                  «       y rs  ró  rS  s     r4   r  zAuthenticatorTests._cbTestLOGINó  rô  r6   c                ó,  ‡ — t         j                  ‰ j                  j                  d<   t        j                  d«      }‰ j
                  j                  |«       ˆ fd„}ˆ fd„}ˆ fd„}‰ j                  j                  t        |«      «      }|j                  t        |«      t        |«      «       |j                  ‰ j                  ‰ j                  «       t        j                  ‰ j                  «       |g«      }|j                  ‰ j                   «      S )Nrø  rÊ  c                 ó:   •— ‰ j                   j                  d«      S r÷  r²  rR   s   €r4   rø  z3AuthenticatorTests.testFailedLOGIN.<locals>.misauthü  rù  r6   c                 ó   •— d‰ _         y rs  rì  rR   s   €r4   rí  z2AuthenticatorTests.testFailedLOGIN.<locals>.authedÿ  rî  r6   c                 ó   •— d‰ _         y rü  rì  rR   s   €r4   rþ  z5AuthenticatorTests.testFailedLOGIN.<locals>.misauthed  rÿ  r6   )r   rµ  rý  r2  r¶  rþ  r·  rÿ  r›   r7   rÙ  r  r
  r   r(  r#   Ú_cbTestFailedLOGINr  s   `      r4   ÚtestFailedLOGINz"AuthenticatorTests.testFailedLOGIN÷  óÇ   ø€ Ü,1×,BÑ,Bˆ�‰×Ñ Ñ)Ü×(Ñ(¨Ó5ˆØ�‰×)Ñ)¨%Ô0ô	?ô	#ô	$ð �^‰^×'Ñ'¬¨g«Ó7ˆØ
�‰œ˜f›¤u¨YÓ'7Ô8Ø
�‰˜×*Ñ*¨D¯O©OÔ<Ü×Ñ §¡£°"Ð 5Ó6ˆØ�}‰}˜T×4Ñ4Ó5Ð5r6   c                óˆ   — | j                  | j                  d«       | j                  | j                  j                  d «       y rü  ró  rS  s     r4   r  z%AuthenticatorTests._cbTestFailedLOGIN  r  r6   c                óH  ‡ — t         j                  x‰ j                  j                  d<   }t	        t
        |«       t        j                  d«      }‰ j                  j                  |«       ˆ fd„}ˆ fd„}‰ j                  j                  t        |«      «      }|j                  t        |«      ‰ j                  «       |j                  ‰ j                  ‰ j                  «       t        j                   ‰ j#                  «       |g«      }|j                  ‰ j$                  «      S )Nr”  rÊ  c                 ó:   •— ‰ j                   j                  d«      S r±  r²  rR   s   €r4   rO  z*AuthenticatorTests.testPLAIN.<locals>.auth  r´  r6   c                 ó   •— d‰ _         y rs  rì  rR   s   €r4   rí  z,AuthenticatorTests.testPLAIN.<locals>.authed  rî  r6   )r   ÚPLAINCredentialsrý  r2  r   r    ÚPLAINAuthenticatorrþ  r·  rÿ  r›   r7   rÙ  r
  r  r   r(  r#   Ú_cbTestPLAIN)rE   Ú	plainCredr¸  rO  rí  r)  rž   s   `      r4   Ú	testPLAINzAuthenticatorTests.testPLAIN  r
  r6   c                óœ   — | j                  | j                  d«       | j                  | j                  j                  | j                  «       y rs  ró  rS  s     r4   r  zAuthenticatorTests._cbTestPLAIN#  rô  r6   c                ó,  ‡ — t         j                  ‰ j                  j                  d<   t        j                  d«      }‰ j
                  j                  |«       ˆ fd„}ˆ fd„}ˆ fd„}‰ j                  j                  t        |«      «      }|j                  t        |«      t        |«      «       |j                  ‰ j                  ‰ j                  «       t        j                  ‰ j                  «       |g«      }|j                  ‰ j                   «      S )Nr”  rÊ  c                 ó:   •— ‰ j                   j                  d«      S r÷  r²  rR   s   €r4   rø  z3AuthenticatorTests.testFailedPLAIN.<locals>.misauth,  rù  r6   c                 ó   •— d‰ _         y rs  rì  rR   s   €r4   rí  z2AuthenticatorTests.testFailedPLAIN.<locals>.authed/  rî  r6   c                 ó   •— d‰ _         y rü  rì  rR   s   €r4   rþ  z5AuthenticatorTests.testFailedPLAIN.<locals>.misauthed2  rÿ  r6   )r   r  rý  r2  r  rþ  r·  rÿ  r›   r7   rÙ  r  r
  r   r(  r#   Ú_cbTestFailedPLAINr  s   `      r4   ÚtestFailedPLAINz"AuthenticatorTests.testFailedPLAIN'  r  r6   c                óˆ   — | j                  | j                  d«       | j                  | j                  j                  d «       y rü  ró  rS  s     r4   r!  z%AuthenticatorTests._cbTestFailedPLAIN;  r  r6   N)rs   rt   ru   r  r¬  r®  r¹  rÐ  rÙ  rÝ  rè  rñ  rð  r  r   r	  r  r  r  r  r  r"  r!  r1   r6   r4   r‘  r‘  •  sl   „ ò
(ò)UòV
ò&9ò.29òh1
òfòB0òd2ò$<ò8ò(4ò0ò(<ò6ò(4ò0ò(<ò6ó(4r6   r‘  c                  ó"   — e Zd ZdZd„ Zd„ Zd„ Zy)ÚSASLPLAINTestszé
    Tests for I{SASL PLAIN} authentication, as implemented by
    L{imap4.PLAINAuthenticator} and L{imap4.PLAINCredentials}.

    @see: U{http://www.faqs.org/rfcs/rfc2595.html}
    @see: U{http://www.faqs.org/rfcs/rfc4616.html}
    c                ó”   — d}d}d}t        j                  |«      }|j                  ||«      }| j                  |d|z   dz   |z   «       y)z�
        L{PLAINAuthenticator.challengeResponse} returns challenge strings of
        the form::

            NUL<authn-id>NUL<secret>
        rÊ  r†  s	   challengeó    N)r   r  rÌ  rB   )rE   rˆ  rÊ  rË  r¸  rŸ  s         r4   Ú#test_authenticatorChallengeResponsez2SASLPLAINTests.test_authenticatorChallengeResponseI  sT   € ð ˆØˆØˆÜ×(Ñ(¨Ó2ˆØ×*Ñ*¨6°4Ó8ˆØ×Ñ˜ 5¨8Ñ#3°eÑ#;¸fÑ#DÕEr6   c                ó¾   — t        j                  «       }|j                  d«       | j                  |j                  d«       | j                  |j
                  d«       y)z†
        L{PLAINCredentials.setResponse} parses challenge strings of the
        form::

            NUL<authn-id>NUL<secret>
        s    testuser secretrÊ  r†  N)r   r  r   rB   rˆ  r�  ©rE   Úcreds     r4   Útest_credentialsSetResponsez*SASLPLAINTests.test_credentialsSetResponseW  sI   € ô ×%Ñ%Ó'ˆØ×ÑÐ.Ô/Ø×Ñ˜Ÿ™¨Ô4Ø×Ñ˜Ÿ™¨	Õ2r6   c                ó.  — t        j                  «       }| j                  t         j                  |j                  d«       | j                  t         j                  |j                  d«       | j                  t         j                  |j                  d«       y)zŽ
        L{PLAINCredentials.setResponse} raises L{imap4.IllegalClientResponse}
        when passed a string not of the expected form.
        s   hellos   hello worlds   hello world Zoom! N)r   r  r×   ræ  r   r*  s     r4   Útest_credentialsInvalidResponsez.SASLPLAINTests.test_credentialsInvalidResponsec  su   € ô
 ×%Ñ%Ó'ˆØ×Ñœ%×5Ñ5°t×7GÑ7GÈÔRØ×ÑÜ×'Ñ'¨×)9Ñ)9¸?ô	
ð 	×ÑÜ×'Ñ'¨×)9Ñ)9Ð;Sõ	
r6   N)rs   rt   ru   r3  r(  r,  r.  r1   r6   r4   r%  r%  @  s   „ ñòFò
3ó
r6   r%  c                  óT   — 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y)ÚUnsolicitedResponseTestsc                óF  ‡ — ˆ fd„}ˆ fd„}‰ j                   j                  t        |«      «      }|j                  t        |«      «      j                  ‰ j                  «       t        j                  ‰ j                  «       |g«      }|j                  ‰ j                  «      S )Nc                 ó<   •— ‰ j                   j                  dd«      S rG  rz  rR   s   €r4   rH  z5UnsolicitedResponseTests.testReadWrite.<locals>.logint  r{  r6   c                 ó<   •— ‰ j                   j                  d«       y rs  ©rý  rê  rR   s   €r4   ró  z8UnsolicitedResponseTests.testReadWrite.<locals>.loggedInw  ó   ø€ Ø�K‰K×#Ñ# AÕ&r6   )	rÿ  r›   r7   r'  r
  r   r(  r#   Ú_cbTestReadWrite©rE   rH  ró  r)  rž   s   `    r4   ÚtestReadWritez&UnsolicitedResponseTests.testReadWrites  sw   ø€ ô	Dô	'ð �^‰^×'Ñ'¬¨e«Ó5ˆØ
�‰”u˜X“Ó'×2Ñ2°4·?±?ÔCÜ×Ñ §¡£°"Ð 5Ó6ˆØ�}‰}˜T×2Ñ2Ó3Ð3r6   c                óZ   — | j                   j                  }| j                  |ddgg«       y )Nrê  rÅ   ©rþ  rã  rB   ©rE   rT  ÚEs      r4   r6  z)UnsolicitedResponseTests._cbTestReadWrite  ó)   € Ø�K‰K×ÑˆØ×Ñ˜˜m¨QÐ/Ð0Õ1r6   c                óF  ‡ — ˆ fd„}ˆ fd„}‰ j                   j                  t        |«      «      }|j                  t        |«      «      j                  ‰ j                  «       t        j                  ‰ j                  «       |g«      }|j                  ‰ j                  «      S )Nc                 ó<   •— ‰ j                   j                  dd«      S rG  rz  rR   s   €r4   rH  z4UnsolicitedResponseTests.testReadOnly.<locals>.login„  r{  r6   c                 ó<   •— ‰ j                   j                  d«       y rÓ  r4  rR   s   €r4   ró  z7UnsolicitedResponseTests.testReadOnly.<locals>.loggedIn‡  r5  r6   )	rÿ  r›   r7   r'  r
  r   r(  r#   Ú_cbTestReadOnlyr7  s   `    r4   ÚtestReadOnlyz%UnsolicitedResponseTests.testReadOnlyƒ  sw   ø€ ô	Dô	'ð �^‰^×'Ñ'¬¨e«Ó5ˆØ
�‰”u˜X“Ó'×2Ñ2°4·?±?ÔCÜ×Ñ §¡£°"Ð 5Ó6ˆØ�}‰}˜T×1Ñ1Ó2Ð2r6   c                óZ   — | j                   j                  }| j                  |ddgg«       y )Nrê  r   r:  r;  s      r4   rA  z(UnsolicitedResponseTests._cbTestReadOnly�  r=  r6   c                ó^  ‡ ‡— ddgg dgdœŠˆ fd„}ˆˆ fd„}‰ j                   j                  t        |«      «      }|j                  t        |«      «      j                  ‰ j                  «       t        j                  ‰ j                  «       |g«      }|j                  ‰ j                  ‰«      S )Nú	\Answeredr‘  ú\Recent)rÅ   rÊ   rö   c                 ó<   •— ‰ j                   j                  dd«      S rG  rz  rR   s   €r4   rH  z6UnsolicitedResponseTests.testFlagChange.<locals>.login–  r{  r6   c                 ó<   •— ‰j                   j                  ‰ «       y r0   )rý  rð  )r�  rE   s   €€r4   ró  z9UnsolicitedResponseTests.testFlagChange.<locals>.loggedIn™  s   ø€ Ø�K‰K×$Ñ$ UÕ+r6   )	rÿ  r›   r7   r'  r
  r   r(  r#   Ú_cbTestFlagChange)rE   rH  ró  r)  rž   r�  s   `    @r4   ÚtestFlagChangez'UnsolicitedResponseTests.testFlagChange“  sŒ   ù€ Ø! ;Ð/°B¸Z¸LÑIˆô	Dõ	,ð �^‰^×'Ñ'¬¨e«Ó5ˆØ
�‰”u˜X“Ó'×2Ñ2°4·?±?ÔCÜ×Ñ §¡£°"Ð 5Ó6ˆØ�}‰}˜T×3Ñ3°UÓ;Ð;r6   c                óø   — | j                   j                  }|j                  «       D �cg c]  }d|d   |d   ig‘Œ }}|j                  d„ ¬«       |j                  d„ ¬«       | j	                  ||«       y c c}w )Nrð  r   rÅ   c                ó   — | d   S rÓ  r1   ©rp   s    r4   r5   z<UnsolicitedResponseTests._cbTestFlagChange.<locals>.<lambda>¤  s
   € ˜Q˜q™T€ r6   )Úkeyc                ó   — | d   S rÓ  r1   rM  s    r4   r5   z<UnsolicitedResponseTests._cbTestFlagChange.<locals>.<lambda>¥  s
   €  ! A¡$€ r6   )rþ  rã  Úitemsr½  rB   )rE   rT  r�  r<  r\  Úexpects         r4   rI  z*UnsolicitedResponseTests._cbTestFlagChange¡  sm   € Ø�K‰K×ÑˆØ:?¿+¹+»-ÖH°Q�> A a¡D¨!¨A©$ <Ò0ÐHˆÐHØ	�‰‘>ˆÔ"Ø�‰™ˆÔ'Ø×Ñ˜˜FÕ#ùò Is   ©A7c                óF  ‡ — ˆ fd„}ˆ fd„}‰ j                   j                  t        |«      «      }|j                  t        |«      «      j                  ‰ j                  «       t        j                  ‰ j                  «       |g«      }|j                  ‰ j                  «      S )Nc                 ó<   •— ‰ j                   j                  dd«      S rG  rz  rR   s   €r4   rH  z7UnsolicitedResponseTests.testNewMessages.<locals>.login©  r{  r6   c                 ó>   •— ‰ j                   j                  dd «       y ©Nrö   ©rý  rô  rR   s   €r4   ró  z:UnsolicitedResponseTests.testNewMessages.<locals>.loggedIn¬  s   ø€ Ø�K‰K×#Ñ# B¨Õ-r6   )	rÿ  r›   r7   r'  r
  r   r(  r#   Ú_cbTestNewMessagesr7  s   `    r4   ÚtestNewMessagesz(UnsolicitedResponseTests.testNewMessages¨  sw   ø€ ô	Dô	.ð �^‰^×'Ñ'¬¨e«Ó5ˆØ
�‰”u˜X“Ó'×2Ñ2°4·?±?ÔCÜ×Ñ §¡£°"Ð 5Ó6ˆØ�}‰}˜T×4Ñ4Ó5Ð5r6   c                óZ   — | j                   j                  }| j                  |g d¢g«       y )N)rô  rö   Nr:  r;  s      r4   rW  z+UnsolicitedResponseTests._cbTestNewMessages´  ó%   € Ø�K‰K×ÑˆØ×Ñ˜Ò6Ð7Õ8r6   c                óF  ‡ — ˆ fd„}ˆ fd„}‰ j                   j                  t        |«      «      }|j                  t        |«      «      j                  ‰ j                  «       t        j                  ‰ j                  «       |g«      }|j                  ‰ j                  «      S )Nc                 ó<   •— ‰ j                   j                  dd«      S rG  rz  rR   s   €r4   rH  z=UnsolicitedResponseTests.testNewRecentMessages.<locals>.login¹  r{  r6   c                 ó>   •— ‰ j                   j                  d d«       y rU  rV  rR   s   €r4   ró  z@UnsolicitedResponseTests.testNewRecentMessages.<locals>.loggedIn¼  s   ø€ Ø�K‰K×#Ñ# D¨"Õ-r6   )	rÿ  r›   r7   r'  r
  r   r(  r#   Ú_cbTestNewRecentMessagesr7  s   `    r4   ÚtestNewRecentMessagesz.UnsolicitedResponseTests.testNewRecentMessages¸  sw   ø€ ô	Dô	.ð �^‰^×'Ñ'¬¨e«Ó5ˆØ
�‰”u˜X“Ó'×2Ñ2°4·?±?ÔCÜ×Ñ §¡£°"Ð 5Ó6ˆØ�}‰}˜T×:Ñ:Ó;Ð;r6   c                óZ   — | j                   j                  }| j                  |g d¢g«       y )N©rô  Nrö   r:  r;  s      r4   r^  z1UnsolicitedResponseTests._cbTestNewRecentMessagesÄ  rZ  r6   c                óF  ‡ — ˆ fd„}ˆ fd„}‰ j                   j                  t        |«      «      }|j                  t        |«      «      j                  ‰ j                  «       t        j                  ‰ j                  «       |g«      }|j                  ‰ j                  «      S )Nc                 ó<   •— ‰ j                   j                  dd«      S rG  rz  rR   s   €r4   rH  z@UnsolicitedResponseTests.testNewMessagesAndRecent.<locals>.loginÉ  r{  r6   c                 ó>   •— ‰ j                   j                  dd«       y )Nr@  rö   rV  rR   s   €r4   ró  zCUnsolicitedResponseTests.testNewMessagesAndRecent.<locals>.loggedInÌ  s   ø€ Ø�K‰K×#Ñ# B¨Õ+r6   )	rÿ  r›   r7   r'  r
  r   r(  r#   Ú_cbTestNewMessagesAndRecentr7  s   `    r4   ÚtestNewMessagesAndRecentz1UnsolicitedResponseTests.testNewMessagesAndRecentÈ  sw   ø€ ô	Dô	,ð �^‰^×'Ñ'¬¨e«Ó5ˆØ
�‰”u˜X“Ó'×2Ñ2°4·?±?ÔCÜ×Ñ §¡£°"Ð 5Ó6ˆØ�}‰}˜T×=Ñ=Ó>Ð>r6   c                ó`   — | j                   j                  }| j                  |g d¢g d¢g«       y )N)rô  r@  Nra  r:  r;  s      r4   re  z4UnsolicitedResponseTests._cbTestNewMessagesAndRecentÔ  s(   € Ø�K‰K×ÑˆØ×Ñ˜Ò6Ò8QÐRÕSr6   N)rs   rt   ru   r8  r6  rB  rA  rJ  rI  rX  rW  r_  r^  rf  re  r1   r6   r4   r0  r0  r  s?   „ ò
4ò2ò
3ò2ò<ò$ò
6ò9ò
<ò9ò
?óTr6   r0  c                  ó(   — e Zd ZdZd„ Zd„ Zd„ Zd„ Zy)ÚClientCapabilityTestszT
    Tests for issuance of the CAPABILITY command and handling of its response.
    c                óÔ   — t        «       | _        t        j                  «       | _        | j                  j                  | j                  «       | j                  j                  d«       y)zS
        Create an L{imap4.IMAP4Client} connected to a L{StringTransport}.
        s   * OK [IMAP4rev1]
N)r   rì  r   rá  Úprotocolr¾  r¨  rR   s    r4   r  zClientCapabilityTests.setUpÞ  sG   € ô )Ó*ˆŒÜ×)Ñ)Ó+ˆŒØ�‰×$Ñ$ T§^¡^Ô4Ø�‰×"Ñ"Ð#:Õ;r6   c                óØ   ‡ — ‰ j                   j                  d¬«      }‰ j                   j                  d«       ‰ j                   j                  d«       ˆ fd„}|j                  |«       |S )z—
        A capability response consisting only of atoms without C{'='} in them
        should result in a dict mapping those atoms to L{None}.
        F©ÚuseCaches&   * CAPABILITY IMAP4rev1 LOGINDISABLED
ó   0001 OK Capability completed.
c                ó0   •— ‰j                  | d d dœ«       y )N)r!  s   LOGINDISABLEDr%  ©ÚcapabilitiesrE   s    €r4   ÚgotCapabilitiesz?ClientCapabilityTests.test_simpleAtoms.<locals>.gotCapabilitiesð  s   ø€ Ø×Ñ˜\¸$ÐRVÑ+WÕXr6   ©rk  r  r¨  r›   ©rE   ÚcapabilitiesResultrs  s   `  r4   Útest_simpleAtomsz&ClientCapabilityTests.test_simpleAtomsç  s_   ø€ ð
 "Ÿ]™]×:Ñ:ÀEÐ:ÓJÐØ�‰×"Ñ"Ð#NÔOØ�‰×"Ñ"Ð#GÔHô	Yð 	×&Ñ& Ô7Ø!Ð!r6   c                óØ   ‡ — ‰ j                   j                  d¬«      }‰ j                   j                  d«       ‰ j                   j                  d«       ˆ fd„}|j                  |«       |S )aã  
        A capability response consisting of atoms including C{'='} should have
        those atoms split on that byte and have capabilities in the same
        category aggregated into lists in the resulting dictionary.

        (n.b. - I made up the word "category atom"; the protocol has no notion
        of structure here, but rather allows each capability to define the
        semantics of its entry in the capability response in a freeform manner.
        If I had realized this earlier, the API for capabilities would look
        different.  As it is, we can hope that no one defines any crazy
        semantics which are incompatible with this API, or try to figure out a
        better API when someone does. -exarkun)
        Frm  s.   * CAPABILITY IMAP4rev1 AUTH=LOGIN AUTH=PLAIN
ro  c                ó4   •— ‰j                  | d ddgdœ«       y )Nrø  r”  )r!  r/  r%  rq  s    €r4   rs  zAClientCapabilityTests.test_categoryAtoms.<locals>.gotCapabilities  s    ø€ Ø×ÑØ¨T¸XÀxÐ<PÑQõr6   rt  ru  s   `  r4   Útest_categoryAtomsz(ClientCapabilityTests.test_categoryAtomsö  s^   ø€ ð "Ÿ]™]×:Ñ:ÀEÐ:ÓJÐØ�‰×"Ñ"Ð#VÔWØ�‰×"Ñ"Ð#GÔHô	ð
 	×&Ñ& Ô7Ø!Ð!r6   c                óØ   ‡ — ‰ j                   j                  d¬«      }‰ j                   j                  d«       ‰ j                   j                  d«       ˆ fd„}|j                  |«       |S )zÈ
        A capability response consisting of both simple and category atoms of
        the same type should result in a list containing L{None} as well as the
        values for the category.
        Frm  s0   * CAPABILITY IMAP4rev1 FOO FOO=BAR BAR=FOO BAR
ro  c                ó:   •— ‰j                  | d d dgdd gdœ«       y )Nó   BARó   FOO)r!  r~  r}  r%  rq  s    €r4   rs  z>ClientCapabilityTests.test_mixedAtoms.<locals>.gotCapabilities  s&   ø€ Ø×ÑØØ#¨d°F¨^ÀfÈdÀ^ÑTõr6   rt  ru  s   `  r4   Útest_mixedAtomsz%ClientCapabilityTests.test_mixedAtoms  sd   ø€ ð "Ÿ]™]×:Ñ:ÀEÐ:ÓJÐð 	�‰×"Ñ"ØAô	
ð 	�‰×"Ñ"Ð#GÔHô	ð 	×&Ñ& Ô7Ø!Ð!r6   N)rs   rt   ru   r3  r  rw  rz  r  r1   r6   r4   ri  ri  Ù  s   „ ñò<ò"ò"ó4"r6   ri  c                  ó   — e Zd ZdZd„ Zd„ Zy)ÚStillSimplerClientzH
    An IMAP4 client which keeps track of unsolicited flag changes.
    c                óP   — t         j                  j                  | «       i | _        y r0   )r   rá  rz   r�  rR   s    r4   rz   zStillSimplerClient.__init__-  s   € Ü×Ñ×"Ñ" 4Ô(Øˆ�
r6   c                ó:   — | j                   j                  |«       y r0   )r�  r  rñ  s     r4   rð  zStillSimplerClient.flagsChanged1  s   € Ø�
‰
×Ñ˜(Õ#r6   N)rs   rt   ru   r3  rz   rð  r1   r6   r4   r�  r�  (  s   „ ñòó$r6   r�  c                  óB   — e Zd Zd„ Zd„ Zd„ Zd„ Zd„ Zd„ Zd„ Z	d„ Z
d	„ Zy
)ÚHandCraftedTestsc                ó  ‡ ‡‡‡‡— t        «       Št        j                  «       Š‰j                  ‰«       ‰j	                  d«       ˆ ˆfd„Šˆˆfd„Šˆˆfd„}‰j                  dd«      }‰j                  d«       |j                  |«       |S )Nó   * OK [IMAP4rev1]c                óh   •— ‰j                  ‰j                  «       j                  «       d   d«       y )Nrý  s   0003 FETCH 1 (RFC822)©rB   r  rg  )rT  rE   rì  s    €€r4   ÚcbCheckTransportz>HandCraftedTests.testTrailingLiteral.<locals>.cbCheckTransport<  s,   ø€ Ø×ÑØ—‘Ó!×,Ñ,Ó.¨rÑ2Ø(õr6   c                ó�   •— ‰j                  d«      }‰j                  d«       ‰j                  d«       |j                  ‰«       |S )Nrð   s6   * 1 FETCH (RFC822 {10}
0123456789
 RFC822.SIZE 10)
s   0003 OK FETCH
)ÚfetchMessager¨  r›   )rT  rž   r”   rŠ  s     €€r4   ÚcbSelectz6HandCraftedTests.testTrailingLiteral.<locals>.cbSelectB  sA   ø€ Ø—‘˜sÓ#ˆAØ�N‰NØOôð �N‰NÐ/Ô0Ø�M‰MÐ*Ô+ØˆHr6   c                ón   •— ‰j                  d«      }‰j                  d«       |j                  ‰«       |S ©NrÝ  ó   0002 OK SELECT)rÃ  rÚ  r›   )rT  rž   r”   r�  s     €€r4   ÚcbLoginz5HandCraftedTests.testTrailingLiteral.<locals>.cbLoginK  s/   ø€ Ø—‘˜Ó!ˆAØ�N‰NÐ,Ô-Ø�M‰M˜(Ô#ØˆHr6   ó   blahó   0001 OK LOGIN
)r   r   rá  r¾  rÚ  rH  r¨  r›   )rE   r‘  rž   r”   rŠ  r�  rì  s   `  @@@@r4   ÚtestTrailingLiteralz$HandCraftedTests.testTrailingLiteral6  ss   ü€ Ü#Ó%ˆ	Ü×ÑÓˆØ	×Ñ˜Ô#Ø	�‰Ð*Ô+õ	õ	õ	ð �G‰G�G˜WÓ%ˆØ	�‰Ð+Ô,Ø	�‰�gÔØˆr6   c                óx  — | j                   j                  j                  dd«       t        «       }| j                   j	                  |«       |j                  «        | j                   j                  d«       | j                  |j                  «       d«       |j                  «        | j                   j                  d«       | j                  |j                  «       d«       |j                  «        | j                   j                  d«       | j                  |j                  «       «       | j                   j                  d«       | j                  |j                  «       d	«       | j                  | j                   j                  d
«       | j                   j                  t        j                  d«      «       y)z]
        String literals whose data is not immediately available are
        parsed.
        rÊ  rÎ  s   01 LOGIN {8}
s   + Ready for 8 octets of text
s   testuser {13}
s   + Ready for 13 octets of text
s   passwords   -test
ó   01 OK LOGIN succeeded
rO  r¦  N)rý  rÒ  rÑ  r   r¾  r¿  r¨  rB   r  Ú	assertNotrR  rÂ  r   rÃ  ©rE   rì  s     r4   Útest_fragmentedStringLiteralsz.HandCraftedTests.test_fragmentedStringLiteralsV  s4  € ð
 	�‰×Ñ×#Ñ# KÐ1AÔBÜ#Ó%ˆ	Ø�‰×"Ñ" 9Ô-à�‰ÔØ�‰× Ñ Ð!4Ô5Ø×Ñ˜Ÿ™Ó*Ð,OÔPà�‰ÔØ�‰× Ñ Ð!5Ô6Ø×Ñ˜Ÿ™Ó*Ð,PÔQà�‰ÔØ�‰× Ñ  Ô-Ø�‰�y—‘Ó(Ô)Ø�‰× Ñ  Ô.Ø×Ñ˜Ÿ™Ó*Ð,HÔIØ×Ñ˜Ÿ™×*Ñ*¨FÔ3à�‰×"Ñ"¤5×#7Ñ#7Ð8JÓ#KÕLr6   c                ó\  — ddi| j                   j                  _        t        «       }| j                   j	                  |«       |j                  «        | j                   j                  d«       | j                  |j                  «       d«       |j                  «        | j                   j                  d«       | j                  |j                  «       d«       | j                  | j                   j                  d«       | j                   j                  t        j                  d«      «       y)	z3
        Empty string literals are parsed.
        r6   s   01 LOGIN {0}
s   + Ready for 0 octets of text
s   {0}
r–  rO  r¦  N)rý  rÒ  r†  r   r¾  r¿  r¨  rB   r  rR  rÂ  r   rÃ  r˜  s     r4   Útest_emptyStringLiteralz(HandCraftedTests.test_emptyStringLiteralp  sÕ   € ð &)¨# Jˆ�‰×ÑÔ!Ü#Ó%ˆ	Ø�‰×"Ñ" 9Ô-à�‰ÔØ�‰× Ñ Ð!4Ô5Ø×Ñ˜Ÿ™Ó*Ð,OÔPà�‰ÔØ�‰× Ñ  Ô,Ø×Ñ˜Ÿ™Ó*Ð,HÔIØ×Ñ˜Ÿ™×*Ñ*¨FÔ3à�‰×"Ñ"¤5×#7Ñ#7Ð8JÓ#KÕLr6   c                ó,  ‡ ‡‡— t        «       Št        «       Š‰j                  ‰«       ‰j                  d«       ˆfd„}ˆfd„}ˆfd„}ˆˆ ˆfd„} |«       j	                  t        |«      «      j	                  t        |«      «      j	                  |«      S )a^  
        If unsolicited data is received along with solicited data in the
        response to a I{FETCH} command issued by L{IMAP4Client.fetchSpecific},
        the unsolicited data is passed to the appropriate callback and not
        included in the result with which the L{Deferred} returned by
        L{IMAP4Client.fetchSpecific} fires.
        r‡  c                 óN   •— ‰j                  dd«      } ‰j                  d«       | S ©Nr’  r“  ©rH  r¨  ©rž   r”   s    €r4   rH  zRHandCraftedTests.test_unsolicitedResponseMixedWithSolicitedResponse.<locals>.login�  ó%   ø€ Ø—‘˜ Ó)ˆAØ�N‰NÐ/Ô0ØˆHr6   c                 óL   •— ‰j                  d«      } ‰j                  d«       | S r�  ©rÃ  rÚ  r   s    €r4   rÃ  zSHandCraftedTests.test_unsolicitedResponseMixedWithSolicitedResponse.<locals>.select•  ó#   ø€ Ø—‘˜Ó!ˆAØ�N‰NÐ,Ô-ØˆHr6   c                 ó†  •— ‰j                  dddg¬«      } ‰j                  d«       ‰j                  d«       ‰j                  d«       ‰j                  d«       ‰j                  d	«       ‰j                  d
«       ‰j                  d«       ‰j                  d«       ‰j                  d«       ‰j                  d«       | S )Nrá   úHEADER.FIELDSÚSUBJECT©Ú
headerTypeÚ
headerArgss1   * 1 FETCH (BODY[HEADER.FIELDS ("SUBJECT")] {38}
s$   Subject: Suprise for your woman...
r‹  ó   )
s   * 1 FETCH (FLAGS (\Seen))
s1   * 2 FETCH (BODY[HEADER.FIELDS ("SUBJECT")] {75}
sI   Subject: What you been doing. Order your meds here . ,. handcuff madsen
ó   0003 OK FETCH completed
©ÚfetchSpecificr¨  r   s    €r4   r�  zRHandCraftedTests.test_unsolicitedResponseMixedWithSolicitedResponse.<locals>.fetchš  s¨   ø€ Ø—‘Ø /¸y¸kð  ó ˆAð �N‰NÐQÔRØ�N‰NÐDÔEØ�N‰N˜7Ô#Ø�N‰N˜8Ô$Ø�N‰NÐ<Ô=Ø�N‰NÐQÔRØ�N‰NØ^ôð �N‰N˜7Ô#Ø�N‰N˜8Ô$Ø�N‰NÐ9Ô:ØˆHr6   c                óì   •— ‰j                  ‰j                  «       j                  «       d   d«       ‰j                  | dddggdggdddggdggdœ«       ‰j                  ‰j                  d	d
gi«       y )Nrý  ó,   0003 FETCH 1:* BODY[HEADER.FIELDS (SUBJECT)]rÂ  r¦  r§  z&Subject: Suprise for your woman...

zKSubject: What you been doing. Order your meds here . ,. handcuff madsen

©rÅ   rÉ   rÅ   ú\Seen©rB   r  rg  r�  ©Úresr”   rE   rì  s    €€€r4   rÞ  zQHandCraftedTests.test_unsolicitedResponseMixedWithSolicitedResponse.<locals>.test¬  s˜   ø€ Ø×ÑØ—‘Ó!×,Ñ,Ó.¨rÑ2Ø?ôð
 ×ÑØð #Ø,¨y¨kÐ:ØHððð #Ø,¨y¨kÐ:Ømððñôð( ×Ñ˜QŸW™W q¨8¨* oÕ6r6   ©r   r�  r¾  rÚ  r›   r7   ©rE   rH  rÃ  r�  rÞ  r”   rì  s   `    @@r4   Ú2test_unsolicitedResponseMixedWithSolicitedResponsezCHandCraftedTests.test_unsolicitedResponseMixedWithSolicitedResponseƒ  sv   ú€ ô $Ó%ˆ	ÜÓ ˆØ	×Ñ˜Ô#Ø	�‰Ð*Ô+ô	ô
	ô
	ö$	7ñ: ‹Gß‰[œ˜v›Ó'ß‰[œ˜u›Ó&ß‰[˜Óð		
r6   c                óN  ‡ ‡‡— t        «       Št        j                  «       Š‰j                  ‰«       ‰j	                  d«       ˆfd„}ˆfd„}ˆfd„}ˆ ˆfd„} |«       }|j                  t        |«      «       |j                  t        |«      «       |j                  |«       |S )zf
        Literals should be recognized even when they are not preceded by
        whitespace.
        r‡  c                 óN   •— ‰j                  dd«      } ‰j                  d«       | S rž  rŸ  ©rž   rk  s    €r4   rH  zFHandCraftedTests.test_literalWithoutPrecedingWhitespace.<locals>.loginÚ  ó'   ø€ Ø—‘˜w¨Ó0ˆAØ×!Ñ!Ð"6Ô7ØˆHr6   c                 óL   •— ‰j                  d«      } ‰j                  d«       | S )Nó   inboxr�  r£  r»  s    €r4   rÃ  zGHandCraftedTests.test_literalWithoutPrecedingWhitespace.<locals>.selectß  s%   ø€ Ø—‘ Ó)ˆAØ×!Ñ!Ð"3Ô4ØˆHr6   c                 óv   •— ‰j                  dddg¬«      } ‰j                  d«       ‰j                  d«       | S )Nrá   r¦  r§  r¨  s8   * 1 FETCH (BODY[HEADER.FIELDS ({7}
SUBJECT)] "Hello")
r¬  r­  r»  s    €r4   r�  zFHandCraftedTests.test_literalWithoutPrecedingWhitespace.<locals>.fetchä  sJ   ø€ Ø×&Ñ&Ø /¸y¸kð 'ó ˆAð ×!Ñ!ØOôð ×!Ñ!Ð"@ÔAØˆHr6   c                óž   •— ‰j                  ‰j                  «       j                  «       d   d«       ‰j                  | ddddggdggi«       y )Nrý  r°  rÅ   rÂ  r¦  r§  ÚHellor‰  )r2   rE   rì  s    €€r4   rÞ  zEHandCraftedTests.test_literalWithoutPrecedingWhitespace.<locals>.testî  sW   ø€ Ø×ÑØ—‘Ó!×,Ñ,Ó.¨rÑ2Ø?ôð ×ÑØ˜˜f ¸¸Ð&DÀgÐNÐOÐPõr6   ©r   r   rá  r¾  rÚ  r›   r7   )rE   rH  rÃ  r�  rÞ  rž   rk  rì  s   `     @@r4   Ú&test_literalWithoutPrecedingWhitespacez7HandCraftedTests.test_literalWithoutPrecedingWhitespaceÏ  s†   ú€ ô
 $Ó%ˆ	Ü×$Ñ$Ó&ˆà×Ñ 	Ô*Ø×ÑÐ1Ô2ô	ô
	ô
	õ	ñ ‹GˆØ	�‰”e˜F“mÔ$Ø	�‰”e˜E“lÔ#Ø	�‰�dÔØˆr6   c                ó$  ‡ ‡‡— t        «       Št        j                  «       Š‰j                  ‰«       ‰j	                  d«       ˆfd„}ˆfd„}ˆˆ ˆfd„} |«       }|j                  t        |«      «       |j                  t        |«      «       |S )zà
        If the server sends a literal length which cannot be parsed as an
        integer, L{IMAP4Client.lineReceived} should cause the protocol to be
        disconnected by raising L{imap4.IllegalServerResponse}.
        r‡  c                 óN   •— ‰j                  dd«      } ‰j                  d«       | S rž  rŸ  r»  s    €r4   rH  z<HandCraftedTests.test_nonIntegerLiteralLength.<locals>.login	  r¼  r6   c                 óL   •— ‰j                  d«      } ‰j                  d«       | S r�  r£  r»  s    €r4   rÃ  z=HandCraftedTests.test_nonIntegerLiteralLength.<locals>.select  s%   ø€ Ø—‘ Ó(ˆAØ×!Ñ!Ð"3Ô4ØˆHr6   c                 óè   •— ‰ j                  dddg¬«       ‰j                  ‰j                  «       j                  «       d   d«       ‰j	                  t
        j                  ‰ j                  d«       y )Nrá   r¦  r§  r¨  rý  r°  s   * 1 FETCH {xyz}
...)r®  rB   r  rg  r×   r   ÚIllegalServerResponser¨  )rk  rE   rì  s   €€€r4   r�  z<HandCraftedTests.test_nonIntegerLiteralLength.<locals>.fetch  so   ø€ Ø×"Ñ"Ø /¸y¸kð #ô ð ×ÑØ—‘Ó!×,Ñ,Ó.¨rÑ2Ø?ôð
 ×ÑÜ×+Ñ+Ø×%Ñ%Ø)õr6   rÂ  )rE   rH  rÃ  r�  rž   rk  rì  s   `    @@r4   Útest_nonIntegerLiteralLengthz-HandCraftedTests.test_nonIntegerLiteralLengthý  su   ú€ ô $Ó%ˆ	Ü×$Ñ$Ó&ˆà×Ñ 	Ô*Ø×ÑÐ1Ô2ô	ô
	ö
	ñ  ‹GˆØ	�‰”e˜F“mÔ$Ø	�‰”e˜E“lÔ#Øˆr6   c                ó(  ‡ ‡— t        «       }t        «       Š‰j                  |«       ‰j                  d«       ˆfd„}ˆfd„}ˆfd„}ˆˆ fd„} |«       j	                  t        |«      «      j	                  t        |«      «      j	                  |«      S )a  
        Any unrequested flag information received along with other requested
        information in an untagged I{FETCH} received in response to a request
        issued with L{IMAP4Client.fetchSpecific} is passed to the
        C{flagsChanged} callback.
        r‡  c                 óN   •— ‰j                  dd«      } ‰j                  d«       | S rž  rŸ  r   s    €r4   rH  zLHandCraftedTests.test_flagsChangedInsideFetchSpecificResponse.<locals>.login4  r¡  r6   c                 óL   •— ‰j                  d«      } ‰j                  d«       | S r�  r£  r   s    €r4   rÃ  zMHandCraftedTests.test_flagsChangedInsideFetchSpecificResponse.<locals>.select9  r¤  r6   c                 ó   •— ‰j                  dddg¬«      } ‰j                  d«       ‰j                  d«       ‰j                  d«       ‰j                  d«       ‰j                  d	«       ‰j                  d
«       ‰j                  d«       | S )Nrß   r¦  r§  r¨  s1   * 1 FETCH (BODY[HEADER.FIELDS ("SUBJECT")] {22}
s   Subject: subject one
s    FLAGS (\Recent))
s?   * 2 FETCH (FLAGS (\Seen) BODY[HEADER.FIELDS ("SUBJECT")] {22}
s   Subject: subject two
r«  r¬  r­  r   s    €r4   r�  zLHandCraftedTests.test_flagsChangedInsideFetchSpecificResponse.<locals>.fetch>  s„   ø€ Ø—‘Ø ?À	¸{ð  ó ˆAð �N‰NÐQÔRØ�N‰NÐ6Ô7Ø�N‰NÐ4Ô5à�N‰NØUôð �N‰NÐ6Ô7Ø�N‰N˜8Ô$Ø�N‰NÐ9Ô:ØˆHr6   c                óŽ   •— ‰j                  | dddggdggdddggdggdœ«       ‰j                  ‰j                  dgdgdœ«       y )	NrÂ  r¦  r§  zSubject: subject one
zSubject: subject two
r±  rF  r²  )rB   r�  )rµ  r”   rE   s    €€r4   rÞ  zKHandCraftedTests.test_flagsChangedInsideFetchSpecificResponse.<locals>.testO  sp   ø€ Ø×ÑØð #Ø,¨y¨kÐ:Ø6ððð #Ø,¨y¨kÐ:Ø6ððñôð( ×Ñ˜QŸW™W¨:¨,¸H¸:Ñ&FÕGr6   r¶  )rE   rì  rH  rÃ  r�  rÞ  r”   s   `     @r4   Ú,test_flagsChangedInsideFetchSpecificResponsez=HandCraftedTests.test_flagsChangedInsideFetchSpecificResponse(  sw   ù€ ô $Ó%ˆ	ÜÓ ˆØ	×Ñ˜Ô#Ø	�‰Ð*Ô+ô	ô
	ô
	õ"	Hñ0 ‹Gß‰[œ˜v›Ó'ß‰[œ˜u›Ó&ß‰[˜Óð		
r6   c                ó,  ‡ ‡‡— t        «       Št        «       Š‰j                  ‰«       ‰j                  d«       ˆfd„}ˆfd„}ˆfd„}ˆˆ ˆfd„} |«       j	                  t        |«      «      j	                  t        |«      «      j	                  |«      S )a  
        Any unrequested flag information received along with other requested
        information in an untagged I{FETCH} received in response to a request
        issued with L{IMAP4Client.fetchMessage} is passed to the
        C{flagsChanged} callback.
        r‡  c                 óN   •— ‰j                  dd«      } ‰j                  d«       | S rž  rŸ  r   s    €r4   rH  zKHandCraftedTests.test_flagsChangedInsideFetchMessageResponse.<locals>.loginy  r¡  r6   c                 óL   •— ‰j                  d«      } ‰j                  d«       | S r�  r£  r   s    €r4   rÃ  zLHandCraftedTests.test_flagsChangedInsideFetchMessageResponse.<locals>.select~  r¤  r6   c                 ó  •— ‰j                  d«      } ‰j                  d«       ‰j                  d«       ‰j                  d«       ‰j                  d«       ‰j                  d«       ‰j                  d«       ‰j                  d«       | S )	Nrá   s   * 1 FETCH (RFC822 {24}
s   Subject: first subject
s    FLAGS (\Seen))
s.   * 2 FETCH (FLAGS (\Recent \Seen) RFC822 {25}
s   Subject: second subject
r«  r¬  )rŒ  r¨  r   s    €r4   r�  zKHandCraftedTests.test_flagsChangedInsideFetchMessageResponse.<locals>.fetchƒ  sp   ø€ Ø—‘˜uÓ%ˆAØ�N‰NÐ8Ô9Ø�N‰NÐ8Ô9Ø�N‰NÐ2Ô3Ø�N‰NÐPÔQØ�N‰NÐ9Ô:Ø�N‰N˜8Ô$Ø�N‰NÐ9Ô:ØˆHr6   c                óÞ   •— ‰j                  ‰j                  «       j                  «       d   d«       ‰j                  | ddiddidœ«       ‰j                  ‰j                  dgddgdœ«       y )	Nrý  s   0003 FETCH 1:* (RFC822)r§  zSubject: first subject
zSubject: second subject
r±  r²  rF  r³  r´  s    €€€r4   rÞ  zJHandCraftedTests.test_flagsChangedInsideFetchMessageResponse.<locals>.testŽ  sx   ø€ Ø×ÑØ—‘Ó!×,Ñ,Ó.¨rÑ2Ø*ôð
 ×ÑØà Ð">Ð?Ø Ð"?Ð@ñôð ×Ñ˜QŸW™W¨8¨*¸*ÀhÐ9OÑ&PÕQr6   r¶  r·  s   `    @@r4   Ú+test_flagsChangedInsideFetchMessageResponsez<HandCraftedTests.test_flagsChangedInsideFetchMessageResponsem  sw   ú€ ô $Ó%ˆ	ÜÓ ˆØ	×Ñ˜Ô#Ø	�‰Ð*Ô+ô	ô
	ô
		ö	Rñ" ‹Gß‰[œ˜v›Ó'ß‰[œ˜u›Ó&ß‰[˜Óð		
r6   c                ó0  — t        «       }t        j                  «       }||_        |j	                  |«       |j                  d«       t        j                  d«      }|j                  |«       |j                  d«      }| j                  |t        j                  «       |j                  d«       | j                  t        j                  «      }| j                  t!        |«      d«       | j                  |d   j"                  j$                  d   d«       |S )z¦
        When decoding a base64 encoded authentication message from the server,
        decoding errors are logged and then the client closes the connection.
        sP   * OK [CAPABILITY IMAP4rev1 IDLE NAMESPACE AUTH=CRAM-MD5] Twisted IMAP4rev1 ReadyrÊ  rÊ  s   + Something bad! and bad
rÅ   r   s   Something bad! and bad)r   r   rá  rk  r¾  rÚ  rï  r·  r³  ÚassertFailurer   rÃ  r¨  r~  rÈ  rB   rÐ   r  rÖ  )rE   rì  rk  r¸  rž   Úloggeds         r4   Ú-test_authenticationChallengeDecodingExceptionz>HandCraftedTests.test_authenticationChallengeDecodingException¥  sï   € ô
 5Ó6ˆ	Ü×$Ñ$Ó&ˆØ%ˆ	Ôà×Ñ 	Ô*Ø×Ñð'ô	
ô ×0Ñ0°Ó=ˆØ×&Ñ& uÔ-à×!Ñ! (Ó+ˆð 	×Ñ˜1œe×2Ñ2Ô3à×ÑÐ=Ô>ð ×'Ñ'¬×(CÑ(CÓDˆØ×Ñœ˜V› aÔ(Ø×Ñ˜ ™Ÿ™×-Ñ-¨aÑ0Ð2KÔLØˆr6   N)rs   rt   ru   r”  r™  r›  r¸  rÃ  rÉ  rÏ  rÕ  rÙ  r1   r6   r4   r…  r…  5  s9   „ òò@Mò4Mò&J
òX,ò\)òVC
òJ6
ópr6   r…  c                  ó:   — e Zd ZU dZej
                  Zded<   d„ Zy)ÚPreauthIMAP4ClientMixinav  
    Mixin for L{SynchronousTestCase} subclasses which
    provides a C{setUp} method which creates an L{IMAP4Client}
    connected to a L{StringTransport} and puts it into the
    I{authenticated} state.

    @ivar transport: A L{StringTransport} to which C{client} is
        connected.

    @ivar client: An L{IMAP4Client} which is connected to
        C{transport}.
    zType[imap4.IMAP4Client]ÚclientProtocolc                óÌ   — t        «       | _        | j                  «       | _        | j                  j	                  | j                  «       | j                  j                  d«       y)zm
        Create an IMAP4Client connected to a fake transport and in the
        authenticated state.
        s   * PREAUTH Hello unittest
N)r   rì  rÜ  rþ  r¾  r¨  rR   s    r4   r  zPreauthIMAP4ClientMixin.setUpÔ  sG   € ô
 )Ó*ˆŒØ×)Ñ)Ó+ˆŒØ�‰×"Ñ" 4§>¡>Ô2Ø�‰× Ñ Ð!@ÕAr6   N)	rs   rt   ru   r3  r   rá  rÜ  r¥  r  r1   r6   r4   rÛ  rÛ  Ä  s    … ñð /4×.?Ñ.?€NÐ+Ó?óBr6   rÛ  c                  óp   — 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d„ Zd„ Zd„ Zy)ÚSelectionTestsMixinzl
    Mixin for test cases which defines tests which apply to both I{EXAMINE} and
    I{SELECT} support.
    c                óÆ   —  t        | j                  | j                  «      d«      }| j                  | j                  j                  «       d| j                  z   dz   «       |S )zø
        Issue either an I{EXAMINE} or I{SELECT} command (depending on
        C{self.method}), assert that the correct bytes are written to the
        transport, and return the L{Deferred} returned by whichever method was
        called.
        Úfooboxs   0001 s	    foobox
)r²  rþ  ÚmethodrB   rì  r  rÌ  ©rE   rž   s     r4   Ú_examineOrSelectz$SelectionTestsMixin._examineOrSelectå  sT   € ð .ŒG�D—K‘K §¡Ó-¨hÓ7ˆØ×ÑØ�N‰N× Ñ Ó" H¨t¯|©|Ñ$;¸nÑ$Lô	
ð ˆr6   c                ó¤   — |D ]   }| j                   j                  |dz   «       Œ" | j                   j                  d| j                  z   dz   «       y)zÉ
        Deliver the given (unterminated) response lines to C{self.client} and
        then deliver a tagged SELECT or EXAMINE completion line to finish the
        SELECT or EXAMINE response.
        r‹  s   0001 OK [READ-ONLY] s    completed
N)rþ  r¨  rÌ  )rE   ÚlinesrÜ  s      r4   Ú	_responsezSelectionTestsMixin._responseò  sM   € ð ò 	5ˆDØ�K‰K×$Ñ$ T¨G¡^Õ4ð	5à�‰× Ñ Ø# d§l¡lÑ2Ð5FÑFõ	
r6   c                óŽ   — | j                  «       }| j                  d«       | j                  | j                  |«      dddœ«       y)a  
        If the server response to a I{SELECT} or I{EXAMINE} command includes an
        I{EXISTS} response, the L{Deferred} return by L{IMAP4Client.select} or
        L{IMAP4Client.examine} fires with a C{dict} including the value
        associated with the C{'EXISTS'} key.
        s
   * 3 EXISTSFrÇ   )r¼  r»  N©rä  rç  rB   ÚsuccessResultOfrã  s     r4   Útest_existszSelectionTestsMixin.test_existsþ  ó?   € ð ×!Ñ!Ó#ˆØ�‰�}Ô%Ø×Ñ˜×-Ñ-¨aÓ0ÀÐRSÑ2TÕUr6   c                ó†   — | j                  «       }| j                  d«       | j                  |t        j                  «       y)a  
        If the server returns a non-integer EXISTS value in its response to a
        I{SELECT} or I{EXAMINE} command, the L{Deferred} returned by
        L{IMAP4Client.select} or L{IMAP4Client.examine} fails with
        L{IllegalServerResponse}.
        s   * foo EXISTSN©rä  rç  ÚfailureResultOfr   rÈ  rã  s     r4   Útest_nonIntegerExistsz)SelectionTestsMixin.test_nonIntegerExists	  ó4   € ð ×!Ñ!Ó#ˆØ�‰�Ô'Ø×Ñ˜Q¤× ;Ñ ;Õ<r6   c                óŽ   — | j                  «       }| j                  d«       | j                  | j                  |«      dddœ«       y)a  
        If the server response to a I{SELECT} or I{EXAMINE} command includes an
        I{RECENT} response, the L{Deferred} return by L{IMAP4Client.select} or
        L{IMAP4Client.examine} fires with a C{dict} including the value
        associated with the C{'RECENT'} key.
        s
   * 5 RECENTFrÊ   )r¼  rR  Nré  rã  s     r4   Útest_recentzSelectionTestsMixin.test_recent  rì  r6   c                ó†   — | j                  «       }| j                  d«       | j                  |t        j                  «       y)a  
        If the server returns a non-integer RECENT value in its response to a
        I{SELECT} or I{EXAMINE} command, the L{Deferred} returned by
        L{IMAP4Client.select} or L{IMAP4Client.examine} fails with
        L{IllegalServerResponse}.
        s   * foo RECENTNrî  rã  s     r4   Útest_nonIntegerRecentz)SelectionTestsMixin.test_nonIntegerRecent  rñ  r6   c                óŽ   — | j                  «       }| j                  d«       | j                  | j                  |«      dddœ«       y)a  
        If the server response to a I{SELECT} or I{EXAMINE} command includes an
        I{UNSEEN} response, the L{Deferred} returned by L{IMAP4Client.select} or
        L{IMAP4Client.examine} fires with a C{dict} including the value
        associated with the C{'UNSEEN'} key.
        s)   * OK [UNSEEN 8] Message 8 is first unseenFrÍ   )r¼  rU  Nré  rã  s     r4   Útest_unseenzSelectionTestsMixin.test_unseen*  s@   € ð ×!Ñ!Ó#ˆØ�‰ÐCÔDØ×Ñ˜×-Ñ-¨aÓ0ÀÐRSÑ2TÕUr6   c                ó†   — | j                  «       }| j                  d«       | j                  |t        j                  «       y)a  
        If the server returns a non-integer UNSEEN value in its response to a
        I{SELECT} or I{EXAMINE} command, the L{Deferred} returned by
        L{IMAP4Client.select} or L{IMAP4Client.examine} fails with
        L{IllegalServerResponse}.
        s-   * OK [UNSEEN foo] Message foo is first unseenNrî  rã  s     r4   Útest_nonIntegerUnseenz)SelectionTestsMixin.test_nonIntegerUnseen5  s5   € ð ×!Ñ!Ó#ˆØ�‰ÐGÔHØ×Ñ˜Q¤× ;Ñ ;Õ<r6   c                óŽ   — | j                  «       }| j                  d«       | j                  | j                  |«      dddœ«       y)a)  
        If the server response to a I{SELECT} or I{EXAMINE} command includes an
        I{UIDVALIDITY} response, the L{Deferred} returned by
        L{IMAP4Client.select} or L{IMAP4Client.examine} fires with a C{dict}
        including the value associated with the C{'UIDVALIDITY'} key.
        s#   * OK [UIDVALIDITY 12345] UIDs validFr4  )r¼  rT  Nré  rã  s     r4   Útest_uidvalidityz$SelectionTestsMixin.test_uidvalidity@  sB   € ð ×!Ñ!Ó#ˆØ�‰Ð=Ô>Ø×ÑØ× Ñ  Ó#°EÈ%Ñ%Põ	
r6   c                ó†   — | j                  «       }| j                  d«       | j                  |t        j                  «       y)a  
        If the server returns a non-integer UIDVALIDITY value in its response to
        a I{SELECT} or I{EXAMINE} command, the L{Deferred} returned by
        L{IMAP4Client.select} or L{IMAP4Client.examine} fails with
        L{IllegalServerResponse}.
        s!   * OK [UIDVALIDITY foo] UIDs validNrî  rã  s     r4   Útest_nonIntegerUIDVALIDITYz.SelectionTestsMixin.test_nonIntegerUIDVALIDITYM  s5   € ð ×!Ñ!Ó#ˆØ�‰Ð;Ô<Ø×Ñ˜Q¤× ;Ñ ;Õ<r6   c                óŽ   — | j                  «       }| j                  d«       | j                  | j                  |«      dddœ«       y)a!  
        If the server response to a I{SELECT} or I{EXAMINE} command includes an
        I{UIDNEXT} response, the L{Deferred} returned by L{IMAP4Client.select}
        or L{IMAP4Client.examine} fires with a C{dict} including the value
        associated with the C{'UIDNEXT'} key.
        s&   * OK [UIDNEXT 4392] Predicted next UIDFi(  )r¼  rS  Nré  rã  s     r4   Útest_uidnextz SelectionTestsMixin.test_uidnextX  sB   € ð ×!Ñ!Ó#ˆØ�‰Ð@ÔAØ×ÑØ× Ñ  Ó#°EÀdÑ%Kõ	
r6   c                ó†   — | j                  «       }| j                  d«       | j                  |t        j                  «       y)a  
        If the server returns a non-integer UIDNEXT value in its response to a
        I{SELECT} or I{EXAMINE} command, the L{Deferred} returned by
        L{IMAP4Client.select} or L{IMAP4Client.examine} fails with
        L{IllegalServerResponse}.
        s%   * OK [UIDNEXT foo] Predicted next UIDNrî  rã  s     r4   Útest_nonIntegerUIDNEXTz*SelectionTestsMixin.test_nonIntegerUIDNEXTe  s5   € ð ×!Ñ!Ó#ˆØ�‰Ð?Ô@Ø×Ñ˜Q¤× ;Ñ ;Õ<r6   c                óŽ   — | j                  «       }| j                  d«       | j                  | j                  |«      dddœ«       y)á  
        If the server response to a I{SELECT} or I{EXAMINE} command includes an
        I{FLAGS} response, the L{Deferred} returned by L{IMAP4Client.select} or
        L{IMAP4Client.examine} fires with a C{dict} including the value
        associated with the C{'FLAGS'} key.
        s2   * FLAGS (\Answered \Flagged \Deleted \Seen \Draft)F)rE  z\Flaggedr‘  r²  z\Draft)r¼  r›  Nré  rã  s     r4   Ú
test_flagszSelectionTestsMixin.test_flagsp  sF   € ð ×!Ñ!Ó#ˆØ�‰ÐQÔRØ×ÑØ× Ñ  Ó#à#ØVñõ	
r6   c                óŽ   — | j                  «       }| j                  d«       | j                  | j                  |«      dddœ«       y)r  sN   * OK [PERMANENTFLAGS (\Starred)] Just one permanent flag in that list up thereF)z\Starred)r¼  ÚPERMANENTFLAGSNré  rã  s     r4   Útest_permanentflagsz'SelectionTestsMixin.test_permanentflags�  sI   € ð ×!Ñ!Ó#ˆØ�‰ð"ô	
ð 	×ÑØ× Ñ  Ó#Ø °NÑCõ	
r6   c                óŒ   — | j                  «       }| j                  d«       | j                  | j                  |«      ddi«       y)z¤
        If the server response to a I{SELECT} or I{EXAMINE} command includes an
        I{OK} with unrecognized response code text, parsing does not fail.
        s3   * OK [X-MADE-UP] I just made this response text up.r¼  FNré  rã  s     r4   Útest_unrecognizedOkz'SelectionTestsMixin.test_unrecognizedOk’  sA   € ð
 ×!Ñ!Ó#ˆØ�‰ÐMÔNð 	×Ñ˜×-Ñ-¨aÓ0°<ÀÐ2GÕHr6   c                óŒ   — | j                  «       }| j                  d«       | j                  | j                  |«      ddi«       y)zš
        If the server response to a I{SELECT} or I{EXAMINE} command includes an
        I{OK} with no response code text, parsing does not fail.
        s   * OKr¼  FNré  rã  s     r4   Útest_bareOkzSelectionTestsMixin.test_bareOk�  s>   € ð
 ×!Ñ!Ó#ˆØ�‰�wÔØ×Ñ˜×-Ñ-¨aÓ0°<ÀÐ2GÕHr6   N)rs   rt   ru   r3  rä  rç  rë  rð  ró  rõ  r÷  rù  rû  rý  rÿ  r  r  r  r	  r  r1   r6   r4   rß  rß  ß  s\   „ ñò
ò

ò	Vò	=ò	Vò	=ò	Vò	=ò
ò	=ò
ò	=ò
ò"
ò"	IóIr6   rß  c                  ó   — e Zd ZdZdZdZy)ÚIMAP4ClientExamineTestsaþ  
    Tests for the L{IMAP4Client.examine} method.

    An example of usage of the EXAMINE command from RFC 3501, section 6.3.2::

        S: * 17 EXISTS
        S: * 2 RECENT
        S: * OK [UNSEEN 8] Message 8 is first unseen
        S: * OK [UIDVALIDITY 3857529045] UIDs valid
        S: * OK [UIDNEXT 4392] Predicted next UID
        S: * FLAGS (\Answered \Flagged \Deleted \Seen \Draft)
        S: * OK [PERMANENTFLAGS ()] No permanent flags permitted
        S: A932 OK [READ-ONLY] EXAMINE completed
    rÅ  s   EXAMINEN©rs   rt   ru   r3  râ  rÌ  r1   r6   r4   r  r  §  s   „ ñð €FØ�Gr6   r  c                  ó   — e Zd ZdZdZdZy)ÚIMAP4ClientSelectTestsa  
    Tests for the L{IMAP4Client.select} method.

    An example of usage of the SELECT command from RFC 3501, section 6.3.1::

        C: A142 SELECT INBOX
        S: * 172 EXISTS
        S: * 1 RECENT
        S: * OK [UNSEEN 12] Message 12 is first unseen
        S: * OK [UIDVALIDITY 3857529045] UIDs valid
        S: * OK [UIDNEXT 4392] Predicted next UID
        S: * FLAGS (\Answered \Flagged \Deleted \Seen \Draft)
        S: * OK [PERMANENTFLAGS (\Deleted \Seen \*)] Limited
        S: A142 OK [READ-WRITE] SELECT completed
    rÃ  s   SELECTNr  r1   r6   r4   r  r  »  s   „ ñð  €FØ�Gr6   r  c                  ó(   — e Zd ZdZd„ Zd„ Zd„ Zd„ Zy)ÚIMAP4ClientExpungeTestsa  
    Tests for the L{IMAP4Client.expunge} method.

    An example of usage of the EXPUNGE command from RFC 3501, section 6.4.3::

        C: A202 EXPUNGE
        S: * 3 EXPUNGE
        S: * 3 EXPUNGE
        S: * 5 EXPUNGE
        S: * 8 EXPUNGE
        S: A202 OK EXPUNGE completed
    c                óÂ   — | j                   j                  «       }| j                  | j                  j	                  «       d«       | j                  j                  «        |S )Ns   0001 EXPUNGE
)rþ  r•  rB   rì  r  r¿  rã  s     r4   Ú_expungez IMAP4ClientExpungeTests._expungeÞ  sG   € Ø�K‰K×ÑÓ!ˆØ×Ñ˜Ÿ™×-Ñ-Ó/Ð1DÔEØ�‰×ÑÔØˆr6   c                ó˜   — |D ]*  }| j                   j                  t        d|› d�«      «       Œ, | j                   j                  d«       y )Nz* z EXPUNGEs   0001 OK EXPUNGE COMPLETED)rþ  rÚ  r)   )rE   ÚsequenceNumbersÚnumbers      r4   rç  z!IMAP4ClientExpungeTests._responseä  sF   € Ø%ò 	KˆFØ�K‰K×$Ñ$¤]°R¸°x¸xÐ3HÓ%IÕJð	Kà�‰× Ñ Ð!=Õ>r6   c                ó�   — | j                  «       }| j                  g d¢«       | j                  | j                  |«      g d¢«       y)zÆ
        L{IMAP4Client.expunge} sends the I{EXPUNGE} command and returns a
        L{Deferred} which fires with a C{list} of message sequence numbers
        given by the server's response.
        )rÇ   rÇ   rÊ   rÍ   N)r  rç  rB   rê  rã  s     r4   Útest_expungez$IMAP4ClientExpungeTests.test_expungeé  s6   € ð �M‰M‹OˆØ�‰’|Ô$Ø×Ñ˜×-Ñ-¨aÓ0²,Õ?r6   c                óŠ   — | j                  «       }| j                  g d¢«       | j                  |t        j                  «       y)zÐ
        If the server responds with a non-integer where a message sequence
        number is expected, the L{Deferred} returned by L{IMAP4Client.expunge}
        fails with L{IllegalServerResponse}.
        )rÇ   rÇ   rH  rÍ   N)r  rç  rï  r   rÈ  rã  s     r4   Útest_nonIntegerExpungedz/IMAP4ClientExpungeTests.test_nonIntegerExpungedó  s2   € ð �M‰M‹OˆØ�‰Ò'Ô(Ø×Ñ˜Q¤× ;Ñ ;Õ<r6   N)rs   rt   ru   r3  r  rç  r  r  r1   r6   r4   r  r  Ð  s   „ ñòò?ò
@ó=r6   r  c                  ó(   — e Zd ZdZd„ Zd„ Zd„ Zd„ Zy)ÚIMAP4ClientSearchTestsaí  
    Tests for the L{IMAP4Client.search} method.

    An example of usage of the SEARCH command from RFC 3501, section 6.4.4::

        C: A282 SEARCH FLAGGED SINCE 1-Feb-1994 NOT FROM "Smith"
        S: * SEARCH 2 84 882
        S: A282 OK SEARCH completed
        C: A283 SEARCH TEXT "string not in mailbox"
        S: * SEARCH
        S: A283 OK SEARCH completed
        C: A284 SEARCH CHARSET UTF-8 TEXT {6}
        C: XXXXXX
        S: * SEARCH 43
        S: A284 OK SEARCH completed
    c                ó¸   — | j                   j                  t        j                  d¬«      «      }| j	                  | j
                  j                  «       d«       |S )NÚABCDEF)rF   s   0001 SEARCH (TEXT "ABCDEF")
)rþ  Úsearchr   r  rB   rì  r  rã  s     r4   Ú_searchzIMAP4ClientSearchTests._search  sB   € Ø�K‰K×ÑœuŸ{™{°Ô9Ó:ˆØ×Ñ˜Ÿ™×-Ñ-Ó/Ð1SÔTØˆr6   c                óÂ   — | j                   j                  dt        dj                  t	        t
        |«      «      «      z   «       | j                   j                  d«       y )Ns	   * SEARCH ú s   0001 OK SEARCH completed)rþ  rÚ  r)   r’   Úmaprå   )rE   ÚmessageNumberss     r4   rç  z IMAP4ClientSearchTests._response  sF   € Ø�‰× Ñ Øœ=¨¯©´#´c¸>Ó2JÓ)KÓLÑLô	
ð 	�‰× Ñ Ð!<Õ=r6   c                ó�   — | j                  «       }| j                  g d¢«       | j                  | j                  |«      g d¢«       y)zÄ
        L{IMAP4Client.search} sends the I{SEARCH} command and returns a
        L{Deferred} which fires with a C{list} of message sequence numbers
        given by the server's response.
        )rÉ   rÊ   rö   N)r!  rç  rB   rê  rã  s     r4   Útest_searchz"IMAP4ClientSearchTests.test_search  s6   € ð �L‰L‹NˆØ�‰’zÔ"Ø×Ñ˜×-Ñ-¨aÓ0²*Õ=r6   c                óŠ   — | j                  «       }| j                  g d¢«       | j                  |t        j                  «       y)zÏ
        If the server responds with a non-integer where a message sequence
        number is expected, the L{Deferred} returned by L{IMAP4Client.search}
        fails with L{IllegalServerResponse}.
        )rÉ   rH  rö   N)r!  rç  rï  r   rÈ  rã  s     r4   Útest_nonIntegerFoundz+IMAP4ClientSearchTests.test_nonIntegerFound%  s1   € ð �L‰L‹NˆØ�‰’~Ô&Ø×Ñ˜Q¤× ;Ñ ;Õ<r6   N)rs   rt   ru   r3  r!  rç  r'  r)  r1   r6   r4   r  r  þ  s   „ ñò"ò
>ò>ó=r6   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d„ Zd„ Zd„ Zd„ Zd„ Zy)ÚIMAP4ClientFetchTestszV
    Tests for the L{IMAP4Client.fetch} method.

    See RFC 3501, section 6.4.5.
    c                óø  — | j                   j                  d«      }| j                  | j                  j	                  «       d«       | j                   j                  d«       | j                   j                  d«       | j                   j                  d«       | j                   j                  d«       | j                   j                  d«       | j                  | j                  |«      dd	idd
iddiddidœ«       y)a  
        L{IMAP4Client.fetchUID} sends the I{FETCH UID} command and returns a
        L{Deferred} which fires with a C{dict} mapping message sequence numbers
        to C{dict}s mapping C{'UID'} to that message's I{UID} in the server's
        response.
        ú1:7ó   0001 FETCH 1:7 (UID)
ó   * 2 FETCH (UID 22)s   * 3 FETCH (UID 23)ó   * 4 FETCH (UID 24)s   * 5 FETCH (UID 25)ó   0001 OK FETCH completedr©  Ú22Ú23Ú24Ú25©rÉ   rÇ   rË   rÊ   N)rþ  ÚfetchUIDrB   rì  r  rÚ  rê  rã  s     r4   Útest_fetchUIDz#IMAP4ClientFetchTests.test_fetchUID7  sÍ   € ð �K‰K× Ñ  Ó'ˆØ×Ñ˜Ÿ™×-Ñ-Ó/Ð1LÔMØ�‰× Ñ Ð!6Ô7Ø�‰× Ñ Ð!6Ô7Ø�‰× Ñ Ð!6Ô7Ø�‰× Ñ Ð!6Ô7Ø�‰× Ñ Ð!;Ô<Ø×ÑØ× Ñ  Ó#Ø˜� 5¨$ -°U¸D°MÀuÈdÀmÑTõ	
r6   c                ó:  — | j                   j                  d«      }| j                  | j                  j	                  «       d«       | j                   j                  d«       | j                   j                  d«       | j                  |t        j                  «       y)zÑ
        If the server responds with a non-integer where a message sequence
        number is expected, the L{Deferred} returned by L{IMAP4Client.fetchUID}
        fails with L{IllegalServerResponse}.
        rð   s   0001 FETCH 1 (UID)
s   * foo FETCH (UID 22)r1  N©	rþ  r7  rB   rì  r  rÚ  rï  r   rÈ  rã  s     r4   Útest_fetchUIDNonIntegerFoundz2IMAP4ClientFetchTests.test_fetchUIDNonIntegerFoundJ  sr   € ð �K‰K× Ñ  Ó%ˆØ×Ñ˜Ÿ™×-Ñ-Ó/Ð1JÔKØ�‰× Ñ Ð!8Ô9Ø�‰× Ñ Ð!;Ô<Ø×Ñ˜Q¤× ;Ñ ;Õ<r6   c                ó¦  — | j                   j                  d«      }| j                  | j                  j	                  «       d«       | j                   j                  d«       | j                   j                  d«       | j                   j                  d«       | j                   j                  d«       | j                  |t        j                  «       y)z¼
        If the server responds with an incomplete I{FETCH} response line, the
        L{Deferred} returned by L{IMAP4Client.fetchUID} fails with
        L{IllegalServerResponse}.
        r-  r.  r/  s   * 3 FETCH (UID)r0  r1  Nr:  rã  s     r4   Útest_incompleteFetchUIDResponsez5IMAP4ClientFetchTests.test_incompleteFetchUIDResponseV  s˜   € ð �K‰K× Ñ  Ó'ˆØ×Ñ˜Ÿ™×-Ñ-Ó/Ð1LÔMØ�‰× Ñ Ð!6Ô7Ø�‰× Ñ Ð!3Ô4Ø�‰× Ñ Ð!6Ô7Ø�‰× Ñ Ð!;Ô<Ø×Ñ˜Q¤× ;Ñ ;Õ<r6   c                óD  — | j                   j                  d«      }| j                  | j                  j	                  «       d«       | j                   j                  d«       | j                   j                  d«       | j                  | j                  |«      dddii«       y)	a  
        L{IMAP4Client.fetchBody} sends the I{FETCH BODY} command and returns a
        L{Deferred} which fires with a C{dict} mapping message sequence numbers
        to C{dict}s mapping C{'RFC822.TEXT'} to that message's body as given in
        the server's response.
        Ú3s   0001 FETCH 3 (RFC822.TEXT)
s&   * 3 FETCH (RFC822.TEXT "Message text")r1  rÇ   r¥  zMessage textN)rþ  Ú	fetchBodyrB   rì  r  rÚ  rê  rã  s     r4   Útest_fetchBodyz$IMAP4ClientFetchTests.test_fetchBodyd  s�   € ð �K‰K×!Ñ! #Ó&ˆØ×Ñ˜Ÿ™×-Ñ-Ó/Ð1RÔSØ�‰× Ñ Ð!JÔKØ�‰× Ñ Ð!;Ô<Ø×Ñ˜×-Ñ-¨aÓ0°1°}ÀnÐ6UÐ2VÕWr6   c                óH  — | j                   j                  d«      }| j                  | j                  j	                  «       d«       | j                   j                  d«       | j                   j                  d«       | j                  | j                  |«      ddg dggi«       y)	aI  
        L{IMAP4Client.fetchSpecific} sends the I{BODY[]} command if no
        parameters beyond the message set to retrieve are given.  It returns a
        L{Deferred} which fires with a C{dict} mapping message sequence numbers
        to C{list}s of corresponding message data given by the server's
        response.
        Ú7ó   0001 FETCH 7 BODY[]
s   * 7 FETCH (BODY[] "Some body")r1  rÎ   rÂ  ú	Some bodyN©rþ  r®  rB   rì  r  rÚ  rê  rã  s     r4   Útest_fetchSpecificz(IMAP4ClientFetchTests.test_fetchSpecificq  s†   € ð �K‰K×%Ñ% cÓ*ˆØ×Ñ˜Ÿ™×-Ñ-Ó/Ð1KÔLØ�‰× Ñ Ð!BÔCØ�‰× Ñ Ð!;Ô<Ø×Ñ˜×-Ñ-¨aÓ0°1¸ÀÀKÐ7PÐ6QÐ2RÕSr6   c                óL  — | j                   j                  dd¬«      }| j                  | j                  j	                  «       d«       | j                   j                  d«       | j                   j                  d«       | j                  | j                  |«      ddg d	ggi«       y
)zƒ
        L{IMAP4Client.fetchSpecific} issues a I{BODY.PEEK[]} command if passed
        C{True} for the C{peek} parameter.
        Ú6T)rÉ  s   0001 FETCH 6 BODY.PEEK[]
s   * 6 FETCH (BODY[] "Some body")r1  rÌ   rÂ  rE  NrF  rã  s     r4   Útest_fetchSpecificPeekz,IMAP4ClientFetchTests.test_fetchSpecificPeek  s‹   € ð
 �K‰K×%Ñ% c°Ð%Ó5ˆØ×Ñ˜Ÿ™×-Ñ-Ó/Ð1PÔQà�‰× Ñ Ð!BÔCØ�‰× Ñ Ð!;Ô<Ø×Ñ˜×-Ñ-¨aÓ0°1¸ÀÀKÐ7PÐ6QÐ2RÕSr6   c                óN  — | j                   j                  dd¬«      }| j                  | j                  j	                  «       d«       | j                   j                  d«       | j                   j                  d«       | j                  | j                  |«      ddd	gd
ggi«       y)a;  
        L{IMAP4Client.fetchSpecific}, when passed a sequence for
        C{headerNumber}, sends the I{BODY[N.M]} command.  It returns a
        L{Deferred} which fires with a C{dict} mapping message sequence numbers
        to C{list}s of corresponding message data given by the server's
        response.
        rC  rÈ   ©ÚheaderNumbers   0001 FETCH 7 BODY[1.2.3]
s#   * 7 FETCH (BODY[1.2.3] "Some body")r1  rÎ   rÂ  z1.2.3rE  NrF  rã  s     r4   Útest_fetchSpecificNumberedz0IMAP4ClientFetchTests.test_fetchSpecificNumbered‹  s�   € ð �K‰K×%Ñ% c¸	Ð%ÓBˆØ×Ñ˜Ÿ™×-Ñ-Ó/Ð1PÔQØ�‰× Ñ Ð!GÔHØ�‰× Ñ Ð!;Ô<Ø×ÑØ× Ñ  Ó# a¨6°G°9¸kÐ*JÐ)KÐ%Lõ	
r6   c                óN  — | j                   j                  dd¬«      }| j                  | j                  j	                  «       d«       | j                   j                  d«       | j                   j                  d«       | j                  | j                  |«      dddgd	ggi«       y
)a1  
        L{IMAP4Client.fetchSpecific}, when passed C{'TEXT'} for C{headerType},
        sends the I{BODY[TEXT]} command.  It returns a L{Deferred} which fires
        with a C{dict} mapping message sequence numbers to C{list}s of
        corresponding message data given by the server's response.
        Ú8ÚTEXT©r©  ó   0001 FETCH 8 BODY[TEXT]
s"   * 8 FETCH (BODY[TEXT] "Some body")r1  rÍ   rÂ  rE  NrF  rã  s     r4   Útest_fetchSpecificTextz,IMAP4ClientFetchTests.test_fetchSpecificText›  ó�   € ð �K‰K×%Ñ% c°fÐ%Ó=ˆØ×Ñ˜Ÿ™×-Ñ-Ó/Ð1OÔPØ�‰× Ñ Ð!FÔGØ�‰× Ñ Ð!;Ô<Ø×ÑØ× Ñ  Ó# a¨6°F°8¸[Ð*IÐ)JÐ%Kõ	
r6   c                óP  — | j                   j                  ddd¬«      }| j                  | j                  j	                  «       d«       | j                   j                  d«       | j                   j                  d«       | j                  | j                  |«      dd	d
gdggi«       y)ah  
        If passed a value for the C{headerNumber} parameter and C{'TEXT'} for
        the C{headerType} parameter, L{IMAP4Client.fetchSpecific} sends a
        I{BODY[number.TEXT]} request and returns a L{Deferred} which fires with
        a C{dict} mapping message sequence numbers to C{list}s of message data
        given by the server's response.
        Ú4rQ  rÎ   )r©  rM  s   0001 FETCH 4 BODY[7.TEXT]
s$   * 4 FETCH (BODY[7.TEXT] "Some body")r1  rË   rÂ  z7.TEXTrE  NrF  rã  s     r4   Útest_fetchSpecificNumberedTextz4IMAP4ClientFetchTests.test_fetchSpecificNumberedTextª  s’   € ð �K‰K×%Ñ% c°fÈ1Ð%ÓMˆØ×Ñ˜Ÿ™×-Ñ-Ó/Ð1QÔRØ�‰× Ñ Ð!HÔIØ�‰× Ñ Ð!;Ô<Ø×ÑØ× Ñ  Ó# a¨6°H°:¸{Ð*KÐ)LÐ%Mõ	
r6   c                ó>  — | j                   j                  dd¬«      }| j                  | j                  j	                  «       d«       | j                   j                  d«       | j                   j                  d«       | j                  |t        j                  «       y)zü
        If the server responds to a I{BODY[TEXT]} request with a I{FETCH} line
        which is truncated after the I{BODY[TEXT]} tokens, the L{Deferred}
        returned by L{IMAP4Client.fetchUID} fails with
        L{IllegalServerResponse}.
        rP  rQ  rR  rS  s   * 8 FETCH (BODY[TEXT])r1  N©	rþ  r®  rB   rì  r  rÚ  rï  r   rÈ  rã  s     r4   Ú(test_incompleteFetchSpecificTextResponsez>IMAP4ClientFetchTests.test_incompleteFetchSpecificTextResponseº  sw   € ð �K‰K×%Ñ% c°fÐ%Ó=ˆØ×Ñ˜Ÿ™×-Ñ-Ó/Ð1OÔPØ�‰× Ñ Ð!:Ô;Ø�‰× Ñ Ð!;Ô<Ø×Ñ˜Q¤× ;Ñ ;Õ<r6   c                óN  — | j                   j                  dd¬«      }| j                  | j                  j	                  «       d«       | j                   j                  d«       | j                   j                  d«       | j                  | j                  |«      dddgd	ggi«       y
)a1  
        L{IMAP4Client.fetchSpecific}, when passed C{'MIME'} for C{headerType},
        sends the I{BODY[MIME]} command.  It returns a L{Deferred} which fires
        with a C{dict} mapping message sequence numbers to C{list}s of
        corresponding message data given by the server's response.
        rP  rÐ  rR  s   0001 FETCH 8 BODY[MIME]
s"   * 8 FETCH (BODY[MIME] "Some body")r1  rÍ   rÂ  rE  NrF  rã  s     r4   Útest_fetchSpecificMIMEz,IMAP4ClientFetchTests.test_fetchSpecificMIMEÇ  rU  r6   c                óT  — | j                   j                  dddd¬«      }| j                  | j                  j	                  «       d«       | j                   j                  d«       | j                   j                  d«       | j                  | j                  |«      d	d
dgddggi«       y)aX  
        L{IMAP4Client.fetchSpecific}, when passed C{offset} and C{length},
        sends a partial content request (like I{BODY[TEXT]<offset.length>}).
        It returns a L{Deferred} which fires with a C{dict} mapping message
        sequence numbers to C{list}s of corresponding message data given by the
        server's response.
        Ú9rQ  rD  rÇ   )r©  ÚoffsetÚlengths   0001 FETCH 9 BODY[TEXT]<17.3>
s    * 9 FETCH (BODY[TEXT]<17> "foo")r1  r÷   rÂ  z<17>rH  NrF  rã  s     r4   Útest_fetchSpecificPartialz/IMAP4ClientFetchTests.test_fetchSpecificPartialÖ  s—   € ð �K‰K×%Ñ% c°fÀRÐPQÐ%ÓRˆØ×Ñ˜Ÿ™×-Ñ-Ó/Ð1UÔVØ�‰× Ñ Ð!DÔEØ�‰× Ñ Ð!;Ô<Ø×ÑØ× Ñ  Ó# a¨6°F°8¸VÀUÐ*KÐ)LÐ%Mõ	
r6   c                ó>  — | j                   j                  dd¬«      }| j                  | j                  j	                  «       d«       | j                   j                  d«       | j                   j                  d«       | j                  |t        j                  «       y)a  
        If the server responds to a I{BODY[TEXT]} request with a I{FETCH} line
        which is truncated after the I{BODY[TEXT]<offset>} tokens, the
        L{Deferred} returned by L{IMAP4Client.fetchUID} fails with
        L{IllegalServerResponse}.
        rP  rQ  rR  rS  s   * 8 FETCH (BODY[TEXT]<17>)r1  NrZ  rã  s     r4   Ú+test_incompleteFetchSpecificPartialResponsezAIMAP4ClientFetchTests.test_incompleteFetchSpecificPartialResponseæ  sw   € ð �K‰K×%Ñ% c°fÐ%Ó=ˆØ×Ñ˜Ÿ™×-Ñ-Ó/Ð1OÔPØ�‰× Ñ Ð!>Ô?Ø�‰× Ñ Ð!;Ô<Ø×Ñ˜Q¤× ;Ñ ;Õ<r6   c                óH  — | j                   j                  d«      }| j                  | j                  j	                  «       d«       | j                   j                  d«       | j                   j                  d«       | j                  | j                  |«      ddg dggi«       y)	aA  
        If the body of a message begins with I{<} and ends with I{>} (as,
        for example, HTML bodies typically will), this is still interpreted
        as the body by L{IMAP4Client.fetchSpecific} (and particularly, not
        as a length indicator for a response to a request for a partial
        body).
        rC  rD  s&   * 7 FETCH (BODY[] "<html>test</html>")r1  rÎ   rÂ  z<html>test</html>NrF  rã  s     r4   Útest_fetchSpecificHTMLz,IMAP4ClientFetchTests.test_fetchSpecificHTMLó  sŠ   € ð �K‰K×%Ñ% cÓ*ˆØ×Ñ˜Ÿ™×-Ñ-Ó/Ð1KÔLØ�‰× Ñ Ð!JÔKØ�‰× Ñ Ð!;Ô<Ø×ÑØ× Ñ  Ó# a¨6°2Ð7JÐ*KÐ)LÐ%Mõ	
r6   c                ó¤  — | j                   j                  d|¬«      }| j                  | j                  j	                  «       d|j                  d«      z   dz   «       | j                   j                  d|j                  d«      z   dz   «       | j                   j                  d«       | j                  | j                  |«      d	d
|g gdggi«       y)aÏ  
        Assert that the provided C{BODY} section, when invoked with no
        arguments, produces an empty list, and that it returns a
        L{Deferred} which fires with a C{dict} mapping message
        sequence numbers to C{list}s of corresponding message data
        given by the server's response.

        @param section: The C{BODY} section to test: either
            C{'HEADER.FIELDS'} or C{'HEADER.FIELDS.NOT'}
        @type section: L{str}
        Ú10rR  s   0001 FETCH 10 BODY[r®  s    ()]
s   * 10 FETCH (BODY[s    ()] "")r1  rö   rÂ  r(  N)rþ  r®  rB   rì  r  rC   rÚ  rê  )rE   Úsectionrž   s      r4   Ú&assertFetchSpecificFieldsWithEmptyListz<IMAP4ClientFetchTests.assertFetchSpecificFieldsWithEmptyList  s¿   € ð �K‰K×%Ñ% d°wÐ%Ó?ˆØ×ÑØ�N‰N× Ñ Ó"Ø" W§^¡^°GÓ%<Ñ<¸{ÑJô	
ð 	�‰× Ñ Ø  7§>¡>°'Ó#:Ñ:¸[ÑHô	
ð 	�‰× Ñ Ð!;Ô<Ø×Ñ˜×-Ñ-¨aÓ0°2¸À'È2ÀÐPRÐ8SÐ7TÐ2UÕVr6   c                ó&   — | j                  d«       y)az  
        L{IMAP4Client.fetchSpecific}, when passed C{'HEADER.FIELDS'}
        for C{headerType} but no C{headerArgs}, sends the
        I{BODY[HEADER.FIELDS]} command with no arguments.  It returns
        a L{Deferred} which fires with a C{dict} mapping message
        sequence numbers to C{list}s of corresponding message data
        given by the server's response.
        r¦  N©rj  rR   s    r4   Ú,test_fetchSpecificHeaderFieldsWithoutHeaderszBIMAP4ClientFetchTests.test_fetchSpecificHeaderFieldsWithoutHeaders  s   € ð 	×3Ñ3°OÕDr6   c                ó&   — | j                  d«       y)a‚  
        L{IMAP4Client.fetchSpecific}, when passed
        C{'HEADER.FIELDS.NOT'} for C{headerType} but no C{headerArgs},
        sends the I{BODY[HEADER.FIELDS.NOT]} command with no
        arguments.  It returns a L{Deferred} which fires with a
        C{dict} mapping message sequence numbers to C{list}s of
        corresponding message data given by the server's response.
        zHEADER.FIELDS.NOTNrl  rR   s    r4   Ú/test_fetchSpecificHeaderFieldsNotWithoutHeaderszEIMAP4ClientFetchTests.test_fetchSpecificHeaderFieldsNotWithoutHeaders'  s   € ð 	×3Ñ3Ð4GÕHr6   c                óN  — | j                   j                  dd¬«      }| j                  | j                  j	                  «       d«       | j                   j                  d«       | j                   j                  d«       | j                  | j                  |«      dddgd	ggi«       y
)a=  
        L{IMAP4Client.fetchSpecific}, when passed C{'HEADER'} for
        C{headerType}, sends the I{BODY[HEADER]} command.  It returns
        a L{Deferred} which fires with a C{dict} mapping message
        sequence numbers to C{list}s of corresponding message data
        given by the server's response.
        Ú11ÚHEADERrR  s   0001 FETCH 11 BODY[HEADER]
sJ   * 11 FETCH (BODY[HEADER] "From: someone@localhost
Subject: Some subject")r1  r?  rÂ  z.From: someone@localhost
Subject: Some subjectNrF  rã  s     r4   Útest_fetchSpecificHeaderz.IMAP4ClientFetchTests.test_fetchSpecificHeader2  s¡   € ð �K‰K×%Ñ% d°xÐ%Ó@ˆØ×Ñ˜Ÿ™×-Ñ-Ó/Ð1RÔSØ�‰× Ñ ðDô	
ð 	�‰× Ñ Ð!;Ô<Ø×ÑØ× Ñ  Ó#ààØ!˜
ØJðððõ	
r6   N)rs   rt   ru   r3  r8  r;  r=  rA  rG  rJ  rN  rT  rX  r[  r]  rb  rd  rf  rj  rm  ro  rs  r1   r6   r4   r+  r+  0  sg   „ ñò
ò&
=ò=òXòTò
Tò
ò 
ò
ò =ò
ò
ò =ò
ò Wò2	Eò	Ió
r6   r+  c                  ó\   — e Zd ZdZ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y)ÚIMAP4ClientStoreTestsaÛ  
    Tests for the L{IMAP4Client.setFlags}, L{IMAP4Client.addFlags}, and
    L{IMAP4Client.removeFlags} methods.

    An example of usage of the STORE command, in terms of which these three
    methods are implemented, from RFC 3501, section 6.4.6::

        C: A003 STORE 2:4 +FLAGS (\Deleted)
        S: * 2 FETCH (FLAGS (\Deleted \Seen))
        S: * 3 FETCH (FLAGS (\Deleted))
        S: * 4 FETCH (FLAGS (\Deleted \Flagged \Seen))
        S: A003 OK STORE completed
    c                óZ  —  t        | j                  |«      ddd«      }| j                  | j                  j	                  «       d|z   dz   «       | j                  j                  d«       | j                  j                  d«       | j                  | j                  |«      dd	d
dgii«       y)am  
        Test a non-silent flag modifying method.  Call the method, assert that
        the correct bytes are sent, deliver a I{FETCH} response, and assert
        that the result of the Deferred returned by the method is correct.

        @param method: The name of the method to test.
        @param item: The data item which is expected to be specified.
        r?  ©ú\Readr²  Fó   0001 STORE 3 ó    (\Read \Seen)
s   * 3 FETCH (FLAGS (\Read \Seen))ó   0001 OK STORE completedrÇ   r›  rx  r²  N©r²  rþ  rB   rì  r  rÚ  rê  ©rE   râ  Úitemrž   s       r4   Ú
_flagsTestz IMAP4ClientStoreTests._flagsTest`  sž   € ð )ŒG�D—K‘K Ó(¨Ð.BÀEÓJˆØ×ÑØ�N‰N× Ñ Ó"Ð$4°tÑ$;Ð>UÑ$Uô	
ð 	�‰× Ñ Ð!EÔFØ�‰× Ñ Ð!;Ô<Ø×Ñ˜×-Ñ-¨aÓ0°1°wÀÈ8Ð@TÐ6UÐ2VÕWr6   c                ó  —  t        | j                  |«      ddd«      }| j                  | j                  j	                  «       d|z   dz   «       | j                  j                  d«       | j                  | j                  |«      i «       y)ag  
        Test a silent flag modifying method.  Call the method, assert that the
        correct bytes are sent, deliver an I{OK} response, and assert that the
        result of the Deferred returned by the method is correct.

        @param method: The name of the method to test.
        @param item: The data item which is expected to be specified.
        r?  rw  Try  rz  r{  Nr|  r}  s       r4   Ú_flagsSilentlyTestz(IMAP4ClientStoreTests._flagsSilentlyTestq  s|   € ð )ŒG�D—K‘K Ó(¨Ð.BÀDÓIˆØ×ÑØ�N‰N× Ñ Ó"Ð$4°tÑ$;Ð>UÑ$Uô	
ð 	�‰× Ñ Ð!;Ô<Ø×Ñ˜×-Ñ-¨aÓ0°"Õ5r6   c                ó¢  —  t        | j                  |«      ddd«      }| j                  | j                  j	                  «       d|z   dz   «       | j                  j                  d«       | j                  j                  d«       | j                  | j                  |«      i «       | j                  | j                  j                  dd	d
gi«       y)a¨  
        Test unsolicited data received in response to a silent flag modifying
        method.  Call the method, assert that the correct bytes are sent,
        deliver the unsolicited I{FETCH} response, and assert that the result
        of the Deferred returned by the method is correct.

        @param method: The name of the method to test.
        @param item: The data item which is expected to be specified.
        r?  rw  Try  rz  s   * 2 FETCH (FLAGS (\Read \Seen))r{  rÉ   rx  r²  N)r²  rþ  rB   rì  r  rÚ  rê  r�  r}  s       r4   Ú%_flagsSilentlyWithUnsolicitedDataTestz;IMAP4ClientStoreTests._flagsSilentlyWithUnsolicitedDataTest�  s³   € ð )ŒG�D—K‘K Ó(¨Ð.BÀDÓIˆØ×ÑØ�N‰N× Ñ Ó"Ð$4°tÑ$;Ð>UÑ$Uô	
ð 	�‰× Ñ Ð!EÔFØ�‰× Ñ Ð!;Ô<Ø×Ñ˜×-Ñ-¨aÓ0°"Ô5Ø×Ñ˜Ÿ™×*Ñ*¨Q°¸8Ð0DÐ,EÕFr6   c                ó(   — | j                  dd«       y)aQ  
        When passed a C{False} value for the C{silent} parameter,
        L{IMAP4Client.setFlags} sends the I{STORE} command with a I{FLAGS} data
        item and returns a L{Deferred} which fires with a C{dict} mapping
        message sequence numbers to C{dict}s mapping C{'FLAGS'} to the new
        flags of those messages.
        ÚsetFlagsr‘  N©r  rR   s    r4   Útest_setFlagsz#IMAP4ClientStoreTests.test_setFlags”  s   € ð 	�‰˜
 HÕ-r6   c                ó(   — | j                  dd«       y)zö
        When passed a C{True} value for the C{silent} parameter,
        L{IMAP4Client.setFlags} sends the I{STORE} command with a
        I{FLAGS.SILENT} data item and returns a L{Deferred} which fires with an
        empty dictionary.
        r…  ó   FLAGS.SILENTN©r�  rR   s    r4   Útest_setFlagsSilentlyz+IMAP4ClientStoreTests.test_setFlagsSilentlyž  s   € ð 	×Ñ 
¨OÕ<r6   c                ó(   — | j                  dd«       y)z®
        If unsolicited flag data is received in response to a I{STORE}
        I{FLAGS.SILENT} request, that data is passed to the C{flagsChanged}
        callback.
        r…  r‰  N©rƒ  rR   s    r4   Ú(test_setFlagsSilentlyWithUnsolicitedDataz>IMAP4ClientStoreTests.test_setFlagsSilentlyWithUnsolicitedData§  s   € ð 	×2Ñ2°:¸ÕOr6   c                ó(   — | j                  dd«       y)z{
        L{IMAP4Client.addFlags} is like L{IMAP4Client.setFlags}, but sends
        I{+FLAGS} instead of I{FLAGS}.
        ÚaddFlagss   +FLAGSNr†  rR   s    r4   Útest_addFlagsz#IMAP4ClientStoreTests.test_addFlags¯  s   € ð
 	�‰˜
 IÕ.r6   c                ó(   — | j                  dd«       y)zß
        L{IMAP4Client.addFlags} with a C{True} value for C{silent} behaves like
        L{IMAP4Client.setFlags} with a C{True} value for C{silent}, but it
        sends I{+FLAGS.SILENT} instead of I{FLAGS.SILENT}.
        r�  ó   +FLAGS.SILENTNrŠ  rR   s    r4   Útest_addFlagsSilentlyz+IMAP4ClientStoreTests.test_addFlagsSilently¶  s   € ð 	×Ñ 
Ð,<Õ=r6   c                ó(   — | j                  dd«       y)z‘
        L{IMAP4Client.addFlags} behaves like L{IMAP4Client.setFlags} when used
        in silent mode and unsolicited data is received.
        r�  r“  Nr�  rR   s    r4   Ú(test_addFlagsSilentlyWithUnsolicitedDataz>IMAP4ClientStoreTests.test_addFlagsSilentlyWithUnsolicitedData¾  s   € ð
 	×2Ñ2°:Ð?OÕPr6   c                ó(   — | j                  dd«       y)z~
        L{IMAP4Client.removeFlags} is like L{IMAP4Client.setFlags}, but sends
        I{-FLAGS} instead of I{FLAGS}.
        ÚremoveFlagss   -FLAGSNr†  rR   s    r4   Útest_removeFlagsz&IMAP4ClientStoreTests.test_removeFlagsÅ  s   € ð
 	�‰˜ yÕ1r6   c                ó(   — | j                  dd«       y)zâ
        L{IMAP4Client.removeFlags} with a C{True} value for C{silent} behaves
        like L{IMAP4Client.setFlags} with a C{True} value for C{silent}, but it
        sends I{-FLAGS.SILENT} instead of I{FLAGS.SILENT}.
        r˜  ó   -FLAGS.SILENTNrŠ  rR   s    r4   Útest_removeFlagsSilentlyz.IMAP4ClientStoreTests.test_removeFlagsSilentlyÌ  s   € ð 	×Ñ Ð/?Õ@r6   c                ó(   — | j                  dd«       y)z”
        L{IMAP4Client.removeFlags} behaves like L{IMAP4Client.setFlags} when
        used in silent mode and unsolicited data is received.
        r˜  r›  Nr�  rR   s    r4   Ú+test_removeFlagsSilentlyWithUnsolicitedDatazAIMAP4ClientStoreTests.test_removeFlagsSilentlyWithUnsolicitedDataÔ  s   € ð
 	×2Ñ2°=ÐBRÕSr6   N)rs   rt   ru   r3  r�  rÜ  r  r�  rƒ  r‡  r‹  rŽ  r‘  r”  r–  r™  rœ  rž  r1   r6   r4   ru  ru  O  sP   „ ñð (€NòXò"6ò Gò&.ò=òPò/ò>òQò2òAóTr6   ru  c                  ó   — e Zd ZdZd„ Zd„ Zy)ÚIMAP4ClientStatusTestsa_  
    Tests for the L{IMAP4Client.status} method.

    An example of usage of the STATUS command from RFC 3501, section
    5.1.2::

        C: A042 STATUS blurdybloop (UIDNEXT MESSAGES)
        S: * STATUS blurdybloop (MESSAGES 231 UIDNEXT 44292)
        S: A042 OK STATUS completed

    @see: U{https://tools.ietf.org/html/rfc3501#section-5.1.2}
    c                ó¬   — | j                  t        | j                  j                  dd«      }| j	                  t        |«      dt        dh«      z   «       y)z‘
        Only allow sending the C{STATUS} names defined in RFC 3501.

        @see: U{https://tools.ietf.org/html/rfc3501#section-5.1.2}
        rT  zIMPOSSIBLE?!zUnknown names: N)r×   r  rþ  rb  rB   rå   rÛ   )rE   Úexcs     r4   ÚtestUnknownNamez&IMAP4ClientStatusTests.testUnknownNameê  sN   € ð ×ÑÜØ�K‰K×ÑØØó	
ˆð 	×Ñœ˜S›Ð#4´t¸^Ð<LÓ7MÑ#MÕNr6   c                ó<  — | j                   j                  dd«      }| j                  | j                  j	                  «       d«       | j                   j                  d«       | j                   j                  d«       | j                  |t        j                  «       y)z‰
        C{STATUS} names that cannot be decoded as ASCII cause the
        status Deferred to fail with L{IllegalServerResponse}
        ÚblurdyblooprQ  s$   0001 STATUS blurdybloop (MESSAGES)
s?   * STATUS blurdybloop (MESSAGES 1 ASCIINAME "OK" NOTÿASCII "NO")s   0001 OK STATUS completedN)	rþ  rb  rB   rì  r  rÚ  rï  r   rÈ  rã  s     r4   ÚtestUndecodableNamez*IMAP4ClientStatusTests.testUndecodableNameø  s}   € ð �K‰K×Ñ˜}¨jÓ9ˆØ×ÑØ�N‰N× Ñ Ó"Ø5ô	
ð
 	�‰× Ñ ØUô	
ð 	�‰× Ñ Ð!<Ô=Ø×Ñ˜Q¤× ;Ñ ;Õ<r6   N)rs   rt   ru   r3  r£  r¦  r1   r6   r4   r   r   Ü  s   „ ñòOó=r6   r   c                  ó,   — e Zd ZdZeZd„ Zd„ Zd„ Zd„ Z	y)ÚIMAP4ClientCopyTestszà
    Tests for the L{IMAP4Client.copy} method.

    An example of the C{COPY} command, which this method implements,
    from RFC 3501, section 6.4.7::

        C: A003 COPY 2:4 MEETING
        S: A003 OK COPY completed
    c                ó  — | j                   j                  ddd¬«      }| j                  | j                  j	                  «       d«       | j                   j                  d«       | j                  | j                  |«      g df«       y)	z·
        L{IMAP4Client.copy} copies the messages identified by their
        sequence numbers to the mailbox, returning a L{Deferred} that
        succeeds with a true value.
        rí   ÚMEETINGFr  ó   0001 COPY 2:3 MEETING
ó   0001 OK COPY completedó   OK COPY completedN©rþ  ÚcopyrB   rì  r  rÚ  rê  rã  s     r4   Útest_copySequenceNumbersz-IMAP4ClientCopyTests.test_copySequenceNumbers  sv   € ð �K‰K×Ñ˜U I°5ÐÓ9ˆà×ÑØ�N‰N× Ñ Ó"Ø(ô	
ð
 	�‰× Ñ Ð!:Ô;Ø×Ñ˜×-Ñ-¨aÓ0°2Ð7KÐ2LÕMr6   c                ó<  — | j                   j                  ddd¬«      }| j                  | j                  j	                  «       d«       | j                   j                  d«       | j                  | j                  |«      j                  t        j                  «       y)zÎ
        L{IMAP4Client.copy} returns a L{Deferred} that fails with an
        L{IMAP4Exception} when the messages specified by the given
        sequence numbers could not be copied to the mailbox.
        rí   rª  Fr  r«  ó   0001 BAD COPY failedN©
rþ  r¯  rB   rì  r  rÚ  r×  rï  r   r  rã  s     r4   Útest_copySequenceNumbersFailsz2IMAP4ClientCopyTests.test_copySequenceNumbersFails(  s|   € ð �K‰K×Ñ˜U I°5ÐÓ9ˆà×ÑØ�N‰N× Ñ Ó"Ø(ô	
ð
 	�‰× Ñ Ð!8Ô9Ø×Ñ˜d×2Ñ2°1Ó5×;Ñ;¼U×=QÑ=QÕRr6   c                ó  — | j                   j                  ddd¬«      }| j                  | j                  j	                  «       d«       | j                   j                  d«       | j                  | j                  |«      g df«       y)	z«
        L{IMAP4Client.copy} copies the messages identified by their
        UIDs to the mailbox, returning a L{Deferred} that succeeds
        with a true value.
        rí   rª  Tr  ó   0001 UID COPY 2:3 MEETING
r¬  r­  Nr®  rã  s     r4   Útest_copyUIDsz"IMAP4ClientCopyTests.test_copyUIDs8  sv   € ð �K‰K×Ñ˜U I°4ÐÓ8ˆà×ÑØ�N‰N× Ñ Ó"Ø,ô	
ð
 	�‰× Ñ Ð!:Ô;Ø×Ñ˜×-Ñ-¨aÓ0°2Ð7KÐ2LÕMr6   c                ó<  — | j                   j                  ddd¬«      }| j                  | j                  j	                  «       d«       | j                   j                  d«       | j                  | j                  |«      j                  t        j                  «       y)zÂ
        L{IMAP4Client.copy} returns a L{Deferred} that fails with an
        L{IMAP4Exception} when the messages specified by the given
        UIDs could not be copied to the mailbox.
        rí   rª  Tr  r¶  r²  Nr³  rã  s     r4   Útest_copyUIDsFailsz'IMAP4ClientCopyTests.test_copyUIDsFailsH  s|   € ð �K‰K×Ñ˜U I°4ÐÓ8ˆà×ÑØ�N‰N× Ñ Ó"Ø,ô	
ð
 	�‰× Ñ Ð!8Ô9Ø×Ñ˜d×2Ñ2°1Ó5×;Ñ;¼U×=QÑ=QÕRr6   N)
rs   rt   ru   r3  r�  rÜ  r°  r´  r·  r¹  r1   r6   r4   r¨  r¨    s&   „ ñð (€NòNò Sò Nó Sr6   r¨  c                  ó   — e Zd ZdZdZd„ Zy)ÚFakeyServerrÃ  Nc                 ó   — y r0   r1   rR   s    r4   ÚsendServerGreetingzFakeyServer.sendServerGreeting]  r  r6   )rs   rt   ru   rR  Útimeoutr½  r1   r6   r4   r»  r»  Y  s   „ Ø€EØ€Gór6   r»  c                  óF   — e Zd ZdZd„ Zd„ Zd„ Zd„ Zd„ Zd„ Z	d„ Z
d	„ Zd
„ Zy)r˜   )rœ   r�  rŽ  Ú_bodyrª  c                óx   — || _         || _        || _        t        |«      | _        || _        || _        || _        y r0   )rœ   r�  rÀ  rÐ   ÚsizerŽ  rª  Úsubpart)rE   rœ   r�  rŽ  r“   rª  rÃ  s          r4   rz   zFakeyMessage.__init__e  s7   € ØˆŒØˆŒ
ØˆŒ
Ü˜“IˆŒ	ØˆŒ	ØˆŒØˆ�r6   c                ó,   — ||f| _         | j                  S r0   )Úgot_headersrœ   )rE   rÍ  r†  s      r4   Ú
getHeaderszFakeyMessage.getHeadersn  s   € Ø! 5˜=ˆÔØ�|‰|Ðr6   c                ó   — | j                   S r0   rm  rR   s    r4   rn  zFakeyMessage.getFlagsr  ro  r6   c                ó   — | j                   S r0   )rŽ  rR   s    r4   ÚgetInternalDatezFakeyMessage.getInternalDateu  ó   € Ø�y‰yÐr6   c                ó,   — t        | j                  «      S r0   )r   rÀ  rR   s    r4   ÚgetBodyFilezFakeyMessage.getBodyFilex  s   € Ü�t—z‘zÓ"Ð"r6   c                ó   — | j                   S r0   )rÂ  rR   s    r4   ÚgetSizezFakeyMessage.getSize{  rÊ  r6   c                ó   — | j                   S r0   r  rR   s    r4   r„  zFakeyMessage.getUID~  s   € Ø�x‰xˆr6   c                ó   — | j                   d uS r0   )rÃ  rR   s    r4   ÚisMultipartzFakeyMessage.isMultipart�  s   € Ø�|‰| 4Ð'Ð'r6   c                ó.   — || _         | j                  |   S r0   )Úgot_subpartrÃ  )rE   rÑ  s     r4   Ú
getSubPartzFakeyMessage.getSubPart„  s   € ØˆÔØ�|‰|˜DÑ!Ð!r6   N)rs   rt   ru   ÚshowAttributesrz   rÆ  rn  rÉ  rÌ  rÎ  r„  rÑ  rÔ  r1   r6   r4   r˜   r˜   a  s4   „ àA€Nòòòòò#òòò(ó"r6   r˜   c                  ó:   — e Zd ZdZdZd„ Zd„ Zd„ Zd„ Zd„ Z	dd„Z
y)	ÚNewStoreTestsNc                óü   — d x| _         | _        t        j                  «       | _        d| j                  _        | | j                  _        t        j                  «       | _	        t        | j                  «      | _        y ©NrÃ  )Úreceived_messagesÚreceived_uidr   rÏ  rý  rR  r^  r   r   rÿ  rß  rþ  rR   s    r4   r  zNewStoreTests.setUp�  sX   € Ø59Ð9ˆÔ Ô!2ä×'Ñ'Ó)ˆŒØ$ˆ�‰ÔØˆ�‰ÔÜŸ™Ó)ˆŒÜ" 4§>¡>Ó2ˆ�r6   c                 ó   — y r0   r1   ©rE   r\  s     r4   rh  zNewStoreTests.addListener–  r  r6   c                 ó   — y r0   r1   rÝ  s     r4   rj  zNewStoreTests.removeListener™  r  r6   c                ó,   — ||f| _         | j                  S r0   )Ú	storeArgsrŸ  )rE   rÖ  r×  s      r4   r¤  zNewStoreTests.storeœ  s   € Ø˜r˜ˆŒØ�}‰}Ðr6   c                ój  ‡ — ˆ fd„}ˆ fd„}‰ j                   j                  t        |«      «      j                  |«      j                  ‰ j                  «      j	                  ‰ j
                  «       ˆ fd„}t        j                  ‰ j                  ‰ j                  d¬«      }|j                  |«       |S )Nc                 ó|   •— ‰ j                  ‰ j                  ‰ j                  ‰ j                  ‰ j                  «      S r0   )Úfunctionr  r�  Úsilentrª  rR   s   €r4   rÿ  z+NewStoreTests._storeWork.<locals>.connected¡  s(   ø€ Ø—=‘= §¡°·
±
¸D¿K¹KÈÏÉÓRÐRr6   c                ó   •— | ‰_         y r0   ©r2   ©ÚRrE   s    €r4   r2   z(NewStoreTests._storeWork.<locals>.result¤  ó
   ø€ ØˆD�Kr6   c                óž   •— ‰j                  ‰j                  ‰j                  «       ‰j                  ‰j                  ‰j                  «       y r0   )rB   r2   rh  rà  ÚexpectedArgs©rT  rE   s    €r4   r�  z'NewStoreTests._storeWork.<locals>.check«  s5   ø€ Ø×Ñ˜TŸ[™[¨$¯-©-Ô8Ø×Ñ˜TŸ^™^¨T×->Ñ->Õ?r6   F©Únoisy©
rÿ  r›   r7   r  r'  r
  r#   ÚloopbackTCPrý  rþ  )rE   rÿ  r2   r�  rž   s   `    r4   Ú
_storeWorkzNewStoreTests._storeWork   s‰   ø€ ô	Sô	ð 	�‰×"Ñ"¤5¨Ó#3Ó4×@Ñ@ÀÓH×TÑTØ×Ñó	
ç
‰*�T—_‘_Ô
%ô	@ô × Ñ  §¡¨d¯k©kÀÔGˆØ	�‰�eÔØˆr6   c                ó’  — | j                   j                  | _        d| _        g d¢| _        d| _        || _        g d¢g d¢g d¢dœ| _        dg d¢idg d¢idg d¢idœ| _        t        j                  «       }|j                  d«       |j                  d«       |j                  d«       |g d¢d	fd
d	if| _        | j                  «       S )Nz1,5,9)z\Az\BÚCF)rÅ   rÊ   r÷   r›  rÅ   rÊ   r÷   r   rª  )rþ  r…  rã  r  r�  rä  rª  rŸ  rh  r   r   rÒ   rë  rñ  )rE   rª  r�   s      r4   ÚtestSetFlagszNewStoreTests.testSetFlags³  s¾   € ØŸ™×,Ñ,ˆŒØˆŒÚ(ˆŒ
ØˆŒØˆŒâ"Ú"Ú"ñ
ˆŒð Ò,Ð-ØÒ,Ð-ØÒ,Ð-ñ
ˆŒô
 ×ÑÓ ˆØ�‰�Œ
Ø�‰�Œ
Ø�‰�Œ
Ø!Ò#6¸Ð:¸UÀA¸JÐGˆÔØ�‰Ó Ð r6   rÄ  )rs   rt   ru   r2   rà  r  rh  rj  r¤  rñ  rô  r1   r6   r4   r×  r×  ‰  s*   „ Ø€FØ€Iò3òòòòô&!r6   r×  c                  óF   — e Zd ZdZd„ Zd„ Zd„ Zd„ Zd„ Zd„ Z	d„ Z
d	„ Zd
„ Zy)ÚGetBodyStructureTestsz½
    Tests for L{imap4.getBodyStructure}, a helper for constructing a list which
    directly corresponds to the wire information needed for a I{BODY} or
    I{BODYSTRUCTURE} response.
    c                óÞ   — d}d}d}d}d}d}d}t        |dz   |z   d	z   |z   d
z   |||dœdd|dd«      }t        j                  |«      }	| j                  ||d|ddg|||t	        |«      g|	«       y)z´
        L{imap4.getBodyStructure} accepts a L{IMessagePart} provider and returns
        a list giving the basic fields for the I{BODY} response for that
        message.
        ó   hello, worldÚimageÚjpegúus-asciiúsome kind of idúgreat justiceÚmaximumrQ  ú
; charset=ú; x=y©rŽ   ú
content-idúcontent-descriptionúcontent-transfer-encodingr1   r6   r�   NÚcharsetr\  Úy©r˜   r   ÚgetBodyStructurerB   rÐ   ©
rE   r“   ÚmajorÚminorr  rJ  Údescriptionrž  r�   Ú	structures
             r4   Útest_singlePartz%GetBodyStructureTests.test_singlePartÒ  s·   € ð ˆØˆØˆØˆØ&ˆ
Ø%ˆØˆÜà %¨¡¨eÑ 3°lÑ BÀWÑ LÈwÑ VØ(Ø'2Ø-5ñ	ð ØØØØó
ˆô ×*Ñ*¨3Ó/ˆ	Ø×ÑàØØ˜G S¨#Ð.ØØØÜ�D“	ðð õ	
r6   c                óò  — t        i ddddd«      }t        j                  |«      }|dd \  }}| j                  d|«       | j                  d|«       t        ddiddddd«      }t        j                  |«      }|dd \  }}| j                  d|«       | j                  d|«       t        ddiddddd«      }	t        j                  |	«      }
|
dd \  }}| j                  d|«       | j                  d|«       y)	zÑ
        L{imap4.getBodyStructure} returns L{None} for the major and
        minor MIME types of a L{IMessagePart} provider whose headers
        lack a C{Content-Type}, or have an empty value for it.
        r1   r6   r�   NrÉ   rŽ   r(  ú
)r˜   r   r  ÚassertIs)rE   ÚmissingÚmissingContentTypeStructureÚmissingMajorÚmissingMinorrË  ÚemptyContentTypeStructureÚ
emptyMajorÚ
emptyMinorÚnewlineÚnewlineContentTypeStructureÚnewlineMajorÚnewlineMinors                r4   Útest_emptyContentTypez+GetBodyStructureTests.test_emptyContentTypeú  s  € ô ˜r 2 s¨C°°dÓ;ˆÜ&+×&<Ñ&<¸WÓ&EÐ#Ø%@ÀÀ!Ð%DÑ"ˆ�lØ�‰�d˜LÔ)Ø�‰�d˜LÔ)ä˜n¨bÐ1°2°s¸CÀÀdÓKˆÜ$)×$:Ñ$:¸5Ó$AÐ!Ø!:¸2¸AÐ!>Ñˆ
�JØ�‰�d˜JÔ'Ø�‰�d˜JÔ'ä °Ð5°r¸3ÀÀSÈ$ÓOˆÜ&+×&<Ñ&<¸WÓ&EÐ#Ø%@ÀÀ!Ð%DÑ"ˆ�lØ�‰�d˜LÔ)Ø�‰�d˜LÕ)r6   c                óª   — t        ddiddddd«      }t        j                  |«      }|dd \  }}| j                  |d«       | j	                  |d«       y)z·
        L{imap4.getBodyStructure} returns only a non-L{None} major
        MIME type for a L{IMessagePart} provider whose headers only
        have a main a C{Content-Type}.
        rŽ   Úmainr1   r6   r�   NrÉ   )r˜   r   r  rB   r  )rE   r  ÚmainStructureÚ	mainMajorÚ	mainMinors        r4   Útest_onlyMajorContentTypez/GetBodyStructureTests.test_onlyMajorContentType  s\   € ô ˜^¨VÐ4°b¸#¸sÀCÈÓNˆÜ×.Ñ.¨tÓ4ˆØ,¨R¨aÐ0Ñˆ	�9Ø×Ñ˜ FÔ+Ø�‰�i Õ&r6   c                óþ   — d}d}d}d}d}d}d}d}t        |d	z   |z   d
z   |z   dz   ||||ddddœdd|dd«      }	t        j                  |	d¬«      }
| j                  ||d|ddg|||t	        |«      |dg d¢gddg|
«       y)zÀ
        L{imap4.getBodyStructure} returns a list giving the basic and extended
        fields for a I{BODYSTRUCTURE} response if passed C{True} for the
        C{extended} parameter.
        rø  rù  rú  rû  rü  rý  rþ  ÚabcdefabcdefrQ  rÿ  r   zattachment; name=foo; size=barÚfrÚFrance©rŽ   r  r  r  úcontent-md5úcontent-dispositionúcontent-languageúcontent-locationr1   r(  r�   NT©Úextendedr  r\  r  Ú
attachment)r¾  rH  rÂ  rI  r  )rE   r“   r
  r  r  rJ  r  rž  Úmd5r�   r  s              r4   Útest_singlePartExtendedz-GetBodyStructureTests.test_singlePartExtended  sÜ   € ð ˆØˆØˆØˆØ&ˆ
Ø%ˆØˆØˆÜà %¨¡¨eÑ 3°lÑ BÀWÑ LÈwÑ VØ(Ø'2Ø-5Ø"Ø'GØ$(Ø$,ñ	ð ØØØØó
ˆô" ×*Ñ*¨3¸Ô>ˆ	Ø×ÑàØØ˜G S¨#Ð.ØØØÜ�D“	ØØÒ=Ð>ØØðð õ	
r6   c                óº   — d}d}d}t        d|dz   |z   idd|dd	«      }t        j                  |d
¬«      }| j                  ||d	d	d	d	t	        |«      d	d	d	d	g|«       y	)z›
        For fields with no information contained in the message headers,
        L{imap4.getBodyStructure} fills in L{None} values in its result.
        rù  rú  rø  rŽ   rQ  r1   r6   r�   NTr-  r  )rE   r
  r  r“   r�   r  s         r4   Útest_singlePartWithMissingz0GetBodyStructureTests.test_singlePartWithMissingO  s|   € ð
 ˆØˆØˆÜØ˜U S™[¨5Ñ0Ð1°2°s¸DÀ#Àtó
ˆô ×*Ñ*¨3¸Ô>ˆ	Ø×ÑØ�E˜4  t¨T´3°t³9¸dÀDÈ$ÐPTÐUØõ	
r6   c                ó  — d}d}d}d}d}d}d}t        |dz   |z   d	z   |z   d
z   |||dœdd|dd«      }t        j                  |«      }	| j                  ||d|ddg|||t	        |«      t	        |j                  «       «      g|	«       y)z’
        For a I{text/*} message, the number of lines in the message body are
        included after the common single-part basic fields.
        ó"   hello, world
how are you?
goodbye
rF   rú  rû  rü  rý  rþ  rQ  rÿ  r   r  r1   r6   r�   Nr  r\  r  )r˜   r   r  rB   rÐ   rg  r	  s
             r4   Útest_textPartz#GetBodyStructureTests.test_textPart`  sÆ   € ð
 8ˆØˆØˆØˆØ&ˆ
Ø%ˆØˆÜà %¨¡¨eÑ 3°lÑ BÀWÑ LÈwÑ VØ(Ø'2Ø-5ñ	ð ØØØØó
ˆô ×*Ñ*¨3Ó/ˆ	Ø×ÑàØØ˜G S¨#Ð.ØØØÜ�D“	Ü�D—O‘OÓ%Ó&ð	ð õ	
r6   c                ó@  — d}d}d}d}d}d}d}t        |dz   |z   d	z   |z   d
z   dd|||dœdd|dd«      }t        ddidddd|g«      }	t        j                  |	«      }
| j                  dddddddt        j                  |«      t        j                  |«      dg
|
«       y)z‹
        For a I{message/rfc822} message, the common basic fields are followed
        by information about the contained message.
        r5  rF   rú  rû  rü  rý  rþ  rQ  rÿ  r   zAlice <alice@example.com>zBob <bob@example.com>)rŽ   rˆ   rŠ   r  r  r  r1   r(  r�   NrŽ   úmessage/rfc822r6   r�  r¨  r   rÇ   )r˜   r   r  rB   ÚgetEnvelope)rE   r“   r
  r  r  rJ  r  rž  r�   Ú	containerr  s              r4   Útest_rfc822Messagez(GetBodyStructureTests.test_rfc822Messageˆ  sù   € ð
 8ˆØˆØˆØˆØ&ˆ
Ø%ˆØˆÜà %¨¡¨eÑ 3°lÑ BÀWÑ LÈwÑ VØ3Ø-Ø(Ø'2Ø-5ñð ØØØØó
ˆô  !àÐ 0ðð ØØØØˆEó	
ˆ	ô ×*Ñ*¨9Ó5ˆ	Ø×ÑàØØØØØØÜ×!Ñ! #Ó&Ü×&Ñ& sÓ+Øðð õ	
r6   c           	     ó  — t        dddddœdddd	d
«      }t        ddiddddd
«      }t        ddidddd||g«      }| j                  t        j                  |«      t        j                  |«      dgt        j                  |«      «       y
)zî
        For a I{multipart/*} message, L{imap4.getBodyStructure} returns a list
        containing the body structure information for each part of the message
        followed by an element giving the MIME subtype of the message.
        zimage/jpeg; x=yrü  rý  rþ  r  r1   r6   ó   hello worldr�   NrŽ   ztext/plain; charset=us-asciió
   some stufféA  zmultipart/relatedé+  Úrelated©r˜   rB   r   r  ©rE   Ú
oneSubPartÚanotherSubPartr:  s       r4   Útest_multiPartz$GetBodyStructureTests.test_multiPartÀ  sÉ   € ô "à 1Ø/Ø'6Ø-6ñ	ð ØØØØó
ˆ
ô &àÐ >ðð ØØØØó	
ˆô !àÐ 3ðð ØØØØ˜Ð(ó	
ˆ	ð 	×Ñä×&Ñ& zÓ2Ü×&Ñ& ~Ó6Øðô
 ×"Ñ" 9Ó-õ	
r6   c           	     ó<  — t        dddddœdddd	d
«      }t        ddiddddd
«      }t        dddddœdddd||g«      }| j                  t        j                  |d¬«      t        j                  |d¬«      dddgdddggddgt        j                  |d¬«      «       y
)a)  
        When passed a I{multipart/*} message and C{True} for the C{extended}
        argument, L{imap4.getBodyStructure} includes extended structure
        information from the parts of the multipart message and extended
        structure information about the multipart message itself.
        s   image/jpeg; x=ys   some kind of ids   great justices   maximum)ó   content-types
   content-ids   content-descriptions   content-transfer-encodingr1   r6   r=  r�   NrH  s   text/plain; charset=us-asciir>  r?  zmultipart/related; foo=barÚesÚSpainzattachment; name=monkeys)rŽ   r+  r,  r*  r@  Tr-  rA  rH  rI  r/  r¾  ÚmonkeysrB  rC  s       r4   Útest_multiPartExtendedz,GetBodyStructureTests.test_multiPartExtendedó  sï   € ô "à!3Ø1Ø(8Ø.8ñ	ð ØØØØó
ˆ
ô &àÐ!@ðð ØØØØó	
ˆô !à <Ø$(Ø$+Ø'Añ	ð ØØØØ˜Ð(ó
ˆ	ð 	×Ñä×&Ñ& z¸DÔAÜ×&Ñ& ~ÀÔEØØ˜�Ø ¨	Ð2Ð3ØØðô ×"Ñ" 9°tÔ<õ	
r6   N)rs   rt   ru   r3  r  r  r#  r1  r3  r6  r;  rF  rL  r1   r6   r4   rö  rö  Ë  s9   „ ñò&
òP*ò0
'ò/
òb
ò"&
òP6
òp1
óf9
r6   rö  c                  ó  — e Zd Zd„ Zd„ Zd„ Zd„ Zd„ Zd„ Zd-d„Z	d„ Z
d-d	„Zd
„ Z ej                  ej                  d«      Z	  ej                  ej                  d«        ej                  ej                  e«       dZ eed«      d„ «       Zd-d„Zd„ Zd-d„Zd„ Zd-d„Zd-d„Zd„ Zd-d„Zd„ Zd-d„Zd„ Zd„ Z d-d„Z!d„ Z"d-d„Z#d „ Z$d-d!„Z%d"„ Z&d#„ Z'd$„ Z(d-d%„Z)d&„ Z*d-d'„Z+d(„ Z,d-d)„Z-d*„ Z.d-d+„Z/d,„ Z0y# ej$                  $ r dZY Œ„w xY w).ÚNewFetchTestsc                ó
  — d x| _         | _        d | _        t        j                  «       | _        d| j
                  _        | | j
                  _        t        j                  «       | _
        t        | j                  «      | _        y rÙ  )rÚ  rÛ  r2   r   rÏ  rý  rR  r^  r   r   rÿ  rß  rþ  rR   s    r4   r  zNewFetchTests.setUp0  s_   € Ø59Ð9ˆÔ Ô!2ØˆŒä×'Ñ'Ó)ˆŒØ$ˆ�‰ÔØˆ�‰ÔÜŸ™Ó)ˆŒÜ" 4§>¡>Ó2ˆ�r6   c                 ó   — y r0   r1   rÝ  s     r4   rh  zNewFetchTests.addListener:  r  r6   c                 ó   — y r0   r1   rÝ  s     r4   rj  zNewFetchTests.removeListener=  r  r6   c           	     ó”   — || _         || _        t        t        t	        t        | j                  «      «      | j                  «      «      S r0   )rÚ  rÛ  Úiterrä   rn   rÐ   ÚmsgObjsrœ  s      r4   r�  zNewFetchTests.fetch@  s6   € Ø!)ˆÔØˆÔÜ”Cœœc $§,¡,Ó/Ó0°$·,±,Ó?Ó@Ð@r6   c                ó  ‡ ‡— ‰rct        t        t        ‰ j                  «      «      ‰ j                  «      D ].  \  }}t	        |j                  «       «      ‰ j                  |   d<   Œ0 ˆ fd„}‰ j                  j                  ˆ ˆfd„«      j                  |«      j                  ‰ j                  «      j                  ‰ j                  «       t        j                  ‰ j                  ‰ j                  d¬«      }|j                  ˆ fd„«       |S )Nr©  c                ó   •— | ‰_         y r0   ræ  rç  s    €r4   r2   z(NewFetchTests._fetchWork.<locals>.resultJ  ré  r6   c                ó<   •— ‰j                  ‰j                  ‰«      S r0   ©rã  r  )r&  rE   rª  s    €€r4   r5   z*NewFetchTests._fetchWork.<locals>.<lambda>N  s   ø€ �d—m‘m D§M¡M°3Ó7€ r6   Frí  c                óP   •— ‰j                  ‰j                  ‰j                  «      S r0   ©rB   r2   rh  )r\  rE   s    €r4   r5   z*NewFetchTests._fetchWork.<locals>.<lambda>T  s   ø€  × 0Ñ 0°·±¸d¿m¹mÓ L€ r6   )rä   rn   rÐ   rT  rå   r„  rh  rÿ  r›   r  r'  r
  r#   rð  rý  rþ  )rE   rª  ré   r�   r2   rž   s   ``    r4   Ú
_fetchWorkzNewFetchTests._fetchWorkE  sÅ   ù€ ÙÜœe¤C¨¯©Ó$5Ó6¸¿¹ÓEò <‘��3Ü*-¨c¯j©j«lÓ*;�—‘˜aÑ  Ò'ð<ô	ð 	�‰×"Ñ"Ü7ó	
ç
‰+�fÓ
Ÿk™k¨$×*<Ñ*<Ó=¿j¹jØ�O‰Oô?
ô × Ñ  §¡¨d¯k©kÀÔGˆØ	�‰ÓLÔMØˆr6   c           
     óÒ   ‡ — ˆ fd„‰ _         d‰ _        t        i ddddd «      t        i ddddd «      t        i ddddd «      g‰ _        dd	idd
iddidœ‰ _        ‰ j                  d«      S )Nc                ó:   •— ‰j                   j                  | «      S r0   ©rþ  r7  )ró   ÚurE   s     €r4   r5   z,NewFetchTests.testFetchUID.<locals>.<lambda>X  s   ø€  T§[¡[×%9Ñ%9¸!Ó%<€ r6   rC  r1   r6   r4  éç  éu'  r©  Ú12345Ú999Ú10101)r   rÅ   rÉ   r   )rã  r  r˜   rT  rh  r[  rR   s   `r4   ÚtestFetchUIDzNewFetchTests.testFetchUIDW  sƒ   ø€ Û<ˆŒàˆŒä˜˜R  c¨5°$Ó7Ü˜˜R  c¨3°Ó5Ü˜˜R  c¨5°$Ó7ð
ˆŒð �wÐØ�uˆ~Ø�wÐñ
ˆŒð
 �‰˜qÓ!Ð!r6   c           	     óÞ   — | j                   j                  | _        d| _        t	        i g d¢dddd «      t	        i g d¢dddd «      g| _        dg d¢idg d¢idœ| _        | j                  |«      S )	Nr_  )ÚFlagAÚFlagBú\FlagCr6   é1Ô  )ri  rg  rh  r4  r›  ©r   rÅ   )rþ  Ú
fetchFlagsrã  r  r˜   rT  rh  r[  ©rE   rª  s     r4   ÚtestFetchFlagszNewFetchTests.testFetchFlagsg  sw   € ØŸ™×.Ñ.ˆŒØˆŒä˜Ò:¸CÀÀeÈTÓRÜ˜Ò:¸CÀÀeÈTÓRð
ˆŒð
 Ò6Ð7ØÒ6Ð7ñ
ˆŒð �‰˜sÓ#Ð#r6   c                ó$   — | j                  d«      S rs  )rn  rR   s    r4   ÚtestFetchFlagsUIDzNewFetchTests.testFetchFlagsUIDt  s   € Ø×"Ñ" 1Ó%Ð%r6   c                ó  — | j                   j                  | _        d| _        t	        i ddddd «      t	        i ddddd «      t	        i dddd	d «      t	        i dd
ddd «      g| _        ddiddiddiddidœ| _        | j                  |«      S )NÚ13r1   s   Fri, 02 Nov 2003 21:25:10 GMTr6   iÀZ  s   Thu, 29 Dec 2013 11:31:52 ESTée   s   Mon, 10 Mar 1992 02:44:30 CSTéÊ   s   Sat, 11 Jan 2000 14:40:24 PSTi/  rž  z02-Nov-2003 21:25:10 +0000z29-Dec-2013 11:31:52 -0500z10-Mar-1992 02:44:30 -0600z11-Jan-2000 14:40:24 -0800)r   rÅ   rÉ   rÇ   )rþ  ÚfetchInternalDaterã  r  r˜   rT  rh  r[  rm  s     r4   ÚtestFetchInternalDatez#NewFetchTests.testFetchInternalDatew  s¯   € ØŸ™×5Ñ5ˆŒØˆŒä˜˜RÐ!AÀ3ÈÈtÓTÜ˜˜RÐ!AÀ3ÈÈTÓRÜ˜˜RÐ!AÀ3ÈÈTÓRÜ˜˜RÐ!AÀ3ÈÈTÓRð	
ˆŒð Ð <Ð=ØÐ <Ð=ØÐ <Ð=ØÐ <Ð=ñ	
ˆŒð �‰˜sÓ#Ð#r6   c                ó$   — | j                  d«      S rs  )rv  rR   s    r4   ÚtestFetchInternalDateUIDz&NewFetchTests.testFetchInternalDateUIDˆ  s   € Ø×)Ñ)¨!Ó,Ð,r6   Nú
es_AR.UTF8FTz'The es_AR.UTF8 locale is not installed.c                ó  — t        j                  t         j                  d«      }t        j                  t         j                  d«       | j                  t         j                  t         j                  |«       | j	                  d«      S )zC
        The month name in the date is locale independent.
        Nry  rÅ   )ÚlocaleÚ	setlocaleÚLC_ALLr§  rv  )rE   ÚcurrentLocales     r4   Ú'test_fetchInternalDateLocaleIndependentz5NewFetchTests.test_fetchInternalDateLocaleIndependent™  sY   € ô ×(Ñ(¬¯©¸Ó=ˆÜ×ÑœŸ™¨Ô5Ø�‰œ×(Ñ(¬&¯-©-¸ÔGØ×)Ñ)¨!Ó,Ð,r6   c                óâ   — | j                   j                  | _        d| _        t	        ddddddœdd	d	d
d «      g| _        ddddg d¢gg d¢gg d¢gg d¢gd d d dg
ii| _        | j                  |«      S )NÚ15zuser@domainzresu@domainÚthursdayzit is a messagezid-id-id-yayaya)rˆ   rŠ   rŽ  rŒ   z
message-idr1   r6   ix  r   r˜  )NNrv  Údomain)NNÚresurƒ  )rþ  ÚfetchEnveloperã  r  r˜   rT  rh  r[  rm  s     r4   ÚtestFetchEnvelopezNewFetchTests.testFetchEnvelope¤  s¦   € ØŸ™×1Ñ1ˆŒØˆŒäà)Ø'Ø&Ø0Ø"3ñð ØØØØóð
ˆŒð" ØØØ%Ú3Ð4Ú3Ð4Ú3Ð4Ú3Ð4ØØØØ%ððð
ˆŒð  �‰˜sÓ#Ð#r6   c                ó$   — | j                  d«      S rs  )r†  rR   s    r4   ÚtestFetchEnvelopeUIDz"NewFetchTests.testFetchEnvelopeUIDÉ  s   € Ø×%Ñ% aÓ(Ð(r6   c                óà   — | j                   j                  | _        d| _        t	        dddddddd	d
œddddd«      g| _        ddddg d¢dddddddddggdd	gii| _        | j                  |«      S )a[  
        L{IMAP4Client.fetchBodyStructure} issues a I{FETCH BODYSTRUCTURE}
        command and returns a Deferred which fires with a structure giving the
        result of parsing the server's response.  The structure is a list
        reflecting the parenthesized data sent by the server, as described by
        RFC 3501, section 7.4.2.
        ú3:9,10:*ú#text/plain; name=thing; key="value"úthis-is-the-content-idú!describing-the-content-goes-here!Ú8BITÚabcdef123456zattachment; filename=monkeysrI  zhttp://example.com/monkeysr(  r1   r(  ó   Body
Text
Goes
Here
éý Nr   r«  rF   Úplain©rN  r  r¾  ÚthingÚ20rW  r/  ÚfilenamerK  ©rþ  ÚfetchBodyStructurerã  r  r˜   rT  rh  r[  rm  s     r4   Útest_fetchBodyStructurez%NewFetchTests.test_fetchBodyStructureÌ  sµ   € ð Ÿ™×6Ñ6ˆŒØ"ˆŒäà$IØ":Ø+NØ17Ø#1Ø+IØ(,Ø(Dñ	ð ØØ+ØØóð
ˆŒð( ØØØÚ5Ø,Ø7ØØØØ"Ø! J°	Ð#:Ð;ØØ0ð"ðð
ˆŒð$ �‰˜sÓ#Ð#r6   c                ó$   — | j                  d«      S )z�
        If passed C{True} for the C{uid} argument, C{fetchBodyStructure} can
        also issue a I{UID FETCH BODYSTRUCTURE} command.
        rÅ   )r™  rR   s    r4   ÚtestFetchBodyStructureUIDz'NewFetchTests.testFetchBodyStructureUIDý  s   € ð
 ×+Ñ+¨AÓ.Ð.r6   c                ó  — | j                   j                  | _        d| _        t	        dddddddd	d
œddddd«      }t	        ddddœdddd|g«      g| _        ddddg d¢ddddddddgdd	gdddgdddgii| _        | j                  |«      S )z”
        L{IMAP4Client.fetchBodyStructure} can also parse the response to a
        I{FETCH BODYSTRUCTURE} command for a multipart message.
        rŠ  r‹  rŒ  r�  rŽ  r&  Ú123456abcdefÚinlinezouter space)rŽ   r  r  r  r+  r)  r*  r,  r1   r6   r�  r‘  Nzmultipart/mixed; boundary="xyz"ÚenÚnearby)rŽ   r+  r,  r   r«  rF   r’  r“  r•  rW  ÚmixedÚboundaryÚxyzr—  )rE   rª  ÚinnerMessages      r4   Ú test_fetchBodyStructureMultipartz.NewFetchTests.test_fetchBodyStructureMultipart  sø   € ð
 Ÿ™×6Ñ6ˆŒØ"ˆŒÜ#à EØ6Ø'JØ-3Ø$(Ø-Ø'/Ø$1ñ	ð ØØ'ØØó
ˆô$ à$EØ(,Ø(0ñð
 ØØØØ�óð
ˆŒð ØàØÚ9Ø0Ø;ØØØØ&Ø! 4Ð(ØØ%ðð Ø Ð'ØØØð'"ðð
ˆŒð2 �‰˜sÓ#Ð#r6   c                óÐ   — | j                   j                  | _        d| _        t	        i ddddt	        ddidddd d «      g«      g| _        d	d
g d¢ii| _        | j                  |«      S )NÚ21r1   r6   ó   Yea whateveré±f rŽ   ú	image/jpgó   Body Body Bodyr   rÂ  ©NNNNNNÚ12©rþ  ÚfetchSimplifiedBodyrã  r  r˜   rT  rh  r[  rm  s     r4   ÚtestFetchSimplifiedBodyz%NewFetchTests.testFetchSimplifiedBodyE  s�   € ØŸ™×7Ñ7ˆŒØˆŒäØØØØØä Ø'¨Ð5ØØØ)ØØóð	óð
ˆŒð& ˜VÒ%OÐPÐQˆŒà�‰˜sÓ#Ð#r6   c                ó$   — | j                  d«      S rs  )r°  rR   s    r4   ÚtestFetchSimplifiedBodyUIDz(NewFetchTests.testFetchSimplifiedBodyUID_  s   € Ø×+Ñ+¨AÓ.Ð.r6   c                ó²   — | j                   j                  | _        d| _        t	        ddiddddd «      g| _        dd	g d
¢ii| _        | j                  |«      S )Nr§  rŽ   r�   r1   r6   r¨  r©  r   rÂ  )rF   r’  NNNNr­  rð   r®  rm  s     r4   ÚtestFetchSimplifiedBodyTextz)NewFetchTests.testFetchSimplifiedBodyTextb  se   € ØŸ™×7Ñ7ˆŒØˆŒäØ Ð.°°C¸È%ÐQUóð
ˆŒð �ÒLÐMð
ˆŒð �‰˜sÓ#Ð#r6   c                ó$   — | j                  d«      S rs  )r´  rR   s    r4   ÚtestFetchSimplifiedBodyTextUIDz,NewFetchTests.testFetchSimplifiedBodyTextUIDp  s   € Ø×/Ñ/°Ó2Ð2r6   c                ó  — | j                   j                  | _        d| _        t	        ddiddddt	        ddidd	d
d d «      g«      g| _        ddddd d d d dd d g d¢gg d¢gd d d d d d g
g d¢dg
ii| _        | j                  |«      S )Nr§  rŽ   r8  r1   r6   r¨  r©  rª  r(  r«  r   rÂ  r�  r¨  r­  ©NNN)rù  ÚjpgNNNNÚ14rð   r®  rm  s     r4   ÚtestFetchSimplifiedBodyRFC822z+NewFetchTests.testFetchSimplifiedBodyRFC822s  s×   € ØŸ™×7Ñ7ˆŒØˆŒäØÐ!1Ð2ØØØØä Ø'¨Ð5ØØØ)ØØóð	óð
ˆŒð( ØØØØØØØØàØÚ+Ð,Ú+Ð,ØØØØØØðò CØð+ðð
ˆŒð8 �‰˜sÓ#Ð#r6   c                ó$   — | j                  d«      S rs  )r»  rR   s    r4   Ú testFetchSimplifiedBodyRFC822UIDz.NewFetchTests.testFetchSimplifiedBodyRFC822UID§  s   € Ø×1Ñ1°!Ó4Ð4r6   c           	     ó2  — | j                   j                  | _        d| _        t	        ddiddddd«      t	        dd	iddd
dd«      g}t	        ddidddd|«      }t	        ddidddd|g«      }|g| _        ddg d¢g d¢dgdgii| _        | j                  d«      S )ah  
        L{IMAP4Client.fetchSimplifiedBody} returns a dictionary mapping message
        sequence numbers to fetch responses for the corresponding messages.  In
        particular, for a multipart message, the value in the dictionary maps
        the string C{"BODY"} to a list giving the body structure information for
        that message, in the form of a list of subpart body structure
        information followed by the subtype of the message (eg C{"alternative"}
        for a I{multipart/alternative} message).  This structure is self-similar
        in the case where a subpart is itself multipart.
        r§  rŽ   r�   r1   s   dates   Stuffrj  Nr±   s   ThingsiŸ~  r¸   r6   s
   Irrelevantr4  zmultipart/mixeds   RootOfiÍ� r   rÂ  )rF   r’  NNNNÚ5rð   )rF   ÚhtmlNNNNrI  rð   Úalternativer¡  Fr®  )rE   ÚsinglesrÁ  r¡  s       r4   Ú!test_fetchSimplifiedBodyMultipartz/NewFetchTests.test_fetchSimplifiedBodyMultipartª  sï   € ð Ÿ™×7Ñ7ˆŒØˆŒô Ø Ð.°°G¸XÀuÈdóô Ø Ð-¨r°7¸IÀuÈdóð	
ˆô #ØÐ4Ð5ØØØØØó
ˆô àÐ.Ð/ØØØØØˆMó
ˆð �wˆŒð ØâKÚJØ%ðð
 ðð	ð
ˆŒð �‰˜uÓ%Ð%r6   c                ó®   — | j                   j                  | _        d| _        t	        ddiddddd «      g| _        dd	d
ii| _        | j                  |«      S )Nz1,3,7,10101rÌ  ÚValuer1   r6   s   BODY TEXT
é[   r   r§  zHeader: Value

BODY TEXT
)rþ  rŒ  rã  r  r˜   rT  rh  r[  rm  s     r4   ÚtestFetchMessagezNewFetchTests.testFetchMessageê  s^   € ØŸ™×0Ñ0ˆŒØ%ˆŒä˜( GÐ,¨b°#Ð7GÈÈTÓRð
ˆŒð ˜XÐ'KÐLÐMˆŒØ�‰˜sÓ#Ð#r6   c                ó$   — | j                  d«      S rs  )rÇ  rR   s    r4   ÚtestFetchMessageUIDz!NewFetchTests.testFetchMessageUIDó  ó   € Ø×$Ñ$ QÓ'Ð'r6   c                óò   — | j                   j                  | _        d| _        t	        dddœddddd «      g| _        t        t        j                  dddœ«      «      }dd	|ii| _	        | j                  |«      S )
Nz9,6,2ÚV1ÚV2)ÚH1ÚH2r1   r6   éc   r   r¡  )rþ  ÚfetchHeadersrã  r  r˜   rT  r(   r   re  rh  r[  )rE   rª  rœ   s      r4   ÚtestFetchHeaderszNewFetchTests.testFetchHeadersö  s|   € ØŸ™×0Ñ0ˆŒØˆŒä ¨DÑ1°2°s¸CÀÀTÓJð
ˆŒô œu×3Ñ3¸4ÀtÑ4LÓMÓNˆð � Ð)ð
ˆŒð �‰˜sÓ#Ð#r6   c                ó$   — | j                  d«      S rs  )rÒ  rR   s    r4   ÚtestFetchHeadersUIDz!NewFetchTests.testFetchHeadersUID  rÊ  r6   c                ó®   — | j                   j                  | _        d| _        t	        ddiddddd «      g| _        dd	d
ii| _        | j                  |«      S )Nz1,2,3,4,5,6,7rÌ  rÅ  r1   r(  s   Body goes here
é«   r   r¥  zBody goes here
)rþ  r@  rã  r  r˜   rT  rh  r[  rm  s     r4   ÚtestFetchBodyzNewFetchTests.testFetchBody  sc   € ØŸ™×-Ñ-ˆŒØ'ˆŒä˜( GÐ,¨b°"Ð6KÈSÐRVÓWð
ˆŒð �Ð3Ð4ð
ˆŒð �‰˜sÓ#Ð#r6   c                ó$   — | j                  d«      S rs  )r×  rR   s    r4   ÚtestFetchBodyUIDzNewFetchTests.testFetchBodyUID  ó   € Ø×!Ñ! !Ó$Ð$r6   c                óø  ‡ — ‰ j                   j                  ‰ _        d‰ _        d}d}d}t	        «       }d|d<   d|d<   d	|d
<   d|d<   t	        «       }d|d
<   d|d<   t	        «       }d|d
<   d|d<   t        |dd|dt        |dd|dd«      t        |dd|dd«      g«      g‰ _        dddgdggi‰ _        ˆ fd„}‰ j                  j                  ˆ fd„«       ‰ j                  j                  |«       ‰ j                  j                  ‰ j                  «       ‰ j                  j                  ‰ j                  «       t        j                  ‰ j                  ‰ j                   d¬«      }|j                  ˆ fd„«       |S )zT
        Test the server's handling of requests for specific body sections.
        rð   r(  r¡   r¯   r‡   rˆ   r‰   rŠ   r‹   rŒ   r¢   rŽ   r£   r�   r°   r±   r1   Nr�   r   rÂ  z&Contained body message text.  Squarge.c                ó   •— | ‰_         y r0   ræ  rç  s    €r4   r2   z0NewFetchTests.testFetchBodyParts.<locals>.result8  ré  r6   c                ó>   •— ‰j                  ‰j                  d¬«      S )NrÅ   rL  rX  r;  s    €r4   r5   z2NewFetchTests.testFetchBodyParts.<locals>.<lambda><  s   ø€ �d—m‘m D§M¡MÀ�mÓB€ r6   Frí  c                óP   •— ‰j                  ‰j                  ‰j                  «      S r0   rZ  ©ÚignrE   s    €r4   r5   z2NewFetchTests.testFetchBodyParts.<locals>.<lambda>C  ó   ø€  $×"2Ñ"2°4·;±;ÀÇÁÓ"N€ r6   ©rþ  r®  rã  r  r   r˜   rT  rh  rÿ  r›   r  r'  r
  r#   rð  rý  )	rE   r«   r³   r´   rœ   r¬   rµ   r2   rž   s	   `        r4   ÚtestFetchBodyPartsz NewFetchTests.testFetchBodyParts  s  ø€ ð Ÿ™×1Ñ1ˆŒØˆŒØˆ	Ø>ˆ
ØFˆ
Ü“-ˆØ'ˆ�‰Ø*ˆ�‰Ø.ˆ�	ÑØ"Iˆ�ÑÜ"“}ˆØ"8ˆ�YÑØ'3ˆ�^Ñ$Ü#›ˆØ#;ˆ�iÑ Ø(3ˆ�nÑ%äØØØØØä  ¨r°4¸ÀTÈ4ÓPÜ  °°D¸*ÀdÈDÓQðó
ð
ˆŒð ˜f s eÐ-UÐVÐWÐXˆŒô	ð 	�‰×"Ñ"ÛBô	
ð 	�‰×"Ñ" 6Ô*Ø�‰×"Ñ" 4×#5Ñ#5Ô6Ø�‰×!Ñ! $§/¡/Ô2ä× Ñ  §¡¨d¯k©kÀÔGˆØ	�‰ÓNÔOØˆr6   c                ón  ‡ ‡— ‰ j                   j                  ‰ _        d‰ _        dgŠd}t	        «       }d|d<   d|d<   d|d	<   d
|d<   t        |dd|dd«      g‰ _        dddgdggi‰ _        ˆ fd„}‰ j                  j                  ˆˆ fd„«       ‰ j                  j                  |«       ‰ j                  j                  ‰ j                  «       ‰ j                  j                  ‰ j                  «       t        j                  ‰ j                  ‰ j                   d¬«      }|j                  ˆ fd„«       |S )z÷
        Single-part messages have an implicit first part which clients
        should be able to retrieve explicitly.  Test that a client
        requesting part 1 of a text/plain message receives the body of the
        text/plain part.
        rð   rÅ   s   DA bodyr‡   rˆ   r‰   rŠ   r‹   rŒ   r�   rŽ   r1   Nr�   r   rÂ  zDA bodyc                ó   •— | ‰_         y r0   ræ  rç  s    €r4   r2   z>NewFetchTests.test_fetchBodyPartOfNonMultipart.<locals>.resultZ  ré  r6   c                ó>   •— ‰j                  ‰j                  ‰¬«      S )NrL  rX  )r&  ÚpartsrE   s    €€r4   r5   z@NewFetchTests.test_fetchBodyPartOfNonMultipart.<locals>.<lambda>^  s   ø€ �d—m‘m D§M¡MÀ�mÓF€ r6   Frí  c                óP   •— ‰j                  ‰j                  ‰j                  «      S r0   rZ  rß  s    €r4   r5   z@NewFetchTests.test_fetchBodyPartOfNonMultipart.<locals>.<lambda>e  rá  r6   râ  )rE   r«   rœ   r2   rž   rç  s   `    @r4   Ú test_fetchBodyPartOfNonMultipartz.NewFetchTests.test_fetchBodyPartOfNonMultipartF  s  ù€ ð Ÿ™×1Ñ1ˆŒØˆŒØ�ˆØˆ	Ü“-ˆØ'ˆ�‰Ø*ˆ�‰Ø.ˆ�	ÑØ".ˆ�ÑÜ$ W¨b°$¸	À3ÈÓMÐNˆŒà˜f s e¨YÐ7Ð8Ð9ˆŒô	ð 	�‰×"Ñ"ÜFô	
ð 	�‰×"Ñ" 6Ô*Ø�‰×"Ñ" 4×#5Ñ#5Ô6Ø�‰×!Ñ! $§/¡/Ô2ä× Ñ  §¡¨d¯k©kÀÔGˆØ	�‰ÓNÔOØˆr6   c                óª   — | j                   j                  | _        d| _        t	        i ddddd «      g| _        dddii| _        | j                  |«      S )	Nz	1:100,2:*r1   r6   s   xxxxxxxxxxxxxxxxxxxxr�   r   r£  r•  )rþ  Ú	fetchSizerã  r  r˜   rT  rh  r[  rm  s     r4   ÚtestFetchSizezNewFetchTests.testFetchSizeh  s[   € ØŸ™×-Ñ-ˆŒØ#ˆŒä˜˜R  i°°dÓ;ð
ˆŒð �˜tÐ$ð
ˆŒð �‰˜sÓ#Ð#r6   c                ó$   — | j                  d«      S rs  )rì  rR   s    r4   ÚtestFetchSizeUIDzNewFetchTests.testFetchSizeUIDs  rÚ  r6   c                ó.  — | j                   j                  | _        d| _        t	        i ddddd «      t	        i dddd	d «      g| _        g d¢d
dd d g d¢gg d¢gd d d d d d g
g d¢dœg d¢ddd d g d¢gg d¢gd d d d d d g
g d¢dœdœ| _        | j                  |«      S )Nz1,3)z\XYZz\YZXÚAbcs%   Sun, 25 Jul 2010 06:20:30 -0400 (EDT)s   xyzxyziŽ  )z\Onez\TwoÚThrees   Mon, 14 Apr 2003 19:43:44 -0400s   abcabcabcabcr@  z25-Jul-2010 06:20:30 -0400rI  r¸  )NNNNNNrI  )r›  rž  r£  r˜  rÂ  z14-Apr-2003 19:43:44 -0400r­  r¬  rk  )rþ  Ú	fetchFullrã  r  r˜   rT  rh  r[  rm  s     r4   ÚtestFetchFullzNewFetchTests.testFetchFullv  sò   € ØŸ™×-Ñ-ˆŒØˆŒäØØ)Ø8ØØØóô ØØ+Ø2ØØØóð
ˆŒò( 3Ø <Ø"àØÚ'Ð(Ú'Ð(ØØØØØØðò Bñ!ò& 5Ø <Ø#àØÚ'Ð(Ú'Ð(ØØØØØØðò Cñ!ñ'%
ˆŒðL �‰˜sÓ#Ð#r6   c                ó$   — | j                  d«      S rs  )ró  rR   s    r4   ÚtestFetchFullUIDzNewFetchTests.testFetchFullUID³  rÚ  r6   c                ó  — | j                   j                  | _        d| _        t	        i ddddd «      t	        i ddddd «      g| _        d d g d	¢gg d	¢gd d d d d d g
d
dg dœd d g d	¢gg d	¢gd d d d d d g
d
dg dœdœ| _        | j                  |«      S )Nz1,2:3r1   s   Mon, 14 Apr 2003 19:43:44 +0400s   Lalalara  s   Tue, 15 Apr 2003 19:43:44 +0200s   AlalaliêN  r¸  rI  z14-Apr-2003 19:43:44 +0400)r˜  r£  rž  r›  z15-Apr-2003 19:43:44 +0200rk  )rþ  ÚfetchAllrã  r  r˜   rT  rh  r[  rm  s     r4   ÚtestFetchAllzNewFetchTests.testFetchAll¶  sâ   € ØŸ™×,Ñ,ˆŒØˆŒäØ�BÐ:¸IÀuÈdóô Ø�BÐ:¸IÀuÈdóð	
ˆŒð ØÚ'Ð(Ú'Ð(ØØØØØØðð  #Ø <Øñð& ØÚ'Ð(Ú'Ð(ØØØØØØðð  #Ø <Øññ%#
ˆŒðH �‰˜sÓ#Ð#r6   c                ó$   — | j                  d«      S rs  )rø  rR   s    r4   ÚtestFetchAllUIDzNewFetchTests.testFetchAllUIDç  s   € Ø× Ñ  Ó#Ð#r6   c                ó°   — | j                   j                  | _        d| _        t	        i ddddd «      g| _        ddgdd	d
œi| _        | j                  |«      S )Nrð   )ú\Xs   19 Mar 2003 19:22:21 -0500r6   r÷   r   rü  z19-Mar-2003 19:22:21 -0500Ú0)r›  rž  r£  )rþ  Ú	fetchFastrã  r  r˜   rT  rh  r[  rm  s     r4   ÚtestFetchFastzNewFetchTests.testFetchFastê  se   € ØŸ™×-Ñ-ˆŒØˆŒä˜˜XÐ'DÀcÈ1ÈdÓSð
ˆŒð Ø˜Ø <Ø"ñð
ˆŒð �‰˜sÓ#Ð#r6   c                ó$   — | j                  d«      S rs  )rÿ  rR   s    r4   ÚtestFetchFastUIDzNewFetchTests.testFetchFastUIDù  rÚ  r6   rÄ  )1rs   rt   ru   r  rh  rj  r�  r[  re  rn  rp  rv  rx  r{  r|  r}  r~  ÚnoEsARLocaleÚErrorr
   r  r†  rˆ  r™  r›  r¥  r°  r²  r´  r¶  r»  r½  rÃ  rÇ  rÉ  rÒ  rÔ  r×  rÙ  rã  ré  rì  rî  ró  rõ  rø  rú  rÿ  r	  r1   r6   r4   rN  rN  /  sR  „ ò3òòòAò
ò$"ó $ò&ó$ò"-ð %�F×$Ñ$ V§]¡]°DÓ9€MðØˆ×Ñ˜Ÿ™¨Ô5ð 	ˆ×Ñ˜Ÿ™¨Ô6ØˆáˆLÐCÓDñ-ó Eð-ó#$òJ)ó/$òb/ó?$óB$ò4/ó$ò3ó2$òh5ò>&ó@$ò(ó$ò(ó	$ò%ò/òb óD	$ò%ó;$òz%ó/$òb$ó$ó%øðM �<‰<ò ØŠðús   ÁC0 Ã0DÄDrN  c                  óp   — 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d„ Zd„ Zd„ Zy)ÚDefaultSearchTestszz
    Test the behavior of the server's SEARCH implementation, particularly in
    the face of unhandled search terms.
    c                ó„  — t        j                  «       | _        d| j                  _        | | j                  _        t        j                  «       | _        t        | j                  «      | _	        t        i ddddd «      t        i ddddd «      t        i ddddd «      t        i ddddd «      t        i ddddd «      g| _        y )	NrÃ  r1   r6   r`  ra  r4  i!N  i"N  )r   rÏ  rý  rR  r^  r   r   rÿ  rß  rþ  r˜   rT  rR   s    r4   r  zDefaultSearchTests.setUp  s«   € Ü×'Ñ'Ó)ˆŒØ$ˆ�‰ÔØˆ�‰ÔÜŸ™Ó)ˆŒÜ" 4§>¡>Ó2ˆŒä˜˜R  c¨3°Ó5Ü˜˜R  c¨5°$Ó7Ü˜˜R  c¨5°$Ó7Ü˜˜R  c¨5°$Ó7Ü˜˜R  c¨5°$Ó7ð
ˆ�r6   c           
     ó€   — t        t        t        dt        | j                  «      dz   «      | j                  «      «      S )zW
        Pretend to be a mailbox and let C{self.server} lookup messages on me.
        rÅ   )rÑ   rä   rn   rÐ   rT  rœ  s      r4   r�  zDefaultSearchTests.fetch  s/   € ô ”Cœ˜a¤ T§\¡\Ó!2°QÑ!6Ó7¸¿¹ÓFÓGÐGr6   c                ó  ‡ ‡‡— ˆˆ fd„}‰ j                   j                  t        |«      «      }ˆˆ fd„}|j                  |«       |j                  ‰ j                  «       |j	                  ‰ j
                  «       ‰ j                  «        |S )a€  
        Issue a search with given query and verify that the returned messages
        match the given expected messages.

        @param queryTerms: A string giving the search query.
        @param expectedMessages: A list of the message sequence numbers
            expected as the result of the search.
        @return: A L{Deferred} which fires when the test is complete.
        c                 ó:   •— ‰j                   j                  ‰ «      S r0   ©rþ  r   ©Ú
queryTermsrE   s   €€r4   r   z8DefaultSearchTests._messageSetSearchTest.<locals>.search"  r¬  r6   c                ó*   •— ‰j                  | ‰«       y r0   r%  )rI  ÚexpectedMessagesrE   s    €€r4   Úsearchedz:DefaultSearchTests._messageSetSearchTest.<locals>.searched'  s   ø€ Ø×Ñ˜WÐ&6Õ7r6   )rÿ  r›   r7   r  r'  r
  r#   )rE   r	  r	  r   rž   r	  s   ```   r4   Ú_messageSetSearchTestz(DefaultSearchTests._messageSetSearchTest  se   ú€ õ	2ð �N‰N×&Ñ&¤u¨V£}Ó5ˆõ	8ð 	
�‰�hÔØ	�‰�d×(Ñ(Ô)Ø	�‰�T—_‘_Ô%Ø�‰ŒØˆr6   c                ó(   — | j                  ddg«      S )zˆ
        Test that a search which starts with a message set properly limits
        the search results to messages in that set.
        rð   rÅ   ©r	  rR   s    r4   Útest_searchMessageSetz(DefaultSearchTests.test_searchMessageSet0  s   € ð
 ×)Ñ)¨#°¨sÓ3Ð3r6   c                ó*   — | j                  dg d¢«      S )zv
        If the search filter ends with a star, all the message from the
        starting point are returned.
        z2:*r6  r	  rR   s    r4   Útest_searchMessageSetWithStarz0DefaultSearchTests.test_searchMessageSetWithStar7  ó   € ð
 ×)Ñ)¨%²Ó>Ð>r6   c                ó*   — | j                  dg d¢«      S )z‹
        If the search filter starts with a star, the result should be identical
        with if the filter would end with a star.
        z*:2r6  r	  rR   s    r4   Ú"test_searchMessageSetWithStarFirstz5DefaultSearchTests.test_searchMessageSetWithStarFirst>  r	  r6   c                ó*   — | j                  dg d¢«      S )z•
        If the search filter ends with a star, all the message from the
        starting point are returned (also for the SEARCH UID case).
        zUID 10000:*r6  r	  rR   s    r4   Ú test_searchMessageSetUIDWithStarz3DefaultSearchTests.test_searchMessageSetUIDWithStarE  ó   € ð
 ×)Ñ)¨-ºÓFÐFr6   c                ó*   — | j                  dg d¢«      S )zª
        If the search filter starts with a star, the result should be identical
        with if the filter would end with a star (also for the SEARCH UID case).
        zUID *:10000r6  r	  rR   s    r4   Ú%test_searchMessageSetUIDWithStarFirstz8DefaultSearchTests.test_searchMessageSetUIDWithStarFirstL  r	  r6   c                ó(   — | j                  ddg«      S )z‘
        A search filter of 1234:* should include the UID of the last message in
        the mailbox, even if its UID is less than 1234.
        zUID 30000:*rÊ   r	  rR   s    r4   Ú,test_searchMessageSetUIDWithStarAndHighStartz?DefaultSearchTests.test_searchMessageSetUIDWithStarAndHighStartS  s   € ð ×)Ñ)¨-¸!¸Ó=Ð=r6   c                ó(   — | j                  ddg«      S )z—
        If the search filter contains nesting terms, one of which includes a
        message sequence set with a wildcard, IT ALL WORKS GOOD.
        z(6:*)rÊ   r	  rR   s    r4   Útest_searchMessageSetWithListz0DefaultSearchTests.test_searchMessageSetWithList[  s   € ð ×)Ñ)¨'°A°3Ó7Ð7r6   c                ó*   — | j                  dddg«      S )z‚
        If the search filter contains an I{OR} term, all messages
        which match either subexpression are returned.
        zOR 1 2rÅ   rÉ   r	  rR   s    r4   rl  z DefaultSearchTests.test_searchOre  s   € ð
 ×)Ñ)¨(°Q¸°FÓ;Ð;r6   c                ó*   — | j                  dg d¢«      S )zà
        If the search filter contains an I{OR} term with a
        subexpression which includes a message sequence set wildcard,
        all messages in that set are considered for inclusion in the
        results.
        z
OR 2:* 2:*r6  r	  rR   s    r4   Útest_searchOrMessageSetz*DefaultSearchTests.test_searchOrMessageSetl  s   € ð ×)Ñ)¨,ºÓEÐEr6   c                ó*   — | j                  dg d¢«      S )z†
        If the search filter contains a I{NOT} term, all messages
        which do not match the subexpression are returned.
        zNOT 3)rÅ   rÉ   rË   rÊ   r	  rR   s    r4   ro  z!DefaultSearchTests.test_searchNotu  s   € ð
 ×)Ñ)¨'²<Ó@Ð@r6   c                ó(   — | j                  ddg«      S )zÞ
        If the search filter contains a I{NOT} term with a
        subexpression which includes a message sequence set wildcard,
        no messages in that set are considered for inclusion in the
        result.
        zNOT 2:*rÅ   r	  rR   s    r4   Útest_searchNotMessageSetz+DefaultSearchTests.test_searchNotMessageSet|  s   € ð ×)Ñ)¨)°a°SÓ9Ð9r6   c                ó(   — | j                  ddg«      S )zÉ
        If the search filter contains multiple terms implicitly
        conjoined with a message sequence set wildcard, only the
        intersection of the results of each term are returned.
        z2:* 3rÇ   r	  rR   s    r4   Útest_searchAndMessageSetz+DefaultSearchTests.test_searchAndMessageSet…  s   € ð ×)Ñ)¨'°A°3Ó7Ð7r6   c                ó$  ‡ ‡— dŠˆˆ fd„}‰ j                   j                  t        |«      «      }‰ j                  |t        j
                  «      }ˆ fd„}|j                  |«       |j                  ‰ j                  «       ‰ j                  «        |S )zË
        If the search criteria is not a valid key, a NO result is returned to
        the client (resulting in an error callback), and an IllegalQueryError is
        logged on the server side.
        ÚFOOc                 ó:   •— ‰j                   j                  ‰ «      S r0   r
	  r	  s   €€r4   r   z=DefaultSearchTests.test_searchInvalidCriteria.<locals>.search•  r¬  r6   c                óR  •— ‰j                   j                  j                  «        ‰j                  j                  j                  «        ‰j	                  t
        j                  «      }‰j                  t        |«      d«       ‰j                  t        d«      t        | «      «       y)ú—
            Verify that the server logs an IllegalQueryError and the
            client raises an IMAP4Exception with 'Search failed:...'
            rÅ   s)   SEARCH failed: Invalid search command FOON©
rþ  rì  rí  rý  r~  r   r$  rB   rÐ   rå   ©rI  r{  rE   s     €r4   ÚerrorReceivedzDDefaultSearchTests.test_searchInvalidCriteria.<locals>.errorReceived›  s}   ø€ ð
 �K‰K×!Ñ!×0Ñ0Ô2Ø�K‰K×!Ñ!×0Ñ0Ô2ð ×+Ñ+¬E×,CÑ,CÓDˆFØ×ÑœS ›[¨!Ô,ð ×ÑÜÐ@ÓAÜ�G“õr6   ©	rÿ  r›   r7   r×  r   r  r'  r
  r#   )rE   r   rž   r1	  r	  s   `   @r4   Útest_searchInvalidCriteriaz-DefaultSearchTests.test_searchInvalidCriteria�  sr   ù€ ð ˆ
õ	2ð �N‰N×&Ñ&¤u¨V£}Ó5ˆØ×Ñ˜q¤%×"6Ñ"6Ó7ˆô	ð$ 	
�‰�mÔ$Ø	�‰�T—_‘_Ô%Ø�‰ŒØˆr6   N)rs   rt   ru   r3  r  r�  r	  r	  r	  r	  r	  r	  r	  r!	  rl  r$	  ro  r'	  r)	  r3	  r1   r6   r4   r	  r	  ý  s\   „ ñò

òHòò24ò?ò?òGòGò>ò8ò<òFòAò:ò8ó#r6   r	  c                  óL   — e Zd Zd„ Zd„ Zd„ ZeZd„ Zd„ Zd„ Z	d„ Z
d„ Zd	„ Zd
„ Zy)ÚFetchSearchStoreTestsc                ó4  — d x| _         | _        d | _        d | _        d | _        d | _        t        j                  «       | _        d| j                  _	        | | j                  _
        t        j                  «       | _        t        | j                  «      | _        y rÙ  )rh  r2   Úserver_received_queryÚserver_received_uidÚserver_received_partsÚserver_received_messagesr   rÏ  rý  rR  r^  r   r   rÿ  rß  rþ  rR   s    r4   r  zFetchSearchStoreTests.setUpµ  sv   € Ø&*Ð*ˆŒ˜œØ%)ˆÔ"Ø#'ˆÔ Ø%)ˆÔ"Ø(,ˆÔ%ä×'Ñ'Ó)ˆŒØ$ˆ�‰ÔØˆ�‰ÔÜŸ™Ó)ˆŒÜ" 4§>¡>Ó2ˆ�r6   c                ól   — |dgk(  rt        j                  d«      ‚|| _        || _        | j                  S )Nr~  z"FOO is not a valid search criteria)r   r$  r7	  r8	  rh  )rE   r  rª  s      r4   r   zFetchSearchStoreTests.searchÂ  s8   € à�V�HÒÜ×)Ñ)Ð*NÓOÐOà%*ˆÔ"Ø#&ˆÔ Ø�}‰}Ðr6   c                 ó   — y r0   r1   )rE   rß  r×  s      r4   rh  z!FetchSearchStoreTests.addListenerË  r  r6   c                ón  ‡ ‡— ˆ ˆfd„}ˆ fd„}‰ j                   j                  t        |«      «      j                  |«      j                  ‰ j                  «      j	                  ‰ j
                  «       ˆ fd„}t        j                  ‰ j                  ‰ j                  d¬«      }|j                  |«       |S )Nc                 óR   •— ‰ j                   j                  ‰ j                  ‰¬«      S )Nr  )rþ  r   r  rm  s   €€r4   r   z1FetchSearchStoreTests._searchWork.<locals>.searchÑ  s!   ø€ Ø—;‘;×%Ñ% d§j¡j°cÐ%Ó:Ð:r6   c                ó   •— | ‰_         y r0   ræ  rç  s    €r4   r2   z1FetchSearchStoreTests._searchWork.<locals>.resultÔ  ré  r6   c                ó|  •— ‰j                  ‰j                  ‰j                  u «       ‰j                  ‰j                  ‰j                  «       ‰j                  ‰j                  ‰j
                  «       ‰j                  t        j                  ‰j                  j                  d«      «      ‰j                  «       y )NÚcharmap)rT  r2   rh  rB   rª  r8	  r   r�  r  rC   r7	  rì  s    €r4   r�  z0FetchSearchStoreTests._searchWork.<locals>.checkÛ  s†   ø€ à×Ñ˜TŸ[™[¨D¯M©MÐ9Ô:à×Ñ˜TŸ[™[¨$¯-©-Ô8Ø×Ñ˜TŸX™X t×'?Ñ'?Ô@Ø×Ñô ×'Ñ'¨¯
©
×(9Ñ(9¸)Ó(DÓEØ×*Ñ*õ	r6   Frí  rï  )rE   rª  r   r2   r�  rž   s   ``    r4   Ú_searchWorkz!FetchSearchStoreTests._searchWorkÐ  s†   ù€ õ	;ô	ð 	�‰×"Ñ"¤5¨£=Ó1×=Ñ=¸fÓE×QÑQØ×Ñó	
ç
‰*�T—_‘_Ô
%ô	ô × Ñ  §¡¨d¯k©kÀÔGˆØ	�‰�eÔØˆr6   c                óÌ   — t        j                  t        j                  d¬«      t        j                  dd¬«      «      | _        g d¢| _        d| _        | j                  d«      S )N©rŒ   Ú	substring©rÊ  é   é   ©r  r	  )rÅ   rË   rÊ   rÎ   r   )r   r  r  r  rh  rª  rB	  rR   s    r4   Ú
testSearchz FetchSearchStoreTests.testSearchì  sN   € Ü—X‘XÜ�K‰KÐ7Ô8Ü�K‰K˜t¨TÔ2ó
ˆŒ
ò %ˆŒØˆŒØ×Ñ Ó"Ð"r6   c                óÌ   — t        j                  t        j                  d¬«      t        j                  dd¬«      «      | _        d| _        g d¢| _        | j                  d«      S )NrD	  rF	  rG	  rH	  rI	  rÅ   rÈ   )r   r  r  r  rª  rh  rB	  rR   s    r4   ÚtestUIDSearchz#FetchSearchStoreTests.testUIDSearchõ  sN   € Ü—X‘XÜ�K‰KÐ7Ô8Ü�K‰K˜t¨TÔ2ó
ˆŒ
ð ˆŒÚ!ˆŒØ×Ñ Ó"Ð"r6   c                óŠ   — 	 | j                   |   d   S # t        t        f$ r | j                   |dz
     cY S t        $ r Y yw xY w)Nr©  rÅ   rq  )rh  rØ   Ú
IndexErrorÚKeyError©rE   r�   s     r4   r„  zFetchSearchStoreTests.getUIDþ  sM   € ð	Ø—=‘= Ñ% eÑ,Ð,øÜœ:Ð&ò 	*Ø—=‘=  q¡Ñ)Ò)Üò 	Ùð	ús   ‚ ”!A·AÁAc                óH   — || _         t        |«      | _        | j                  S r0   )r8	  rå   r:	  rh  rœ  s      r4   r�  zFetchSearchStoreTests.fetch  s    € Ø#&ˆÔ Ü(+¨H«ˆÔ%Ø�}‰}Ðr6   c                ó`  ‡ — ˆ fd„}‰ j                   j                  t        |«      «      j                  |«      j                  ‰ j                  «      j	                  ‰ j
                  «       ˆ fd„}t        j                  ‰ j                  ‰ j                  d¬«      }|j                  |«       |S )Nc                ó   •— | ‰_         y r0   ræ  rç  s    €r4   r2   z0FetchSearchStoreTests._fetchWork.<locals>.result  ré  r6   c                óè  •— ‰j                  ‰j                  ‰j                  u «       ‰j                  xr ‰j                  j	                  «        ‰j
                  xr ‰j
                  j	                  «        ‰j                  r0‰j                  j                  «       D ]  \  }}t        |«      |d<   Œ ‰j                  ‰j                  ‰j                  «       ‰j                  ‰j                  ‰j                  «       ‰j                  ‰j                  ‰j
                  «       ‰j                  t        j                  ‰j                  «      t        j                  ‰j                  «      «       y )Nr©  )rT  r2   rh  rç  r½  r9	  rª  rP  rå   rB   r8	  r   rã   r  r:	  )rT  ÚkÚvrE   s      €r4   r�  z/FetchSearchStoreTests._fetchWork.<locals>.check  s
  ø€ à×Ñ˜TŸ[™[¨D¯M©MÐ9Ô:à�J‰JÒ,˜4Ÿ:™:Ÿ?™?Ó,øØ×&Ñ&ÒL¨4×+EÑ+E×+JÑ+JÓ+Løà�xŠxØ ŸM™M×/Ñ/Ó1ò &‘D�A�qÜ" 1›v�A�e’Hð&ð ×Ñ˜TŸ[™[¨$¯-©-Ô8Ø×Ñ˜TŸX™X t×'?Ñ'?Ô@Ø×Ñ˜TŸZ™Z¨×)CÑ)CÔDØ×ÑÜ×!Ñ! $§-¡-Ó0Ü×!Ñ! $×"?Ñ"?Ó@õr6   Frí  rï  )rE   r�  r2   r�  rž   s   `    r4   r[  z FetchSearchStoreTests._fetchWork  s�   ø€ ô	ð 	�‰×"Ñ"¤5¨£<Ó0×<Ñ<¸VÓD×PÑPØ×Ñó	
ç
‰*�T—_‘_Ô
%ô	ô& × Ñ  §¡¨d¯k©kÀÔGˆØ	�‰�eÔØˆr6   c                ó$  ‡ ‡— dŠˆˆ fd„}‰ j                   j                  t        |«      «      }‰ j                  |t        j
                  «      }ˆ fd„}|j                  |«       |j                  ‰ j                  «       ‰ j                  «        |S )zå
        If, as part of a search, an ISearchableMailbox raises an
        IllegalQueryError (e.g. due to invalid search criteria), client sees a
        failure response, and an IllegalQueryError is logged on the server.
        r+	  c                 ó:   •— ‰j                   j                  ‰ «      S r0   r
	  )r  rE   s   €€r4   r   z6FetchSearchStoreTests.test_invalidTerm.<locals>.search2  s   ø€ Ø—;‘;×%Ñ% eÓ,Ð,r6   c                óR  •— ‰j                   j                  j                  «        ‰j                  j                  j                  «        ‰j	                  t
        j                  «      }‰j                  t        |«      d«       ‰j                  t        d«      t        | «      «       y)r.	  rÅ   s1   SEARCH failed: FOO is not a valid search criteriaNr/	  r0	  s     €r4   r1	  z=FetchSearchStoreTests.test_invalidTerm.<locals>.errorReceived8  s|   ø€ ð
 �K‰K×!Ñ!×0Ñ0Ô2Ø�K‰K×!Ñ!×0Ñ0Ô2ð ×+Ñ+¬E×,CÑ,CÓDˆFØ×ÑœS ›[¨!Ô,ð ×ÑÜÐHÓIÌ3ÈwË<õr6   r2	  )rE   r   rž   r1	  r  s   `   @r4   Útest_invalidTermz&FetchSearchStoreTests.test_invalidTerm*  sr   ù€ ð ˆõ	-ð �N‰N×&Ñ&¤u¨V£}Ó5ˆØ×Ñ˜q¤%×"6Ñ"6Ó7ˆô	ð" 	
�‰�mÔ$Ø	�‰�T—_‘_Ô%Ø�‰ŒØˆr6   N)rs   rt   ru   r  r   rh  rj  rB	  rJ	  rL	  r„  r�  r[  rZ	  r1   r6   r4   r5	  r5	  ³  s;   „ ò3òòð !€Nòò8#ò#òòò
ó>"r6   r5	  c                  ó   — e Zd Zd„ Zd„ Zy)ÚFakeMailboxc                ó   — g | _         y r0   )rÖ  rR   s    r4   rz   zFakeMailbox.__init__P  ó	   € Øˆ�	r6   c                óh   — | j                   j                  |||f«       t        j                  d «      S r0   )rÖ  r|   r   r[  )rE   r“   r�  rŽ  s       r4   r�  zFakeMailbox.addMessageS  s*   € Ø�	‰	×Ñ˜$  tÐ,Ô-Ü�}‰}˜TÓ"Ð"r6   N)rs   rt   ru   rz   r�  r1   r6   r4   r\	  r\	  O  s   „ òó#r6   r\	  c                  ó   — e Zd Zd„ Zd„ Zd„ Zy)ÚFeaturefulMessagec                 ó   — y)Nr�  r1   rR   s    r4   rn  zFeaturefulMessage.getFlagsZ  s   € Ør6   c                 ó   — y)Nr   r1   rR   s    r4   rÉ  z!FeaturefulMessage.getInternalDate]  s   € Ør6   c                ó   — t        d«      S )Nó   openr   rR   s    r4   ry  zFeaturefulMessage.open`  s   € Ü�wÓÐr6   N)rs   rt   ru   rn  rÉ  ry  r1   r6   r4   ra	  ra	  X  s   „ òòó r6   ra	  c                  ó   — e Zd Zd„ Zd„ Zy)ÚMessageCopierMailboxc                ó   — g | _         y r0   )ÚmsgsrR   s    r4   rz   zMessageCopierMailbox.__init__f  r^	  r6   c                ób   — | j                   j                  |«       t        | j                   «      S r0   )ri	  r|   rÐ   rP	  s     r4   r¯  zMessageCopierMailbox.copyi  s"   € Ø�	‰	×Ñ˜ÔÜ�4—9‘9‹~Ðr6   N)rs   rt   ru   rz   r¯  r1   r6   r4   rg	  rg	  d  s   „ òór6   rg	  c                  ó   — e Zd Zd„ Zd„ Zd„ Zy)ÚCopyWorkerTestsc                óê   ‡ ‡— t        j                  «       }|j                  }t        «       Š |t	        dd«      D �cg c]  }|t        «       f‘Œ c}d‰«      }ˆˆ fd„}|j                  |«      S c c}w )NrÅ   r?  rÙ  c                ó  •— ‰j                   D ]O  }‰j                  |d   j                  «       d«       ‰j                  |d   d«       ‰j                  |d   d«       ŒQ | D ](  \  }}‰j                  |«       ‰j                  |d «       Œ* y )Nr   re	  rÅ   r�  rÉ   r   )rÖ  rB   rW   rV  )rI  rß  rb  r2   ró   rE   s       €€r4   ÚcbCopyz5CopyWorkerTests.testFeaturefulMessage.<locals>.cbCopy  s‰   ø€ Ø—V‘Vò 7�Ø× Ñ   1¡§¡£¨gÔ6Ø× Ñ   1¡ wÔ/Ø× Ñ   1¡ ~Õ6ð7ð
 #*ò /‘�˜Ø—‘ Ô'Ø× Ñ  ¨Õ.ñ/r6   )r   rÏ  Ú_IMAP4Server__cbCopyr\	  rn   ra	  r›   )rE   r|  r3   ré   rž   ro	  ró   s   `     @r4   ÚtestFeaturefulMessagez%CopyWorkerTests.testFeaturefulMessageo  sh   ù€ Ü×ÑÓˆð ×"Ñ"ˆä‹MˆÙ´°q¸"³Ö>¨A�Ô$Ó&Ò'Ò>ÀÀqÓIˆõ	/ð �}‰}˜VÓ$Ð$ùò ?s   ½A0c                óf  ‡ ‡— t        j                  «       }|j                  }t        «       Št	        dd«      D �cg c]$  }t        dt        |«      iddd|fz  |dz   d «      ‘Œ& }} |t        t	        dd«      |«      D �cg c]  }|‘Œ c}d‰«      }ˆˆ fd	„}|j                  |«      S c c}w c c}w )
NrÅ   r?  zHeader-Counterr1   ó   Dates   Body %drö   rÙ  c                óš  •— g }‰j                   D ]N  }|j                  |d   j                  «       «       ‰j                  |d   d«       ‰j                  |d   d«       ŒP |j	                  «        t        d„ t        dd«      D «       «      }‰j                  ||«       | D ](  \  }}‰j                  |«       ‰j                  |d «       Œ* y )Nr   rÅ   r1   rÉ   rs	  c              3  ó*   K  — | ]  }d ||fz  –— Œ y­w)s   Header-Counter: %d

Body %dNr1   r+  s     r4   r-  zJCopyWorkerTests.testUnfeaturefulMessage.<locals>.cbCopy.<locals>.<genexpr>¢  s   è ø€ ò ØBCÐ4¸¸1°vÕ=ñùs   ‚r?  )rÖ  r|   rW   rB   r½  rf  rn   rV  )rI  Úseenrß  Úexprb  r2   ró   rE   s         €€r4   ro	  z7CopyWorkerTests.testUnfeaturefulMessage.<locals>.cbCopyš  sÃ   ø€ ØˆDØ—V‘Vò 0�Ø—‘˜A˜a™DŸI™I›KÔ(Ø× Ñ   1¡ rÔ*Ø× Ñ   1¡ wÕ/ð0ð
 �I‰IŒKÜñ ÜGLÈQÐPRÃ|ôó ˆCð ×Ñ˜T 3Ô'à")ò /‘�˜Ø—‘ Ô'Ø× Ñ  ¨Õ.ñ/r6   )	r   rÏ  rp	  r\	  rn   r˜   rå   rä   r›   )	rE   r|  r3   ré   ri	  Úimrž   ro	  ró   s	   `       @r4   ÚtestUnfeaturefulMessagez'CopyWorkerTests.testUnfeaturefulMessage‹  s¼   ù€ Ü×ÑÓˆð ×"Ñ"ˆä‹Mˆô
 ˜1˜b“\ö	
ð ô Ø!¤3 q£6Ð*¨B°¸ÀqÀdÑ9JÈAÐPRÉFÐTXõð
ˆð 
ñ œC¤ a¨£¨dÓ3Ö4�bŠrÒ4°e¸QÓ?ˆõ	/ð" �}‰}˜VÓ$Ð$ùò3
ùò 5s   »)B)Â 	B.c                ó<  ‡ ‡‡— t        j                  «       }|j                  }t        «       Št	        dd«      D �cg c]  }t        «       ‘Œ c}Š |t        t	        dd«      ‰«      D �cg c]  }|‘Œ c}d‰«      }ˆˆˆ fd„}|j                  |«      S c c}w c c}w )NrÅ   r?  s   tagc                óÌ   •— ‰j                  | t        t        dgdz  t        dd«      «      «      «       t        ‰‰j                  «      D ]  \  }}‰j                  ||«       Œ y )NrÅ   rö   r?  )rB   rÑ   rä   rn   ri	  r‘   )rI  Úorigr  ró   ri	  rE   s      €€€r4   ro	  z1CopyWorkerTests.testMessageCopier.<locals>.cbCopy·  sY   ø€ Ø×Ñ˜W¤d¬3°¨s°R©x¼¸qÀ"»Ó+FÓ&GÔHÜ   q§v¡vÓ.ò 0‘	��cØ×$Ñ$ T¨3Õ/ñ0r6   )r   rÏ  rp	  rg	  rn   Úobjecträ   r›   )	rE   r|  r3   ré   rx	  rž   ro	  ró   ri	  s	   `      @@r4   ÚtestMessageCopierz!CopyWorkerTests.testMessageCopier­  s‚   ú€ Ü×ÑÓˆð ×"Ñ"ˆä Ó"ˆÜ"'¨¨2£,Ö/˜Q”•Ò/ˆÙœC¤ a¨£¨dÓ3Ö4�bŠrÒ4°f¸aÓ@ˆö	0ð
 �}‰}˜VÓ$Ð$ùò 0ùÚ4s   ¼BÁ*	BN)rs   rt   ru   rq	  ry	  r~	  r1   r6   r4   rl	  rl	  n  s   „ ò%ò8 %óD%r6   rl	  zOpenSSL not presentzReactor doesn't support SSLc                  óv   — e Zd ZdZdZer e«       Zer e«       Zd„ Zd„ Zd„ Z	d„ Z
d„ Zdd„Zd„ Zd	„ Zd
„ Zd„ Zy)ÚTLSTestsNc                óZ   — t        j                  | j                  | j                  d¬«      S )NFrí  )r#   rð  rý  rþ  rR   s    r4   r#   zTLSTests.loopbackÉ  s   € Ü×#Ñ# D§K¡K°·±ÀEÔJÐJr6   c                óÀ  ‡ ‡	‡
— t         j                  j                  d«       g Š	ˆ	ˆ fd„}ˆ	ˆ fd„}ˆ	ˆ fd„}ˆ	ˆ fd„}ˆ	ˆ fd„}d‰ j                  _        |||||gŠ
‰
D ]&  }‰ j
                  j                  t        |«      «       Œ( ‰ j
                  j                  ‰ j                  ‰ j                  «       ˆ	ˆ
ˆ fd„}‰ j                  «       }|j                  |«       |S )	Nr¾  c                 ó^   •— ‰ j                  d «       ‰j                  j                  dd«      S rG  )r|   rþ  rH  ©ÚcalledrE   s   €€r4   rH  z)TLSTests.testAPileOfThings.<locals>.loginÐ  s'   ø€ Ø�M‰M˜$ÔØ—;‘;×$Ñ$ [Ð2BÓCÐCr6   c                 ó^   •— ‰ j                  d «       ‰j                  j                  dd«      S )Nr¾  ó   %)r|   rþ  rÑ   r„	  s   €€r4   rÑ   z(TLSTests.testAPileOfThings.<locals>.listÔ  s&   ø€ Ø�M‰M˜$ÔØ—;‘;×#Ñ# H¨dÓ3Ð3r6   c                 ó^   •— ‰ j                  d «       ‰j                  j                  dd«      S )Nr¾  rS  )r|   rþ  rb  r„	  s   €€r4   rb  z*TLSTests.testAPileOfThings.<locals>.statusØ  s&   ø€ Ø�M‰M˜$ÔØ—;‘;×%Ñ% h°	Ó:Ð:r6   c                 ó\   •— ‰ j                  d «       ‰j                  j                  d«      S )Nr¾  )r|   rþ  rÅ  r„	  s   €€r4   rÅ  z+TLSTests.testAPileOfThings.<locals>.examineÜ  s$   ø€ Ø�M‰M˜$ÔØ—;‘;×&Ñ& xÓ0Ð0r6   c                 óZ   •— ‰ j                  d «       ‰j                  j                  «       S r0   )r|   rþ  r9  r„	  s   €€r4   r9  z*TLSTests.testAPileOfThings.<locals>.logoutà  s"   ø€ Ø�M‰M˜$ÔØ—;‘;×%Ñ%Ó'Ð'r6   Tc                óæ   •— ‰j                  ‰j                  j                  d«       ‰j                  ‰j                  j                  d«       ‰j                  t	        ‰«      t	        ‰«      «       y r˜  )rB   rý  Ú
startedTLSrþ  rÐ   )rT  r…	  ÚmethodsrE   s    €€€r4   r�  z)TLSTests.testAPileOfThings.<locals>.checkì  sO   ø€ Ø×Ñ˜TŸ[™[×3Ñ3°TÔ:Ø×Ñ˜TŸ[™[×3Ñ3°TÔ:Ø×ÑœS ›[¬#¨g«,Õ7r6   )rÉ  rÝ  rª  rþ  ÚrequireTransportSecurityrÿ  r›   r7   rÙ  r  r
  r#   )rE   rH  rÑ   rb  rÅ  r9  râ  r�  rž   r…	  r�	  s   `        @@r4   ÚtestAPileOfThingszTLSTests.testAPileOfThingsÌ  s¼   ú€ Ü×Ñ×*Ñ*¨8Ô4Øˆõ	Dõ	4õ	;õ	1õ	(ð 04ˆ�‰Ô,à˜$ ¨°Ð8ˆØò 	6ˆFØ�N‰N×&Ñ&¤u¨V£}Õ5ð	6ð 	�‰×#Ñ# D×$6Ñ$6¸¿¹ÔHö	8ð
 �M‰M‹OˆØ	�‰�eÔØˆr6   c                óö  ‡ ‡— ‰ j                   j                  j                  dd«       g Š‰ j                  j	                  t        j                  d«      «       ‰ j                  j                  ˆ fd„«      j                  ˆ fd„«      j                  ‰j                  «      j                  ‰ j                  «      j                  ‰ j                  «       ‰ j                  «       }|j                  ˆ ˆfd„«       |S )NrÊ  rÎ  c                ó:   •— ‰j                   j                  d«      S )NrÎ  r²  r;  s    €r4   r5   z)TLSTests.testLoginLogin.<locals>.<lambda>ú  s   ø€ �d—k‘k×.Ñ.Ð/?Ó@€ r6   c                ó8   •— ‰j                   j                  «       S r0   )rþ  r9  r;  s    €r4   r5   z)TLSTests.testLoginLogin.<locals>.<lambda>û  s   ø€  §¡× 2Ñ 2Ó 4€ r6   c                ó:   •— ‰j                  t        ‰«      d«      S rs  )rB   rÐ   ©r\  rE   Úsuccesss    €€r4   r5   z)TLSTests.testLoginLogin.<locals>.<lambda>  s   ø€  × 0Ñ 0´°W³¸qÓ A€ r6   )rý  rÒ  rÑ  rþ  r·  r   r¶  rÿ  r›   r|   r  r'  r
  r#   )rE   rž   r•	  s   ` @r4   ÚtestLoginLoginzTLSTests.testLoginLoginõ  s³   ù€ Ø�‰×Ñ×#Ñ# KÐ1AÔBØˆØ�‰×)Ñ)¬%×*BÑ*BÀ;Ó*OÔPØ�‰×"Ñ"Û@ó	
ç
‰+Ó4Ó
5·k±kØ�N‰Nó7
ç
‰+Ø×Ñó
ç
‰*Ø�O‰Oô
ð �M‰M‹OˆØ	�‰ÔAÔBØˆr6   c                ó�  ‡ ‡— g Š‰ j                   j                  t        ‰ j                  j                  «      «       ˆ fd„}‰ j                   j                  |«       ‰ j                   j                  ‰j
                  «       ‰ j                  «       }|j                  ˆ ˆfd„«       t        j                  |‰ j                   g«      S )zì
        Begin a C{STARTTLS} sequence and assert that it results in a
        TLS session.

        @return: A L{Deferred} that fires when the underlying
            connection between the client and server has been terminated.
        c                óŠ   •— ‰j                  t        j                  j                  ‰j                  j
                  «      «       y r0   )rV  r   ÚISSLTransportÚ
providedByrþ  rì  rì  s    €r4   ÚcheckSecurez6TLSTests.startTLSAndAssertSession.<locals>.checkSecure  s*   ø€ Ø�O‰OœJ×4Ñ4×?Ñ?ÀÇÁ×@UÑ@UÓVÕWr6   c                ó&   •— ‰j                  ‰«      S r0   )rV  r”	  s    €€r4   r5   z3TLSTests.startTLSAndAssertSession.<locals>.<lambda>  s   ø€  §¡°Ó 8€ r6   )	rÿ  r›   r7   rþ  ÚstartTLSr|   r#   r   r(  )rE   r›	  rž   r•	  s   `  @r4   ÚstartTLSAndAssertSessionz!TLSTests.startTLSAndAssertSession  s�   ù€ ð ˆØ�‰×"Ñ"¤5¨¯©×)=Ñ)=Ó#>Ô?ô	Xð 	�‰×"Ñ" ;Ô/Ø�‰×"Ñ" 7§>¡>Ô2à�M‰M‹OˆØ	�‰Ô8Ô9Ü×"Ñ" A t§~¡~Ð#6Ó7Ð7r6   c                óº   — | j                  «       }| j                  j                  | j                  «       | j                  j	                  | j
                  «       |S )zª
        L{IMAP4Client.startTLS} triggers TLS negotiation and returns a
        L{Deferred} which fires after the client's transport is using
        encryption.
        )rž	  rÿ  r›   r  r'  r
  ©rE   Údisconnecteds     r4   Útest_startTLSzTLSTests.test_startTLS  sF   € ð ×4Ñ4Ó6ˆØ�‰×"Ñ" 4×#5Ñ#5Ô6Ø�‰×!Ñ! $§/¡/Ô2ØÐr6   c                ó&  — | j                  | j                  j                  «       d| j                  _        | j                  «       }| j                  j                  | j                  «       | j                  j                  | j                  «       |S )zd
        L{IMAPClient.startTLS} supplies a default TLS context if none is
        supplied.
        N)	ÚassertIsNotNonerþ  Úcontextrž	  rÿ  r›   r  r'  r
  r 	  s     r4   Útest_startTLSDefaultzTLSTests.test_startTLSDefault'  sj   € ð
 	×Ñ˜TŸ[™[×0Ñ0Ô1Ø"ˆ�‰ÔØ)-×)FÑ)FÓ)HˆØ�‰×"Ñ" 4×#5Ñ#5Ô6Ø�‰×!Ñ! $§/¡/Ô2ØÐr6   c                óÚ  —  G d„ dt         «      } || j                  | j                  ¬«      | _        | j	                  «       }| j                  j                  t        | j                  j                  «      «       | j                  j                  | j                  d«       | j                  j                  | j                  «       | j                  j                  | j                  «       |S )z]
        A server that receives a second C{STARTTLS} sends a C{NO}
        response.
        c                  ó   — e Zd Zd„ Zy)ú:TLSTests.test_doubleSTARTTLS.<locals>.DoubleSTARTTLSClientc                óŒ   — | j                   st        j                  | «      S | j                  t	        j
                  d«      «      S )Ns   STARTTLS)rŒ	  rß  r�	  r‹  r   r8  rR   s    r4   r�	  zCTLSTests.test_doubleSTARTTLS.<locals>.DoubleSTARTTLSClient.startTLS:  s4   € Ø—’Ü'×0Ñ0°Ó6Ð6à×'Ñ'¬¯©°kÓ(BÓCÐCr6   N)rs   rt   ru   r�	  r1   r6   r4   ÚDoubleSTARTTLSClientr©	  9  s   „ óDr6   r«	  rü  s   TLS already negotiated)rß  rÿ  rú  rþ  rž	  r›   r7   r�	  r'  r  r  r
  )rE   r«	  r¡	  s      r4   Útest_doubleSTARTTLSzTLSTests.test_doubleSTARTTLS3  s°   € ô	D¤<ô 	Dñ +Ø�N‰N¨4¯>©>ô
ˆŒð ×4Ñ4Ó6ˆà�‰×"Ñ"¤5¨¯©×)=Ñ)=Ó#>Ô?Ø�‰×!Ñ!Ø×+Ñ+Ð-Fô	
ð 	�‰×"Ñ" 4×#5Ñ#5Ô6Ø�‰×!Ñ! $§/¡/Ô2àÐr6   c                óÜ  ‡ — t         j                  t         j                  dœ‰ j                  _        t
        j                  ˆ fd„«       }‰ j                  j                  t        |«      «       ‰ j                  «       }‰ j                  j                  t        |«      «       ‰ j                  j                  ‰ j                  «       ‰ j                  j                  ‰ j                  «       |S )z°
        Starting a TLS negotiation with an L{IMAP4Server} that already
        has C{LOGIN} and C{PLAIN} L{IChallengeResponse} factories uses
        those factories.
        )rø  r”  c               3  ó¾   •K  — ‰j                   j                  «       –—} ‰j                  d| «       ‰j                  d| d   «       ‰j                  d| d   «       y ­w)Nr/  rø  r”  )rþ  r  r  rq  s    €r4   ÚassertLOGINandPLAINzJTLSTests.test_startTLSWithExistingChallengers.<locals>.assertLOGINandPLAIN[  sP   øè ø€ à!%§¡×!<Ñ!<Ó!>Ñ>ˆLØ�M‰M˜' <Ô0Ø�M‰M˜( L°Ñ$9Ô:Ø�M‰M˜( L°Ñ$9Õ:ùs   ƒAA)r   rµ  r  rý  r2  r   r  rÿ  r›   r7   rž	  r  r'  r
  )rE   r¯	  r¡	  s   `  r4   Ú$test_startTLSWithExistingChallengersz-TLSTests.test_startTLSWithExistingChallengersP  s³   ø€ ô ×,Ñ,Ü×,Ñ,ñ#
ˆ�‰Ôô
 
×	Ñ	ó	;ó 
ð	;ð 	�‰×"Ñ"¤5Ð)<Ó#=Ô>à×4Ñ4Ó6ˆà�‰×"Ñ"¤5Ð)<Ó#=Ô>à�‰×"Ñ" 4×#5Ñ#5Ô6Ø�‰×!Ñ! $§/¡/Ô2àÐr6   c                ó¢  ‡ — d„ ‰ j                   _        ‰ j                  j                  ˆ fd„«       ‰ j                  j	                  ‰ j
                  d«       ‰ j                  j                  ‰ j                  «       ‰ j                  j	                  ‰ j                  «       t        j                  ‰ j                  «       ‰ j                  g«      S )z|
        A client that attempts to log in before issuing the
        C{STARTTLS} command receives a C{NO} response.
        c                 ó0   — t        j                  g df«      S )NzOK Begin TLS negotiation now)r   r[  r1   r6   r4   r5   z3TLSTests.test_loginBeforeSTARTTLS.<locals>.<lambda>s  s   € ¤u§}¡}ØÐ/Ð0ó(
€ r6   c                ó<   •— ‰j                   j                  dd«      S )Ns   wrongs   timerz  r;  s    €r4   r5   z3TLSTests.test_loginBeforeSTARTTLS.<locals>.<lambda>w  s   ø€ �d—k‘k×'Ñ'¨°'Ó:€ r6   s!   LOGIN is disabled before STARTTLS)rþ  r�	  rÿ  r›   r'  r  r  r
  r   r(  r#   rR   s   `r4   Útest_loginBeforeSTARTTLSz!TLSTests.test_loginBeforeSTARTTLSm  s˜   ø€ ñ 
ˆ�‰Ôð 	�‰×"Ñ"Û:ô	
ð 	�‰×!Ñ!Ø×+Ñ+Ø0ô	
ð
 	�‰×"Ñ" 4×#5Ñ#5Ô6Ø�‰×!Ñ! $§/¡/Ô2ä×"Ñ" D§M¡M£O°T·^±^Ð#DÓEÐEr6   c                ó   ‡ ‡— g Šˆ fd„}‰ j                   j                  |«       ‰ j                   j                  ˆ fd„«       ‰ j                   j                  ˆfd„«       ‰ j                   j                  ‰ j                  «       ‰ j                   j                  ‰ j                  «       ˆˆ fd„}‰ j                  «       j                  |«      S )Nc                ó(   •— d‰j                   _        y r¢  )rý  ÚcanStartTLSrß  s    €r4   ÚbreakServerTLSz3TLSTests.testFailedStartTLS.<locals>.breakServerTLS‡  s   ø€ Ø&+ˆD�K‰KÕ#r6   c                ó8   •— ‰j                   j                  «       S r0   )rþ  r�	  rß  s    €r4   r5   z-TLSTests.testFailedStartTLS.<locals>.<lambda>‹  s   ø€ ¨t¯{©{×/CÑ/CÓ/E€ r6   c                ó`   •— ‰j                  | j                  t        j                  «      «      S r0   )r|   r  r   r  )r	  r¢  s    €r4   r5   z-TLSTests.testFailedStartTLS.<locals>.<lambda>�  s   ø€ ˜Ÿ™¨¯©´×1EÑ1EÓ(FÓG€ r6   c                ón   •— ‰j                  ‰«       ‰j                  ‰d   t        j                  «       y rÓ  )rV  r‘   r   r  )rT  r¢  rE   s    €€r4   r�  z*TLSTests.testFailedStartTLS.<locals>.check’  s)   ø€ Ø�O‰O˜HÔ%Ø× Ñ  ¨!¡¬e×.BÑ.BÕCr6   )rÿ  r›   r'  r  r
  r#   )rE   r¸	  r�  r¢  s   `  @r4   ÚtestFailedStartTLSzTLSTests.testFailedStartTLS„  s˜   ù€ Øˆô	,ð 	�‰×"Ñ" >Ô2Ø�‰×"Ñ"Ó#EÔFØ�‰×!Ñ!ÛGô	
ð 	�‰×"Ñ" 4×#5Ñ#5Ô6Ø�‰×!Ñ! $§/¡/Ô2õ	Dð �}‰}‹×*Ñ*¨5Ó1Ð1r6   )ÚreturnzDeferred[object])rs   rt   ru   rù  rú  r-   r,   r#   r�	  r–	  rž	  r¢	  r¦	  r¬	  r°	  r´	  r¼	  r1   r6   r4   r€	  r€	  ¿  sY   „ ð €IØ€IÙÙ$Ó&ˆ	ÙÙ$Ó&ˆ	òKò'òRò$8ò*	ó
òò:ò:Fó.2r6   r€	  c                  ó   — e Zd ZdZdZdZd„ Zy)ÚSlowMailboxrÉ   Nc                ó²   — t        j                  «       }| j                  | j                  |j                  d«       | j
                  j	                  d «       |S )Nr1   )r   r   Ú	callLaterÚhowSlowræ  ÚfetchDeferred)rE   r  rª  rž   s       r4   r�  zSlowMailbox.fetch   s?   € Ü�N‰NÓˆØ�‰�t—|‘| Q§Z¡Z°Ô4Ø×Ñ×#Ñ# DÔ)Øˆr6   )rs   rt   ru   rÂ	  rÁ	  rÃ	  r�  r1   r6   r4   r¿	  r¿	  ™  s   „ Ø€GØ€IØ€Mór6   r¿	  c                  ó0   — e Zd Zd„ Zd„ Zd„ Zd„ Zd„ Zd„ Zy)ÚTimeoutTestsc                ó„  ‡ ‡‡— t        «       Šd‰ j                  _        d‰ j                  _        ‰j
                  ‰ j                  _        d‰ _        ˆˆ ˆfd„}ˆ fd„Š‰ j                  j                  t        |«      «      }|j                  ‰ j                  «       t        j                  |‰ j                  «       g«      S )z{
        The *client* has a timeout mechanism which will close connections that
        are inactive for a period.
        TrÊ   Nc                 ó„   •— ‰j                   j                  dd«      } ‰j                  d«       | j                  ‰«       | S )NrÊ  rÎ  rÊ   )rþ  rH  Úadvancer'  )rž   r”   rE   ÚtimedOuts    €€€r4   rH  z.TimeoutTests.test_serverTimeout.<locals>.login³  s6   ø€ Ø—‘×!Ñ! +Ð/?Ó@ˆAØ�I‰I�aŒLØ�L‰L˜Ô"ØˆHr6   c                óh   •— ‰j                  d «        | j                  t        j                  «       y r0   )r  r  r   ÚTimeoutErrorrÔ  s    €r4   rÉ	  z1TimeoutTests.test_serverTimeout.<locals>.timedOut¹  s%   ø€ Ø×Ñ˜tÔ$ØˆG�L‰Lœ×+Ñ+Õ,r6   )r   rý  rÕ  rþ  r¾  rÁ	  r§  rÿ  r›   r7   r'  r
  r   r(  r#   )rE   rH  rž   r”   rÉ	  s   `  @@r4   Útest_serverTimeoutzTimeoutTests.test_serverTimeout¨  sŒ   ú€ ô
 ‹GˆØ"&ˆ�‰ÔØˆ�‰ÔØ !§¡ˆ�‰ÔØ ˆÔö	ô	-ð �N‰N×&Ñ&¤u¨U£|Ó4ˆØ	�‰�T—_‘_Ô%Ü×"Ñ" A t§}¡}£Ð#7Ó8Ð8r6   c                ó,  ‡ ‡— t        «       Š‰j                  ‰ j                  _        ˆ fd„}ˆˆ fd„}‰ j                  j	                  t        |«      «      }|j	                  t        |«      «       t        j                  |‰ j                  «       g«      S )z4
        The server times out a connection.
        c                 ó<   •— ‰ j                   j                  dd«      S rG  rz  rR   s   €r4   rH  z/TimeoutTests.test_serverTimesOut.<locals>.loginÈ  r{  r6   c                 óV   •— ‰ j                  ‰j                  j                  dz  «       y ©NrÉ   ©rÈ	  rý  ÚPOSTAUTH_TIMEOUT©r”   rE   s   €€r4   Ú
expireTimez4TimeoutTests.test_serverTimesOut.<locals>.expireTimeË  ó   ø€ Ø�I‰I�d—k‘k×2Ñ2°QÑ6Õ7r6   )	r   rÁ	  rý  rÿ  r›   r7   r   r(  r#   )rE   rH  rÔ	  rž   r”   s   `   @r4   Útest_serverTimesOutz TimeoutTests.test_serverTimesOutÁ  sp   ù€ ô ‹GˆØ !§¡ˆ�‰Ôô	Dõ	8ð �N‰N×&Ñ&¤u¨U£|Ó4ˆØ	�‰”e˜JÓ'Ô(ô
 ×"Ñ" A t§}¡}£Ð#7Ó8Ð8r6   c                óô  ‡ ‡‡— ‰ j                  t        j                  dt        «       t        j                  j	                  d«       t        j                  j
                  d   Š‰ j                  t        j                  ‰«      «       t        «       Š‰j                  ‰ j                  _
        ˆ fd„}ˆ fd„}ˆˆ fd„}ˆˆ fd„}ˆ fd„}‰ j                  j                  t        |«      «      }|j                  t        |«      «       |j                  t        |«      «       |j                  t        |«      «       |j                  t        |«      «       t        j                   |‰ j#                  «       g«      S )	z^
        The server unsets the selected mailbox when timing out a
        connection.
        r½  úmailbox-testúMAILBOX-TESTc                 ó<   •— ‰ j                   j                  dd«      S rG  rz  rR   s   €r4   rH  z7TimeoutTests.test_serverUnselectsMailbox.<locals>.loginã  r{  r6   c                 ó:   •— ‰ j                   j                  d«      S ©NrØ	  r°  rR   s   €r4   rÃ  z8TimeoutTests.test_serverUnselectsMailbox.<locals>.selectæ  r±  r6   c                 óR   •— ‰j                  ‰ ‰j                  j                  «       y r0   )r  rý  r^  ©r^  rE   s   €€r4   Ú	assertSetz;TimeoutTests.test_serverUnselectsMailbox.<locals>.assertSeté  s   ø€ Ø�M‰M˜$ §¡× 0Ñ 0Õ1r6   c                 óV   •— ‰ j                  ‰j                  j                  dz  «       y rÐ	  rÑ	  rÓ	  s   €€r4   rÔ	  z<TimeoutTests.test_serverUnselectsMailbox.<locals>.expireTimeì  rÕ	  r6   c                 óP   •— ‰ j                  ‰ j                  j                  «       y r0   )rT  rý  r^  rR   s   €r4   ÚassertUnsetz=TimeoutTests.test_serverUnselectsMailbox.<locals>.assertUnsetï  s   ø€ Ø×Ñ˜TŸ[™[×-Ñ-Õ.r6   )r¤  rÉ  rÝ  r§  rª  r½  rT  r"   rš	  r   rÁ	  rý  rÿ  r›   r7   r   r(  r#   )	rE   rH  rÃ  rß	  rÔ	  râ	  rž   r”   r^  s	   `      @@r4   Útest_serverUnselectsMailboxz(TimeoutTests.test_serverUnselectsMailboxÖ  s  ú€ ð
 	�
‰
”<×*Ñ*Ð,<Ô>PÔQÜ×Ñ×*Ñ*¨>Ô:Ü×&Ñ&×0Ñ0°Ñ@ˆØ×ÑÔ.×9Ñ9¸$Ó?Ô@ä‹GˆØ !§¡ˆ�‰Ôô	Dô	6õ	2õ	8ô	/ð �N‰N×&Ñ&¤u¨U£|Ó4ˆØ	�‰”e˜F“mÔ$Ø	�‰”e˜IÓ&Ô'Ø	�‰”e˜JÓ'Ô(Ø	�‰”e˜KÓ(Ô)ô
 ×"Ñ" A t§}¡}£Ð#7Ó8Ð8r6   c                ó„  ‡ ‡‡— t         j                  j                  d«       t         j                  j                  d   Št	        t
        ‰«       t        «       Š‰j                  ‰ j                  _        ˆ fd„}ˆ fd„}ˆˆ fd„}ˆˆ fd„}ˆˆ fd„}‰ j                  j                  t        |«      «      }|j                  t        |«      «       |j                  t        |«      «       |j                  t        |«      «       |j                  t        |«      «       t        j                  |‰ j                  «       g«      S )zi
        The server closes the selected, closeable mailbox when timing
        out a connection.
        rØ	  rÙ	  c                 ó<   •— ‰ j                   j                  dd«      S rG  rz  rR   s   €r4   rH  z?TimeoutTests.test_serverTimesOutAndClosesMailbox.<locals>.login	  r{  r6   c                 ó:   •— ‰ j                   j                  d«      S rÜ	  r°  rR   s   €r4   rÃ  z@TimeoutTests.test_serverTimesOutAndClosesMailbox.<locals>.select  r±  r6   c                 ó<   •— ‰j                  ‰ j                  «       y r0   )rT  r™  rÞ	  s   €€r4   ÚassertMailboxOpenzKTimeoutTests.test_serverTimesOutAndClosesMailbox.<locals>.assertMailboxOpen  s   ø€ Ø×Ñ˜TŸ[™[Õ)r6   c                 óV   •— ‰ j                  ‰j                  j                  dz  «       y rÐ	  rÑ	  rÓ	  s   €€r4   rÔ	  zDTimeoutTests.test_serverTimesOutAndClosesMailbox.<locals>.expireTime  rÕ	  r6   c                 ó<   •— ‰j                  ‰ j                  «       y r0   )rV  r™  rÞ	  s   €€r4   ÚassertMailboxClosedzMTimeoutTests.test_serverTimesOutAndClosesMailbox.<locals>.assertMailboxClosed  s   ø€ Ø�O‰O˜DŸK™KÕ(r6   )rÉ  rÝ  rª  r½  r   r"   r   rÁ	  rý  rÿ  r›   r7   r   r(  r#   )	rE   rH  rÃ  rè	  rÔ	  rë	  rž   r”   r^  s	   `      @@r4   Ú#test_serverTimesOutAndClosesMailboxz0TimeoutTests.test_serverTimesOutAndClosesMailboxý  sè   ú€ ô
 	×Ñ×*Ñ*¨>Ô:Ü×&Ñ&×0Ñ0°Ñ@ˆÜÔ*¨DÔ1ä‹GˆØ !§¡ˆ�‰Ôô	Dô	6õ	*õ	8õ	)ð �N‰N×&Ñ&¤u¨U£|Ó4ˆØ	�‰”e˜F“mÔ$Ø	�‰”eÐ-Ó.Ô/Ø	�‰”e˜JÓ'Ô(Ø	�‰”eÐ/Ó0Ô1ô
 ×"Ñ" A t§}¡}£Ð#7Ó8Ð8r6   c                óh  ‡ ‡— t        «       Š‰j                  t        _        t        j                  «       t        _        ‰j                  ‰ j                  _        t        t        j                  _	        t        j                  j                  d«       ‰ j                  j                  d«       ˆ fd„}ˆ fd„}ˆ fd„}ˆ fd„}ˆfd„}t        j
                  j                  |«       ‰ j                  j                  t        |«      «      }|j                  t        |«      «       |j                  t        |«      «       |j                  t        |«      «       |j                  ‰ j                  «       |j!                  ‰ j"                  «       t        j$                  |‰ j'                  «       g«      }|S )zM
        The connection timeout does not take effect during fetches.
        rØ	  rÅ   c                 ó<   •— ‰ j                   j                  dd«      S rG  rz  rR   s   €r4   rH  z7TimeoutTests.test_longFetchDoesntTimeout.<locals>.login0  r{  r6   c                 óp   •— ‰ j                   j                  d«       ‰ j                  j                  d«      S )NrÅ   rØ	  )rý  Ú
setTimeoutrþ  rÃ  rR   s   €r4   rÃ  z8TimeoutTests.test_longFetchDoesntTimeout.<locals>.select3  s*   ø€ Ø�K‰K×"Ñ" 1Ô%Ø—;‘;×%Ñ% nÓ5Ð5r6   c                 ó:   •— ‰ j                   j                  d«      S )Nrá   r^  rR   s   €r4   r�  z7TimeoutTests.test_longFetchDoesntTimeout.<locals>.fetch7  s   ø€ Ø—;‘;×'Ñ'¨Ó.Ð.r6   c                 óR   •— ‰ j                  ‰ j                  j                  d«       y )Nr¾  )rÏ   rý  rR  rR   s   €r4   ÚstillConnectedz@TimeoutTests.test_longFetchDoesntTimeout.<locals>.stillConnected:  s   ø€ Ø×Ñ §¡× 1Ñ 1°9Õ=r6   c                óH   •— t        d«      D ]  }‰j                  d«       Œ y )NrË   g      à?)rn   rÈ	  )rT  ré   r”   s     €r4   Ú	cbAdvancez;TimeoutTests.test_longFetchDoesntTimeout.<locals>.cbAdvance=  s!   ø€ Ü˜1“Xò �Ø—	‘	˜#•ñr6   )r   rÁ	  r¿	  r   r   rÃ	  rý  rÉ  rÝ  r½  rª  rð	  r›   rÿ  r7   r  r'  r
  r(  r#   )	rE   rH  rÃ  r�  ró	  rõ	  r)  rž   r”   s	   `       @r4   Útest_longFetchDoesntTimeoutz(TimeoutTests.test_longFetchDoesntTimeout#  s&  ù€ ô ‹GˆØ !§¡ŒÔÜ$)§N¡NÓ$4ŒÔ!Ø !§¡ˆ�‰ÔÜ1<Œ×ÑÔ.Ü×Ñ×*Ñ*¨>Ô:à�‰×Ñ˜qÔ!ô	Dô	6ô	/ô	>ô	ô 	×!Ñ!×-Ñ-¨iÔ8à�^‰^×'Ñ'¬¨e«Ó5ˆØ
�‰”u˜V“}Ô%Ø
�‰”u˜U“|Ô$Ø
�‰”u˜^Ó,Ô-Ø
�‰�t×)Ñ)Ô*Ø
�‰�d—o‘oÔ&Ü×Ñ  T§]¡]£_Ð 5Ó6ˆØˆr6   c                ó  ‡‡— t        «       }t        «       }| j                  |_        |j                  | j                  _        | j                  j                  |«       g Š| j                  j                  Šˆˆfd„| j                  _        |j                  dg| j                  j                  dz  gdz  z   «       | j                  ‰‰«       |j                  d| j                  j                  dz  g«       | j                  ‰«       y)z{
        The *server* has a timeout mechanism which will close connections that
        are inactive for a period.
        c                ó<   •— ‰j                  d «       ‰| «      fd   S rs  )r|   )ÚreasonÚconnLostÚlosts    €€r4   r5   z<TimeoutTests.test_idleClientDoesDisconnect.<locals>.<lambda>[  s(   ø€ Ø�K‰K˜ÓÙ�VÓð5
ð ñ5€ r6   g        g      @rÉ   g       @N)r   r   rý  rk  rÁ	  r¾  rÂ  ÚpumpÚtimeOutrT  rV  )rE   r”   rì  rú	  rû	  s      @@r4   Útest_idleClientDoesDisconnectz*TimeoutTests.test_idleClientDoesDisconnectL  sÐ   ù€ ô
 ‹Gˆä4Ó6ˆ	Ø!Ÿ[™[ˆ	ÔØ !§¡ˆ�‰ÔØ�‰×"Ñ" 9Ô-ð ˆØ—;‘;×-Ñ-ˆô&ˆ�‰Ô"ð 	
�‰�ˆu˜Ÿ™×+Ñ+¨cÑ1Ð2°QÑ6Ñ6Ô7Ø×Ñ˜˜tÔ$ð 	
�‰��T—[‘[×(Ñ(¨3Ñ.Ð/Ô0Ø�‰˜Õr6   N)	rs   rt   ru   rÌ	  rÖ	  rã	  rì	  rö	  rþ	  r1   r6   r4   rÅ	  rÅ	  §  s#   „ ò9ò29ò*%9òN$9òL'óRr6   rÅ	  c                  ó   — e Zd Zd„ Zy)ÚDisconnectionTestsc                ó  — t        j                  «       }t        «       }|j                  |«       | j	                  |j                  dd«      t        j                  «      }|j                  t        j                  d«      «       |S )NrÊ  zexample.comúConnection closed)	r   rá  r   r¾  r×  rH  r   rÃ  rÂ  )rE   r”   Útrž   s       r4   Ú"testClientDisconnectFailsDeferredsz5DisconnectionTests.testClientDisconnectFailsDeferredsj  sm   € Ü×ÑÓˆÜ,Ó.ˆØ	×Ñ˜ÔØ×ÑØ�G‰G�K Ó/´×1EÑ1Eó
ˆð 	
×Ñœ×-Ñ-Ð.AÓBÔCØˆr6   N)rs   rt   ru   r
  r1   r6   r4   r 
  r 
  i  s   „ ór6   r 
  c                  ó   — e Zd ZdZd„ Zd„ Zy)ÚSynchronousMailboxzb
    Trivial, in-memory mailbox implementation which can produce a message
    synchronously.
    c                ó   — || _         y r0   r  )rE   r  s     r4   rz   zSynchronousMailbox.__init__{  s	   € Ø ˆ�r6   c              #  óX   K  — |rJ d«       ‚|D ]  }|| j                   |dz
     f–— Œ y ­w)NzCannot handle uid requests.rÅ   r  )rE   r`  rª  r�   s       r4   r�  zSynchronousMailbox.fetch~  s;   è ø€ ÙÐ5Ð5Ó5ˆwØò 	.ˆCØ�t—}‘} S¨1¡WÑ-Ð-Ó-ñ	.ùs   ‚(*N)rs   rt   ru   r3  rz   r�  r1   r6   r4   r
  r
  u  s   „ ñò
!ó.r6   r
  c            
      ó†   — e Zd ZdZ ei g dddd«       ei g dddd«       ei g dddd«      gZd„ Zd„ Zd	„ fd
„Zd„ Z	d„ Z
d„ Zy)ÚPipeliningTestszM
    Tests for various aspects of the IMAP4 server's pipelining support.
    r6   r:  Nr=  ó   2c                óh  — g | _         t        «       | _        t        j                  d d | j
                  «      | _        | j                  j                  | j                  «       t        | j                  «      }d| j                  _
        || j                  _        | j                  j                  «        y rÙ  )Ú	iteratorsr   rì  r   rÏ  ÚiterateInReactorrý  r¾  r
  r  rR  r^  r¿  )rE   rW  s     r4   r  zPipeliningTests.setUp�  s   € ØˆŒä(Ó*ˆŒÜ×'Ñ'¨¨d°D×4IÑ4IÓJˆŒØ�‰×"Ñ" 4§>¡>Ô2ä$ T§]¡]Ó3ˆð %ˆ�‰ÔØ"ˆ�‰Ôð 	�‰×ÑÕr6   c                óh   — t        j                  «       }| j                  j                  ||f«       |S )zÈ
        A fake L{imap4.iterateInReactor} that records the iterators it
        receives.

        @param iterator: An iterator.

        @return: A L{Deferred} associated with this iterator.
        )r   r   r
  r|   )rE   Úiteratorrž   s      r4   r
  z PipeliningTests.iterateInReactorŸ  s+   € ô �N‰NÓˆØ�‰×Ñ˜x¨˜mÔ,Øˆr6   c                  ó   — yr˜  r1   r1   r6   r4   r5   zPipeliningTests.<lambda>¬  rh  r6   c                ó„  — | j                   r´ |«       r¬| j                   d   d   D ]T  }| j                  j                  sŒ| j                  j                  j                  «        | j                  j                  rŒ;ŒV | j                   j	                  d«      d   j                  d«       | j                   r	 |«       rŒªyyyy)a†  
        Advance pending iterators enqueued with L{iterateInReactor} in
        a round-robin fashion, resuming the transport's producer until
        it has completed.  This ensures bodies are flushed.

        @param asLongAs: (optional) An optional predicate function.
            Flushing iterators continues as long as there are
            iterators and this returns L{True}.
        r   rÅ   N)r
  rì  Úproducerr~   rT  ræ  )rE   ÚasLongAsÚes      r4   ÚflushPendingzPipeliningTests.flushPending¬  s•   € ð �nŠn¡¤Ø—^‘^ AÑ& qÑ)ò 8�Ø—n‘n×-Ó-Ø—N‘N×+Ñ+×;Ñ;Ô=ð —n‘n×-Ô-ð8ð —‘×"Ñ" 1Ó% aÑ(×1Ñ1°$Ô7ð �nŠn¡¦ˆn ˆnr6   c                ó„   — | j                   j                  t        j                  t	        j
                  «       «      «       y r0   rÁ  rR   s    r4   r  zPipeliningTests.tearDown½  rÄ  r6   c                óL  — | j                   j                  d«       | j                  «        | j                  | j                  j                  «       dj                  dt        dt        | j                  d   j                  «       j                  «       «      ›�«      dt        dt        | j                  d   j                  «       j                  «       «      ›�«      d	t        d
t        | j                  d   j                  «       j                  «       «      ›�«      g«      «       y)z€
        Test that pipelined FETCH commands which can be responded to
        synchronously are responded to correctly.
        s9   01 FETCH 1 BODY[]
02 FETCH 2 BODY[]
03 FETCH 3 BODY[]
r6   ó   * 1 FETCH (BODY[] )
ú 01 OK FETCH completed
{5}


r   ó   * 2 FETCH (BODY[] )
z 02 OK FETCH completed
{5}


rÅ   s   * 3 FETCH (BODY[] )
z 03 OK FETCH completed
{5}


rÉ   N)rý  r¨  r
  rB   rì  r  r’   r)   r(   r  rÌ  rW   rR   s    r4   Útest_synchronousFetchz%PipeliningTests.test_synchronousFetchÀ  sö   € ð 	�‰× Ñ ØVô	
ð 	×ÑÔà×ÑØ�N‰N× Ñ Ó"Ø�H‰Hà.Ý!ä'¨¯©°aÑ(8×(DÑ(DÓ(F×(KÑ(KÓ(MÔNðQóð /Ý!ä'¨¯©°aÑ(8×(DÑ(DÓ(F×(KÑ(KÓ(MÔNðQóð /Ý!ä'¨¯©°aÑ(8×(DÑ(DÓ(F×(KÑ(KÓ(MÔNðQóðóõ	
r6   c                ól  — | j                   j                  d«       t        j                  t        t        g d¢«      «      }| j                  |¬«       | j                  | j                  j                  «       dj                  dt        dt        | j                  d   j                  «       j                  «       «      ›�«      g«      «       | j                  j!                  «        | j                   j#                  d¬	«       | j%                  | j                  j                  «       «       | j                  «        | j                  | j                  j                  «       dj                  d
dt        dt        | j                  d   j                  «       j                  «       «      ›�«      g«      «       y)zž
        When a server status change occurs during an ongoing FETCH
        command, the server status is buffered until the FETCH
        completes.
        s   01 FETCH 1,2 BODY[]
)TTF)r
  r6   r
  z	{5}


r   T)rî  r
  s   * [READ-WRITE]
r
  rÅ   N)rý  r¨  Ú	functoolsÚpartialÚnextrS  r
  rB   rì  r  r’   r)   r(   r  rÌ  rW   r¿  rê  rT  )rE   Útwices     r4   Útest_bufferedServerStatusz)PipeliningTests.test_bufferedServerStatusã  sa  € ð 	�‰× Ñ Ð!;Ô<ô ×!Ñ!¤$¬Ò-@Ó(AÓBˆØ×Ñ 5ÐÔ)à×ÑØ�N‰N× Ñ Ó"Ø�H‰Hð /å!ä'¨¯©°aÑ(8×(DÑ(DÓ(F×(KÑ(KÓ(MÔNðQóð	ó
ô	
ð 	�‰×ÑÔð 	�‰×Ñ¨$ÐÔ/ð 	×Ñ˜Ÿ™×-Ñ-Ó/Ô0à×ÑÔà×ÑØ�N‰N× Ñ Ó"Ø�H‰Hð /à)å!ä'¨¯©°aÑ(8×(DÑ(DÓ(F×(KÑ(KÓ(MÔNðQóð
óõ	
r6   )rs   rt   ru   r3  r˜   r  r  r
  r
  r  r
  r"
  r1   r6   r4   r

  r

  „  sk   „ ññ
 	�R˜˜S $¨¨dÓ3Ù�R˜˜S $¨¨dÓ3Ù�R˜˜S $¨¨dÓ3ð€Hòò ñ %1ó 8ò"Lò!
óF5
r6   r

  c                  ó   — e Zd ZdZd„ Zd„ Zy)ÚIMAP4ServerFetchTestszV
    This test case is for the FETCH tests that require
    a C{StringTransport}.
    c                óÀ   — t        «       | _        t        j                  «       | _        d| j                  _        | j                  j                  | j                  «       y rÙ  )r   rì  r   rÏ  rý  rR  r¾  rR   s    r4   r  zIMAP4ServerFetchTests.setUp!  s>   € Ü(Ó*ˆŒÜ×'Ñ'Ó)ˆŒØ$ˆ�‰ÔØ�‰×"Ñ" 4§>¡>Õ2r6   c                óV  — | j                   j                  «        | j                  j                  d«       d}| j	                  | j                   j                  «       |«       | j                   j                  «        | j                  j                  t        j                  d«      «       y)a  
        If by any chance, extra bytes got appended at the end of a valid
        FETCH arguments, the client should get a BAD - arguments invalid
        response.

        See U{RFC 3501<http://tools.ietf.org/html/rfc3501#section-6.4.5>},
        section 6.4.5,
        s   0001 FETCH 1 FULLL
s+   0001 BAD Illegal syntax: Invalid Argument
r
  N)	rì  r¿  rý  r¨  rB   r  rÂ  r   rÃ  )rE   rh  s     r4   Ú"test_fetchWithPartialValidArgumentz8IMAP4ServerFetchTests.test_fetchWithPartialValidArgument'  sw   € ð 	�‰×ÑÔà�‰× Ñ Ð!:Ô;ØCˆØ×Ñ˜Ÿ™×-Ñ-Ó/°Ô:Ø�‰×ÑÔØ�‰×"Ñ"¤5×#7Ñ#7Ð8KÓ#LÕMr6   N)rs   rt   ru   r3  r  r'
  r1   r6   r4   r$
  r$
    s   „ ñò
3óNr6   r$
  c                  ó.   — e Zd ZdZd„ Zd„ Zd„ Zd„ Zd„ Zy)ÚLiteralTestsMixinz‹
    Shared tests for literal classes.

    @ivar literalFactory: A callable that returns instances of the
        literal under test.
    c                ó6   — t        j                  «       | _        y)z
        Shared setup.
        N)r   r   râ  rR   s    r4   r  zLiteralTestsMixin.setUpB  s   € ô Ÿ™Ó(ˆ�r6   c                ó´   — | j                  d| j                  «      }| j                  d|j                  d«      «       | j	                  | j                  «       y)ze
        The literal returns L{None} when given less data than the
        literal requires.
        rG	  Ns
   incomplete)ÚliteralFactoryrâ  r  r\   ÚassertNoResult)rE   Úliterals     r4   Útest_partialWritez#LiteralTestsMixin.test_partialWriteH  sC   € ð
 ×%Ñ% d¨D¯M©MÓ:ˆØ�‰�d˜GŸM™M¨-Ó8Ô9Ø×Ñ˜DŸM™MÕ*r6   c                óø   — d}| j                  t        |«      | j                  «      }|j                  |«      }| j	                  |t
        «       | j                  |«       | j                  | j                  «       y)zz
        The literal returns an empty L{bytes} instance when given
        exactly the data the literal requires.
        ó   completeN)r,
  rÐ   râ  r\   r×  rL   rT  r-
  ©rE   Údatar.
  Úleftovers       r4   Útest_exactWritez!LiteralTestsMixin.test_exactWriteQ  sa   € ð
 ˆØ×%Ñ%¤c¨$£i°·±Ó?ˆØ—=‘= Ó&ˆà×Ñ˜h¬Ô.Ø×Ñ˜Ô"Ø×Ñ˜DŸM™MÕ*r6   c                ó˜   — d}| j                  t        d«      | j                  «      }|j                  |«      }| j	                  |d«       y)zt
        The literal returns any left over L{bytes} when given more
        data than the literal requires.
        s   completeleftoverr1
  ó   leftoverN)r,
  rÐ   râ  r\   rB   r2
  s       r4   Útest_overlongWritez$LiteralTestsMixin.test_overlongWrite^  sB   € ð
 #ˆØ×%Ñ%¤c¨+Ó&6¸¿¹ÓFˆà—=‘= Ó&ˆà×Ñ˜ ;Õ/r6   c                ó†   — | j                  d| j                  «      }d}|j                  |«      }| j                  ||«       y)zo
        The literal returns an empty L{bytes} instance
        when given an empty L{bytes} instance.
        r   r7
  N)r,
  râ  r\   rB   )rE   r.
  r3
  r4
  s       r4   Útest_emptyLiteralz#LiteralTestsMixin.test_emptyLiteralj  s=   € ð
 ×%Ñ% a¨¯©Ó7ˆØˆà—=‘= Ó&ˆà×Ñ˜ 4Õ(r6   N)	rs   rt   ru   r3  r  r/
  r5
  r8
  r:
  r1   r6   r4   r)
  r)
  :  s    „ ñò)ò+ò+ò
0ó
)r6   r)
  c                  ó.   — e Zd ZdZej
                  Zd„ Zy)ÚLiteralStringTestsz+
    Tests for L{self.literalFactory}.
    c                ó   — d}d}t        j                  t        |«      | j                  «      }t	        |«      D ]  }|j                  |«       Œ |j                  d«       | j                  | j                  «      }| j                  |||f«       y)zÙ
        Calling L{imap4.LiteralString.callback} with a line fires the
        instance's L{Deferred} with a 2-L{tuple} whose first element
        is the collected data and whose second is the provided line.
        ó   datar7  N)	r   ÚLiteralStringrÐ   râ  r'   r\   ræ  rê  rB   )rE   r3
  Úextrar.
  r”   r2   s         r4   Útest_callbackz LiteralStringTests.test_callback~  s   € ð ˆØˆä×%Ñ%¤c¨$£i°·±Ó?ˆä˜4“ò 	ˆAØ�M‰M˜!Õð	ð 	×Ñ˜Ô"à×%Ñ% d§m¡mÓ4ˆØ×Ñ˜ $¨ Õ/r6   N)rs   rt   ru   r3  r   r?
  r,
  rA
  r1   r6   r4   r<
  r<
  w  s   „ ñð ×(Ñ(€Nó0r6   r<
  c                  ó4   — e Zd ZdZej
                  Zd„ Zd„ Zy)ÚLiteralFileTestsz)
    Tests for L{imap4.LiteralFile}.
    c                óx  — d}d}t        j                  t        |«      | j                  «      }t	        |«      D ]  }|j                  |«       Œ |j                  d«       | j                  | j                  «      }| j                  t        |«      d«       |\  }}| j                  |j                  «       d«       y)zÍ
        Calling L{imap4.LiteralFile.callback} with a line fires the
        instance's L{Deferred} with a 2-L{tuple} whose first element
        is the file and whose second is the provided line.
        r>
  r7  rÉ   N)
r   ÚLiteralFilerÐ   râ  r'   r\   ræ  rê  rB   rW   ©rE   r3
  r@
  r.
  r”   r2   ÚdataFiles          r4   rA
  zLiteralFileTests.test_callback™  sž   € ð ˆØˆä×#Ñ#¤C¨£I¨t¯}©}Ó=ˆä˜4“ò 	ˆAØ�M‰M˜!Õð	ð 	×Ñ˜Ô"à×%Ñ% d§m¡mÓ4ˆØ×Ñœ˜V› aÔ(à ‰ˆ�%Ø×Ñ˜Ÿ™›¨'Õ2r6   c                óº  — d}d}| j                  t        j                  dd«       t        j                  t        |«      | j                  «      }t        |«      D ]  }|j                  |«       Œ |j                  d«       | j                  | j                  «      }| j                  t        |«      d«       |\  }}| j                  |j                  «       d«       y)a=  
        A L{imap4.LiteralFile} whose size exceeds the maximum
        in-memory size spools its content to disk, and invoking its
        L{callback} with a line fires the instance's L{Deferred} with
        a 2-L{tuple} whose first element is the spooled file and whose second
        is the provided line.
        r>
  r7  Ú_memoryFileLimitrÅ   rÉ   N)r¤  r   rE
  rÐ   râ  r'   r\   ræ  rê  rB   rW   rF
  s          r4   Útest_callbackSpooledToDiskz+LiteralFileTests.test_callbackSpooledToDisk¯  sµ   € ð ˆØˆà�
‰
”5×$Ñ$Ð&8¸!Ô<ä×#Ñ#¤C¨£I¨t¯}©}Ó=ˆä˜4“ò 	ˆAØ�M‰M˜!Õð	ð 	×Ñ˜Ô"à×%Ñ% d§m¡mÓ4ˆØ×Ñœ˜V› aÔ(à ‰ˆ�%Ø×Ñ˜Ÿ™›¨'Õ2r6   N)	rs   rt   ru   r3  r   rE
  r,
  rA
  rJ
  r1   r6   r4   rC
  rC
  ’  s   „ ñð ×&Ñ&€Nò3ó,3r6   rC
  c                  ó4   — e Zd ZdZd„ Zd„ Zd„ Zd„ Zd„ Zd„ Z	y)	ÚWriteBufferTestsz)
    Tests for L{imap4.WriteBuffer}.
    c                ó"   — t        «       | _        y r0   )r   rì  rR   s    r4   r  zWriteBufferTests.setUpÏ  s   € Ü(Ó*ˆ�r6   c                óÔ   — t        j                  | j                  «      }d|j                  z  }|j	                  |«       | j                  | j                  j                  «       «       y)zd
        L{imap4.WriteBuffer} buffers writes that are smaller than its
        buffer size.
        ó   xN)r   ÚWriteBufferrì  Ú
bufferSizer\   rT  r  ©rE   Úbufr3
  s      r4   r/
  z"WriteBufferTests.test_partialWriteÒ  sL   € ô
 ×Ñ §¡Ó/ˆØ�c—n‘nÑ$ˆà�	‰	�$Œà×Ñ˜Ÿ™×-Ñ-Ó/Õ0r6   c                óÜ   — t        j                  | j                  «      }d|j                  dz   z  }|j	                  |«       | j                  | j                  j                  «       |«       y)z‰
        L{imap4.WriteBuffer} writes data without buffering it when
        the size of the data exceeds the size of its buffer.
        rO
  rÅ   N)r   rP
  rì  rQ
  r\   rB   r  rR
  s      r4   r8
  z#WriteBufferTests.test_overlongWriteÞ  sS   € ô
 ×Ñ §¡Ó/ˆØ�s—~‘~¨Ñ)Ñ*ˆà�	‰	�$Œà×Ñ˜Ÿ™×-Ñ-Ó/°Õ6r6   c                óT  — t        j                  | j                  «      }d|j                  z  }d}|j	                  |«       | j                  | j                  j                  «       «       |j	                  |«       | j                  | j                  j                  «       ||z   «       y)zp
        L{imap4.WriteBuffer} buffers writes until its buffer's size
        exceeds its maximum value.
        rO
  ó   yN)r   rP
  rì  rQ
  r\   rT  r  rB   )rE   rS
  Ú	firstDataÚ
secondDatas       r4   Útest_writesImplyFlushz&WriteBufferTests.test_writesImplyFlushê  s€   € ô
 ×Ñ §¡Ó/ˆØ˜3Ÿ>™>Ñ)ˆ	Øˆ
à�	‰	�)Ôà×Ñ˜Ÿ™×-Ñ-Ó/Ô0à�	‰	�*Ôà×Ñ˜Ÿ™×-Ñ-Ó/°¸ZÑ1GÕHr6   c                óH  — t        j                  | j                  «      }d|j                  z  }|j	                  |«       | j                  | j                  j                  «       «       |j                  «        | j                  | j                  j                  «       |«       y)z{
        L{imap4.WriteBuffer.flush} flushes the buffer even when its
        size is smaller than the buffer size.
        rO
  N)	r   rP
  rì  rQ
  r\   rT  r  ÚflushrB   rR
  s      r4   Útest_explicitFlushz#WriteBufferTests.test_explicitFlushû  sr   € ô
 ×Ñ §¡Ó/ˆØ�s—~‘~Ñ&ˆà�	‰	�$Œà×Ñ˜Ÿ™×-Ñ-Ó/Ô0à�	‰	Œà×Ñ˜Ÿ™×-Ñ-Ó/°Õ6r6   c                ó´   — t        j                  | j                  «      }|j                  «        | j	                  | j                  j                  «       «       y)z_
        L{imap4.WriteBuffer.flush} has no effect if when the buffer is
        empty.
        N)r   rP
  rì  r[
  rT  r  )rE   rS
  s     r4   Útest_explicitFlushEmptyBufferz.WriteBufferTests.test_explicitFlushEmptyBuffer  s<   € ô
 ×Ñ §¡Ó/ˆà�	‰	Œà×Ñ˜Ÿ™×-Ñ-Ó/Õ0r6   N)
rs   rt   ru   r3  r  r/
  r8
  rY
  r\
  r^
  r1   r6   r4   rL
  rL
  Ê  s&   „ ñò+ò
1ò
7òIò"7ó 	1r6   rL
  )Žr3  Ú
__future__r   r©  rU   r
  r{  rŒ  rº   Úcollectionsr   Úior   Ú	itertoolsr   Útypingr   r	   Úunittestr
   Úzope.interfacer   Úzope.interface.verifyr   r   Útwisted.cred.checkersr   Útwisted.cred.credentialsr   r   r   Útwisted.cred.errorr   Útwisted.cred.portalr   r   Útwisted.internetr   r   r   r   Útwisted.internet.deferr   Útwisted.internet.taskr   Útwisted.internet.testingr   r   Útwisted.mailr   Útwisted.mail.imap4r   Útwisted.mail.interfacesr    r!   r"   Útwisted.protocolsr#   Útwisted.pythonr$   r%   r&   Útwisted.python.compatr'   r(   r)   Útwisted.trial.unittestr*   r+   Útwisted.test.ssl_helpersr,   r-   ÚImportErrorr7   r9   rw   r…   rÃ   r5  ÚIMailboxInfoÚIMailboxÚICloseableMailboxrV  r§  ÚMemoryAccountWithoutNamespacesr»  rÂ  rÆ  rÏ  rÉ  rá  rß  rø  r  r¼  rO  rÐ  r…  r‘  r%  r0  ri  r�  r…  rÛ  rß  r  r  r  r  r+  ru  r   r¨  r»  ÚIMessageÚFancyStrMixinr˜   r×  rö  rN  r	  ÚISearchableMailboxr5	  r\	  ÚIMessageFilera	  ÚIMessageCopierrg	  rl	  ÚIReactorSSLr€	  r¿	  rÅ	  r 
  r
  r

  r$
  r)
  r<
  rC
  rL
  r1   r6   r4   ú<module>r‚
     s  ðñõ #ã Û Û Û Û 	Û Ý #Ý Ý ß !Ý å &ß ;å I÷ñ õ
 1ß .ß >Ó >Ý +Ý 'ß VÝ Ý )÷ñ õ
 'ß -Ñ -ß HÑ Hß @ðßKò#ôb;�Xô b;÷Jñ ô"d)Ð.ô d)ôNHVÐ)ô HVôV
q+�xô q+ñh ˆU×Ñ §¡°×1HÑ1HÓI÷Pð Pó JðPñf ˆU×Ñ §¡Ó0÷Tð Tó 1ðTôn˜u×CÑCô ô"Ð&¨×(;Ñ(;ô ô3�5×$Ñ$ô 3ô,(�5×$Ñ$ô (÷,.,ñ .,ôb_/Ð'¨ô _/ôDa2Ð1ô a2ôHdXÐ-¨xô dXñN ˆVÓ÷@ð @ó ð@÷:"ñ "ô"h4Ð)¨8ô h4ôV/
�Xô /
ôddTÐ/°ô dTôNL"˜Hô L"ô^
$˜×*Ñ*ô 
$ôLÐ'¨ô L÷^Bñ Bô6EIÐ1ô EIôPÐ1Ð3Fô ô(Ð0Ð2Eô ô*+=Ð5Ð7Jô +=ô\/=Ð4Ð6Iô /=ôd\
Ð3Ð5Hô \
ô~JTÐ3°Xô JTôZ,=Ð4Ð6Iô ,=ô^KSÐ2Ð4Gô KSô\�%×#Ñ#ô ñ ˆU�^‰^Óô$"�4×%Ñ%ó $"ó ð$"ôN?!�HÐ.ô ?!ôDa
˜Hô a
ôHK%�HÐ.ô K%ô\sÐ)¨8ô sñl ˆU×%Ñ%Ó&ôX˜HÐ&6ó Xó 'ðX÷v#ñ #ñ ˆU×ÑÓ ÷ ð  ó !ð ñ ˆU×!Ñ!Ó"÷ð ó #ðôN%�hô N%ñb ÐÐÐ3Ó4ÙÐ"ˆJ×"Ò" 7¨DÓ1Ð1Ð3PÓQôU2Ð ó U2ó Ró 5ðU2ôp�-ô ôÐ# Xô ôD	˜ô 	÷.ñ .ôT
�hô T
ônN˜Hô N÷>:)ñ :)ôz0Ð*Ð,?ô 0ô653Ð(¨(ô 53ôpJ1Ð*õ J1øðmt ò ØÐØÓðús   ÃQ Ñ	Q"Ñ!Q"