Ë
    t?²jh  ã                   óÞ  — d Z ddlZddlZddlZddlZddl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 ddlmZ dZej                   j#                  ed«      Zej                   j#                  ed«      ZdZd	Zd
ZdZd„ Zd„ Zd„ Zd„ Zd„ Z	 d&d„Zdefd„Zd„ Zd„ Z d„ Z!d„ Z"d„ Z#d„ Z$d„ Z%d„ Z&d'd„Z'ej                   j#                  edd«      Z(d„ Z)d(d „Z*d!„ Z+efd"„Z,d#„ Z-d$„ Z.e/d%k(  r e-«        yy))uD  
crawl_scheduler_v2.py - æ™ºèƒ½çˆ¬è™«è°ƒåº¦å™¨ v2
==========================================
æ ¸å¿ƒæ€�è·¯ï¼šå°†æ‰€æœ‰çˆ¬è™«æŒ‰è¿�è¡ŒçŠ¶æ€�åˆ†ç»„ â†’ å�¥åº·è„šæœ¬ä¼˜å…ˆè·‘ â†’ å�Œç±»é—®é¢˜é›†ä¸­æŠ¥å‘Š

åˆ†ç»„é€»è¾‘ï¼š
  - æ­£å¸¸ç¾¤: ä¸Šæ¬¡è¿�è¡Œæˆ�åŠŸ â†’ å…¨éƒ¨æ‰§è¡Œ
  - æ–°è„šæœ¬: ä»Žæœªè¿�è¡Œè¿‡ â†’ å…¨éƒ¨æ‰§è¡Œ  
  - è¶…æ—¶ç¾¤: ç»Ÿä¸€è¶…æ—¶ â†’ é›†ä¸­æŠ¥å‘Š
  - ç«™ç‚¹ä¸�å�¯è¾¾: è¿žæŽ¥è¢«æ‹’/DNS/ç½‘ç»œä¸�å�¯è¾¾ â†’ é›†ä¸­æŠ¥å‘Š
  - è„šæœ¬å¼‚å¸¸ç¾¤: Pythoné”™è¯¯/Traceback â†’ é›†ä¸­æŠ¥å‘Š
  - å…¶ä»–å¤±è´¥ç¾¤: æœªçŸ¥é”™è¯¯ â†’ é›†ä¸­æŠ¥å‘Š

å·¥ä½œæµ�ï¼š
  1. è¯»å�– daily_crawl_config.json + run_status.json
  2. å°†è„šæœ¬æŒ‰çŠ¶æ€�åˆ†ç»„
  3. æ‰§è¡Œæ­£å¸¸ç¾¤(å¹¶è¡Œ 3 ä¸ª worker, å�«é‡�è¯•)
  4. æ‰§è¡Œæ–°è„šæœ¬(å¹¶è¡Œ 3 ä¸ª worker)
  5. è¾“å‡ºåˆ†ç»„æŠ¥å‘Š â†’ ç”¨æˆ·ä¿®å¤�é—®é¢˜ç¾¤

ç”¨æ³•:
  python3 crawl_scheduler_v2.py              # æ‰§è¡Œæ‰€æœ‰è„šæœ¬ï¼ˆæ™ºèƒ½è°ƒåº¦ï¼‰
  python3 crawl_scheduler_v2.py --dry-run     # ä»…åˆ†ç»„é¢„è§ˆï¼Œä¸�æ‰§è¡Œ
  python3 crawl_scheduler_v2.py --group æ±Ÿè‹�   # å�ªè·‘æŒ‡å®šåˆ†ç»„
  python3 crawl_scheduler_v2.py --parallel 5  # è°ƒæ•´å¹¶è¡Œæ•°
é    N)Údatetime)Údefaultdictz/root/gov_crawlerzdaily_crawl_config.jsonzrun_status.jsonz/root/search.dbé   éX  Fc                 óp   — t        j                  «       j                  d«      }t        d|› d| › �d¬«       y )Nú%H:%M:%Sú[ú] T)Úflush)r   ÚnowÚstrftimeÚprint)ÚmsgÚtss     ú'/root/gov_crawler/crawl_scheduler_v2.pyÚlogr   +   s.   € Ü	�‰‹×	 Ñ	  Ó	,€BÜ	ˆAˆbˆT��C�5ˆ/ Ö&ó    c                  ó¬   — t        t        d¬«      5 } t        j                  | «      }t	        |t
        «      rd|i}|d   cd d d «       S # 1 sw Y   y xY w)Núutf-8©ÚencodingÚcrawlers)ÚopenÚCONFIG_PATHÚjsonÚloadÚ
isinstanceÚlist)ÚfÚcfgs     r   Úload_configr!   /   sK   € Ü	Œk GÔ	,ð °Ü�i‰i˜‹lˆä�cœ4Ô Ø˜sÐ#ˆCØ�:‰÷÷ ò ús   ’.A
Á
Ac                 ó˜   — | j                  d«      xs8 | j                  d«      xs% | j                  d«      xs | j                  dd«      S )uC   å…¼å®¹ name ç¼ºå¤±çš„åŽ†å�²æ�¡ç›®: name -> config_name -> site_nameÚnameÚconfig_nameÚ	site_nameÚscriptú?©Úget)Úcs    r   Úcnamer+   8   s>   € à�5‰5�‹=Ò^˜AŸE™E -Ó0Ò^°A·E±E¸+Ó4FÒ^È!Ï%É%ÐPXÐZ]ÓJ^Ð^r   c                  ó¾   — 	 t        t        d¬«      5 } t        j                  | «      cd d d «       S # 1 sw Y   y xY w# t        t        j
                  f$ r i cY S w xY w©Nr   r   )r   ÚSTATUS_PATHr   r   ÚFileNotFoundErrorÚJSONDecodeError©r   s    r   Úload_statusr2   <   sQ   € ðÜ”+¨Ô0ð 	 °AÜ—9‘9˜Q“<÷	 ÷ 	 ò 	 ûäœt×3Ñ3Ð4ò ØŠ	ðúó#   ‚> “2¨	> ²;·> »> ¾AÁAc                 ó„   — t        t        dd¬«      5 }t        j                  | |dd¬«       d d d «       y # 1 sw Y   y xY w)NÚwr   r   Fé   )Úensure_asciiÚindent)r   r.   r   Údump)Ú
status_mapr   s     r   Úsave_statusr;   C   s7   € Ü	Œk˜3¨Ô	1ð ?°QÜ�	‰	�*˜a¨e¸AÕ>÷?÷ ?ñ ?ús   “6¶?Ú c
                 ó’  — t        j                  «       j                  d«      }
t        j                  «       j                  d«      }	 t        j                  t
        d¬«      }|j                  d|
