§
    ¿4Ëj…@ ã                   ó	  — U 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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 ddlZddlZddlmZmZmZ ej        dk    rC	 ej                             d¬	¦  «         ej                             d¬	¦  «         n# e$ r Y nw xY w ee¦  «                              ¦   «         j!        j!        Z"e"d
z  dz  Z#e"d
z  dz  Z$e"d
z  dz  Z%e"d
z  dz  Z&	 ddl'm(Z( e"dz  Z) ed¦  «        Z*e) +                    ¦   «         r e(e)d¬¦  «         n.e* +                    ¦   «         r e(e*d¬¦  «         n e(d¬¦  «         n# e$ r Y nw xY w	 ddl,m-Z-m.Z.m/Z/m0Z0 n-# e1$ r% 	 ddl,m-Z-m.Z.m/Z/m0Z0 n# e$ r dZ-dZ.dZ/d„ Z0Y nw xY wY nw xY wdddddddddddddddœZ2ee3e3f         e4d<   dddœdddœdddœdd dœdd!dœdd"dœdd#dœdd$dœdd%dœdd&dœdd'dœdd(dœdd)dœdd*dœdœZ5ee3ee3e3f         f         e4d+<    G d,„ d-e¦  «        Z6 G d.„ d/e¦  «        Z7 G d0„ d1e¦  «        Z8d2e3d3ee         fd4„Z9dmd7ed8e:d9e:d3ee;         fd:„Z<dnd;ee3         d9e:d3ee;         fd<„Z=d7ed3e>fd=„Z?d>ej@        d3ej@        fd?„ZA G d@„ dA¦  «        ZBdBed3efdC„ZCe"d
z  dDz  ZDdEZE G dF„ dG¦  «        ZF G dH„ dI¦  «        ZG G dJ„ dK¦  «        ZH G dL„ dM¦  «        ZI G dN„ dO¦  «        ZJ	 	 	 dodQe3d7e3dRe3dSe3dTee3         d3e8fdU„ZK	 dpdVe3d;ee3         dTee3         d3e8fdW„ZLeMdXk    �rgddlNZN eNjO        dY¬Z¦  «        ZPeP Q                    d[e3d\¬]¦  «         eP Q                    d^e3d_¬]¦  «         eP Q                    d`e3dPda¬b¦  «         eP Q                    dce3dPdd¬b¦  «         eP Q                    dee3df¬]¦  «         eP Q                    dgdhdi¬j¦  «         eP R                    ¦   «         ZSeSjT        rJeSjU        rC eKeSjT        eSjU        eSjV        eSjW        ¦  «        ZX eYeX Z                    dk¬l¦  «        ¦  «         dS eSj[        r>eSj\        r7 eLeSj[        eSj\        ¦  «        ZX eYeX Z                    dk¬l¦  «        ¦  «         dS eP ]                    ¦   «          dS dS )qu’  
=============================================================================
THáº¬P NGÅ¨ NIÃŠN (THE FIFTEEN SPRINGS) - 2-TIER QUALITY GATE & CLASSIFIER
=============================================================================
Module: antigravity_critic_gate.py
Author: Nguyá»…n SÄ© SÆ¡n / AI Cinema Production Team
Standard: AGENTS.md, GEMINI.md, ORIGINAL_REQUEST.md Â§R1

Cá»•ng kiá»ƒm duyá»‡t 2 táº§ng (Shot-Level 10s & Scene-Level 30-40s):
- Táº§ng 1 (Shot Gate): Tháº©m Ä‘á»‹nh Ä‘Ãºng nhÃ¢n váº­t (khÃ´ng nháº§m vai/morphing),
  khÃ´ng dá»‹ táº­t thá»‹ giÃ¡c (máº¯t lÃ©, thá»«a chi, máº·t sÃ¡p), tuÃ¢n thá»§ Audio Guard,
  ngÆ°á»¡ng phÃª duyá»‡t overall_score >= 0.8.
- Táº§ng 2 (Scene Gate): Kiá»ƒm duyá»‡t Ä‘iá»ƒm giao cáº¯t tiáº¿p biÃªn (junction),
  quy táº¯c trá»¥c 180 Ä‘á»™, Ä‘á»™ khá»›p hÆ°á»›ng nhÃ¬n, Ä‘á»™ chÃªnh mÃ u (color continuity),
  nhá»‹p Ä‘iá»‡u cáº¯t dá»±ng (editing tempo & static freeze > 2s), tá»± Ä‘á»™ng kÃ­ch hoáº¡t
  Color Match hoáº·c Trim Static.
- Ä�á»™ng cÆ¡ tháº©m Ä‘á»‹nh:
  1. Primary: Google Antigravity SDK (Agent + LocalAgentConfig, response_schema=VideoCriticVerdict)
  2. Secondary: Google GenAI Client (gemini-2.5-flash with structured output)
  3. Offline Heuristic Fallback: OpenCV/FFprobe (duration, resolution, audio stream,
     histogram delta between frames, black/frozen frame detection).
=============================================================================
é    N)Údatetime)ÚPath)ÚListÚOptionalÚDictÚAnyÚTupleÚUnion)Ú	BaseModelÚFieldÚmodel_validatorÚwin32úutf-8©ÚencodingÚ	04_AssetsÚ
charactersÚ	keyframesÚvideosÚcritic_queue)Úload_dotenvz.envz1C:\Users\Admin\.gemini\antigravity\mem0_data\.envT)Úoverride)ÚZeroWasteContactSheetÚ!generate_zero_waste_contact_sheetÚextract_contact_sheet_bytesÚcompute_zero_waste_gridé   c                 ó
   — | dfS )Nr   © )Úns    úGC:\Projects\KieuStory\05_Production_Pipeline\antigravity_critic_gate.pyú<lambda>r"   V   s
   € ¨Q°¨F€ ó    ÚcriticalÚhighÚminor)Úcharacter_driftÚ
breed_swapÚrole_reversalÚbrand_logo_textÚcharacter_count_driftÚcamera_driftÚobject_morphÚreverse_motionÚhuman_hands_limbsÚscale_breakÚlighting_jitterÚ
micro_blurÚbackground_warpÚcolor_shiftÚFLOWKIT_ERROR_TIERSub   Máº·t nhÃ¢n váº­t biáº¿n dáº¡ng / sai lá»‡ch Ä‘áº·c Ä‘iá»ƒm nháº­n diá»‡n so vá»›i Character Bible)ÚtierÚdescriptionuQ   TrÃ¡o Ä‘á»•i vai diá»…n / nháº§m láº«n nhÃ¢n váº­t giá»¯a cÃ¡c vai chÃ­nh - phá»¥uW   Ä�á»•i vá»‹ tháº¿ nhÃ¢n váº­t / nháº§m vai chá»§ khÃ¡ch hoáº·c hÃ nh vi Ä‘á»‘i nghá»‹chuD   Watermark láº¡, logo thÆ°Æ¡ng hiá»‡u, hoáº·c text glitch nhÃ¢n táº¡ou`   Thá»«a / thiáº¿u nhÃ¢n váº­t chÃ­nh, nhÃ¢n váº­t Ä‘á»™t ngá»™t xuáº¥t hiá»‡n hoáº·c biáº¿n máº¥tuR   Rung láº¯c báº¥t thÆ°á»�ng, chuyá»ƒn Ä‘á»™ng camera giáº­t cá»¥c, gÃ£y trá»¥c mÃ¡yuX   Ä�áº¡o cá»¥ / trang phá»¥c bá»‹ biáº¿n hÃ¬nh vÃ´ lÃ½, máº¥t tÃ­nh nháº¥t quÃ¡n váº­t lÃ½uX   Chuyá»ƒn Ä‘á»™ng Ä‘i lÃ¹i vÃ´ lÃ½, nÆ°á»›c cháº£y ngÆ°á»£c, quá»¹ Ä‘áº¡o giáº­t ngÆ°á»£cu?   Dá»‹ táº­t bÃ n tay 6 ngÃ³n, dÃ­nh ngÃ³n, thá»«a chi, máº¯t lÃ©uY   Sai lá»‡ch tá»· lá»‡ cÆ¡ thá»ƒ hoáº·c kÃ­ch thÆ°á»›c dá»‹ thÆ°á»�ng so vá»›i bá»‘i cáº£nhu5   Nháº¥p nhÃ¡y Ã¡nh sÃ¡ng nháº¹ giá»¯a cÃ¡c khung hÃ¬nhuO   NhÃ²e chuyá»ƒn Ä‘á»™ng nháº¹, giáº£m chi tiáº¿t vÃ  Ä‘á»™ tÆ°Æ¡ng pháº£n vi mÃ´u&   Háº­u cáº£nh bá»‹ mÃ©o nháº¹ á»Ÿ biÃªnu=   Sai lá»‡ch tÃ´ng mÃ u nháº¹ giá»¯a Ä‘áº§u vÃ  Ä‘uÃ´i cÃº mÃ¡yÚFLOWKIT_ERROR_CATALOGc                   óŒ  — e Zd ZU dZ edd¬¦  «        Zeed<    edddd¬	¦  «        Ze	ed
<    edddd¬	¦  «        Z
e	ed<    eed¬¦  «        Zee         ed<    eed¬¦  «        Zee         ed<    eed¬¦  «        Zeeef         ed<    edd¬¦  «        Zeed<    edd¬¦  «        Zeed<    edddd¬	¦  «        Ze	ed<   dS )ÚShotEvaluationuR   Ä�Ã¡nh giÃ¡ chi tiáº¿t á»Ÿ cáº¥p Ä‘á»™ tá»«ng cÃº mÃ¡y 10s (Táº§ng 1 - Shot Gate).Tu]   XÃ¡c nháº­n nhÃ¢n váº­t hiá»ƒn thá»‹ khá»›p vá»›i vai diá»…n ká»‹ch báº£n vÃ  Character Bible©Údefaultr7   Úcharacter_matchç      ð?ç        u:   Ä�á»™ tin cáº­y nháº­n diá»‡n nhÃ¢n váº­t (0.0 Ä‘áº¿n 1.0)©r<   ÚgeÚler7   Úcharacter_confidenceum   Ä�iá»ƒm nháº¥t quÃ¡n nhÃ¢n váº­t (0.0 Ä‘áº¿n 1.0; náº¿u cÃ³ lá»—i Critical thÃ¬ <= 0.30 theo chuáº©n FlowKit)Úcharacter_consistencyui   Danh sÃ¡ch dá»‹ táº­t thá»‹ giÃ¡c phÃ¡t hiá»‡n Ä‘Æ°á»£c (máº·t sÃ¡p, nhÃ²e hÃ¬nh, Ä‘en hÃ¬nh, Ä‘Æ¡ hÃ¬nh)©Údefault_factoryr7   Úvisual_defectsuP   Danh sÃ¡ch cÃ¡c lá»—i phÃ¡t hiá»‡n theo bá»™ danh má»¥c 14 lá»—i chuáº©n FlowKitÚdetected_errorsu?   PhÃ¢n loáº¡i má»©c Ä‘á»™ nghiÃªm trá»�ng: critical, high, minorÚerror_severitiesFuF   Cá»� phÃ¡t hiá»‡n máº¯t lÃ©, ngÃ³n tay biáº¿n dáº¡ng hoáº·c thá»«a chiÚsquint_or_extra_limbsuX   XÃ¡c nháº­n Ã¢m thanh tuÃ¢n thá»§ Audio Guard (khÃ´ng nháº¡c rÃ¡c, khÃ´ng táº¡p Ã¢m rÃ¨)Úaudio_guard_okuF   Ä�iá»ƒm Ä‘Ã¡nh giÃ¡ shot tá»« 0.0 Ä‘áº¿n 1.0 (ngÆ°á»¡ng Ä‘áº¡t >= 0.8)ÚscoreN)Ú__name__Ú
__module__Ú__qualname__Ú__doc__r   r=   ÚboolÚ__annotations__rC   ÚfloatrD   ÚlistrG   r   ÚstrrH   ÚdictrI   r   rJ   rK   rL   r   r#   r!   r:   r:   ±   sê  € € € € € € Ø\Ð\Ø!˜EØØsðñ ô €O�Tð ð ñ ð #( %ØØØØPð	#ñ #ô #Ð˜%ð ð ñ ð $) 5ØØØð Dð	$ñ $ô $Ð˜5ð ð ñ ð !& ØØð!ñ !ô !€N�D˜”Ið ð ñ ð "' ØØfð"ñ "ô "€O�T˜#”Yð ð ñ ð (- uØØUð(ñ (ô (Ð�d˜3 ˜8”nð ð ñ ð #( %ØØ\ð#ñ #ô #Ð˜4ð ð ñ ð !˜5ØØnðñ ô €N�Dð ð ñ ð �5ØØØØ\ð	ñ ô €Eˆ5ð ð ñ ð ð r#   r:   c                   ó@  — e Zd ZU dZ edddd¬¦  «        Zeed<    edd¬	¦  «        Ze	ed
<    edd¬	¦  «        Z
e	ed<    edddd¬¦  «        Zeed<    edd¬	¦  «        Ze	ed<    edd¬	¦  «        Ze	ed<    edd¬	¦  «        Ze	ed<    edddd¬¦  «        Zeed<   dS )ÚSceneEvaluationuS   Ä�Ã¡nh giÃ¡ chi tiáº¿t á»Ÿ cáº¥p Ä‘á»™ toÃ n cáº£nh 30-40s (Táº§ng 2 - Scene Gate).r>   r?   ue   Ä�á»™ mÆ°á»£t mÃ  cá»§a Ä‘iá»ƒm giao cáº¯t tiáº¿p biÃªn giá»¯a cÃ¡c shot liá»�n ká»� (0.0 Ä‘áº¿n 1.0)r@   Újunction_smoothnessTuE   TuÃ¢n thá»§ quy táº¯c trá»¥c 180 Ä‘á»™, khÃ´ng nháº£y trá»¥c vÃ´ cá»›r;   Úaxis_180_okuR   Ä�á»™ khá»›p hÆ°á»›ng nhÃ¬n (eyeline match) giá»¯a cÃ¡c nhÃ¢n váº­t Ä‘á»‘i thoáº¡iÚ
eyeline_okuP   Ä�á»™ Ä‘á»“ng nháº¥t mÃ u sáº¯c vÃ  Ã¡nh sÃ¡ng giá»¯a cÃ¡c shot (0.0 Ä‘áº¿n 1.0)Úcolor_continuityFue   Tá»± Ä‘á»™ng kÃ­ch hoáº¡t bá»™ cÃ¢n báº±ng mÃ u (Color Match) khi Ä‘á»™ chÃªnh mÃ u vÆ°á»£t ngÆ°á»¡ngÚtrigger_color_matchuO   Nhá»‹p Ä‘iá»‡u dá»±ng phim Ä‘áº¡t chuáº©n, khÃ´ng cÃ³ khoáº£ng cháº¿t vÃ´ há»“nÚtempo_oku_   Tá»± Ä‘á»™ng kÃ­ch hoáº¡t cáº¯t tá»‰a (Trim) khi phÃ¡t hiá»‡n Ä‘oáº¡n tÄ©nh kÃ©o dÃ i > 2 giÃ¢yÚtrigger_trim_staticuG   Ä�iá»ƒm Ä‘Ã¡nh giÃ¡ scene tá»« 0.0 Ä‘áº¿n 1.0 (ngÆ°á»¡ng Ä‘áº¡t >= 0.8)rL   N)rM   rN   rO   rP   r   rY   rS   rR   rZ   rQ   r[   r\   r]   r^   r_   rL   r   r#   r!   rX   rX   ß   s¨  € € € € € € Ø]Ð]Ø!& ØØØØ{ð	"ñ "ô "Ð˜ð ð ñ ð ˜ØØ[ðñ ô €K�ð ð ñ ð �uØØhðñ ô €J�ð ð ñ ð $˜eØØØØfð	ñ ô Ð�eð ð ñ ð !& ØØ{ð!ñ !ô !Ð˜ð ð ñ ð �UØØeðñ ô €Hˆdð ð ñ ð !& ØØuð!ñ !ô !Ð˜ð ð ñ ð �5ØØØØ]ð	ñ ô €Eˆ5ð ð ñ ð ð r#   rX   c                   óÈ  — e Zd ZU dZ edddd¬¦  «        Zeed<    edd	¬
¦  «        Ze	ed<    edd¬
¦  «        Z
ee         ed<    edd¬
¦  «        Zee         ed<    eed¬¦  «        Zee         ed<    eed¬¦  «        Zeeef         ed<    edd¬
¦  «        Zee         ed<    edd¬
¦  «        Zeed<    edd¬
¦  «        Zeed<    ed¬¦  «        d"d!„¦   «         ZdS )#ÚVideoCriticVerdictuã   
    Káº¿t quáº£ tháº©m Ä‘á»‹nh tá»•ng há»£p cá»§a Cá»•ng Kiá»ƒm duyá»‡t Antigravity.
    NgÆ°á»¡ng phÃª duyá»‡t: overall_score >= 0.8.
    TÃ­ch há»£p bá»™ cháº·n cá»©ng FlowKit Hard Caps (Critical <= 0.59, High <= 0.74).
    .r?   r>   uJ   Ä�iá»ƒm tá»•ng há»£p tá»« 0.0 Ä‘áº¿n 1.0. NgÆ°á»¡ng cháº¥p thuáº­n: >= 0.8)rA   rB   r7   Úoverall_scoreFua   Tráº¡ng thÃ¡i phÃª duyá»‡t (True náº¿u overall_score >= 0.8 vÃ  khÃ´ng cÃ³ lá»—i nghiÃªm trá»�ng)r;   ÚapprovedNuC   Ä�Ã¡nh giÃ¡ chi tiáº¿t cáº¥p Ä‘á»™ shot (náº¿u kiá»ƒm duyá»‡t shot)Ú	shot_evaluE   Ä�Ã¡nh giÃ¡ chi tiáº¿t cáº¥p Ä‘á»™ scene (náº¿u kiá»ƒm duyá»‡t scene)Ú
