Ë
    Eêñi(R  ã                  óR  — U d dl mZ d dlZd dlZd dlmZmZ d dlmZmZm	Z	 d dl
mZmZmZmZ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  ee«      Zded<   er G d„ de«      ZdZ ded<   dZ!ded<    e"e!«      Z#ded<   dZ$ded<   dZ%ded<    G d„ d«      Z&d,d„Z'd-d„Z(d.d„Z)d/d„Z*d0d„Z+d1d„Z,d1d „Z-	 d2	 	 	 	 	 	 	 	 	 d3d!„Z.d4d"„Z/d5d#„Z0d6d$„Z1	 	 	 	 	 	 	 	 	 	 d7d%„Z2	 	 	 	 	 	 d8d&„Z3	 	 	 	 	 	 	 	 	 	 d9d'„Z4 ejj                  d(«      Z6	 	 	 	 	 	 d:d)„Z7	 	 	 	 	 	 	 	 d;d*„Z8d<d+„Z9y)=é    )ÚannotationsN)ÚCallableÚMapping)ÚdatetimeÚ	timedeltaÚtimezone)ÚTYPE_CHECKINGÚAnyÚFinalÚ	TypedDictÚcast)Ú	urlencodeÚurlparse)Úconfig)ÚStreamlitAuthError)Ú
get_logger)ÚAttrDictÚsecrets_singletonr   Ú_LOGGERc                  ó"   — e Zd ZU ded<   ded<   y)ÚProviderTokenPayloadÚstrÚproviderÚintÚexpN)Ú__name__Ú
__module__Ú__qualname__Ú__annotations__© ó    úU/var/www/pod-logistic/pod-ai/venv/lib/python3.12/site-packages/streamlit/auth_util.pyr   r   !   s   … Ø‹ØŒr!   r   i   ÚMAX_COOKIE_BYTESz; Path=/; HttpOnlyÚCOOKIE_ATTRIBUTESÚCOOKIE_ATTR_SIZEé2   ÚSIGNING_OVERHEAD_SAFETY_BUFFERé   ÚSINGLE_BYTE_BASE64_SIZEc                  ó:   — e Zd ZdZdd„Zd	d„Zd
dd„Zdd„Zdd„Zy)Ú	AuthCachezBSimple cache implementation for storing info required for Authlib.c                ó   — i | _         y ©N©Úcache©Úselfs    r"   Ú__init__zAuthCache.__init__4   s	   € Ø%'ˆ�
r!   c                ó8   — | j                   j                  |«      S r-   )r/   Úget©r1   Úkeys     r"   r4   zAuthCache.get7   s   € Ø�z‰z�~‰~˜cÓ"Ð"r!   Nc                ó"   — || j                   |<   y r-   r.   )r1   r6   ÚvalueÚ
expires_ins       r"   ÚsetzAuthCache.set<   s   € Øˆ�
‰
�3Šr!   c                ó   — | j                   S r-   r.   r0   s    r"   Úget_dictzAuthCache.get_dict?   s   € Ø�z‰zÐr!   c                ó<   — | j                   j                  |d «       y r-   )r/   Úpopr5   s     r"   ÚdeletezAuthCache.deleteB   s   € Ø�
‰
�‰�s˜DÕ!r!   )ÚreturnÚNone)r6   r   r@   r
   r-   )r6   r   r8   r
   r9   z
int | Noner@   rA   )r@   údict[str, Any])r6   r   r@   rA   )	r   r   r   Ú__doc__r2   r4   r:   r<   r?   r    r!   r"   r+   r+   1   s   „ ÙLó(ó#ô
 óô"r!   r+   c                 ó®   — 	 ddl } | j                  }t        t        t        |j                  d«      «      «      }|dk  ry	 y# t        t        f$ r Y yw xY w)zCheck if Authlib is installed.r   Nú.)é   é   é   FT)ÚauthlibÚ__version__ÚtupleÚmapr   ÚsplitÚImportErrorÚModuleNotFoundError)rI   Úauthlib_versionÚauthlib_version_tuples      r"   Úis_authlib_installedrR   F   sa   € ð	Ûà!×-Ñ-ˆÜ %¤c¬#¨×/DÑ/DÀSÓ/IÓ&JÓ KÐà  9Ò,Øð -ð øô Ô,Ð-ò Ùðús   ‚=A ÁAÁAc                 óª   — t        j                  d«      } t        j                  «       r)t        j                  d«      }|r|j	                  d| «      } | S )zEGet the cookie signing secret from the configuration or secrets.toml.zserver.cookieSecretÚauthÚcookie_secret)r   Ú
