§
    ‚ŠtjžE  ã                   ór  — d Z 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
  e
¦   «         r4ddlmZmZ dd	lmZmZ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 ddlmZ ddlmZmZmZm Z m!Z!m"Z"m#Z#m$Z$m%Z% erddl&m'Z'm(Z(m)Z)m*Z*  G d„ ded¬¦  «        Z+h d£Z, ej-        e.¦  «        Z/ G d„ de¦  «        Z0dS )z�
Handler for the /v1/chat/completions endpoint.

Supports streaming (SSE via DirectStreamer) and non-streaming (JSON) responses.
é    N)ÚAsyncGenerator)ÚTYPE_CHECKINGé   )Úlogging)Úis_serve_available)ÚJSONResponseÚStreamingResponse)ÚChatCompletionÚChatCompletionMessageÚChatCompletionMessageToolCall)ÚChoice)ÚChatCompletionChunkÚChoiceDeltaÚChoiceDeltaToolCall)ÚCompletionCreateParamsStreaming)ÚCompletionUsageé   )	ÚBaseGenerateManagerÚBaseHandlerÚModalityÚReasoningTextÚ_StreamErrorÚget_reasoning_configÚget_tool_call_configÚparse_reasoningÚparse_tool_calls)ÚGenerationConfigÚPreTrainedModelÚPreTrainedTokenizerFastÚProcessorMixinc                   ó.   — e Zd ZU eed<   eed<   eed<   dS )Ú+TransformersCompletionCreateParamsStreamingÚgeneration_configÚseedÚchat_template_kwargsN)Ú__name__Ú
__module__Ú__qualname__ÚstrÚ__annotations__ÚintÚdict© ó    úf/var/www/html/CA-Chatbot/venv/lib/python3.11/site-packages/transformers/cli/serving/chat_completion.pyr"   r"   @   s3   € € € € € € ØÐÐÑØ
€I€I�IØÐÐÑÐÐr.   r"   F)Útotal>   ÚnÚuserÚaudioÚstoreÚlogprobsÚmetadataÚ	functionsÚ
modalitiesÚ
predictionÚtool_choiceÚservice_tierÚtop_logprobsÚfunction_callÚstream_optionsÚresponse_formatÚpresence_penaltyÚreasoning_effortÚweb_search_optionsÚparallel_tool_callsÚmax_completion_tokensc                   óŽ  ‡ — e Zd ZdZeZeZdede	de
ez  fd„Z	 	 d!de	ddd	d
de	dedddededz  dedz  de
fd„Z	 	 d!de	ddd	d
de	dedddededz  dedz  defd„Zd"dedddefˆ fd„Z	 	 	 d#de	de	de	de	dedz  dee         dz  de	dz  defd„Z	 	 	 	 	 	 	 	 d$de	de	dz  de	dz  de	dz  de	dz  dedz  dedz  de	dz  de	fd „Zˆ xZS )%ÚChatCompletionHandlerz|Handler for the `/v1/chat/completions` endpoint.

    Supports both streaming (SSE) and non-streaming (JSON) responses.
    ÚbodyÚ
