Ë
    å({j[4  ã                   ó”  — 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	m
Z
mZ dZdZdZdZdZd	Zd
Zej&                  j)                  dd«      Zej,                  j/                  ej,                  j1                  ej,                  j3                  e«      «      d«      ZdZdZdddddœZd„ Zd„ Z d„ Z!d„ Z"d„ Z#d„ Z$e%dk(  r e$«        yy)uj  
è¾¾å·žé«˜æ–°æŠ€æœ¯äº§ä¸šå›­åŒº - çŽ¯å¢ƒä¿�æŠ¤ (www.dzgxq.gov.cn æ³¨æ„�: dzgxq=è¾¾å·žé«˜æ–°é�žå¾·å·ž!, å››å·�)
æ �ç›®: æ”¿åºœä¿¡æ�¯å…¬å¼€ > çŽ¯å¢ƒä¿�æŠ¤ /xxgk-list-huanjingbaohu.html (catid=53, 257æ�¡/13é¡µ, 20æ�¡/é¡µ)
CMS: è‡ªå»º PHP (xxgk ä¿¡æ�¯å…¬å¼€ç³»ç»Ÿ, API åŠ¨æ€�åŠ è½½)
åˆ—è¡¨: POST http://www.dzgxq.gov.cn/api-ajax_list-{page}.html
      body (PHPé£Žæ ¼åº�åˆ—åŒ–!): ajax_type[]=39_xxgk&ajax_type[]=53&ajax_type[]=39&ajax_type[]=xxgk&ajax_type[]=Y-m-d&ajax_type[]=40&ajax_type[]=20&ajax_type[7][]=inputtime+DESC&ajax_type[7][]=displayorder+DESC&ajax_type[7][]=is_top+DESC&is_ds=1
      å“�åº” JSON: data[] (id/catid/title/url/inputtime/description)
è¯¦æƒ…: /xxgk-show-{id}.html
      æ ‡é¢˜ div.cont_tit > h2, æ—¥æœŸ div.msg "å�‘å¸ƒæ—¥æœŸï¼šYYYY-MM-DD", æ­£æ–‡ div.contM (å�«è¡¨æ ¼/é™„ä»¶)
ç”¨æ³•: python3 crawl_dzgxq_hjbh.py [--pages=N | N] [--sync] [--sync-only]
é    N)ÚThreadPoolExecutorÚas_completedu   è¾¾å·žé«˜æ–°åŒº-çŽ¯å¢ƒä¿�æŠ¤zhttp://www.dzgxq.gov.cnz1http://www.dzgxq.gov.cn/api-ajax_list-{page}.htmlÚ53zwww.dzgxq.gov.cnu   å››å·�z
2020-01-01ÚDB_PATHz/root/search.dbzquality_results.dbé   zÔajax_type[]=39_xxgk&ajax_type[]=53&ajax_type[]=39&ajax_type[]=xxgk&ajax_type[]=Y-m-d&ajax_type[]=40&ajax_type[]=20&ajax_type[7][]=inputtime+DESC&ajax_type[7][]=displayorder+DESC&ajax_type[7][]=is_top+DESC&is_ds=1zoMozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/120.0.0.0 Safari/537.36z!application/x-www-form-urlencodedÚXMLHttpRequestz4http://www.dzgxq.gov.cn/xxgk-list-huanjingbaohu.html)ú
User-AgentzContent-TypezX-Requested-WithÚRefererc                 ó°   — t        j                  dd| xs d«      } t        j                  dd| «      } t        j                  dd| «      j                  «       S )Nz$&middot;|&nbsp;|&#160;|\u200b|\ufeffÚ u   ^[â€¢Â·]\s*z\s+ú )ÚreÚsubÚstrip)Úts    ú%/root/gov_crawler/crawl_dzgxq_hjbh.pyÚclean_titler   .   sG   € Ü
�‰Ð6¸¸AºGÀÓD€AÜ
�‰ˆ~˜r 1Ó%€AÜ�6‰6�&˜#˜qÓ!×'Ñ'Ó)Ð)ó    c                 ó  — 	 t        j                  t        j                  | ¬«      t        t
        d¬«      }|j                  «        |j                  «       }d|vr!t        d| › dt        |«      d d › �«       g dfS t        |j                  d	«      xs d«      }g }|j                  d«      xs g D ]£  }t        |j                  d
