§
    S¿jr4  ã            
      óÀ  — d Z ddlmZ ddlZddl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mZmZmZmZ e	j                             dej                             ej                             ej                             e¦  «        d¦  «        ¦  «        ¦  «         ddlmZ ddlmZmZmZmZ  ed	d	¬
¦  «         G d„ d¦  «        ¦   «         Z  ed	d	¬
¦  «         G d„ d¦  «        ¦   «         Z! ed	d	¬
¦  «         G d„ d¦  «        ¦   «         Z"dCd„Z#dDdEd„Z$dFd„Z%dGdHd%„Z&dId)„Z'dJd-„Z(dKd3„Z)dLd5„Z*dMd8„Z+dNd:„Z,dOd<„Z-dPd=„Z.dQdRd@„Z/dSdA„Z0e1dBk    r e0¦   «          dS dS )Taw  
High-Concurrency Stress Testing & Benchmark Suite for FreeExile Chat Architecture.
Simulates partitioned distributed loads representing 1,000,000 CCU across all 8 channels:
World, Zone, Guild, Party, Whisper, System, Recruit, and Feedback.
Measures p50, p95, p99 fan-out latency (< 15ms), HMAC query SLA (< 2ms),
and multi-round heap regression (residual growth <= 0.05MB).
é    )ÚannotationsN)Ú	dataclass)ÚCallableÚDictÚListÚOptionalÚSequenceÚTuplez../..)ÚChatService)ÚChatChannelTypeÚChatMessageDTOÚItemAffixDTOÚSendChatRequestDTOT)ÚslotsÚfrozenc                  ór   — 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	<   d
Zded<   dZ	ded<   dZ
ded<   dS )ÚBenchmarkConfigé@B ÚintÚsimulated_ccuéˆ  Úactive_sample_subscriberséè  Úmessage_counté
   Úconcurrencyé   Úleak_check_roundsé@   Úcluster_shardséÈ   Úitem_query_countN)Ú__name__Ú
__module__Ú__qualname__r   Ú__annotations__r   r   r   r   r    r"   © ó    ú9C:\Projects\FreeExile\tools\stress\chat_load_benchmark.pyr   r       sŒ   € € € € € € à"€MÐ"Ð"Ð"Ñ"Ø%*ÐÐ*Ð*Ð*Ñ*Ø€MÐÐÐÑØ€KÐÐÐÑØÐÐÐÐÑØ€NÐÐÐÑØÐÐÐÐÑÐÐr(   r   c                  ó¦   — e Zd ZU ded<   ded<   ded<   ded<   ded<   ded<   ded	<   ded
<   ded<   ded<   ded<   ded<   ded<   ded<   ded<   dS )ÚRoundMetricsr   Úround_indexÚmessages_acceptedÚdeliveries_countÚfloatÚduration_secÚthroughput_msg_per_secÚp50_msÚp95_msÚp99_msÚhmac_queries_passedÚhmac_avg_msÚhmac_p99_msÚstart_heap_mbÚpeak_heap_mbÚend_heap_mbÚnet_growth_mbN©r#   r$   r%   r&   r'   r(   r)   r+   r+   +   s½   € € € € € € àÐÐÑØÐÐÑØÐÐÑØÐÐÑØ!Ð!Ð!Ñ!Ø€M€M�MØ€M€M�MØ€M€M�MØÐÐÑØÐÐÑØÐÐÑØÐÐÑØÐÐÑØÐÐÑØÐÐÑÐÐr(   r+   c                  óV   — e Zd ZU ded<   ded<   ded<   ded<   ded<   d	ed
<   ded<   dS )ÚBenchmarkSummaryr   Úconfigztuple[RoundMetrics, ...]Úround_metricsÚboolÚsla_latency_passedÚsla_hmac_passedÚsla_leak_passedr/   Úresidual_growth_mbÚoverall_passedNr<   r'   r(   r)   r>   r>   >   sf   € € € € € € àÐÐÑØ+Ð+Ð+Ñ+ØÐÐÑØÐÐÑØÐÐÑØÐÐÑØÐÐÑÐÐr(   r>   Ú	latenciesúSequence[float]ÚreturnúDict[str, float]c                ó¶  — | sdddddœS t          | ¦  «        }t          |¦  «        }t          |t          |dz  ¦  «                 d¦  «        t          |t	          t          |dz  ¦  «        |dz
  ¦  «                 d¦  «        t          |t	          t          |dz  ¦  «        |dz
  ¦  «                 d¦  «        t          t          |¦  «        |z  d¦  «        dœS )z4Calculates p50, p95, p99, and average latency in ms.ç        )Úp50Úp95Úp99Úavgg      à?r   gffffffî?é   g®Gáz®ï?)ÚsortedÚlenÚroundr   ÚminÚsum)rG   ÚvalsÚns      r)   Úcalculate_percentilesrY   I   sË   € àð @Ø 3¨s¸3Ð?Ð?Ð?Ý�)ÑÔ€DÝˆD‰	Œ	€Aå�T�#˜a $™h™-œ-Ô(¨!Ñ,Ô,Ý�T�#�c ! d¡(™mœm¨Q°©UÑ3Ô3Ô4°aÑ8Ô8Ý�T�#�c ! d¡(™mœm¨Q°©UÑ3Ô3Ô4°aÑ8Ô8Ý•S˜‘Y”Y ‘] AÑ&Ô&ð	ð ð r(   r   Úchat_servicer   Úcountr   útuple[tuple[str, str], ...]c                ó$  — g }t          |¦  «        D ]p}d|› �}| j                             |d|dz   › �d|dz  dz   dd|z   d|dz   › �t          dd	d
