§
    íóÉj˜ˆ  ã                   ó¬  — 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ZddlmZ ddlmZ ddlmZmZ dZdZdadad„ Zd	„ Zd3d„Zd„ Z	 d4d„Z ed¬¦  «        d„ ¦   «         Z ej        d¦  «        Z  ej        d¦  «        Z!d„ Z"d„ Z#d„ Z$d5d„Z% G d„ dej&        j'        ¦  «        Z(d„ Z)d„ Z* G d„ dej+        j,        ¦  «        Z- G d„ d ej+        j.        ¦  «        Z/ G d!„ d"ej&        j0        ¦  «        Z1 G d#„ d$ej&        j2        ¦  «        Z3d%„ Z4d&„ Z5d'„ Z6d(„ Z7d)„ Z8d*„ Z9d+„ Z:e:Z;d6d-dd.œd/„Z< G d0„ d1ej=        ¦  «        Z=g d2¢Z>dS )7z+Centralized I/O security sentinel for NLTK.é    N)Ú	lru_cache)ÚPath)ÚunquoteÚurlparseTFc                 ó0  — 	 t          j        | ¦  «        }n# t          $ r Y dS w xY wt          j        |j        ¦  «        sdS t           j        dk    rdS |j        t          j        ¦   «         dfvrdS |j        t          j        t          j	        z  z  rdS dS )aï  Return True if *path* is a directory safe to trust as a data root: another
    *unprivileged local user* cannot plant files in it.

    This is the test that distinguishes a shared, world-writable temp directory
    (Linux ``/tmp``, mode ``1777``) -- which a local attacker could use to plant
    trusted-looking data (CWE-377/CWE-378) -- from a *private* per-user temp
    directory (macOS ``$TMPDIR`` ``/var/folders/...`` mode ``0700``, Windows
    ``%TEMP%`` under the ACL-protected user profile), which is safe.

    Cross-platform:
      * POSIX: the directory must be owned by the current user (or root) and be
        neither group- nor world-writable (unless the writable group/other bit
        is paired with the sticky bit *and* the dir is user-owned -- but we keep
        it strict and simply reject any group/other-writable dir).
      * Windows: ``st_uid``/mode are not meaningful; the per-user temp/profile is
        ACL-protected, so a plain "exists and is a directory" check is used.
    FÚposixTr   )
ÚosÚstatÚOSErrorÚS_ISDIRÚst_modeÚnameÚst_uidÚgetuidÚS_IWGRPÚS_IWOTH)ÚpathÚsts     úo/home/lighthouse/badge-speaker-benchmark/.benchmark-venv-community/lib/python3.11/site-packages/nltk/pathsec.pyÚis_private_dirr   *   s¤   € ð$ÝŒW�T‰]Œ]ˆˆøÝð ð ð ØˆuˆuðøøøåŒ<˜œ
Ñ#Ô#ð ØˆuÝ	„w�'ÒÐàˆtà	„y�œ™œ aÐ(Ð(Ð(Øˆuð 
„z•T”\¥D¤LÑ0Ñ1ð ØˆuØˆ4s   ‚ —
%¤%c                  ót  — g } dt           j        v r.t          t          t           j        d         dg ¦  «        ¦  «        } t          j                             dd¦  «        }| |f}t          �t          |k    rt          S t          ¦   «         }| | 
                    t          j        ¦  «        z   D ]�}|r‹	 t          |d¦  «        r|j        n|}|                     t          t!          |¦  «        ¦  «                             ¦   «                              ¦   «         ¦  «         Œr# t&          t(          t*          f$ r Y Œ‹w xY wŒ�ddg}|D ]|}	 t          |¦  «                             ¦   «                              ¦   «         }|                     ¦   «         r|                     |¦  «         Œ`# t&          t(          t*          f$ r Y Œyw xY w	 t          t/          j        ¦   «         ¦  «                             ¦   «         }t3          |¦  «        r|                     |¦  «         n# t&          t(          t*          f$ r Y nw xY w|a|a|S )zDDynamically determines allowed directories based on NLTK data paths.z	nltk.datar   Ú	NLTK_DATAÚ Nz~/nltk_dataz/usr/share/nltk_data)ÚsysÚmodulesÚlistÚgetattrr	   ÚenvironÚgetÚ_ALLOWED_ROOTS_CACHEÚ_LAST_DATA_PATHSÚsetÚsplitÚpathsepÚhasattrr   Úaddr   ÚstrÚ
expanduserÚresolver   Ú
ValueErrorÚRuntimeErrorÚexistsÚtempfileÚ
gettempdirr   )	Úcurrent_pathsÚ	env_pathsÚcurrent_stateÚrootsÚpÚraw_pÚcandidate_locsÚlocÚtmps	            r   Ú_get_allowed_rootsr8   O   s1  € ð €MØ•c”kÐ!Ð!å�W¥S¤[°Ô%=¸vÀrÑJÔJÑKÔKˆå”
—’˜{¨BÑ/Ô/€IØ" IÐ.€MåÐ'Õ,<ÀÒ,MÐ,MÝ#Ð#å‰EŒE€EØ˜YŸ_š_­R¬ZÑ8Ô8Ñ8ð ð ˆØð 	ðå")¨!¨VÑ"4Ô"4Ð;˜œ˜¸!�Ø—	’	�$�s 5™zœzÑ*Ô*×5Ò5Ñ7Ô7×?Ò?ÑAÔAÑBÔBÐBÐBøÝ�Z­Ð6ð ð ð Ø�ðøøøð	ð $Ð%;Ð<€Nàð ð ˆð	Ý�S‘	”	×$Ò$Ñ&Ô&×.Ò.Ñ0Ô0ˆAØ�xŠx‰zŒzð Ø—	’	˜!‘”�øøÝ�¥\Ð2ð 	ð 	ð 	ØˆHð	øøøðÝ•8Ô&Ñ(Ô(Ñ)Ô)×1Ò1Ñ3Ô3ˆÝ˜#ÑÔð 	Ø�IŠI�c‰NŒNˆNøøÝ•Z¥Ð.ð ð ð Øˆðøøøð !ÐØ$ÐØ€Ls9   Â1A,DÄD8Ä7D8ÅAF"Æ"F<Æ;F<Ç AH ÈH1È0H1ÚNLTKc                 ó*  ‡‡— t          | t          ¦  «        s#| r!t          | ¦  «                             ¦   «         sdS 	 t	          | d¦  «        r| j        nt          | ¦  «        }d|v r9t          |¦  «        }|j        dv rdS |j        dk    rt          |j        ¦  «        }	 t          |¦  «         
                    ¦   «         Šn€# t          t          f$ rl |                     ¦   «         }d|v rB|                     d¦  «        dz   }t          |d|…         ¦  «         
                    ¦   «         Šnt          |¦  «        ŠY nw xY w|rzt	          |d¦  «        r|j        nt          |¦  «        }t          |¦  «         
                    ¦   «         }‰|k    s-‰                     |¦  «        st          d|› d	‰› d
