Ë
    —¨jû1  ã                  ó   — d Z ddlmZ ddlZddlmZ dZg d¢Zg d¢ZdZ	d	Z
d!d
„Zd"d„Zd#d„Zd$d„Zd%d„Zd&d„Zd'd„Zd(d„Zd)d„Zd*d„Zd+d„Zd,d„Zd-d„Zd.d„Zd/d„Zd0d„Zd1d„Zd2d„Zd1d„Zd3d„Zd4d5d„Zd6d„Z d4d7d „Z!y)8a}  Python port of packages/engine (the CMAH guidance engine).

Must produce output identical to the JS engine for every vector in
packages/engine/vectors/cases.json (see tests/test_engine_vectors.py). The
server uses it to recompute runs on finalize (never trusting the browser),
to backfill suggestions for imported forecasts, and to replay proposed
config versions against history.
é    )ÚannotationsN)ÚAnyz1.0.0)ÚnorthÚ	northeastÚeastÚ	southeastÚsouthÚ	southwestÚwestÚ	northwest)ÚupperÚmiddleÚloweré   é   c                ó2   — t        j                  | dz   «      S )z5JavaScript Math.round (half rounds toward +infinity).ç      à?©ÚmathÚfloor©Úvs    ú'/var/www/avy-guidance/api/app/engine.pyÚjs_roundr      s   € ä�:‰:�a˜#‘gÓÐó    c                óD   — | €y t        j                  | dz  dz   «      dz  S )Ng     ˆÃ@r   r   r   s    r   Úround4r      s&   € Ø€yØÜ�:‰:�a˜#‘g ‘mÓ$ sÑ*Ð*r   c                óœ   — | �| dk(  st        | t        «      ry	 t        j                  t	        | «      «       S # t
        t        f$ r Y yw xY w)NÚ F)Ú
isinstanceÚboolr   ÚisnanÚfloatÚ	TypeErrorÚ
ValueErrorr   s    r   Úis_numr&   "   sK   € Ø€y�A˜’Gœz¨!¬TÔ2ØðÜ—:‘:œe A›hÓ'Ð'Ð'øÜ”zÐ"ò Ùðús   š9 ¹AÁ
Ac                ó2   — t        | «      rt        | «      S d S ©N)r&   r#   r   s    r   Ú_numr)   +   s   € Ü˜a”yŒ5�‹8Ð* dÐ*r   c                ó.   — t        |t        || «      «      S r(   )ÚmaxÚmin)r   ÚloÚhis      r   Úclampr/   /   s   € Üˆr”3�r˜1“:ÓÐr   c                óÊ   — t        | «      j                  «       j                  «       j                  «       }t	        |«      dk7  s|d   t
        vs|d   t        vry |d   |d   fS )Nr   r   r   )ÚstrÚstripr   ÚsplitÚlenÚASPECTSÚBANDS)ÚlocÚpartss     r   Úparse_locationr9   6   s[   € Ü�‹H�N‰NÓ×"Ñ"Ó$×*Ñ*Ó,€EÜ
ˆ5ƒz�Q‚˜% ™(¬'Ñ1°U¸1±XÄUÑ5JØØ�‰8�U˜1‘XÐÐr   c                ót   — t        «       }| xs g D ]$  }t        |«      }|sŒ|j                  |d   «       Œ& |S )Nr   )Úsetr9   Úadd)Ú	locationsÚoutr7   Úps       r   Úbands_ofr@   =   s?   € Ü
‹%€CØŠ˜Bò ˆÜ˜3ÓˆÚØ�G‰G�A�a‘D�Mðð €Jr   c                ón   — t        | t        «      r
| dk  s| dkD  ry t        | dz     › dt        | dz     › �S )Nr   é   é   ú )r    Úintr5   r6   )Úcells    r   Úcell_to_locationrG   F   s@   € Ü�dœCÔ  D¨1¢H°°r²	ØÜ�d˜Q‘hÑÐ  ¤%¨°©	Ñ"2Ð!3Ð4Ð4r   c                ó†   — t        | «      }|sy t        j                  |d   «      dz  t        j                  |d   «      z   S )Nr   rC   r   )r9   r6   Úindexr5   )r7   r?   s     r   Úlocation_to_cellrJ   L   s<   € Ü�sÓ€AÙØÜ�;‰;�q˜‘tÓ˜qÑ ¤7§=¡=°°1±Ó#6Ñ6Ð6r   c                ó  ‡‡‡— |d   Š|d   Š|d   Št        t        | «      dt        ‰«      dz
  «      } t        t        |«      dt        ‰«      dz
  «      }t        j                  | «      }t        t        ‰«      dz
  |dz   «      }| |z
  }t        j                  |«      }t        t        ‰«      dz
  |dz   «      }||z
  }dˆˆˆfd„}	 |	||«      d|z
  z   |	||«      |z  z   }
 |	||«      d|z
  z   |	||«      |z  z   }|
