§
    ‚ŠtjSU  ã                   óâ  — d Z ddlZddlmZ ddlmZ ddlZddlmZm	Z	 dZ
e G d„ d	¦  «        ¦   «         Z	 dd
ej        dz  dej        ez  ez  dej        dededz  f
d„Z	 dd
ej        dz  dej        ez  ez  dej        dededz  f
d„Zddej        dej        dedz  fd„Zddej        dej        dedz  fd„Z	 	 ddej        ez  ez  dej        dej        dededz  dej        dz  fd„ZdS )a  
IMPORTANT NOTICE: Every class and function in this file is deprecated in favor of using the much more general
`masking_utils.py` primitives. New code should not rely on it, it is only kept for backward compatibility for now,
and will be removed in the future.
é    N)Ú	dataclass)ÚUnioné   )Úis_torchdynamo_compilingÚ
is_tracingzÐThe attention mask API under `transformers.modeling_attn_mask_utils` (`AttentionMaskConverter`) is deprecated and will be removed in Transformers v5.10. Please use the new API in `transformers.masking_utils`.c                   óò  — e Zd ZU dZeed<   eed<   d dededz  fd„Z	 d!deded	ed
ej	        de
ej        df         dej        dz  fd„Z	 d dej        ded
ej	        d	edz  dej        f
d„Ze	 	 d"dej        d
ej	        dej        dededz  f
d„¦   «         Zed dej        d
ej	        dedz  fd„¦   «         Zedej        defd„¦   «         Ze	 	 d#dej        dz  dej        dededz  dedefd„¦   «         ZdS )$ÚAttentionMaskConvertera9  
    A utility attention mask class that allows one to:
        - Create a causal 4d mask
        - Create a causal 4d mask with slided window
        - Convert a 2d attention mask (batch_size, query_length) to a 4d attention mask (batch_size, 1, query_length,
          key_value_length) that can be multiplied with attention scores

    Examples:

    ```python
    >>> import torch
    >>> from transformers.modeling_attn_mask_utils import AttentionMaskConverter

    >>> converter = AttentionMaskConverter(True)
    >>> converter.to_4d(torch.tensor([[0, 0, 0, 1, 1]]), 5, key_value_length=5, dtype=torch.float32)
    tensor([[[[-3.4028e+38, -3.4028e+38, -3.4028e+38, -3.4028e+38, -3.4028e+38],
            [-3.4028e+38, -3.4028e+38, -3.4028e+38, -3.4028e+38, -3.4028e+38],
            [-3.4028e+38, -3.4028e+38, -3.4028e+38, -3.4028e+38, -3.4028e+38],
            [-3.4028e+38, -3.4028e+38, -3.4028e+38,  0.0000e+00, -3.4028e+38],
            [-3.4028e+38, -3.4028e+38, -3.4028e+38,  0.0000e+00,  0.0000e+00]]]])
    ```

    Parameters:
        is_causal (`bool`):
            Whether the attention mask should be a uni-directional (causal) or bi-directional mask.

        sliding_window (`int`, *optional*):
            Optionally, the sliding window masks can be created if `sliding_window` is defined to a positive integer.
    Ú	is_causalÚsliding_windowNc                 ó¸   — t          j        t          t          ¦  «         || _        || _        | j        �#| j        dk    rt          d| j        › d�¦  «        ‚d S d S )Nr   zaMake sure that when passing `sliding_window` that its value is a strictly positive integer, not `ú`)ÚwarningsÚwarnÚDEPRECATION_MESSAGEÚFutureWarningr
   r   Ú
ValueError)Úselfr
   r   s      úc/var/www/html/CA-Chatbot/venv/lib/python3.11/site-packages/transformers/modeling_attn_mask_utils.pyÚ__init__zAttentionMaskConverter.__init__F   s|   € ÝŒÕ)­=Ñ9Ô9Ð9à"ˆŒØ,ˆÔàÔÐ*¨tÔ/BÀaÒ/GÐ/GÝð KÐtxô  uHð  Kð  Kð  Kñô ð ð +Ð*Ð/GÐ/Gó    ÚcpuÚ
