Ë
    ÷g÷j5Y  ã                  ó¸  — 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Z	ddl
mZ ddlmZ ddlmZmZ  ee«      j%                  «       j&                  d   Z ee«      ej,                  vr"ej,                  j/                  d ee«      «       ddlmZmZmZmZ dd	lmZmZm Z m!Z! dd
l"m#Z# dZ$dddœe¥Z%i Z&de'd<    e(«       Z)de'd<   i Z*de'd<   i Z+de'd<    e(«       Z,de'd<   d-d„Z-d.d„Z.d/d„Z/d.d„Z0d.d„Z1d0d1d„Z2d0d2d„Z3d0d3d„Z4d4d5d „Z5d6d!„Z6d0d7d"„Z7d8d9d#„Z8d:d$„Z9	 d;	 	 	 	 	 	 	 	 	 	 	 d<d%„Z:	 	 	 	 	 	 	 	 	 	 	 	 d=d&„Z;d0d>d'„Z<d?d@d(„Z=d.d)„Z>dAd*„Z? G d+„ d,e«      Z@y)Bz Vercel fake debate API for guided demos (flock-cameras, thc-legalization).

In-memory only. No GitHub, no Spot, no real drain. One board per topic per process.
é    )ÚannotationsN)ÚBaseHTTPRequestHandler)ÚPath)Úparse_qsÚurlparseé   )ÚDEFAULT_TOPICÚget_demoÚ	is_guidedÚknown_topics)ÚREVIEW_TITLESÚREVIEW_TOPICSÚapply_payloadÚload_page_payload)Únormalize_urlz Make your opinion finally heard.z"Should cities use camera networks?z#Should adult-use cannabis be legal?)úflock-camerasúthc-legalizationzdict[str, dict[str, str]]Ú_PT_POSITIONSzset[str]Ú
_PT_SEEDEDzdict[str, dict]Ú_BOARDSzdict[str, int]Ú	_NEXT_IDSÚ	_VISITORSc                óP   — t        j                  | d¬«      j                  dd«      S )NF)ÚquoteÚ
z<br>)ÚhtmlÚescapeÚreplace)Útexts    ú/app/api/demo.pyÚ_escaper!   -   s    € Ü�;‰;�t 5Ô)×1Ñ1°$¸Ó?Ð?ó    c                ó6   — | ddg g g t        «       ddd ddddœdœS )NFr   Ú ©ÚurlÚ
normalizedÚtitle)ÚtopicÚexistsÚstepÚcommentsÚkeysÚpairsÚsuggestion_sourcesÚscript_completeÚlast_noticeÚpendingÚpage)Úset)r)   s    r    Ú_empty_boardr5   1   s6   € àØØØØØÜ!›eØ ØØØ¨"°rÑ:ñð r"   c                óò   — | t         vs| t        v ry t        | «      }|€y t        j	                  | i «      }t        |||«       t        j                  | «       t        | «      }t        |dd «      �||_	        y y )NÚ	POSITIONS)
r   r   r   r   Ú
setdefaultr   Úaddr
   Úgetattrr7   )r)   ÚstateÚpayloadÚ	positionsÚdemos        r    Ú_ensure_pt_seedr?   A   st   € Ø”MÑ! U¬jÑ%8ØÜ Ó&€GØ€ØÜ×(Ñ(¨°Ó3€IÜ�%˜ )Ô,Ü‡N�N�5Ôä�E‹?€DÜˆt�[ $Ó'Ð3Ø"ˆ�ð 4r"   c                ó¼   — | t         vr(t        | «      t         | <   t        j                  | d«       t         |    }|j                  dddddœ«       t	        | |«       |S )Nr   r3   r$   r%   )r   r5   r   r8   r?   )r)   r;   s     r    ÚboardrA   P   sW   € Ø”GÑÜ% eÓ,Œ�‰Ü×Ñ˜U AÔ&Ü�E‰N€EØ	×Ñ�V R°rÀBÑGÔHÜ�E˜5Ô!Ø€Lr"   c                ón  — t         j                  | «      xs i }t        |j                  d«      xs i «      }t        | «      t         | <   |j                  d«      s|j                  d«      r|t         |    d<   dt        | <   t
        j                  | «       t        j                  | d «       t        | «      S )Nr3   r&   r'   r   )
r   ÚgetÚdictr5   r   r   Údiscardr   ÚpoprA   )r)   Úpreviousr3   s      r    Úreset_boardrH   Z   s‘   € Ü�{‰{˜5Ó!Ò' R€HÜ�—‘˜VÓ$Ò*¨Ó+€DÜ! %Ó(„GˆE�NØ‡x�x�„˜$Ÿ(™( <Ô0Ø!%Œ�‰�vÑØ„IˆeÑÜ×Ñ�uÔÜ×Ñ�e˜TÔ"Ü�‹<Ðr"   c                óH  — | xs dj                  «       }|r9	 t        t        j                  |«      «      }t        j                  |«       |ddœS t        t        j                  «       «      }t        j                  |«       |ddœS # t        $ r}t        d«      |‚d}~ww xY w)zKMint or validate a visitor UUID. Server is the source of truth for new IDs.r$   F)ÚvisitorÚcreatedzvisitor must be a UUIDNT)ÚstripÚstrÚuuidlibÚUUIDr   r9   Ú
ValueErrorÚuuid4)rJ   ÚrawÚparsedÚexcÚminteds        r    ÚidentifyrV   f   s’   € àŠ=�b×
Ñ
Ó
!€CÙ
ð	@ÜœŸ™ cÓ*Ó+ˆFÜ�M‰M˜&Ô!Ø%°%Ñ8Ð8ô ”—‘“Ó!€FÜ‡M�M�&ÔØ¨$Ñ/Ð/øô	 ò 	@ÜÐ5Ó6¸CÐ?ûð	@ús   ˜7B Â	B!ÂBÂB!c                óò  — |xs | }	 d}d}d|v rIt        |«      }|j                  xs dj                  «       j                  d«      }|j                  xs d}nR| j                  dd«      }t        |«      dkD  r|d   n| }t        |«      dkD  rd|d   j                  dd«      d   z   nd}|d	vr|j                  d«      nd}||z   }|d d
 t        |«      d