scene_evaluM   Tá»•ng há»£p danh sÃ¡ch cÃ¡c lá»—i phÃ¡t hiá»‡n theo chuáº©n FlowKit 14 lá»—irE   rH   uE   Má»©c Ä‘á»™ nghiÃªm trá»�ng cá»§a tá»«ng lá»—i: critical, high, minorrI   uF   Ä�Æ°á»�ng dáº«n file Zero-Waste Contact Sheet phá»¥c vá»¥ kiá»ƒm toÃ¡nÚcontact_sheet_pathÚAPPROVEuP   HÃ nh Ä‘á»™ng Ä‘á»� xuáº¥t: APPROVE, RETAKE_SHOT, APPLY_COLOR_MATCH, TRIM_STATICÚsuggested_actionÚ uU   Ghi chÃº chi tiáº¿t tá»« Há»™i Ä‘á»“ng PhÃª bÃ¬nh MLLM vÃ  bá»™ phÃ¢n tÃ­ch HeuristicÚcritique_notesÚafter)ÚmodeÚreturnc                 ó2  ‡— t          | j        ¦  «        }t          | j        ¦  «        Š| j        rU| j        j        D ]}||vr|                     |¦  «         Œ| j        j                             ¦   «         D ]\  }}|‰vr|‰|<   Œ|| _        ‰| _        t          ˆfd„|D ¦   «         ¦  «        }t          ˆfd„|D ¦   «         ¦  «        }|r«t          t          | j
        ¦  «        d¦  «        | _
        | j        rnt          t          | j        j        ¦  «        d¦  «        | j        _        t          t          | j        j        ¦  «        d¦  «        | j        _        d| j        _        d| _        d| _        n |rnt          t          | j
        ¦  «        d¦  «        | _
        | j        r1t          t          | j        j        ¦  «        d¦  «        | j        _        d| _        d| _        n0| j        �d	nd
}| j
        |k    r| j        dk    rd| _        nd| _        | S )u$  
        Ä�á»“ng bá»™ tráº¡ng thÃ¡i phÃª duyá»‡t nghiÃªm ngáº·t theo chá»‰ thá»‹ FlowKit Hard Caps:
        1. Náº¿u phÃ¡t hiá»‡n Báº¤T Ká»² lá»—i Critical nÃ o:
           - character_consistency Báº®T BUá»˜C bá»‹ Ã©p xuá»‘ng <= 0.30 (tÆ°Æ¡ng Ä‘Æ°Æ¡ng 3.0/10).
           - overall_score Báº®T BUá»˜C bá»‹ Ã©p xuá»‘ng <= 0.59 (tÆ°Æ¡ng Ä‘Æ°Æ¡ng 5.9/10).
           - approved = False, suggested_action = "RETAKE_SHOT" (triá»‡t tiÃªu sá»± khoan dung cá»§a LLM).
        2. Náº¿u phÃ¡t hiá»‡n lá»—i High:
           - overall_score Báº®T BUá»˜C bá»‹ Ã©p xuá»‘ng <= 0.74 (dÆ°á»›i ngÆ°á»¡ng 0.8).
           - approved = False, suggested_action = "RETAKE_SHOT".
        3. Náº¿u khÃ´ng cÃ³ lá»—i Critical/High:
           - Duy trÃ¬ phÃª duyá»‡t khi overall_score >= 0.8 vÃ  action != "RETAKE_SHOT".
        c              3   ó†   •K  — | ];}‰                      |¦  «        d k    pt                                |¦  «        d k    V — Œ<dS )r$   N©Úgetr5   ©Ú.0ÚeÚall_severitiess     €r!   ú	<genexpr>z9VideoCriticVerdict.sync_approval_state.<locals>.<genexpr>S  sd   øè è € ð 
ð 
àð ×Ò˜qÑ!Ô! ZÒ/Ð[Õ3F×3JÒ3JÈ1Ñ3MÔ3MÐQ[Ò3[ð
ð 
ð 
ð 
ð 
ð 
r#   c              3   ó†   •K  — | ];}‰                      |¦  «        d k    pt                                |¦  «        d k    V — Œ<dS )r%   Nrp   rr   s     €r!   rv   z9VideoCriticVerdict.sync_approval_state.<locals>.<genexpr>W  sc   øè è € ð 
ð 
àð ×Ò˜qÑ!Ô! VÒ+ÐSÕ/B×/FÒ/FÀqÑ/IÔ/IÈVÒ/Sð
ð 
ð 
ð 
ð 
ð 
r#   gáz®Gáâ?ç333333Ó?FÚRETAKE_SHOTg®Gáz®ç?Nç      è?çš™™™™™é?T)rT   rH   rV   rI   rd   ÚappendÚitemsÚanyÚminrS   rb   rD   rL   r=   rc   rh   re   )	ÚselfÚ
all_errorsrt   ÚkÚvÚhas_criticalÚhas_highÚ	min_scoreru   s	           @r!   Úsync_approval_statez&VideoCriticVerdict.sync_approval_state6  sL  ø€ õ ˜$Ô.Ñ/Ô/ˆ
Ý˜dÔ3Ñ4Ô4ˆàŒ>ð 	*Ø”^Ô3ð )ð )�Ø˜JÐ&Ð&Ø×%Ò% aÑ(Ô(Ð(øØœÔ7×=Ò=Ñ?Ô?ð *ð *‘��1Ø˜NÐ*Ð*Ø()�N 1Ñ%øà)ˆÔØ .ˆÔåð 
ð 
ð 
ð 
àð
ñ 
ô 
ñ 
ô 
ˆõ ð 
ð 
ð 
ð 
àð
ñ 
ô 
ñ 
ô 
ˆð
 ð 	&Ý!$¥U¨4Ô+=Ñ%>Ô%>ÀÑ!EÔ!EˆDÔØŒ~ð 7Ý7:½5ÀÄÔAeÑ;fÔ;fÐhlÑ7mÔ7m�”Ô4Ý'*­5°´Ô1EÑ+FÔ+FÈÑ'MÔ'M�”Ô$Ø16�”Ô.Ø!ˆDŒMØ$1ˆDÔ!Ð!Øð 	&Ý!$¥U¨4Ô+=Ñ%>Ô%>ÀÑ!EÔ!EˆDÔØŒ~ð NÝ'*­5°´Ô1EÑ+FÔ+FÈÑ'MÔ'M�”Ô$Ø!ˆDŒMØ$1ˆDÔ!Ð!à $¤Ð ;˜˜ÀˆIØÔ! YÒ.Ð.°4Ô3HÈMÒ3YÐ3YØ $�”�à %�”àˆr#   )rm   ra   )rM   rN   rO   rP   r   rb   rS   rR   rc   rQ   rd   r   r:   re   rX   rT   rH   r   rU   rV   rI   r   rf   rh   rj   r   r‡   r   r#   r!   ra   ra   	  s  € € € € € € ðð ð
 !˜5ØØØØ`ð	ñ ô €M�5ð ð ñ ð �UØØwðñ ô €Hˆdð ð ñ ð +0¨%ØØYð+ñ +ô +€Iˆx˜Ô'ð ð ñ ð -2¨EØØ[ð-ñ -ô -€J�˜Ô)ð ð ñ ð "' ØØcð"ñ "ô "€O�T˜#”Yð ð ñ ð (- uØØ[ð(ñ (ô (Ð�d˜3 ˜8”nð ð ñ ð ).¨ØØ\ð)ñ )ô )Ð˜ œð ð ñ ð "˜EØØfðñ ô Ð�cð ð ñ ð  ˜%ØØkðñ ô €N�Cð ð ñ ð
 €_˜'Ð"Ñ"Ô"ð:ð :ð :ñ #Ô"ð:ð :ð :r#   ra   Úcharacter_namerm   c                 ó$  ‡— | r|                       ¦   «         dv rdS |                       ¦   «                              dd¦  «                             ¦   «         }dddddd	d
dddddddddœ}|                     ¦   «         D ]+\  }}||v r"t          |z  }|                     ¦   «         r|c S Œ,t                               d¦  «        D ]M}|j                              ¦   «         Št          ˆfd„| 	                    d¦  «        D ¦   «         ¦  «        r|c S ŒNdS )uJ   TÃ¬m Ä‘Æ°á»�ng dáº«n áº£nh chÃ¢n dung chuáº©n trong 04_Assets/characters/.©ÚnoneÚsceneryri   Nú Ú_z;01_Main_Protagonists/kim_trong_18yo/kim_trong_18yo_720p.pngzI01_Main_Protagonists/thuy_kieu_maiden_16yo/thuy_kieu_maiden_16yo_720p.pngzG01_Main_Protagonists/thuy_van_maiden_16yo/thuy_van_maiden_16yo_720p.pngz?02_Vuong_Family_And_Fate/vuong_ong_55yo/vuong_ong_55yo_720p.pngz=02_Vuong_Family_And_Fate/vuong_ba_50yo/vuong_ba_50yo_720p.pngzA02_Vuong_Family_And_Fate/vuong_quan_16yo/vuong_quan_16yo_720p.pngz302_Vuong_Family_And_Fate/dam_tien/dam_tien_720p.pngz805_Imperial_Court_And_Officials/sai_nha/sai_nha_720p.pngzB05_Imperial_Court_And_Officials/thang_ban_to/thang_ban_to_720p.pngzI02_Vuong_Family_And_Fate/tieu_dong_kim_trong/tieu_dong_kim_trong_720p.pngz:04_Brokers_And_Brothels/ma_giam_sinh/ma_giam_sinh_720p.pngz,04_Brokers_And_Brothels/tu_ba/tu_ba_720p.pngz204_Brokers_And_Brothels/so_khanh/so_khanh_720p.png)Ú	kim_trongÚ	thuy_kieuÚthuy_kieu_maidenÚthuy_vanÚ	vuong_ongÚvuong_baÚ
vuong_quanÚdam_tienÚsai_nhaÚthang_ban_toÚtieu_dong_kim_trongÚ	tieu_dongÚma_giam_sinhÚtu_baÚso_khanhz**/*.pngc              3   óF   •K  — | ]}t          |¦  «        d k    ¯|‰v V — ŒdS )é   N)Úlen)rs   ÚtokÚstems     €r!   rv   z+_find_character_portrait.<locals>.<genexpr>›  s1   øè è € ÐMÐM˜s½sÀ3¹x¼xÈ1º}¸}ˆs�dˆ{¸}¸}¸}¸}ÐMÐMr#   )
ÚlowerÚreplaceÚstripr}   ÚCHARACTERS_DIRÚexistsÚglobr¢   r~   Úsplit)rˆ   Ú
char_cleanÚmappingÚkeyÚrelÚcandÚpr¢   s          @r!   Ú_find_character_portraitr°   x  sR  ø€ àð ˜^×1Ò1Ñ3Ô3Ð7NÐNÐNØˆtà×%Ò%Ñ'Ô'×/Ò/°°SÑ9Ô9×?Ò?ÑAÔA€Jð SØ`ØgØ]ØVØSØYØIØMØ\ØjØ`ØTØ?ØHðð €Gð$ —M’M‘O”Oð ð ‰ˆˆSØ�*ÐÐÝ! CÑ'ˆDØ�{Š{‰}Œ}ð Ø���øõ × Ò  Ñ,Ô,ð ð ˆØŒv�|Š|‰~Œ~ˆÝÐMÐMÐMÐM j×&6Ò&6°sÑ&;Ô&;ÐMÑMÔMÑMÔMð 	ØˆHˆHˆHð	ð ˆ4r#   rŸ   éÐ  Ú
video_pathÚ
max_framesÚmax_dimensionc           	      óB  ‡— |                       ¦   «         r|                      ¦   «         j        dk    rg S t          j        t          | ¦  «        ¦  «        }|                     ¦   «         sg S t          |                     t          j	        ¦  «        ¦  «        Š‰dk    r| 
                    ¦   «          g S ‰|k    rt          t          ‰¦  «        ¦  «        }nˆfd„g d¢d|…         D ¦   «         }g }|D �]}|                     t          j        |¦  «         |                     ¦   «         \  }}|r|€Œ?|j        dd…         \  }	}
t#          |	|
¦  «        |k    rV|t#          |	|
¦  «        z  }t          j        |t          |
|z  ¦  «        t          |	|z  ¦  «        ft          j        ¬¦  «        }t          j        d|t          t          j        ¦  «        dg¦  «        \  }}|r'|                     |                     ¦   «         ¦  «         �Œ| 
                    ¦   «          |S )	u®   
    TrÃ­ch xuáº¥t cÃ¡c khung hÃ¬nh Ä‘áº¡i diá»‡n (keyframes) tá»« video vÃ  nÃ©n thÃ nh JPEG bytes
    Ä‘á»ƒ náº¡p vÃ o ná»™i dung MLLM (Multimodal Gemini/Antigravity).
    r   c                 ó4   •— g | ]}t          ‰|z  ¦  «        ‘ŒS r   )Úint)rs   ÚrÚfcs     €r!   ú
<listcomp>z+_extract_keyframe_bytes.<locals>.<listcomp>³  s#   ø€ ÐLÐLÐL 1•3�r˜A‘v‘;”;ÐLÐLÐLr#   )çš™™™™™¹?çffffffÖ?gÍÌÌÌÌÌä?gÍÌÌÌÌÌì?Né   ©Úinterpolationú.jpgéP   )r§   ÚstatÚst_sizeÚcv2ÚVideoCapturerU   ÚisOpenedr·   rq   ÚCAP_PROP_FRAME_COUNTÚreleaserT   ÚrangeÚsetÚCAP_PROP_POS_FRAMESÚreadÚshapeÚmaxÚresizeÚ
INTER_AREAÚimencodeÚIMWRITE_JPEG_QUALITYr|   Útobytes)r²   r³   r´   ÚcapÚindicesÚkeyframe_bytesÚidxÚretÚframeÚhÚwÚscaleÚsuccessÚbufr¹   s                 @r!   Ú_extract_keyframe_bytesrß   ¡  sô  ø€ ð
 ×ÒÑÔð  *§/¢/Ñ"3Ô"3Ô";¸qÒ"@Ð"@Øˆ	Ý
Ô
�3˜z™?œ?Ñ
+Ô
+€CØ�<Š<‰>Œ>ð Øˆ	Ý	ˆS�WŠW•SÔ-Ñ.Ô.Ñ	/Ô	/€BØ	ˆQ‚w€wØ�Š‰ŒˆØˆ	à	ˆZÒÐÝ•u˜R‘y”y‘/”/ˆˆàLÐLÐLÐLÐ(>Ð(>Ð(>¸{À
¸{Ô(KÐLÑLÔLˆà€NØð 1ñ 1ˆØ�Š•Ô'¨Ñ-Ô-Ð-Ø—X’X‘Z”Z‰
ˆˆUØð 	�e�mØØŒ{˜2˜A˜2Œ‰ˆˆ1Ýˆq�!‰9Œ9�}Ò$Ð$Ø!¥C¨¨1¡I¤IÑ-ˆEÝ”J˜u¥s¨1¨u©9¡~¤~µs¸1¸u¹9±~´~Ð&FÕVYÔVdÐeÑeÔeˆEÝ”| F¨EµC½Ô8PÑ4QÔ4QÐSUÐ3VÑWÔW‰ˆ�Øð 	1Ø×!Ò! #§+¢+¡-¤-Ñ0Ô0Ð0ùØ‡K‚K�M„M€MØÐr#   Úshot_video_pathsc           
      óŠ  — g }t          t          | ¦  «        dz
  ¦  «        D �]Ÿ}t          | |         ¦  «        }t          | |dz            ¦  «        }|                     ¦   «         r|                     ¦   «         sŒYt	          j        t          |¦  «        ¦  «        }t	          j        t          |¦  «        ¦  «        }|                     ¦   «         r|                     ¦   «         s)|                     ¦   «          |                     ¦   «          Œìt          | 
                    t          j        ¦  «        ¦  «        }|                     t          j        t          d|dz
  ¦  «        ¦  «         |                     ¦   «         \  }	}
|                     t          j        d¦  «         |                     ¦   «         \  }}|                     ¦   «          |                     ¦   «          |
|fD ]Û}|�×|j        dd…         \  }}t          ||¦  «        |k    rV|t          ||¦  «        z  }t	          j        |t          ||z  ¦  «        t          ||z  ¦  «        ft          j        ¬¦  «        }t	          j        d|t          t          j        ¦  «        dg¦  «        \  }}|r'|                     |                     ¦   «         ¦  «         ŒÜ�Œ¡|S )u¸   
    TrÃ­ch xuáº¥t cÃ¡c cáº·p khung hÃ¬nh tiáº¿p biÃªn (tail frame shot N vs head frame shot N+1)
    Ä‘á»ƒ náº¡p vÃ o ná»™i dung MLLM Ä‘Ã¡nh giÃ¡ tÃ­nh liá»�n máº¡ch cá»§a Scene.
    r   r   Nr½   r¾   rÀ   rÁ   )rÉ   r    r   r§   rÄ   rÅ   rU   rÆ   rÈ   r·   rq   rÇ   rÊ   rË   rÎ   rÌ   rÍ   rÏ   rÐ   rÑ   rÒ   r|   rÓ   )rà   r´   Újunction_bytesÚiÚp1Úp2Úcap1Úcap2Úfc1Úret1Úf1Úret2Úf2ÚfrÚ   rÛ   rÜ   ÚsÚbs                      r!   Ú_extract_junction_frame_bytesrð   Æ  sP  € ð
 €NÝ•3Ð'Ñ(Ô(¨1Ñ,Ñ-Ô-ð 7ñ 7ˆÝÐ" 1Ô%Ñ&Ô&ˆÝÐ" 1 q¡5Ô)Ñ*Ô*ˆØ�yŠy‰{Œ{ð 	 "§)¢)¡+¤+ð 	ØÝÔ¥ B¡¤Ñ(Ô(ˆÝÔ¥ B¡¤Ñ(Ô(ˆØ�}Š}‰Œð 	 d§m¢m¡o¤oð 	Ø�LŠL‰NŒNˆNØ�LŠL‰NŒNˆNØÝ�$—(’(�3Ô3Ñ4Ô4Ñ5Ô5ˆØ�Š•Ô(­#¨a°°q±©/¬/Ñ:Ô:Ð:Ø—9’9‘;”;‰ˆˆbØ�Š•Ô(¨!Ñ,Ô,Ð,Ø—9’9‘;”;‰ˆˆbØ�Š‰ŒˆØ�Š‰ŒˆØ�b�ð 	7ð 	7ˆAØˆ}Ø”w˜r ˜r”{‘��1Ý�q˜!‘9”9˜}Ò,Ð,Ø)­C°°1©I¬IÑ5�EÝœ
 1¥s¨1¨u©9¡~¤~µs¸1¸u¹9±~´~Ð&FÕVYÔVdÐeÑeÔe�AÝ”| F¨AµµCÔ4LÑ0MÔ0MÈrÐ/RÑSÔS‘��1Øð 7Ø"×)Ò)¨!¯)ª)©+¬+Ñ6Ô6Ð6øñ	7ð Ðr#   c                 ód  — |                       ¦   «         r|                      ¦   «         j        dk    rdS 	 ddddddd	d
dt          | ¦  «        g
}t	          j        |ddd¬¦  «        }|j        dk    rdS |j        r|j                             ¦   «         sdS t          j
        |j        ¦  «        }|                     dg ¦  «        }|sdS |D ]T}|                     dd¦  «                             ¦   «         }|                     dd¦  «        }|r|dvr dS |�|dk    r dS ŒUdS # t          $ r Y dS w xY w)uˆ  
    Kiá»ƒm tra luá»“ng Ã¢m thanh thÃ´ng qua ffprobe.
    - KhÃ´ng cÃ³ luá»“ng audio (video silent / synthetic): Há»£p lá»‡ theo Audio Guard (khÃ´ng sinh nháº¡c rÃ¡c).
    - CÃ³ luá»“ng audio: PhÃ¢n tÃ­ch JSON tá»« stdout Ä‘á»ƒ xÃ¡c thá»±c codec (AAC/PCM/MP3) vÃ  channel count > 0.
    - Náº¿u ffprobe tráº£ vá»� lá»—i (exit code != 0) hoáº·c stdout khÃ´ng há»£p lá»‡: Tráº£ vá»� False.
    r   FÚffprobez-vÚerrorz-select_streamsÚaz-show_entriesz&stream=codec_name,channels,sample_ratez-ofÚjsonTé   )Úcapture_outputÚtextÚtimeoutÚstreamsÚ
codec_nameri   Úchannels)ÚaacÚ	pcm_s16leÚ	pcm_s24leÚmp3ÚopusÚflac)r§   rÂ   rÃ   rU   Ú
subprocessÚrunÚ
returncodeÚstdoutr¥   rõ   Úloadsrq   r£   Ú	Exception)r²   ÚcmdÚresÚdatarú   ÚstÚcodecrü   s           r!   Ú_check_audio_streamr  ê  s}  € ð ×ÒÑÔð  *§/¢/Ñ"3Ô"3Ô";¸qÒ"@Ð"@Øˆuðà�t˜WØ˜sØÐEØ�6Ý�
‰OŒOð
ˆõ Œn˜S°¸DÈ!ÐLÑLÔLˆØŒ>˜QÒÐØ�5ØŒzð 	 ¤×!1Ò!1Ñ!3Ô!3ð 	Ø�5ÝŒz˜#œ*Ñ%Ô%ˆØ—(’(˜9 bÑ)Ô)ˆØð 	à�4Øð 	ð 	ˆBØ—F’F˜<¨Ñ,Ô,×2Ò2Ñ4Ô4ˆEØ—v’v˜j¨!Ñ,Ô,ˆHØð ˜EÐ)aÐaÐaØ�u�uØÐ 8¨q¢= =Ø�u�uð $1àˆtøÝð ð ð Øˆuˆuðøøøs0   µ<D! Á3 D! Â1D! ÃA	D! Ä	D! ÄD! Ä!
D/Ä.D/Úimagec                 óÈ   — t          j        | t           j        ¦  «        }t          j        |gddgdddgg d¢¦  «        }t          j        ||ddt           j        ¬¦  «         |S )u0   TÃ­nh toÃ¡n HSV color histogram 3D chuáº©n hÃ³a.r   r   Né   é    )r   é´   r   é   )ÚalphaÚbetaÚ	norm_type)rÄ   ÚcvtColorÚCOLOR_BGR2HSVÚcalcHistÚ	normalizeÚNORM_MINMAX)r  ÚhsvÚhists      r!   Ú_compute_color_histogramr    s`   € å
Œ,�u�cÔ/Ñ
0Ô
0€CÝŒ<˜˜  1˜v t¨b°"¨XÐ7GÐ7GÐ7GÑHÔH€DÝ„M�$˜ A¨A½¼ÐIÑIÔIÐIØ€Kr#   c                   ót   — e Zd ZdZe	 	 ddededededef
d„¦   «         Zed	ed
ee         defd„¦   «         Z	dS )ÚOfflineHeuristicEngineu  
    Ä�á»™ng cÆ¡ tháº©m Ä‘á»‹nh xÃ¡c Ä‘á»‹nh (deterministic) dá»±a trÃªn OpenCV vÃ  FFprobe.
    Ä�Ã¡nh giÃ¡ Ä‘á»™ dÃ i, Ä‘á»™ phÃ¢n giáº£i, luá»“ng Ã¢m thanh, phÃ¡t hiá»‡n frame Ä‘en/Ä‘Æ¡ hÃ¬nh,
    Ä‘o tÆ°Æ¡ng quan mÃ u sáº¯c tiáº¿p biÃªn vÃ  Ä‘á»‘i soÃ¡t nhiá»…m vai nhÃ¢n váº­t.
    ri   Úshot_idÚvideo_path_strÚexpected_characterÚpromptrm   c                 ó6  ‡A— t          |¦  «        }|                     ¦   «         s5t          ddd|j        › �gddd¬¦  «        }t	          dd|dd|› �¬¦  «        S |                     ¦   «         j        dk    r(t          ddd	gd¬
¦  «        }t	          dd|dd¬¦  «        S t          j        t          |¦  «        ¦  «        }| 
                    ¦   «         s(t          dddgd¬
¦  «        }t	          dd|dd¬¦  «        S |                     t          j        ¦  «        pd}t          |                     t          j        ¦  «        ¦  «        }t          |                     t          j        ¦  «        ¦  «        }	t          |                     t          j        ¦  «        ¦  «        }
|dk    r||z  nd}g }d}|dk     r|                     d|d›d�¦  «         |	dk    s|
dk    r|                     d¦  «         n'|	dk     s|
dk     r|                     d|	› d|
› �¦  «         |
dk    r|	|
z  nd}t%          |dk     ¦  «        }|r |                     d|d›d|	› d|
› d�¦  «         g }t'          d|dz  ¦  «        }d}| 
                    ¦   «         r—t)          |¦  «        dk     r„|                     t          j        |¦  «         |                     ¦   «         \  }}|r|€nH|                     |¦  «         ||z  }||k    rn'| 
                    ¦   «         rt)          |¦  «        dk     °„|                     ¦   «          t3          |¦  «        D ]K\  }}t5          t7          j        |¦  «        ¦  «        }|dk     r|                     d |› d!|d›d"�¦  «          nŒLt)          |¦  «        d#k    rÜg }t;          t)          |¦  «        dz
  ¦  «        D ]Œ}t5          t7          j        t7          j        ||                              t4          ¦  «        ||dz                                 t4          ¦  «        z
  ¦  «        ¦  «        ¦  «        }|                     |¦  «         Œ�|rt'          |¦  «        nd}|d$k     r|                     d%¦  «         tA          |¦  «        }|s|                     d&¦  «         d'}d}| !                    ¦   «          "                    ¦   «         }|�r|d(v�rüd)|v }tG          d)¦  «        }tG          |¦  «        } |�r×|�rÔ|                     ¦   «         �r¿|t)          |¦  «        d*z           }!tI          |!¦  «        }"t          j%        t          |¦  «        ¦  «        }#|#�tI          |#¦  «        nd }$|$�-t5          t          j&        |"|$t          j'        ¦  «        ¦  «        nd}%|�sd}&| rs|                      ¦   «         r_t          j%        t          | ¦  «        ¦  «        }'|'�<tI          |'¦  «        }(t5          t          j&        |"|(t          j'        ¦  «        ¦  «        }&|%d+k    rV|&d,k     s	|%|&d-z   k    rGd}t'          dtQ          d|%z
  d*¦  «        ¦  «        }d'}|                     d.|%d/›d0|› d1|&d/›d"�¦  «         n]|&d2k    r+t'          d,tS          dt5          |&¦  «        ¦  «        ¦  «        }n+t'          dtS          dt5          |%¦  «        ¦  «        ¦  «        }d })tT          �I	 tU          |d3¬4¦  «        \  }*}+|+r!t          |+ +                    ¦   «         ¦  «        })n# tX          $ r Y nw xY wt[          d5„ |D ¦   «         ¦  «        },t[          d6„ |D ¦   «         ¦  «        }-t[          d7„ |D ¦   «         ¦  «        }.t[          d8„ |D ¦   «         ¦  «        }/t[          d9„ |D ¦   «         ¦  «        }0g }1i ŠAt5          |¦  «        }2|r|0r1|1 .                    d:d;g¦  «         d<‰Ad:<   d<‰Ad;<   tS          |2d-¦  «        }2|-r|1                     d=¦  «         d<‰Ad=<   |,r|1                     d>¦  «         d?‰Ad><   |r|1                     d@¦  «         d<‰Ad@<   n|.s|/r|1                     d@¦  «         d?‰Ad@<   |r|1                     dA¦  «         d?‰AdA<   |r�	 t5          t7          j        dB„ |D ¦   «         ¦  «        ¦  «        }3|3dCk    rMdD„ |D ¦   «         }4|4r?t5          t7          j        |4¦  «        ¦  «        dEk     r|1                     dF¦  «         dG‰AdF<   n# tX          $ r Y nw xY wt)          |¦  «        d#k    r_	 dH„ |D ¦   «         }5|5r?t5          t7          j/        |5¦  «        ¦  «        dIk    r|1                     dJ¦  «         dG‰AdJ<   n# tX          $ r Y nw xY wt)          |¦  «        d*k    rÚ	 t          j0        |d         t          j1        ¦  «        }6t          j0        |dK         t          j1        ¦  «        }7t7          j        |6dL¬M¦  «        }8t7          j        |7dL¬M¦  «        }9t5          t6          j2         3                    |8|9z
  ¦  «        dNz  ¦  «        }:|:dOk    r|1                     dP¦  «         dG‰AdP<   n# tX          $ r Y nw xY wd};|r|;d,z  };|r|0r|;d2z  };|,r|;dQz  };|-r|;dQz  };|.r|;dQz  };|/r|;dQz  };|s|;dRz  };|r|;dSz  };dT„ |D ¦   «         }<|<r#|;tS          d-t)          |<¦  «        dUz  ¦  «        z  };t'          dtS          dtQ          |;dV¦  «        ¦  «        ¦  «        };|p,|,p*|-p(|.p&|/p$|0p"| p|p| pt[          ˆAfdW„|1D ¦   «         ¦  «        }=|;d$k    o|= }>|>rdXnd}?dY| › dZ|d›d[|	› d|
