Ë
    tPêjÊM  ã                   óÂ  — U d dl Z d dlmZ d dlmZmZmZmZ d dlm	Z	m
Z
mZ d dlmZ d dlmZ d dlmZmZ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"m#Z#m$Z$m%Z% erd dl&m'Z'  e	«       Z(ee)d<    e«       Z*ee)d<    G d„ de«      Z+dddee+   fd„Z,de-de-de-fd„Z.d„ Z/e(ja                  ddg e
e«      ge%¬«       e
e«      fdefd „«       Z1e(je                  ddg e
e«      ge#¬«       e
e«      fd!e$defd"„«       Z3d#Z4ee)d$<   de5fd%„Z6de5fd&„Z7de5fd'„Z8e(js                  d(dg e
e«      ge#¬«       e
e«      fd!e"defd)„«       Z:e(js                  d*dg e
e«      ge!¬«       e
e«      fd!e defd+„«       Z;e(js                  d,dg e
e«      ge!¬«       e
e«      fd!e defd-„«       Z<e(j{                  d.dg e
e«      ge#¬«       e
e«      fdefd/„«       Z>y)0é    N)ÚMapping)ÚTYPE_CHECKINGÚFinalÚProtocolÚcast)Ú	APIRouterÚDependsÚHTTPException)Úverbose_proxy_logger)ÚSensitiveDataMasker)ÚCommonProxyErrorsÚLitellmUserRolesÚUserAPIKeyAuth)Úuser_api_key_auth)Údecrypt_value_helperÚencrypt_value_helper)Ú_user_has_admin_view)ÚConfigRepository)ÚTableActions)ÚCloudZeroExportRequestÚCloudZeroExportResponseÚCloudZeroInitRequestÚCloudZeroInitResponseÚCloudZeroSettingsUpdateÚCloudZeroSettingsView)ÚPrismaClientÚrouterÚ_sensitive_maskerc                   ó<   — e Zd ZdZedeeeef   z  dz  fd„«       Zy)Ú_CloudZeroConfigRowzSThe ``LiteLLM_Config`` row holding ``cloudzero_settings``, as this module reads it.ÚreturnNc                  ó   — y ©N© )Úselfs    úu/home/oem/CyberBrain26-unified/.venv/lib/python3.12/site-packages/litellm/proxy/spend_tracking/cloudzero_endpoints.pyÚparam_valuez_CloudZeroConfigRow.param_value-   s   € Ø=@ó    )Ú__name__Ú
__module__Ú__qualname__Ú__doc__ÚpropertyÚstrr   r'   r$   r(   r&   r    r    *   s+   „ Ù]àØ@˜S 7¨3°¨8Ñ#4Ñ4°tÑ;Ò@ó Ù@r(   r    Úprisma_clientr   r!   c                 óZ   — t        | «      j                  }t        t        t           |«      S r#   )r   Útabler   r   r    )r/   Úrepository_tables     r&   Ú_config_tabler3   1   s'   € Ü.¨}Ó=×CÑCÐÜ”Ô0Ñ1Ð3CÓDÐDr(   Úapi_keyÚconnection_idÚtimezonec              ƒ   óL  K  — ddl m} |€'t        ddt        j                  j
                  i¬«      ‚t        | «      }|||dœ}t        |«      j                  j                  dd	id	t        j                  |«      d
œdt        j                  |«      idœ¬«      ƒ d{  –—†  y7 Œ­w)zé
    Store CloudZero settings in the database with encrypted API key.

    Args:
        api_key: CloudZero API key to encrypt and store
        connection_id: CloudZero connection ID
        timezone: Timezone for date handling
    r   ©r/   Néô  Úerror©Ústatus_codeÚdetail©r4   r5   r6   Ú
param_nameÚcloudzero_settings)r?   r'   r'   )ÚcreateÚupdate)ÚwhereÚdata)Úlitellm.proxy.proxy_serverr/   r
   r   Údb_not_connected_errorÚvaluer   r   r1   ÚupsertÚjsonÚdumps)r4   r5   r6   r/   Úencrypted_api_keyr@   s         r&   Ú_set_cloudzero_settingsrL   6   s¹   è ø€ õ 9àÐÜØØÔ.×EÑE×KÑKÐLô
