Ë
    íì�isV  ã                   óš   — d dl Z d dlZd dlmZ d dlmZ d dlmZ d dl	m
Z
mZ d dlmZ d dlmZ d dlmZ d d	lmZmZmZ d
„ Z G d„ d«      Zy)é    N)Úis_regressor)ÚLabelEncoder)Ú_safe_indexing)Úis_pandas_dfÚis_polars_df)Úcheck_matplotlib_support)Ú_get_response_values)Ú_get_adapter_from_container)Ú_is_arraylike_not_scalarÚ_num_featuresÚcheck_is_fittedc                 ó¤   — t        | d«      }|r%t        | j                  d   «      rd}t        |«      ‚|dk(  rt	        | «      rd}|S g d¢}|S |}|S )aF  Validate the response methods to be used with the fitted estimator.

    Parameters
    ----------
    estimator : object
        Fitted estimator to check.

    response_method : {'auto', 'decision_function', 'predict_proba', 'predict'}
        Specifies whether to use :term:`decision_function`, :term:`predict_proba`,
        :term:`predict` as the target response. If set to 'auto', the response method is
        tried in the before mentioned order.

    class_of_interest : int, float, bool, str or None
        The class considered when plotting the decision. Cannot be None if
        multiclass and `response_method` is 'predict_proba' or 'decision_function'.

        .. versionadded:: 1.4

    Returns
    -------
    prediction_method : list of str or str
        The name or list of names of the response methods to use.
    Úclasses_r   zFMulti-label and multi-output multi-class classifiers are not supportedÚautoÚpredict)Údecision_functionÚpredict_probar   )Úhasattrr   r   Ú