› d\|› d]|d/›d^t)          |¦  «        › d_|1› d`|;d/›�}@t          |||2||1‰A|||;¬a¦	  «	        }t	          |;|>||1‰A|)|?|@¬b¦  «        S )cNFr?   zVideo file does not exist: )r=   rC   rG   rJ   rK   rL   ry   u%   Lá»—i: KhÃ´ng tÃ¬m tháº¥y file video )rb   rc   rd   rh   rj   r   zZero-byte corrupted file)r=   rC   rG   rL   u    Lá»—i: File video rá»—ng 0-byte.z,OpenCV could not open or decode video streamu7   Lá»—i: File video bá»‹ há»�ng, khÃ´ng thá»ƒ giáº£i mÃ£.g      8@r>   zDuration too short (z.1fzs, expected ~10s)zZero resolution detectedi€  ih  zLow resolution: ÚxçHáz®Gõ?zCRITICAL: Invalid aspect ratio z.3fú (zo). Cinema Feature cut requires 16:9 widescreen (1280x720). Vertical 9:16 is STRICTLY PROHIBITED in cinema cuts.r   é
   g      @z%Black frame detected at sample index z (luminance: ú)rŸ   r{   zAFrozen video detected (virtually zero micro-motion across frames)z,Audio stream missing or violated Audio GuardTrŠ   r�   r½   g333333ë?g333333ã?rx   uC   Character cross-contamination: ThÃºy Kiá»�u pattern detected (corr=ú.2fz) in 'z ' shot (expected character corr=ç      à?é   ©Ú
num_framesc              3   ó   K  — | ]}d |v V — Œ	dS )ÚFrozenNr   ©rs   Úds     r!   rv   z7OfflineHeuristicEngine.evaluate_shot.<locals>.<genexpr>Î  s&   è è € Ð7Ð7¨!˜ A˜Ð7Ð7Ð7Ð7Ð7Ð7r#   c              3   ó   K  — | ]}d |v V — Œ	dS )úBlack frameNr   r3  s     r!   rv   z7OfflineHeuristicEngine.evaluate_shot.<locals>.<genexpr>Ï  s'   è è € ÐBÐB°Q˜m¨qÐ0ÐBÐBÐBÐBÐBÐBr#   c              3   ó   K  — | ]}d |v V — Œ	dS )úDuration too shortNr   r3  s     r!   rv   z7OfflineHeuristicEngine.evaluate_shot.<locals>.<genexpr>Ð  s(   è è € ÐFÐF¸Ð/°1Ð4ÐFÐFÐFÐFÐFÐFr#   c              3   óB   K  — | ]}d |                      ¦   «         v V — ŒdS )Ú
resolutionN©r£   r3  s     r!   rv   z7OfflineHeuristicEngine.evaluate_shot.<locals>.<genexpr>Ñ  s/   è è € ÐDÐD°q˜¨¯ª©¬Ð2ÐDÐDÐDÐDÐDÐDr#   c              3   óB   K  — | ]}d |                      ¦   «         v V — ŒdS )úcross-contaminationNr;  r3  s     r!   rv   z7OfflineHeuristicEngine.evaluate_shot.<locals>.<genexpr>Ò  s0   è è € ÐTÐTÀqÐ 5¸¿º¹¼Ð BÐTÐTÐTÐTÐTÐTr#   r'   r(   r$   r*   r,   r%   r0   r/   c                 ó:   — g | ]}|®t          j        |¦  «        ‘ŒS ©N)ÚnpÚstd©rs   rí   s     r!   rº   z8OfflineHeuristicEngine.evaluate_shot.<locals>.<listcomp>õ  s!   € Ð)]Ð)]Ð)]¸ÈqÈ}­"¬&°©)¬)È}È}È}r#   g      4@c           
      óÈ   — g | ]_}|®t          t          j        t          j        |t          j        ¦  «        t          j        ¦  «                             ¦   «         ¦  «        ‘Œ`S r?  )rS   rÄ   Ú	Laplacianr  ÚCOLOR_BGR2GRAYÚCV_64FÚvarrB  s     r!   rº   z8OfflineHeuristicEngine.evaluate_shot.<locals>.<listcomp>÷  sW   € ð  ð  ð  à°1°=õ �cœm­C¬L¸½CÔ<NÑ,OÔ,OÕQTÔQ[Ñ\Ô\×`Ò`ÑbÔbÑcÔcØ3@°=°=r#   g      .@r2   r&   c           
      óŽ   — g | ]B}|®t          t          j        t          j        |t          j        ¦  «        ¦  «        ¦  «        ‘ŒCS r?  )rS   r@  ÚmeanrÄ   r  rE  rB  s     r!   rº   z8OfflineHeuristicEngine.evaluate_shot.<locals>.<listcomp>  s@   € ÐuÐuÐuÐPQÐghÐgt��bœg¥c¤l°1µcÔ6HÑ&IÔ&IÑJÔJÑKÔKÐgtÐgtÐgtr#   g     €F@r1   éÿÿÿÿ©r   r   ©Úaxisç     ào@gÍÌÌÌÌÌÜ?r4   r¼   g      Ð?gš™™™™™É?c                 óJ   ‡— g | ]Št          ˆfd „dD ¦   «         ¦  «        °‰‘Œ S )c              3   ó    •K  — | ]}|‰v V — Œ	d S r?  r   )rs   r‚   r4  s     €r!   rv   zBOfflineHeuristicEngine.evaluate_shot.<locals>.<listcomp>.<genexpr>0  s?   øè è € ð  ]ð  ] !�q˜A�vð  ]ð  ]ð  ]ð  ]ð  ]ð  ]r#   )zaspect ratior2  r6  r8  r:  r=  zAudio stream)r~   r3  s    @r!   rº   z8OfflineHeuristicEngine.evaluate_shot.<locals>.<listcomp>.  sk   ø€ ð 
