Ë
    çÍ:jr‡ ã                   ót  — d Z 	 ddlZddlZddlZddlZddlZddlZddlZddlZddl	Z	ddl
Z
ddlmZmZ ddlmZmZ ddlmZ ddlZddlmZmZ  G d„ d«      Z G d	„ d
«      Z G d„ d«      Z G d„ de«      Z G d„ de«      Z G d„ de«      Z G d„ de«      Z G d„ de«      Z G d„ de«      Z G d„ de«      Z  G d„ de«      Z! G d„ de«      Z" G d„ d e«      Z# G d!„ d"e«      Z$ G d#„ d$e«      Z% G d%„ d&e«      Z& G d'„ d(«      Z' G d)„ d*«      Z( G d+„ d,«      Z)d-„ Z*d.„ Z+d/„ Z,d0„ Z-d]d1„Z.d2„ Z/d]d3„Z0d4„ Z1d^d5„Z2d6„ Z3d7„ Z4d8„ Z5d9„ Z6 e'«       Z7e7jp                  Z8d:„ Z9d;„ Z:d<„ Z;e<d=k(  �rTdd>l=m>Z>  e>«       Z?e?j�                  d?d@dAdBdC¬D«       e?j�                  dEdFdGdHdIdJ¬K«       e?j�                  dLdMdNdHdIdO¬K«       e?j�                  dPdQdRdHdIdS¬K«       e?j�                  dTdUdVej‚                  j…                  dW«      dX¬Y«       e?j‡                  «       \  ZDZE e'eDjŒ                  ¬Z«      ZGeErWeED ]Q  ZHeGjq                  eHeDj’                  eDj”                  eDj–                  eDj˜                  ¬[«      ZMeMrŒDeDj˜                  sŒQ y yeGjq                  eDj’                  eDj”                  eDj–                  eDj˜                  ¬\«       yy)_aH	  
The NLTK corpus and module downloader.  This module defines several
interfaces which can be used to download corpora, models, and other
data packages that can be used with NLTK.

Downloading Packages
====================
If called with no arguments, ``download()`` will display an interactive
interface which can be used to download and install new packages.
If Tkinter is available, then a graphical interface will be shown,
otherwise a simple text interface will be provided.

Individual packages can be downloaded by calling the ``download()``
function with a single argument, giving the package identifier for the
package that should be downloaded:

    >>> download('treebank') # doctest: +SKIP
    [nltk_data] Downloading package 'treebank'...
    [nltk_data]   Unzipping corpora/treebank.zip.

NLTK also provides a number of "package collections", consisting of
a group of related packages.  To download all packages in a
colleciton, simply call ``download()`` with the collection's
identifier:

    >>> download('all-corpora') # doctest: +SKIP
    [nltk_data] Downloading package 'abc'...
    [nltk_data]   Unzipping corpora/abc.zip.
    [nltk_data] Downloading package 'alpino'...
    [nltk_data]   Unzipping corpora/alpino.zip.
      ...
    [nltk_data] Downloading package 'words'...
    [nltk_data]   Unzipping corpora/words.zip.

Download Directory
==================
By default, packages are installed in either a system-wide directory
(if Python has sufficient access to write to it); or in the current
user's home directory.  However, the ``download_dir`` argument may be
used to specify a different installation target, if desired.

See ``Downloader.default_download_dir()`` for more a detailed
description of how the default download directory is chosen.

NLTK Download Server
====================
Before downloading any packages, the corpus and module downloader
contacts the NLTK download server, to retrieve an index file
describing the available packages.  By default, this index file is
loaded from ``https://raw.githubusercontent.com/nltk/nltk_data/gh-pages/index.xml``.
If necessary, it is possible to create a new ``Downloader`` object,
specifying a different URL for the package index file.

Usage::

    python nltk/downloader.py [-d DATADIR] [-q] [-f] [-k] PACKAGE_IDS

or::

    python -m nltk.downloader [-d DATADIR] [-q] [-f] [-k] PACKAGE_IDS
é    N)Úmd5Úsha256)Ú	HTTPErrorÚURLError)ÚElementTree)ÚZipFileÚurlopenc                   óJ   — e Zd ZdZ	 	 	 	 	 	 	 	 	 	 	 dd„Zed„ «       Zd„ Zd„ Zy)ÚPackagea4  
    A directory entry for a downloadable package.  These entries are
    extracted from the XML index file that is downloaded by
    ``Downloader``.  Each package consists of a single file; but if
    that file is a zip file, then it can be automatically decompressed
    when the package is installed.
    Nc                 ó  — || _         	 |xs || _        	 t        j                  j	                  |«      s#d|j                  dd«      j                  d«      v rt        d|›d�«      ‚|| _        	 t        j                  |v sd|v sd|v sd|v rt        d|›d�«      ‚|| _
        	 t        |«      | _        	 t        |«      | _        	 || _        	 || _        	 |	| _        	 |
| _        	 || _        	 || _        	 t        j                  j)                  |j                  d«      d   «      d	   }t        j                  j+                  |||z   «      | _        	 t/        t        |«      «      | _        	 | j2                  j5                  |«       y )
Nz..ú\ú/zInvalid package subdir z=: must be a relative path without parent directory referenceszInvalid package id z": must not contain path separatorséÿÿÿÿé   )ÚidÚnameÚosÚpathÚisabsÚreplaceÚsplitÚ
ValueErrorÚsubdirÚsepÚurlÚintÚsizeÚunzipped_sizeÚchecksumÚsvn_revisionÚ	copyrightÚcontactÚlicenseÚauthorÚsplitextÚjoinÚfilenameÚboolÚunzipÚ__dict__Úupdate)Úselfr   r   r   r   r   r   r   r    r!   r"   r#   r$   r)   ÚkwÚexts                   úd/home/mcse/projects/srt_converter/srt-converter-venv/lib/python3.12/site-packages/nltk/downloader.pyÚ__init__zPackage.__init__Ä   s�  € ð" ˆŒØ3à’J˜BˆŒ	Ø-ô �7‰7�=‰=˜Ô  D¨F¯N©N¸4ÀÓ,E×,KÑ,KÈCÓ,PÑ$PÜØ)¨&¨ð 46ð 7óð ð ˆŒð	4ô �6‰6�R‰<˜3 "™9¨°©
°d¸b±jÜØ% b VÐ+MÐNóð ð ˆŒØEä˜“IˆŒ	Ø:ä  Ó/ˆÔð	ð !ˆŒØ4à(ˆÔØ<à"ˆŒØ0àˆŒð	,ð ˆŒØ3àˆŒØ%ä�g‰g×Ñ˜sŸy™y¨›~¨bÑ1Ó2°1Ñ5ˆÜŸ™Ÿ™ V¨R°#©XÓ6ˆŒð	3ô œ#˜e›*Ó%ˆŒ
ð	ð 	�‰×Ñ˜RÕ ó    c                 óâ   — t        | t        «      rt        j                  | «      } | j                  D ]'  }t        | j                  |   «      | j                  |<   Œ) t        di | j                  ¤ŽS )N© )Ú
isinstanceÚstrr   ÚparseÚattribr   )ÚxmlÚkeys     r/   ÚfromxmlzPackage.fromxml  s[   € ä�cœ3ÔÜ×#Ñ# CÓ(ˆCØ—:‘:ò 	3ˆCÜ! #§*¡*¨S¡/Ó2ˆC�J‰J�sŠOð	3äÑ$˜Ÿ™Ñ$Ð$r1   c                 ó4   — | j                   |j                   k  S ©N©r   ©r,   Úothers     r/   Ú__lt__zPackage.__lt__  ó   € Ø�w‰w˜Ÿ™Ñ!Ð!r1   c                 ó    — d| j                   z  S )Nz<Package %s>r=   ©r,   s    r/   Ú__repr__zPackage.__repr__   s   € Ø §¡Ñ'Ð'r1   )NÚ NNNNÚUnknownrF   rF   rF   T©	Ú__name__Ú
__module__Ú__qualname__Ú__doc__r0   Ústaticmethodr:   r@   rD   r3   r1   r/   r   r   »   sO   „ ñð ØØØØØØØØØØóO!ðb ñ%ó ð%ò"ó(r1   r   c                   ó4   — e Zd ZdZdd„Zed„ «       Zd„ Zd„ Zy)Ú
Collectionz¨
    A directory entry for a collection of downloadable packages.
    These entries are extracted from the XML index file that is
    downloaded by ``Downloader``.
    Nc                 ó‚   — || _         	 |xs || _        	 || _        	 d | _        	 | j                  j                  |«       y r<   )r   r   ÚchildrenÚpackagesr*   r+   )r,   r   rP   r   r-   s        r/   r0   zCollection.__init__+  sH   € ØˆŒØ6à’J˜BˆŒ	Ø0à ˆŒð	,ð ˆŒð	3ð 	�‰×Ñ˜RÕ r1   c                 óJ  — t        | t        «      rt        j                  | «      } | j                  D ]'  }t        | j                  |   «      | j                  |<   Œ) | j                  d«      D �cg c]  }|j                  d«      ‘Œ }}t        dd|i| j                  ¤ŽS c c}w )NÚitemÚrefrP   r3   )r4   r5   r   r6   r7   ÚfindallÚgetrN   )r8   r9   ÚchildrP   s       r/   r:   zCollection.fromxml=  s‹   € ä�cœ3ÔÜ×#Ñ# CÓ(ˆCØ—:‘:ò 	3ˆCÜ! #§*¡*¨S¡/Ó2ˆC�J‰J�sŠOð	3à25·+±+¸fÓ2EÖF¨�E—I‘I˜eÕ$ÐFˆÐFÜÑ: 8Ð:¨s¯z©zÑ:Ð:ùò Gs   Á/B c                 ó4   — | j                   |j                   k  S r<   r=   r>   s     r/   r@   zCollection.__lt__F  rA   r1   c                 ó    — d| j                   z  S )Nz<Collection %s>r=   rC   s    r/   rD   zCollection.__repr__I  s   € Ø  4§7¡7Ñ*Ð*r1   r<   rG   r3   r1   r/   rN   rN   $  s*   „ ñó!ð$ ñ;ó ð;ò"ó+r1   rN   c                   ó   — e Zd ZdZy)ÚDownloaderMessagezSA status message object, used by ``incr_download`` to
    communicate its progress.N)rH   rI   rJ   rK   r3   r1   r/   r[   r[   R  s   „ ò!r1   r[   c                   ó   — e Zd ZdZd„ Zy)ÚStartCollectionMessagez<Data server has started working on a collection of packages.c                 ó   — || _         y r<   ©Ú
collection©r,   r`   s     r/   r0   zStartCollectionMessage.__init__Z  ó	   € Ø$ˆ�r1   N©rH   rI   rJ   rK   r0   r3   r1   r/   r]   r]   W  s
   „ ÙFó%r1   r]   c                   ó   — e Zd ZdZd„ Zy)ÚFinishCollectionMessagez=Data server has finished working on a collection of packages.c                 ó   — || _         y r<   r_   ra   s     r/   r0   z FinishCollectionMessage.__init__a  rb   r1   Nrc   r3   r1   r/   re   re   ^  s
   „ ÙGó%r1   re   c                   ó   — e Zd ZdZd„ Zy)ÚStartPackageMessagez-Data server has started working on a package.c                 ó   — || _         y r<   ©Úpackage©r,   rk   s     r/   r0   zStartPackageMessage.__init__h  ó	   € Øˆ�r1   Nrc   r3   r1   r/   rh   rh   e  ó
   „ Ù7ór1   rh   c                   ó   — e Zd ZdZd„ Zy)ÚFinishPackageMessagez.Data server has finished working on a package.c                 ó   — || _         y r<   rj   rl   s     r/   r0   zFinishPackageMessage.__init__o  rm   r1   Nrc   r3   r1   r/   rp   rp   l  ó
   „ Ù8ór1   rp   c                   ó   — e Zd ZdZd„ Zy)ÚStartDownloadMessagez.Data server has started downloading a package.c                 ó   — || _         y r<   rj   rl   s     r/   r0   zStartDownloadMessage.__init__v  rm   r1   Nrc   r3   r1   r/   rt   rt   s  rr   r1   rt   c                   ó   — e Zd ZdZd„ Zy)ÚFinishDownloadMessagez/Data server has finished downloading a package.c                 ó   — || _         y r<   rj   rl   s     r/   r0   zFinishDownloadMessage.__init__}  rm   r1   Nrc   r3   r1   r/   rw   rw   z  ó
   „ Ù9ór1   rw   c                   ó   — e Zd ZdZd„ Zy)ÚStartUnzipMessagez,Data server has started unzipping a package.c                 ó   — || _         y r<   rj   rl   s     r/   r0   zStartUnzipMessage.__init__„  rm   r1   Nrc   r3   r1   r/   r{   r{   �  s
   „ Ù6ór1   r{   c                   ó   — e Zd ZdZd„ Zy)ÚFinishUnzipMessagez-Data server has finished unzipping a package.c                 ó   — || _         y r<   rj   rl   s     r/   r0   zFinishUnzipMessage.__init__‹  rm   r1   Nrc   r3   r1   r/   r~   r~   ˆ  rn   r1   r~   c                   ó   — e Zd ZdZd„ Zy)ÚUpToDateMessagez/The package download file is already up-to-datec                 ó   — || _         y r<   rj   rl   s     r/   r0   zUpToDateMessage.__init__’  rm   r1   Nrc   r3   r1   r/   r�   r�   �  ry   r1   r�   c                   ó   — e Zd ZdZd„ Zy)ÚStaleMessagez3The package download file is out-of-date or corruptc                 ó   — || _         y r<   rj   rl   s     r/   r0   zStaleMessage.__init__™  rm   r1   Nrc   r3   r1   r/   r„   r„   –  s
   „ Ù=ór1   r„   c                   ó   — e Zd ZdZd„ Zy)ÚErrorMessagez Data server encountered an errorc                 ób   — || _         t        |t        «      rt        |«      | _        y || _        y r<   )rk   r4   Ú	Exceptionr5   Úmessage)r,   rk   rŠ   s      r/   r0   zErrorMessage.__init__   s%   € ØˆŒÜ�gœyÔ)Ü˜w›<ˆD�Là"ˆD�Lr1   Nrc   r3   r1   r/   r‡   r‡   �  s
   „ Ù*ó#r1   r‡   c                   ó   — e Zd ZdZd„ Zy)ÚProgressMessagez4Indicates how much progress the data server has madec                 ó   — || _         y r<   )Úprogress)r,   rŽ   s     r/   r0   zProgressMessage.__init__«  s	   € Ø ˆ�r1   Nrc   r3   r1   r/   rŒ   rŒ   ¨  s
   „ Ù>ó!r1   rŒ   c                   ó   — e Zd ZdZd„ Zy)ÚSelectDownloadDirMessagez:Indicates what download directory the data server is usingc                 ó   — || _         y r<   )Údownload_dir©r,   r’   s     r/   r0   z!SelectDownloadDirMessage.__init__²  s
   € Ø(ˆÕr1   Nrc   r3   r1   r/   r�   r�   ¯  s
   „ ÙDó)r1   r�   c                   óD  — e Zd ZdZdZ	 dZ	 dZ	 dZ	 dZ	 dZ		 d(d	„Z
	 	 	 	 	 	 d)d„Zd„ Zd„ Zd„ Zd„ Zd„ Zd*d„Zd„ Zd„ Zd„ Zdddddd
dej,                  fd„Zd+d„Zd+d„Zd+d„Zd+d„Zd„ Zd,d„Zd+d„Zd„ Zd „ Z d!„ Z!d"„ Z"d#„ Z# e$e"e#«      Z%d$„ Z&d%„ Z'd&„ Z( e$e'e(«      Z)d'„ Z*y)-Ú
Downloaderzy
    A class used to access the NLTK data server, which can be used to
    download corpora and other data packages.
    i  zChttps://raw.githubusercontent.com/nltk/nltk_data/gh-pages/index.xmlÚ	installedznot installedzout of dateÚpartialNc                 óä   — |xs | j                   | _        	 i | _        	 i | _        	 || _        	 d | _        	 d | _        	 i | _        	 d | _        	 | j                  €| j                  «       | _        y y r<   )
ÚDEFAULT_URLÚ_urlÚ_collectionsÚ	_packagesÚ_download_dirÚ_indexÚ_index_timestampÚ_status_cacheÚ_errorsÚdefault_download_dir)r,   Úserver_index_urlr’   s      r/   r0   zDownloader.__init__ä  sŽ   € Ø$Ò8¨×(8Ñ(8ˆŒ	Ø7àˆÔØEàˆŒØ?à)ˆÔØIàˆŒØ@à $ˆÔð	Lð  ˆÔð	ð
 ˆŒØRð ×ÑÐ%Ø!%×!:Ñ!:Ó!<ˆDÕð &r1   TFc                 óæ  — d}|€| j                   }t        d|z  «       |ret        ddt        | j                  «      z   z  «       t        d| j                  z  «       t        ddt        | j                  «      z   z  «       |dz  }dx}}	g }
|r|
j	                  d«       |r|
j	                  d	«       |
D �]†  }t        d
|j                  «       z  «       |dz  }t         t        | |«      «       t        ¬«      D �]4  }| j                  ||«      }|| j                  k(  r|rŒ(|| j                  k(  rd}|| j                  k(  rd}	| j                  d| j                  d| j                  d| j                  di|   }t        j                  d|j                   xs |j"                  z   dd¬«      dd  }t        dj%                  ||j"                  j'                  dd«      |«      «       |t        |j)                  d«      «      z  }|s�Œ|dkD  s�Œt+        d«      }|j-                  «       dv r  y d}�Œ7 t        «        �Œ‰ d}|r|dz  }|	r|dz  }t        t        j                  |d z   dd!¬"«      «       y )#Nr   z!Using default data directory (%s)ú=é   z Data server index for <%s>é   FrQ   Úcollectionsz%s:r   ©r9   TÚ*ú-ÚPú ú---------------------------éK   ú                           ©Úsubsequent_indenté   z  [{}] {} {}é   ú.ú
zHit Enter to continue: )ÚxÚqz([*] marks installed packagesz+; [-] marks out-of-date or corrupt packagesz+; [P] marks partially installed collectionsú)éL   )r²   Úwidth)r�   ÚprintÚlenrš   ÚappendÚ
capitalizeÚsortedÚgetattrr5   ÚstatusÚ	INSTALLEDÚSTALEÚPARTIALÚNOT_INSTALLEDÚtextwrapÚfillr   r   ÚformatÚljustr   ÚinputÚlower)r,   r’   Úshow_packagesÚshow_collectionsÚheaderÚmore_promptÚskip_installedÚlinesÚstaler—   Ú
categoriesÚcategoryÚinforÂ   Úprefixr   Ú
user_inputÚmsgs                     r/   ÚlistzDownloader.list	  sY  € ð ˆØÐØ×-Ñ-ˆLÜÐ5¸ÑDÔEÙÜ�#˜œc $§)¡)›nÑ,Ñ-Ô.ÜÐ/°$·)±)Ñ;Ô<Ü�#˜œc $§)¡)›nÑ,Ñ-Ô.Ø�Q‰JˆEØÐˆ�àˆ
ÙØ×Ñ˜jÔ)ÙØ×Ñ˜mÔ,Ø"ó 	ˆHÜ�%˜(×-Ñ-Ó/Ñ/Ô0Ø�Q‰JˆEÜÐ6œw t¨XÓ6Ó8¼cÔBó �ØŸ™ T¨<Ó8�Ø˜TŸ^™^Ò+±ØØ˜TŸZ™ZÒ'Ø �EØ˜TŸ\™\Ò)Ø"�Gà—N‘N CØ—J‘J Ø—L‘L #Ø×&Ñ&¨ð	ð
 ñ�ô  —}‘}Ø §	¡	Ò 4¨T¯W©WÑ5°rÈXôà�#ð�ô �n×+Ñ+¨F°D·G±G·M±MÀ"ÀcÓ4JÈDÓQÔRØœ˜TŸZ™Z¨Ó-Ó.Ñ.�Û 5¨2¤:Ü!&Ð'@Ó!A�JØ!×'Ñ'Ó)¨ZÑ7ÚØ’Eð/ô0 ŽGð7	ð8 .ˆÙØÐ@Ñ@ˆCÙØÐ@Ñ@ˆCÜŒh�m‰m˜C #™I¸ÀBÔGÕHr1   c                 óV   — | j                  «        | j                  j                  «       S r<   )Ú_update_indexrœ   ÚvaluesrC   s    r/   rQ   zDownloader.packagesE  s!   € Ø×ÑÔØ�~‰~×$Ñ$Ó&Ð&r1   c                 ó¨   — | j                  «        | j                  j                  «       D ��cg c]  \  }}|j                  dk(  sŒ|‘Œ c}}S c c}}w ©NÚcorpora©rÜ   rœ   Úitemsr   ©r,   r   Úpkgs      r/   rà   zDownloader.corporaI  ó>   € Ø×ÑÔØ%)§^¡^×%9Ñ%9Ó%;×W™	˜˜S¸s¿z¹zÈYÓ?V’ÓWÐWùÓWó   ®AÁAc                 ó¨   — | j                  «        | j                  j                  «       D ��cg c]  \  }}|j                  dk7  sŒ|‘Œ c}}S c c}}w rß   rá   rã   s      r/   ÚmodelszDownloader.modelsM  rå   ræ   c                 óV   — | j                  «        | j                  j                  «       S r<   )rÜ   r›   rÝ   rC   s    r/   r¨   zDownloader.collectionsQ  s#   € Ø×ÑÔØ× Ñ ×'Ñ'Ó)Ð)r1   c                 óH   — t        |t        «      r| j                  |«      S |S r<   )r4   r5   rÖ   )r,   Ú
info_or_ids     r/   Ú_info_or_idzDownloader._info_or_idY  s!   € Ü�j¤#Ô&Ø—9‘9˜ZÓ(Ð(àÐr1   c              #   ó  K  — |€| j                   }t        |«      –— t        |t        t        f«      r| j                  |||«      E d {  –—†  y 	 | j                  |«      }t        |t        «      r@t        |«      –— | j                  |j                  ||«      E d {  –—†  t        |«      –— y | j                  |||«      E d {  –—†  y 7 Œƒ# t        t        f$ r}t        d d|› d|› �«      –— Y d }~y d }~ww xY w7 Œ`7 Œ9­w)NzError loading ú: )r�   r�   r4   rÚ   ÚtupleÚ_download_listrì   ÚOSErrorr   r‡   rN   r]   Úincr_downloadrP   re   Ú_download_package)r,   rë   r’   ÚforcerÖ   Úes         r/   rò   zDownloader.incr_downloadh  s  è ø€ àÐØ×-Ñ-ˆLÜ*¨<Ó8Ò8ô �j¤4¬ -Ô0Ø×*Ñ*¨:°|ÀUÓK×KÐKØð	Ø×#Ñ# JÓ/ˆDô �dœJÔ'Ü(¨Ó.Ò.Ø×)Ñ)¨$¯-©-¸ÀuÓM×MÐMÜ)¨$Ó/Ó/ð ×-Ñ-¨d°LÀ%ÓH×HÑHð% Lùô œÐ$ò 	Ü˜t ~°j°\ÀÀAÀ3Ð%GÓHÒHÜûð	úð Nøð
 IúsZ   ‚ADÁ
