
    Oj                       d Z ddlmZ ddlZddlZddlZddlmZ ddlm	Z	m
Z
mZmZ ddlmZ ddlmZ ddlmZ g d	Z ej(                  e      Zdd
Z	 	 	 	 	 	 	 	 ddZ	 	 	 	 	 	 	 	 ddZ ej4                  d      Z	 	 	 	 	 	 	 	 ddZ	 	 	 	 	 	 	 	 ddZ	 	 	 	 	 	 	 	 ddZ	 	 	 	 	 	 	 	 ddZ	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 ddZ 	 	 	 	 	 	 	 	 ddZ!y)u  Scene image pipeline checkpoint loaders — module-level stateless helpers.

W5 F22 Phase B.11 (2026-04-22): scene_image_service.generate_images()의
checkpoint 로딩 블록(shot_staging / shot_dependency)을 이관.

모든 loader는 stateless 순수 함수로, 체크포인트 JSON을 파싱하여 generate_images
파이프라인이 쓰는 key-to-data map 형태로 정규화한다. 파일이 없거나 파싱에
실패하면 빈 dict를 반환한다 (failure non-fatal).
    )annotationsNPath)AnyDictListOptional)AppError)validate_keep_elements)_normalize_evidence_fields)load_shot_staging_mapload_shot_dependency_mapload_shot_t2i_variationsload_background_chain_bg_mapload_space_set_bg_mapload_outdoor_direct_contextc                <    t        |       |z  dz  dz  |z  |z  dz  S )Ncheckpointsepisodeszmanifest.jsonr   )projects_dir
project_id
episode_id	step_names       [/Users/manta/Documents/Projects/TheRoad-I1/backend/app/services/scene_checkpoint_loaders.py_ep_checkpoint_pathr   $   s<    \Z'
	$	%'1	2
	%	&    c                   i }t        | ||d      }|j                         s|S 	 t        j                  |j	                  d            }|j                  d|      j                  dg       D ],  }|j                  d       d|j                  d       }|||<   . 	 |S # t        $ r!}t        j                  d	|       Y d
}~|S d
}~ww xY w)zLoad shot_staging checkpoint and index by 'scene_index_shot_index' key.

    Used to resolve character/gaze/camera metadata per shot. Returns empty
    dict on missing file or parse failure (non-fatal).
    shot_stagingutf-8encodingdatashotsscene_index_
shot_indexu>   shot_staging checkpoint load failed: %s — staging_map 비움N	r   existsjsonloads	read_textget	Exceptionloggerwarning)	r   r   r   staging_mapcp_pathrawstkeyexcs	            r   r   r   ,   s     .0K!,
JWG>>^jj**G*<=''&#&**7B7BVVM*+1RVVL-A,BCC!K 8
   ^WY\]]^s   A6B 	C&CCc                   i }t        | ||d      }t        | ||d      }|j                         r|n|}|j                         s|S 	 t        j                  |j	                  d            }|j                  d|      j                  dg       D ]  }|j                  d       d|j                  d	       }	|j                  d