get_optionr   Úload_if_toml_existsr4   )Úsigning_secretÚauth_sections     r"   Úget_signing_secretrZ   U   sJ   € ä ×+Ñ+Ð,AÓB€NÜ×,Ñ,Ô.Ü(×,Ñ,¨VÓ4ˆÙØ)×-Ñ-¨o¸~ÓNˆNØÐr!   c            	     ó–   — t        i «      } t        j                  «       r)t        dt        j                  dt        i «      «      «      } | S )z+Get the 'auth' section of the secrets.toml.r   rT   )r   r   rW   r   r4   )rY   s    r"   Úget_secrets_auth_sectionr\   _   s;   € ä˜B“<€LÜ×,Ñ,Ô.Ü˜JÔ(9×(=Ñ(=¸fÄhÈrÃlÓ(SÓTˆàÐr!   c                 óú   — t        «       } | j                  d«      }t        |t        «      r|g}n+t        |t        «      r|D �cg c]  }t        |«      ‘Œ }}ng S t        |«      ddhz
  rt        d«      ‚|S c c}w )zïGet the expose_tokens configuration from secrets.toml.

    Returns a list of token types to expose. Accepts both string and list formats:
    - expose_tokens = "id" -> ["id"]
    - expose_tokens = ["id", "access"] -> ["id", "access"]
    Úexpose_tokensÚidÚaccesszHInvalid expose_tokens configuration. Only 'id' and 'access' are allowed.)r\   r4   Ú
isinstancer   Úlistr:   r   )rY   r^   ÚresÚtokens       r"   Úget_expose_tokens_configre   h   s€   € ô ,Ó-€LØ ×$Ñ$ _Ó5€Mä�-¤Ô%Øˆo‰Ü	�M¤4Ô	(Ø'4Ö5˜eŒs�5�zÐ5ˆÑ5àˆ	ä
ˆ3ƒx�4˜Ð"Ò"Ü ØVó
ð 	
ð €Jùò 6s   ÁA8c                óê   — d| vry| d   }d|v r.|j                  dt        t        j                  d«      «      «      }	 t	        |«      }|j                  «       S # t
        $ r t        d|› d�«      ‚w xY w)zJGet the redirect_uri from auth_section - filling in port number if needed.Úredirect_uriNz{port}zserver.portzInvalid redirect_uri: ú". Please check your configuration.)Úreplacer   r   rV   r   Ú
ValueErrorr   Úgeturl©rY   rg   Úredirect_uri_parseds      r"   Úget_redirect_urirn   �   s’   € ð ˜\Ñ)Øà$ ^Ñ4€LØ�<ÑØ#×+Ñ+Ø”cœ&×+Ñ+¨MÓ:Ó;ó
ˆð
Ü& |Ó4Ðð ×%Ñ%Ó'Ð'øô ò 
Ü Ø$ \ NÐ2TÐUó
ð 	
ð
ús   ¾A ÁA2c                 óŠ   — t        «       } | syt        | «      }|sy|j                  d«      st        j	                  d«       y|S )a6  Get the redirect_uri from secrets, validating it ends with /oauth2callback.

    This is used for logout flows where we need a validated redirect URI
    that matches the OAuth callback path.

    Returns
    -------
    str | None
        The validated redirect URI, or None if not configured or invalid.
    Nz/oauth2callbackz.Redirect URI does not end with /oauth2callback)r\   rn   Úendswithr   Úwarning)rY   rg   s     r"   Úget_validated_redirect_urirr   —   sG   € ô ,Ó-€LÙØä# LÓ1€LÙØà× Ñ Ð!2Ô3Ü�‰ÐHÔIØàÐr!   c                 ó„   — t        «       } | syt        | «      }|syt        |«      }|j                  › d|j                  › �S )z¿Extract the origin (scheme + host) from the configured redirect_uri.

    Returns
    -------
    str | None
        The origin in format "scheme://host:port", or None if not configured.
    Nz://)r\   rn   r   ÚschemeÚnetlocrl   s      r"   Úget_origin_from_redirect_urirv   ±   sM   € ô ,Ó-€LÙØä# LÓ1€LÙØä" <Ó0ÐØ!×(Ñ(Ð)¨Ð-@×-GÑ-GÐ,HÐIÐIr!   c                óÔ   — ddl m} ||dœ}|r||d<   t        | «      }t         ||j                  «      «      }i |¥|¥}t        |«      }	|j                  |	¬«      j                  «       S )aÑ  Build an OIDC logout URL with the required parameters.

    Parameters
    ----------
    end_session_endpoint
        The OIDC provider's end_session_endpoint URL.
    client_id
        The OAuth client ID.
    post_logout_redirect_uri
        The URI to redirect to after logout.
    id_token
        Optional ID token to include as id_token_hint for the logout request.

    Returns
    -------
    str
        The complete logout URL with query parameters.
    r   )Ú	parse_qsl)Ú	client_idÚpost_logout_redirect_uriÚid_token_hint)Úquery)Úurllib.parserx   r   Údictr|   r   Ú_replacerk   )
