+
    LV-jP  ã                   óÊ   € ^ RI t ^ RIt^ RIt^ RIt^RIHt ^RIHt ^RIH	t	  ! R R]4      t
RR R lltR	 tRR
 ltRR ltR tR tR t ! R R4      t ! R R4      tR tR# )é    N)Ú	url_to_fs)ÚAbstractBufferedFile)Úmerge_offset_rangesc                   ó&   a € ] tR t^t o R tRtV tR# )ÚAlreadyBufferedFilec                ó   € \         h©N)ÚNotImplementedError)ÚselfÚstartÚends   &&&Ú_/Volumes/fast/ai/experiments/ui-tars-smoke/.venv/lib/python3.14/site-packages/fsspec/parquet.pyÚ_fetch_rangeÚ AlreadyBufferedFile._fetch_range   s   € Ü!Ð!ó    © N)Ú__name__Ú
__module__Ú__qualname__Ú__firstlineno__r   Ú__static_attributes__Ú__classdictcell__©Ú__classdict__s   @r   r   r      s   ø‡ € ÷"ð "r   r   c                ón  € V ^8„  d   QhR\         \        ,          RR\        P                  ,          RR\         \        ,          ,          RR\         \        ,          ,          RR\
        ,          R\        R\        R	\        R
\        RR\         \         \         \        ,          ,          ,          ,          /
# )é   ÚpathÚfsNÚcolumnsÚ
row_groupsÚstorage_optionsÚengineÚmax_gapÚ	max_blockÚfooter_sample_sizeÚfilters)ÚlistÚstrÚfsspecÚAbstractFileSystemÚintÚdict)Úformats   "r   Ú__annotate__r.      s¯   € ÷ Fñ FÜ
Œs�)ðFàŒv×(Ñ(Õ(ðFð ”Dœ•IÕð	Fð
 ”tœC•yÕ ðFð œD•[ðFô ðFô ðFô ðFô ðFð ”Dœœd¤3�i�Õ)Õ)ñFr   c                ó  € VfA   T p\        V \        \        34      '       d
   V ^ ,          p \        V 3/ T;'       g    / B w  rMT pVe   \	        V4      ^ 8X  d   Rp\        V4      p\        V\        \        34      '       d   TpMpRV 9   d   VP                  V 4      pMWVP                  R4      '       d>   VP                  V RRR7       Uu. uF  pVP                  R4      '       g   K  VNK   	  ppMV .p\        VVVVVVVVV	V
R7
      pVP                  R/ 4      P                  4       pVP                  4        UUu. uF3  w  pp\        RRRR	VR
RRRR/ VCRV/CR\        R V 4       4      /VB NK5  	  upp# u upi u uppi )aý	  
Return a file-like object for a single Parquet file.

The specified parquet `engine` will be used to parse the
footer metadata, and determine the required byte ranges
from the file. The target path will then be opened with
the "parts" (`KnownPartsOfAFile`) caching strategy.

Note that this method is intended for usage with remote
file systems, and is unlikely to improve parquet-read
performance on local file systems.

Parameters
----------
path: str
    Target file path.
metadata: Any, optional
    Parquet metadata object. Object type must be supported
    by the backend parquet engine. For now, only the "fastparquet"
    engine supports an explicit `ParquetFile` metadata object.
    If a metadata object is supplied, the remote footer metadata
    will not need to be transferred into local memory.
fs: AbstractFileSystem, optional
    Filesystem object to use for opening the file. If nothing is
    specified, an `AbstractFileSystem` object will be inferred.
engine : str, default "auto"
    Parquet engine to use for metadata parsing. Allowed options
    include "fastparquet", "pyarrow", and "auto". The specified
    engine must be installed in the current environment. If
    "auto" is specified, and both engines are installed,
    "fastparquet" will take precedence over "pyarrow".
columns: list, optional
    List of all column names that may be read from the file.
row_groups : list, optional
    List of all row-groups that may be read from the file. This
    may be a list of row-group indices (integers), or it may be
    a list of `RowGroup` metadata objects (if the "fastparquet"
    engine is used).
storage_options : dict, optional
    Used to generate an `AbstractFileSystem` object if `fs` was
    not specified.
max_gap : int, optional
    Neighboring byte ranges will only be merged when their
    inter-range gap is <= `max_gap`. Default is 64KB.
max_block : int, optional
    Neighboring byte ranges will only be merged when the size of
    the aggregated range is <= `max_block`. Default is 256MB.
footer_sample_size : int, optional
    Number of bytes to read from the end of the path to look
    for the footer metadata. If the sampled bytes do not contain
    the footer, a second read request will be required, and
    performance will suffer. Default is 1MB.
filters : list[list], optional
    List of filters to apply to prevent reading row groups, of the
    same format as accepted by the loading engines. Ignored if
    ``row_groups`` is specified.
**kwargs :
    Optional key-word arguments to pass to `fs.open`
NÚ*Ú/F)ÚwithdirsÚdetail)Úmetadatar   r    r"   r#   r$   r%   r&   Úcache_optionsr   r   ÚmodeÚrbÚ
cache_typeÚpartsÚdataÚsizec              3   ó2   "  € T F  q^,          x € K  	  R# 5i)é   Nr   ©Ú.0Ú_s   & r   Ú	<genexpr>Ú%open_parquet_files.<locals>.<genexpr>›   s   é € Ð*¡6˜a�q—T’T£6ùs   ‚)z.parquetz.parqr   )Ú
isinstancer'   Útupler   ÚlenÚ_set_engineÚglobÚendswithÚfindÚ_get_parquet_byte_rangesÚpopÚcopyÚitemsr   Úmax)r   r   r4   r   r    r!   r"   r#   r$   r%   r&   ÚkwargsÚpath0Úpathsr@   r:   ÚoptionsÚfnÚrangess   &&&&&&&&&&&,       r   Úopen_parquet_filesrU      sÒ  € ðX 
‚zØˆÜ�dœT¤5˜M×*Ò*Ø˜•7ˆDÜ˜TÑ= o×&;Ð&;¸Ñ=‰ˆˆDàˆð Òœs 7›|¨qÔ0Øˆô ˜Ó €Fä�%œ$¤˜×'Ò'Ø‰Ø	�ŒØ—‘˜“‰Ø	�‰˜×	Ò	ð —W‘W˜T¨E¸%�WÔ@ó
á@�Ø�z‰zÐ/×0÷ ˆAÙ@ð 	ð 
ˆð �ˆä#ØØ
ØØØØØØØ-Øô€Dð �j‰j˜¨"Ó-×2Ñ2Ó4€Gð Ÿ*™*œ,ôñ '‰JˆB�ô 	ñ 	
Øð	
àð	
ð ð	
ð ð		
ð
Øðà˜ñð	
ô Ñ*¡6Ó*Ó*ð	
ð ô	
ñ 'òð ùò/
ùó.s   ÃE<Ã+E<Ä?9Fc                 ó&   € \        V / VB ^ ,          # )aF  Create files tailed to reading specific parts of parquet files

