
    pi2                         d Z ddlZddlmc mZ ddlZddlZej                  j                  dd       ddlZd Zd Zd Zd Zd Zd	 Zd
 Zd Zd Zd Zd Zd Zd Zd Zd Zd Zd Zd Zd Zy)uZ   
통합 테스트: scripts/g3_independent_verifier.py
task-1837_5.1 - 닌기르수 작성
    Nz/home/jay/workspace/scriptsc                 r   |j                  t        dt        |              | dz  dz  }|j                  dd       d}|dz  j	                  |d	       t        j
                  d
      }||k(  }|st        j                  d|fd||f      dt        j                         v st        j                  |      rt        j                  |      nddt        j                         v st        j                  |      rt        j                  |      nddz  }dd|iz  }t        t        j                  |            d}y)u?   보고서 파일이 존재하면 내용을 반환해야 한다.WORKSPACE_ROOTmemoryreportsTparentsexist_oku&   # 테스트 보고서
내용입니다.ztask-load-test.mdutf-8encodingztask-load-test==z%(py0)s == %(py2)sresultexpectedpy0py2assert %(py4)spy4Nsetattrg3vstrmkdir
write_textload_report
@pytest_ar_call_reprcompare@py_builtinslocals_should_repr_global_name	_safereprAssertionError_format_explanation)tmp_pathmonkeypatchreports_dirr   r   @py_assert1@py_format3@py_format5s           9/home/jay/workspace/tests/integration/test_g3_verifier.py,test_load_report_returns_content_when_existsr-      s    -s8}=X%	1KdT28H&&228g2N__-.FX6X66XX    c                    |j                  t        dt        |              | dz  dz  }|j                  dd       t        j                  d      }d}||u }|st        j                  d|fd	||f      d
t        j                         v st        j                  |      rt        j                  |      nd
t        j                  |      dz  }dd|iz  }t        t        j                  |            dx}}y)u:   보고서 파일이 없으면 None을 반환해야 한다.r   r   r   Tr   ztask-nonexistentNis)z%(py0)s is %(py3)sr   r   py3assert %(py5)spy5)r   r   r   r   r   r   r   r    r!   r"   r#   r$   r%   )r&   r'   r(   r   @py_assert2r)   @py_format4@py_format6s           r,   *test_load_report_returns_none_when_missingr9      s    -s8}=X%	1KdT2__/0F6T>6T66Tr.   c                 r   |j                  t        dt        |              | dz  dz  }|j                  dd       d}|dz  j	                  |d	       t        j
                  d
      }||k(  }|st        j                  d|fd||f      dt        j                         v st        j                  |      rt        j                  |      nddt        j                         v st        j                  |      rt        j                  |      nddz  }dd|iz  }t        t        j                  |            d}y)u5   UTF-8 한글 내용을 정확히 반환해야 한다.r   r   r   Tr   uT   ## 수정 파일별 검증 상태

| 파일 | 변경 내용 | grep 검증 | 상태 |ztask-korean.mdr
   r   ztask-koreanr   r   r   koreanr   r   r   Nr   )r&   r'   r(   r;   r   r)   r*   r+   s           r,   test_load_report_utf8_koreanr<   %   s    -s8}=X%	1KdT2eF##///I__]+FV6V66VVr.   c                  p   d} t        j                  |       }t        |      }d}||k(  }|st        j                  d|fd||f      dt        j                         v st        j                  t              rt        j                  t              nddt        j                         v st        j                  |      rt        j                  |      ndt        j                  |      t        j                  |      dz  }dd	|iz  }t        t        j                  |            d
x}x}}|d   d   }d}||k(  }|slt        j                  d|fd||f      t        j                  |      t        j                  |      dz  }	dd|	iz  }t        t        j                  |            d
x}x}}|d   d   }d}||k(  }|slt        j                  d|fd||f      t        j                  |      t        j                  |      dz  }	dd|	iz  }t        t        j                  |            d
x}x}}|d   d   }d}||k(  }|slt        j                  d|fd||f      t        j                  |      t        j                  |      dz  }	dd|	iz  }t        t        j                  |            d
x}x}}|d   d   }d}||k(  }|slt        j                  d|fd||f      t        j                  |      t        j                  |      dz  }	dd|	iz  }t        t        j                  |            d
x}x}}|d   d   }d}||k(  }|slt        j                  d|fd||f      t        j                  |      t        j                  |      dz  }	dd|	iz  }t        t        j                  |            d
x}x}}y
)uZ   마크다운 테이블에서 file_path/keyword/status를 올바르게 추출해야 한다.u   ## 수정 파일별 검증 상태

