§
    ŠŠtj#-  ã                   óP  — 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 d dl	m
Z
mZ d dlZd dlmZ d dlmZ  ej        e¦  «        Z G d„ de¦  «        Z ed	¬
¦  «         G d„ d¦  «        ¦   «         Z ed	¬
¦  «         G d„ d¦  «        ¦   «         Zdedee         defd„Ze j        deeee         f         defd„¦   «         Zdefd„Zdeeee         f         defd„Zdeeee         f         deddfd„Z dedeeee         f         fd„Z!dedeeee         f         fd„Z"dS )é    N)ÚCallableÚ	Generator)Ú	dataclass)ÚAnyÚOptional)Ú_maybe_get_opdef)ÚFileLikec                   ó   — e Zd ZdZdS )ÚMissingOpProfilezc
    This is raised when we don't have an operator profile available for the
    given inputs.
    N)Ú__name__Ú
__module__Ú__qualname__Ú__doc__© ó    úY/var/www/html/CA-Chatbot/venv/lib/python3.11/site-packages/torch/_library/fake_profile.pyr   r      s   € € € € € ðð ð ð r   r   T)Úfrozenc                   ó‚   — e Zd ZU eed<   ej        ed<   ej        ed<   ej        ed<   e	de
ded          fd„¦   «         ZdS )	ÚTensorMetadataÚrankÚdtypeÚdeviceÚlayoutÚtÚreturnc                 ó    — t          | t          j        ¦  «        sd S t          |                      ¦   «         | j        | j        | j        ¦  «        S ©N)Ú
isinstanceÚtorchÚTensorr   Údimr   r   r   )r   s    r   Úmaybe_from_tensorz TensorMetadata.maybe_from_tensor   s=   € å˜!�Uœ\Ñ*Ô*ð 	Ø�4Ý˜aŸeše™gœg q¤w°´¸!¼(ÑCÔCÐCr   N)r   r   r   ÚintÚ__annotations__r   r   r   r   Ústaticmethodr   r   r"   r   r   r   r   r      sƒ   € € € € € € à
€I€I�IØŒ;ÐÐÑØŒLÐÐÑØŒLÐÐÑàðD˜Sð D XÐ.>Ô%?ð Dð Dð Dñ „\ðDð Dð Dr   r   c                   óH   — e Zd ZU eedz           ed<   eee         z  ed<   dS )Ú	OpProfileNÚargs_profileÚout_profile)r   r   r   Útupler   r$   r   r   r   r'   r'   &   s>   € € € € € € à˜¨Ñ-Ô.Ð.Ð.Ñ.Ø %¨Ô"7Ñ7Ð7Ð7Ñ7Ð7Ð7r   r'   Úop_nameÚ
op_profiler   c                 óð   ‡ ‡‡‡— dt           t          d z           dt          dt          fd„Šdt          t           t                   z  dt          j        t          t          j                 z  fd„Šˆˆˆ ˆfd„}|S )Nr(   Úargsr   c                 óT   ‡ — t          ˆ fd„t          |¦  «        D ¦   «         ¦  «        S )Nc              3   óf   •K  — | ]+\  }}t                                |¦  «        ‰|         k    V — Œ,d S r   )r   r"   )Ú.0ÚiÚargr(   s      €r   ú	<genexpr>z=_generate_fake_kernel.<locals>._match_args.<locals>.<genexpr>.   sR   øè è € ð 
ð 
á��3õ ×,Ò,¨SÑ1Ô1°\À!´_ÒDð
ð 
ð 
ð 
ð 
ð 
r   )ÚallÚ	enumerate)r(   r.   s   ` r   Ú_match_argsz*_generate_fake_kernel.<locals>._match_args-   sA   ø€ Ýð 
ð 
ð 
ð 
å# D™/œ/ð
ñ 
ô 
ñ 
ô 
ð 	
r   r)   c                 óÐ   ‡‡— t           j                             ¦   «         Šdt          dt           j        fˆfd„Št          | t          ¦  «        r ‰| ¦  «        S ˆfd„| D ¦   «         S )Nr   r   c                 ó   •— ˆfd„t          | j        ¦  «        D ¦   «         }dg| j        z  }d}|}t          | j        ¦  «        D ]}|||<   |||         z  }Œt          j        ||| j        | j        | j        ¬¦  «        S )Nc                 ó8   •— g | ]}‰                      ¦   «         ‘ŒS r   )Únew_dynamic_size)r1   Ú_Úctxs     €r   ú
<listcomp>z^_generate_fake_kernel.<locals>._generate_res.<locals>._generate_tensor_out.<locals>.<listcomp>9   s%   ø€ ÐHÐHÐH°Q˜#×.Ò.Ñ0Ô0ÐHÐHÐHr   éÿÿÿÿé   )r   r   r   )Úranger   r   Úempty_stridedr   r   r   )r   Ú
fake_shapeÚfake_stridesÚexpectedÚfake_strider2   r=   s         €r   Ú_generate_tensor_outzJ_generate_fake_kernel.<locals>._generate_res.<locals>._generate_tensor_out8   sš   ø€ ØHÐHÐHÐH½%ÀÄ¹-¼-ÐHÑHÔHˆJØ˜4 !¤&™=ˆLØˆHØ"ˆKå˜1œ6‘]”]ð :ð :�Ø"-�˜Q‘Ø)¨J°q¬MÑ9��åÔ&ØØØ”xØ”gØ”xðñ ô ð r   c                 ó&   •— g | ]} ‰|¦  «        ‘ŒS r   r   )r1   r   rG   s     €r   r>   z@_generate_fake_kernel.<locals>._generate_res.<locals>.<listcomp>M   s%   ø€ ÐAÐAÐA°Ð(Ð(¨Ñ+Ô+ÐAÐAÐAr   )r   ÚlibraryÚget_ctxr   r    r   )r)   rG   r=   s    @@r   Ú_generate_resz,_generate_fake_kernel.<locals>._generate_res3   s‡   øø€ õ Œm×#Ò#Ñ%Ô%ˆð	¥Nð 	µu´|ð 	ð 	ð 	ð 	ð 	ð 	õ$ �k¥>Ñ2Ô2ð 	BØ'Ð'¨Ñ4Ô4Ð4àAÐAÐAÐA°[ÐAÑAÔAÐAr   c                  ó²   •— ‰D ]<} ‰|j         g | ¢|                     ¦   «         ¢R ¦  «        r ‰|j        ¦  «        c S Œ=t          d‰› d| |f› d�¦  «        ‚)NzNo fake kernel was found for zz, and although we have previously registered some profiles to generate a fake kernel, no profiles match the given inputs: ú.)r(   Úvaluesr)   r   )r.   ÚkwargsÚprofilerK   r7   r+   r,   s      €€€€r   Ú_fake_kernelz+_generate_fake_kernel.<locals>._fake_kernelO   sž   ø€ Ø!ð 	:ð 	:ˆGØˆ{˜7Ô/Ð1J°4Ð1J¸&¿-º-¹/¼/Ð1JÐ1JÑKÔKð :Ø$�} WÔ%8Ñ9Ô9Ð9Ð9Ð9ð:õ ðC¨Gð Cð Cà37¸°.ðCð Cð Cñ
ô 
ð 	
r   )r*   r   r   Úboolr   r    Úlist)r+   r,   rQ   rK   r7   s   `` @@r   Ú_generate_fake_kernelrT   ,   s«   øøøø€ ð
¥%­¸Ñ(=Ô">ð 
Åcð 
Ídð 
ð 
ð 
ð 
ðBÝ#¥e­NÔ&;Ñ;ðBå	Œ��Uœ\Ô*Ñ	*ðBð Bð Bð Bð8	
ð 	
ð 	
ð 	
ð 	
ð 	
ð 	
ð 	
ð Ðr   Úop_profilesc              #   óØ  K  — g }i }|                       ¦   «         D ]ì\  }}t                               d|¦  «         |                     d¦  «        }|d         |d         }}|› d|› �}t	          ||¦  «        }	t          |¦  «        x}
r'|
j        �
|
j        ||<   |
                     |	¦  «         Œ”t          j	         
                    |d¦  «        }t          j	                             ||	|d¬	¦  «         |                     |¦  «         Œí	 |V — |D ]}|                     ¦   «          Œ|                      ¦   «         D ]>\  }}t          |¦  «        }
|
€t          d
|› d�¦  «        ‚|
                     |¦  «         Œ?dS # |D ]}|                     ¦   «          Œ|                      ¦   «         D ]>\  }}t          |¦  «        }
|
€t          d
|› d�¦  «        ‚|
                     |¦  «         Œ?w xY w)aI  
    Registers a fake kernel based on the given operator profiles. This fake
    kernel registration will override any existing fake kernel registrations.

    The input is a dictionary mapping operator names to a set of operator
    profiles, which we will use to generate fake kernels. The operator profiles
    are a record of the input and output tensor metadata. Based on this
    information we will match a given input to the recorded profile, and return
    an output with the same metadata as in the recorded profile. If a profile
    doesn't exist then an exception will be thrown.

    The fake kernel generation is considered unsafe because it relies on the
    rigid, pre-defined operator profiles that do not account for potential
    variations in output behavior. Specifically, the generated kernels assume a
    fixed relationship between input and output ranks. However, in reality, it's
    possible that data-dependent operations may produce outputs of different
    ranks even when given inputs of the same rank. The generated fake kernels
    are inflexible and unable to accommodate these nuances, making them
    potentially unsafe.

    Args:
        op_profiles (dict[str, set[OpProfile]]): A dictionary mapping operator
            name to a set of operator profiles from which we will generate fake
            kernels.

    Examples:

        >>> # Example: Registering an op-profile from draft-export
        >>> import torch
        >>> from torch.export._draft_export import draft_export
        >>>
        >>> @torch.library.custom_op("mylib::foo", mutates_args=())
        >>> def foo(x: Tensor, y: Tensor) -> Tensor:
        >>>     return x + y
        >>>
        >>> class M(torch.nn.Module):
        >>>     def forward(self, a, b):
        >>>         res = torch.ops.mylib.foo(a, b)  # no fake impl
        >>>         return res
        >>>
        >>> ep = draft_export(M(), (torch.ones(3, 4), torch.ones(3, 4))
        >>>
        >>> with torch._library.fake_profile.unsafe_generate_fake_kernels(ep._report.op_profiles):
        >>>     decomp = ep.run_decompositions()

    zZRegistering fake profile for %s. This will override any existing fake kernel registration.rM   r   r@   z::NÚFRAGMENTT)ÚlibÚallow_overridez
opdef for z must not be None)ÚitemsÚlogÚwarningÚsplitrT   r   Ú_abstract_fnÚregister_faker   rI   ÚLibraryÚappendÚ_destroyÚAssertionError)rU   ÚlibsÚold_fake_implsr+   ÚprofilesÚop_name_splitÚ	namespaceÚop_name_strÚop_strÚfake_kernelÚopdefÚnewlibrX   Úold_fakes                 r   Úunsafe_generate_fake_kernelsro   ]   s`  è è € ðb )+€Dà*,€NØ(×.Ò.Ñ0Ô0ð  ð  Ñˆ�Ý�Šð(àñ	
ô 	
ð 	
ð  Ÿš cÑ*Ô*ˆØ!.¨qÔ!1°=ÀÔ3C�;ˆ	ØÐ.Ð. Ð.Ð.ˆå+¨F°HÑ=Ô=ˆå$ VÑ,Ô,Ð,ˆ5ð 	 ð Ô!Ð-Ø).Ô);�˜vÑ&Ø×Ò Ñ,Ô,Ð,Ð,õ ”]×*Ò*¨9°jÑAÔAˆFÝŒM×'Ò'Ø˜¨Àð (ñ ô ð ð �KŠK˜ÑÔÐÐð*Øˆ
ˆ
ˆ
ð ð 	ð 	ˆCØ�LŠL‰NŒNˆNˆNð !/× 4Ò 4Ñ 6Ô 6ð 	*ð 	*ÑˆF�HÝ$ VÑ,Ô,ˆEØˆ}Ý$Ð%K°&Ð%KÐ%KÐ%KÑLÔLÐLØ×Ò Ñ)Ô)Ð)Ð)ð		*ð 	*øð	 ð 	ð 	ˆCØ�LŠL‰NŒNˆNˆNð !/× 4Ò 4Ñ 6Ô 6ð 	*ð 	*ÑˆF�HÝ$ VÑ,Ô,ˆEØˆ}Ý$Ð%K°&Ð%KÐ%KÐ%KÑLÔLÐLØ×Ò Ñ)Ô)Ð)Ð)ð		*øøøs   Ä	E; Å;A.G)c                  óš   — t           j                             d¦  «        } t          | d         ¦  «        › dt          | d         ¦  «        › �S )NrM   r   r@   )r   Ú__version__r]   r#   )Úversions    r   Úget_torch_versionrs   À   s@   € ÝÔ×%Ò% cÑ*Ô*€GÝ�'˜!”*‰oŒoÐ1Ð1¥ G¨A¤J¡¤Ð1Ð1Ð1r   c                 ó   ‡‡‡‡— ddl }ddlmŠmŠ dt          dt
          fˆˆfd„Šdt          dt
          fˆfd„Šˆfd	„|                      ¦   «         D ¦   «         }|                     t          ¦   «         |d
