
    gIjS                     ^   d Z ddlZddlZddlZddlZddlmZ ej                  j                  d e	 ee
      j                               ddlZej                  Zd Zd Zde	dede	fd	Zdded
e	de	fdZde	defdZde	dede	fdZdededefdZd Zd ZddZdZd Zedk(  r e        yy)u   갤러리 빌더 v2 — 파이프라인 순서 정렬 + 단계 라벨 + 프롬프트 전수 표시.

사용: .venv/bin/python gallery.py  → forest_exp/gallery.html (8897 서빙)
    N)Pathc                  P   i } t         j                  j                         rvt         j                  j                         j	                         D ]G  }	 t        j                  |      }|j                  d      }|s-|| vs|j                  d      sC|| |<   I | S # t        $ r Y Ww xY w)uY   out 경로 → 생성 이벤트. skip 이벤트가 prompt 있는 원본을 덮지 않게.outprompt)	FRUNLOGexists	read_text
splitlinesjsonloads	Exceptionget)by_outlineer   s       
gallery.pyload_runlogr      s    FxxHH&&(335DJJt$ %%,C& AEE(Os 6 M  s   B	B%$B%c                     i } t         j                  j                         rt         j                  j                         j	                         D ]  }	 t        j                  |      }|j                  d      dk7  s|j                  d      r?|j                  d      xs g D ]?  }| j                  t        |      g       j                  |j                  d      xs d       A  | S # t        $ r Y w xY w)u\   참조 이미지 절대경로 → 그것을 소비한 생성 호출 tag 목록 (runlog SOT).kindimgskiprefstag?)r   r   r	   r
   r   r   r   r   r   
setdefaultstrappend)usedr   r   rs       r   build_usage_mapr!   "   s    DxxHH&&(335DJJt$ uuV}%veeFm)r)A+22155<3F3G * 6 K  s   C''	C32C3pathr   returnc                     |j                  t        |             xs g }|syt        t        |            }ddj	                  |d d       z   t        |      dkD  rdz   S dz   S )Nu\   ❌ 이번 실험의 어떤 생성 호출에도 참조로 사용되지 않음(보유 자산)u   ✅ 사용된 호출: ,    u    … )r   r   sortedsetjoinlen)r"   r   tagsuniqs       r   
usage_noter.   2   s`    88CI$"Dm#d)D#diiRa&99s4yST}V]]Z\]]    step_norolec                    | j                         sy| j                  t              }|j                  t	        |             xs i }g }|j                  d      r|j                  |d           |j                  d      r|j                  |d    d       d}	|j                  d      r|j                  d      xs g }
|j                  d      xs g D cg c]  }t        |      j                   }}|
r:t        |
      t        |      k(  r#dj                  d	 t        |
|      D              }ndj                  |      }d
t        j                  |d         z   dz   |rdt        j                  |       dndz   dz   }	|rdt        j                  |       dnd}dt        j                  |       dt        j                  |       dt        j                  dj                  |             d| d| d| d| |	 dS c c}w )uJ   이미지 셀 — 단계번호+역할 라벨 + 프롬프트/참조 접기.r'   enginedur_ssr   
ref_labelsr   
c              3   2   K   | ]  \  }}d | d|   yw)[u   ]
  → N ).0lns      r   	<genexpr>zcell.<locals>.<genexpr>J   s$     T=STQq9QC0=Ss   uC   <details><summary>prompt/refs (실제 호출 기록)</summary><pre>z</pre>u:   <div class='refs'>참조 이미지(역할 라벨 포함):
</div>z
</details>z<div class='note'>z*<div class='cell'><div class='steplbl'><b>z</b> z <span class='meta'>u    · z</span></div><a href='z' target='_blank'><img src='z	' width='z'></a>)r	   relative_toEXPr   r   r   r   namer+   r*   ziphtmlescape)r"   r0   r1   r   wnoterelr   metadetlabelsr    	ref_namesr   nts                  r   cellrN   :   s   ;;=


3
C

3t9#ADuuXq{m%uuW~qzl!$%
CuuX|$*,-EE&M,?R,?A,?aT!W\\,?	Ac&kS^399TS=STTD99Y'DTQx[)*,45  PPTP[P[\`PaObbhi!# 	
 <@dkk$/0	7RB8W9M8Ne{{4 !!5dkk&++dBS6T5U Vu8YqcPRtTWSXX^` a Bs   G=titlec                     |j                         sydt        j                  |        dt        j                  |j                               z   dz   S )Nr'   <details class='json'><summary></summary><pre></pre></details>)r	   rD   rE   r
   )rO   r"   s     r   json_detailsrT   X   sK    ;;=-dkk%.@-AQkk$..*+,.@A Br/   cellsc                     |D cg c]  }|s|	 }}|sydt        j                  |        ddj                  |       dS c c}w )Nr'   z<div class='rowtitle'>z</div><div class='row'>r?   )rD   rE   r*   )rO   rU   cs      r   rowrX   _   sS    #1QE#$T[[%7$8 9  "/v7 8 $s
   AAsrcdstc                     | r\t        |       j                         rC|j                         s3|j                  j                  dd       t	        j
                  | |       |S )NT)parentsexist_ok)r   r	   parentmkdirshutilcopyfile)rY   rZ   s     r   	copy_intorb   g   sF    