ValueErrorr   )Ú	estimatorÚresponse_methodÚclass_of_interestÚhas_classesÚmsgÚprediction_methods         ú�/var/www/ITT-ServiceAPI-Services/ITT-Document-Scan/mrzscanner/mrzenv/lib/python3.12/site-packages/sklearn/inspection/_plot/decision_boundary.pyÚ_check_boundary_response_methodr      sr   € ô0 ˜) ZÓ0€KÙÔ/°	×0BÑ0BÀ1Ñ0EÔFØVˆÜ˜‹oÐà˜&Ò Ü˜	Ô"Ø )Ðð Ðò	 !RÐð Ðð ,ÐàÐó    c                   óN   — e Zd ZdZddddœd„Zdd„Zedddd	dddddd
œ	d„«       Zy)ÚDecisionBoundaryDisplaya•  Decisions boundary visualization.

    It is recommended to use
    :func:`~sklearn.inspection.DecisionBoundaryDisplay.from_estimator`
    to create a :class:`DecisionBoundaryDisplay`. All parameters are stored as
    attributes.

    Read more in the :ref:`User Guide <visualizations>`.

    For a detailed example comparing the decision boundaries of multinomial and
    one-vs-rest logistic regression, please see
    :ref:`sphx_glr_auto_examples_linear_model_plot_logistic_multinomial.py`.

    .. versionadded:: 1.1

    Parameters
    ----------
    xx0 : ndarray of shape (grid_resolution, grid_resolution)
        First output of :func:`meshgrid <numpy.meshgrid>`.

    xx1 : ndarray of shape (grid_resolution, grid_resolution)
        Second output of :func:`meshgrid <numpy.meshgrid>`.

    response : ndarray of shape (grid_resolution, grid_resolution) or             (grid_resolution, grid_resolution, n_classes)
        Values of the response function.

    multiclass_colors : list of str or str, default=None
        Specifies how to color each class when plotting all classes of multiclass
        problem. Ignored for binary problems and multiclass problems when plotting a
        single prediction value per point.
        Possible inputs are:

        * list: list of Matplotlib
          `color <https://matplotlib.org/stable/users/explain/colors/colors.html#colors-def>`_
          strings, of length `n_classes`
        * str: name of :class:`matplotlib.colors.Colormap`
        * None: 'viridis' colormap is used to sample colors

        Single color colormaps will be generated from the colors in the list or
        colors taken from the colormap and passed to the `cmap` parameter of
        the `plot_method`.

        .. versionadded:: 1.7

    xlabel : str, default=None
        Default label to place on x axis.

    ylabel : str, default=None
        Default label to place on y axis.

    Attributes
    ----------
    surface_ : matplotlib `QuadContourSet` or `QuadMesh` or list of such objects
        If `plot_method` is 'contour' or 'contourf', `surface_` is
        :class:`QuadContourSet <matplotlib.contour.QuadContourSet>`. If
        `plot_method` is 'pcolormesh', `surface_` is
        :class:`QuadMesh <matplotlib.collections.QuadMesh>`.

    multiclass_colors_ : array of shape (n_classes, 4)
        Colors used to plot each class in multiclass problems.
        Only defined when `color_of_interest` is None.

        .. versionadded:: 1.7

    ax_ : matplotlib Axes
        Axes with decision boundary.

    figure_ : matplotlib Figure
        Figure containing the decision boundary.

    See Also
    --------
    DecisionBoundaryDisplay.from_estimator : Plot decision boundary given an estimator.

    Examples
    --------
    >>> import matplotlib.pyplot as plt
    >>> import numpy as np
    >>> from sklearn.datasets import load_iris
    >>> from sklearn.inspection import DecisionBoundaryDisplay
    >>> from sklearn.tree import DecisionTreeClassifier
    >>> iris = load_iris()
    >>> feature_1, feature_2 = np.meshgrid(
    ...     np.linspace(iris.data[:, 0].min(), iris.data[:, 0].max()),
    ...     np.linspace(iris.data[:, 1].min(), iris.data[:, 1].max())
    ... )
    >>> grid = np.vstack([feature_1.ravel(), feature_2.ravel()]).T
    >>> tree = DecisionTreeClassifier().fit(iris.data[:, :2], iris.target)
    >>> y_pred = np.reshape(tree.predict(grid), feature_1.shape)
    >>> display = DecisionBoundaryDisplay(
    ...     xx0=feature_1, xx1=feature_2, response=y_pred
    ... )
    >>> display.plot()
    <...>
    >>> display.ax_.scatter(
    ...     iris.data[:, 0], iris.data[:, 1], c=iris.target, edgecolor="black"
    ... )
    <...>
    >>> plt.show()
    N)Úmulticlass_colorsÚxlabelÚylabelc                óX   — || _         || _        || _        || _        || _        || _        y ©N©Úxx0Úxx1Úresponser!   r"   r#   )Úselfr'   r(   r)   r!   r"   r#   s          r   Ú__init__z DecisionBoundaryDisplay.__init__¥   s/   € ð ˆŒØˆŒØ ˆŒØ!2ˆÔØˆŒØˆ�r   Úcontourfc                 óÔ  — t        d«       ddl}ddlm} |dvrt	        d|› d�«      ‚|€|j                  «       \  }}t        ||«      }	| j                  j                  dk(  r0 |	| j                  | j                  | j                  fi |¤Ž| _        �nÉ| j                  j                  d   }
d	D ]#  }||v sŒt        j                  d
|› d�«       ||= Œ% | j                  �t!        | j                  t"        «      r¿| j                  €
|
dk  rdnd}n| j                  }|dk(  r%|
dk  r |j%                  dd«      j&                  d|
 }nË|dk(  r%|
dk  r |j%                  dd«      j&                  d|
 }n¡|j%                  ||
«      }t)        |d«      s |t+        j,                  dd|
«      «      }ne|j&                  }nXt!        | j                  t.        «      r3| j                  D �cg c]  }|j&                  j1                  |«      ‘Œ }}nt	        d«      ‚|| _        |dk(  rC| j                  j5                  d¬«      } |	| j                  | j                  |fd|i|¤Ž| _        nüt7        |«      D �����cg c]9  \  }\  }}}}|j&                  j8                  j;                  d|› �d|||dfg«      ‘Œ; }}}}}}g | _        t7        |«      D ]’  \  }}t*        j<                  j?                  | j                  dd…dd…|f   | j                  j5                  d¬«      |k(   ¬«      }| j                  jA                   |	| j                  | j                  |fd|i|¤Ž«       Œ” |€|jC                  «       s!|€| jD                  n|}|jG                  |«       |€|jI                  «       s!|€| jJ                  n|}|jM                  |«       || _'        |jP                  | _)        | S c c}w c c}}}}}w )aó  Plot visualization.

        Parameters
        ----------
        plot_method : {'contourf', 'contour', 'pcolormesh'}, default='contourf'
            Plotting method to call when plotting the response. Please refer
            to the following matplotlib documentation for details:
            :func:`contourf <matplotlib.pyplot.contourf>`,
            :func:`contour <matplotlib.pyplot.contour>`,
            :func:`pcolormesh <matplotlib.pyplot.pcolormesh>`.

        ax : Matplotlib axes, default=None
            Axes object to plot on. If `None`, a new figure and axes is
            created.

        xlabel : str, default=None
            Overwrite the x-axis label.

        ylabel : str, default=None
            Overwrite the y-axis label.

        **kwargs : dict
            Additional keyword arguments to be passed to the `plot_method`.

        Returns
        -------
        display: :class:`~sklearn.inspection.DecisionBoundaryDisplay`
            Object that stores computed values.
        zDecisionBoundaryDisplay.plotr   N©r,   ÚcontourÚ