|| ||||||dd |||	f«       |j                  «        |j                  «        y# t        $ r}t        d|› �«       Y d}~yd}~ww xY w)	u�  å†™å…¥è¿�è¡Œæ—¥å¿—åˆ° search.db run_logs è¡¨

    2026-09-21 æ–°å¢ž seen / flag / output_len ä¸‰åˆ—ï¼Œç”¨äºŽåŒºåˆ†ã€Œæ­£å¸¸ç©ºè½®ã€�ä¸Žã€Œé�™é»˜å“‘ç�«ã€�ï¼š
      flag=SILENT  é›¶è¾“å‡º+exit0ï¼ˆå“‘ç�«ï¼Œéœ€äººå·¥çœ‹ï¼‰
      flag=NOITEMS åˆ—è¡¨é¡µä¸€æ�¡éƒ½æ²¡è§£æž�å‡ºæ�¥ï¼ˆæŠ“å�–å¤±è´¥ï¼‰
      flag=IDLE    çœ‹åˆ°äº†ä½†éƒ½å·²å…¥åº“ï¼ˆæ­£å¸¸ç©ºè½®ï¼‰
      flag=NEW     æœ‰æ–°å¢ž
    z%Y-%m-%dr   é<   ©ÚtimeoutzÑINSERT OR REPLACE INTO run_logs (run_date, run_time, script_name, config_name, group_name, status, new_count,  elapsed_seconds, error_detail, seen, flag, output_len) VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)Niô  u     [WARN] run_logå†™å…¥å¤±è´¥: )r   r   r   Úsqlite3ÚconnectÚDB_PATHÚexecuteÚcommitÚcloseÚ	Exceptionr   )Úscript_namer$   Ú
group_nameÚstatusÚ	new_countÚelapsedÚerror_detailÚseenÚflagÚ
output_lenÚtodayÚnow_timeÚconnÚes                 r   Úwrite_run_logrU   G   s·   € ô �L‰L‹N×#Ñ# JÓ/€EÜ�|‰|‹~×&Ñ& zÓ2€Hð4Ü�‰œw°Ô3ˆØ�‰ð :ð �H˜k¨;¸
ÀFÈIØ�l 4 CÐ(¨$°°jðBô		Cð 	�‰ŒØ�
‰
�øÜò 4ÜÐ.¨q¨cÐ2×3Ñ3ûð4ús   ÁAB% Â%	CÂ.CÃCc                 óì  — t        j                   «       }t        |t        «      rdj                  d„ |D «       «      }dt        › d| › d|› �}t        j                  |dt
        j                  t
        j                  dd¬«      }	 |j                  |¬«      \  }}t        j                   «       |z
  }|xs d	|rd
|z   nd	z   }	|	j                  «       |j                  t        |d«      fS # t
        j                  $ r¿ 	 t        j                  t        j                  |j                   «      t"        j$                  «       n0# t&        $ r$ 	 |j)                  «        n# t&        $ r Y nw xY wY nw xY w	 |j                  d¬«       n# t&        $ r Y nw xY wt        j                   «       |z
  }ddt        |d«      fcY S t&        $ r3}
t        j                   «       |z
  }d|
