Ë
    àU.j_W  ã                   ó8  — d Z ddlZddlZ ej                  e«      ZddlmZ ddlm	Z	m
Z
mZ ddlmZmZ ddlmZmZmZmZmZ ddlmZ ddlmc mZ g d¢Zd	Zd
„ Zd„ Zd„ Zd„ Z  G d„ dejB                  ejD                  ejF                  ejH                  «      Z% G d„ dejD                  ejL                  ejF                  ejH                  «      Z' G d„ dejF                  ejH                  «      Z( G d„ dejB                  ejF                  ejH                  «      Z)y)zFpasslib.handlers.des_crypt - traditional unix (DES) crypt and variantsé    N)Úwarn)Ú
safe_cryptÚ
test_cryptÚ
to_unicode)Úh64Úh64big)Úbyte_elem_valueÚuÚuascii_to_strÚunicodeÚsuppress_cause)Údes_encrypt_int_block)Ú	des_cryptÚ
bsdi_cryptÚbigcryptÚcrypt16ó    c                 ó>   — t        d„ t        | dd «      D «       «      S )zØconvert secret to 64-bit DES key.

    this only uses the first 8 bytes of the secret,
    and discards the high 8th bit of each byte at that.
    a null parity bit is inserted after every 7th bit of the output.
    c              3   óP   K  — | ]  \  }}t        |«      d z  d|dz  z
  z  –— Œ  y­w)é   é9   é   N)r	   )Ú.0ÚiÚcs      ú\C:\xampp\htdocs\tradingbinance\backend\.venv\Lib\site-packages\passlib/handlers/des_crypt.pyÚ	<genexpr>z'_crypt_secret_to_key.<locals>.<genexpr>(   s3   è ø€ ð 2Ù0‘4�1�aô   Ó" TÑ)¨r°!°A±#©vÕ6Ù0ùs   ‚$&Nr   )ÚsumÚ	enumerate)Úsecrets    r   Ú_crypt_secret_to_keyr!      s)   € ô ñ 2Ü$ V¨B¨Q ZÔ0ó2ó 2ð 2ó    c                 ód  — t        |«      dk(  sJ ‚t        j                  |«      }t        | t        «      r| j                  d«      } t        | t        «      sJ ‚t        | v r#t        j                  j                  t        «      ‚t        | «      }t        |d|d«      }t        j                  |«      S )z pure-python backed for des_crypté   úutf-8r   é   )Úlenr   Údecode_int12Ú
isinstancer   ÚencodeÚbytesÚ_BNULLÚuhÚexcÚNullPasswordErrorr   r!   r   r   Úencode_int64)r    ÚsaltÚ
salt_valueÚ	key_valueÚresults        r   Ú_raw_des_cryptr5   +   sž   € äˆt‹9˜Š>Ðˆ>ô ×!Ñ! $Ó'€Jô �&œ'Ô"Ø—‘˜wÓ'ˆÜ�fœeÔ$Ð$Ð$ô �ÑÜ�f‰f×&Ñ&¤yÓ1Ð1ô % VÓ,€Iô # 9¨a°¸RÓ@€Fô ×Ñ˜vÓ&Ð&r"   c                 ó”   — t        | «      }d}t        | «      }||k  r*|dz   }t        | || «      }t        ||«      |z  }|}||k  rŒ*|S )z,convert secret to DES key used by bsdi_cryptr   )r!   r'   r   )r    r3   ÚidxÚendÚnextÚ	tmp_values         r   Ú_bsdi_secret_to_keyr;   I   sb   € ä$ VÓ,€IØ
€CÜ
ˆf‹+€CØ
�Š)Ø�Q‰wˆÜ(¨°°DÐ)9Ó:ˆ	Ü)¨)°YÓ?À)ÑKˆ	Øˆð	 �‹)ð
 Ðr"   c                 óD  — t        j                  |«      }t        | t        «      r| j	                  d«      } t        | t
        «      sJ ‚t        | v r#t        j                  j                  t        «      ‚t        | «      }t        |d||«      }t        j                  |«      S )z"pure-python backend for bsdi_cryptr%   r   )r   Údecode_int24r)   r   r*   r+   r,   r-   r.   r/   r   r;   r   r   r0   )r    Úroundsr1   r2   r3   r4   s         r   Ú_raw_bsdi_cryptr?   U   sŽ   € ô ×!Ñ! $Ó'€Jô �&œ'Ô"Ø—‘˜wÓ'ˆÜ�fœeÔ$Ð$Ð$ô �ÑÜ�f‰f×&Ñ&¤zÓ2Ð2ô $ FÓ+€Iô # 9¨a°¸VÓD€Fô ×Ñ˜vÓ&Ð&r"   c                   ó  — e Zd ZdZd ZdZej                  ZdZ	dxZ
