+
    –°³jK;  ã                  óš   € R t ^ RIHt ^ RIHt ^ RIHtHt ]'       d   ^ RIt] ! R R4      4       t	] ! R R4      4       t
 ! R	 R
4      tR# )a  
Dynamo Profiler - tracks where Dynamo spends time during compilation.

This module provides profiling functionality for Dynamo tracing, showing per-function
cumtime (inclusive) and tottime (exclusive) in a cProfile-compatible format.
The output can be visualized with tools like snakeviz.

Usage:
    # Enable via config (prints pstats output):
    torch._dynamo.config.dynamo_profiler = True

    # Or save to file for snakeviz:
    torch._dynamo.config.dynamo_profiler = "/tmp/dynamo.prof"
    # Then: snakeviz /tmp/dynamo.prof
)Úannotations)Ú	dataclass)ÚAnyÚTYPE_CHECKINGNc                  ó8  € ] tR t^t$ RtR]R&   R]R&   R]R&   R]R&   R]R&   R]R	&   R]R
&   RtR]R&   RtR]R&   RtR]R&   Rt	R]R&   R$t
R]R&   ]R R l4       t]R R l4       t]R R l4       t]R R l4       t]R R l4       t]R  R! l4       tR" R# ltR$tR# )%ÚFunctionTraceTiminga  
Timing data for a single inlined function trace.

Follows cProfile conventions:
- cumtime: total time in function including all subcalls (inclusive)
- tottime: time in function excluding subcalls (exclusive)
- caller info: who called this function (for building call graph)
ÚstrÚ	func_nameÚfilenameÚintÚfirstlinenoÚ
cumtime_nsÚ
tottime_nsÚbytecode_countÚinline_depthNú
str | NoneÚcaller_func_nameÚcaller_filenamez
int | NoneÚcaller_firstlinenoTÚboolÚis_primitive_callú tuple[tuple[str, str, int], ...]Ú
call_stackc               ó   € V ^8„  d   QhRR/# )é   Úreturnr   © )Úformats   "Ú^/home/luca/screen-checking/.venv/lib/python3.14/site-packages/torch/_dynamo/dynamo_profiler.pyÚ__annotate__Ú FunctionTraceTiming.__annotate__>   s   € ÷ ñ ˜sñ ó    c                	ó   € V P                   # ©N©r   ©Úselfs   &r   Útrace_time_nsÚ!FunctionTraceTiming.trace_time_ns=   s   € à�‰Ðr!   c               ó   € V ^8„  d   QhRR/# ©r   r   Úfloatr   )r   s   "r   r   r    B   s   € ÷ %ñ %˜uñ %r!   c                	ó(   € V P                   R ,          # ©g    €„.Ar$   r%   s   &r   Útrace_time_msÚ!FunctionTraceTiming.trace_time_msA   ó   € à�‰ Õ$Ð$r!   c               ó   € V ^8„  d   QhRR/# r*   r   )r   s   "r   r   r    F   ó   € ÷ %ñ %˜Eñ %r!   c                	ó(   € V P                   R ,          # r-   r$   r%   s   &r   Ú
cumtime_msÚFunctionTraceTiming.cumtime_msE   r0   r!   c               ó   € V ^8„  d   QhRR/# r*   r   )r   s   "r   r   r    J   r2   r!   c                	ó(   € V P                   R ,          # r-   )r   r%   s   &r   Ú
tottime_msÚFunctionTraceTiming.tottime_msI   r0   r!   c               ó   € V ^8„  d   QhRR/# )r   r   ztuple[str, int, str] | Noner   )r   s   "r   r   r    N   s   € ÷ ñ Ð7ñ r!   c                ó�   € V P                   e8   V P                  ;'       g    RV P                  ;'       g    ^ V P                   3# R# )z/Return caller as a pstats-compatible key tuple.NÚ )r   r   r   r%   s   &r   Ú
caller_keyÚFunctionTraceTiming.caller_keyM   sJ   € ð × Ñ Ò,à×$Ñ$×*Ð*¨Ø×'Ñ'×,Ð,¨1Ø×%Ñ%ðð ñ
 r!   c               ó   € V ^8„  d   QhRR/# )r   r   ztuple[str, int, str]r   )r   s   "r   r   r    Y   s   € ÷ Añ AÐ.ñ Ar!   c                óH   € V P                   V P                  V P                  3# )z6Return this function as a pstats-compatible key tuple.)r
   r   r	   r%   s   &r   Úfunc_keyÚFunctionTraceTiming.func_keyX   s   € ð —‘˜t×/Ñ/°·±Ð@Ð@r!   c               ó   € V ^8„  d   QhRR/# )r   r   r   r   )r   s   "r   r   r    ]   s   € ÷ 