g       dd D ]  }
d|
vr"||u rt        j                  d|	       i |
dg i}
d|
vr!t        dd|j                   d|	 d|
d      |
d   }t        |d|j                   d|	 ddd       |
j                  dd      |
j                  d|
j                  dd            ||
j                  d      |
j                  d	      ||u d||	<     	 |S # t        $ r  t        $ r!}t        j                  d|       Y d}~|S d}~ww xY w)u  Load shot_dependency_t2i (preferred) or shot_dependency checkpoint.

    Returns {'scene_index_shot_index': {ref_usage, ignore_elements,
    keep_elements: list[{label, kind}]}} using the first location_ref per shot.
    ignore_elements falls back to legacy 'removal_instruction' key.
    Empty dict on JSON parse failure (warning log).

    Area D-next-min — keep_elements entry validation (L2 intermediate fail-fast):
    - entry must be dict with required keys 'label' and 'kind'.
    - kind must be in KEEP_ELEMENT_KINDS (environment / static_prop only —
      person/character 묘사 금지, character state 는 별도 layer 책임).
    - legacy List[str] cp (v5) → AppError fail-fast (운영자 force 의무).
    - legacy v6 cp (kind=immobilized_character) → AppError fail-fast (운영자
      force 의무 — Area D-next-min 에서 enum 폐기).
    - broad except 가 shape validation AppError 를 absorb 안 함
      (`except AppError: raise` 분기, silent fallback 0).
    shot_dependency_t2ishot_dependencyr   r    r"   dependenciesr$   r%   r&   location_refsN   keep_elementsuq   shot_dependency base cp dep[%s]: keep_elements 없음 — t2i 주석 전 기본 CP 라 빈 목록으로 읽는다z9step.scene_checkpoint_loaders.keep_elements_entry_invalidzshot_dependency cp z: dep[uO   ] location_ref missing 'keep_elements' key — schema v7 required field. value=i  )codemessagestatus_code]z6step.scene_checkpoint_loaders.keep_elements_legacy_str)label_sourceerror_code_entryerror_code_legacy_str	ref_usage ignore_elementsremoval_instruction)rD   rF   r<   dep_scene_indexdep_shot_indext2i_annotatedz.Failed to parse shot_dependency checkpoint: %s)r   r(   r)   r*   r+   r,   r.   infor
   namer   r-   r/   )r   r   r   dep_mapt2i_path	base_pathsourcer2   depr4   refraw_keepr5   s                r   r   r   B   s   ( *,G"<ZI^_H#L*jJ[\I!*X	F==?<Njj))7);<7763'++NB?CWW]+,Acggl.C-DECww3BQ7 ##-&I2E KKCDGI 7S6/26C"#-"X1&++fSE J88;w@ %(  /&#6v{{m6#a!P%`*b	 "%b!9'*ww/@#''J_acBd'e%- (+ww}'=&)ggl&; &,x%7! A 8 @v N   	 NGMMNNs   EF" "G4GGz^S(\d+)_Shot(\d+)$c           	     ,   d}|xs i j                  d      xs i }t        |t              s|S |j                         D ]#  \  }}t        |t              s|j                  d      dk7  r-|j                  d      xs d}|sEt	        |      }|j                         sa|j                  dd      }	|j                  d      xs g }
t        |
t              s	 |j                         }|
D ]u  }t        j                  t        |            }|s$t        |j                  d             dt        |j                  d             }|| v r`|d| d|	 d||	d| |<   |dz  }w & |S # t        $ r#}t        j                  d	|||       Y d
}~Pd
}~ww xY w)u   Phase 7 / Phase 5 공통 shape: data.groups[bg_id].{status, png_path, shot_ids, location_id}.

    각 'ok' 그룹의 shot_ids("Sxx_Shotyy")를 'xx_yy' key로 펼침. 첫 매칭 보존.
    Returns 추가된 매핑 수.
    r   groupsstatusokpng_pathrE   location_idshot_idsu/   %s: %s vanished after exists check — skip: %sNr;   r%      background chain ref ( for '   ) — match wall/floor/ceiling/lightingimage_byteslabelbg_idrY   )r,   
isinstancedictitemsr   r(   list
read_bytesOSErrorr.   r/   _SHOT_ID_REmatchstrintgroup)bg_mapr"   source_labeladdedrU   rb   gresrX   ploc_idrZ   r`   io_excsidmr4   s                   r   _ingest_phase7_groups_shaperw      s    Ejbh'-2Ffd#||~t$%88H%88J'-2Nxxz-,88J'-2(D)	,,.K C!!#c(+A_%Qs1771:&78Cf}*,UG5 A8 9
 %
F3K QJE% / &T L1  	NNA<QRTZ 		s   E''	F0FFc           	        i }ddl m} |j                  s|S t        | ||d      }|j	                         r[	 t        j                  |j                  d            j                  di       }t        ||d      }|rt        j                  d|       t        | ||d
      }	|	j	                         r<	 t        j                  |	j                  d            j                  di       }
t        ||
d
      }|rt        j                  d|       |