CÁDÁC Á"=DÂD Â (DÃDÃ	DÃC=ÃC8Ã3DÃ8C=Ã=DÄDc                 óN   — t        |t        «      ryt        |j                  «      S )Nr   )r4   r   r½   rQ   )r,   rS   s     r/   Ú_num_packageszDownloader._num_packages„  s   € Ü�dœGÔ$Øä�t—}‘}Ó%Ð%r1   c              #   ó  ‡ K  — t        t        |«      «      D ]  }	 ‰ j                  ||   «      ||<   Œ t        ˆ fd„|D «       «      }d}t        |«      D ]…  \  }}t        |t        «      rd|z  }	nt        |j                  «      |z  }	‰ j                  |||«      D ]4  }
t        |
t        «      rt        ||
j                  |	z  z   «      –— Œ1|
–— Œ6 |d|	z  z  }Œ‡ y # t        t        f$ r}t        ||   |«      –— Y d }~ y d }~ww xY w­w)Nc              3   ó@   •K  — | ]  }‰j                  |«      –— Œ y ­wr<   )r÷   )Ú.0rS   r,   s     €r/   ú	<genexpr>z,Downloader._download_list.<locals>.<genexpr>”  s   øè ø€ ÒF¸˜4×-Ñ-¨d×3ÑFùs   ƒr   g      ð?éd   )Úranger½   rì   rñ   r   r‡   ÚsumÚ	enumerater4   r   rQ   rò   rŒ   rŽ   )r,   râ   r’   rô   Úirõ   Únum_packagesrŽ   rS   ÚdeltarÙ   s   `          r/   rð   zDownloader._download_listŠ  s  øè ø€ ä”s˜5“zÓ"ò 	ˆAðØ×+Ñ+¨E°!©HÓ5��a’ð	ô ÓFÀÔFÓFˆØˆÜ  Ó'ò 	$‰GˆAˆtÜ˜$¤Ô(Ø˜lÑ*‘ä˜DŸM™MÓ*¨\Ñ9�Ø×)Ñ)¨$°¸eÓDò �Ü˜c¤?Ô3Ü)¨(°S·\±\ÀEÑ5IÑ*IÓJÓJà“Ið	ð ˜˜e™Ñ#‰Hñ	$øô œZÐ(ò Ü" 5¨¡8¨QÓ/Ò/Ýûðüs.   ƒDœC³B,DÃD
Ã.DÃ?DÄD
Ä
Dc              #   ó€  K  — t        |«      –— t        d«      –— | j                  ||«      }|s7|| j                  k(  r(t	        |«      –— t        d«      –— t        |«      –— y | j                  j                  |j                  d «       t        j                  j                  ||j                  «      }t        j                  j                  t        j                  j                  |«      «      }t        j                  j                  t        j                  j                  |«      «      }|j                  |t        j                   z   «      s*t#        |d|j                  › d|j$                  › d�«      –— y t        j                  j'                  |«      r1|| j(                  k(  rt+        |«      –— t        j,                  |«       t        j.                  |d¬«       t        j.                  t        j                  j                  ||j$                  «      d¬«       t1        |«      –— t        d«      –— 	 t3        |j4                  «      }t7        |d	«      5 }	t9        d
|j:                  dz  «      }
t=        j>                  «       D ]Q  }|jA                  d«      }|	jC                  |«       |s n+|dz  dk(  sŒ2t        tE        ddd||
z  z  z   «      «      –— ŒS d d d «       |jG                  «        tK        |«      –— t        d«      –— |j                  jM                  d«      rµt        j                  j                  ||j$                  «      }|jN                  sGt        j                  j'                  t        j                  j                  ||j                  «      «      r8tQ        |«      –— tS        ||d¬«      D ]  }||_*        |–— Œ tW        |«      –— t        |«      –— y # 1 sw Y   �ŒxY w# tH        $ r5}t#        |d|j                  ›d|j4                  ›d|›�«      –— Y d }~y d }~ww xY w­w)Nr   rü   z!Path traversal blocked: package 'z9' attempted to write outside download directory (subdir='z')T©Úexist_oké   Úwbr   é @  é   éP   r¯   zError downloading z from <ú>:
  ú.zipF)Úverbose),rh   rŒ   rÂ   rÃ   r�   rp   r    Úpopr   r   r   r&   r'   ÚrealpathÚabspathÚ
startswithr   r‡   r   ÚexistsrÄ   r„   ÚremoveÚmakedirsrt   r	   r   ÚopenÚmaxr   Ú	itertoolsÚcountÚreadÚwriteÚminÚcloserñ   rw   Úendswithr)   r{   Ú_unzip_iterrk   r~   )r,   rÖ   r’   rô   rÂ   ÚfilepathÚreal_downloadÚreal_filepathÚinfileÚoutfileÚ
num_blocksÚblockÚsrõ   ÚzipdirrÙ   s                   r/   ró   zDownloader._download_package£  sN  è ø€ Ü! $Ó'Ò'Ü˜aÓ Ò ð —‘˜T <Ó0ˆÙ˜ 4§>¡>Ò1Ü! $Ó'Ò'Ü! #Ó&Ò&Ü& tÓ,Ò,Øð 	×Ñ×Ñ˜tŸw™w¨Ô-ô —7‘7—<‘< ¨d¯m©mÓ<ˆô Ÿ™×(Ñ(¬¯©¯©¸Ó)FÓGˆÜŸ™×(Ñ(¬¯©¯©¸Ó)BÓCˆØ×'Ñ'¨¼¿¹Ñ(>Ô?ÜØØ3°D·G±G°9ð ==Ø=A¿[¹[¸MÈðMóò ð
 ä�7‰7�>‰>˜(Ô#Ø˜Ÿ™Ò#Ü" 4Ó(Ò(Ü�I‰I�hÔô 	�‰�L¨4Õ0Ü
�‰”B—G‘G—L‘L ¨t¯{©{Ó;ÀdÕKô # 4Ó(Ò(Ü˜aÓ Ò ð	Ü˜TŸX™XÓ&ˆFÜ�h Ó%ð V¨Ü   D§I¡I°Ñ$;Ó<�
Ü&Ÿ_™_Ó.ò V�EØŸ™ IÓ.�AØ—M‘M !Ô$ÙÙØ˜q‘y A“~Ü-¬c°"°a¸"ÀÈ
Ñ@RÑ:SÑ6SÓ.TÓUÓUðV÷Vð �L‰LŒNô $ DÓ)Ò)Ü˜bÓ!Ò!ð �=‰=×!Ñ! &Ô)Ü—W‘W—\‘\ ,°·±Ó<ˆFð �zŠzœRŸW™WŸ^™^¬B¯G©G¯L©L¸ÀÇÁÓ,IÔJÜ'¨Ó-Ò-Ü& x°ÀÔGò �Cà"&�C”KØ“Iðô )¨Ó.Ò.ä" 4Ó(Ó(÷AVñ Vûô ò 	ÜÙØ>B¿g»gÀtÇxÃxÑQRÐSóò ô ûð	üsP   ‚H:P>È=!O= ÉAO0Ê>"O0Ë O= Ë8C8P>Ï0O:Ï5O= Ï=	P;Ð+P6Ð1P>Ð6P;Ð;P>ú[nltk_data] c	           
      ó¶  ‡‡— t        j                  t        |¬«      Š|€|�|| _        | j	                  «        ydˆˆfd„	}	| j                  |||«      D �]  }
t        |
t        «      r� |	|
j                  «       |rt        |
j                  «      ‚|r yd| _
        |sW ‰d«       t        «       j                  «       }|dv r-| j                  |
j                  j                  |||‰||«      s y|dv r y|rŒ¤t        |
t         «      r- |	d|
j"                  j                  z  «       ‰d	z  Š ‰‰«       Œát        |
t$        «      r[ ‰‰«       ‰d d
 Š| j                  r! |	d|
j"                  j                  z  «       �Œ+ |	d|
j"                  j                  z  «       �ŒLt        |
t&        «      r% |	d|
j                  j                  ›d|›d�«       �Œ�t        |
t(        «      r" |	d|
j                  j                  z  d«       �Œ³t        |
t*        «      r" |	d|
j                  j,                  z  d«       �Œåt        |
t.        «      s�Œ÷|
j0                  }�Œ y)N)ÚfileTc                 óT   •—  ‰t        j                  | ‰|z   ‰|z   dz   ¬«      «       y )Nú    )Úinitial_indentr²   )rÇ   rÈ   )r&  Úprefix2r×   Úprint_tos     €€r/   Úshowz!Downloader.download.<locals>.show	  s/   ø€ ÙÜ—M‘MØØ'-°Ñ'7Ø*0°7Ñ*:¸WÑ*Dôõr1   Fz(Error installing package. Retry? [n/y/e])ÚyÚY)rõ   ÚEúDownloading collection %rz   | éüÿÿÿz$Downloaded collection %r with errorszDone downloading collection %szDownloading package z to z...z!Package %s is already up-to-date!ú  zUnzipping %s.©rE   )Ú	functoolsr—   r¼   r�   Ú_interactive_downloadrò   r4   r‡   rŠ   r   r¡   rË   ÚstripÚdownloadrk   r   r]   r`   re   rh   r�   r{   r'   r�   r’   )r,   rë   r’   Úquietrô   r×   Úhalt_on_errorÚraise_on_errorÚprint_error_tor0  rÙ   Úchoicer/  s        `      @r/   r;  zDownloader.downloadñ  s  ù€ ô ×$Ñ$¤U°Ô@ˆàÐð Ð'Ø%1�Ô"Ø×&Ñ&Ô(Øöð ×)Ñ)¨*°lÀEÓJó <8�ä˜c¤<Ô0Ù˜Ÿ™Ô%Ù%Ü(¨¯©Ó5Ð5Ù$Ù$Ø#'�D”LÙ Ù Ð!KÔLÜ!&£§¡£˜Ø! ZÑ/Ø#'§=¡=Ø #§¡§¡Ø ,Ø %Ø %Ø &Ø -Ø .ô$ñ (-Ø# zÑ1Ù#(ò ä! #Ô'=Ô>ÙÐ8¸3¿>¹>×;LÑ;LÑLÔMØ 'Ñ)˜Ù  Õ(Ü# CÔ)@ÔAÙ  Ô(Ø!'¨¨ ˜ØŸ<š<Ù Ø FØ"%§.¡.×"3Ñ"3ñ!4öñ
 !Ð!AÀCÇNÁN×DUÑDUÑ!UÖVô $ CÔ)<Ô=Úà"Ÿ{™{Ÿ~›~ª|ð=öô $ C¬Ô9ÙÐ@À3Ç;Á;Ç>Á>ÑQÐSWÖXô $ CÔ):Ô;Ù˜_¨s¯{©{×/CÑ/CÑCÀTÖJô $ CÔ)AÖBØ'*×'7Ñ'7šðy<8ðz r1   c                 ó@   — | j                  ||«      | j                  k(  S r<   )rÂ   rÄ   ©r,   rë   r’   s      r/   Úis_stalezDownloader.is_staleQ  s   € Ø�{‰{˜: |Ó4¸¿
¹
ÑBÐBr1   c                 ó@   — | j                  ||«      | j                  k(  S r<   )rÂ   rÃ   rB  s      r/   Úis_installedzDownloader.is_installedT  s   € Ø�{‰{˜: |Ó4¸¿¹ÑFÐFr1   c                 óv   — |€| j                   j                  «        y | j                   j                  |d «       y r<   )r    Úclearr  ©r,   r   s     r/   Úclear_status_cachezDownloader.clear_status_cacheW  s/   € Øˆ:Ø×Ñ×$Ñ$Õ&à×Ñ×"Ñ" 2 tÕ,r1   c                 ó  — |€| j                   }| j                  |«      }t        |t        «      r´|j                  D �cg c]  }| j                  |j                  «      ‘Œ }}| j                  |v r| j                  S | j                  |v r| j                  S | j                  |v r| j                  |v r| j                  S | j                  |v r| j                  S | j                  S t        j                  j                  ||j                  «      }|| j                   k7  r| j                  ||«      S |j                  | j                   vr)| j                  ||«      | j                   |j                  <   | j                   |j                     S c c}w )zÀ
        Return a constant describing the status of the given package
        or collection.  Status can be one of ``INSTALLED``,
        ``NOT_INSTALLED``, ``STALE``, or ``PARTIAL``.
        )r�   rì   r4   rN   rQ   rÂ   r   rÄ   rÅ   rÃ   rÆ   r   r   r&   r'   Ú_pkg_statusr    )r,   rë   r’   rÖ   rä   Ú