pcolormeshz@plot_method must be 'contourf', 'contour', or 'pcolormesh'. Got ú	 instead.é   éÿÿÿÿ)ÚcmapÚcolorsú'z‡' is ignored in favor of 'multiclass_colors' in the multiclass case when the response method is 'decision_function' or 'predict_proba'.é
   Útab10Úgist_rainbowÚtab20é   r5   é   z,'multiclass_colors' must be a list or a str.r/   ©ÚaxisÚ	colormap_)ç      ð?r@   r@   r@   r@   )Úmaskr4   )*r   Ú
matplotlibÚmatplotlib.pyplotÚpyplotr   ÚsubplotsÚgetattrr)   Úndimr'   r(   Úsurface_ÚshapeÚwarningsÚwarnr!   Ú
isinstanceÚstrÚget_cmapr5   r   ÚnpÚlinspaceÚlistÚto_rgbaÚmulticlass_colors_ÚargmaxÚ	enumerateÚLinearSegmentedColormapÚ	from_listÚmaÚarrayÚappendÚ
get_xlabelr"   Ú
set_xlabelÚ
get_ylabelr#   Ú
set_ylabelÚax_ÚfigureÚfigure_)r*   Úplot_methodÚaxr"   r#   ÚkwargsÚmplÚpltÚ_Ú	plot_funcÚn_responsesÚkwargr4   r5   ÚcolorÚ	class_mapÚ	class_idxÚrÚgÚbÚmulticlass_cmapsr)   s                         r   ÚplotzDecisionBoundaryDisplay.plot¯   sÉ  € ô< 	!Ð!?Ô@Û Ý'àÐCÑCÜðØ"�m 9ð.óð ð
 ˆ:Ø—L‘L“N‰EˆAˆrä˜B Ó,ˆ	Ø�=‰=×Ñ Ò"Ù% d§h¡h°·±¸$¿-¹-ÑRÈ6ÑRˆDŽMàŸ-™-×-Ñ-¨bÑ1ˆKØ+ò &�Ø˜F’?Ü—M‘MØ˜E˜7ð #Bð Bôð
 ˜u™ð&ð ×%Ñ%Ð-´Ø×&Ñ&¬ô2ð ×)Ñ)Ð1Ø&1°RÒ&7™7¸^‘Dà×1Ñ1�Dð
 ˜7’? {°bÒ'8Ø Ÿ\™\¨'°2Ó6×=Ñ=¸l¸{ÐK‘FØ˜W’_¨¸Ò):Ø Ÿ\™\¨'°2Ó6×=Ñ=¸l¸{ÐK‘FàŸ<™<¨¨kÓ:�DÜ" 4¨Ô2á!%¤b§k¡k°!°Q¸Ó&DÓ!E™à!%§¡™Ü˜D×2Ñ2´DÔ9ØAE×AWÑAWÖX¸˜#Ÿ*™*×,Ñ,¨UÕ3ÐX�ÑXä Ð!OÓPÐPà&,ˆDÔ#Ø˜iÒ'à ŸM™M×0Ñ0°aÐ0Ó8�	Ù )Ø—H‘H˜dŸh™h¨	ñ!Ø:@ð!ØDJñ!�•ô 4=¸VÓ3D÷	$ò $ñ 0˜	¡< A q¨!¨Qð —J‘J×6Ñ6×@Ñ@Ø# I ;Ð/Ð2FÈÈAÈqÐRUÈÐ1Wõð$Ð ô $ð !#�”Ü'0Ð1AÓ'Bò ‘O�I˜tÜ!Ÿu™uŸ{™{ØŸ™¢aª¨I oÑ6Ø#Ÿ}™}×3Ñ3¸Ð3Ó;¸yÑHÐIð  +ó  �Hð —M‘M×(Ñ(Ù! $§(¡(¨D¯H©H°hÑTÀTÐTÈVÑTõðð Ð R§]¡]¤_Ø$* N�T—[’[¸ˆFØ�M‰M˜&Ô!ØÐ R§]¡]¤_Ø$* N�T—[’[¸ˆFØ�M‰M˜&Ô!àˆŒØ—y‘yˆŒØˆùòM Yùö$s   Ç!"OÉ1>O!éd   r@   r   )	Úgrid_resolutionÚepsrb   r   r   r!   r"   r#   rc   c       	         óD  ‡#— t        | j                  › d�«       t        |«       ddlŠ#|dkD  st	        d|› d�«      ‚|dk\  st	        d|› d�«      ‚d}||vr#d	j                  |«      }t	        d
