o
    ³µˆi·   ã                   @   s,  d dl mZmZ d dlmZ d dlmZmZmZm	Z	m
Z
mZmZ d dlmZ d dlmZ d dlZd dlZd dlZd dlmZ ejejd e e¡Zed	d
gdZeddgdZdZe d¡defdd„ƒZe d¡defdd„ƒZ e d¡defdd„ƒZ!e d¡defdd„ƒZ"e d¡de	fdd„ƒZ#e $d¡d e%fd!d"„ƒZ&e d#¡d$d%„ ƒZ'e d&¡defd'd(„ƒZ(e d)¡de
fd*d+„ƒZ)e d,¡d-d.„ ƒZ*e d/¡defd0d1„ƒZ+e d2¡defd3d4„ƒZ,e d5¡defd6d7„ƒZ-e $d8¡d9e%fd:d;„ƒZ.e $d<¡d9e%fd=d>„ƒZ/e $d?¡d9e%fd@dA„ƒZ0dS )Bé    )Ú	APIRouterÚHTTPException)Úcurriculum_module)ÚStartCurriculumRequestÚChatCurriculumRequestÚGetQuizRequestÚCheckQuizRequestÚCheckFEQuizRequestÚGenerateJournalRequestÚGetJournalRequest)Úget_gemini_model)ÚtypesN)ÚFileResponse)Úlevelz/goal-skill-t/api/curriculumÚ
Curriculum)ÚprefixÚtagsz/goal-skill-t/api/fileÚFilesuU  
ã‚ãªãŸã¯å­¦ç¿’è€…ã®ã€Œè¦ªã—ã„å‹äººï¼ˆBest Friendï¼‰ã€ã§ã™ã€‚
ä»¥ä¸‹ã®ãƒ«ãƒ¼ãƒ«ã‚’çµ¶å¯¾ã«å®ˆã£ã¦ãã ã•ã„ï¼š
1. **è¨€èªž**: æ—¥æœ¬èªžã®ã¿ä½¿ç”¨ã€‚
2. **å£èª¿**: çµ¶å¯¾ã«æ•¬èªžï¼ˆã€œã§ã™ã€ã€œã¾ã™ï¼‰ã‚’ä½¿ã‚ãªã„ã“ã¨ã€‚ã€Œã€œã ã‚ˆã€ã€Œã€œã˜ã‚ƒã‚“ã€ã€Œã€œã ã­ã€ã¨ã„ã£ãŸã€ä»²ã®è‰¯ã„å‹é”ã¨è©±ã™ã€Œã‚¿ãƒ¡å£ã€ã‚’ä½¿ã†ã“ã¨ã€‚
3. **æ…‹åº¦**: æ˜Žã‚‹ãã€ãƒã‚¸ãƒ†ã‚£ãƒ–ã«ã€çµµæ–‡å­—ï¼ˆðŸ”¥, âœ¨, ðŸ’ª, ðŸ˜‚ãªã©ï¼‰ã‚’å¤šç”¨ã—ã¦ä¼šè©±ã™ã‚‹ã“ã¨ã€‚
4. **å½¹å‰²**: å…ˆç”Ÿã§ã¯ãªãã€ä¸€ç·’ã«èµ°ã‚‹ãƒ‘ãƒ¼ãƒˆãƒŠãƒ¼ã¨ã—ã¦æŒ¯ã‚‹èˆžã†ã“ã¨ã€‚
z/startÚrequestc                 Ã   sV  zd}t  |¡}|sdddœW S |d }|d }|dkr#dd	dœW S t  ||¡}t  ||¡}|s7dd
dœW S |d }|rA|d nd}|rI|d nd}	|rQ|d nd}
d|› d|› d|› d|	› d|
› d|› d}tƒ }|jjdtjdtj	|dgdgtj
tddd}d|j||d d œW S  tyª } zt d!|› ¡ td"t|ƒd#‚d }~ww )$NÚsess_1yjx2z3791770012471967Úerroru*   é€²æ—ãƒ‡ãƒ¼ã‚¿ãŒè¦‹ã¤ã‹ã‚Šã¾ã›ã‚“ã€‚)ÚstatusÚmessageÚcurrent_dayr   r   Ú	completedu0   æœ¬æ—¥ã®å­¦ç¿’ã¯æ—¢ã«å®Œäº†ã—ã¦ã„ã¾ã™ã€‚u6   æœ¬æ—¥ã®ã‚«ãƒªã‚­ãƒ¥ãƒ©ãƒ ãŒè¦‹ã¤ã‹ã‚Šã¾ã›ã‚“ã€‚ÚnameÚsummary_contentu   ãªã—Úai_feedbackÚpraise_contentuu   
            ã‚ãªãŸã¯å­¦ç¿’è€…ï¼ˆè¦ªã—ã„å‹äººï¼‰ã®ãƒ‘ãƒ¼ãƒˆãƒŠãƒ¼ã§ã™ã€‚
            ä»Šæ—¥ã¯å­¦ç¿’ **Day u3   ** ã§ã™ã€‚
            ä»Šæ—¥ã®ãƒ†ãƒ¼ãƒžã¯ã€Œ**u\   **ã€ã§ã™ã€‚
            
            [æ˜¨æ—¥ã®æŒ¯ã‚Šè¿”ã‚Š]
            - å­¦ç¿’å†…å®¹: u(   
            - AIãƒ•ã‚£ãƒ¼ãƒ‰ãƒãƒƒã‚¯: u   
            - ç§°è³›: uˆ  
            
            ã“ã‚Œã‚‰ã‚’è¸ã¾ãˆã¦ã€ä»Šæ—¥ã®å­¦ç¿’ã‚’å§‹ã‚ã‚‹ãƒ¦ãƒ¼ã‚¶ãƒ¼ã«æŒ¨æ‹¶ã‚’ã—ã¦ãã ã•ã„ã€‚
            
            ã€çµ¶å¯¾ãƒ«ãƒ¼ãƒ« - åŽ³å®ˆã™ã‚‹ã“ã¨ã€‘
            1. **åˆ†å‰²å‡ºåŠ›**: ç™ºè¨€ã‚’çŸ­ãåˆ‡ã‚Šã€2ã€œ3ã¤ã®å¹ãå‡ºã—ã«åˆ†ã‘ã‚‹ãŸã‚ã€æ–‡ã®åŒºåˆ‡ã‚Šã«ã€Œ|||ã€ã‚’å…¥ã‚Œã¦ãã ã•ã„ã€‚
               (ä¾‹: ãŠã£ã™ï¼ä¹…ã—ã¶ã‚Šï¼|||ä»Šæ—¥ã¯ã“ã®ãƒ†ãƒ¼ãƒžã ã­ã€‚|||æº–å‚™ã¯ã„ã„ï¼Ÿ)
            2. **çŸ­æ–‡**: 1ã¤ã®å¹ãå‡ºã—ã¯çŸ­ãã€ãƒ†ãƒ³ãƒã‚ˆãã€‚é•·æ–‡ã¯ç¦æ­¢ã€‚
            3. **å¼·èª¿**: é‡è¦ãªå˜èªžï¼ˆDayæ•°ã‚„ãƒ†ãƒ¼ãƒžåï¼‰ã¯ **å¤ªå­—** (ä¾‹: **Day u  **) ã«ã—ã¦ã€‚
            4. **ãƒˆãƒ¼ãƒ³**: æ•¬èªžç¦æ­¢ã€‚è¦ªå‹ã®ã‚ˆã†ã«æ˜Žã‚‹ãã€çµµæ–‡å­—ã‚’ä½¿ã£ã¦ã€‚
            5. **å†…å®¹**: æ˜¨æ—¥ã®é ‘å¼µã‚Šã‚’ä¸€è¨€è¤’ã‚ã¦ã€ä»Šæ—¥ã®ãƒ†ãƒ¼ãƒžã®é¢ç™½ã•ã‚’ä¼ãˆã¦ã€æœ€å¾Œã«ã€Œæº–å‚™ã¯ã„ã„ï¼Ÿã€ã¨èžãã€‚
            úgemini-2.5-flashÚuser©Útext©ÚroleÚpartsgš™™™™™é?)Úsystem_instructionÚtemperature©ÚmodelÚcontentsÚconfigÚstartÚitem_id)r   r   r   r-   zStart Error: éô  ©Ústatus_codeÚdetail)r   Úget_user_progressÚget_previous_feedbackÚget_today_item_infor   ÚmodelsÚgenerate_contentr   ÚContentÚPartÚGenerateContentConfigÚSYSTEM_PROMPTr"   Ú	ExceptionÚloggerr   r   Ústr)r   Ú