kD  rdz   S dz   S # t        $ r | xs dd d
 cY S w xY w)Nr$   z://zwww.Ú/é   r   Ú?r   )r$   rX   é@   u   â€¦z	This page)	r   ÚhostnameÚlowerÚremoveprefixÚpathnameÚsplitÚlenÚrstripÚ	Exception)ÚnormÚhrefrR   ÚhostÚpathÚpartsÚbitsÚlabels           r    Ú_page_titlerk   u   s  € Ø
Š,�$€Cð*ØˆØˆØ�C‰<Ü˜S“MˆEØ—N‘NÒ( b×/Ñ/Ó1×>Ñ>¸vÓFˆDØ—>‘>Ò' R‰Dð —:‘:˜c 1Ó%ˆDÜ! $›i¨!šm�4˜’7°ˆDÜ58¸³YÀ²]�3˜˜a™Ÿ™ s¨AÓ.¨qÑ1Ò1ÈˆDØ#'¨yÑ#8ˆt�{‰{˜3Ô¸bˆØ�t‘ˆØ�S�bˆz¤c¨%£j°2¢o˜UÑ>Ð>¸2Ñ>Ð>øÜò *ØÒ#˜ S bÐ)Ò)ð*ús   ˆCC! ÃC! Ã!C6Ã5C6c                óB   — | › d|› �j                  «       }d|v ryd|v ryy )NÚ r   r   )r]   )r&   r'   Úhays      r    Ú_detect_guidedro   Š   s4   € ØˆE��:�,Ð
×
%Ñ
%Ó
'€CØ˜#ÑØØ˜SÑ Ø!Ør"   c                óÌ  — t        |«      }| xs dj                  «       }|xs dj                  «       }t        ||«      }|r^t        |«      }||t        j                  ||«      dœ|d<   |d   |d   |d||t        j                  ||«      |d   t        ||d   «      dœ	S |}|s3|r1	 |j                  d	«      s|j                  d
«      rt        |«      }nd}|sd}dt        j                  |j                  d«      «      j                  «       dd z   }	t        ||«      }
t        |	«      }|||
dœ|d<   |d   |d   |	d|||
|d   t        |	|d   «      dœ	S # t        $ r d}Y Œ‹w xY w)zBMap a tab URL to a server topic id. Guided demos keep fixed slugs.r$   r%   r3   rJ   rK   Tr*   )	rJ   Úvisitor_createdr)   Úguidedr&   r'   r(   r*   Úviewzhttp://zhttps://zlocal/unparsed/zlocal/new-tab/zu-zutf-8Né   F)rV   rL   ro   rA   ÚGUIDED_TITLESrC   Ú
build_viewÚ
startswithr   rc   ÚhashlibÚsha256ÚencodeÚ	hexdigestrk   )r&   r'   rJ   ÚidentrR   Únorm_inrr   r;   rd   r)   r(   s              r    Úresolve_pager~   “   sŸ  € ä�WÓ€EØŠ9�"×
Ñ
Ó
€CØÒ˜R×&Ñ&Ó(€GÜ˜C Ó)€FÙÜ�f“ˆàØ Ü"×&Ñ& v¨vÓ6ñ
ˆˆf‰ð ˜YÑ'Ø$ YÑ/ØØØØ Ü"×&Ñ& v¨vÓ6Ø˜H‘oÜ˜v u¨YÑ'7Ó8ñ

ð 
	
