Ë
    ¼Ó^jß}  ã                  ó’  — U d dl mZ d dlZd dlZd dlZd dlZd dl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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  G d„ de«      Z G d„ de«      Zej@                  e!ejD                  e#ejH                  e!ejJ                  e!ejL                  e!ejN                  e!ejP                  e!ejR                  e#iZ*de+d<   ej@                  dgejD                  dgejH                  ddgejJ                  dgejL                  dgejN                  dgejP                  dgejR                  dgiZ,de+d<   ej@                  ddgejD                  dgejH                  g d¢ejJ                  ddgejL                  ddgejN                  ddgejP                  ddgejR                  dgiZ-de+d<   g d¢Z.	 	 	 	 	 	 	 	 d'd„Z/ ee/dd¬«      d'd„«       Z0	 d(	 	 	 	 	 	 	 d)d„Z1d*d„Z2	 d(	 	 	 	 	 	 	 	 	 d+d „Z3	 d(	 	 	 	 	 	 	 d)d!„Z4	 d(	 	 	 	 	 	 	 d)d"„Z5	 	 	 	 	 	 d,d#„Z6	 d(	 	 	 	 	 	 	 d)d$„Z7	 d(	 	 	 	 	 	 	 d-d%„Z8	 	 	 	 	 	 d.d&„Z9y)/é    )ÚannotationsN)ÚEnum)ÚAnyÚcast)Ú
deprecatedÚvoid)ÚImage)Údenormalize_boxes)Úpolygon_to_maskÚpolygon_to_xyxy)Úwarn_deprecated)Ú_validate_resolutionc                  óT   — e Zd ZdZdZdZdZdZdZdZ	dZ
d	Zedd
„«       Zedd„«       Zy)ÚLMMa   
    Enum specifying supported Large Multimodal Models (LMMs).

    .. deprecated:: 0.27.0
        `LMM` is deprecated and will be removed in `supervision-0.31.0`.
        Use `VLM` instead.

    Attributes:
        PALIGEMMA: Google's PaliGemma vision-language model.
        FLORENCE_2: Microsoft's Florence-2 vision-language model.
        QWEN_2_5_VL: Qwen2.5-VL open vision-language model from Alibaba.        QWEN_3_VL: Qwen3-VL open vision-language model from Alibaba.
        GOOGLE_GEMINI_2_0: Google Gemini 2.0 vision-language model.
        GOOGLE_GEMINI_2_5: Google Gemini 2.5 vision-language model.
        MOONDREAM: The Moondream vision-language model.
    Ú	paligemmaÚ