|› �¦  «        ‚t!          ¦   «         }	t#          ˆfd„|	D ¦   «         ¦  «        rdS 	 t          t%          j        ¦   «         ¦  «         
                    ¦   «         Š‰‰k    s‰                     ‰¦  «        r^t#          ˆfd„|	D ¦   «         ¦  «        rdS d|› d�}
t(          rt+          |
¦  «        ‚t-          j        d|› d	‰› d�t0          d¬¦  «         dS n# t          t          f$ r Y nw xY wd|› d‰› �}
t(          rt+          |
¦  «        ‚t-          j        |
t0          d¬¦  «         dS # t*          t          f$ r ‚ t2          $ r t(          r‚ Y dS w xY w)aG  
    Ensures file access is restricted to allowed data directories.

    :param path_input: The path to validate.
    :param context: Diagnostic context for warnings/errors.
    :param required_root: If provided, enforces that the path is strictly
                          within this specific directory (scoped sandbox).
    Nr   z://)ÚhttpÚhttpsÚftpÚfilez.zipé   úSecurity Violation [z]: Path z escapes root c              3   óN   •K  — | ]}‰|k    p‰                      |¦  «        V — Œ d S ©N)Úis_relative_to)Ú.0ÚrootÚtargets     €r   ú	<genexpr>z validate_path.<locals>.<genexpr>·   s:   øè è € ÐWÐWÀˆv˜Š~Ð< ×!6Ò!6°tÑ!<Ô!<ÐWÐWÐWÐWÐWÐWó    c              3   ó$   •K  — | ]
}‰|k    V — Œd S rB   © )rD   rE   Úcwds     €r   rG   z validate_path.<locals>.<genexpr>¾   s'   øè è € Ð=Ð= t�s˜d’{Ð=Ð=Ð=Ð=Ð=Ð=rH   zS]: CWD access restricted in ENFORCE mode. Authorize via: nltk.data.path.append('.')zSecurity Warning [z allowed via CWD.é   ©Ú
stacklevelz]: Unauthorized path )Ú
isinstanceÚintr'   Ústripr%   r   r   Úschemer   r   r)   r   r*   ÚlowerÚfindrC   r8   Úanyr	   ÚgetcwdÚENFORCEÚPermissionErrorÚwarningsÚwarnÚRuntimeWarningÚ	Exception)Ú
path_inputÚcontextÚrequired_rootÚrawÚparsedÚ	lower_rawÚzip_idxÚroot_rawÚscoped_rootÚallowed_rootsÚmsgrK   rF   s              @@r   Úvalidate_pathrh   …   s¶  øø€ õ �*�cÑ"Ô"ð ¨*ð ½CÀ
¹O¼O×<QÒ<QÑ<SÔ<Sð ØˆðIÝ!(¨°VÑ!<Ô!<ÐQˆjŒoˆoÅ#ÀjÁ/Ä/ˆà�Cˆ<ˆ<Ý˜c‘]”]ˆFØŒ}Ð 8Ð8Ð8Ø�ØŒ} Ò&Ð&Ý˜fœkÑ*Ô*�ð		#Ý˜#‘Y”Y×&Ò&Ñ(Ô(ˆFˆFøÝ�Ð$ð 	#ð 	#ð 	#àŸ	š	™œˆIØ˜Ð"Ð"Ø#Ÿ.š.¨Ñ0Ô0°1Ñ4�Ý˜c ( 7 (œmÑ,Ô,×4Ò4Ñ6Ô6��å˜c™œ�øøð	#øøøð ð 	õ ˜=¨&Ñ1Ô1ð(�Ô"Ð"å˜Ñ'Ô'ð õ
 ˜x™.œ.×0Ò0Ñ2Ô2ˆKØ˜kÒ)Ð)¨V×-BÒ-BÀ;Ñ-OÔ-OÐ)å Ø_¨7Ð_Ð_¸FÐ_Ð_ÐR]Ð_Ð_ñô ð õ
 +Ñ,Ô,ˆÝÐWÐWÐWÐWÈÐWÑWÔWÑWÔWð 	ØˆFð	Ý•r”y‘{”{Ñ#Ô#×+Ò+Ñ-Ô-ˆCØ˜Š}ˆ} × 5Ò 5°cÑ :Ô :ˆ}ÝÐ=Ð=Ð=Ð=¨}Ð=Ñ=Ô=Ñ=Ô=ð Ø�Fð@¨7ð @ð @ð @ð õ ð Ý)¨#Ñ.Ô.Ð.å”MØW¨WÐWÐW¸fÐWÐWÐWÝ&Ø#$ðñ ô ð ð
 �Fð øõ  �Ð$ð 	ð 	ð 	ØˆDð	øøøð L WÐKÐKÀ6ÐKÐKˆÝð 	=Ý! #Ñ&Ô&Ð&åŒM˜#�~¸!Ð<Ñ<Ô<Ð<Ð<Ð<øÝ�ZÐ(ð ð ð ØÝð ð ð Ýð 	Øð	ð 	ð 	ðøøøsi   ¾AK+ ÂK+ Â"!C ÃK+ ÃA:EÄ>K+ Å EÅB(K+ Ç,A(J É?J ÊK+ ÊJ,Ê)K+ Ê+J,Ê,=K+ Ë+#LÌLc                 ó  — t           j        j        r|                      dd¦  «        n| }t           j                             | ¦  «        d         s|                     d¦  «        rdS t           j        j        |                     d¦  «        v S )aš  True if a ZIP member is written somewhere other than where it is validated.

    ``zipfile.ZipFile.extract`` sanitises a member name by *dropping* the drive
    and every empty / ``.`` / ``..`` component while keeping the rest, whereas
    ``Path.resolve`` collapses a ``..`` against its *preceding* component.  For a
    member such as ``a/../b/x`` the two disagree: it is validated as ``<root>/b/x``
    but written to ``<root>/a/b/x``, which can escape through a pre-existing
    symlink at ``<root>/a/b`` that the collapsed validation path never visits.

    The mismatch only ever arises from absolute / drive-qualified / ``..`` members
    -- exactly the shapes a legitimate archive never uses -- so rather than keep
    two different normalizations in sync we reject them outright.  This both
    closes the validate/extract gap and is the proactive block the hardened
    extractor promises (CWE-22 / CWE-59).
    ú\ú/r   T)r	   r   ÚaltsepÚreplaceÚ
splitdriveÚ
startswithÚpardirr#   )Úname_strÚ
normalizeds     r   Ú_zip_member_is_unsafers   Ü   s{   € õ" 13´´ÐL�×!Ò! $¨Ñ,Ô,Ð,ÀH€JÝ	„w×Ò˜(Ñ#Ô# AÔ&ð ¨*×*?Ò*?ÀÑ*DÔ*Dð ØˆtÝŒ7Œ>˜Z×-Ò-¨cÑ2Ô2Ð2Ð2rH   ÚZipAuditc                 ó¦  ‡‡‡— 	 t          |¦  «                             ¦   «         Šˆˆˆfd„}t          | t          j        ¦  «        r || ¦  «         dS t          j        | d¦  «        5 } ||¦  «         ddd¦  «         dS # 1 swxY w Y   dS # t
          t          f$ r ‚ t          t          j        f$ r t          rt          d¦  «        ‚Y dS w xY w)zEEnhanced Zip-Slip protection using Pathlib for cross-platform safety.c                 ó´  •— ‰�‰gn|                       ¦   «         }|D ]º}t          |d¦  «        r|j        nt          |¦  «        }d|v rt	          d|› �¦  «        ‚‰|z                       ¦   «         }t          |¦  «        s|‰k    sP|                     ‰¦  «        s;d‰› d|› d�}t          rt          |¦  «        ‚t          j        |t          d¬¦  «         Œ»d S )	NÚfilenameú zNull byte in ZIP member: r@   z]: Traversal member 'z' detected.rL   rM   )Únamelistr%   rw   r'   r*   r)   rs   rC   rW   rX   rY   rZ   r[   )	ÚzfÚmembersr   rq   Úmember_pathrg   r^   Úspecific_memberrF   s	         €€€r   Ú_auditz$validate_zip_archive.<locals>._auditú   s  ø€ à%4Ð%@�Ð!Ð!ÀbÇkÂkÁmÄmð ð  ð Ið I�Ý,3°D¸*Ñ,EÔ,EÐT˜4œ=˜=Í3ÈtÉ9Ì9�Ø˜8Ð#Ð#Ý$Ð%KÀÐ%KÐ%KÑLÔLÐLð  &¨Ñ0×9Ò9Ñ;Ô;�Ý(¨Ñ2Ô2ð IØ 6Ò)Ð)¨[×-GÒ-GÈÑ-OÔ-OÐ)àd°ÐdÐdÈxÐdÐdÐd�CÝð IÝ-¨cÑ2Ô2Ð2å œ c­>ÀaÐHÑHÔHÐHøð#Ið IrH   ÚrNzZip validation failed)