› �dt        |d«      fcY d}
~
S d}
~
ww xY w)u8   æ‰§è¡Œå�•ä¸ªè„šæœ¬ï¼Œè¿”å›ž (output, exit_code, elapsed)ú c              3   ó2   K  — | ]  }t        |«      –— Œ y ­w©N)Ústr)Ú.0Úas     r   ú	<genexpr>zrun_script.<locals>.<genexpr>d   s   è ø€ Ò- 1œ˜AŸÑ-ùs   ‚zcd "z" && python3 "z" T)ÚshellÚstdoutÚstderrÚtextÚstart_new_sessionr?   r<   ú
é   é   z [TIMEOUT]
[KILLED_PROCESS_GROUP]éÿÿÿÿz[EXCEPTION] N)Útimer   r   ÚjoinÚBASE_DIRÚ
subprocessÚPopenÚPIPEÚcommunicateÚstripÚ
returncodeÚroundÚTimeoutExpiredÚosÚkillpgÚgetpgidÚpidÚsignalÚSIGKILLrG   Úkill)r&   Úargsr@   Út0ÚcmdÚprocÚout_sÚerr_srL   ÚoutrT   s              r   Ú
run_scriptr€   `   s³  € ä	�‰‹€BÜ�$œÔØ�x‰xÑ-¨Ô-Ó-ˆØ”�
˜.¨¨°°4°&Ð
9€Cô
 ×Ñ˜C t´J·O±OÌJÏOÉOØ!%¸ô?€Dð9Ø×'Ñ'°Ð'Ó8‰ˆˆuÜ—)‘)“+ Ñ"ˆØŠ{˜©u˜t eš|¸"Ñ=ˆØ�y‰y‹{˜DŸO™O¬U°7¸AÓ->Ð>Ð>øÜ×$Ñ$ò Jð	Ü�I‰I”b—j‘j §¡Ó*¬F¯N©NÕ;øÜò 	ðØ—	‘	•øÜò Ùðüð	úð
	Ø×Ñ RÐÕ(øÜò 	Ùð	úä—)‘)“+ Ñ"ˆØ2°B¼¸gÀqÓ8IÐIÒIÜò 9Ü—)‘)“+ Ñ"ˆØ˜a˜SÐ! 2¤u¨W°aÓ'8Ð8Õ8ûð9ús’   ÂA"C' Ã'G3Ã;AD=Ä<G3Ä=	E*ÅEÅE*Å	E$Å!E*Å#E$Å$E*Å'G3Å)E*Å*G3Å.FÆ G3Æ	FÆ
G3ÆFÆ)G3Æ8G3Ç (G.Ç(G3Ç.G3c                 ó  ‡— |dk(  ry|dk(  rd| j                  «       v ry| j                  «       Št        ˆfd„dD «       «      ryt        ˆfd	„d
D «       «      ryt        ˆfd„dD «       «      ryd‰v sd‰v ryd‰v sd‰v ryy)u*   æ ¹æ�®è¾“å‡ºå’Œé€€å‡ºç �åˆ†ç±»é”™è¯¯ç±»åž‹r   r<   rf   ÚTIMEOUTr@   c              3   ó&   •K  — | ]  }|‰v –— Œ
 y ­wrY   © ©r[   ÚxÚ	err_lowers     €r   r]   z!classify_error.<locals>.<genexpr>Š   s   øè ø€ ò  A˜aˆ1�	Œ>ñ  Aùó   ƒ)zconnection refusedzconnection resetu   è¿žæŽ¥è¢«æ‹’ç»�zconnect failedz	errno 111Úconnection_refusedc              3   ó&   •K  — | ]  }|‰v –— Œ
 y ­wrY   r„   r…   s     €r   r]   z!classify_error.<locals>.<genexpr>Œ   s   øè ø€ ò  X˜aˆ1�	Œ>ñ  Xùrˆ   )zname or service not knownz$temporary failure in name resolutionu   æ— æ³•è§£æž�ÚresolveÚdnszerrno -2Údns_resolvec              3   ó&   •K  — | ]  }|‰v –— Œ
 y ­wrY   r„   r…   s     €r   r]   z!classify_error.<locals>.<genexpr>Ž   s   øè ø€ ò  `˜aˆ1�	Œ>ñ  `ùrˆ   )zno route to hostznetwork is unreachableu   æ— æ³•è®¿é—®u   ç½‘ç»œä¸�å�¯è¾¾z	errno 101z	errno 113u   è¿žæŽ¥è¶…æ—¶Úunreachablezread timed outÚread_timeoutÚ	tracebackÚerrorÚscript_errorÚ
exit_error)ÚupperÚlowerÚany)r   Úcoder‡   s     @r   Úclassify_errorr™   ƒ   s­   ø€ àˆq‚yØØˆr‚z�i 3§9¡9£;Ñ.ØØ—	‘	“€IÜ
ó  AÐ#ô  Aô  AØ#Ü
ó  Xð  $Wô  Xô  XØÜ
ó  `ð  $_ô  `ô  `ØØ˜9Ñ$¨	°YÑ(>ØØ�iÑ 7¨iÑ#7ØØr   c                 ó@  — | j                  «       j                  d«      }t        |«      D ]ñ  }|j                  «       }t        j                  d|«      }|rt        |j                  d«      «      c S t        j                  d|t        j                  «      }|rt        |j                  d«      «      c S t        j                  d|«      }|rt        |j                  d«      «      c S t        j                  d|«      }|sŒ×t        |j                  d«      «      c S  y)un   ä»Žè„šæœ¬è¾“å‡ºä¸­æ��å�–æ–°å¢žæ�¡æ•° - ä»Žæœ€å�Žä¸€è¡Œå¾€å‰�æ�œï¼Œé�¿å…�åŒ¹é…�åˆ°æ ‡é¢˜é‡Œçš„æ–°å¢žXXä¸‡å­—æ ·rc   u   æ–°å¢ž\s*[ï¼š:]\s*(\d+)rd   u!   (?:Inserted|New)\s*[ï¼š:]\s*(\d+)u   æ–°å¢ž\s*(\d+)\s*æ�¡u   ä¿�å­˜\D*(\d+)r   )rn   ÚsplitÚreversedÚreÚsearchÚintÚgroupÚ
IGNORECASE)ÚoutputÚlinesÚlineÚms       r   Úextract_new_countr¦   –   sÙ   € à�L‰L‹N× Ñ  Ó&€EÜ˜“ò #ˆØ�z‰z‹|ˆä�I‰IÐ0°$Ó7ˆÙÜ�q—w‘w˜q“z“?Ò"ä�I‰IÐ:¸DÄ"Ç-Á-ÓPˆÙÜ�q—w‘w˜q“z“?Ò"ä�I‰IÐ-¨tÓ4ˆÙÜ�q—w‘w˜q“z“?Ò"ä�I‰IÐ'¨Ó.ˆÚÜ�q—w‘w˜q“z“?Ò"ð##ð$ r   c                 ó¸  — t        | j                  «       j                  d«      «      D ]6  }t        j                  d|«      }|sŒt        |j                  d«      «      c S  t        | j                  «       j                  d«      «      D ]N  }dD ]G  }t        j                  ||t        j                  «      }|sŒ+t        |j                  d«      «      c c S  ŒP y)ud  æ��å�–ã€Œåˆ—è¡¨é¡µçœ‹åˆ°å¤šå°‘æ�¡ã€�â€”â€”è¿™æ˜¯åŒºåˆ†ã€Œæ­£å¸¸ç©ºè½®ã€�ä¸Žã€Œé�™é»˜å“‘ç�«ã€�çš„å…³é”®ç»´åº¦ã€‚

    ä¼˜å…ˆçº§ï¼š
      1) æ–°å¥‘çº¦è¡Œ `##RUN seen=N new=M skip=K##`ï¼ˆè„šæœ¬æ˜¾å¼�ä¸ŠæŠ¥ï¼Œæœ€å�¯é� ï¼‰
      2) æ—§è„šæœ¬çš„å¸¸è§�æŽªè¾žå°½åŠ›è§£æž�
    è¿”å›ž None è¡¨ç¤ºæ— æ³•åˆ¤å®šï¼ˆä¸�è¦�å½“æˆ� 0ï¼Œå�¦åˆ™ä¼šè¯¯æŠ¥æŠ“å�–å¤±è´¥ï¼‰ã€‚
    rc   z##RUN\b[^#]*\bseen=(\d+)rd   )zFound\s+(\d+)\s+items?z(\d+)\s+items?\s+foundu   åˆ—è¡¨[^\d]{0,6}(\d+)\s*æ�¡u   å…±\s*(\d+)\s*æ�¡u   æ‰¾åˆ°\s*(\d+)\s*æ�¡u   èŽ·å�–åˆ°\s*(\d+)\s*æ�¡u   æœ¬é¡µ\s*(\d+)\s*æ�¡N)rœ   rn   r›   r�   rž   rŸ   r    r¡   )r¢   r¤   r¥   Úpats       r   Úextract_items_seenr©   ­   s¹   € ô ˜Ÿ™›×-Ñ-¨dÓ3Ó4ò #ˆÜ�I‰IÐ1°4Ó8ˆÚÜ�q—w‘w˜q“z“?Ò"ð#ô ˜Ÿ™›×-Ñ-¨dÓ3Ó4ò 
'ˆð-ò 		'ˆCô —	‘	˜#˜t¤R§]¡]Ó3ˆAÚÜ˜1Ÿ7™7 1›:“Ô&ñ		'ð
'ð r   c                 óp   — | r| j                  «       dv ryt        d„ | j                  d«      D «       «       S )u,  é›¶è¾“å‡ºåˆ¤å®šï¼šé€€å‡ºç � 0 ä½†ä¸€è¡Œæœ‰æ•ˆè¾“å‡ºéƒ½æ²¡æœ‰ â†’ æž�å�¯èƒ½æ²¡èµ°åˆ°ä¸»é€»è¾‘ï¼ˆé�™é»˜å“‘ç�«ï¼‰ã€‚

    2026-09-21 å®žè¯�ï¼šcrawl_ahsthj.py å®Œå…¨æ— è¾“å‡º + exit 0ï¼Œå�´è¢«è®°ä¸ºã€Œæˆ�åŠŸ +0æ�¡ã€�ï¼Œ
    ä¸ŽçœŸçš„ã€Œç«™ç‚¹æ— æ–°æ•°æ�®ã€�åœ¨æ—¥å¿—é‡Œä¸€æ¨¡ä¸€æ ·ï¼Œæ— æ³•åŒºåˆ†ã€‚
    )r<   z	[TIMEOUT]z[EXCEPTION]Tc              3   ó<   K  — | ]  }|j                  «       –— Œ y ­wrY   )rn   )r[   Úchs     r   r]   zis_silent.<locals>.<genexpr>Ï   s   è ø€ Ò8 "�2—8‘8—:Ñ8ùs   ‚rc   )rn   r—   r›   )r   s    r   Ú	is_silentr­   Ç   s4   € ñ �#—)‘)“+Ð!AÑAØÜÑ8¨¯	©	°$«Ô8Ó8Ð8Ð8r   c           	      óV  — t        | j                  «       j                  d«      «      D ]w  }t        j                  d|«      }|sŒt        t        j                  d|j                  d«      «      «      }|j                  «       D ��ci c]  \  }}|t        |«      “Œ c}}c S  i S c c}}w )uG   è§£æž�æ–°å¥‘çº¦è¡Œ `##RUN seen=20 new=3 skip=17##`ï¼Œç¼ºå¤±è¿”å›ž {}ã€‚rc   z##RUN\b([^#]*)##z(\w+)=(\d+)rd   )