ð €DÙ‘Cð	%Ø�~‰~˜iÔ(¨C¯N©N¸:Ô,FÜ$ SÓ)‘à(�ñ Øˆà”7—>‘> $§+¡+¨gÓ"6Ó7×AÑAÓCÀCÀRÐHÑH€EÜ˜˜cÓ"€EÜ�%‹L€EØ¨t¸eÑD€Eˆ&�Mà˜Ñ#Ø  Ñ+ØØØØØØ˜‘/Ü˜5 %¨	Ñ"2Ó3ñ
ð 
øô ò 	%Ø$ŠDð	%ús   Â'0E ÅE#Å"E#c                ó:  — g }t        «       }t        | d   «      D ]}  }|j                  j                  |«      }|sŒ!|d   }|| d   v s||v rŒ2|j	                  |«       |j                  ||j                  d«      xs d|j                  d«      xs ddœ«       Œ |S )Nr/   Úkeyr-   Úcitationr$   Únote)r€   r�   r‚   )r4   ÚsortedÚSUGGESTIONSrC   r9   Úappend)r;   r>   ÚrowsÚseenÚsourceÚinfor€   s          r    Ú_suggestion_rowsrŠ   É   s¥   € Ø€DÜ‹5€DÜ˜Ð3Ñ4Ö5ˆØ×Ñ×#Ñ# FÓ+ˆÙØØ�5‰kˆØ�%˜‘-Ñ 3¨$¡;ØØ�‰�ŒØ�‰àØ ŸH™H ZÓ0Ò6°BØŸ™ Ó(Ò.¨Bñõ	
ð 6ð €Kr"   c                ó(  — t        | j                  d«      xs g «      }| d   | d   | j                  d«      xs dt        | d   «      | d   | d   ||r|n|gdt        |«      xr | j                  d«      |k(  t        | j                  d	«      «      d
œS )Nr-   ÚidÚauthor_nameÚauthor_uuidr$   ÚbodyÚstartingr   Úinjected)rŒ   ÚauthorrŽ   r   r   r�   r€   r-   ÚtallyÚminer‘   )ÚlistrC   r!   Úbool)ÚcommentÚsection_keyrJ   r-   s       r    Ú_comment_publicr™   Þ   s™   € Ü�—‘˜FÓ#Ò) rÓ*€Dà�d‰mØ˜-Ñ(Ø—{‘{ =Ó1Ò7°RÜ˜ ™Ó(Ø˜‘Ø˜JÑ'ØÙ‘ ; -ØÜ�W“ÒG '§+¡+¨mÓ"<ÀÑ"GÜ˜Ÿ™ ZÓ0Ó1ñð r"   c                ó°  — t        | «      }t        | «      }|j                  }|j                  d«      xs i }|xs ddddœ}|d   s¬| ddt	        |«      dg g i g g ||j                  d«      xs d|j                  d«      xs d|j                  d«      xs t
        j                  | d«      d	œt        | «      d|d
   t        |«      |d   |j                  d«      xs d|j                  d«      dœdœS i }t        |d   «      }	d}
|d   D ]O  }|j                  d«      sŒ|j                  d«      xs dg}|D ]   }|dk(  rd}
Œ||	vsŒ|	j                  |«       Œ" ŒQ |
rd|	vr|	j                  d«       t        j                  | «      xs |j                  }|	D ]‡  }g }|d   D ]J  }|j                  d«      sŒ|j                  d«      xs g }||v sŒ/|j                  t        |||«      «       ŒL |j                  |d«      }||dk(  |rt        |«      ndd|dddddœ	||<   Œ‰ |j                  d«      }|rbd|vrddddg dddddœ	|d<   |d   D ]G  }|d   |k(  sŒ|j                  d«      rŒ|d   d   j                  t        i |¥dgddœ¥d|«      «       ŒI g }|j                  d«      r|j                  dddœ«       i d| “dd“d||v r|nd“dt	        |«      xr ||v“d|d   rt        nd“d |d   D �cg c]
  }|dk7  sŒ	|‘Œ c}“d!|d!   D �cg c]  }t        |«      ‘Œ c}“d"|“d#t        ||«      “d$|“d%|“d|j                  d«      xs d|j                  d«      xs d|j                  d«      xs t
        j                  | d«      d	œ“d&t        | «      “d'd“d|d
   t        |«      |d   |j                  d«      xs d|j                  d«      |d
   t        |«      k  r|j                  d«      s||d
      d(   d)   nd|d
   t        |«      k  r|j                  d«      s||d
      d*   ndd+œ“d,|j                  d«      xs d“S c c}w c c}w )-Nr3   r$   F)ÚuuidÚnameÚchosenr*   r&   r'   r(   r%   r+   r0   r1   r2   )r+   ÚtotalÚcompleteÚnoticer2   )r)   r*   ÚfocusÚmissing_focusÚfiling_lineÚexistingr.   ÚsectionsÚsuggestionsÚnoticesrJ   r3   rr   rK   r>   r-   r,   ÚplacedÚuncategorizedTr   )	r€   r©   Úposition_htmlÚquestions_htmlr,   r“   r”   Útopic_tallyÚ
topic_minerŒ   )r-   r�   Úbatchr>   )ÚsectionÚkindr)   r¡   r¢   r£   r¤   r.   r¥   r¦   r§   rJ   rr   rK   r’   rœ   r�   )r+   rž   rŸ   r    r2   Únext_authorÚ	next_bodyÚbatch_notice)r
   rA   ÚSCRIPTrC   r–   ru   r   ra   r•   r…   r   r7   r™   r!   ÚFILINGrŠ   )r)   rJ   r¡   r>   r;   Úscriptr3   Úvisitor_infor¥   Ú	key_orderÚ	has_uncatr—   Úplacesr€   r=   r,   ÚpositionÚ
