Ë
    oj//  ã                   óÞ   — d Z ddlZddlZddlZddlmZ ddlmZmZ ddl	m
Z
  G d„ d«      Z G d„ d	ee
j                  «      Z G d
„ dee
j                  «      Z G d„ de
j                  «      Zy)z'
Tests for L{twisted.python.zipstream}
é    N)Úmd5)ÚfilepathÚ	zipstream)Úunittestc                   óL   — 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)ÚFileEntryMixinz?
    File entry classes should behave as file-like objects
    c                 ó   — | j                  «       }t        j                  |d| j                  «      5 }|j	                  d|«       ddd«       t        j                  |d«      }|j                  d«      S # 1 sw Y   Œ0xY w)z6
        Return an appropriate zip file entry
        ÚwÚcontentNÚr)ÚmktempÚzipfileÚZipFileÚcompressionÚwritestrr   ÚChunkingZipFileÚreadfile)ÚselfÚcontentsÚfilenameÚzs       úD/usr/lib/python3/dist-packages/twisted/python/test/test_zipstream.pyÚgetFileEntryzFileEntryMixin.getFileEntry   sk   € ð —;‘;“=ˆÜ�_‰_˜X s¨D×,<Ñ,<Ó=ð 	,ÀØ�J‰J�y (Ô+÷	,ä×%Ñ% h°Ó4ˆØ�z‰z˜)Ó$Ð$÷	,ð 	,ús   ²A4Á4A=c                 óŽ   — | j                  d«      5 }| j                  |j                  «       «       ddd«       y# 1 sw Y   yxY w)zK
        zip files should not be ttys, so isatty() should be false
        Ú N)r   ÚassertFalseÚisatty©r   Ú	fileEntrys     r   Útest_isattyzFileEntryMixin.test_isatty    s@   € ð ×Ñ˜rÓ"ð 	1 iØ×Ñ˜Y×-Ñ-Ó/Ô0÷	1÷ 	1ñ 	1ús	   ’ ;»Ac                 ó¼   — | j                  d«      5 }| j                  |j                  «       ddd«       | j                  j                  «       y# 1 sw Y   Œ%xY w)zd
        The C{closed} attribute should reflect whether C{close()} has been
        called.
        r   N)r   r   ÚclosedÚ
assertTruer   s     r   Útest_closedzFileEntryMixin.test_closed'   sO   € ð
 ×Ñ˜rÓ"ð 	/ iØ×Ñ˜Y×-Ñ-Ô.÷	/à�‰˜	×(Ñ(Õ)÷	/ð 	/ús   ’AÁAc                 ó  — | j                  d«      5 }| j                  |j                  «       d«       | j                  |j                  «       d«       | j                  |j                  «       d«       ddd«       y# 1 sw Y   yxY w)zk
        C{readline()} should mirror L{file.readline} and return up to a single
        delimiter.
        s   hoho
hos   hoho
ó   hoó    N)r   ÚassertEqualÚreadliner   s     r   Útest_readlinezFileEntryMixin.test_readline0   st   € ð
 ×Ñ˜{Ó+ð 	8¨yØ×Ñ˜Y×/Ñ/Ó1°9Ô=Ø×Ñ˜Y×/Ñ/Ó1°5Ô9Ø×Ñ˜Y×/Ñ/Ó1°3Ô7÷	8÷ 	8ñ 	8úó   ’A!A<Á<Bc                 ó  — | j                  d«      5 }| j                  |j                  «       d«       | j                  |j                  «       d«       | j                  t        |j                  «       ddd«       y# 1 sw Y   yxY w)zV
        Zip file entries should implement the iterator protocol as files do.
        s   ho
hohoó   ho
s   hohoN)r   r(   ÚnextÚassertRaisesÚStopIterationr   s     r   Ú	test_nextzFileEntryMixin.test_next:   sk   € ð ×Ñ˜{Ó+ð 	=¨yØ×Ñ˜YŸ^™^Ó-¨wÔ7Ø×Ñ˜YŸ^™^Ó-¨wÔ7Ø×Ñœm¨Y¯^©^Ô<÷	=÷ 	=ñ 	=úr+   c                 ó”   — | j                  d«      5 }| j                  |j                  «       g d¢«       ddd«       y# 1 sw Y   yxY w)zG
        C{readlines()} should return a list of all the lines.
        s   ho
ho
ho)r-   r-   r&   N)r   r(   Ú	readlinesr   s     r   Útest_readlineszFileEntryMixin.test_readlinesC   sG   € ð ×Ñ˜}Ó-ð 	O°Ø×Ñ˜Y×0Ñ0Ó2Ò4MÔN÷	O÷ 	Oñ 	Oús	   ’#>¾Ac                 óÆ   — | j                  d«      5 }| j                  t        |«      |«       | j                  |j                  «       |«       ddd«       y# 1 sw Y   yxY w)zJ
        C{__iter__()} and C{xreadlines()} should return C{self}.
        r   N)r   ÚassertIsÚiterÚ
