§
    Î’Áj8  ã                  óà  — U d Z ddlm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	m
Z
 ddlmZmZmZmZ  eej        d¦  «        rej                             d¬¦  «          eej        d¦  «        rej                             d¬¦  «         ej                             ej                             ej                             e¦  «        d	¦  «        ¦  «        Zh d
£Zh d£ZdZdZdZdZdZ dZ!dZ"dZ#dZ$dZ%dZ&i Z'de(d<   e	 G d„ d¦  «        ¦   «         Z)e	 G d„ d¦  «        ¦   «         Z*e	 G d„ d¦  «        ¦   «         Z+d/d!„Z,d0d%„Z-d1d'„Z.d2d3d+„Z/d4d-„Z0e1d.k    r ej2         e0¦   «         ¦  «         dS dS )5aù  
FREEEXILE CODE & DOCUMENTATION HYGIENE AUDIT TOOL
Enforces strict file modularization, conciseness, and architectural hygiene standards:
- Code File Length: Soft Cap <= 350 lines, Hard Cap <= 500 lines.
- Doc File Length: Soft Cap <= 400 lines, Hard Cap <= 600 lines.
- Function/Method Length: AST check <= 50 lines.
- Proper use of common/, utils/, helpers/ modules.
- Zero lip-service automated quality gating.

Usage:
    python tools/lint/check_code_and_doc_hygiene.py [--strict] [--json-out <path>]
é    )ÚannotationsN)Ú	dataclassÚfield)ÚListÚDictÚTupleÚOptionalÚreconfigureúutf-8©Úencodingz../..>   ú.gitú.venvú.agentsú.antigravityú.pytest_cacheÚx64ÚvenvÚDebugÚbuildÚReleaseÚ
CMakeFilesÚ__pycache__Úbuild_ninjaÚnode_modules>   ú	bundle.jsúbundle.d.tsúpackage-lock.jsonú!GLOBAL_LOCALIZATION_DICTIONARY.mdi^  iô  i¼  iè  i�  iX  éÈ   é2   zDict[str, str]ÚPENDING_AUDIT_EXCLUSIONSc                  óB   — e Zd ZU ded<   ded<   ded<   ded<   ded<   dS )	ÚFileViolationÚstrÚ	file_pathÚintÚ
line_countÚcategoryÚseverityÚmessageN©Ú__name__Ú
__module__Ú__qualname__Ú__annotations__© ó    ú>C:\Projects\FreeExile\tools\lint\check_code_and_doc_hygiene.pyr$   r$   O   s=   € € € € € € à€N€N�NØ€O€O�OØ€M€M�MØ€M€M�MØ€L€L�L€L€Lr2   r$   c                  óB   — e Zd ZU ded<   ded<   ded<   ded<   ded<   dS )	ÚFunctionViolationr%   r&   Ú	func_namer'   r(   Ú
start_lineÚend_lineNr,   r1   r2   r3   r5   r5   X   s=   € € € € € € à€N€N�NØ€N€N�NØ€O€O�OØ€O€O�OØ€M€M�M€M€Mr2   r5   c                  óš   — e Zd ZU dZded<   dZded<   dZded<   dZded<    ee	¬¦  «        Z
ded	<    ee	¬¦  «        Zd
ed<   dZded<   dS )ÚHygieneAuditReportr   r'   Útotal_files_scannedÚtotal_code_filesÚtotal_doc_filesÚpassed_clean_files)Údefault_factoryzList[FileViolation]Úfile_violationsúList[FunctionViolation]Úfunction_violationsTÚboolÚis_compliantN)r-   r.   r/   r;   r0   r<   r=   r>   r   Úlistr@   rB   rD   r1   r2   r3   r:   r:   a   s§   € € € € € € à ÐÐ Ð Ð Ñ ØÐÐÐÐÑØ€OÐÐÐÑØÐÐÐÐÑØ+0¨5ÀÐ+FÑ+FÔ+F€OÐFÐFÐFÑFØ38°5ÈÐ3NÑ3NÔ3NÐÐNÐNÐNÑNØ€LÐÐÐÑÐÐr2   r:   Úpathr%   ÚfilenameÚreturnrC   c                ó  — |t           v rdS |                     d¦  «        s|                     d¦  «        rdS t          j                             | ¦  «                             t          j        ¦  «        }|D ]}|t          v r dS ŒdS )NTz_pb2.pyz_pb2.pyiF)ÚEXCLUDE_FILESÚendswithÚosrF   ÚnormpathÚsplitÚsepÚEXCLUDE_DIRS)rF   rG   ÚpartsÚparts       r3   Úis_excludedrS   l   s’   € Ø•=Ð Ð ØˆtØ×Ò˜Ñ#Ô#ð  x×'8Ò'8¸Ñ'DÔ'Dð ØˆtÝŒG×Ò˜TÑ"Ô"×(Ò(­¬Ñ0Ô0€EØð ð ˆØ•<ÐÐØ�4�4ð  àˆ5r2   r&   Úrel_pathúOptional[FileViolation]c                óf  — t           j                             | ¦  «        d                              ¦   «         }	 t	          | ddd¬¦  «        5 }|                     ¦   «         }t          |¦  «        }d d d ¦  «         n# 1 swxY w Y   n# t          $ r}Y d }~d S d }~ww xY w|dv rít           j                             | ¦  «                             ¦   «         }d|v pMd|v pId	|v pEd
|v pAd|v p=dt           j         	                    | ¦  «         
                    t           j        ¦  «        v }|rt          nt          }	|rt          nt          }