«      xs d«      }|j                  d«      xs dj                  «       }|j                  d«      xs dj                  «       d d }|r|sŒo|j                  |||t        |j                  d«      xs d«      d d dœ«       Œ¥ ||fS # t        $ r}	t        d| › d|	› �«       g dfcY d }	~	S d }	~	ww xY w)N)Úpageé   )ÚdataÚheadersÚtimeoutr   z
  [list] Pz fail: éd   r   ÚtotalÚtitler   ÚurlÚ	inputtimeé
   ÚdescriptionéÈ   )r   r   Úpub_dater!   ú ERR: )ÚrequestsÚpostÚLIST_APIÚformatÚ	LIST_DATAÚHEADERSÚraise_for_statusÚjsonÚprintÚstrÚintÚgetr   r   ÚappendÚ	Exception)
r   ÚrÚjr   ÚitemsÚcr   r   r   Úes
             r   Ú
fetch_listr8   4   ss  € ðÜ�M‰Mœ(Ÿ/™/¨t˜/Ó4¼9ÌgÐ_aÔbˆØ	×ÑÔØ�F‰F‹HˆØ˜‰?Ü�J˜t˜f G¬C°«F°4°C¨L¨>Ð:Ô;Ø�q�5ˆLÜ�A—E‘E˜'“NÒ' aÓ(ˆØˆØ—‘�v“Ò$ "ò 	ˆAÜ §¡ g£Ò 4°"Ó5ˆEØ—5‘5˜“<Ò% 2×,Ñ,Ó.ˆCØŸ™˜{Ó+Ò1¨r×8Ñ8Ó:¸3¸BÐ?ˆIÙ¡ØØ�L‰LØØØ%Ü*¨1¯5©5°Ó+?Ò+EÀ2ÓFÀtÈÐLñ	õ ð	ð �eˆ|ÐøÜò Ü�
˜4˜&  q cÐ*Ô+Ø�1ˆu�ûðús%   ‚A9E Á<CE Å	FÅ$E>Å8FÅ>Fc           	      óò	  ‡‡— 	 t        j                  | dt        d   id¬«      }|j                  «        d|_        |j
                  }d}t        j                  d|t        j                  «      }|r/t        t        j                  d	d|j                  d