ð 
ð 
ØÝð  ]ð  ]ð  ]ð  ]ð  (\ð  ]ñ  ]ô  ]ñ  ]ô  ]ð
Øð
ð 
ð 
r#   r»   é   c              3   óF   •K  — | ]}‰                      |¦  «        d v V — ŒdS ))r$   r%   N)rq   )rs   rt   rI   s     €r!   rv   z7OfflineHeuristicEngine.evaluate_shot.<locals>.<genexpr>;  s8   øè è € ÐYÐYÀAÐ ×$Ò$ QÑ'Ô'Ð+?Ð?ÐYÐYÐYÐYÐYÐYr#   rg   zShot z: Duration zs, Res z, CharMatch=z (conf=z), Defects=z, FlowKitErrors=ú, Score=)	r=   rC   rD   rG   rH   rI   rJ   rK   rL   )rb   rc   rd   rH   rI   rf   rh   rj   )4r   r§   r:   Únamera   rÂ   rÃ   rÄ   rÅ   rU   rÆ   rq   ÚCAP_PROP_FPSr·   rÇ   ÚCAP_PROP_FRAME_WIDTHÚCAP_PROP_FRAME_HEIGHTr|   rQ   rÎ   r    rÊ   rË   rÌ   rÈ   Ú	enumeraterS   r@  rI  rÉ   ÚabsÚastyper  r£   r¥   r°   r  ÚimreadÚcompareHistÚHISTCMP_CORRELÚroundr   r   Úresolver  r~   ÚextendrA  r  r  ÚlinalgÚnorm)Br"  r#  r$  r%  r²   rd   rÔ   ÚfpsÚframe_countÚwidthÚheightÚdurationÚdefectsÚsquint_extra_limbsÚaspect_ratioÚis_vertical_videoÚsampled_framesÚstepr×   rØ   rÙ   rã   Úmean_valÚdiffsÚdiffÚmax_diffÚaudio_okÚ
char_matchÚ	char_confÚexp_char_cleanÚis_kieu_expectedÚkieu_portraitÚexp_portraitÚsample_frameÚsample_histÚkieu_imgÚh_kieuÚ	corr_kieuÚcorr_expÚexp_imgÚh_expÚcs_path_strrŽ   Úcs_fileÚ	is_frozenÚhas_black_frameÚis_too_shortÚ
is_low_resÚhas_contaminationrH   Úchar_consistencyÚmean_stdÚlap_varsÚlumsÚhead_hsvÚtail_hsvÚmean_hÚmean_tÚ	delta_hsvrL   Úother_defectsÚhas_severe_defectrc   ÚactionÚnotesrI   sB                                                                    @r!   Úevaluate_shotz$OfflineHeuristicEngine.evaluate_shot$  s´  ø€ õ ˜.Ñ)Ô)ˆ
Ø× Ò Ñ"Ô"ð 	Ý&Ø %Ø%(Ø O¸j¼oÐ OÐ OÐPØ&+Ø$Øðñ ô ˆIõ &Ø!ØØ#Ø!.ØSÀzÐSÐSðñ ô ð ð �?Š?ÑÔÔ$¨Ò)Ð)Ý&Ø %Ø%(Ø :Ð;Øð	ñ ô ˆIõ &Ø!ØØ#Ø!.ØAðñ ô ð õ Ô�s :™œÑ/Ô/ˆØ�|Š|‰~Œ~ð 	Ý&Ø %Ø%(Ø NÐOØð	ñ ô ˆIõ &Ø!ØØ#Ø!.ØXðñ ô ð ð �gŠg•cÔ&Ñ'Ô'Ð/¨4ˆÝ˜#Ÿ'š'¥#Ô":Ñ;Ô;Ñ<Ô<ˆÝ�C—G’G�CÔ4Ñ5Ô5Ñ6Ô6ˆÝ�S—W’W�SÔ6Ñ7Ô7Ñ8Ô8ˆØ(+¨aª¨�; Ñ$Ð$°SˆàˆØ"Ðð �cŠ>ˆ>Ø�NŠNÐQ°(ÐQÐQÐQÐQÑRÔRÐRð �AŠ:ˆ:˜ 1š˜Ø�NŠNÐ5Ñ6Ô6Ð6Ð6Ø�SŠ[ˆ[˜F SšL˜LØ�NŠNÐ>¨eÐ>Ð>°fÐ>Ð>Ñ?Ô?Ð?à)/°!ª¨�u˜v‘~�~¸ˆÝ  °Ò!4Ñ5Ô5ÐØð 	Ø�NŠNð@°,ÐYð @ð @Àeð @ð @Èfð @ð @ð @ñô ð ð ˆÝ�1�k RÑ'Ñ(Ô(ˆØˆØ�lŠl‰nŒnð 	¥ ^Ñ!4Ô!4°rÒ!9Ð!9Ø�GŠG•CÔ+¨SÑ1Ô1Ð1ØŸš™œ‰JˆC�Øð ˜%˜-ØØ×!Ò! %Ñ(Ô(Ð(Ø�4‰KˆCØ�kÒ!Ð!Øð �lŠl‰nŒnð 	¥ ^Ñ!4Ô!4°rÒ!9Ð!9ð 	�Š‰Œˆõ " .Ñ1Ô1ð 	ð 	‰HˆAˆuÝ�RœW U™^œ^Ñ,Ô,ˆHØ˜#Š~ˆ~Ø—’ÐfÀqÐfÐfÐW_ÐfÐfÐfÐfÑgÔgÐgØ�ð õ
 ˆ~ÑÔ !Ò#Ð#ØˆEÝ�3˜~Ñ.Ô.°Ñ2Ñ3Ô3ð #ð #�Ý�RœW¥R¤V¨N¸1Ô,=×,DÒ,DÅUÑ,KÔ,KÈnÐ]^Ð_`Ñ]`ÔNa×NhÒNhÕinÑNoÔNoÑ,oÑ%pÔ%pÑqÔqÑrÔr�Ø—’˜TÑ"Ô"Ð"Ð"Ø%*Ð3•s˜5‘z”z�z°ˆHØ˜#Š~ˆ~Ø—’ÐbÑcÔcÐcõ ' zÑ2Ô2ˆØð 	KØ�NŠNÐIÑJÔJÐJð ˆ
Øˆ	Ø+×1Ò1Ñ3Ô3×9Ò9Ñ;Ô;ˆàñ  	E˜nÐ4KÐKÑKØ +¨~Ð =ÐÝ4°[ÑAÔAˆMÝ3°NÑCÔCˆLàñ E -ñ E°M×4HÒ4HÑ4JÔ4Jñ EØ-­c°.Ñ.AÔ.AÀQÑ.FÔG�Ý6°|ÑDÔD�Ýœ:¥c¨-Ñ&8Ô&8Ñ9Ô9�Ø?GÐ?SÕ1°(Ñ;Ô;Ð;ÐY]�Ø_eÐ_q�E¥#¤/°+¸vÅsÔGYÑ"ZÔ"ZÑ[Ô[Ð[Ðwz�	à'ñ EØ"�HØ#ð f¨×(;Ò(;Ñ(=Ô(=ð fÝ"%¤*­S°Ñ->Ô->Ñ"?Ô"?˜Ø"Ð.Ý$<¸WÑ$EÔ$E˜EÝ',­S¬_¸[È%ÕQTÔQcÑ-dÔ-dÑ'eÔ'e˜Hð ! 4Ò'Ð'¨X¸ª_¨_À	ÈHÐW[ÉOÒ@[Ð@[Ø%*˜
Ý$'¨­U°3¸±?ÀAÑ-FÔ-FÑ$GÔ$G˜	Ø-1Ð*ØŸšðgÐbkÐsð gð gØ#5ðgð gØW_Ðfðgð gð gñô ð ð ð " Dš˜Ý$'¨­c°#µu¸X±´Ñ.GÔ.GÑ$HÔ$H˜	øå # C­¨Sµ%¸	Ñ2BÔ2BÑ)CÔ)CÑ DÔ D�Ið &*ˆÝ,Ð8ðÝ>¸zÐVWÐXÑXÔX‘
��7Øð 9Ý"% g§o¢oÑ&7Ô&7Ñ"8Ô"8�KøøÝð ð ð Ø�ðøøøõ Ð7Ð7¨wÐ7Ñ7Ô7Ñ7Ô7ˆ	ÝÐBÐB¸'ÐBÑBÔBÑBÔBˆÝÐFÐF¸gÐFÑFÔFÑFÔFˆÝÐDÐD¸GÐDÑDÔDÑDÔDˆ
ÝÐTÐTÈGÐTÑTÔTÑTÔTÐà%'ˆØ+-ÐÝ  Ñ+Ô+Ðàð 	;Ð.ð 	;Ø×"Ò"Ð$5°|Ð#DÑEÔEÐEØ2<ÐÐ.Ñ/Ø-7Ð˜\Ñ*Ý"Ð#3°TÑ:Ô:Ðàð 	=Ø×"Ò"Ð#4Ñ5Ô5Ð5Ø2<ÐÐ.Ñ/àð 	6Ø×"Ò" >Ñ2Ô2Ð2Ø/5Ð˜^Ñ,àð 	5Ø×"Ò" =Ñ1Ô1Ð1Ø.8Ð˜]Ñ+Ð+Øð 	5˜Zð 	5Ø×"Ò" =Ñ1Ô1Ð1Ø.4Ð˜]Ñ+àð 	;Ø×"Ò"Ð#6Ñ7Ô7Ð7Ø4:ÐÐ0Ñ1ð ð 	ðÝ ¥¤Ð)]Ð)]¸^Ð)]Ñ)]Ô)]Ñ!^Ô!^Ñ_Ô_�Ø˜d’?�?ð ð  à!/ð ñ  ô  �Hð  ð A¥E­"¬'°(Ñ*;Ô*;Ñ$<Ô$<¸tÒ$CÐ$CØ'×.Ò.¨|Ñ<Ô<Ð<Ø9@Ð(¨Ñ6øøÝð ð ð Ø�ðøøøõ ˆ~ÑÔ !Ò#Ð#ðØuÐuÐUcÐuÑuÔu�Øð B�E¥"¤&¨¡,¤,Ñ/Ô/°$Ò6Ð6Ø#×*Ò*Ð+<Ñ=Ô=Ð=Ø:AÐ$Ð%6Ñ7øøÝð ð ð Ø�ðøøøõ ˆ~ÑÔ !Ò#Ð#ð
Ýœ<¨°qÔ(9½3Ô;LÑMÔM�Ýœ<¨°rÔ(:½CÔ<MÑNÔN�Ýœ °Ð7Ñ7Ô7�Ýœ °Ð7Ñ7Ô7�Ý!¥"¤)§.¢.°¸&±Ñ"AÔ"AÀEÑ"IÑJÔJ�	Ø˜tÒ#Ð#Ø#×*Ò*¨=Ñ9Ô9Ð9Ø6=Ð$ ]Ñ3øøÝð ð ð Ø�ðøøøð ˆàð 	Ø�T‰MˆEØð 	Ð.ð 	Ø�T‰MˆEØð 	Ø�T‰MˆEØð 	Ø�T‰MˆEØð 	Ø�T‰MˆEØð 	Ø�T‰MˆEØð 	Ø�T‰MˆEØð 	Ø�T‰MˆEð
ð 
Øð
ñ 
ô 
ˆð ð 	:Ø•S˜�s =Ñ1Ô1°DÑ8Ñ9Ô9Ñ9ˆEå�C�˜S¥%¨¨q¡/¤/Ñ2Ô2Ñ3Ô3ˆð ð Z ð Z¨oð ZÀð ZÐQ[ð ZØðZØ&0 .ðZØ5GðZØPXÈLðZåÐYÐYÐYÐYÈÐYÑYÔYÑYÔYð 	ð
 ˜S’LÐ=Ð+<Ð'<ˆØ&Ð9��¨MˆðB�Gð Bð B¨ÐOð Bð B¸Uð Bð BÀVð Bð BØ#ðBð BØ,5ÐVðBð BÝFIÈ'ÁlÄlðBð Bà,ðBð Bà6;ÐAðBð Bð 	õ #Ø&Ø!*Ø"2Ø"Ø+Ø-Ø"4Ø#Øð

ñ 

ô 

ˆ	õ "ØØØØ+Ø-Ø*Ø#Ø ð	
ñ 	
ô 	
ð 		
sK   Û7\ Ü
\ Ü\ á:A>c9 ã9
dädäAe+ å+
e8å7e8æCi é
i%é$i%Úscene_idrà   c                 óH  — |rt          |¦  «        dk     r/t          dddddddd¬¦  «        }t          dd|dd| › d�¬¦  «        S g }|D �]Û}t          |¦  «        }|                     ¦   «         s|                     d	|j        › �¦  «         ŒD|                     ¦   «         j        d
k    r|                     d|j        › �¦  «         Œt          j
        t          |¦  «        ¦  «        }|                     ¦   «         s2|                     d|j        › �¦  «         |                     ¦   «          Œæt          |                     t          j        ¦  «        ¦  «        }t          |                     t          j        ¦  «        ¦  «        }t          |                     t          j        ¦  «        ¦  «        }	|d
k    r|                     d|j        › �¦  «         n9|d
k    r3|	d
k    r-||	z  dk     r$|                     d|j        › d|› d|	› d�¦  «         |                     ¦   «          �ŒÝ|rTt          dddddddd¬¦  «        }t          dd|ddt          |¦  «        › d| › dd                     |¦  «        › �¬¦  «        S g }
g }d}d}d}|D �](}t          |¦  «        }t          j
        t          |¦  «        ¦  «        }t          |                     t          j        ¦  «        ¦  «        }|                     t          j        d
¦  «         |                     ¦   «         \  }}|                     t          j        t/          d
|dz
  ¦  «        ¦  «         |                     ¦   «         \  }}|dk    rþ|                     t          j        |dz  ¦  «         |                     ¦   «         \  }}|                     t          j        t1          |dz
  |dz  dz   ¦  «        ¦  «         |                     ¦   «         \  }}|rt|rr|�p|�nt3          t5          j        t5          j        |                     t2          ¦  «        |                     t2          ¦  «        z
  ¦  «        ¦  «        ¦  «        }|dk     rd}|                     ¦   «          |r|�|
                     |¦  «         |r|�|                     |¦  «         �Œ*t          |
¦  «        t          |¦  «        k    s t          |¦  «        t          |¦  «        k    r/t          dddddddd¬¦  «        }t          dd|dd| › d�¬¦  «        S g }g }t1          t          |¦  «        dz
  t          |
¦  «        dz
  ¦  «        }t=          t/          d
|¦  «        ¦  «        D �]s}||         }|
|dz            }t3          t5          j        t          j        |t          j         ¦  «        ¦  «        ¦  «        }t3          t5          j        t          j        |t          j         ¦  «        ¦  «        ¦  «        }dt1          dt9          ||z
  ¦  «        dz  ¦  «        z
  } t5          j        |d¬ ¦  «        }!t5          j        |d¬ ¦  «        }"t3          t4          j!         "                    |!|"z
  ¦  «        d!z  ¦  «        }#t/          dd|#z
  ¦  «        }$|                     |$¦  «         g }%t=          d"¦  «        D ]Ð}&t          j#        |g|&gd d#gd
d$g¦  «        }'t          j#        |g|&gd d#gd
d$g¦  «        }(t          j$        |'|'d
dt          j%        ¦  «         t          j$        |(|(d
dt          j%        ¦  «         t3          t          j&        |'|(t          j'        ¦  «        ¦  «        })|%                     t/          d|)¦  «        ¦  «         ŒÑ|%r!t3          t5          j        |%¦  «        ¦  «        nd}*tQ          d|*z  d| z  z   d"¦  «        }+|                     |+¦  «         �Œut          |¦  «        dk    rd},d}-nJ|r!t3          t5          j        |¦  «        ¦  «        nd},|r!t3          t5          j        |¦  «        ¦  «        nd}-|-d%k     }.|}/|,dz  |-dz  z   }0|.r|0d&z  }0|/r|0d&z  }0|s|0d'z  }0t/          dt1          dtQ          |0d"¦  «        ¦  «        ¦  «        }0t          |¦  «        d(k    rd)nd*}1|0|1k    }2|2s|sd}3n|.rd+}3n|/rd,}3n|2rd-nd}3d.| › dt          |¦  «        › d/|,d0›d1|-d0›d2|.› d3|/› d4|0d0›�}4t          |,|||-|.|/ |/|0¬¦  «        }t          |0|2||3|4¬¦  «        S )5Nr   r?   F)rY   rZ   r[   r\   r]   r^   r_   rL   ry   u<   Lá»—i: KhÃ´ng cÃ³ video nÃ o Ä‘Æ°á»£c cung cáº¥p cho cáº£nh ú.)rb   rc   re   rh   rj   zMissing file: r   zZero-byte file: zUnreadable file: zZero frames: r(  z>Vertical 9:16 aspect ratio prohibited in 16:9 cinema feature: r)  r'  r+  u   Lá»—i: PhÃ¡t hiá»‡n u&    video khÃ´ng há»£p lá»‡ trong cáº£nh ú: z; Té<   r½   é0   r-  uP   Lá»—i: KhÃ´ng thá»ƒ trÃ­ch xuáº¥t Ä‘á»§ frame tá»« táº¥t cáº£ shot trong cáº£nh r>   rN  rK  rL  g…ëQ¸š{@rQ  r  r  gffffffæ?g333333Ã?rx   r.  rz   r{   ÚAPPLY_COLOR_MATCHÚTRIM_STATICrg   zScene z shots): Junction=r,  z, ColorCont=z, ColorMatchTrigger=z, TrimStaticTrigger=rS  ))r    rX   ra   r   r§   r|   rT  rÂ   rÃ   rÄ   rÅ   rU   rÆ   rÈ   r·   rq   rÇ   rV  rW  ÚjoinrÊ   rË   rÌ   rÎ   r   rS   r@  rI  rY  rZ  rÉ   r  rE  ra  rb  r  r  r  r\  r]  r^  )5r–  rà   re   Úinvalid_filesÚp_strr¯   rÔ   r¹   rÛ   rÚ   Úhead_framesÚtail_framesÚstatic_frames_foundrZ   r[   Úret_hÚheadÚret_tÚtailÚr1rê   Úr2rì   rp  Újunction_scoresÚcolor_diffsÚ
pair_countrã   Úf_tailÚf_headÚlum_tÚlum_hÚlum_continuityr�  rŽ  Úcolor_deltaÚcol_contÚcorrsÚchÚhtÚhhÚcÚ	hist_corrÚj_smoothÚavg_junctionÚ	avg_colorr]   r_   rL   Úscene_thresholdrc   r“  r”  s5                                                        r!   Úevaluate_scenez%OfflineHeuristicEngine.evaluate_scene]  s
  € àð 	¥3Ð'7Ñ#8Ô#8¸1Ò#<Ð#<Ý(Ø$'Ø!Ø Ø!$Ø$)ØØ$)Øð	ñ 	ô 	ˆJõ &Ø!ØØ%Ø!.ØiÐ^fÐiÐiÐiðñ ô ð ð ˆØ%ð 	ñ 	ˆEÝ�U‘”ˆAØ—8’8‘:”:ð Ø×$Ò$Ð%>°a´fÐ%>Ð%>Ñ?Ô?Ð?ØØ�vŠv‰xŒxÔ 1Ò$Ð$Ø×$Ò$Ð%@¸¼Ð%@Ð%@ÑAÔAÐAØÝÔ"¥3 q¡6¤6Ñ*Ô*ˆCØ—<’<‘>”>ð Ø×$Ò$Ð%A¸¼Ð%AÐ%AÑBÔBÐBØ—’‘”�ØÝ�S—W’W�SÔ5Ñ6Ô6Ñ7Ô7ˆBÝ�C—G’G�CÔ4Ñ5Ô5Ñ6Ô6ˆAÝ�C—G’G�CÔ5Ñ6Ô6Ñ7Ô7ˆAØ�QŠwˆwØ×$Ò$Ð%=°Q´VÐ%=Ð%=Ñ>Ô>Ð>Ð>Ø�Q’�˜1˜qš5˜5 a¨!¡e¨d¢l lØ×$Ò$Ð%xÐfgÔflÐ%xÐ%xÐpqÐ%xÐ%xÐtuÐ%xÐ%xÐ%xÑyÔyÐyØ�KŠK‰MŒMˆM‰Màð 	Ý(Ø$'Ø!Ø Ø!$Ø$)ØØ$)Øð	ñ 	ô 	ˆJõ &Ø!ØØ%Ø!.ð  Wµc¸-Ñ6HÔ6Hð   Wð   WÐpxð   Wð   Wð  }A÷  }Fò  }Fð  GTñ  }Uô  }Uð   Wð   Wðñ ô ð ð ˆØˆØ#ÐØˆØˆ