j                  di       xs i }|j                         D ]  \  }}|j                  dg       xs g D ]  }|j                  d      }|j                  d      }|j                  dd      }|||s>t        |      }|j	                         sZ| d| }||v rf	 |j!                         }|j                  dd      }|d| d| d||d||<     	 t%        | ||      }|r0|j'                  |       t        j                  dt)        |             t+        | ||      }|rg }g }|j                         D ]b  \  }}|j                  |      }||j                  d      dk(  r.|dk(  r||j-                  |       G||j-                  |       dd|d ||<   d |s|r=t        j                  d!t)        |      t/        |      t)        |      t/        |             |S # t        $ r!}t        j                  d|       Y d	}~d	}~ww xY w# t"        $ r"}t        j                  d||       Y d	}~d	}~ww xY w# t        $ r!}t        j                  d|       Y d	}~d	}~ww xY w)"u)  Load background_render(Phase 7) / background_chain_render(Phase 5/4) checkpoint
    and map shot → background image_bytes.

    on_demand step이라 체크포인트가 없을 수 있다. 이 경우 빈 dict 반환 (set_design
    시절과 동일한 optional fallback 패턴).

    P0-2 (2026-04-29): settings.background_chain_enabled=False면 체크포인트가
    있어도 무조건 빈 dict 반환. 토글 off 시 stale 체크포인트가 inject되어 회귀를
    일으키는 것을 차단 (Codex H1).

    지원 shape:
      - Phase 7: background_render — data.groups[bg_id].{status, png_path, shot_ids[], ...}
      - Phase 5: background_chain_render — 동일 shape
      - Phase 4 LEGACY: background_chain_render — data.locations[loc_id].shot_backgrounds[]

    Phase 7 우선, Phase 5/4 fallback. _ingest_phase7_groups_shape는 중복 key
    첫 번째 보존이라 자연스럽게 Phase 7 우선이 된다.

    Returns {'scene_index_shot_index': {image_bytes, label}}. Failed nodes /
    missing PNGs / 잘못된 shot_id 형식은 skip.
    r   settingsbackground_renderr   r    r"   z5background_render: loaded %d shot background mappingsuH   background_render checkpoint load failed: %s — Phase 5 fallback 시도Nbackground_chain_renderzEbackground_chain_render (Phase 5): loaded %d shot background mappings	locationsshot_backgroundsr$   r&   