r   r)   rO   ÚzipfileÚZipFilerX   r*   r   Ú
BadZipFilerW   )Úzip_obj_or_pathÚtarget_rootr}   r^   r~   rz   rF   s     ``  @r   Úvalidate_zip_archiver…   ó   s\  øøø€ ð#;Ý�kÑ"Ô"×*Ò*Ñ,Ô,ˆð	Ið 	Ið 	Ið 	Ið 	Ið 	Ið 	Iõ. �o¥w¤Ñ7Ô7ð 	ØˆF�?Ñ#Ô#Ð#Ð#Ð#å” °#Ñ6Ô6ð ¸"Ø��r‘
”
�
ðð ð ñ ô ð ð ð ð ð ð ð øøøð ð ð ð ð ð øå�ZÐ(ð ð ð ØÝ•WÔ'Ð(ð ;ð ;ð ;Ýð 	;Ý!Ð"9Ñ:Ô:Ð:ð	;ð 	;ð 	;ð;øøøs<   …AB ÁB Á)BÁ5B ÂBÂB Â	BÂ
B Â=CÃCé   )Úmaxsizec                 óx   — 	 t          j        | dt           j        ¬¦  «        S # t          t          f$ r g cY S w xY w)a?  Cached hostname resolution for the early SSRF pre-check.

    Note: the cache alone does NOT prevent DNS rebinding, because the connection
    layer re-resolves the hostname independently. The actual rebinding
    protection is the connect-time IP pinning in ``_SafeHTTPConnection`` /
    ``_SafeHTTPSConnection``.
    N©Úproto)ÚsocketÚgetaddrinfoÚIPPROTO_TCPr   r*   )Úhostnames    r   Ú_resolve_hostnamer�     sK   € ðÝÔ! (¨D½Ô8JÐKÑKÔKÐKøÝ•ZÐ ð ð ð Øˆ	ˆ	ˆ	ðøøøs   ‚ # £9¸9z64:ff9b::/96z::/96c                 óº   — t          | t          j        ¦  «        sdS | j        }|�|S | t          v s	| t
          v r!t          j        | j        dd…         ¦  «        S dS )a<  The embedded IPv4 for IPv6 forms that *are* an IPv4 address, else None.

    Covers IPv4-mapped (``::ffff:0:0/96``), IPv4-compatible (``::/96``) and the
    NAT64 well-known prefix (``64:ff9b::/96``). For these the IPv6 wrapper has no
    independent routable meaning, so the embedded IPv4 is what gets reached.
    Néüÿÿÿ)rO   Ú	ipaddressÚIPv6AddressÚipv4_mappedÚ_NAT64_WELL_KNOWNÚ_IPV4_COMPATIBLEÚIPv4AddressÚpacked)ÚipÚmappeds     r   Ú_embedded_ipv4r›   1  sg   € õ �b�)Ô/Ñ0Ô0ð ØˆtØŒ^€FØÐØˆØ	ÕÐÐ "Õ(8Ð"8Ð"8ÝÔ$ R¤Y¨r¨s¨s¤^Ñ4Ô4Ð4Øˆ4rH   c              #   ó‚   K  — t          | t          j        ¦  «        sdS | j        }|�|V — | j        }|�
|E d{V —† dS dS )zBIPv4 addresses tunneled by routable IPv6 wrappers (6to4 / Teredo).N)rO   r’   r“   Ú	sixtofourÚteredo)r™   r�   rž   s      r   Ú_tunneled_ipv4srŸ   B  si   è è € å�b�)Ô/Ñ0Ô0ð ØˆØ”€IØÐØˆˆˆØŒY€FØÐØÐÐÐÐÐÐÐÐÐð ÐrH   c                 óŒ   — t          | ¦  «        }|�|} t          | ¦  «        D ]}|j        s|j        s dS Œ| j        p| j         S )am  Return True if the SSRF filter must refuse to connect to ``ip``.

    Policy (defense in depth): only *globally routable* addresses are allowed;
    anything that is not global -- loopback, link-local, private, carrier-grade
    NAT (100.64.0.0/10), reserved, unspecified (``0.0.0.0`` / ``::``),
    documentation ranges, etc. -- is forbidden. This generalises the previous
    explicit ``loopback / link-local / multicast / private`` list and is a strict
    superset of it. Multicast is still rejected explicitly because some CPython
    versions classify multicast addresses as ``is_global``.

    IPv6 addresses that embed an IPv4 address are evaluated by that embedded IPv4,
    not by the wrapper: the stdlib classifies the wrappers (IPv4-mapped,
    IPv4-compatible, NAT64 ``64:ff9b::/96``, 6to4 ``2002::/16``, Teredo
    ``2001:0::/32``) as globally routable, so a forbidden internal IPv4 (loopback,
    the link-local cloud-metadata address, ...) could otherwise be smuggled past
    the check and then routed to that IPv4 by a NAT64/6to4/Teredo gateway
    (CWE-918). This extends the previous IPv4-mapped-only unwrap.
    NT)r›   rŸ   Úis_multicastÚ	is_global)r™   ÚembeddedÚtunneleds      r   Ú_ip_is_forbiddenr¥   N  sf   € õ& ˜bÑ!Ô!€HØÐØˆÝ# BÑ'Ô'ð ð ˆØÔ ð 	¨Ô(:ð 	Ø�4�4ð	àŒ?Ð. "¤,Ð.Ð.rH   Ú	NetworkIOc                 ó¬  — | r!t          | ¦  «                             ¦   «         sdS 	 t          t          | ¦  «        ¦  «        }|j        dk    r�t	          |j        ¦  «        }|j        }|dvrt          d|› d|›�¦  «        ‚t          j	        dk    r5t          |¦  «        dk    r"|d         d	k    r|d
         dk    r
|dd…         }t          ||› d�¬¦  «         dS |j        dvrBd|› d|j        › d�}t          rt          |¦  «        ‚t          j        |t           d¬¦  «         dS t#          |j        pd¦  «        D ]k}t'          j        |d         d         ¦  «        }t+          |¦  «        r:d|› d|› �}t          rt          |¦  «        ‚t          j        |t           d¬¦  «         ŒldS # t          t,          f$ r ‚ t.          $ r t          r‚ Y dS w xY w)z-Hardened URL validation with SSRF protection.Nr>   )r   Ú	localhostr@   z9.file_scheme]: Non-local file URI authority not allowed: ÚntrL   r   rk   é   ú:é   z.file_scheme©r^   )r;   r<   z]: Unsupported scheme 'z'.rM   r   r?   z!]: SSRF attempt to restricted IP )r'   rQ   r   rR   r   r   Únetlocr   r	   r   Úlenrh   rW   rX   rY   rZ   r[   r�   rŽ   r’   Ú
ip_addressr¥   r*   r\   )Ú	url_inputr^   ra   Ú	file_pathr®   rg   Úresultr™   s           r   Úvalidate_network_urlr´   j  s[  € àð �C 	™NœN×0Ò0Ñ2Ô2ð Øˆð2Ý�#˜i™.œ.Ñ)Ô)ˆàŒ=˜FÒ"Ð"Ý ¤Ñ,Ô,ˆIØ”]ˆFð Ð.Ð.Ð.ÝðL¨7ð Lð LØAGðLð Lñô ð õ ”˜4’�Ý˜	‘N”N aÒ'Ð'Ø˜a”L CÒ'Ð'Ø˜a”L CÒ'Ð'à% a b bœM�	å˜)°Ð-EÐ-EÐ-EÐFÑFÔFÐFØˆFàŒ=Ð 1Ð1Ð1àX wÐXÐXÀvÄ}ÐXÐXÐXð õ ð AÝ% cÑ*Ô*Ð*å”˜c¥>¸aÐ@Ñ@Ô@Ð@ØˆFå'¨¬Ð(=¸2Ñ>Ô>ð 	Eð 	EˆFÝÔ% f¨Q¤i°¤lÑ3Ô3ˆBÝ Ñ#Ô#ð EØ[¨WÐ[Ð[ÐWYÐ[Ð[�Ýð EÝ)¨#Ñ.Ô.Ð.å”M #¥~À!ÐDÑDÔDÐDøð	Eð 	Eøõ �ZÐ(ð ð ð ØÝð ð ð Ýð 	Øð	ð 	ð 	ðøøøs    §B4F, ÃA	F, Ä(BF, Æ,#GÇGc                   ó"   ‡ — e Zd ZdZˆ fd„Zˆ xZS )Ú_ValidatingRedirectHandlerzIEnsures that every step of a redirect chain is re-validated against SSRF.c                 ór   •— t          |d¬¦  «         t          ¦   «                              ||||||¦  «        S )NÚNetworkRedirectr­   )r´   ÚsuperÚredirect_request)ÚselfÚreqÚfpÚcoderg   ÚheadersÚnewurlÚ	__class__s          €r   rº   z+_ValidatingRedirectHandler.redirect_request¦  s9   ø€ Ý˜VÐ->Ð?Ñ?Ô?Ð?Ý‰wŒw×'Ò'¨¨R°°s¸GÀVÑLÔLÐLrH   )Ú__name__Ú
__module__Ú__qualname__Ú__doc__rº   Ú__classcell__©rÁ   s   @r   r¶   r¶   £  sG   ø€ € € € € ØSÐSðMð Mð Mð Mð Mð Mð Mð Mð MrH   r¶   c                 óx  — 	 t          j        | |t           j        ¬¦  «        }n# t          t          f$ r g cY S w xY w|D ]z}	 t          j        |d         d         ¦  «        }n# t          $ r Y Œ0w xY wt          |¦  «        r7d|› �}t          rt          |¦  «        ‚t          j        |t          d¬¦  «         Œ{|S )a  
    Resolve ``host`` once and SSRF-validate *every* address it resolves to.

    Returns the resolved ``getaddrinfo`` records so the caller can connect to a
    **pinned** numeric address. Because validation and the subsequent connection
    observe the same resolution (the connection is made to the numeric IP, which
    triggers no further name lookup), this closes the DNS-rebinding TOCTOU where
    a hostname resolves to a public IP during validation and to an internal /
    loopback IP during the actual connect.
    r‰   r?   r   zDSecurity Violation [pathsec.urlopen]: SSRF attempt to restricted IP rª   rM   )r‹   rŒ   r�   r   r*   r’   r°   r¥   rW   rX   rY   rZ   r[   )ÚhostÚportÚaddrinfoÚresr™   rg   s         r   Ú_resolve_and_validate_hostrÍ   «  së   € ðÝÔ% d¨D½Ô8JÐKÑKÔKˆˆøÝ•ZÐ ð ð ð Øˆ	ˆ	ˆ	ðøøøàð 	=ð 	=ˆð	ÝÔ% c¨!¤f¨Q¤iÑ0Ô0ˆBˆBøÝð 	ð 	ð 	ØˆHð	øøøå˜BÑÔð 	=Ø]ÐY[Ð]Ð]ˆCÝð +Ý% cÑ*Ô*Ð*ÝŒM˜#�~¸!Ð<Ñ<Ô<Ð<øØ€Os   ‚!$ ¤:¹:Á A#Á#