|dz   z  ¦  «        f¬¦  «        }|                     ||j        f¦  «         Œqt          |¦  «        S )zBPre-generates signed items for concurrent HMAC inspection queries.Úbench_item_blade_u   Huyá»�n VÅ© Kiáº¿m Báº­c rQ   é   é   éZ   u   Ä�áº¡i SÆ° #Úaff_statu   Huyáº¿t Lá»±cg     @@)Ú	item_uuidÚitem_name_keyÚrarityÚelementÚqualityÚ
item_levelÚcrafter_nameÚaffixes)ÚrangeÚitem_link_serviceÚcreate_item_snapshotr   ÚappendÚhmac_signatureÚtuple)rZ   r[   ÚitemsÚiÚuidÚsnaps         r)   Úprovision_test_itemsru   W   sÆ   € à#%€EÝ�5‰\Œ\ð 1ð 1ˆØ% !Ð%Ð%ˆØÔ-×BÒBØÐ)LÀQÈÁUÐ)LÐ)LÐUVØ˜‘U˜a‘K¨¸¸Q¹ÐMcÐ\]Ð`aÑ\aÐMcÐMcÝ! *¨o¸uÈÈAÉ¹ÑOÔOÐQð Cñ 
ô 
ˆð
 	�Š�c˜4Ô.Ð/Ñ0Ô0Ð0Ð0Ý�‰<Œ<Ðr(   Úsinkú Callable[[ChatMessageDTO], None]c                óD  — t          d|dz   ¦  «        D ]o}dD ]}|                      |||¦  «         Œ|dk    r|                      d||¦  «         |dk    r.|                      d||¦  «         |                      d||¦  «         Œp| j        j                             ¦   «         S )zNRegisters listeners across World, System, Recruit, Zones, Guilds, and Parties.rQ   )ÚworldÚsystemÚrecruitzzone:zone_mainzguild:guild_mainr   zparty:party_mainzwhisper:100001:200001zfeedback:100001)rk   Úsubscribe_clientÚcluster_routerÚregistryÚtotal_subscribers_count)rZ   r[   rv   ÚcidÚchs        r)   Úprovision_subscribersr‚   e   sÁ   € å�Q˜ ™	Ñ"Ô"ð Hð HˆØVð 	9ð 	9ˆBØ×)Ò)¨"¨c°4Ñ8Ô8Ð8Ð8Ø�$Š;ˆ;Ø×)Ò)Ð*<¸cÀ4ÑHÔHÐHØ�!Š8ˆ8Ø×)Ò)Ð*AÀ3ÈÑMÔMÐMØ×)Ò)Ð*;¸SÀ$ÑGÔGÐGøØÔ&Ô/×GÒGÑIÔIÐIr(   r   Ú	round_idxÚtotal_countÚ	pool_sizeúList[SendChatRequestDTO]c                ó6  — t           j        t           j        t           j        t           j        t           j        t           j        t           j        t           j        f}g }t          |¦  «        D ]¬}||t          |¦  «        z           }t          ||d¦  «        }|t           j        k    rdnd||z  z   }|t           j        k    rdnd|› �}	|t           j        k    rdnd}