Please see ``open_parquet_files`` for details of the arguments. The
difference is, this function always returns a single ``AlreadyBufferedFile``,
whereas `open_parquet_files`` always returns a list of files, even if
there are one or zero matching parquet files.
)rU   )ÚargsrO   s   *,r   Úopen_parquet_filerX   ¢   s   € ô ˜tÐ. vÑ.¨qÕ1Ð1r   c
                óè  € \        V\        4      '       d   \        V4      pVe   \        VVVVVVVV	R7      # VfK   VfG   V	fC   VP	                  V 4      P                  4        U
Uu/ uF  w  r«V
^ \        V4      3V/bK  	  pp
pEM<VP                  V 4      p. p. p. pV Uu. uF  p\        ^ VV,
          4      NK  	  ppVP                  V VV4      p. p\        V 4       F`  w  pp
\        P                  VV,          RR	 R4      pVV,          V^,           ,
          pVVV,          8  g   KM  VP                  VV34       Kb  	  V'       dÃ   \        P                  ! RV R24       V UUu. uF  w  ppV V,          NK  	  pppV Uu. uF  pV^,          NK  	  ppV UUu. uF  w  ppVV,          V,
          NK  	  pppVP                  VVV4      p\        \!        VVV4      4       F"  w  pw  p
ppVVV,          ,           VV&   VVV&   K$  	  \!        V VVV4       U
UUUu/ uF  w  p
pppV
VV3V/bK  	  pppp
p\        V 4       FX  w  pp
VP#                  VVVV,          VV,          V	R7      w  pp Wê.\        V4      ,          ,          pVV,          pVV ,          pKZ  	  \%        VVVVVRR7      w  rïp\'        WWïV4       \)        V4       V# u upp
i u upi u uppi u upi u uppi u upppp
i )
a  Get a dictionary of the known byte ranges needed
to read a specific column/row-group selection from a
Parquet dataset. Each value in the output dictionary
is intended for use as the `data` argument for the
`KnownPartsOfAFile` caching strategy of a single path.
)r   r    r#   r$   r&   ÚlittlezYNot enough data was used to sample the parquet footer. Try setting footer_sample_size >= Ú.)r    ÚfooterÚfooter_startr&   T©r#   r$   Úsortiøÿÿÿéüÿÿÿ)rC   r(   rF   Ú&_get_parquet_byte_ranges_from_metadataÚcatrM   rE   ÚsizesrN   Ú
cat_rangesÚ	enumerater+   Ú
from_bytesÚappendÚwarningsÚwarnÚzipÚ_parquet_byte_rangesr   Ú_transfer_rangesÚ_add_header_magic)!rQ   r   r4   r   r    r#   r$   r%   r"   r&   r   r:   ÚresultÚ
file_sizesÚ
data_pathsÚdata_startsÚ	data_endsÚ	file_sizeÚfooter_startsÚfooter_samplesÚlarge_footerÚiÚfooter_sizeÚreal_footer_startr@   rP   ÚstartsÚendsr   Úblockr;   Úpath_data_startsÚpath_data_endss!   &&&&&&&&&&                       r   rJ   rJ   ­   sY  € ô( �&œ#×ÒÜ˜VÓ$ˆð Òô 6ØØØØØ!ØØØô	
ð 		
ð ‚˜:Ò-°'²/ð
 BDÇÁÈÃ×ATÑATÔAVÔWÑAV±:°4�$˜!œS ›Y˜¨Ð.Ò.ÑAVˆÑW‰ð
 —X‘X˜e“_ˆ
Øˆ
ØˆØˆ	ñ
 EOó
ÙDN°yŒC��9Ð1Õ1Ö2ÁJð 	ð 
ð Ÿ™ u¨m¸ZÓHˆð ˆÜ  Ö'‰GˆAˆtÜŸ.™.¨¸Õ):¸2¸bÐ)AÀ8ÓLˆKØ *¨1¥°¸qµÕ AÐØ  =°Õ#3Ö3Ø×#Ñ# QÐ(9Ð$:Ö;ñ	 (÷
 Ü�MŠMð5Ø5A°NÀ!ðEôñ +7Ô7©,¡$ ! Q�U˜1—X�X©,ˆEÑ7Ù$0Ó1¡L˜q�a˜—d�d¡LˆFÐ1ÙCOÔPÁ<¹4¸1¸a�J˜q•MÐ$6×6Ð6Á<ˆDÑPØ—=‘= ¨°Ó5ˆDÜ+4´S¸ÀÈÓ5MÖ+NÑ'�Ñ'�D˜% Ø$)¨N¸1Õ,=Õ$=�˜qÑ!Ø#(�˜aÓ ñ ,Oô
 ,/Ø�} j°.ô,ö
