§
    éƒtjI  ã                  ó¶   — d Z ddlmZ ddlZddlZddlmZmZmZ  ej	        dej
        ¦  «        Z ej	        d¦  «        Zdd„Zdd„Zdd„Zdd„Zdd„Zdd„ZdS )z@Safe arithmetic calculator for chat (no eval of arbitrary code).é    )ÚannotationsN)ÚDecimalÚInvalidOperationÚlocalcontextzn^(please\s+)?(can\s+you\s+)?(please\s+)?(calculate|compute|solve|evaluate|simplify|what\s+is|whats|what\'s)\s+u   ^[\d\s+\-*/().%,^=xXÃ·Ã—]+$ÚtextÚstrÚreturnÚboolc                ó  — t          | ¦  «        }t          |¦  «        dk     st          j        d|¦  «        sdS t          j        d|¦  «        sdS t          j        d|¦  «        rdS t	          t
                               |¦  «        ¦  «        S )zATrue for calculator-style expressions with no accounting wording.é   z\dFu   [+\-*/Ã·Ã—xX^=]z[a-wyzA-WYZ])Ú_normalize_exprÚlenÚreÚsearchr
   Ú_PURE_MATH_REÚ	fullmatch©r   Úss     ú./var/www/html/CA-Chatbot/app/rag/calculator.pyÚis_pure_mathr      s‚   € å˜ÑÔ€AÝ
ˆ1�v„v�‚z€z�œ 5¨!Ñ,Ô,€zØˆuÝŒ9Ð'¨Ñ+Ô+ð ØˆuÝ	„y� !Ñ$Ô$ð ØˆuÝ•×'Ò'¨Ñ*Ô*Ñ+Ô+Ð+ó    c                ó‚  — |                       ¦   «                              d¦  «        }t                               d|¦  «                              ¦   «         }|                     d¦  «        dk    rU|                      ¦   «                              d¦  «        s.|                     dd¦  «        d                               ¦   «         }|                     dd¦  «                             dd¦  «                             d	d
¦  «        }t          j        dd|¦  «        }|                     dd¦  «        }|                      ¦   «         S )Nz?.!Ú Ú=é   õ   Ã—Ú*õ   Ã·ú/ú^z**z(?<=\d)\s*[xX]\s*(?=\d)ú%z/100)	ÚstripÚrstripÚ_MATH_PREFIX_REÚsubÚcountÚ
startswithÚsplitÚreplacer   r   s     r   r   r      sø   € Ø�
Š
‰Œ×Ò˜EÑ"Ô"€AÝ×Ò˜B Ñ"Ô"×(Ò(Ñ*Ô*€AØ‡w‚wˆs�|„|�qÒÐ §¢¡¤×!5Ò!5°cÑ!:Ô!:ÐØ�GŠG�C˜‰OŒO˜AÔ×$Ò$Ñ&Ô&ˆØ	�	Š	�$˜ÑÔ×$Ò$ T¨3Ñ/Ô/×7Ò7¸¸TÑBÔB€AÝ
ŒÐ)¨3°Ñ2Ô2€AØ	�	Š	�#�vÑÔ€AØ�7Š7‰9Œ9Ðr   Únodeúast.ASTr   c                ór  — t          | t          j        ¦  «        rt          | j        ¦  «        S t          | t          j        ¦  «        r€t          | j        t          ¦  «        r.t          | j        t          ¦  «        st          | j        ¦  «        S t          | j        t          ¦  «        rt          d¦  «        ‚t          d¦  «        ‚t          | t          j        ¦  «        rft          | j        ¦  «        }t          | j        t          j        ¦  «        r|S t          | j        t          j        ¦  «        r| S t          d¦  «        ‚t          | t          j        ¦  «        �rÆt          | j        ¦  «        }t          | j        ¦  «        }t          | j        t          j        ¦  «        r||z   S t          | j        t          j        ¦  «        r||z
  S t          | j        t          j        ¦  «        r||z  S t          | j        t          j        ¦  «        r|dk    rt1          d¦  «        ‚||z  S t          | j        t          j        ¦  «        r|dk    rt1          d¦  «        ‚||z  S t          | j        t          j        ¦  «        r|dk    rt1          d¦  «        ‚||z  S t          | j        t          j        ¦  «        rY||                     ¦   «         k    s t;          t          |¦  «        ¦  «        dk    rt          d¦  «        ‚|t          |¦  «        z  S t          d¦  «        ‚t          d	¦  «        ‚)