tCy!#**,

5S!Jr/   c           
      <   |d   |    }t         dz  dz  | z  }g }	 t        j                  |d   |d         }t	        |d d       D ]C  \  }}t        t        |      |d| dz        }	|j                  t        |	d	d
| |d             E |S # t        $ r g }Y cw xY w)Nshotsr   baselinescene_index
shot_index   prod_.pngu   비교u   production 최종 스틸 #J  rF   )	rA   r   query_production_stillsr   	enumeraterb   r   r   rN   )
skreconr   r5   dst_dircells_pathsiprZ   s
             r   baseline_cellsrv   n   s    grAEkJ&+GF))!M*:AlOL %)$1QU1#T?!:;d3,Fqc*JFVYZ[ % M  s   B BBc                    |d   |    }t         j                  dz  | z  }|j                  d      xs i }d|  ddj                  |d          d|j                  d	       d
dj                  |j                  d      xs dg       dt	        j
                  t        |j                  d                   dg}|j                  t        dt        |dz  dd|      t        |dz  dd|      t        |dz  dd|      t        |dz  dd|      t        |dz  dd |      g             |j                  t        d!t        |d"z  d#d$|      g             |j                  t        d%t        |d&z  d'd(|      t        |d)z  d*d+|      g             |j                  t        d,t        |d-z  d.d/|      t        |d0z  d1d+|      t        |d2z  d3d4|      t        |d5z  d6d7|      g             t         j                  d8|  d9z  }|j                  t        |  d:|             t        | ||      }|r|j                  t        d;|             d<j                  |      S )=Nrd   indoorstaging<h3> <small>loc=,loc_ids    · framing=framing_scale    · 인물=r%   