Zej                  ZdZ ej                   ed«      ej"                  ej$                  z  «      Zed„ «       Zd„ Zd	„ Zd
Zed„ «       Zd„ Zed„ «       Zd„ Zy)r   a›  This class implements the des-crypt password hash, and follows the :ref:`password-hash-api`.

    It supports a fixed-length salt.

    The :meth:`~passlib.ifc.PasswordHash.using` method accepts the following optional keywords:

    :type salt: str
    :param salt:
        Optional salt string.
        If not specified, one will be autogenerated (this is recommended).
        If specified, it must be 2 characters, drawn from the regexp range ``[./0-9A-Za-z]``.

    :param bool truncate_error:
        By default, des_crypt will silently truncate passwords larger than 8 bytes.
        Setting ``truncate_error=True`` will cause :meth:`~passlib.ifc.PasswordHash.hash`
        to raise a :exc:`~passlib.exc.PasswordTruncateError` instead.

        .. versionadded:: 1.7

    :type relaxed: bool
    :param relaxed:
        By default, providing an invalid value for one of the other
        keywords will result in a :exc:`ValueError`. If ``relaxed=True``,
        and the error can be corrected, a :exc:`~passlib.exc.PasslibHashWarning`
        will be issued instead. Correctable errors include
        ``salt`` strings that are too long.

        .. versionadded:: 1.6
    ©r1   Útruncate_erroré   r$   r   zU
        ^
        (?P<salt>[./a-z0-9]{2})
        (?P<chk>[./a-z0-9]{11})?
        $c                 óL   — t        |dd«      }|d d |dd  }} | ||xs d ¬«      S )NÚasciiÚhashr$   ©r1   Úchecksum)r   )ÚclsrF   r1   Úchks       r   Úfrom_stringzdes_crypt.from_string´   s6   € ä˜$ ¨Ó0ˆØ˜˜!�H˜d 1 2˜hˆcˆÙ˜ s¢{¨dÔ3Ð3r"   c                 ó`   — t        d«      | j                  | j                  fz  }t        |«      S ©Nz%s%s©r
   r1   rH   r   ©ÚselfrF   s     r   Ú	to_stringzdes_crypt.to_stringº   ó(   € Ü�‹y˜DŸI™I t§}¡}Ð5Ñ5ˆÜ˜TÓ"Ð"r"   c                 ó^   — | j                   r| j                  |«       | j                  |«      S )N)Úuse_defaultsÚ_check_truncate_policyÚ_calc_checksum_backend©rP   r    s     r   Ú_calc_checksumzdes_crypt._calc_checksumÁ   s*   € à×ÒØ×'Ñ'¨Ô/à×*Ñ*¨6Ó2Ð2r"   ©Úos_cryptÚbuiltinc                 óT   — t        dd«      r| j                  | j                  «       yy)NÚtestÚabgOeLfPimXQoTF©r   Ú_set_calc_checksum_backendÚ_calc_checksum_os_crypt©rI   s    r   Ú_load_backend_os_cryptz des_crypt._load_backend_os_cryptÐ   s&   € ä�f˜oÔ.Ø×*Ñ*¨3×+FÑ+FÔGØàr"   c                 ó  — t        || j                  «      }|€| j                  |«      S |j                  | j                  «      rt	        |«      dk7  r+t
        j                  j                  | | j                  |«      ‚|dd  S )Né   r$   )r   r1   Ú_calc_checksum_builtinÚ