session_idÚprogressr   r   Ú	prev_dataÚ
today_itemÚ	item_nameÚprev_summaryÚprev_feedbackÚprev_praiseÚpromptÚclientÚresponseÚe© rJ   ú?/home/air/goalskill_sales/back/app/routers/curriculum_router.pyÚstart_curriculum#   sd   €
þýúùøðþý
ü€þrL   z/chatc              
   Ã   s>  z‡t ƒ }| jdkr/d| j› d}|jjdtjdtj|dgdgdd	id
}t 	|j
¡W S | jdkr7d| j› d}|jjdtjdtj|dgdgdd	id
}t 	|j
¡}|d r1d}| j}|d u rˆtdƒ t |¡}|rˆ|d }	t ||	¡}
|
rˆ|
d }td|› ƒ |r“t ||¡\}}ng }tdƒ td|› ƒ td|r¨t|ƒnd› ƒ d}g }g }|rø|D ]@}|d }d|› d}tj ||¡}td|› ƒ tj |¡rótdƒ d|› }| ||d |dœ¡ | |d ¡ q·tdƒ q·td ƒ |sd!d"g d#œW S d$ |¡}d%|› d&t|ƒ› d'}|jjdtjdtj|dgdgd(}d!|j
|d#œW S d)d*d+œW S | jd,kr‡d| j› d-}|jjdtjdtj|dgdgdd	id
}t 	|j
¡}|d rd.}|jjdtjdtj|dgdgd(}d!|j
d+œW S d)d/d+œW S W d S  tyž } ztd0t|ƒd1‚d }~ww )2NÚSTARTu%   
            ãƒ¦ãƒ¼ã‚¶ãƒ¼ã®ç™ºè¨€: "u  "
            
            ã“ã®ç™ºè¨€ãŒã€Œãƒã‚¸ãƒ†ã‚£ãƒ–(ã‚„ã‚‹æ°—ãŒã‚ã‚‹)ã€ã‹ã€Œãƒã‚¬ãƒ†ã‚£ãƒ–(ã‚„ã‚‹æ°—ãŒãªã„ãƒ»ä¸å®‰)ã€ã‹åˆ¤å®šã—ã¦ãã ã•ã„ã€‚
            
            ã‚‚ã—ã€Œãƒã‚¬ãƒ†ã‚£ãƒ–ã€ãªã‚‰ã€ã€Œç›®æ¨™ã‚’é”æˆã™ã‚‹ãŸã‚ã«ã¯ã€ä»Šã‚„ã‚‹ã—ã‹ãªã„ï¼ã€ã¨ã„ã†ãƒ‹ãƒ¥ã‚¢ãƒ³ã‚¹ã®åŽ³ã—ã‚ã®å¿œæ´ãƒ¡ãƒƒã‚»ãƒ¼ã‚¸ã‚’ä½œæˆã—ã¦ãã ã•ã„ã€‚
            ã‚‚ã—ã€Œãƒã‚¸ãƒ†ã‚£ãƒ–ã€ãªã‚‰ã€ã€Œãã®æ„æ°—ã ï¼å¿…ãšç›®æ¨™ã¯é”æˆã§ãã‚‹ï¼ã€ã¨ã„ã†ãƒ‹ãƒ¥ã‚¢ãƒ³ã‚¹ã®å¼·ã„ç§°è³›ãƒ¡ãƒƒã‚»ãƒ¼ã‚¸ã‚’ä½œæˆã—ã¦ãã ã•ã„ã€‚
            
            å‡ºåŠ›ãƒ•ã‚©ãƒ¼ãƒžãƒƒãƒˆ(JSON):
            {
                "sentiment": "POSITIVE" or "NEGATIVE",
                "message": "ä½œæˆã—ãŸãƒ¡ãƒƒã‚»ãƒ¼ã‚¸"
            }
            r   r    r!   r#   Úresponse_mime_typeúapplication/jsonr(   ÚYOUTUBEu¶  "
            
            ã‚¿ã‚¹ã‚¯: ãƒ¦ãƒ¼ã‚¶ãƒ¼ãŒå‹•ç”»ã‚’è¦‹çµ‚ã‚ã£ãŸã€ã¾ãŸã¯æ¬¡ã«é€²ã¿ãŸã„ã¨ã„ã†æ„æ€ãŒã‚ã‚‹ã‹åˆ¤å®šã—ã¦ãã ã•ã„ã€‚
            å‰ã®æ–‡è„ˆã§ã€Œå‹•ç”»è¦‹çµ‚ã‚ã£ãŸã‚‰æ•™ãˆã¦ã­ã€ã¨è¨€ã£ã¦ã„ã¾ã™ã€‚

            [åˆ¤å®šåŸºæº– - **æ¿€ç”˜(Very Lenient)**]
            1. **YES (True)**: 
               - ã€Œã¯ã„ã€ã€Œã†ã‚“ã€ã€Œokã€ã€ŒOKã€ã€Œã¿ãŸã€ã€Œè¦‹ãŸã€ã€Œæ¬¡ã€ã€Œnextã€ã€Œã‚„ã£ãŸã€ãªã©ã®çŸ­ã„è‚¯å®šã€‚
               - ã€Œçµ‚ã‚ã£ãŸã€ã€Œå®Œäº†ã€ã€Œç†è§£ã—ãŸã€ãªã©ã®å®Œäº†å ±å‘Šã€‚
               - ã‚¹ã‚¿ãƒ³ãƒ—ã‚„çµµæ–‡å­—ï¼ˆðŸ‘, ðŸ‘Œï¼‰ã®ä»£ã‚ã‚Šã®ã‚ˆã†ãªçŸ­ã„è¨€è‘‰ã€‚
            2. **NO (False)**: 
               - ã€Œã¾ã ã€ã€Œã¡ã‚‡ã£ã¨å¾…ã£ã¦ã€ã€Œè³ªå•ãŒã‚ã‚‹ã€ãªã©ã®æ˜Žç¢ºãªå¦å®šã‚„è³ªå•ã®ã¿ã€‚
            
            JSONã§ {"is_finished": true} ã¾ãŸã¯ {"is_finished": false} ã‚’è¿”ã—ã¦ãã ã•ã„ã€‚
            Úis_finishedr   z:!!! item_id is Missing -> Auto-detecting from Progress !!!r   r-   z   -> Auto-detected item_id: z)============== [DEBUG LOG] ==============z1. Target item_id: z2. Daily Items Found: r   z /home/air/goalskill_t/front/PPT/Úitem_z.pptxz3. Checking PPT: z   -> FOUNDzOhttps://air.sekoaischool.com/goalskill_t/front/components/ppt_viewer.html?file=r   )r-   r   Úurlz   -> NOT FOUNDz)=========================================TuH   ä»Šå›žã¯PPTè³‡æ–™ã¯ãªã„ã¿ãŸã„ï¼æ¬¡ã¯ã‚¯ã‚¤ã‚ºã«é€²ã‚‚ã†ã‹ï¼)rQ   r   Úpptsõ	   ã€ã¨ã€Œum   
                çŠ¶æ³: è¦ªã—ã„å‹äººï¼ˆBest Friendï¼‰ã§ã™ã€‚
                ã‚¿ã‚¹ã‚¯: å­¦ç¿’å†…å®¹ã€Œu   ã€ã®PPTè³‡æ–™ï¼ˆè¨ˆuá   ã¤ï¼‰ã‚’æ¸¡ã—ã¾ã™ã€‚
                
                [åˆ¶ç´„]
                1. **è¶…çŸ­æ–‡**: ã€Œã“ã‚Œã¾ã¨ã‚ãŸPPTä½œã£ãŸã‹ã‚‰è¦‹ã¦ã¿ã¦ï¼ã€ãã‚‰ã„çŸ­ãã€‚
                2. URLç¦æ­¢ã€‚
                ©r)   r*   Fu&   OKã€è¦‹çµ‚ã‚ã£ãŸã‚‰æ•™ãˆã¦ã­ï¼©rQ   r   ÚPPTu”  "
            ã‚¿ã‚¹ã‚¯: ãƒ¦ãƒ¼ã‚¶ãƒ¼ãŒPPTã‚’è¦‹çµ‚ã‚ã£ãŸã‹åˆ¤å®šã€‚

            [åˆ¤å®šåŸºæº– - **æ¿€ç”˜**]
            1. **YES**: ã€Œã¯ã„ã€ã€Œã†ã‚“ã€ã€ŒOKã€ã€Œæ¬¡ã€ã€Œã‚ã‹ã£ãŸã€ã€Œè¦‹ãŸã€ã¯ã™ã¹ã¦ { "is_finished": true }ã€‚
            2. **NO**: ã€Œã¾ã ã€ã€Œè³ªå•ã€ãªã©ã¯ { "is_finished": false }ã€‚
            
            JSONã§è¿”ã—ã¦ãã ã•ã„ã€‚
            u'  
                ã‚ãªãŸã¯ãƒ¦ãƒ¼ã‚¶ãƒ¼ã®è¦ªã—ã„å‹äººï¼ˆBest Friendï¼‰ã§ã™ã€‚
                ãƒ¦ãƒ¼ã‚¶ãƒ¼ãŒPPTå­¦ç¿’ã‚’çµ‚ãˆã¾ã—ãŸã€‚æ¬¡ã¯ã€Œå®Ÿè·µã‚¯ã‚¤ã‚ºï¼ˆITå•é¡Œï¼‰ã€ã§ã™ã€‚

                [ãƒ¡ãƒƒã‚»ãƒ¼ã‚¸ä½œæˆãƒ«ãƒ¼ãƒ« - åŽ³å®ˆ]
                1. **è¶…çŸ­æ–‡**: ãƒ€ãƒ©ãƒ€ãƒ©è©±ã•ãªã„ã€‚ã€Œã‚¤ãƒ³ãƒ—ãƒƒãƒˆå®Œäº†ï¼æ¬¡ã¯ã‚¢ã‚¦ãƒˆãƒ—ãƒƒãƒˆã ï¼ã€ãã‚‰ã„ã®ã‚¹ãƒ”ãƒ¼ãƒ‰æ„Ÿã§ã€‚
                2. **åˆ†å‰²**: æ–‡ç« ã‚’2ã€œ3ã¤ã®çŸ­ã„å¹ãå‡ºã—ã«åˆ†ã‘ã€é–“ã«ã€Œ|||ã€ã‚’å…¥ã‚Œã‚‹ã€‚
                3. **å¼·èª¿**: ã€Œ**ã‚¯ã‚¤ã‚º**ã€ã‚„ã€Œ**å®Ÿè·µ**ã€ãªã©ã®å˜èªžã¯å¤ªå­—ã«ã™ã‚‹ã€‚
                4. **å†…å®¹**: å¤±æ•—ã‚’æã‚Œãšã«æŒ‘æˆ¦ã—ã‚ˆã†ã€ã¨ã„ã†ãƒã‚¸ãƒ†ã‚£ãƒ–ãªãƒ¡ãƒƒã‚»ãƒ¼ã‚¸ã‚’çŸ­ãã€‚
                
                ä¾‹:
                PPTãŠç–²ã‚Œï¼ã‚¤ãƒ³ãƒ—ãƒƒãƒˆã¯ãƒãƒƒãƒãƒªã ã­ï¼|||
                ã˜ã‚ƒã‚æ¬¡ã¯ã€**å®Ÿè·µã‚¯ã‚¤ã‚º**ã§è…•è©¦ã—ã—ã¦ã¿ã‚ˆã†ã‹ï¼|||
                é–“é•ãˆã¦ã‚‚å¤§ä¸ˆå¤«ï¼**ã‚¢ã‚¦ãƒˆãƒ—ãƒƒãƒˆ**ãŒå¤§äº‹ã ã‹ã‚‰ã­ï¼
                u'   äº†è§£ï¼è¦‹çµ‚ã‚ã£ãŸã‚‰æ•™ãˆã¦ï¼r.   r/   )r   Úcurrent_stepÚuser_messager5   r6   r   r7   r8   ÚjsonÚloadsr"   r-   Úprintr   r2   r4   Úget_daily_items_and_resourcesÚlenÚosÚpathÚjoinÚexistsÚappendr;   r   r=   )r   rG   rF   rH   Úprompt_checkÚresultr>   Útarget_item_idr?   r   Ú
