Ë
    ÛJêjŽ)  ã                   óº  — d Z ddlZddl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	m
Z
 ddlmZmZ  ej                  ej                  d¬«        ej                   d«      Zej$                  j'                  dd	«      Zej$                  j'                  d
d«      Zej$                  j'                  dd«      Z eej$                  j'                  dd«      «      Zej$                  j'                  dd«      Z e	«       Zej'                  d«      d„ «       Zej'                  d«      d„ «       Zej;                  d«      de
fd„«       Z G d„ d«      Zej;                  d«      de
fd„«       Z  G d„ d«      Z!ej;                  d«      de
fd „«       Z"ej;                  d«      de
fd!„«       Z#ej;                  d"«      de
fd#„«       Z$e%d$k(  rddl&Z& e&jN                  eeed%¬&«       yy)'u)  
llama_cpp_server_proxy.py â€” Proxy llama.cpp API server on port 8080.

Proxies to Ollama running on port 11434. Provides OpenAI-compatible API
endpoints expected by LlamaCppClient in CyberBrain26.

Install dependencies: pip install fastapi uvicorn httpx
Run: python3 ./llama_cpp_server_proxy.py
é    N)ÚFastAPIÚRequest)ÚJSONResponseÚStreamingResponsez0%(asctime)s %(levelname)s [%(name)s] %(message)s)ÚlevelÚformatÚllama_cpp_server_proxyÚOLLAMA_BASE_URLzhttp://127.0.0.1:11434ÚPRIMARY_MODELzphi3.5:latestÚFALLBACK_MODELzdolphin-cb26:latestÚLLM_PROXY_PORTÚ8080ÚLLM_PROXY_HOSTz	127.0.0.1ú/c               ƒ   óD   K  — t         j                  dt        t        dœS ­w)Nzllama.cpp proxy)ÚosÚarchÚmodelÚport)ÚsysÚplatformr   ÚPORT© ó    ú8/home/oem/CyberBrain26-unified/llama_cpp_server_proxy.pyÚrootr   !   s"   è ø€ ô �l‰lØ!ÜÜñ	ð ùs   ‚ z/api/tokenizec            	   ƒ   ón  K  — 	 t        j                  d¬«      4 ƒd {  –—† } | j                  t        › d�«      ƒ d {  –—† }|j                  dk(  ru|j                  «       }g }|j                  dg «      D ]9  }|j                  |d   |j                  di «      j                  dd	«      d
œ«       Œ; d|icd d d «      ƒd {  –—†  S d d d «      ƒd {  –—†  g ddœS 7 Œ½7 ŒŸ7 Œ7 Œ# 1 ƒd {  –—†7  sw Y   ŒxY w# t        $ r0}t        j                  d|› �«       g t        |«      dœcY d }~S d }~ww xY w­w)Né   ©Útimeoutz	/api/tagséÈ   ÚmodelsÚnameÚdetailsÚcontext_lengthr   )r   r%   Úerror)r"   Úmessagezlist_models error: )ÚhttpxÚAsyncClientÚgetr
   Ústatus_codeÚjsonÚappendÚ	ExceptionÚlogr&   Ústr)ÚclientÚrespÚdataÚ
model_infoÚmÚes         r   Úlist_modelsr7   +   s6  è ø€ ð1Ü×$Ñ$¨RÔ0÷ 
	.ð 
	.°FØŸ™¤Ð&7°yÐ$AÓB×BˆDØ×Ñ 3Ò&Ø—y‘y“{�Ø�
ØŸ™ (¨BÓ/ò �AØ×%Ñ%Ø!" 6¡Ø*+¯%©%°	¸2Ó*>×*BÑ*BÐCSÐUVÓ*Wñ'õ ðð
 ! *Ð-÷
	.÷ 
	.÷ 
	.÷ 
	.ñ 
	.ð ¨Ñ1Ð1ð
	.øØBøð
	.øð 
	.ø÷ 
	.÷ 
	.ñ 
	.ûô ò 1Ü�	‰	Ð'¨ sÐ+Ô,Ø¬¨Q«Ñ0Õ0ûð1üs¨   ‚D5„C9 žCŸC9 ¢C$¾C¿A6C$Â5C9 ÃC ÃC9 ÃD5ÃC9 ÃC"ÃC9 ÃD5ÃC9 ÃC$Ã C9 Ã"C9 Ã$C6Ã*C-Ã+C6Ã2C9 Ã9	D2Ä%D-Ä'D2Ä(D5Ä-D2Ä2D5ú	/api/chatÚrequestc              ƒ   ó  K  — | j                   j                  dd«      j                  d«      r| j                  «       ƒ d {  –—† ni }|j                  d«      xs t        }|j                  dg «      }|j                  dd«      }|j                  di «      }d}	 t        j                  d	¬