startswithr'   r-   r.   ÚCryptBackendError)rP   r    rF   s      r   ra   z!des_crypt._calc_checksum_os_cryptØ   sn   € ô ˜& $§)¡)Ó,ˆØˆ<ð ×.Ñ.¨vÓ6Ð6Ø�‰˜tŸy™yÔ)¬S°«Y¸"ª_Ü—&‘&×*Ñ*¨4°·±¸DÓAÐAØ�A�Bˆxˆr"   c                 ó:   — | j                  | j                  «       y©NT©r`   rf   rb   s    r   Ú_load_backend_builtinzdes_crypt._load_backend_builtinç   ó   € à×&Ñ& s×'AÑ'AÔBØr"   c                 ój   — t        || j                  j                  d«      «      j                  d«      S ©NrE   )r5   r1   r*   ÚdecoderW   s     r   rf   z des_crypt._calc_checksum_builtinì   s)   € Ü˜f d§i¡i×&6Ñ&6°wÓ&?Ó@×GÑGÈÓPÐPr"   N)Ú__name__Ú
__module__Ú__qualname__Ú__doc__ÚnameÚsetting_kwdsr-   ÚHASH64_CHARSÚchecksum_charsÚchecksum_sizeÚmin_salt_sizeÚmax_salt_sizeÚ
salt_charsÚtruncate_sizeÚreÚcompiler
   ÚXÚIÚ_hash_regexÚclassmethodrK   rQ   rX   Úbackendsrc   ra   rl   rf   © r"   r   r   r   p   sÇ   „ ñðH €DØ-€Lð
 —_‘_€NØ€Mð
 %&Ð%€M�MØ—‘€Jð
 €Mð �"—*‘*™Qð  ó ð �t‰t�B—D‘D‰yó	€Kð ñ4ó ð4ò
#ò3ð '€Hð
 ñó ðò
ð ñó ðóQr"   r   c                   óH  ‡ — e Zd ZdZd ZdZdZej                  Z	dxZ
Zej                  ZdZdZdZdZ ej$                   ed	«      ej(                  ej*                  z  «      Zed
„ «       Zd„ ZdZeˆ fd„«       Zeˆ fd„«       Zˆ fd„ZdZed„ «       Zd„ Z ed„ «       Z!d„ Z"ˆ xZ#S )r   a
  This class implements the BSDi-Crypt password hash, and follows the :ref:`password-hash-api`.

    It supports a fixed-length salt, and a variable number of rounds.

    The :meth:`~passlib.ifc.PasswordHash.using` method accepts the following optional keywords:

    :type salt: str
    :param salt:
        Optional salt string.
        If not specified, one will be autogenerated (this is recommended).
        If specified, it must be 4 characters, drawn from the regexp range ``[./0-9A-Za-z]``.

    :type rounds: int
    :param rounds:
        Optional number of rounds to use.
        Defaults to 5001, must be between 1 and 16777215, inclusive.

    :type relaxed: bool
    :param relaxed:
        By default, providing an invalid value for one of the other
        keywords will result in a :exc:`ValueError`. If ``relaxed=True``,
        and the error can be corrected, a :exc:`~passlib.exc.PasslibHashWarning`
        will be issued instead. Correctable errors include ``rounds``
        that are too small or too large, and ``salt`` strings that are too long.

        .. versionadded:: 1.6

    .. versionchanged:: 1.6
        :meth:`hash` will now issue a warning if an even number of rounds is used
        (see :ref:`bsdi-crypt-security-issues` regarding weak DES keys).
    )r1   r>   rC   é   i‰  é   iÿÿÿ Úlinearz�
        ^
        _
        (?P<rounds>[./a-z0-9]{4})
        (?P<salt>[./a-z0-9]{4})
        (?P<chk>[./a-z0-9]{11})?
        $c                 ó  — t        |dd«      }| j                  j                  |«      }|st        j                  j                  | «      ‚|j                  ddd«      \  }}} | t        j                  |j                  d«      «      ||¬«      S )NrE   rF   r>   r1   rJ   )r>   r1   rH   )