|                     t          ||	d|d| › d	|› d
|j        › d|› �ddd|
¬¦	  «	        ¦  «         Œ­|S )zZGenerates distributed chat requests cycling through all 8 channels across simulated users.r   r   i¡† u   Há»‡ Thá»‘ngÚExile_iA é#   zBenchmark msg rÚ_seqz on z by Ú	zone_mainÚ
guild_mainÚ
party_main)	Ú	sender_idÚsender_nameÚsender_levelÚchannelÚcontentÚzone_idÚguild_idÚparty_idÚ	target_id)r   ÚWORLDÚZONEÚGUILDÚPARTYÚWHISPERÚSYSTEMÚRECRUITÚFEEDBACKrk   rS   Úmaxrn   r   Úname)rƒ   r„   r…   ÚchannelsÚreqsrr   r�   Ú	safe_poolÚsidÚsnameÚtids              r)   Úgenerate_round_requestsr§   r   s7  € õ 	Ô�Ô3µ_Ô5JÝÔ�Ô6½Ô8NÝÔ¥Ô!9ð€Hð
 &(€DÝ�;ÑÔð ð ˆØ�a�#˜h™-œ-Ñ'Ô(ˆå˜ Y°Ñ5Ô5ˆ	Ø�Ô/Ò/Ð/ˆaˆa°WÀÀIÁÑ5NˆØ"$­Ô(>Ò">Ð">��ÀNÈSÀNÀNˆØ�Ô6Ò6Ð6ˆgˆg¸AˆØ�ŠÕ&Ø u¸2ÀrØN iÐNÐN°QÐNÐN¸B¼GÐNÐNÈÐNÐNØ¨,ÀØð	
ñ 
ô 
ñ 	ô 	ð 	ð 	ð €Kr(   ÚbatchúSequence[SendChatRequestDTO]úTuple[int, int]c           	   ƒ  ó‚  K  — d\  }}|D ]²}| j                              |j        |j        |j        |j        |j        |j        ¬¦  «        }t          | j	        j
                             |¦  «        ¦  «        }|                      |¦  «        ƒ d{V —†}|j        r
|dz  }||z  }t          j        d¦  «        ƒ d{V —† Œ³||fS )zXAsynchronous worker executing a subset of chat publish requests with cooperative yields.)r   r   )r‘   r“   r”   r•   Úplayer_aÚplayer_bNrQ   r   )Úchannel_managerÚget_channel_keyr‘   r“   r”   r•   rŽ   r–   rS   r}   r~   Úget_callbacksÚhandle_send_chatÚsuccessÚasyncioÚsleep)rZ   r¨   ÚacceptedÚ	deliveredÚreqÚch_keyÚdeliv_countÚress           r)   Ú_publisher_workerr»   Š   së   è è € àÑ€HˆiØð 
ð 
ˆØÔ-×=Ò=Ø”K¨¬¸s¼|Ø”\¨C¬MÀCÄMð >ñ 
ô 
ˆõ ˜,Ô5Ô>×LÒLÈVÑTÔTÑUÔUˆØ ×1Ò1°#Ñ6Ô6Ð6Ð6Ð6Ð6Ð6Ð6ˆØŒ;ð 	%Ø˜‰MˆHØ˜Ñ$ˆIÝŒm˜AÑÔÐÐÐÐÐÐÐÐØ�YÐÐr(   ÚqueriesúSequence[Tuple[str, str]]úTuple[int, List[float]]c              ƒ  ó  K  — dg }}|D ]€\  }}t          j        ¦   «         }|                      ||¦  «        }|                     t          j        ¦   «         |z
  dz  ¦  «         |j        r|dz  }t          j        d¦  «        ƒ d{V —† Œ�||fS )zWWorker executing concurrent HMAC item snapshot tooltip lookups with cooperative yields.r   g     @�@rQ   N)ÚtimeÚperf_counterÚquery_item_snapshotrn   Úis_validr³   r´   )rZ   r¼   ÚpassedrG   Úuuid_strÚsigÚt0rº   s           r)   Ú_hmac_query_workerrÈ   ›   s¯   è è € à˜2ˆI€FØ ð ð ‰ˆ�#ÝÔÑ Ô ˆØ×.Ò.¨x¸Ñ=Ô=ˆØ×Ò�$Ô+Ñ-Ô-°Ñ2°fÑ<Ñ=Ô=Ð=ØŒ<ð 	Ø�a‰KˆFÝŒm˜AÑÔÐÐÐÐÐÐÐÐØ�9ÐÐr(   ÚrequestsÚ	snapshotsÚquery_countr   ú!Tuple[int, int, int, List[float]]c              ƒ  óê  ‡ ‡‡‡‡‡K  — t          dt          ‰¦  «        |z  ¦  «        Šˆˆfd„t          dt          ‰¦  «        ‰¦  «        D ¦   «         }ˆfd„t          t          d|¦  «        ¦  «        D ¦   «         Št          dt          ‰¦  «        |z  ¦  «        Šˆˆfd„t          dt          ‰¦  «        ‰¦  «        D ¦   «         }ˆ fd„|D ¦   «         }ˆ fd„|D ¦   «         }t          j        t          j        |Ž t          j        |Ž ¦  «        ƒ d{V —†\  }	}