xreadlinesr   s     r   Útest_iterationzFileEntryMixin.test_iterationJ   sR   € ð ×Ñ˜rÓ"ð 	= iØ�M‰Mœ$˜y›/¨9Ô5Ø�M‰M˜)×.Ñ.Ó0°)Ô<÷	=÷ 	=ñ 	=ús   ’<AÁA c                 ó”   — d}| j                  |«      5 }| j                  |j                  «       |«       ddd«       y# 1 sw Y   yxY w)z9
        C{.read()} should read the entire file.
        s   Hello, world!N)r   r(   Úread©r   r   Úentrys      r   Útest_readWholezFileEntryMixin.test_readWholeR   sD   € ð $ˆØ×Ñ˜xÓ(ð 	5¨EØ×Ñ˜UŸZ™Z›\¨8Ô4÷	5÷ 	5ñ 	5ús	   ”!>¾Ac                 óà   — d}| j                  |«      5 }|j                  d«      }|j                  d«      }ddd«       | j                  d«       | j                  d«       y# 1 sw Y   Œ.xY w)zD
        C{.read(num)} should read num bytes from the file.
        Ú
0123456789é   éÈ   Ns   0123s   456789)r   r;   r(   )r   r   r=   ÚoneÚtwos        r   Útest_readPartialzFileEntryMixin.test_readPartialZ   sj   € ð  ˆØ×Ñ˜xÓ(ð 	"¨EØ—*‘*˜Q“-ˆCØ—*‘*˜S“/ˆC÷	"ð 	×Ñ˜˜gÔ&Ø×Ñ˜˜iÕ(÷		"ð 	"ús   ”#A$Á$A-c                 ó  — d}| j                  |«      5 }|j                  d«       | j                  |j                  «       d«       |j                  d«       | j                  |j                  «       d«       ddd«       y# 1 sw Y   yxY w)zb
        C{.tell()} should return the number of bytes that have been read so
        far.
        Údxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxé   rA   é   N)r   r;   r(   Útellr<   s      r   Ú	test_tellzFileEntryMixin.test_telle   sp   € ð
 ˆØ×Ñ˜xÓ(ð 	.¨EØ�J‰J�qŒMØ×Ñ˜UŸZ™Z›\¨1Ô-Ø�J‰J�qŒMØ×Ñ˜UŸZ™Z›\¨1Ô-÷		.÷ 	.ñ 	.ús   ”A#B Â B	N)Ú__name__Ú
__module__Ú__qualname__Ú__doc__r   r    r$   r*   r1   r4   r9   r>   rE   rK   © r'   r   r   r      s:   „ ñò%ò1ò*ò8ò=òOò=ò5ò	)ó
.r'   r   c                   ó(   — e Zd ZdZej
                  Zy)ÚDeflatedZipFileEntryTestsz2
    DeflatedZipFileEntry should be file-like
    N)rL   rM   rN   rO   r   ÚZIP_DEFLATEDr   rP   r'   r   rR   rR   r   s   „ ñð ×&Ñ&�Kr'   rR   c                   ó(   — e Zd ZdZej
                  Zy)ÚZipFileEntryTestsz*
    ZipFileEntry should be file-like
    N)rL   rM   rN   rO   r   Ú