image_pathrE   r%   uD   background_chain_render: %s vanished after exists check — skip: %snode_idr\   r]   r^   r_   uQ   background_chain_render checkpoint load failed: %s — bg_map 일부만 채워짐uG   space_set_bg: %d shot background mappings overlaid (space plate 우선)rP   space_set_bg
unassignedspace_set_bg_no_plateT)rP   suppress_background_requiredreasonzjspace_set_bg diagnostics: %d legacy chain bg suppressed %s / %d kept (unassigned + legacy env-identity) %s)app.core.configrz   background_chain_enabledr   r(   r)   r*   r+   r,   rw   r.   rK   r-   r/   re   r   rg   rh   r   updatelenload_space_set_bg_no_plate_keysappendsorted)r   r   r   rn   rz   
cp_p7_pathdata_p7nr5   
cp_p5_pathdata_p5n_p5r}   rs   loc_datasbsishiimg_pathrr   r4   r`   rt   r   	space_mapno_plate_keys
suppressedkept_legacykr   existings                                  r   r   r      s   0 )+F(,, %j*.AJ 	jj!5!5w!5!GHLLVUWXG+FG=PQASUVW %j*.GJ .	jj!5!5w!5!GHLLVUWXG.vw@YZD[]a  K4:I$-OO$5 ",,'92>D"DB.B&&.C!vvlB7HzS[ XA88: D#-Cf} !&'lln !ffY3G'24WIU6( K@ A
 ")'-
#F3K+ E %6T &lJ
KIi U	N	
 4L*jYM 
&,,.IAvzz!}H#X(>.(P%(*>""1%#!!!$ 204 F1I /$ KK@J
!3K &"5	 Mi  	NNZ\_ 	F # !bv !!$  	NNceh 	s[   AK5 0DM 3L"'M 5	L>LL"	M+MM MM 	M:M55M:c                   i }ddl m} t        t        |dd            s|S t	        | ||d      }|j                         s|S 	 t        j                  |j                  d            j                  di       xs i }|j                  d	      xs i j                         D ]  \  }}t        |t              s|j                  d
      xs g D ]p  }	t        |	t              s|	j                  d      dvr(|	j                  d      |	j                  d      }}
|
|Ot        |	j                  d            ||
 d| <   r  	 |S # t        $ r"}t        j!                  d|       i cY d}~S d}~ww xY w)ug  space_set_bg shot_assign_diagnostics 에서 'plate 없음/불확실' 판정 shot 맵.

    W1 (2026-06-11): reason ∈ {unassigned, connector_no_plate,
    plate_action_no_plate} 인 shot 의 `{scene}_{shot}` → reason 맵.
    plate_action_no_plate (Phase 3) = 배정 LLM 의 명시적 'plate 참조 부적합'
    정책 판정 — connector 와 같은 suppression 계열 (Codex 리뷰 BLOCKING 1:
    빠지면 legacy chain bg 가 도로 붙어 W1-B 억제 정책과 충돌).
    소비처는 load_background_chain_bg_map —
    이 key 들의 legacy chain bg fallback 을 sentinel 로 대체 (space policy 우선)
    하고, sentinel 이 required background waiver 신호를 coordinator 에 전달
    (Codex 합의: validator 는 pure checker 유지, explicit signal 만).
    flag OFF / checkpoint 부재 / 진단 부재 시 빈 dict (기존 동작 보존).
    r   ry   space_set_bg_enabledFr   r   r    r"   rU   shot_assign_diagnosticsr   )r   connector_no_plateplate_action_no_platesceneshotNr%   u>   space_set_bg no-plate diagnostics load failed: %s — 빈 dict)r   rz   boolgetattrr   r(   r)   r*   r+   r,   re   rc   rd   rk   r-   r.   r/   )r   r   r   keysrz   r1   r"   _gidrq   diagscshr5   s                r   r   r   w  sd     D("8%@A!,
JWG>>zz'++W+=>BB62NTRT88H-3::<JD$dD)";<BB!$-88H% .  '*DHHV,<B:%(();%<t1RD\" C =" K  WY\]	s   C=E 	E-E("E-(E-c                    i }ddl m} t        t        |dd            s|S t	        | ||d      }|j                         s|S 	 t        j                  |j                  d            j                  di       xs i }|j                  d	      xs i j                         D ]  \  }}t        |t              r|j                  d
      dk7  r,|j                  d      xs d}	|j                  d      xs i j                         D ]  \  }
}t        |t              s|j                  d      xs d}|r|	s1t        |	      |z  }|j                         sP	 |j                         }|j                  dd      }|d| d| dd| d|j                  dd       d||d||
<     	 |S # t        $ r!}t         j#                  d||       Y d}~d}~ww xY w# t$        $ r!}t         j#                  d|       Y d}~|S d}~ww xY w)u@  Load space_set_bg checkpoint's shot_plate_map → shot 단위 background ref map.

    W21B Phase 2 (2026-06-10): space_set_bg step 이 상류에서 1회 확정한
    shot→space 배정(shot_plate_map)을 deterministic 조인만으로 펼친다 —
    이 loader 는 어떤 판단도 하지 않는다 (Codex 합의 B).

    - opt-in: settings.space_set_bg_enabled=False(default) 면 무조건 빈 dict
      (기존 파이프라인 byte-identical 보존).
    - bg_id 는 synthetic `space_set_bg:<gid>:<plate_key>` — 실 catalog bg_id 를
      가장하지 않는다 (provenance/freshness 계약 오염 방지, Codex C 반려 사유).
    - status!="ok" 그룹 / 누락 PNG 는 skip (해당 shot 은 기존 경로 유지).

    Returns {'scene_index_shot_index': {image_bytes, label, bg_id, source,
    group_id, space}}.
    r   ry   r   Fr   r   r    r"   rU   rV   rW   
assets_dirrE   shot_plate_map	plate_pngu9   space_set_bg: %s vanished after exists check — skip: %sNspacezspace set background ref (z, u$   ) — match layout/material/lightingzspace_set_bg::	plate_key)r`   ra   rb   rP   group_idr   u<   space_set_bg checkpoint load failed: %s — space map 비움)r   rz   r   r   r   r(   r)   r*   r+   r,   re   rc   rd   r   rg   rh   r.   r/   r-   )r   r   r   r   rz   r1   r"   gidrq   r   r4   entrypng_namerr   r`   rt   r   r5   s                     r   r   r     s   $ ,.I("8%@A!,
JWG>>$\zz'++W+=>BB62NTRT((8,299;ICdD)TXXh-?4-G,/52J#xx(89?RFFH
U!%. 99[17Rz$x/xxz"#,,.K 		'2.#.4UG2cU C9 :  -SE599["3M2NO, #"
"	#% I	 <F )  NNS6 $  \UWZ[[\sD   DG F&#A G &	G/GG GG 	G=G88G=c                  t        j                  |xs d      j                  dg       }|r|D ]  }t        |d        |S t	        | ||d      }	|	j                         sg S 	 t        j                  |	j                  d            j                  di       }
|xs |}|
j                  dg       D ]  }|j                  d      |k7  r|P|j                  d      ?|j                  d      |k(  s@|j                  dg       }|D ]  }t        |d        |c S |j                  dg       }|D ]  }t        |d        |c S  g S # t        $ r"}t        j                  d	|       g cY d
}~S d
}~ww xY w)u3  Load t2i_variations for a single shot: camera_json → scene_detail fallback.

    W5 F22 Phase B.21.1 (2026-04-22): scene_image_service.generate_single_scene_image의
    T2I 변형 조회 블록을 이관. 조회 순서:
      1) still.camera_json의 't2i_variations' 필드 (JSON decode — 원본과 동일하게
         JSONDecodeError는 caller까지 propagate)
      2) 비어있으면 scene_detail 체크포인트에서 scene_index/shot_index 매칭 샷 조회
         - v4: shot_index 매칭 우선 (_shot_index 필드 기반)
         - fallback: scene_index 단독 매칭 (첫 씬 항목의 t2i_variations)

    target_si는 `scene_index or still_index` (원본 literal 그대로 — 0이면 fallback).
    scene_detail 체크포인트 자체의 파싱 실패는 빈 리스트로 fallback (non-fatal).
    z{}t2i_variationsz$scene_checkpoint_loaders.camera_json)wherescene_detailr   r    r"   z(scene_detail checkpoint parse failed: %sNscenesr$   _shot_indexz!scene_checkpoint_loaders.fallback)