A0Á/A0c                 óê   — t          | |¦  «        }|st          j        d| ›d�¦  «        ‚d}|D ]C}|d         d         }	 t          j        ||f||¦  «        c S # t          $ r}|}Y d}~Œ<d}~ww xY w|‚)aj  Open a socket to ``host``/``port`` over an SSRF-validated, pinned address.

    Every address ``host`` resolves to is validated together, then the socket is
    opened to those **numeric** addresses, so no second (unvalidated) name lookup
    happens at connect time -- this closes the DNS-rebinding TOCTOU.  All
    validated addresses are tried in order, preserving urllib/socket's normal
    dual-stack / multi-A fallback.  If nothing resolves to a validated address we
    fail closed: we never fall back to connecting by the raw hostname, which
    would re-resolve unvalidated and reopen the rebinding hole.
    z/pathsec.urlopen: no validated address for host z-; refusing to connect by unvalidated hostnameNr?   r   )rÍ   r‹   ÚgaierrorÚcreate_connectionr   )	rÉ   rÊ   ÚtimeoutÚsource_addressrË   Úlast_errrÌ   r™   Úes	            r   Ú_pinned_connectionrÕ   Ç  sÁ   € õ *¨$°Ñ5Ô5€HØð 
õ Œoð:¸dð :ð :ð :ñ
ô 
ð 	
ð €HØð ð ˆØ�ŒV�AŒYˆð	ÝÔ+¨R°¨J¸ÀÑPÔPÐPÐPÐPøÝð 	ð 	ð 	ØˆHˆHˆHˆHˆHˆHøøøøð	øøøà
€Ns   Á AÁ
A0Á$A+Á+A0c                   ó   — e Zd ZdZd„ ZdS )Ú_SafeHTTPConnectionzOHTTPConnection that resolves, SSRF-validates and pins the address at connect().c                 ó\   — t          | j        | j        | j        | j        ¦  «        | _        d S rB   )rÕ   rÉ   rÊ   rÑ   rÒ   Úsock)r»   s    r   Úconnectz_SafeHTTPConnection.connectî  s)   € Ý&ØŒI�t”y $¤,°Ô0Cñ
ô 
ˆŒ	ˆ	ˆ	rH   N©rÂ   rÃ   rÄ   rÅ   rÚ   rJ   rH   r   r×   r×   ë  s)   € € € € € ØYÐYð
ð 
ð 
ð 
ð 
rH   r×   c                   ó   — e Zd ZdZd„ ZdS )Ú_SafeHTTPSConnectionz§HTTPS variant of :class:`_SafeHTTPConnection`.

    Connects to a validated, pinned IP but keeps SNI / certificate verification
    against the original hostname.
    c                 óž   — t          | j        | j        | j        | j        ¦  «        }| j                             || j        ¬¦  «        | _        d S )N)Úserver_hostname)rÕ   rÉ   rÊ   rÑ   rÒ   Ú_contextÚwrap_socketrÙ   )r»   rÙ   s     r   rÚ   z_SafeHTTPSConnection.connectû  sG   € Ý!ØŒI�t”y $¤,°Ô0Cñ