rœ   rn   r›   r�   rž   ÚdictÚfindallr    ÚitemsrŸ   )r¢   r¤   r¥   ÚkvÚkÚvs         r   Úextract_run_contractrµ   Ò   s‡   € ä˜Ÿ™›×-Ñ-¨dÓ3Ó4ò 6ˆÜ�I‰IÐ)¨4Ó0ˆÚÜ”b—j‘j °·±¸³Ó<Ó=ˆBØ*,¯(©(«*×5¡$ ! Q�A”s˜1“v‘IÓ5Ò5ð	6ð
 €Iùó 6s   ÂB%c                 óT   — | sy| j                  dd«      }|j                  d«      ry|S )u,   ä»Ž run_status.json entry èŽ·å�–çŠ¶æ€�æ ‡ç­¾u	   æ–°è„šæœ¬rJ   r<   õ   æˆ�åŠŸõ   æ­£å¸¸)r)   Ú
startswith)ÚentryÚss     r   Úget_status_labelr¼   Ü   s,   € áØØ�	‰	�(˜BÓ€AØ‡|�|�HÔØØ€Hr   c                 ó,   — | sy| j                  dd«      S )u   èŽ·å�–é”™è¯¯ç±»åž‹r<   Ú
error_typer(   )rº   s    r   Úget_error_typer¿   å   s   € áØØ�9‰9�\ 2Ó&Ð&r   c                 óˆ  — g g g g g g g dœ}| D �]1  }t        |«      }|j                  dd«      }|j                  dd«      }|s|d   j                  |«       ŒJ|j                  |«      xs |j                  |«      }|s|d   j                  |«       Œ…|j                  dd«      }|j                  d	d«      }	|j                  d
«      r|d   j                  |«       ŒÏ|	dk(  r|d   j                  |«       Œé|	dv r|d   j                  |«       �Œ|	dk(  r|d   j                  |«       �Œ|d   j                  |«       �Œ4 |S )uç   
    å°†çˆ¬è™«åˆ†ç»„:
      - normal: ä¸Šæ¬¡æˆ�åŠŸ or ä»Žæœªè¿�è¡Œ
      - timeout: è¶…æ—¶
      - site_down: ç«™ç‚¹ä¸�å�¯è¾¾ç±»
      - script_error: è„šæœ¬å¼‚å¸¸
      - other_failed: å…¶ä»–å¤±è´¥
      - disabled: æœªå�¯ç”¨
    ©r¸   õ	   æœªè¿�è¡Œõ   è¶…æ—¶õ   ç«™ç‚¹ä¸�å�¯è¾¾õ   è„šæœ¬å¼‚å¸¸õ   å…¶ä»–å¤±è´¥õ	   æœªå�¯ç”¨r&   r<   ÚenabledTrÇ   rÂ   rJ   r¾   r·   r¸   r@   rÃ   ©r‰   r�   r�   r�   rÄ   r“   rÅ   rÆ   )r+   r)   Úappendr¹   )
r   r:   Úgroupsr*   r#   r&   rÈ   rº   r»   r¾   s
             r   Úgroup_crawlersrÌ   ì   sT  € ð ØØØØØØñ€Fð ó -ˆÜ�Q‹xˆØ—‘�x Ó$ˆØ—%‘%˜	 4Ó(ˆáØ�;Ñ×&Ñ& qÔ)Øà—‘˜vÓ&Ò>¨*¯.©.¸Ó*>ˆáØ�;Ñ×&Ñ& qÔ)Øà�I‰I�h Ó#ˆØ—Y‘Y˜|¨RÓ0ˆ
à�<‰<˜Ô!Ø�8Ñ×#Ñ# AÕ&Ø˜9Ò$Ø�8Ñ×#Ñ# AÕ&ØÐ_Ñ_ØÐ$Ñ%×,Ñ,¨QÖ/Ø˜>Ò)Ø�>Ñ"×)Ñ)¨!Ö,à�>Ñ"×)Ñ)¨!Ö,ð7-ð: €Mr   c                 ó2  — t        d„ | j                  «       D «       «      }t        dd› �«       t        d|› d�«       t        d› «       g d¢}ddd	d
ddddœ}|D �]  }| j                  |g «      }|sŒ|j                  |d«      }t        d|› |› d|› dt	        |«      › d�«       t        t        «      }|D ]/  }	||	j                  dd«         j                  t        |	«      «       Œ1 t        |j                  «       «      D ]m  \  }
}t        |› d|
› dt	        |«      › d�«       |dvsŒ(|dd D ]  }t        |› d|› �«       Œ t	        |«      dkD  sŒQt        |› dt	        |«      dz
  › d�«       Œo �Œ t        d|› d› �«       t        |› d|› d�«       |d fS )!u   æ‰“å�°åˆ†ç»„æŠ¥å‘Šc              3   ó8   K  — | ]  \  }}t        |«      –— Œ y ­wrY   )Úlen)r[   r³   r´   s      r   r]   z%print_group_report.<locals>.<genexpr>!  s   è ø€ Ò2™4˜1˜a”�A—Ñ2ùs   ‚rc   ú<============================================================u&     æ™ºèƒ½è°ƒåº¦åˆ†ç»„æŠ¥å‘Š â€” æ€»è®¡ u
    ä¸ªçˆ¬è™«rÁ   u   âœ…u   ðŸ†•u   â�°u   ðŸŒ�u   ðŸ�›u   â�“u   â�¹ï¸�u   ðŸ“‹rW   ú (u   ä¸ª)r    u   å…¶ä»–z  [r
   u   ä¸ª)r¸   rÂ   rÇ   Né   u       Â· u       ... è¿˜æœ‰ õ    ä¸ªú2==================================================u	     å…¨éƒ¨ uF    ä¸ªå�‡ä¼šæ‰§è¡Œï¼ˆå�«ä¹‹å‰�å¤±è´¥çš„ï¼Œç«™ç‚¹æ�¢å¤�å�Žè‡ªåŠ¨å½’é˜Ÿï¼‰r   )
