§
    (ê[f/,  ã                   óv  — d dl Z d dlZd dlmZ d dlmZ d dlmZ d dlm	Z	m
Z
 d dlmZ d dlmZ d dlmZ d d	lmZ d d
lmZmZmZmZ d dlmZ ddlmZ ddlmZ ddlm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$d%d„Z% e ¦   «          e!dd ej&        ¦   «         ¦  «         e!dd ej'         ej(         ej)        ¦   «         ¦  «         ej)        ¦   «         d¦  «        ¦  «         e!d d! ej'         ej(         ej*        ¦   «         ¦  «         ej*        ¦   «         d¦  «        ¦  «         e"d"¦  «         e"d#¦  «         e"d$¦  «         e#d"¦  «         e#d#¦  «         e#d$¦  «         e$d¦  «         e$d"¦  «         e$d#¦  «         e$d$¦  «        gZ+dS )&é    N)Úpadding)Úhashes)Údefault_backend)Úaes_key_wrapÚaes_key_unwrap)ÚCipher)ÚAES)ÚGCM)ÚConcatKDFHash)Úto_bytesÚ	to_nativeÚurlsafe_b64decodeÚurlsafe_b64encode)ÚJWEAlgorithmé   )ÚRSAKey)ÚECKey)ÚOctKeyc                   ó0   — e Zd ZdZdZd„ Zd„ Zdd„Zd„ ZdS )	ÚDirectAlgorithmÚdirz$Direct use of a shared symmetric keyc                 ó*   — t          j        |¦  «        S ©N©r   Ú
import_key©ÚselfÚraw_datas     úQ/var/www/piapp/venv/lib/python3.11/site-packages/authlib/jose/rfc7518/jwe_algs.pyÚprepare_keyzDirectAlgorithm.prepare_key   ó   € ÝÔ  Ñ*Ô*Ð*ó    c                 ó   — i S r   © )r   Úenc_algÚkeys      r   Úgenerate_presetzDirectAlgorithm.generate_preset    s   € Øˆ	r"   Nc                 óŠ   — |                      d¦  «        }t          |¦  «        dz  |j        k    rt          d¦  «        ‚d|dœS )NÚencrypté   úInvalid "cek" lengthr"   ©ÚekÚcek©Ú
get_op_keyÚlenÚCEK_SIZEÚ
ValueError©r   r%   Úheadersr&   Úpresetr.   s         r   ÚwrapzDirectAlgorithm.wrap#   sH   € Ø�nŠn˜YÑ'Ô'ˆÝˆs‰8Œ8�a‰<˜7Ô+Ò+Ð+ÝÐ3Ñ4Ô4Ð4Ø #Ð&Ð&Ð&r"   c                 ó„   — |                      d¦  «        }t          |¦  «        dz  |j        k    rt          d¦  «        ‚|S )NÚdecryptr*   r+   r/   )r   r%   r-   r5   r&   r.   s         r   ÚunwrapzDirectAlgorithm.unwrap)   s?   € Ø�nŠn˜YÑ'Ô'ˆÝˆs‰8Œ8�a‰<˜7Ô+Ò+Ð+ÝÐ3Ñ4Ô4Ð4Øˆ
r"   r   )	Ú__name__Ú
__module__Ú__qualname__ÚnameÚdescriptionr    r'   r7   r:   r$   r"   r   r   r      s_   € € € € € Ø€DØ8€Kð+ð +ð +ðð ð ð'ð 'ð 'ð 'ðð ð ð ð r"   r   c                   ó2   — e Zd ZdZd„ Zd„ Zd„ Zdd„Zd„ ZdS )	ÚRSAAlgorithmi   c                 ó0   — || _         || _        || _        d S r   )r>   r?   r   )r   r>   r?   Úpad_fns       r   Ú__init__zRSAAlgorithm.__init__5   s   € ØˆŒ	Ø&ˆÔØˆŒˆˆr"   c                 ó*   — t          j        |¦  «        S r   )r   r   r   s     r   r    zRSAAlgorithm.prepare_key:   r!   r"   c                 ó2   — |                      ¦   «         }d|iS ©Nr.   ©Úgenerate_cek©r   r%   r&   r.   s       r   r'   zRSAAlgorithm.generate_preset=   ó   € Ø×"Ò"Ñ$Ô$ˆØ�sˆ|Ðr"   Nc                 óð   — |rd|v r	|d         }n|                      ¦   «         }|                     d¦  «        }|j        | j        k     rt          d¦  «        ‚|                     || j        ¦  «        }||dœS )Nr.   ÚwrapKeyz.A key of size 2048 bits or larger MUST be usedr,   )rI   r0   Úkey_sizer3   r)   r   )r   r%   r5   r&   r6   r.   Úop_keyr-   s           r   r7   zRSAAlgorithm.wrapA   s€   € Øð 	)�e˜v�o�oØ˜”-ˆCˆCà×&Ò&Ñ(Ô(ˆCà—’ 	Ñ*Ô*ˆØŒ?˜Tœ]Ò*Ð*ÝÐMÑNÔNÐNØ�^Š^˜C ¤Ñ.Ô.ˆØ Ð%Ð%Ð%r"   c                 óº   — |                      d¦  «        }|                     || j        ¦  «        }t          |¦  «        dz  |j        k    rt          d¦  «        ‚|S ©NÚ	unwrapKeyr*   r+   )r0   r9   r   r1   r2   r3   ©r   r%   r-   r5   r&   rO   r.   s          r   r:   zRSAAlgorithm.unwrapM   sT   € à—’ Ñ,Ô,ˆØ�nŠn˜R ¤Ñ.Ô.ˆÝˆs‰8Œ8�a‰<˜7Ô+Ò+Ð+ÝÐ3Ñ4Ô4Ð4Øˆ
r"   r   )	r;   r<   r=   rN   rD   r    r'   r7   r:   r$   r"   r   rA   rA   0   sk   € € € € € ð €Hðð ð ð
+ð +ð +ðð ð ð
&ð 
&ð 
&ð 
&ðð ð ð ð r"   rA   c                   ó:   — e Zd Zd„ Zd„ Zd„ Zd„ Zd„ Zd	d„Zd„ Z	dS )
ÚAESAlgorithmc                 ó@   — d|› d�| _         d|› d�| _        || _        d S )NÚAÚKWzAES Key Wrap using ú-bit key©r>   r?   rN   ©r   rN   s     r   rD   zAESAlgorithm.__init__W   s2   € Ø$˜Ð$Ð$Ð$ˆŒ	ØC°ÐCÐCÐCˆÔØ ˆŒˆˆr"   c                 ó*   — t          j        |¦  «        S r   r   r   s     r   r    zAESAlgorithm.prepare_key\   r!   r"   c                 ó2   — |                      ¦   «         }d|iS rG   rH   rJ   s       r   r'   zAESAlgorithm.generate_preset_   rK   r"   c                 ól   — t          |¦  «        dz  | j        k    rt          d| j        › d�¦  «        ‚d S ©Nr*   zA key of size z bits is required.©r1   rN   r3   ©r   r&   s     r   Ú
_check_keyzAESAlgorithm._check_keyc   óF   € Ýˆs‰8Œ8�a‰<˜4œ=Ò(Ð(ÝØB ¤ÐBÐBÐBñDô Dð Dð )Ð(r"   c                 óš   — |                      d¦  «        }|                      |¦  «         t          ||t          ¦   «         ¦  «        }||dœS )NrM   r,   )r0   rb   r   r   )r   r.   r&   rO   r-   s        r   Úwrap_cekzAESAlgorithm.wrap_cekh   sJ   € Ø—’ 	Ñ*Ô*ˆØ�Š˜ÑÔÐÝ˜& #¥Ñ'8Ô'8Ñ9Ô9ˆØ Ð%Ð%Ð%r"   Nc                 ót   — |rd|v r	|d         }n|                      ¦   «         }|                      ||¦  «        S rG   )rI   re   r4   s         r   r7   zAESAlgorithm.wrapn   sB   € Øð 	)�e˜v�o�oØ˜”-ˆCˆCà×&Ò&Ñ(Ô(ˆCØ�}Š}˜S #Ñ&Ô&Ð&r"   c                 óè   — |                      d¦  «        }|                      |¦  «         t          ||t          ¦   «         ¦  «        }t	          |¦  «        dz  |j        k    rt          d¦  «        ‚|S rQ   )r0   rb   r   r   r1   r2   r3   rS   s          r   r:   zAESAlgorithm.unwrapu   sh   € Ø—’ Ñ,Ô,ˆØ�Š˜ÑÔÐÝ˜V R­Ñ):Ô):Ñ;Ô;ˆÝˆs‰8Œ8�a‰<˜7Ô+Ò+Ð+ÝÐ3Ñ4Ô4Ð4Øˆ
r"   r   )
r;   r<   r=   rD   r    r'   rb   re   r7   r:   r$   r"   r   rU   rU   V   s…   € € € € € ð!ð !ð !ð
+ð +ð +ðð ð ðDð Dð Dð
&ð &ð &ð'ð 'ð 'ð 'ðð ð ð ð r"   rU   c                   óN   — e Zd Z eddg¦  «        Zd„ Zd„ Zd„ Zd„ Zd
d„Z	d	„ Z
dS )ÚAESGCMAlgorithmÚivÚtagc                 ó@   — d|› d�| _         d|› d�| _        || _        d S )NrW   ÚGCMKWz Key wrapping with AES GCM using rY   rZ   r[   s     r   rD   zAESGCMAlgorithm.__init__�   s2   € Ø'˜Ð'Ð'Ð'ˆŒ	ØP¸hÐPÐPÐPˆÔØ ˆŒˆˆr"   c                 ó*   — t          j        |¦  «        S r   r   r   s     r   r    zAESGCMAlgorithm.prepare_key†   r!   r"   c                 ó2   — |                      ¦   «         }d|iS rG   rH   rJ   s       r   r'   zAESGCMAlgorithm.generate_preset‰   rK   r"   c                 ól   — t          |¦  «        dz  | j        k    rt          d| j        › d�¦  «        ‚d S r_   r`   ra   s     r   rb   zAESGCMAlgorithm._check_key�   rc   r"   Nc                 óB  — |rd|v r	|d         }n|                      ¦   «         }|                     d¦  «        }|                      |¦  «         d}t          j        |dz  ¦  «        }t          t          |¦  «        t          |¦  «        t          ¦   «         ¬¦  «        }	|	 	                    ¦   «         }
|
 
                    |¦  «        |
                     ¦   «         z   }t          t          |¦  «        ¦  «        t          t          |