ô 
ˆð ”M×-Ò-¨dÀDÄIÐ-ÑNÔNˆŒ	ˆ	ˆ	rH   NrÛ   rJ   rH   r   rÝ   rÝ   ô  s2   € € € € € ðð ðOð Oð Oð Oð OrH   rÝ   c                   ó   — e Zd Zd„ ZdS )Ú_SafeHTTPHandlerc                 ó8   — |                       t          |¦  «        S rB   )Údo_openr×   )r»   r¼   s     r   Ú	http_openz_SafeHTTPHandler.http_open  s   € Ø�|Š|Õ/°Ñ5Ô5Ð5rH   N)rÂ   rÃ   rÄ   ræ   rJ   rH   r   rã   rã     s#   € € € € € ð6ð 6ð 6ð 6ð 6rH   rã   c                   ó   — e Zd Zd„ ZdS )Ú_SafeHTTPSHandlerc                 óš   — i }t          | dd ¦  «        �
| j        |d<   t          | dd ¦  «        �
| j        |d<    | j        t          |fi |¤ŽS )Nrà   r^   Ú_check_hostnameÚcheck_hostname)r   rà   rê   rå   rÝ   )r»   r¼   Úkwargss      r   Ú
https_openz_SafeHTTPSHandler.https_open  sc   € ØˆÝ�4˜ TÑ*Ô*Ð6Ø $¤ˆF�9ÑÝ�4Ð*¨DÑ1Ô1Ð=Ø'+Ô';ˆFÐ#Ñ$ØˆtŒ|Õ0°#Ð@Ð@¸Ð@Ð@Ð@rH   N)rÂ   rÃ   rÄ   rí   rJ   rH   r   rè   rè     s(   € € € € € ðAð Að Að Að ArH   rè   c                  ó    — t           rdS t          j                             dd¦  «                             ¦   «                              ¦   «         dv S )zGTrue only if the operator has explicitly opted into trusting the proxy.TÚNLTK_ALLOW_PROXIED_URLOPENr   )Ú1ÚtrueÚyesÚon)ÚALLOW_PROXIED_FETCHr	   r   r   rQ   rS   rJ   rH   r   Ú_proxied_fetch_allowedrõ     sK   € åð ØˆtÝŒ:�>Š>Ð6¸Ñ;Ô;×AÒAÑCÔC×IÒIÑKÔKð Pð ð rH   c                 ó–   — t          ¦   «         rdS d| ›d�}t          rt          |¦  «        ‚t          j        |t
          d¬¦  «         dS )aÏ  Fail closed on a proxied fetch NLTK cannot SSRF-validate (CWE-918).

    A configured proxy performs the egress, so NLTK can neither pin the
    validated IP nor observe the address the proxy ultimately reaches. Rather
    than reintroduce the DNS-rebinding / internal-routing SSRF that the pinned
    direct path closes, refuse the request unless the operator has asserted the
    proxy is trusted (``ALLOW_PROXIED_FETCH`` / ``NLTK_ALLOW_PROXIED_URLOPEN``).
    NzBSecurity Violation [pathsec.urlopen]: refusing a proxied fetch of a  . A configured proxy performs the egress, so NLTK cannot pin the validated IP and SSRF protection cannot be enforced (CWE-918). If and only if the proxy is trusted to be SSRF-safe, opt in via NLTK_ALLOW_PROXIED_URLOPEN=1 or nltk.pathsec.ALLOW_PROXIED_FETCH=True.rL   rM   )rõ   rW   rX   rY   rZ   r[   )Úurl_strrg   s     r   Ú _reject_unpinnable_proxied_fetchrø     sl   € õ ÑÔð Øˆð	QØð	Qð 	Qð 	Qð õ ð #Ý˜cÑ"Ô"Ð"Ý„M�#•~°!Ð4Ñ4Ô4Ð4Ð4Ð4rH   c                 óÔ  — t          | d¦  «        r| j        nt          | ¦  «        }t          |d¬¦  «         t	          ¦   «         g}d}d}t
          j        j        ��=t
          j        j        j        D �]%}t          |t
          j        j
        ¦  «        rVd}|j        rt          |j        ¦  «        ni }|rd}|                     t
          j         
                    |¦  «        ¦  «         Œxt          |t
          j        j        ¦  «        r8|                     t
          j                             |j        ¦  «        ¦  «         ŒÏt          |t
          j        j        ¦  «        r7|                     t
          j                             |j        ¦  «        ¦  «         �Œ'|s"|s t
          j                             ¦   «         rd}|sw|s2|                     t
          j         
                    i ¦  «        ¦  «         |                     t%          ¦   «         ¦  «         |                     t'          ¦   «         ¦  «         nt)          |¦  «         t          j        j        |Ž }	 |	j        | g|¢R i |¤ŽS )zÔ
    Secure wrapper for urllib.request.urlopen with redirect validation.
    Inherits NLTK proxy settings, but intentionally ignores other custom
    global handlers to strictly enforce the security sandbox.
    Úfull_urlzpathsec.urlopenr­   FNT)r%   rú   r'   r´   r¶   ÚurllibÚrequestÚ_openerÚhandlersrO   ÚProxyHandlerÚproxiesÚdictÚappendÚProxyBasicAuthHandlerÚpasswdÚProxyDigestAuthHandlerÚ
getproxiesrã   rè   rø   Úbuild_openerÚopen)
ÚurlÚargsrì   r÷   rþ   ÚproxiedÚhas_proxy_handlerÚhandlerÚisolated_proxiesÚopeners
             r   Úurlopenr  4  s9  € õ & c¨:Ñ6Ô6ÐDˆcŒlˆl½CÀ¹H¼H€GÝ˜Ð*;Ð<Ñ<Ô<Ð<õ +Ñ,Ô,Ð-€Hð €GØÐÝ„~ÔÑ)Ý”~Ô-Ô6ð 	Wñ 	WˆGÝ˜'¥6¤>Ô#>Ñ?Ô?ð 
WØ$(Ð!à<C¼OÐ#S¥4¨¬Ñ#8Ô#8Ð#8ÐQSÐ Ø#ð #Ø"�GØ—’¥¤× ;Ò ;Ð<LÑ MÔ MÑNÔNÐNÐNÝ˜G¥V¤^Ô%IÑJÔJð WØ—’¥¤× DÒ DÀWÄ^Ñ TÔ TÑUÔUÐUÐUÝ˜G¥V¤^Ô%JÑKÔKð WØ—’¥¤× EÒ EÀgÄnÑ UÔ UÑVÔVÐVùð ð Ð,ð µ´×1JÒ1JÑ1LÔ1Lð Øˆàð 2ð !ð 	=Ø�OŠO�FœN×7Ò7¸Ñ;Ô;Ñ<Ô<Ð<Ø�ŠÕ(Ñ*Ô*Ñ+Ô+Ð+Ø�ŠÕ)Ñ+Ô+Ñ,Ô,Ð,Ð,õ 	)¨Ñ1Ô1Ð1åŒ^Ô(¨(Ð3€FØˆ6Œ;�sÐ,˜TÐ,Ð,Ð, VÐ,Ð,Ð,rH   c                 óJ   — t          | ¦  «        t          d¦  «        k    od| v S )zETrue for a plain read mode with no create/write/append/update intent.Úrbtr   )r"   )Úmodes    r   Ú_is_readonly_moder  q  s"   € åˆt‰9Œ9�˜E™
œ
Ò"Ð2 s¨d {Ð2rH   c                 ó<  — t           j        dk    rd	 ddl}d}|                     | |d¦  «        }t          j        |                     dd¦  «        d         ¦  «        S # t          t          f$ r Y dS w xY w	 t          j        d| › �¦  «        S # t          $ r Y dS w xY w)	záThe kernel's real path for an open descriptor, or ``None`` if unavailable.

    This reflects the inode actually opened, so validating it is race-free: no
    path re-resolution (which an attacker could win) is involved.
    Údarwinr   Né2   s                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                   ó    r¬   z/proc/self/fd/)	r   ÚplatformÚfcntlr	   Úfsdecoder#   r   r*   Úreadlink)Úfdr  Ú	f_getpathÚbufs       r   Ú_fd_realpathr   v  sÃ   € õ „|�xÒÐð	ØˆLˆLˆLàˆIØ—+’+˜b )¨^Ñ<Ô<ˆCÝ”;˜sŸyšy¨°!Ñ4Ô4°QÔ7Ñ8Ô8Ð8øÝ�Ð$ð 	ð 	ð 	Ø�4�4ð	øøøðÝŒ{Ð0¨BÐ0Ð0Ñ1Ô1Ð1øÝð ð ð Øˆtˆtðøøøs$   ’A