pending_idr§   Úpairs                       r    rv   rv   ï   s7  € Ü�E‹?€DÜ�%‹L€EØ�[‰[€FØ�9‰9�VÓÒ" €DØ#šM r°2ÀÑG€LØ�Š?àØØÜ! %›[ØØØØØØØ#à—x‘x “Ò,¨"Ø"Ÿh™h |Ó4Ò:¸ØŸ™ 'Ó*ÒJ¬m×.?Ñ.?ÀÀrÓ.Jñô
   Ó&Øà˜f™Ü˜V›Ø!Ð"3Ñ4ØŸ)™) MÓ2Ò8°bØ Ÿ9™9 YÓ/ññ'
ð 	
ð8 !#€HÜ�U˜6‘]Ó#€IØ€IØ˜Ô$ˆØ�{‰{˜8Ô$ØØ—‘˜VÓ$Ò9¨Ð(9ˆÛˆCØ�oÒ%Ø ‘	Ø˜IÒ%Ø× Ñ  Õ%ñ	 ð	 %ñ �_¨IÑ5Ø×Ñ˜Ô)ä×!Ñ! %Ó(Ò:¨D¯N©N€IÛˆØˆØ˜ZÔ(ˆGØ—;‘;˜xÔ(ØØ—[‘[ Ó(Ò.¨BˆFØ�fŠ}Ø—‘¤°¸¸gÓ FÕGð )ð —=‘=  bÓ)ˆàØ  OÑ3Ù2:œW XÔ.ÀØ Ø ØØØØñ

ˆ�Šð ð* —‘˜9Ó%€JÙØ (Ñ*à&Ø!%Ø!#Ø"$ØØØØ Ø#ñ
)ˆH�_Ñ%ð ˜ZÔ(ˆGØ�t‰} 
Ó*°7·;±;¸xÕ3HØ˜Ñ)¨*Ñ5×<Ñ<Ü#Ø[˜7Ð[¨_Ð,=È?Ò[Ø'Øóõð )ð €GØ‡y�y�ÔØ�‰ 7°FÑ;Ô<ð%Ø�ð%à�$ð%ð 	˜% 8Ñ+‘°ð%ð 	œ˜e›Ò>¨°hÐ)>ð	%ð
 	  zÒ!2•v¸ð%ð 	 E¨&¢MÓL¡M˜S°S¸OÓ5K’S MÑLð%ð 	¨¨wªÓ8© ”$�t•*¨Ñ8ð%ð 	�Hð%ð 	Ô'¨¨tÓ4ð%ð 	�7ð%ð 	�<ð%ð 	Ø—8‘8˜E“?Ò( bØŸ(™( <Ó0Ò6°BØ—X‘X˜gÓ&ÒF¬-×*;Ñ*;¸EÀ2Ó*Fñ
ð%ð" 	”)˜EÓ"ð#%ð$ 	�5ð%%ð& 	Ø˜&‘MÜ˜“[ØÐ/Ñ0Ø—i‘i Ó.Ò4°"Ø—y‘y Ó+ð ˜‘=¤3 v£;Ò.°u·y±yÀÔ7Kð �u˜V‘}Ñ% hÑ/°Ò7àð ˜‘=¤3 v£;Ò.°u·y±yÀÔ7Kð �u˜V‘}Ñ% fÒ-àñ
ð'%ðH 	˜Ÿ	™	 -Ó0Ò6°BðI%ð %ùò MùÚ8s   Ë6
QÌQÌQc                ó¤   — t        | «      }t        | «      }|d   D �cg c]
  }|dk7  sŒ	|‘Œ }}|j                  ||«      }|dd||xs ddœS c c}w )Nr-   r©   FTr$   )Ú
suggestionÚfiledÚcan_choose_existingr¤   Úreading)r
   rA   Úpreview_suggestion)r)   r�   r>   r;   r€   r¤   r¿   s          r    ÚpreviewrÄ   {  si   € Ü�E‹?€DÜ�%‹L€EØ$ Vš}ÓG™}˜°°Ó0F’˜}€HÐGØ×(Ñ(¨¨xÓ8€Jà ØØ#ØØÒ# ñð ùò Hs
   ž
A©Ac                óø  — t        | «      }|xs dj                  «       }|st        d«      ‚|j                  d«      rt        d«      ‚t	        |«      }|d   }d|d<   d}|r	||d	   v r|}t        t        j                  | d
«      «      }	t        |	«      d
z   t        | <   |	||xs dj                  «       xs dd||g dd dœ	}
|d   j                  |
«       |
d   |d<   d|d<   | ||d   |	||g ddt        | |«      dœ
S )Nr$   zbody is requiredr2   z0drain the pending post before submitting anotherrJ   Tr*   r©   r-   r   ÚVisitorr   F)	rŒ   rŽ   r�   Ú	author_idr�   r�   r-   r¨   Ú	script_idr,   rŒ   r1   rK   )
r)   rJ   rq   Ú
comment_idr�   r€   r-   rK   rÁ   rs   )
rA   rL   rP   rC   rV   rM   r   Úintr…   rv   )r)   rJ   r�   r�   rœ   r;   r   r|   r�   rÉ   r—   s              r    ÚsubmitrË   ‰  s8  € ô �%‹L€EØŠJ�B×ÑÓ€DÙÜÐ+Ó,Ð,Ø‡y�y�ÔÜÐKÓLÐLä�WÓ€EØ�IÑ€Gà€Eˆ(�OØ€HÙ�&˜E &™MÑ)Øˆä”Y—]‘] 5¨!Ó,Ó-€JÜ˜:“¨Ñ*„IˆeÑàØØš
 ×)Ñ)Ó+Ò8¨yØØØØØØñ