ñ 
˜#ñ 
r!   c                	óÂ   € R V P                    RV P                   RV P                   RV P                  R RV P                  R RV P
                   RV P                   R2# )	zFunctionTraceTiming(z at Ú:z
, cumtime=ú.2fzms, tottime=zms, bytecode=z, depth=Ú))r	   r
   r   r4   r8   r   r   r%   s   &r   Ú__repr__ÚFunctionTraceTiming.__repr__]   sp   € à" 4§>¡>Ð"2°$°t·}±}°oÀQÀt×GWÑGWÐFXð YØ—‘ sÐ+¨<¸¿¹ÈÐ7Lð MØ×+Ñ+Ð,¨H°T×5FÑ5FÐ4GÀqðJð	
r!   r   )Ú__name__Ú
__module__Ú__qualname__Ú__firstlineno__Ú__doc__Ú__annotations__r   r   r   r   r   Úpropertyr'   r.   r4   r8   r=   rA   rH   Ú__static_attributes__r   r!   r   r   r      sí   ‡ ñð ƒNØƒMØÓàƒOØƒOàÓàÓà#'Ð�jÓ'Ø"&€O�ZÓ&Ø%)Ð˜
Ó)ð #Ð�tÓ"ð 46€JÐ0Ó5ð ôó ðð ô%ó ð%ð ô%ó ð%ð ô%ó ð%ð ôó ðð ôAó ðA÷
ñ 
r!   r   c                  ó\   € ] tR t^et$ RtR]R&   R]R&   R]R&   R]R&   R]R&   R	tR
]R&   RtR# )ÚProfilerStackEntryz@Stack entry for tracking function timing in the Dynamo profiler.r   r	   r
   r   r   Ústart_time_nsÚchild_time_nsTr   r   r   N)rJ   rK   rL   rM   rN   rO   r   rQ   r   r!   r   rS   rS   e   s,   ‡ áJàƒNØƒMØÓØÓØÓØ"Ð�t×"r!   rS   c                  óª   € ] tR t^qtRtR R ltR R ltR R ltR R	 ltR
 R lt	R R lt
R R ltR R ltRR R lltRR R lltRR R lltRtR# )ÚDynamoProfilerStatez:State for Dynamo profiler tracking function trace timings.c               ó   € V ^8„  d   QhRR/# )r   r   ÚNoner   )r   s   "r   r   Ú DynamoProfilerState.__annotate__t   s   € ÷ 2ñ 2˜$ñ 2r!   c                	ó"   € . V n         . V n        R # r#   )ÚtimingsÚstackr%   s   &r   Ú__init__ÚDynamoProfilerState.__init__t   s   € Ø24ˆŒØ/1ˆŽ
r!   c               ó    € V ^8„  d   QhRRRR/# )r   Útimingr   r   rY   r   )r   s   "r   r   rZ   x   s   € ÷ $ñ $Ð$7ð $¸Dñ $r!   c                ó<   € V P                   P                  V4       R# )z)Record timing data for a traced function.N)r\   Úappend)r&   ra   s   &&r   Úrecord_timingÚ!DynamoProfilerState.record_timingx   s   € à�‰×Ñ˜FÖ#r!   c               ó   € V ^8„  d   QhRR/# )r   r   zlist[FunctionTraceTiming]r   )r   s   "r   r   rZ   |   s   € ÷ ñ Ð6ñ r!   c                ó   € V P                   # )zGet all recorded timings.)r\   r%   s   &r   Úget_timingsÚDynamoProfilerState.get_timings|   s   € à�|‰|Ðr!   c          
     ó,   € V ^8„  d   QhRRRRRRRRRR/# )	r   r	   r   r
   r   r   rT   r   rY   r   )r   s   "r   r   rZ   €   s4   € ÷ 