ZIP_STOREDr   rP   r'   r   rU   rU   z   s   „ ñð ×$Ñ$�Kr'   rU   c                   óf   — e Zd ZdZd„ Z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y)ÚZipstreamTestsz,
    Tests for twisted.python.zipstream
    c                 óü   — t        j                  | j                  «       «      | _        | j                  j	                  «        | j                  j                  d«      | _        | j                  j	                  «        y)zz
        Creates junk data that can be compressed and a test directory for any
        files that will be created
        ÚunzippedN)r   ÚFilePathr   ÚtestdirÚmakedirsÚchildÚunzipdir©r   s    r   ÚsetUpzZipstreamTests.setUp‡   sR   € ô
  ×(Ñ(¨¯©«Ó7ˆŒØ�‰×ÑÔØŸ™×*Ñ*¨:Ó6ˆŒØ�‰×ÑÕ r'   c                 ó  — | j                   j                  d«      j                  }t        j                  |d«      5 }t        |«      D ],  \  }}t        |«      }|r|dz   |z   }|j                  ||«       Œ. 	 ddd«       |S # 1 sw Y   |S xY w)z¤
        Makes a zip file archive containing len(contents) files.  Contents
        should be a list of strings, each string being the content of one file.
        zzipfile.zipr
   ú/N)r\   r^   Úpathr   r   Ú	enumerateÚstrr   )r   r   Ú	directoryÚ
zpfilenameÚzpfileÚir   r   s           r   ÚmakeZipFilezZipstreamTests.makeZipFile‘   sŽ   € ð
 —\‘\×'Ñ'¨Ó6×;Ñ;ˆ