«      «      «      }|sdt        j                  d|t        j                  «      }|r=t        t        j                  dd|j                  d
«      j                  «       «      «      }d}t        j                  d|t        j                  «      }|r8t        j                  d|j                  d
«      «      }|r|j                  d«      }|s)t        j                  d|«      }|r|j                  d«      }dŠt        j                  d|t        j                  «      }|r|j                  d
«      Š‰s8t        j                  d|t        j                  «      }|r|j                  d
«      Št        j                  dd‰t        j                  t        j                   z  ¬«      Št        j                  dd‰t        j                  t        j                   z  ¬«      Šg }t        j"                  d‰«      D �]  }|j                  d
«      j                  «       t        |j                  d«      «      }
}	t        j                  d|	t        j                   «      sd|	v sd|	j%                  «       v sŒy|	j'                  d«      r|	n1|	j'                  d«      r|	nt(        |	j'                  d«      r|	nd|	z   z   Št+        ˆfd„|D «       «      rŒÓ|j-                  |
xs& |	j/                  d«      d   j/                  d«      d   ‰d œ«       �Œ d!„ }t        j                  d"|‰«      Št        j                  d#|‰«      Št        j                  d$d%‰«      Št        j                  d&d‰«      Št        j                  d'd‰t        j                  t        j                   z  ¬«      Š|rDt+        ˆfd(„|D «       «      }|s.dj1                  d)„ |D «       «      }‰j3                  «       d*z   |z   Št5        t        j                  d	d‰«      j                  «       «      }d+‰v }d,‰v xs d-‰v }|d.k  r|s|s	|s|d|g d/œS |‰||d/œS # t        $ r}t        d| › d|› �«       Y d }~y d }~ww xY w)0Nr	   r   )r   r   zutf-8z  [detail] r$   r   z,<div class="cont_tit">\s*<h2[^>]*>(.*?)</h2>ú<[^>]+>é   z<title>(.*?)</title>z^[^-]+-z<div class="msg">(.*?)</div>z(\d{4})-(\d{2})-(\d{2})r   z1<div class="contM"[^>]*>(.*?)</div>\s*(?:</div>)?z<div class="contM"[^>]*>(.*)z<script[^>]*>.*?</script>)Úflagsz<style[^>]*>.*?</style>z,<a[^>]*href="([^"]+)"[^>]*>([^<]{0,120})</a>é   z0\.(pdf|doc|docx|xls|xlsx|zip|rar|wps|7z|et|dps)$z/uploadfile/z/attachment/Úhttpú//ú/c              3   ó.   •K  — | ]  }|d    ‰k(  –— Œ y­w©r   N© )Ú.0ÚaÚabs_urls     €r   ú	<genexpr>zparse_detail.<locals>.<genexpr>€   s   øè ø€ Ò9¨q�q˜‘x 7Õ*Ñ9ùs   ƒéÿÿÿÿú?)Únamer   c                 óÄ  — | j                  d«      j                  «       }|j                  d«      s"|j                  d«      s|j                  d«      r| j                  d«      S |j                  d«      r$| j                  d«      j                  |d|z   «      S | j                  d«      j                  ||j                  d«      rt        |z   «      S t        dz   |z   «      S )	Nr;   r>   Ú
javascriptú#r   r?   zhttp:r@   )Úgroupr   Ú
startswithÚreplaceÚBASE_URL)ÚmÚhrefs     r   Úabs_linkzparse_detail.<locals>.abs_link„   s³   € Ø�w‰w�q‹z×ÑÓ!ˆØ�?‰?˜6Ô" d§o¡o°lÔ&CÀtÇÁÐWZÔG[Ø—7‘7˜1“:ÐØ�?‰?˜4Ô Ø—7‘7˜1“:×%Ñ% d¨G°d©NÓ;Ð;Ø�w‰w�q‹z×!Ñ! $¸4¿?¹?È3Ô;O¬°4©ÓkÐkÔU]Ð`cÑUcÐfjÑUjÓkÐkr   zhref="([^"]+)"zsrc="([^"]+)"z<p[^>]*>z<p>z
<p>\s*</p>zI<div[^>]*class="[^"]*(share|ewm|qrcode|print|bshare)[^"]*"[^>]*>.*?</div>c              3   ó,   •K  — | ]  }|d    ‰v –— Œ y­wrB   rC   )rD   rE   Ú	body_htmls     €r   rG   zparse_detail.<locals>.<genexpr>•   s   øè ø€ Ò:°�a˜‘h )Ô+Ñ:ùs   ƒc              3   ó`   K  — | ]&  }d |d   › dt        j                  |d   «      › d�–— Œ( y­w)z<p><a href="r   z">rJ   z</a></p>N)Úhtml_modÚescape)rD   rE   s     r   rG   zparse_detail.<locals>.<genexpr>—   s3   è ø€ ÒmÐcd ¨a°©h¨Z°r¼(¿/¹/È!ÈFÉ)Ó:TÐ9UÐU]Ô^Ñmùs   ‚,.ú
z<imgz<iframeÚvideoé   ©r   Úcontentr#   Úattachments)r%   r0   r*   r+   ÚencodingÚtextr2   r-   r   ÚsearchÚDOTALLr   r   rN   r   ÚSÚIÚfinditerÚlowerrO   rQ   Úanyr1   ÚsplitÚjoinÚrstripÚlen)r   r3   Ú	html_textr7   r   rR   r#   ÚdÚattsrS   rJ   rT   Úhas_attÚatt_htmlÚtext_lenÚhas_imgÚ	has_videorF   rV   s                    @@r   Úparse_detailru   P   sq  ù€ ðÜ�L‰L˜ |´W¸\Ñ5JÐ&KÐUWÔXˆØ	×ÑÔØˆŒ
Ø—F‘Fˆ	ð
 €EÜ
�	‰	ÐAÀ9ÌbÏiÉiÓX€AÙÜœBŸF™F :¨r°1·7±7¸1³:Ó>Ó?ˆÙÜ�I‰IÐ-¨y¼"¿)¹)ÓDˆÙÜ¤§¡ z°2°q·w±w¸q³z×7GÑ7GÓ7IÓ JÓKˆEà€HÜ
�	‰	Ð1°9¼b¿i¹iÓH€AÙÜ�I‰IÐ0°!·'±'¸!³*Ó=ˆÙØ—w‘w˜q“zˆHÙÜ�I‰IÐ0°)Ó<ˆÙØ—w‘w˜q“zˆHà€IÜ
�	‰	ÐFÈ	ÔSU×S\ÑS\Ó]€AÙØ—G‘G˜A“Jˆ	ÙÜ�I‰IÐ5°yÄ"Ç)Á)ÓLˆÙØŸ™ ›
ˆIä—‘Ð3°R¸Ì"Ï$É$ÔQS×QUÑQUÉ+ÔV€IÜ—‘Ð1°2°yÌÏÉÌrÏtÉtÉÔT€Ið €DÜ�[‰[ÐHÈ)ÓTó aˆØ—W‘W˜Q“Z×%Ñ%Ó'¬°Q·W±W¸Q³ZÓ)@ˆdˆÜ�9‰9ÐHÈ$ÔPR×PTÑPTÔUÐYgÐkoÑYoð  tBð  FJ÷  FPñ  FPó  FRò  tRØ"Ÿo™o¨fÔ5‘dÀDÇOÁOÐTXÔDY¹DÔ_gÐsw÷  tCñ  tCð  DGô  tHÑkoð  NQð  TXñ  NXñ  `YˆGÜÓ9°DÔ9Õ9Ø—‘ TÒ%N¨T¯Z©Z¸«_¸RÑ-@×-FÑ-FÀsÓ-KÈAÑ-NÐW^Ñ_Ö`ðaòlô —‘Ð(¨(°IÓ>€IÜ—‘Ð'¨°9Ó=€IÜ—‘�{ E¨9Ó5€IÜ—‘�} b¨)Ó4€Iô —‘ÐcÐegÐirÔz|×z~Ñz~ô  BD÷  BFñ  BFñ  {Fô  G€IáÜÓ:°TÔ:Ó:ˆÙØ—w‘wÑmÐhlÔmÓmˆHØ!×(Ñ(Ó*¨TÑ1°HÑ<ˆIä”2—6‘6˜* b¨)Ó4×:Ñ:Ó<Ó=€HØ˜	Ð!€GØ˜YÐ&Ò>¨'°YÐ*>€IØ�!‚|™G©I¹dØ¨2¸8ÐTVÑWÐWØ y¸hÐW[Ñ\Ð\øôS ò Ü�˜C˜5  q cÐ*Ô+Üûðús   „AS Ó	S6ÓS1Ó1S6c                 ó0  — t        j                  t        «      }|j                  d«       |j	                  «       }|j                  d«       d}| D ]Î  }	 |j                  d|j                  dd«      |j                  dd«      |j                  dd«      |j                  d	d«      |j                  d
d«      |j                  dd«      |j                  dd«      |j                  dd«      |j                  dd«      |j                  dd«      f
«       ||j                  z  }ŒÐ |j                  «        |j                  «        t        d|› dt        | «      |z
  › �«       |S # t        $ r,}t        d|j                  dd«      › d|› �«       Y d }~�Œ@d }~ww xY w)NúPRAGMA busy_timeout=300000aî  CREATE TABLE IF NOT EXISTS crawl_results (
        id INTEGER PRIMARY KEY AUTOINCREMENT,
        site_id INTEGER DEFAULT 0,
        title TEXT, url TEXT, content TEXT,
        publish_date TEXT, summary TEXT,
        domain TEXT, category TEXT DEFAULT '',
        content_hash TEXT, crawl_time TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
        industry TEXT DEFAULT '', group_name TEXT DEFAULT '',
        script_name TEXT DEFAULT '', attachments TEXT DEFAULT '[]',
        UNIQUE(domain, url)
    )r   z¥INSERT OR IGNORE INTO crawl_results (domain, title, url, content, publish_date, summary, industry, group_name, script_name, attachments) VALUES (?,?,?,?,?,?,?,?,?,?)Údomainr   r   r   r^   r#   ÚsummaryÚindustryÚ
group_nameÚscript_namer_   ú[]z  [push] ERR ú: z[push_local] new=z skip=)Úsqlite3ÚconnectÚ
QUALITY_DBÚexecuteÚcursorr0   Úrowcountr2   r-   ÚcommitÚcloserl   )Úrecordsr|   ÚconnÚcurÚn_newr3   r7   s          r   Ú
push_localr‹   ¢   sp  € Ü�?‰?œ:Ó&€DØ‡L�LÐ-Ô.Ø
�+‰+‹-€CØ‡K�Kð 
	ô 

ð €EØò :ˆð
	:Ø�K‰Kð xØ—‘�x Ó$ a§e¡e¨G°RÓ&8¸!¿%¹%ÀÀrÓ:JØ—‘�y "Ó% q§u¡u¨Z¸Ó'<¸a¿e¹eÀIÈrÓ>RØ—‘�z 2Ó&¨¯©¨l¸BÓ(?Ø—‘�} bÓ)¨1¯5©5°ÀÓ+EðGôð �S—\‘\Ñ!‰Eð:ð 	‡K�K„MØ‡J�J„LÜ	Ð˜e˜W F¬3¨w«<¸Ñ+=Ð*>Ð
?Ô@Ø€Løô ò 	:Ü�M !§%¡%¨¨b£/Ð!2°"°Q°CÐ8×9Ò9ûð	:ús   ÁCE Å 	FÅ)!FÆFc                  ó¼  — 	 t        j                  t        «      } | j                  d«       | j                  dt        f«      j                  «       }| j                  «        |st        d«       y t        j                  t        d¬«      }|j                  d«       |j                  d«       dx}}	 |D ]Â  }|\	  }}}	}
}}}}}|j                  d	|f«      }|j                  «       }	 |rF|j                  d
||	xs dd d |
xs d|xs dd d |xs d|xs d|xs d|xs d|d   f	«       |dz  }nH|j                  d|||	xs dd d |
xs d|xs dd d |xs d|xs d|xs d|xs dt        |f«       |dz  }ŒÄ |j                  «        |j                  dt        f«       |j                  «        |j                  dt        f«      j                  «       d   }|j                  «        t        d|› d|› d|› d�«       y # t        $ r}t        d|› �«       Y d }~y d }~ww xY w# t        $ r}t        d|› d|› �«       Y d }~�ŒŽd }~ww xY w# |j                  «        w xY w)Nrw   z�SELECT title, url, content, publish_date, summary, industry, group_name, script_name, attachments FROM crawl_results WHERE domain=? ORDER BY idz[sync] local read ERR: u   [sync] æœ¬åœ°æ²¡æœ‰æ•°æ�®i,  )r   zPRAGMA journal_mode=WALr   z'SELECT id FROM gov_raw WHERE page_url=?zƒUPDATE gov_raw SET title=?, content=?, publish_date=?, summary=?, industry=?, group_name=?, script_name=?, attachments=? WHERE id=?r   i ¡ r}   r;   z«INSERT INTO gov_raw (title, page_url, content, publish_date, summary, industry, group_name, script_name, attachments, site_name, source_url) VALUES (?,?,?,?,?,?,?,?,?,?,?)z  [sync] ERR r~   z±INSERT INTO gov_search(rowid,title,site_name,summary) SELECT r.id,r.title,r.site_name,r.summary FROM gov_raw r WHERE r.id NOT IN (SELECT rowid FROM gov_search) AND r.site_name=?z.SELECT COUNT(*) FROM gov_raw WHERE site_name=?z[sync] OK updated=z
 inserted=u    DBå…±u   æ�¡)r   r€   r�   r‚   ÚDOMAINÚfetchallr†   r2   r-   r   ÚfetchoneÚ	SITE_NAMEr…   )rˆ   Úrowsr7   ÚdstÚupdÚinsr3   r   r   r^   r#   ry   ÚindÚgrpÚsnÚattr‰   Úrowr   s                      r   Úsync_to_serverrš   Ä   s‘  € ð
Ü�‰œzÓ*ˆØ�‰Ð1Ô2Ø�|‰|ð ^ÜˆIó
÷ ‰(‹*ð 	ð 	�
‰
Œñ ÜÐ)Ô*ØÜ
�/‰/œ'¨3Ô
/€CØ‡K�KÐ)Ô*Ø‡K�KÐ,Ô-Ø€M€Cˆ#ðØò 	2ˆAØHIÑEˆE�3˜ ¨7°C¸¸bÀ#Ø—+‘+ÐGÈ#ÈÓPˆCØ—,‘,“.ˆCð2ÙØ—K‘Kð ^Ø ¢¨B°°Ð 8¸(º.ÀbÈ7Ê=ÐVXÐZ^Ð[^ÐJ_Øš  C¢I¨2¨rªx°R¸ºÀÀcÈ!ÁfðNôOð ˜1‘H‘Cà—K‘Kð FØ  g¢m°°W°fÐ%=¸xº~È2ÐPWÒP]Ð[]Ð_cÐ`cÐOdØš  C¢I¨2¨rªx°R¸ºÀÄiÐQTðVôWð ˜1‘H�Cøð!	2ð& 	�
‰
ŒØ�‰ðQô ˆLô		ð
 	�
‰
ŒØ—‘ÐLÌyÈlÓ[×dÑdÓfÐghÑiˆà�	‰	ŒÜ	Ð˜s˜e :¨c¨U°&¸¸¸sÐ
CÕDøôQ ò ÜÐ'¨ sÐ+Ô,Üûðûô8 ò 2Ü˜ c U¨"¨Q¨CÐ0×1Ò1ûð2ûð 	�	‰	�úsP   ‚AG= Â14I	 Ã&BH!Å6A!I	 Ç=	HÈHÈHÈ!	IÈ*IÈ;I	 ÉIÉI	 É	Ic                  óÆ  — dt         j                  v } d }dt         j                  v }t         j                  dd  D ]O  }|j                  d«      r 	 t        |j	                  dd«      d   «      }Œ4|j                  «       sŒEt        |«      }ŒQ t        d|› d| › �«       | rt        «        y g }d}t        dd	«      D ]b  }|r||kD  r nYt        |«      \  }}t        d
|› dt        |«      › d|› d�«       |s n)|j                  |«       |�ŒP|sŒSt        |«      |k\  sŒb n t        dt        |«      › d|› d�«       g }t        t        ¬«      5 }	|D �
ci c]  }
|	j                  t         |
d   «      |
“Œ }}
d}t#        |«      D �]R  }||   }
|j%                  «       }|dz  }|dz  dk(  rt        d|› dt        |«      › d�d¬«       |€!t        d|
d   d d › �«       |
d   d|
d   g dœ}|d   r'|d   t&        k  rt        d|d   › d|d   d d › �«       Œ’t(        t*        |d   xs |
d   |
d   |d   |d   xs |
d   t-        j.                  d d|d   «      d d! xs |
j1                  d"d«      dt2        t4        j6                  j9                  t         j                  d   «      |d#   rt;        j<                  |d#   d$¬%«      nd&d'œ}|j?                  |«       �ŒU 	 d d d «       t        d(t        |«      › �«       |rHtA        |t4        j6                  j9                  t         j                  d   «      «       |rt        «        y y y # t
        $ r Y �Œw xY wc c}