batch_sizeÚquery_lengthÚkey_value_lengthÚdtypeÚdeviceÚstrÚreturnc                 ó¾   — | j         st          d| j        › d�¦  «        ‚||f}||z
  }d}|d         dk    s| j        �|                      ||||| j        ¬¦  «        }|S )z¿
        Creates a causal 4D mask of (bsz, head_dim=1, query_length, key_value_length) shape and adds large negative
        bias to upper right hand triangular matrix (causal mask).
        z"Please use `to_causal_4d` only if z has `is_causal` set to True.Néÿÿÿÿr   ©r   Úpast_key_values_lengthr   )r
   r   Ú	__class__r   Ú_make_causal_mask)	r   r   r   r   r   r   Úinput_shaper"   Úcausal_4d_masks	            r   Úto_causal_4dz#AttentionMaskConverter.to_causal_4dQ   s”   € ð Œ~ð 	qÝÐoÀ$Ä.ÐoÐoÐoÑpÔpÐpð " <Ð0ˆØ!1°LÑ!@Ðð ˆØ�rŒ?˜QÒÐ $Ô"5Ð"AØ!×3Ò3ØØØØ'=Ø#Ô2ð 4ñ ô ˆNð Ðr   Úattention_mask_2dc                 óð  — |j         d         |f}d}|d         dk    s| j        �B| j        r;|€t          d¦  «        ‚||z
  }|                      |||j        || j        ¬¦  «        }n| j        �t          d¦  «        ‚|                      |||d         ¬¦  «                             |j        ¦  «        }|�?| 	                    | 
                    ¦   «         t          j        |¦  «        j        ¦  «        }|}	|	S )	a  
        Converts 2D attention mask to 4D attention mask by expanding mask to (bsz, head_dim=1, query_length,
        key_value_length) shape and by adding a large negative bias to not-attended positions. If attention_mask is
        causal, a causal mask will be added.
        r   Nr    r   zpThis attention mask converter is causal. Make sure to pass `key_value_length` to correctly create a causal mask.r!   z?Sliding window is currently only implemented for causal masking)Útgt_len)Úshaper   r
   r   r$   r   ÚNotImplementedErrorÚ_expand_maskÚtoÚmasked_fillÚboolÚtorchÚfinfoÚmin)
r   r(   r   r   r   r%   r&   r"   Úexpanded_attn_maskÚexpanded_4d_masks
             r   Úto_4dzAttentionMaskConverter.to_4dr   s5  € ð )Ô.¨qÔ1°<Ð@ˆð ˆØ˜ŒO˜aÒÐ 4Ô#6Ð#BÈÌÐ#BØÐ'Ý ð Gñô ð ð &6¸Ñ%DÐ"Ø!×3Ò3ØØØ(Ô/Ø'=Ø#Ô2ð 4ñ ô ˆNˆNð Ô Ð,Ý%Ð&gÑhÔhÐhð "×.Ò.Ð/@À%ÐQ\Ð]_ÔQ`Ð.ÑaÔa×dÒdØÔ$ñ
ô 
Ðð Ð%Ø!/×!;Ò!;Ð<N×<SÒ<SÑ<UÔ<UÕW\ÔWbÐchÑWiÔWiÔWmÑ!nÔ!nÐð .ÐàÐr   r   Úinput_ids_shaper"   c                 ó‚  — t          j        t          t          ¦  «         | \  }}t	          j        ||ft	          j        |¦  «        j        |¬¦  «        }t	          j        | 	                    d¦  «        |¬¦  «        }| 
                    ||dz                        | 	                    d¦  «        d¦  «        k     d¦  «         |                     |¦  «        }|dk    r.t	          j        t	          j        ||||¬¦  «        |gd¬¦  «        }|�‹||z
  dz
  }	t	          j        t	          j        |t          j        ¬¦  «        |	¬	¦  «        }
t%          ¦   «         r|                     ¦   «         }| 
                    |