r)   r*   r,   r   r   r(   r+   r-   r.   r/   )r   r   r   camera_jsonr$   still_indexr&   r   varr1   detail_datar5   	target_sir   	vars_lists                  r   r   r     s   . ZZ 3t4889I2NN!C&A " !,
JWG>>	jj!2!2G!2!DEII&RTU
 *{Iooh+66- I-!bff]&;&Gvvm$
2FF#3R8	$C.#F % ! /4I *B ! % ,& I1  A3G	s   #5E 	E2E-'E2-E2c                4
    i }ddl m} t        |dd      s|S d/ fd} |d      j                  di       xs i } |d      j                  di       xs i } |d	      j                  di       xs i }|r|r|s|S  |d
      }	i }
i }|	j                  dg       xs g D ]  }|j                  d      }||j                  d      xs d|
t	        |      <   |j                  dg       xs g D ]c  }|j                  d      }||j                  d      xs d|j                  d      xs g D cg c]  }|st        |       c}d|| d| <   e  ddlm}m}m	} d}	  ||      }d}|j                         D ]  \  }}t        |t              rd|vr|j                  |      xs i j                  d      xs i }|j                  |      xs i }|r|j                  d      dk7  rp	 t!        |j                  d      xs d      j#                         }t!        |j                  d      xs d      j#                         }|j                  dg       xs g D cg c]%  }|j                  d       r|j                  d d      ' }}|j                  d      xs i j                         D ]  \  } }!t        |!t              r|!j                  d      dk7  r,|!j                  d!      xs i }"|"j                  d"      r|"j                  d#      st        j                  d$|        z|j                  |       xs i }#|#j                  d      st        j                  d%|        	 t	        | j'                  d      d         }	  || ||"|      |
j                  |d      |#d   |#j                  d      xs g |"j                  d&      xs d|"j                  d"      xs d|"j                  d#      xs d|"j                  d'      xs dd(|d|d)      }$|$||||j                  d+      xs d|j                  d,      xs d|d-|| <     |rt        j-                  d.t/        |             |S c c}w # t        $ r"}t        j                  d|       |cY d}~S d}~ww xY w# t$        $ r"}t        j                  d||       Y d}~Kd}~ww xY wc c}w # t(        t*        f$ r Y :w xY w# t        $ r"}t        j                  d*| |       Y d}~dd}~ww xY w)0ut  W22 야외 직행 합성 컨텍스트 — shot 별 캐논 refs + 9절 프롬프트.

    Returns {"<scene_index>_<shot_index>": {
        "prompt": <s33 9절 결정론 조립 (REF_NOTE 제외 — role 지시문이 담당)>,
        "master_bytes": bytes, "map_bytes": bytes,
        "master_asset_id": str, "map_asset_id": str,
        "place_id": <building group_id>,
    }}

    flag OFF / cp 부재 / 그룹·샷 결측 / 조립 실패 = 해당 키 없음 → 소비자는
    기존 5a~5e 경로로 자연 fallback. flag OFF 면 무조건 빈 dict —
    load_background_chain_bg_map 의 stale 차단 패턴과 동일.
    r   ry   outdoor_direct_compose_enabledFc                   t        |       }|j                         r:	 t        j                  |j	                  d            j                  di       xs i S i S # t        $ r"}t        j                  d| |       Y d }~i S d }~ww xY w)Nr   r    r"   u$   outdoor_direct: %s 로드 실패: %sr'   )step_idrr   r5   r   r   r   s      r   