pkg_statusr  s          r/   rÂ   zDownloader.status]  sQ  € ð ÐØ×-Ñ-ˆLØ×Ñ 
Ó+ˆô �dœJÔ'Ø9=¿¹ÖG°#˜$Ÿ+™+ c§f¡fÕ-ÐGˆJÐGØ�z‰z˜ZÑ'Ø—z‘zÐ!Ø—‘ Ñ+Ø—|‘|Ð#Ø—‘ :Ñ-°$×2DÑ2DÈ
Ñ2RØ—|‘|Ð#Ø×#Ñ# zÑ1Ø×)Ñ)Ð)à—~‘~Ð%ô —w‘w—|‘| L°$·-±-Ó@ˆHØ˜t×1Ñ1Ò1Ø×'Ñ'¨¨hÓ7Ð7à—7‘7 $×"4Ñ"4Ñ4Ø26×2BÑ2BÀ4ÈÓ2R�D×&Ñ& t§w¡wÑ/Ø×)Ñ)¨$¯'©'Ñ2Ð2ùò) Hs   ¾"F	c                 ó¢  — t         j                  j                  |«      s| j                  S 	 t        j                  |«      }|j                  t        |j                  «      k7  r| j                  S t        |dd «      }|rt        |«      |k7  rq| j                  S t        | dd«      s#t        j                  dt        d¬«       d| _        t        |dd «      }|s| j                  S t!        |«      |k7  r| j                  S |j#                  d	«      r›|d d
 }t         j                  j                  |«      s| j$                  S t         j                  j'                  |«      s| j                  S t)        d„ t        j*                  |«      D «       «      }||j,                  k7  r| j                  S | j$                  S # t
        $ r | j                  cY S w xY w)NÚsha256_checksumÚ_warned_missing_sha256_checksumFzÅNLTK downloader package metadata is missing SHA256 checksums; falling back to legacy MD5 verification. Consider updating your NLTK data index (or re-running the downloader) to get SHA256 checksums.r	  ©Ú
stacklevelTr   r  r5  c              3   ó¬   K  — | ]L  \  }}}|D ]A  }t        j                  t         j                  j                  ||«      «      j                  –— ŒC ŒN y ­wr<   )r   Ústatr   r&   Úst_size)rú   ÚdÚ_ÚfilesÚfs        r/   rû   z)Downloader._pkg_status.<locals>.<genexpr>«  sQ   è ø€ ò  á�A�q˜%Øò ð ô —‘œŸ™Ÿ™ Q¨Ó*Ó+×3Õ3ð Ø3ñ ùs   ‚AA)r   r   r  rÆ   rS  rñ   rT  r   r   rÄ   rÁ   Úsha256_hexdigestÚwarningsÚwarnÚRuntimeWarningrO  Úmd5_hexdigestr  rÃ   Úisdirrþ   Úwalkr   )r,   rÖ   r  ÚfilestatrN  Úmd5_checksumÚunzipdirr   s           r/   rK  zDownloader._pkg_status  s”  € Ü�w‰w�~‰~˜hÔ'Ø×%Ñ%Ð%ð	&Ü—w‘w˜xÓ(ˆHð ×Ñœs 4§9¡9›~Ò-Ø—:‘:Ðô " $Ð(9¸4Ó@ˆÙÜ Ó)¨_Ò<Ø—z‘zÐ!ä˜4Ð!BÀEÔJÜ—‘ð^ô #Ø õð 8<�Ô4ä" 4¨°TÓ:ˆLÙØ—z‘zÐ!Ü˜XÓ&¨,Ò6Ø—z‘zÐ!ð ×Ñ˜VÔ$Ø  �}ˆHÜ—7‘7—>‘> (Ô+Ø—~‘~Ð%Ü—7‘7—=‘= Ô*Ø—z‘zÐ!äñ  ä#%§7¡7¨8Ó#4ô ó ˆMð
  × 2Ñ 2Ò2Ø—z‘zÐ!ð �~‰~Ðøô] ò 	&Ø×%Ñ%Ò%ð	&ús   ­F6 Æ6GÇGc                 ó´   — | j                  «        | j                  «       D ]5  }| j                  |«      | j                  k(  sŒ"| j	                  |||¬«       Œ7 y)zA
        Re-download any packages whose status is STALE.
        )r<  r×   N)rI  rQ   rÂ   rÄ   r;  )r,   r<  r×   rä   s       r/   r+   zDownloader.update¶  sL   € ð 	×ÑÔ!Ø—=‘=“?ò 	?ˆCØ�{‰{˜3Ó 4§:¡:Ó-Ø—‘˜c¨°v�Õ>ñ	?r1   c                 óÜ  — | j                   �1|€/t        j                  «       | j                  z
  | j                  kD  sy|xs | j                  | _        t
        j                  j                  t        j                  t        | j                  «      «      j                  «       «      | _         t        j                  «       | _        | j                   j                  d«      D �cg c]  }t        j                  |«      ‘Œ }}|D �ci c]  }|j                  |“Œ c}| _        | j                   j                  d«      D �cg c]  }t"        j                  |«      ‘Œ }}|D �ci c]  }|j                  |“Œ c}| _        | j$                  j'                  «       D ]œ  }t)        |j*                  «      D ]‚  \  }}|| j                   v r| j                   |   |j*                  |<   Œ1|| j$                  v r| j$                  |   |j*                  |<   Œ\t-        dj/                  |«      «       |j*                  |= Œ„ Œž | j$                  j'                  «       D ]o  }i }|g}	|	D ]N  }
t1        |
t"        «      r|	j3                  |
j*                  «       Œ/t1        |
t        «      r|
||
j                  <   ŒOŒP |j'                  «       |_        Œq | j6                  j9                  «        yc c}w c c}w c c}w c c}w )z–A helper function that ensures that self._index is
        up-to-date.  If the index is older than self.INDEX_TIMEOUT,
        then download it again.Núpackages/packageúcollections/collectionz.removing collection member with no package: {})rž   ÚtimerŸ   ÚINDEX_TIMEOUTrš   ÚnltkÚ	internalsÚElementWrapperr   r6   r	   ÚgetrootrU   r   r:   r   rœ   rN   r›   rÝ   rÿ   rP   r¼   rÉ   r4   ÚextendrQ   r    rG  )r,   r   ÚprQ   Úcr¨   r`   r   Úchild_idÚqueuerW   s              r/   rÜ   zDownloader._update_indexÃ  s‰  € ð �K‰KÐØˆÜ�y‰y‹{˜T×2Ñ2Ñ2°T×5GÑ5GÒGàð Ò$˜4Ÿ9™9ˆŒ	ô —n‘n×3Ñ3Ü×Ñœg d§i¡iÓ0Ó1×9Ñ9Ó;ó
ˆŒô !%§	¡	£ˆÔð 15·±×0CÑ0CÐDVÓ0WÖX¨1”G—O‘O AÕ&ÐXˆÐXØ+3Ö4 a˜!Ÿ$™$ ™'Ò4ˆŒð ,0¯;©;×+>Ñ+>Ð?WÓ+Xö
Ø&'ŒJ×Ñ˜qÕ!ð
ˆð 
ð /:Ö:¨˜QŸT™T 1™WÒ:ˆÔð ×+Ñ+×2Ñ2Ó4ò 	/ˆJÜ(¨×)<Ñ)<Ó=ò /‘��8Ø˜tŸ~™~Ñ-Ø-1¯^©^¸HÑ-E�J×'Ñ'¨Ò*Ø ×!2Ñ!2Ñ2Ø-1×->Ñ->¸xÑ-H�J×'Ñ'¨Ò*äØH×OÑOØ$óôð
 #×+Ñ+¨AÑ.ñ/ð	/ð ×+Ñ+×2Ñ2Ó4ò 
	4ˆJØˆHØ�LˆEØò �Ü˜e¤ZÔ0Ø—L‘L §¡Õ0Ü ¤wÔ/Ø).�H˜UŸX™XÒ&àðð #+§/¡/Ó"3ˆJÕð
	4ð 	×Ñ× Ñ Õ"ùòM YùÚ4ùò
ùò ;s   Ã!KÄKÄ<K$ÅK)c                 ó:   — | j                  «        | j                  S )z±
        Return the XML index describing the packages available from
        the data server.  If necessary, this index will be downloaded
        from the data server.
        )rÜ   rž   rC   s    r/   ÚindexzDownloader.index  s   € ð 	×ÑÔØ�{‰{Ðr1   c                 ó²   — | j                  «        || j                  v r| j                  |   S || j                  v r| j                  |   S t        d|z  «      ‚)zKReturn the ``Package`` or ``Collection`` record for the
        given item.úPackage %r not found in index)rÜ   rœ   r›   r   rH  s     r/   rÖ   zDownloader.info
  s[   € ð 	×ÑÔØ�—‘ÑØ—>‘> "Ñ%Ð%Ø�×"Ñ"Ñ"Ø×$Ñ$ RÑ(Ð(ÜÐ8¸2Ñ=Ó>Ð>r1   c                 ó  — | j                  «        | j                  j                  d«      D ]  }|j                  d«      |k(  sŒ|c S  | j                  j                  d«      D ]  }|j                  d«      |k(  sŒ|c S  t	        d|z  «      ‚)z-Return the XML info record for the given itemre  r   rf  ru  )rÜ   rž   rU   rV   r   )r,   r   rk   r`   s       r/   ÚxmlinfozDownloader.xmlinfo  sŽ   € à×ÑÔØ—{‘{×*Ñ*Ð+=Ó>ò 	ˆGØ�{‰{˜4Ó  BÓ&Ø’ð	ð Ÿ+™+×-Ñ-Ð.FÓGò 	"ˆJØ�~‰~˜dÓ# rÓ)Ø!Ò!ð	"ô Ð8¸2Ñ=Ó>Ð>r1   c                 ó   — | j                   S )z)The URL for the data server's index file.)rš   rC   s    r/   Ú_get_urlzDownloader._get_url#  s   € à�y‰yÐr1   c                 ój   — | j                   }	 | j                  |«       y# t        $ r	 || _         ‚ w xY w)z…
        Set a new URL for the data server. If we're unable to contact
        the given url, then the original url is kept.
        N)rš   rÜ   r‰   )r,   r   Úoriginal_urls      r/   Ú_set_urlzDownloader._set_url'  s9   € ð
 —y‘yˆð	Ø×Ñ˜sÕ#øÜò 	Ø$ˆDŒIØð	ús   Ž   2c                 óü  — dt         j                  v ryt        j                  j                  D ]E  }t         j                  j                  |«      sŒ#t        j                  j                  |«      sŒC|c S  t        j                  dk(  r&dt         j                  v rt         j                  d   }n/t         j                  j                  d«      }|dk(  rt        d«      ‚t         j                  j                  |d«      S )a×  
        Return the directory to which packages will be downloaded by
        default.  This value can be overridden using the constructor,
        or on a case-by-case basis using the ``download_dir`` argument when
        calling ``download()``.

        On Windows, the default download directory is
        ``PYTHONHOME/lib/nltk``, where *PYTHONHOME* is the
        directory containing Python, e.g. ``C:\Python25``.

        On all other platforms, the default directory is the first of
        the following which exists or which can be created with write
        permission: ``/usr/share/nltk_data``, ``/usr/local/share/nltk_data``,
        ``/usr/lib/nltk_data``, ``/usr/local/lib/nltk_data``, ``~/nltk_data``.
        ÚAPPENGINE_RUNTIMENÚwin32ÚAPPDATAz~/z+Could not find a default download directoryÚ	nltk_data)r   Úenvironri  Údatar   r  rj  Úis_writableÚsysÚplatformÚ
expanduserr   r&   )r,   ÚnltkdirÚhomedirs      r/   r¢   zDownloader.default_download_dir5  s¹   € ð" ¤"§*¡*Ñ,Øô —y‘y—~‘~ò 	ˆGÜ�w‰w�~‰~˜gÕ&¬4¯>©>×+EÑ+EÀgÕ+NØ’ð	ô
 �<‰<˜7Ò" y´B·J±JÑ'>Ü—j‘j Ñ+‰Gô —g‘g×(Ñ(¨Ó.ˆGØ˜$ŠÜ Ð!NÓOÐOô �w‰w�|‰|˜G [Ó1Ð1r1   c                 ó   — | j                   S )a  
        The default directory to which packages will be downloaded.
        This defaults to the value returned by ``default_download_dir()``.
        To override this default on a case-by-case basis, use the
        ``download_dir`` argument when calling ``download()``.
        )r�   rC   s    r/   Ú_get_download_dirzDownloader._get_download_dir\  s   € ð ×!Ñ!Ð!r1   c                 óF   — || _         | j                  j                  «        y r<   )r�   r    rG  r“   s     r/   Ú_set_download_dirzDownloader._set_download_dire  s   € Ø)ˆÔà×Ñ× Ñ Õ"r1   c                 ó„  — t         j                  j                  dd«      j                  «       dk(  rt	        | «      j                  «        y 	 dd l}	 t        | «      j                  «        y # t        $ r t	        | «      j                  «        Y y w xY w# |j                  $ r t	        | «      j                  «        Y y w xY w)NÚ'NLTK_DOWNLOADER_FORCE_INTERACTIVE_SHELLÚfalseÚtruer   )r   r‚  rV   rÌ   ÚDownloaderShellÚrunÚtkinterÚImportErrorÚDownloaderGUIÚmainloopÚTclError)r,   r”  s     r/   r9  z Downloader._interactive_downloadp  s¨   € ô �J‰J�N‰NÐDÀgÓN×TÑTÓVØòô ˜DÓ!×%Ñ%Ô'Øð	Ûð
	(Ü˜$Ó×(Ñ(Õ*øô ò 	Ü˜DÓ!×%Ñ%Ô'Ùð	ûð ×Ñò 	(Ü˜DÓ!×%Ñ%Ö'ð	(ús$   ÁA, ÁB Á,"BÂBÂ(B?Â>B?)NN)NTTTFF)NFr<   )Fr(  )+rH   rI   rJ   rK   rh  r™   rÃ   rÆ   rÄ   rÅ   r0   rÚ   rQ   rà   rè   r¨   rì   rò   r÷   rð   ró   r…  Ústderrr;  rC  rE  rI  rÂ   rK  r+   rÜ   rs  rÖ   rw  ry  r|  Úpropertyr   r¢   r‹  r�  r’   r9  r3   r1   r/   r•   r•   »  s7  „ ñð €Mðð X€Kð!ð €Ið$à#€Mðà€Eð"à€GðEó=ðN ØØØØØó:Iòx'òXòXò*òóIò8&ò$ò2L)ð` ØØØØØØØ—z‘zó^ó@CóGó-ó 3òD5ón?ó<#ò|ò?ò	?òò
ñ �8˜XÓ
&€Cò%2òN"ò#ñ
 Ð-Ð/@ÓA€Ló(r1   r•   c                   ó<   — e Zd Zd„ Zd„ Zd„ Zd„ Zd„ Zd„ Zd„ Z	d„ Z
y	)
r’  c                 ó   — || _         y r<   )Ú_ds)r,   Ú
dataservers     r/   r0   zDownloaderShell.__init__‰  s	   € Øˆ�r1   c                 ó¸   — t        d«       dt        d„ |D «       «      z
  t        |«      dz
  z  dz  }t        d|j                  |«      z   «       t        d«       y )NzK---------------------------------------------------------------------------éD   c              3   ó2   K  — | ]  }t        |«      –— Œ y ­wr<   )r½   )rú   Úos     r/   rû   z;DownloaderShell._simple_interactive_menu.<locals>.<genexpr>Ž  s   è ø€ Ò0 1œ˜AŸÑ0ùs   ‚r   r­   r,  )r¼   rþ   r½   r&   )r,   ÚoptionsÚspcs      r/   Ú_simple_interactive_menuz(DownloaderShell._simple_interactive_menuŒ  sN   € ÜˆhŒØ”CÑ0¨Ô0Ó0Ñ0´c¸'³lÀQÑ6FÑGÈ#ÑMˆÜˆf�s—x‘x Ó(Ñ(Ô)Üˆh�r1   c                 ó
  — t        d«       	 | j                  dddddd«       t        d	«      j                  «       }|st        «        Œ=|j	                  «       j                  «       d
   }|j                  «       dd  }	 |dk(  r=t        «        | j                  j                  | j                  j                  dd¬«       nl|dk(  r| j                  «        nV|dk(  r| j                  «        n@|dv ry |dk(  r| j                  |«       n$|dk(  r| j                  «        nt        d|z  «       t        «        �Œ+# t        $ r}t        d|z  «       Y d }~Œ(d }~wt        $ r"}t        d|j                  z  «       Y d }~ŒQd }~ww xY w)NúNLTK DownloaderTzd) Downloadzl) Listz
 u) Updatez	c) Configzh) Helpzq) QuitzDownloader> r   r   ÚlF)rÏ   rÐ   Úhro  )r¸   r·   rU  ÚuzCommand %r unrecognizedzError reading from server: %szError connecting to server: %s)r¼   r¥  rË   r:  rÌ   r   r�  rÚ   r’   Ú_simple_interactive_helpÚ_simple_interactive_configÚ_simple_interactive_downloadÚ_simple_interactive_updater   r   Úreason)r,   rØ   ÚcommandÚargsrõ   s        r/   r“  zDownloaderShell.run’  si  € ÜÐÔ ØØ×)Ñ)ØØØØØØôô ˜~Ó.×4Ñ4Ó6ˆJÙÜ”ØØ ×&Ñ&Ó(×.Ñ.Ó0°Ñ3ˆGØ×#Ñ#Ó% a bÐ)ˆDðCØ˜c’>Ü”GØ—H‘H—M‘M $§(¡(×"7Ñ"7ÀÐSW�MÕXØ ’^Ø×1Ñ1Õ3Ø ’^Ø×3Ñ3Õ5Ø 
Ñ*ØØ ’^Ø×5Ñ5°dÕ;Ø ’^Ø×3Ñ3Õ5äÐ3°jÑ@ÔAô ŒGñK øô> ò ;ÜÐ5¸Ñ9×:Ñ:ûÜò CÜÐ6¸¿¹ÑA×BÑBûðCús+   Á>A2D8 Ã1;D8 Ä8	FÅEÅFÅ E=Å=Fc                 óR  — |r&|D ]   }	 | j                   j                  |d¬«       Œ" y 	 t	        «        t	        d«       t        d«      }|j                  «       dk(  r4| j                   j                  | j                   j                  ddd¬«       Œh|j                  «       d	v ry |r4|j                  «       D ]   }	 | j                   j                  |d¬«       Œ" y Œ±# t        t        f$ r}t	        |«       Y d }~Œõd }~ww xY w# t        t        f$ r}t	        |«       Y d }~Œkd }~ww xY w)
Nr,  ©r×   Tz*Download which package (l=list; x=cancel)?ú  Identifier> r¨  F)rÏ   rÐ   rÑ   ©r·   r¸   rE   )
r�  r;  rñ   r   r¼   rË   rÌ   rÚ   r’   r   )r,   r±  Úargrõ   rØ   r   s         r/   r­  z,DownloaderShell._simple_interactive_download»  s#  € ÙØò �ðØ—H‘H×%Ñ% c°&Ð%Õ9ñð Ü”ÜÐBÔCÜ"Ð#3Ó4�
Ø×#Ñ#Ó%¨Ò,Ø—H‘H—M‘MØŸ™×-Ñ-Ø$Ø$(Ø'+ð	 "ô ð Ø×%Ñ%Ó'¨>Ñ9ØÙØ(×.Ñ.Ó0ò %˜ð%Ø ŸH™H×-Ñ-¨b¸Ð-Õ@ð%ð
 ð) øô  ¤Ð,ò Ü˜!—H‘Hûðûô* !(¬Ð4ò %Ü! !ŸH™Hûð%ús/   ‰CÂ:DÃC?Ã*C:Ã:C?ÄD&ÄD!Ä!D&c           	      ó(  — 	 g }dx}}t         t        | j                  d«      «       t        ¬«      D ]\  }| j                  j	                  |«      | j                  j
                  k(  sŒ6|j                  |j                  |j                  f«       Œ^ t        «        |rÂt        d«       |D ]N  \  }}t        j                  d|z   dd¬«      d	d  }t        d