«      4 ƒd {  –—† }|j                  t        › d�d|i¬«      ƒ d {  –—† }|j                  dv }d d d «      ƒd {  –—†  |s.dt        vrt        n|}
t        j                  d|› d|
› d�«       |
}||||dœ}	 t        j                  d¬
«      4 ƒd {  –—† }|r&t        t!        ||«      «      cd d d «      ƒd {  –—†  S |j                  t        › d�|¬«      ƒ d {  –—† }|j                  dk(  �r |j                  «       }t#        |j                  d«      t$        «      r"|j                  di «      j                  dd«      nt'        |j                  dd«      «      }dt)        t+        j*                  «       «      › �dt)        t+        j*                  «       «      |dd|dœdd œgt-        d!„ |D «       «      t/        |«      t-        d"„ |D «       «      t/        |«      z   d#œd$œcd d d «      ƒd {  –—†  S t1        d%d&|j                  › d'|j2                  › �id(¬)«      cd d d «      ƒd {  –—†  S 7 �Œ¥7 �Œ57 �Œ7 �Œù# 1 ƒd {  –—†7  sw Y   �Œ
xY w# t
        j                  $ r#}	t        j                  d|	› �«       Y d }	~	�Œ>d }	~	ww xY w7 �Œô7 �ŒÐ7 �Œ°7 Œ£7 Œk# 1 ƒd {  –—†7  sw Y   y xY w# t
        j                  $ rH}	t        j5                  d*|	› �«       t1        d%d+|	j6                  j8                  › �id(¬)«      cY d }	~	S d }	~	wt:        $ r:}	t        j5                  d,|	› �«       t1        d%t'        |	«      id(¬)«      cY d }	~	S d }	~	ww xY w­w)-Núcontent-typeÚ úapplication/jsonr   ÚmessagesÚstreamFÚoptionsr   r   z	/api/showr#   ©r,   )r!   z Primary model check HTTP error: ú:zPrimary model 'z ' unavailable, falling back to 'ú')r   r>   r?   r@   éX  r8   r!   r'   Úcontentz	chatcmpl-zchat.completionr   Ú	assistant)ÚrolerE   Ústop)Úindexr'   Úfinish_reasonc              3   óR   K  — | ]  }t        |j                  d d«      «      –— Œ! y­w©rE   r<   N©Úlenr*   ©Ú.0Úmsgs     r   ú	<genexpr>z#chat_completions.<locals>.<genexpr>k   s!   è ø€ Ò0aÐQT´°S·W±W¸YÈÓ5K×1LÑ0aùó   ‚%'c              3   óR   K  — | ]  }t        |j                  d d«      «      –— Œ! y­wrL   rM   rO   s     r   rR   z#chat_completions.<locals>.<genexpr>m   s!   è ø€ Ò/`ÐPS´°C·G±G¸IÀrÓ4J×0KÑ/`ùrS   )Úprompt_tokensÚcompletion_tokensÚtotal_tokens)ÚidÚobjectÚcreatedr   ÚchoicesÚusager&   úOllama error ú: éô  ©r+   zchat HTTP error: z
chat http zchat error: )Úheadersr*   Ú
startswithr,   r   r(   r)   Úpostr
   r+   Ú	HTTPErrorr/   Úwarningr   Úinfor   ÚStreamChatIteratorÚ