|rdnd}||	k    rt!          |||dd|› d|	› d�¬¦  «        S ||
k    rt!          |||dd|› d|
› d�¬¦  «        S �n |dv rßd}|t"          v s|                     dd¦  «        t"          v r`t"                               |¦  «        p-t"                               |                     dd¦  «        ¦  «        }t!          |||dd|› d�¬¦  «        S |t(          k    r t!          |||dd|› dt(          › d�¬¦  «        S |t*          k    r t!          |||dd|› dt*          › d �¬¦  «        S n½|d!k    rYd"}|t,          k    r t!          |||dd#|› dt,          › d$�¬¦  «        S |t.          k    r t!          |||dd%|› dt.          › d&�¬¦  «        S n^|d'k    rXd(}|t0          k    r t!          |||dd)|› dt0          › d*�¬¦  «        S |t2          k    r t!          |||dd+|› dt2          › d,�¬¦  «        S d S )-Né   Úrr   Úignore©r   Úerrors>   ú.csú.hú.jsú.pyú.tsú.cppú.hppÚ_catalogÚcatalog_Ú	_databaseÚ_tagsÚtags_ÚdataÚCATALOGÚCODEÚERRORu   VÆ°á»£t quÃ¡ Hard Cap (z > u8    dÃ²ng). Báº¯t buá»™c tÃ¡ch module, catalog hoáº·c DTOs!)r&   r(   r)   r*   r+   ÚWARNINGu   VÆ°á»£t quÃ¡ Soft Cap (u:    dÃ²ng). Khuyáº¿n nghá»‹ tá»‘i Æ°u hÃ³a hoáº·c chia nhá»�.>   ú.htmú.htmlÚWEB_HTMLú/ú\z[PENDING_AUDIT] u(    - Ä�ang chá»� refactor sang ES Modules.u:   Tá»‡p HTML nguyÃªn khá»‘i vÆ°á»£t tráº§n nghiÃªm trá»�ng (ug    dÃ²ng). Báº¯t buá»™c tam phÃ¢n láº­p mÃ£ nguá»“n thÃ nh Native ES Modules (tÃ¡ch riÃªng css/ vÃ  js/)!u   Tá»‡p HTML dÃ i (uD    dÃ²ng). Khuyáº¿n nghá»‹ tÃ¡ch CSS vÃ  JS ra cÃ¡c file Ä‘á»™c láº­p.z.cssÚWEB_CSSu   Tá»‡p CSS quÃ¡ dÃ i (ub    dÃ²ng). Báº¯t buá»™c tÃ¡ch thÃ nh cÃ¡c stylesheet theo domain (hud.css, shop.css, inventory.css)!u   Tá»‡p CSS dÃ i (u%    dÃ²ng). Khuyáº¿n nghá»‹ module hÃ³a.ú.mdÚDOCu   TÃ i liá»‡u quÃ¡ dÃ i (uQ    dÃ²ng). Cáº§n tÃ³m táº¯t khoa há»�c, sÃºc tÃ­ch hoáº·c chia file theo DiÃ¡taxis!u   TÃ i liá»‡u dÃ i (uA    dÃ²ng). Khuyáº¿n nghá»‹ cÃ´ Ä‘á»�ng báº£ng biá»ƒu vÃ  sÆ¡ Ä‘á»“.)rL   rF   ÚsplitextÚlowerÚopenÚ	readlinesÚlenÚ	ExceptionÚbasenamerM   rN   rO   ÚCATALOG_HARD_CAPÚCODE_HARD_CAPÚCATALOG_SOFT_CAPÚCODE_SOFT_CAPr$   r"   ÚreplaceÚgetÚHTML_HARD_CAPÚHTML_SOFT_CAPÚCSS_HARD_CAPÚCSS_SOFT_CAPÚDOC_HARD_CAPÚDOC_SOFT_CAP)r&   rT   ÚextÚfÚlinesr(   ÚeÚ	base_nameÚ
is_catalogÚhard_capÚsoft_capr)   Útickets                r3   Úaudit_file_lengthr‘   x   s:  € Ý
Œ'×
Ò
˜9Ñ
%Ô
% aÔ
(×
.Ò
.Ñ
0Ô
0€CðÝ�)˜S¨7¸8ÐDÑDÔDð 	$ÈØ—K’K‘M”MˆEÝ˜U™œˆJð	$ð 	$ð 	$ñ 	$ô 	$ð 	$ð 	$ð 	$ð 	$ð 	$ð 	$øøøð 	$ð 	$ð 	$ð 	$øøõ ð ð ð Øˆtˆtˆtˆtˆtøøøøðøøøð Ð@Ð@Ð@Ý”G×$Ò$ YÑ/Ô/×5Ò5Ñ7Ô7ˆ	à˜)Ð#ð CØ˜YÐ&ðCà˜iÐ'ðCð ˜)Ð#ðCð ˜)Ð#ð	Cð
 �œ×)Ò)¨)Ñ4Ô4×:Ò:½2¼6ÑBÔBÐBð 	ð (2ÐDÕ#Ð#µ}ˆØ'1ÐDÕ#Ð#µ}ˆØ *Ð6�9�9°ˆà˜Ò Ð Ý Ø"Ø%Ø!Ø ð D°*ð  Dð  DÀð  Dð  Dð  Dðñ ô ð ð ˜(Ò"Ð"Ý Ø"Ø%Ø!Ø"ð F°*ð  Fð  FÀð  Fð  Fð  Fðñ ô ð ñ #ð 
Ð!Ð	!Ð	!ØˆØÕ/Ð/Ð/°8×3CÒ3CÀCÈÑ3NÔ3NÕRjÐ3jÐ3jÝ-×1Ò1°(Ñ;Ô;ÐxÕ?W×?[Ò?[Ð\d×\lÒ\lÐmpÐrvÑ\wÔ\wÑ?xÔ?xˆFÝ Ø"Ø%Ø!Ø"Ø[¨6Ð[Ð[Ð[ðñ ô ð ð �Ò%Ð%Ý Ø"Ø%Ø!Ø ð [ÐU_ð  [ð  [Õdqð  [ð  [ð  [ðñ ô ð ð �-Ò'Ð'Ý Ø"Ø%Ø!Ø"ð O¨Jð  Oð  O½=ð  Oð  Oð  Oðñ ô ð ð (ð 
�ŠˆØˆØ�Ò$Ð$Ý Ø"Ø%Ø!Ø ð p°
ð  pð  p½|ð  pð  pð  pðñ ô ð ð �,Ò&Ð&Ý Ø"Ø%Ø!Ø"Øm¨:ÐmÐm½,ÐmÐmÐmðñ ô ð ð 'ð 
�ŠˆØˆØ�Ò$Ð$Ý Ø"Ø%Ø!Ø ð a°*ð  að  aÅð  að  að  aðñ ô ð ð �,Ò&Ð&Ý Ø"Ø%Ø!Ø"ð L¨Zð  Lð  L½Lð  Lð  Lð  Lðñ ô ð ð ˆ4s5   ¹B Á$A<Á0B Á<B Â B ÂB ÂB Â
BÂBrA   c           
     ó|  — g }|                       d¦  «        s|S 	 t          | ddd¬¦  «        5 }|                     ¦   «         }d d d ¦  «         n# 1 swxY w Y   t          j        || ¬¦  «        }n# t
          $ r |cY S w xY wt          j        |¦  «        D ]¤}t          |t          j        t          j	        f¦  «        r||j
                             d¦  «        rŒCt          |dd	¦  «        }t          |d
|¦  «        }||z
  dz   }	|	t          k    r,|                     t          ||j
        |	||¬¦  «        ¦  «         Œ¥|S )Nr_   rX   r   rY   rZ   )rG   Útest_Úlinenor   Ú
end_linenorW   )r&   r6   r(   r7   r8   )rK   rw   ÚreadÚastÚparserz   ÚwalkÚ
isinstanceÚFunctionDefÚAsyncFunctionDefÚnameÚ
startswithÚgetattrÚFUNCTION_HARD_CAPÚappendr5   )
r&   rT   Ú
violationsr‰   ÚcodeÚtreeÚnoder7   r8   Úlengths
             r3   Úaudit_python_functionsr§   å   s¬  € Ø*,€JØ×Ò˜eÑ$Ô$ð ØÐðÝ�)˜S¨7¸8ÐDÑDÔDð 	ÈØ—6’6‘8”8ˆDð	ð 	ð 	ñ 	ô 	ð 	ð 	ð 	ð 	ð 	ð 	øøøð 	ð 	ð 	ð 	åŒy˜¨	Ð2Ñ2Ô2ˆˆøÝð ð ð ØÐÐÐðøøøõ ”˜‘”ð ð ˆÝ�d�Sœ_­cÔ.BÐCÑDÔDð 	àŒy×#Ò# GÑ,Ô,ð ØÝ   x°Ñ3Ô3ˆJÝ˜t \°:Ñ>Ô>ˆHØ 
Ñ*¨QÑ.ˆFØÕ)Ò)Ð)Ø×!Ò!Ý%Ø"*Ø"&¤)Ø#)Ø#-Ø!)ðñ ô ñô ð øð Ðs4   ›A1 ®AÁA1 ÁAÁA1 ÁAÁA1 Á1B Á?B TÚroot_dirÚcheck_funcsc                ó  — t          ¦   «         }t          j        | ¦  «        D �]h\  }}}d„ |D ¦   «         |d d …<   |D �]L}t          j                             |¦  «        d                              ¦   «         }|dvrŒ?t          j                             ||¦  «        }t          j                             || ¦  «        }	t          ||¦  «        rŒ�|xj	        dz  c_	        |dv r|xj
        dz  c_
        n|dk    r|xj        dz  c_        t          ||	¦  «        }
|
r-|j                             |
¦  «         |
j        dk    rd|_        n|xj        dz  c_        |r0|dk    r*t%          ||	¦  «        }|j                             |¦  «         �ŒN�Œj|S )	Nc                ó$   — g | ]}|t           v¯|‘ŒS r1   )rP   )Ú.0Úds     r3   ú
<listcomp>z%run_hygiene_audit.<locals>.<listcomp>  s"   € ÐDÐDÐD˜Q¨aµ|Ð.CÐ.C�qÐ.CÐ.CÐ.Cr2   rW   >   r]   r^   rs   r_   r`   ra   rb   >   r]   r^   r_   r`   ra   rb   rs   rk   Fr_   )r:   rL   r™   rF   ru   rv   ÚjoinÚrelpathrS   r;   r<   r=   r‘   r@   r¡   r*   rD   r>   r§   rB   Úextend)r¨   r©   ÚreportÚdirpathÚdirnamesÚ	filenamesrG   rˆ   Ú	full_pathrT   ÚvÚf_violationss               r3   Úrun_hygiene_auditr¹     sÄ  € ÝÑ!Ô!€Få(*¬°Ñ(9Ô(9ð !@ñ !@Ñ$ˆ�˜9àDÐD (ÐDÑDÔDˆ���‰à!ð 	@ñ 	@ˆHÝ”'×"Ò" 8Ñ,Ô,¨QÔ/×5Ò5Ñ7Ô7ˆCØÐLÐLÐLØåœŸš W¨hÑ7Ô7ˆIÝ”w—’ y°(Ñ;Ô;ˆHå˜9 hÑ/Ô/ð ØàÐ&Ô&¨!Ñ+Ð&Ô&ØÐAÐAÐAØÐ'Ô'¨1Ñ,Ð'Ô'Ð'Ø˜’�ØÐ&Ô&¨!Ñ+Ð&Ô&õ " )¨XÑ6Ô6ˆAØð /ØÔ&×-Ò-¨aÑ0Ô0Ð0Ø”: Ò(Ð(Ø*/�FÔ'øàÐ)Ô)¨QÑ.Ð)Ô)ð ð @˜s eš|˜|Ý5°iÀÑJÔJ�ØÔ*×1Ò1°,Ñ?Ô?Ð?ùñ;	@ð> €Mr2   r'   c                 óê  — t          j        d¬¦  «        } |                      dt          t          d¬¦  «         |                      ddd¬	¦  «         |                      d
dd¬	¦  «         |                      dt          d d¬¦  «         |                      ¦   «         }t          d¦  «         t          d¦  «         t          d¦  «         t          d|j        › �¦  «         t          dt          › dt          › d�¦  «         t          dt          › dt          › d�¦  «         t          dt          › d�¦  «         t          d¦  «         t          |j        |j         ¬¦  «        }t          d|j        › �¦  «         t          d|j        › �¦  «         t          d|j        › �¦  «         t          d|j        › �¦  «         t          d¦  «         d„ |j        D ¦   «         }d„ |j        D ¦   «         }|rTt          dt)          |¦  «        › d�¦  «         |D ]1}t          d |j        › d!|j        › d"|j        › d#|j        › �¦  «         Œ2|rTt          d$t)          |¦  «        › d%�¦  «         |D ]1}t          d&|j        › d!|j        › d"|j        › d#|j        › �¦  «         Œ2|j        r¯t          d$t)          |j        ¦  «        › d't          › d(�¦  «         |j        d d)…         D ]2}t          d*|j        › d+|j        › d,|j        › d-|j        › d.�	¦  «         Œ3t)          |j        ¦  «        d)k    r(t          d/t)          |j        ¦  «        d)z
  › d0�¦  «         |j        r¾|j        |j        |j        |j        t)          |¦  «        t)          |¦  «        t)          |j        ¦  «        d1„ |D ¦   «         d2„ |D ¦   «         d3œ	}t=          |j        d4d5¬6¦  «        5 }t?          j         ||d7d8¬9¦  «         d d d ¦  «         n# 1 swxY w Y   t          d:|j        › �¦  «         t          d;¦  «         |j        r t          d<¦  «         t          d¦  «         d=S t          d>¦  «         t          d¦  «         |j!        rd?S d=S )@Nz.FreeExile Code & Documentation Hygiene Auditor)Údescriptionz--rootzRoot directory to scan)ÚtypeÚdefaultÚhelpz--strictÚ
store_truez$Exit with code 1 on ERROR violations)Úactionr¾   z--skip-funcszSkip function length checksz
--json-outzSave report to JSON filezP================================================================================zA       FREEEXILE CODE & DOCUMENTATION HYGIENE AUDIT GATE (2026.1)u   QuÃ©t thÆ° má»¥c gá»‘c: u   NgÆ°á»¡ng Code : Soft Cap <= u    dÃ²ng | Hard Cap <= u    dÃ²ngu   NgÆ°á»¡ng Docs : Soft Cap <= u   HÃ m Python  : Hard Cap <= zP--------------------------------------------------------------------------------)r©   u#   Tá»•ng sá»‘ file Ä‘Ã£ quÃ©t      : u    - File mÃ£ nguá»“n (code)   : u    - File tÃ i liá»‡u (docs)   : u%    - File Ä‘áº¡t chuáº©n sáº¡ch sáº½ : c                ó(   — g | ]}|j         d k    ¯|‘ŒS )rk   ©r*   ©r¬   r·   s     r3   r®   zmain.<locals>.<listcomp>I  s$   € ÐIÐIÐI�A°1´:ÀÒ3HÐ3HˆaÐ3HÐ3HÐ3Hr2   c                ó(   — g | ]}|j         d k    ¯|‘ŒS )rl   rÂ   rÃ   s     r3   r®   zmain.<locals>.<listcomp>J  s$   € ÐMÐMÐM�a°Q´ZÀ9Ò5LÐ5L�Ð5LÐ5LÐ5Lr2   u   
[!] PHÃ�T HIá»†N u!    FILE VI PHáº M HARD CAP (ERROR):u     â�Œ [z] z (u    dÃ²ng) -> u   
[*] Cáº¢NH BÃ�O u!    FILE VÆ¯á»¢T SOFT CAP (WARNING):u
     âš ï¸� [u    HÃ€M/METHOD DÃ€I HÆ N u    DÃ’NG:é
   u	     âš ï¸� ú:z - def z() (u    dÃ²ng)u     ... vÃ  cÃ²n u    hÃ m khÃ¡c.c                ó   — g | ]	}|j         ‘Œ
S r1   ©Ú__dict__rÃ   s     r3   r®   zmain.<locals>.<listcomp>f  s   € Ð2Ð2Ð2 a�q”zÐ2Ð2Ð2r2   c                ó   — g | ]	}|j         ‘Œ
S r1   rÈ   rÃ   s     r3   r®   zmain.<locals>.<listcomp>g  s   € Ð6Ð6Ð6¨˜œÐ6Ð6Ð6r2   )	r;   r<   r=   rD   Úerrors_countÚwarnings_countÚfunction_violations_countr[   ÚwarningsÚwr   r   é   F)ÚindentÚensure_asciiu!   
BÃ¡o cÃ¡o JSON Ä‘Ã£ lÆ°u táº¡i: zQ
================================================================================uU   âœ… Káº¾T QUáº¢: TOÃ€N Bá»˜ MÃƒ NGUá»’N VÃ€ TÃ€I LIá»†U TUÃ‚N THá»¦ HARD CAP HYGIENE!r   uR   â�Œ Káº¾T QUáº¢: PHÃ�T HIá»†N FILE VI PHáº M QUY CHUáº¨N Ä�á»˜ DÃ€I & MODULE HÃ“A!rW   )"ÚargparseÚArgumentParserÚadd_argumentr%   ÚPROJECT_ROOTÚ
parse_argsÚprintÚrootr   r}   r‡   r†   r    r¹   Ú
skip_funcsr;   r<   r=   r>   r@   ry   r)   r&   r(   r+   rB   r7   r6   Újson_outrD   rw   ÚjsonÚdumpÚstrict)	ÚparserÚargsr²   r[   rÎ   r‹   rÏ   r‰   Úout_datas	            r3   Úmainrâ   0  sZ  € ÝÔ$Ð1aÐbÑbÔb€FØ
×Ò˜¥sµLÐG_ÐÑ`Ô`Ð`Ø
×Ò˜
¨<Ð>dÐÑeÔeÐeØ
×Ò˜¨|ÐB_ÐÑ`Ô`Ð`Ø
×Ò˜­3¸ÐC]ÐÑ^Ô^Ð^Ø×ÒÑÔ€Då	Ð
\Ñ]Ô]Ð]Ý	Ð
MÑNÔNÐNÝ	Ð
\Ñ]Ô]Ð]Ý	Ð
0 T¤YÐ
0Ð
0Ñ1Ô1Ð1Ý	Ð
c­-Ð
cÐ
cÍmÐ
cÐ
cÐ
cÑdÔdÐdÝ	Ð
a­,Ð
aÐ
aÍ\Ð
aÐ
aÐ
aÑbÔbÐbÝ	Ð
AÕ(9Ð
AÐ
AÐ
AÑBÔBÐBÝ	Ð
\Ñ]Ô]Ð]å˜tœy¸$¼/Ð6IÐJÑJÔJ€Få	Ð
L°Ô0JÐ
LÐ
LÑMÔMÐMÝ	Ð
E¨FÔ,CÐ
EÐ
EÑFÔFÐFÝ	Ð
D¨FÔ,BÐ
DÐ
DÑEÔEÐEÝ	Ð
M°&Ô2KÐ
MÐ
MÑNÔNÐNÝ	Ð
\Ñ]Ô]Ð]àIÐI˜Ô/ÐIÑIÔI€FØMÐM˜6Ô1ÐMÑMÔM€Hàð _ÝÐR¥C¨¡K¤KÐRÐRÐRÑSÔSÐSØð 	_ð 	_ˆAÝÐ]˜AœJÐ]Ð]¨!¬+Ð]Ð]¸¼Ð]Ð]ÐRSÔR[Ð]Ð]Ñ^Ô^Ð^Ð^àð bÝÐS¥3 x¡=¤=ÐSÐSÐSÑTÔTÐTØð 	bð 	bˆAÝÐ`˜qœzÐ`Ð`¨Q¬[Ð`Ð`¸A¼LÐ`Ð`ÐUVÔU^Ð`Ð`ÑaÔaÐaÐaàÔ!ð XÝÐu¥3 vÔ'AÑ#BÔ#BÐuÐuÕ[lÐuÐuÐuÑvÔvÐvØÔ+¨C¨R¨CÔ0ð 	ið 	iˆAÝÐg˜aœkÐgÐg¨A¬LÐgÐgÀÄÐgÐgÐRSÔR^ÐgÐgÐgÑhÔhÐhÐhÝˆvÔ)Ñ*Ô*¨RÒ/Ð/ÝÐV¥C¨Ô(BÑ$CÔ$CÀbÑ$HÐVÐVÐVÑWÔWÐWà„}ð Dà#)Ô#=Ø &Ô 7Ø%Ô5Ø"Ô/Ý ™KœKÝ! (™mœmÝ),¨VÔ-GÑ)HÔ)HØ2Ð2¨6Ð2Ñ2Ô2Ø6Ð6¨XÐ6Ñ6Ô6ð

ð 

ˆõ �$”- ¨wÐ7Ñ7Ô7ð 	A¸1ÝŒI�h ¨!¸%Ð@Ñ@Ô@Ð@ð	Að 	Að 	Añ 	Aô 	Að 	Að 	Að 	Að 	Að 	Að 	Aøøøð 	Að 	Að 	Að 	AåÐB°4´=ÐBÐBÑCÔCÐCå	Ð
^Ñ_Ô_Ð_ØÔð 	ÝÐeÑfÔfÐfÝÐ`ÑaÔaÐaØˆqåÐbÑcÔcÐcÝÐ`ÑaÔaÐaØŒ;ð 	Ø�1Øˆqs   ÏO4Ï4O8Ï;O8Ú__main__)rF   r%   rG   r%   rH   rC   )r&   r%   rT   r%   rH   rU   )r&   r%   rT   r%   rH   rA   )T)r¨   r%   r©   rC   rH   r:   )rH   r'   )3Ú__doc__Ú
__future__r   rÓ   r—   rL   ÚsysrÜ   Údataclassesr   r   Útypingr   r   r   r	   ÚhasattrÚstdoutr
   ÚstderrrF   Úabspathr¯   ÚdirnameÚ__file__rÖ   rP   rJ   r   r}   r~   r|   r‡   r†   rƒ   r‚   r…   r„   r    r"   r0   r$   r5   r:   rS   r‘   r§   r¹   râ   r-   Úexitr1   r2   r3   ú<module>rð      sØ  ððð ð ð #Ð "Ð "Ð "Ð "Ð "Ø €€€Ø 