r   r‚   Úmatchr-   r.   ÚInvalidHashErrorÚgroupr   r=   r*   )rI   rF   Úmr>   r1   rJ   s         r   rK   zbsdi_crypt.from_string4  s   € ä˜$ ¨Ó0ˆØ�O‰O×!Ñ! $Ó'ˆÙÜ—&‘&×)Ñ)¨#Ó.Ð.ØŸG™G H¨f°eÓ<Ñˆ��cÙÜ×#Ñ# F§M¡M°'Ó$:Ó;ØØô
ð 	
r"   c                 óº   — t        d«      t        j                  | j                  «      j	                  d«      | j
                  | j                  fz  }t        |«      S )Nz_%s%s%srE   )r
   r   Úencode_int24r>   rp   r1   rH   r   rO   s     r   rQ   zbsdi_crypt.to_stringA  sI   € Ü�‹|œs×/Ñ/°·±Ó<×CÑCÀGÓLØ#Ÿy™y¨$¯-©-ð9ñ 9ˆä˜TÓ"Ð"r"   Tc                 ó”   •— t        t        | �
  di |¤Ž}|j                  dz  s$t	        dt
        j                  j                  «       |S )Nrˆ   zHbsdi_crypt rounds should be odd, as even rounds may reveal weak DES keysr…   )Úsuperr   ÚusingÚdefault_roundsr   r-   r.   ÚPasslibSecurityWarning)rI   ÚkwdsÚsubclsÚ	__class__s      €r   r“   zbsdi_crypt.usingN  sB   ø€ ä”z 3Ñ-Ñ5°Ñ5ˆØ×$Ñ$ qÒ(äÐ[Ü—‘×.Ñ.ô0àˆr"   c                 ó2   •— t         t        | �  «       }|dz  S )Nrˆ   )r’   r   Ú_generate_rounds)rI   r>   r˜   s     €r   rš   zbsdi_crypt._generate_roundsW  s   ø€ ä”z 3Ñ8Ó:ˆð �a‰xˆr"   c                 óJ   •— | j                   dz  syt        t        | �  di |¤ŽS )Nrˆ   Tr…   )r>   r’   r   Ú_calc_needs_update)rP   r–   r˜   s     €r   rœ   zbsdi_crypt._calc_needs_updatee  s&   ø€ à�{‰{˜QŠØä”Z Ñ9ÑA¸DÑAÐAr"   rY   c                 óT   — t        dd«      r| j                  | j                  «       yy)Nr]   z_/...lLDAxARksGCHin.TFr_   rb   s    r   rc   z!bsdi_crypt._load_backend_os_cryptt  s'   € ä�fÐ4Ô5Ø×*Ñ*¨3×+FÑ+FÔGØàr"   c                 óð   — | j                  «       }t        ||«      }|€| j                  |«      S |j                  |d d «      rt	        |«      dk7  r!t
        j                  j                  | ||«      ‚|dd  S )Né	   é   éõÿÿÿ)rQ   r   rf   rg   r'   r-   r.   rh   )rP   r    ÚconfigrF   s       r   ra   z"bsdi_crypt._calc_checksum_os_crypt|  ss   € Ø—‘Ó!ˆÜ˜& &Ó)ˆØˆ<ð ×.Ñ.¨vÓ6Ð6Ø�‰˜v b q˜zÔ*¬c°$«i¸2ªoÜ—&‘&×*Ñ*¨4°¸Ó>Ð>Ø�C�DˆzÐr"   c                 ó:   — | j                  | j                  «       yrj   rk   rb   s    r   rl   z bsdi_crypt._load_backend_builtinŠ  rm   r"   c                 ó€   — t        || j                  | j                  j                  d«      «      j	                  d«      S ro   )r?   r>   r1   r*   rp   rW   s     r   rf   z!bsdi_crypt._calc_checksum_builtin�  s0   € Ü˜v t§{¡{°D·I±I×4DÑ4DÀWÓ4MÓN×UÑUÐV]Ó^Ð^r"   )$rq   rr   rs   rt   ru   rv   ry   r-   rw   rx   rz   r{   r|   r”   Ú
min_roundsÚ
max_roundsÚrounds_costr~   r   r
   r€   r�   r‚   rƒ   rK   rQ   Ú_avoid_even_roundsr“   rš   rœ   r„   rc   ra   rl   rf   Ú__classcell__©r˜   s   @r   r   r   ó   s  ø„ ñðF €DØ%€LØ€MØ—_‘_€Nð %&Ð%€M�MØ—‘€Jð €NØ€JØ€JØ€Kð �"—*‘*™Qð  ó ð �t‰t�B—D‘D‰yó€Kð ñ

ó ð

ò#ð Ðàóó ðð óó ðôBð '€Hð
 ñó ðò	ð ñó ðö_r"   r   c                   óà   ‡ — e Zd ZdZd ZdZej                  ZdxZ	Z