j        ¦  «        ¦  «        dœ}|||dœS )Nr.   rM   é`   r*   ©Úbackend)rj   rk   ©r-   r.   Úheader)rI   r0   rb   ÚosÚurandomr   r	   r
   r   Ú	encryptorÚupdateÚfinalizer   r   rk   )r   r%   r5   r&   r6   r.   rO   Úiv_sizerj   ÚcipherÚencr-   Úhs                r   r7   zAESGCMAlgorithm.wrap’   s  € Øð 	)�e˜v�o�oØ˜”-ˆCˆCà×&Ò&Ñ(Ô(ˆCà—’ 	Ñ*Ô*ˆØ�Š˜ÑÔÐð
 ˆÝŒZ˜ 1™Ñ%Ô%ˆå�˜F™œ¥S¨¡W¤WµoÑ6GÔ6GÐHÑHÔHˆØ×ÒÑ Ô ˆØ�ZŠZ˜‰_Œ_˜sŸ|š|™~œ~Ñ-ˆõ Õ-¨bÑ1Ô1Ñ2Ô2ÝÕ.¨s¬wÑ7Ô7Ñ8Ô8ð
ð 
ˆð  °Ð2Ð2Ð2r"   c                 ó¤  — |                      d¦  «        }|                      |¦  «         |                     d¦  «        }|st          d¦  «        ‚|                     d¦  «        }|st          d¦  «        ‚t	          t          |¦  «        ¦  «        }t	          t          |¦  «        ¦  «        }t          t          |¦  «        t          ||¦  «        t          ¦   «         ¬¦  «        }| 
                    ¦   «         }	|	                     |¦  «        |	                     ¦   «         z   }
t          |
¦  «        dz  |j        k    rt          d¦  «        ‚|
S )	NrR   rj   zMissing "iv" in headersrk   zMissing "tag" in headersrs   r*   r+   )r0   rb   Úgetr3   r   r   r   r	   r
   r   Ú	decryptorrz   r{   r1   r2   )r   r%   r-   r5   r&   rO   rj   rk   r}   Údr.   s              r   r:   zAESGCMAlgorithm.unwrap«   s  € Ø—’ Ñ,Ô,ˆØ�Š˜ÑÔÐà�[Š[˜ÑÔˆØð 	8ÝÐ6Ñ7Ô7Ð7à�kŠk˜%Ñ Ô ˆØð 	9ÝÐ7Ñ8Ô8Ð8å�x¨™|œ|Ñ,Ô,ˆÝ¥¨¡¤Ñ.Ô.ˆå�˜F™œ¥S¨¨S¡\¤\½?Ñ;LÔ;LÐMÑMÔMˆØ×ÒÑÔˆØ�hŠh�r‰lŒl˜QŸZšZ™\œ\Ñ)ˆÝˆs‰8Œ8�a‰<˜7Ô+Ò+Ð+ÝÐ3Ñ4Ô4Ð4Øˆ
r"   r   )r;   r<   r=   Ú	frozensetÚEXTRA_HEADERSrD   r    r'   rb   r7   r:   r$   r"   r   ri   ri   ~   s‰   € € € € € Ø�I˜t U˜mÑ,Ô,€Mð!ð !ð !ð
+ð +ð +ðð ð ðDð Dð Dð
3ð 3ð 3ð 3ð2ð ð ð ð r"   ri   c                   óZ   — e Zd Zg d¢ZeZdd„Zd„ Zd„ Zd„ Z	d„ Z
d„ Zd	„ Zd
„ Zdd„Zd„ ZdS )ÚECDHESAlgorithm)ÚepkÚapuÚapvNc                 ó¨   — |€d| _         d| _        n%d|› d�| _         d                     |¦  «        | _        || _        t	          |¦  «        | _        d S )NzECDH-ESz(ECDH-ES in the Direct Key Agreement modez	ECDH-ES+ArX   z3ECDH-ES using Concat KDF and CEK wrapped with A{}KW)r>   r?   ÚformatrN   rU   Úaeskwr[   s     r   rD   zECDHESAlgorithm.__init__Ç   sb   € ØÐØ!ˆDŒIØIˆDÔÐà0 HÐ0Ð0Ð0ˆDŒIðß$šf XÑ.Ô.ð Ôð !ˆŒÝ! (Ñ+Ô+ˆŒ
ˆ
ˆ
r"   c                 óX   — t          || j        ¦  «        r|S t          j        |¦  «        S r   )Ú
isinstanceÚALLOWED_KEY_CLSr   r   r   s     r   r    zECDHESAlgorithm.prepare_keyÓ   s-   € Ý�h Ô 4Ñ5Ô5ð 	ØˆOÝÔ Ñ)Ô)Ð)r"   c                 ó¤   — |                       |¦  «        }|                      |¦  «        }||dœ}| j        �|                     ¦   «         }||d<   |S )N)rˆ   rv   r.   )Ú_generate_ephemeral_keyÚ_prepare_headersrN   rI   )r   r%   r&   rˆ   r   r6   r.   s          r   r'   zECDHESAlgorithm.generate_presetØ   s\   € Ø×*Ò*¨3Ñ/Ô/ˆØ×!Ò! #Ñ&Ô&ˆØ¨Ð*Ð*ˆØŒ=Ð$Ø×&Ò&Ñ(Ô(ˆCØˆF�5‰MØˆr"   c                 ó2  — | j         €t          |d         ¦  «        }nt          |d         ¦  «        }t          |                     d¦  «        d¦  «        }t          |                     d¦  «        d¦  «        }t          j        d|¦  «        }||z   |z   |z   S )Nr~   Úalgr‰   TrŠ   ú>I)rN   Úu32be_len_inputr�   ÚstructÚpack)r   r5   Úbit_sizeÚalg_idÚapu_infoÚapv_infoÚpub_infos          r   Úcompute_fixed_infoz"ECDHESAlgorithm.compute_fixed_infoá   s�   € àŒ=Ð Ý$ W¨U¤^Ñ4Ô4ˆFˆFå$ W¨U¤^Ñ4Ô4ˆFõ # 7§;¢;¨uÑ#5Ô#5°tÑ<Ô<ˆõ # 7§;¢;¨uÑ#5Ô#5°tÑ<Ô<ˆõ ”;˜t XÑ.Ô.ˆà˜Ñ  8Ñ+¨hÑ6Ð6r"   c                 ó’   — t          t          j        ¦   «         |dz  |t          ¦   «         ¬¦  «        }|                     |¦  «        S )Nr*   )Ú	algorithmÚlengthÚ	otherinfort   )r   r   ÚSHA256r   Úderive)r   Ú
shared_keyÚ
fixed_inforš   Úckdfs        r   Úcompute_derived_keyz#ECDHESAlgorithm.compute_derived_keyó   sF   € ÝÝ”m‘o”oØ˜q‘=Ø Ý#Ñ%Ô%ð	
ñ 
ô 
ˆð �{Š{˜:Ñ&Ô&Ð&r"   c                 ó†   — |                      |¦  «        }|                      ||¦  «        }|                      |||¦  «        S r   )Úexchange_shared_keyrŸ   r©   )r   r&   Úpubkeyr5   rš   r¦   r§   s          r   ÚdeliverzECDHESAlgorithm.deliverü   sB   € Ø×,Ò,¨VÑ4Ô4ˆ
Ø×,Ò,¨W°hÑ?Ô?ˆ
Ø×'Ò'¨
°JÀÑIÔIÐIr"   c                 ó<   — |                      |d         d¬¦  «        S )NÚcrvT)Ú
is_private)Úgenerate_keyra   s     r   r’   z'ECDHESAlgorithm._generate_ephemeral_key  s   € Ø×Ò  E¤
°tÐÑ<Ô<Ð<r"   c                 óF   ‡— ˆfd„‰j         D ¦   «         }‰j        |d<   d|iS )Nc                 ó"   •— i | ]}|‰|         “ŒS r$   r$   )Ú.0Úkrˆ   s     €r   ú
<dictcomp>z4ECDHESAlgorithm._prepare_headers.<locals>.<dictcomp>  s   ø€ Ð?Ð?Ð? �1�c˜!”fÐ?Ð?Ð?r"   Úktyrˆ   )ÚREQUIRED_JSON_FIELDSr·   )r   rˆ   Úpub_epks    ` r   r“   z ECDHESAlgorithm._prepare_headers  s5   ø€ à?Ð?Ð?Ð? cÔ&>Ð?Ñ?Ô?ˆØœˆ�‰Ø�wÐÐr"   c                 óº  — | j         €|j        }n| j         }|rd|v r|d         }i }n*|                      |¦  «        }|                      |¦  «        }|                     d¦  «        }|                      ||||¦  «        }	| j         €d|	|dœS |rd|v rd|d         i}
nd }
| j                             |	¦  «        }| j                             ||||
¦  «        }||d<   |S )Nrˆ   rM   r"   ru   r.   rv   )	rN   r2   r’   r“   r0   r­   r�   r    r7   )r   r%   r5   r&   r6   rš   rˆ   r   Ú
public_keyÚdkÚpreset_for_kwÚkekÚrvs                r   r7   zECDHESAlgorithm.wrap
  s  € ØŒ=Ð ØÔ'ˆHˆHà”}ˆHàð 	+�e˜v�o�oØ˜”-ˆCØˆAˆAà×.Ò.¨sÑ3Ô3ˆCØ×%Ò% cÑ*Ô*ˆAà—^’^ IÑ.Ô.ˆ