€Gð 
ˆ*Ñ×Ñ˜WÔ%Ø˜t‘}€Eˆ)ÑØ€Eˆ-ÑàØØ  Ñ+Ø ØØØØØ$Ü˜5 'Ó*ñð r"   c                óœ  — t        | «      }t        |«      |d<   d|d<   |D ]$  }|dk7  sŒ	||d   vsŒ|d   j                  |«       Œ& |rª|j                  d«      xs g D ]  }|d   j	                  |«       Œ |j                  d«      }|r<t        |«      |d   vr,|d	   |d
   g|d   vr|d   j                  t        |«      «       |j                  d«      xs d|d<   |j                  d«      |d<   y |j                  |d   |«      }	|	|d<   |	D ]$  }|dk7  sŒ	||d   vsŒ|d   j                  |«       Œ& |j                  |«       d|d<   y )Nr-   Tr¨   r©   Úopen_suggestions_fromr/   r½   r.   r   r   r    zBatch placed this post.r1   rŒ   rÈ   r�   )r
   r•   r…   rC   r9   Úfreeform_drainÚafter_freeform)
r)   r;   r—   Ú
drain_keysr+   r>   r€   rˆ   r½   r-   s
             r    Ú_apply_drain_for_commentrÑ   ¹  sm  € ô �E‹?€DÜ˜:Ó&€GˆF�OØ€GˆHÑÛˆØ�/Ó! c°°v±Ò&>Ø�&‰M× Ñ  Õ%ð ñ Ø—h‘hÐ6Ó7Ò=¸2Ò=ˆFØÐ&Ñ'×+Ñ+¨FÕ3ð >à�x‰x˜ÓˆÙ”D˜“J e¨G¡nÑ4¸$¸q¹'À4ÈÁ7Ð9KÐSXÐY`ÑSaÑ9aØ�'‰N×!Ñ!¤$ t£*Ô-Ø#Ÿx™x¨Ó1ÒNÐ5NˆˆmÑØ#Ÿx™x¨›~ˆ�Òà×"Ñ" 7¨6¡?°EÓ:ˆØˆ�‰ÛˆCØ�oÓ%¨#°U¸6±]Ò*BØ�f‘×$Ñ$ SÕ)ð ð 	×Ñ˜EÔ"Ø8ˆˆmÒr"   c           	     óø  ‡— t        | «      }t        | «      }|j                  d«      Š‰sdddddt        | |«      dœS t	        ˆfd„|d   D «       «      }|j
                  }d }|d	   t        |«      k  rJ|j                  d
«      €9||d	      }|d   |d   k(  r&ddlm}  ||«      }	|	dk(  r|d   |d   d   k(  r|}n|}|r?t        | ||t        |d   «      |«       |d	xx   dz  cc<   |d	   t        |«      k\  rd|d<   nt        | ||g d «       d |d<   d|d   dddt        | |«      |d   dœ}
	 ddlm}m} |d	   t        |«      k  r#||d	      }|d   d   |v r|j                  | «       |
S # t        $ r Y |
S w xY w)Nr2   Tznothing to drainr   F)Úhardware_should_shut_downÚmessageÚcommitsÚcloud_api_calledÚbootedrs   c              3  ó4   •K  — | ]  }|d    ‰k(  sŒ|–— Œ y­w)rŒ   N© )Ú.0Úcr¼   s     €r    Ú	<genexpr>zdrain.<locals>.<genexpr>â  s   øè ø€ ÐIÑ/˜°1°T±7¸jÓ3H”1Ñ/ùs   ƒ‘r,   r+   rÈ   r�   )Úscript_roleÚpeerr�   r’   rœ   rÐ   r   r0   r1   )rÓ   rÔ   rÕ   rÖ   r×   rs   r³   )ÚHUBÚ
PEER_NAMES)r
   rA   rC   rv   Únextr´   ra   Úclevertree_chat.chat_hubrÝ   rÑ   r•   rß   rà   Úschedule_peer_after_drainrc   )r)   rJ   r>   r;   r—   r¶   r+   Ú	candidaterÝ   ÚroleÚresultrß   rà   Únxtr¼   s                 @r    Údrainrè   Ô  sÕ  ø€ Ü�E‹?€DÜ�%‹L€EØ—‘˜9Ó%€JÙà)-Ø)ØØ %ØÜ˜u gÓ.ñ
ð 	
ô ÓI˜e JÒ/ÓIÓI€GØ�[‰[€FØ€DØˆV�}”s˜6“{Ò" w§{¡{°;Ó'?Ð'GØ˜5 ™=Ñ)ˆ	ð �6‰?˜i¨Ñ/Ò/Ý<á˜yÓ)ˆDØ�vŠ~Ø˜=Ñ)¨Y°xÑ-@ÀÑ-HÒHØ$‘Dà �áÜ  ¨¨w¼¸TÀ,Ñ=OÓ8PÐRVÔWØˆf‹˜Ñ‹Ø�‰=œC ›KÒ'Ø'+ˆEÐ#Ò$ä  ¨¨w¸¸DÔAà€Eˆ)Ñà%)Ø˜Ñ'ØØ!ØÜ˜5 'Ó*Ø˜mÑ,ñ€Fðß<à�‰=œ3˜v›;Ò&Ø˜˜v™Ñ'ˆCØ�8‰}˜VÑ$¨
Ñ2Ø×-Ñ-¨eÔ4ð €Møô ò ØØ€Mðús   Ä.<E, Å,	E9Å8E9c           	     ó2  — t        | «       |€t        | «      ddœS t        | «      }t        dt	        t        |«      t        |j                  «      «      «      }t        |«      D ]  }t        | «       t        | «       Œ t        | «      t        | «      d   dœS )zNReset, then optionally advance through scripted steps 0..step-1 fully drained.r   )rs   r+   r+   )rH   rv   r
   ÚmaxÚminrÊ   ra   r´   ÚrangeÚadvance_script_oncerè   rA   )r)   r+   r>   ÚtargetÚ_indexs        r    Úreplayrð     s€   € ä�ÔØ€|Ü" 5Ó)°1Ñ5Ð5Ü�E‹?€DÜ�”Cœ˜D›	¤3 t§{¡{Ó#3Ó4Ó5€FÜ˜–-ˆÜ˜EÔ"Üˆe�ð  ô ˜uÓ%¬u°U«|¸FÑ/CÑDÐDr"   c                óÄ  ‡ — t        ‰ «      }t        ‰ «      }|j                  }|j                  d«      rt	        d«      ‚|d   t        |«      k\  rd|d<   dt        ‰ «      dœS ||d      }|d   }t        ‰ |d   |d	   |j                  d
«      xs d|d   ¬«      }t        ˆ fd„t        ‰ «      d   D «       «      }|d   |d<   |d   |d<   |d   |d<   d|d   |d   |dœS )zESubmit the next scripted post (live, uncategorized) without draining.r2   z'drain the pending post before advancingr+   Tr0   )Údoners   r’   r›   r�   r�   Nrœ   ©r�   rœ   c              3  óL   •K  — | ]  }|d    t        ‰«      d   k(  sŒ|–— Œ y­w)rŒ   r2   N)rA   )rÚ   rÛ   r)   s     €r    rÜ   z&advance_script_once.<locals>.<genexpr>-  s)   øè ø€ Ð]Ñ6˜¸!¸D¹'ÄUÈ5Ã\ÐR[ÑE\Ó:\”1Ñ6ùs   ƒ$�$r,   r�   rŽ   rŒ   rÇ   Frs   )rò   Ústep_idrs   Ú	submitted)	r
   rA   r´   rC   rP   ra   rv   rË   rá   )r)   r>   r;   r¶   Úitemr’   ræ   r2   s   `       r    rí   rí     s  ø€ ä�E‹?€DÜ�%‹L€EØ�[‰[€FØ‡y�y�ÔÜÐBÓCÐCØˆV�}œ˜F›Ò#Ø#'ˆÐÑ Ø¤j°Ó&7Ñ8Ð8Ø�%˜‘-Ñ €DØ�(‰^€FÜØˆv�f‰~˜t F™|°D·H±H¸XÓ4FÒ4NÈ$ÐU[Ð\bÑUcô€Fô Ó]œe E›l¨:Ò6Ó]Ó]€GØ# F™^€GˆMÑØ# F™^€GˆMÑØ! $™<€GˆKÑØ d¨4¡j¸&À¹.ÐW]Ñ^Ð^r"   c           
     ó$  — | j                  d«      xs |j                  d«      xs d}t        | j                  d«      xs |j                  d«      xs d«      }t        | j                  d«      xs |j                  d«      xs t        «      j                  «       xs t        }|dk(  rdt	        |«      fS |dk(  rndt        t        | j                  d	«      xs |j                  d	«      xs d«      t        | j                  d
«      xs |j                  d
«      xs d«      |¬«      fS 	 t        |«       |dk(  r*dt        |t        | j                  d«      xs d«      «      fS |dk(  rm| j                  d«      }|�t        |«      j                  «       xs d }dt        ||t        | j                  d«      xs d«      || j                  d«      ¬«      fS |dk(  rdt        ||«      fS |dk(  rC| j                  d|j                  d«      «      }dt        ||dv rd «      fS t        |«      «      fS |dk(  rdt        |«      fS |dk(  rSt        |«      }|j                  d«      rd|fS t        ||«      }	|j                  d«      |	d<   t        ||«      |	d<   d|	fS |dk(  rddt        «       ifS dt        ||t        |j                  d«      xs | j                  d«      xs d«      «      fS # t        $ r}ddt        |«      ifcY d }~S d }~ww xY w)NÚactionrs   rJ   r$   r)   rV   éÈ   Úresolver&   r'   )r&   r'   rJ   é�  ÚerrorrÄ   r�   rË   r�   rœ   ró   rè   rð   r+   )Nr$   ÚadvanceÚplayrò   rõ   ÚtopicsÚsubtopic)rC   rM   r	   rL   rV   r~   r
   rP   rÄ   rË   rè   rð   rÊ   rí   rv   r   )
r<   Úqueryrù   rJ   r)   rT   r�   r+   ÚadvancedÚdraineds
             r    Údispatchr  4  s  € Ø�[‰[˜Ó"ÒC e§i¡i°Ó&9ÒC¸V€FÜ�'—+‘+˜iÓ(ÒF¨E¯I©I°iÓ,@ÒFÀBÓG€GÜ�—‘˜GÓ$ÒK¨¯	©	°'Ó(:ÒK¼mÓL×RÑRÓTÒeÔXe€Eà�ÒØ”H˜WÓ%Ð%Ð%Ø�ÒØ”LÜ�G—K‘K Ó&Ò@¨%¯)©)°EÓ*:Ò@¸bÓAÜ˜7Ÿ;™; |Ó4ÒU¸¿	¹	À,Ó8OÒUÐSUÓVØô
ð 
ð 	
ð(Ü�Œð �ÒØ”G˜E¤3 w§{¡{°6Ó':Ò'@¸bÓ#AÓBÐBÐBØ�ÒØ—‘˜XÓ&ˆØÐÜ˜“[×&Ñ&Ó(Ò0¨DˆFØ”FØ�7œC §¡¨FÓ 3Ò 9°rÓ:À6ÐPW×P[ÑP[Ð\bÓPcô
ð 
ð 	
ð �ÒØ”E˜% Ó)Ð)Ð)Ø�ÒØ�{‰{˜6 5§9¡9¨VÓ#4Ó5ˆØ”F˜5¨$°*Ñ*< $ÓLÐLÐLÄ#ÀdÃ)ÓLÐLÐLØ�ÒØÔ'¨Ó.Ð.Ð.Ø�ÒÜ& uÓ-ˆØ�<‰<˜ÔØ˜�=Ð Ü˜˜wÓ'ˆØ%Ÿ\™\¨)Ó4ˆ�	ÑÜ$ U¨GÓ4ˆ�‰Ø�Gˆ|ÐØ�ÒØ�Xœ|›~Ð.Ð.Ð.Ø”
Øˆwœ˜EŸI™I jÓ1ÒR°W·[±[ÀÓ5LÒRÐPRÓSóð ð øô; ò (Ø�Wœc #›hÐ'Ð'Õ'ûð(ús   Ä+K- Ë-	LË6L
ÌLÌ
Lc                  ó0   — e Zd Zd„ Zd„ Zd„ Zd„ Zd„ Zd„ Zy)Úhandlerc                ó$   — | j                  «        y ©N©Ú_handle©Úselfs    r    Údo_GETzhandler.do_GETg  ó   € Ø�‰�r"   c                ó$   — | j                  «        y r	  r
  r  s    r    Údo_POSTzhandler.do_POSTj  r  r"   c                óf   — | j                  d«       | j                  «        | j                  «        y )NéÌ   )Úsend_responseÚ_corsÚend_headersr  s    r    Ú
do_OPTIONSzhandler.do_OPTIONSm  s%   € Ø×Ñ˜3ÔØ�
‰
ŒØ×ÑÕr"   c                óN   — t         j                  j                  d||z  z  «       y )Nz%s
)ÚsysÚstderrÚwrite)r  ÚfmtÚargss      r    Úlog_messagezhandler.log_messager  s   € Ü�
‰
×Ñ˜ 3¨¡:Ñ.Õ/r"   c                ó   — 	 t        | j                  «      }t        |j                  «      j	                  «       D ��ci c]  \  }}||d   “Œ }}}i }t        | j                  j                  d«      xs d«      }|r@t        j                  | j                  j                  |«      j                  «       xs d«      }t        ||«      \  }}t        j,                  |«      j/                  «       }
| j1                  |«       | j3                  dd	«       | j3                  d
d«       | j5                  «        | j3                  dt        t7        |
«      «      «       | j9                  «        | j:                  j'                  |
«       y c c}}w # t        $ r}	ddt        |	«      i}}Y d }	~	ŒÛd }	~	wt         $ rK}	t"        j$                  j'                  t)        j*                  «       «       ddt        |	«      i}}Y d }	~	�Œ-d }	~	ww xY w)NéÿÿÿÿzContent-Lengthr   z{}rü   rý   iô  úContent-Typezapplication/json; charset=utf-8zCache-Controlzno-store)r   rg   r   r  ÚitemsrÊ   ÚheadersrC   ÚjsonÚloadsÚrfileÚreadÚdecoder  rP   rM   rc   r  r  r  Ú	tracebackÚ
format_excÚdumpsrz   r  Úsend_headerr  ra   r  Úwfile)r  rS   r€   Úvaluesr  r<   ÚlengthÚcoder�   rT   rR   s              r    r  zhandler._handleu  s‘  € ð	2Ü˜dŸi™iÓ(ˆFÜ8@ÀÇÁÓ8N×8TÑ8TÔ8VÔWÑ8V©¨¨f�S˜& ™*‘_Ð8VˆEÑWØˆGÜ˜Ÿ™×)Ñ)Ð*:Ó;Ò@¸qÓAˆFÙÜŸ*™* T§Z¡Z§_¡_°VÓ%<×%CÑ%CÓ%EÒ%MÈÓN�Ü! '¨5Ó1‰JˆD�$ô �j‰j˜Ó×%Ñ%Ó'ˆØ×Ñ˜4Ô Ø×Ñ˜Ð)JÔKØ×Ñ˜¨*Ô5Ø�
‰
ŒØ×ÑÐ)¬3¬s°3«x«=Ô9Ø×ÑÔØ�
‰
×Ñ˜Õùó% Xøô ò 	2Ø˜w¬¨C«Ð1�$�DûÜò 	2Ü�J‰J×ÑœY×1Ñ1Ó3Ô4Ø˜w¬¨C«Ð1�$ŽDûð	2ús6   ‚;F	 ½FÁA>F	 ÆF	 Æ		G=ÆF&Æ&G=Æ2A G8Ç8G=c                óT  — | j                   j                  d«      xs d}h d£}||v s"|j                  d«      s|j                  d«      r| j                  d|xs d«       n| j                  dd«       | j                  dd	«       | j                  d
d«       | j                  dd«       y )NÚOriginr$   >   úhttp://127.0.0.1:3000úhttp://127.0.0.1:8080úhttp://127.0.0.1:8944úhttp://localhost:3000úhttp://localhost:8080úhttps://clevertree.chatzhttp://127.0.0.1:zhttp://localhost:zAccess-Control-Allow-Originr8  z Access-Control-Allow-CredentialsÚtruezAccess-Control-Allow-Headersr!  zAccess-Control-Allow-MethodszGET, POST, OPTIONS)r#  rC   rw   r,  )r  ÚoriginÚalloweds      r    r  zhandler._corsŒ  sª   € Ø—‘×!Ñ! (Ó+Ò1¨rˆò
ˆð �WÑ × 1Ñ 1Ð2EÔ FÈ&×J[ÑJ[ØôK
ð ×ÑÐ:¸FÒ<_ÐF_Õ`à×ÑÐ:Ð<UÔVØ×ÑÐ;¸VÔDØ×ÑÐ7¸ÔHØ×ÑÐ7Ð9MÕNr"   N)	Ú__name__Ú
__module__Ú__qualname__r  r  r  r  r  r  rÙ   r"   r    r  r  f  s!   „ òòòò
0òó.Or"   r  )r   rM   ÚreturnrM   )r)   rM   r?  rD   )r)   rM   r;   rD   r?  ÚNone)r$   )rJ   rM   r?  rD   )rd   rM   re   rM   r?  rM   )r&   rM   r'   rM   r?  ú
str | None)r$   r$   r$   )r&   rM   r'   rM   rJ   rM   r?  rD   )r;   rD   r?  z
list[dict])r—   rD   r˜   rM   rJ   rM   r?  rD   )r$   r$   )r)   rM   rJ   rM   r¡   rM   r?  rD   )r)   rM   r�   rM   r?  rD   )NN)r)   rM   rJ   rM   r�   rM   r�   rA  rœ   rA  r?  rD   )r)   rM   r;   rD   r—   rD   rÐ   z	list[str]r+   zdict | Noner?  r@  )r)   rM   rJ   rM   r?  rD   r	  )r)   rM   r+   z
int | Noner?  rD   )r<   rD   r  rD   r?  ztuple[int, dict])AÚ__doc__Ú
__future__r   rx   r   r$  r  r)  r›   rN   Úhttp.serverr   Úpathlibr   Úurllib.parser   r   Ú__file__rû   ÚparentsÚROOTrM   rg   ÚinsertÚclevertree_chat.demosr	   r
   r   r   Úclevertree_chat.pt_seedr   r   r   r   Úclevertree_chat.urlsr   rµ   ru   r   Ú__annotations__r4   r   r   r   r   r!   r5   r?   rA   rH   rV   rk   ro   r~   rŠ   r™   rv   rÄ   rË   rÑ   rè   rð   rí   r  r  rÙ   r"   r    Ú<module>rO     s³  ðòõ
 #ã Û Û Û 
Û Û Ý .Ý ß +áˆHƒ~×ÑÓ×'Ñ'¨Ñ*€Ù€tƒ9�C—H‘HÑØ‡H�H‡O�O�A‘s˜4“yÔ!ç RÓ Rß bÓ bÝ .à	+€ð :Ø=ñð ð€ð ,.€Ð(Ó -Ù“u€
ˆHÓ ð €ˆÓ Ø€	ˆ>Ó á“e€	ˆ8Ó ó@óó #óó	ô0ô*ô*ô3ólô*ô"IóXð X\ð-Øð-Øð-Ø$'ð-Ø1;ð-ØJTð-à	ó-ð`9Øð9Øð9Ø&*ð9Ø8Að9ØITð9à	ó9ô6:ôz
Eó_ó,/ôd8OÐ$õ 8Or"   