|› d|› d�«      ‚t        |«      }|dk7  rt	        d|› d�«      ‚|dv r½|�»t        |d«      r¯t        |j                  «      x}dkD  r•t        |t        «      rKt        |«      |k7  rt	        d|› dt        |«      › d�«      ‚t        ˆ#fd„|D «       «      rt	        d|› �«      ‚t        |t        «      r*|‰#j                  j                  «       vrt	        d|› �«      ‚t!        |dd¬«      t!        |dd¬«      }}|j#                  «       |z
  |j%                  «       |z   }}|j#                  «       |z
  |j%                  «       |z   }}t'        j(                  t'        j*                  |||«      t'        j*                  |||«      «      \  }}t&        j,                  |j/                  «       |j/                  «       f   }t1        |«      st3        |«      r)t5        |«      }|j7                  |||j8                  ¬«      }t;        |||«      }	 t=        ||||d¬«      \  }}}|dk(  r8t        |d«      r,t?        «       } |j                  | _	        | jA                  |«      }|jB                  dk(  r |jD                  |jF                  Ž }n‰tI        |«      rt	        d«      ‚|�Ft'        jJ                  |j                  |k(  «      d   }! |dd…|!f   jD                  |jF                  Ž }n+ |jD                  g |jF                  ¢|jF                  d   ‘­Ž }|	€t        |d «      r|j8                  d   nd!}	|
€t        |d «      r|j8                  d   nd!}
 | |||||	|