| 파일 | 변경 내용 | grep 검증 | 상태 |
|------|-----------|-----------|------|
| scripts/foo.py | 함수 추가 | grep "def foo" OK | verified |
| utils/bar.py | 버그 수정 | grep "fix_bug" OK | verified |
   r   z0%(py3)s
{%(py3)s = %(py0)s(%(py1)s)
} == %(py6)slenentriesr   py1r3   py6assert %(py8)spy8Nr   	file_pathzscripts/foo.pyz%(py1)s == %(py4)srC   r   assert %(py6)srD   keywordzdef foostatusverified   zutils/bar.pyfix_bugr   parse_verification_tabler@   r   r   r    r!   r"   r#   r$   r%   
reportrA   r6   @py_assert5@py_assert4@py_format7@py_format9@py_assert0@py_assert3r+   s
             r,   .test_parse_verification_table_extracts_entriesrZ   3   sY   F **62Gw<1<1<133ww<11:k"6&66"&66666"&6666"666&666666661:i -I- I---- I--- ---I-------1:h-:-:----:------:-------1:k"4n4"n4444"n444"444n44444441:i -I- I---- I--- ---I-------r.   c                  ~   d} t        j                  |       }g }||k(  }|st        j                  d|fd||f      dt	        j
                         v st        j                  |      rt        j                  |      ndt        j                  |      dz  }dd|iz  }t        t        j                  |            dx}}y)	u]   '수정 파일별 검증 상태' 테이블이 없으면 빈 리스트를 반환해야 한다.u?   # 보고서
## 작업 완료
내용만 있고 테이블 없음.r   z%(py0)s == %(py3)srA   r2   r4   r5   N)
r   rQ   r   r   r    r!   r"   r#   r$   r%   )rS   rA   r6   r)   r7   r8   s         r,   4test_parse_verification_table_no_table_returns_emptyr]   E   so    PF**62G7b=7b77br.   c                  X   d} t        j                  |       }t        |      }d}||k(  }|st        j                  d|fd||f      dt        j                         v st        j                  t              rt        j                  t              nddt        j                         v st        j                  |      rt        j                  |      ndt        j                  |      t        j                  |      dz  }dd	|iz  }t        t        j                  |            d
x}x}}|d   d   }d}||k(  }|slt        j                  d|fd||f      t        j                  |      t        j                  |      dz  }	dd|	iz  }t        t        j                  |            d
x}x}}y
)uF   헤더 행과 구분선은 항목으로 파싱되지 않아야 한다.u   ## 수정 파일별 검증 상태

| 파일 | 변경 내용 | grep 검증 | 상태 |
|------|-----------|-----------|------|
| scripts/actual.py | 실제 변경 | grep "actual_func" OK | verified |
rN   r   r?   r@   rA   rB   rE   rF   Nr   rG   zscripts/actual.pyrH   rI   rJ   rD   rP   rR   s
             r,   8test_parse_verification_table_skips_header_and_separatorr_   L   s   F **62Gw<1<1<133ww<11:k"9&99"&99999"&9999"999&99999999r.   c                  V   d} t        j                  |       }t        |      }d}||k(  }|st        j                  d|fd||f      dt        j                         v st        j                  t              rt        j                  t              nddt        j                         v st        j                  |      rt        j                  |      ndt        j                  |      t        j                  |      dz  }dd	|iz  }t        t        j                  |            d
x}x}}|d   d   }d
}||u }|slt        j                  d|fd||f      t        j                  |      t        j                  |      dz  }	dd|	iz  }t        t        j                  |            d
x}x}}y
)uV   grep 검증 셀에 grep 키워드 형식이 없으면 keyword는 None이어야 한다.u   ## 수정 파일별 검증 상태

