+
    šHAjf  ã                  ó>  € ^ RI Ht ^ RIt^ RIHt ^ RIHtHtHt ^ RI	H
t
HtHtHtHt ^t^t]]]3,          tR R ltR"R R	 llt] ! R
 R4      4       tR R ltR R ltR#R R l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!4      t!R# )$é    )ÚannotationsN)Ú	dataclass)ÚDecimalÚInvalidOperationÚROUND_HALF_UP)ÚAnyÚDictÚListÚOptionalÚTuplec               ó    € V ^8„  d   QhRRRR/# )é   ÚpenniesÚintÚreturnÚstr© )Úformats   "Ú²D:\Dyzine Tek Dropbox\Chris Cummings\Dyzine Tek, LLC\Engineering\Digital Signage\Overhead Bank Signage\DyzineFrame\Cursor OHD Project\DyzineFrame\reusable_odometer\core\engine.pyÚ__annotate__r      s   € ÷ 'ñ '˜Cð ' Cñ 'ó    c                ód   € \        ^ \        V 4      4      pV^d,          pV^d,          pRVR RVR 2# )z&Format integer pennies as `$1,234.56`.Ú$Ú,Ú.Ú02d)Úmaxr   )r   ÚvalueÚdollarsÚcentss   &   r   Úformat_dollarsr!      s;   € ä�”3�w“<Ó €EØ�s�l€GØ�C�K€EØˆw�qˆk˜˜5 ˜+Ð&Ð&r   c               ó$   € V ^8„  d   QhRRRRRR/# )r   r   r   Údefaultr   r   r   )r   s   "r   r   r      s!   € ÷ ñ  Cð °#ð ¸cñ r   c           
     óF  € V f   \        ^ \        V4      4      # \        V \        4      '       d   \        ^ \        V 4      4      # \        V \        4      '       dX   \	        \        V 4      4      \	        R4      ,          p\        ^ \        VP                  \	        R4      \        R7      4      4      # \        V 4      P                  4       pV'       g   \        ^ \        V4      4      # VP                  RR4      P                  RR4      p \	        V4      pRT9   dF   T\	        R4      ,          p\        ^ \        TP                  \	        R4      \        R7      4      4      # \        ^ \        T4      4      #   \        \        3 d    \        ^ \        T4      4      u # i ; i)z9Parse an int-pennies or dollar-string value into pennies.Ú100Ú1)Úroundingr   Ú r   r   )r   r   Ú
isinstanceÚfloatr   r   Úquantizer   ÚstripÚreplacer   Ú
ValueError)r   r#   r    ÚtextÚparseds   &&   r   Úparse_display_to_penniesr1      s@  € à‚}Ü�1”c˜'“lÓ#Ð#Ü�%œ×ÒÜ�1”c˜%“jÓ!Ð!Ü�%œ×ÒÜœ˜E›
Ó#¤g¨e£nÕ4ˆÜ�1”c˜%Ÿ.™.¬°«Ä˜.ÓNÓOÓPÐPäˆu‹:×ÑÓ€DßÜ�1”c˜'“lÓ#Ð#Ø�<‰<˜˜RÓ ×(Ñ(¨¨bÓ1€Dð$Ü˜“ˆð ˆd„{Øœ ›Õ'ˆÜ�1”c˜%Ÿ.™.¬°«Ä˜.ÓNÓOÓPÐPÜˆq”#�f“+ÓÐøô œjÐ)ô $Ü�1”c˜'“lÓ#Ò#ð$ús   ÄE7 Å7&F ÆF c                  óf  € ] tR t^.t$ RtR]R&   RtR]R&   ^ tR]R&   RtR]R&   ^ t	R]R	&   R
t
R]R&   RtR]R&   RtR]R&   RtR]R&   RtR]R&   RtR]R&   RtR]R&   RtR]R&   RtR]R&   RtR]R&   R)tR]R&   R)tR]R&   R tR]R!&   ^tR]R"&   RtR]R#&   RtR]R$&   ^ÈtR]R%&   ]R*R' R( ll4       tR)tR&# )+ÚOdometerConfigiè  r   Úmax_lag_penniesiô  Úpenny_max_lag_penniesÚdime_continuous_lag_penniesi„  Údime_roll_max_lag_penniesÚpenny_roll_max_lag_penniesg333333Ã?r*   Úmin_rateç      à?Úmax_rateç      @Údime_max_rateg      9@Úidle_catchup_secç      @Úcontribution_idle_secg      @Úpenny_roll_secç        Úpenny_roll_sec_minÚcarry_roll_secÚcarry_roll_sec_miniÀáä Úinitial_display_penniesúTuple[CurvePoint, ...]Ú
rate_curveÚroll_curve_secç      ð?Úchase_rate_scaleÚcatchup_lag_thresholdÚcatchup_lag_bonus_per_centÚsnap_behind_threshold_penniesÚsnap_behind_to_lag_penniesNc               ó$   € V ^8„  d   QhRRRRRR/# )r   ÚdatazOptional[Dict[str, Any]]Úkwargsr   r   z'OdometerConfig'r   )r   s   "r   r   ÚOdometerConfig.__annotate__I   s$   € ÷ >ñ >Ø+ð>Ø>Að>à	ñ>r   c                	ó>  € / pV'       d   VP                  V4       VP                  V4       V ! 4       pR  F-  pWS9   g   K  \        W5,          VP                  R7      Vn         M	  / RRbRRbRRbRRbRRbRRbRRbR	R	bR
R	bRRbRRbRRbRRbRRbRRbRRbRRbRRRRRRRRRRRRRRRRRRRRRRRRRR/CpVP                  4        F  w  rxWs9   g   K  \	        WHW7,          4       K!  	  R!p	V	 F*  w  rxp
Ws9   g   K  \	        WH\        W7,          V
4      4       K,  	  V# )"Úinitial_display)r#   r4   r5   Úpenny_max_lagr8   Úpenny_roll_max_lagr6   Údime_continuous_lagr7   Údime_roll_max_lagr9   r;   r=   r>   r@   Úmax_lagÚpennies_min_rateÚpennies_max_raterA   rC   rD   rE   Údime_roll_secÚdime_roll_sec_minrK   rL   rM   rN   rO   Ú!progressive_snap_behind_thresholdÚprogressive_snap_behind_lag)rU   Úinitial_dollarsÚinitial_pennies))rH   rH   Úrate)Úchase_rate_curverH   rc   )Úpennies_per_second_curverH   rc   )rI   rI   Úsec)Úpenny_roll_curve_secrI   rf   )Úroll_sec_curverI   rf   )Úupdater1   rF   ÚitemsÚsetattrÚ_parse_curve_points)ÚclsrQ   rR   ÚmergedÚcfgÚkeyÚkey_mapÚsrcÚdstÚ	curve_mapÚ	value_keys   &&,        r   Úfrom_mappingÚOdometerConfig.from_mappingH   sè  € ð "$ˆßØ�M‰M˜$ÔØ�‰�fÔÙ‹eˆãLˆCØŽ}Ü.FØ•K¨×)DÑ)Dô/�Ô+ñ ñ Mð
ØÐ0ð
à#Ð%<ð
ð Ð4ð
ð )Ð*Fð	
ð
 !Ð">ð