florence_2Úqwen_2_5_vlÚ	qwen_3_vlÚdeepseek_vl_2Ú
gemini_2_0Ú
gemini_2_5Ú	moondreamc                ó@   — | D �cg c]  }|j                   ‘Œ c}S c c}w ©N©Úvalue©ÚclsÚcs     úd/var/www/ramen.bs-engineer-server.com/venv/lib/python3.12/site-packages/supervision/detection/vlm.pyÚlistzLMM.list1   ó   € à!$Ö%˜A�—“Ò%Ð%ùÒ%ó   …c                ó(  — t        d«       t        || «      r|S t        |t        «      r|j                  «       }	  | |«      S t	        dt        |«      › d| j                  › d�«      ‚# t        $ r  t	        d|› d| j                  «       › �«      ‚w xY w)Nzn`LMM` is deprecated since `supervision-0.27.0` and will be removed in `supervision-0.31.0`. Use `VLM` instead.úInvalid value: ú. Must be one of úInvalid value type: ú. Must be an instance of ú or str.)r   Ú
isinstanceÚstrÚlowerÚ
ValueErrorr!   ÚtypeÚ__name__©r   r   s     r    Ú
from_valuezLMM.from_value5   s¤   € äð7ô	
ô �e˜SÔ!ØˆLÜ�eœSÔ!Ø—K‘K“MˆEðYÙ˜5“zÐ!ô Ø"¤4¨£; -Ð/HØ�|‰|ˆn˜Hð&ó
ð 	
øô ò YÜ  ?°5°'Ð9JÈ3Ï8É8Ë:È,Ð!WÓXÐXðYús   »A( Á()BN©Úreturnz	list[str])r   z	LMM | strr3   r   ©r/   Ú
__module__Ú__qualname__Ú__doc__Ú	PALIGEMMAÚ
FLORENCE_2ÚQWEN_2_5_VLÚ	QWEN_3_VLÚDEEPSEEK_VL_2ÚGOOGLE_GEMINI_2_0ÚGOOGLE_GEMINI_2_5Ú	MOONDREAMÚclassmethodr!   r1   © ó    r    r   r      sY   „ ñð" €IØ€JØ€KØ€IØ#€MØ$ÐØ$ÐØ€Iàò&ó ð&ð ò
ó ñ
rB   r   c                  óT   — e Zd ZdZdZdZdZdZdZdZ	dZ
d	Zedd
„«       Zedd„«       Zy)ÚVLMa   
    Enum specifying supported Vision-Language Models (VLMs).

    Attributes:
        PALIGEMMA: Google's PaliGemma vision-language model.
        FLORENCE_2: Microsoft's Florence-2 vision-language model.
        QWEN_2_5_VL: Qwen2.5-VL open vision-language model from Alibaba.
        QWEN_3_VL: Qwen3-VL open vision-language model from Alibaba.
        GOOGLE_GEMINI_2_0: Google Gemini 2.0 vision-language model.
        GOOGLE_GEMINI_2_5: Google Gemini 2.5 vision-language model.
        MOONDREAM: The Moondream vision-language model.
    r   r   r   r   r   r   r   r   c                ó@   — | D �cg c]  }|j                   ‘Œ c}S c c}w r   r   r   s     r    r!   zVLM.list`   r"   r#   c                ó  — t        || «      r|S t        |t        «      r|j                  «       }	  | |«      S t        dt        |«      › d| j                  › d�«      ‚# t        $ r  t        d|› d| j	                  «       › �«      ‚w xY w)Nr%   r&   r'   r(   r)   )r*   r+   r,   r-   r!   r.   r/   r0   s     r    r1   zVLM.from_valued   s•   € ä�e˜SÔ!ØˆLÜ�eœSÔ!Ø—K‘K“MˆEðYÙ˜5“zÐ!ô Ø"¤4¨£; -Ð/HØ�|‰|ˆn˜Hð&ó
ð 	
øô ò YÜ  ?°5°'Ð9JÈ3Ï8É8Ë:È,Ð!WÓXÐXðYús   °A Á)BNr2   )r   ú	VLM | strr3   rD   r4   rA   rB   r    rD   rD   I   sY   „ ñð €IØ€JØ€KØ€IØ#€MØ$ÐØ$ÐØ€Iàò&ó ð&ð ò
ó ñ
rB   rD   zdict[VLM, type]ÚRESULT_TYPESÚresolution_whÚinput_whzdict[VLM, list[str]]ÚREQUIRED_ARGUMENTSÚclasses)rJ   rI   rL   ÚALLOWED_ARGUMENTS)
ú<OD>ú<CAPTION_TO_PHRASE_GROUNDING>ú<DENSE_REGION_CAPTION>ú<REGION_PROPOSAL>ú<OCR_WITH_REGION>ú#<REFERRING_EXPRESSION_SEGMENTATION>ú<REGION_TO_SEGMENTATION>ú<OPEN_VOCABULARY_DETECTION>ú<REGION_TO_CATEGORY>ú<REGION_TO_DESCRIPTION>c           
     ó  — t        | t        «      r	 t        | j                  «       «      } t        |t        |    «      s!t	        dt        |«      › dt        |    › �«      ‚t        j                  | g «      }|D ]  }||vsŒt	        d|› �«      ‚ t        j                  | g «      }|D ]!  }||vsŒt	        d|› d| j                  › �«      ‚ | S # t        $ r4 t	        d| › dt        D �cg c]  }|j
                  ‘Œ nc c}w c}› �«      ‚w xY w)aÁ  
    Validates the parameters and result type for a given Vision-Language Model (VLM).

    Args:
        vlm: The VLM enum or string specifying the model.
        result: The result object to validate (type depends on VLM).
        kwargs: Dictionary of arguments to validate against required/allowed lists.

    Returns:
        The validated VLM enum value.

    Raises:
        ValueError: If the VLM, result type, or arguments are invalid.
    zInvalid vlm value: r&   zInvalid VLM result type: z
. Must be zMissing required argument: z	Argument z is not allowed for )r*   r+   rD   r,   r-   r   rH   r.   rK   ÚgetrM   Úname)ÚvlmÚresultÚkwargsÚeÚrequired_argsÚargÚallowed_argss          r    Ú_validate_vlm_parametersrb   £   s.  € ô" �#”sÔð	Ü�c—i‘i“kÓ"ˆCô �fœl¨3Ñ/Ô0ÜØ'¬¨V« ~°ZÄÈSÑ@QÐ?RÐSó
ð 	
ô '×*Ñ*¨3°Ó3€MØò BˆØ�fÒÜÐ:¸3¸%Ð@ÓAÐAðBô %×(Ñ(¨¨bÓ1€LØò NˆØ�lÒ"Ü˜y¨¨Ð-AÀ#Ç(Á(ÀÐLÓMÐMðNð €Jøô) ò 	ÜØ% c UÐ*;ÌcÖ<RÈ¸Q¿W»WÑ<RùÔ<RÐ;SÐTóð ð	ús   ’C ÃD	Ã&C:Ã9D	z0.29.0z0.32.0)ÚtargetÚdeprecated_inÚ	remove_inc                ó   — t        | ||«      S r   )r   )r[   r\   r]   s      r    Úvalidate_vlm_parametersrg   Î   s   € ô ��V˜VÓ$Ð$rB   c                óŒ  — t        |«      \  }}t        j                  d«      }|j                  | «      }|rt	        j
                  |«      nt	        j                  d«      }|j                  d   dk(  rJt	        j                  d«      t	        j                  dt        ¬«      t	        j                  dt        ¬«      fS t	        j
                  |dd…g d¢f   t        ¬«      }|j                  t        «      d	z  t	        j
                  ||||g«      z  }t        j                  j                  |dd…d
f   j                  t        «      «      }	d}
|�gt	        j
                  |	D �cg c]  }||v ‘Œ c}t        ¬«      }||   }|	|   }	t	        j
                  |	D �cg c]  }|j                  |«      ‘Œ c}«      }
||
|	fS c c}w c c}w )aé  
    Parse bounding boxes from paligemma-formatted text, scale them to the specified
    resolution, and optionally filter by classes.

    Args:
        result: String containing paligemma-formatted locations and labels.
        resolution_wh: tuple (width, height) to which we scale the box coordinates.
        classes: Optional list of valid class names. If provided, boxes and labels not
            in this list are filtered out.

    Returns:
        A tuple of `(xyxy, class_id, class_name)` where `xyxy` is an array of
            shape `(n, 4)` in format `[x1, y1, x2, y2]`, `class_id` is an
            optional array of shape `(n,)` with class indices, and `class_name`
            is an array of shape `(n,)` with class labels.
    zK(?<!<loc\d{4}>)<loc(\d{4})><loc(\d{4})><loc(\d{4})><loc(\d{4})> ([\w\s\-]+))r   é   r   ©r   é   ©r   ©ÚdtypeN)é   r   é   é   i   rk   )r   ÚreÚcompileÚfindallÚnpÚarrayÚemptyÚshapeÚintr+   ÚfloatÚastypeÚcharÚstripÚboolÚindex)r\   rI   rL   ÚwÚhÚpatternÚmatchesÚmatches_arrÚxyxy_arrÚ
class_nameÚclass_idrZ   Úmasks                r    Úfrom_paligemmar‰   ×   sm  € ô(   Ó.�D€A€qä�j‰jØVó€Gð �o‰o˜fÓ%€GÙ9@¤B§H¡H¨WÔ$5ÄbÇhÁhÈvÓFV€Kà×Ñ˜Ñ˜qÒ Ü�x‰x˜Ó¤§¡¨$´cÔ!:¼B¿H¹HÀQÌcÔ<RÐRÐRä�x‰x˜¢A¢| OÑ4¼EÔB€HØ�‰œsÓ# dÑ*¬R¯X©X°q¸!¸QÀ°lÓ-CÑC€HÜ—‘—‘˜{ª1¨a¨4Ñ0×7Ñ7¼Ó<Ó=€JØ(,€HàÐÜ�x‰x°ZÖ@¨T˜ šÒ@ÌÔMˆØ˜D‘>ˆØ Ñ%ˆ
Ü—8‘8¸ZÖH°T˜WŸ]™]¨4Õ0ÒHÓIˆà�X˜zÐ)Ð)ùò Aùò Is   Å#F<ÆGc                ó„  — 	 | j                  d«      }|dk(  ry| |d }|j                  d«      }|dk(  ry|d|dz    }|j                  d«      }|dk(  ry|d|dz    }||dz   d j                  «       }|j                  d«      r|dd j                  «       }||z   dz   }t	        j
                  |«      S # t        $ r Y yw xY w)aú  
    Attempt to recover and parse a truncated or malformed JSON snippet from Qwen-2.5-VL
    output.

    This utility extracts a JSON-like portion from a string that may be truncated or
    malformed, cleans trailing commas, and attempts to parse it into a Python object.

    Args:
        text: Raw text containing the JSON snippet possibly truncated or
            incomplete.

    Returns:
        Parsed Python object (usually list) if recovery and parsing succeed;
            otherwise `None`.
    ú[éÿÿÿÿNú}ro   ú,ú])ÚfindÚrfindÚrstripÚendswithÚjsonÚloadsÚ	Exception)ÚtextÚfirst_bracketÚsnippetÚ
last_braceÚ
prefix_endÚprefixÚbodyÚrepaireds           r    Ú&recover_truncated_qwen_2_5_vl_responserŸ     sè   € ð ØŸ	™	 #›ˆØ˜BÒØØ�}�~Ð&ˆà—]‘] 3Ó'ˆ
Ø˜ÒØàÐ*˜J¨™NÐ+ˆà—\‘\ #Ó&ˆ
Ø˜ÒØàÐ)˜:¨™>Ð*ˆØ�z A‘~Ð'Ð(×/Ñ/Ó1ˆà�=‰=˜ÔØ˜˜�9×#Ñ#Ó%ˆDà˜D‘= 3Ñ&ˆä�z‰z˜(Ó#Ð#øÜò Ùðús"   ‚B3 ™B3 µB3 ÁAB3 Â3	B?Â>B?c                óŠ  — t        |«      \  }}t        |«      \  }}| j                  «       }t        j                  dd|t        j                  ¬«      j                  «       }t        j                  dd|«      j                  «       }|j                  d«      }	|j                  d«      }
|	dk7  r |
dk7  r|
|	kD  r||	|
dz    j                  «       }	 t        j                  |«      }t)        |t*        «      sJt!        j"                  d
«      t!        j"                  dt$        ¬«      t!        j"                  dt&        ¬«      fS g }g }|D ]C  }t)        |t,        «      rd|vsd|vrŒ|j/                  |d   «       |j/                  |d   «       ŒE |sJt!        j"                  d
«      t!        j"                  dt$        ¬«      t!        j"                  dt&        ¬«      fS t!        j0                  |t2        ¬«      }t!        j0                  |t&        ¬«      }|||||gz  }|||||gz  }d	}|�mt!        j0                  |D �cg c]  }||v ‘Œ c}t4        ¬«      }||   }||   }t!        j0                  |D �cg c]  }|j7                  |«      ‘Œ c}t$        ¬«      }|||fS # t        j                  $ r‘ t        |«      }|�|}n}	 t        j                  |«      }nf# t        t        t        f$ rO t!        j"                  d
«      t!        j"                  dt$        ¬«      t!        j"                  dt&        ¬«      fcY cY S w xY wY �ŒSw xY wc c}w c c}w )aö  
    Parse and rescale bounding boxes and class labels from Qwen-2.5-VL JSON output.

    The JSON is expected to be enclosed in triple backticks with the format:
      ```json
      [
          {"bbox_2d": [x1, y1, x2, y2], "label": "some class name"},
          ...
      ]
      ```

    Args:
        result: String containing Qwen-2.5-VL JSON bounding box and label data.
        input_wh: Width and height of the coordinate space where boxes
            are normalized.
        resolution_wh: Target width and height to scale bounding boxes.
        classes: Optional list of valid class names to filter results. If provided,
            only boxes with labels in this list are returned.

    Returns:
        A tuple of `(xyxy, class_id, class_name)` where `xyxy` is an array of
            shape `(N, 4)` in `(x_min, y_min, x_max, y_max)` format, `class_id`
            is an optional array of shape `(N,)` with class indices, and
            `class_name` is an array of shape `(N,)` with class names.
    z^```(json)?Ú ©Úflagsz```$r‹   r�   rŒ   ro   Nrj   rl   rm   Úbbox_2dÚlabel)r   r}   rr   ÚsubÚ
IGNORECASEr�   r‘   r”   r•   ÚJSONDecodeErrorrŸ   ÚastÚliteral_evalr-   ÚSyntaxErrorÚ	TypeErrorru   rw   ry   r+   r*   r!   ÚdictÚappendrv   rz   r~   r   )r\   rJ   rI   rL   Úin_wÚin_hÚout_wÚout_hr—   ÚstartÚendÚdatarž   Ú
boxes_listÚlabels_listÚitemÚxyxyr†   r‡   r¥   rˆ   s                        r    Úfrom_qwen_2_5_vlrº   1  sÑ  € ô@ & hÓ/�J€Dˆ$Ü'¨Ó6�L€Eˆ5à�<‰<‹>€DÜ�6‰6�. " d´"·-±-Ô@×FÑFÓH€DÜ�6‰6�'˜2˜tÓ$×*Ñ*Ó,€Dà�I‰I�c‹N€EØ
�*‰*�S‹/€CØ�‚{�s˜b’y S¨5¢[Ø�E˜C !™GÐ$×*Ñ*Ó,ˆðÜ�z‰z˜$Óˆô �dœDÔ!Ü—‘˜Ó ¤"§(¡(¨4´sÔ";¼R¿X¹XÀdÔRUÔ=VÐWÐWà€JØ€Kàò *ˆÜ˜$¤Ô%¨¸$Ñ)>À'ÐQUÑBUØØ×Ñ˜$˜y™/Ô*Ø×Ñ˜4 ™=Õ)ð	*ñ Ü—‘˜Ó ¤"§(¡(¨4´sÔ";¼R¿X¹XÀdÔRUÔ=VÐWÐWä�8‰8�J¤eÔ,€DÜ—‘˜+¬SÔ1€Jà�4˜˜t TÐ*Ñ*€DØ�5˜% ¨Ð.Ñ.€Dà€HàÐÜ�x‰x°zÖB¨e˜ 'Ò)ÒBÌ$ÔOˆØ�D‰zˆØ Ñ%ˆ
Ü—8‘8¸zÖJ°e˜WŸ]™]¨5Õ1ÒJÔRUÔVˆà�˜:Ð%Ð%øôW ×Ñò Ü9¸$Ó?ˆØÐØ‰DðÜ×'Ñ'¨Ó-‘øÜ¤¬YÐ7ò ä—H‘H˜VÓ$Ü—H‘H˜T¬Ô-Ü—H‘H˜T¬Ô-ðô ðýðüòL Cùò KsC   ÃJ È5L;É*M Ê#L8Ê8KËL8ËAL1Ì,L8Ì0L1Ì1L8Ì7L8c                ó    — t        | d||¬«      S )a[  
    Parse and scale bounding boxes from Qwen-3-VL style JSON output.

    Args:
        result: String containing the Qwen-3-VL JSON output.
        resolution_wh: Target resolution `(width, height)` to scale bounding boxes.
        classes: Optional list of valid classes to filter results.

    Returns:
        A tuple of `(xyxy, class_id, class_name)` where `xyxy` is an array of
            shape `(N, 4)` in `(x_min, y_min, x_max, y_max)` format scaled to
            `resolution_wh`, `class_id` is an optional array of class indices,
            and `class_name` is an array of class names.
    )éè  r¼   )r\   rJ   rI   rL   )rº   )r\   rI   rL   s      r    Úfrom_qwen_3_vlr½   �  s   € ô& ØØØ#Øô	ð rB   c           	     óÀ  — |\  }}t        j                  d| t         j                  ¬«      }t        j                  d| t         j                  ¬«      }t        |«      t        |«      k7  r$t	        dt        |«      › dt        |«      › d�«      ‚g }g }t        ||«      D ]¡  \  }	}
|	j                  «       }t        j                  d|
«      D ]s  }t        t        |j                  d«      j                  d	«      «      \  }}}}|j                  |d
z  |z  |d
z  |z  |d
z  |z  |d
z  |z  g«       |j                  |«       Œu Œ£ t        j                  |t        j                  ¬«      }t        j                  |«      }|�ht        j                  |D �cg c]  }||v ‘Œ c}t        ¬«      }||   }||   }t        j                  |D �cg c]  }|j                  |«      ‘Œ c}«      }nat!        t#        t%        |«      «      «      }t'        |«      D ��ci c]  \  }}||“Œ
 }}}t        j                  |D �cg c]  }||   ‘Œ	 c}«      }|||fS c c}w c c}w c c}}w c c}w )uØ  
    Parse bounding boxes from deepseek-vl2-formatted text, scale them to the specified
    resolution, and optionally filter by classes.

    The DeepSeek-VL2 output typically contains pairs of <|ref|> ... <|/ref|> labels
    and <|det|> ... <|/det|> bounding box definitions. Each <|det|> section may
    contain one or more bounding boxes in the form [[x1, y1, x2, y2], [x1, y1, x2, y2], ...]
    (scaled to 0..999). For example:

    ```
    <|ref|>The giraffe at the back<|/ref|><|det|>[[580, 270, 999, 904]]<|/det|><|ref|>The giraffe at the front<|/ref|><|det|>[[26, 31, 632, 998]]<|/det|><|endâ–�ofâ–�sentence|>
    ```

    Args:
        result: String containing deepseek-vl2-formatted locations and labels.
        resolution_wh: Tuple (width, height) to which we scale the box coordinates.
        classes: Optional list of valid class names. If provided, boxes and labels not
            in this list are filtered out.

    Returns:
        A tuple of `(xyxy, class_id, class_name)` where `xyxy` is an array of
            shape `(n, 4)` in format `[x1, y1, x2, y2]`, `class_id` is an
            optional array of shape `(n,)` with class indices, and `class_name`
            is an array of shape `(n,)` with class labels.
    z<\|ref\|>(.*?)<\|/ref\|>r¢   z<\|det\|>(.*?)<\|/det\|>zNumber of ref tags (z) and det tags (z) in the result must be equal.z	\[(.*?)\]z[]rŽ   iç  rm   )rr   rt   ÚSÚlenr-   Úzipr}   Úmaprz   Úsplitr®   ru   rv   Úfloat32r~   r   Úsortedr!   ÚsetÚ	enumerate)r\   rI   rL   ÚwidthÚheightÚlabel_segmentsÚdetection_segmentsÚ	xyxy_listÚclass_name_listr¥   Údetection_blobÚcurrent_class_nameÚboxÚx1Úy1Úx2Úy2r¹   r†   rZ   rˆ   r‡   Úunique_classesÚiÚclass_to_ids                            r    Úfrom_deepseek_vl_2rØ   ¨  s=  € ð: "�M€Eˆ6Ü—Z‘ZÐ ;¸VÌ2Ï4É4ÔP€NÜŸ™Ð$?ÀÌrÏtÉtÔTÐä
ˆ>ÓœcÐ"4Ó5Ò5ÜØ"¤3 ~Ó#6Ð"7ð 8Ü Ð!3Ó4Ð5Ð5SðUó
ð 	
ð
 $&€IØ!#€OÜ!$ ^Ð5GÓ!Hò 7Ñˆˆ~Ø"Ÿ[™[›]ÐÜ—:‘:˜l¨NÓ;ò 
	7ˆCÜ ¤¨¯	©	°$«×(=Ñ(=¸cÓ(BÓC‰NˆB��B˜Ø×Ñà˜#‘X Ñ%Ø˜#‘X Ñ&Ø˜#‘X Ñ%Ø˜#‘X Ñ&ð	ôð ×"Ñ"Ð#5Õ6ñ
	7ð7ô �8‰8�I¤R§Z¡ZÔ0€DÜ—‘˜/Ó*€JàÐÜ�x‰x°ZÖ@¨T˜ šÒ@ÌÔMˆØ�D‰zˆØ Ñ%ˆ
Ü—8‘8¸ZÖH°T˜WŸ]™]¨4Õ0ÒHÓI‰ä¤¤S¨£_Ó 5Ó6ˆÜ.7¸Ó.G×H¡7 1 d�t˜Q‘wÐHˆÑHÜ—8‘8¸:ÖF°4˜[¨Ó.ÒFÓGˆà�˜:Ð%Ð%ùò Aùò Iùó IùÚFs   ÆIÇIÈIÈ3Ic                óˆ  — t        | «      dk(  s
J d| › �«       ‚t        t        | j                  «       «      «      }|t        vrt        |› dt        › �«      ‚| |   } |dv rFt        j                  | d   t        j                  ¬«      }t        j                  | d   «      }||ddfS |d	k(  r.t        j                  | d   t        j                  ¬«      }|dddfS |d
k(  r…t        j                  | d   t        j                  ¬«      }|j                  ddd«      }t        j                  |D �cg c]  }t        |«      ‘Œ c}«      }t        j                  | d   «      }||d|fS |dv rÔg }g }| d   D ]ˆ  }	|	D ]�  }t        j                  |d«      j                  t        j                  «      }t        ||«      j                  t        «      }
|j                  |
«       t        |«      }|j                  |«       Œƒ ŒŠ t        j                  |t        j                  ¬«      }t        j                  |«      }|d|dfS |dk(  rFt        j                  | d   t        j                  ¬«      }t        j                  | d   «      }||ddfS |dv �r&t!        | t"        «      sJ dt%        | «      › �«       ‚| dk(  r<t        j&                  dt        j                  ¬«      t        j                  g «      ddfS t)        j*                  d«      }|j-                  | «      }|€
J d| › �«       ‚t/        |«      \  }}t        j                  |j1                  «       gt        j                  ¬«      }|t        j                  ||||g«      dz  z  }| d|j3                  «        }t        j                  |g«      }||ddfS t5        d|› �«      ‚c c}w )a±  
    Parse results from the Florence 2 multi-model model.
    https://huggingface.co/microsoft/Florence-2-large

    Args:
        result: dict containing the model output
        resolution_wh: (output_width, output_height) to which we rescale the boxes.

    Returns:
        A tuple of `(xyxy, labels, masks, obb_boxes)` where `xyxy` is an array
            of shape `(n, 4)` in format `[x1, y1, x2, y2]`, `labels` is an
            optional array of shape `(n,)` with class labels, `masks` is an
            optional array of shape `(n, h, w)` with segmentation masks, and
            `obb_boxes` is an optional array of shape `(n, 4, 2)` with oriented
            bounding boxes.
    ro   z,Expected result with a single element. Got: z% not supported. Supported tasks are: )rN   rO   rP   Úbboxesrm   ÚlabelsNrQ   rR   Ú
quad_boxesrŒ   rk   rq   )rS   rT   Úpolygons)rŒ   rq   rU   Úbboxes_labels)rV   rW   z4Expected string as <REGION_TO_CATEGORY> result, got zNo object detected.rj   z,<loc_(\d+)><loc_(\d+)><loc_(\d+)><loc_(\d+)>z1Expected string to end in location tags, but got r¼   zUnimplemented task: )rÀ   ÚnextÚiterÚkeysÚSUPPORTED_TASKS_FLORENCE_2r-   ru   rv   rÄ   Úreshaper   r{   Úint32r   r~   r®   r*   r+   r.   rw   rr   rs   Úsearchr   Úgroupsr³   ÚRuntimeError)r\   rI   Útaskr¹   rÛ   ÚxyxyxyxyÚpolygonrÌ   Ú
masks_listÚpolygons_of_same_classrˆ   Úxyxy_boxÚmasksr‚   Úmatchr€   r�   Úresult_strings                     r    Úfrom_florence_2rñ   ï  s�  € ô0 ˆv‹;˜!ÒÐTÐKÈFÈ8ÐTÓTÐÜ”�V—[‘[“]Ó#Ó$€DØÔ-Ñ-ÜØˆfÐ9Ô:TÐ9UÐVó
ð 	
ð �D‰\€FàÐRÑRÜ�x‰x˜˜xÑ(´·
±
Ô;ˆÜ—‘˜& Ñ*Ó+ˆØ�V˜T 4Ð'Ð'àÐ"Ò"Ü�x‰x˜˜xÑ(´·
±
Ô;ˆà�T˜4 Ð%Ð%àÐ"Ò"Ü—8‘8˜F <Ñ0¼¿
¹
ÔCˆØ×#Ñ# B¨¨1Ó-ˆÜ�x‰xÀÖJ°gœ¨Õ1ÒJÓKˆÜ—‘˜& Ñ*Ó+ˆØ�V˜T 8Ð+Ð+àÐRÑRØ,.ˆ	Ø-/ˆ
Ø&,¨ZÑ&8ò 	+Ð"Ø1ò +�ÜŸ*™* W¨gÓ6×=Ñ=¼b¿h¹hÓG�Ü& w°Ó>×EÑEÄdÓK�Ø×!Ñ! $Ô'Ü*¨7Ó3�Ø× Ñ  Õ*ñ+ð	+ô �x‰x˜	¬¯©Ô4ˆÜ—‘˜Ó$ˆØ�T˜5 $Ð&Ð&àÐ,Ò,Ü�x‰x˜˜xÑ(´·
±
Ô;ˆÜ—‘˜& Ñ1Ó2ˆà�V˜T 4Ð'Ð'àÐBÒBÜ˜&¤#Ô&ð 	
ØBÄ4ÈÃ<À.ÐQó	
Ð&ð Ð*Ò*Ü—8‘8˜F¬"¯*©*Ô5´r·x±xÀ³|ÀTÈ4ÐOÐOä—*‘*ÐLÓMˆØ—‘˜vÓ&ˆØÐ ð 	
Ø?À¸xÐHó	
Ð ô $ MÓ2‰ˆˆ1Ü�x‰x˜Ÿ™›Ð(´·
±
Ô;ˆØ”—‘˜!˜Q  1˜Ó&¨Ñ-Ñ-ˆØ˜ §¡£Ð/ˆÜ—‘˜=˜/Ó*ˆØ�V˜T 4Ð'Ð'ä
Ð-¨d¨VÐ4Ó
5Ð5ùòa Ks   Ä,N?c                ó^  — t        |«      \  }}| j                  «       }t        |«      D ]7  \  }}|dk(  sŒdj                  ||dz   d «      } | j	                  d«      d   }  n 	 t        j                  | «      }t        |t        «      sJt        j                  d«      t        j                  dt        ¬	«      t        j                  dt        ¬	«      fS g }	g }
|D ]U  }t        |t        «      rd
|vsd|vrŒ|	j                  |d   «       |d
   }|
j                  |d   |d   |d   |d   g«       ŒW t!        |
«      dk(  rJt        j                  d«      t        j                  dt        ¬	«      t        j                  dt        ¬	«      fS t#        t        j$                  |
t        j&                  ¬	«      ||fd¬«      }
t        j$                  |	«      }d}|�gt        j$                  |D �cg c]  }||v ‘Œ c}t(        ¬	«      }|
|   }
||   }t        j$                  |D �cg c]  }|j+                  |«      ‘Œ c}«      }|
||fS # t
        j                  $ rM t        j                  d«      t        j                  dt        ¬	«      t        j                  dt        ¬	«      fcY S w xY wc c}w c c}w )a‘  
    Parse and scale bounding boxes from Google Gemini style
    [JSON output](https://ai.google.dev/gemini-api/docs/vision?lang=python).

    The JSON is expected to be enclosed in triple backticks with the format:
        ```json
        [
            {"box_2d": [x1, y1, x2, y2], "label": "some class name"},
            ...
        ]
        ```

    For example:
        ```json
        [
            {"box_2d": [10, 20, 110, 120], "label": "cat"},
            {"box_2d": [50, 100, 150, 200], "label": "dog"}
        ]
        ```

    Args:
        result: String containing the JSON snippet enclosed by triple backticks.
        resolution_wh: (output_width, output_height) to which we rescale the boxes.
        classes: Optional list of valid class names. If provided, returned boxes/labels
            are filtered to only those classes found here.

    Returns:
        A tuple of `(xyxy, class_id, class_name)` where `xyxy` is an array of
            shape `(n, 4)` in format `[x1, y1, x2, y2]`, `class_id` is an
            optional array of shape `(n,)` with class indices, and `class_name`
            is an array of shape `(n,)` with class labels.

    ú```jsonú