¬"«      }" |"jL                  d$||d#œ|¤ŽS # t        $ r/}dt        |«      v rt	        d|› d|j                  › �«      |‚‚ d}~ww xY w)%a  Plot decision boundary given an estimator.

        Read more in the :ref:`User Guide <visualizations>`.

        Parameters
        ----------
        estimator : object
            Trained estimator used to plot the decision boundary.

        X : {array-like, sparse matrix, dataframe} of shape (n_samples, 2)
            Input data that should be only 2-dimensional.

        grid_resolution : int, default=100
            Number of grid points to use for plotting decision boundary.
            Higher values will make the plot look nicer but be slower to
            render.

        eps : float, default=1.0
            Extends the minimum and maximum values of X for evaluating the
            response function.

        plot_method : {'contourf', 'contour', 'pcolormesh'}, default='contourf'
            Plotting method to call when plotting the response. Please refer
            to the following matplotlib documentation for details:
            :func:`contourf <matplotlib.pyplot.contourf>`,
            :func:`contour <matplotlib.pyplot.contour>`,
            :func:`pcolormesh <matplotlib.pyplot.pcolormesh>`.

        response_method : {'auto', 'decision_function', 'predict_proba',                 'predict'}, default='auto'
            Specifies whether to use :term:`decision_function`,
            :term:`predict_proba` or :term:`predict` as the target response.
            If set to 'auto', the response method is tried in the order as
            listed above.

            .. versionchanged:: 1.6
                For multiclass problems, 'auto' no longer defaults to 'predict'.

        class_of_interest : int, float, bool or str, default=None
            The class to be plotted when `response_method` is 'predict_proba'
            or 'decision_function'. If None, `estimator.classes_[1]` is considered
            the positive class for binary classifiers. For multiclass
            classifiers, if None, all classes will be represented in the
            decision boundary plot; the class with the highest response value
            at each point is plotted. The color of each class can be set via
            `multiclass_colors`.

            .. versionadded:: 1.4

        multiclass_colors : list of str, or str, default=None
            Specifies how to color each class when plotting multiclass
            'predict_proba' or 'decision_function' and `class_of_interest` is
            None. Ignored in all other cases.

            Possible inputs are:

            * list: list of Matplotlib
              `color <https://matplotlib.org/stable/users/explain/colors/colors.html#colors-def>`_
              strings, of length `n_classes`
            * str: name of :class:`matplotlib.colors.Colormap`
            * None: 'tab10' colormap is used to sample colors if the number of
                classes is less than or equal to 10, otherwise 'gist_rainbow'
                colormap.

            Single color colormaps will be generated from the colors in the list or
            colors taken from the colormap, and passed to the `cmap` parameter of
            the `plot_method`.

            .. versionadded:: 1.7

        xlabel : str, default=None
            The label used for the x-axis. If `None`, an attempt is made to
            extract a label from `X` if it is a dataframe, otherwise an empty
            string is used.

        ylabel : str, default=None
            The label used for the y-axis. If `None`, an attempt is made to
            extract a label from `X` if it is a dataframe, otherwise an empty
            string is used.

        ax : Matplotlib axes, default=None
            Axes object to plot on. If `None`, a new figure and axes is
            created.

        **kwargs : dict
            Additional keyword arguments to be passed to the
            `plot_method`.

        Returns
        -------
        display : :class:`~sklearn.inspection.DecisionBoundaryDisplay`
            Object that stores the result.

        See Also
        --------
        DecisionBoundaryDisplay : Decision boundary visualization.
        sklearn.metrics.ConfusionMatrixDisplay.from_estimator : Plot the
            confusion matrix given an estimator, the data, and the label.
        sklearn.metrics.ConfusionMatrixDisplay.from_predictions : Plot the
            confusion matrix given the true and predicted labels.

        Examples
        --------
        >>> import matplotlib.pyplot as plt
        >>> from sklearn.datasets import load_iris
        >>> from sklearn.linear_model import LogisticRegression
        >>> from sklearn.inspection import DecisionBoundaryDisplay
        >>> iris = load_iris()
        >>> X = iris.data[:, :2]
        >>> classifier = LogisticRegression().fit(X, iris.target)
        >>> disp = DecisionBoundaryDisplay.from_estimator(
        ...     classifier, X, response_method="predict",
        ...     xlabel=iris.feature_names[0], ylabel=iris.feature_names[1],
        ...     alpha=0.5,
        ... )
        >>> disp.ax_.scatter(X[:, 0], X[:, 1], c=iris.target, edgecolor="k")
        <...>
        >>> plt.show()
        z.from_estimatorr   Nr<   z,grid_resolution must be greater than 1. Got r1   z,eps must be greater than or equal to 0. Got r.   z, zplot_method must be one of z. Got r2   z#n_features must be equal to 2. Got )r   r   r   r   z[When 'multiclass_colors' is a list, it must be of the same length as 'estimator.classes_' (z), got: ú.c              3   óV   •K  — | ]   }‰j                   j                  |«       –— Œ" y ­wr%   )r5   Úis_color_like)Ú.0Úcolre   s     €r   ú	<genexpr>z9DecisionBoundaryDisplay.from_estimator.<locals>.<genexpr>Ù  s(   øè ø€ ò Ø:=˜Ÿ