ñ 
Øð
Ø(+ð
Ø:=ð
ØNQð
à	ñ
r!   c                ó  aaa€ \         ;QJ d+    VVV3R lV P                   4       F  '       g   K   RM 	  RM! VVV3R lV P                   4       4      '       * pV P                  P                  \        SSSV^ VR7      4       R# )z'Push a new entry onto the timing stack.c              3  óž   <"  € T FB  pVP                   S8H  ;'       d'    VP                  S8H  ;'       d    VP                  S8H  x € KD  	  R # 5ir#   ©r	   r
   r   )Ú.0Úentryr
   r   r	   s   & €€€r   Ú	<genexpr>Ú+DynamoProfilerState.push.<locals>.<genexpr>…   sX   øé € ð 
ñ $�ð �O‰O˜yÑ(÷ 1ð 1Ø—‘ (Ñ*÷1ð 1à×!Ñ! [Ñ0ô1ó $ùs   ƒAžAµATF)r	   r
   r   rT   rU   r   N)Úanyr]   rc   rS   )r&   r	   r
   r   rT   Úis_primitives   &fff& r   ÚpushÚDynamoProfilerState.push€   sp   ú€ ÷
 ›3ö 
ð Ÿšó	
Ÿ3Ÿ3š3ö 
ð Ÿšó	
ó 
ô 
ˆð 	�
‰
×ÑÜØ#Ø!Ø'Ø+ØØ".ôö		
r!   c               ó   € V ^8„  d   QhRR/# )r   r   zProfilerStackEntry | Noner   )r   s   "r   r   rZ   –   s   € ÷ ñ Ð.ñ r!   c                ó^   € V P                   '       d   V P                   P                  4       # R# )z(Pop the top entry from the timing stack.N)r]   Úpopr%   s   &r   rx   ÚDynamoProfilerState.pop–   s   € à�:�:ˆ:Ø—:‘:—>‘>Ó#Ð#Ùr!   c               ó    € V ^8„  d   QhRRRR/# )r   Úchild_cumtime_nsr   r   rY   r   )r   s   "r   r   rZ   œ   s   € ÷ =ñ =¨sð =°tñ =r!   c                ó‚   € V P                   '       d-   V P                   R,          ;P                  V,          un        R# R# )zGAdd the child's cumulative time to the parent's child_time accumulator.Néÿÿÿÿ)r]   rU   )r&   r{   s   &&r   Úadd_child_timeÚ"DynamoProfilerState.add_child_timeœ   s*   € à�:�:ˆ:Ø�J‰J�r�N×(Ò(Ð,<Õ<×(ñ r!   c               ó   € V ^8„  d   QhRR/# )r   r   ztuple[str, str, int] | Noner   )r   s   "r   r   rZ   ¡   s   € ÷ ñ Ð$?ñ r!   c                ó–   € V P                   '       d7   V P                   R,          pVP                  VP                  VP                  3# R# )zLGet the current caller (top of stack) as (func_name, filename, firstlineno).Nr}   )r]   r	   r
   r   )r&   ro   s   & r   Úget_current_callerÚ&DynamoProfilerState.get_current_caller¡   s6   € à�:�:ˆ:Ø—J‘J˜r•NˆEØ—O‘O U§^¡^°U×5FÑ5FÐGÐGÙr!   c               ó   € V ^8„  d   QhRR/# )r   r   r   r   )r   s   "r   r   rZ   ¨   s   € ÷ 
ñ 
Ð @ñ 
r!   c                ó‚   € \         ;QJ d    . R V P                   4       F  NK  	  5# ! R V P                   4       4      # )zOGet the full current call stack as tuple of (func_name, filename, firstlineno).c              3  óf   "  € T F'  qP                   VP                  VP                  3x € K)  	  R # 5ir#   rm   )rn   ro   s   & r   rp   Ú5DynamoProfilerState.get_call_stack.<locals>.<genexpr>ª   s&   é € ð 
ÙNXÀU�_‰_˜eŸn™n¨e×.?Ñ.?Õ@Ëjùs   ‚/1)Útupler]   r%   s   &r   Úget_call_stackÚ"DynamoProfilerState.get_call_stack¨   s<   € çŒuñ 
ØNRÏjÊjó
�uð 	
ˆuñ 
ØNRÏjÊjó
ó 
ð 	
r!   Nc               ó$   € V ^8„  d   QhRRRRRR/# )r   Úoutput_filer   Ú	print_rawr   r   zpstats.Statsr   )r   s   "r   r   rZ   ®   s)   € ÷ Yñ YØ%ðYØ9=ðYà	ñYr!   c                ó
  € ^ RI p^ RIp^ RIp^ RIpVP	                  \
        4      p/ p/ p	V P                   EFÎ  p