€
€
€
Ø 	€	€	€	Ø 
€
€
€
Ø €€€Ø (Ð (Ð (Ð (Ð (Ð (Ð (Ð (Ø .Ð .Ð .Ð .Ð .Ð .Ð .Ð .Ð .Ð .Ð .Ð .ð €7ˆ3Œ:�}Ñ%Ô%ð -Ø„J×Ò GÐÑ,Ô,Ð,Ø
€7ˆ3Œ:�}Ñ%Ô%ð -Ø„J×Ò GÐÑ,Ô,Ð,àŒw�Š˜rœwŸ|š|¨B¬G¯OªO¸HÑ,EÔ,EÀwÑOÔOÑPÔP€ðð ð €ð"ð ð €ð €Ø€àÐ ØÐ à€Ø€à€Ø€à€Ø€àÐ ð ,.Ð Ð -Ð -Ð -Ñ -ð ðð ð ð ð ñ ô ñ „ðð ðð ð ð ð ñ ô ñ „ðð ðð ð ð ð ñ ô ñ „ðð	ð 	ð 	ð 	ðjð jð jð jðZð ð ð ðD&ð &ð &ð &ð &ðRGð Gð Gð GðT ˆzÒÐØ€C„HˆTˆT‰VŒVÑÔÐÐÐð Ðr2   