ñ,Ñ'��e˜T 4ð �E˜4�= $Ð'Ò'ñ,ð 	ó 
ô ! Ö'‰GˆAˆtà/5×/JÑ/JØØ%Ø% aÕ(Ø*¨1Õ-Øð 0Kó 0Ñ,Ð˜nð ˜&¤3Ð'7Ó#8Õ8Õ8ˆJØÐ+Õ+ˆKØ˜Õ'ŠIñ (ô .AØØØØØØô.
Ñ*ˆ
 ô 	˜ Z¸iÔHô �fÔà€MùóU Xùò
ùó" 8ùÚ1ùÛPùõ

s$   Á'KÂ"KÅ+KÆK!Æ K&È!K,
c           	     óÚ   € VP                  W4WR7      w  r‰p
\        VV	V
VVRR7      w  r‰p
\        \        V4      4       Uu/ uF  q»/ bK  	  pp\	        WW‰V
4       \        V4       V# u upi )záSimplified version of `_get_parquet_byte_ranges` for
the case that an engine-specific `metadata` object is
provided, and the remote footer metadata does not need to
be transferred before calculating the required byte ranges.
)r    r4   r&   Fr^   )rk   r   r'   Úsetrl   rm   )r4   r   r"   r   r    r#   r$   r&   rp   rq   rr   rS   rn   s   &&&&&&&&     r   ra   ra   &  sŠ   € ð" *0×)DÑ)DØ°ð *Eó *Ñ&€J˜Yô
 *=ØØØØØØô*Ñ&€J˜Yô  $¤C¨