ro   Nú```r   rj   rl   rm   Úbox_2dr¥   rp   rq   r¼   ©rI   Únormalization_factor)r   Ú
splitlinesrÇ   ÚjoinrÃ   r”   r•   r¨   ru   rw   ry   r+   r*   r!   r­   r®   rÀ   r
   rv   Úfloat64r~   r   )r\   rI   rL   r€   r�   ÚlinesrÖ   Úlinerµ   rÛ   r¹   r¸   rÐ   r†   r‡   rZ   rˆ   s                    r    Úfrom_google_gemini_2_0rþ   O  s]  € ôN   Ó.�D€A€qà×ÑÓ€EÜ˜UÓ#ò ‰ˆˆ4Ø�9ÓØ—Y‘Y˜u Q¨¡U W˜~Ó.ˆFØ—\‘\ %Ó(¨Ñ+ˆFÙð	ðVÜ�z‰z˜&Ó!ˆô �dœDÔ!Ü�x‰x˜Ó¤§¡¨$´cÔ!:¼B¿H¹HÀTÔQTÔ<UÐUÐUà€FØ€Dàò 6ˆÜ˜$¤Ô%¨¸Ñ)=ÀÐPTÑATØØ�‰�d˜7‘mÔ$Ø�8‰nˆà�‰�S˜‘V˜S ™V S¨¡V¨S°©VÐ4Õ5ð6ô ˆ4ƒy�A‚~Ü�x‰x˜Ó¤§¡¨$´cÔ!:¼B¿H¹HÀTÔQTÔ<UÐUÐUäÜ
�‰�œRŸZ™ZÔ(Ø˜!�fØ!ô€Dô
 —‘˜&Ó!€JØ€HàÐÜ�x‰x°ZÖ@¨T˜ šÒ@ÌÔMˆØ�D‰zˆØ Ñ%ˆ
Ü—8‘8¸ZÖH°T˜WŸ]™]¨4Õ0ÒHÓIˆà�˜:Ð%Ð%øôE ×Ñò VÜ�x‰x˜Ó¤§¡¨$´cÔ!:¼B¿H¹HÀTÔQTÔ<UÐUÒUðVüò: Aùò Is   Á%I Ç)J%ÈJ*ÉAJ"Ê!J"c           
     óV  — t        |«      \  }}| j                  «       }t        |«      D ]7  \  }}|dk(  sŒdj                  ||dz   d «      } | j	                  d«      d   }  n 	 t        j                  | «      }t        |t        «      set        j                  d«      t        j                  g t        ¬«      t        j                  g t        ¬«      t        j                  g t        ¬«      dfS g }	g }
g }g }|D �]l  }t        |t         «      rd	|vsd
|vrŒ|
j#                  |d
   «       |d	   }t%        t        j                  |d   |d   |d   |d   gg«      j'                  t        j(                  «      ||fd¬«      d   }|	j#                  |«       d|v �r«|��ª|d   }t        |t        «      r|j+                  d«      s.|j#                  t        j,                  ||ft.        ¬«      «       �nV|j1                  d«      }	 t3        j4                  |«      }t7        j8                  t;        j<                  |«      «      j?                  d«      }t        |d   «      t        |d   «      }}t        |d   «      t        |d   «      }}||z
  }||z
  }|dkD  r‚|dkD  r}|jA                  ||ft6        jB                  jD                  ¬«      }t        j,                  ||ft.        ¬«      }t        j                  |«      dkD  |||…||…f<   |j#                  |«       n/|j#                  t        j,                  ||ft.        ¬«      «       nd}d|v r|€�ŒU|j#                  |d   «       �Œkd}�Œo |	set        j                  d«      t        j                  g t        ¬«      t        j                  g t        ¬«      t        j                  g t        ¬«      dfS t        j                  |	t        ¬«      }t        j                  |
«      }|�®t        j                  |D �cg c]  }||v ‘Œ c}t.        ¬«      }||   }||   }t        j                  |D �cg c]  }|jI                  |«      ‘Œ c}«      }|�!tK        ||«      D �� cg c]
  \  }} | sŒ	|‘Œ }}} |�ƒtK        ||«      D �!� cg c]
  \  }!} | sŒ	|!‘Œ }}!} natM        t        tO        |«      «      «      }"t        |"«      D ��#ci c]  \  }}#|#|“Œ
 }$}}#t        j                  |D �cg c]  }|$|   ‘Œ	 c}«      }|�t        j                  |t        ¬«      nd}%|�t        j                  |«      nd}&||||%|&fS # t
        j                  $ rh t        j                  d«      t        j                  g t        ¬«      t        j                  g t        ¬«      t        j                  g t        ¬«      dfcY S w xY w# tF        $ r0 |j#                  t        j,                  ||ft.        ¬«      «       Y �ŒÀw xY wc c}w c c}w c c} }w c c} }!w c c}#}w c c}w )a/  
    Parse and scale bounding boxes and masks from Google Gemini 2.5 style
    [JSON output](https://ai.google.dev/gemini-api/docs/vision?lang=python).

    The JSON is expected to be enclosed in triple backticks with the format:
        ```json
        [
            {
                "box_2d": [x1, y1, x2, y2],
                "mask": "data:image/png;base64,...",
                "label": "some class name",
                "confidence": 0.95,
            },
            ...
        ]
        ```

    Args:
        result: String containing the JSON snippet enclosed by triple backticks.
        resolution_wh: (output_width, output_height) to which we rescale the boxes.
        classes: Optional list of valid class names. If provided, returned boxes/labels
            are filtered to only those classes found here.

    Returns:
        A tuple of `(xyxy, class_id, class_name, confidence, masks)` where
            `xyxy` is an array of shape `(n, 4)` in format `[x1, y1, x2, y2]`,
            `class_id` is an array of shape `(n,)` with class indices,
            `class_name` is an array of shape `(n,)` with class labels,
            `confidence` is an optional array of shape `(n,)` with confidence
            scores, and `masks` is an optional array of shape `(n, h, w)` with
            segmentation masks.
    ró   rô   ro   Nrõ   r   rj   rm   rö   r¥   rp   rq   r¼   r÷   rˆ   zdata:image/png;base64,ÚL)ÚresampleÚ
confidence)(r   rù   rÇ   rú   rÃ   r”   r•   r¨   ru   rw   rv   ry   r+   rz   r*   r!   r­   r®   r
   r{   rû   Ú
startswithÚzerosr~   ÚremoveprefixÚbase64Ú	b64decoder	   ÚopenÚioÚBytesIOÚconvertÚresizeÚ
ResamplingÚBILINEARr–   r   rÁ   rÅ   rÆ   )'r\   rI   rL   r€   r�   rü   rÖ   rý   rµ   r¶   r·   Úconfidence_listrë   r¸   rÐ   Úabsolute_bboxÚpng_strÚ	png_bytesÚmask_imgÚy_minÚy_maxÚx_minÚx_maxÚbbox_heightÚ
bbox_widthÚnp_maskr¹   r†   rZ   rˆ   r‡   ÚmÚkeepr   Úunique_labelsr¥   Úlabel_to_idr  rî   s'                                          r    Úfrom_google_gemini_2_5r  ¦  s§  € ôV   Ó.�D€A€qà×ÑÓ€EÜ˜UÓ#ò ‰ˆˆ4Ø�9ÓØ—Y‘Y˜u Q¨¡U W˜~Ó.ˆFØ—\‘\ %Ó(¨Ñ+ˆFÙð	ð	
Ü�z‰z˜&Ó!ˆô �dœDÔ!ä�H‰H�VÓÜ�H‰H�RœsÔ#Ü�H‰H�RœsÔ#Ü�H‰H�RœuÔ%Øð
ð 	
ð €JØ€KØ*,€OØ02€Jàó 8#ˆÜ˜$¤Ô%¨¸Ñ)=ÀÐPTÑATØØ×Ñ˜4 ™=Ô)Ø�8‰nˆä)Ü�H‰H�s˜1‘v˜s 1™v s¨1¡v¨s°1©vÐ6Ð7Ó8×?Ñ?ÄÇ
Á
ÓKØ˜a˜&Ø!%ô
ð ñ	ˆð
 	×Ñ˜-Ô(à�TŠ>ØÑ%Ø˜v™,�Ü! '¬3Ô/°w×7IÑ7IØ,ô8ð ×%Ñ%¤b§h¡h°°1¨v¼TÔ&BÖCà%×2Ñ2Ð3KÓL�GðLÜ$*×$4Ñ$4°WÓ$=˜	Ü#(§:¡:¬b¯j©j¸Ó.CÓ#D×#LÑ#LÈSÓ#Q˜ô (+¨=¸Ñ+;Ó'<¼cÀ-ÐPQÑBRÓ>S˜u˜Ü'*¨=¸Ñ+;Ó'<¼cÀ-ÐPQÑBRÓ>S˜u˜à&+¨e¡m˜Ø%*¨U¡]˜
à&¨š?¨z¸Aª~Ø'/§¡Ø!+¨[Ð 9Ü).×)9Ñ)9×)BÑ)Bð (7ó (˜Hô >@¿X¹XØ!" A ¬dô>˜Gô ACÇÁÈÓ@RÐUVÑ@V˜G E¨% K°°u°Ð$<Ñ=Ø&×-Ñ-¨gÕ6à&×-Ñ-¬b¯h©h¸¸1°vÄTÔ.JÕKàˆJà˜4ÑØÒ*Ø×&Ñ& t¨LÑ'9Ö:à"ŠOðq8#ñt ä�H‰H�VÓÜ�H‰H�RœsÔ#Ü�H‰H�RœsÔ#Ü�H‰H�RœuÔ%Øð
ð 	
ô �8‰8�J¤eÔ,€DÜ—‘˜+Ó&€Jð ÐÜ�x‰x°ZÖ@¨T˜ šÒ@ÌÔMˆØ�D‰zˆØ Ñ%ˆ
Ü—8‘8¸ZÖH°T˜WŸ]™]¨4Õ0ÒHÓIˆØÐ!Ü+.¨z¸4Ó+@×I¡  4ÂDš!ÐIˆJÑIàÐ&Ü03°OÀTÓ0J×S¡W Q¨ÊdšqÐSˆOÒSäœt¤C¨
£OÓ4Ó5ˆÜ09¸-Ó0H×I¡H A u�u˜a‘xÐIˆÑIÜ—8‘8¸:ÖF°4˜[¨Ó.ÒFÓGˆð 3BÐ2MŒ�‰�¬Õ.ÐSWð ð %/Ð$:ŒB�H‰H�ZÔ À€Eð 	ØØØØðð øôe ×Ñò 
ä�H‰H�VÓÜ�H‰H�RœsÔ#Ü�H‰H�RœsÔ#Ü�H‰H�RœuÔ%Øð
ò 	
ð
ûôf %ò HØ"×)Ñ)¬"¯(©(°A°q°6ÄÔ*F×GðHüòX Aùò IùãIùó Tùó JùÚFsV   Á%U ÈAWÐX
Ñ
XÑ:
XÒXÒ
XÒ(XÓX Ó>X&ÕA8W×
W×5XØXc                ó~  ‡	— |\  }}|dk  s|dk  rt        d|› d|› d�«      ‚d| vst        | d   t        «      st        j                  dt
        ¬«      S g }| d   D ]@  Š	t        ˆ	fd„d	D «       «      sŒ‰	d
   }‰	d   }‰	d   }‰	d   }|j                  ||||g«       ŒB t        |«      dk(  r4t        t        j                  t           t        j                  d«      «      S t        t        j                  t           t        t        j                  |«      j                  t        j                   «      ||f¬«      «      S )a   
    Parse and scale bounding boxes from moondream JSON output.

    The JSON is expected to have a key "objects" with a list of dictionaries:
      {
          "objects": [
              {"x_min": 0.1, "y_min": 0.2, "x_max": 0.3, "y_max": 0.4},
              ...
          ]
      }

      For Example:
      {
          "objects": [
              {"x_min": 0.1, "y_min": 0.2, "x_max": 0.3, "y_max": 0.4},
              {"x_min": 0.5, "y_min": 0.6, "x_max": 0.7, "y_max": 0.8}
          ]
      }

    Args:
        result: Dictionary containing the JSON output from the model.
        resolution_wh: (output_width, output_height) to which we rescale the boxes.

    Returns:
        An array of shape `(n, 4)` containing the bounding boxes coordinates
            in format `[x1, y1, x2, y2]`.
    r   z8Both dimensions in resolution_wh must be positive. Got (z, z).Úobjectsrj   rm   c              3  ó&   •K  — | ]  }|‰v –— Œ
 y ­wr   rA   )Ú.0Úkr¸   s     €r    ú	<genexpr>z!from_moondream.<locals>.<genexpr>ƒ  s   øè ø€ ÒK �1˜”9ÑKùs   ƒ)r  r  r  r  r  r  r  r  )rI   )r-   r*   r!   ru   rw   rz   Úallr®   rÀ   r   ÚnptÚNDArrayr   r
   rv   r{   rû   )
r\   rI   r€   r�   r¹   r  r  r  r  r¸   s
            @r    Úfrom_moondreamr)  W  s6  ø€ ð@ �D€A€qØˆA‚v��a’ÜØFÀqÀcÈÈAÈ3ÈbÐQó
ð 	
ð ˜Ñ¤j°¸	Ñ1BÄDÔ&IÜ�x‰x˜¤eÔ,Ð,à€Dà�yÑ!ò 	2ˆÜÓKÐ&JÔKÔKØà�W‘ˆØ�W‘ˆØ�W‘ˆØ�W‘ˆà�‰�U˜E 5¨%Ð0Õ1ð	2ô ˆ4ƒy�A‚~Ü”C—K‘K¤Ñ$¤b§h¡h¨vÓ&6Ó7Ð7äÜ�‰”CÑÜÜ�H‰H�T‹N×!Ñ!¤"§*¡*Ó-Ø˜a˜&ô	
óð rB   )r[   rG   r\   r   r]   údict[str, Any]r3   rD   r   )r\   r+   rI   útuple[int, int]rL   úlist[str] | Noner3   úBtuple[npt.NDArray[Any], npt.NDArray[Any] | None, npt.NDArray[Any]])r—   r+   r3   z
Any | None)
r\   r+   rJ   r+  rI   r+  rL   r,  r3   r-  )r\   r*  rI   r+  r3   zbtuple[npt.NDArray[Any], npt.NDArray[Any] | None, npt.NDArray[Any] | None, npt.NDArray[Any] | None])r\   r+   rI   r+  rL   r,  r3   zttuple[npt.NDArray[Any], npt.NDArray[Any] | None, npt.NDArray[Any], npt.NDArray[Any] | None, npt.NDArray[Any] | None])r\   r*  rI   r+  r3   znpt.NDArray[Any]):Ú
__future__r   r©   r  r	  r”   rr   Úenumr   Útypingr   r   Únumpyru   Únumpy.typingr'  Ú	deprecater   r   ÚPILr	   Ú!supervision.detection.utils.boxesr
   Ú&supervision.detection.utils.convertersr   r   Úsupervision.utils.internalr   Úsupervision.validatorsr   r   rD   r8   r+   r9   r­   r:   r;   r<   r=   r>   r?   rH   Ú__annotations__rK   rM   râ   rb   rg   r‰   rŸ   rº   r½   rØ   rñ   rþ   r  r)  rA   rB   r    ú<module>r:     sw  ðÞ "ã 
Û Û 	Û Û 	Ý ß ã Ý ß &Ý å ?ß SÝ 6Ý 7ô0
ˆ$ô 0
ôf(
ˆ$ô (
ðX ‡M�M�3Ø‡N�N�DØ‡O�O�SØ‡M�M�3Ø×Ñ�sØ×Ñ˜3Ø×Ñ˜3Ø‡M�M�4ð	!€ˆoó 	ð ‡M�M�OÐ$Ø‡N�N�_Ð%Ø‡O�O�j /Ð2Ø‡M�M�OÐ$Ø×Ñ˜Ð(Ø×Ñ˜OÐ,Ø×Ñ˜OÐ,Ø‡M�M�OÐ$ð	,Ð Ð(ó 	ð ‡M�M�O YÐ/Ø‡N�N�_Ð%Ø‡O�OÒ=Ø‡M�M�O YÐ/Ø×Ñ˜¨Ð3Ø×Ñ˜O¨YÐ7Ø×Ñ˜O¨YÐ7Ø‡M�M�OÐ$ð	+Ð Ð'ó 	òÐ ð(Ø	ð(Øð(Ø)7ð(àó(ñV Ø#ØØôò
%óð
%ð
 NRð**Øð**Ø /ð**Ø:Jð**àGó**óZ*ðb !%ð	Y&ØðY&àðY&ð #ðY&ð ð	Y&ð
 HóY&ð~ !%ðØðà"ðð ðð Hó	ð8 NRðD&ØðD&Ø /ðD&Ø:JðD&àGóD&ðN]6Øð]6Ø+:ð]6ðó]6ðF !%ðT&ØðT&à"ðT&ð ðT&ð Hó	T&ðt !%ðnØðnà"ðnð ðnðó	nðb?Øð?à"ð?ð ô?rB   