characters   없음</small></h3><p class='desc'>description</p>u    생성 순서 ① control/임시z	fpvar.png   ①u0   fp변형 (카메라 콘+인물 서클) [CONTROL]temp.png   ②u'   임시샷 β (ENV=탑레이어+CONTROL)ztemp_bg.pngu   ②'u   임시배경 α (실험변수)ztemp_alpha.pngu   ②''u   임시샷 α (ENV=임시배경)contour.png   ③u   윤곽 (temp→라인아트)u(   경로 A — 직행 (temp 없이 최종)final_A.pngAu    최종샷 (ENV+CONTROL+passport)uI   경로 B — 임시샷→VLM 구도 텍스트→배경 재생성→최종bg_B.pngB1u"   재생성 배경 (VLM comp 기반)final_B.pngB2	   최종샷u?   경로 C — 임시샷→i2i 윤곽→배경 재생성→최종bg_C.pngC1u    재생성 배경 (윤곽 기반)final_C.pngC2
bg_C_m.pngm1   재생성 배경+마네킹final_C_m.pngm2   최종샷 (마네킹 경유)comp_.jsonu)    VLM 구도 분석 JSON (경로 B 입력)   production 비교r7   r   OUTr   r*   rD   rE   r   r   rX   rN   PLANSrT   rv   )	ro   rp   r   r5   dstr   compbls	            r   indoor_shot_blockr   |   s~   grA	2A	
y		RB"\#((1Y<"8!9ff_%&k$))AEE,<O<]T\S]2^1_*4;;s155;O7P+Q*RRVX YC JJs5Q_e%WY_`Q^U$MvVQ(H&QQ!!7,MvVQ'EvN8   JJs=Q%GP@   JJs^Q^T#GPQk6:a   JJsTQ^T#EvNQk6:Qt%A6JQ $(FO	W   77uRD&&DJJ|rd"KLdST	E6	*B	

3*B/099S>r/   c                    |d   |    }t         j                  |z  | z  }|j                  d      xs i }d|  ddj                  |d          d|j                  d       d	d
j                  |j                  d      xs dg       dt	        j
                  t        |j                  d                   dg}|j                  t        dt        |dz  dd|      t        |dz  dd|      t        |dz  dd|      t        |dz  dd|      t        |dz  dd|      t        |d z  d!d"|      g             |j                  t        d#t        |d$z  d%d&|      g             |j                  t        d't        |d(z  d)d*|      t        |d+z  d,d-|      t        |d.z  d/d0|      t        |d1z  d2d3|      g             |j                  t        d4t        |d5z  d6d*|      t        |d7z  d8d-|      t        |d9z  d:d;|      t        |d<z  d=d>|      g             t         j                  d?|  | d@z  }	|j                  t        |  | dA|	             t        | ||      }
|
r|j                  t        dB|
             dCj                  |      S )DNrd   ry   rz   r{   r|   r}   r~   r   r   r%   r   r   r   r   r   u&   생성 순서 ① control/plate/임시zroot_marked.pngr   u5   뿌리 마킹 (카메라 콘+인물 서클) [CONTROL]
sketch.pngu   ①'u!   camview 라인아트 (sketch-hop)	plate.pngr   u   빈 배경 plate [ENV]r   r   u	   임시샷ztemp_v31.pngu   ③'u   임시샷 v3.1 (CONTROL=sketch)r   u   ④u   윤곽u   경로 A — 직행r   r   u"   최종샷 (plate+CONTROL+passport)u!   경로 B — VLM 구도 텍스트r   r   u   재생성 배경r   r   r   zbg_B_v31.pngzB1'u   재생성 배경 v3.1zfinal_B_v31.pngzB2'u   최종샷 v3.1u   경로 C — i2i 윤곽r   r   r   r   r   r   r   r   r   r   r   r   u    VLM 구도 분석 JSONr   r7   r   )ro   rp   r   lanetagvr5   r   r   r   r   r   s              r   outdoor_shot_blockr      s   grA	rA	
y		RB"\#((1Y<"8!9ff_%&k$))AEE,<O<]T\S]2^1_*4;;s155;O7P+Q*RRVX YC JJs;Q""E+bdjkQv'JFSQ_e%=vFQ^UK8Q)JFSQx8>   JJs(Q%I6R+   JJs6Q^T#5v>Qk6:Q(?HQ""E+;VD	9   JJs,Q^T#5v>Qk6:Qt%A6JQ $(FO	/   77uRDe,,DJJ|rd4&(?@$GH	E6	*B	

3*B/099S>r/   a  <meta charset='utf-8'><title>forest_exp gallery</title><style>
body{font-family:sans-serif;background:#171717;color:#eee;margin:20px;max-width:1780px}
.row{display:flex;flex-wrap:wrap;gap:10px;margin:4px 0 14px}
.cell{background:#222;padding:8px;border-radius:8px;max-width:430px}
.cell img{border-radius:4px;max-width:100%}
.steplbl{font-size:13px;margin-bottom:4px;color:#fd9}
.meta{color:#8ac;font-size:11px}.note{color:#f88;font-size:12px}
.desc{color:#bbb;max-width:1200px;font-size:13px}
.rowtitle{color:#fc6;font-weight:bold;margin-top:12px;font-size:14px}
details pre{white-space:pre-wrap;font-size:11px;color:#9c9;max-height:300px;overflow:auto;background:#1b1b1b;padding:6px}
details.json pre{color:#9ac}
.refs{font-size:10px;color:#789;white-space:pre-wrap}
h2{border-bottom:2px solid #555;padding-bottom:4px;margin-top:40px;background:#20242c;padding:8px}
h3{margin-top:22px;color:#dfd}
.verdict{background:#26301f;border-left:4px solid #8c4;padding:8px 12px;margin:8px 0;font-size:13px;max-width:1200px}
.warn{background:#33261f;border-left:4px solid #c84}
.guide{background:#1e2430;padding:12px 16px;border-radius:8px;font-size:13px;max-width:1200px;line-height:1.6}
</style>c                     t        j                         } t               }t        j                  d      }t        d| d    dg}|j                  d       t               }|j                  d       |j                  d       g }t        | j                  d      xs i j                               D ]  \  }}|D ]  }|j                  t        |d	               s!t        |d	         }	t        |	t         j                  d
z  |	j                  z        }
|j                  t        |
d| d|d    |dt!        |d	   |                     | j                  d      ry|j                  t        | d               r\t        t        | d         t         j                  dz  dz        }
|j                  t        |
dd|dt!        | d   |      dz                |j                  t#        d|             g }t        | j                  d      xs i j                               D ]  \  }}|j                  t        |            xs g }|s't        t        |      t         j                  d
z  d| dz        }
|j                  t        |
dd| |dt!        ||                    |r|j                  t#        d|             |j                  d       |j                  d       |j                  t#        dt        t         j                  dz  dz  d d!|d"#      t        t         j                  dz  d$z  d%d&|d"#      t        t         j                  dz  d'z  d(d)|d"#      g             |j                  t%        d*t         j&                  d+z               d,D ]6  }|j                  t%        d-| d.t         j&                  d/| d0z               8 t         j                  d1z  d2z  j)                         r|j                  d3       |j                  d4       |j                  t#        d5t        t         j                  d1z  d2z  d6d7|d8#      g             |j                  t%        d9t         j&                  d:z               |j                  t%        d;t         j&                  d<z               t         j                  d=z  }|j)                         rt        d> |j+                         D              D ]  }| d?   j                  |      xs i }|j                  d@| dAdBj-                  |j                  dC      xs g        dDt/        j0                  t        |j                  dE                   dF       |j                  t#        dGt        ||z  dHz  dIdJ|      t        ||z  dKz  dLdM|      g              |j                  dN       |j                  dO       t         j                  dPz  dQz  }|j                  t#        dRt        |dSz  dTdU|      t        |dVz  dWdX|      t        |dYz  dZd[|      g             |j                  t%        d\t         j&                  d]z               |j                  d^       |j                  d_       |j                  dP      xs g D ]  }|j                  t3        || |               |j                  d`       |j                  da       dbD ]  \  }}|j                  dc      xs g D cg c])  }t         j                  |z  |z  j)                         s(|+ }}|sP|j                  dd|de   j5                         r|de   ndf dg| dh       |D ]/  }|j                  t7        || |||dik(  rdjn|dkk(  rdlndmn             1  t         j                  doz  j)                         rd|j                  dp       t        dq t         j                  doz  j+                         D              D ]  }|j                  t7        || |do             ! |j                  dr       |j                  ds       	 dtd l}dtd l}du|j<                  fdv|j>                  fdwdxfD ]C  \  }}|j                  dyt/        j0                  |       dzt/        j0                  |       d{       E 	 g }t         jB                  j)                         r,t         jB                  jE                         jG                         ng D ]P  }	 tI        jJ                  |      } | j                  d~      dk(  s.| j                  d      s@|j                  |        R |D ]  } |j                  dt/        j0                  | j                  ddm             dt/        j0                  | j                  ddm             dt/        j0                  | d         z   dz   t/        j0                  | j                  d      xs dm      z   d{z           tL        dz  jO                  dj-                  |             tQ        dtL        dz          y c c}w # t@        $ r<}|j                  d|t/        j0                  t        |             d}       Y d }~d }~ww xY w# t@        $ r Y w xY w)Nsubsetu   <h1>forest_exp — 'group_idu$   ' 총괄 파이프라인 실험</h1>u  <div class='guide'><b>읽는 법</b> — 흐름: 0.입력(fp/배치도) → 1.뿌리(조감 스케치) →
2.실내 탑레이어 → 3.실내 샷별 체인 → 4.실외 샷별 체인(v1→v2→v3 버전순).<br>
각 샷 블록은 <b>생성 순서(①②③…)</b> 행 다음에 <b>경로별 결과(A=직행 / B=VLM구도 / C=i2i윤곽 / m=마네킹)</b> 행.
모든 셀 하단 <i>prompt/refs</i> 를 펼치면 실제 사용 프롬프트와 참조 이미지가 나옵니다.
실외 버전: <b>v1</b>=계약 없음(실패 증거) → <b>v2</b>=인원/시점/마커 계약 3줄 → <b>v3</b>=sketch-hop(라인아트 경유) → <b>v3.1</b>=CONTROL을 스케치로 교체.</div>uL   <h2>0. 입력 데이터 — 실제 생성에 참조로 사용된 것만</h2>u   <div class='guide'>각 셀 주석 = runlog 기준 그 이미지를 <b>실제 소비한 생성 호출 목록</b>. 사용되지 않은 보유 자산은 표시하지 않음.</div>	fp_by_locpng_pathinputsu   입력u    floor plan — fp_idrk   )rF   rG   baseline_aerialrootzbaseline_aerial.pngu1   production 통합 배치도 (root_B의 베이스)uK    · ⚠ fp_l03 과 배치 불일치+실내 노출(3라운드 진단 원인)u"   floor plans + production 배치도	passports	passport_rj   z	passport    uE   캐릭터 passport (최종샷 IDENTITY 참조로 실사용된 것만)uX   <h2>1. 뿌리 — 통합 조감 스케치 (전 샷 포괄, 원기호+영어 범례)</h2>u  <div class='verdict'>판정: 기호/범례 렌더는 A·B 모두 신뢰(오탈자 0, readback 10/10). 그러나 <b>기하가 문제</b> — root_A 는 자체 발명, root_B 는 production 배치도의 틀린 배치(fp_l03 대비 방 축소·계단/물탱크 위치 오류)를 상속 → 실외 하류 전체가 '오두막' 으로 붕괴. 3라운드: fp_l03 을 기하 SOT 로 앵커한 root_C 검증.</div>u   root 변형z
root_A.pngzR-Au+   순수 T2I (기하 자체발명 — 결격)i  rl   z
root_B.pngzR-Bu<   배치도 I2I (1-2라운드 뿌리 — 틀린 기하 상속)z
root_C.pngzR-Cu!   fp_l03 기하 앵커 (3라운드)u/   R1 요소 선정 JSON (뿌리 텍스트 계약)zroot_plan.json)r   BCroot_z VLM readbackroot_readback_r   root_v2zroot_v2.pnguX   <h2>1.5 뿌리 v2 — 건물 전체 통합 도면 (4라운드, 사용자 재정의)</h2>uD  <div class='verdict'>사용자 의도 반영: 옥탑방 레벨만이 아니라 <b>건물 전체</b> — 지상 출입구/마당(인물 도착 지점), 외부 계단, 옥상 레벨 — 를 한 장 top-down 으로. 기하 앵커 = 그룹 실외 fp 전부(옥상+마당+계단, 이전 미사용이던 fp_l10 2장 포함).</div>zroot v2zR-v2u3   건물 전체 통합 도면 (실외 fp 3장 앵커)i0  u   R1v2 요소 선정 JSONzroot_plan_v2.jsonzroot_v2 VLM readbackzroot_readback_v2.json	outdoor_dc              3   V   K   | ]!  }|j                         s|j                   # y wNis_dirrB   r;   ru   s     r   r>   zmain.<locals>.<genexpr>#  s     Loaffos   ))rd   u&   <h3>실외샷 (무마킹·무인) — r{   r|   r}   r   r   r   u!   root v2 → camview → 빈 plater   r   u7   camview 라인아트 (마킹 없음, staging 텍스트)r   r   u$   빈 배경 plate (무인·무마커)u=   <h2>2. 실내 탑레이어 배경 (zone/material master)</h2>u   <div class='verdict'>판정: 재질/무드 연속(체이닝 성공) but TL2 가 TL1 구도까지 복사(구도 수렴) — 침실 마스터 부재. 하류는 fpvar 가 카메라 SOT 를 쥐고 있어 버텨냄.</div>rx   
top_layersu   탑레이어 (생성 순서)zTL1_bedroom_bathroom.pngTL1u+   1번째 마스터 (fp 첨부=LLM 판단 ON)zTL1_bedroom_bathroom_fpOFF.pngzTL1'u   강제 fp OFF 비교쌍zTL2_living_kitchen_entry.pngTL2u!   2번째 마스터 (TL1 체이닝)uN   I0 실내 계획 JSON (배경 리스팅→탑레이어 병합/순서/fp판단)zindoor_plan.jsonu    <h2>3. 실내 샷별 체인</h2>u   <div class='verdict'>판정: 전 경로 성립 — fp 기하 정합, 정체성 교차샷 일관, 마커/마네킹 누출 0.</div>uA   <h2>4. 실외 샷별 체인 — 버전순 (v1 → v2 → v3)</h2>u  <div class='verdict warn'>판정: v1=실패 증거(항공 고착+군중+지붕 소실). v2=계약 3줄로 군중/topology 해소. v3=sketch-hop 으로 plate 눈높이 성공, 단 임시샷(nb2) 경유 시 시점 재상승(2회 재현) → <b>wide 무인물 establishing 정답 = sketch-hop + 직행(임시샷 생략)</b>. 그리고 모든 버전이 뿌리(root_B)의 틀린 기하(작은 오두막)를 물려받음 — 근본 해결은 root_C 몫.</div>))outdooru+   v1 — 계약 없음 (실패 증거 보존))
outdoor_v2u'   v2 — 인원/시점/마커 계약 3줄)
outdoor_v3u5   v3 — sketch-hop-before-plate (+v3.1 CONTROL=sketch)r   z<h2 style='font-size:17px'>4.1u    실외 z</h2>r   _v3r   _v2r'   )r   	outdoor_cuy   <h2 style='font-size:17px'>4.4 실외 root_C 체인 재검증 (fp 앵커 뿌리 → 마킹 → sketch-hop → plate)</h2>c              3   T   K   | ]   }|j                         r|j                   " y wr   r   r   s     r   r>   zmain.<locals>.<genexpr>V  s%      ()HAHHJ )Hs   &(uB   <h2>부록 — LLM 단계 프롬프트 (실제 사용 원문)</h2>u~  <div class='guide'>이미지 셀의 prompt/refs 는 전부 호출 시점 runlog 기록. LLM(텍스트) 단계의 system 프롬프트는 아래 코드 상수가 그대로 사용되었고, user 프롬프트는 §0-§1 의 데이터(멤버/샷 원문 전체+계획 JSON)를 자르지 않고 조립한 것(조립 규칙 포함). 이후 호출부터는 runlog 에 원문도 기록.</div>r   u2   R1 요소 선정 system prompt (s1_root.R1_SYSTEM)u4   I0 실내 계획 system prompt (s2_indoor.I0_SYSTEM))u:   VLM 구도 분석 지시문 (forest_chain.vlm_composition)a8  Analyse this film still's composition precisely. Describe the camera, horizon/depth, major visible surfaces, each subject's screen position / depth / pose / support contact, occlusion order, and what an EMPTY background plate (no people) must contain so the people could be re-inserted with the same composition.)u*   root readback 지시문 (s1_root.readback)zThis is a top-down site sketch with circled capital letters and a legend panel. List every circled capital letter you can find, list the legend entries as written, and say whether any interior room layout is exposed.rQ   rR   rS   u5   <div class='note'>프롬프트 상수 로드 실패: r?   r   llmsystem_promptu5   <details class='json'><summary>llm 호출 기록 — stepz (modelz)</summary><pre>SYSTEM:
z