request_idÚreturnc              ƒ   ó’  K  — |                       |¦  «         |                      |¦  «        \  }}}| j                             ||¬¦  «        }| j                             ||¦  «        }t                               d|› d|› �¦  «         | j                             ||¬¦  «        }|  	                    |d         |¦  «        }	t          d„ |	D ¦   «         ¦  «        }
i }|
rd|d<   |                     | j        ¦  «         |                     |                     d	i ¦  «        ¦  «          |j        |	fd
|                     d¦  «        |rdndd
d
|t          j        k    o|
dœ|¤Ž}|s|                     |j        ¦  «        }|                      ||j        |¬¦  «        }|r|                     ||¦  «         |                     d¦  «        rt-          ||¦  «        nd}t/          |||d         ¦  «        }|                     d¦  «        }|r|                      |||||||||¬¦	  «	        S |                      |||||||||¬¦	  «	        ƒ d{V —†S )a�  Validate the request, load the model, and dispatch to streaming or non-streaming.

        Args:
            body (`dict`): The raw JSON request body (OpenAI chat completion format).
            request_id (`str`): Unique request identifier (from header or auto-generated).

        Returns:
            `StreamingResponse | JSONResponse`: SSE stream or JSON depending on ``body["stream"]``.
        )Ú	processorz[Request received] Model: z, CB: ©Úuse_cbÚmessagesc              3   óÌ   K  — | ]_}t          |                     d ¦  «        t          ¦  «        r|                     d ¦  «        ng D ]}|                     d¦  «        dk    V — ŒŒ`dS )ÚcontentÚtypeÚvideoN)Ú
isinstanceÚgetÚlist)Ú.0ÚmsgÚcs      r/   ú	<genexpr>z7ChatCompletionHandler.handle_request.<locals>.<genexpr>€   s‰   è è € ð 
ð 
àÝ,6°s·w²w¸yÑ7IÔ7IÍ4Ñ,PÔ,PÐX�c—g’g˜iÑ(Ô(Ð(ÐVXð
ð 
ð ð �EŠE�&‰MŒM˜WÒ$ð
ð 
ð 
ð 
ð 
ð 
ð 
r.   é    Ú
num_framesr%   TÚtoolsNÚpt)Úadd_generation_promptr\   Úreturn_tensorsÚreturn_dictÚtokenizeÚload_audio_from_videoÚ	input_idsÚstream)Úgen_managerÚtool_configÚreasoning_config)Ú_validate_requestÚ_resolve_modelÚmodel_managerÚget_model_modalityÚgeneration_stateÚuse_continuous_batchingÚloggerÚwarningÚget_managerÚ"get_processor_inputs_from_messagesÚanyÚupdater%   rT   Úapply_chat_templater   Ú
MULTIMODALÚtoÚdeviceÚ_build_generation_configr#   Úinit_cbr   r   Ú
_streamingÚ_non_streaming)ÚselfrG   rH   Úmodel_idÚmodelrK   ÚmodalityrM   re   Úprocessor_inputsÚ	has_videor%   ÚinputsÚ
gen_configrf   rg   Ú	streamings                    r/   Úhandle_requestz$ChatCompletionHandler.handle_requestm   sà  è è € ð 	×Ò˜tÑ$Ô$Ð$à%)×%8Ò%8¸Ñ%>Ô%>Ñ"ˆ�%˜ØÔ%×8Ò8¸È)Ð8ÑTÔTˆØÔ&×>Ò>¸uÀhÑOÔOˆÝ�ŠÐL°HÐLÐLÀFÐLÐLÑMÔMÐMØÔ+×7Ò7¸ÈÐ7ÑPÔPˆØ×BÒBÀ4È
ÔCSÐU]Ñ^Ô^Ðåð 
ð 
à'ð
ñ 
ô 
ñ 
ô 
ˆ	ð &(ÐØð 	4Ø13Ð  Ñ.Ø×#Ò# DÔ$=Ñ>Ô>Ð>Ø×#Ò# D§H¢HÐ-CÀRÑ$HÔ$HÑIÔIÐIØ.�Ô.Øð	
à"&Ø—(’(˜7Ñ#Ô#Ø#)Ð3˜4˜4¨tØØØ"*­hÔ.AÒ"AÐ"OÀið	
ð 	
ð #ð	
ð 	
ˆð ð 	-Ø—Y’Y˜uœ|Ñ,Ô,ˆFà×2Ò2°4¸Ô9PÐY_Ð2Ñ`Ô`ˆ
àð 	3Ø×Ò  zÑ2Ô2Ð2à@DÇÂÈÑ@QÔ@QÐ[Õ*¨9°eÑ<Ô<Ð<ÐW[ˆÝ/°	¸5À&ÈÔBUÑVÔVÐà—H’H˜XÑ&Ô&ˆ	Øð 	Ø—?’?ØØØØØØØ'Ø'Ø!1ð #ñ 
ô 
ð 
ð ×,Ò,ØØØØØØØ'Ø'Ø!1ð -ñ 
ô 
ð 
ð 
ð 
ð 
ð 
ð 
ð 
r.   Nr~   r   rK   z(ProcessorMixin | PreTrainedTokenizerFastr}   r‚   rƒ   r   re   rf   rg   c
           
      ó:  ‡ ‡‡‡‡‡‡‡‡— |                      |‰|‰‰‰|	¬¦  «        \  ŠŠ|d         }
t          |
t          ¦  «        rt          |
¦  «        n|
j        d         Šdt
          t          df         fˆˆˆˆˆˆˆ ˆˆf	d„}t           |¦   «         d¬¦  «        S )	z(Stream tokens as SSE via DirectStreamer.)rH   rf   rg   rc   éÿÿÿÿrI   Nc                 óà  •	K  — 	 ‰                      ‰d‰¬¦  «        W V — d} | �s@‰                     ¦   «         ƒ d {V —†}|g}	 	 |                     ‰                     ¦   «         ¦  «         Œ(# t          j        $ r Y nw xY wg }|D ]Â}|€d}  n»t          |t          ¦  «        r9|                     d|j        › d�¦  «         d 	                    |¦  «        W V —  d S t          |t          ¦  «        r,|                     ‰                      ‰‰|¬¦  «        ¦  «         Œ—|                     ‰                      ‰‰|¬	¦  «        ¦  «         ŒÃ|rd 	                    |¦  «        W V — | �¯@d}‰rvt          ‰‰j        ‰d
         ¦  «        }|rXd}t          |¦  «        D ]F\  }}‰                      ‰‰t          |d‰› d|› �|d         |d         dœ¬¦  «        g¬¦  «        W V — ŒG‰j        d uo‰j        ‰j        k    }|rd}	n|rd}	nd}	t#          ‰‰j        ‰‰j        z   ¬¦  «        }
‰                      ‰|	‰|
¬¦  «        W V — d S # t$          t          j        f$ r ‰                     ¦   «          ‚ w xY w)NÚ	assistant)Úroler~   FTzdata: {"error": "z"}

Ú )r~   Úreasoning_content)r~   rP   ÚschemaÚfunctionÚ_tool_call_ÚnameÚ	arguments©r�   r‘   )ÚindexrQ   ÚidrŽ   )r~   Ú
tool_callsr•   ÚlengthÚstop©Úprompt_tokensÚcompletion_tokensÚtotal_tokens)Úfinish_reasonr~   Úusage)Ú_build_chunk_sserT   ÚappendÚ
get_nowaitÚasyncioÚ
QueueEmptyrS   r   rW   Újoinr   r   Úgenerated_token_idsÚ	enumerater   Úmax_new_tokensr›   r   ÚGeneratorExitÚCancelledErrorÚcancel)ÚdoneÚtextÚbatchÚ	sse_partsÚhas_tool_callsÚparsedÚiÚtcÚhit_maxrœ   r�   rƒ   Ú	input_lenr}   rK   ÚqueuerH   r|   Ústreamerrf   s              €€€€€€€€€r/   Ússe_genz1ChatCompletionHandler._streaming.<locals>.sse_gen×   s„  øè è € ðJØ×+Ò+¨J¸[ÐPXÐ+ÑYÔYÐYÐYÐYÐYà�Øñ 1Ø!&§¢¡¤Ð,Ð,Ð,Ð,Ð,Ð,�DØ!˜F�Eðð=Ø!ŸLšL¨×)9Ò)9Ñ);Ô);Ñ<Ô<Ð<ð=øå"Ô-ð ð ð Ø˜ðøøøð ,.�IØ %ð nð n˜Ø˜<Ø#'˜DØ!˜EÝ% d­LÑ9Ô9ð #Ø%×,Ò,Ð-SÀ$Ä(Ð-SÐ-SÐ-SÑTÔTÐTØ"$§'¢'¨)Ñ"4Ô"4Ð4Ð4Ð4Ð4Ø"˜F˜Få% d­MÑ:Ô:ð nØ%×,Ò,¨T×-BÒ-BÀ:ÐU]ÐquÐ-BÑ-vÔ-vÑwÔwÐwÐwà%×,Ò,¨T×-BÒ-BÀ:ÐU]ÐgkÐ-BÑ-lÔ-lÑmÔmÐmÐmà ð 1Ø Ÿgšg iÑ0Ô0Ð0Ð0Ð0Ð0ð3 ñ 1ð: "'�Øð Ý-¨i¸Ô9UÐWbÐckÔWlÑmÔm�FØð Ø)-˜Ý%.¨vÑ%6Ô%6ð ð ™E˜A˜rØ"&×"7Ò"7Ø *Ø&.å$7Ø./Ø-7Ø.8Ð+HÐ+HÀQÐ+HÐ+HØ:<¸V¼*ÐSUÐVaÔSbÐ1cÐ1cð	%&ñ %&ô %&ð,"ð #8ñ #ô #ð ð ð ð ð ð %Ô3¸4Ð?ÐvÀHÔDYÐ]gÔ]vÒDv�Ø!ð +Ø$0�M�MØð +Ø$,�M�Mà$*�MÝ'Ø"+Ø&.Ô&;Ø!*¨XÔ-BÑ!Bðñ ô �ð
 ×+Ò+ØØ"/Ø"Øð	 ,ñ ô ð ð ð ð ð ð øõ "¥7Ô#9Ð:ð ð ð ð —’Ñ!Ô!Ð!Øð	øøøs1   …=I Á)A, Á,A>Á;I Á=A>Á>AI ÃE$I É,I-ztext/event-stream©Ú
media_type)Úgenerate_streamingrS   rU   ÚlenÚshaper   r)   r	   )r|   rH   r~   rK   r}   r‚   rƒ   re   rf   rg   rc   r¶   r³   r´   rµ   s   `` `` ` `   @@@r/   rz   z ChatCompletionHandler._streaming½   sô   øøøøøøøøø€ ð &×8Ò8ØØØØØ!Ø#Ø-ð 9ñ 
ô 
‰ˆˆxð ˜;Ô'ˆ	å&0°½DÑ&AÔ&AÐZ•C˜	‘N”N�NÀyÄÐWYÔGZˆ	ðK	�~­c°4¨iÔ8ð K	ð K	ð K	ð K	ð K	ð K	ð K	ð K	ð K	ð K	ð K	ð K	ð K	ð K	õZ !  ¡¤Ð7JÐKÑKÔKÐKr.   c
              ƒ   óê  ‡K  — |                      ||||‰¬¦  «        ƒ d{V —†\  }
}}|j        duot          |¦  «        |j        k    }t          |¦  «        }t          ||||z   ¬¦  «        }d}|�4t	          |||d         ¦  «        }|rˆfd„t          |¦  «        D ¦   «         }d}|	�t          |||
|	¦  «        \  }
}|�d}n|rd}nd}t          |                      ‰|
|||||¬	¦  «        d
¬¦  «        S )z)Run generation and return a JSONResponse.)rH   Nr˜   r�   c           	      ób   •— g | ]+\  }}t          ‰› d |› �d|d         |d         dœ¬¦  «        ‘Œ,S )r�   rŽ   r�   r‘   r’   )r”   rQ   rŽ   )r   )rV   r°   r±   rH   s      €r/   ú
<listcomp>z8ChatCompletionHandler._non_streaming.<locals>.<listcomp>E  se   ø€ ð ð ð ñ ˜˜2õ 2Ø(Ð8Ð8°QÐ8Ð8Ø'Ø*,¨V¬*À2ÀkÄ?Ð!SÐ!Sðñ ô ðð ð r.   r•   r–   r—   )rœ   r�   r•   rŒ   zapplication/jsonr·   )	Úgenerate_non_streamingr¦   rº   r   r   r¥   r   r   Ú_build_completion)r|   rH   r~   rK   r}   r‚   rƒ   re   rf   rg   rP   r³   Úgenerated_idsr²   rš   r�   r•   r¯   rŒ   rœ   s    `                  r/   r{   z$ChatCompletionHandler._non_streaming(  sš  øè è € ð 3>×2TÒ2TØ�9˜f j¸Zð 3Uñ 3
ô 3
ð -
ð -
ð -
ð -
ð -
ð -
Ñ)ˆ�˜Mð Ô+°4Ð7Ðk½CÀÑ<NÔ<NÐR\ÔRkÒ<kˆÝ Ñ.Ô.ÐÝØ#Ø/Ø"Ð%6Ñ6ð
ñ 
ô 
ˆð ˆ
ØÐ"Ý% i°ÀÈHÔ@UÑVÔVˆFØð ðð ð ð õ "+¨6Ñ!2Ô!2ðñ ô �
ð !ÐØÐ'Ý)8¸ÀMÐSZÐ\lÑ)mÔ)mÑ&ˆGÐ&àÐ!Ø(ˆMˆMØð 	#Ø$ˆMˆMà"ˆMåØ×"Ò"ØØØØ+ØØ%Ø"3ð #ñ ô ð *ð
ñ 
ô 
ð 	
r.   FÚmodel_generation_configrM   c                 óÒ  •— t          ¦   «                              |||¬¦  «        }|                     d¦  «        �t          |d         ¦  «        |_        |                     d¦  «        �dt          |d         ¦  «        z   |_        |                     d¦  «        �)d„ |d                              ¦   «         D ¦   «         |_        |                     d¦  «        �|d         |_	        |S )	z�Apply Chat Completions params (``max_tokens``, ``frequency_penalty``, ``logit_bias``,
        ``stop``) on top of the base generation config.rL   Ú