ð 	
ô  4°GÓ<Ðð %Ø&Øñ!Ðô ˜=Ó
)×
/Ñ
/×
6Ñ
6ØÐ1Ð2ð 3Ü#Ÿz™zÐ*<Ó=ñð %¤d§j¡jÐ1CÓ&DÐEñ
ð 7ó 	÷ 	ò 	ús   ‚BB$ÂB"ÂB$c               ƒ   ó4  K  — ddl m}  | €'t        ddt        j                  j
                  i¬«      ‚t        | «      j                  ddi¬	«      ƒ d{  –—† }|�|j                  €i S t        |j                  t        «      r|j                  }nOt        |j                  t        «      r t        j                  |j                  «      }nt        |j                  «      }|j                  d
«      }|r$t        |dd¬«      }|€t        dddi¬«      ‚||d
<   |S 7 ŒÃ­w)z¶
    Retrieve CloudZero settings from the database with decrypted API key.

    Returns:
        dict: CloudZero settings with decrypted API key, or empty dict if not configured
    r   r8   Nr9   r:   r;   r?   r@   ©rC   r4   Úcloudzero_api_key)ÚkeyÚexception_typezGFailed to decrypt CloudZero API key. Check your salt key configuration.)rE   r/   r
   r   rF   rG   r3   Ú
find_firstr'   Ú
isinstanceÚdictr.   rI   ÚloadsÚgetr   )r/   Úcloudzero_configÚsettingsrK   Údecrypted_api_keys        r&   Ú_get_cloudzero_settingsrZ   \   s#  è ø€ õ 9àÐÜØØÔ.×EÑE×KÑKÐLô
ð 	
ô
 %2°-Ó$@×$KÑ$KÐS_ÐauÐRvÐ$KÓ$w×wÐØÐÐ#3×#?Ñ#?Ð#GØˆ	ô Ð"×.Ñ.´Ô5Ø#×/Ñ/‰Ü	Ð$×0Ñ0´#Ô	6Ü—:‘:Ð.×:Ñ:Ó;‰äÐ(×4Ñ4Ó5ˆð  (Ÿ|™|¨IÓ6ÐÙÜ0Ð1BÐH[ÐlsÔtÐØÐ$ÜØØÐ!jÐkôð ð 0ˆ�Ñà€Oð/ xús   ‚ADÁDÁCDz/cloudzero/settingsÚ	CloudZero)ÚtagsÚdependenciesÚresponse_modelÚuser_api_key_dictc              ƒ   óê  K  — t        | «      s't        ddt        j                  j                  i¬«      ‚	 t        «       ƒ d{  –—† }|st        dddd¬«      S t        j                  |«      }t        |j                  d«      |j                  d«      |j                  d«      d	¬«      S 7 Œf# t        $ r}|‚d}~wt        $ r-}t        j                  d
|«       t        ddd|› �i¬«      ‚d}~ww xY w­w)a‚  
    View current CloudZero settings.

    Returns the current CloudZero configuration with the API key masked for security.
    Only the first 4 and last 4 characters of the API key are shown.
    Returns null/empty values when settings are not configured (consistent with other settings endpoints).

    Only admin users (Proxy Admin or Admin Viewer) can view CloudZero settings.
    é“  r:   r;   N)Úapi_key_maskedr5   r6   Ústatusr4   r5   r6   Ú
configuredz'Error retrieving CloudZero settings: %sr9   z'Failed to retrieve CloudZero settings: )r   r
   r   Únot_allowed_accessrG   rZ   r   r   Ú	mask_dictrV   Ú	Exceptionr   r:   )r_   rX   Úmasked_settingsÚes       r&   Úget_cloudzero_settingsrj   …   s  è ø€ ô&  Ð 1Ô2ÜØØÔ.×AÑA×GÑGÐHô
ð 	
ð

ä 7Ó 9×9ˆñ Ü(Ø#Ø"ØØô	ð ô "3×!<Ñ!<¸XÓ!Fˆä$Ø*×.Ñ.¨yÓ9Ø"Ÿ,™, Ó7Ø—\‘\ *Ó-Øô	
ð 	
ð :ùô* ò àˆûÜò 
Ü×"Ñ"Ð#LÈaÔPÜØØÐFÀqÀcÐJÐKô
ð 	
ûð
üsS   ‚3C3¶B, ÁB*ÁB, ÁC3ÁAB, Â)C3Â*B, Â,	C0Â5B7Â7C0Ã(C+Ã+C0Ã0C3Úrequestc              ƒ   ó  K  — |j                   t        j                  k7  r't        ddt        j
                  j                  i¬«      ‚t        | j                  | j                  | j                  g«      st        dddi¬«      ‚	 t        «       ƒ d{  –—† }| j                  �| j                  n|d   }| j                  �| j                  n|d   }| j                  �| j                  n|d	   }t        |||¬