Úend_session_endpointry   rz   Úid_tokenrx   Úlogout_paramsÚparsedÚexisting_paramsÚmerged_paramsÚ	new_querys
             r"   Úbuild_logout_urlr‡   Å   sx   € õ0 'ð Ø$<ñ%€Mñ
 Ø)1ˆ�oÑ&ô Ð*Ó+€FÜ™9 V§\¡\Ó2Ó3€OØ8�Ð8¨-Ð8€MÜ˜-Ó(€IØ�?‰? ˆ?Ó+×2Ñ2Ó4Ð4r!   c                ó  — 	 ddl m} ddi}| t	        j
                  t        j                  «      t        d¬«      z   d	œ}|j                  ||t        «       «      }|j                  d
«      S # t        $ r t        d«      d‚w xY w)zAReturns a signed JWT token with the provider and expiration time.r   )ÚjwtúcTo use authentication features, you need to install Authlib>=1.3.2, e.g. via `pip install Authlib`.NÚalgÚHS256rH   )Úminutes)r   r   zlatin-1)Úauthlib.joser‰   rN   r   r   Únowr   Úutcr   ÚencoderZ   Údecode)r   r‰   ÚheaderÚpayloadÚprovider_tokens        r"   Úencode_provider_tokenr–   ð   s‡   € ðÝ$ð �WÐ€FàÜ�|‰|œHŸL™LÓ)¬I¸aÔ,@Ñ@ñ€Gð  ŸJ™J v¨wÔ8JÓ8LÓM€Nà× Ñ  Ó+Ð+øô ò Ü Øuó
àð	ðús   ‚A+ Á+Bc                ó  — 	 ddl m}m}m} ddiddidœ}	 |j                  | t        «       |¬«      }|j                  «        t        d
|«      S # t        $ r t        d«      d‚w xY w# |$ r}t        d	|› �«      d‚d}~ww xY w)z-Decode the JWT token and validate the claims.r   )Ú	JoseErrorÚ	JWTClaimsr‰   rŠ   NÚ	essentialT)r   r   )Úclaims_optionszError decoding provider token: r   )
rŽ   r˜   r™   r‰   rN   r   r’   rZ   Úvalidater   )r•   r˜   r™   r‰   Úclaim_optionsr”   Úes          r"   Údecode_provider_tokenrŸ     s±   € ðß:Ñ:ð )¨$Ð/¸kÈ4Ð=PÑQ€MðRØ ŸZ™ZØÔ.Ó0Àð (ó 
ˆð 	×ÑÔô Ð&¨Ó0Ð0øô! ò Ü Øuó
àð	ðûð ò RÜ Ð#BÀ1À#Ð!FÓGÈTÐQûðRús"   ‚
A –,A' ÁA$Á'B Á,A;Á;B c           	     óÀ  — i }| j                  d«      r| j                  d«      |d<   | j                  d«      r| j                  d«      |d<   | j                  d«      r| j                  d«      |d<   | j                  d«      r6t        d| j                  dt        i «      «      «      j                  «       |d<   | j                  d«      r| j                  d«      |d<   |S )zKGenerate a default provider section for the 'auth' section of secrets.toml.ry   Úclient_secretÚserver_metadata_urlÚclient_kwargsr   r^   )r4   r   r   Úto_dict)rY   Údefault_provider_sections     r"   Ú!generate_default_provider_sectionr¦     sä   € à!ÐØ×Ñ˜Ô$Ø0<×0@Ñ0@ÀÓ0MÐ  Ñ-Ø×Ñ˜Ô(Ø4@×4DÑ4DÀ_Ó4UÐ  Ñ1Ø×ÑÐ-Ô.Ø:F×:JÑ:JØ!ó;
Ð Ð!6Ñ7ð ×Ñ˜Ô(Ü48Ø˜×(Ñ(¨¼(À2»,ÓGó5
ç
‰'‹)ð 	! Ñ1ð ×Ñ˜Ô(Ø4@×4DÑ4DÀ_Ó4UÐ  Ñ1Ø#Ð#r!   c                óð   — t        j                  |«      } |||«      }t        |«      dz   t        |«      z   t        z   }|t        kD  r%t
        j                  d|«       t        | |||«       y | ||«       y)a[  Set a cookie, splitting into multiple cookies if necessary.

    Args:
        set_single_cookie_fn: Function to set a single cookie (cookie_name, value)
        create_signed_value_fn: Function to create a signed cookie value (cookie_name, value)
        cookie_name: Name of the cookie
        value: Dictionary value to serialize and store
    rF   zNCookie size (%d bytes) exceeds browser limit. Splitting into multiple cookies.N)ÚjsonÚdumpsÚlenr%   r#   r   ÚdebugÚ_set_split_cookie)Úset_single_cookie_fnÚcreate_signed_value_fnÚcookie_namer8   Úserialized_cookie_valueÚsigned_valueÚactual_cookie_sizes          r"   Úset_cookie_with_chunksr³   .  s„   € ô #Ÿj™j¨Ó/Ðñ *¨+Ð7NÓO€Lô ˜[Ó)¨AÑ-´°LÓ0AÑAÔDTÑTÐð Ô,Ò,Ü�‰Ø\Øô	
ô 	Ø Ø"ØØ#õ		
ñ 	˜[Ð*AÕBr!   c                ó<   — d} | ||«      }t        |«      t        z
  S )a  Calculate the server's signing overhead by measuring the size difference.

    This empirically measures the overhead added by the signing function (e.g., itsdangerous
    create_signed_value) by signing a minimal test value and computing the difference.

    Args:
        create_signed_value_fn: Function to create a signed cookie value
        cookie_name: Name of the cookie (affects overhead due to length prefix)

    Returns
    -------
        The number of bytes added by signing (excluding the base64-encoded value)
    Úx)rª   r)   )r®   r¯   Ú