t          d	„ |	D ¦   «         ¦  «        }t          d
„ |	D ¦   «         ¦  «        }d„ |
D ¦   «         }||t          d„ |
D ¦   «         ¦  «        |fS )zLDispatches publisher and HMAC query workers concurrently via asyncio.gather.rQ   c                ó*   •— g | ]}‰||‰z   …         ‘ŒS r'   r'   )Ú.0rr   Úc_sizerÉ   s     €€r)   ú
<listcomp>z-_dispatch_concurrent_work.<locals>.<listcomp>®   s&   ø€ ÐSÐSÐS¨a�˜!˜a &™j˜.Ô)ÐSÐSÐSr(   r   c                ó@   •— g | ]}‰|t          ‰¦  «        z           ‘ŒS r'   )rS   )rÏ   rr   rÊ   s     €r)   rÑ   z-_dispatch_concurrent_work.<locals>.<listcomp>¯   s)   ø€ ÐQÐQÐQ°ˆy˜�S ™^œ^Ñ+Ô,ÐQÐQÐQr(   c                ó*   •— g | ]}‰||‰z   …         ‘ŒS r'   r'   )rÏ   rr   Úq_sizer¼   s     €€r)   rÑ   z-_dispatch_concurrent_work.<locals>.<listcomp>±   s&   ø€ ÐQÐQÐQ¨Q�˜˜Q ™Z˜Ô(ÐQÐQÐQr(   c                ó0   •— g | ]}t          ‰|¦  «        ‘ŒS r'   )r»   )rÏ   ÚbrZ   s     €r)   rÑ   z-_dispatch_concurrent_work.<locals>.<listcomp>³   s$   ø€ ÐEÐEÐE°aÕ  ¨qÑ1Ô1ÐEÐEÐEr(   c                ó0   •— g | ]}t          ‰|¦  «        ‘ŒS r'   )rÈ   )rÏ   ÚqbrZ   s     €r)   rÑ   z-_dispatch_concurrent_work.<locals>.<listcomp>´   s$   ø€ ÐHÐHÐH¸Õ! ,°Ñ3Ô3ÐHÐHÐHr(   Nc              3  ó    K  — | ]	\  }}|V — Œ
d S ©Nr'   )rÏ   ÚaÚ_s      r)   ú	<genexpr>z,_dispatch_concurrent_work.<locals>.<genexpr>·   s&   è è € Ð/Ð/™t˜q !˜Ð/Ð/Ð/Ð/Ð/Ð/r(   c              3  ó    K  — | ]	\  }}|V — Œ
d S rÚ   r'   )rÏ   rÜ   Úds      r)   rÝ   z,_dispatch_concurrent_work.<locals>.<genexpr>¸   s&   è è € Ð,Ð,™D˜A˜q�aÐ,Ð,Ð,Ð,Ð,Ð,r(   c                ó"   — g | ]\  }}|D ]}|‘ŒŒS r'   r'   )rÏ   rÜ   ÚlatsÚlats       r)   rÑ   z-_dispatch_concurrent_work.<locals>.<listcomp>¹   s)   € Ð?Ð?Ð?™˜˜4¸$Ð?Ð?°3�Ð?Ð?Ð?Ð?r(   c              3  ó    K  — | ]	\  }}|V — Œ
d S rÚ   r'   )rÏ   ÚprÜ   s      r)   rÝ   z,_dispatch_concurrent_work.<locals>.<genexpr>º   s&   è è € Ð+FÐ+F±$°!°Q¨AÐ+FÐ+FÐ+FÐ+FÐ+FÐ+Fr(   )rŸ   rS   rk   r³   ÚgatherrV   )rZ   rÉ   rÊ   rË   r   Ú	p_batchesÚ	q_batchesÚp_tasksÚq_tasksÚres_pubÚres_queriesÚaccepted_totalÚdeliv_totalÚall_latsrÐ   rÔ   r¼   s   ```           @@@r)   Ú_dispatch_concurrent_workrï   ¨   s£  øøøøøøè è € õ
 �•C˜‘M”M [Ñ0Ñ1Ô1€FØSÐSÐSÐSÐSµ5¸½CÀ¹M¼MÈ6Ñ3RÔ3RÐSÑSÔS€IØQÐQÐQÐQµe½CÀÀ;Ñ<OÔ<OÑ6PÔ6PÐQÑQÔQ€GÝ�•C˜‘L”L KÑ/Ñ0Ô0€FØQÐQÐQÐQÐQµ%¸½3¸w¹<¼<ÈÑ2PÔ2PÐQÑQÔQ€IàEÐEÐEÐE¸9ÐEÑEÔE€GØHÐHÐHÐH¸iÐHÑHÔH€GÝ!(¤µ´ÀÐ0HÍ'Ì.ÐZaÐJbÑ!cÔ!cÐcÐcÐcÐcÐcÐcÑ€Gˆ[åÐ/Ð/ wÐ/Ñ/Ô/Ñ/Ô/€NÝÐ,Ð, GÐ,Ñ,Ô,Ñ,Ô,€KØ?Ð? ;Ð?Ñ?Ô?€HØ˜;­Ð+FÐ+F¸+Ð+FÑ+FÔ+FÑ(FÔ(FÈÐPÐPr(   r?   c              ƒ  ó¬  K  — |                      ¦   «          t          j        ¦   «          t          j        ¦   «         d         }t          | |j        |j        ¦  «        }t          j	        ¦   «         }t          ||||j        |j        ¦  «        ƒ d{V —†\  }}}	}
t          j	        ¦   «         |z
  }t          j        ¦   «          t          j        ¦   «         \  }}|j                             ¦   «         }t          |