V
P                  V
P                  V
P                  3pW¸9  d   R^ R^ RRRR/W‹&   / W›&   W‹,          pVR;;,          ^,          uu&   VR;;,          V
P                  R,          ,          uu&   V
P                  '       d<   VR;;,          ^,          uu&   VR;;,          V
P                  R,          ,          uu&   V
P                  f   KÝ  V
P                  V
P                  ;'       g    ^ V
P                  ;'       g    R3pWÙV,          9  d   R^ R^ RRRR/W›,          V&   W›,          V,          pVR;;,          ^,          uu&   VR;;,          V
P                  R,          ,          uu&   VR;;,          V
P                  R,          ,          uu&   V
P                  '       g   EK¹  VR;;,          ^,          uu&   EKÑ  	  V'       Ed8   \!        VP#                  4       R	 R
R7      p\%        R4       \%        RR RRR RRR RRR R24       \%        R$4       RpRpV F“  w  w  ppppVR,          pVR,          pVR,          R,          pVR,          R,          pVV,          pVV,          pRV9   d   VP'                  R4      R%,          MTp\%        VR RVR RVR RVR RV RV RV R24       K•  	  \%        R$4       \%        R\)        V P                  4       R\)        V4       24       \%        RVR RVR R24       \+        V	P-                  4       4       F*  pW›,           F  pWØ9  g   K  R^ R^ RRRR/W�&   / W�&   K  	  K,  	  / pVP#                  4        Fq  w  r¼/ pW›,          P#                  4        F*  w  rÞVR,          VR,          VR,          VR,          3VV&   K,  	  VR,          VR,          VR,          VR,          V3VV&   Ks  	  VP/                  4       pVP1                  4        VP3                  4        VP4                  ! VVP7                  4       R7      pVVn        \;        R  VP=                  4        4       4      Vn        \;        R! VP=                  4        4       4      Vn         \;        R" VP=                  4        4       4      Vn!        V'       d%   VPE                  V4       VPG                  R#VV4       V# )&z¸Generate pstats.Stats object from recorded timings.

Args:
    output_file: Optional file path to save the stats.
    print_raw: If True, print raw aggregate timings before returning.
NÚncallsÚpcallsÚtottimeg        Úcumtimeg    eÍÍAr<   c                ó"   € V ^,          R,          # )é   r’   r   )Úxs   &r   Ú<lambda>Ú5DynamoProfilerState.generate_pstats.<locals>.<lambda>ò   s   € °!°Aµ$°y¶/r!   T)ÚkeyÚreversez 
=== Aggregate Timings (raw) ===z>8Ú z>12z
  functioniè  Ú/z>10.2fzms zms  z (rE   rG   zTotal timings: z, unique functions: zSum tottime: rF   zms, Sum cumtime: Úms)Ústreamc              3  ó2   "  € T F  q^,          x € K  	  R# 5i)r”   Nr   ©rn   Úss   & r   rp   Ú6DynamoProfilerState.generate_pstats.<locals>.<genexpr>;  s   é € ÐBÑ.A¨ !§¢Ó.Aùó   ‚c              3  ó2   "  € T F  q^ ,          x € K  	  R# 5i)é    Nr   rŸ   s   & r   rp   r¡   <  s   é € ÐAÑ-@¨ ŸtštÓ-@ùr¢   c              3  ó2   "  € T F  q^,          x € K  	  R# 5i)r   Nr   rŸ   s   & r   rp   r¡   =  s   é € Ð?Ñ+> a˜qŸTšTÓ+>ùr¢   z/Saved pstats to %s. Visualize with: snakeviz %szP--------------------------------------------------------------------------------r}   )$ÚcProfileÚioÚloggingÚpstatsÚ	getLoggerrJ   r\   r
   r   r	   r   r   r   r   r   r   ÚsortedÚitemsÚprintÚsplitÚlenÚlistÚkeysÚProfileÚenableÚdisableÚStatsÚStringIOÚstatsÚsumÚvaluesÚtotal_callsÚ
prim_callsÚtotal_ttÚ
dump_statsÚinfo)r&   rŒ   r�   r¦   r§   r¨   r©   ÚlogÚ
aggregatedÚcaller_edgesÚtr˜   Úaggr=   ÚedgeÚsorted_itemsÚtotal_cumtimeÚtotal_tottimer
   Úlinenor	   r�   r�   r‘   r’   Ú