œd¬¦  «        S )zÏ
    Generates a yaml string from the given operator profiles which can be saved
    to a file. The yaml string can be loaded back into an operator profile
    structure using `read_profiles_from_yaml`.
    r   N)Ú_TORCH_TO_SERIALIZE_DTYPEÚ_TORCH_TO_SERIALIZE_LAYOUTr   r   c                 ó€   •— | j         ‰| j                 j        t          | j        ¦  «        ‰| j                 j        dœS )N©r   r   r   r   )r   r   ÚvalueÚstrr   r   )r   ru   rv   s    €€r   Úserialize_tensor_metadataz>generate_yaml_from_profiles.<locals>.serialize_tensor_metadataÓ   s<   ø€ à”FØ.¨q¬wÔ7Ô=Ý˜!œ(‘m”mØ0°´Ô:Ô@ð	
ð 
ð 	
r   Úopc                 ó¦   •— ˆfd„| j         D ¦   «         t          | j        t          ¦  «        r ‰| j        ¦  «        nˆfd„| j        D ¦   «         dœS )Nc                 ó*   •— g | ]}|® ‰|¦  «        ‘ŒS r   r   )r1   r3   r{   s     €r   r>   zMgenerate_yaml_from_profiles.<locals>.serialize_op_profile.<locals>.<listcomp>Ý   s1   ø€ ð ð ð àØ�?ð *Ð)¨#Ñ.Ô.à"�?�?r   c                 ó&   •— g | ]} ‰|¦  «        ‘ŒS r   r   )r1   Úoutr{   s     €r   r>   zMgenerate_yaml_from_profiles.<locals>.serialize_op_profile.<locals>.<listcomp>å   s%   ø€ ÐOÐOÐO¸Ð/Ð/°Ñ4Ô4ÐOÐOÐOr   ©r(   r)   )r(   r   r)   r   )r|   r{   s    €r   Úserialize_op_profilez9generate_yaml_from_profiles.<locals>.serialize_op_profileÛ   s}   ø€ ðð ð ð àœ?ðñ ô õ ˜bœn­nÑ=Ô=ðPÐ)Ð)¨"¬.Ñ9Ô9Ð9àOÐOÐOÐOÀÄÐOÑOÔOð
ð 
ð 	
r   c                 ó4   •— i | ]\  }}|ˆfd „|D ¦   «         “ŒS )c                 ó&   •— g | ]} ‰|¦  «        ‘ŒS r   r   )r1   rP   r‚   s     €r   r>   z:generate_yaml_from_profiles.<locals>.<dictcomp>.<listcomp>ê   s%   ø€ ÐIÐIÐI°WÐ'Ð'¨Ñ0Ô0ÐIÐIÐIr   r   )r1   Úoperatorrf   r‚   s      €r   ú
<dictcomp>z/generate_yaml_from_profiles.<locals>.<dictcomp>é   sD   ø€ ð ð ð áˆH�hð 	ÐIÐIÐIÐIÀÐIÑIÔIðð ð r   )Útorch_versionÚ	operatorsF)Ú	sort_keys)
ÚyamlÚtorch._export.serde.serializeru   rv   r   Údictr'   rZ   Údumprs   )rU   rŠ   Úserialized_dataru   rv   r‚   r{   s      @@@@r   Úgenerate_yaml_from_profilesr�   Å   sû   øøøø€ ð €K€K€Kðð ð ð ð ð ð ð ð