A ÁA2Á1A2Á6B Â
BÂBc                 óD  — t          | ¦  «        }d|v rt          j        t          j        z  }n>d|v rt          j        t          j        z  }n d|v rt          j        t          j        z  }nd}d|v rt          j        }n |h d£z  rt          j        }nt          j        }||z  S )a  Translate a :func:`builtins.open` *mode* string into ``os.open()`` flags.

    Mirrors the read/write/create/append/truncate intent of *mode* so the
    hardened opener can add ``O_NOFOLLOW`` on top of exactly what the caller
    asked for. POSIX only.
    ÚxÚwÚar   ú+>   r$  r#  r"  )	r"   r	   ÚO_CREATÚO_EXCLÚO_TRUNCÚO_APPENDÚO_RDWRÚO_WRONLYÚO_RDONLY)r  ÚcharsÚcreatÚaccesss       r   Ú_os_open_flagsr0  ‹  sœ   € õ �‰IŒI€EØ
ˆe€|€|Ý”
�RœYÑ&ˆˆØ	�ˆˆÝ”
�RœZÑ'ˆˆØ	�ˆˆÝ”
�Rœ[Ñ(ˆˆàˆØ
ˆe€|€|Ý”ˆˆØ	���Ñ	 ð Ý”ˆˆå”ˆØ�E‰>ÐrH   c                 óÜ  — ddl }t          |¦  «        t          t          dd¦  «        z  t          t          dd¦  «        z  }	 t          j        | |d¦  «        }n<# t
          $ r/}|j         |j        |j        fv rt          d| ›d�¦  «        |‚‚ d}~ww xY w	 t          j	        |¦  «        }	|	j
        dk    rt          d	| ›d
|	j
        › d�¦  «        ‚t          |¦  «        }
t          |
�|
nt          j                             | ¦  «        ||¬¦  «         n## t          $ r t          j        |¦  «         ‚ w xY w	 t          j        ||fi |¤ŽS # t          $ r t          j        |¦  «         ‚ w xY w)a  Open ``raw_path`` for read *or* write, closing the symlink-swap TOCTOU and
    the hardlink escape that a path-only ``validate_path`` cannot.

    1. Open ``raw_path`` with ``O_NOFOLLOW`` so its final component is never
       followed as a symlink. Unlike opening a re-resolved path, this is atomic:
       the kernel either opens the real inode at that path or fails, so a symlink
       swapped in after the caller's ``validate_path`` cannot redirect the open
       (TOCTOU). On the write side this stops an attacker who plants/swaps
       ``<root>/pkg`` -> ``/etc/...`` between the check and a ``retrieve()`` /
       model write from redirecting the write outside the root -- the symmetric
       counterpart of the read-side content leak (CWE-59, GHSA-f794 class).
       Corpora/data files are never symlinks, so refusing a final-component
       symlink outright is fail-closed.
    2. ``fstat`` the descriptor and refuse ``st_nlink > 1``: a hardlink is another
       name for the same inode with no symlink to resolve, so an in-root hardlink
       to an outside inode would otherwise be read or written through.
    3. Re-validate the *opened descriptor's* real path (from the kernel, not by
       re-resolving the string) so a swapped intermediate directory symlink that
       redirected the open to an outside inode is still caught.

    A newly created file is given ``0600`` permissions so a write into a shared
    temp dir is not left group-/world-readable (CWE-377/378). POSIX only;
    callers fall back to :func:`builtins.open` elsewhere.
    r   NÚ
O_NOFOLLOWÚ	O_CLOEXECi€  zQSecurity Violation [pathsec.open]: refusing to follow a symlink at open time for z (TOCTOU guard, CWE-59)r¬   zASecurity Violation [pathsec.open]: refusing multiply-linked file z (st_nlink=z9); a hardlink can point at an outside-root inode (CWE-59)©r^   r_   )Úerrnor0  r   r	   r  r   ÚELOOPÚEMLINKrX   ÚfstatÚst_nlinkr   rh   r   ÚrealpathÚBaseExceptionÚcloseÚfdopen)Úraw_pathr  r^   r_   rì   r5  Úflagsr  rÔ   r   Úactuals              r   Ú_hardened_openrA  ¤  sè  € ð2 €L€L€Lõ 	�tÑÔÝ
•"�l AÑ
&Ô
&ñ	'å
•"�k 1Ñ
%Ô
%ñ	&ð 
ð
	åŒW�X˜u eÑ,Ô,ˆˆøÝð ð ð ØŒ7�u”{ E¤LÐ1Ð1Ð1Ý!ðHØ$,ðHð Hð Hñô ð ðð 	øøøøðøøøðÝŒX�b‰\Œ\ˆØŒ;˜Š?ˆ?Ý!ð.Øð.ð .Ø*,¬+ð.ð .ð .ñô ð õ ˜bÑ!Ô!ˆÝØÐ(ˆFˆF­b¬g×.>Ò.>¸xÑ.HÔ.HØØ'ð	
ñ 	
ô 	
ð 	
ð 	
øõ
 ð ð ð Ý
Œ�‰ŒˆØðøøøðÝŒy˜˜TÐ,Ð, VÐ,Ð,Ð,øÝð ð ð õ 	Œ�‰ŒˆØðøøøs1   ÁA Á
BÁ$*BÂBÂA<D Ä D4Ä8E Å E+r   zpathsec.openr4  c                óð  — t          | t          ¦  «        r&t          | ||¬¦  «         t          j        | fd|i|¤ŽS t          | ¦  «        t          t          fvr2t          t          | dd¦  «        t          t          f¦  «        r| j	        } 	 t          j        | ¦  «        }n# t          $ r t          d¦  «        d‚w xY wt          |¦  «        t          t          fvr%t          dt          |¦  «        j        › d�¦  «        ‚t          |¦  «        t          u rt          j        |¦  «        }t          |||¬¦  «         t          r t          j        dk    rt#          ||||fi |¤ŽS t          j        |fd|i|¤ŽS )	z!Secure wrapper for builtins.open.r4  r  r   Nú,Path must be a string, bytes, or os.PathLikeúFStrict security policy: Path must resolve to exact str or bytes, not 'ú'r   )rO   rP   rh   Úbuiltinsr  Útyper'   Úbytesr   r   r	   ÚfspathÚ	TypeErrorrÂ   r  rW   r   rA  )r>   r  r^   r_   rì   r>  s         r   r  r  ð  s   € õ �$�ÑÔð 8Ý�d G¸=ÐIÑIÔIÐIÝŒ}˜TÐ7Ð7¨Ð7°Ð7Ð7Ð7õ
 ˆD�z„z�#�u˜Ð%Ð%­*Ý��f˜dÑ#Ô#¥c­5 \ñ+ô +Ð%ð ŒyˆðRÝ”9˜T‘?”?ˆˆøÝð Rð Rð RÝÐFÑGÔGÈTÐQðRøøøõ ˆH�~„~�c¥5˜\Ð)Ð)ÝØoÕUYÐZbÑUcÔUcÔUlÐoÐoÐoñ