_load_dataz/load_outdoor_direct_context.<locals>._load_data?  s    j*gN88:Uzz!++w+"?@DDVRPVTVV 	  UEwPSTT	Us   8A 	B%BBoutdoor_place_specrU   outdoor_place_canonoutdoor_shot_groundingshot_validatorr   r$   Nscene_headingrE   r#   r&   description
characters)r   r   r%   )build_direct_promptbuild_place_descload_blocks3uG   outdoor_direct: 프롬프트 팩 로드 실패 — 직행 비활성: %sspecrV   rW   master_png_pathmap_png_pathu8   outdoor_direct: group=%s 캐논 read 실패 — skip: %sre   r=   groundcamera_position_enlook_direction_enug   outdoor_direct: %s grounded camera 필드 결손 — direct 제외(fail-closed, 기존 경로 fallback)u-   outdoor_direct: %s 샷 원문 없음 — skipmoment_context_enin_frame_en)r   r   r   )

place_descr   shot_descriptioncharacter_namesr   camera_guidanceworld_facts_blockstyle_context
spec_codesinclude_ref_noteu:   outdoor_direct: %s 프롬프트 조립 실패 — skip: %smaster_asset_idmap_asset_id)promptprompt_versionmaster_bytes	map_bytesr   r   place_idu.   outdoor_direct: %d shots direct-compose 활성)r   rk   returnDict[str, Any])r   rz   r   r,   rl   rk   +app.modules.pipeline.outdoor_direct_composer   r   r   r-   r.   r/   re   rc   rd   r   rg   rh   split
ValueError
IndexErrorrK   r   )%r   r   r   outrz   r   spec_groupscanon_groupsground_groups	validatorheading_by_scene	shot_infor   r   r   r   cr   r   r   DIRECT_PROMPT_VERSIONblocksr5   world_factsr   g_entryr   canonr   r   itcodesr4   sh_entryr   rK   r   s%   ```                                  r   r   r   )  s,     &(C(8=uE
 1266xDJK34882FL"L78<<XrJPbML]
 +,I')+-ImmHb)/R/VVM":$&FF?$;$ArR!&&"%++B&&&C{!vvm4:%'VVL%9%?R%?%?qACF%?(IAcUm$	 , 0    23 K%++-W'4(G7,B$*//7=2  %+uyy*d2			*; < BCNNPLUYY~6<"=HHJI *.'2)>)D")D
)D2vvf~ FF62)D 	 
 &kk'28b??AMCh-h1G41O\\(+1rF JJ34

#67BCF ==%+D88M*CS 3*+,/="2"6"6r2">%)-%8$(HH\$:$@b&,jj1D&E&K #JJ';<B"JJ':;Ar'-zz-'@'FB% '2"$$%*)8 !"7 ,&#(99->#?#E2 %		. 9 ?RCHk B' .d Dc#hOJY  `bef
(  	NNJCQT 		

6 
+ 2  PRUWZ 	st   1Q0
9Q0
$Q5 /AR#*S&SBS,5	R >RR R #	S,S		SS)(S),	T5TT)
r   rk   r   rk   r   rk   r   rk   r   r   )r   rk   r   rk   r   rk   r   Dict[str, Dict[str, Any]])rn   r   r"   r   ro   rk   r   rl   )r   rk   r   rk   r   rk   r   zDict[str, str])r   rk   r   rk   r   rk   r   zOptional[str]r$   Optional[int]r   r  r&   r  r   zList[Dict[str, Any]])"__doc__
__future__r   r)   loggingrepathlibr   typingr   r   r   r	   app.core.errorsr
   app.core.keep_elementsr    app.core.steps._evidence_helpersr   __all__	getLogger__name__r.   r   r   r   compileri   rw   r   r   r   r   r    r   r   <module>r     s   #   	  , , $ H 
		8	$#&47,WW#&W47WWt bjj./6%6-;6KN66r\\#&\47\\~,,#&,47,,^@@#&@47@@F=== =
 = = = = =@``#&`47``r   