«      ƒ d{  –—†  t        j                  d«       t        dd¬«      S 7 Œ“7 Œ(# t        $ r%}|j                   dk(  rt        dddi¬«      ‚|‚d}~wt"        $ r-}t        j$                  d|«       t        ddd|› �i¬«      ‚d}~ww xY w­w)aå  
    Update existing CloudZero settings.

    Allows updating individual CloudZero configuration fields without requiring all fields.
    Only provided fields will be updated; others will remain unchanged.

    Parameters:
    - api_key: (Optional) New CloudZero API key for authentication
    - connection_id: (Optional) New CloudZero connection ID for data submission
    - timezone: (Optional) New timezone for date handling

    Only admin users can update CloudZero settings.
    ra   r:   r;   i�  z.At least one field must be provided for updateNr4   r5   r6   r>   z'CloudZero settings updated successfullyÚsuccess©Úmessagerc   é”  zTCloudZero settings not found. Please initialize settings first using /cloudzero/initz%Error updating CloudZero settings: %sr9   z%Failed to update CloudZero settings: )Ú	user_roler   ÚPROXY_ADMINr
   r   re   rG   Úanyr4   r5   r6   rZ   rL   r   Úinfor   r<   rg   r:   )rk   r_   Úcurrent_settingsÚupdated_api_keyÚupdated_connection_idÚupdated_timezoneri   s          r&   Úupdate_cloudzero_settingsry   À   s°  è ø€ ð0 ×"Ñ"Ô&6×&BÑ&BÒBÜØØÔ.×AÑA×GÑGÐHô
ð 	
ô �—‘ ×!6Ñ!6¸×8HÑ8HÐIÔJÜØØÐMÐNô
ð 	
ð
%
ä(?Ó(A×"AÐð 5<·O±OÐ4O §¢ÐUeÐfoÑUpˆà%,×%:Ñ%:Ð%FˆG×!Ò!ÐL\Ð]lÑLmð 	ð 7>×6FÑ6FÐ6R '×"2Ò"2ÐXhÐisÑXtÐô &Ø#Ø/Ø%ô
÷ 	
ð 	
ô 	×!Ñ!Ð"KÔLä$Ð-VÐ_hÔiÐið% #Bøð	
ùô ò 	Ø�=‰=˜CÒäØàÐsðôð ð ˆûÜò 
Ü×"Ñ"Ð#JÈAÔNÜØØÐDÀQÀCÐHÐIô
ð 	
ûð
üs[   ‚B FÂD( ÂD$ÂA,D( Ã=D&Ã>%D( Ä#FÄ$D( Ä&D( Ä(	F
Ä1 EÅF
Å(FÆF
Æ
FFÚ%_cloudzero_background_job_initializedc               ƒ   óì   K  — 	 ddl m}  | €yt        | «      j                  ddi¬«      ƒ d{  –—† }|duxr |j                  duS 7 Œ# t
        $ r }t        j                  d|«       Y d}~yd}~ww xY w­w)	a  
    Check if CloudZero is setup in the database.

    CloudZero is considered setup in the database if:
    - CloudZero settings exist in the database
    - The settings have a non-None value

    Returns:
        bool: True if CloudZero is active, False otherwise
    r   r8   NFr?   r@   rN   z#Error checking CloudZero status: %s)rE   r/   r3   rR   r'   rg   r   r:   )r/   rW   ri   s      r&   Úis_cloudzero_setup_in_dbr|     sŒ   è ø€ ðÝ<àÐ Øô )6°mÓ(D×(OÑ(OØÐ!5Ð6ð )Pó )
÷ #
Ðð
   tÐ+ÒXÐ0@×0LÑ0LÐTXÐ0XÐXð#
ùô ò Ü×"Ñ"Ð#HÈ!ÔLÜûðüsH   ‚A4„A ŒA4� A ­A®A ÁA4ÁA Á	A1ÁA,Á'A4Á,A1Á1A4c                  ó&   — ddl } d| j                  v S )a	  
    Check if CloudZero is setup in config.yaml or environment variables.

    CloudZero is considered setup in config if:
    - "cloudzero" is in the callbacks list in config.yaml, OR
    Returns:
        bool: True if CloudZero is configured, False otherwise
    r   NÚ	cloudzero)ÚlitellmÚ	callbacks)r   s    r&   Úis_cloudzero_setup_in_configr�   /  s   € ó à˜'×+Ñ+Ð+Ð+r(   c               ƒ   ó¦   K  — 	 t        «       ryt        «       ƒ d{  –—† ryy7 Œ# t        $ r } t        j                  d| «       Y d} ~ yd} ~ ww xY w­w)aj  
    Check if CloudZero is setup in either config.yaml/env vars OR database.

    CloudZero is considered setup if:
    - CloudZero is configured in config.yaml callbacks, OR
    - CloudZero environment variables are set, OR
    - CloudZero settings exist in the database

    Returns:
        bool: True if CloudZero is configured anywhere, False otherwise
    TNFz"Error checking CloudZero setup: %s)r�   r|   rg   r   r:   )ri   s    r&   Úis_cloudzero_setuprƒ   =  sR   è ø€ ðä'Ô)Øô *Ó+×+Ð+Øàð ,ùô
 ò Ü×"Ñ"Ð#GÈÔKÜûðüs?   ‚A„
% ŽA�% œ#�% ¡A£% ¥	A®A	ÁAÁ	AÁAz/cloudzero/initc              ƒ   ó¶  K  — |j                   t        j                  k7  r't        ddt        j
                  j                  i¬«      ‚	 t        | j                  | j                  | j                  ¬«      ƒ d{  –—†  t        j                  d«       t        dd¬«      S 7 Œ&# t        $ r-}t        j                  d	|«       t        d
dd|› �i¬«      ‚d}~ww xY w­w)aÐ  
    Initialize CloudZero settings and store in the database.

    This endpoint stores the CloudZero API key, connection ID, and timezone configuration
    in the proxy database for use by the CloudZero logger.

    Parameters:
    - api_key: CloudZero API key for authentication
    - connection_id: CloudZero connection ID for data submission
    - timezone: Timezone for date handling (default: UTC)

    Only admin users can configure CloudZero settings.
    ra   r:   r;   r>   Nz+CloudZero settings initialized successfullyrm   rn   z)Error initializing CloudZero settings: %sr9   z)Failed to initialize CloudZero settings: )rq   r   rr   r
   r   re   rG   rL   r4   r5   r6   r   rt   r   rg   r:   )rk   r_   ri   s      r&   Úinit_cloudzero_settingsr…   Y  sÚ   è ø€ ð0 ×"Ñ"Ô&6×&BÑ&BÒBÜØØÔ.×AÑA×GÑGÐHô