à%ð 	)ñ 	)ˆEÝ�U‘”ˆAÝÔ"¥3 q¡6¤6Ñ*Ô*ˆCÝ�S—W’W�SÔ5Ñ6Ô6Ñ7Ô7ˆBØ�GŠG•CÔ+¨QÑ/Ô/Ð/ØŸ(š(™*œ*‰KˆE�4Ø�GŠG•CÔ+­S°°B¸±F©^¬^Ñ<Ô<Ð<ØŸ(š(™*œ*‰KˆE�4ð �BŠwˆwØ—’�Ô/°°q±Ñ9Ô9Ð9ØŸš™œ‘��BØ—’�Ô/µ°R¸!±V¸RÀ1¹WÀr¹\Ñ1JÔ1JÑKÔKÐKØŸš™œ‘��BØð 3˜"ð 3  °B°NÝ ¥¤­¬°·	²	½%Ñ0@Ô0@À2Ç9Â9ÍUÑCSÔCSÑ0SÑ)TÔ)TÑ!UÔ!UÑVÔV�DØ˜c’z�zØ.2Ð+à�KŠK‰MŒMˆMàð )˜Ð)Ø×"Ò" 4Ñ(Ô(Ð(Øð )˜Ð)Ø×"Ò" 4Ñ(Ô(Ð(ùåˆ{ÑÔ�sÐ#3Ñ4Ô4Ò4Ð4½¸KÑ8HÔ8HÍCÐP`ÑLaÔLaÒ8aÐ8aÝ(Ø$'Ø!Ø Ø!$Ø$)ØØ$)Øð	ñ 	ô 	ˆJõ &Ø!ØØ%Ø!.Ø}ÐrzÐ}Ð}Ð}ðñ ô ð ð ˆØˆÝ�˜[Ñ)Ô)¨AÑ-­s°;Ñ/?Ô/?À!Ñ/CÑDÔDˆ
å•s˜1˜jÑ)Ô)Ñ*Ô*ð 	-ñ 	-ˆAØ  ”^ˆFØ   Q¡Ô'ˆFå�"œ'¥#¤,¨vµsÔ7IÑ"JÔ"JÑKÔKÑLÔLˆEÝ�"œ'¥#¤,¨vµsÔ7IÑ"JÔ"JÑKÔKÑLÔLˆEØ ¥3 s­C°¸±Ñ,>Ô,>ÀÑ,FÑ#GÔ#GÑGˆNå”W˜V¨&Ð1Ñ1Ô1ˆFÝ”W˜V¨&Ð1Ñ1Ô1ˆFÝ¥¤	§¢¨v¸©Ñ ?Ô ?À&Ñ HÑIÔIˆKÝ˜3  kÑ 1Ñ2Ô2ˆHØ×Ò˜xÑ(Ô(Ð(àˆEÝ˜A‘h”hð *ð *�Ý”\ 6 (¨R¨D°$¸¸¸qÀ#¸hÑGÔG�Ý”\ 6 (¨R¨D°$¸¸¸qÀ#¸hÑGÔG�Ý”˜b " a¨­C¬OÑ<Ô<Ð<Ý”˜b " a¨­C¬OÑ<Ô<Ð<Ý�#œ/¨"¨bµ#Ô2DÑEÔEÑFÔF�Ø—’�S  a™[œ[Ñ)Ô)Ð)Ð)Ø16Ð?��bœg e™nœnÑ-Ô-Ð-¸CˆIå˜S 9™_¨s°^Ñ/CÑCÀQÑGÔGˆHØ×"Ò" 8Ñ,Ô,Ð,Ñ,åÐÑ Ô  AÒ%Ð%ØˆLØˆIˆIà>MÐV�5¥¤¨Ñ!9Ô!9Ñ:Ô:Ð:ÐSVˆLØ7BÐK��bœg kÑ2Ô2Ñ3Ô3Ð3ÈˆIà'¨$Ò.ÐØ1Ðà Ñ# i°#¡oÑ5ˆØð 	Ø�T‰MˆEØð 	Ø�T‰MˆEØð 	Ø�T‰MˆEå�C�˜S¥%¨¨q¡/¤/Ñ2Ô2Ñ3Ô3ˆå"%Ð&6Ñ"7Ô"7¸1Ò"<Ð"<˜$˜$À$ˆØ˜OÒ+ˆàð 	> ð 	>Ø"ˆFˆFØ ð 	>Ø(ˆFˆFØ ð 	>Ø"ˆFˆFà"*Ð=�Y�Y°ˆFðs�Xð sð s¥Ð%5Ñ!6Ô!6ð sð sØ$ÐGðsð sØ6?ÐGðsð sà!4ðsð sàJ]ðsð sàglÐrðsð sð 	õ %Ø ,Ø#Ø!Ø&Ø 3Ø,Ð,Ø 3Øð	
ñ 	
ô 	
ˆ
õ "ØØØ!Ø#Ø ð
ñ 
ô 
ð 	
r#   N©ri   ri   )
rM   rN   rO   rP   ÚstaticmethodrU   ra   r•  r   r¾  r   r#   r!   r!  r!    sÇ   € € € € € ðð ð ð #%Øð	v
ð v
Øðv
àðv
ð  ðv
ð ð	v
ð
 
ðv
ð v
ð v
ñ „\ðv
ðp	 ðK
 ð K
¸¸S¼	ð K
ÐFXð K
ð K
ð K
ñ „\ðK
ð K
ð K
r#   r!  Úcoroc                 ó†  — t          j        | ¦  «        s| S 	 t          j        ¦   «         }n# t          $ r d}Y nw xY w|r|                     ¦   «         rmddl}|j                             d¬¦  «        5 }| 	                    t          j
        | ¦  «                             ¦   «         cddd¦  «         S # 1 swxY w Y   dS dS dS )ug   Cháº¡y an toÃ n má»™t coroutine trong ngá»¯ cáº£nh Ä‘á»“ng bá»™, xá»­ lÃ½ cáº£ khi Ä‘Ã£ cÃ³ event loop.Nr   r   )Úmax_workers)ÚinspectÚiscoroutineÚasyncioÚget_running_loopÚRuntimeErrorÚ
is_runningÚconcurrent.futuresÚfuturesÚThreadPoolExecutorÚsubmitr  Úresult)rÁ  ÚloopÚ
concurrentÚexecutors       r!   Ú_run_coroutine_safelyrÒ  0  s(  € åÔ˜tÑ$Ô$ð ØˆðÝÔ'Ñ)Ô)ˆˆøÝð ð ð Øˆˆˆðøøøð ð ?�—’Ñ!Ô!ð ?Ø!Ð!Ð!Ð!ØÔ×2Ò2¸qÐ2ÑAÔAð 	?ÀXØ—?’?¥7¤;°Ñ5Ô5×<Ò<Ñ>Ô>ð	?ð 	?ð 	?ð 	?ñ 	?ô 	?ð 	?ð 	?ð 	?ð 	?ð 	?ð 	?øøøð 	?ð 	?ð 	?ð 	?ð 	?ð 	?ð?ð ?ð ?ð ?s   ˜, ¬;º;Á32B2Â2B6Â9B6zcritic_spend_tracker.jsonr>   c                   óØ   — e Zd ZdZeZedefd„¦   «         Zede	e
ef         fd„¦   «         Zede	e
ef         ddfd„¦   «         Zedefd„¦   «         Zedde
dedede
def
d„¦   «         ZdS )ÚCriticCostGuardu½  
    Bá»™ giÃ¡m sÃ¡t & ngáº¯t máº¡ch chi phÃ­ thá»�i gian thá»±c (Hard Circuit Breaker).
    Giá»›i háº¡n ngÃ¢n sÃ¡ch nghiÃªm ngáº·t (máº·c Ä‘á»‹nh $1.00 USD).
    Khi chi phÃ­ tÃ­ch lÅ©y cháº¡m ngÆ°á»¡ng $1.00, tá»± Ä‘á»™ng ngáº¯t káº¿t ná»‘i Cloud API
    vÃ  chuyá»ƒn quyá»�n tháº©m Ä‘á»‹nh sang Offline Heuristic Fallback (OpenCV/FFprobe)
    Ä‘á»ƒ quy trÃ¬nh sáº£n xuáº¥t khÃ´ng bá»‹ giÃ¡n Ä‘oáº¡n vÃ  khÃ´ng phÃ¡t sinh thÃªm chi phÃ­.
    rm   c                 ó°   — 	 t          t          j                             dt	          t
          ¦  «        ¦  «        ¦  «        S # t          $ r
 t
          cY S w xY w)NÚCRITIC_MAX_BUDGET_USD)rS   ÚosÚenvironrq   rU   ÚDEFAULT_MAX_BUDGET_USDÚ
ValueError©Úclss    r!   Úget_max_budgetzCriticCostGuard.get_max_budgetP  sV   € ð	*Ý�œŸšÐ(?ÅÕE[ÑA\ÔA\Ñ]Ô]Ñ^Ô^Ð^øÝð 	*ð 	*ð 	*Ý)Ð)Ð)Ð)ð	*øøøs   ‚>A ÁAÁAc                 ó  — | j                              ¦   «         rU	 t          | j         dd¬¦  «        5 }t          j        |¦  «        cd d d ¦  «         S # 1 swxY w Y   n# t
          $ r Y nw xY wd|                      ¦   «         dddg dœS )Nr¸   r   r   r?   r   )Útotal_cost_usdÚmax_budget_usdÚtotal_callsÚtotal_input_tokensÚtotal_output_tokensÚhistory)Ú
SPEND_FILEr§   Úopenrõ   Úloadr  rÝ  )rÜ  rí   s     r!   Úload_trackerzCriticCostGuard.load_trackerW  sê   € àŒ>× Ò Ñ"Ô"ð 	ðÝ˜#œ.¨#¸Ð@Ñ@Ô@ð (ÀAÝœ9 Q™<œ<ð(ð (ð (ð (ñ (ô (ð (ð (ð (ð (ð (ð (øøøð (ð (ð (ð (ð (øåð ð ð Ø�ðøøøð "Ø!×0Ò0Ñ2Ô2ØØ"#Ø#$Øð
ð 
ð 	
s4   ›A ²AÁA ÁAÁA ÁAÁA Á
A,Á+A,r  Nc                 óü   — 	 | j         j                             dd¬¦  «         t          | j         dd¬¦  «        5 }t	          j        ||dd¬¦  «         d d d ¦  «         d S # 1 swxY w Y   d S # t          $ r Y d S w xY w)	NT©ÚparentsÚexist_okrÛ   r   r   Fr½   ©Úensure_asciiÚindent)rå  ÚparentÚmkdirræ  rõ   Údumpr  )rÜ  r  rí   s      r!   Úsave_trackerzCriticCostGuard.save_trackerh  së   € ð	ØŒNÔ!×'Ò'°¸tÐ'ÑDÔDÐDÝ�c”n c°GÐ<Ñ<Ô<ð AÀÝ”	˜$ °¸aÐ@Ñ@Ô@Ð@ðAð Að Añ Aô Að Að Að Að Að Að Að Aøøøð Að Að Að Að Að Aøåð 	ð 	ð 	ØˆDˆDð	øøøs4   ‚8A- ºA ÁA- Á A$Á$A- Á'A$Á(A- Á-
A;Á:A;c                 ó.  — |                       ¦   «         }|dk    st          j                             d¦  «        sdS |                      ¦   «         }|                     dd¦  «        }||k    r)t          d|d›d|d›d	�¦  «         t          d
¦  «         dS dS )Nr?   ÚGEMINI_API_KEYFrß  u(   âš ï¸� [CRITIC COST GUARD] NgÃ¢n sÃ¡ch $r,  u    USD Ä‘Ã£ cháº¡m ngÆ°á»¡ng ($z.4fz USD).uY      Tá»± Ä‘á»™ng kÃ­ch hoáº¡t Offline Heuristic Fallback Ä‘á»ƒ khÃ´ng phÃ¡t sinh chi phÃ­.T)rÝ  r×  rØ  rq   rè  Úprint)rÜ  Ú
max_budgetÚtrackerÚspents       r!   Ú	can_spendzCriticCostGuard.can_spendq  s©   € à×'Ò'Ñ)Ô)ˆ
Ø˜ÒÐ¥B¤J§N¢NÐ3CÑ$DÔ$DÐØ�5Ø×"Ò"Ñ$Ô$ˆØ—’Ð,¨cÑ2Ô2ˆØ�JÒÐÝÐ{¸ZÐ{Ð{Ð{ÐjoÐ{Ð{Ð{Ð{Ñ|Ô|Ð|ÝÐnÑoÔoÐoØ�5Øˆtr#   éÜ  é,  ri   Ú
model_nameÚinput_tokensÚoutput_tokensÚtaskc           	      óv  — |dz  dz  |dz  dz  z   }|                       ¦   «         }t          |                     dd¦  «        |z   d¦  «        |d<   |                     dd¦  «        d	z   |d<   |                     d
d¦  «        |z   |d
<   |                     dd¦  «        |z   |d<   |                      ¦   «         |d<   dd l}|                     dg ¦  «        }|                     |                     d¦  «        ||t          |d¦  «        |d         dœ¦  «         |dd …         |d<   |                      |¦  «         |S )Ni@B r»   gš™™™™™Ù?rß  r?   r.  rá  r   r   râ  rã  rà  rä  ú%Y-%m-%d %H:%M:%S)Ú	timestampr   ÚmodelÚcost_usdÚcumulative_usdiÎÿÿÿ)rè  r^  rq   rÝ  Útimer|   Ústrftimeró  )	rÜ  rý  rþ  rÿ  r   Úcostrø  r  rä  s	            r!   Úrecord_usagezCriticCostGuard.record_usage~  sb  € à˜yÑ(¨4Ñ/°MÀIÑ4MÐPTÑ4TÑUˆØ×"Ò"Ñ$Ô$ˆÝ$)¨'¯+ª+Ð6FÈÑ*LÔ*LÈtÑ*SÐUVÑ$WÔ$WˆÐ Ñ!Ø!(§¢¨]¸AÑ!>Ô!>ÀÑ!Bˆ�ÑØ(/¯ªÐ4HÈ!Ñ(LÔ(LÈ|Ñ([ˆÐ$Ñ%Ø)0¯ªÐ5JÈAÑ)NÔ)NÐQ^Ñ)^ˆÐ%Ñ&Ø$'×$6Ò$6Ñ$8Ô$8ˆÐ Ñ!àˆˆˆØ—+’+˜i¨Ñ,Ô,ˆØ�ŠØŸšÐ':Ñ;Ô;ØØÝ˜d A™œØ%Ð&6Ô7ð
ð 
ñ 	ô 	ð 	ð % S T Tœ]ˆ�	ÑØ×Ò˜Ñ!Ô!Ð!Øˆr#   )rû  rü  ri   )rM   rN   rO   rP   ÚCRITIC_SPEND_FILErå  ÚclassmethodrS   rÝ  r   rU   r   rè  ró  rQ   rú  r·   r
  r   r#   r!   rÔ  rÔ  F  s!  € € € € € ðð ð #€Jàð*˜uð *ð *ð *ñ „[ð*ð ð
˜T # s (œ^ð 
ð 
ð 
ñ „[ð
ð  ð  S¨# X¤ð °4ð ð ð ñ „[ðð ð
˜$ð 
ð 
ð 
ñ „[ð
ð ðð  cð ¸ð ÐTWð Ðehð Ðrwð ð ð ñ „[ðð ð r#   rÔ  c                   óÜ   — e Zd ZdZeZedee         fd„¦   «         Z	ede
dedefd„¦   «         Ze	 	 dde
d	e
d
e
de
dee         f
d„¦   «         Zede
dee
         dee         fd„¦   «         ZdS )ÚFileBridgeCriticEngineu  
    Ä�á»™ng cÆ¡ cáº§u ná»‘i tá»‡p tin IPC (Autonomous File-Bridge Quality Gate).
    Cho phÃ©p Antigravity Host Agent (Gemini) trá»±c tiáº¿p tháº©m Ä‘á»‹nh hÃ¬nh áº£nh / video
    thÃ´ng qua AI Credits tÃ­ch há»£p sáºµn trong IDE, 100% Ä‘á»™c láº­p vá»›i Cloud API Key.
    rm   c                 ó†   — | j                              ¦   «         sg S t          | j                              d¦  «        ¦  «        S )Nz*_request.json)Ú	QUEUE_DIRr§   Úsortedr¨   rÛ  s    r!   Úget_pending_requestsz+FileBridgeCriticEngine.get_pending_requests¢  s<   € àŒ}×#Ò#Ñ%Ô%ð 	ØˆIÝ�c”m×(Ò(Ð)9Ñ:Ô:Ñ;Ô;Ð;r#   Ú	target_idÚverdictc                 óþ   — | j                              dd¬¦  «         | j         |› d�z  }t          |dd¬¦  «        5 }|                     |                     d¬¦  «        ¦  «         d d d ¦  «         n# 1 swxY w Y   |S )	NTrê  ú_verdict.jsonrÛ   r   r   r½   ©rï  )r  rñ  ræ  ÚwriteÚmodel_dump_json)rÜ  r  r  Úverdict_filerí   s        r!   Úwrite_verdictz$FileBridgeCriticEngine.write_verdict¨  sÂ   € àŒ×Ò D°4ÐÑ8Ô8Ð8Ø”}¨)Ð'BÐ'BÐ'BÑBˆÝ�, ¨gÐ6Ñ6Ô6ð 	7¸!Ø�GŠG�G×+Ò+°1Ð+Ñ5Ô5Ñ6Ô6Ð6ð	7ð 	7ð 	7ñ 	7ô 	7ð 	7ð 	7ð 	7ð 	7ð 	7ð 	7øøøð 	7ð 	7ð 	7ð 	7àÐs   ¼*A2Á2A6Á9A6ri   r"  r#  r$  r%  c           
      óš  — | j                              dd¬¦  «         | j         |› d�z  }|                     ¦   «         r¯	 t          |dd¬¦  «        5 }t	          j        |¦  «        }d d d ¦  «         n# 1 swxY w Y   t                               |¦  «        }t          d|› d|j	        d	›d
|j
        › �¦  «         |S # t          $ r$}	t          d|j        › d|	› �¦  «         Y d }	~	nd }	~	ww xY wt          |¦  «        }
d }t          �]|
                     ¦   «         rI	 t          |
d¬¦  «        \  }}|r!t          |                     ¦   «         ¦  «        }n# t          $ r Y nw xY w| j         |› d�z  }	 ||
                     ¦   «         r!t          |
                     ¦   «         ¦  «        n||||t#          t$                               ¦   «         ¦  «        dt)          j        ¦   «                              d¦  «        dœ}t          |dd¬¦  «        5 }t	          j        ||dd¬¦  «         d d d ¦  «         n# 1 swxY w Y   n# t          $ r Y nw xY wd S )NTrê  r  r¸   r   r   uF   ðŸŽ¯ [FILE-BRIDGE GATE] Náº¡p phÃ¡n quyáº¿t tá»« Host Agent cho shot 'ú	': score=r,  ú
 approved=õ/   âš ï¸� [FILE-BRIDGE GATE] Lá»—i Ä‘á»�c verdict r™  r.  r/  ú_request.jsonÚpending_agent_reviewr  )r"  r²   rf   r$  r%  Úflowkit_14_error_catalogÚstatusr  rÛ   Fr½   rí  )r  rñ  r§   ræ  rõ   rç  ra   Úmodel_validaterö  rb   rc   r  rT  r   r   rU   r_  rT   r8   Úkeysr   Únowr  rò  )rÜ  r"  r#  r$  r%  r  rí   r  r  rt   r²   r�  rŽ   r‚  Úrequest_fileÚreq_datas                   r!   r•  z$FileBridgeCriticEngine.evaluate_shot°  sh  € ð 	Œ×Ò D°4ÐÑ8Ô8Ð8Ø”}¨'Ð'@Ð'@Ð'@Ñ@ˆð ×ÒÑ Ô ð 	bðbÝ˜,¨°gÐ>Ñ>Ô>ð (À!Ýœ9 Q™<œ<�Dð(ð (ð (ñ (ô (ð (ð (ð (ð (ð (ð (øøøð (ð (ð (ð (å,×;Ò;¸DÑAÔA�Ýð  iÐ_fð  ið  iÐqxô  rGð  ið  ið  ið  W^ô  Wgð  ið  iñ  jô  jð  jØ�øÝð bð bð bÝÐ`ÈÔHYÐ`Ð`Ð]^Ð`Ð`ÑaÔaÐaÐaÐaÐaÐaÐaøøøøðbøøøõ ˜.Ñ)Ô)ˆ