short_fileÚ
stats_dictÚcallersÚdummy_profiler·   s   &&&                           r   Úgenerate_pstatsÚ#DynamoProfilerState.generate_pstats®   sè  € ó 	ÛÛÛà×Ñ¤Ó)ˆð BDˆ
ð ð 	ð —•ˆAØ—:‘:˜qŸ}™}¨a¯k©kÐ:ˆCàÔ$à˜aØ˜aØ˜sØ˜sð	#�
‘ð %'�Ñ!à•/ˆCØ��M˜QÕ‹MØ�	�N˜aŸl™l¨SÕ0Õ0‹Nà×"×"Ð"Ø�H— Õ"“Ø�I— !§,¡,°Õ"4Õ4“ð × Ñ Ô,à×%Ñ%Ø×(Ñ(×-Ð-¨AØ×&Ñ&×,Ð,¨"ð�
ð
 °#Õ%6Ô6à  !Ø  !Ø! 3Ø! 3ð	5�LÕ% jÑ1ð $Õ(¨Õ4�Ø�X— !Õ#“Ø�Y— 1§<¡<°#Õ#5Õ5“ð �Y— 1§<¡<°#Õ#5Õ5“Ø×&×&Ó&Ø˜—N aÕ'–NñS ÷V ˆ9Ü!Ø× Ñ Ó"Ñ(AÈ4ôˆLô Ð5Ô6ÜØ˜B�-˜q ¨" ¨Q¨y¸¨o¸Q¸yÈ¸oÈZÐXôô �(ŒOØˆMØˆMÛ6BÑ2Ñ-�˜6 9¨sØ˜X��Ø˜X��Ø˜i�.¨4Õ/�Ø˜i�.¨4Õ/�Ø Õ(�Ø Õ(�Ø8;¸x¼˜XŸ^™^¨CÓ0°Ö4ÈX�
ÜØ˜b�k  6¨" +¨Q¨w°vÐ.>¸cÀ'È&ÐAQÐQUØ �k  J <¨q°°¸ð;öñ 7Cô �(ŒOÜØ!¤# d§l¡lÓ"3Ð!4Ð4HÌÈZËÐHYÐZôô Ø ¨cÐ2Ð2CÀMÐRUÐCVÐVXÐYôô ˜×)Ñ)Ó+Ö,ˆCØ*×/Ð/�
ØÖ/à  !Ø  !Ø! 3Ø! 3ð	.�JÑ*ð 02�LÓ,ó 0ñ -ð ð 	ð #×(Ñ(Ö*‰HˆCØQSˆGØ$0Õ$5×$;Ñ$;Ö$=Ñ �
à˜•NØ˜•NØ˜•OØ˜•Oð	'�˜
Ó#ñ %>ð �H•Ø�H•Ø�I•Ø�I•ØðˆJ�s‹Oñ +ð& !×(Ñ(Ó*ˆØ×ÑÔØ×ÑÔØ—’˜]°2·;±;³=ÔAˆà ˆŒÜÑB¨j×.?Ñ.?Ô.AÓBÓBˆÔÜÑA¨Z×->Ñ->Ô-@ÓAÓAˆÔÜÑ?¨:×+<Ñ+<Ô+>Ó?Ó?ˆŒçØ×Ñ˜[Ô)Ø�H‰HØAØØôð ˆr!   c               ó$   € V ^8„  d   QhRRRRRR/# )r   Úprofile_filer   Úsvg_filer   r   r   )r   s   "r   r   rZ   I  s)   € ÷ Fñ FØðFØ+5ðFà	ñFr!   c           	     óÈ  € ^ RI p^ RIp^ RIpVP                  R4      '       g   \	        R4       R# VP                  R4      '       g   \	        R4       R# Vf!   VP                  R^4      ^ ,          R,           p VP                  RRR	R
RRV.VP                  VP                  R7      pVP                  RRRV.VP                  VP                  VP                  R7      pVP                  P                  4        VP                  4       w  r‰VP                  4       w  rŠVP                  ^ 8w  d   \	        RV
P                  4        24       R# VP                  ^ 8w  d   \	        RV	P                  4        24       R# VP                  P                  V4      '       g   \	        RV 24       R# \	        RV 24       V#   \         d   p\	        RT 24        Rp?R# Rp?ii ; i)aC  Generate an SVG call graph from a profile file using gprof2dot and graphviz.

Args:
    profile_file: Path to the pstats profile file.
    svg_file: Optional path for the output SVG. If not provided, uses
        profile_file with .svg extension.