ð 	
ð

ä%Ø—O‘OØ!×/Ñ/Ø×%Ñ%ô
÷ 	
ð 	
ô 	×!Ñ!Ð"OÔPä$Ð-ZÐclÔmÐmð	
ùô ò 
Ü×"Ñ"Ð#NÐPQÔRÜØØÐHÈÈÐLÐMô
ð 	
ûð
üs<   ‚ACÁ/B  Á7BÁ8%B  ÂCÂB  Â 	CÂ)(CÃCÃCz/cloudzero/dry-runc              ƒ   óä  K  — |j                   t        j                  k7  r't        ddt        j
                  j                  i¬«      ‚	 ddlm}  |«       }|j                  | j                  ¬«      ƒ d{  –—† }t        j                  d«       t        d	d
||r|j                  d«      ¬«      S d¬«      S 7 Œ@# t        $ r-}t        j                   d|«       t        ddd|› �i¬«      ‚d}~ww xY w­w)aO  
    Perform a dry run export using the CloudZero logger.

    This endpoint uses the CloudZero logger to perform a dry run export,
    which returns the data that would be exported without actually sending it to CloudZero.

    Parameters:
    - limit: Optional limit on number of records to process (default: 10000)

    Returns:
    - usage_data: Sample of the raw usage data (first 50 records)
    - cbf_data: CloudZero CBF formatted data ready for export
    - summary: Statistics including total cost, tokens, and record counts

    Only admin users can perform CloudZero exports.
    ra   r:   r;   r   ©ÚCloudZeroLogger)ÚlimitNz/CloudZero dry run export completed successfullyz0CloudZero dry run export completed successfully.rm   Úsummary©ro   rc   Údry_run_datarŠ   z-Error performing CloudZero dry run export: %sr9   z,Failed to perform CloudZero dry run export: )rq   r   rr   r
   r   re   rG   Ú(litellm.integrations.cloudzero.cloudzerorˆ   Údry_run_export_usage_datar‰   r   rt   r   rV   rg   r:   )rk   r_   rˆ   ÚloggerÚdry_run_resultri   s         r&   Úcloudzero_dry_run_exportr‘   ‹  sý   è ø€ ð6 ×"Ñ"Ô&6×&BÑ&BÒBÜØØÔ.×AÑA×GÑGÐHô