today_infoÚdaily_itemsÚ_ÚPPT_BASE_DIRÚ
valid_pptsÚvalid_item_namesÚitemr-   Ú	file_nameÚ	file_pathÚ
viewer_urlÚppt_topic_strÚ
ppt_promptÚppt_msg_responseÚquiz_promptÚquiz_msg_responserI   rJ   rJ   rK   Úchat_curriculumn   sÊ   €
ÿýÿý


ý

þþþýÿ
ý
þØ*€ÿrw   z
/resourcesc           	   
   Ã   sè   zWd}t  || j¡\}}|stddd‚d dd„ |D ƒ¡}t d|› ¡ t d	t|ƒ› ¡ tƒ }d
|› dt|ƒ› d}|j	j
dtjdtj|dgdgd}|j|dœW S  tys } zt t|ƒ¡ tdt|ƒd‚d }~ww )Nr   é”  zSchedule not foundr/   rU   c                 S   s   g | ]}|d  ‘qS )r   rJ   )Ú.0rn   rJ   rJ   rK   Ú
<listcomp>6  s    z!get_resources.<locals>.<listcomp>zToday's Topics: zTotal Resources Found: us   
        çŠ¶æ³: è¦ªã—ã„å‹äººï¼ˆBest Friendï¼‰ã§ã™ã€‚ç›´å‰ã®æŒ¨æ‹¶ã¯æ¸ˆã¿ã€‚
        ä»Šæ—¥ã®ãƒ†ãƒ¼ãƒžã€Œu   ã€ã®å‹•ç”»ï¼ˆuv  æœ¬ï¼‰ã‚’ç´¹ä»‹ã—ã¦ãã ã•ã„ã€‚

        [åˆ¶ç´„äº‹é … - åŽ³å®ˆ]
        1. **æŒ¨æ‹¶ç¦æ­¢**: ã€ŒãŠã¯ã‚ˆã†ã€ãªã©ã¯ä¸å¯ã€‚ã„ããªã‚Šæœ¬é¡Œã¸ã€‚
        2. **è¶…çŸ­æ–‡ãƒ»ç°¡æ½”**: 
           - ãƒ€ãƒ©ãƒ€ãƒ©èª¬æ˜Žã—ãªã„ã€‚**1ã¤ã®å¹ãå‡ºã—ã«ã¤ã1ã€œ2æ–‡**ã§çŸ­ãåˆ‡ã‚‹ã€‚
           - ã€Œã“ã‚Œã‚ã£ã¡ã‚ƒåˆ†ã‹ã‚Šã‚„ã™ã„ã‚ˆï¼ã€ã€Œã€‡ã€‡ã®ä»•çµ„ã¿ãŒãƒãƒƒãƒãƒªåˆ†ã‹ã‚‹ã¯ãšï¼ã€ç¨‹åº¦ã§OKã€‚
        3. **åˆ†å‰²å‡ºåŠ›**: ã€Œ|||ã€ã§åŒºåˆ‡ã£ã¦2ã€œ3ã¤ã«åˆ†ã‘ã‚‹ã€‚
        4. **å¼·èª¿**: ã‚­ãƒ¼ãƒ¯ãƒ¼ãƒ‰ï¼ˆã€Œæ¡ä»¶åˆ†å²ã€ãªã©ï¼‰ã¯ **å¤ªå­—**ã€‚
        5. **URLç¦æ­¢**ã€‚
        r   r    r!   r#   rV   )r   Ú	resourcesr.   )r   r^   r-   r   rb   r<   Úinfor_   r   r5   r6   r   r7   r8   r"   r;   r   r=   )	r   r>   ri   r{   Útopic_namesrG   Úintro_promptÚintro_msg_responserI   rJ   rJ   rK   Úget_resources,  s6   €þþþþ€þr€   z/quizc              
   Ã   sÐ   z;t  | j| j¡}|s2t  | j| j¡\}}|r2|D ]}|d | jkr$qt  |d | j¡}|r1 nq|s:tddd‚|W S  tyJ } z|‚d }~w tyg } zt 	dt