Ü�_‰_˜Z¨Ó-ð 	3°Ü'¨Ó1ò 3‘
��7Ü˜q›6�ÙØ(¨3™°Ñ9�HØ—‘ ¨'Õ2ñ	3÷	3ð Ð÷	3ð Ðús   ¼;BÂBc                 ó¸   — t        j                  | j                  «       d«      5 }| j                  t        |j
                  d«       ddd«       y# 1 sw Y   yxY w)z€
        A ChunkingZipFile opened in write-mode should not allow .readfile(),
        and raise a RuntimeError instead.
        r
   Ú	somethingN)r   r   r   r/   ÚRuntimeErrorr   ©r   Úczfs     r   Útest_invalidModezZipstreamTests.test_invalidModeŸ   sK   € ô
 ×&Ñ& t§{¡{£}°cÓ:ð 	G¸cØ×Ñœl¨C¯L©L¸+ÔF÷	G÷ 	Gñ 	Gús   ¥"AÁAc                 ó²   — t        j                  | j                  dg«      d«      }|j                  «        | j	                  t
        |j                  d«       y)zn
        A closed ChunkingZipFile should raise a L{RuntimeError} when
        .readfile() is invoked.
        rm   r   N)r   r   rk   Úcloser/   rn   r   ro   s     r   Útest_closedArchivez!ZipstreamTests.test_closedArchive§   sB   € ô
 ×'Ñ'¨×(8Ñ(8¸+¸Ó(GÈÓMˆØ�	‰	ŒØ×Ñœ,¨¯©°kÕBr'   c                 ót  — | j                  ddg«      }t        j                  |d«      5 }|j                  d«      j                  }ddd«       t        |d«      5 }|j                  d«       |j                  d«       ddd«       t        j                  |«      5 }| j                  t        j                  |j                  d«       |j                  d	«      5 }| j                  |j                  «       d
«       ddd«       ddd«       y# 1 sw Y   ŒÅxY w# 1 sw Y   Œ™xY w# 1 sw Y   Œ*xY w# 1 sw Y   yxY w)z¤
        A zipfile entry with the wrong magic number should raise BadZipFile for
        readfile(), but that should not affect other files in the archive.
        ztest contentszmore contentsr   Ú0Núr+br   s   0000Ú1ó   more contents)rk   r   r   ÚgetinfoÚheader_offsetÚopenÚseekÚwriter   r   r/   Ú
BadZipFiler   r(   r;   )r   ÚfnÚzfÚ
zeroOffsetÚscribblerp   Úzfes          r   Útest_invalidHeaderz!ZipstreamTests.test_invalidHeader°   s  € ð
 ×Ñ˜°Ð@ÓAˆÜ�_‰_˜R Ó%ð 	7¨ØŸ™ C›×6Ñ6ˆJ÷	7ô �"�e‹_ð 	% Ø�M‰M˜* aÔ(Ø�N‰N˜8Ô$÷	%ô ×&Ñ& rÓ*ð 	?¨cØ×Ñœg×0Ñ0°#·,±,ÀÔDØ—‘˜cÓ"ð ? cØ× Ñ  §¡£Ð-=Ô>÷?÷	?ð 	?÷	7ð 	7ú÷	%ð 	%ú÷
?ð ?ú÷	?ð 	?ús;   ªD
Á$DÂ=D.Ã!D"Ã9D.Ä
DÄDÄ"D+	Ä'D.Ä.D7c                 óž  — | j                  ddg«      }t        j                  |d«      5 }|j                  d«      }d|_        ddd«       t        |d«      5 }|j                  j                  d«       |j                  |j                  «       «       ddd«       t        j                  |«      5 }| j                  t        j                  |j                  d«       |j                  d	«      5 }| j                  |j!                  «       d«       ddd«       ddd«       y# 1 sw Y   ŒÝxY w# 1 sw Y   Œ™xY w# 1 sw Y   Œ*xY w# 1 sw Y   yxY w)
zƒ
        A zipfile entry with a different filename than is found in the central
        directory should raise BadZipFile.
        s   test contentsry   r   rv   znot zeroNrw   r   rx   )rk   r   r   rz   r   r|   r}   r{   r~   Ú
FileHeaderr   r   r/   r   r   r(   r;   )r   r€   r�   Úinforƒ   rp   r„   s          r   Útest_filenameMismatchz$ZipstreamTests.test_filenameMismatchÁ   s  € ð
 ×ÑÐ/Ð1AÐBÓCˆÜ�_‰_˜R Ó%ð 	'¨Ø—:‘:˜c“?ˆDØ&ˆDŒM÷	'ô �"�e‹_ð 	. Ø�M‰M˜$×,Ñ,¨aÔ0Ø�N‰N˜4Ÿ?™?Ó,Ô-÷	.ô ×&Ñ& rÓ*ð 	?¨cØ×Ñœg×0Ñ0°#·,±,ÀÔDØ—‘˜cÓ"ð ? cØ× Ñ  §¡£Ð-=Ô>÷?÷	?ð 	?÷	'ð 	'ú÷	.ð 	.ú÷?ð ?ú÷	?ð 	?ús;   ªDÁ<D+Â0=EÃ-!D7ÄEÄD(Ä+D4Ä7E 	Ä<EÅEc                 ó€  — | j                  «       }t        j                  |d«      5 }t        j                  d«      }|j	                  |d«       d|_        ddd«       t        j                  |«      5 }| j                  t        j                  |j                  d«       ddd«       y# 1 sw Y   ŒSxY w# 1 sw Y   yxY w)zq
        A zipfile which describes an unsupported compression mechanism should
        raise BadZipFile.
        r
   rv   z	some dataiÒ  N)r   r   r   ÚZipInfor   Úcompress_typer   r   r/   r   r   )r   r€   r�   Úzirp   s        r   Útest_unsupportedCompressionz*ZipstreamTests.test_unsupportedCompressionÓ   s§   € ð
 �[‰[‹]ˆÜ�_‰_˜R Ó%ð 	$¨Ü—‘ Ó%ˆBØ�K‰K˜˜KÔ(ð  $ˆBÔ÷	$ô ×&Ñ& rÓ*ð 	E¨cØ×Ñœg×0Ñ0°#·,±,ÀÔD÷	Eð 	E÷	$ð 	$ú÷	Eð 	Eús   §/B(Á3,B4Â(B1Â4B=c                 óü  — | j                  «       }t        j                  |d«      5 }t        j                  d«      }d}t	        j
                  ddt        |«      «      |z   |_        |j                  |d«       ddd«       t        j                  |«      5 }|j                  d«      5 }| j                  |j                  «       d«       ddd«       ddd«       y# 1 sw Y   ŒbxY w# 1 sw Y   ŒxY w# 1 sw Y   yxY w)zW
        readfile() should skip over 'extra' data present in the zip metadata.
        r
   rv   s   hello, extraz<hhé*   s   the real dataN)r   r   r   r‹   ÚstructÚpackÚlenÚextrar   r   r   r   r(   r;   )r   r€   r�   r�   Ú