test_valueÚsigneds       r"   Ú_calculate_signing_overheadr¸   T  s%   € ð" €JÙ# K°Ó<€FÜˆv‹;Ô0Ñ0Ð0r!   c                ó  — t        ||«      t        z   }t        t        |«      z
  dz
  t        z
  }||z
  }|t
        k  rt        d«      ‚|dz  dz  }g }t        dt        |«      |«      D ]  }	||	|	|z    }
|j                  |
«       Œ t        |«      dk(  r | ||d   «       y | |dt        |«      › �«       t        t        |«      «      D ]  }	|› d|	dz   › �} | |||	   «       Œ t        j                  d	|t        |«      «       y)
aé  Split a large cookie value into multiple smaller cookies.

    The main cookie always exists and either contains the whole value or the chunk count.
    Additional chunks are stored as cookie_name_1, cookie_name_2, etc.

    Args:
        set_single_cookie_fn: Function to set a single cookie (cookie_name, value)
        create_signed_value_fn: Function to create a signed cookie value
        cookie_name: Name of the cookie
        value: Serialized string value to split and store
    rF   z0Not enough space available for the signed value.rG   r(   r   Nzchunks-Ú_z Split cookie '%s' into %d chunks)r¸   r'   r#   rª   r%   r)   r   ÚrangeÚappendr   Úinfo)r­   r®   r¯   r8   Úsigning_overheadÚavailable_for_signed_valueÚavailable_for_base64_valueÚ