t	          j        |¦  «        j        ¦  «         |dddd…dd…f                              |d|||z   ¦  «        S )
zJ
        Make causal mask used for bi-directional self-attention.
        )r   r    r   r   ©r   r   )ÚdimN©r   )Údiagonal)r   r   r   r   r1   Úfullr2   r3   ÚarangeÚsizeÚmasked_fill_Úviewr.   ÚcatÚzerosÚtrilÚ	ones_liker0   r   ÚcloneÚexpand)r7   r   r   r"   r   Úbszr*   ÚmaskÚ	mask_condr<   Úcontext_masks              r   r$   z(AttentionMaskConverter._make_causal_mask¡   s�  € õ 	ŒÕ)­=Ñ9Ô9Ð9à&‰ˆˆWÝŒz˜7 GÐ,­e¬k¸%Ñ.@Ô.@Ô.DÈVÐTÑTÔTˆÝ”L §¢¨2¡¤°vÐ>Ñ>Ô>ˆ	Ø×Ò˜) y°1¡}×&:Ò&:¸4¿9º9ÀR¹=¼=È!Ñ&LÔ&LÒLÈaÑPÔPÐPà�wŠw�u‰~Œ~ˆà! AÒ%Ð%Ý”9�eœk¨'Ð3IÐQVÐ_eÐfÑfÔfÐhlÐmÐsuÐvÑvÔvˆDð Ð%Ø-°Ñ>ÀÑBˆHå œ:¥e¤o°dÅ%Ä*Ð&MÑ&MÔ&MÐX`ÐaÑaÔaˆLõ (Ñ)Ô)ð $Ø—z’z‘|”|�Ø×Ò˜l­E¬K¸Ñ,>Ô,>Ô,BÑCÔCÐCà�D˜$    1 1 1Ð$Ô%×,Ò,¨S°!°W¸gÐH^Ñ>^Ñ_Ô_Ð_r   rI   r*   c                 ó²  — t          j        t          t          ¦  «         |                      ¦   «         \  }}|�|n|}| dd…dddd…f                              |d||¦  «                             |¦  «        }t          j        d|¬¦  «        |z
  }| 	                    |                     t          j
        ¦  «        t          j        |¦  «        j        ¦  «        S )zg
        Expands attention_mask from `[bsz, seq_len]` to `[bsz, 1, tgt_seq_len, src_seq_len]`.
        Nr   ç      ð?r;   )r   r   r   r   r?   rG   r.   r1   Útensorr/   r0   r2   r3   )rI   r   r*   rH   Úsrc_lenÚexpanded_maskÚinverted_masks          r   r-   z#AttentionMaskConverter._expand_maskÅ   sÁ   € õ
 	ŒÕ)­=Ñ9Ô9Ð9à—y’y‘{”{‰ˆˆWØ$Ð0�'�'°gˆà˜Q˜Q˜Q  d¨A¨A¨AÐ-Ô.×5Ò5°c¸1¸gÀwÑOÔO×RÒRÐSXÑYÔYˆåœ S°Ð6Ñ6Ô6¸ÑFˆà×(Ò(¨×)9Ò)9½%¼*Ñ)EÔ)EÅuÄ{ÐSXÑGYÔGYÔG]Ñ^Ô^Ð^r   rP   Ú	min_dtypec                 óæ   — t          j        t          t          ¦  «         | j        t
          j        k    rt          d¦  «        ‚|                      t          j	        | |k    dd¬¦  «         ¦  «        S )aÏ  
        Attend to all tokens in masked rows from the expanded attention mask, for example the relevant first rows when
        using left padding. This is required by F.scaled_dot_product_attention memory-efficient attention path.
        Details: https://github.com/pytorch/pytorch/issues/110213

        `expanded_mask` is [bsz, num_masks, tgt_seq_len, src_seq_len] or [bsz, tgt_seq_len, src_seq_len].
        `attention_mask` is [bsz, src_seq_len].

        The dimension num_masks of `expanded_mask` is most often 1, but it can also be the number of heads in the case of alibi attention bias.

        For example, if `expanded_mask` is (e.g. here left-padding case)
        ```
        [[[[0, 0, 0],
           [0, 0, 0],
           [0, 0, 1]]],
         [[[1, 0, 0],
           [1, 1, 0],
           [1, 1, 1]]],
         [[[0, 0, 0],
           [0, 1, 0],
           [0, 1, 1]]]]
        ```
        then the modified `expanded_mask` will be
        ```
        [[[[1, 1, 1],   <-- modified
           [1, 1, 1],   <-- modified
           [0, 0, 1]]],
         [[[1, 0, 0],
           [1, 1, 0],
           [1, 1, 1]]],
         [[[1, 1, 1],   <-- modified
           [0, 1, 0],
           [0, 1, 1]]]]
        ```
        z\AttentionMaskConverter._unmask_unattended expects a float `expanded_mask`, got a BoolTensor.r    T)r:   Úkeepdim)