ØˆÝ,Ð8¸Z×=NÒ=NÑ=PÔ=PÐ8ðÝ>¸zÐVWÐXÑXÔX‘
��7Øð 9Ý"% g§o¢oÑ&7Ô&7Ñ"8Ô"8�KøøÝð ð ð Ø�ðøøøð ”}¨'Ð'@Ð'@Ð'@Ñ@ˆð	à"Ø;E×;LÒ;LÑ;NÔ;NÐb�c *×"4Ò"4Ñ"6Ô"6Ñ7Ô7Ð7ÐTbØ&1Ø&8Ø Ý,0Õ1F×1KÒ1KÑ1MÔ1MÑ,NÔ,NØ0Ý%œ\™^œ^×4Ò4Ð5HÑIÔIð	ð 	ˆHõ �l C°'Ð:Ñ:Ô:ð E¸aÝ”	˜( A°EÀ!ÐDÑDÔDÐDðEð Eð Eñ Eô Eð Eð Eð Eð Eð Eð Eøøøð Eð Eð Eð Eøøåð 	ð 	ð 	ØˆDð	øøøð ˆts…   ¿B< ÁA2Á&B< Á2A6Á6B< Á9A6Á:AB< Â<
C*ÃC%Ã%C*Ä7E Å
EÅEÅ0BH; È
H/È#H; È/H3È3H; È6H3È7H; È;
IÉIr–  rà   c                 ó
  — | j                              dd¬¦  «         | j         |› d�z  }|                     ¦   «         r¯	 t          |dd¬¦  «        5 }t	          j        |¦  «        }d d d ¦  «         n# 1 swxY w Y   t                               |¦  «        }t          d|› d|j	        d	›d
|j
        › �¦  «         |S # t          $ r$}t          d|j        › d|› �¦  «         Y d }~nd }~ww xY w| j         |› d�z  }	 |d„ |D ¦   «         dt          j        ¦   «                              d¦  «        dœ}	t          |dd¬¦  «        5 }t	          j        |	|dd¬¦  «         d d d ¦  «         n# 1 swxY w Y   n# t          $ r Y nw xY wd S )NTrê  r  r¸   r   r   uH   ðŸŽ¯ [FILE-BRIDGE GATE] Náº¡p phÃ¡n quyáº¿t tá»« Host Agent cho cáº£nh 'r  r,  r  r  r™  r   c                 ój   — g | ]0}t          t          |¦  «                             ¦   «         ¦  «        ‘Œ1S r   )rU   r   r_  )rs   r¯   s     r!   rº   z9FileBridgeCriticEngine.evaluate_scene.<locals>.<listcomp>ý  s0   € Ð$VÐ$VÐ$VÀ¥S­¨a©¬¯ªÑ):Ô):Ñ%;Ô%;Ð$VÐ$VÐ$Vr#   r!  r  )r–  rà   r#  r  rÛ   Fr½   rí  )r  rñ  r§   ræ  rõ   rç  ra   r$  rö  rb   rc   r  rT  r   r&  r  rò  )
rÜ  r–  rà   r  rí   r  r  rt   r'  r(  s
             r!   r¾  z%FileBridgeCriticEngine.evaluate_sceneä  s¤  € ð 	Œ×Ò D°4ÐÑ8Ô8Ð8Ø”}¨(Ð'AÐ'AÐ'AÑAˆð ×ÒÑ Ô ð 	bðbÝ˜,¨°gÐ>Ñ>Ô>ð (À!Ýœ9 Q™<œ<�Dð(ð (ð (ñ (ô (ð (ð (ð (ð (ð (ð (øøøð (ð (ð (ð (å,×;Ò;¸DÑAÔA�Ýð  lÐaið  lð  lÐt{ô  uJð  lð  lð  lð  Zaô  Zjð  lð  lñ  mô  mð  mØ�øÝð bð bð bÝÐ`ÈÔHYÐ`Ð`Ð]^Ð`Ð`ÑaÔaÐaÐaÐaÐaÐaÐaøøøøðbøøøð ”}¨(Ð'AÐ'AÐ'AÑAˆð
	à$Ø$VÐ$VÐEUÐ$VÑ$VÔ$VØ0Ý%œ\™^œ^×4Ò4Ð5HÑIÔIð	ð ˆHõ �l C°'Ð:Ñ:Ô:ð E¸aÝ”	˜( A°EÀ!ÐDÑDÔDÐDðEð Eð Eñ Eô Eð Eð Eð Eð Eð Eð Eøøøð Eð Eð Eð Eøøåð 	ð 	ð 	ØˆDð	øøøð ˆtss   ¿B< ÁA2Á&B< Á2A6Á6B< Á9A6Á:AB< Â<
C*ÃC%Ã%C*Ã;AE3 ÅE'ÅE3 Å'E+Å+E3 Å.E+Å/E3 Å3
F Å?F Nr¿  )rM   rN   rO   rP   ÚCRITIC_QUEUE_DIRr  r  r   r   r  rU   ra   r  r   r•  r¾  r   r#   r!   r  r  š  s.  € € € € € ðð ð
 !€Iàð< T¨$¤Zð <ð <ð <ñ „[ð<ð
 ð cð Ð4Fð È4ð ð ð ñ „[ðð ð
 #%Øð1ð 1àð1ð ð1ð  ð	1ð
 ð1ð 
Ð$Ô	%ð1ð 1ð 1ñ „[ð1ðf ð!àð!ð ˜sœ)ð!ð 
Ð$Ô	%ð	!ð !ð !ñ „[ð!ð !ð !r#   r  c                   ó–   — e Zd ZdZe	 ddedededededee         fd	„¦   «         Z	e	 dd
ede
e         dedee         fd„¦   «         ZdS )ÚAntigravitySDKEngineuþ   
    Ä�á»™ng cÆ¡ tháº©m Ä‘á»‹nh MLLM Vision sá»­ dá»¥ng Google Antigravity SDK
    (Agent vá»›i LocalAgentConfig vÃ  response_schema=VideoCriticVerdict).
    TrÃ­ch xuáº¥t Zero-Waste Contact Sheet Ä‘Ã­nh kÃ¨m thá»±c táº¿ vÃ o ná»™i dung Ä‘Ã¡nh giÃ¡.
    Fr"  r#  r$  r%  Ústrictrm   c                 óì  ‡‡‡— ddl mŠm}m} t          j                             d¦  «        }t          |¦  «        }	|	                     ¦   «         r|	 	                    ¦   «         j
        dk    rd|	› �}
|rt          d|
› �¦  «        ‚d S d }t          �t          |	d¬¦  «        }|r|gnt          |	d¬	¦  «        }|sd
|	› �}
|rt          d|
› �¦  «        ‚d S d}t          |ddœ}|r||d<   nMt          j                             dd¦  «        }d|d<   ||d<   t          j                             dd¦  «        |d<    |d(i |¤ŽŠd|› d|› d|› d�}|gŠ|D ]$}|r ‰                      ||d¬¦  «        ¦  «         Œ%ˆˆˆfd„}	 t#           |¦   «         ¦  «        }d }t%          |d¦  «        rc|j        r\t)          |j        t          ¦  «        r|j        }n®t)          |j        t*          ¦  «        rt                               |j        ¦  «        }ntt%          |d¦  «        rd|j        r]t1          j        d d!|j                             ¦   «         ¦  «        }t1          j        d"d!|¦  «        }t                               |¦  «        }|�!t8                               dd#|› �¬$¦  «         |S |rt          d%|› �¦  «        ‚n?# t<          $ r2}|rt          d&|› �¦  «        |‚t?          d'|› �¦  «         Y d }~d S d }~ww xY wd S ))Nr   ©ÚAgentÚLocalAgentConfigÚ
from_bytesrõ  u-   File video khÃ´ng tá»“n táº¡i hoáº·c rá»—ng: ú[CRITIC GATE ERROR] r.  r/  rŸ   ©r³   u3   KhÃ´ng thá»ƒ trÃ­ch xuáº¥t khung hÃ¬nh tá»« video: u?  You are the Lead Cinematic Critic Auditor for 'Tháº­p NgÅ© NiÃªn' following FlowKit Quality Standards. Audit this shot against the 14 Known AI Video Errors (Critical: character_drift, breed_swap, role_reversal, brand_logo_text, character_count_drift; High: camera_drift, object_morph, reverse_motion, human_hands_limbs, scale_break; Minor: lighting_jitter, micro_blur, background_warp, color_shift). If any Critical error exists, overall_score must be <= 0.59 and character_consistency <= 0.30. If any High error exists, overall_score must be <= 0.74. Score >= 0.80 approves.úgemini-3.8-flash©Úresponse_schemaÚsystem_instructionsr  Úapi_keyÚGOOGLE_CLOUD_PROJECTúdscons-508517TÚvertexÚprojectÚGOOGLE_CLOUD_LOCATIONúus-central1ÚlocationúEvaluate Shot 'ú'. Expected Character: 'ú'. Motion Prompt: 'zn'. Check attached zero-waste contact sheet for facial morphing, character mixups, and 14 FlowKit video errors.ú
image/jpeg©Ú	mime_typec               “   ó®   •K  —  ‰‰¬¦  «        4 ƒd {V —†} |                       ‰¦  «        ƒ d {V —†cd d d ¦  «        ƒd {V —† S # 1 ƒd {V —†swxY w Y   d S ©N)Úconfig©Úchat©Úagentr1  ÚcfgÚinputss    €€€r!   Ú	_call_sdkz5AntigravitySDKEngine.evaluate_shot.<locals>._call_sdkP  óö   øè è € Ø�u CÐ(Ñ(Ô(ð 0ð 0ð 0ð 0ð 0ð 0ð 0¨EØ"ŸZšZ¨Ñ/Ô/Ð/Ð/Ð/Ð/Ð/Ð/ð0ð 0ð 0ð 0ñ 0ô 0ð 0ð 0ð 0ð 0ð 0ð 0ð 0ð 0ð 0ð 0ð 0ð 0ð 0ð 0ð 0ð 0ð 0ð 0øøøð 0ð 0ð 0ð 0ð 0ð 0ó   –AÁ
AÁAÚstructured_outputrø   ú^```json\s*ri   ú\s*```$úshot:©r   uJ   [CRITIC GATE ERROR] Antigravity SDK khÃ´ng tráº£ vá»� verdict há»£p lá»‡: u6   [CRITIC GATE ERROR] Lá»—i thá»±c thi Antigravity SDK: õ    âš ï¸� [ANTIGRAVITY SDK] Lá»—i: r   ) Úgoogle.antigravityr1  r2  r3  r×  rØ  rq   r   r§   rÂ   rÃ   ÚFileNotFoundErrorr   rß   rÈ  ra   r|   rÒ  ÚhasattrrT  Ú
isinstancerV   r$  rø   ÚreÚsubr¥   Úmodel_validate_jsonrÔ  r
  r  rö  )rÜ  r"  r#  r$  r%  r.  r2  r3  r:  r²   Úerr_msgÚcs_bytesrÖ   Úsys_instÚ
cfg_kwargsÚgcp_projectÚeval_promptÚkbrQ  Úrespr  Ú
clean_jsonrt   r1  rO  rP  s                          @@@r!   r•  z"AntigravitySDKEngine.evaluate_shot  s  øøø€ ð 	KÐJÐJÐJÐJÐJÐJÐJÐJÐJÝ”*—.’.Ð!1Ñ2Ô2ˆå˜.Ñ)Ô)ˆ
Ø× Ò Ñ"Ô"ð 	 j§o¢oÑ&7Ô&7Ô&?À1Ò&DÐ&DØRÀjÐRÐRˆGØð JÝ'Ð(H¸wÐ(HÐ(HÑIÔIÐIØ�4ð ˆÝ&Ð2Ý2°:È!ÐLÑLÔLˆHà'/Ðf˜(˜˜Õ5LÈZÐdeÐ5fÑ5fÔ5fˆØð 	ØXÈJÐXÐXˆGØð EÝ"Ð#C¸'Ð#CÐ#CÑDÔDÐDØ�4ð_ð 	õ  2Ø#+Ø'ð
ð 
ˆ
ð
 ð 	\Ø$+ˆJ�yÑ!Ð!åœ*Ÿ.š.Ð)?ÀÑQÔQˆKØ#'ˆJ�xÑ Ø$/ˆJ�yÑ!Ý%'¤Z§^¢^Ð4KÈ]Ñ%[Ô%[ˆJ�zÑ"àÐÐ,Ð, Ð,Ð,ˆðV˜gð Vð VÐ?Qð Vð VØ%ðVð Vð Vð 	ð
 �ˆØ ð 	Fð 	FˆBØð FØ—’˜j˜j¨°|ÐDÑDÔDÑEÔEÐEøð	0ð 	0ð 	0ð 	0ð 	0ð 	0ð 	0ð	Ý(¨¨©¬Ñ5Ô5ˆDØˆGÝ�tÐ0Ñ1Ô1ð M°dÔ6Lð MÝ˜dÔ4Õ6HÑIÔIð XØ"Ô4�G�GÝ Ô 6½Ñ=Ô=ð XÝ0×?Ò?ÀÔ@VÑWÔW�GøÝ˜˜vÑ&Ô&ð M¨4¬9ð MÝœV N°B¸¼	¿ºÑ8IÔ8IÑJÔJ�
ÝœV J°°JÑ?Ô?�
Ý,×@Ò@ÀÑLÔL�àÐ"Ý×,Ò,Ð-?ÐFWÈgÐFWÐFWÐ,ÑXÔXÐXØ�Øð xÝ"Ð#vÐptÐ#vÐ#vÑwÔwÐwðxøåð 	ð 	ð 	Øð hÝ"Ð#_Ð\]Ð#_Ð#_Ñ`Ô`ÐfgÐgÝÐ8°QÐ8Ð8Ñ9Ô9Ð9Ø�4�4�4�4�4øøøøð		øøøð
 ˆts   Å=D"J5 Ê J5 Ê5
K1Ê?'K,Ë,K1r–  rà   c                 óp  ‡‡‡— ddl mŠm}m} t          j                             d¦  «        }|rt          |¦  «        dk     rd|› �}|rt          d|› �¦  «        ‚d S t          |¦  «        }|sd|› �}|rt          d|› �¦  «        ‚d S d}	t          |	d	d
œ}
|r||
d<   nMt          j                             dd¦  «        }d|
d<   ||
d<   t          j                             dd¦  «        |
d<    |d%i |
¤ŽŠd|› dt          |¦  «        › d�}|gŠ|D ]"}‰                      ||d¬¦  «        ¦  «         Œ#ˆˆˆfd„}	 t           |¦   «         ¦  «        }d }t          |d¦  «        rc|j        r\t!          |j        t          ¦  «        r|j        }n®t!          |j        t"          ¦  «        rt                               |j        ¦  «        }ntt          |d¦  «        rd|j        r]t)          j        dd|j                             ¦   «         ¦  «        }t)          j        dd|¦  «        }t                               |¦  «        }|�!t0                               d	d|› �¬ ¦  «         |S |rt          d!|› d"|› �¦  «        ‚nB# t4          $ r5}|rt          d#|› d"|› �¦  «        |‚t7          d$|› �¦  «         Y d }~d S d }~ww xY wd S )&Nr   r0  rõ  r   u(   KhÃ´ng cÃ³ danh sÃ¡ch video cho cáº£nh: r4  u7   KhÃ´ng thá»ƒ trÃ­ch xuáº¥t junction frames cho cáº£nh: uÜ   You are the Lead Cinematic Pacing & Concat Critic for 'Tháº­p NgÅ© NiÃªn'. Evaluate multi-shot scene flow: 180-degree axis continuity, eyeline matches, color grading consistency, and editing tempo. Score >= 0.8 approves.r6  r7  r:  r;  r<  Tr=  r>  r?  r@  rA  úEvaluate Scene 'ú' consisting of zu shots. Inspect attached pairwise junction frames (tail frame vs head frame) for continuity, eyeline, and color flow.rE  rF  c               “   ó®   •K  —  ‰‰¬¦  «        4 ƒd {V —†} |                       ‰¦  «        ƒ d {V —†cd d d ¦  «        ƒd {V —† S # 1 ƒd {V —†swxY w Y   d S rI  rK  rM  s    €€€r!   Ú_call_scenez8AntigravitySDKEngine.evaluate_scene.<locals>._call_scene¡  rR  rS  rT  rø   rU  ri   rV  úscene:rX  uT   [CRITIC GATE ERROR] Antigravity SDK khÃ´ng tráº£ vá»� verdict há»£p lá»‡ cho cáº£nh r™  u@   [CRITIC GATE ERROR] Lá»—i thá»±c thi Antigravity SDK cho cáº£nh rY  r   )rZ  r1  r2  r3  r×  rØ  rq   r    rÚ  rð   rÈ  ra   r|   rÒ  r\  rT  r]  rV   r$  rø   r^  r_  r¥   r`  rÔ  r
  r  rö  )rÜ  r–  rà   r.  r2  r3  r:  ra  râ   rc  rd  re  r%  Újbrn  rh  r  ri  rt   r1  rO  rP  s                      @@@r!   r¾  z#AntigravitySDKEngine.evaluate_scenem  sÜ  øøø€ ð 	KÐJÐJÐJÐJÐJÐJÐJÐJÐJÝ”*—.’.Ð!1Ñ2Ô2ˆàð 	¥3Ð'7Ñ#8Ô#8¸1Ò#<Ð#<ØKÀÐKÐKˆGØð CÝ Ð!A¸Ð!AÐ!AÑBÔBÐBØ�4å6Ð7GÑHÔHˆØð 	ØZÐPXÐZÐZˆGØð EÝ"Ð#C¸'Ð#CÐ#CÑDÔDÐDØ�4ð8ð 	õ  2Ø#+Ø'ð
ð 
ˆ
ð
 ð 	\Ø$+ˆJ�yÑ!Ð!åœ*Ÿ.š.Ð)?ÀÑQÔQˆKØ#'ˆJ�xÑ Ø$/ˆJ�yÑ!Ý%'¤Z§^¢^Ð4KÈ]Ñ%[Ô%[ˆJ�zÑ"àÐÐ,Ð, Ð,Ð,ˆð}˜xð }ð }½Ð=MÑ9NÔ9Nð }ð }ð }ð 	ð �ˆØ ð 	Bð 	BˆBØ�MŠM˜*˜* R°<Ð@Ñ@Ô@ÑAÔAÐAÐAð	0ð 	0ð 	0ð 	0ð 	0ð 	0ð 	0ð	Ý(¨¨©¬Ñ7Ô7ˆDØˆGÝ�tÐ0Ñ1Ô1ð M°dÔ6Lð MÝ˜dÔ4Õ6HÑIÔIð XØ"Ô4�G�GÝ Ô 6½Ñ=Ô=ð XÝ0×?Ò?ÀÔ@VÑWÔW�GøÝ˜˜vÑ&Ô&ð M¨4¬9ð MÝœV N°B¸¼	¿ºÑ8IÔ8IÑJÔJ�
ÝœV J°°JÑ?Ô?�
Ý,×@Ò@ÀÑLÔL�àÐ"Ý×,Ò,Ð-?ÐFYÈxÐFYÐFYÐ,ÑZÔZÐZØ�Øð NÝ"ð  $Mð  {Cð  $Mð  $Mð  GKð  $Mð  $Mñ  Nô  Nð  NðNøåð 	ð 	ð 	Øð ~Ý"Ð#uÐfnÐ#uÐ#uÐrsÐ#uÐ#uÑvÔvÐ|}Ð}ÝÐ8°QÐ8Ð8Ñ9Ô9Ð9Ø�4�4�4�4�4øøøøð		øøøð
 ˆts   Ä9D"I4 ÉI4 É4
J3É>*J.Ê.J3N)F)rM   rN   rO   rP   r  rU   rQ   r   ra   r•  r   r¾  r   r#   r!   r-  r-  	  sù   € € € € € ðð ð ð ðZð ZàðZð ðZð  ð	Zð
 ðZð ðZð 