d|z
  z  ||z  z   S )NÚsensitivityÚdistributionÚlikelihoodMatrixr   r   c                ó~   •— t        ‰j                  ‰|    d   «      xs i j                  ‰|   d   «      xs d«      S )NÚkeyr   )r#   Úget)ÚdiÚsiÚdistÚmÚsenss     €€€r   rF   zinterp_likelihood.<locals>.cellc   s<   ø€ Ü�a—e‘e˜D ™H U™OÓ,Ò2°×7Ñ7¸¸R¹À¹ÓHÒMÈAÓNÐNr   )rR   rE   rS   rE   Úreturnr#   )r/   r#   r4   r   r   r,   )Údist_posÚsens_posÚconfigÚd0Úd1ÚfdÚs0Ús1ÚfsrF   ÚbottomÚtoprT   rU   rV   s               @@@r   Úinterp_likelihoodrc   V   s  ú€ Ø�-Ñ €DØ�.Ñ!€DØÐ!Ñ"€AÜ”U˜8“_ a¬¨T«°Q©Ó7€HÜ”U˜8“_ a¬¨T«°Q©Ó7€HÜ	�‰�HÓ	€BÜ	ŒS�‹Y˜‰]˜B ™FÓ	#€BØ	�B‰€BÜ	�‰�HÓ	€BÜ	ŒS�‹Y˜‰]˜B ™FÓ	#€BØ	�B‰€B÷Oñ �"�b‹\˜Q ™VÑ$¡t¨B°£|°bÑ'8Ñ8€FÙ