¥^ð 
½ð 
ð 
ð 
ð 
ð 
ð 
ð 
ð
¥ð 
­tð 
ð 
ð 
ð 
ð 
ð 
ðð ð ð à"-×"3Ò"3Ñ"5Ô"5ðñ ô €Oð �9Š9Ý+Ñ-Ô-¸OÐLÐLØð ñ ô ð r   Úfc                 ó¶  — t          | ¦  «        }t          |t          t          j        f¦  «        rTt          j        |¦  «        }t          |d¦  «        5 }|                     |¦  «         ddd¦  «         dS # 1 swxY w Y   dS t          |t          j	        ¦  «        r*|                     | 
                    d¦  «        ¦  «         dS t          d|› �¦  «        ‚)z©
    Serializes the given operator profiles into a yaml format and saves it to
    the given file. The operator profile can be loaded back using `load_op_profiles`.
    ÚwNúutf-8úInvalid type of file )r�   r   rz   ÚosÚPathLikeÚfspathÚopenÚwriteÚioÚBytesIOÚencodeÚ
ValueError)rU   r�   Úyaml_strÚfiles       r   Úsave_op_profilesr    ó   s  € õ
 +¨;Ñ7Ô7€Hå�!•c�2œ;Ð'Ñ(Ô(ð 