Úsumr±   r   r)   rÏ   r   r   rÊ   r+   Úsorted)rË   r8   ÚtotalÚorderÚemojisÚgrp_namer±   ÚemojiÚby_provincer*   ÚprovÚnamesÚns                r   Úprint_group_reportrà     sÉ  € äÑ2 6§<¡<£>Ô2Ó2€EÜ	ˆBˆvˆhˆ-ÔÜ	Ð2°5°'¸Ð
DÔEÜ	ˆVˆHÔâm€Eà f¸Ø!°6È5Ð_gñ€Fð
 ó HˆØ—
‘
˜8 RÓ(ˆÙØØ—
‘
˜8 VÓ,ˆÜ��6�(˜5˜'  8 *¨B¬s°5«z¨l¸$Ð?Ô@ä!¤$Ó'ˆØò 	CˆAØ˜Ÿ™˜g xÓ0Ñ1×8Ñ8¼¸q»ÕBð	Cä! +×"3Ñ"3Ó"5Ó6ò 	H‰KˆD�%Ü�V�H˜C ˜v R¬¨E«
 |°3Ð7Ô8ØÐCÒCØ˜r ˜ò 1�AÜ˜V˜H G¨A¨3Ð/Õ0ð1ä�u“: “>Ü˜V˜H O´C¸³J¸q±L°>ÀÐFÕGò	HðHô& 
ˆBˆvˆh�v�hÐ
Ô Ü	ˆVˆH�I˜e˜WÐ$jÐ
kÔlØ�!ˆ8€Or   Údatazauto_import_map.jsonc                  ó¾   — 	 t        t        d¬«      5 } t        j                  | «      cd d d «       S # 1 sw Y   y xY w# t        t        j
                  f$ r i cY S w xY wr-   )r   ÚAUTO_IMPORT_MAP_PATHr   r   r/   r0   r1   s    r   Úload_auto_import_maprä   H  sR   € ðÜÔ&°Ô9ð 	 ¸QÜ—9‘9˜Q“<÷	 ÷ 	 ò 	 ûäœt×3Ñ3Ð4ò ØŠ	ðúr3   c                 óv  — 	 |�|n	t        «       }| |vry||    }|j                  dd«      }d}|dk(  �r+|j                  dg «      D �]  }t        j                  j	                  |«      ràt        j                  j                  |«      dkD  r¾t        j                  t        j                  t        j                  j                  t        d«      d	|d