r   r   r   r   r   r1   r0   r   ÚmulÚall)rP   rR   s     r   Ú_unmask_unattendedz)AttentionMaskConverter._unmask_unattendedÕ   so   € õR 	ŒÕ)­=Ñ9Ô9Ð9ð Ô¥%¤*Ò,Ð,ÝØnñô ð ð × Ò ¥%¤)¨M¸YÒ,FÈBÐX\Ð"]Ñ"]Ô"]Ð!]Ñ^Ô^Ð^r   FÚattention_maskÚinputs_embedsÚis_trainingc                 ór  — t          j        t          t          ¦  «         |j        d         |j        d         }}||z   }t          |¦  «        }d}	| €|s|s|dk    s||k    r
|�||k     rd}	nJ|�||k     rBt          | j        ¦  «        dk    rdS |s&t          j        | dk    ¦  «        r|dk    s||k    rd}	|	S )a9  
        Detects whether the optional user-specified attention_mask & the automatically created causal mask can be
        ignored in case PyTorch's SDPA is used, rather relying on SDPA's `is_causal` argument.

        In case no token is masked in the `attention_mask` argument, if `query_length == 1` or
        `key_value_length == query_length`, we rather rely on SDPA `is_causal` argument to use causal/non-causal masks,
        allowing to dispatch to the flash attention kernel (that can otherwise not be used if a custom `attn_mask` is
        passed).
        r   r   FNTé   )	r   r   r   r   r+   r   Úlenr1   rV   )
rX   rY   r"   r   rZ   Ú_r   r   Úis_tracing_Úignore_causal_masks
             r   Ú_ignore_causal_mask_sdpaz/AttentionMaskConverter._ignore_causal_mask_sdpa  s  € õ" 	ŒÕ)­=Ñ9Ô9Ð9à'Ô-¨aÔ0°-Ô2EÀaÔ2Hˆ<ˆØ'Ð*@Ñ@Ðå  Ñ/Ô/ˆà"ÐàÐ!ð ð*Ø$/ð*à! QÒ&Ð&Ð*:¸lÒ*JÐ*JØ#Ð+Ð/?À.Ò/PÐ/Pà%)Ð"øØÐ#Ð'7¸.Ò'HÐ'HÝ�>Ô'Ñ(Ô(¨AÒ-Ð-Ø�uØ ð .¥U¤Y¨~ÀÒ/BÑ%CÔ%Cð .Ø 1Ò$Ð$Ð(8¸LÒ(HÐ(Hà)-Ð&ð "Ð!r   ©N)r   ©r   N)NF)Ú__name__Ú
__module__Ú__qualname__Ú__doc__r0   Ú__annotations__Úintr   r1   r   r   r   ÚTensorr'   r6   ÚstaticmethodÚSizer$   r-   ÚFloatTensorÚfloatrW   ra   © r   r   r	   r	   #   s�  € € € € € € ðð ð< €O€O�OØÐÐÑð	ð 	 $ð 	¸¸d¹
ð 	ð 	ð 	ð 	ð" .3ðð àðð ðð ð	ð
 Œ{ðð �e”l EÐ)Ô*ðð 