isinstanceÚdictr0   ÚintÚtimeÚsumrN   r   Útextr&   Ú	__class__Ú__name__r.   )r9   Úbodyr   r>   r?   r@   Ú
primary_okr1   r2   r6   Úfallbackr3   r[   s                r   Úchat_completionsrs   ?   sä  è ø€ à#*§?¡?×#6Ñ#6°~ÀrÓ#J×#UÑ#UÐVhÔ#i�—‘“×ÐÐoq€DØ�H‰H�WÓÒ.¤€EØ�x‰x˜
 BÓ'€HØ�X‰X�h Ó&€FØ�h‰h�y "Ó%€Gð €Jð<Ü×$Ñ$¨RÔ0÷ 	4ð 	4°FØŸ™¬Ð'8¸	Ð%BÈ&ÐRWÈ˜ÓY×YˆDØ×)Ñ)¨VÐ3ˆJ÷	4÷ 	4ñ
 Ø%(´Ñ%>•>ÀEˆÜ�‰�? 5 'Ð)IÈ(ÈÐSTÐUÔVØˆð ØØØñ	€Dð@Ü×$Ñ$¨SÔ1÷ 	uð 	u°VÙÜ(Ô);¸FÀDÓ)IÓJ÷	u÷ 	uñ 	uð $Ÿ[™[¬OÐ+<¸IÐ)FÈT˜[ÓR×R�Ø×#Ñ# sÓ*ØŸ9™9›;�DÜLVÐW[×W_ÑW_Ð`iÓWjÔlpÔLq˜dŸh™h y°"Ó5×9Ñ9¸)ÀRÔHÔwzÐ{÷  |Dñ  |Dð  ENð  PRó  |Só  xT�Gà )¬#¬d¯i©i«kÓ*:Ð);Ð<Ø"3Ü#&¤t§y¡y£{Ó#3Ø!&Ø./À[Ð]dÑ<eÐx~Ñ$ð  $Aä-0Ñ0aÐX`Ô0aÓ-aÜ14°W³Ü,/Ñ/`ÐW_Ô/`Ó,`ÔcfÐgnÓcoÑ,oñ"ñ÷	u÷ 	uñ 	uô* (¨°MÀ$×BRÑBRÐASÐSUÐVZ×V_ÑV_ÐU`Ð2aÐ(bÐpsÔt÷+	u÷ 	uñ 	uð7  ùð	4ùØYùð	4ù÷ 	4÷ 	4ò 	4ûô �?‰?ò <Ü�‰Ð6°q°cÐ:×;Ò;ûð<úð	uùð 	uùð Sùð		uøð 	uø÷ 	u÷ 	uñ 	uûô, �?‰?ò ]Ü�	‰	Ð% a SÐ)Ô*Ü˜W¨
°1·;±;×3GÑ3GÐ2HÐ&IÐJÐX[Ô\Õ\ûÜò @Ü�	‰	�L  Ð$Ô%Ü˜W¤c¨!£fÐ-¸3Ô?Õ?ûð@üs�  ‚?PÁK&ÁAPÂL Â4K)Â5L Â8 K2ÃK,ÃK2Ã+L Ã6K/Ã7L Ã;7PÄ3M# ÅMÅM# ÅMÅ(M# Å4MÅ5M# Å9PÅ:MÆMÆDMÊM# Ê&M
Ê'M# Ê+PÊ,(MËM# Ë MË!M# Ë%PË)L Ë,K2Ë/L Ë2LË8K;Ë9LÌ L ÌL>ÌL9Ì3PÌ9L>Ì>PÍM# ÍM# ÍMÍ
M# ÍM# ÍM ÍMÍM ÍM# ÍPÍ M# Í#O?Í6=N9Î3O?Î4PÎ9O?Ï/O:Ï4O?Ï5PÏ:O?Ï?Pc                   ó   — e Zd Zd„ Zd„ Zy)rg   c                 ó    — || _         || _        y ©N)r1   rp   )Úselfr1   rp   s      r   Ú__init__zStreamChatIterator.__init__{   s   € ØˆŒØˆ�	r   c                ó  K  — d}| j                   j                  t        › |› �| j                  ¬«      ƒ d {  –—† }|j	                  «       D ]–  }|j                  «       }|r"|j                  d«      r|j                  d«      sŒ8	 t        j                  |«      }|j                  dd«      |j                  di «      j                  dd«      |j                  d	d
«      dœ­–— Œ˜ y 7 Œ®# t        j                  $ r Y Œ±w xY w­w)Nr8   rA   ú{ú}r   r<   r'   rE   ÚdoneF)r   rE   r|   )r1   rc   r
   rp   Ú
iter_linesÚstriprb   Úendswithr,   Úloadsr*   ÚJSONDecodeError)rw   Úrequest_urlÚresponseÚlineÚchunks        r   Ú__iter__zStreamChatIterator.__iter__   s  è ø€ Ø!ˆØŸ™×)Ñ)¬_Ð,=¸k¸]Ð*KÐRV×R[ÑR[Ð)Ó\×\ˆØ×'Ñ'Ó)ò 	ˆDØ—:‘:“<ˆDÙ˜tŸ™¨sÔ3¸4¿=¹=ÈÔ;MØðÜŸ
™
 4Ó(�Ø %§	¡	¨'°2Ó 6À5Ç9Á9ÈYÐXZÓC[×C_ÑC_Ð`iÐkmÓCnÐx}÷  yBñ  yBð  CIð  KPó  yQñ  Rô  Rñ	ð ]ùô ×'Ñ'ò Ùðüs5   ‚5D·C&¸ADÂAC(Ã#DÃ(C>Ã;DÃ=C>Ã>DN©ro   Ú
__module__Ú__qualname__rx   r†   r   r   r   rg   rg   z   s   „ òór   rg   z/api/completionc           
   ƒ   ó  K  — | j                   j                  dd«      j                  d«      r| j                  «       ƒ d {  –—† ni }|j                  d«      xs t        }|j                  dd«      }|j                  dd«      }|j                  di «      }	 t        j                  d	¬