USER:
user_promptzgallery.htmlr7   zgallery -> ))r   
load_reconr   	load_planCSSr   r!   r(   r   itemsr   r   rb   r   rB   rN   r.   rX   rT   r   r	   iterdirr*   rD   rE   r   isdigitr   s1_root	s2_indoor	R1_SYSTEM	I0_SYSTEMr   r   r
   r   r   r   rA   
write_textprint)!rp   r   r   Pr   fp_cellslocfpsfprY   rZ   pp_cellssidppathr,   vd_dirskdsdtlro   r   subkkeys_s1_s2rO   txtexc
llm_loggedr   r   s!                                    r   mainr      s	   LLNE]F[["F	$U:%6$77[\]A HH L M DHH[\HH O PHEIIk28b??ABSB88C:/0r*~&CC!1CHH!<=COODh3%7G7}0U!'3Z:PT5UW X  C yy"#U;L5M1N(OU#456I^8^_S(,_agkn",U3D-Et"Ll#mn 	o HHS5x@AHeii4:AACD
UxxE
#)rUQUUX%5)C58M%MNS(iu,=v",UD"9; 	< E 	\^fgh HHghHH T U HHSQUUV^l*E3`bhlopQUUV^l*E3qsy  ~A  	BQUUV^l*E3VX^bef!  
 HH\KQWWWgMghi	aS6NSTRUUZB[8[\]  	
	M)113	kl	 C 	D 	
Y"]2FFRUW!
  	 	
7CV9VWX	4agg@W6WXY#<<>LemmoLL7^'',2A# G''*xxy0A0GR'H&I J,,0KKBFF=<Q8R,S+TTXZ [ @|3U<uw}~{2E;acijC   M HHLMHH q r	
	L	(BHHS/R,,e5bdjkR22F<UW]^R00%9\^de2  
 HH\j''$668 9 HH/0HH  Q  Rjj"(b(	"2uf56 ) HHPQHH S T_	c #JJy17R7X7aQUUT\A=M<U<U<W7X	0T"X=M=M=ObUX0YYabeaffklmBHH'E647;|7Ke8<8LuRTX Y _ 	
##%	 O 	P (!%%+*=)F)F)H ( (BHH'E6;GH(
 HHQRHH n ohA3==QCS]]S8$
JE3 HH6t{{57I6J K![[-..>@ A
( J56XX__5F""$//1BN	

4 A 55=E!aeeO&<a  O 	HUVUZUZ[abdUeIfHgdkk!%%"3455NP;;q1235BC ;;quu]39r:; >PP 	Q  	>%%diil3	Kn,-
./{ YV  h	HUXY\U]I^H__efggh  		s7   6)h/ h/7A,h4 6i<4	i9=1i44i9<	j	j	__main__)i  r'   )r'   )__doc__rD   r   r`   syspathlibr   r"   insertr   __file__r^   
forest_libr   rA   r   r!   dictr.   rN   rT   listrX   rb   rv   r   r   r   r   __name__r:   r/   r   <module>r     s      
  3tH~,,- . ee" ^S ^ ^ ^at ac a a<B B4 B8s 84 8C 84 d t  F#L(m0` zF r/   