j                  |j                  dd«      |«      «       ŒP t        «        t        d«      }|j                  «       dk(  r)|D ]#  \  }}	 | j                  j!                  |d¬«       Œ% y |j                  «       dv ry t        d«       y �Œk# t"        t$        f$ r}	t        |	«       Y d }	~	Œgd }	~	ww xY w)NFrQ   r©   z/Will update following packages (o=ok; x=cancel)r®   r¯   r°   r±   r³   z  [ ] {} {}r´   rµ   r´  r¢  r,  r³  rµ  zNothing to update.)rÀ   rÁ   r�  r5   rÂ   rÄ   r¾   r   r   r¼   rÇ   rÈ   rÉ   rÊ   rË   rÌ   r;  rñ   r   )
r,   Ústale_packagesrÓ   r—   rÖ   ÚpidÚpnamer   rØ   rõ   s
             r/   r®  z*DownloaderShell._simple_interactive_updateÙ  s  € ØØˆNØ#Ð#ˆE�GÜÐ<œw t§x¡x°Ó<Ó>ÄCÔHò @�Ø—8‘8—?‘? 4Ó(¨D¯H©H¯N©NÓ:Ø"×)Ñ)¨4¯7©7°D·I±IÐ*>Õ?ð@ô ŒGÙÜÐGÔHØ"0ò J‘J�C˜Ü#Ÿ=™=Ø  EÑ*¨BÀ(ôà�cð�Dô ˜-×.Ñ.¨s¯y©y¸¸SÓ/AÀ4ÓHÕIð	Jô
 ”ä"Ð#3Ó4�
Ø×#Ñ#Ó%¨Ò,Ø&4ò %™
˜˜Uð%Ø ŸH™H×-Ñ-¨c¸&Ð-ÕAð%ð
 Ø×%Ñ%Ó'¨>Ñ9ØäÐ*Ô+Øñ; øô, !(¬Ð4ò %Ü! !ŸH™Hûð%ús   Ä,E-Å-FÅ<FÆFc                 óp   — t        «        t        d«       t        d«       t        d«       t        d«       y )Nz	Commands:zH  d) Download a package or collection     u) Update out of date packagesz1  l) List packages & collections          h) Helpz1  c) View & Modify Configuration          q) Quit)r¼   rC   s    r/   r«  z(DownloaderShell._simple_interactive_helpù  s.   € ÜŒÜˆkÔÜØVô	
ô 	ÐAÔBÜÐAÕBr1   c                 óœ  — t        «        t        d«       t        d| j                  j                  z  «       t        dt        | j                  j	                  «       «      z  «       t        dt        | j                  j                  «       «      z  «       t        «        t        d«       t        d| j                  j                  z  «       y )NzData Server:z  - URL: <%s>z$  - %d Package Collections Availablez$  - %d Individual Packages AvailablezLocal Machine:z  - Data directory: %s)r¼   r�  r   r½   r¨   rQ   r’   rC   s    r/   Ú_show_configzDownloaderShell._show_config  sŠ   € ÜŒÜˆnÔÜˆo §¡§¡Ñ,Ô-ÜÐ4´s¸4¿8¹8×;OÑ;OÓ;QÓ7RÑRÔSÜÐ4´s¸4¿8¹8×;LÑ;LÓ;NÓ7OÑOÔPÜŒÜÐÔÜÐ&¨¯©×)>Ñ)>Ñ>Õ?r1   c                 óÂ  — | j                  «        	 t        «        | j                  dddd«       t        d«      j	                  «       j                  «       }|dk(  r| j                  «        nË|dk(  rit        d«      j	                  «       }|d	v rt        d
«       n�t        j                  j                  |«      r|| j                  _
        nlt        d|z  «       n]|dk(  rRt        d«      j	                  «       }|d	v rt        d
«       n/|j                  d«      sd|z   }	 || j                  _        n|dk(  ry �Œ(# t        $ r}t        d|›d|› �«       Y d }~Œ!d }~ww xY w)Nzs) Show Configzu) Set Server URLzd) Set Data Dirzm) Main MenuzConfig> r&  rU  z  New Directory> )rE   r·   r¸   ÚXÚQz  Cancelled!z)Directory %r not found!  Create it first.rª  z  New URL> )zhttp://úhttps://rÁ  zError reading <r  Úm)r½  r¼   r¥  rË   r:  rÌ   r   r   r^  r�  r’   r  r   r‰   )r,   rØ   Ú
new_dl_dirÚnew_urlrõ   s        r/   r¬  z*DownloaderShell._simple_interactive_config  sL  € Ø×ÑÔØÜŒGØ×)Ñ)Ø Ð"5Ð7HÈ.ôô ˜zÓ*×0Ñ0Ó2×8Ñ8Ó:ˆJØ˜SÒ Ø×!Ñ!Õ#Ø˜sÒ"Ü"Ð#6Ó7×=Ñ=Ó?�
ØÐ!9Ñ9Ü˜.Õ)Ü—W‘W—]‘] :Ô.Ø,6�D—H‘HÕ)äÐEÈ
ÑRÕSØ˜sÒ"Ü Ó.×4Ñ4Ó6�ØÐ6Ñ6Ü˜.Õ)à"×-Ñ-Ð.EÔFØ",¨wÑ"6˜ðFØ'.˜Ÿ™�ð ˜sÒ"Øñ9 øô2 %ò FÜ °¨{¸&ÀÀÐD×EÑEûðFús   Ä D: Ä:	EÅEÅEN)rH   rI   rJ   r0   r¥  r“  r­  r®  r«  r½  r¬  r3   r1   r/   r’  r’  ˆ  s.   „ òòò'òRò<ò@Cò@ór1   r’  c                   ó\  — e Zd ZdZg d¢Z	 dddddœZ	 dddd	d	d
dœZ	 dZ	 g d¢Z	 eD ]  Z	e	ev rŒJ ‚ eD ]  Z	e	ev rŒJ ‚ eD ]  Z	e	ev rŒJ ‚ dZ
ej                  dej                  dej                  dej                  diZdZdZdZdZdZdBd„Zd„ Zd„ Zd„ Zd„ Zd„ Zd„ ZdCd„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/d0„ Z0d1„ Z1d2„ Z2d3„ Z3d4„ Z4d5„ Z5 e6jn                  d6«      Z8d7„ Z9d8„ Z:dZ;d9„ Z<d:„ Z=d;„ Z>d<„ Z?d=„ Z@ G d>„ d?eAj„                  «      ZCd@ZDdA„ ZEy)Dr–  zU
    Graphical interface for downloading packages from the NLTK data
    server.
    )rE   Ú
IdentifierÚNameÚSizeÚStatusúUnzipped SizeÚ	CopyrightÚContactÚLicenseÚAuthorÚSubdirÚChecksumr   r  )rE   rÇ  rÈ  rÉ  r   r´   é-   é
   é   )rE   rÆ  rÇ  rÈ  rÊ  rÉ  é   )rE   rÆ  rÇ  rÈ  rÉ  )z#000z#ccc)z#afaz#080)z#ffaz#880)z#faaz#800)ú#fffz#888)rÕ  z#45c)ú#aaaz#67a)z#f00rÖ  zhelvetica -16 boldc                 óÂ  — dd l }ddlm} || _        || _        t        j                  «       | _        g | _        g | _	        d| _
        i | _        g | _        d| _        | j                  d«       |j                  «       x}| _        |j#                  d«       |j%                  d«       |j'                  | j(                  d   ¬«       |j+                  d	| j,                  «       |j+                  d
| j,                  «       d| _        i | _        | j3                  «        | j5                  «        	 | j7                  «        | j?                  «        | jA                  «        | jB                  jE                  d«       | jB                  j+                  d| jF                  «       y # t8        $ r} |d|«       Y d }~Œyd }~wt:        $ r} |d|j<                  «       Y d }~Œ�d }~ww xY w)Nr   ©Ú	showerrorFzNLTK Downloader Started!z+50+50r§  r   )Ú
backgroundz<Control-q>z<Control-x>úError reading from serverúError connecting to serverz	<Destroy>)$r”  Útkinter.messageboxrÙ  r�  Ú_use_threadsÚ	threadingÚLockÚ_download_lockÚ_download_msg_queueÚ_download_abort_queueÚ_downloadingÚ_afteridÚ_log_messagesÚ_log_indentÚ_logÚTkÚtopÚgeometryÚtitleÚ	configureÚ_BACKDROP_COLORÚbindÚdestroyÚ
_destroyedÚ_column_varsÚ_init_widgetsÚ
_init_menuÚ_fill_tabler   r   r¯  Ú
_show_infoÚ_select_columnsÚ_tableÚselectÚ_destroy)r,   rž  Úuse_threadsr”  rÙ  rê  rõ   s          r/   r0   zDownloaderGUI.__init__‡  s�  € ó 	Ý0àˆŒØ'ˆÔô (Ÿn™nÓ.ˆÔØ#%ˆÔ Ø%'ˆÔ"Ø!ˆÔð ˆŒð  ˆÔØˆÔØ�	‰	Ð,Ô-ð !Ÿ™›Ð%ˆˆdŒhØ�‰�XÔØ�	‰	Ð#Ô$Ø�‰ ×!5Ñ!5°aÑ!8ˆÔ9ð 	�‰� §¡Ô-Ø�‰� §¡Ô-ØˆŒàˆÔð 	×ÑÔØ�‰Ôð	>Ø×ÑÔð 	�‰ÔØ×ÑÔØ�‰×Ñ˜1Ôð 	�‰×Ñ˜ d§m¡mÕ4øô ò 	6ÙÐ1°1×5Ñ5ûÜò 	>ÙÐ2°A·H±H×=Ñ=ûð	>ús$   Ä,F Æ	GÆ'	F5Æ5GÇGÇGc                 óš   — | j                   j                  dj                  t        j                  «       d| j
                  z  |«      «       y )Nz{} {}{}z | )ræ  r¾   rÉ   rg  Úctimerç  ©r,   rÙ   s     r/   rè  zDownloaderGUI._log½  s9   € Ø×Ñ×!Ñ!Ø×ÑœTŸZ™Z›\¨5°4×3CÑ3CÑ+CÀSÓIõ	
r1   c                 ó*  ‡ — dd l }ddlm} |j                  ‰ j                  dddd¬«      }|j                  ddd	¬
«       |j                  dd¬«       |j                  dd¬«       |j                  |d¬«      j                  dd¬«       |j                  |«      }|j                  ddd¬«       |j                  |«      }|j                  ddd¬«       |j                  |«      }|j                  ddd¬«       |j                  |d¬«      j                  dd¬«       |j                  |«      }|j                  ddd¬«       |j                  |d¬«      j                  dd¬«       |j                  ‰ j                  dd‰ j                  d   ¬«      }|j                  dd¬«       d‰ j                  d<   d‰ j                  d<   g d¢‰ _
        i ‰ _        t        ‰ j                  «      D ]x  \  }	}