«      4 ƒd {  –—† }|r(t        t        ||||«      «      cd d d «      ƒd {  –—†  S |j                  t        › d�||ddœ|¥¬«      ƒ d {  –—† }|j                  dk(  rw|j                  «       }dt        t        j                  «       «      › �dt        t        j                  «       «      |d|j                  dd«      ddœgdœcd d d «      ƒd {  –—†  S t        dd|j                  › d|j                  › �id¬«      cd d d «      ƒd {  –—†  S 7 �Œˆ7 �Œ7 Œó7 ŒÌ7 ŒI7 Œ# 1 ƒd {  –—†7  sw Y   y xY w# t
        j                   $ rH}	t"        j%                  d|	› �«       t        dd|	j&                  j(                  › �id¬«      cY d }	~	S d }	~	wt*        $ r:}	t"        j%                  d|	› �«       t        dt-        |	«      id¬«      cY d }	~	S d }	~	ww xY w­w)Nr;   r<   r=   r   Úpromptr?   Fr@   rD   r   ú/api/generate©r   r‹   r?   rA   r!   zcmpl-Útext_completionr   rƒ   rH   )rI   rm   rJ   )rX   rY   rZ   r   r[   r&   r]   r^   r_   r`   zcompletion HTTP error: zcompletion http zcompletion error: )ra   r*   rb   r,   r   r(   r)   r   ÚStreamCompletionIteratorrc   r
   r+   rj   rk   r   rm   rd   r/   r&   rn   ro   r.   r0   )
r9   rp   r   r‹   r?   r@   r1   r2   r3   r6   s
             r   Úcompletion_completionsr�   �   s�  è ø€ à#*§?¡?×#6Ñ#6°~ÀrÓ#J×#UÑ#UÐVhÔ#i�—‘“×ÐÐoq€DØ�H‰H�WÓÒ.¤€EØ�X‰X�h Ó#€FØ�X‰X�h Ó&€FØ�h‰h�y "Ó%€Gð@Ü×$Ñ$¨SÔ1÷ 	qð 	q°VÙÜ(Ô)AÀ&È%ÐQWÐY`Ó)aÓb÷	q÷ 	qñ 	qð $Ÿ[™[¬OÐ+<¸MÐ)JÐ[`Ðlrð  Dñ  RPð  HOð  RP˜[ó  Q÷  Q�Ø×#Ñ# sÒ*ØŸ9™9›;�Dà %¤c¬$¯)©)«+Ó&6Ð%7Ð8Ø"3Ü#&¤t§y¡y£{Ó#3Ø!&Ø./¸¿¹À*ÈbÓ9QÐdjÑ$kÐ#lñ÷	q÷ 	qñ 	qô $ W°¸d×>NÑ>NÐ=OÈrÐRV×R[ÑR[ÐQ\Ð.]Ð$^ÐloÔp÷	q÷ 	qñ 	qð  ùð	qùð 	qøð Qøð		qøð 	qø÷ 	q÷ 	qñ 	qûô �?‰?ò cÜ�	‰	Ð+¨A¨3Ð/Ô0Ü˜WÐ(8¸¿¹×9MÑ9MÐ8NÐ&OÐPÐ^aÔbÕbûÜò @Ü�	‰	Ð& q cÐ*Ô+Ü˜W¤c¨!£fÐ-¸3Ô?Õ?ûð@üs	  ‚?JÁG	ÁAJÂG, Â2GÂ3G, Â6GÃG, ÃGÃG, Ã JÃ!#GÄGÄA8GÅ=G, Æ	GÆ
G, ÆJÆ(GÆ7G, ÇGÇG, ÇJÇG, ÇG, ÇGÇG, ÇG, ÇG)ÇG ÇG)Ç%G, Ç(JÇ)G, Ç,JÇ?=IÈ<JÈ=JÉJÉ/JÉ=JÉ>JÊJÊJc                   ó   — e Zd Zd„ Zd„ Zy)r�   c                 ó<   — || _         || _        || _        || _        y rv   )r1   r   r‹   r@   )rw   r1   r   r‹   r@   s        r   rx   z!StreamCompletionIterator.__init__®   s   € ØˆŒØˆŒ
ØˆŒØˆ�r   c                óî  K  — | j                   j                  t        › d�| j                  | j                  ddœ| j
                  ¥¬«      ƒ d {  –—† }|j                  «       D ]s  }|j                  «       }|r|j                  d«      sŒ'	 t        j                  |«      }|j                  dd«      }|r#| j                  ||j                  dd	«      d
œ­–— Œu y 7 Œ‹# t        j                  $ r Y ŒŽw xY w­w)NrŒ   Tr�   rA   rz   rƒ   r<   r|   F)r   rm   r|   )r1   rc   r
   r   r‹   r@   r}   r~   rb   r,   r€   r*   r�   )rw   rƒ   r„   r…   rm   s        r   r†   z!StreamCompletionIterator.__iter__´   s  è ø€ ØŸ™×)Ñ)¬_Ð,=¸]Ð*KÐ\`×\fÑ\fÐrv×r}Ñr}ð  JNñ  S_ð  RV÷  R^ñ  R^ð  S_Ð)ó  `÷  `ˆØ×'Ñ'Ó)ò 
	ˆDØ—:‘:“<ˆDÙ˜tŸ™¨sÔ3ØðÜŸ
™
 4Ó(�Ø—y‘y ¨RÓ0�ÙØ$(§J¡J¸ÀeÇiÁiÐPVÐX]ÓF^Ñ_Ó_øñ
	ð `ùô ×'Ñ'ò Ùðüs7   ‚AC5ÁCÁ;C5ÂACÃC5ÃC2Ã/C5Ã1C2Ã2C5Nr‡   r   r   r   r�   r�   ­   s   „ òór   r�   z/api/embeddingsc              ƒ   ó:  K  — | j                   j                  dd«      j                  d«      r| j                  «       ƒ d {  –—† ni }|j                  d«      xs t        }|j                  dg «      }	 t        j                  d¬«      4 ƒd {  –—† }t        |t        «      r|}ndj                  |«      }|j                  t        › d	�||d