Ð$Ô	%ðZð Zð Zñ „[ðZðx ð
 ð	Nð NàðNð ˜sœ)ðNð ð	Nð
 
Ð$Ô	%ðNð Nð Nñ „[ðNð Nð Nr#   r-  c                   ó†   — e Zd ZdZedededededee         f
d„¦   «         Zeded	e	e         dee         fd
„¦   «         Z
dS )ÚGoogleGenAIEngineu    
    Ä�á»™ng cÆ¡ dá»± phÃ²ng thá»© cáº¥p sá»­ dá»¥ng Google GenAI Client (gemini-2.5-flash).
    Ä�Ã­nh kÃ¨m keyframe JPEG Parts thá»±c táº¿ vÃ o contents.
    r"  r#  r$  r%  rm   c                 óf  — 	 t                                ¦   «         sd S dd lm} t          j                             d¦  «        }|sd S t          |¦  «        }|                     ¦   «         r| 	                    ¦   «         j
        dk    rd S d }t          �t          |d¬¦  «        }|r|gnt          |d¬¦  «        }	|	sd S |                     |¬¦  «        }
d|› d	|› d
|› d�}|g}|	D ]8}|r4|                     |j        j                             |d¬¦  «        ¦  «         Œ9|
j                             d||j                             dt*          ¬¦  «        ¬¦  «        }|j        r@t*                               |j        ¦  «        }t                                dd|› �¬¦  «         |S n# t2          $ r Y d S w xY wd S )Nr   rõ  r.  r/  rŸ   r5  ©r:  uv   You are the Lead Cinematic Critic Auditor for 'Tháº­p NgÅ© NiÃªn' following FlowKit Quality Standards. Evaluate Shot 'rC  rD  a  '. Inspect the attached zero-waste contact sheet against the 14 Known AI Video Errors (Critical: character_drift, breed_swap, role_reversal, brand_logo_text, character_count_drift; High: camera_drift, object_morph, reverse_motion, human_hands_limbs, scale_break; Minor: lighting_jitter, micro_blur, background_warp, color_shift). If any Critical error exists, overall_score must be <= 0.59 and character_consistency <= 0.30. If any High error exists, overall_score must be <= 0.74. Return VideoCriticVerdict JSON.rE  ©r  rG  r6  úapplication/json©Úresponse_mime_typer8  ©r  ÚcontentsrJ  rW  rX  )rÔ  rú  Úgoogle.genaiÚgenair×  rØ  rq   r   r§   rÂ   rÃ   r   rß   ÚClientr|   ÚtypesÚPartr3  ÚmodelsÚgenerate_contentÚGenerateContentConfigra   rø   r`  r
  r  )rÜ  r"  r#  r$  r%  r|  r:  r²   rb  rÖ   ÚclientÚprompt_textrz  rg  rh  r  s                   r!   r•  zGoogleGenAIEngine.evaluate_shotÅ  s5  € ð2	Ý"×,Ò,Ñ.Ô.ð Ø�tà(Ð(Ð(Ð(Ð(Ð(Ý”j—n’nÐ%5Ñ6Ô6ˆGØð Ø�tå˜nÑ-Ô-ˆJØ×$Ò$Ñ&Ô&ð ¨*¯/ª/Ñ*;Ô*;Ô*CÀqÒ*HÐ*HØ�tð ˆHÝ*Ð6Ý6°zÈaÐPÑPÔP�à+3Ðj˜h˜Z˜ZÕ9PÐQ[ÐhiÐ9jÑ9jÔ9jˆNØ!ð Ø�tà—\’\¨'�\Ñ2Ô2ˆFðlØ")ðlð lØCUðlð lØjpðlð lð lð ð $�}ˆHØ$ð bð b�Øð bØ—O’O E¤KÔ$4×$?Ò$?ÀRÐS_Ð$?Ñ$`Ô$`ÑaÔaÐaøà”=×1Ò1Ø(Ø!Ø”{×8Ò8Ø'9Ý$6ð 9ñ ô ð 2ñ ô ˆDð Œyð Ý,×@Ò@ÀÄÑKÔK�Ý×,Ò,Ð-?ÐFWÈgÐFWÐFWÐ,ÑXÔXÐXØ�ðøõ ð 	ð 	ð 	Ø�4�4ð	øøøàˆts*   ‚F  �'F  ÁA F  Â2F  Â<C"F  Æ 
F.Æ-F.r–  rà   c                 óÞ  — 	 t                                ¦   «         sd S dd lm} t          j                             d¦  «        }|sd S |rt          |¦  «        dk     rd S t          |¦  «        }|sd S | 	                    |¬¦  «        }d|› dt          |¦  «        › d�}|g}|D ]6}	| 
                    |j        j                             |	d¬	¦  «        ¦  «         Œ7|j                             d
||j                             dt"          ¬¦  «        ¬¦  «        }
|
j        r@t"                               |
j        ¦  «        }t                                d
d|› �¬¦  «         |S n# t*          $ r Y d S w xY wd S )Nr   rõ  r   rt  u[   You are the Lead Cinematic Pacing & Concat Critic for 'Tháº­p NgÅ© NiÃªn'. Evaluate Scene 'z' continuity across zæ shots. Inspect the attached pairwise junction keyframes (tail frame of shot N vs head frame of shot N+1) for 180-degree axis continuity, eyeline match, color grading consistency, and editing tempo. Return VideoCriticVerdict JSON.rE  ru  r6  rv  rw  ry  ro  rX  )rÔ  rú  r{  r|  r×  rØ  rq   r    rð   r}  r|   r~  r  r3  r€  r�  r‚  ra   rø   r`  r
  r  )rÜ  r–  rà   r|  r:  râ   rƒ  r„  rz  rp  rh  r  s               r!   r¾  z GoogleGenAIEngine.evaluate_scene  sÓ  € ð)	Ý"×,Ò,Ñ.Ô.ð Ø�tà(Ð(Ð(Ð(Ð(Ð(Ý”j—n’nÐ%5Ñ6Ô6ˆGØð Ø�tà#ð ¥sÐ+;Ñ'<Ô'<¸qÒ'@Ð'@Ø�tå:Ð;KÑLÔLˆNØ!ð Ø�tà—\’\¨'�\Ñ2Ô2ˆFð3Ø#+ð3ð 3ÝADÐEUÑAVÔAVð3ð 3ð 3ð ð $�}ˆHØ$ð ^ð ^�Ø—’ ¤Ô 0× ;Ò ;ÀÈ|Ð ;Ñ \Ô \Ñ]Ô]Ð]Ð]à”=×1Ò1Ø(Ø!Ø”{×8Ò8Ø'9Ý$6ð 9ñ ô ð 2ñ ô ˆDð Œyð Ý,×@Ò@ÀÄÑKÔK�Ý×,Ò,Ð-?ÐFYÈxÐFYÐFYÐ,ÑZÔZÐZØ�ðøõ ð 	ð 	ð 	Ø�4�4ð	øøøàˆts)   ‚E �'E ÁE ÁE Á0C*E Å
E*Å)E*N)rM   rN   rO   rP   r  rU   r   ra   r•  r   r¾  r   r#   r!   rr  rr  ¿  s´   € € € € € ðð ð
 ð:àð:ð ð:ð  ð	:ð
 ð:ð 
Ð$Ô	%ð:ð :ð :ñ „[ð:ðx ð+ cð +¸TÀ#¼Yð +È8ÐTfÔKgð +ð +ð +ñ „[ð+ð +ð +r#   rr  c                   ó  — e Zd ZdZej                             dd¦  «        Z ed¦  «        Z	e
defd„¦   «         Ze
	 	 	 dd	ed
ededededee         fd„¦   «         Ze
	 ddedee         dedee         fd„¦   «         ZdS )ÚMuseAPICriticEngineu…  
    Ä�á»™ng cÆ¡ tháº©m Ä‘á»‹nh AI Fallback sá»­ dá»¥ng Muse2API Gateway (/v1/chat/completions, model gpt-5).
    Ä�Æ°á»£c kÃ­ch hoáº¡t lÃ m táº§ng cá»©u sinh khi Google Antigravity SDK gáº·p sá»± cá»‘
    (thiáº¿u GEMINI_API_KEY, vÆ°á»£t ngÃ¢n sÃ¡ch $1.00 USD, hoáº·c lá»—i káº¿t ná»‘i).
    Ä�áº£m báº£o 100% quy trÃ¬nh review cháº¡y báº±ng AI Vision mÃ  KHÃ”NG rÆ¡i vá»� Heuristic.
    ÚMUSE2API_BASE_URLzhttp://127.0.0.1:18610z!c:\Projects\Muse2API\data\api_keyrm   c                 óþ   — t           j                             dd¦  «        }|sX| j                             ¦   «         r?	 | j                             d¬¦  «                             ¦   «         }n# t          $ r Y nw xY w|pdS )NÚMUSE2API_API_KEYri   r   r   z$m2a--nqA-RT1mZ4AWalrdDVzSYkhI9Cksd8O)r×  rØ  rq   ÚLOCAL_KEY_FILEr§   Ú	read_textr¥   r  )rÜ  r¬   s     r!   Ú_get_api_keyz MuseAPICriticEngine._get_api_key?  sŽ   € åŒj�nŠnÐ/°Ñ4Ô4ˆØð 	�sÔ)×0Ò0Ñ2Ô2ð 	ðØÔ(×2Ò2¸GÐ2ÑDÔD×JÒJÑLÔL��øÝð ð ð Ø�ðøøøàÐ<Ð<Ð<s   ½-A+ Á+
A8Á7A8ri   éx   r"  r#  r$  r%  rù   c                 óP  — t          |¦  «        }|                     ¦   «         r|                     ¦   «         j        dk    rd S d }t          �t	          |d¬¦  «        }|r|gnt          |d¬¦  «        }|r|d         sd S t                               |d         ¦  «                             d¦  «        }	d|	› �}
d}d	d
|› d|› d|› d�dœdd|
idœg}dd|dœd|dœgddœ}|  	                    ¦   «         }d|› �ddœ}	 dd l
}| j                             d¦  «        › d�}|                     ||||¬¦  «        }|j        dk    r)t          d|j        › d |j        d d!…         › �¦  «         d S |                     ¦   «         }|                     d"g ¦  «        }|sd S |d                              d#i ¦  «                             d$d%¦  «        }|sd S t'          j        d&d%|                     ¦   «         ¦  «        }t'          j        d'd%|¦  «        }t'          j        d(|t&          j        ¦  «        }|r|                     d¦  «        }t2                               |¦  «        }t          d)|› d*|j        d+›d,|j        › �¦  «         |S # t:          $ r}t          d-|› �¦  «         Y d }~d S d }~ww xY w).Nr   r.  r/  rŸ   r5  r   údata:image/jpeg;base64,u  You are the Lead Cinematic Critic Auditor for 'Tháº­p NgÅ© NiÃªn' following FlowKit Quality Standards. Audit this shot against the 14 Known AI Video Errors (Critical: character_drift, breed_swap, role_reversal, brand_logo_text, character_count_drift; High: camera_drift, object_morph, reverse_motion, human_hands_limbs, scale_break; Minor: lighting_jitter, micro_blur, background_warp, color_shift). If any Critical error exists, overall_score must be <= 0.59 and character_consistency <= 0.30. If any High error exists, overall_score must be <= 0.74. Score >= 0.80 approves. Output MUST be a single raw JSON object matching the VideoCriticVerdict schema: {"overall_score": float, "approved": bool, "detected_errors": list, "error_severities": dict, "suggested_action": str, "critique_notes": str}rø   rB  rC  rD  zC'. Check attached zero-waste contact sheet. Return ONLY valid JSON.©Útyperø   Ú	image_urlÚurl©r’  r“  úgpt-5Úsystem©ÚroleÚcontentÚuserF©r  ÚmessagesÚstreamúBearer rv  ©ÚAuthorizationzContent-Typeú/ú/v1/chat/completions©Úheadersrõ   rù   éÈ   õ   âš ï¸� [MUSE API CRITIC] HTTP r™  é–   ÚchoicesÚmessagerš  ri   rU  rV  ú\{.*\}uG   ðŸŽ¯ [MUSE API CRITIC] Tháº©m Ä‘á»‹nh thÃ nh cÃ´ng qua gpt-5 cho shot 'r  r,  r  õ,   âš ï¸� [MUSE API CRITIC] Lá»—i gá»�i gpt-5: )r   r§   rÂ   rÃ   r   rß   Úbase64Ú	b64encodeÚdecoder�  ÚrequestsÚBASE_URLÚrstripÚpostÚstatus_coderö  rø   rõ   rq   r^  r_  r¥   ÚsearchÚDOTALLÚgroupra   r`  rb   rc   r  )rÜ  r"  r#  r$  r%  rù   r²   rb  rÖ   Úb64_imgÚdata_uriÚ
sys_promptÚuser_contentÚpayloadr¬   r¥  r°  r”  rh  r  r©  Ú
reply_textri  Úmr  rt   s                             r!   r•  z!MuseAPICriticEngine.evaluate_shotI  s˜  € õ ˜.Ñ)Ô)ˆ
Ø× Ò Ñ"Ô"ð 	 j§o¢oÑ&7Ô&7Ô&?À1Ò&DÐ&DØ�4ð ˆÝ&Ð2Ý2°:È!ÐLÑLÔLˆHà'/Ðf˜(˜˜Õ5LÈZÐdeÐ5fÑ5fÔ5fˆØð 	 ^°AÔ%6ð 	Ø�4å×"Ò" >°!Ô#4Ñ5Ô5×<Ò<¸WÑEÔEˆØ6¨WÐ6Ð6ˆð\ð 	ð ð ~¨'ð  ~ð  ~ÐK]ð  ~ð  ~Ðrxð  ~ð  ~ð  ~ðð ð
 $Ø# XÐ.ðð ð	
ˆð à!¨jÐ9Ð9Ø¨LÐ9Ð9ðð ð
ð 
ˆð ×ÒÑ Ô ˆà, s˜_˜_Ø.ð
ð 
ˆð
	ØˆOˆOˆOØ”\×(Ò(¨Ñ-Ô-ÐCÐCÐCˆCØ—=’= ¨g¸GÈW�=ÑUÔUˆDØÔ 3Ò&Ð&ÝÐ\°tÔ7GÐ\Ð\È4Ì9ÐUYÐVYÐUYÌ?Ð\Ð\Ñ]Ô]Ð]Ø�tà—9’9‘;”;ˆDØ—h’h˜y¨"Ñ-Ô-ˆGØð Ø�tØ  œŸš¨	°2Ñ6Ô6×:Ò:¸9ÀbÑIÔIˆJØð Ø�tåœ °°J×4DÒ4DÑ4FÔ4FÑGÔGˆJÝœ 
¨B°
Ñ;Ô;ˆJÝ”	˜) Zµ´Ñ;Ô;ˆAØð (ØŸWšW Q™ZœZ�
å(×<Ò<¸ZÑHÔHˆGÝð  fÐ\cð  fð  fÐnuô  oDð  fð  fð  fð  T[ô  Tdð  fð  fñ  gô  gð  gØˆNøÝð 	ð 	ð 	ÝÐDÀÐDÐDÑEÔEÐEØ�4�4�4�4�4øøøøð	øøøs,   Ã:A,I> Å(,I> Æ2I> Ç
B3I> É>
J%ÊJ Ê J%r–  rà   c                 óÌ  — |rt          |¦  «        dk     rd S t          |¦  «        }|r|d         sd S t                               |d         ¦  «                             d¦  «        }d|› �}d}dd|› dt          |¦  «        › d	�d
œdd|idœg}dd|dœd|dœgddœ}	|                      ¦   «         }
d|
› �ddœ}	 dd l}| j                             d¦  «        › d�}| 	                    |||	|¬¦  «        }|j
        dk    r)t          d|j
        › d|j        d d…         › �¦  «         d S |                     ¦   «         }|                     dg ¦  «        }|sd S |d                              di ¦  «                             d d!¦  «        }|sd S t          j        d"d!|                     ¦   «         ¦  «        }t          j        d#d!|¦  «        }t          j        d$|t          j        ¦  «        }|r|                     d¦  «        }t*                               |¦  «        }t          d%|› d&|j        d'›d(|j        › �¦  «         |S # t2          $ r}t          d)|› �¦  «         Y d }~d S d }~ww xY w)*Nr   r   r   r�  uº  You are the Lead Cinematic Pacing & Concat Critic for 'Tháº­p NgÅ© NiÃªn'. Evaluate multi-shot scene flow: 180-degree axis continuity, eyeline matches, color grading consistency, and editing tempo. Score >= 0.8 approves. Output MUST be a single raw JSON object matching the VideoCriticVerdict schema: {"overall_score": float, "approved": bool, "detected_errors": list, "error_severities": dict, "suggested_action": str, "critique_notes": str}rø   rk  rl  zA shots. Inspect attached junction frames. Return ONLY valid JSON.r‘  r“  r”  r•  r–  r—  r˜  r›  Frœ  rŸ  rv  r   r¢  r£  r¤  r¦  r§  r™  r¨  r©  rª  rš  ri   rU  rV  r«  uI   ðŸŽ¯ [MUSE API CRITIC] Tháº©m Ä‘á»‹nh thÃ nh cÃ´ng qua gpt-5 cho cáº£nh 'r  r,  r  r¬  )r    rð   r­  r®  r¯  r�  r°  r±  r²  r³  r´  rö  rø   rõ   rq   r^  r_  r¥   rµ  r¶  r·  ra   r`  rb   rc   r  )rÜ  r–  rà   rù   râ   r¸  r¹  rº  r»  r¼  r¬   r¥  r°  r”  rh  r  r©  r½  ri  r¾  r  rt   s                         r!   r¾  z"MuseAPICriticEngine.evaluate_scene£  sD  € ð  ð 	¥3Ð'7Ñ#8Ô#8¸1Ò#<Ð#<Ø�4å6Ð7GÑHÔHˆØð 	 ^°AÔ%6ð 	Ø�4å×"Ò" >°!Ô#4Ñ5Ô5×<Ò<¸WÑEÔEˆØ6¨WÐ6Ð6ˆð\ð 	ð ð ^¨8ð  ^ð  ^ÅSÐIYÑEZÔEZð  ^ð  ^ð  ^ðð ð
 $Ø# XÐ.ðð ð	