Œ˜Ñ	ðð ð ð ðL (,ð- ð - à œ<ð- ð ð- ð Œ{ð	- ð
  ™*ð- ð 
Œð- ð - ð - ð - ð^ ð
 '(Ø%)ð!`ð !`Øœð!`àŒ{ð!`ð ”ð!`ð !$ð	!`ð
 ˜d™
ð!`ð !`ð !`ñ „\ð!`ðF ð_ð _˜5œ<ð _°´ð _ÀcÈDÁjð _ð _ð _ñ „\ð_ð ð0_ØÔ(ð0_àð0_ð 0_ð 0_ñ „\ð0_ðd ð
 &*Ø!ð8"ð 8"Øœ tÑ+ð8"à”|ð8"ð !$ð8"ð ˜d™
ð	8"ð
 ð8"ð 
ð8"ð 8"ð 8"ñ „\ð8"ð 8"ð 8"r   r	   rX   r%   rY   r"   r   c                 óž  — t          d|¬¦  «        }|d         |z   }| �=t          | j        ¦  «        dk    r%|                     | |d         ||j        ¬¦  «        } nñ| �¿t          | j        ¦  «        dk    r§|d         d	|d	         |f}t          | j        ¦  «        |k    r(t          d
t          | j        ¦  «        › d|› d�¦  «        ‚d| z
  }|                     |                     t          j
        ¦  «        t          j        |j        ¦  «        j        ¦  «        } n0|                     |d         |d         ||j        |j        ¬¦  «        } | S )añ  
    Creates a causal 4D mask of shape `(batch_size, 1, query_length, key_value_length)` from a 2D mask of shape
    `(batch_size, key_value_length)`

    Args:
        attention_mask (`torch.Tensor` or `None`):
            A 2D attention mask of shape `(batch_size, key_value_length)`
        input_shape (`tuple(int)` or `list(int)` or `torch.Size`):
            The input shape should be a tuple that defines `(batch_size, query_length)`.
        inputs_embeds (`torch.Tensor`):
            The embedded inputs as a torch Tensor.
        past_key_values_length (`int`):
            The length of the key value cache.
        sliding_window (`int`, *optional*):
            If the model uses windowed attention, a sliding window should be passed.
    T©r
   r   r    Né   )r   r   r\   r   r   z#Incorrect 4D attention_mask shape: z; expected: ú.rM   r9   )r	   r]   r+   r6   r   Útupler   r/   r.   r1   r0   r2   r3   r'   r   )	rX   r%   rY   r"   r   Úattn_mask_converterr   Úexpected_shaperQ   s	            r   Ú!_prepare_4d_causal_attention_maskrw   D  sx  € õ. 1¸4ÐP^Ð_Ñ_Ô_Ðà" 2”Ð)?Ñ?Ðð Ð!¥c¨.Ô*>Ñ&?Ô&?À1Ò&DÐ&DØ,×2Ò2Ø˜K¨œOÐ>NÐVcÔVið 3ñ 
ô 
ˆˆð 
Ð	#­¨NÔ,@Ñ(AÔ(AÀQÒ(FÐ(FØ% aœ.¨!¨[¸¬^Ð=MÐNˆÝ�Ô%Ñ&Ô&¨.Ò8Ð8ÝØpµe¸NÔ<PÑ6QÔ6QÐpÐpÐ_mÐpÐpÐpñô ð ð
   .Ñ0ˆMØ*×6Ò6Ø× Ò ¥¤Ñ,Ô,­e¬k¸-Ô:MÑ.NÔ.NÔ.Rñô ˆNˆNð -×9Ò9Ø˜ŒN˜K¨œOÐ-=À]ÔEXÐanÔauð :ñ 
ô 
ˆð Ðr   c                 ó  — t          d|¬¦  «        }|d         |z   }t          |¦  «        }t                                | |||¬¦  «        }|rd}	nº| €1|                     |d         |d         ||j        |j        ¬¦  «        }	n‡|                      ¦   «         dk    r| }	n$|                     | |d         |j        |¬	¦  «        }	|sF|	j        j        d
v r8t            	                    |	t          j        |j        ¦  «        j        ¬¦  «        }	|	S )aé  
    Prepares the correct `attn_mask` argument to be used by `torch.nn.functional.scaled_dot_product_attention`.

    In case no token is masked in the `attention_mask` argument, we simply set it to `None` for the cases `query_length == 1` and
    `key_value_length == query_length`, and rely instead on SDPA `is_causal` argument to use causal/non-causal masks,
    allowing to dispatch to the flash attention kernel (that can otherwise not be used if a custom `attn_mask` is passed).
    Trq   r    )rX   rY   r"   r   Nr   r9   r\   )r   r   )ÚcudaÚxpu)rR   )r	   r   ra   r'   r   r   r:   r6   ÚtyperW   r1   r2   r3   )
rX   r%   rY   r"   r   ru   r   r_   r`   r5   s
             r   Ú*_prepare_4d_causal_attention_mask_for_sdpar|   y  sU  € õ 1¸4ÐP^Ð_Ñ_Ô_Ðà" 2”Ð)?Ñ?Ðõ
 ˜]Ñ+Ô+€Kå/×HÒHØ%Ø#Ø5Ø%ð	 Iñ ô Ðð ð ØÐÐØ	Ð	Ø.×;Ò;Ø˜ŒN˜K¨œOÐ-=À]ÔEXÐanÔauð <ñ 