¦  «        }t!          | ||||dk    r||z  nd|d         |d         |d         |	|d         |d         |dz  |dz  |dz  ||z
  dz  ¬	¦  «        S )
zHExecutes a single benchmark load round with memory and latency tracking.r   NrL   rM   rN   rO   rP   i   )r,   r-   r.   r0   r1   r2   r3   r4   r5   r6   r7   r8   r9   r:   r;   )Úreset_rate_limitsÚgcÚcollectÚtracemallocÚget_traced_memoryr§   r   r   rÀ   rÁ   rï   r"   r   r}   Úget_latency_statsrY   r+   )rƒ   r?   rZ   rÊ   Ú	mem_startrÉ   rÇ   rµ   Ú
deliveriesÚhmac_okÚ	hmac_latsÚdurÚmem_endÚmem_peakÚr_statsÚh_statss                   r)   Úexecute_roundr   ½   ss  è è € ð
 ×"Ò"Ñ$Ô$Ð$Ý„J�L„L€LÝÔ-Ñ/Ô/°Ô2€IÝ& y°&Ô2FÈÔHhÑiÔi€HÝ	Ô	Ñ	Ô	€BÝ5NØ�h 	¨6Ô+BÀFÔDVñ6ô 6ð 0ð 0ð 0ð 0ð 0ð 0Ñ,€Hˆj˜' 9õ Ô
Ñ
Ô
 Ñ