ej                  Z ej                   ed«      ej                  ej                   z  «      Zed„ «       Zd„ Zd	ˆ fd„	Zd„ Zˆ xZS )
r   ag  This class implements the BigCrypt password hash, and follows the :ref:`password-hash-api`.

    It supports a fixed-length salt.

    The :meth:`~passlib.ifc.PasswordHash.using` method accepts the following optional keywords:

    :type salt: str
    :param salt:
        Optional salt string.
        If not specified, one will be autogenerated (this is recommended).
        If specified, it must be 22 characters, drawn from the regexp range ``[./0-9A-Za-z]``.

    :type relaxed: bool
    :param relaxed:
        By default, providing an invalid value for one of the other
        keywords will result in a :exc:`ValueError`. If ``relaxed=True``,
        and the error can be corrected, a :exc:`~passlib.exc.PasslibHashWarning`
        will be issued instead. Correctable errors include
        ``salt`` strings that are too long.

        .. versionadded:: 1.6
    )r1   r$   zX
        ^
        (?P<salt>[./a-z0-9]{2})
        (?P<chk>([./a-z0-9]{11})+)?
        $c                 óÒ   — t        |dd«      }| j                  j                  |«      }|st        j                  j                  | «      ‚|j                  dd«      \  }} | ||¬«      S ©NrE   rF   r1   rJ   rG   ©r   r‚   r‹   r-   r.   rŒ   r�   ©rI   rF   rŽ   r1   rJ   s        r   rK   zbigcrypt.from_stringÃ  ó]   € ä˜$ ¨Ó0ˆØ�O‰O×!Ñ! $Ó'ˆÙÜ—&‘&×)Ñ)¨#Ó.Ð.Ø—G‘G˜F EÓ*‰	ˆˆcÙ˜ sÔ+Ð+r"   c                 ó`   — t        d«      | j                  | j                  fz  }t        |«      S rM   rN   rO   s     r   rQ   zbigcrypt.to_stringÌ  rR   r"   c                 óŒ   •— t         t        | �  ||¬«      }t        |«      dz  rt        j
                  j                  | «      ‚|S )N)ÚrelaxedrC   )r’   r   Ú_norm_checksumr'   r-   r.   rŒ   )rP   rH   r³   r˜   s      €r   r´   zbigcrypt._norm_checksumÐ  s?   ø€ Üœ 4Ñ7¸È'Ð7ÓRˆÜˆx‹=˜2ÒÜ—&‘&×)Ñ)¨$Ó/Ð/Øˆr"   c                 ó  — t        |t        «      r|j                  d«      }t        || j                  j                  d«      «      }d}t        |«      }||k  r"|dz   }|t        ||| |dd «      z  }|}||k  rŒ"|j                  d«      S )Nr%   rE   r   r¡   i÷ÿÿÿ)r)   r   r*   r5   r1   r'   rp   )rP   r    rJ   r7   r8   r9   s         r   rX   zbigcrypt._calc_checksumÙ  s�   € Ü�fœgÔ&Ø—]‘] 7Ó+ˆFÜ˜V T§Y¡Y×%5Ñ%5°gÓ%>Ó?ˆØˆÜ�&‹kˆØ�CŠiØ˜‘7ˆDØ”> &¨¨TÐ"2°C¸¸B°KÓ@Ñ@ˆCØˆCð �C‹ið �z‰z˜'Ó"Ð"r"   )F)rq   rr   rs   rt   ru   rv   r-   rw   rx   rz   r{   r|   r~   r   r
   r€   r�   r‚   rƒ   rK   rQ   r´   rX   r©   rª   s   @r   r   r   –  s„   ø„ ñð4 €DØ€LØ—_‘_€Nð %&Ð%€M�MØ—‘€Jð
 �"—*‘*™Qð  ó ð �t‰t�B—D‘D‰yó	€Kð ñ,ó ð,ò#õö