ð *Ð+Hð
ð "Ð#@ð
ð (Ð)Dð
ð  Ð!<ð
ð ˜
ð
ð ˜
ð
ð ˜_ð
ð Ð 2ð
ð $Ð%<ð
ð Ð(ð
ð   
ð!
ð"  
ð#
ð$ Ð.Ø Ð"6ØÐ.Ø Ð"6ØÐ-ØÐ!5ØÐ 2Ø#Ð%<Ø(Ð*FØ+Ð-LØ(Ð*FØ/Ð1PØ)Ð+Gñ=
ˆð@  Ÿ™ž‰HˆCØŽ}Ü˜ &¥+Ö.ñ (ð
ˆ	ó $-ÑˆC�iØŽ}Ü˜Ô"5°fµkÀ9Ó"MÖNñ $-ð ˆ
r   r   ©N)Ú__name__Ú
__module__Ú__qualname__Ú__firstlineno__r4   Ú__annotations__r5   r6   r7   r8   r9   r;   r=   r>   r@   rA   rC   rD   rE   rF   rH   rI   rK   rL   rM   rN   rO   Úclassmethodrv   Ú__static_attributes__r   r   r   r3   r3   .   s   ‡ à€O�SÓØ!$Ð˜3Ó$Ø'(Ð Ó(Ø%(Ð˜sÓ(Ø&'Ð Ó'Ø€HˆeÓØ€HˆeÓØ€M�5ÓØ"Ð�eÓ"Ø#&Ð˜5Ó&Ø€N�EÓØ #Ð˜Ó#Ø€N�EÓØ #Ð˜Ó#Ø#-Ð˜SÓ-Ø)+€JÐ&Ó+Ø-/€NÐ*Ó/Ø!Ð�eÓ!Ø!#Ð˜3Ó#Ø(+Ð Ó+à)-Ð! 3Ó-Ø&)Ð Ó)àö>ó ô>r   r3   c               ó    € V ^8„  d   QhRRRR/# )r   ro   r3   r   r   r   )r   s   "r   r   r   Š   s   € ÷ %ñ %˜nð %°ñ %r   c                ó°   € V P                   '       d   \        R  V P                    4       4      # V P                  ^ 8”  d   V P                  # V P                  # )c              3  ó2   "  € T F  q^ ,          x € K  	  R# 5i©r   Nr   ©Ú.0Úpoints   & r   Ú	<genexpr>Ú'_penny_roll_ramp_lag.<locals>.<genexpr>Œ   ó   é € Ð<Ñ); ˜—8’8Ó);ùó   ‚)rI   r   r8   r5   )ro   s   &r   Ú_penny_roll_ramp_lagr‹   Š   sK   € Ø
××ÐÜÑ<¨×);Ò);Ó<Ó<Ð<Ø
×%Ñ%¨Ô)Ø×-Ñ-Ð-Ø×$Ñ$Ð$r   c               ó    € V ^8„  d   QhRRRR/# )r   ro   r3   r   r*   r   )r   s   "r   r   r   ’   s   € ÷ Pñ P˜.ð P¨Uñ Pr   c                óÖ   € V P                   '       d   \        R  V P                    4       4      # \        V P                  R4      pV P                  ^ 8”  d   V P                  # VR,          # )c              3  ó2   "  € T F  q^,          x € K  	  R# 5i©é   Nr   r„   s   & r   r‡   Ú#slowest_roll_sec.<locals>.<genexpr>”   r‰   rŠ   ç�íµ ÷Æ°>r<   )rI   r   rA   rC   )ro   Úfasts   & r   Úslowest_roll_secr”   ’   sY   € Ø
××ÐÜÑ<¨×);Ò);Ó<Ó<Ð<Üˆs×!Ñ! 4Ó(€DØ%(×%;Ñ%;¸aÔ%?ˆ3×!Ñ!ÐOÀTÈCÅZÐOr   c               ó(   € V ^8„  d   QhRRRRRRRR/# )r   Úpowerr   ro   r3   Úlag_penniesr   r*   r   )r   s   "r   r   r   ™   s,   € ÷ ,ñ ,Øð,Ø#ð,Ø25ð,à
ñ,r   c                óB   € ? V^ 8¼  d   TM
\        V4      p\        W14      # ©r   )r‹   Ú_penny_roll_sec_at_lag)r–   ro   r—   Úlags   &&& r   Úcarry_roll_sec_for_powerrœ   ™   s&   € ð 	Ø$¨Ô)‰+Ô/CÀCÓ/H€CÜ! #Ó+Ð+r   c               ó$   € V ^8„  d   QhRRRRRR/# )r   Údeltar   ro   r3   r   r*   r   )r   s   "r   r   r   ¡   s!   € ÷ $ñ $ #ð $¨Nð $¸uñ $r   c                óV  € VP                   '       d   \        WP                   4      # \        VP                  R 4      pVP                  ^ 8”  d   VP                  MVR,          p\        \        V4      ^4      p\        \        ^ V 4      V4      V,          pW5W#,
          ,          ,           # )r’   r<   )rI   Ú_curve_value_at_lagr   rA   rC   r‹   Úmin)rž   ro   r“   ÚslowÚcapÚts   &&    r   rš   rš   ¡   sˆ   € Ø
××ÐÜ" 5×*<Ñ*<Ó=Ð=Üˆs×!Ñ! 4Ó(€DØ%(×%;Ñ%;¸aÔ%?ˆ3×!Ò!ÀTÈCÅZ€DÜ
Ô" 3Ó'¨Ó
+€CÜŒC��5‹M˜3Ó #Õ%€AØ�t•{Õ#Õ#Ð#r   c               ó    € V ^8„  d   QhRRRR/# )r   r   r   r   ú	List[int]r   )r   s   "r   r   r   «   s   € ÷ Cñ C ð C¨	ñ Cr   c                óœ   € \        ^ \        V 4      4      p \        \        4       Uu. uF  q^
V,          ,          ^
,          NK  	  up# u upi r™   )r   r   ÚrangeÚNUM_COLUMNS)r   Úis   & r   Ú_pennies_to_digitsr«   «   s@   € Ü�!”S˜“\Ó"€GÜ/4´[Ô/AÓBÑ/A¨!˜˜Q�Õ 2×%Ð%Ñ/AÑBÐBùÒBs   §A	c               ó    € V ^8„  d   QhRRRR/# )r   Údigitsr¦   r   r   r   )r   s   "r   r   r   °   s   € ÷ ñ  yð °Sñ r   c                ón   € \        \        ^,
          RR4       F  pW,          ^ 8w  g   K  Vu # 	  \        # )r�   éÿÿÿÿ)r¨   r©   ÚMIN_DISPLAY_POWER)r­   r–   s   & r   Úleftmost_significant_powerr±   °   s0   € Ü”{ Q•¨¨BÖ/ˆØ�=˜AÖØŠLñ 0ô Ðr   c               ó    € V ^8„  d   QhRRRR/# ©r   ro   r3   r   r   r   )r   s   "r   r   r   ·   s   € ÷ ñ ¨ð ¸3ñ r   c                óÂ  € \        V 4      p\        ^ V 4      p\        W4      pV P                  '       g   V P                  '       d¶   V P                  '       d   R\	        V P                  4       R2M(V P
                   RV P                   RV P                   R2pV P                  '       d   R\	        V P                  4       R2M	VR RVR R2pR	\        V P                  4       R
V RV RV P                   R2	# R	\        V P                  4       RV P                   RV RVR RVR RV P
                   RV P                   RV P                   RV P                   R2# )r   zcurve[Ú]z->Ú+zc/sz.2fzs->Úszstart=z  chase=z  roll=z  dimes=intermittent  @ Úcz  chase@zc  roll@zc zs  dimes=intermittent  zc/s @ )r‹   rš   rH   rI   Úlenr9   r;   r=   r!   rF   r4   r5   )ro   Úroll_capÚ	roll_slowÚ	roll_fastÚ
chase_descÚ	roll_descs   &     r   Úformat_odometer_config_summaryr¿   ·   s‡  € Ü# CÓ(€HÜ& q¨#Ó.€IÜ& xÓ5€IØ
‡~‡~€~˜×+×+Ð+ð �~�~ˆ~ð ”S˜Ÿ™Ó(Ð)¨Ñ+à—L‘L�>  C§L¡L >°°3×3DÑ3DÐ2EÀSÐIð 	ð ×!×!Ð!ð ”S˜×+Ñ+Ó,Ð-¨QÑ/à˜c�? # i° _°AÐ6ð 	ð ”^ C×$?Ñ$?Ó@ÐAð BØ�L ¨	 {ð 3%Ø%(×%8Ñ%8Ð$9¸ð<ð	
ð ” × ;Ñ ;Ó<Ð=ð >Ø×*Ñ*Ð+¨8°H°:¸RØ�Sˆ/˜˜Y s˜Oð ,Ø"Ÿ|™|˜n¨B¨s¯|©|¨n¸A¸c×>OÑ>OÐ=Pð QØ× Ñ Ð! ð		$ðr   c               ó    € V ^8„  d   QhRRRR/# r³   r   )r   s   "r   r   r   Ô   s   € ÷ ñ  ð °Cñ r   c                ó>  € \        V ^ R7      pR.pR
 Fw  p\        \        V^d,          4      4      pVP                  V4      p\	        W@4      pRV,          p\        WW4      pVP                  RVR RVR RVR RVR RVR RVR 24       Ky  	  R	P                  V4      # )r   )Úinitial_target_penniesz2lag($)  lag(c)  chase  roll_s  roll_cap  EFFECTIVErJ   z  $z4.2fz  Ú5dz5.2fÚ
)g      Ð?r:   rJ   g       @r?   g      @g      @g      @gö(\�Âõ@r<   g      @g      @g      @g       @g      !@g{®Gáú!@g      "@g      $@)ÚOdometerEnginer   ÚroundÚ_pennies_per_secondrš   r¡   ÚappendÚjoin)	ro   ÚengineÚlinesr   r›   ÚchaseÚrollÚrcapÚeffs	   &        r   Úformat_odometer_lag_maprÐ   Ô   s¹   € Ü˜C¸Ô:€FØAÐB€Eóˆô( ”%˜ #�Ó&Ó'ˆØ×*Ñ*¨3Ó/ˆÜ% cÓ/ˆØ�T�zˆÜ�%ÓˆØ�‰Ø�'˜$�˜r # b ¨¨E°$¨<°r¸$¸t¸ÀBÀtÈDÀkÐQSÐTWÐX\ÐS]Ð^ö	
ñ3ð8 �9‰9�UÓÐr   c               ó$   € V ^8„  d   QhRRRRRR/# )r   Úrawr   ru   r   r   rG   r   )r   s   "r   r   r   ö   s"   € ÷ )ñ )˜Sð )¨Sð )Ð5Kñ )r   c           
     ó2  € \        V \        \        34      '       g   R# / pV  EF  pR pR p\        V\        4      '       d�   VP	                  RVP	                  RVP	                  R4      4      4      pVP	                  VVP	                  RVP	                  R4      4      4      pVe   Vf   KŠ   \        ^ \        V4      4      p\        V4      pM[\        V\        \        34      '       d@   \        V4      ^8¼  d0    \        ^ \        V^ ,          4      4      p\        V^,          4      pVe   Ve   VR8:  d   EK  WRV&   EK   	  \        \        VP                  4       4      4      #   \        \        3 d     EKY  i ; i  \        \        3 d     EKr  i ; i)Nr—   r›   Úxr   ÚyrB   r   )r)   ÚlistÚtupleÚdictÚgetr   r   r*   Ú	TypeErrorr.   r¹   Úsortedrj   )rÒ   ru   ÚpointsÚentryr›   r   Úlag_rawÚ	value_raws   &&      r   rl   rl   ö   s]  € Ü�cœD¤%˜=×)Ò)Øˆ	Ø!€FÜˆØ!ˆØ!%ˆÜ�eœT×"Ò"Ø—i‘i ¨u¯y©y¸ÀÇ	Á	È#ÃÓ/OÓPˆGØŸ	™	ØØ—	‘	˜' 5§9¡9¨S£>Ó2óˆIð Š )Ò"3ÙðÜ˜!œS ›\Ó*�Ü˜iÓ(‘ô ˜¤¤e˜}×-Ò-´#°e³*À´/ðÜ˜!œS  q¥›]Ó+�Ü˜e A�h›�ð Š;˜%š-¨5°C¬<ÚØˆsŒñ1 ô2 ”˜Ÿ™›Ó'Ó(Ð(øô œzÐ*ô Ûðûô œzÐ*ô Ûðús$   Â. E'Ã<.F Å'E=Å<E=Æ FÆFc               ó$   € V ^8„  d   QhRRRRRR/# )r   rž   r   ÚcurverG   r   r*   r   )r   s   "r   r   r     s"   € ÷ ñ ˜sð Ð+Að Àeñ r   c                ó8  € V'       g   R # W^ ,          ^ ,          8:  d   V^ ,          ^,          # V^ ,          w  r#VR,           FE  w  rEW8:  d9   \        WB,
          ^4      pW,
          V,          pW7WS,
          ,          ,           u # YEr2KG  	  VR,          ^,          # )rB   :r�   NNr¯   )r   )rž   rá   Úprev_lagÚ
prev_valuer›   r   Úspanr¤   s   &&      r   r    r      sˆ   € ßÙØ�a•˜•ÔØ�Q�x˜�{ÐØ  �8Ñ€HØ˜B—i�i‰
ˆØŒ<Ü�s•~ qÓ)ˆDØÕ! TÕ)ˆAØ UÕ%7Õ 8Õ8Ò8Ø"’*ñ  ð ��9�Q�<Ðr   c                  ó^  € ] tR tRtR\R R l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4       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  ltR! R" ltR# R$ ltR]R% R& lltR' R( ltR) R* ltR+ R, ltR- R. ltR/ R0 ltR1 R2 ltR3 R4 ltR5 R6 ltR7 R8 lt] R9 R: l4       t!R; R< lt"R= R> lt#R? R@ lt$RA RB lt%] RC RD l4       t&RE RF lt'RG RH lt(RI RJ lt)RK RL lt*] RM RN l4       t+RO RP lt,RQ RR lt-RS RT lt.RU RV lt/RW RX lt0RY RZ lt1R[t2R# )^rÅ   i%  Nc               ó    € V ^8„  d   QhRRRR/# )r   ÚconfigzOptional[OdometerConfig]rÂ   úOptional[int]r   )r   s   "r   r   ÚOdometerEngine.__annotate__&  s   € ÷ /ñ /à(ð/ð !.ñ/r   c                	óª  € T;'       g    \        4       V n        Vf   V P                  P                  M\        ^ \	        V4      4      pW0n        \        V4      V n        \        P                  ! 4       V n
        R.\        ,          V n        R.\        ,          V n        R .\        ,          V n        R.\        ,          V n        R V n        RV n        R # )NrB   F)r3   rè   rF   r   r   Útarget_penniesr*   Údisplay_floatÚtimeÚperf_counterÚ_last_target_change_timer©   Ú_carry_scroll_phaseÚ_carry_finishingÚ_carry_from_digitÚ_carry_was_inÚ_last_maintained_lagÚ_penny_scroll_visual)Úselfrè   rÂ   Ústarts   &&& r   Ú__init__ÚOdometerEngine.__init__&  s³   € ð
 ×0Ð0¤Ó 0ˆŒð &Ò-ð �K‰K×/Ò/ä�QœÐ2Ó3Ó4ð 	ð
 $)ÔÜ$)¨%£LˆÔÜ/3×/@Ò/@Ó/BˆÔ%Ø14°¼Õ0CˆÔ Ø-2¨G´kÕ,AˆÔØ7;°f¼{Õ6JˆÔØ*/¨´;Õ)>ˆÔØ37ˆÔ!Ø+.ˆÖ!r   c               ó    € V ^8„  d   QhRRRR/# ©r   rì   ré   r   ÚNoner   )r   s   "r   r   rê   ;  s   € ÷ *ñ *°ð *À4ñ *r   c                	óÀ   € Vf   R # \        ^ \        V4      4      pW P                  8w  d3   W n        \        P                  ! 4       V n        V P                  4        R # R # rx   )r   r   rì   rî   rï   rð   Úsnap_if_too_far_behind©r÷   rì   r¤   s   && r   Úset_target_penniesÚ!OdometerEngine.set_target_pennies;  sP   € ØÒ!ÙÜ�”3�~Ó&Ó'ˆØ×#Ñ#Ô#Ø"#ÔÜ,0×,=Ò,=Ó,?ˆDÔ)Ø×'Ñ'Ö)ñ $r   c               ó    € V ^8„  d   QhRRRR/# rü   r   )r   s   "r   r   rê   D  s   € ÷ /ñ /¸ð /È$ñ /r   c                óž   € Vf   R# \        ^ \        V4      4      pW n        \        P                  ! 4       V n        V P                  V4       R# )zCSnap target and display immediately to a known starting/live value.N)r   r   rì   rî   rï   rð   Ú_snap_display_to_settled_centsr   s   && r   Údisplay_immediate_penniesÚ(OdometerEngine.display_immediate_penniesD  sA   € àÒ!ÙÜ�”3�~Ó&Ó'ˆØÔÜ(,×(9Ò(9Ó(;ˆÔ%Ø×+Ñ+¨AÖ.r   c               ó    € V ^8„  d   QhRRRR/# rü   r   )r   s   "r   r   rê   M  s   € ÷ 0ñ 0¨ð 0¸4ñ 0r   c                	ó(   € V P                  V4       R # rx   )r  )r÷   rì   s   &&r   Ú
set_targetÚOdometerEngine.set_targetM  s   € Ø×Ñ Ö/r   c               ó    € V ^8„  d   QhRRRR/# ©r   Údelta_penniesr   r   rý   r   )r   s   "r   r   rê   P  s   € ÷ Jñ J°ð J¸ñ Jr   c                	ó\   € V P                  V P                  \        V4      ,           4       R # rx   )r  rì   r   ©r÷   r  s   &&r   Úbump_target_penniesÚ"OdometerEngine.bump_target_penniesP  s    € Ø×Ñ × 3Ñ 3´c¸-Ó6HÕ HÖIr   c               ó    € V ^8„  d   QhRRRR/# r  r   )r   s   "r   r   rê   S  s   € ÷ 0ñ 0¨ð 0°ñ 0r   c                	ó(   € V P                  V4       R # rx   )r  r  s   &&r   Úbump_targetÚOdometerEngine.bump_targetS  s   € Ø× Ñ  Ö/r   c               ó   € V ^8„  d   QhRR/# ©r   r   r   r   )r   s   "r   r   rê   W  s   € ÷ %ñ % ñ %r   c                	ó"   € V P                  4       # rx   )Ú_settled_cents©r÷   s   &r   Údisplay_penniesÚOdometerEngine.display_penniesV  s   € à×"Ñ"Ó$Ð$r   c               ó   € V ^8„  d   QhRR/# ©r   r   Úboolr   )r   s   "r   r   rê   Z  s   € ÷ 
ñ 
˜dñ 
r   c                	ó0  € V P                  4       ^ 8„  ;'       g}    V P                  R8„  ;'       gf    \        ;QJ d&    R V P                   4       F  '       g   K   RM	  RM! R V P                   4       4      ;'       g    \        V P                  4      # )r   r’   c              3  ó*   "  € T F	  qR 8„  x € K  	  R# 5i)r’   Nr   )r…   Úps   & r   r‡   Ú.OdometerEngine.is_animating.<locals>.<genexpr>^  s   é € Ð>Ñ%= �t–8Ó%=ùs   ‚TF)r—   rö   Úanyrñ   rò   r  s   &r   Úis_animatingÚOdometerEngine.is_animatingZ  s~   € à×ÑÓ Ñ"÷ *ð *Ø×(Ñ(¨4Ñ/÷*ð *ç‹sÑ> T×%=Ò%=Ó>�s�sŠsÑ> T×%=Ò%=Ó>Ó>÷*ð *ô �4×(Ñ(Ó)ð		
r   c               ó   € V ^8„  d   QhRR/# r  r   )r   s   "r   r   rê   b  s   € ÷ 'ñ ' ñ 'r   c                	ó,   € \        V P                  4      # rx   )r   rí   r  s   &r   r  ÚOdometerEngine._settled_centsb  s   € Ü�4×%Ñ%Ó&Ð&r   c               ó   € V ^8„  d   QhRR/# r  r   )r   s   "r   r   rê   e  s   € ÷ ñ ˜Tñ r   c                	óÀ   € \        V P                  4      V P                  ,
          pWP                  P                  8:  d   R # V P                  V P                  4       R# )FT)r   rí   rì   rè   r4   r  )r÷   Ú	overshoots   & r   Úsnap_if_wonÚOdometerEngine.snap_if_wone  sG   € Ü˜×*Ñ*Ó+¨d×.AÑ.AÕAˆ	ØŸ™×3Ñ3Ô3ÙØ×+Ñ+¨D×,?Ñ,?Ô@Ùr   c               ó   € V ^8„  d   QhRR/# r  r   )r   s   "r   r   rê   l  s   € ÷ ñ ¨ñ r   c                ór  € V P                  4       p\        ^ \        V P                  P                  4      4      p\        ^ \        V P                  P
                  4      4      pV^ 8:  g   W8:  d   R# \        ^ V P                  V,
          4      pV P                  4       V8X  d   R# V P                  V4       R# )zDIf lag exceeds threshold, jump display to a fixed lag behind target.FT)	r—   r   r   rè   rN   rO   rì   r  r  )r÷   r›   Ú	thresholdÚ
target_lagÚsnap_displays   &    r   rÿ   Ú%OdometerEngine.snap_if_too_far_behindl  s‘   € à×ÑÓ ˆÜ˜œ3˜tŸ{™{×HÑHÓIÓJˆ	Ü˜œC §¡× FÑ FÓGÓHˆ
Ø˜Œ>˜SÔ-ÙÜ˜1˜d×1Ñ1°JÕ>Ó?ˆØ×ÑÓ  LÔ0ÙØ×+Ñ+¨LÔ9Ùr   c               ó   € V ^8„  d   QhRR/# r  r   )r   s   "r   r   rê   y  s   € ÷ .ñ . tñ .r   c                	ó|   € \         P                  ! 4       V P                  ,
          V P                  P                  8  # rx   )rî   rï   rð   rè   r@   r  s   &r   Ú_contributions_activeÚ$OdometerEngine._contributions_activey  s0   € ä×ÒÓ $×"?Ñ"?Õ?Ø�K‰K×-Ñ-ñ.ð 	.r   c               ó    € V ^8„  d   QhRRRR/# ©r   rž   ré   r   r*   r   )r   s   "r   r   rê   ~  s   € ÷ /ñ /¨ð /Àñ /r   c                	óL   € Vf   V P                  4       pV P                  V4      # rx   )r—   rÇ   ©r÷   rž   s   &&r   Úpennies_per_secondÚ!OdometerEngine.pennies_per_second~  s&   € ØŠ=Ø×$Ñ$Ó&ˆEØ×'Ñ'¨Ó.Ð.r   c               ó    € V ^8„  d   QhRRRR/# r;  r   )r   s   "r   r   rê   ƒ  s   € ÷ $ñ $°-ð $È5ñ $r   c                	ó(  € Vf   V P                  4       pV^ 8:  d   R# \        V P                  V4      V P                  V4      4      pV P	                  4       p\        RV\        V P                  4       4      ,
          4      R,          p\        W$4      # )NrB   g      N@)r—   r¡   rÇ   Ú_chase_animation_capÚ_intermittent_display_ceilingr   r*   r  )r÷   rž   rÌ   ÚceilÚheadrooms   &&   r   Úeffective_pennies_per_secondÚ+OdometerEngine.effective_pennies_per_secondƒ  s~   € ØŠ=Ø×$Ñ$Ó&ˆEØ�AŒ:ÙÜ�D×,Ñ,¨UÓ3°T×5NÑ5NÈuÓ5UÓVˆØ×1Ñ1Ó3ˆÜ�s˜D¤5¨×)<Ñ)<Ó)>Ó#?Õ?Ó@À4ÕGˆÜ�5Ó#Ð#r   c               ó    € V ^8„  d   QhRRRR/# ©r   rž   r   r   r*   r   )r   s   "r   r   rê   �  s   € ÷ ñ ¨ð °ñ r   c                	óÔ  € V P                   pV^ 8:  d   R# V P                  4       '       g'   \        VP                  WP                  ,          4      # VP
                  '       d   \        WP
                  4      pMÉ\        VP                  ^4      pW8:  d>   W,          pVP                  WRP                  VP                  ,
          ,          ,           pMpVP                  p\        VP                  VP                  ,
          ^4      p\        WP                  ,
          V4      pW‡,          pWeVP                  ,          ,           p\        R\        VP                  4      4      p	W9,          p\        ^ \        VP                  4      4      p
\        R\        VP                   4      4      pV
^ 8”  d:   V^ 8”  d3   W8”  d-   V P                  4       '       d   W1V
,
          V,          ,          pV# )r   rB   gš™™™™™©?)rè   r8  r   r9   r>   rH   r    r5   r;   r4   r¡   r=   r*   rK   r   rL   rM   )r÷   rž   ro   rc   Ú	penny_capr¤   Ú
penny_rateÚbandÚexcessÚscaler2  Úbonuss   &&          r   rÇ   Ú"OdometerEngine._pennies_per_second�  sn  € Ø�k‰kˆØ�AŒ:ÙØ×)Ñ)×+Ò+Ü�s—|‘| U×-AÑ-AÕ%AÓBÐBØ�>�>ˆ>Ü& u¯n©nÓ=‰Dä˜C×5Ñ5°qÓ9ˆIØÔ!ØÕ%�Ø—|‘| a¯<©<¸#¿,¹,Õ+FÕ&GÕG‘à Ÿ\™\�
Ü˜3×.Ñ.°×1JÑ1JÕJÈAÓN�Ü˜U×%>Ñ%>Õ>ÀÓE�Ø•M�Ø!¨×(9Ñ(9Õ$9Õ9�Ü�Dœ% × 4Ñ 4Ó5Ó6ˆØ�|ˆÜ˜œ3˜s×8Ñ8Ó9Ó:ˆ	Ü�Cœ˜s×=Ñ=Ó>Ó?ˆà˜ŒMØ˜”	ØÔ!Ø×*Ñ*×,Ò,à˜YÕ&¨%Õ/Õ/ˆDØˆr   c               ó    € V ^8„  d   QhRRRR/# rI  r   )r   s   "r   r   rê   ­  s   € ÷ 
ñ 
¨#ð 
°%ñ 
r   c           	     	óŠ   € R \        \        \        ^ V4      \        V P                  4      4      V P                  4      ,          # )rJ   )rš   r¡   r   r‹   rè   r=  s   &&r   rB  Ú#OdometerEngine._chase_animation_cap­  s7   € ØÔ+Ü”�A�u“Ô3°D·K±KÓ@ÓAÀ4Ç;Á;ó
õ 
ð 	
r   c               ó$   € V ^8„  d   QhRRRRRR/# ©r   rí   r*   r–   r   r   r   )r   s   "r   r   rê   ²  s!   € ÷ -ñ -¨eð -¸Cð -ÀEñ -r   c                	ó2   € ^
V,          pW,          V,          # ©é
   r   )r÷   rí   r–   Úunits   &&& r   Ú_column_fractionÚOdometerEngine._column_fraction²  s   € Ø�5�yˆØÕ$¨Õ,Ð,r   c               ó    € V ^8„  d   QhRRRR/# )r   r    ré   r   rý   r   )r   s   "r   r   rê   ¶  s   € ÷ 'ñ '°Mð 'ÈTñ 'r   c                	ó¦   € Vf   V P                  4       M\        ^ \        V4      4      p\        V4      V n        RV n        V P                  4        R # )NrB   )r  r   r   r*   rí   rö   Ú_clear_all_carry_scroll)r÷   r    r   s   && r   r  Ú-OdometerEngine._snap_display_to_settled_cents¶  sA   € Ø).ª�×#Ñ#Ô%¼CÀÄ3ÀuÃ:Ó<NˆÜ" 5›\ˆÔØ$'ˆÔ!Ø×$Ñ$Ö&r   c               ó   € V ^8„  d   QhRR/# ©r   r   rý   r   )r   s   "r   r   rê   ¼  s   € ÷ +ñ +¨ñ +r   c                	óä   € V P                  4       p\        V P                  V,
          4      R 8”  d   \        V4      V n        V P	                  4       ^ 8:  d   RV n        V P                  4        R# R# )ç•Ö&è.>rB   N)r  Úabsrí   r*   r—   rö   r_  )r÷   Úsettleds   & r   Ú_discard_sub_cent_slopÚ%OdometerEngine._discard_sub_cent_slop¼  s^   € Ø×%Ñ%Ó'ˆÜˆt×!Ñ! GÕ+Ó,¨tÔ3Ü!& w£ˆDÔØ×ÑÓ Ô"Ø(+ˆDÔ%Ø×(Ñ(Ö*ñ #r   c               ó    € V ^8„  d   QhRRRR/# )r   Údtr*   r   r   )r   s   "r   r   rê   Ä  s   € ÷ $ñ $ 5ð $¨Uñ $r   c           	     	ó¾   € \        \        \        ^V P                  4       4      \	        V P
                  4      4      V P
                  4      pV\        VR4      ,          # )r�   r’   )rš   r¡   r   r—   r‹   rè   )r÷   rj  rÍ   s   && r   Ú_penny_roll_stepÚOdometerEngine._penny_roll_stepÄ  sJ   € Ü%Ü”�A�t×'Ñ'Ó)Ó*Ô,@ÀÇÁÓ,MÓNØ�K‰Kó
ˆð ”C˜˜d“OÕ#Ð#r   c               ó   € V ^8„  d   QhRR/# r  r   )r   s   "r   r   rê   Ë  s   € ÷ /ñ /°ñ /r   c                	óz   € V P                  4       pV P                  V,
          pV^ 8„  ;'       d    V^
,          ^	8H  # r™   )r  rì   )r÷   rf  Úgaps   &  r   Ú_chase_needs_penny_carry_chainÚ-OdometerEngine._chase_needs_penny_carry_chainË  s;   € Ø×%Ñ%Ó'ˆØ×!Ñ! GÕ+ˆØ�Q‰w×.Ð.˜G b�L¨QÑ.Ð.r   c               ó    € V ^8„  d   QhRRRR/# ©r   rj  r*   r   rý   r   )r   s   "r   r   rê   Ð  s   € ÷ Nñ N ð N¨4ñ Nr   c                	óÒ  € V P                  4       pV P                  V8:  d   R # V P                  4       '       d6   V P                  V4      p\	        RV P
                  V,           4      V n        R # V P                  V4      p\	        RV P
                  V,           4      V n        V P
                  R8¼  d5   RV n        \        \	        V^,           V P                  4      4      V n        R # R # )NrJ   rB   ç¡�vÿÿÿï?)r  rì   rq  rl  r¡   rö   r*   rí   ©r÷   rj  rf  Ústeps   &&  r   Ú_chase_cent_upÚOdometerEngine._chase_cent_upÐ  sÀ   € Ø×%Ñ%Ó'ˆØ×Ñ 'Ô)ÙØ×.Ñ.×0Ò0Ø×(Ñ(¨Ó,ˆDÜ(+¨C°×1JÑ1JÈTÕ1QÓ(RˆDÔ%ÙØ×$Ñ$ RÓ(ˆÜ$'¨¨T×-FÑ-FÈÕ-MÓ$NˆÔ!Ø×$Ñ$¨
Ô2Ø(+ˆDÔ%Ü!&¤s¨7°Q­;¸×8KÑ8KÓ'LÓ!MˆDÖñ 3r   c               ó    € V ^8„  d   QhRRRR/# rt  r   )r   s   "r   r   rê   Þ  s   € ÷ Jñ J 5ð J¨Tñ Jr   c                	ó²  € V P                  4       pW P                  8:  d   R # V P                  V4      pV P                  R8”  dh   \	        RV P                  V,
          4      V n        V P                  R8:  d3   RV n        \        \	        V^,
          V P                  4      4      V n        R # \        \	        V^,
          V P                  4      4      V n        R # )Nr’   rB   rd  )r  rì   rl  rö   r   r*   rí   rw  s   &&  r   Ú_chase_cent_downÚOdometerEngine._chase_cent_downÞ  s¬   € Ø×%Ñ%Ó'ˆØ×)Ñ)Ô)ÙØ×$Ñ$ RÓ(ˆØ×$Ñ$ tÔ+Ü(+¨C°×1JÑ1JÈTÕ1QÓ(RˆDÔ%Ø×(Ñ(¨DÔ0Ø,/�Ô)Ü%*¬3¨w¸­{¸D×<OÑ<OÓ+PÓ%Q�Ô"ÙÜ"¤3 w°¥{°D×4GÑ4GÓ#HÓIˆÖr   c               ó    € V ^8„  d   QhRRRR/# rt  r   )r   s   "r   r   rê   ë  s   € ÷ -ñ -˜ð - 4ñ -r   c                	óf  € V^ 8:  d   R# V P                  4        V P                  4        V P                  4       pV P                  V8”  d   V P	                  V4       MCV P                  V8  d#   V P                  V4       V P                  4        MV P                  4        V P                  V4       R# rƒ   )	r.  rÿ   r  rì   ry  r}  Ú$_sync_intermittent_phases_to_displayrg  Ú_update_intermittent_scroll)r÷   rj  rf  s   && r   ri   ÚOdometerEngine.updateë  s�   € Ø�Œ7ÙØ×ÑÔØ×#Ñ#Ô%Ø×%Ñ%Ó'ˆØ×Ñ Ô(Ø×Ñ Õ#Ø× Ñ  7Ô*Ø×!Ñ! "Ô%Ø×5Ñ5Õ7à×'Ñ'Ô)Ø×(Ñ(¨Ö,r   c               ó    € V ^8„  d   QhRRRR/# ©r   r–   r   r   rý   r   )r   s   "r   r   rê   ú  s   € ÷ *ñ *¨ð *°ñ *r   c                	ó~   € R V P                   V&   RV P                  V&   RV P                  V&   RV P                  V&   R# )rB   FN)rñ   rò   ró   rô   ©r÷   r–   s   &&r   Ú_clear_carry_scrollÚ"OdometerEngine._clear_carry_scrollú  sB   € Ø*-ˆ× Ñ  Ñ'Ø',ˆ×Ñ˜eÑ$Ø(,ˆ×Ñ˜uÑ%Ø$)ˆ×Ñ˜5Ó!r   c               ó   € V ^8„  d   QhRR/# rb  r   )r   s   "r   r   rê      s   € ÷ ,ñ ,¨ñ ,r   c                	óT   € \        \        4       F  pV P                  V4       K  	  R # rx   )r¨   r©   rˆ  r‡  s   & r   r_  Ú&OdometerEngine._clear_all_carry_scroll   s   € Üœ;Ö'ˆEØ×$Ñ$ UÖ+ó (r   c               ó   € V ^8„  d   QhRR/# rb  r   )r   s   "r   r   rê     s   € ÷ 9ñ 9°dñ 9r   c                	ój  € V P                   p\        ^\        4       F’  pV P                  V,          pVR8:  d   K  V P	                  V4      '       d   V P                  V4      pM-V P                  V,          '       d   V P                  W4      pMKu  W4R,           8”  g   K„  W@P                  V&   K”  	  R# )r�   r’   N)rí   r¨   r©   rñ   Ú_column_cascade_activeÚ_intermittent_scroll_targetrò   r[  )r÷   Údfr–   ÚphaseÚtargets   &    r   r�  Ú3OdometerEngine._sync_intermittent_phases_to_display  s•   € Ø×ÑˆÜ˜1œkÖ*ˆEØ×,Ñ,¨UÕ3ˆEØ˜Œ}ÙØ×*Ñ*¨5×1Ò1Ø×9Ñ9¸%Ó@‘Ø×&Ñ& u×-Ô-Ø×.Ñ.¨rÓ9‘áØ •}Ö$Ø28×(Ñ(¨Ó/ó +r   c               ó$   € V ^8„  d   QhRRRRRR/# )r   Úsettled_centsr   r–   r   r   )r   s   "r   r   rê     s!   € ÷ 3ñ 3 sð 3°3ð 3¸3ñ 3r   c                	ó0   € V ^
V,          ,          ^
,          # rX  r   )r–  r–   s   &&r   Ú_digit_at_powerÚOdometerEngine._digit_at_power  s   € à " e¥)Õ,°Õ2Ð2r   c               ó   € V ^8„  d   QhRR/# r  r   )r   s   "r   r   rê     s   € ÷ &ñ & Tñ &r   c                	ó(   € V P                  4       ^ 8„  # r™   ©r—   r  s   &r   Ú_display_is_chasingÚ"OdometerEngine._display_is_chasing  s   € Ø×ÑÓ! AÑ%Ð%r   c               ó    € V ^8„  d   QhRRRR/# ©r   r–   r   r   r   r   )r   s   "r   r   rê     s   € ÷ Uñ U¨Sð U°Tñ Ur   c                	ó‚   € V P                   V,          pVR 8„  ;'       d    VR8  ;'       g    V P                  V,          # )r’   rv  )rñ   rò   )r÷   r–   r’  s   && r   Ú_carry_roll_in_progressÚ&OdometerEngine._carry_roll_in_progress  s<   € Ø×(Ñ(¨Õ/ˆØ˜‘×3Ð3 ¨Ñ!3×TÐT¸×8MÑ8MÈeÕ8TÐTr   c               ó    € V ^8„  d   QhRRRR/# r   r   )r   s   "r   r   rê     s   € ÷ 
ñ 
¨Cð 
°Dñ 
r   c                	óÆ  € V^ 8:  d   R# V P                  V4      '       d   R# V P                  4       '       g   R# V P                  4       pV^8X  d   V P                  V^4      # V P                  W!4      '       g   R# V P	                  W!4      ^	8¼  d   R# V^,
          pV P                  V4      ;'       g-    V P
                  V,          ;'       g    V P                  V4      # )r   FT)r¢  r�  r  Ú_column_in_carryr˜  rò   r�  )r÷   r–   rf  Úlowers   &&  r   r�  Ú%OdometerEngine._column_cascade_active  sÐ   € Ø�AŒ:ÙØ×'Ñ'¨×.Ò.ÙØ×'Ñ'×)Ò)ÙØ×%Ñ%Ó'ˆØ�AŒ:Ø×(Ñ(¨°!Ó4Ð4Ø×$Ñ$ W×4Ò4ÙØ×Ñ Ó/°1Ô4ÙØ˜•	ˆà×(Ñ(¨Ó/÷ 2ð 2Ø×$Ñ$ UÕ+÷2ð 2à×*Ñ*¨5Ó1ð	
r   c               ó    € V ^8„  d   QhRRRR/# ©r   r–   r   r   r*   r   )r   s   "r   r   rê   3  s   € ÷ ñ °ð ¸ñ r   c                	ó8   € V P                  V4      '       g   R # R# )rB   rJ   )r�  r‡  s   &&r   r�  Ú*OdometerEngine._intermittent_scroll_target3  s   € Ø×*Ñ*¨5×1Ò1ÙÙr   c               ó$   € V ^8„  d   QhRRRRRR/# rV  r   )r   s   "r   r   rê   9  s!   € ÷ 1ñ 1¨ð 1°sð 1¸uñ 1r   c                	ó„   € ^
V,          p\        V 4      V,          V,          p\        W2,           ^,
          4      R,           # )rY  gé!çýÿï?)r   r*   )rí   r–   rZ  Útails   &&  r   Ú_carry_window_capÚ OdometerEngine._carry_window_cap8  s5   € à�5�yˆÜ�MÓ" dÕ*¨dÕ2ˆÜ�T•[ 1•_Ó%¨Õ0Ð0r   c               ó    € V ^8„  d   QhRRRR/# )r   rí   r*   r   zOptional[float]r   )r   s   "r   r   rê   >  s   € ÷ 	ñ 	°Uð 	¸ñ 	r   c                	óB  € . p\        ^\        4       Fu  pV P                  V4      '       d#   VP                  V P	                  W4      4       K<  V P                  V4      '       g   KU  VP                  V P	                  W4      4       Kw  	  V'       g   R# \        V4      # r�   )r¨   r©   r¢  rÈ   r°  r�  r¡   )r÷   rí   Úcapsr–   s   &&  r   Ú_carry_display_hold_capÚ&OdometerEngine._carry_display_hold_cap>  sz   € ØˆÜ˜1œkÖ*ˆEØ×+Ñ+¨E×2Ò2Ø—‘˜D×2Ñ2°=ÓHÖIØ×,Ñ,¨U×3Ô3Ø—‘˜D×2Ñ2°=ÓHÖIñ	 +÷
 ÙÜ�4‹yÐr   c               ó    € V ^8„  d   QhRRRR/# r…  r   )r   s   "r   r   rê   I  s   € ÷ ,ñ ,¨sð ,°tñ ,r   c                	óF  € \        V^,           \        4       F6  pV P                  V4      '       g   V P                  V,          '       g   K5   R# 	  V P	                  4       pW0P
                  8¼  d   R# V P
                  V,
          pV^8X  d,   V^
,          ^	8X  d   V P                  V P
                  4       R# ^
V,          pW5,          V^,
          8  d   R# \        W5,          V,          V,           V P
                  4      pWc8”  d   \        V4      V n	        RV n
        R# R# )r�   NrB   )r¨   r©   r¢  rò   r  rì   r  r¡   r*   rí   rö   )r÷   r–   Úhigherrf  rp  rZ  Úbumpeds   &&     r   Ú_bump_display_after_carryÚ(OdometerEngine._bump_display_after_carryI  sê   € Ü˜E A�I¤{Ö3ˆFØ×+Ñ+¨F×3Ò3°t×7LÑ7LÈV×7TÖ7TÚñ 4ð ×%Ñ%Ó'ˆØ×)Ñ)Ô)ÙØ×!Ñ! GÕ+ˆØ�!Œ8˜ 2�¨!Ô+Ø×/Ñ/°×0CÑ0CÔDÙØ�5�yˆØ�N˜d Q�hÔ&ÙÜ�g•o¨Õ-°Õ4°d×6IÑ6IÓJˆØÔÜ!& v£ˆDÔØ(+ˆDÖ%ñ r   c               ó   € V ^8„  d   QhRR/# )r   r   r*   r   )r   s   "r   r   rê   \  s   € ÷ ñ ¨uñ r   c                	ó„   € \        V P                  4      pV P                  V P                  4      pVe   \	        W4      pV# rx   )r*   rì   rµ  rí   r¡   )r÷   Úceilingr£   s   &  r   rC  Ú,OdometerEngine._intermittent_display_ceiling\  s<   € Ü˜×+Ñ+Ó,ˆØ×*Ñ*¨4×+=Ñ+=Ó>ˆØŠ?Ü˜'Ó'ˆGØˆr   c               ó    € V ^8„  d   QhRRRR/# rt  r   )r   s   "r   r   rê   c  s   € ÷ !,ñ !,¨eð !,¸ñ !,r   c                	óÈ  € V^ 8:  d   R# \        ^\        4       EFÃ  pV P                  4       ^
V,          ,          ^
,          pV P                  V,          pV\	        W P
                  V P                  4       R7      ,          pVR8¼  d%   V P                  V4       V P                  V4       K“  V P                  V4      pV P                  V,          pV'       dn   V'       g   W0P                  V&   RV P                  V&   RV P                  V&   V P                  V4      pW„8”  d    \        W„V,           4      V P                  V&   EK,  RV P                  V&   VR8”  dq   V P                  V,          e\   RV P                  V&   \        RWE,           4      pW@P                  V&   VR8¼  d#   V P                  V4       V P                  V4       EK²  V P                  V4       EKÆ  	  R# )r   Nrœ  rJ   TFr’   rv  )r¨   r©   r  rñ   rœ   rè   r—   rˆ  r»  r�  rô   ró   rò   r�  r¡   )	r÷   rj  r–   rf  r’  rx  Ú	cascadingÚwas_inr“  s	   &&       r   r‚  Ú*OdometerEngine._update_intermittent_scrollc  s£  € Ø�Œ7ÙÜ˜1œk×*ˆEØ×*Ñ*Ó,°°UµÕ;¸rÕAˆGØ×,Ñ,¨UÕ3ˆEØÔ0Ø—{‘{°×0@Ñ0@Ó0Bôõ ˆDð ˜
Ô"Ø×(Ñ(¨Ô/Ø×.Ñ.¨uÔ5ÙØ×3Ñ3°EÓ:ˆIØ×'Ñ'¨Õ.ˆFßßØ4;×*Ñ*¨5Ñ1Ø,0�×"Ñ" 5Ñ)Ø/4�×%Ñ% eÑ,Ø×9Ñ9¸%Ó@�Ø”>Ü69¸&È$Å,Ó6O�D×,Ñ,¨UÑ3ÚØ(-ˆD×Ñ˜uÑ%Ø�tŒ| × 6Ñ 6°uÕ =Ò IØ/3�×%Ñ% eÑ,Ü˜C ¥Ó.�Ø27×(Ñ(¨Ñ/Ø˜JÔ&Ø×,Ñ,¨UÔ3Ø×2Ñ2°5Ô9ÚØ×$Ñ$ U×+ó= +r   c               ó$   € V ^8„  d   QhRRRRRR/# )r   r–  r   r–   r   r   r   )r   s   "r   r   rê   ‡  s!   € ÷ 0ñ 0¨ð 0°Cð 0¸Dñ 0r   c                	óJ   € V^ 8:  d   R# ^
V,          pW,          V^,
          8¬  # )r   Fr   )r–  r–   Úmods   && r   r¦  ÚOdometerEngine._column_in_carry†  s'   € à�AŒ:ÙØ�%�iˆØÕ#¨¨a­Ñ/Ð/r   c               ó   € V ^8„  d   QhRR/# )r   r   r¦   r   )r   s   "r   r   rê   �  s   € ÷ ;ñ ; Iñ ;r   c                	ó>   € \        \        V P                  4      4      # rx   )r«   r   rí   r  s   &r   Úget_display_digitsÚ!OdometerEngine.get_display_digits�  s   € Ü!¤# d×&8Ñ&8Ó"9Ó:Ð:r   c               ó    € V ^8„  d   QhRRRR/# )r   r–   r   r   zTuple[int, float]r   )r   s   "r   r   rê   �  s   € ÷ +ñ + Sð +Ð->ñ +r   c                	óV  € V^ 8  g   V\         8¼  d   R# V^ 8X  d$   V P                  4       ^
,          V P                  3# ^
V,          pV P                  4       V,          ^
,          pV P                  V,          pVR8:  d   VR3# V P                  V,          pVf   TpV\        VR4      3# )r   rB   r’   rJ   )r   rB   )r©   r  rö   rñ   ró   r¡   )r÷   r–   rZ  rf  r’  Ú
from_digits   &&    r   Úget_column_drawÚOdometerEngine.get_column_draw�  s©   € Ø�1Œ9˜¤Ô,ØˆMØ�AŒ:Ø×&Ñ&Ó(¨2Õ-¨t×/HÑ/HÐHÐHØ�5�yˆØ×&Ñ&Ó(¨DÕ0°BÕ6ˆØ×(Ñ(¨Õ/ˆØ�DŒ=Ø˜C�<ÐØ×+Ñ+¨EÕ2ˆ
ØÒØ ˆJØœ3˜u c›?Ð*Ð*r   c               ó    € V ^8„  d   QhRRRR/# rª  r   )r   s   "r   r   rê   Ÿ  s   € ÷ .ñ . sð .¨uñ .r   c                	ó2   € V P                  V4      ^,          # )r�   )rÑ  r‡  s   &&r   Úget_column_scrollÚ OdometerEngine.get_column_scrollŸ  s   € Ø×#Ñ# EÓ*¨1Õ-Ð-r   c               ó   € V ^8„  d   QhRR/# r  r   )r   s   "r   r   rê   ¢  s   € ÷ Cñ C˜Sñ Cr   c                	óX   € \        ^ V P                  V P                  4       ,
          4      # r™   )r   rì   r  r  s   &r   r—   ÚOdometerEngine.lag_pennies¢  s#   € Ü�1�d×)Ñ)¨D×,?Ñ,?Ó,AÕAÓBÐBr   c               ó    € V ^8„  d   QhRRRR/# )r   r—   r   r   rý   r   )r   s   "r   r   rê   ¥  s   € ÷ <ñ <¨ð <°ñ <r   c                	óR  € \        \        ^ \        V4      4      V P                  P                  4      pV P
                  pVe   W#8  d   V P                  4        RV n        \        ^ V P                  4       V,           4      V n	        W n        \        P                  ! 4       V n        R# )r   NrB   )r¡   r   r   rè   r4   rõ   r�  rö   r  rì   rî   rï   rð   )r÷   r—   r›   rã   s   &&  r   Úmaintain_lagÚOdometerEngine.maintain_lag¥  s�   € Ü”#�aœ˜[Ó)Ó*¨D¯K©K×,GÑ,GÓHˆØ×,Ñ,ˆØÒ C¤NØ×5Ñ5Ô7Ø(+ˆDÔ%Ü! ! T×%8Ñ%8Ó%:¸SÕ%@ÓAˆÔØ$'Ô!Ü(,×(9Ò(9Ó(;ˆÖ%r   c               ó   € V ^8„  d   QhRR/# rb  r   )r   s   "r   r   rê   ¯  s   € ÷ )ñ )¨ñ )r   c                	óJ   € V P                  V P                  4       R V n        R # rx   )r  rì   rõ   r  s   &r   Úreset_display_to_targetÚ&OdometerEngine.reset_display_to_target¯  s   € Ø×+Ñ+¨D×,?Ñ,?Ô@Ø$(ˆÖ!r   )
rò   ró   rñ   rô   rõ   rð   rö   rè   rí   rì   )NNrx   )3ry   rz   r{   r|   rù   r  r  r
  r  r  Úpropertyr  r&  r  r.  rÿ   r8  r>  rF  rÇ   rB  r[  r  rg  rl  rq  ry  r}  ri   rˆ  r_  r�  Ústaticmethodr˜  r�  r¢  r�  r�  r°  rµ  r»  rC  r‚  r¦  rÌ  rÑ  rÕ  r—   rÜ  rà  r   r   r   r   rÅ   rÅ   %  s&  † ÷/õ**õ/õ0õJõ0ð ô%ó ð%õ
õ'õõõ.÷
/÷
$õõ@
õ
-÷'õ+õ$õ/õ
NõJõ-õ*õ,õ9ð ô3ó ð3õ&õUõ
õ*ð
 ô1ó ð1õ
	õ,õ&õ!,ðF ô0ó ð0õ;õ+õ.õCõ<÷)ñ )r   rÅ   r™   )r¯   )"Ú
__future__r   rî   Údataclassesr   Údecimalr   r   r   Útypingr   r	   r
   r   r   r©   r°   r   r*   Ú
CurvePointr!   r1   r3   r‹   r”   rœ   rš   r«   r±   r¿   rÐ   rl   r    rÅ   r   r   r   Ú<module>ré     sœ   ðÝ "ã Ý !ß <Ñ <ß 3Õ 3à€ØÐ Ø�3˜�:Õ€
õ'÷ð2 ÷Xð Xó ðXõv%õP÷,õ$õCõ
õõ:õD)õ@÷L)ó L)r   