"€CÝ„J�L„L€LÝ#Ô5Ñ7Ô7Ñ€GˆXØÔ)×;Ò;Ñ=Ô=€GÝ# IÑ.Ô.€GÝØ°ÈJØÀ3ÈÂ7À7°¸C±°ÐPSØ�uŒ~ g¨e¤n¸WÀU¼^Ø#°¸´ÈWÐUZÌ^Ø ;Ñ/¸hÈ+Ñ>VØ˜{Ñ+¸GÀiÑ<OÐT_Ñ;`ðñ ô ð r(   ÚcfgÚNonec                óà   — t          d¦  «         t          d| j        d›d| j        d›d| j        › �¦  «         t          d| j        d›d| j        › d| j        d›d	| j        › d
�	dz   ¦  «         dS )z*Prints benchmark configuration parameters.zÍ======================================================================
FREEEXILE 2026: 1,000,000 CCU DISTRIBUTED CHAT STRESS BENCHMARK
======================================================================zScale CCU: ú,z | Subscribers: z | Shards: zMsgs/Round: z | Workers: z	 | HMAC: z | Rounds: ú
zF----------------------------------------------------------------------N)Úprintr   r   r    r   r   r"   r   )r  s    r)   Úprint_bannerr  Ù   s×   € å	Ð
eÑfÔfÐfÝ	Ð
}˜Ô)Ð
}Ð
}Ð
}¸SÔ=ZÐ
}Ð
}Ð
}ÐilÔi{Ð
}Ð
}Ñ~Ô~Ð~Ý	ð  Q˜Ô*ð  Qð  Qð  Q¸#¼/ð  Qð  QÐTWÔThð  Qð  Qð  QÐwzô  xMð  Qð  Qð  Qð  T\ñ  \ñ  ]ô  ]ð  ]ð  ]ð  ]r(   Úmc                ój  — t          d| j        › d| j        d›d| j        d›d| j        d›�¦  «         t          d| j        d›d	| j        d›d	| j        d›d
�¦  «         t          d| j        d›d| j	        d›d| j
        › d�¦  «         t          d| j        d›d| j        d›d| j        d›d�¦  «         dS )z/Formats telemetry output for a completed round.z[ROUND z] Duration: z.3fzs | Throughput: z,.1fz msg/s | Deliveries: r  z  Latency p50/p95/p99 : zms / Úmsz  HMAC Item Query p99 : zms (avg zms, valid: ú)z  Heap Memory Start/End: z.2fzMB -> z	MB (Net: ú.4fzMB)N)r  r,   r0   r1   r.   r2   r3   r4   r7   r6   r5   r8   r:   r;   )r  s    r)   Úprint_round_metricsr  à   s-  € å	ð  ^�A”Mð  ^ð  ^¨q¬~ð  ^ð  ^ð  ^ÐSTÔSkð  ^ð  ^ð  ^ð  HIô  HZð  ^ð  ^ð  ^ñ  _ô  _ð  _Ý	Ð
[ Q¤XÐ
[Ð
[Ð
[¸¼Ð
[Ð
[Ð
[È1Ì8Ð
[Ð
[Ð
[Ð
[Ñ\Ô\Ð\Ý	Ð
v Q¤]Ð
vÐ
vÐ
vÀÄÐ
vÐ
vÐ
vÐ^_Ô^sÐ
vÐ
vÐ
vÑwÔwÐwÝ	Ð
u a¤oÐ
uÐ
uÐ
uÀÄÐ
uÐ
uÐ
uÐ]^Ô]lÐ
uÐ
uÐ
uÐ
uÑvÔvÐvÐvÐvr(   Úsc                ó  — t          d¦  «         t          d| j        rdnd› d�¦  «         t          d| j        rdnd› d�¦  «         t          d| j        rdnd› d| j        d	›d
�¦  «         t          d| j        rdnd› d�dz   ¦  «         dS )z-Prints final multi-round verification report.zµ----------------------------------------------------------------------
BENCHMARK VERIFICATION & SLA COMPLIANCE
----------------------------------------------------------------------z*Fan-Out Latency SLA (p99 < 15.0ms)     : [ÚPASSÚFAILú]z*HMAC Item Query SLA (p99 < 2.0ms)      : [z*Memory Leak Slope (Residual <= 0.05MB) : [z] (r  z MB)z*Overall Benchmark Status               : [z]
zF======================================================================N)r  rB   rC   rD   rE   rF   )r  s    r)   Úprint_final_summaryr  è   sæ   € å	Ð
MÑNÔNÐNÝ	Ð
dÀÔAUÐ7a°v°vÐ[aÐ
dÐ
dÐ
dÑeÔeÐeÝ	Ð
aÀÔARÐ7^°v°vÐX^Ð
aÐ
aÐ
aÑbÔbÐbÝ	ð  BÀÔARÐ7^°v°vÐX^ð  Bð  BÐcdÔcwð  Bð  Bð  Bð  Bñ  Cô  Cð  CÝ	Ð
bÀÔAQÐ7]°v°vÐW]Ð
bÐ
bÐ
bÐemÑ
mÑnÔnÐnÐnÐnr(   c           	   ƒ  óÄ  K  — 	 t           j                             d¬¦  «         n# t          $ r Y nw xY wt	          | ¦  «         t          j        ¦   «         st          j        ¦   «          t          | j	        ¬¦  «        }t          |d¬¦  «        }t          || j        d„ ¦  «        }t          d|d›d	| j	        › d
�¦  «         g }t          d| j        dz   ¦  «        D ]>}t!          || ||¦  «        ƒ d{V —†}|                     |¦  «         t%          |¦  «         Œ?t'          d„ |D ¦   «         ¦  «        }t'          d„ |D ¦   «         ¦  «        }t)          |¦  «        dk    r|d         j        |d         j        z
  nd}	|	dk    }