chunk_sizeÚchunksÚiÚchunkÚ
chunk_names               r"   r¬   r¬   j  s;  € ô& 	$Ð$:¸KÓHÜ
(ñ	)ð ô 	œ3˜{Ó+Ñ+¨aÑ/Ô2BÑBð ð
 "<Ð>NÑ!NÐð
 	#Ô%<Ò<ä Ð!SÓTÐTð -¨qÑ0°QÑ6€JØ€FÜ�1”c˜%“j *Ó-ò ˆØ�a˜!˜j™.Ð)ˆØ�‰�eÕðô ˆ6ƒ{�aÒÙ˜[¨&°©)Ô4Øñ ˜¨´°F³¨}Ð&=Ô>ô ”3�v“;Óò 4ˆØ#�} A a¨!¡e WÐ-ˆ
Ù˜Z¨°©Õ3ð4ô ‡L�LØ*ØÜˆF‹õr!   s   chunks-(\d+)c                ó¤  —  | |«      }|€|S t         j                  |«      }|€|S 	 t        |j                  d«      «      }g }t        |«      D ]C  }|› d|dz   › �} | |«      }|€t        j                  d|dz   |«        y|j                  |«       ŒE dj                  |«      }	|	S # t        t
        f$ r t        j                  d|«       Y yw xY w)añ  Get a cookie, reconstructing from chunks if it was split.

    If a count cookie exists, the main cookie contains the first chunk,
    and additional chunks are in cookie_name_1, cookie_name_2, etc.
    If no count cookie exists, the main cookie contains the entire value.

    Args:
        get_single_cookie_fn: Function to get a single cookie (cookie_name) -> bytes | None
        cookie_name: Name of the cookie

    Returns
    -------
        Cookie value as bytes, or None if not found
    NrF   z#Invalid chunk count for cookie '%s'rº   z Missing chunk %d for cookie '%s'r!   )Ú_chunks_regexÚmatchr   Úgrouprj   Ú	TypeErrorr   Ú	exceptionr»   Úerrorr¼   Újoin)
Úget_single_cookie_fnr¯   Úcookie_valuerÈ   Úchunk_countrÂ   rÃ   rÅ   Úchunk_valueÚreconstructed_values
             r"   Úget_cookie_with_chunksrÓ   ®  sð   € ñ$ (¨Ó4€LØÐØÐä×Ñ Ó-€EØ€}ØÐðÜ˜%Ÿ+™+ a›.Ó)ˆð €Fä�;Óò #ˆØ#�} A a¨!¡e WÐ-ˆ
Ù*¨:Ó6ˆØÐÜ�M‰MÐ<¸aÀ!¹eÀ[ÔQÙØ�‰�kÕ"ð#ð Ÿ(™( 6Ó*ÐØÐøô! œ	Ð"ò Ü×ÑÐ?ÀÔMÙðús   §B' Â'%CÃCc                óü   —  | |«      } ||«       |€yt         j                  |«      }|€y	 t        |j                  d«      «      }t	        d|dz   «      D ]  } ||› d|› �«       Œ y# t
        t        f$ r Y yw xY w)a–  Clear a cookie and any associated chunk cookies.

    The main cookie always exists. If there are chunks, also clear
    cookie_name_1, cookie_name_2, etc., and the count cookie.

    Args:
        get_single_cookie_fn: Function to get a single cookie (cookie_name) -> bytes | None
        clear_single_cookie_fn: Function to clear a single cookie (cookie_name)
        cookie_name: Name of the cookie
    NrF   rº   )rÇ   rÈ   r   rÉ   r»   rj   rÊ   )rÎ   Úclear_single_cookie_fnr¯   rÏ   rÈ   rÐ   rÃ   s          r"   Úclear_cookie_and_chunksrÖ   Þ  s”   € ñ (¨Ó4€LÙ˜;Ô'ØÐØä×Ñ Ó-€EØ€}ØðÜ˜%Ÿ+™+ a›.Ó)ˆä�q˜+¨™/Ó*ò 	9ˆAÙ" k ]°!°A°3Ð#7Õ8ñ	9øäœ	Ð"ò ñ 	ðús   ­;A) Á)A;Á:A;c                ó8  — t        j                  «       st        d«      ‚t        j                  d«      }|€t        d«      ‚d|vrt        d«      ‚d|vrt        d«      ‚|j                  | «      }d| v rt        d	| › d