ˆr�2‹,˜!˜b™&Ñ
!¡D¨¨R£L°2Ñ$5Ñ
5€CØ�Q˜‘VÑ˜s R™xÑ'Ð'r   c           	     óz  — | j                  d«      xs i }| j                  d«      xs i }t        d„ |j                  d«      |j                  d«      |j                  d«      |j                  d«      fD «       «      sy t        |d   |d   |«      }t        |d   |d   |«      }t        ||«      t	        ||«      dœS )NrL   rM   c              3  ó2   K  — | ]  }t        |«      –— Œ y ­wr(   ©r&   ©Ú.0Úxs     r   ú	<genexpr>z#likelihood_range.<locals>.<genexpr>n   s   è ø€ Ò[˜QŒv�a�yÑ[ùó   ‚r,   r+   ©r,   r+   )rQ   Úallrc   r,   r+   )ÚproblemrZ   ÚsÚdr-   r.   s         r   Úlikelihood_rangerq   k   s¦   € Ø�‰�MÓ"Ò( b€AØ�‰�NÓ#Ò) r€AÜÑ[ 1§5¡5¨£<°·±°u³¸q¿u¹uÀU»|ÈQÏUÉUÐSXË\Ð"ZÔ[Ô[ØÜ	˜1˜U™8 Q u¡X¨vÓ	6€BÜ	˜1˜U™8 Q u¡X¨vÓ	6€BÜ�r˜2“;¤s¨2¨r£{Ñ3Ð3r   c                óê   — | sg S t        t        t        j                  | d   «      dd«      «      }t        t        t        j                  | d   «      dd«      «      }t        t        ||dz   «      «      S )Nr,   r   é   r+   )rE   r/   r   r   ÚceilÚlistÚrange)Úrr-   r.   s      r   Úlikelihood_optionsrx   u   s`   € ÙØˆ	Ü	ŒU”4—:‘:˜a ™hÓ'¨¨AÓ.Ó	/€BÜ	ŒU”4—9‘9˜Q˜u™XÓ&¨¨1Ó-Ó	.€BÜ”�b˜"˜q™&Ó!Ó"Ð"r   c           	     ó
  — t        | |«      }|sy | j                  d«      }t        |«      r7t        t	        t        t        |«      «      dd«      «      }|t        |«      v r|S t        t	        t        |d   «      dd«      «      S )NÚlikelihoodChoicer   rs   r+   )rq   rQ   r&   rE   r/   r   r#   rx   )rn   rZ   rw   ÚchoiceÚcs        r   Úlikelihood_forr}   }   sv   € Ü˜ &Ó)€AÙØØ�[‰[Ð+Ó,€FÜˆf„~Ü””hœu V›}Ó-¨q°!Ó4Ó5ˆØÔ" 1Ó%Ñ%ØˆHÜŒu”X˜a ™hÓ'¨¨AÓ.Ó/Ð/r   c                ó    — t        |d   d   «      }t        t        dt        |t	        j
                  t        | «      dz
  «      «      «      «      S )NÚdangerTableÚ1r   g•Ö&è.>)r4   rE   r+   r,   r   rt   r#   )ÚsizerZ   Úcolss      r   Ú
size_classrƒ   Œ   sA   € Üˆv�mÑ$ SÑ)Ó*€DÜŒs�1”c˜$¤§	¡	¬%°«+¸Ñ*<Ó =Ó>Ó?Ó@Ð@r   c                óx   — |d   j                  t        | «      «      }|syt        |t        ||«      dz
     «      S )Nr   r   r   )rQ   r1   rE   rƒ   )Ú
likelihoodr�   rZ   Úrows       r   Ú
danger_forr‡   ‘   s=   € Ø
�Ñ
×
#Ñ
#¤C¨
£OÓ
4€CÙØÜˆs”:˜d FÓ+¨aÑ/Ñ0Ó1Ð1r   c           
     óT  — dddddœ}t         D ]—  }d}| D ]w  }t        ||«      }|j                  d«      xs i }|rt        |j                  d«      «      sŒA|t	        |j                  d«      «      vrŒ^t        |t        ||d   |«      «      }Œy |||<   t        |d   |«      |d<   Œ™ |S )Nr   )r   r   r   Úoverallr�   r+   r=   r‰   )r6   r}   rQ   r&   r@   r+   r‡   )ÚproblemsrZ   r>   ÚbandÚbestr?   Úliker�   s           r   Údanger_suggestionsrŽ   ˜   sÀ   € Ø ¨Q¸1Ñ