ô 
ð 	
õ ˆH�~„~�ÐÐÝ”;˜xÑ(Ô(ˆõ �( G¸=ÐIÑIÔIÐIõ ð P•2”7˜gÒ%Ð%õ ˜h¨¨g°}ÐOÐOÈÐOÐOÐOÝŒ=˜Ð7Ð7¨Ð7°Ð7Ð7Ð7s   ÂB! Â!B<c                   ó:   ‡ — e Zd ZdZˆ fd„Zdˆ fd„	Zdˆ fd„	Zˆ xZS )r�   z#Secure wrapper for zipfile.ZipFile.c                 óü  •— t          |t          t          t          j        f¦  «        r´	 t          j        |¦  «        }n# t          $ r t          d¦  «        d ‚w xY wt          |¦  «        t          t          fvr%t          dt          |¦  «        j        › d�¦  «        ‚t          |¦  «        t          u rt          j	        |¦  «        }t          |d¬¦  «         |}n|} t          ¦   «         j        |g|¢R i |¤Ž d S )NrC  rD  rE  zpathsec.ZipFiler­   )rO   r'   rH  r	   ÚPathLikerI  rJ  rG  rÂ   r  rh   r¹   Ú__init__)r»   r>   r
  rì   r>  Úfile_to_openrÁ   s         €r   rN  zZipFile.__init__#  s  ø€ õ �d�S¥%­¬Ð5Ñ6Ô6ð 	 ðÝœ9 T™?œ?��øÝð ð ð ÝØBñô àððøøøõ
 �H‰~Œ~¥c­5 \Ð1Ð1ÝØwÕ]aÐbjÑ]kÔ]kÔ]tÐwÐwÐwñô ð õ �H‰~Œ~¥Ð&Ð&Ýœ; xÑ0Ô0�å˜(Ð,=Ð>Ñ>Ô>Ð>Ø#ˆLˆLàˆLà�‰ŒÔ˜Ð7¨Ð7Ð7Ð7°Ð7Ð7Ð7Ð7Ð7s	   ª? ¿ANc                 ó”   •— t          | |pt          j        ¦   «         |¬¦  «         t          ¦   «                              |||¦  «        S )N)r}   )r…   r	   rV   r¹   Úextract)r»   Úmemberr   ÚpwdrÁ   s       €r   rQ  zZipFile.extract=  s=   ø€ Ý˜T 4Ð#6­2¬9©;¬;ÈÐOÑOÔOÐOÝ‰wŒw�Š˜v t¨SÑ1Ô1Ð1rH   c                 ó”   •— t          | |pt          j        ¦   «         ¦  «         t          ¦   «                              |||¦  «         d S rB   )r…   r	   rV   r¹   Ú
extractall)r»   r   r{   rS  rÁ   s       €r   rU  zZipFile.extractallA  s@   ø€ Ý˜T 4Ð#6­2¬9©;¬;Ñ7Ô7Ð7Ý‰Œ×Ò˜4 ¨#Ñ.Ô.Ð.Ð.Ð.rH   )NN)NNN)rÂ   rÃ   rÄ   rÅ   rN  rQ  rU  rÆ   rÇ   s   @r   r�   r�      sz   ø€ € € € € Ø-Ð-ð8ð 8ð 8ð 8ð 8ð42ð 2ð 2ð 2ð 2ð 2ð/ð /ð /ð /ð /ð /ð /ð /ð /ð /rH   r�   )rh   r´   r…   r  r  r�   rW   )r9   N)Nrt   )r¦   )r   )?rÅ   rF  Úhttp.clientr;   r’   r	   r‹   r
   r   r-   Úurllib.requestrû   rY   r€   Ú	functoolsr   Úpathlibr   Úurllib.parser   r   rW   rô   r    r!   r   r8   rh   rs   r…   r�   Ú
ip_networkr•   r–   r›   rŸ   r¥   r´   rü   ÚHTTPRedirectHandlerr¶   rÍ   rÕ   ÚclientÚHTTPConnectionr×   ÚHTTPSConnectionrÝ   ÚHTTPHandlerrã   ÚHTTPSHandlerrè   rõ   rø   r  r  r   r0  rA  Ú_hardened_read_openr  r�   Ú__all__rJ   rH   r   ú<module>rd     sÇ  ðð 2Ð 1à 1Ø €€€Ø Ð Ð Ð Ø Ð Ð Ð Ø 	€	€	€	Ø €€€Ø €€€Ø 
€
€
€
Ø €€€Ø Ð Ð Ð Ø €€€Ø €€€Ø Ð Ð Ð Ð Ð Ø Ð Ð Ð Ð Ð Ø *Ð *Ð *Ð *Ð *Ð *Ð *Ð *ð €ð Ð àÐ ØÐ ð"ð "ð "ðJ3ð 3ð 3ðlTð Tð Tð Tðn3ð 3ð 3ð0 AKð';ð ';ð ';ð ';ðT €�3ÐÑÔðð ñ Ôðð )�IÔ(¨Ñ8Ô8Ð Ø'�9Ô'¨Ñ0Ô0Ð ðð ð ð"	ð 	ð 	ð/ð /ð /ð86ð 6ð 6ð 6ðrMð Mð Mð Mð M ¤Ô!Cñ Mô Mð Mðð ð ð8!ð !ð !ðH
ð 
ð 
ð 
ð 
˜$œ+Ô4ñ 
ô 
ð 
ðOð Oð Oð Oð O˜4œ;Ô6ñ Oô Oð Oð6ð 6ð 6ð 6ð 6�v”~Ô1ñ 6ô 6ð 6ð
Að Að Að Að A˜œÔ3ñ Aô Að Að	ð 	ð 	ð5ð 5ð 5ð.:-ð :-ð :-ðz3ð 3ð 3ð
ð ð ð*ð ð ð2Dð Dð DðR %Ð ð-8 NÀ$ð -8ð -8ð -8ð -8ð -8ð`#/ð #/ð #/ð #/ð #/ˆgŒoñ #/ô #/ð #/ðLð ð €€€rH   