ó
    Eñi¤J  ã                   óä  • S SK r S SKrS SKrS SKJs  Js  Jr  S SKJs  Js  J	s  J
r  S SKJr  S SKJs  Jr  S SKJr  S SKJr  SSKJrJrJrJrJrJrJrJrJrJrJr  SSK J!r!J"r"J#r#J$r$  \#" \RJ                  \RJ                  \RL                  \RN                  S9r(\#" \RJ                  \RJ                  S9r)\#" \RJ                  \RN                  \RL                  \RN                  S	S
9r*\#" \RN                  \RN                  \RL                  S9r+\#" \RJ                  \RJ                  \RN                  \RN                  S9r,S r-\$R\                  r/\(/r0\" \05      r1S r2S r3S r4S r5S r6S r7\ Rp                  " S	S/\Rr                  \Rr                  /5      r:\: GHH  u  r;r<\;(       a¤  \1R{                  \"" 5       R}                  \<\R~                  \R€                  4\45      Rƒ                  \/5      R…                  \05      R‡                  \55      R‰                  \65      R‹                  \75      R�                  \RŽ                  5      5        M²  \1R{                  \"" 5       R}                  \<\R€                  \45      Rƒ                  \/5      R…                  \05      R‡                  \25      R‰                  \35      R‹                  \45      R�                  \RŽ                  5      5        GMK     S rHS rIS rJS rKS rLS rM\ Rp                  " S	S/\Rr                  \Rr                  /5      rN\N GHH  u  r;r<\;(       a¤  \1R{                  \"" 5       R}                  \<\\R~                  \R€                  445      Rƒ                  \/5      R…                  \05      R‡                  \K5      R‰                  \L5      R‹                  \M5      R�                  \RŽ                  5      5        M²  \1R{                  \"" 5       R}                  \<\\R€                  45      Rƒ                  \/5      R…                  \05      R‡                  \H5      R‰                  \I5      R‹                  \J5      R�                  \RŽ                  5      5        GMK     \1R{                  \"" \RŽ                  5      Rƒ                  \/5      R…                  \05      RŸ                  \R€                  5      R¡                  \R€                  5      5        S rQS rRS rSS rTS rUS rV\ Rp                  " S	S/\Rr                  \Rr                  /5      rW\W GH`  u  r;r<\;(       a°  \1R{                  \"" 5       R}                  \R°                  \<\R~                  \R€                  4\445      Rƒ                  \/5      R…                  \05      R‡                  \T5      R‰                  \U5      R‹                  \V5      R�                  \R²                  5      5        M¾  \1R{                  \"" 5       R}                  \R°                  \<\R€                  \445      Rƒ                  \/5      R…                  \05      R‡                  \Q5      R‰                  \R5      R‹                  \S5      R�                  \R²                  5      5        GMc     S  rZS! r[S" r\S# r]S$ r^S% r_\ Rp                  " S	S/\Rr                  \Rr                  /5      rW\W GH`  u  r;r<\;(       a°  \1R{                  \"" 5       R}                  \R°                  \<\\R~                  \R€                  4445      Rƒ                  \/5      R…                  \05      R‡                  \]5      R‰                  \^5      R‹                  \_5      R�                  \R²                  5      5        M¾  \1R{                  \"" 5       R}                  \R°                  \<\\R€                  445      Rƒ                  \/5      R…                  \05      R‡                  \Z5      R‰                  \[5      R‹                  \\5      R�                  \R²                  5      5        GMc     \1R{                  \"" \R²                  5      Rƒ                  \/5      R…                  \05      RŸ                  \R€                  5      R¡                  \R€                  5      5        \(\*/r`\" \`5      raS& rb\b" \a\RÆ                  \RÈ                  \RÊ                  \RÌ                  \`\" \RÎ                  5      \RÎ                  \/\RÆ                  5
        \aR{                  \"" \RÆ                  \RÐ                  \RÊ                  45      R…                  \`5      R‡                  \-5      R�                  \RÎ                  5      5        \b" \a\RÆ                  \RÈ                  \RÒ                  \RÔ                  \`\" \RÖ                  5      \RÖ                  \/\RÆ                  5
        \)/rl\)/rm\)/rn\)/ro\*/rp\+/rq\,/rrS'\!4S( jrsS)/rtg)*é    N)Ú_sequential_wrapper2)ÚMatchAllNodeé   )Ú_get_binary_op_configsÚ_get_bn_configsÚ_get_cat_configÚ_get_conv_configsÚ_get_default_op_configsÚ_get_embedding_op_configsÚ_get_fixed_qparams_op_configsÚ_get_linear_configsÚ_get_ln_configsÚ_get_rnn_op_configsÚ_get_share_qparams_op_configs)ÚBackendConfigÚBackendPatternConfigÚDTypeConfigÚObservationType)Úinput_dtypeÚoutput_dtypeÚweight_dtypeÚ
bias_dtype)r   r   T)r   r   r   r   Ú
is_dynamic)r   r   r   c                 ó®  • UR                   UR                   :w  d  UR                   UR                   :w  a  [        S5      eU (       a  [        SXU4 35      e[        R                  [
        R                  0nUR                  [        U5      5      nUb3  [        R                  R                  R                  X5      nU" Xc5      nU$ [        SXU4 35      e)aa  Given the linear, bn and leaky_relu modules, fuses them and returns the fused module
Args:
    is_qat: a flag for whether we are using quantization aware training fusion
            or post training quantization fusion
    linear: Module instance of type Linear
    bn: BatchNorm1d instance that needs to be fused with the linear layer
    leaky_relu: LeakyReLU instance that needs to be fused with the linear layer
Examples::
    >>> # xdoctest: +SKIP(failing)
    >>> m1 = nn.Linear(20, 10)
    >>> b1 = nn.BatchNorm1d(10)
    >>> lr = nn.LeakyReLU(0.01)
    >>> m2 = _fuse_linear_bn_leaky_relu(m1, b1, lr)
zFLinear, BN and LeakyReLU all must be in the same mode (train or eval).úCannot fuse train modules: zCannot fuse eval modules: )ÚtrainingÚAssertionErrorÚNotImplementedErrorÚnnÚLinearÚnniÚLinearLeakyReLUÚgetÚtypeÚutilsÚfusionÚfuse_linear_bn_eval)Úis_qatÚlinearÚbnÚ
leaky_reluÚmap_to_fused_module_evalÚfused_moduleÚfused_linearÚfms           Úh/home/mande/repo/quber/.venv/lib/python3.13/site-packages/torch/ao/quantization/backend_config/onednn.pyÚ_fuse_linear_bn_leaky_relur1   L   sÐ   € ð ‡�˜"Ÿ+™+Ó%¨¯©¸
×8KÑ8KÓ)KÜØTó
ð 	
ö Ü!Ø)¨6°zÐ*BÐ)CÐDó
ð 	
ô
 �I‰I”s×*Ñ*ð$
Ð ð 0×3Ñ3´D¸³LÓAˆØÑ#ÜŸ8™8Ÿ?™?×>Ñ>¸vÓJˆLÙ˜lÓ7ˆBØˆIä%Ø,¨f¸*Ð-EÐ,FÐGóð ó    c                 ó.   • [         R                  " X!5      $ ©N©r!   Ú	ConvAdd2d)r(   ÚaddÚconvÚ_s       r0   Ú_fuse_conv_add_leftr:   ‡   ó   € Ü�=Š=˜Ó#Ð#r2   c                 ó   • U u  pnU$ r4   © )Úpatternr9   r8   s      r0   Ú_conv_add_root_node_getter_leftr?   ‹   s   € Ø�J€AˆQØ€Kr2   c                 ó   • U u  pnU/$ ©zyget inputs pattern for extra inputs, inputs for root node
are assumed to be copied over from root node to the fused node
r=   )r>   r9   Ú_convÚextra_inputs       r0   Ú"_conv_add_extra_inputs_getter_leftrD   �   s   € ð $Ñ€AˆkØˆ=Ðr2   c                 ó¶   • Uu  pEU (       a  [        SXTU4 35      e[        R                  R                  R	                  XT5      n[
        R                  " Xa5      $ ©Nr   ©r   r   r%   r&   Úfuse_conv_bn_evalr!   r6   )r(   r7   Úbn_convr9   r*   r8   Ú
fused_convs          r0   Ú_fuse_conv_bn_add_leftrK   Ÿ   óK   € Ø�H€BÞÜ!Ð$?ÀÈ3ÀÐ?PÐ"QÓRÐRä—X‘X—_‘_×6Ñ6°tÓ@ˆ
Ü�}Š}˜ZÓ-Ð-r2   c                 ó   • U u  pnUu  p4U$ r4   r=   )Úadd_patternr9   rI   Ú_bnr8   s        r0   Ú"_conv_bn_add_root_node_getter_leftrP   ¨   s   € Ø�M€A�Ø�I€CØ€Kr2   c                 ó   • U u  pnU/$ rA   r=   )rN   r9   Ú_bn_convrC   s       r0   Ú%_conv_bn_add_extra_inputs_getter_leftrS   ®   s   € ð  +Ñ€A�Øˆ=Ðr2   Fc                 ó.   • [         R                  " X15      $ r4   r5   )r(   r7   r9   r8   s       r0   Ú_fuse_conv_add_rightrU   Ú   r;   r2   c                 ó   • U u  pnU$ r4   r=   )r>   Ú_addr9   r8   s       r0   Ú _conv_add_root_node_getter_rightrX   Þ   s   € Ø�M€DˆTØ€Kr2   c                 ó   • U u  pnU/$ rA   r=   )r>   r9   rC   rB   s       r0   Ú#_conv_add_extra_inputs_getter_rightrZ   ã   s   € ð $Ñ€A�EØˆ=Ðr2   c                 ó¶   • Uu  pEU (       a  [        SXTU4 35      e[        R                  R                  R	                  XT5      n[
        R                  " Xa5      $ rF   rG   )r(   r7   r9   rI   r*   r8   rJ   s          r0   Ú_fuse_conv_bn_add_rightr\   ò   rL   r2   c                 ó   • U u  pnUu  pEU$ r4   r=   )r>   rW   r9   rI   rO   r8   s         r0   Ú#_conv_bn_add_root_node_getter_rightr^   û   s   € ØÑ€DˆWØ�I€CØ€Kr2   c                 ó   • U u  pnU/$ rA   r=   )r>   r9   rC   rR   s       r0   Ú&_conv_bn_add_extra_inputs_getter_rightr`     s   € ð  'Ñ€A�HØˆ=Ðr2   c                 ó:   • Uu  p4n[         R                  " XCU5      $ r4   ©r!   ÚConvAddReLU2d)r(   ÚrelurN   r7   r8   r9   s         r0   Ú_fuse_conv_add_relu_leftre   9  s   € Ø�L€CˆqÜ×Ò˜T¨Ó-Ð-r2   c                 ó   • U u  pUu  p4nU$ r4   r=   )r>   Ú_relurN   r9   r8   s        r0   Ú$_conv_add_relu_root_node_getter_leftrh   >  s   € Ø Ñ€EØ�J€AˆQØ€Kr2   c                 ó   • U u  pUu  p4nU/$ rA   r=   )r>   rg   rN   r9   rB   rC   s         r0   Ú'_conv_add_relu_extra_inputs_getter_leftrj   D  s   € ð !Ñ€EØ'Ñ€AˆkØˆ=Ðr2   c                 óÂ   • Uu  p4nUu  pgU (       a  [        SXvX14 35      e[        R                  R                  R	                  Xv5      n[
        R                  " XƒU5      $ rF   ©r   r   r%   r&   rH   r!   rc   )	r(   rd   rN   r7   rI   r9   r*   r8   rJ   s	            r0   Ú_fuse_conv_bn_add_relu_leftrm   V  sY   € Ø!�O€C�!Ø�H€BÞÜ!Ð$?ÀÈ3Ð@UÐ?VÐ"WÓXÐXä—X‘X—_‘_×6Ñ6°tÓ@ˆ
Ü× Ò  °$Ó7Ð7r2   c                 ó    • U u  pUu  p4nUu  pVU$ r4   r=   ©r>   rg   rN   r9   rI   rO   r8   s          r0   Ú'_conv_bn_add_relu_root_node_getter_leftrp   `  s   € Ø Ñ€EØ�M€A�Ø�I€CØ€Kr2   c                 ó   • U u  pUu  p4nU/$ rA   r=   )r>   rg   rN   r9   rR   rC   s         r0   Ú*_conv_bn_add_relu_extra_inputs_getter_leftrr   g  s   € ð !Ñ€EØ*Ñ€A�Øˆ=Ðr2   c                 ó:   • Uu  p4n[         R                  " XSU5      $ r4   rb   )r(   rd   rN   r7   r9   r8   s         r0   Ú_fuse_conv_add_relu_rightrt   –  s   € Ø�L€CˆDÜ×Ò˜T¨Ó-Ð-r2   c                 ó   • U u  pUu  p4nU$ r4   r=   )r>   rg   rN   r9   Ú_extra_inputr8   s         r0   Ú%_conv_add_relu_root_node_getter_rightrw   ›  s   € Ø Ñ€EØ'Ñ€A�TØ€Kr2   c                 ó   • U u  pUu  p4nU/$ rA   r=   )r>   rg   rN   r9   rC   rB   s         r0   Ú(_conv_add_relu_extra_inputs_getter_rightry   ¡  s   € ð !Ñ€EØ'Ñ€A�EØˆ=Ðr2   c                 óÂ   • Uu  p4nUu  pgU (       a  [        SXvX14 35      e[        R                  R                  R	                  Xv5      n[
        R                  " XƒU5      $ rF   rl   )	r(   rd   rN   r7   r9   rI   r*   r8   rJ   s	            r0   Ú_fuse_conv_bn_add_relu_rightr{   ³  sY   € Ø!�O€CˆGØ�H€BÞÜ!Ð$?ÀÈ3Ð@UÐ?VÐ"WÓXÐXä—X‘X—_‘_×6Ñ6°tÓ@ˆ
Ü× Ò  °$Ó7Ð7r2   c                 ó    • U u  pUu    p4Uu  pVU$ r4   r=   ro   s          r0   Ú(_conv_bn_add_relu_root_node_getter_rightr}   ½  s   € Ø Ñ€EØ�M€A€qØ�I€CØ€Kr2   c                 ó   • U u  pUu  p4nU/$ rA   r=   )r>   rg   rN   r9   rC   rR   s         r0   Ú+_conv_bn_add_relu_extra_inputs_getter_rightr   Ä  s   € ð !Ñ€EØ*Ñ€A�HØˆ=Ðr2   c
                 ó´  • U R                  [        X45      R                  U5      R                  U5      R	                  U5      5        U R                  [        X45      R                  U5      R                  U5      R	                  U5      5        U R                  [        U5      R                  U5      R                  U5      R                  U5      R                  U	5      5        U R                  [        X#45      R                  U5      R                  U5      5        U R                  [        X$45      R                  U5      R                  U5      5        g r4   )Úappendr   Úset_dtype_configsÚset_fuser_methodÚset_fused_moduleÚset_observation_typeÚset_root_moduleÚset_reference_quantized_module)
ÚconfigsÚroot_moduleÚroot_opÚpost_moduleÚpost_opÚdtype_configsÚfuser_methodr-   Úobservation_typeÚref_quant_modules
             r0   Ú_add_eltwise_fusion_configsr‘   ÿ  s  € ð ‡N�NÜ˜kÐ7Ó8ß	Ñ	˜=Ó	)ß	Ñ	˜,Ó	'ß	Ñ	˜,Ó	'ô	ð ‡N�NÜ˜kÐ3Ó4ß	Ñ	˜=Ó	)ß	Ñ	˜,Ó	'ß	Ñ	˜,Ó	'ô	ð ‡N�NÜ˜\Ó*ß	Ñ	Ð.Ó	/ß	Ñ	˜=Ó	)ß	‰˜Ó	%ß	'Ñ	'Ð(8Ó	9ôð ‡N�NÜ˜gÐ3Ó4ß	Ñ	Ð.Ó	/ß	Ñ	˜=Ó	)ôð
 ‡N�NÜ˜gÐ/Ó0ß	Ñ	Ð.Ó	/ß	Ñ	˜=Ó	)õr2   Úreturnc                  ó\  • [        S5      R                  [        5      R                  [        5      R                  [	        [
        5      5      R                  [        [        5      5      R                  [        [        5      5      R                  [        [        5      5      R                  [        [        5      5      R                  [        [        5      5      R                  [        [         5      5      R                  [#        [$        5      5      R                  ['        [(        5      5      $ )zA
Return the `BackendConfig` for PyTorch's native ONEDNN backend.
Úonednn)r   Úset_backend_pattern_configsÚconv_configsÚlinear_configsr   Úbinary_op_dtype_configsÚset_backend_pattern_configr   Údefault_op_dtype_configsr
   r   Úfixed_qparams_op_dtype_configsr   Úshare_qparams_op_dtype_configsr   r   Úlayer_norm_op_dtype_configsr   Úrnn_op_dtype_configsr   Úembedding_op_dtype_configsr=   r2   r0   Úget_onednn_backend_configr    e  sÐ   € ô
 	�hÓß	$Ñ	$¤\Ó	2ß	$Ñ	$¤^Ó	4ß	$Ñ	$Ô%;Ô<SÓ%TÓ	Uß	#Ñ	#¤OÔ4LÓ$MÓ	Nß	$Ñ	$Ô%<Ô=UÓ%VÓ	Wß	$Ñ	$Ü)Ô*HÓIó

÷ 
%Ñ	$Ü)Ô*HÓIó

÷ 
%Ñ	$¤_Ô5MÓ%NÓ	Oß	$Ñ	$¤_Ô5PÓ%QÓ	Rß	$Ñ	$Ô%8Ô9MÓ%NÓ	Oß	$Ñ	$Ü%Ô&@ÓAó

ð!r2   r    )uÚ	itertoolsÚoperatorÚtorchÚtorch.ao.nn.intrinsicÚaor   Ú	intrinsicr!   Útorch.ao.nn.quantized.referenceÚ	quantizedÚ	referenceÚnnqrÚtorch.nnÚtorch.nn.functionalÚ
functionalÚFÚ+torch.ao.quantization.fuser_method_mappingsr   Útorch.ao.quantization.utilsr   Ú_common_operator_config_utilsr   r   r   r	   r
   r   r   r   r   r   r   Úbackend_configr   r   r   r   Úquint8Úqint8ÚfloatÚ$onednn_weighted_op_int8_dtype_configÚonednn_op_quint8_dtype_configÚ onednn_dynamic_int8_dtype_configÚ%onednn_weight_only_qint8_dtype_configÚ,onednn_input_output_only_quint8_dtype_configr1   Ú&OUTPUT_USE_DIFFERENT_OBSERVER_AS_INPUTr�   Úconv_dtype_configsr–   r:   r?   rD   rK   rP   rS   Úproductr7   Úconv_add_left_optioinsÚwith_bnÚadd_opr�   Ú_set_pattern_complex_formatÚBatchNorm2dÚConv2dr…   r‚   rƒ   Ú_set_root_node_getterÚ_set_extra_inputs_getterr„   r6   rU   rX   rZ   r\   r^   r`   Úconv_add_optioinsr†   r‡   re   rh   rj   rm   rp   rr   Úconv_add_relu_left_optioinsÚReLUrc   rt   rw   ry   r{   r}   r   Úlinear_dtype_configsr—   r‘   r    r)   Ú	LeakyReLUr+   r"   ÚBatchNorm1dÚTanhÚtanhÚ
LinearTanhr˜   rš   r›   rœ   rž   rŸ   r�   r    Ú__all__r=   r2   r0   Ú<module>rÐ      sµ  ðã Û ã ß #Ó #ß .Ö .Ý ß Ð Ý LÝ 4÷÷ ÷ ñ ÷ó ñ (3Ø—‘Ø—‘Ø—‘Ø�{‰{ñ	(Ð $ñ !,Ø—‘Ø—‘ñ!Ð ñ
 $/Ø—‘Ø—‘Ø—‘Ø�{‰{Øñ$Ð  ñ )4Ø—‘Ø—‘Ø—‘ñ)Ð %ñ 0;Ø—‘Ø—‘Ø—‘Ø�{‰{ñ	0Ð ,ò$ðT #×IÑIÐ à:Ð;Ð Ù Ð!3Ó4€ò$òò
ò.òòð #×*Ò*Ø	ˆ5€MØ
‡Y�Y�—‘ÐóÐ ô
 .�O€GˆVÞØ×ÑÙ Ó"ß(Ñ(Ø˜"Ÿ.™.¨"¯)©)Ð4°lÐCó÷ "Ñ!Ð"2Ó3ßÑÐ1Ó2ßÑÐ4Ó5ß"Ñ"Ð#EÓFß%Ñ%Ð&KÓLßÑ˜cŸm™mÓ,ö	
ð 	×ÑÙ Ó"ß(Ñ(¨&°"·)±)¸\Ð)JÓKß!Ñ!Ð"2Ó3ßÑÐ1Ó2ßÑÐ1Ó2ß"Ñ"Ð#BÓCß%Ñ%Ð&HÓIßÑ˜cŸm™mÓ,÷		
ñ .ò>$òò
ò.òòð ×%Ò%Ø	ˆ5€MØ
‡Y�Y�—‘ÐóÐ ô
 )�O€GˆVÞØ×ÑÙ Ó"ß(Ñ(Ø˜¨¯©¸¿	¹	Ð'BÐCó÷ "Ñ!Ð"2Ó3ßÑÐ1Ó2ßÑÐ5Ó6ß"Ñ"Ð#FÓGß%Ñ%Ð&LÓMßÑ˜cŸm™mÓ,ö	
ð 	×ÑÙ Ó"ß(Ñ(¨&°,ÀÇ	Á	Ð)JÓKß!Ñ!Ð"2Ó3ßÑÐ1Ó2ßÑÐ2Ó3ß"Ñ"Ð#CÓDß%Ñ%Ð&IÓJßÑ˜cŸm™mÓ,÷		
ñ )ð4 × Ñ Ù˜Ÿ™Ó'ßÑÐ*Ó+ßÑÐ)Ó*ß�_�R—Y‘YÓß#Ñ# D§K¡KÓ0ôò".ò
òò$8òòð (×/Ò/Ø	ˆ5€MØ
‡Y�Y�—‘ÐóÐ ô
 3�O€GˆVÞØ×ÑÙ Ó"ß(Ñ(Ø—‘˜6 B§N¡N°B·I±IÐ#>ÀÐMÐNó÷ "Ñ!Ð"2Ó3ßÑÐ1Ó2ßÑÐ9Ó:ß"Ñ"Ð#JÓKß%Ñ%Ð&PÓQßÑ˜c×/Ñ/Ó0ö	
ð 	×ÑÙ Ó"ß(Ñ(¨"¯'©'°F¸B¿I¹IÀ|Ð3TÐ)UÓVß!Ñ!Ð"2Ó3ßÑÐ1Ó2ßÑÐ6Ó7ß"Ñ"Ð#GÓHß%Ñ%Ð&MÓNßÑ˜c×/Ñ/Ó0÷		
ñ 3òB.ò
òò$8òòð (×/Ò/Ø	ˆ5€MØ
‡Y�Y�—‘ÐóÐ ô
 3�O€GˆVÞØ×ÑÙ Ó"ß(Ñ(Ø—‘˜6 <°"·.±.À"Ç)Á)Ð1LÐMÐNó÷ "Ñ!Ð"2Ó3ßÑÐ1Ó2ßÑÐ:Ó;ß"Ñ"Ð#KÓLß%Ñ%Ð&QÓRßÑ˜c×/Ñ/Ó0ö	
ð 	×ÑÙ Ó"ß(Ñ(¨"¯'©'°F¸LÈ"Ï)É)Ð3TÐ)UÓVß!Ñ!Ð"2Ó3ßÑÐ1Ó2ßÑÐ7Ó8ß"Ñ"Ð#HÓIß%Ñ%Ð&NÓOßÑ˜c×/Ñ/Ó0÷		
ñ 3ð4 × Ñ Ù˜×*Ñ*Ó+ßÑÐ*Ó+ßÑÐ)Ó*ß�_�R—Y‘YÓß#Ñ# D§K¡KÓ0ôð )Ø$ðÐ ñ %Ð%9Ó:€ò.ñd ØØ‡I�IØ‡H�HØ‡L�LØ‡L�LØÙ˜×,Ñ,Ó-Ø×ÑØØ‡K�Kôð × Ñ Ù˜"Ÿ)™) R§^¡^°R·\±\ÐBÓCßÑÐ+Ó,ßÑÐ0Ó1ßÑ�c×)Ñ)Ó*ô	ñ ØØ‡I�IØ‡H�HØ‡G�GØ	‡J�JØÙ˜Ÿ™Ó(Ø‡N�NØØ‡K�Kôð" 9Ð9Ð Ø9Ð:Ð Ø"?Ð!@Ð Ø"?Ð!@Ð Ø8Ð9Ð ØCÐDÐ ØKÐLÐ ð =ô ð6  ð�r2   