max_tokensNÚfrequency_penaltyg      ð?Ú
logit_biasc                 ó6   — i | ]\  }}t          |¦  «        f|“ŒS r-   )r+   )rV   ÚkÚvs      r/   ú
<dictcomp>zBChatCompletionHandler._build_generation_config.<locals>.<dictcomp>r  s&   € Ð.cÐ.cÐ.cÁÀÀ1µ°A±´¨y¸!Ð.cÐ.cÐ.cr.   r—   )
Úsuperrx   rT   r+   r¦   ÚfloatÚrepetition_penaltyÚitemsÚsequence_biasÚstop_strings)r|   rG   rÂ   rM   r#   Ú	__class__s        €r/   rx   z.ChatCompletionHandler._build_generation_configh  sÜ   ø€ õ "™GœG×<Ò<¸TÐCZÐciÐ<ÑjÔjÐà�8Š8�LÑ!Ô!Ð-Ý/2°4¸Ô3EÑ/FÔ/FÐÔ,Ø�8Š8Ð'Ñ(Ô(Ð4Ø36½¸tÐDWÔ?XÑ9YÔ9YÑ3YÐÔ0Ø�8Š8�LÑ!Ô!Ð-Ø.cÐ.cÈÈ\ÔHZ×H`ÒH`ÑHbÔHbÐ.cÑ.cÔ.cÐÔ+Ø�8Š8�FÑÔÐ'Ø-1°&¬\ÐÔ*à Ð r.   rP   rœ   r�   r•   rŒ   c                 óè   — t          j        |d||dœ¦  «        }t          |t          t	          j        ¦   «         ¦  «        d|t          d||¬¦  «        g|¬¦  «        }	|	                     d¬¦  «        S )	aÁ  Build a non-streaming ChatCompletion response dict.

        Args:
            request_id (`str`): Unique request identifier.
            content (`str`): The generated text.
            model_id (`str`): Model ID to include in the response.
            finish_reason (`str`): Why generation stopped (``"stop"``, ``"length"``, ``"tool_calls"``).
            usage (`CompletionUsage`, *optional*): Token usage statistics.
            tool_calls (`list[dict]`, *optional*): Parsed tool calls, if any.
            reasoning_content (`str`, *optional*): Chain-of-thought content extracted from the response.

        Returns:
            `dict`: Serialized ``ChatCompletion`` ready for JSON response.
        r‰   ©rP   rŠ   r•   rŒ   zchat.completionr   )r“   Úmessagerœ   )r”   ÚcreatedÚobjectr~   Úchoicesr�   T)Úexclude_none)r   Úmodel_validater
   r+   Útimer   Ú