|j                  ||
‰ j                  ¬«      }|j                  d|	dz   dz  dz  ¬«       |j                  d ‰ j                   «       |‰ j                  |
j#                  «       <   Œz ‰ j$                  D �cg c]  }‰ j&                  j)                  |d«      ‘Œ  }} ||‰ j$                  |dd!‰ j*                  ¬"«      ‰ _        ‰ j,                  j/                  d‰ j0                  d   ¬#«       t        ‰ j$                  «      D ]H  \  }	}‰ j2                  j)                  |‰ j4                  «      }‰ j,                  j/                  |	|¬$«       ŒJ ‰ j,                  j                  dd	¬%«       ‰ j,                  j7                  «        ‰ j,                  j9                  d&‰ j:                  «       ‰ j,                  j                  d'‰ j<                  «       ‰ j,                  j                  d(‰ j:                  «       ‰ j,                  j                  d)‰ j>                  «       ‰ j,                  j                  d*‰ j@                  «       ‰ j,                  j                  d+‰ jB                  «       |j                  dd¬«       d,d-‰ jD                  fd.d/‰ jF                  fg}i ‰ _$        t        |«      D ]œ  \  }	\  }}}|j                  ||¬0«      j                  d|	d1¬«       |jK                  |d2d3d4d4¬5«      }||f‰ jH                  |<   |j                  d(‰ jL                  «       |j                  d |fˆ fd6„	«       |j                  d|	d7¬«       Œž ‰ j                  j                  d ‰ jL                  «       |jO                  |d8‰ j:                  d¬9«      ‰ _(        ‰ jP                  j                  d¬:«       |jO                  |d;‰ jR                  d¬9«      ‰ _*        ‰ jT                  j                  d<¬:«       |j                  |d=‰ j                  d   ‰ j                  d   ¬>«      ‰ _+        |jY                  |d?d!‰ jZ                  d   d@d¬A«      ‰ _.        ‰ j_                  «        ‰ j\                  j                  d<¬:«       ‰ jV                  j                  d¬:«       y c c}w )BNr   )ÚTableÚraisedr	  é   )ÚreliefÚborderÚpadxÚpadyrê  TÚboth)ÚsidÚexpandrÈ   r   )Úweight)Úheight)ÚcolumnÚrowÚnews)r  r  Ústickyr§   é   r  é   )r  r  rÚ  Úbottomr·   )ÚsiderÈ   r  Úhighlightthickness)ÚCollectionsÚCorporaÚModelszAll Packages)ÚtextÚfontÚleftrÒ  )r  r  z
<Button-1>é   )Úcolumn_weightsr  Úlistbox_heightÚreprfunc)Ú
foreground©r»   )r	  rÈ   z<Double-Button-1>z<space>z<Return>z<Left>z<Right>z<Control-a>r   zServer Index:r’   zDownload Directory:)r  rõ   ÚcourierÚgroovez#007aff)r  r  Údisabledforegroundr  c                 ó&   •— ‰j                  |«      S r<   ©Ú
_info_edit)rõ   r9   r,   s     €r/   ú<lambda>z-DownloaderGUI._init_widgets.<locals>.<lambda>  s   ø€ ¸¿¹ÈÓ8L€ r1   ÚewÚDownload)r  r°  r»   )r  ÚRefreshÚrightrE   )r  r  rÚ  éÈ   Úsunken)r»   r  rÚ  r  r  )0r”  Únltk.draw.tabler   ÚFramerê  ÚpackÚgrid_rowconfigureÚgrid_columnconfigureÚgridrî  Ú
_tab_namesÚ_tabsrÿ   ÚLabelÚ	_TAB_FONTrï  Ú_select_tabrÌ   ÚCOLUMNSÚCOLUMN_WEIGHTSrV   Ú_table_reprfuncrø  ÚcolumnconfigÚ_MARK_COLORÚCOLUMN_WIDTHSÚDEFAULT_COLUMN_WIDTHÚfocusÚbind_to_listboxesÚ	_downloadÚ_table_markÚ	_prev_tabÚ	_next_tabÚ	_mark_allr|  r�  Ú_infoÚEntryÚ
_info_saveÚButtonÚ_download_buttonÚ_refreshÚ_refresh_buttonÚ_progresslabelÚCanvasÚ_PROGRESS_COLORÚ_progressbarÚ_init_progressbar)r,   r”  r   Úf1ÚtabframeÚ
tableframeÚbuttonframeÚ	infoframeÚprogressframer   ÚtabÚlabelr  r  r»   rÖ   r9   ÚcallbackÚentrys   `                  r/   ró  zDownloaderGUI._init_widgetsÆ  sè  ø€ ó 	å)ð �]‰]˜4Ÿ8™8¨H¸QÀQÈQˆ]ÓOˆØ
�‰�E $¨VˆÔ4Ø
×Ñ˜Q qÐÔ)Ø
×Ñ ¨!ÐÔ,Ø�‰�b ˆÓ#×(Ñ(°°qÐ(Ô9Ø—=‘= Ó$ˆØ�‰˜Q A¨fˆÔ5Ø—]‘] 2Ó&ˆ
Ø�‰˜q a°ˆÔ7Ø—m‘m BÓ'ˆØ×Ñ  q°ÐÔ8Ø�‰�b ˆÓ#×(Ñ(°°qÐ(Ô9Ø—M‘M "Ó%ˆ	Ø�‰˜a Q¨vˆÔ6Ø�‰�b ˆÓ#×(Ñ(°°qÐ(Ô9ØŸ™Ø�H‰H˜1 1°×1EÑ1EÀaÑ1Hð &ó 
ˆð 	×Ñ ¨sÐÔ3Øˆ�‰�ÑØ)*ˆ�‰Ð%Ñ&ò OˆŒØˆŒ
Ü §¡Ó0ò 	,‰FˆAˆsØ—M‘M (°¸4¿>¹>�MÓJˆEØ�J‰J˜F¨1¨q©5°A©+¸Ñ);ˆJÔ<Ø�J‰J�| T×%5Ñ%5Ô6Ø&+ˆD�J‰J�s—y‘y“{Ò#ð		,ð LPÏ<É<ÖXÀ˜$×-Ñ-×1Ñ1°&¸!Õ<ÐXˆÐXÙØØ�L‰LØ)Ø ØØ×)Ñ)ô
ˆŒð 	�‰× Ñ  ¨t×/?Ñ/?ÀÑ/BÐ ÔCÜ" 4§<¡<Ó0ò 	5‰IˆAˆvØ×&Ñ&×*Ñ*¨6°4×3LÑ3LÓMˆEØ�K‰K×$Ñ$ Q¨eÐ$Õ4ð	5ð 	�‰×Ñ ¨6ÐÔ2Ø�‰×ÑÔØ�‰×%Ñ%Ð&9¸4¿>¹>ÔJØ�‰×Ñ˜ D×$4Ñ$4Ô5Ø�‰×Ñ˜ T§^¡^Ô4Ø�‰×Ñ˜ 4§>¡>Ô2Ø�‰×Ñ˜ D§N¡NÔ3Ø�‰×Ñ˜¨¯©Ô7ð 	×&Ñ& q°Ð&Ô3ð �O T§]¡]Ð3ØÐ2°D×4JÑ4JÐKð
ˆð ˆŒ
Ü)2°4«ò 	5Ñ%ˆAÑ%��U˜HØ�M‰M˜)¨%ˆMÓ0×5Ñ5¸QÀAÈcÐ5ÔRØ—M‘MØØØØ#,Ø$ð "ó ˆEð  % hÐ/ˆD�J‰J�s‰OØ�J‰J�z 4§?¡?Ô3Ø�J‰J�|°3Ô%LÔMØ�J‰J˜a Q¨tˆJÕ4ð	5ð  	�‰�‰�l D§O¡OÔ4ð !(§¡Ø˜j°$·.±.Èð !/ó !
ˆÔð 	×Ñ×"Ñ"¨Ð"Ô/Ø&Ÿ~™~Ø˜i°·±Àað  .ó  
ˆÔð 	×Ñ×!Ñ! wÐ!Ô/ð &Ÿm™mØØØ×+Ñ+¨AÑ.Ø×+Ñ+¨AÑ.ð	 ,ó 
ˆÔð $ŸN™NØØØØ×+Ñ+¨AÑ.ØØð +ó 
ˆÔð 	×ÑÔ Ø×Ñ×Ñ GÐÔ,Ø×Ñ× Ñ  fÐ Õ-ùòW Ys   É1#Zc                 ó  ‡ — dd l }|j                  ‰ j                  «      }|j                  |d¬«      }|j                  dd‰ j                  d¬«       |j                  «        |j                  ddˆ fd„¬	«       |j                  d
dˆ fd„¬	«       |j                  «        |j                  dd‰ j                  ¬	«       |j                  «        |j                  dd‰ j                  d¬«       |j                  dd|¬«       |j                  |d¬«      }‰ j                  j                  dd  D ]z  }|j                  ‰ j                  «      }|‰ j                  vsJ ‚|‰ j                  |<   |‰ j                  v r|j                  d«       |j                  |d|‰ j                   ¬«       Œ| |j                  dd|¬«       |j                  |d¬«      }‰ j                  j                  dd  D ]  }|j                  d|z  |fˆ fd„	¬«       Œ |j                  «        ‰ j                  j                  dd  D ]  }|j                  d|z  |fˆ fd„	¬«       Œ |j                  dd|¬«       |j                  |d¬«      }|j                  dd‰ j"                  ¬	«       |j                  dd‰ j$                  d¬«       |j                  dd|¬«       ‰ j                  j'                  d ‰ j$                  «       ‰ j                  j)                  |¬!«       y )"Nr   )Útearoffr)  ÚReturn)rZ  Ú	underliner°  ÚacceleratorzChange Server Indexé   c                  ó&   •— ‰ j                  d«      S )Nr   r%  rC   s   €r/   r'  z*DownloaderGUI._init_menu.<locals>.<lambda>H  s   ø€ ˜DŸO™O¨EÓ2€ r1   )rZ  r`  r°  zChange Download Directoryc                  ó&   •— ‰ j                  d«      S )Nr’   r%  rC   s   €r/   r'  z*DownloaderGUI._init_menu.<locals>.<lambda>M  s   ø€ ˜DŸO™O¨NÓ;€ r1   zShow Logr  ÚExitr   zCtrl-xÚFile)rZ  r`  Úmenur	  )rZ  r`  Úvariabler°  ÚViewz
Sort by %sc                 ó<   •— ‰j                   j                  | d«      S )NÚ	ascending©rø  Úsort_by©ro  r,   s    €r/   r'  z*DownloaderGUI._init_menu.<locals>.<lambda>m  s   ø€ ¨$¯+©+×*=Ñ*=¸aÀÓ*M€ r1   )rZ  r°  zReverse sort by %sc                 ó<   •— ‰j                   j                  | d«      S )NÚ
descendingrl  rn  s    €r/   r'  z*DownloaderGUI._init_menu.<locals>.<lambda>t  s   ø€ ¨$¯+©+×*=Ñ*=¸aÀÓ*N€ r1   ÚSortÚAboutÚInstructionsÚF1ÚHelpz<F1>)rg  )r”  ÚMenurê  Úadd_commandrB  Úadd_separatorÚ	_show_logrð  Úadd_cascaderø  Úcolumn_namesÚIntVarrò  ÚINITIAL_COLUMNSÚsetÚadd_checkbuttonr÷  ÚaboutÚhelprï  Úconfig)	r,   r”  ÚmenubarÚfilemenuÚviewmenur  ÚvarÚsortmenuÚhelpmenus	   `        r/   rô  zDownloaderGUI._init_menu;  sý  ø€ Ûà—,‘,˜tŸx™xÓ(ˆà—<‘< °�<Ó3ˆØ×ÑØ¨°4·>±>Èxð 	ô 	
ð 	×ÑÔ Ø×ÑØ'ØÛ2ð 	ô 	
ð
 	×ÑØ-ØÛ;ð 	ô 	
ð
 	×ÑÔ Ø×Ñ :¸ÀDÇNÁNÐÔSØ×ÑÔ Ø×ÑØ A¨t¯|©|Èð 	ô 	
ð 	×Ñ &°A¸HÐÔEð
 —<‘< °�<Ó3ˆØ—k‘k×.Ñ.¨q¨rÐ2ò 	ˆFØ—.‘. §¡Ó*ˆCØ ×!2Ñ!2Ñ2Ð2Ð2Ø(+ˆD×Ñ˜fÑ%Ø˜×-Ñ-Ñ-Ø—‘˜”
Ø×$Ñ$Ø¨°CÀ×AUÑAUð %õ ð	ð 	×Ñ &°A¸HÐÔEð
 —<‘< °�<Ó3ˆØ—k‘k×.Ñ.¨q¨rÐ2ò 	ˆFØ× Ñ Ø" VÑ+Ø"(ÔMð !õ ð	ð
 	×ÑÔ à—k‘k×.Ñ.¨q¨rÐ2ò 	ˆFØ× Ñ Ø*¨VÑ3Ø"(ÔNð !õ ð	ð
 	×Ñ &°A¸HÐÔEà—<‘< °�<Ó3ˆØ×Ñ 7°aÀÇÁÐÔLØ×ÑØ ¨A°t·y±yÈdð 	ô 	
ð 	×Ñ &°A¸HÐÔEØ�‰�‰�f˜dŸi™iÔ(à�‰�‰˜WˆÕ%r1   c                 óÖ   — | j                   j                  «       D ]L  \  }}|j                  «       r| j                  j	                  |«       Œ2| j                  j                  |«       ŒN y r<   )rò  râ   rV   rø  Úshow_columnÚhide_column)r,   r  r†  s      r/   r÷  zDownloaderGUI._select_columns‚  sQ   € Ø×,Ñ,×2Ñ2Ó4ò 	0‰KˆF�CØ�w‰wŒyØ—‘×'Ñ'¨Õ/à—‘×'Ñ'¨Õ/ñ		0r1   c                 ó"  — ddl m} | j                  j                  «        	 | j	                  «        | j                  j                  d«       y # t
        $ r} |d|«       Y d }~Œ3d }~wt        $ r} |d|j                  «       Y d }~ŒWd }~ww xY w©Nr   rØ  rÛ  rÜ  )
rÝ  rÙ  r�  rI  rõ  r   r   r¯  rø  rù  )r,   rÙ  rõ   s      r/   rL  zDownloaderGUI._refresh‰  su   € Ý0à�‰×#Ñ#Ô%ð	>Ø×ÑÔð
 	�‰×Ñ˜1Õøô	 ò 	6ÙÐ1°1×5Ñ5ûÜò 	>ÙÐ2°A·H±H×=Ñ=ûð	>ús#   ¢A Á	BÁ	A%Á%BÁ1B	Â	Bc                 ó|   — | j                  «        | j                  |   \  }}d|d<   d|d<   |j                  «        y )NÚnormalÚstater-  r  )rI  rG  r@  )r,   Úinfo_keyr\  r[  s       r/   r&  zDownloaderGUI._info_edit•  s9   € Ø�‰ÔØŸ*™* XÑ.‰ˆˆxØ!ˆˆg‰Ø"ˆˆh‰Ø�‰�r1   Nc                 ó  — | j                   }| j                  j                  «       D ]P  \  }}|d   dk(  rŒ|� |j                  |u r|j                  dk7  r|}Œ1d|d<   d|d<    ||j                  «       «       ŒR |j                  «        y )Nr�  Údisabledr_  r"  r  )rø  rG  rÝ   ÚwidgetÚkeysymrV   r@  )r,   rõ   r@  r\  r[  s        r/   rI  zDownloaderGUI._info_saveœ  s…   € Ø—‘ˆØ#Ÿz™z×0Ñ0Ó2ò 	&‰OˆE�8Ø�W‰~ Ò+ØØˆ} §¡¨UÑ!2°q·x±xÀ8Ò7KØ‘à!+��g‘Ø"*��h‘Ù˜Ÿ™›Õ%ð	&ð 	�‰�r1   c                 óè   — | j                   j                  |   j                  d«      r7t        |t        «      rd|z  S |dk  rd|dz  z  S |dk  rd|dz  z  S d	|d
z  z  S |dv rt	        |«      S d|z  S )NrÈ  z  %si   z	  %.1f KBg      �@i   @z	  %.1f MBg      0Az	  %.1f GBg      ÐA)r   rE   )rø  r{  r  r4   r5   )r,   r  ÚcolÚvals       r/   r;  zDownloaderGUI._table_reprfunc©  sˆ   € Ø�;‰;×#Ñ# CÑ(×1Ñ1°&Ô9Ü˜#œsÔ#Ø ‘|Ð#Ø�w’Ø" c¨I¡oÑ6Ð6Ø�w’Ø" c¨I¡oÑ6Ð6à" c¨I¡oÑ6Ð6à�'‰>Ü�s“8ˆOà˜C‘<Ðr1   c                 óø   — ddl m} || j                  j                  k(  ry 	 || j                  _        | j	                  «        | j                  «        y # t
        $ r} |dt        |«      «       Y d }~Œ1d }~ww xY w)Nr   rØ  zError Setting Server Index)rÝ  rÙ  r�  r   rõ  rñ   r5   rö  )r,   r   rÙ  rõ   s       r/   r|  zDownloaderGUI._set_url¹  sd   € Ý0à�$—(‘(—,‘,ÒØð	<ØˆD�H‰HŒLØ×ÑÔð 	�‰Õøô ò 	<ÙÐ2´C¸³F×;Ñ;ûð	<ús   ¢!A Á	A9ÁA4Á4A9c                 ó.  — ddl m} | j                  j                  |k(  ry || j                  _        	 | j	                  «        | j                  «        y # t
        $ r} |d|«       Y d }~Œ(d }~wt        $ r} |d|j                  «       Y d }~ŒLd }~ww xY wr�  )	rÝ  rÙ  r�  r’   rõ  r   r   r¯  rö  )r,   r’   rÙ  rõ   s       r/   r�  zDownloaderGUI._set_download_dirÅ  s€   € Ý0à�8‰8× Ñ  LÒ0Øð !-ˆ�‰Ôð	>Ø×ÑÔð
 	�‰Õøô	 ò 	6ÙÐ1°1×5Ñ5ûÜò 	>ÙÐ2°A·H±H×=Ñ=ûð	>ús#   ³A Á	BÁ	A+Á+BÁ7BÂBc                 óÜ  — t        d| j                  j                  «       | j                  j	                  «       D ]  \  }}d|d<   |j                  dd«       Œ | j                  d   d   j                  d| j                  j                  «       | j                  d   d   j                  d| j                  j                  «       | j                  j	                  «       D ]
  \  }}d|d<   Œ y )	Nzshowing infor�  r�  r   Úendr   r’   r“  )r¼   r�  r   rG  rÝ   ÚdeleteÚinsertr’   )r,   r\  Úcbs      r/   rö  zDownloaderGUI._show_infoÖ  sÄ   € Üˆn˜dŸh™hŸl™lÔ+ØŸ™×*Ñ*Ó,ò 	#‰IˆE�2Ø%ˆE�'‰NØ�L‰L˜˜EÕ"ð	#ð 	�
‰
�5Ñ˜!Ñ×#Ñ# A t§x¡x§|¡|Ô4Ø�
‰
�>Ñ" 1Ñ%×,Ñ,¨Q°·±×0EÑ0EÔFØŸ™×*Ñ*Ó,ò 	(‰IˆE�2Ø'ˆE�'ŠNñ	(r1   c                 ó†  — ddl m} t        | j                  «      D ]`  \  }}|j	                  «       | j
                  k(  sŒ$|dkD  sŒ*| j                  |dz
     j	                  «       | _        	 | j                  «       c S  y # t        $ r} |d|«       Y d }~Œ{d }~wt        $ r} |d|j                  «       Y d }~ŒŸd }~ww xY w©Nr   rØ  r   rÛ  rÜ  )
rÝ  rÙ  rÿ   r4  rÌ   Ú_tabrõ  r   r   r¯  ©r,   rõ   rÙ  r   rY  s        r/   rD  zDownloaderGUI._prev_tabà  sª   € Ý0ä §¡Ó0ò 	F‰FˆAˆsØ�y‰y‹{˜dŸi™iÓ'¨A°«EØ ŸO™O¨A°©EÑ2×8Ñ8Ó:�”	ðFØ×+Ñ+Ó-Ò-ñ		Føô
 !ò >ÙÐ9¸1×=Ñ=ûÜò FÙÐ:¸A¿H¹H×EÑEûðFús$   Á,B Â 	C Â		BÂC Â#B;Â;C c                 ó²  — ddl m} t        | j                  «      D ]v  \  }}|j	                  «       | j
                  k(  sŒ$|t        | j                  «      dz
  k  sŒ@| j                  |dz      j	                  «       | _        	 | j                  «       c S  y # t        $ r} |d|«       Y d }~Œ‘d }~wt        $ r} |d|j                  «       Y d }~Œµd }~ww xY wr¡  )rÝ  rÙ  rÿ   r4  rÌ   r¢  r½   r5  rõ  r   r   r¯  r£  s        r/   rE  zDownloaderGUI._next_tabí  s¸   € Ý0ä §¡Ó0ò 	F‰FˆAˆsØ�y‰y‹{˜dŸi™iÓ'¨A´°T·Z±Z³À1Ñ1DÓ,EØ ŸO™O¨A°©EÑ2×8Ñ8Ó:�”	ðFØ×+Ñ+Ó-Ò-ñ		Føô
 !ò >ÙÐ9¸1×=Ñ=ûÜò FÙÐ:¸A¿H¹H×EÑEûðFús$   ÂBÂ	CÂ	B-Â-CÂ9CÃCc                 óü   — ddl m} |j                  d   j                  «       | _        	 | j                  «        y # t        $ r} |d|«       Y d }~y d }~wt        $ r} |d|j                  «       Y d }~y d }~ww xY w)Nr   rØ  r  rÛ  rÜ  )	rÝ  rÙ  r”  rÌ   r¢  rõ  r   r   r¯  )r,   ÚeventrÙ  rõ   s       r/   r8  zDownloaderGUI._select_tabú  sh   € Ý0à—L‘L Ñ(×.Ñ.Ó0ˆŒ	ð	>Ø×ÑÕøÜò 	6ÙÐ1°1×5Ñ5ûÜò 	>ÙÐ2°A·H±H×=Ñ=ûð	>ús!   ª; »	A;Á	AÁA;ÁA6Á6A;r¨   c                 ó€  — | j                   j                  «       }| j                   j                  «        | j                  dk(  r| j                  j                  «       }n’| j                  dk(  r| j                  j                  «       }nh| j                  dk(  r| j                  j                  «       }n>| j                  dk(  r| j                  j                  «       }nJ d| j                  z  «       ‚|D �cg c]  }| j                  |«      ‘Œ }}| j                   j                  |«       | j                  j                  «       D ]o  \  }}|| j                  k(  r.|j                  | j                  d   | j                  d   ¬«       ŒC|j                  | j                  d   | j                  d   ¬«       Œq | j                   j!                  d	d
¬«       | j#                  «        | j                   j%                  |«        | j&                  j(                  d| j                   j*                  j,                  g| j                   j.                  j1                  «       ¢­Ž   | j&                  j(                  d| j                   j*                  j,                  g| j                   j.                  j1                  «       ¢­Ž  y c c}w )Nzall packagesrà   rè   r¨   r   zbad tab value %rr   ©r  rÚ  rÆ  rk  )Úorderé–   i,  )rø  Úselected_rowrG  r¢  r�  rQ   rà   rè   r¨   Ú_package_to_columnsrm  r5  râ   rí  Ú_FRONT_TAB_COLORÚ_BACK_TAB_COLORrm  Ú_color_tablerù  rê  ÚafterÚ
_scrollbarr~  Ú_mlbÚyview)r,   r«  râ   rS   ÚrowsrY  rZ  s          r/   rõ  zDownloaderGUI._fill_table	  s  € Ø—{‘{×/Ñ/Ó1ˆØ�‰×ÑÔØ�9‰9˜Ò&Ø—H‘H×%Ñ%Ó'‰EØ�Y‰Y˜)Ò#Ø—H‘H×$Ñ$Ó&‰EØ�Y‰Y˜(Ò"Ø—H‘H—O‘OÓ%‰EØ�Y‰Y˜-Ò'Ø—H‘H×(Ñ(Ó*‰Eà4Ð(¨4¯9©9Ñ4Ó4�1Ø;@ÖA°4�×(Ñ(¨Õ.ÐAˆÐAØ�‰×Ñ˜4Ô ð Ÿ*™*×*Ñ*Ó,ò 
	‰JˆC�Ø�d—i‘iÒØ—‘Ø#×4Ñ4°QÑ7Ø#×4Ñ4°QÑ7ð  õ ð
 —‘Ø#×3Ñ3°AÑ6Ø#×3Ñ3°AÑ6ð  õ ð
	ð 	�‰×Ñ˜L°ÐÔ<Ø×ÑÔØ�‰×Ñ˜<Ô(ð 	ˆ�‰�‰�s˜DŸK™K×2Ñ2×6Ñ6ÐR¸¿¹×9IÑ9I×9OÑ9OÓ9QÓRØˆ�‰�‰�s˜DŸK™K×2Ñ2×6Ñ6ÐR¸¿¹×9IÑ9I×9OÑ9OÓ9QÔRùò5 Bs   Ã5J;c                 óà   — t        t        | j                  «      «      D ]=  }| j                  j	                  | j                  |df   «      }|| j                  |df<   Œ? | j                  «        y )NrÆ  rÉ  )rý   r½   rø  r�  rÂ   r¯  )r,   Úrow_numrÂ   s      r/   Ú_update_table_statusz"DownloaderGUI._update_table_status2  s`   € ÜœS §¡Ó-Ó.ò 	4ˆGØ—X‘X—_‘_ T§[¡[°¸,Ð1FÑ%GÓHˆFØ-3ˆD�K‰K˜ Ð)Ò*ð	4ð 	×ÑÕr1   c                 óÒ  — | j                   r | j                  |Ž S t        t        | j                  «      «      D �cg c]'  }| j                  |df   dk7  r| j                  |df   ‘Œ) }}| j                  j                  «       }|s|�| j                  |df   g}| j                  j                  || j                  j                  «      }d| _	        | j                  ||«       y c c}w )Nr   rE   rÆ  )rÞ  Ú_download_threadedrý   r½   rø  r«  r�  rò   r’   rç  Ú_download_cb)r,   rõ   r  ÚmarkedÚ	selectionÚdownload_iters         r/   rB  zDownloaderGUI._download8  sß   € ð ×ÒØ*�4×*Ñ*¨AÐ.Ð.ô œS §¡Ó-Ó.ö
àØ�{‰{˜3 ˜6Ñ" bÒ(ð �K‰K˜˜\Ð)Ó*ð
ˆð 
ð
 —K‘K×,Ñ,Ó.ˆ	Ù˜)Ð/Ø—k‘k )¨\Ð"9Ñ:Ð;ˆFàŸ™×.Ñ.¨v°t·x±x×7LÑ7LÓMˆØˆÔØ×Ñ˜-¨Õ0ùò
s   ¼,C$c                 óÄ  ‡ — 	 t        |«      }ˆ fd„}t        |t        «      r‰ j                  |j                  «       �nt        |t        «      rU ||j                  «       |j                  �%‰ j                  |j                  j                  «       ‰ j                  d «       y t        |t        «      r6 |d|j                   j                  z  «       ‰ xj"                  dz  c_        �n`t        |t$        «      r! |d|j                  j                  z  «       �n/t        |t&        «      r  |d|j                  j                  z  «       nÿt        |t(        «      r  |d	|j                  j                  z  «       nÏt        |t*        «      r  |d
|j                  j,                  z  «       nŸt        |t.        «      rZ‰ xj"                  dz  c_         |d|j                   j                  z  «       ‰ j1                  |j                   j                  «       n5t        |t2        «      r%‰ j1                  |j                  j                  «       ‰ j                  j	                  ‰ j4                  ‰ j6                  ||«      }|‰ j                  d<   y # t        $ rI ‰ j                  «        ‰ j                  j	                  d‰ j
                  d«      }|‰ j                  d<   Y y w xY w)NrÒ  r   rº  c                 óF   •— | ‰j                   d<   ‰j                  | «       y ©Nr  ©rN  rè  ©r&  r,   s    €r/   r0  z(DownloaderGUI._download_cb.<locals>.showW  ó   ø€ Ø*+ˆD×Ñ Ñ'Ø�I‰I�a�Lr1   zDownloading collection %sr   zDownloading package %súPackage %s is up-to-date!úFinished downloading %r.úUnzipping %sú#Finished downloading collection %r.)ÚnextÚStopIterationr·  rê  r°  Ú_show_progressrå  r4   rŒ   rŽ   r‡   rŠ   rk   Ú_selectr   r]   r`   rç  rh   r�   rw   r{   r'   re   Ú_clear_markrp   Ú	_DL_DELAYrº  )r,   r½  ÚidsrÙ   Úafteridr0  s   `     r/   rº  zDownloaderGUI._download_cbM  s  ø€ ð	Ü�}Ó%ˆCô	ô �cœ?Ô+Ø×Ñ §¡Ö-Ü˜œ\Ô*Ù�—‘ÔØ�{‰{Ð&Ø—‘˜SŸ[™[Ÿ^™^Ô,Ø×Ñ Ô%ØÜ˜Ô3Ô4ÙÐ,¨s¯~©~×/@Ñ/@Ñ@ÔAØ×Ò Ñ!×Ü˜Ô0Ô1ÙÐ)¨C¯K©K¯N©NÑ:Ö;Ü˜œ_Ô-ÙÐ,¨s¯{©{¯~©~Ñ=Õ>ô ˜Ô2Ô3ÙÐ+¨c¯k©k¯n©nÑ<Õ=Ü˜Ô.Ô/Ù� #§+¡+×"6Ñ"6Ñ6Õ7Ü˜Ô4Ô5Ø×Ò Ñ!ÕÙÐ6¸¿¹×9JÑ9JÑJÔKØ×Ñ˜SŸ^™^×.Ñ.Õ/Ü˜Ô1Ô2Ø×Ñ˜SŸ[™[Ÿ^™^Ô,Ø—(‘(—.‘. §¡°×1BÑ1BÀMÐSVÓWˆØ(/ˆ�‰�nÒ%øôO ò 	à×%Ñ%Ô'Ø—h‘h—n‘n R¨×)<Ñ)<¸aÓ@ˆGØ,3ˆD�M‰M˜.Ñ)Ùð	ús   ƒJ ÊAKËKc                 ó¬   — t        t        | j                  «      «      D ]3  }| j                  |df   |k(  sŒ| j                  j                  |«        y  y )NrÆ  )rý   r½   rø  rù  ©r,   r   r  s      r/   rË  zDownloaderGUI._selecty  sJ   € Üœ˜TŸ[™[Ó)Ó*ò 	ˆCØ�{‰{˜3 Ð,Ñ-°Ó3Ø—‘×"Ñ" 3Ô'Ùñ	r1   c                 óH  — t        t        | j                  «      «      D ]�  }| j                  | j                  |df      \  }}d\  }}| j                  j	                  |||||¬«       | j                  j                  |d| j                  d   | j                  d   ¬«       Œƒ y )NrÉ  )ÚblackÚwhite)r  ÚselectforegroundrÚ  Úselectbackgroundr   r   r¨  )rý   r½   rø  Ú
_ROW_COLORÚ	rowconfigÚitemconfigurer=  )r,   r  ÚbgÚsbgÚfgÚsfgs         r/   r¯  zDownloaderGUI._color_table  s¦   € äœ˜TŸ[™[Ó)Ó*ò 	ˆCØ—o‘o d§k¡k°#°x°-Ñ&@ÑA‰GˆB�Ø(‰GˆB�Ø�K‰K×!Ñ!ØØØ!$ØØ!$ð "ô ð �K‰K×%Ñ%Ø�Q 4×#3Ñ#3°AÑ#6À4×CSÑCSÐTUÑCVð &õ ñ	r1   c                 ó–   — t        t        | j                  «      «      D ](  }| j                  |df   |k(  sŒd| j                  |df<   Œ* y )NrÆ  rE   r   ©rý   r½   rø  rÑ  s      r/   rÌ  zDownloaderGUI._clear_mark�  sG   € Üœ˜TŸ[™[Ó)Ó*ò 	)ˆCØ�{‰{˜3 Ð,Ñ-°Ó3Ø&(�—‘˜C ˜FÒ#ñ	)r1   c                 ól   — t        t        | j                  «      «      D ]  }d| j                  |df<   Œ y )Nr¿  r   rß  )r,   rõ   r  s      r/   rF  zDownloaderGUI._mark_all•  s1   € Üœ˜TŸ[™[Ó)Ó*ò 	&ˆCØ"%ˆD�K‰K˜˜Q˜Òñ	&r1   c                 óê   — | j                   j                  «       }|dk\  r8| j                   |   d   dk7  rd| j                   |df<   nd| j                   |df<   | j                   j                  d¬«       y )Nr   rE   r¿  r   )r  )rø  r«  rù  )r,   rõ   r¼  s      r/   rC  zDownloaderGUI._table_mark™  sj   € Ø—K‘K×,Ñ,Ó.ˆ	Ø˜Š>Ø�{‰{˜9Ñ% aÑ(¨BÒ.Ø,.�—‘˜I q˜LÒ)à,/�—‘˜I q˜LÑ)Ø�‰×Ñ ÐÕ#r1   c                 ón   — ddl m} dj                  | j                  «      } || j                  d|«       y )Nr   ©ÚShowTextr¶   zNLTK Downloader Log)Únltk.draw.utilrä  r&   ræ  rê  )r,   rä  r  s      r/   ry  zDownloaderGUI._show_log¢  s*   € Ý+à�y‰y˜×+Ñ+Ó,ˆÙ�—‘Ð0°$Õ7r1   c                 óŒ  — g }t        | j                  «      D ]©  \  }}|dk(  r|j                  d«       Œ|dk(  r|j                  |j                  «       Œ>|dk(  r+|j                  | j                  j                  |«      «       Œn|j                  «       j                  dd«      }|j                  t        ||d«      «       Œ« |S )z„
        Given a package, return a list of values describing that
        package, one for each column in ``self.COLUMNS``.
        r   rE   rÆ  rÉ  r­   rV  zn/a)	rÿ   r9  r¾   r   r�  rÂ   rÌ   r   rÁ   )r,   rä   r  Úcolumn_indexÚcolumn_nameÚattrs         r/   r¬  z!DownloaderGUI._package_to_columns¨  s©   € ð
 ˆÜ)2°4·<±<Ó)@ò 		6Ñ%ˆL˜+Ø˜qÒ Ø—
‘
˜2•Ø Ò,Ø—
‘
˜3Ÿ6™6Õ"Ø Ò(Ø—
‘
˜4Ÿ8™8Ÿ?™?¨3Ó/Õ0à"×(Ñ(Ó*×2Ñ2°3¸Ó<�Ø—
‘
œ7 3¨¨eÓ4Õ5ð		6ð ˆ
r1   c                 ó`   — | j                   ry | j                  j                  «        d| _         y )NT)rñ  rê  rð  )r,   rõ   s     r/   rð  zDownloaderGUI.destroy¾  s#   € Ø�?Š?ØØ�‰×ÑÔØˆ�r1   c                 ó  — | j                   �:| j                  j                  «       D ]  }| j                   j                  |«       Œ | j                  r| j
                  r| j                  «        | j                  j                  «        y r<   )	rê  rå  rÝ   Úafter_cancelrä  rÞ  Ú_abort_downloadrò  rG  )r,   rõ   rÏ  s      r/   rú  zDownloaderGUI._destroyÄ  sm   € Ø�8‰8ÐØŸ=™=×/Ñ/Ó1ò /�Ø—‘×%Ñ% gÕ.ð/ð ×Ò ×!2Ò!2Ø× Ñ Ô"ð
 	×Ñ×ÑÕ!r1   c                 ó<   —  | j                   j                  |i |¤Ž y r<   )rê  r—  )r,   r±  Úkwargss      r/   r—  zDownloaderGUI.mainloopÒ  s   € Øˆ�‰×Ñ˜4Ð* 6Ó*r1   an      This tool can be used to download a variety of corpora and models
    that can be used with NLTK.  Each corpus or model is distributed
    in a single zip file, known as a "package file."  You can
    download packages individually, or you can download pre-defined
    collections of packages.

    When you download a package, it will be saved to the "download
    directory."  A default download directory is chosen when you run

    the downloader; but you may also select a different download
    directory.  On Windows, the default download directory is


    "package."

    The NLTK downloader can be used to download a variety of corpora,
    models, and other data packages.

    Keyboard shortcuts::
      [return]	 Download
      [up]	 Select previous package
      [down]	 Select next package
      [left]	 Select previous tab
      [right]	 Select next tab
    c                 óê   — ddl m} 	  || j                  d| j                  j	                  «       dd¬«       y # t
        $ r1  || j                  d| j                  j	                  «       d¬«       Y y w xY w)Nr   rã  zHelp: NLTK Downloaderr¯   Úfixed)r»   r  r   )rå  rä  rê  ÚHELPr:  r‰   )r,   rõ   rä  s      r/   r�  zDownloaderGUI.helpö  sc   € Ý+ð		UÙØ—‘Ø'Ø—	‘	—‘Ó!ØØöøô ò 	UÙ�T—X‘XÐ6¸¿	¹	¿¹Ó8IÐQS×Tð	Uús   ˆ/8 ¸7A2Á1A2c                 óœ   — ddl m} d}d}	 ddlm}  |||¬«      j	                  «        y # t
        $ r  || j                  ||«       Y y w xY w)Nr   rã  z'NLTK Downloader
Written by Edward LoperzAbout: NLTK Downloader)ÚMessage)rŠ   rì  )rå  rä  rÝ  rô  r0  r•  rê  )r,   rõ   rä  ÚABOUTÚTITLErô  s         r/   r€  zDownloaderGUI.about  sI   € Ý+à?ˆØ(ˆð	-Ý2á˜E¨Ô/×4Ñ4Õ6øÜò 	-Ù�T—X‘X˜u eÖ,ð	-ús   Œ+ «AÁ
Ac                 ó  — | j                   }t        |d   «      t        |d   «      }}t        dt        |d   «      dz  | j                  z  «      D ]a  }|j	                  || j                  z  dz   d|| j                  z  |z
  dz
  |dz   | j                  ddt        |d	z  d
z
  «      dz  z   z  ¬«       Œc |j                  d«       |j                  dd¬«       |j                  d|j                  dddd| j                  d   ¬«      «       y )Nr»   r  r   r	  r´   iìÿÿÿz	#%02x0000r
  r  r§   rÓ  )r»   rÈ   ÚgradientÚhidden©r�  Úredbox)rÈ   )rQ  r   rý   Ú_gradient_widthÚcreate_lineÚabsÚ
addtag_allÚ
itemconfigÚaddtag_withtagÚcreate_rectanglerP  )r,   ro  r»   r  r   s        r/   rR  zDownloaderGUI._init_progressbar  s  € Ø×ÑˆÜ˜A˜g™J›¬¨Q¨x©[Ó)9ˆvˆÜ�qœ3˜q ™z›?¨QÑ.°4×3GÑ3GÑGÓHò 	ˆAØ�M‰MØ�D×(Ñ(Ñ(¨2Ñ-ØØ�D×(Ñ(Ñ(¨6Ñ1°BÑ6Ø˜‘Ø×*Ñ*Ø  B¬¨Q°©U°Q©Y«¸"Ñ)<Ñ$<Ñ=ð õ ð	ð 	
�‰�ZÔ Ø	�‰�Z xˆÔ0ð 	
×ÑØ�a×(Ñ(¨¨A¨q°!¸$×:NÑ:NÈqÑ:QÐ(ÓRõ	
r1   c                 ó  — | j                   }|€)|j                  ddddd«       |j                  dd¬«       y t        |d   «      t        |d   «      }}|t        |«      z  dz  d	z   }|j                  ddd||d	z   «       y )
Nrû  r   rø  rù  rú  r»   r  rü   r   )rQ  Úcoordsr   r   )r,   Úpercentro  r»   r  r·   s         r/   rÊ  zDownloaderGUI._show_progress+  s€   € Ø×ÑˆØˆ?Ø�H‰H�X˜q ! Q¨Ô*Ø�L‰L˜¨8ˆLÕ4ä  '¡
›O¬S°°8±Ó-=�6ˆEØœ#˜e›*Ñ$¨Ñ+¨aÑ/ˆAØ�H‰H�X˜q ! Q¨°©
Õ3r1   c                 ó�  — | j                   }| j                  s|j                  dd¬«       y |j                  dd¬«       |j                  d«      \  }}}}|dk  r$|j	                  d| j
                  dz  dz
  d«       n|j	                  dd	d«       | j                  j                  d