6ÝŒI�a‰LŒLˆå�!�S‰\Œ\ð 	!˜TØ�JŠJ�xÑ Ô Ð ð	!ð 	!ð 	!ñ 	!ô 	!ð 	!ð 	!ð 	!ð 	!ð 	!ð 	!ð 	!øøøð 	!ð 	!ð 	!ð 	!ð 	!ð 	!õ 
�A•r”zÑ	"Ô	"ð 6Ø	�Š�—’ Ñ(Ô(Ñ)Ô)Ð)Ð)Ð)õ Ð4°Ð4Ð4Ñ5Ô5Ð5s   ÁA8Á8A<Á?A<rž   c                 ód  ‡‡‡‡— ddl }ddlmŠmŠ dt          dt
          fˆˆfd„Šdt          dt          fˆfd„Š|                     | ¦  «        }|d         }|t          ¦   «         k    r!t          d	|› d
t          ¦   «         › �¦  «        ‚|d         }ˆfd„| 
                    ¦   «         D ¦   «         S )zW
    Reads the yaml saved by `save_op_profiles` and returns the operator profiles.
    r   N)Ú_SERIALIZE_TO_TORCH_DTYPEÚ_SERIALIZE_TO_TORCH_LAYOUTÚdatar   c                 ó–   •— t          | d         ‰| d                  t          j        | d         ¦  «        ‰| d                  ¬¦  «        S )Nr   r   r   r   rx   )r   r   r   )r¤   r¢   r£   s    €€r   Údeserialize_tensor_metadataz<read_profiles_from_yaml.<locals>.deserialize_tensor_metadata  sJ   ø€ ÝØ�f”Ø+¨D°¬MÔ:Ý”<  X¤Ñ/Ô/Ø-¨d°8¬nÔ=ð	