model_dump)
r|   rH   rP   r}   rœ   r�   r•   rŒ   rÔ   Úresults
             r/   rÀ   z'ChatCompletionHandler._build_completionz  s‡   € õ4 (Ô6Ø¨ÀJÐevÐwÐwñ
ô 
ˆõ  ØÝ�œ	™œÑ$Ô$Ø$ØÝ !¨WÀMÐRÑRÔRÐSØð
ñ 
ô 
ˆð × Ò ¨dÐ Ñ3Ô3Ð3r.   r‹   rŠ   c	           
      óè   — t          j        ||||dœ¦  «        }	t          |t          t	          j        ¦   «         ¦  «        |t          |	d|¬¦  «        g|dd¬¦  «        }
|                      |
¦  «        S )aí  Build a streaming ``ChatCompletionChunk`` and format it as an SSE ``data:`` line.

        Args:
            request_id (`str`): Unique request identifier.
            content (`str`, *optional*): Text content delta.
            model (`str`, *optional*): Model ID.
            role (`str`, *optional*): Role (only sent in the first chunk).
            finish_reason (`str`, *optional*): Set on the final chunk.
            tool_calls (`list`, *optional*): Tool call deltas.
            usage (`CompletionUsage`, *optional*): Token usage (sent with the final chunk).
            reasoning_content (`str`, *optional*): Reasoning/thinking delta (OpenAI-compatible extension).

        Returns:
            `str`: A formatted SSE event string.
        rÓ   r   )Údeltar“   rœ   r‹   zchat.completion.chunk)r”   rÕ   r~   r×   r�   Úsystem_fingerprintrÖ   )r   rÙ   r   r+   rÚ   ÚChoiceChunkÚchunk_to_sse)r|   rH   rP   r~   rŠ   rœ   r•   r�   rŒ   rÞ   Úchunks              r/   rž   z&ChatCompletionHandler._build_chunk_sse¡  s‡   € õ8 Ô*Ø¨¸ZÐ^oÐpÐpñ