| 파일 | 변경 내용 | grep 검증 | 상태 |
|------|-----------|-----------|------|
| scripts/no_grep.py | 파일 생성 | N/A | verified |
rN   r   r?   r@   rA   rB   rE   rF   Nr   rK   r0   )z%(py1)s is %(py4)srI   rJ   rD   rP   rR   s
             r,   5test_parse_verification_table_no_keyword_when_no_grepra   Y   s    F **62Gw<1<1<133ww<11:i (D( D(((( D((( (((D(((((((r.   c                    |j                  t        dt        |              | dz  dz  }|j                  j	                  dd       |j                  dd       t        |      d	d
ddg}t        j                  |      \  }}d}||k(  }|st        j                  d|fd||f      dt        j                         v st        j                  |      rt        j                  |      ndt        j                  |      dz  }dd|iz  }	t        t        j                  |	            d
x}}g }||k(  }|st        j                  d|fd||f      dt        j                         v st        j                  |      rt        j                  |      ndt        j                  |      dz  }dd|iz  }	t        t        j                  |	            d
x}}y
)uO   모든 파일이 존재하면 status='PASS', missing=[]를 반환해야 한다.r   scriptszexisting.pyTr   zdef foo(): passr
   r   u	   테스트NrM   rG   descriptionrK   rL   PASSr   r\   rL   r2   r4   r5   missing)r   r   r   parentr   r   check_file_existencer   r   r    r!   r"   r#   r$   r%   )
r&   r'   existingrA   rL   rg   r6   r)   r7   r8   s
             r,   -test_check_file_existence_pass_when_all_existrk   h   s/   -s8}=)#m3HOO$6)G< ];SWcmnoG..w7OFG6V6V66V7b=7b77br.   c                    |j                  t        dt        |              dddddg}t        j                  |      \  }}d}||k(  }|st	        j
                  d|fd	||f      d
t        j                         v st	        j                  |      rt	        j                  |      nd
t	        j                  |      dz  }dd|iz  }t        t	        j                  |            dx}}d}	|	|v }|st	        j
                  d|fd|	|f      t	        j                  |	      dt        j                         v st	        j                  |      rt	        j                  |      nddz  }dd|iz  }t        t	        j                  |            dx}	}y)uR   파일이 없으면 status='FAIL', missing에 파일명이 포함되어야 한다.r   zscripts/missing_file.py   없는 파일NrM   rd   FAILr   r\   rL   r2   r4   r5   in)z%(py1)s in %(py3)srg   )rC   r3   )r   r   r   ri   r   r   r    r!   r"   r#   r$   r%   )
r&   r'   rA   rL   rg   r6   r)   r7   r8   rX   s
             r,   0test_check_file_existence_fail_when_file_missingrq   u   s    -s8}=6cgs}~G..w7OFG6V6V66V$/$////$///$////////////////r.   c                 <   |j                  t        dt        |              | dz  }|j                  dd       t        |      dddd	d
dddd	g}t        j                  |      \  }}d}||k(  }|st        j                  d|fd||f      dt        j                         v st        j                  |      rt        j                  |      ndt        j                  |      dz  }dd|iz  }	t        t        j                  |	            dx}}t        |      }d}
||
k(  }|st        j                  d|fd||
f      dt        j                         v st        j                  t              rt        j                  t              nddt        j                         v st        j                  |      rt        j                  |      ndt        j                  |      t        j                  |
      dz  }dd|iz  }t        t        j                  |            dx}x}}
d
}|d   }||v }|slt        j                  d|fd||f      t        j                  |      t        j                  |      dz  }dd|iz  }t        t        j                  |            dx}x}}y) uS   일부 파일이 있고 일부가 없을 때 missing 목록이 정확해야 한다.r   z	exists.pypassr
   r   u   있는 파일NrM   rd   zno_such_file.pyrm   rn   r   r\   rL   r2   r4   r5   rN   r?   r@   rg   rB   rE   rF   r   ro   )z%(py1)s in %(py4)srI   rJ   rD   )r   r   r   r   ri   r   r   r    r!   r"   r#   r$   r%   r@   )r&   r'   rj   rA   rL   rg   r6   r)   r7   r8   rT   rU   rV   rW   rX   rY   r+   s                    r,   test_check_file_existence_mixedrt   ~   s   -s8}=+%H1 (mOPT`jk'TXdnoG ..w7OFG6V6V66Vw<1<1<133ww<1*
*
****
******
*******r.   c                    |j                  t        dt        |              t        j                  d      }t        |      }d}||k(  }|st	        j
                  d|fd||f      dt        j                         v st	        j                  t              rt	        j                  t              nddt        j                         v st	        j                  |      rt	        j                  |      ndt	        j                  |      t	        j                  |      dz  }d	d