w # 1 sw Y   Œ€xY w))Nz--sync-onlyz--syncr;   z--pages=ú=z[DZGXQ] max_pages=z sync_only=r   i'  z[list] Pr~   u    æ�¡ (total=ú)u   [total] åˆ—è¡¨å…± )Úmax_workersr   é2   u	     è¯¦æƒ… r@   z...T)Úflushz	  [fail] r   é(   r   r#   r]   z  [cutoff] r   r^   r:   r"   r!   r_   F)Úensure_asciir}   )rx   Ú	site_namer   r   r^   r#   ry   rz   r{   r|   r_   z[total] valid=)!ÚsysÚargvrO   r/   ri   Ú
ValueErrorÚisdigitr-   rš   Úranger8   rl   Úextendr   ÚMAX_WORKERSÚsubmitru   r   ÚresultÚCUTOFFr�   r�   r   r   r0   ÚGROUPÚosÚpathÚbasenamer,   Údumpsr1   r‹   )Ú	sync_onlyÚ	max_pagesÚdo_syncrE   Ú	all_itemsr   Úpgr5   ÚvalidÚexecutorÚitÚfut_mapÚdoneÚfutÚdetÚrecs                   r   ÚmainrÀ   ø   sv  € Ø¤§¡Ð)€IØ€IØœ#Ÿ(™(Ð"€GÜ�X‰X�a�bˆ\ò ˆØ�<‰<˜
Ô#ðÜ §¡¨¨Q£°Ñ 2Ó3‘	ð �Y‰Y�[Ü˜A›‰Iðô 
Ð˜y˜k¨°Y°KÐ
@ÔAÙÜÔØà€IØ€EÜ�A�u‹oò 	ˆÙ˜˜išÙÜ! "“~‰ˆˆuÜ�˜˜˜Bœs 5›z˜l¨,°u°g¸QÐ?Ô@ÙÙØ×Ñ˜ÔØÑ¢¬3¨y«>¸UÓ+BÙð	ô 
Ðœs 9›~Ð.¨l¸5¸'ÀÐ
CÔDà€EÜ	¬Ô	4ð ¸ØJSÖTÀB�8—?‘?¤<°°E±Ó;¸RÑ?ÐTˆÐTØˆÜ Ó(ó 	ˆCØ˜‘ˆBØ—*‘*“,ˆCØ�A‰IˆDØ�b‰y˜AŠ~Ü˜	 $  q¬¨Y«Ð(8¸Ð<ÀDÕIØˆ{Ü˜	 " W¡+¨c¨rÐ"2Ð!3Ð4Ô5Ø " 7¡¸ÈÈ:ÉÐgiÑj�Ø�:Š 3 z¡?´VÒ#;Ü˜ C¨
¡OÐ#4°A°c¸'±lÀ3ÀBÐ6GÐ5HÐIÔJØä Ü&Ø˜W™Ò4¨¨G©Ø˜%‘yØ˜y™>Ø 
™OÒ=¨r°*©~ÜŸ6™6 *¨b°#°i±.ÓAÀ$À3ÐGÒdÈ2Ï6É6ÐR_ÐacÓKdØÜ#Ü!Ÿw™w×/Ñ/´·±¸±Ó<ØUXÐYfÒUgœtŸz™z¨#¨mÑ*<È5ÕQÐmqñˆCð �L‰L˜Öñ3	÷ô: 
ˆNœ3˜u›:˜,Ð
'Ô(ÙÜ�5œ"Ÿ'™'×*Ñ*¬3¯8©8°A©;Ó7Ô8ÙÜÕð ð øôm ò Úðüò2 U÷ð ús1   ÁMÅMÅ!MÅ2E%MÍ	MÍMÍMÍM Ú__main__)&Ú__doc__r   r¤   r¯   r,   ÚhtmlrX   r%   r   Úconcurrent.futuresr   r   r�   rQ   r'   ÚCATA_IDr�   r®   r­   Úenvironr0   r   r°   rj   ÚdirnameÚabspathÚ__file__r�   rª   r)   r*   r   r8   ru   r‹   rš   rÀ   Ú__name__rC   r   r   ú<module>rË      sç   ðñ
ó 
Û 
Û 	Û Û Û Û ß ?à*€	Ø$€Ø>€Ø
€Ø	€Ø€Ø	€Ø
�*‰*�.‰.˜Ð$5Ó
6€Ø�W‰W�\‰\˜"Ÿ'™'Ÿ/™/¨"¯'©'¯/©/¸(Ó*CÓDÐFZÓ[€
Ø€ð3€	ð
 DØ7Ø(ØEñ	€ò*òò8O]òdòD1EòhAðH ˆzÒÙ…Fð r   