ð 	
ð

åLñ (Ó)ˆØ&,×&FÑ&FÈWÏ]É]Ð&FÓ&[× [ˆä×!Ñ!Ð"SÔTä&ØFØØ'Ù5C�N×&Ñ& yÓ1ô	
ð 	
ð JNô	
ð 	
ð	 !\ùô ò 
Ü×"Ñ"Ð#RÐTUÔVÜØØÐKÈAÈ3ÐOÐPô
ð 	
ûð
üsH   ‚AC0Á,B7 Á4B5Á58B7 Â-C0Â.B7 Â4C0Â5B7 Â7	C-Ã (C(Ã(C-Ã-C0z/cloudzero/exportc              ƒ   ó€  K  — |j                   t        j                  k7  r't        ddt        j
                  j                  i¬«      ‚	 t        «       ƒ d{  –—† }ddlm	}  ||j                  d«      |j                  d«      |j                  d	«      ¬
«      }|j                  | j                  | j                  | j                  | j                  ¬«      ƒ d{  –—†  t!        j"                  d«       t%        dddd¬«      S 7 Œ«7 Œ*# t&        $ r-}t!        j(                  d|«       t        ddd|› �i¬«      ‚d}~ww xY w­w)a|  
    Perform an actual export using the CloudZero logger.

    This endpoint uses the CloudZero logger to export usage data to CloudZero AnyCost API.

    Parameters:
    - limit: Optional limit on number of records to export
    - operation: CloudZero operation type ("replace_hourly" or "sum", default: "replace_hourly")

    Only admin users can perform CloudZero exports.
    ra   r:   r;   Nr   r‡   r4   r5   r6   r>   )r‰   Ú	operationÚstart_time_utcÚend_time_utcz'CloudZero export completed successfullyrm   r‹   z%Error performing CloudZero export: %sr9   z$Failed to perform CloudZero export: )rq   r   rr   r
   r   re   rG   rZ   r�   rˆ   rV   Úexport_usage_datar‰   r“   r”   r•   r   rt   r   rg   r:   )rk   r_   rX   rˆ   r�   ri   s         r&   Úcloudzero_exportr—   Å  s@  è ø€ ð, ×"Ñ"Ô&6×&BÑ&BÒBÜØØÔ.×AÑA×GÑGÐHô
ð 	
ð
"
ä 7Ó 9×9ˆõ 	Mñ (Ø—L‘L Ó+Ø"Ÿ,™, Ó7Ø—\‘\ *Ó-ô
ˆð
 ×&Ñ&Ø—-‘-Ø×'Ñ'Ø"×1Ñ1Ø ×-Ñ-ð	 'ó 
÷ 	
ð 	
ô 	×!Ñ!Ð"KÔLä&Ø=ØØØô	
ð 	
ð) :øð	
ùô  ò 
Ü×"Ñ"Ð#JÈAÔNÜØØÐCÀAÀ3ÐGÐHô
ð 	
ûð
üsO   ‚AD>ÁD ÁDÁBD ÃDÃ'D Ä D>ÄD ÄD Ä	D;Ä(D6Ä6D;Ä;D>z/cloudzero/deletec              ƒ   ó–  K  — | j                   t        j                  k7  r't        ddt        j
                  j                  i¬«      ‚	 ddlm} |€'t        ddt        j                  j                  i¬«      ‚t        |«      j                  dd	i¬
«      ƒ d{  –—† }|€t        dddi¬«      ‚t        |«      j                  j                  dd	i¬
«      ƒ d{  –—†  t        j                   d«       t#        dd¬«      S 7 Œf7 Œ(# t        $ r}|‚d}~wt$        $ r-}t        j&                  d|«       t        ddd|› �i¬«      ‚d}~ww xY w­w)a[  
    Delete CloudZero settings from the database.

    This endpoint removes the CloudZero configuration (API key, connection ID, timezone)
    from the proxy database. Only the CloudZero settings entry will be deleted;
    other configuration values in the database will remain unchanged.

    Only admin users can delete CloudZero settings.
    ra   r:   r;   r   r8   Nr9   r?   r@   rN   rp   zCloudZero settings not foundz'CloudZero settings deleted successfullyrm   rn   z%Error deleting CloudZero settings: %sz%Failed to delete CloudZero settings: )rq   r   rr   r
   r   re   rG   rE   r/   rF   r3   rR   r   r1   Údeleter   rt   r   rg   r:   )r_   r/   rW   ri   s       r&   Údelete_cloudzero_settingsrš     sf  è ø€ ð& ×"Ñ"Ô&6×&BÑ&BÒBÜØØÔ.×AÑA×GÑGÐHô
ð 	
ð
#
Ý<àÐ ÜØØÔ!2×!IÑ!I×!OÑ!OÐPôð ô )6°mÓ(D×(OÑ(OØÐ!5Ð6ð )Pó )
÷ #
Ðð Ð#ÜØØÐ!?Ð@ôð ô ˜}Ó-×3Ñ3×:Ñ:À,ÐPdÐAeÐ:Óf×fÐfä×!Ñ!Ð"KÔLä$Ð-VÐ_hÔiÐið!#
øð 	gùô ò ØˆûÜò 
Ü×"Ñ"Ð#JÈAÔNÜØØÐDÀQÀCÐHÐIô
ð 	
ûð
üs[   ‚AE	ÁAD ÂC>Â?D ÃD Ã%D Ã=E	Ã>D Ä D Ä	EÄDÄEÄ(EÅEÅE	)?rI   Úcollections.abcr   Útypingr   r   r   r   Úfastapir   r	   r
   Úlitellm._loggingr   Ú0litellm.litellm_core_utils.sensitive_data_maskerr   Úlitellm.proxy._typesr   r   r   Ú$litellm.proxy.auth.user_api_key_authr   Ú0litellm.proxy.common_utils.encrypt_decrypt_utilsr   r   Ú/litellm.proxy.management_endpoints.common_utilsr   Ú&litellm.repositories.config_repositoryr   Ú%litellm.repositories.prisma_protocolsr   Ú'litellm.types.proxy.cloudzero_endpointsr   r   r   r   r   r   rE   r   r   Ú__annotations__r   r    r3   r.   rL   rZ   rV   rj   Úputry   rz   Úboolr|   r�   rƒ   Úpostr…   r‘   r—   r™   rš   r$   r(   r&   ú<module>r«      sØ  ðÜ Ý #÷ó ÷ 6Ñ 5å 1Ý Pß TÑ TÝ B÷õ QÝ CÝ >÷÷ ñ Ý7á“€ˆÓ ñ /Ó0Ð �5Ó 0ôA˜(ô AðE ð E°LÐATÑ4Uó Eð
#¨3ð #¸sð #Ècó #òL&ðR ‡�ØØ
ˆÙÐ+Ó,Ð-Ø(ð	 ó ñ )0Ð0AÓ(Bñ2
Ø%ò2
óð2
ðj ‡�ØØ
ˆÙÐ+Ó,Ð-Ø(ð	 ó ñ )0Ð0AÓ(BñD
Ø$ðD
à%òD
óðD
ðP 05Ð % uÓ 4ð¨ó ð<, dó ,ð $ó ð8 ‡�ØØ
ˆÙÐ+Ó,Ð-Ø(ð	 ó ñ )0Ð0AÓ(Bñ)
Ø!ð)
à%ò)
óð)
ðX ‡�ØØ
ˆÙÐ+Ó,Ð-Ø*ð	 ó ñ )0Ð0AÓ(Bñ1
Ø#ð1
à%ò1
óð1
ðh ‡�ØØ
ˆÙÐ+Ó,Ð-Ø*ð	 ó ñ )0Ð0AÓ(Bñ8
Ø#ð8
à%ò8
óð8
ðv ‡�ØØ
ˆÙÐ+Ó,Ð-Ø(ð	 ó ñ )0Ð0AÓ(Bñ6
Ø%ò6
óñ6
r(   