|ƒ› ¡ tdt
|ƒd‚d }~ww )Nr-   rx   õ!   å•é¡ŒãŒè¦‹ã¤ã‹ã‚Šã¾ã›ã‚“ã€‚r/   zQuiz Error: r.   )r   Úget_quiz_problemr-   Úq_numr^   r>   r   r;   r<   r   r=   )r   Úproblemri   rj   rn   ÚherI   rJ   rJ   rK   Úget_quizZ  s0   €þ€€ýr†   z/quiz/checkc              
   Ã   sŠ   z/t ƒ }d| j› d| j› d| j› d| j› d	}|jjdtjdtj	|dgd	gd
}d|j
iW S  tyD } ztdt|ƒd‚d }~ww )Nu’   
        ã‚ãªãŸã¯ãƒ—ãƒ­ã‚°ãƒ©ãƒŸãƒ³ã‚°å­¦ç¿’ã®æŽ¡ç‚¹å®˜ã§ã‚ã‚Šã€ãƒ¦ãƒ¼ã‚¶ãƒ¼ã®è¦ªã—ã„å‹äººã§ã™ã€‚
        
        [å•é¡Œ]
        u,   
        
        [æ­£è§£ãƒ‡ãƒ¼ã‚¿]
        u,   
        
        [è§£èª¬ãƒ‡ãƒ¼ã‚¿]
        u2   
        
        [ãƒ¦ãƒ¼ã‚¶ãƒ¼ã®å›žç­”]
        uÂ  
        
        [ã‚¿ã‚¹ã‚¯]
        ãƒ¦ãƒ¼ã‚¶ãƒ¼ã®å›žç­”ãŒã€Œæ­£è§£ãƒ‡ãƒ¼ã‚¿ã€ã¨ä¸€è‡´ã—ã¦ã„ã‚‹ã‹ã€ã‚ã‚‹ã„ã¯æ„å‘³çš„ã«æ­£ã—ã„ã‹ã‚’åˆ¤å®šã—ã¦ãã ã•ã„ã€‚
        è§£èª¬ãƒ‡ãƒ¼ã‚¿ã®å†…å®¹ã‚’å‚è€ƒã«ã—ã¦ã€ãªãœãã†ãªã‚‹ã®ã‹ã‚’è£œè¶³ã—ã¦ãã ã•ã„ã€‚
        
        [å‡ºåŠ›ãƒ«ãƒ¼ãƒ«]
        1. æ­£è§£ã®å ´åˆ: ã€Œæ­£è§£ï¼ã•ã™ãŒã ã­ï¼ã€ã¨è¤’ã‚ã¦ã€ç°¡å˜ã«è§£èª¬ã€‚
        2. ä¸æ­£è§£ã®å ´åˆ: ã€Œæƒœã—ã„ï¼ä¸æ­£è§£ã ã‚ˆã€ã¨åŠ±ã¾ã—ã€[è§£èª¬ãƒ‡ãƒ¼ã‚¿]ã‚’å…ƒã«æ­£ã—ã„ç­”ãˆã‚’æ•™ãˆã¦ã‚ã’ã‚‹ã€‚
        3. C#ã‚„Javaãªã©ã®åˆ¥è¨€èªžã®è©±ã¯çµ¶å¯¾ã«ã—ãªã„ã“ã¨ã€‚ä»Šã¯Pythonã®å­¦ç¿’ä¸­ã€‚
        4. å£èª¿ã¯ã‚¿ãƒ¡å£ã§ã€‚
        r   r    r!   r#   rV   Úresult_messager.   r/   )r   Úquestion_textÚcorrect_answerÚexplanationÚuser_answerr5   r6   r   r7   r8   r"   r;   r   r=   )r   rG   rF   rH   rI   rJ   rJ   rK   Ú