ô 
ÐÐð ×ÒÑÔ 1Ò$Ð$Ø-ÐÐà2×8Ò8ØØ˜B”Ø#Ô)Ø!1ð	  9ñ  ô  Ðð ð 	Ð/Ô6Ô;¸ÐNÐNÝ5×HÒHØ ­E¬K¸Ô8KÑ,LÔ,LÔ,Pð  Iñ  ô  Ðð Ðr   rI   r   r*   c                 ó<   — t                                | ||¬¦  «        S )áÎ  
    Creates a non-causal 4D mask of shape `(batch_size, 1, query_length, key_value_length)` from a 2D mask of shape
    `(batch_size, key_value_length)`

    Args:
        mask (`torch.Tensor`):
            A 2D attention mask of shape `(batch_size, key_value_length)`
        dtype (`torch.dtype`):
            The torch dtype the created mask shall have.
        tgt_len (`int`):
            The target length or query length the created mask shall have.
    ©rI   r   r*   )r	   r-   r   s      r   Ú_prepare_4d_attention_maskr€   ³  s   € õ "×.Ò.°DÀÈwÐ.ÑWÔWÐWr   c                 óì   — t          j        t          t          ¦  «         | j        \  }}|�|n|}t          | ¦  «        st          j        | dk    ¦  «        rdS t           	                    | ||¬¦  «        S )r~   Nr   r   )
r   r   r   r   r+   r   r1   rV   r	   r-   )rI   r   r*   r^   r   s        r   Ú#_prepare_4d_attention_mask_for_sdpar‚   Ã  s}   € õ „MÕ%¥}Ñ5Ô5Ð5àœ*Ñ€AÐØ Ð,ˆgˆgÐ2B€Gõ �dÑÔð \¥¤	¨$°!ª)Ñ 4Ô 4ð \Øˆtå%×2Ò2¸ÀEÐSZÐ2Ñ[Ô[Ð[r   r   r   c                 óŠ   — t          d|¬¦  «        }|| d         z   }|                     | d         | d         |||¬¦  «        }|S )a/  
    Creates a causal 4D mask of shape `(batch_size, 1, query_length, key_value_length)`

    Args:
        input_shape (`tuple(int)` or `list(int)` or `torch.Size`):
            The input shape should be a tuple that defines `(batch_size, query_length)`.
        dtype (`torch.dtype`):
            The torch dtype the created mask shall have.
        device (`int`):
            The torch device the created mask shall have.
        sliding_window (`int`, *optional*):
            If the model uses windowed attention, a sliding window should be passed.
    Trq   r    r   r9   )r	   r'   )r%   r   r   r"   r   ru   r   rX   s           r   Ú _create_4d_causal_attention_maskr„   Ü  s]   € õ( 1¸4ÐP^Ð_Ñ_Ô_Ðà-°¸B´Ñ?ÐØ(×5Ò5Ø�AŒ˜ BœÐ)9ÀÈvð 6ñ ô €Nð Ðr   rb   rc   )rg   r   Údataclassesr   Útypingr   r1   Úutils.import_utilsr   r   r   r	   rj   rl   rt   Úlistri   rw   r|   r   r€   r‚   r   r„   ro   r   r   ú<module>r‰      ss  ððð ð €€€Ø !Ð !Ð !Ð !Ð !Ð !Ø Ð Ð Ð Ð Ð à €€€à DÐ DÐ DÐ DÐ DÐ DÐ DÐ Dðwð ð ð]"ð ]"ð ]"ð ]"ð ]"ñ ]"ô ]"ñ „ð]"ðJ	 "&ð1ð 1Ø”L 4Ñ'ð1à”˜eÑ# dÑ*ð1ð ”<ð1ð  ð	1ð
 ˜$‘Jð1ð 1ð 1ð 1ðt "&ð7ð 7Ø”L 4Ñ'ð7à”˜eÑ# dÑ*ð7ð ”<ð7ð  ð	7ð
 ˜$‘Jð7ð 7ð 7ð 7ðtXð X U¤\ð X¸%¼+ð XÐPSÐVZÑPZð Xð Xð Xð Xð \ð \¨e¬lð \À5Ä;ð \ÐY\Ð_cÑYcð \ð \ð \ð \ð: #$Ø!%ðð Ø”˜eÑ# dÑ*ðàŒ;ðð ŒLðð  ð	ð
 ˜$‘Jðð „\�DÑðð ð ð ð ð r   