=€CÜò 3ˆØˆØò 	DˆAÜ! ! VÓ,ˆDØ—5‘5˜“=Ò& BˆDÙœv d§h¡h¨u£oÔ6ØØœ8 A§E¡E¨+Ó$6Ó7Ñ7ØÜ�tœZ¨¨d°5©k¸6ÓBÓC‰Dð	Dð ˆˆD‰	Ü˜S ™^¨TÓ2ˆˆIŠð3ð €Jr   c                ó~   — t        t        | j                  d«      «      t        |j                  d«      «      z  «      S )Nr=   )r!   r@   rQ   )ÚaÚbs     r   Ú_shares_bandr’   ¬   s.   € Ü”˜Ÿ™˜{Ó+Ó,¬x¸¿¹¸kÓ8JÓ/KÑKÓLÐLr   c                óx   — t        | |«      t        ||«      }}|r|sy|d   |d   dz   k  xr |d   |d   dz   k  S )NFr,   r+   r   )rq   )r�   r‘   rZ   ÚraÚrbs        r   Ú_likelihood_overlapr–   °   sO   € Ü˜a Ó(Ô*:¸1¸fÓ*Eˆ€BÙ‘RØØˆe‰9˜˜5™	 A™Ñ%ÒD¨"¨U©)°r¸%±yÀ1±}Ñ*DÐDr   c           	     ót  — | j                  d«      xs i |j                  d«      xs i }}t        d„ |j                  d«      |j                  d«      |j                  d«      |j                  d«      fD «       «      syt        |d   «      t        |d   «      k  xr t        |d   «      t        |d   «      k  S )Nr�   c              3  ó2   K  — | ]  }t        |«      –— Œ y ­wr(   rf   rg   s     r   rj   z _size_overlap.<locals>.<genexpr>¹   s   è ø€ Ò_˜QŒv�a�yÑ_ùrk   r,   r+   F)rQ   rm   r#   )r�   r‘   ÚsaÚsbs       r   Ú_size_overlapr›   ·   sž   € Ø�U‰U�6‹]Ò ˜b !§%¡%¨£-Ò"5°2ˆ€BÜÑ_ 2§6¡6¨%£=°"·&±&¸³-ÀÇÁÈÃÐPR×PVÑPVÐW\ÓP]Ð"^Ô_Ô_ØÜ��E‘Óœu R¨¡YÓ/Ñ/ÒX´E¸"¸U¹)Ó4DÌÈbÐQVÉiÓHXÑ4XÐXr   c                óN  — i }| D ]%  }|j                  d«      €Œ||t        |d   «      <   Œ' g }|j                  d«      xs g D ]Þ  }|j                  t        |d   «      «      |j                  t        |d   «      «      }}|r|sŒBt        ||«      t        |||«      t	        ||«      dœ}|j                  d«      duxr t        |j                  «       «      }	|j                  |d   › d|d   › �t        |d   «      t        |d   «      ||	|j                  d	«      d
œ«       Œà |S )NÚtypeÚpairingRulesr�   r‘   )Úlocationr…   r�   ÚrequireJustificationFú-Úsource)rP   r�   r‘   ÚoverlapÚstrongr¢   )rQ   rE   r’   r–   r›   rm   ÚvaluesÚappend)
rŠ   rZ   Úby_typer?   ÚflagsÚruleÚpaÚpbr£   r¤   s
             r   Úpairing_flagsr¬   ¾   s1  € Ø!€GØò (ˆØ�5‰5�‹=Ñ$Ø&'ˆG”C˜˜&™	“NÒ#ð(ð €EØ—
‘
˜>Ó*Ò0¨bò 
ˆØ—‘œS  c¡›^Ó,¨g¯k©k¼#¸dÀ3¹i».Ó.IˆBˆÙ™Øä$ R¨Ó,Ü-¨b°"°fÓ=Ü! " bÓ)ñ
ˆð
 —‘Ð0Ó1¸Ð>ÒXÄ3ÀwÇ~Á~ÓGWÓCXˆØ�‰à˜s™)˜ A d¨3¡i [Ð1Ü˜˜c™“^Ü˜˜c™“^Ø"Ø ØŸ(™( 8Ó,ñõ		
ð
ð( €Lr   c                ó  ‡‡‡— g Š| j                  d«      xs g }t        | j                  d«      xs g «      }d5d6ˆfd„}t        |«      D �]g  \  }}|j                  d«      �t        |d   «      nd }|j                  d«      xs i }	t	        |	j                  d«      «      t	        |	j                  d«      «      }}
t	        |j                  d«      xs i j                  d«      «      }t	        |j                  d	«      xs i j                  d«      «      }|�|
�|
|z
  d