�«      ‚|€| dk(  rt	        |«      }|€| dk(  rt        d«      ‚t        d| › d�«      ‚t        |t        «      st        d| › d�«      ‚g d¢}|D �cg c]	  }||vsŒ|‘Œ }}|r&| dk(  rt        d|› d�«      ‚t        d| › d|› d�«      ‚yc c}w )z[Validate the general auth credentials and auth credentials for the given
    provider.
    z“To use authentication features you need to configure credentials for at
            least one authentication provider in `.streamlit/secrets.toml`.rT   Nrg   zˆAuthentication credentials in `.streamlit/secrets.toml` are missing the
            "redirect_uri" key. Please check your configuration.rU   z‰Authentication credentials in `.streamlit/secrets.toml` are missing the
            "cookie_secret" key. Please check your configuration.rº   zAuth provider name "zI" contains an underscore. Please use a provider name without underscores.Údefaultz�Authentication credentials in `.streamlit/secrets.toml` are missing for
                the default authentication provider. Please check your configuration.zeAuthentication credentials in `.streamlit/secrets.toml` are missing for the authentication provider "z#". Please check your configuration.zYAuthentication credentials in `.streamlit/secrets.toml` for the authentication provider "z6" must be valid TOML. Please check your configuration.)ry   r¡   r¢   z€Authentication credentials in `.streamlit/secrets.toml` for the default authentication provider are missing the following keys: rh   z"" are missing the following keys: )r   rW   r   r4   r¦   ra   r   )r   rY   Úprovider_sectionÚrequired_keysr6   Úmissing_keyss         r"   Úvalidate_auth_credentialsrÜ     sÒ  € ô ×0Ñ0Ô2Ü ðOó
ð 	
ô
 %×(Ñ(¨Ó0€LØÐÜ ðOó
ð 	
ð ˜\Ñ)Ü ðDó
ð 	
ð ˜lÑ*Ü ðEó
ð 	
ð
 $×'Ñ'¨Ó1Ðð ˆh�Ü Ø" 8 *ð ->ð ?ó
ð 	
ð
 Ð H°	Ò$9Ü<¸\ÓJÐàÐØ�yÒ Ü$ðYóð ô !ð,Ø,4¨:ð 6ðó
ð 	
ô Ð&¬Ô0Ü ð(Ø(0 zð 2"ð#ó
ð 	
ò J€MØ#0ÖP˜C°CÐ?OÒ4O’CÐP€LÐPÙØ�yÒ Ü$ðSà�.Ð BðDóð ô
 !ð(Ø(0 zÐ1SØˆnÐ>ð@ó
ð 	
ð ùò Qs   Ã	DÃ(D)r@   Úbool)r@   r   )r@   r   )r@   z	list[str])rY   r   r@   ú
str | None)r@   rÞ   r-   )
r€   r   ry   r   rz   r   r�   rÞ   r@   r   )r   r   r@   r   )r•   r   r@   r   )rY   r   r@   rB   )
r­   úCallable[[str, str], None]r®   úCallable[[str, str], bytes]r¯   r   r8   rB   r@   rA   )r®   rà   r¯   r   r@   r   )
r­   rß   r®   rà   r¯   r   r8   r   r@   rA   )rÎ   úCallable[[str], bytes | None]r¯   r   r@   zbytes | None)rÎ   rá   rÕ   zCallable[[str], None]r¯   r   r@   rA   )r   r   r@   rA   ):Ú
__future__r   r¨   ÚreÚcollections.abcr   r   r   r   r   Útypingr	   r
   r   r   r   r}   r   r   Ú	streamlitr   Ústreamlit.errorsr   Ústreamlit.loggerr   Ústreamlit.runtime.secretsr   r   r   r   r   r   r#   r$   rª   r%   r'   r)   r+   rR   rZ   r\   re   rn   rr   rv   r‡   r–   rŸ   r¦   r³   r¸   r¬   ÚcompilerÇ   rÓ   rÖ   rÜ   r    r!   r"   ú<module>rë      só  ðö #ã Û 	ß -ß 2Ñ 2ß =Õ =ß ,å Ý /Ý 'ß Aá˜HÓ%€ˆÓ %áô˜yô ð
 Ð �%Ó à/Ð �5Ó /ÙÐ/Ó0Ð �%Ó 0ð )+Ð  Ó *à!"Ð ˜Ó "÷"ñ "ó*óóóó2(ó,ó4Jð0  ð	(5Øð(5àð(5ð "ð(5ð ð	(5ð
 	ó(5óV,ó&1ó.$ð(#CØ4ð#Cà7ð#Cð ð#Cð ð	#Cð
 
ó#CðL1Ø7ð1àð1ð 	ó1ð,>Ø4ð>à7ð>ð ð>ð ð	>ð
 
ó>ðB �—
‘
Ð+Ó,€ð-Ø7ð-àð-ð ó-ð` Ø7ð à1ð ð ð ð 
ó	 ôFH
r!   