t-          | t/          |¦  «        |||
|	|o|o|
¬¦  «        }t1          |¦  «         t          j        ¦   «         rt          j        ¦   «          |S )zFCoordinates full 1M CCU stress benchmark suite across multiple rounds.zutf-8)Úencoding)r    r   )r[   c                ó   — d S rÚ   r'   )rÜ   s    r)   ú<lambda>zrun_benchmark.<locals>.<lambda>ý   s   € Ðae€ r(   u,   [âœ“] Subscriber routing table established: r  z handles across z	 shards.
rQ   Nc              3  ó,   K  — | ]}|j         d k     V — ŒdS )g      .@N)r4   ©rÏ   r  s     r)   rÝ   z run_benchmark.<locals>.<genexpr>  s(   è è € Ð5Ð5¨�Q”X ’_Ð5Ð5Ð5Ð5Ð5Ð5r(   c              3  ó,   K  — | ]}|j         d k     V — ŒdS )g       @N)r7   r  s     r)   rÝ   z run_benchmark.<locals>.<genexpr>  s)   è è € Ð:Ð:¨a�a”m cÒ)Ð:Ð:Ð:Ð:Ð:Ð:r(   éÿÿÿÿr   rL   gš™™™™™©?)r?   r@   rB   rC   rD   rE   rF   )ÚsysÚstdoutÚreconfigureÚ	Exceptionr  rô   Ú
is_tracingÚstartr   r    ru   r‚   r   r  rk   r   r   rn   r  ÚallrS   r:   r>   rp   r  Ústop)r?   rZ   rÊ   Ú
total_subsÚroundsÚrÚmetricÚ
all_p99_okÚall_hmac_okÚ
res_growthÚleak_okÚsummarys               r)   Úrun_benchmarkr-  ñ   s#  è è € ðÝŒ
×Ò¨ÐÑ0Ô0Ð0Ð0øÝð ð ð Øˆðøøøå�ÑÔÐÝÔ!Ñ#Ô#ð ÝÔÑÔÐå¨fÔ.CÐDÑDÔD€LÝ$ \¸Ð<Ñ<Ô<€IÝ& |°VÔ5UÐWeÐWeÑfÔf€JÝ	Ð
x¸Ð
xÐ
xÐ
xÐW]ÔWlÐ
xÐ
xÐ
xÑyÔyÐyà!#€FÝ�1�fÔ.°Ñ2Ñ3Ô3ð $ð $ˆÝ$ Q¨°¸iÑHÔHÐHÐHÐHÐHÐHÐHˆØ�Š�fÑÔÐÝ˜FÑ#Ô#Ð#Ð#åÐ5Ð5¨fÐ5Ñ5Ô5Ñ5Ô5€JÝÐ:Ð:°6Ð:Ñ:Ô:Ñ:Ô:€KÝEHÈÁ[Ä[ÐSTÂ_À_�&˜”*Ô(¨6°!¬9Ô+@Ñ@Ð@ÐZ]€JØ˜DÒ €GÝØ¥U¨6¡]¤]ÀzØ#°WØ%°jÐ6\À[Ð6\ÐU\ðñ ô €Gõ
 ˜Ñ Ô Ð ÝÔÑÔð ÝÔÑÔÐØ€Ns   „ % ¥
2±2ÚargvúOptional[Sequence[str]]c                ó  — t          j        d¬¦  «        }|                     dt          d¬¦  «         |                     dt          d¬¦  «         |                     dt          d	¬¦  «         |                     d
t          d¬¦  «         |                     dt          d¬¦  «         |                     dt          d¬¦  «         |                     | ¦  «        }t          |j        |j        |j        |j	        |j
        |j        ¬¦  «        S )z3Parses command-line arguments into BenchmarkConfig.z&1M CCU FreeExile Chat Stress Benchmark)Údescriptionz--simulated-ccur   )ÚtypeÚdefaultz--active-sample-subscribersr   z--message-countr   z--concurrencyr   z--leak-check-roundsr   z--shardsr   )r   r   r   r   r   r    )ÚargparseÚArgumentParserÚadd_argumentr   Ú