| d|gddd¬«      }	|	j                  xs d|	j                  xs dz   }
|
j                  «       r"|
j                  «       j                  d«      d   nd}t!        d| › d|› �«       |dz  }�Œt!        d| › d|› �«       �Œ �n|�r|j                  «       �r
d| j#                  dd«      j#                  dd«      › d�}t%        |dd¬«      5 }|j'                  |«       ddd«       t        j                  t        j                  t        j                  j                  t        d«      d|d
| d|gddd¬«      }	|	j                  xs d|	j                  xs dz   }
|
j                  «       r"|
j                  «       j                  d«      d   nd}t!        d| › d|› �«       |dz  }|dfS # 1 sw Y   ŒÉxY w# t(        $ r"}t!        d| › d|› �«       dd |› �fcY d}~S d}~ww xY w)!uW   è„šæœ¬æ‰§è¡Œæˆ�åŠŸå�Žè‡ªåŠ¨å¯¼å…¥å…¶è¾“å‡ºåˆ° search.db (å¹‚ç­‰, page_url è¦†ç›–æ›´æ–°)N)r   zno-mapÚtyper<   r   ÚfileÚfileszimport_jsonl_auto.pyz--filez--scriptz--siteTéx   )Úcapture_outputra   r@   rc   rf   r'   u     ðŸ“¥ è‡ªåŠ¨å¯¼å…¥ ú: rd   u   : è¾“å‡ºæ–‡ä»¶ç©º/ä¸�å­˜åœ¨ z/tmp/autoimp_z.pyz.jsz.outr5   r   r   z--stdoutÚoku     âš ï¸� è‡ªåŠ¨å¯¼å…¥å¼‚å¸¸ zerr:)rä   r)   rr   ÚpathÚexistsÚgetsizerj   ÚrunÚsysÚ
executablerh   ri   r_   r`   rn   r›   r   Úreplacer   ÚwriterG   )r&   Úout_textÚscript_siteÚ	force_mapÚamaprº   ÚetypeÚimportedÚfpÚrr   ÚnoteÚtmpfr   rT   s                  r   Úauto_importrÿ   O  sŠ  € ð$Ø%Ð1‰yÔ7KÓ7MˆØ˜ÑØØ�V‘ˆØ—	‘	˜& "Ó%ˆØˆØ�F‹?Ø—i‘i ¨Ó,ó Y�Ü—7‘7—>‘> "Ô%¬"¯'©'¯/©/¸"Ó*=ÀÒ*AÜ"Ÿ™ÜŸ™¬¯©¯©´hÐ@VÓ)WØ! 2 z°6¸8À[ðRà'+°$ÀôE�Að Ÿ8™8š> r¨a¯h©hªn¸"Ñ=�CØ:=¿)¹)¼+˜3Ÿ9™9›;×,Ñ,¨TÓ2°2Ò6È3�DÜÐ.¨v¨h°b¸¸Ð?Ô@Ø ‘M’HäÐ.¨v¨hÐ6RÐSUÐRVÐWÖXòYò ˜HŸN™NÕ,Ø& v§~¡~°e¸BÓ'?×'GÑ'GÈÈbÓ'QÐ&RÐRVÐW�Ü˜$ ¨gÔ6ð &¸!Ø—G‘G˜HÔ%÷&ä—N‘NÜ—^‘^¤R§W¡W§\¡\´(Ð<RÓ%SØ  z°6¸8À[ðRà#'¨d¸CôA�ð —x‘x’~ 2¨!¯(©(ª.°bÑ9�Ø69·i±i´k�s—y‘y“{×(Ñ(¨Ó.¨rÒ2Às�ÜÐ*¨6¨(°"°T°FÐ;Ô<Ø˜A‘�Ø˜ˆ~Ð÷&ð &ûô ò ÜÐ*¨6¨(°"°Q°CÐ8Ô9Ø�D˜˜�*ˆ}Õûðús<   ‚J •FJ Æ'JÆ9CJ ÊJ
ÊJ Ê	J8ÊJ3Ê-J8Ê3J8c                 ó*  — | d   }| j                  dd«      }t        | «      }| j                  dd«      }| j                  d«      xs t        }t        d|› d|› d|› d	�«       t	        |||¬
«      \  }}}|dk(  rÈt        |«      }	|	r|	j                  d«      n
t        |«      }
|
€t        |«      }
|	r|	j                  d«      n
t        |«      }t        |«      }d}|rd}n#|dk(  r|
dk(  rd}n|�|dkD  r|
dk(  rd}n|
dkD  rd}t        d|
› d|› d|› d|› d	�	«       	 t        |||¬«       ||d|
|dd||||t        |«      dœS t        ||«      }t        d|› d|› d	�«       ||dd|||dd |d œS # t        $ r}t        d|› d|› �«       Y d}~Œcd}~ww xY w)!u+   å�•ä¸ªworkeræ‰§è¡Œä»»åŠ¡ï¼Œè¿”å›žç»“æžœdictr&   ry   r<   r    r@   u   â–¶ rÑ   z) [timeout=zs]r?   r   ÚnewNrN   ÚSILENTÚNOITEMSÚIDLEÚNEWu     âœ… å®Œæˆ� +u
   æ�¡ [seen=rW   z] [)rö   u     âš ï¸� auto_import å¼‚å¸¸ rë   T)r#   r&   ÚsuccessrK   rL   r¾   r’   rI   rN   ÚsilentrO   rP   u     â�Œ z [Fé,  ©r#   r&   r  rK   rL   r¾   r’   rI   )r)   r+   ÚSCRIPT_TIMEOUTr   r€   rµ   r¦   r©   r­   rÿ   rG   rÏ   r™   )Úcrawlerr&   ry   r#   rI   Útask_timeoutr   r˜   rL   ÚcontractrK   rN   r  rO   rT   r¾   s                   r   Úexecute_workerr  y  së  € à�XÑ€FØ�;‰;�v˜rÓ"€DÜ�‹>€DØ—‘˜W bÓ)€JØ—;‘;˜yÓ)Ò;¬^€Läˆ$ˆtˆf�B�v�h˜k¨,¨°rÐ:Ô;Ü# F¨D¸,ÔGÑ€Cˆˆwàˆq‚yÜ'¨Ó,ˆÙ+3�H—L‘L Ô'Ô9JÈ3Ó9Oˆ	ØÐÜ)¨#Ó.ˆIÙ'/ˆx�|‰|˜FÔ#Ô5GÈÓ5LˆÜ˜3“ˆàˆÙØ‰DØ�QŠY˜9¨š>Ø‰DØÐ $¨¢(¨y¸Aª~Ø‰DØ˜Š]ØˆDÜˆn˜Y˜K z°$°°q¸¸¸cÀ'ÀÈ"ÐMÔNð	>Ü˜ °Õ6ð  F°tØ"¨wØ rØ$Ø F°DÌÈCËñ
ð 	
ô $ C¨Ó.ˆ
Üˆf�Z�L  7 )¨2Ð.Ô/à F°uØ wØ$¨s°4°C¨yØ$ñ	
ð 	
øô ò 	>ÜÐ.¨v¨h°b¸¸Ð<×=Ñ=ûð	>ús   ÄE. Å.	FÅ7FÆFc                 óà  — | sg S t        | «      }t        dd› �«       t        d|› d|› d|› d�«       t        d› «       g }t        j                  j	                  |¬«      5 }| D �ci c]  }|j                  t        |«      |“Œ }}t        j                  j                  |«      D ]$  }	 |j                  «       }	|j                  |	«       Œ& 	 ddd«       t        d„ |D «       «      }||z
  }t        d|› d|› d|› �«       |S c c}w # t        $ rQ}
||   }|j                  t        |«      |d   d	d
d
dt        |
«      dd |j                  dd«      dœ«       Y d}
~
Œ·d}
~
ww xY w# 1 sw Y   Œ˜xY w)u   å¹¶è¡Œæ‰§è¡Œä¸€ç»„çˆ¬è™«rc   rÔ   u     æ‰§è¡Œã€Œu   ã€�ç»„: u    ä¸ªçˆ¬è™« (å¹¶è¡Œ ú))Úmax_workersr&   Fr   Ú	exceptionNr  r    r<   r	  c              3   ó,   K  — | ]  }|d    sŒ	d–— Œ y­w©r  rd   Nr„   ©r[   rü   s     r   r]   zrun_group.<locals>.<genexpr>Æ  s   è ø€ Ò5˜¨¨)«”!Ñ5ùó   ‚
�u     ðŸ“Š u	   : æˆ�åŠŸ u
    / å¤±è´¥ )rÏ   r   Ú
concurrentÚfuturesÚThreadPoolExecutorÚsubmitr  Úas_completedÚresultrÊ   rG   r+   rZ   r)   rÕ   )r   ÚlabelÚparallelrß   ÚresultsÚexecutorr*   r  Úfuturer  rT   r  Úfaileds                r   Ú	run_groupr#  ¬  s~  € áØˆ	äˆH‹€AÜˆ"ˆVˆHˆÔÜˆ+�e�W˜H Q CÐ':¸8¸*ÀAÐFÔGÜˆ6ˆ(Ôà€GÜ	×	Ñ	×	.Ñ	.¸8Ð	.Ó	Dð ÈØBJÖK¸Q�8—?‘?¤>°1Ó5°qÑ8ÐKˆÐKÜ ×(Ñ(×5Ñ5°gÓ>ò 	ˆFð
ØŸ™›�Ø—‘˜vÕ&ñ	÷ô Ñ5˜WÔ5Ó5€GØ�‰[€FÜˆ'�%�˜	 ' ¨*°V°HÐ=Ô>Ø€Nùò# Løô
 ò Ø˜F‘O�Ø—‘Ü! !›H°°(±Ø$°1ÀØ"-¼¸A»¸tÀ¸Ø"#§%¡%¨°Ó"4ñ	 ÷ ñ ûðú÷ð úsI   Á!E$Á&DÂ$E$Â)!DÃ
E$ÄE$Ä	E!ÄAEÅE$ÅE!Å!E$Å$E-c                  ót  — dd l } | j                  d¬«      }|j                  ddd¬«       |j                  dd	¬
«       |j                  dt        t        dt        › d�¬«       |j                  «       }t        j                  «       }t        d«       t        «       }|j                  rT|D �cg c]$  }|j                  dd«      |j                  k(  sŒ#|‘Œ& }}t        d|j                  › dt        |«      › d�«       t        «       }t        ||«      }t        |«      \  }}	|j                  rt        d«       y g }
d}g d¢}|D ]o  }|j                  |g «      }|sŒt!        |||j"                  «      }|
j%                  |«       |D ]   }|d   rt'        ||«       Œt'        ||«       Œ" t)        |«       Œq t+        d„ |
D «       «      }t        |
«      |z
  }t+        d„ |
D «       «      }t        j                  «       |z
  }t-        dd› �«       t-        d«       t-        d› «       t-        d|d›d�«       t-        d t        |
«      › d!t        |«      › d"t        |j                  d#g «      «      › d$�«       t-        d%|› d&|› d'�«       t-        d(|› d�«       |dkD  rÌt-        d)«       t/        t0        «      }|
D ]/  }|d   rŒ	||j                  d*d+«         j3                  |d,   «       Œ1 t5        |j7                  «       «      D ]b  \  }}t-        d-|› d.t        |«      › d/�«       |d d0 D ]  }t-        d1|› �«       Œ t        |«      d0kD  sŒHt-        d2t        |«      d0z
  › d�«       Œd |dkD  rt-        d3«       t)        |«       t        d4«       	 t        d5«       t9        j:                  t<        j>                  t@        jB                  jE                  tF        d6«      gd7d8¬9«       t        d:«       	 t        d<«       t9        j:                  t<        j>                  t@        jB                  jE                  tF        d=«      gd>d8¬9«       t        d?«       	 t        dA«       t9        j:                  t<        j>                  t@        jB                  jE                  tF        dB«      dCgd>d8¬9«       t        dD«       dFD ]k  }	 t        dG|› dH�«       t9        j:                  t<        j>                  t@        jB                  jE                  tF        |«      gdId8¬9«       t        dG|› dJ�«       Œm y c c}w # tH        $ r}t        d;|› �«       Y d }~�ŒVd }~ww xY w# tH        $ r}t        d@|› �«       Y d }~�Œd }~ww xY w# tH        $ r}t        dE|› �«       Y d }~ŒÜd }~ww xY w# tH        $ r}t        dG|› dK|› �«       Y d }~�Œd }~ww xY w)LNr   u   æ™ºèƒ½çˆ¬è™«è°ƒåº¦å™¨ v2)Údescriptionz	--dry-runÚ
store_trueu   ä»…åˆ†ç»„é¢„è§ˆï¼Œä¸�æ‰§è¡Œ)ÚactionÚhelpz--groupu   å�ªè¿�è¡ŒæŒ‡å®šçœ�ä»½/åˆ†ç»„)r(  z
--parallelu   å¹¶è¡Œæ•° (é»˜è®¤ r  )ræ   Údefaultr(  u   ðŸš€ çˆ¬è™«è°ƒåº¦å™¨ v2 å�¯åŠ¨r    r<   u   è¿‡æ»¤åˆ†ç»„: u    â†’ rÓ   u,   
ðŸ�� Dry-run æ¨¡å¼�ï¼Œæœªæ‰§è¡Œä»»ä½•è„šæœ¬)r¸   rÂ   rÃ   rÄ   rÅ   rÆ   r  c              3   ó,   K  — | ]  }|d    sŒ	d–— Œ y­wr  r„   r  s     r   r]   zmain.<locals>.<genexpr>ú  s   è ø€ Ò?˜a°!°I³,œÑ?ùr  c              3   ó2   K  — | ]  }|d    sŒ	|d   –— Œ y­w)r  rK   Nr„   r  s     r   r]   zmain.<locals>.<genexpr>ü  s   è ø€ ÒH q¸1¸Y»<�A�k•NÑHùs   ‚
�
rc   rÐ   u     ðŸ“Š ä»Šæ—¥è¿�è¡Œæ€»ç»“u     æ€»è€—æ—¶: z.0fr»   u     å…¨éƒ¨æ‰§è¡Œ: ú/u    ä¸ª (æœªå�¯ç”¨ rÇ   u    ä¸ªè·³è¿‡)u     ä»Šæ—¥æˆ�åŠŸ: u    ä¸ª (+u
   æ�¡æ•°æ�®)u     ä»Šæ—¥å¤±è´¥: u   
  ðŸ“‹ ä»Šæ—¥å¤±è´¥è¯¦æƒ…:r¾   Úunknownr#   z
    rÑ   u   ä¸ª):é   u	         Â· u         ... è¿˜æœ‰ uW   
  ä¸‹æ¬¡æ—¥è·‘ä¼šå†�æ¬¡å°�è¯•ä»¥ä¸Šæ‰€æœ‰å¤±è´¥ç«™ç‚¹ï¼ˆç«™ç‚¹æ�¢å¤�å�Žè‡ªåŠ¨å½’é˜Ÿï¼‰u   ðŸ�� è°ƒåº¦å®Œæˆ�z"[STATS] generating Dis-db stats...zdisdb_server_stats.pyr  F)r@   Úcheckz3[STATS] Dis-db stats written: /tmp/disdb_stats.jsonz[STATS] FAILED: z"[NORM] normalizing publish_date...znormalize_dates_cron.pyr   z&[NORM] publish_date normalization donez[NORM] FAILED: z2[FIX-MD] cleaning markdown artifacts in content...zfix_md_after_crawl.pyz--days=1z[FIX-MD] donez[FIX-MD] FAILED: )zrebuild_entity_inc.pyzrebuild_bigram_inc2.pyz[IDX] z ...i  z donez	 FAILED: )%ÚargparseÚArgumentParserÚadd_argumentrŸ   ÚDEFAULT_PARALLELÚ
parse_argsrg   r   r!   r    r)   rÏ   r2   rÌ   rà   Údry_runr#  r  ÚextendÚupdate_statusr;   rÕ   r   r   r   rÊ   rÖ   r±   rj   rð   rñ   rò   rr   rí   rh   ri   rG   )r0  Úparserry   Ústart_tsr   r*   r:   rË   Ú	run_countÚ
skip_countÚall_resultsÚrecovery_countÚexecution_orderrÚ   r±   r  rü   Útotal_successÚtotal_failedÚ	total_newÚelapsed_totalÚfailed_by_typerù   rÞ   rß   rT   Ú_idx_jobs                              r   ÚmainrE  Ì  s]  € ÛØ×$Ñ$Ð1KÐ$ÓL€FØ
×Ñ˜¨LÐ?\ÐÔ]Ø
×Ñ˜	Ð(FÐÔGØ
×Ñ˜¬3Ô8HÐQcÔdtÐcuÐuvÐOwÐÔxØ×ÑÓ€Dä�y‰y‹{€HÜÐ(Ô)ä‹}€HØ‡z‚zØ'ÖL˜!¨1¯5©5°¸"Ó+=ÀÇÁÓ+K’AÐLˆÐLÜˆn˜TŸZ™Z˜L¨¬c°(«m¨_¸DÐAÔBä“€JÜ˜H jÓ1€Fä.¨vÓ6Ñ€Iˆzà‡|‚|ÜÐ;Ô<Øð €KØ€Nâj€OØ#ò  ˆØ—
‘
˜8 RÓ(ˆÙØÜ˜E 8¨T¯]©]Ó;ˆØ×Ñ˜7Ô#àò 	-ˆAØ�Š|Ü˜j¨!Õ,ô ˜j¨!Õ,ð	-ô 	�JÕð ô  Ñ? ;Ô?Ó?€MÜ�{Ó# mÑ3€LÜÑH¨KÔHÓH€Iô —I‘I“K (Ñ*€MÜ	ˆBˆvˆhˆ-ÔÜ	Ð%Ô'Ü	ˆVˆHÔÜ	ˆM˜-¨Ð,¨AÐ
.Ô/Ü	ÐœS Ó-Ð.¨a´°H³¨Ð>NÌsÐSY×S]ÑS]Ð^iÐjlÓSmÓOnÐNoÐozÐ
{Ô|Ü	Ð˜]˜O¨7°9°+¸ZÐ
HÔIÜ	Ð˜\˜N¨$Ð
/Ô0ð �aÒÜÐ,Ô.Ü$¤TÓ*ˆØò 	QˆAØ�Y“<Ø˜qŸu™u \°9Ó=Ñ>×EÑEÀaÈÁiÕPð	Qô # >×#7Ñ#7Ó#9Ó:ò 	>‰LˆE�5Ü�F˜5˜' ¤C¨£J <¨uÐ5Ô6Ø˜2˜A�Yò '�Ü˜	 ! �oÕ&ð'ä�5‹z˜A‹~ÜÐ)¬#¨e«*°Q©,¨°tÐ<Õ=ð	>ð �aÒÜÐhÔjô �
ÔÜÐ
Ôð$ÜÐ0Ô1Ü�‰Ü�^‰^œRŸW™WŸ\™\¬(Ð4KÓLÐMØ˜uõ	
ô 	ÐAÔBð#ÜÐ0Ô1Ü�‰Ü�^‰^œRŸW™WŸ\™\¬(Ð4MÓNÐOØ˜uõ	
ô 	Ð4Ô5ð
%ÜÐ@ÔAÜ�‰Ü�^‰^œRŸW™WŸ\™\¬(Ð4KÓLÈjÐYØ˜uõ	
ô 	ˆOÔð Hò 	1ˆð	1Ü�&˜˜
 $Ð'Ô(Ü�N‰NÜ—‘¤§¡§¡¬h¸Ó!AÐBØ Eõô �&˜˜
 %Ð(Õ)ñ	1ùò_ MøôZ ò $ÜÐ˜q˜cÐ"×#Ò#ûð$ûô ò #Üˆo˜a˜SÐ!×"Ò"ûð#ûô ò %ÜÐ ˜sÐ#×$Ñ$ûð%ûô& ò 	1Ü�&˜˜
 )¨A¨3Ð/×0Ò0ûð	1úsp   Â,$TÃTÎA T$ Ï,A U	 ÑA!U. Ò4A(VÔ$	UÔ-UÕUÕ		U+ÕU&Õ&U+Õ.	VÕ7V
Ö
VÖ	V7ÖV2Ö2V7c                 ó$  — t        j                   «       }|j                  dd«      }|j                  dd«      }|j                  dd«      }|d   r,|j                  dd«      }|dk(  rd}nX|d	k(  rd
}nPd|d   › d�}nF|j                  dd«      }|dk(  rd}n,|dv rd}n%|dk(  rd}n|dk(  rd|j                  dd«      › �}nd}|||j                  dd«      |j                  dd«      dœ}	|r|	| |<   |r
||k7  r|	| |<   |xs |}
|d   rdn|j                  d«      d   }t        |
||||j                  dd«      |j                  dd«      |j                  dd«      |j                  d«      |j                  dd«      |j                  d d«      ¬!«
       y")#u7   æ›´æ–°å�•æ�¡çŠ¶æ€�åˆ° status_map, å�Œæ—¶å†™å…¥ run_logsr&   r<   r#   rI   r  rO   r  u%   æˆ�åŠŸ +0æ�¡ (âš ï¸�é�™é»˜:é›¶è¾“å‡º)r  u+   æˆ�åŠŸ +0æ�¡ (âš ï¸�åˆ—è¡¨ç©º:æŠ“å�–å¤±è´¥)u   æˆ�åŠŸ +rK   u   æ�¡r¾   r@   rÃ   rÉ   rÄ   r“   rÅ   r”   u
   å¤±è´¥ rc=r’   r'   u   å¤±è´¥rL   r   )rJ   r   rL   r¾   r·   rW   rN   rP   )
rH   r$   rI   rJ   rK   rL   rM   rN   rO   rP   N)rg   r)   r›   rU   )r:   r  r   r&   r#   rI   Ú_flagÚ
status_strÚetrº   Ú	db_scriptÚ	db_statuss               r   r7  r7  T  s»  € ä	�‰‹€BØ�Z‰Z˜ "Ó%€FØ�:‰:�f˜bÓ!€DØ—‘˜L¨"Ó-€JàˆiÒØ—
‘
˜6 2Ó&ˆØ�HÒØ@‰JØ�iÒØF‰Jà# F¨;Ñ$7Ð#8¸Ð<‰Jà�Z‰Z˜ bÓ)ˆØ�Š?Ø!‰JØÐWÑWØ*‰JØ�>Ò!Ø'‰JØ�<ÒØ% f§j¡j°¸Ó&=Ð%>Ð?‰Jà!ˆJð ØØ—:‘:˜i¨Ó+Ø—j‘j ¨rÓ2ñ	€Eñ Ø"ˆ
�6ÑÙ�˜’Ø ˆ
�4Ñð ’˜$€IØ" 9Ò-‘°:×3CÑ3CÀCÓ3HÈÑ3K€IÜØØØØØ—*‘*˜[¨!Ó,Ø—
‘
˜9 aÓ(Ø—Z‘Z ¨Ó,Ø�Z‰Z˜ÓØ�Z‰Z˜ Ó#Ø—:‘:˜l¨AÓ.ör   Ú__main__)r<   Nr<   r   )z  )r<   N)0Ú__doc__r   rr   rñ   rg   rj   rv   Úconcurrent.futuresr  r�   ÚsocketrA   r   Úcollectionsr   ri   rí   rh   r   r.   rC   r3  r
  ÚRETRY_FAILEDr   r!   r+   r2   r;   rU   r€   r™   r¦   r©   r­   rµ   r¼   r¿   rÌ   rà   rã   rä   rÿ   r  r#  rE  r7  Ú__name__r„   r   r   ú<module>rS     s!  ðñ÷6 X× W× W× W× WÝ Ý #ð €Ø�g‰g�l‰l˜8Ð%>Ó?€Ø�g‰g�l‰l˜8Ð%6Ó7€Ø
€ØÐ Ø€Ø€ò'òò_òò?ð
 CDó4ð2 ¨ó !9òFò&ò.ò49òòò'ò1óf"ðN —w‘w—|‘| H¨fÐ6LÓMÐ òó&òT1
ðf )9ó ò@E1òP5ðn ˆzÒÙ…Fð r   