kD  r |dddd|«       |dv r|
�|
dk  r|�|t
        k  r |dddd|«       |dk(  r*|
�|
dk  r |dddd|«       |�|t        kD  r |dddd|«       |dk(  r |dddd|«       |j                  d«      r�ŒXg r�Œ\ |ddd d|«       �Œj |D �ch c]"  }|j                  d«      €Œt        |d   «      ’Œ$ }}d!|v rd"|v rd#|vr |d$dd%d«       d&|v r|r |d'dd(d«       |ròt        ˆfd)„|D «       «      }t        D �cg c]   }t        |j                  |«      xs d*«      ‘Œ" }}t        |«      Š|r0‰d"k\  r+t        ˆfd+„|D «       «      r‰dk(  rd,nd-} |d.d|› d/�d0«       t        «       }|D ]  }|t        |j                  d«      «      z  }Œ! t        D ];  }t        |j                  |«      xs d*«      dk\  sŒ%|sŒ(||vsŒ- |d1dd2|› d3�d4«       Œ= ‰S c c}w c c}w )7NrŠ   Ú
conditionsc                ó4   •— ‰j                  | ||||dœ«       y )N)ÚidÚlevelÚtextr¢   ÚproblemIndex)r¦   )Úid_r±   r²   r¢   Úproblem_indexr>   s        €r   r<   zguidance_checks.<locals>.addã   s   ø€ Ø�
‰
˜#¨°tÀvÐ_lÑmÕnr   r�   r�   r+   r,   rL   rM   r   Ú
size_rangeÚwarnzXKeep the range of sizes to two or less and describe outliers in the problem description.u   FG Â§3.4)r   r   g      ø?Úsmall_loose_or_stormÚinfoz‹Table 1 lists Dry Loose and Storm Slab when there is potential for ~D1.5 or larger avalanches, or a widespread pattern of small avalanches.z
FG Table 1rs   é   Údps_sizezODeep Persistent Slab is for slabs capable of high-consequence avalanches (D3+).Údps_sensitivityzÅDeep Persistent Slab is reserved for low likelihood / high consequence scenarios and is normally stubborn to triggers. Temporary increases are acceptable if likelihood is expected to return to low.é	   Úglide_durationzyGlide timing is highly uncertain: consider keeping the problem for at least 48 hours after the onset of glide avalanches.r=   Úno_locationzSMark the aspects and elevations where the problem is most likely to be encountered.Únew_snow_24hé   r   Úfirst_storm_on_pwlz�The first storm on a persistent weak layer should be a Storm Slab unless you expect the terrain-management considerations of a Persistent Slab.Ú	no_hazardÚstructure_not_problemz|Assign a problem only when there is an associated avalanche hazard; poor structure alone belongs in the Forecast Discussion.c              3  óÄ   •K  — | ]W  }t        |j                  d «      xs i j                  d«      «      duxr" t        |d    d   «      dk\  xr t        |‰«      –— ŒY y­w)r�   r+   Nrº   )r)   rQ   r#   r}   )rh   r?   rZ   s     €r   rj   z"guidance_checks.<locals>.<genexpr>  sl   øè ø€ ò 
ð ô �!—%‘%˜“-Ò% 2×*Ñ*¨5Ó1Ó2¸$Ð>ò *Ü�a˜‘i Ñ&Ó'¨1Ñ,ò*ä˜q &Ó)ó*ñ
ùs   ƒAA r   c              3  ó(   •K  — | ]	  }|‰k  –— Œ y ­wr(   © )rh   Úlvlrb   s     €r   rj   z"guidance_checks.<locals>.<genexpr>
  s   øè ø€ Ò#@°# C¨#¥IÑ#@ùs   ƒÚEXTREMEÚHIGHÚhigh_all_bandsz« danger with D3+ avalanches should be assigned to all elevation bands unless there is a specific, explainable reason these avalanches will not affect the other elevations.u   FG Â§2.1Úband_without_problemzThe uu    band is rated Considerable or higher but no problem is located there â€” check the locations or explain in the text.u   FG Â§3.2r(   )r´   r1   r±   r1   r²   r1   r¢   r1   rµ   ú