| j                  «      }|| j                  d<   y )Nrø  rù  rú  r�  iœÿÿÿr  r  r   r5  r,  Ú_progress_alive)
rQ  rä  r   ÚbboxÚmoverü  rê  r°  r  rå  )r,   ro  Úx1Úy1Úx2Úy2rÏ  s          r/   r  zDownloaderGUI._progress_alive5  s¬   € Ø×ÑˆØ× Ò Ø�L‰L˜¨8ˆLÕ4à�L‰L˜¨8ˆLÔ4ØŸV™V JÓ/‰NˆB��B˜Ø�TŠzØ—‘�z D×$8Ñ$8¸1Ñ$<ÀÑ#AÀ1ÕEà—‘�z 2 qÔ)Ø—h‘h—n‘n S¨$×*>Ñ*>Ó?ˆGØ/6ˆD�M‰MÐ+Ò,r1   c                 óì  — | j                   r| j                  «        y d| j                  d<   t        t	        | j
                  «      «      D �cg c]'  }| j
                  |df   dk7  r| j
                  |df   ‘Œ) }}| j
                  j                  «       }|s|�| j
                  |df   g}t        | j                  j                  | j                  j                  «      }| j                  g k(  sJ ‚| j                  g k(  sJ ‚| j                  ||| j                  | j                  | j                  «      j                  «        d| _        d| _         | j#                  «        | j%                  «        y c c}w )NÚCancelr  r   rE   rÆ  T)rä  rí  rK  rý   r½   rø  r«  r•   r�  r   r’   râ  rã  Ú_DownloadThreadrá  Ústartrç  Ú_monitor_message_queuer  )r,   rõ   r  r»  r¼  Údss         r/   r¹  z DownloaderGUI._download_threadedG  sd  € ð ×ÒØ× Ñ Ô"Øð )1ˆ×Ñ˜fÑ%ô œS §¡Ó-Ó.ö
àØ�{‰{˜3 ˜6Ñ" bÒ(ð �K‰K˜˜\Ð)Ó*ð
ˆð 
ð
 —K‘K×,Ñ,Ó.ˆ	Ù˜)Ð/Ø—k‘k )¨\Ð"9Ñ:Ð;ˆFô
 ˜Ÿ™Ÿ™ d§h¡h×&;Ñ&;Ó<ˆð ×'Ñ'¨2Ò-Ð-Ð-Ø×)Ñ)¨RÒ/Ð/Ð/Ø×ÑØØØ×ÑØ×$Ñ$Ø×&Ñ&ó	
÷ ‰%Œ'ð ˆÔØ ˆÔØ×#Ñ#Ô%ð 	×ÑÕùòA
s   Á,E1c                 ó¼   — | j                   rP| j                  j                  «        | j                  j	                  d«       | j                  j                  «        y y )NÚabort)rä  rá  Úacquirerã  r¾   ÚreleaserC   s    r/   rí  zDownloaderGUI._abort_downloads  sH   € Ø×ÒØ×Ñ×'Ñ'Ô)Ø×&Ñ&×-Ñ-¨gÔ6Ø×Ñ×'Ñ'Õ)ð r1   c                   ó   — e Zd Zd„ Zd„ Zy)úDownloaderGUI._DownloadThreadc                 óˆ   — || _         || _        || _        || _        || _        t
        j                  j                  | «       y r<   )Údata_serverrâ   ÚlockÚmessage_queuer  rß  ÚThreadr0   )r,   r  râ   r  r  r  s         r/   r0   z&DownloaderGUI._DownloadThread.__init__z  s;   € Ø*ˆDÔØˆDŒJØˆDŒIØ!.ˆDÔØˆDŒJÜ×Ñ×%Ñ% dÕ+r1   c                 ó  — | j                   j                  | j                  «      D ]”  }| j                  j	                  «        | j
                  j                  |«       | j                  r7| j
                  j                  d«       | j                  j                  «         y | j                  j                  «        Œ– | j                  j	                  «        | j
                  j                  d«       | j                  j                  «        y )NÚabortedÚfinished)	r  rò   râ   r  r  r  r¾   r  r  rþ  s     r/   r“  z!DownloaderGUI._DownloadThread.run‚  s¾   € Ø×'Ñ'×5Ñ5°d·j±jÓAò $�Ø—	‘	×!Ñ!Ô#Ø×"Ñ"×)Ñ)¨#Ô.à—:’:Ø×&Ñ&×-Ñ-¨iÔ8Ø—I‘I×%Ñ%Ô'ÙØ—	‘	×!Ñ!Õ#ð$ð �I‰I×ÑÔØ×Ñ×%Ñ% jÔ1Ø�I‰I×ÑÕr1   N)rH   rI   rJ   r0   r“  r3   r1   r/   r  r  y  s   „ ò	,ó	 r1   r  rü   c                 ó\  ‡ — ˆ fd„}‰ j                   j                  «       sy ‰ j                  D �]x  }|dk(  s|dk(  r¶‰ j                  «        d‰ _        d‰ j
                  d<   ‰ j                  d d …= ‰ j                  d d …= ‰ j                   j                  «        |dk(  r |d«       ‰ j                  d «        y ‰ j                  j                  d‰ j                  d «      }|‰ j                  d	<    y t        |t        «      r‰ j                  |j                  «       Œðt        |t        «      r] ||j                   «       |j"                  �%‰ j%                  |j"                  j&                  «       ‰ j                  d «       d‰ _         y t        |t(        «      r6 |d
|j*                  j&                  z  «       ‰ xj,                  dz  c_        �Œ£t        |t.        «      rP‰ j0                  j3                  |j"                  j&                  «        |d|j"                  j&                  z  «       �Œt        |t4        «      r! |d|j"                  j&                  z  «       �Œ4t        |t6        «      r! |d|j"                  j&                  z  «       �Œet        |t8        «      r! |d|j"                  j:                  z  «       �Œ–t        |t<        «      r! |d|j"                  j&                  z  «       �ŒÇt        |t>        «      r[‰ xj,                  dz  c_         |d|j*                  j&                  z  «       ‰ jA                  |j*                  j&                  «       �Œ2t        |tB        «      s�ŒD‰ j                  «        ‰ jA                  |j"                  j&                  «       �Œ{ ‰ j                  rd‰ jD                  d<   ‰ j                  d d …= ‰ j                   j                  «        ‰ j                  j                  ‰ jF                  ‰ jH                  «      }|‰ j                  d	<   y )Nc                 óF   •— | ‰j                   d<   ‰j                  | «       y rÀ  rÁ  rÂ  s    €r/   r0  z2DownloaderGUI._monitor_message_queue.<locals>.show“  rÃ  r1   r!  r   Fr)  r  zDownload aborted!rü   r  r4  r   zDownloading package %rrÄ  rÅ  rÆ  zFinished installing %srÇ  zAborting download...)%rá  r  râ  r·  rä  rK  rã  r  rÊ  rê  r°  rå  r4   rŒ   rŽ   r‡   rŠ   rk   rË  r   r]   r`   rç  rh   r�  rI  r�   rw   r{   r'   r~   re   rÌ  rp   rN  Ú_MONITOR_QUEUE_DELAYr  )r,   r0  rÙ   rÏ  s   `   r/   r  z$DownloaderGUI._monitor_message_queue’  s2  ø€ ô	ð
 ×"Ñ"×*Ñ*Ô,ØØ×+Ñ+ó 3	1ˆCà�jÒ  C¨9Ò$4à×)Ñ)Ô+Ø$)�Ô!Ø0:�×%Ñ% fÑ-Ø×,Ñ,ªQÐ/Ø×.Ñ.ªqÐ1Ø×#Ñ#×+Ñ+Ô-Ø˜)Ò#ÙÐ,Ô-Ø×'Ñ'¨Ô-ñ ð #Ÿh™hŸn™n¨S°$×2EÑ2EÀtÓL�GØ>E�D—M‘MÐ":Ñ;Ùô ˜C¤Ô1Ø×#Ñ# C§L¡LÕ1Ü˜C¤Ô.Ù�S—[‘[Ô!Ø—;‘;Ð*Ø—L‘L §¡§¡Ô0Ø×#Ñ# DÔ)Ø$)�Ô!ÙÜ˜CÔ!7Ô8ÙÐ0°3·>±>×3DÑ3DÑDÔEØ× Ò  AÑ%× Ü˜CÔ!4Ô5Ø—‘×+Ñ+¨C¯K©K¯N©NÔ;ÙÐ-°·±·±Ñ>Ö?Ü˜C¤Ô1ÙÐ0°3·;±;·>±>ÑAÖBô ˜CÔ!6Ô7ÙÐ/°#·+±+·.±.Ñ@ÖAÜ˜CÔ!2Ô3Ù�^ c§k¡k×&:Ñ&:Ñ:Ö;Ü˜CÔ!3Ô4ÙÐ-°·±·±Ñ>Ö?Ü˜CÔ!8Ô9Ø× Ò  AÑ%Õ ÙÐ:¸S¿^¹^×=NÑ=NÑNÔOØ× Ñ  §¡×!2Ñ!2Ö3Ü˜CÔ!5Ö6Ø×)Ñ)Ô+Ø× Ñ  §¡§¡Ö0ðg3	1ðp ×%Ò%Ø*@ˆD×Ñ Ñ'ð ×$Ñ$¢QÐ'Ø×Ñ×#Ñ#Ô%ð —(‘(—.‘. ×!:Ñ!:¸D×<WÑ<WÓXˆØ29ˆ�‰Ð.Ò/r1   ©Tr<   )FrH   rI   rJ   rK   r9  r:  r>  r?  r}  ro  rî  r•   rÃ   rÅ   rÄ   rÆ   r×  r=  r­  r®  rP  r7  r0   rè  ró  rô  r÷  rL  r&  rI  r;  r|  r�  rö  rD  rE  r8  r¢  Ú_rowsrõ  r·  rB  rÍ  rº  rË  r¯  rÌ  rF  rC  ry  r¬  rð  rú  r—  rÇ   Údedentrò  r�  r€  rü  rR  rÊ  r  r¹  rí  rß  r  r  r$  r  r3   r1   r/   r–  r–  -  s$  „ ñò€GðDð  Q°¸QÑ?€NðCð ØØØØØñ€Mð<ð Ðð ò C€OØAð ò ˆØ�GŠ|Ðˆ|ðàò ˆØ�GŠ|Ðˆ|ðàò ˆØ�GŠ|Ðˆ|ðð '€Oð 	×ÑÐ.Ø×ÑÐ,Ø×ÑÐ*Ø× Ñ Ð"2ð	€Jð #€Kð (ÐØ&€Oà&€Oà$€Ió45òl
òs.òjE&òN0ò
òóò ò 
òò"(òFòFò	>ð €Dà€Eò'SòRò1ð& €Iò*0òXòò")ò
&ò$ò8òò,ò"ò+ð ˆ8�?‰?ð	ó€Dò:Uò
-ð  €Oò
ò(4ò7ò$*òX*ô ˜)×*Ñ*ô  ð. ÐóI:r1   r–  c                 ó¦   — t        | t        «      r!t        | d«      5 }t        |«      cddd«       S t        | «      S # 1 sw Y   t        | «      S xY w)zz
    Calculate and return the MD5 checksum for a given file.
    ``file`` may either be a filename or an open stream.
    ÚrbN)r4   r5   r  Ú_md5_hexdigest©r*  r"  s     r/   r]  r]  ä  sM   € ô
 �$œÔÜ�$˜Óð 	* Ü! &Ó)÷	*ñ 	*ä˜$ÓÐ÷	*ä˜$ÓÐúó	   �=½Ac                 ó„   — t        «       }	 | j                  d«      }|s	 |j                  «       S |j                  |«       Œ6©Nr  )r   r  r+   Ú	hexdigest)ÚfpÚ
md5_digestr%  s      r/   r*  r*  ï  sD   € Ü“€JØ
Ø—‘˜	Ó"ˆÙØà×ÑÓ!Ð!ð 	×Ñ˜%Ô ð	 r1   c                 ó¦   — t        | t        «      r!t        | d«      5 }t        |«      cddd«       S t        | «      S # 1 sw Y   t        | «      S xY w)z~
    Calculate and return the SHA-256 checksum for a given file.
    ``file`` may either be a filename or an open stream.
    r)  N)r4   r5   r  Ú_sha256_hexdigestr+  s     r/   rY  rY  ù  sM   € ô
 �$œÔÜ�$˜Óð 	- Ü$ VÓ,÷	-ñ 	-ä˜TÓ"Ð"÷	-ä˜TÓ"Ð"úr,  c                 ó„   — t        «       }	 | j                  d«      }|s	 |j                  «       S |j                  |«       Œ6r.  )r   r  r+   r/  )r0  Úsha256_digestr%  s      r/   r3  r3  	  sD   € Ü“H€MØ
Ø—‘˜	Ó"ˆÙØà×"Ñ"Ó$Ð$ð 	×Ñ˜UÔ#ð	 r1   c                 ó^   — t        | ||«      D ]  }t        |t        «      sŒt        |«      ‚ y)z\
    Extract the contents of the zip file ``filename`` into the
    directory ``root``.
    N)r  r4   r‡   r‰   )r'   Úrootr  rŠ   s       r/   r)   r)   	  s1   € ô
 ˜x¨¨wÓ7ò %ˆÜ�gœ|Õ,Ü˜GÓ$Ð$ñ%r1   c                 óD  — d| v rd| ›�S t         j                  j                  |«      j                  t         j                  «      t         j                  z   }t         j                  j                  t         j                  j                  t         j                  j                  || «      «      «      }|j                  |«      sd| › �S t         j                  j                  t         j                  j                  |«      «      j                  t         j                  «      t         j                  z   }t         j                  j                  t         j                  j                  t         j                  j                  || «      «      «      }|j                  |«      sd| › �S y)ar  
    Check a single ZIP member name for path-traversal and escape vectors.

    Returns ``None`` if the member is safe, or a human-readable error
    string if the member must be rejected.  Comparison prefixes are
    derived from *root_abs* internally via ``os.path.normcase`` so that
    callers cannot supply inconsistent values.

    Parameters
    ----------
    member : str
        The archive entry name (forward-slash separated, as stored in the ZIP).
    root_abs : str
        Absolute path of the extraction root (used to build candidate paths
        and derive comparison prefixes via ``os.path.normcase``).
    ú z!Null byte in entry name blocked: zZip Slip blocked: zSymlink escape blocked: N)	r   r   ÚnormcaseÚrstripr   r  r&   r  r  )ÚmemberÚroot_absÚ
abs_prefixÚ
target_absÚreal_prefixÚtarget_reals         r/   Ú_validate_memberrB  	  s  € ð" �ÑØ2°6°*Ð=Ð=ä—‘×!Ñ! (Ó+×2Ñ2´2·6±6Ó:¼R¿V¹VÑC€JÜ—‘×!Ñ!¤"§'¡'§/¡/´"·'±'·,±,¸xÈÓ2PÓ"QÓR€JØ× Ñ  Ô,Ø# F 8Ð,Ð,ä—'‘'×"Ñ"¤2§7¡7×#3Ñ#3°HÓ#=Ó>×EÑEÄbÇfÁfÓMÔPR×PVÑPVÑV€KÜ—'‘'×"Ñ"¤2§7¡7×#3Ñ#3´B·G±G·L±LÀÈ6Ó4RÓ#SÓT€KØ×!Ñ! +Ô.Ø)¨&¨Ð2Ð2àr1   c           	   #   ó   K  — |r`t         j                  j                  dt        j                  j                  | «      d   z  «       t         j                  j                  «        	 t        | «      }	 t        j                  j                  |«      }|j                  «       }d}|D ]!  }t        ||«      }	|	€Œt        | |	«      –— d}Œ# |r	 |j                  «        |rt        «        yy	 t        j                  |d¬«       |D ]S  }t        ||«      }	|	�0t        | |	› d�«      –—  |j                  «        |rt        «        yy	 |j!                  ||«       ŒU 	 |j                  «        |rt        «        yy# t        $ r$}t        | |«      –— |r
t        «        Y d}~yd}~ww xY w# t        $ r8}t        | d|› �«      –— Y d}~|j                  «        |rt        «        yyd}~ww xY w# t        $ r<}t        | d	|› d
|› �«      –— Y d}~ |j                  «        |rt        «        yyd}~ww xY w# t        $ r}t        | d|› �«      –— Y d}~Œùd}~ww xY w# |j                  «        |rt        «        w w xY w­w)aë  
    Secure ZIP extraction using validate-then-extract.

    All members are validated before any extraction occurs.  If any member
    fails validation the entire archive is rejected and nothing is written
    to disk.

    Checks performed on every member name:
    - Null-byte rejection (platform path-truncation vector)
    - Zip-Slip (.., absolute paths, drive letters)
    - Symlink-escape (writes through pre-existing symlinks)

    All path comparisons use ``os.path.normcase`` so that the checks
    are case-insensitive on Windows (no-op on POSIX).

    Members are validated again immediately before each extraction as a
    best-effort check against filesystem changes between Phase 1 and the
    actual write, but this cannot eliminate TOCTOU races inherent in
    non-atomic extraction.

    Extraction aborts on the first error (including I/O errors) rather
    than skipping individual members.  Partial extraction of a potentially
    malicious archive is worse than no extraction.
    rÆ  r   NFTr  zExtraction error: z (during extraction)zExtraction error for rî   zValidation error: )r…  Ústdoutr  r   r   r   Úflushr   r‰   r‡   r¼   r  ÚnamelistrB  r  r  Úextract)
r'   r7  r  Úzfrõ   r=  ÚmembersÚhas_violationsr<  Úerrors
             r/   r  r  <	  sV  è ø€ ñ4 Ü�
‰
×Ñ˜¬"¯'©'¯-©-¸Ó*AÀ!Ñ*DÑDÔEÜ�
‰
×ÑÔðÜ�XÓˆð&Ü—7‘7—?‘? 4Ó(ˆØ—+‘+“-ˆð ˆØò 	ˆFÜ$ V¨XÓ6ˆEØÑ Ü" 8¨UÓ3Ò3Ø!%�Øð	ñ Øð, 	�‰Œ
ÙÜ�Gð ð)	Ü�K‰K˜¨4Õ0ð
 ò 		ˆFÜ$ V¨XÓ6ˆEØÐ Ü" 8°¨wÐ6JÐ-KÓLÒLØð 	�‰Œ