|iz  }t        t	        j                  |            dx}x}}d}t        |      }||v}|st	        j
                  d|fd||f      t	        j                  |      dt        j                         v st	        j                  t              rt	        j                  t              nddt        j                         v st	        j                  |      rt	        j                  |      ndt	        j                  |      dz  }d	d
|iz  }t        t	        j                  |            dx}x}}y)uZ   'path:123' 형식에서 라인번호를 제거하고 순수 경로를 반환해야 한다.r   z/absolute/path/file.py:42z/absolute/path/file.pyr   r?   r   r   rB   rE   rF   N42)not in)z4%(py1)s not in %(py6)s
{%(py6)s = %(py3)s(%(py4)s)
}rC   r3   r   rD   r   r   r   resolve_file_pathr   r   r    r!   r"   r#   r$   r%   )	r&   r'   r   r6   rT   rU   rV   rW   rX   s	            r,   )test_resolve_file_path_strips_line_numberr{      sF   -s8}=""#>?Fv;222;22222;222222232223222222v222v222;22222222222"s6{"4{""""4{"""4""""""s"""s""""""6"""6"""{"""""""r.   c           	         |j                  t        dt        |              t        j                  d      }|j                  } |       }|sddt        j                         v st        j                  |      rt        j                  |      ndt        j                  |      t        j                  |      dz  }t        t        j                  |            dx}}t        |       }t        |      }||v }|st        j                  d|fd||f      d	t        j                         v st        j                  t              rt        j                  t              nd	d
t        j                         v st        j                  |       rt        j                  |       nd
t        j                  |      d	t        j                         v st        j                  t              rt        j                  t              nd	dt        j                         v st        j                  |      rt        j                  |      ndt        j                  |      dz  }	dd|	iz  }
t        t        j                  |
            dx}x}}d}t        |      }||v }|st        j                  d|fd||f      t        j                  |      d	t        j                         v st        j                  t              rt        j                  t              nd	dt        j                         v st        j                  |      rt        j                  |      ndt        j                  |      dz  }dd|iz  }	t        t        j                  |	            dx}x}}y)uO   상대 경로는 WORKSPACE_ROOT 기준 절대 경로로 변환되어야 한다.r   zscripts/some_file.pyzFassert %(py4)s
{%(py4)s = %(py2)s
{%(py2)s = %(py0)s.is_absolute
}()
}r   )r   r   r   Nro   )zN%(py3)s
{%(py3)s = %(py0)s(%(py1)s)
} in %(py8)s
{%(py8)s = %(py5)s(%(py6)s)
}r   r&   )r   rC   r3   r5   rD   rF   zassert %(py10)spy10z0%(py1)s in %(py6)s
{%(py6)s = %(py3)s(%(py4)s)
}rx   rE   rF   )r   r   r   rz   is_absoluter    r!   r   r"   r#   r$   r%   r   )r&   r'   r   r)   rY   r+   r6   @py_assert7rU   rW   @py_format11rX   rT   rV   s                 r,   +test_resolve_file_path_relative_to_absoluter      s   -s8}=""#9:F66x='CK'=K''''=K''''''3'''3''''''x'''x'''=''''''C'''C''''''''''''K'''''''!0S[0![0000![000!000000S000S000000000000[0000000r.   c                    |j                  t        dt        |              d}t        j                  |      }t        |      }||k(  }|s#t	        j
                  d|fd||f      dt        j                         v st	        j                  t              rt	        j                  t              nddt        j                         v st	        j                  |      rt	        j                  |      ndt	        j                  |      dt        j                         v st	        j                  |      rt	        j                  |      nddz  }d	d
|iz  }t        t	        j                  |            dx}}y)u2   절대 경로는 그대로 반환되어야 한다.r   z#/home/jay/workspace/scripts/tool.pyr   )z0%(py3)s
{%(py3)s = %(py0)s(%(py1)s)
} == %(py5)sr   r   abs_path)r   rC   r3   r5   zassert %(py7)spy7Nry   )r&   r'   r   r   r6   rU   r8   @py_format8s           r,   )test_resolve_file_path_absolute_unchangedr      s    -s8}=4H""8,Fv;";("""";(""""""3"""3""""""v"""v""";""""""("""("""""""r.   c           	         |j                  t        dt        |              t        j                  d      }t        |      }|j                  }d} ||      }| }|sddt        j                         v st        j                  t              rt        j                  t              nddt        j                         v st        j                  |      rt        j                  |      ndt        j                  |      t        j                  |      t        j                  |      t        j                  |      dz  }t        t        j                  |            dx}x}x}x}}d	}	t        |      }
|	|
v }|st        j                  d
|fd|	|
f      t        j                  |	      dt        j                         v st        j                  t              rt        j                  t              nddt        j                         v st        j                  |      rt        j                  |      ndt        j                  |
      dz  }dd|iz  }t        t        j                  |            dx}	x}}
y)u]   path:숫자 형식만 라인번호로 인식, 중간 콜론은 제거하지 않아야 한다.r   zscripts/file.py:100z:100zlassert not %(py9)s
{%(py9)s = %(py5)s
{%(py5)s = %(py3)s
{%(py3)s = %(py0)s(%(py1)s)
}.endswith
}(%(py7)s)
}r   r   )r   rC   r3   r5   r   py9Nzfile.pyro   r~   rx   rE   rF   )r   r   r   rz   endswithr    r!   r   r"   r#   r$   r%   r   )r&   r'   r   r6   rU   @py_assert6@py_assert8@py_assert10r   rX   rT   rV   rW   s                r,   4test_resolve_file_path_colon_only_at_end_with_digitsr      se   -s8}=""#89F6{+{##+F+#F+++++++++++s+++s++++++6+++6+++{+++#+++F+++++++++++#F#9####9###9###############F###F##########r.   c                 6   ddl }|j                  t        dt        |              | dz  dz  }|j	                  dd       | dz  dz  j	                  dd       |j                  t
        d	g d
       |j                  t              5 }t        j                          ddd       j                  }|j                  }d}||k(  }|st        j                  d|fd||f      dt        j                         v st        j                  |      rt        j                   |      ndt        j                   |      t        j                   |      t        j                   |      dz  }	dd|	iz  }
t#        t        j$                  |
            dx}x}x}}y# 1 sw Y   xY w)u^   보고서가 없으면 main()은 exit 1을 발생시켜야 한다 (report not found → FAIL).r   Nr   r   r   Tr   eventsargv)g3v.py	--task-idztask-no-report-e2erN   r   zG%(py4)s
{%(py4)s = %(py2)s
{%(py2)s = %(py0)s.value
}.code
} == %(py7)sexc_infor   r   r   r   assert %(py9)sr   )pytestr   r   r   r   sysraises
SystemExitmainvaluecoder   r   r    r!   r"   r#   r$   r%   r&   r'   r   r(   r   r)   rY   r   rT   r   @py_format10s              r,    test_main_exits_0_when_no_reportr      s    -s8}=X%	1KdT28#**4$*GV%RS	z	" h
>>#>#!#!####!######8###8###>######!####### s   FFc                 0   ddl }|j                  t        dt        |              | dz  dz  }|j	                  dd       |dz  j                  d	d
       |j                  t        dg d       |j                  t              5 }t        j                          ddd       j                  }|j                  }d}||k(  }|st        j                  d|fd||f      dt        j                         v st        j                   |      rt        j"                  |      ndt        j"                  |      t        j"                  |      t        j"                  |      dz  }	dd|	iz  }
t%        t        j&                  |
            dx}x}x}}y# 1 sw Y   xY w)uj   보고서가 있지만 검증 테이블 없고 품질 기준 미달이면 FAIL → exit 1이어야 한다.r   Nr   r   r   Tr   ztask-skip-e2e.mdu   # 보고서
내용만 있음r
   r   r   )r   r   ztask-skip-e2erN   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r    r!   r"   r#   r$   r%   r   s              r,   2test_main_exits_1_when_report_no_table_low_qualityr      s   -s8}=X%	1KdT2%%112Q\c1dV%MN	z	" h
>>#>#!#!####!######8###8###>######!####### s   FFc                 4   ddl }|j                  t        dt        |              | dz  dz  }|j	                  dd       d}|d	z  j                  |d
       |j                  t        dg d       |j                  t              5 }t        j                          ddd       j                  }|j                  }d}||k(  }	|	st        j                  d|	fd||f      dt        j                         v st        j                   |      rt        j"                  |      ndt        j"                  |      t        j"                  |      t        j"                  |      dz  }
dd|
iz  }t%        t        j&                  |            dx}x}x}	}y# 1 sw Y   xY w)uj   보고서가 있고 검증 테이블 없지만 품질 기준 충족이면 SKIP → exit 0이어야 한다.r   Nr   r   r   Tr   u  # task-skip-quality 보고서

**S**: 상황 설명입니다. 기존 시스템에서 특정 기능이 필요했습니다. 여러 모듈 간의 의존성으로 인해 복잡한 구조를 갖고 있었습니다.
**C**: 복잡도가 높아서 추가 분석이 필요했습니다. 기존 코드의 문제점을 파악하고 개선 방향을 수립했습니다.
**Q**: 어떻게 해결할 것인가? 어떤 접근 방식이 가장 효율적인가?
**A**: 다음과 같이 해결했습니다. 코드를 수정하고 테스트를 추가하여 검증을 완료했습니다. 전체 테스트 통과 확인. 리팩터링을 통해 가독성과 유지보수성을 향상시켰습니다.
ztask-skip-quality.mdr
   r   r   )r   r   ztask-skip-qualityr   r   r   r   r   r   r   )r&   r'   r   r(   good_reportr   r)   rY   r   rT   r   r   s               r,   3test_main_exits_0_when_report_no_table_good_qualityr      s%   -s8}=X%	1KdT2K ))55kG5TV%QR	z	" h
>>#>#!#!####!######8###8###>######!####### s   FFc                    ddl }|j                  t        dt        |              | dz  dz  }|j	                  dd       | dz  }|j	                  dd       |d	z  }|j                  d
d       dt        |       d}|dz  j                  |d       |j                  t        dg d       |j                  t              5 }t        j                          ddd       j                  }|j                  }	d}
|	|
k(  }|st        j                  d|fd|	|
f      dt        j                         v st        j                   |      rt        j"                  |      ndt        j"                  |      t        j"                  |	      t        j"                  |
      dz  }dd|iz  }t%        t        j&                  |            dx}x}	x}}
y# 1 sw Y   xY w)u>   보고서 + 파일 모두 존재하면 exit 0이어야 한다.r   Nr   r   r   Tr   rc   zreal_file.pyzdef actual_func(): passr
   r      # 보고서

## 수정 파일별 검증 상태

| 파일 | 변경 내용 | grep 검증 | 상태 |
|------|-----------|-----------|------|
| u6    | 함수 추가 | grep "actual_func" OK | verified |
ztask-pass-e2e.mdr   )r   r   ztask-pass-e2er   r   r   r   r   r   r   )r&   r'   r   r(   scripts_dirtarget_filereport_contentr   r)   rY   r   rT   r   r   s                 r,   &test_main_exits_0_when_all_files_existr      sy   -s8}=X%	1KdT2 Y&KdT2.K4wG { N %%11.71SV%MN	z	" h
>>#>#!#!####!######8###8###>######!####### s   GGc                    ddl }|j                  t        dt        |              | dz  dz  }|j	                  dd       | dz  dz  j	                  dd       d	t        |        d
}|dz  j                  |d       |j                  t        dg d       |j                  t              5 }t        j                          ddd       j                  }|j                  }d}||k(  }	|	st        j                  d|	fd||f      dt        j                         v st        j                   |      rt        j"                  |      ndt        j"                  |      t        j"                  |      t        j"                  |      dz  }
dd|
iz  }t%        t        j&                  |            dx}x}x}	}y# 1 sw Y   xY w)uE   보고서는 있지만 파일이 누락되면 exit 1이어야 한다.r   Nr   r   r   Tr   r   r   uG   /scripts/missing_file.py | 함수 추가 | grep "func" OK | verified |
ztask-fail-e2e.mdr
   r   r   )r   r   ztask-fail-e2erN   r   r   r   r   r   r   r   )r&   r'   r   r(   r   r   r)   rY   r   rT   r   r   s               r,   #test_main_exits_1_when_file_missingr     sW   -s8}=X%	1KdT28#**4$*G x=/ N %%11.71SV%MN	z	" h
>>#>#!#!####!######8###8###>######!####### s   ,F44F=) __doc__builtinsr    _pytest.assertion.rewrite	assertionrewriter   jsonr   pathinsertg3_independent_verifierr   r-   r9   r<   rZ   r]   r_   ra   rk   rq   rt   r{   r   r   r   r   r   r   r   r    r.   r,   <module>r      s   
   
 0 1 %
		.$
:
)
0+$#1#$$$$,$:$r.   