extra_datarp   r„   s          r   Útest_extraDatazZipstreamTests.test_extraDataä   sØ   € ð �[‰[‹]ˆÜ�_‰_˜R Ó%ð 	.¨Ü—‘ Ó%ˆBØ(ˆJÜ—{‘{ 5¨"¬c°*«oÓ>ÀÑKˆBŒHØ�K‰K˜Ð,Ô-÷		.ô
 ×&Ñ& rÓ*ð 	;¨c°3·<±<ÀÓ3Dð 	;ÈØ×Ñ˜SŸX™X›ZÐ)9Ô:÷	;÷ 	;ð 	;÷	.ð 	.ú÷
	;ð 	;ú÷ 	;ð 	;ús0   §ACÂC2Â(!C&Ã	C2ÃC#Ã&C/	Ã+C2Ã2C;c                 ór  — d}t        |«      D �cg c]  }d|z  ‘Œ	 }}|D �cg c]  }|j                  d«      ‘Œ }}| j                  |«      }t        t	        j
                  || j                  j                  «      «       | j                  t        | j                  j                  «       «      t        t        t        t        |«      «      «      «       | j                  j                  «       D ]>  }t        |j                  «       «      }| j                  |j!                  «       ||   «       Œ@ yc c}w c c}w )z˜
        L{twisted.python.zipstream.unzipIterChunky} returns an iterator which
        must be exhausted to completely unzip the input archive.
        é
   úThis is test file %d!ÚasciiN)ÚrangeÚencoderk   Úlistr   ÚunzipIterChunkyr_   rd   r(   ÚsetÚlistdirÚmaprf   ÚchildrenÚintÚbasenameÚ
getContent)r   Únumfilesrj   r   rh   r^   Únums          r   Útest_unzipIterChunkyz#ZipstreamTests.test_unzipIterChunkyñ   sø   € ð
 ˆÜ9>¸x»ÖI°AÐ+¨aÓ/ÐIˆÐIØ/7Ö8¨!�A—H‘H˜WÕ%Ð8ˆÐ8Ø×%Ñ% hÓ/ˆ
ÜŒY×&Ñ& z°4·=±=×3EÑ3EÓFÔGØ×Ñœ˜TŸ]™]×2Ñ2Ó4Ó5´s¼3¼sÄEÈ(ÃOÓ;TÓ7UÔVà—]‘]×+Ñ+Ó-ò 	@ˆEÜ�e—n‘nÓ&Ó'ˆCØ×Ñ˜U×-Ñ-Ó/°¸#±Õ?ñ	@ùò JùÚ8s
   �D/¢D4c                 óÚ  — d}t        |«      D �cg c]  }d|z  ‘Œ	 }}|D �cg c]  }|j                  d«      ‘Œ }}| j                  |d«      }t        t	        j
                  || j                  j                  «      «       t        |«      D �ch c]  }t        |«      j                  d«      ’Œ }}| j                  t        | j                  j                  d«      j                  «       «      |«       | j                  j                  d«      j                  «       D ]>  }t        |j                  «       «      }| j                  |j!                  «       ||   «       Œ@ yc c}w c c}w c c}w )zä
        The path to which a file is extracted by L{zipstream.unzipIterChunky}
        is determined by joining the C{directory} argument to C{unzip} with the
        path within the archive of the file being extracted.
        r˜   r™   rš   Úfoos   fooN)r›   rœ   rk   r�   r   rž   r_   rd   rf   r(   rŸ   r^   r    r¢   r£   r¤   r¥   )r   r¦   rj   r   rh   r§   ÚfileContentsr^   s           r   Útest_unzipIterChunkyDirectoryz,ZipstreamTests.test_unzipIterChunkyDirectory  s*  € ð ˆÜ9>¸x»ÖI°AÐ+¨aÓ/ÐIˆÐIØ/7Ö8¨!�A—H‘H˜WÕ%Ð8ˆÐ8Ø×%Ñ% h°Ó6ˆ
ÜŒY×&Ñ& z°4·=±=×3EÑ3EÓFÔGÜ<AÀ(»OÖL°Sœ˜C›Ÿ™¨Õ0ÐLˆÐLØ×Ñœ˜TŸ]™]×0Ñ0°Ó8×@Ñ@ÓBÓCÀ\ÔRà—]‘]×(Ñ(¨Ó0×9Ñ9Ó;ò 	@ˆEÜ�e—n‘nÓ&Ó'ˆCØ×Ñ˜U×-Ñ-Ó/°¸#±Õ?ñ	@ùò JùÚ8ùò Ms   �E¢E#Â!E(c                 óD  — d}t        d«      D ]B  }t        t        j                  «       d«      }t        |«      j	                  d«      }|d|z   z  }ŒD t        |«      j                  «       }	t        j                  | j                  «       «      }
|
j                  «        |
j                  d«      j                  }| j                  |||«       t        j                  ||
j                  |¬«      }t!        |«      }||cxk  xr |k  nc }| j#                  |«       |D ]  }Œ | j%                  |d«       |
j                  d	«      j'                  «       5 }t        |j)                  «       «      j                  «       }| j%                  ||	«       d
d
d
«       y
# 1 sw Y   y
xY w)zW
        unzipIterChunky should unzip the given number of bytes per iteration.
        r'   iè  é   rš   ó    zbigfile.zip)Ú	chunksizer   ÚzipstreamjunkN)r›   ÚroundÚrandomrf   rœ   r   Ú	hexdigestr   r[   r   r]   r^   rd   Ú_makebigfiler   rž   r.   r#   r(   r|   r;   )r   r   r°   ÚlowerÚupperÚjunkÚnr§   Ú