œ¬«      ƒ d {  –—† }|j                  dk(  r7|j                  «       }|j                  dg «      }d|icd d d «      ƒd {  –—†  S t        dd|j                  › d|j                  › �id¬«      cd d d «      ƒd {  –—†  S 7 �Œ7 ŒÐ7 Œ‰7 ŒF7 Œ# 1 ƒd {  –—†7  sw Y   y xY w# t
        j                  $ rH}	t         j#                  d|	› �«       t        dd|	j$                  j&                  › �id¬«      cY d }	~	S d }	~	wt(        $ r:}	t         j#                  d|	› �«       t        dt        |	«      id¬«      cY d }	~	S d }	~	ww xY w­w)Nr;   r<   r=   r   Úinputé<   r   ú z
/api/embed)r   r‹   rA   r!   Ú
embeddingsr&   r]   r^   r_   r`   zembeddings HTTP error: zembeddings http zembeddings error: )ra   r*   rb   r,   r   r(   r)   rh   r0   Újoinrc   r
   r+   r   rm   rd   r/   r&   rn   ro   r.   )
r9   rp   r   Ú
input_textr1   r‹   r2   r3   r˜   r6   s
             r   r˜   r˜   Ã   s÷  è ø€ à#*§?¡?×#6Ñ#6°~ÀrÓ#J×#UÑ#UÐVhÔ#i�—‘“×ÐÐoq€DØ�H‰H�WÓÒ/¤€EØ—‘˜' 2Ó&€Jð@Ü×$Ñ$¨RÔ0÷ 
	mð 
	m°FÜ˜*¤cÔ*Ø#‘àŸ™ *Ó-�ØŸ™¬Ð'8¸
Ð%CÐTYÐekÑJl˜Óm×mˆDØ×Ñ 3Ò&Ø—y‘y“{�Ø!ŸX™X l°BÓ7�
Ø$ jÐ1÷
	m÷ 
	mñ 
	mô   ¨M¸$×:JÑ:JÐ9KÈ2ÈdÏiÉiÈ[Ð*YÐ ZÐhkÔl÷
	m÷ 
	mñ 
	mð  ùð

	møð
 nøð
	møð 
	mø÷ 
	m÷ 
	mñ 
	mûô �?‰?ò cÜ�	‰	Ð+¨A¨3Ð/Ô0Ü˜WÐ(8¸¿¹×9MÑ9MÐ8NÐ&OÐPÐ^aÔbÕbûÜò @Ü�	‰	Ð& q cÐ*Ô+Ü˜W¤c¨!£fÐ-¸3Ô?Õ?ûð@üsä   ‚?HÁEÁ1HÁ4E< ÂEÂE< ÂAE'ÃE!Ã8E'ÄE< ÄE#ÄE< Ä!HÄ"(E'Å
E< ÅE%ÅE< ÅHÅE< Å!E'Å#E< Å%E< Å'E9Å-E0Å.E9Å5E< Å8HÅ9E< Å<HÆ=GÇHÇHÇHÇ/HÈHÈHÈHÈHc              ƒ   ó(   K  — t        ddid¬«      S ­w)Nr&   z+Tokenization not supported via Ollama proxyiõ  r`   )r   )r9   s    r   Útokenizerœ   Þ   s    è ø€ ô Ø	Ð?Ð@Ècôð ùs   ‚z/api/detokenizec           	   ƒ   óØ  K  — | j                   j                  dd«      j                  d«      r| j                  «       ƒ d {  –—† ni }|j                  d«      xs t        }|j                  dg «      }t        |t        «      rdj                  d„ |D «       «      n
t        |«      }	 t        j                  d¬	«      4 ƒd {  –—† }|j                  t        › d
�||dddœ¬«      ƒ d {  –—† }|j                  dk(  rN|j                  «       }|j                  dd«      }t        j                  dd|«      }	d|	icd d d «      ƒd {  –—†  S t!        dd|j                  › d|j"                  › �id¬«      cd d d «      ƒd {  –—†  S 7 �ŒC7 ŒÅ7 Œ 7 ŒF7 Œ# 1 ƒd {  –—†7  sw Y   y xY w# t$        $ r:}
t&        j)                  d|
› �«       t!        dt        |
«      id¬«      cY d }
~
S d }
~
ww xY w­w)Nr;   r<   r=   r   Útokensr—   c              3   ó2   K  — | ]  }t        |«      –— Œ y ­wrv   )r0   )rP   Úts     r   rR   zdetokenize.<locals>.<genexpr>î   s   è ø€ Ò0 Aœ˜QŸÑ0ùs   ‚r   r   rŒ   Fr,   )r   r‹   r?   r   rA   r!   rƒ   z[^\x20-\x7E\n]rm   r&   r]   r^   r_   r`   zdetokenize error: )ra   r*   rb   r,   r   rh   Úlistr™   r0   r(   r)   rc   r
   r+   ÚreÚsubr   rm   r.   r/   r&   )r9   rp   r   rž   Ú	token_strr1   r2   r3   rm   Ú	printabler6   s              r   Ú
detokenizer¦   é   sã  è ø€ à#*§?¡?×#6Ñ#6°~ÀrÓ#J×#UÑ#UÐVhÔ#i�—‘“×ÐÐoq€DØ�H‰H�WÓÒ/¤€EØ�X‰X�h Ó#€FÜ4>¸vÄtÔ4L�—‘Ñ0¨Ô0Ô0ÔRUÐV\ÓR]€Ið@Ü×$Ñ$¨RÔ0÷ 	mð 	m°FØŸ™¬Ð'8¸Ð%FÐW\Ðhqð  ~Cð  OUñ  NV˜ó  W÷  WˆDØ×Ñ 3Ò&Ø—y‘y“{�Ø—x‘x 
¨BÓ/�ÜŸF™FÐ#4°b¸$Ó?�	Ø 	Ð*÷	m÷ 	mñ 	mô   ¨M¸$×:JÑ:JÐ9KÈ2ÈdÏiÉiÈ[Ð*YÐ ZÐhkÔl÷	m÷ 	mñ 	mð  ùð	møð Wøð	møð 	mø÷ 	m÷ 	mñ 	mûô ò @Ü�	‰	Ð& q cÐ*Ô+Ü˜W¤c¨!£fÐ-¸3Ô?Õ?ûð@üsÍ   ‚?G*ÁFÁA$G*Â'F$ ÃFÃF$ Ã#FÃ(F	Ã)AFÄ8F$ ÅFÅF$ Å	G*Å
(FÅ2F$ Å>FÅ?F$ ÆG*ÆF$ Æ	FÆF$ ÆF$ ÆF!ÆFÆF!ÆF$ Æ G*Æ!F$ Æ$	G'Æ-/G"ÇG'ÇG*Ç"G'Ç'G*Ú__main__rf   )Úhostr   Ú	log_level)(Ú__doc__r,   Úloggingr   r¢   r   rk   r(   Úfastapir   r   Úfastapi.responsesr   r   ÚbasicConfigÚINFOÚ	getLoggerr/   Úenvironr*   r
   r   r   rj   r   ÚHOSTÚappr   r7   rc   rs   rg   r�   r�   r˜   rœ   r¦   ro   ÚuvicornÚrunr   r   r   ú<module>r¶      sþ  ðñó Û Û 	Û 	Û 
Û ã ß $ß =à €× Ñ ˜'Ÿ,™,Ð/aÕ bØ€g×ÑÐ0Ó1€à—*‘*—.‘.Ð!2Ð4LÓM€Ø—
‘
—‘˜°Ó@€Ø—‘—‘Ð 0Ð2GÓH€Ù
ˆ2�:‰:�>‰>Ð*¨FÓ3Ó4€Ø	‡z�z‡~�~Ð&¨Ó4€áƒi€ð ‡�ˆƒñó ðð ‡�ˆÓñ1ó ð1ð& ‡�ˆ+Óð7@ Gò 7@ó ð7@÷tñ ð& ‡�Ð
Óð@¨'ò @ó ð@÷>ñ ð, ‡�Ð
Óð@˜gò @ó ð@ð4 ‡�ˆ/Óð˜Gò ó ðð ‡�Ð
Óð@˜gò @ó ð@ð( ˆzÒÛØ€G‡K�K�˜$ T°VÖ<ð r   