Nz Float literals are not supportedzOnly numbers are allowedzUnsupported unary operatorr   zDivision by zeroiè  zExponent too largezUnsupported operatorzUnsupported expression)Ú
isinstanceÚastÚ
ExpressionÚ
_eval_nodeÚbodyÚConstantÚvalueÚintr
   r   ÚfloatÚ
ValueErrorÚUnaryOpÚoperandÚopÚUAddÚUSubÚBinOpÚleftÚrightÚAddÚSubÚMultÚDivÚZeroDivisionErrorÚFloorDivÚModÚPowÚto_integral_valueÚabs)r*   Úvalr=   r>   s       r   r0   r0   (   sÉ  € Ý�$�œÑ'Ô'ð %Ý˜$œ)Ñ$Ô$Ð$Ý�$�œÑ%Ô%ð 5å�d”j¥#Ñ&Ô&ð 	'­z¸$¼*ÅdÑ/KÔ/Kð 	'Ý˜4œ:Ñ&Ô&Ð&Ý�d”j¥%Ñ(Ô(ð 	AÝÐ?Ñ@Ô@Ð@ÝÐ3Ñ4Ô4Ð4Ý�$�œÑ$Ô$ð 7Ý˜œÑ&Ô&ˆÝ�d”g�sœxÑ(Ô(ð 	ØˆJÝ�d”g�sœxÑ(Ô(ð 	Ø�4ˆKÝÐ5Ñ6Ô6Ð6Ý�$�œ	Ñ"Ô"ñ 1Ý˜$œ)Ñ$Ô$ˆÝ˜4œ:Ñ&Ô&ˆÝ�d”g�sœwÑ'Ô'ð 	 Ø˜%‘<ÐÝ�d”g�sœwÑ'Ô'ð 	 Ø˜%‘<ÐÝ�d”g�sœxÑ(Ô(ð 	 Ø˜%‘<ÐÝ�d”g�sœwÑ'Ô'ð 	 Ø˜ŠzˆzÝ'Ð(:Ñ;Ô;Ð;Ø˜%‘<ÐÝ�d”g�sœ|Ñ,Ô,ð 	!Ø˜ŠzˆzÝ'Ð(:Ñ;Ô;Ð;Ø˜5‘=Ð Ý�d”g�sœwÑ'Ô'ð 	 Ø˜ŠzˆzÝ'Ð(:Ñ;Ô;Ð;Ø˜%‘<ÐÝ�d”g�sœwÑ'Ô'ð 	&Ø˜×/Ò/Ñ1Ô1Ò1Ð1µS½¸U¹¼±_´_ÀtÒ5KÐ5KÝ Ð!5Ñ6Ô6Ð6Ø�3˜u™:œ:Ñ%Ð%ÝÐ/Ñ0Ô0Ð0Ý
Ð-Ñ
.Ô
.Ð.r   Únr4   c                óò   — | dk     rdnd}t          t          | ¦  «        ¦  «        }g }|r)|                     |dd …         ¦  «         |d d…         }|°)|d                     t	          |¦  «        ¦  «        z   S )Nr   Ú-r   éýÿÿÿÚ,)r   rH   ÚappendÚjoinÚreversed)rJ   ÚsignÚdigitsÚpartss       r   Ú
_comma_intrU   V   s�   € Ø�a’%�%ˆ3ˆ3˜R€DÝ•�Q‘”‰[Œ[€FØ€EØ
ð Ø�Š�V˜B˜C˜C”[Ñ!Ô!Ð!Ø˜˜˜”ˆð ð ð �#—(’(�8 E™?œ?Ñ+Ô+Ñ+Ð+r   r3   c                ó  — | |                       ¦   «         k    rt          t          | ¦  «        ¦  «        S t          | d¦  «        }d|v r(|                     d¦  «                             d¦  «        }|                     d¦  «        }|r
|dd…         }d|v r=|                     dd¦  «        \  }}t          t          |pd¦  «        ¦  «        › d|› �}nt          t          |pd¦  «        ¦  «        }|rd|                     d¦  «        › �n|S )u@   Always fixed-point / full integer â€” never scientific notation.Úfú.Ú0rL   r   N)rG   rU   r4   Úformatr#   r'   r(   Úlstrip)r3   r   ÚnegativeÚwholeÚfracÚouts         r   Ú_format_resultr`   `   s  € à�×'Ò'Ñ)Ô)Ò)Ð)Ý�#˜e™*œ*Ñ%Ô%Ð%å�%˜ÑÔ€DØ
ˆd€{€{Ø�{Š{˜3ÑÔ×&Ò& sÑ+Ô+ˆØ�Š˜sÑ#Ô#€HØð Ø�A�B�BŒxˆØ
ˆd€{€{Ø—j’j  aÑ(Ô(‰ˆˆtÝ�C  ¨Ñ-Ô-Ñ.Ô.Ð7Ð7°Ð7Ð7ˆˆå�˜T˜[ SÑ)Ô)Ñ*Ô*ˆØ$,Ð5Ð ˆs�zŠz˜#‰ŒÐ Ð Ð °#Ð5r   c                óL  — t          | ¦  «        }|sdS t          |¦  «        dk    rdS d„ t          j        d|¦  «        D ¦   «         }|rt	          |¦  «        dk    r	 dS t	          d|rt	          |¦  «        nd	d
z   ¦  «        }	 t          j        |d¬¦  «        }t          ¦   «         5 }||_        t          |¦  «        }ddd¦  «         n# 1 swxY w Y   dt          |¦  «        › �S # t          $ r Y dS t          t          t          t          t           t"          f$ r 	 Y dS w xY w)z?Evaluate a pure arithmetic expression and return a short reply.z@I couldn't read that calculation. Try something like 12 + 5 * 3.i   z)That expression is too long to calculate.c                óR   — g | ]$}t          |                     d ¦  «        ¦  «        ‘Œ%S )r   )r   Úgroup)Ú.0Úms     r   ú
<listcomp>zcalculate.<locals>.<listcomp>{   s(   € ÐEÐEÐE a•#�a—g’g˜a‘j”j‘/”/ÐEÐEÐEr   z\d+éÈ   z]One of those numbers is too large for a reliable calculator answer. Try a shorter expression.é2   é   é(   Úeval)ÚmodeNzResult: z;That expression divides by zero, so it can't be calculated.ud   I couldn't calculate that. Use numbers with + âˆ’ Ã— Ã· and parentheses, for example (100 + 20) / 4.)r   r   r   ÚfinditerÚmaxr.   Úparser   Úprecr0   r`   rC   r6   ÚSyntaxErrorÚ	TypeErrorr   ÚOverflowErrorÚMemoryError)r   ÚexprÚ
digit_lensrp   ÚtreeÚctxÚresults          r   Ú	calculaterz   s   s�  € å˜4Ñ Ô €DØð RØQÐQÝ
ˆ4�y„y�4ÒÐØ:Ð:àEÐE­2¬;°v¸tÑ+DÔ+DÐEÑEÔE€JØð 
•c˜*‘o”o¨Ò+Ð+ð(ð	
ð 	
õ
 ˆr zÐ9•C˜
‘O”O�O°r¸RÑ?Ñ@Ô@€Dð
ÝŒy˜ FÐ+Ñ+Ô+ˆÝ‰^Œ^ð 	&˜sØˆCŒHÝ Ñ%Ô%ˆFð	&ð 	&ð 	&ñ 	&ô 	&ð 	&ð 	&ð 	&ð 	&ð 	&ð 	&øøøð 	&ð 	&ð 	&ð 	&ð 3�.¨Ñ0Ô0Ð2Ð2Ð2øÝð Mð Mð MØLÐLÐLÝ�¥YÕ0@Å-ÕQ\Ð]ð 
ð 
ð 
ð*ð	
ð 	
ð 	
ð
øøøs<   Â$C) Â)CÃ C) ÃCÃC) ÃCÃC) Ã)
D#Ã6)D#Ä"D#)r   r   r	   r
   )r   r   r	   r   )r*   r+   r	   r   )rJ   r4   r	   r   )r3   r   r	   r   )Ú__doc__Ú
__future__r   r.   r   Údecimalr   r   r   ÚcompileÚ
IGNORECASEr$   r   r   r   r0   rU   r`   rz   © r   r   ú<module>r�      s  ðØ FÐ Fà "Ð "Ð "Ð "Ð "Ð "à 
€
€
€
Ø 	€	€	€	Ø ;Ð ;Ð ;Ð ;Ð ;Ð ;Ð ;Ð ;Ð ;Ð ;à�"”*ðNà„Mñô €ð
 �”
Ð9Ñ:Ô:€ð	,ð 	,ð 	,ð 	,ðð ð ð ð+/ð +/ð +/ð +/ð\,ð ,ð ,ð ,ð6ð 6ð 6ð 6ð&
ð 
ð 
ð 
ð 
ð 
r   