#r"   r   c                   óÔ   — e Zd ZdZd ZdZdZej                  Z	dxZ
Zej                  ZdZ ej                   ed«      ej"                  ej$                  z  «      Zed„ «       Zd„ Zd	„ Zy
)r   a˜  This class implements the crypt16 password hash, and follows the :ref:`password-hash-api`.

    It supports a fixed-length salt.

    The :meth:`~passlib.ifc.PasswordHash.using` method accepts the following optional keywords:

    :type salt: str
    :param salt:
        Optional salt string.
        If not specified, one will be autogenerated (this is recommended).
        If specified, it must be 2 characters, drawn from the regexp range ``[./0-9A-Za-z]``.

    :param bool truncate_error:
        By default, crypt16 will silently truncate passwords larger than 16 bytes.
        Setting ``truncate_error=True`` will cause :meth:`~passlib.ifc.PasswordHash.hash`
        to raise a :exc:`~passlib.exc.PasswordTruncateError` instead.

        .. versionadded:: 1.7

    :type relaxed: bool
    :param relaxed:
        By default, providing an invalid value for one of the other
        keywords will result in a :exc:`ValueError`. If ``relaxed=True``,
        and the error can be corrected, a :exc:`~passlib.exc.PasslibHashWarning`
        will be issued instead. Correctable errors include
        ``salt`` strings that are too long.

        .. versionadded:: 1.6
    rA   é   r$   é   zU
        ^
        (?P<salt>[./a-z0-9]{2})
        (?P<chk>[./a-z0-9]{22})?
        $c                 óÒ   — t        |dd«      }| j                  j                  |«      }|st        j                  j                  | «      ‚|j                  dd«      \  }} | ||¬«      S r­   r®   r¯   s        r   rK   zcrypt16.from_string+  r°   r"   c                 ó`   — t        d«      | j                  | j                  fz  }t        |«      S rM   rN   rO   s     r   rQ   zcrypt16.to_string4  rR   r"   c                 ó   — t        |t        «      r|j                  d«      }| j                  r| j	                  |«       	 t        j                  | j                  j                  d«      «      }t        |«      }t        |d|d«      }t        |dd «      }t        |d|d«      }t        j                  |«      t        j                  |«      z   }|j                  d«      S # t        $ r t        t        d«      «      ‚w xY w)	Nr%   rE   zinvalid chars in saltr   r    r   r¸   é   )r)   r   r*   rT   rU   r   r(   r1   Ú
ValueErrorr   r!   r   r   r0   rp   )rP   r    r2   Úkey1Úresult1Úkey2Úresult2rJ   s           r   rX   zcrypt16._calc_checksum;  sï   € Ü�fœgÔ&Ø—]‘] 7Ó+ˆFð ×ÒØ×'Ñ'¨Ô/ð	FÜ×)Ñ)¨$¯)©)×*:Ñ*:¸7Ó*CÓDˆJô
 $ FÓ+ˆô (¨¨a°¸RÓ@ˆô $ F¨1¨R LÓ1ˆô (¨¨a°¸QÓ?ˆô ×!Ñ! 'Ó*¬V×-@Ñ-@ÀÓ-IÑIˆØ�z‰z˜'Ó"Ð"øô# ò 	FÜ ¤Ð,CÓ!DÓEÐEð	Fús   Á .C ÃC=N)rq   rr   rs   rt   ru   rv   ry   r-   rw   rx   rz   r{   r|   r}   r~   r   r
   r€   r�   r‚   rƒ   rK   rQ   rX   r…   r"   r   r   r   é  s�   „ ñðH €DØ-€Lð
 €MØ—_‘_€Nð
 %&Ð%€M�MØ—‘€Jð
 €Mð
 �"—*‘*™Qð  ó ð �t‰t�B—D‘D‰yó	€Kð ñ,ó ð,ò#ó#r"   r   )*rt   r~   ÚloggingÚ	getLoggerrq   ÚlogÚwarningsr   Úpasslib.utilsr   r   r   Úpasslib.utils.binaryr   r   Úpasslib.utils.compatr	   r
   r   r   r   Úpasslib.crypto.desr   Úpasslib.utils.handlersÚutilsÚhandlersr-   Ú__all__r,   r!   r5   r;   r?   ÚTruncateMixinÚHasManyBackendsÚHasSaltÚGenericHandlerr   Ú	HasRoundsr   r   r   r…   r"   r   Ú<module>rÓ      sö   ðÙ Ló
 
Û Ð'�g×'Ñ'¨Ó1�Ý ÷ =Ñ <ß ,ß [Õ [Ý 4ß #Ð #ò€ð 
€ò2ò'ò<
ò'ô6}Q�× Ñ  "×"4Ñ"4°b·j±jÀ"×BSÑBSô }QôF]_�×#Ñ# R§\¡\°2·:±:¸r×?PÑ?Pô ]_ôFM#ˆr�z‰z˜2×,Ñ,ô M#ôfn#ˆb×Ñ §
¡
¨B×,=Ñ,=õ n#r"   