ñ 
ô 
ð 	
r   c                 óî   •— t          ˆfd„| d         D ¦   «         ¦  «        }| d         }t          |t          ¦  «        rt          ˆfd„|D ¦   «         ¦  «        n
 ‰|¦  «        }t          ||¬¦  «        S )Nc              3   ó.   •K  — | ]} ‰|¦  «        V — Œd S r   r   )r1   r3   r¦   s     €r   r4   zJread_profiles_from_yaml.<locals>.deserialize_op_profile.<locals>.<genexpr>  s@   øè è € ð 
ð 
Ø14Ð'Ð'¨Ñ,Ô,ð
ð 
ð 
ð 
ð 
ð 
r   r(   r)   c              3   ó.   •K  — | ]} ‰|¦  «        V — Œd S r   r   )r1   r€   r¦   s     €r   r4   zJread_profiles_from_yaml.<locals>.deserialize_op_profile.<locals>.<genexpr>!  s/   øè è € ÐOÐO°sÐ-Ð-¨cÑ2Ô2ÐOÐOÐOÐOÐOÐOr   r�   )r*   r   rS   r'   )r¤   r(   Úout_profile_datar)   r¦   s       €r   Údeserialize_op_profilez7read_profiles_from_yaml.<locals>.deserialize_op_profile  s«   ø€ Ýð 
ð 
ð 
ð 
Ø8<¸^Ô8Lð
ñ 
ô 
ñ 
ô 
ˆð   Ô.Ðõ Ð*­DÑ1Ô1ð?�EÐOÐOÐOÐOÐ>NÐOÑOÔOÑOÔOÐOà,Ð,Ð-=Ñ>Ô>ð 	õ
  lÀÐLÑLÔLÐLr   r‡   zBUnable to load outdated profile. It was saved with torch version: z# but the current torch version is: rˆ   c                 ó4   •— i | ]\  }}|ˆfd „|D ¦   «         “ŒS )c                 ó&   •— h | ]} ‰|¦  «        ’ŒS r   r   )r1   rP   r«   s     €r   ú	<setcomp>z5read_profiles_from_yaml.<locals>.<dictcomp>.<setcomp>2  s%   ø€ ÐKÐKÐK°wÐ)Ð)¨'Ñ2Ô2ÐKÐKÐKr   r   )r1   r…   rf   r«   s      €r   r†   z+read_profiles_from_yaml.<locals>.<dictcomp>1  sD   ø€ ð ð ð áˆH�hð 	ÐKÐKÐKÐKÀ(ÐKÑKÔKðð ð r   )rŠ   r‹   r¢   r£   rŒ   r   r'   Ú	safe_loadrs   ÚRuntimeErrorrZ   )	rž   rŠ   Úloaded_dataÚloaded_torch_versionÚoperators_datar¢   r£   r«   r¦   s	        @@@@r   Úread_profiles_from_yamlr´     sM  øøøø€ ð
 €K€K€Kðð ð ð ð ð ð ð ð