ô 
ˆõ $ØÝ�œ	™œÑ$Ô$ØÝ  u°AÀ]ÐSÑSÔSÐTØØ!Ø*ð
ñ 
ô 
ˆð × Ò  Ñ'Ô'Ð'r.   )NN)F)NNN)r‹   NNNNNNN)r&   r'   r(   Ú__doc__r"   Ú_valid_params_classÚUNUSED_CHAT_COMPLETION_FIELDSÚ_unused_fieldsr,   r)   r	   r   r…   r   rz   r{   Úboolrx   r   rU   rÀ   rž   Ú__classcell__)rÑ   s   @r/   rF   rF   d   s  ø€ € € € € ðð ð
 FÐØ2€NðL¨ð L¸3ð LÐCTÐWcÑCcð Lð Lð Lð Lðr $(Ø(,ðgLð gLàðgLð !ðgLð >ð	gLð
 ðgLð ðgLð 'ðgLð )ðgLð ˜D‘[ðgLð  ™+ðgLð 
ðgLð gLð gLð gLðh $(Ø(,ð<
ð <
àð<
ð !ð<
ð >ð	<
ð
 ð<
ð ð<
ð 'ð<
ð )ð<
ð ˜D‘[ð<
ð  ™+ð<
ð 
ð<
ð <
ð <
ð <
ð@!ð !¨Tð !ÐL^ð !Ðhlð !ð !ð !ð !ð !ð !ð0 )-Ø(,Ø(,ð%4ð %4àð%4ð ð%4ð ð	%4ð
 ð%4ð  Ñ%ð%4ð ˜”J Ñ%ð%4ð  ™:ð%4ð 
ð%4ð %4ð %4ð %4ðR Ø"Ø ØØ$(Ø"&Ø(,Ø(,ð((ð ((àð((ð �t‘ð((ð �T‰zð	((ð
 �D‰jð((ð ˜T‘zð((ð ˜4‘Kð((ð  Ñ%ð((ð  ™:ð((ð 
ð((ð ((ð ((ð ((ð ((ð ((ð ((ð ((r.   rF   )1rã   r¡   rÚ   Úcollections.abcr   Útypingr   Úutilsr   Úutils.import_utilsr   Úfastapi.responsesr   r	   Úopenai.types.chatr
   r   r   Ú!openai.types.chat.chat_completionr   Ú'openai.types.chat.chat_completion_chunkr   r   r   rà   Ú*openai.types.chat.completion_create_paramsr   Úopenai.types.completion_usager   r   r   r   r   r   r   r   r   r   Útransformersr   r   r   r    r"   rå   Ú
get_loggerr&   rn   rF   r-   r.   r/   ú<module>rõ      s{  ððð ð €€€Ø €€€Ø *Ð *Ð *Ð *Ð *Ð *Ø  Ð  Ð  Ð  Ð  Ð  à Ð Ð Ð Ð Ð Ø 4Ð 4Ð 4Ð 4Ð 4Ð 4ð ÐÑÔð >ØAÐAÐAÐAÐAÐAÐAÐAðð ð ð ð ð ð ð ð ð ð
 9Ð8Ð8Ð8Ð8Ð8ðð ð ð ð ð ð ð ð ð ð
 NÐMÐMÐMÐMÐMØZÐZÐZÐZÐZÐZØ=Ð=Ð=Ð=Ð=Ð=ð
ð 
ð 
ð 
ð 
ð 
ð 
ð 
ð 
ð 
ð 
ð 
ð 
ð 
ð 
ð 
ð 
ð 
ð 
ð 
ð 
ð 
ð ð hØgÐgÐgÐgÐgÐgÐgÐgÐgÐgÐgÐgðð ð ð ð Ð2QÐY^ð ñ ô ð ð!ð !ð !Ð ð0 
ˆÔ	˜HÑ	%Ô	%€ðe(ð e(ð e(ð e(ð e(˜Kñ e(ô e(ð e(ð e(ð e(r.   