£OÔ4Ó5Ñ4˜�"ŠfÑ4€FÐ5Ü�R ¸)ÔDô �fÔà€Mùò 6s   ÁA(c                 ór   € W#V3p\        . VOV P                  ! V!  N5!   F  w  rgr‰W‘V,          Wx3&   K  	  R # r	   )rj   rd   )
r   ÚblocksrQ   rz   r{   rT   r   r   Ústopr:   s
   &&&&&     r   rl   rl   O  s@   € à˜TÐ"€FÜ#&Ð#G¨Ð#G°·²¸vÑ0FÖ#GÑˆ�TØ&*ˆt��e�]Ó#ó $Hr   c                 óº   € \        V 4       FK  pR pW,           F%  pV^ ,          ^ 8X  g   K  V^,          ^8¼  g   K#  Rp M	  V'       g   K@  RW,          R&   KM  	  R# )TFs   PAR1N)r   é   )r'   )r:   r   Ú	add_magicÚks   &   r   rm   rm   V  sS   € ä�T–
ˆØˆ	Ø—�ˆAØ��t�qŽy˜Q˜q�T QžYØ!�	Ùñ ÷ ‰9Ø!(ˆD�J�vÓó r   c                 ó*  € V R 8X  d   RpM9\        V \        4      '       g   \        R4      hV R9  d   \        V  R24      hV .pV F*  p VR8X  d   \        4       u # VR8X  d   \	        4       u # K,  	  \        RV R24      h  \
         d     KK  i ; i)ÚautoÚfastparquetÚpyarrowzMFailed to set parquet engine! Please pass 'fastparquet', 'pyarrow', or 'auto'z) engine not supported by `fsspec.parquet`zLThe following parquet engines are not installed in your python environment: zS.Please install 'fastparquert' or 'pyarrow' to utilize the `fsspec.parquet` module.)rŠ   r‹   )rC   r(   Ú
ValueErrorÚFastparquetEngineÚPyarrowEngineÚImportError)Ú
engine_strÚtry_enginesr"   s   &  r   rF   rF   b  sÁ   € à�VÔØ0‰Ü˜
¤C×(Ò(Üð>ó
ð 	
ð 
Ð5Ô	5Ü˜J˜<Ð'PÐQÓRÐRà!�lˆó ˆð	Ø˜Ô&Ü(Ó*Ò*Ø˜9Ô$Ü$“Ò&ñ %ñ	 ô ð'Ø'2 mð 4/ð	0óð øô ô 	Úð	ús   Á
BÁBÂBÂBc                   ó0   a € ] tR tRt o R tRR ltRtV tR# )r�   i…  c                ó   € ^ RI pWn        R# ©r   N)rŠ   Úfp)r   r•   s   & r   Ú__init__ÚFastparquetEngine.__init__Œ  s
   € Û àŽr   Nc           	     ól  € Tp. . . r©pV'       d   V'       d   \        R 4      hVf0   V P                  P                  \        P                  ! V4      4      pVf   RM'V Uu0 uF  q»P                  R^4      ^ ,          kK  	  uppVeh   \        VR4      '       dV   VP                  P                  R. 4       Uu. uF  p\        V\        4      '       d   K  VNK  	  ppV\        V4      ,          pV'       d   ^ RIHp RpV! Wv4      pM6V'       d!   \        V^ ,          \        4      '       g   RpMTpVP                  pVe9   V Uu. uF,  p\        V\         4      '       d   TMVP                  R4      NK.  	  pp\#        V4       EF  w  ppVe
   VV9   g   K  VP%                  V4      pVP&                   FÙ  pVP(                  P*                  pVe   \-        VV4      '       g   K1  VP(                  P.                  pVf   VP(                  P0                  pVP(                  P2                  pVe
   VV8  g   K„  VP5                  V4       V	P5                  V4       T
P5                  \7        VV,           T;'       g
    VV,           4      4       KÛ  	  EK  	  V'       d   W‰V
3# Wš3# u upi u upi u upi )z.filters and row_groups cannot be used togetherNr[   Úpandas_metadataÚindex_columns)Úfilter_row_groups)rŒ   r•   ÚParquetFileÚioÚBytesIOÚsplitÚhasattrr™   ÚgetrC   r,   r€   Úfastparquet.apir›   r+   r    r'   re   Úrow_group_filenamer   Ú	meta_dataÚpath_in_schemaÚ_cmpÚdictionary_page_offsetÚdata_page_offsetÚtotal_compressed_sizerg   Úmin)r   r   r    r4   r\   r]   r&   Úpfrp   rq   rr   ÚcÚ
column_setÚindÚmd_indexr›   Úrow_group_indicesr@   ÚrÚ	row_grouprS   ÚcolumnÚnameÚfile_offset0Ú	num_bytess   &&&&&&&                  r   rk   Ú&FastparquetEngine._parquet_byte_ranges‘  sx  € ð ˆØ-/°°R ˆ
ß—zÜÐMÓNÐNØŠ:Ø—‘×$Ñ$¤R§Z¢Z°Ó%7Ó8ˆBð %š_‘TÉwÓ2WÉwÈ!·7±7¸3À³?À1×3EÐ3EÉwÑ2Wˆ
ØÒ!¤g¨bÐ2C×&DÒ&Dð ×-Ñ-×1Ñ1°/À2ÔFóáF�Cä! #¤t×,÷ �ÙFð ð ð œ#˜h›-Õ'ˆJ÷ Ý9à $ÐÙ*¨2Ó7‰Jß¤
¨:°a­=¼#× >Ò >à $Ñð !+ÐØŸ™ˆJØÒ!áDNóÙDN¸q”Z ¤4×(Ò(‘¨a¯g©g°c«lÒ:ÁJð ð ô
 & j×1‰LˆAˆyð !Ò(¨AÐ1BÖ,Bà×*Ñ*¨9Ó5�à'×/Ô/�FØ!×+Ñ+×:Ñ:�Dà!Ò)¬T°$¸
×-CÔ-CØ'-×'7Ñ'7×'NÑ'N˜Ø'Ò/Ø+1×+;Ñ+;×+LÑ+L˜LØ$*×$4Ñ$4×$JÑ$J˜	Ø'Ò/°<À,Ö3NØ&×-Ñ-¨bÔ1Ø'×.Ñ.¨|Ô<Ø%×,Ñ,Ü #Ø$0°9Õ$<Ø$0×$NÐ$N°\ÀIÕ5Mó!"öô 0ñ 2÷2 ð ¨IÐ5Ð5ØÐ%Ð%ùòw 3Xùòùò.s   Á !J'Â8J,ÃJ,Å2J1)r•   ©NNNNN©r   r   r   r   r–   rk   r   r   r   s   @r   r�   r�   …  s   ø‡ € ò÷
N&ò N&r   r�   c                   ó0   a € ] tR tRt o R tRR ltRtV tR# )rŽ   iâ  c                ó   € ^ RI Hp Wn        R# r”   )Úpyarrow.parquetÚparquetÚpq)r   r¾   s   & r   r–   ÚPyarrowEngine.__init__é  s
   € Ý$àŽr   Nc           
     óÞ  € Ve   \        R4      hV'       d   \        h. . r‡V P                  P                  \        P
                  ! V4      4      P                  p	Vf   R M
\        V4      p
V
eÇ   V	P                  P                  4       pVP                  R J;'       d    RVP                  9   pV'       d€   \        P                  ! VP                  R,          P                  R4      4      P                  R. 4       Uu. uF  p\        V\        4      '       d   K  VNK  	  ppV
\        V4      ,          p
V
eG   V
 Uu. uF:  p\        V\         4      '       d
   VR,          MVP#                  R4      R,          NK<  	  p
p\%        V	P&                  4       EF  pVe
   VV9   g   K  V	P)                  V4      p\%        VP*                  4       FÜ  pVP-                  V4      pVP.                  P#                  R4      pV
e   \1        VV
4      '       g   KG  VP3                  4       p\5        R VP                  R4      VP                  R	4      VP                  R
4      3 4       4      pVV8  g   K¢  VP7                  V4       VP7                  \5        VR,          V,           V4      4       KÞ  	  EK  	  VP7                  V4       VP7                  V\9        V4      ,           4       Wx3# u upi u upi )Nz.metadata input not supported for PyarrowEngines   pandasÚutf8rš   :Nr=   Nr[   c              3   ó2   "  € T F  pVf   K	  Vx € K  	  R # 5ir	   r   r>   s   & r   rA   Ú5PyarrowEngine._parquet_byte_ranges.<locals>.<genexpr>$  s"   é € ð +ñ& ð
  !÷ šAó&ùs   ‚�
r§   r¨   Úindex_page_offsetr©   )rŒ   r
   r¾   rœ   r�   rž   r4   r€   ÚschemaÚto_arrow_schemaÚjsonÚloadsÚdecoder¡   rC   r,   r'   rŸ   ÚrangeÚnum_row_groupsr²   Únum_columnsr³   r¥   r¦   Úto_dictrª   rg   rE   )r   r   r    r4   r\   r]   r&   rq   rr   Úmdr­   rÅ   Úhas_pandas_metadatar®   r¯   r@   r±   r²   r¬   r³   r´   Úmetarµ   s   &&&&&&&                r   rk   Ú"PyarrowEngine._parquet_byte_rangesî  s™  € ð ÒÜÐMÓNÐNßä%Ð%à!# R�YØ�W‰W× Ñ ¤§¢¨FÓ!3Ó4×=Ñ=ˆð %š_‘T´#°g³,ˆ
ØÒ!Ø—Y‘Y×.Ñ.Ó0ˆFà—‘ tÐ+×LÐL°	¸V¿_¹_Ñ0Lð  ÷ #ô  $ŸzšzØŸ™¨	Õ2×9Ñ9¸&ÓAó ç‘c˜/¨2Ó.ð /óñ /˜ô & c¬4×0÷ �Cñ /ð ð ð œc (›mÕ+�
ØÒ!áLVóÙLVÀqœ A¤t×,Ò,��"–°!·'±'¸#³,¸rÕ2BÒBÉJð ð ô
 �r×(Ñ(×)ˆAð Ò! Q¨*¦_ØŸL™L¨›O�	Ü˜y×4Ñ4Ö5�AØ&×-Ñ-¨aÓ0�FØ!×0Ñ0×6Ñ6°sÓ;�Dà!Ò)¬T°$¸
×-CÔ-CØ%Ÿ~™~Ó/˜ä'*ñ +ð !%§¡Ð)AÓ BØ $§¡Ð);Ó <Ø $§¡Ð)<Ó =ñ&ó+ó (˜ð (¨,Ö6Ø'×.Ñ.¨|Ô<Ø%×,Ñ,Ü #Ø$(Ð)@Õ$AÀLÕ$PØ$0ó!"öô% 6ñ *ð< 	×Ñ˜<Ô(Ø×Ñ˜¬¨F«Õ3Ô4ØÐ%Ð%ùò_ùòs   Ã>K%ÄK%Ä=A K*)r¾   r¸   r¹   r   s   @r   rŽ   rŽ   â  s   ø‡ € ò÷
J&ò J&r   rŽ   c                 óx   a € \         ;QJ d    V 3R  lV 4       F  '       g   K   R# 	  R# ! V 3R  lV 4       4      # )c              3   ó´   <"  € T FM  p\         ;QJ d&    R  \        SV4       4       F  '       d   K   RM	  RM! R  \        SV4       4       4      x € KO  	  R# 5i)c              3   ó.   "  € T F  w  rW8H  x € K  	  R # 5ir	   r   )r?   ÚaÚbs   &  r   rA   Ú!_cmp.<locals>.<genexpr>.<genexpr><  s   é € Ð3¡l™d˜a�1–6£lùs   ‚FTN)Úallrj   )r?   r@   r´   s   & €r   rA   Ú_cmp.<locals>.<genexpr><  s;   øé € ÐH¹Z¸�s‹sÑ3¤c¨$°¤lÓ3�s�sŠsÑ3¤c¨$°¤lÓ3×3Ð3»Zùs   ƒA“A±'ATF)Úany)r´   r­   s   f&r   r¦   r¦   ;  s,   ø€ ß‹3ÔH¹ZÓH�3Œ3ÐHŠ3ÐHˆ3ÔH¹ZÓHÓHÐHr   )
NNNNNr‰   é ú  é @Bé@B N)NNNrÛ   rÜ   rÝ   r‰   N)NNrÛ   rÜ   N)r�   rÇ   rh   r)   Úcorer   Úspecr   Úutilsr   r   rU   rX   rJ   ra   rl   rm   rF   r�   rŽ   r¦   r   r   r   Ú<module>rá      sp   ðÛ 	Û Û ã å Ý &Ý &ô"Ð.ô "÷
FòR2ôvôr&òR+ò	)ò ÷FZ&ñ Z&÷zV&ñ V&ôrIr   