parse_argsr   r   r   r   r   r   Úshards)r.  ÚparserÚargss      r)   r7  r7    s	  € åÔ$Ð1YÐZÑZÔZ€FØ
×ÒÐ)µ¸YÐÑGÔGÐGØ
×ÒÐ5½CÈÐÑOÔOÐOØ
×ÒÐ)µ¸UÐÑCÔCÐCØ
×Ò˜­c¸2ÐÑ>Ô>Ð>Ø
×ÒÐ-µCÀÐÑCÔCÐCØ
×Ò˜
­°bÐÑ9Ô9Ð9Ø×Ò˜TÑ"Ô"€DÝØÔ(Ø"&Ô"@ØÔ(ØÔ$ØÔ0Ø”{ðñ ô ð r(   c                 óž   — t          ¦   «         } t          j        t          | ¦  «        ¦  «        }t	          j        |j        rdnd¦  «         dS )zCLI Entry point.r   rQ   N)r7  r³   Úrunr-  r  ÚexitrF   )r  r,  s     r)   Úmainr>  )  sD   € å
‰,Œ,€CÝŒk�-¨Ñ,Ô,Ñ-Ô-€GÝ„H�'Ô(Ð/ˆQˆQ¨aÑ0Ô0Ð0Ð0Ð0r(   Ú__main__)rG   rH   rI   rJ   )r   )rZ   r   r[   r   rI   r\   )rZ   r   r[   r   rv   rw   rI   r   )r   )rƒ   r   r„   r   r…   r   rI   r†   )rZ   r   r¨   r©   rI   rª   )rZ   r   r¼   r½   rI   r¾   )rZ   r   rÉ   r©   rÊ   r½   rË   r   r   r   rI   rÌ   )
rƒ   r   r?   r   rZ   r   rÊ   r½   rI   r+   )r  r   rI   r  )r  r+   rI   r  )r  r>   rI   r  )r?   r   rI   r>   rÚ   )r.  r/  rI   r   )rI   r  )2Ú__doc__Ú
__future__r   r4  r³   Údataclassesr   rò   Úosr  rÀ   rô   Útypingr   r   r   r   r	   r
   ÚpathÚinsertÚabspathÚjoinÚdirnameÚ__file__Úserver.chat.chat_servicer   Úserver.chat.chat_typesr   r   r   r   r   r+   r>   rY   ru   r‚   r§   r»   rÈ   rï   r   r  r  r  r-  r7  r>  r#   r'   r(   r)   ú<module>rM     sc  ððð ð #Ð "Ð "Ð "Ð "Ð "à €€€Ø €€€Ø !Ð !Ð !Ð !Ð !Ð !Ø 	€	€	€	Ø 	€	€	€	Ø 
€
€
€
Ø €€€Ø Ð Ð Ð Ø BÐ BÐ BÐ BÐ BÐ BÐ BÐ BÐ BÐ BÐ BÐ BÐ BÐ BÐ BÐ Bà „‡‚��2”7—?’? 2¤7§<¢<°´·²ÀÑ0IÔ0IÈ7Ñ#SÔ#SÑTÔTÑ UÔ UÐ Uà 0Ð 0Ð 0Ð 0Ð 0Ð 0ðð ð ð ð ð ð ð ð ð ð ð ð €�˜dÐ#Ñ#Ô#ð ð  ð  ð  ð  ñ  ô  ñ $Ô#ð ð €�˜dÐ#Ñ#Ô#ðð ð ð ð ñ ô ñ $Ô#ðð$ €�˜dÐ#Ñ#Ô#ðð ð ð ð ñ ô ñ $Ô#ððð ð ð ðð ð ð ð ð
Jð 
Jð 
Jð 
Jðð ð ð ð ð0ð ð ð ð"
ð 
ð 
ð 
ðQð Qð Qð Qð*ð ð ð ð8]ð ]ð ]ð ]ðwð wð wð wðoð oð oð oð!ð !ð !ð !ðHð ð ð ð ð(1ð 1ð 1ð 1ð ˆzÒÐØ€D�F„F€F€F€Fð Ðr(   