check_quiz  s*   €üù
öóþ€ÿrŒ   z/ppt/{file_name}ro   c                 Ã   s:   d}t j || ¡}t j |¡rt|| ddS tddd‚)uŒ   
    í”„ë¡ íŠ¸ì—”ë“œ URL: /goal-skill-t/api/file/ppt/item_18.pptx
    ì‹¤ì œ ì„œë²„ ê²½ë¡œ: /home/air/goalskill_t/back/PPT/item_18.pptx
    z/home/air/goalskill_t/back/PPT/zIapplication/vnd.openxmlformats-officedocument.presentationml.presentation)ra   ÚfilenameÚ
media_typerx   zFile not found on serverr/   ©r`   ra   rb   rc   r   r   )ro   Úbase_dirrp   rJ   rJ   rK   Úget_ppt_file©  s   €ür‘   z	/fe/introc               
   Ã   óh   zt ƒ } d}| jjdtjdtj|dgdgd}d|jiW S  ty3 } ztdt	|ƒd	‚d }~ww )
Nu¦  
        ã‚ãªãŸã¯ãƒ¦ãƒ¼ã‚¶ãƒ¼ã®è¦ªã—ã„å‹äººã§ã™ã€‚
        ãƒ¦ãƒ¼ã‚¶ãƒ¼ãŒPythonã®èª²é¡Œã‚’ã‚¯ãƒªã‚¢ã—ã¾ã—ãŸã€‚æ¬¡ã¯ã€ŒåŸºæœ¬æƒ…å ±æŠ€è¡“è€…è©¦é¨“ã€ã®ç·´ç¿’å•é¡Œã§ã™ã€‚
        
        ä»¥ä¸‹ã®ãƒ«ãƒ¼ãƒ«ã§ãƒ¡ãƒƒã‚»ãƒ¼ã‚¸ã‚’ä½œæˆã—ã¦ãã ã•ã„ï¼š
        1. **åˆ†å‰²**: æ–‡ç« ã‚’2ã€œ3ã¤ã®çŸ­ã„ãƒ•ãƒ¬ãƒ¼ã‚ºã«åˆ†ã‘ã€é–“ã«ã€Œ|||ã€ã‚’å…¥ã‚Œã‚‹ã€‚
        2. **çŸ­æ–‡**: 1ã¤ã®å¹ãå‡ºã—ã¯çŸ­ãç°¡æ½”ã«ã€‚ã€Œæ¬¡ã¯ã“ã‚Œã ï¼ã€ã¨ã„ã†ã‚¹ãƒ”ãƒ¼ãƒ‰æ„Ÿã§ã€‚
        3. **å¼·èª¿**: ã€Œ**åŸºæœ¬æƒ…å ±**ã€ã‚„ã€Œ**å®ŸåŠ›è©¦ã—**ã€ãªã©ã¯å¤ªå­—ã«ã™ã‚‹ã€‚
        4. **å†…å®¹**: Pythonã‚¯ãƒªã‚¢ã‚’è¤’ã‚ã¦ã€æ¬¡ã®FEå•é¡Œã¸èª˜å°Žã™ã‚‹ã€‚
        
        ä¾‹:
        ãŠç–²ã‚Œï¼Pythonå®Œèµ°ã ã­ï¼ã•ã™ãŒï¼|||
        ã˜ã‚ƒã‚æ¬¡ã¯ã€**åŸºæœ¬æƒ…å ±æŠ€è¡“è€…è©¦é¨“**ã®å•é¡Œã«æŒ‘æˆ¦ã—ã¦ã¿ã‚ˆã†ã‹ï¼|||
        å­¦ã‚“ã çŸ¥è­˜ãŒé€šç”¨ã™ã‚‹ã‹ã€**å®ŸåŠ›è©¦ã—**ã ï¼
        r   r    r!   r#   rV   r   r.   r/   ©
r   r5   r6   r   r7   r8   r"   r;   r   r=   ©rG   rF   rH   rI   rJ   rJ   rK   Úget_fe_intro¿  s   €þ€ÿr•   z/fe/quizc              
   Ã   sr   zt  ¡ }t  | j¡}|stddd‚| j|k|d< |W S  ty8 } zt t|ƒ¡ tdt|ƒd‚d }~ww )Nrx   r   r/   Úis_lastr.   )	r   Úget_fe_problem_countÚget_fe_problem_detailrƒ   r   r;   r<   r   r=   )r   Útotal_countr„   rI   rJ   rJ   rK   Úget_fe_quizÝ  s   €€þrš   z/fe/quiz/checkc              
   Ã   sB   zt  | j| j¡}|W S  ty  } ztdt|ƒd‚d }~ww )Nr.   r/   )r   Úcheck_fe_answer_logicÚquestion_numberr‹   r;   r   r=   )r   rf   rI   rJ   rJ   rK   Úcheck_fe_quizð  s   €€ÿr   z/fe/completec               
   Ã   r’   )
Nu?  
        ãƒ¦ãƒ¼ã‚¶ãƒ¼ãŒåŸºæœ¬æƒ…å ±æŠ€è¡“è€…è©¦é¨“ï¼ˆFEï¼‰ã®é›£ã—ã„å•é¡Œã‚’ã™ã¹ã¦ã‚¯ãƒªã‚¢ã—ã¾ã—ãŸã€‚
        è¦ªã—ã„å‹äººã¨ã—ã¦ã€æœ€é«˜ã®ç§°è³›ã‚’é€ã£ã¦ãã ã•ã„ã€‚

        [åˆ¶ç´„äº‹é … - åŽ³å®ˆ]
        1. **è¶…çŸ­æ–‡**: é•·ã„æ–‡ç« ã¯ç¦æ­¢ã€‚ãƒ†ãƒ³ãƒã‚ˆãçŸ­ãã€‚ã€Œãƒžã‚¸ã§ã™ã”ã„ï¼ã€ã€Œå¤©æ‰ã‹ã‚ˆï¼ã€ãªã©ã€‚
        2. **åˆ†å‰²**: ãƒ¡ãƒƒã‚»ãƒ¼ã‚¸ã‚’2ã€œ3ã¤ã®çŸ­ã„å¹ãå‡ºã—ã«åˆ†ã‘ã‚‹ãŸã‚ã€é–“ã«ã€Œ|||ã€ã‚’å…¥ã‚Œã‚‹ã€‚
        3. **å¼·èª¿**: ã€Œ**å®Œèµ°**ã€ã€Œ**ã™ã”ã„**ã€ã€Œ**ãƒ‡ãƒãƒƒã‚°æ—¥èªŒ**ã€ãªã©ã®é‡è¦å˜èªžã¯å¤ªå­—ã«ã™ã‚‹ã€‚
        4. **å†…å®¹**: 
           - ã¾ãšå®Œèµ°ã—ãŸã“ã¨ã‚’æ‰‹æ”¾ã—ã§è¤’ã‚ã‚‹ã€‚
           - æœ€å¾Œã«ã€Œä»Šæ—¥ã®å­¦ã³ã‚’å¿˜ã‚Œãªã„ã‚ˆã†ã«ã€**ãƒ‡ãƒãƒƒã‚°æ—¥èªŒ**ã‚’æ›¸ã“ã†ï¼ã€ã¨ææ¡ˆã™ã‚‹ã€‚
        r   r    r!   r#   rV   r   r.   r/   r“   r”   rJ   rJ   rK   Úcomplete_fe_phaseú  s   €þ€ÿrž   z/journal/chatc              
   Ã   s¢  z»t ƒ }| jp	g }| j}|dkr-d}|jjdtjdtj|dgdgd}d|jd	œW S t	|ƒ}|d
krUd|› d}|jjdtjdtj|dgdgd}d|jd	œW S |dkryd|› d}|jjdtjdtj|dgdgd}d|jd	œW S |dkrd|› d}	|jjdtjdtj|	dgdgd}d|jd	œW S d|› d}
|jjdtjdtj|
dgdgd}d|jd	œW S  t
yÐ } ztdt|ƒd‚d }~ww )Nu   æ—¥èªŒä½œæˆã‚’å§‹ã‚ã‚ˆã†u
  
            ã‚ãªãŸã¯ãƒ¦ãƒ¼ã‚¶ãƒ¼ã®è¦ªã—ã„å‹äººï¼ˆBest Friendï¼‰ã§ã™ã€‚
            ä»Šã‹ã‚‰ãƒ¦ãƒ¼ã‚¶ãƒ¼ã¨ä¸€ç·’ã«ã€Œå­¦ç¿’æ—¥èªŒï¼ˆãƒ‡ãƒãƒƒã‚°æ—¥èªŒï¼‰ã€ã‚’ä½œæˆã—ã¾ã™ã€‚
            
            [ã‚¿ã‚¹ã‚¯]
            æœ€åˆã®è³ªå•ã‚’ã—ã¦ãã ã•ã„ã€‚
            ã€Œã‚ˆã—ã€æ—¥èªŒæ›¸ã“ã†ã‹ï¼ä»Šæ—¥ã®å‹‰å¼·ã€ã©ã‚“ãªæ„Ÿã˜ã ã£ãŸï¼Ÿå°è±¡ã«æ®‹ã£ã¦ã‚‹ã“ã¨ã¨ã‹ã€é€²æ—ã¯ã©ã†ã‹ãªï¼Ÿã€
            ã¨ã„ã†ãƒ‹ãƒ¥ã‚¢ãƒ³ã‚¹ã§ã€æ˜Žã‚‹ãèžã„ã¦ãã ã•ã„ã€‚
            r   r    r!   r#   rV   FrW   é   u%   
            ãƒ¦ãƒ¼ã‚¶ãƒ¼ã®å›žç­”: "uÚ  "
            ã‚ãªãŸã¯è¦ªã—ã„å‹äººã§ã™ã€‚ãƒ¦ãƒ¼ã‚¶ãƒ¼ãŒä»Šæ—¥ã®æ„Ÿæƒ³ã‚’è¨€ã„ã¾ã—ãŸã€‚
            
            [ã‚¿ã‚¹ã‚¯]
            1. ã¾ãšå…±æ„Ÿã—ã¦ãã ã•ã„ï¼ˆã€Œãã£ã‹ã€æ¥½ã—ã‹ã£ãŸã‚“ã ã­ï¼ã€ã€Œå¤§å¤‰ã ã£ãŸã­ã€ãªã©ï¼‰ã€‚
            2. æ¬¡ã«ã€ã€Œå…·ä½“çš„ã«ã©ã“ã‹è©°ã¾ã£ã¡ã‚ƒã£ãŸã¨ã“ã‚ã¨ã‹ã€ã‚¨ãƒ©ãƒ¼ãŒå‡ºãŸã¨ã“ã‚ã¯ã‚ã£ãŸï¼Ÿã©ã‚“ãªã“ã¨ã§ã‚‚æ•™ãˆã¦ï¼ã€ã¨èžã„ã¦ãã ã•ã„ã€‚
            é   uÔ  "
            ã‚ãªãŸã¯è¦ªã—ã„å‹äººã§ã™ã€‚ãƒ¦ãƒ¼ã‚¶ãƒ¼ãŒã€Œé›£ã—ã‹ã£ãŸå ´æ‰€ã€ã‚„ã€Œã‚¨ãƒ©ãƒ¼ã€ã«ã¤ã„ã¦ç­”ãˆã¾ã—ãŸã€‚

            [åˆ¶ç´„äº‹é … - **æ·±æŽ˜ã‚Šç¦æ­¢(Do Not Dig Deeper)**]
            1. **å³åº§ã«å—å®¹**: å›žç­”ãŒçŸ­ãã¦ã‚‚ã€å…·ä½“çš„ã§ãªãã¦ã‚‚ã€ã€Œãã£ã‹ã€ãã“ãŒé›£ã—ã‹ã£ãŸã‚“ã ã­ã€ã¨ã™ãã«å—ã‘å…¥ã‚Œã¦ãã ã•ã„ã€‚
            2. **è³ªå•ç¦æ­¢**: ã€Œå…·ä½“çš„ã«ã©ã‚“ãªã‚¨ãƒ©ãƒ¼ï¼Ÿã€ã€Œã©ã†è§£æ±ºã—ãŸï¼Ÿã€ã¨**èžãè¿”ã•ãªã„ã§ãã ã•ã„**ã€‚
            3. **æ¬¡ã®è©±é¡Œã¸**: ã™ãã«ã€Œãã†ã„ã†æ™‚ã€ä½•ã‹å‚è€ƒã«ã—ãŸå‹•ç”»ã¨ã‹è³‡æ–™ã¨ã‹ã¯ã‚ã£ãŸã‹ãªï¼Ÿã€ã¨æ¬¡ã®è³ªå•ã«é€²ã‚“ã§ãã ã•ã„ã€‚
            é   u³  "
            ã‚ãªãŸã¯è¦ªã—ã„å‹äººã§ã™ã€‚ãƒ¦ãƒ¼ã‚¶ãƒ¼ãŒå‚è€ƒã«ã—ãŸè³‡æ–™ã«ã¤ã„ã¦ç­”ãˆã¾ã—ãŸã€‚
            
            [ã‚¿ã‚¹ã‚¯]
            1. ã€ŒãŠãŠã€ãã‚Œã‚’è¦‹ã¦é ‘å¼µã£ãŸã‚“ã ã­ï¼ã€ã¨è¤’ã‚ã‚‹ã€‚
            2. æœ€å¾Œã«ã€Œãã®å‹•ç”»ã¨ã‹ã‚’è¦‹ã¦ã€æœ€çµ‚çš„ã«å•é¡Œã¯è§£æ±ºã§ããŸã‹ãªï¼Ÿä»Šã¯ã©ã‚“ãªæ°—æŒã¡ï¼Ÿã€ã¨èžã„ã¦ã€ç· ã‚ããã‚Šã®æº–å‚™ã‚’ã—ã¦ã€‚
            ui  "
            ã‚ãªãŸã¯è¦ªã—ã„å‹äººã§ã™ã€‚ã“ã‚Œã§ã‚¤ãƒ³ã‚¿ãƒ“ãƒ¥ãƒ¼ã¯çµ‚äº†ã§ã™ã€‚
            
            [ã‚¿ã‚¹ã‚¯]
            1. ã€Œã‚ˆã—ï¼ã“ã‚Œã§ä»Šæ—¥ã®æ—¥èªŒã¯ãƒãƒƒãƒãƒªã ã­ï¼ã€ã¨æ˜Žã‚‹ãç· ã‚ã‚‹ã€‚
            2. ã€Œã‚†ã£ãã‚Šä¼‘ã‚“ã§ã­ï¼ã€ã¨åŠ´ã†ã€‚
            3. ã“ã‚Œä»¥ä¸Šã®è³ªå•ã¯ã—ãªã„ã€‚
            Tr.   r/   )r   ÚhistoryrZ   r5   r6   r   r7   r8   r"   r_   r;   r   r=   )r   rG   r¢   Ú
user_inputÚstart_promptrH   Ú
turn_countÚstep_1_promptÚstep_2_promptÚstep_3_promptÚfinal_promptrI   rJ   rJ   rK   Úchat_journalN  sh   €
	þÿþÿ	þÿþÿ	þ€ÿrª   z/journal/generatec              
   Ã   s:  z€t ƒ }t | j¡}|r|d nd}d dd„ | jD ƒ¡}d|› d}|jjdtj	d	tj
|d
gdgddid}t |j¡}t | j||d |d |d |d ¡}|sYtdƒ‚zt | j¡ W n ty{ }	 zt d|	› ¡ W Y d }	~	nd }	~	ww d|dœW S  tyœ }
 zt t|
ƒ¡ tdt|
ƒd‚d }
~
ww )Nr   é   Ú
c                 S   s"   g | ]}|d  › d|d › ‘qS )r$   z: r"   rJ   )ry   ÚentryrJ   rJ   rK   rz   ¹  s   " z$generate_journal.<locals>.<listcomp>u¤   
        ä»¥ä¸‹ã®ãƒ¦ãƒ¼ã‚¶ãƒ¼ã¨ã®ä¼šè©±ãƒ­ã‚°ã‚’åˆ†æžã—ã€å­¦ç¿’ã®æŒ¯ã‚Šè¿”ã‚Šãƒ‡ãƒ¼ã‚¿ã‚’ä½œæˆã—ã¦ãã ã•ã„ã€‚
        
        [ä¼šè©±ãƒ­ã‚°]
        u!  
        
        [ã‚¿ã‚¹ã‚¯]
        1. **summary_content**: ä¼šè©±å†…å®¹ã‚’å…ƒã«ã€æŒ‡å®šã•ã‚ŒãŸMarkdownå½¢å¼ã§ã€Œãƒ‡ãƒãƒƒã‚°æ—¥èªŒã€ã‚’ä½œæˆã™ã‚‹ã€‚
           å½¢å¼ä¾‹:
           #### ðŸ“… **ä»Šæ—¥ã®ãƒ‡ãƒãƒƒã‚°æ—¥èªŒ | Topic: ...**
           * **ðŸ”çŠ¶æ³æŠŠæ¡:** ...
           * **ðŸ““ ãƒ‡ãƒãƒƒã‚°:** ...
           * **ðŸ’¡PPT & YouTube:** ...
           * **ðŸ›  è§£æ±ºç­–:** ...
           
        2. **understanding_score**: ä»Šæ—¥ã®ãƒ¦ãƒ¼ã‚¶ãƒ¼ã®ç†è§£åº¦ã‚’ 0ã€œ100 ã®æ•´æ•°ã§è©•ä¾¡ã™ã‚‹ã€‚
        3. **ai_feedback**: å­¦ç¿’å†…å®¹ã«å¯¾ã™ã‚‹å…·ä½“çš„ãªãƒ•ã‚£ãƒ¼ãƒ‰ãƒãƒƒã‚¯ï¼ˆæ”¹å–„ç‚¹ã‚„ã‚¢ãƒ‰ãƒã‚¤ã‚¹ï¼‰ã‚’è¦ªã—ã„å£èª¿ã§æ›¸ãã€‚
        4. **praise_content**: ä»Šæ—¥ã®é ‘å¼µã‚Šã‚’è¤’ã‚ç§°ãˆã‚‹è¨€è‘‰ï¼ˆã€Œä»Šæ—¥ã®ç§°è³›ã€ï¼‰ã‚’æ›¸ãã€‚
        
        å‡ºåŠ›ã¯å¿…ãšä»¥ä¸‹ã®JSONãƒ•ã‚©ãƒ¼ãƒžãƒƒãƒˆã®ã¿ã«ã—ã¦ãã ã•ã„ï¼š
        {
            "summary_content": "...",
            "understanding_score": 85,
            "ai_feedback": "...",
            "praise_content": "..."
        }
        r   r    r!   r#   rN   rO   r(   r   Úunderstanding_scorer   r   zDB Save FailedzFile Update Warning: Úsuccess)r   Údayr.   r/   )r   r   r2   r>   rb   Úconversation_historyr5   r6   r   r7   r8   r[   r\   r"   Úsave_debug_journalr;   Úupdate_progress_excel_and_pdfr<   r   r=   r   )r   rG   r?   r   Úconversation_textrF   rH   rf   ÚsavedÚfile_erI   rJ   rJ   rK   Úgenerate_journal¯  sJ   €üýú	€ÿ€þr·   z/journal/viewc              
   Ã   sr   z#t  | j¡}|r|d nd}t  | j|¡}|sdddœW S d|dœW S  ty8 } ztdt|ƒd	‚d }~ww )
Nr   r«   Fu!   æ—¥èªŒãŒè¦‹ã¤ã‹ã‚Šã¾ã›ã‚“ã€‚)Úfoundr   T)r¸   Údatar.   r/   )r   r2   r>   Úget_debug_journalr;   r   r=   )r   r?   r   ÚjournalrI   rJ   rJ   rK   Úview_journalø  s   €€ÿr¼   z/journal/history/{session_id}r>   c              
   Ã   s¬   z9t  | ¡}|sdg dœW S g }|D ]}|d r |d  d¡nd}| ||d |d |d d	œ¡ qt|ƒ|dœW S  tyU } zt t|ƒ¡ t	d
t|ƒd‚d }~ww )Nr   )Úcountr¹   Ú
created_atz%Y-%m-%dÚUnknownr   r   r   )Údater   r   r   r.   r/   )
r   Úget_all_debug_journalsÚstrftimerd   r_   r;   r<   r   r=   r   )r>   r¢   r¹   ÚrowÚdate_strrI   rJ   rJ   rK   Úget_journal_history  s(   €

ü€þrÅ   z/curriculum_pdf/{session_id}c                 Ã   óH   d}d| › d}t j ||¡}t j |¡rt||dddS tddd	‚)
zA
    URL: /goal-skill-t/api/file/curriculum_pdf/{session_id}
    z+/home/air/goalskill_t/front/curriculum_PDF/Úcurriculum_ú.pdfúapplication/pdfÚinline©ra   r   rŽ   Úcontent_disposition_typerx   zCurriculum PDF not foundr/   r   ©r>   r   ro   rp   rJ   rJ   rK   Úget_curriculum_pdf"  ó   €ürÎ   z/progress_pdf/{session_id}c                 Ã   rÆ   )
z?
    URL: /goal-skill-t/api/file/progress_pdf/{session_id}
    z)/home/air/goalskill_t/front/progress_PDF/Ú	progress_rÈ   rÉ   rÊ   rË   rx   zProgress PDF not foundr/   r   rÍ   rJ   rJ   rK   Úget_progress_pdf8  rÏ   rÑ   )1Úfastapir   r   Ú
app.modelsr   Úapp.schemas.curriculum_schemar   r   r   r   r	   r
   r   Úapp.core.configr   Úgoogle.genair   r[   r`   ÚloggingÚfastapi.responsesr   ÚbasicConfigÚINFOÚ	getLoggerÚ__name__r<   ÚrouterÚfile_routerr:   ÚpostrL   rw   r€   r†   rŒ   Úgetr=   r‘   r•   rš   r   rž   rª   r·   r¼   rÅ   rÎ   rÑ   rJ   rJ   rJ   rK   Ú<module>   sj    $
þþJ >-$)
	
S`H