­$ð 
µ>ð 
ð 
ð 
ð 
ð 
ð 
ð 
ð
M¥Tð 
M­ið 
Mð 
Mð 
Mð 
Mð 
Mð 
Mð —.’. Ñ*Ô*€KØ& Ô7ÐàÕ0Ñ2Ô2Ò2Ð2Ýð^Ø#ð^ð ^ÝHYÑH[ÔH[ð^ð ^ñ
ô 
ð 	
ð
 ! Ô-€Nðð ð ð à"0×"6Ò"6Ñ"8Ô"8ðñ ô ð r   c                 óª  — t          | t          t          j        f¦  «        rPt          j        | ¦  «        } t          | ¦  «        5 }|                     ¦   «         }ddd¦  «         n# 1 swxY w Y   nTt          | t          j        ¦  «        r(|                      ¦   «          	                    d¦  «        }nt          d| › �¦  «        ‚t          |¦  «        S )zD
    Loads the saved operator profiles from `save_op_profiles`.
    Nr“   r”   )r   rz   r•   r–   r—   r˜   Úreadrš   r›   Údecoder�   r´   )r�   rŸ   rž   s      r   Úload_op_profilesr¸   7  sî   € õ �!•c�2œ;Ð'Ñ(Ô(ð 
6ÝŒI�a‰LŒLˆå�!‰WŒWð 	#˜Ø—y’y‘{”{ˆHð	#ð 	#ð 	#ñ 	#ô 	#ð 	#ð 	#ð 	#ð 	#ð 	#ð 	#øøøð 	#ð 	#ð 	#ð 	#øõ 
�A•r”zÑ	"Ô	"ð 6Ø—6’6‘8”8—?’? 7Ñ+Ô+ˆˆõ Ð4°Ð4Ð4Ñ5Ô5Ð5å" 8Ñ,Ô,Ð,s   ÁA&Á&A*Á-A*)#Ú
contextlibrš   Úloggingr•   Úcollections.abcr   r   Údataclassesr   Útypingr   r   r   Útorch._library.custom_opsr   Útorch.typesr	   Ú	getLoggerr   r[   r°   r   r   r'   rz   ÚsetrT   ÚcontextmanagerrŒ   ro   rs   r�   r    r´   r¸   r   r   r   ú<module>rÃ      sÈ  ðØ Ð Ð Ð Ø 	€	€	€	Ø €€€Ø 	€	€	€	Ø /Ð /Ð /Ð /Ð /Ð /Ð /Ð /Ø !Ð !Ð !Ð !Ð !Ð !Ø  Ð  Ð  Ð  Ð  Ð  Ð  Ð  à €€€Ø 6Ð 6Ð 6Ð 6Ð 6Ð 6Ø  Ð  Ð  Ð  Ð  Ð  ð €gÔ˜Ñ!Ô!€ðð ð ð ð �|ñ ô ð ð €�$ÐÑÔð
Dð 
Dð 
Dð 
Dð 
Dñ 
Dô 
Dñ Ôð
Dð €�$ÐÑÔð8ð 8ð 8ð 8ð 8ñ 8ô 8ñ Ôð8ð
. 3ð .°C¸	´Nð .Àxð .ð .ð .ð .ðb Ôð_*¨d°3¸¸I¼Ð3FÔ.Gð _*ÈIð _*ð _*ð _*ñ Ôð_*ðD2˜3ð 2ð 2ð 2ð 2ð
+¨T°#°s¸9´~Ð2EÔ-Fð +È3ð +ð +ð +ð +ð\6 $ s¨C°	¬NÐ':Ô";ð 6Àð 6ÈTð 6ð 6ð 6ð 6ð(- cð -¨d°3¸¸I¼Ð3FÔ.Gð -ð -ð -ð -ð`-˜ð - T¨#¨s°9¬~Ð*=Ô%>ð -ð -ð -ð -ð -ð -r   