™
×0Ñ0°Ó5Ô5ñùs   ƒ&)z[When 'multiclass_colors' is a list, it can only contain valid Matplotlib color names. Got: zSWhen 'multiclass_colors' is a string, it must be a valid Matplotlib colormap. Got: r=   )ÚcolumnsT)r   Ú	pos_labelÚreturn_response_method_usedzis not a valid labelzclass_of_interest=z+ is not a valid label: It should be one of r   z)Multi-output regressors are not supportedr3   r}   Ú r&   )rc   rb   © )'r   Ú__name__r   rB   r   Újoinr   r   Úlenr   rL   rQ   ÚanyrM   rD   Ú	colormapsr   ÚminÚmaxrO   ÚmeshgridrP   Úc_Úravelr   r   r
   Úcreate_containerr}   r   r	   r   Ú	transformrG   ÚreshaperI   r   Úflatnonzerorr   )$Úclsr   ÚXrt   ru   rb   r   r   r!   r"   r#   rc   rd   Úpossible_plot_methodsÚavailable_methodsÚnum_featuresÚ	n_classesÚx0Úx1Úx0_minÚx0_maxÚx1_minÚx1_maxr'   r(   ÚX_gridÚadapterr   r)   rg   Úresponse_method_usedÚexcÚencoderÚcol_idxÚdisplayre   s$                                      @r   Úfrom_estimatorz&DecisionBoundaryDisplay.from_estimator'  s—  ø€ ôP 	! C§L¡L >°Ð!AÔBÜ˜	Ô"Û à Ò"ÜðØ#Ð$ Ið/óð ð
 �aŠxÜØ>¸s¸eÀ9ÐMóð ð !FÐØÐ3Ñ3Ø $§	¡	Ð*?Ó @ÐÜØ-Ð.?Ð-@ð AØ"�m 9ð.óð ô
 % QÓ'ˆØ˜1ÒÜØ5°l°^À9ÐMóð ð
 ÐMÑMØ!Ð-Ü˜	 :Ô.Ü! )×"4Ñ"4Ó5Ð5�¸Ò:äÐ+¬TÔ2ÜÐ(Ó)¨YÒ6Ü$ð;Ø;D¸+ÀXÜÐ0Ó1Ð2°!ð5óð ô
 ó ØARôô ô %ð9Ø9JÐ8KðMóð ô Ð+¬SÔ1Ø$¨C¯J©J×,@Ñ,@Ó,BÑBÜ$ð5Ø5FÐ4GðIóð ô
    1¨1Ô-¬~¸aÀÈÔ/KˆBˆàŸ™› C™¨¯©«°C©�ˆØŸ™› C™¨¯©«°C©�ˆä—;‘;Ü�K‰K˜ ¨Ó8Ü�K‰K˜ ¨Ó8ó
‰ˆˆSô
 —‘�s—y‘y“{ C§I¡I£KÐ/Ñ0ˆÜ˜Œ?œl¨1œoÜ1°!Ó4ˆGØ×-Ñ-ØØØŸ	™	ð .ó ˆFô <Ø�Ð(9ó
Ðð	Ü0DØØØ 1Ø+Ø,0ô1Ñ-ˆH�aÐ-ð&   9Ò,´¸ÀJÔ1OÜ"“nˆGØ(×1Ñ1ˆGÔØ×(Ñ(¨Ó2ˆHà�=‰=˜AÒØ'�x×'Ñ'¨¯©Ð3‰Hä˜IÔ&Ü Ð!LÓMÐMà Ð,ô Ÿ.™.¨×);Ñ);Ð?PÑ)PÓQÐRSÑT�Ø7˜8¢A w JÑ/×7Ñ7¸¿¹ÐC‘à+˜8×+Ñ+ÐK¨S¯Y©YÐK¸¿¹ÀrÑ8JÒK�àˆ>Ü%,¨Q°	Ô%:�Q—Y‘Y˜q’\ÀˆFàˆ>Ü%,¨Q°	Ô%:�Q—Y‘Y˜q’\ÀˆFáØØØØ/ØØô
ˆð ˆw�|‰|ÐE˜r¨{ÑE¸fÑEÐEøô] ò 		Ø%¬¨S«Ñ1ô !Ø(Ð):Ð(;ð <(Ø(1×(:Ñ(:Ð';ð=óð ðð ûð		ús   ÊO' Ï'	PÏ0*PÐP)r,   NNN)r‚   Ú
__module__Ú__qualname__Ú__doc__r+   rr   Úclassmethodr£   r�   r   r   r    r    >   sT   „ ñdðN 8<ÀDÐQUôóvðp ð ØØØØØØØØóKFó ñKFr   r    )rJ   ÚnumpyrO   Úsklearn.baser   Úsklearn.preprocessingr   Úsklearn.utilsr   Úsklearn.utils._dataframer   r   Ú$sklearn.utils._optional_dependenciesr   Úsklearn.utils._responser	   Úsklearn.utils._set_outputr
   Úsklearn.utils.validationr   r   r   r   r    r�   r   r   ú<module>r±      s@   ðó ã å %Ý .Ý (ß ?Ý IÝ 8Ý A÷ñ ò%÷PuFò uFr   