int | NonerW   ÚNone)rQ   r;   Ú	enumeraterE   r)   Ú
WIDESPREADÚSTUBBORNÚanyr6   r+   r@   )ÚinputsrZ   ÚratingsrŠ   r®   r<   Úir?   Útr�   Ús_maxÚs_minÚsens_minÚdist_maxÚtypesÚbigr‘   ÚlevelsÚnameÚtouchedr>   rb   s    `                  @@r   Úguidance_checksrà   Þ   sÇ  ú€ Ø€CØ�z‰z˜*Ó%Ò+¨€HÜ�V—Z‘Z Ó-Ò3°Ó4€Jöoô ˜(Ó#ó M‰ˆˆ1ØŸe™e F›mÐ7ŒC��&‘	ŒN¸TˆØ�u‰u�V‹}Ò" ˆÜ˜DŸH™H U›OÓ,¬d°4·8±8¸E³?Ó.CˆuˆÜ˜Ÿ™˜}Ó-Ò3°×8Ñ8¸Ó?Ó@ˆÜ˜Ÿ™˜~Ó.Ò4°"×9Ñ9¸%Ó@ÓAˆàÐ Ð!2°u¸u±}ÀqÒ7HÙ�˜fð  'Að  CMð  OPô  QØ�‰;˜5Ð,°¸²ÀÐAUÐZbÔeoÒZoÙÐ&¨ð  1~ð  @Lð  NOô  PØ�Š6ØÐ  U¨Q¢YÙ�J Ð(yð  |Hð  JKô  LØÐ#¨´8Ò(;ÙÐ% vð  0wð  yEð  GHô  IØ�Š6ÙÐ  &ð  +fð  htð  vwô  xØ—‘�kÖ"£bÙ�˜vÐ'|ð  Ið  KLö  Mð'Mð* &.ÖK °·±°v³Ñ1JŒS��6‘�^ÐK€EÐKØ˜Ñ#¨¨U©
°qÀ±~ÙÐ  &ð  +|ð  ~Jô  	KØ�jÑ ¡XÙÐ# Vð  .lð  nxô  	yáÜó 
ð ô	
ó 
ˆô 5:Ö:¨q”#�g—k‘k !“nÒ)¨Õ*Ð:ˆÐ:Ü�&‹kˆÙ�3˜!’8¤Ó#@¸Ô#@Ô @Ø # q¢‘9¨fˆDÙÐ  &¨T¨Fð  3^ð  +_ð  akô  lÜ›EˆØò 	4ˆAØ”x §¡ kÓ 2Ó3Ñ3‰Gð	4äò 	AˆAÜ�7—;‘;˜q“>Ò& QÓ'¨1Ó,²¸aÀwÒ>NÙÐ*¨F°d¸1¸#ð  >sð  5tð  v@õ  Að	Að €Jùò1 Lùò ;s   Æ:LÇLÈ)%Lc           
     ó¢  — t        | j                  d«      xs g «      d |j                  d«      xs d }g }|D ]b  }t        ||«      }|j                  t	        |d   «      |rt        |d   «      t        |d   «      dœnd t        |«      t        ||«      dœ«       Œd t        ||«      }t        ||t        ||«      t        i | ¥d|i¥||«      d	œS )
NrŠ   ÚmaxProblemsrº   r�   r,   r+   rl   )r�   ÚlikelihoodRangeÚlikelihoodOptionsr…   )ÚengineVersionrŠ   ÚsuggestionsÚpairingFlagsÚchecks)ru   rQ   rq   r¦   rE   r   rx   r}   rŽ   ÚENGINE_VERSIONr¬   rà   )rÓ   rZ   rŠ   Úper_problemr?   rw   ræ   s          r   Úcompute_runrë     sä   € Ü�F—J‘J˜zÓ*Ò0¨bÓ1Ð2R°F·J±J¸}Ó4MÒ4RÐQRÐS€HØ€KØò 	
ˆÜ˜Q Ó'ˆØ×Ñä˜A˜f™I›ÙYZ¬6°!°E±(Ó+;ÄFÈ1ÈUÉ8ÓDTÒ#UÐ`dÜ%7¸Ó%:Ü,¨Q°Ó7ñ	õ	
ð	
ô % X¨vÓ6€Kä'ØØ"Ü% h°Ó7Ü!Ð"B VÐ"B¨Z¸Ñ"BÀFÈKÓXñð r   c                óP  — |xs i }g }t        | j                  d«      xs g «      D ]­  \  }}|t        |d   «      k  r|d   |   ni }|j                  d«      s|j                  |dddœ«       |j                  d«      xs i }|j                  d«      dv r|j                  |dddœ«       |j                  d	«      rŒ–g rŒ™|j                  |d
ddœ«       Œ¯ |d   D ]G  }|d   sŒ	|j                  |d   «      xs dj	                  «       rŒ0|j                  d|d   ddœ«       ŒI |S )NrŠ   r…   z,Set the sensitivity and distribution ranges.)r³   Úcoder²   r�   r+   )Nr   zSet the expected size range.r=   rŸ   z#Mark at least one aspect/elevation.rç   r¤   rP   r   Újustificationz<Explain why both problems in the flagged pairing are needed.)rí   Úpairingr²   )rÏ   rQ   r4   r¦   r2   )	rÓ   ÚcomputedÚjustificationsÚissuesrÕ   r?   r|   r�   Úfs	            r   Ú	readinessrô   0  s:  € Ø#Ò) r€NØ€FÜ˜&Ÿ*™* ZÓ0Ò6°BÓ7ò r‰ˆˆ1Ø'(¬3¨x¸
Ñ/CÓ+DÒ'DˆH�ZÑ  Ò#È"ˆØ�u‰u�\Ô"Ø�M‰M¨1°lÐLzÑ{Ô|Ø�u‰u�V‹}Ò" ˆØ�8‰8�E‹?˜jÑ(Ø�M‰M¨1°fÐFdÑeÔfØ—‘�kÕ"¢bØ�M‰M¨1°jÐJoÑpÕqðrð �nÑ%ò RˆØˆX‹; × 2Ñ 2°1°U±8Ó <Ò BÀ×IÑIÕKØ�M‰M ?¸qÀ¹xð  RPñ  Qõ  RðRð €Mr   )r   r#   rW   rE   )r   úfloat | NonerW   rõ   )r   r   rW   r!   )r   r   rW   rõ   )r   r#   r-   r#   r.   r#   rW   r#   )r7   r1   rW   ztuple[str, str] | None)r=   zlist[str] | NonerW   zset[str])rF   rE   rW   z
str | None)r7   r1   rW   rÍ   )rX   r#   rY   r#   rZ   ÚdictrW   r#   )rn   rö   rZ   rö   rW   údict | None)rw   r÷   rW   z	list[int])rn   rö   rZ   rö   rW   rÍ   )r�   r#   rZ   rö   rW   rE   )r…   rE   r�   r#   rZ   rö   rW   rE   )rŠ   ú
list[dict]rZ   rö   rW   rö   )r�   rö   r‘   rö   rW   r!   )r�   rö   r‘   rö   rZ   rö   rW   r!   )rŠ   rø   rZ   rö   rW   rø   r(   )rÓ   rö   rZ   rö   rÔ   r÷   rW   rø   )rÓ   rö   rZ   rö   rW   rö   )rÓ   rö   rð   rö   rñ   r÷   rW   rø   )"Ú__doc__Ú
__future__r   r   Útypingr   ré   r5   r6   rÑ   rÐ   r   r   r&   r)   r/   r9   r@   rG   rJ   rc   rq   rx   r}   rƒ   r‡   rŽ   r’   r–   r›   r¬   rà   rë   rô   rÇ   r   r   ú<module>rü      s§   ðñõ #ã Ý à€â
`€Ú$€Ø€Ø€
óó
+óó+óóóó5ó7ó(ó*4ó#ó	0óAó
2óó(MóEóYóô@5óvõ.r   