ˆð à!¨jÐ9Ð9Ø¨LÐ9Ð9ðð ð
ð 
ˆð ×ÒÑ Ô ˆà, s˜_˜_Ø.ð
ð 
ˆð
	ØˆOˆOˆOØ”\×(Ò(¨Ñ-Ô-ÐCÐCÐCˆCØ—=’= ¨g¸GÈW�=ÑUÔUˆDØÔ 3Ò&Ð&ÝÐ\°tÔ7GÐ\Ð\È4Ì9ÐUYÐVYÐUYÌ?Ð\Ð\Ñ]Ô]Ð]Ø�tà—9’9‘;”;ˆDØ—h’h˜y¨"Ñ-Ô-ˆGØð Ø�tØ  œŸš¨	°2Ñ6Ô6×:Ò:¸9ÀbÑIÔIˆJØð Ø�tåœ °°J×4DÒ4DÑ4FÔ4FÑGÔGˆJÝœ 
¨B°
Ñ;Ô;ˆJÝ”	˜) Zµ´Ñ;Ô;ˆAØð (ØŸWšW Q™ZœZ�
å(×<Ò<¸ZÑHÔHˆGÝð  iÐ^fð  ið  iÐqxô  rGð  ið  ið  ið  W^ô  Wgð  ið  iñ  jô  jð  jØˆNøÝð 	ð 	ð 	ÝÐDÀÐDÐDÑEÔEÐEØ�4�4�4�4�4øøøøð	øøøs,   Â8A,H< Ä&,H< Å2H< ÆB3H< È<
I#ÉIÉI#N)ri   ri   rŽ  )rŽ  )rM   rN   rO   rP   r×  rØ  rq   r±  r   r‹  r  rU   r�  r·   r   ra   r•  r   r¾  r   r#   r!   r‡  r‡  5  sM  € € € € € ðð ð Œz�~Š~Ð1Ð3KÑLÔL€HØ�TÐ>Ñ?Ô?€Nàð=˜Sð =ð =ð =ñ „[ð=ð ð
 #%ØØðWð WàðWð ðWð  ð	Wð
 ðWð ðWð 
Ð$Ô	%ðWð Wð Wñ „[ðWðr ð
 ð	Mð MàðMð ˜sœ)ðMð ð	Mð
 
Ð$Ô	%ðMð Mð Mñ „[ðMð Mð Mr#   r‡  ri   r"  r$  r%  Úforce_enginec                 óø  — |pt           j                             dd¦  «        }|dv p3t           j                             dd¦  «                             ¦   «         dv }|r�d}|dvrP	 t                               | |||d	¬
¦  «        }	|	�|	S n+# t          $ r}
|
}t          d|
› �¦  «         Y d}
~
nd}
~
ww xY wt          d¦  «         t                               | |||¬¦  «        }	|	�|	S t          d| › d|› d�¦  «        ‚|dv r!t                               | |||¦  «        }	|	�|	S |dk    r:t                               ¦   «         r!t                               | |||¦  «        }	|	�|	S t                               | |||¦  «        S )uÙ  
    Táº¦NG 1 (SHOT GATE): Tháº©m Ä‘á»‹nh Ä‘á»™c láº­p tá»«ng shot 10s trÆ°á»›c khi lÆ°u video.
    NgÆ°á»¡ng phÃª duyá»‡t: overall_score >= 0.8.
    
    Quy táº¯c báº¯t buá»™c SDK & AI Fallback:
    1. Æ¯u tiÃªn 1: Google Antigravity SDK (gemini-3.8-flash).
    2. Fallback AI: Muse2API Gateway (model: gpt-5) náº¿u SDK lá»—i/thiáº¿u key/háº¿t quota.
    3. Náº¿u cáº£ 2 AI Ä‘á»�u lá»—i: BÃ¡o lá»—i dá»©t khoÃ¡t (RuntimeError), TUYá»†T Ä�á»�I KHÃ”NG dÃ¹ng heuristic.
    ÚCRITIC_GATE_ENGINEÚfile_bridge©ÚsdkÚ	cloud_sdkÚ
strict_sdkÚmuser–  ÚREQUIRE_SDK_CRITICÚ0©Ú1ÚtrueÚyesN©rÈ  r–  F)r"  r#  r$  r%  r.  õ6   âš ï¸� [CRITIC GATE] Antigravity SDK gáº·p sá»± cá»‘: uZ   ðŸ”„ [CRITIC GATE FALLBACK] Chuyá»ƒn tiáº¿p tháº©m Ä‘á»‹nh sang Muse2API (model: gpt-5)...)r"  r#  r$  r%  uk   [CRITIC GATE ERROR] Cáº£ Google Antigravity SDK vÃ  Muse2API (gpt-5) Ä‘á»�u khÃ´ng thá»ƒ Ä‘Ã¡nh giÃ¡ shot 'õ   '. (Chi tiáº¿t SDK: õ`   ). Theo quy chuáº©n báº¯t buá»™c, há»‡ thá»‘ng bÃ¡o lá»—i chá»© khÃ´ng dÃ¹ng heuristic fallback!©ÚautorÃ  rN  Úcloud_genai)r×  rØ  rq   r£   r-  r•  r  rö  r‡  rÈ  r  rÔ  rú  rr  r!  )r"  r²   r$  r%  rÀ  ÚkwargsÚengine_choicerÇ  Úsdk_errr  rt   s              r!   Úevaluate_shot_gaterÙ  ø  s  € ð" !ÐW¥B¤J§N¢NÐ3GÈÑ$WÔ$W€MàÐLÐLð 	RÝ
Œ
�ŠÐ+¨SÑ1Ô1×7Ò7Ñ9Ô9Ð=QÐQð ð
 ð !
Ø'+ˆàÐ 1Ð1Ð1ðTÝ.×<Ò<Ø#Ø#-Ø'9Ø!Ø ð =ñ ô �ð Ð&Ø"�Nð 'øåð Tð Tð TØ�ÝÐRÈqÐRÐRÑSÔSÐSÐSÐSÐSÐSÐSøøøøðTøøøõ
 	ÐkÑlÔlÐlÝ%×3Ò3ØØ%Ø1Øð	 4ñ 
ô 
ˆð ÐØˆNõ ðJð  {Bð Jð JØ 'ðJð Jð Jñ
ô 
ð 	
ð Ð8Ð8Ð8Ý(×6Ò6°wÀ
ÐL^Ð`fÑgÔgˆØÐØˆNà˜Ò%Ð%­/×*CÒ*CÑ*EÔ*EÐ%Ý#×1Ò1°'¸:ÐGYÐ[aÑbÔbˆØÐØˆNõ "×/Ò/°¸ÐEWÐY_Ñ`Ô`Ð`s   Á$"B Â
B0ÂB+Â+B0r–  c                 óä  — |pt           j                             dd¦  «        }|dv p3t           j                             dd¦  «                             ¦   «         dv }|r™d}|dvrN	 t                               | |d	¬
¦  «        }|�|S n+# t          $ r}|}t          d|› �¦  «         Y d}~nd}~ww xY wt          d¦  «         t                               | |¬¦  «        }|�|S t          d| › d|› d�¦  «        ‚|dv rt                               | |¦  «        }|�|S |dk    r8t                               ¦   «         rt                               | |¦  «        }|�|S t                               | |¦  «        S )u-  
    Táº¦NG 2 (SCENE GATE): Tháº©m Ä‘á»‹nh Ä‘iá»ƒm giao cáº¯t tiáº¿p biÃªn (junction),
    trá»¥c 180 Ä‘á»™, Ä‘á»™ chÃªnh mÃ u vÃ  nhá»‹p Ä‘iá»‡u cáº¯t dá»±ng toÃ n cáº£nh 30-40s.
    NgÆ°á»¡ng phÃª duyá»‡t: overall_score >= 0.8.
    
    Quy táº¯c báº¯t buá»™c SDK & AI Fallback:
    1. Æ¯u tiÃªn 1: Google Antigravity SDK (gemini-3.8-flash).
    2. Fallback AI: Muse2API Gateway (model: gpt-5) náº¿u SDK lá»—i/thiáº¿u key/háº¿t quota.
    3. Náº¿u cáº£ 2 AI Ä‘á»�u lá»—i: BÃ¡o lá»—i dá»©t khoÃ¡t (RuntimeError), TUYá»†T Ä�á»�I KHÃ”NG dÃ¹ng heuristic.
    rÂ  rÃ  rÄ  rÉ  rÊ  rË  NrÏ  F)r–  rà   r.  rÐ  ua   ðŸ”„ [CRITIC GATE FALLBACK] Chuyá»ƒn tiáº¿p tháº©m Ä‘á»‹nh cáº£nh sang Muse2API (model: gpt-5)...)r–  rà   ul   [CRITIC GATE ERROR] Cáº£ Google Antigravity SDK vÃ  Muse2API (gpt-5) Ä‘á»�u khÃ´ng thá»ƒ Ä‘Ã¡nh giÃ¡ scene 'rÑ  rÒ  rÓ  rÕ  )r×  rØ  rq   r£   r-  r¾  r  rö  r‡  rÈ  r  rÔ  rú  rr  r!  )	r–  rà   rÀ  rÖ  r×  rÇ  rØ  r  rt   s	            r!   Úevaluate_scene_gaterÛ  A  s   € ð  !ÐW¥B¤J§N¢NÐ3GÈÑ$WÔ$W€MàÐLÐLð 	RÝ
Œ
�ŠÐ+¨SÑ1Ô1×7Ò7Ñ9Ô9Ð=QÐQð ð
 ð 
Ø'+ˆØÐ 1Ð1Ð1ð
TÝ.×=Ò=Ø%Ø%5Ø ð >ñ ô �ð
 Ð&Ø"�Nð 'øåð Tð Tð TØ�ÝÐRÈqÐRÐRÑSÔSÐSÐSÐSÐSÐSÐSøøøøðTøøøõ
 	ÐrÑsÔsÐsÝ%×4Ò4ØØ-ð 5ñ 
ô 
ˆð ÐØˆNåðJð  |Dð Jð JØ 'ðJð Jð Jñ
ô 
ð 	
ð Ð8Ð8Ð8Ý(×7Ò7¸ÐBRÑSÔSˆØÐØˆNà˜Ò%Ð%­/×*CÒ*CÑ*EÔ*EÐ%Ý#×2Ò2°8Ð=MÑNÔNˆØÐØˆNõ "×0Ò0°Ð;KÑLÔLÐLs   Á$ B Â
B.ÂB)Â)B.Ú__main__z#Antigravity Critic Quality Gate CLI)r7   z--shotu   Shot ID cáº§n tháº©m Ä‘á»‹nh)r’  Úhelpz--videou   Ä�Æ°á»�ng dáº«n file video MP4z--characteru'   NhÃ¢n váº­t ká»³ vá»�ng (vd: kim_trong))r’  r<   rÝ  z--promptu   Prompt ká»‹ch báº£nz--sceneu   Scene ID cáº§n tháº©m Ä‘á»‹nhz--shots-listú+u!   Danh sÃ¡ch video shot cá»§a scene)ÚnargsrÝ  r½   r  )rŸ   r±   )r±   )ri   ri   Nr?  )^rP   r×  Úsysr^  rõ   Úshutilr  rÆ  rÄ  r   Úpathlibr   Útypingr   r   r   r   r	   r
   rÄ   Únumpyr@  Úpydanticr   r   r   Úplatformr  ÚreconfigureÚstderrr  Ú__file__r_  rð  ÚBASE_DIRr¦   ÚKEYFRAMES_DIRÚ
VIDEOS_DIRr+  Údotenvr   Ú_workspace_envÚ	_mem0_envr§   Úcontact_sheet_enginer   r   r   r   ÚImportErrorr5   rU   rR   r8   r:   rX   ra   r°   r·   Úbytesrß   rð   rQ   r  Úndarrayr  r!  rÒ  r  rÙ  rÔ  r  r-  rr  r‡  rÙ  rÛ  rM   ÚargparseÚArgumentParserÚparserÚadd_argumentÚ
parse_argsÚargsÚshotÚvideoÚ	characterr%  r
  rö  r  ÚsceneÚ
shots_listÚ
print_helpr   r#   r!   ú<module>r      s#
  ððð ð ð0 
€	€	€	Ø 
€
€
€
Ø 	€	€	€	Ø €€€Ø €€€Ø Ð Ð Ð Ø €€€Ø €€€Ø Ð Ð Ð Ð Ð Ø Ð Ð Ð Ð Ð Ø :Ð :Ð :Ð :Ð :Ð :Ð :Ð :Ð :Ð :Ð :Ð :Ð :Ð :Ð :Ð :Ø 
€
€
€
Ø Ð Ð Ð Ø 6Ð 6Ð 6Ð 6Ð 6Ð 6Ð 6Ð 6Ð 6Ð 6ð „<�7ÒÐðØŒ
×Ò¨ÐÑ0Ô0Ð0ØŒ
×Ò¨ÐÑ0Ô0Ð0Ð0øØð ð ð Øˆðøøøð ˆ4�‰>Œ>×!Ò!Ñ#Ô#Ô*Ô1€Ø˜KÑ'¨,Ñ6€Ø˜;Ñ&¨Ñ4€Ø˜Ñ# hÑ.€
Ø˜kÑ)¨NÑ:Ð ð	Ø"Ð"Ð"Ð"Ð"Ð"Ø Ñ&€NØ�ÐIÑJÔJ€IØ×ÒÑÔð #Øˆ�N¨TÐ2Ñ2Ô2Ð2Ð2Ø	×	Ò	Ñ	Ô	ð #Øˆ�I¨Ð-Ñ-Ô-Ð-Ð-àˆ˜TÐ"Ñ"Ô"Ð"øøØð 	ð 	ð 	Ø€Dð	øøøð3ðð ð ð ð ð ð ð ð ð ð ð ð øð ð 
3ð 
3ð 
3ð	3ð	
ð 	
ð 	
ð 	
ð 	
ð 	
ð 	
ð 	
ð 	
ð 	
ð 	
ð 	
ð 	
øð ð 3ð 3ð 3Ø $ÐØ,0Ð)Ø&*Ð#Ø"2Ð"2ÐÐÐð	3øøøøøð
3øøøð& "ØØØ!Ø'àØØØØàØØØð#'ð 'Ð �T˜#˜s˜(”^ð ð ñ ð, Ø{ðð ð
 Øjðð ð
 Øpðð ð
 Ø]ðð ð
 Øyðð ð
 Økðð ð
 Øqðð ð
 Øqðð ð
 ØXðð ð
 Ørðð ð
 ØNðð ð
 Øhðð ð
 Ø?ðð ð
 ØVðð ðk94ð 94Ð �t˜C  c¨3 h¤Ð/Ô0ð 9ð 9ñ 9ð@+ð +ð +ð +ð +�Yñ +ô +ð +ð\'ð 'ð 'ð 'ð '�iñ 'ô 'ð 'ðThð hð hð hð h˜ñ hô hð hð^&¨Sð &°X¸d´^ð &ð &ð &ð &ðR"ð "¨ð "¸#ð "ÐRUð "Ð`dÐejÔ`kð "ð "ð "ð "ðJ!ð !°D¸´Ið !Ècð !Ð\`ÐafÔ\gð !ð !ð !ð !ðH$ Dð $¨Tð $ð $ð $ð $ðN B¤Jð °2´:ð ð ð ð ðL
ð L
ð L
ð L
ð L
ñ L
ô L
ð L
ðf? ð ?¨ð ?ð ?ð ?ð ?ð$ ˜{Ñ*Ð-HÑHÐ ØÐ ðMð Mð Mð Mð Mñ Mô Mð Mðhlð lð lð lð lñ lô lð lð^sð sð sð sð sñ sô sð sðloð oð oð oð oñ oô oð oðl|ð |ð |ð |ð |ñ |ô |ð |ðL !ØØ"&ðFað FaØðFaàðFað ðFað ð	Fað
 ˜3”-ðFað ðFað Fað Fað FaðX #'ð?Mð ?MØð?Mà˜3”ið?Mð ˜3”-ð?Mð
 ð?Mð ?Mð ?Mð ?MðD ˆzÒÑØ€O€O€OØ$ˆXÔ$Ð1VÐWÑWÔW€FØ
×Ò˜ sÐ1OÐÑPÔPÐPØ
×Ò˜	¨Ð2RÐÑSÔSÐSØ
×Ò˜¨C¸ÐBkÐÑlÔlÐlØ
×Ò˜
¨°bÐ?TÐÑUÔUÐUØ
×Ò˜	¨Ð2QÐÑRÔRÐRØ
×Ò˜¨cÐ8[ÐÑ\Ô\Ð\à×ÒÑÔ€Dà„yð �T”Zð Ø Ð  ¤¨D¬J¸¼ÈÌÑTÔTˆØˆˆc×!Ò!¨Ð!Ñ+Ô+Ñ,Ô,Ð,Ð,Ð,Ø	Œð ˜œð Ø!Ð! $¤*¨d¬oÑ>Ô>ˆØˆˆc×!Ò!¨Ð!Ñ+Ô+Ñ,Ô,Ð,Ð,Ð,à×ÒÑÔÐÐÐð' Ðs[   Á6B ÂBÂBÃ(A&E ÅEÅEÅE( Å(FÅ.E;Å:FÅ;FÆ	FÆFÆFÆF