Returns:
    Path to the generated SVG file, or None if generation failed.
NÚ	gprof2dotz8gprof2dot not found. Install with: pip install gprof2dotÚdotz3graphviz 'dot' not found. Install graphviz package.Ú.z.svgz-fr©   z"--node-label=total-time-percentagez!--node-label=self-time-percentagez--node-label=total-time)ÚstdoutÚstderrz-Tsvgz-o)ÚstdinrÖ   r×   zgprof2dot failed: zgraphviz dot failed: zSVG file was not created: zSVG call graph saved to: zFailed to generate SVG: )ÚosÚshutilÚ
subprocessÚwhichr­   ÚrsplitÚPopenÚPIPErÖ   ÚcloseÚcommunicateÚ
returncodeÚdecodeÚpathÚisfileÚ	Exception)r&   rÐ   rÑ   rÙ   rÚ   rÛ   rÓ   rÔ   Ú_Údot_errÚgprof2dot_errÚes   &&&         r   Úgenerate_svgÚ DynamoProfilerState.generate_svgI  sÆ  € ó 	ÛÛà�|‰|˜K×(Ò(ÜÐLÔMÙà�|‰|˜E×"Ò"ÜÐGÔHÙàÒØ#×*Ñ*¨3°Ó2°1Õ5¸Õ>ˆHð*	à"×(Ñ(àØØØ8Ø7Ø-Ø ðð "—‘Ø!—‘ð )ó ˆIð ×"Ñ"Ø˜  xÐ0Ø×&Ñ&Ø!—‘Ø!—‘ð	 #ó ˆCð ×Ñ×"Ñ"Ô$ØŸ™Ó*‰JˆAØ(×4Ñ4Ó6ÑˆAà×#Ñ# qÔ(ÜÐ*¨=×+?Ñ+?Ó+AÐ*BÐCÔDÙà�~‰~ Ô"ÜÐ-¨g¯n©nÓ.>Ð-?Ð@ÔAÙà—7‘7—>‘> (×+Ò+ÜÐ2°8°*Ð=Ô>ÙäÐ-¨h¨ZÐ8Ô9ØˆOøäô 	ÜÐ,¨Q¨CÐ0Ô1Ýûð	ús1   Á:CF= Å-F= Å< F= ÆF= Æ-F= Æ=G!ÇGÇG!c               ó$   € V ^8„  d   QhRRRRRR/# )r   rŒ   r   rë   r   r   rY   r   )r   s   "r   r   rZ   ‘  s$   € ÷ /ñ /Ø%ð/Ø<@ð/à	ñ/r!   c                óT  € ^ RI pV P                  '       g   R# V P                  VRR7      p\        R4       VP                  Vn        VP                  R4      P                  4        V'       d:   \        RV 24       \        RV 24       V'       d   V P                  V4       R# R# R# )zûPrint profiler stats to stdout and optionally save to file.

Args:
    output_file: Optional path to save the pstats profile.
    generate_svg: If True and output_file is provided, also generate an SVG
        call graph using gprof2dot and graphviz.
NT)r�   z!
=== Dynamo Profiler (pstats) ===Ú
cumulativez
Profile saved to: zVisualize with: snakeviz )	Úsysr\   rÍ   r­   rÖ   r�   Ú
sort_statsÚprint_statsrë   )r&   rŒ   rë   rð   r·   s   &&&  r   r½   ÚDynamoProfilerState.dump_stats‘  s‘   € ó 	à�|�|ˆ|Ùà×$Ñ$ [¸DÐ$ÓAˆÜÐ2Ô3Ø—z‘zˆŒØ×Ñ˜Ó&×2Ñ2Ô4çÜÐ(¨¨Ð6Ô7ÜÐ-¨k¨]Ð;Ô<çØ×!Ñ! +Ö.ñ ñ	 r!   )r]   r\   )NFr#   )NT)rJ   rK   rL   rM   rN   r^   rd   rh   rt   rx   r~   r‚   r‰   rÍ   rë   r½   rQ   r   r!   r   rW   rW   q   sE   † ÙDõ2õ$õõ
õ,õ=õ
õ
÷Y÷vF÷P/ó /r!   rW   )rN   Ú
__future__r   Údataclassesr   Útypingr   r   r©   r   rS   rW   r   r!   r   Ú<module>r÷      s_   ðñõ  #å !ß %÷ Ûð ÷F
ð F
ó ðF
ðR ÷#ð #ó ð#÷y/ó y/r!   