ÙÜ�Gð ðØ—
‘
˜6 8Õ,ñ		ð 	�‰Œ
ÙÜ�Gð øô[ ò Ü˜8 QÓ'Ò'ñ ÜŒGÜûðûô6 ò 	Ü˜xÐ+=¸a¸SÐ)AÓBÒBÛð 	�‰Œ
ÙÜ�Gð ûð%	ûô ò Ü" 8Ð/DÀVÀHÈBÈqÈcÐ-RÓSÒSÜð 	�‰Œ
ÙÜ�Gð ûðûô ò ?Ü˜8Ð'9¸!¸Ð%=Ó>×>ûð?ûð 	�‰Œ
ÙÜ�Gð üsÙ   ‚A#I>Á&E9 Á2AH5 Â7H5 ÃI>Ã+F) Ä%H5 Ä'I>ÅG-ÅH5 ÅI ÅI>Å9	F&ÆF!ÆI>Æ!F&Æ&I>Æ)	G*Æ2G%ÇH5 ÇI>Ç%G*Ç*H5 Ç-	H2Ç6H-È
H5 ÈI>È-H2È2H5 È5	IÈ>IÉI ÉIÉI ÉI;É;I>c                 óh  — g }t        t        j                  j                  | d«      «      D �]D  \  }}}t        j                  |j
                  «      }|› d|› dt        j                  j                  |j
                  «      d   › �}t        d„ |j                  «       D «       «      }|j                  dd|z  «       |j                  dd|j                  z  «       |j                  ddt        |j
                  «      z  «       |j                  d	dt        |j
                  «      z  «       |j                  d
|«       |j                  d«      s|j                  d|«       |j                  |«       �ŒG t        t!        t        j                  j                  | d«      «      «      }	t        «       }
||	z   D ]R  }|j                  d«      |
v rt#        d|j                  d«      z  «      ‚|
j%                  |j                  d«      «       ŒT t'        j(                  d«      }|j                  t'        j(                  d«      «       |d   j+                  t-        |d„ ¬«      «       |j                  t'        j(                  d«      «       |d   j+                  t-        |	d„ ¬«      «       t/        |«       |S )a}  
    Create a new data.xml index file, by combining the xml description
    files for various packages and collections.  ``root`` should be the
    path to a directory containing the package xml and zip files; and
    the collection xml files.  The ``root`` directory is expected to
    have the following subdirectories::

      root/
        packages/ .................. subdirectory for packages
          corpora/ ................. zip & xml files for corpora
          grammars/ ................ zip & xml files for grammars
          taggers/ ................. zip & xml files for taggers
          tokenizers/ .............. zip & xml files for tokenizers
          etc.
        collections/ ............... xml files for collections

    For each package, there should be two files: ``package.zip``
    (where *package* is the package name)
    which contains the package itself as a compressed zip file; and
    ``package.xml``, which is an xml description of the package.  The
    zipfile ``package.zip`` should expand to a single subdirectory
    named ``package/``.  The base filename ``package`` must match
    the identifier given in the package's xml file.

    For each collection, there should be a single file ``collection.zip``
    describing the collection, where *collection* is the name of the collection.

    All identifiers (for both packages and collections) must be unique.
    rQ   r   r   c              3   ó4   K  — | ]  }|j                   –— Œ y ­wr<   )Ú	file_size)rú   Úzf_infos     r/   rû   zbuild_index.<locals>.<genexpr>¶	  s   è ø€ ÒK°'˜G×-Õ-ÑKùs   ‚r   z%sr   r   rN  r   r   r¨   r   zDuplicate UID: %sr�  r   c                 ó$   — | j                  d«      S ©Nr   ©rV   rj   s    r/   r'  zbuild_index.<locals>.<lambda>Ò	  s   € ¸7¿;¹;ÀtÓ;L€ r1   r©   c                 ó$   — | j                  d«      S rQ  rR  r_   s    r/   r'  zbuild_index.<locals>.<lambda>Ô	  s   € ÀÇÁÐPTÓAU€ r1   )Ú_find_packagesr   r   r&   rS  r'   r   rþ   Úinfolistr~  rT  r]  rY  rV   r¾   rÚ   Ú_find_collectionsr   Úaddr   ÚElementrm  rÀ   Ú_indent_xml)r7  Úbase_urlrQ   Úpkg_xmlrH  r   Úzipstatr   r   r¨   ÚuidsrS   Útop_elts                r/   Úbuild_indexr_  “	  s   € ð> €HÜ-¬b¯g©g¯l©l¸4ÀÓ.LÓMó !Ñˆ��VÜ—'‘'˜"Ÿ+™+Ó&ˆØ�
˜!˜F˜8 1¤R§W¡W§]¡]°2·;±;Ó%?ÀÑ%BÐ$CÐDˆÜÑK¸R¿[¹[»]ÔKÓKˆð 	�‰�O T¨MÑ%9Ô:Ø�‰�F˜D 7§?¡?Ñ2Ô3Ø�‰�J ¤}°R·[±[Ó'AÑ AÔBØ�‰Ð% tÔ.>¸r¿{¹{Ó.KÑ'KÔLØ�‰�H˜fÔ%à�{‰{˜5Ô!Ø�K‰K˜˜sÔ#ð 	�‰˜Ö ð!!ô& Ô(¬¯©¯©°d¸MÓ)JÓKÓL€Kô ‹5€DØ˜;Ñ&ò !ˆØ�8‰8�D‹>˜TÑ!ÜÐ0°4·8±8¸D³>ÑAÓBÐBØ�‰�—‘˜$“Õ ð!ô ×!Ñ! +Ó.€GØ‡N�N”;×&Ñ& zÓ2Ô3ØˆA�J×Ñ”f˜XÑ+LÔMÔNØ‡N�N”;×&Ñ& }Ó5Ô6ØˆA�J×Ñ”f˜[Ñ.UÔVÔWä�ÔØ€Nr1   c                 óp  — t        | «      dkD  r¨| j                  xs dj                  «       dz   |z   dz   | _        | D ]  }t        ||dz   «       Œ | dd D ].  }|j                  xs dj                  «       dz   |z   dz   |_        Œ0 | d   j                  xs dj                  «       dz   |z   | d   _        yy)zþ
    Helper for ``build_index()``: Given an XML ``ElementTree``, modify it
    (and its descendents) ``text`` and ``tail`` attributes to generate
    an indented tree, where each nested element is indented by 2
    spaces with respect to its parent.
    r   rE   r¶   r6  Nr   )r½   r  r:  rY  Útail)r8   r×   rW   s      r/   rY  rY  Ú	  sÂ   € ô ˆ3ƒx�!‚|Ø—H‘H’N ×)Ñ)Ó+¨dÑ2°VÑ;¸dÑBˆŒØò 	.ˆEÜ˜˜v¨™}Õ-ð	.à˜˜"�Xò 	KˆEØŸ*™*Ò*¨×1Ñ1Ó3°dÑ:¸VÑCÀdÑJˆE�Jð	Kà˜B™Ÿ™Ò*¨×1Ñ1Ó3°dÑ:¸VÑCˆˆB‰�ð r1   c                 ón  ‡— t         j                  j                  t         j                  j                  |«      d   «      d   Š| j	                  d«      ‰k7  r*t        dj                  | j	                  d«      ‰«      «      ‚t        ˆfd„|j                  «       D «       «      rt        d‰›d‰›d�«      ‚y	)
zr
    Helper for ``build_index()``: Perform some checks to make sure that
    the given package is consistent.
    r   r   r   z&package identifier mismatch ({} vs {})c              3   óV   •K  — | ]   }|‰k7  xr |j                  ‰d z   «       –— Œ" y­w©r   N©r  ©rú   r   Úuids     €r/   rû   z!_check_package.<locals>.<genexpr>÷	  s-   øè ø€ Ò
VÀˆD�C‰KÒ: §¡°°c±	Ó :Ð:Ó:Ñ
Vùó   ƒ&)úZipfile ú..zip does not expand to a single subdirectory r   N)	r   r   r%   r   rV   r   rÉ   rþ   rF  )r[  ÚzipfilenamerH  rg  s      @r/   Ú_check_packagerl  ê	  sš   ø€ ô �'‰'×
Ñ
œ2Ÿ7™7Ÿ=™=¨Ó5°aÑ8Ó
9¸!Ñ
<€CØ‡{�{�4Ó˜CÒÜØ4×;Ñ;¸G¿K¹KÈÓ<MÈsÓSó
ð 	
ô
 Ó
VÈÏÉËÔ
VÔVÝâ"%¢sð,ó
ð 	
ð Wr1   c                 ól  — t        j                  ddd| gt         j                  t         j                  ¬«      }|j                  «       \  }}|j                  dk7  s|s|sDt        dt        j                  j                  | «      d   ›dt        j                  |«      ›�«      ‚|j                  «       d	   S )
z�
    Helper for ``build_index()``: Calculate the subversion revision
    number for a given file (by using ``subprocess`` to run ``svn``).
    ÚsvnrÂ   z-v)rD  r™  r   z#Error determining svn_revision for r   rî   r	  )Ú
subprocessÚPopenÚPIPEÚcommunicateÚ
returncoder   r   r   r   rÇ   rÈ   )r'   rn  rD  r™  s       r/   Ú_svn_revisionrt  ÿ	  s•   € ô
 	×ÑØ	�˜$ Ð)Ü�‰Ü�‰ô	€Að
 —]‘]“_�N€FˆFØ‡|�|�qÒ™F©&Ýä�w‰w�}‰}˜XÓ& qÓ)¬8¯=©=¸Ô+@ðBó
ð 	
ð �<‰<‹>˜!ÑÐr1   c              #   ó  K  — t        j                  | «      D ]d  \  }}}|D ]Y  }|j                  d«      sŒt         j                  j	                  ||«      }t        j                  |«      j                  «       –— Œ[ Œf y­w)zŽ
    Helper for ``build_index()``: Yield a list of ElementTree.Element
    objects, each holding the xml for a single package collection.
    ú.xmlN)r   r_  r  r   r&   r   r6   rl  )r7  ÚdirnameÚ_subdirsrW  r'   Úxmlfiles         r/   rV  rV  
  sq   è ø€ ô
 %'§G¡G¨D£Mò ;Ñ ˆ�˜5Øò 	;ˆHØ× Ñ  Õ(ÜŸ'™'Ÿ,™, w°Ó9�Ü!×'Ñ'¨Ó0×8Ñ8Ó:Ó:ñ	;ñ;ùs   ‚3B ¶A
B c           
   #   ó¨  ‡K  — ddl m} g }t        j                  | «      D �]Ö  \  }}}dj	                   || |«      «      }|D �]Ÿ  }|j                  d«      rït        j                  j	                  ||«      }|dd dz   }		 t        |	«      }
	 t        j                  |«      j                  «       }t        j                  j                  |dd «      d
   Š|j                  d«      ‰k7  r!t        d|j                  d«      ›d‰›d�«      ‚t        ˆfd„|
j!                  «       D «       «      rt        d‰›d‰›d�«      ‚||
|f–— �Œ|j                  d«      s�Œt        j                  j#                  |«      d   }t        j                  j	                  ||dz   «      }t        j                  j%                  |«      r�Œ}t'        j(                  |› d|dz   › d|› d�d¬«       �Œ¢ 	 |j+                  d«       �ŒÙ y# t        $ r}t        d|	›d	|› �«      |‚d}~ww xY w# t        $ r}t        d|›d	|› �«      |‚d}~ww xY w# t        $ r Y �Œ-w xY w­w)az  
    Helper for ``build_index()``: Yield a list of tuples
    ``(pkg_xml, zf, subdir)``, where:
      - ``pkg_xml`` is an ``ElementTree.Element`` holding the xml for a
        package
      - ``zf`` is a ``ZipFile`` for the package's contents.
      - ``subdir`` is the subdirectory (relative to ``root``) where
        the package was found (e.g. 'corpora' or 'grammars').
    r   )Ú
_path_fromr   rv  Nr5  r  zError reading file z!
r   r   zpackage identifier mismatch (z vs r¹   c              3   óV   •K  — | ]   }|‰k7  xr |j                  ‰d z   «       –— Œ" y­wrd  re  rf  s     €r/   rû   z!_find_packages.<locals>.<genexpr>E
  s5   øè ø€ ò àð ˜S‘[ÒC¨¯©¸¸s¹Ó)CÐ%CÓCñùrh  ri  rj  z exists, but z' cannot be found! This could mean that z can not be downloaded.r	  rP  z.svn)Únltk.corpus.reader.utilr{  r   r_  r&   r  r   r   r‰   r   r   r6   rl  r   rV   rþ   rF  r%   r  rZ  r[  r  )r7  r{  rQ   rw  ÚsubdirsrW  Úrelpathr'   Úxmlfilenamerk  rH  rõ   r[  Úresourcenamerg  s                 @r/   rT  rT  
  sW  øè ø€ õ 3ð €HÜ#%§7¡7¨4£=ó 3Ñˆ�˜%Ø—(‘(™: d¨GÓ4Ó5ˆØó +	ˆHØ× Ñ  Ô(Ü Ÿg™gŸl™l¨7°HÓ=�Ø)¨#¨2Ð.°Ñ7�ðYÜ  Ó-�BðYÜ)×/Ñ/°Ó<×DÑDÓF�Gô
 —g‘g—m‘m K°°Ð$4Ó5°aÑ8�Ø—;‘;˜tÓ$¨Ò+Ý$à$+§K¡K°Õ$5²sð<óð ô ó à "§¡£ôô õ %â58º#ð?óð ð
 ˜r 7Ð*Ô*à×"Ñ" 6Ö*ä!Ÿw™w×/Ñ/°Ó9¸!Ñ<�Ü Ÿg™gŸl™l¨7°LÀ6Ñ4IÓJ�Ü—w‘w—~‘~ kÖ2Ü—M‘MØ#˜* M°,ÀÑ2GÐ1Hð I0Ø0<¨~Ð=TðVà#$÷ðO+	ð\	Ø�N‰N˜6Ö"ñc3øô !ò YÜ$Ð':¸;¸/ÈÈQÈCÐ%PÓQÐWXÐXûðYûô !ò YÜ$Ð':¸;¸/ÈÈQÈCÐ%PÓQÐWXÐXûðYûôL ò 	Úð	üsz   ƒA=IÂG<Â#HÂ0B(IÅA$IÇ &IÇ'IÇ8IÇ<	HÈHÈHÈIÈ	H?È(H:È:H?È?IÉ	IÉIÉIÉIc                  ó>   — t        t        «      j                  «        y r<   )r’  Ú_downloaderr“  r3   r1   r/   Údownload_shellr„  m
  s   € Ü”KÓ ×$Ñ$Õ&r1   c                  ó>   — t        t        «      j                  «        y r<   )r–  rƒ  r—  r3   r1   r/   Údownload_guir†  q
  s   € Ü”+Ó×'Ñ'Õ)r1   c                  ó,   — t         j                  «        y r<   )rƒ  r+   r3   r1   r/   r+   r+   u
  s   € Ü×ÑÕr1   Ú__main__)ÚOptionParserz-dz--dirÚdirz!download package to directory DIRÚDIR)Údestr�  Úmetavarz-qz--quietr<  Ú
store_trueFzwork quietly)rŒ  ÚactionÚdefaultr�  z-fz--forcerô   z"download even if already installedz-ez--exit-on-errorr=  zexit if an error occursz-uz--urlr£   ÚNLTK_DOWNLOAD_URLzdownload server index url)rŒ  r�  r�  )r£   )rë   r’   r<  rô   r=  )r’   r<  rô   r=  r%  r7  )NrK   r8  r  r   ro  r…  rÇ   rß  rg  rZ  ÚzipfileÚhashlibr   r   Úurllib.errorr   r   Ú	xml.etreer   ri  Únltk.pathsecr   r	   r   rN   r[   r]   re   rh   rp   rt   rw   r{   r~   r�   r„   r‡   rŒ   r�   r•   r’  r–  r]  r*  rY  r3  r)   rB  r  r_  rY  rl  rt  rV  rT  rƒ  r;  r„  r†  r+   rH   Úoptparser‰  ÚparserÚ
add_optionr‚  rV   Ú
parse_argsr£  r±  r£   Ú
downloaderÚpkg_idrŠ  r<  rô   r=  Úrvr3   r1   r/   ú<module>rž     s1  ðñ<ð@Yót Û Û 	Û Û 
Û Û Û Û Û ß ß ,Ý !ã ß )÷f(ñ f(÷R&+ñ &+÷\!ñ !ô
%Ð.ô %ô%Ð/ô %ôÐ+ô ôÐ,ô ôÐ,ô ôÐ-ô ôÐ)ô ôÐ*ô ôÐ'ô ôÐ$ô ô#Ð$ô #ô!Ð'ô !ô)Ð0ô )÷J(ñ J(÷Zbñ b÷Jn:ñ n:òn ò"ò#ò%ó%òóBNònDóNDò 
ò*ò&	;òAñV ‹l€Ø×Ñ€ò'ò*òð ˆzÓÝ%á‹^€FØ
×ÑØØØØ0Øð ô ð ×ÑØØØØØØð ô ð ×ÑØØØØØØ1ð ô ð ×ÑØØØØØØ&ð ô ð ×ÑØØØØ—
‘
—‘Ð2Ó3Ø(ð ô ð ×%Ñ%Ó'�M€GˆTá¨W×-EÑ-EÔF€JáØò 		ˆFØ×$Ñ$Ø!Ø$Ÿ[™[Ø—m‘mØ—m‘mØ%×3Ñ3ð %ó ˆBò ˜'×/Ó/Ùñ		ð 	×ÑØ Ÿ™Ø—-‘-Ø—-‘-Ø!×/Ñ/ð	 	õ 	
ðw r1   