numEncodedÚjunkmd5ÚtempdirÚzfpathÚuziterr   ÚapproxÚfÚnewmd5s                    r   Ú_unzipIterChunkyTestz#ZipstreamTests._unzipIterChunkyTest  s_  € ð ˆÜ�t“ò 	&ˆAÜœŸ™›¨Ó,ˆCÜ˜S›Ÿ™¨Ó1ˆJØ�D˜:Ñ%Ñ%‰Dð	&ô
 �d“)×%Ñ%Ó'ˆä×#Ñ# D§K¡K£MÓ2ˆØ×ÑÔØ—‘˜}Ó-×2Ñ2ˆØ×Ñ˜& +¨tÔ4Ü×*Ñ*¨6°7·<±<È9ÔUˆÜ�‹Lˆð ˜Ö"˜UÔ"ˆØ�‰˜ÔØò 	ˆAØð	à×Ñ˜˜AÔØ�]‰]˜?Ó+×0Ñ0Ó2ð 	.°aÜ˜Ÿ™›“]×,Ñ,Ó.ˆFØ×Ñ˜V WÔ-÷	.÷ 	.ñ 	.ús   Å:FÆFc                 óH   — | j                  t        j                  ddd«       y)zs
        unzipIterChunky should unzip the given number of bytes per iteration on
        a stored archive.
        iô  é#   é-   N)rÂ   r   rV   r`   s    r   Útest_unzipIterChunkyStoredz)ZipstreamTests.test_unzipIterChunkyStored5  s   € ð
 	×!Ñ!¤'×"4Ñ"4°c¸2¸rÕBr'   c                 óH   — | j                  t        j                  ddd«       y)zu
        unzipIterChunky should unzip the given number of bytes per iteration on
        a deflated archive.
        iÌ  é   é   N)rÂ   r   rS   r`   s    r   Útest_chunkyDeflatedz"ZipstreamTests.test_chunkyDeflated<  s   € ð
 	×!Ñ!¤'×"6Ñ"6¸¸RÀÕDr'   c                 óÎ   — t        j                  |d|«      5 }t        d«      D ]  }d|z  }|j                  |d«       Œ |j                  d|«       ddd«       y# 1 sw Y   yxY w)zT
        Create a zip file with the given file name and compression scheme.
        r
   r˜   zzipstream%dr   r±   N)r   r   r›   r   )r   r   r   r¸   r�   rj   r€   s          r   rµ   zZipstreamTests._makebigfileC  sf   € ô �_‰_˜X s¨KÓ8ð 	/¸BÜ˜2“Yò $�Ø" QÑ&�Ø—‘˜B Õ#ð$ð �K‰K˜¨Ô.÷		/÷ 	/ñ 	/ús   ˜:AÁA$N)r   )rL   rM   rN   rO   ra   rk   rq   rt   r…   r‰   rŽ   r–   r¨   r¬   rÂ   rÆ   rÊ   rµ   rP   r'   r   rX   rX   ‚   sT   „ ñò!óòGòCò?ò"?ò$Eò";ò@ò @ò,.ò<CòEó/r'   rX   )rO   r³   r‘   r   Úhashlibr   Útwisted.pythonr   r   Útwisted.trialr   r   ÚTestCaserR   rU   rX   rP   r'   r   ú<module>rÐ      sg   ðñó Û Û Ý ç .Ý "÷^.ñ ^.ôB' °×0AÑ0Aô 'ô%˜¨×(9Ñ(9ô %ôI/�X×&Ñ&õ I/r'   