
    Kj                        d Z ddlmZ ddlZddlZddlmZmZ ddlm	Z	 ddl
Z
 e	e      j                         j                  dz  ZddiZdd	Zdd
ZddZedk(  r e        yy)zNVerify representative listing URLs and append HTTP evidence to the audit JSON.    )annotationsN)ThreadPoolExecutoras_completed)Pathzchain-audit-2026-08-21.jsonz
User-Agentz8Mozilla/5.0 (compatible; TN-Silver-catalog-research/1.0)c                    | j                         j                  dd      j                  dd      } t        j                  dd|       S )Nu   커팅u   컷팅u   비형u   b형u   [^0-9a-z가-힣]+ )lowerreplaceresub)values    1.runtime/chain-catalog-data/verify_chain_links.py
normalizedr      s;    KKM!!(H5==hOE66&E22    c                X   	 t        j                  | dt        d      }|j                  xs |j                  |_        t        |j                        }|j                  |j                  dk  |j                  |dS # t        $ r%}d d| dt        |      j                  dcY d }~S d }~ww xY w)	N   T)timeoutheadersallow_redirectsi  )http_status	reachable	final_urlbodyFr   )r   r   r   r   error)requestsgetHEADERSapparent_encodingencodingr   textstatus_codeurl	Exceptiontype__name__)r"   responser   r   s       r   checkr'      s    v<<RRVW$66K(:K:K(--(#//!--3!	
 	
  v#%cSU`dej`k`t`tuuvs   A8A; ;	B)B$B)$B)c            	        t        j                  t        j                  d            } i }t	        d      5 }| d   D ]:  }|d   g|d   }|d   D ]%  }|d	   }||vs|j                  t        |      ||<   ' < |j                         D ci c]  \  }}||j                          }	}}d d d        | d   D ]  }|d   D ]~  }	|d	      |d   g|d   D 
cg c]  }
t        |
      st        |
       }}
j                         D ci c]  \  }}|d
k7  s|| c}}|d<   t        fd|D              |d   d<     dt        	      t        d |	j                         D              t        d |	j                         D              t        d | d   D              d| d<   t        j                  t        j                  | dd      d       t!        t        j                  | d   d             |	j                         D ]?  \  }}|d   rt!        |j                         D ci c]  \  }}|d
k7  s|| c}}|       A y c c}}w # 1 sw Y   xY wc c}
w c c}}w c c}}w )Nzutf-8)r      )max_workersrowsnamealiasesrepresentative_listingsr"   r   verificationc              3  ,   K   | ]  }|d    v   yw)r   N ).0termraws     r   	<genexpr>zmain.<locals>.<genexpr>8   s     9kRV$#f+:M9ks   term_visiblez
2026-08-21c              3  ,   K   | ]  }|d    s	d  ywr      Nr1   r2   r   s     r   r5   zmain.<locals>.<genexpr><   s     OuE+<NO   
c              3  ,   K   | ]  }|d    r	d  ywr8   r1   r:   s     r   r5   zmain.<locals>.<genexpr>=   s     U%BT1Ur;   c              3  D   K   | ]  }|d    D ]  }|d   d   rd   yw)r.   r/   r6   r9   Nr1   )r2   rowlistings      r   r5   zmain.<locals>.<genexpr>>   s=      !
S9R5S!
*1~&~6 !
!
s    )
checked_onunique_urlsr   unreachableterm_visible_rowslink_verificationF   )ensure_asciiindent)rF   r   )jsonloadsPATH	read_textr   submitr'   itemsresultr   anylensumvalues
write_textdumpsprint)datajobsexecutorr>   termsr?   keyr"   futureresultsr3   normalized_termsr   rN   r4   s                 @r   mainr^   &   s   ::dnngn67DD		* Ih< 	<C[23y>2E89 <end? (s ;DI<	< <@::<HKC3'HHI F| l45 	lG'%.)C>A&k=[CPYN=[pT_ijn_o
4 0pp-0YY[')sEC6MU
'GN# 7:9kZj9k6kGN#N3	ll #7|O(8OOU'..*:UU  !
f!
 
	!D	 	OODJJt%BWOU	$**T-.U
CD}} WVk"P*#u#-3:PRUVW+ II I  q'$ QsG   %I0II*II+II#
I#
,I):I)II__main__)r   strreturnr`   )r"   r`   ra   dict)ra   None)__doc__
__future__r   rH   r   concurrent.futuresr   r   pathlibr   r   __file__resolveparentrJ   r   r   r'   r^   r%   r1   r   r   <module>rk      sk    T "  	 ?   H~&&)FFS
T3
v!WH zF r   