Ø�\Š\˜#˜z¨7°HÑ=Ô=ˆàŒ=Ð Ø b°AÐ6Ð6Ð6àð 	!�e˜v�o�oØ" F¨5¤MÐ2ˆMˆMà ˆMàŒj×$Ò$ RÑ(Ô(ˆØŒZ�_Š_˜W g¨s°MÑBÔBˆØˆˆ8‰Øˆ	r"   c                 ód  — d|vrt          d¦  «        ‚| j        €|j        }n| j        }|                     |d         ¦  «        }|                     d¦  «        }|                      ||||¦  «        }| j        €|S | j                             |¦  «        }	| j                             ||||	¦  «        S )Nrˆ   zMissing "epk" in headersrM   )	r3   rN   r2   r   r0   r­   r�   r    r:   )
r   r%   r-   r5   r&   rš   rˆ   r»   r¼   r¾   s
             r   r:   zECDHESAlgorithm.unwrap'  s°   € Ø˜ÐÐÝÐ7Ñ8Ô8Ð8àŒ=Ð ØÔ'ˆHˆHà”}ˆHà�nŠn˜W Uœ^Ñ,Ô,ˆØ—^’^ IÑ.Ô.ˆ
Ø�\Š\˜#˜z¨7°HÑ=Ô=ˆàŒ=Ð ØˆIàŒj×$Ò$ RÑ(Ô(ˆØŒz× Ò  ¨"¨g°sÑ;Ô;Ð;r"   r   )r;   r<   r=   r…   r   r�   rD   r    r'   rŸ   r©   r­   r’   r“   r7   r:   r$   r"   r   r‡   r‡   Â   sÇ   € € € € € Ø)Ð)Ð)€MØ€Oð
,ð 
,ð 
,ð 
,ð*ð *ð *ð
ð ð ð7ð 7ð 7ð$'ð 'ð 'ðJð Jð Jð
=ð =ð =ð ð  ð  ðð ð ð ð:<ð <ð <ð <ð <r"   r‡   Fc                 ó°   — | sdS |rt          t          | ¦  «        ¦  «        } nt          | ¦  «        } t          j        dt	          | ¦  «        ¦  «        | z   S )Ns       r–   )r   r   r˜   r™   r1   )ÚsÚbase64s     r   r—   r—   ;  sU   € Øð #Ø"Ð"Øð Ý�h q™kœkÑ*Ô*ˆˆå�Q‰KŒKˆÝŒ;�t�S ™VœVÑ$Ô$ qÑ(Ð(r"   ÚRSA1_5zRSAES-PKCS1-v1_5zRSA-OAEPz#RSAES OAEP using default parameterszRSA-OAEP-256z.RSAES OAEP using SHA-256 and MGF1 with SHA-256é€   éÀ   é   )F),rw   r˜   Ú)cryptography.hazmat.primitives.asymmetricr   Úcryptography.hazmat.primitivesr   Úcryptography.hazmat.backendsr   Ú&cryptography.hazmat.primitives.keywrapr   r   Ú&cryptography.hazmat.primitives.ciphersr   Ú1cryptography.hazmat.primitives.ciphers.algorithmsr	   Ú,cryptography.hazmat.primitives.ciphers.modesr
   Ú,cryptography.hazmat.primitives.kdf.concatkdfr   Úauthlib.common.encodingr   r   r   r   Úauthlib.jose.rfc7516r   Úrsa_keyr   Úec_keyr   Úoct_keyr   r   rA   rU   ri   r‡   r—   ÚPKCS1v15ÚOAEPÚMGF1ÚSHA1r¤   ÚJWE_ALG_ALGORITHMSr$   r"   r   ú<module>rÚ      sŠ  ðØ 	€	€	€	Ø €€€Ø =Ð =Ð =Ð =Ð =Ð =Ø 1Ð 1Ð 1Ð 1Ð 1Ð 1Ø 8Ð 8Ð 8Ð 8Ð 8Ð 8ðð ð ð ð ð ð ð ð :Ð 9Ð 9Ð 9Ð 9Ð 9Ø AÐ AÐ AÐ AÐ AÐ AØ <Ð <Ð <Ð <Ð <Ð <Ø FÐ FÐ FÐ FÐ FÐ Fðð ð ð ð ð ð ð ð ð ð ð ð
 .Ð -Ð -Ð -Ð -Ð -Ø Ð Ð Ð Ð Ð Ø Ð Ð Ð Ð Ð Ø Ð Ð Ð Ð Ð ðð ð ð ð �lñ ô ð ð.#ð #ð #ð #ð #�<ñ #ô #ð #ðL%ð %ð %ð %ð %�<ñ %ô %ð %ðPAð Að Að Að A�lñ Aô Að AðHv<ð v<ð v<ð v<ð v<�lñ v<ô v<ð v<ðr)ð )ð )ð )ð €OÑÔØ€L�Ð-Ð/?¨wÔ/?Ñ/AÔ/AÑBÔBØ€LØÐ9ØˆŒ�\�W”\ + &¤+¡-¤-Ñ0Ô0°+°&´+±-´-ÀÑFÔFñHô Hð €LØÐHØˆŒ�\�W”\ - &¤-¡/¤/Ñ2Ô2°M°F´M±O´OÀTÑJÔJñLô Lð €L�ÑÔØ€L�ÑÔØ€L�ÑÔØ€O�CÑÔØ€O�CÑÔØ€O�CÑÔØ€O�DÑÔØ€O�CÑÔØ€O�CÑÔØ€O�CÑÔð'Ð Ð Ð r"   