§
    éƒtjûž  ã                  óÈ  — U d Z ddlmZ ddlZddlmZ ddlmZ dDd
„ZdDd„Z	dDd„Z
ddœdEd„ZdFd„ZddœdGd„ZddœdHd„ZdId„ZdddœdJd „ZdKd"„Z ej        d#¦  «        Zg d$¢Zd%ed&<    ej        d'¦  «        Z ej        d(¦  «        Z ej        d)¦  «        Z ej        d*¦  «        ZdLd-„Zg Zd.ed/<   eD ]‡\  ZZeD ]Ze                     d0¦  «                              ¦   «          !                    ¦   «         Z"e"r( e#e"¦  «        d1k    se"d2v se" $                    e¦  «        rŒfe %                    e"ee"ff¦  «         Œ€ŒˆdMd4„Z&dMd5„Z'dNd6„Z(dOd9„Z)dPd;„Z*dPd<„Z+dQdRdA„Z,dKdB„Z-dKdC„Z.dS )Sz8Validation and calculation for confirmed PDF line items.é    )ÚannotationsN)ÚCounter)ÚAnyÚrowúdict[str, Any]ÚreturnÚfloatc                ó  — |                       d¦  «        �t          | d         ¦  «        S |                       d¦  «        �t          | d         ¦  «        S |                       d¦  «        �t          | d         ¦  «        S dS )NÚdebitÚcreditÚamountç        ©Úgetr	   ©r   s    ú(/var/www/html/CA-Chatbot/app/pdf/calc.pyÚ
_amount_ofr   
   ss   € Ø
‡w‚wˆwÑÔÐ#Ý�S˜”\Ñ"Ô"Ð"Ø
‡w‚wˆxÑÔÐ$Ý�S˜”]Ñ#Ô#Ð#Ø
‡w‚wˆxÑÔÐ$Ý�S˜”]Ñ#Ô#Ð#Øˆ3ó    c                óP  — |                       d¦  «        �"t          t          | d         ¦  «        ¦  «        S |                       d¦  «        €Y|                       d¦  «        �D	 t          | d         ¦  «        }n# t          t          f$ r Y dS w xY w|dk     rt          |¦  «        S dS )z&Withdrawals / debits from the account.r   Nr   r   r   r   ©r   Úabsr	   Ú	TypeErrorÚ
ValueError©r   Úvals     r   Ú
_money_outr      s©   € à
‡w‚wˆwÑÔÐ#Ý•5˜˜WœÑ&Ô&Ñ'Ô'Ð'à
‡w‚wˆxÑÔÐ  S§W¢W¨XÑ%6Ô%6Ð%Bð	Ý˜˜HœÑ&Ô&ˆCˆCøÝ�:Ð&ð 	ð 	ð 	Ø�3�3ð	øøøà�Š7ˆ7Ý�s‘8”8ˆOØˆ3ó   Á#A9 Á9BÂBc                ó6  — |                       d¦  «        �"t          t          | d         ¦  «        ¦  «        S |                       d¦  «        €L|                       d¦  «        �7	 t          | d         ¦  «        }n# t          t          f$ r Y dS w xY w|dk    r|S dS )z$Deposits / credits into the account.r   Nr   r   r   r   r   r   s     r   Ú	_money_inr   #   s£   € à
‡w‚wˆxÑÔÐ$Ý•5˜˜XœÑ'Ô'Ñ(Ô(Ð(Ø
‡w‚wˆwÑÔÐ C§G¢G¨HÑ$5Ô$5Ð$Að	Ý˜˜HœÑ&Ô&ˆCˆCøÝ�:Ð&ð 	ð 	ð 	Ø�3�3ð	øøøà�Š7ˆ7ØˆJØˆ3r   Úunknown©Údocument_kindÚrowsúlist[dict[str, Any]]r"   Ústrc               óœ  ‡— g }| s|                      d¦  «         d|ddœS d}t          | d¬¦  «        D ]@\  }Št          ˆfd„dD ¦   «         ¦  «        }|s|dz  }|                      d	|› d
�¦  «         ŒAt          d„ | D ¦   «         ¦  «        }t          d„ | D ¦   «         ¦  «        }t          d„ | D ¦   «         ¦  «        }d}	|dk    rd}	n<|r:|r8|r6t	          ||z
  ¦  «        dk    r d}	|                      d|d›d|d›d�¦  «         |dk    o|	}
|
|t          | ¦  «        t          |d¦  «        t          |d¦  «        |dk    rd n|r|	nd |dœS )NzNo line items to validate.Fr   )ÚokÚissuesÚ	row_counté   )Ústartc              3  óF   •K  — | ]}‰                      |¦  «        d uV — Œd S ©N©r   ©Ú.0Úkr   s     €r   ú	<genexpr>z validate_rows.<locals>.<genexpr>=   s2   øè è € ÐTÐT°�c—g’g˜a‘j”j¨Ð,ÐTÐTÐTÐTÐTÐTr   ©r   r   r   zRow z has no numeric amount.c              3  ój   K  — | ].}|                      d ¦  «        ®t          |d          ¦  «        V — Œ/dS )r   Nr   ©r0   Úrs     r   r2   z validate_rows.<locals>.<genexpr>B   s=   è è € ÐOÐO q°A·E²E¸'±N´NÐ4N•�q˜”zÑ"Ô"Ð4NÐ4NÐ4NÐ4NÐOÐOr   c              3  ój   K  — | ].}|                      d ¦  «        ®t          |d          ¦  «        V — Œ/dS )r   Nr   r5   s     r   r2   z validate_rows.<locals>.<genexpr>C   s=   è è € ÐRÐR¨°a·e²e¸H±o´oÐ6Q•%˜˜(œÑ$Ô$Ð6QÐ6QÐ6QÐ6QÐRÐRr   c              3  ór   K  — | ]2}|                      d ¦  «        dup|                      d¦  «        duV — Œ3dS )r   Nr   r.   r5   s     r   r2   z validate_rows.<locals>.<genexpr>D   sE   è è € ÐYÐYÈq�—’�w‘” tÐ+ÐJ¨q¯uªu°X©¬ÀdÐ/JÐYÐYÐYÐYÐYÐYr   TÚbank_statementg{®Gáz„?zDebits (z.2fz) and credits (z) do not balance.é   ©r'   r(   r)   Údebit_totalÚcredit_totalÚbalancedr"   )ÚappendÚ	enumerateÚanyÚsumr   ÚlenÚround)r#   r"   r(   Úmissing_amountÚiÚhas_numÚdebitsÚcreditsÚhas_dcÚ
balance_okr'   r   s              @r   Úvalidate_rowsrL   1   sì  ø€ ð
 €FØð ?Ø�ŠÐ2Ñ3Ô3Ð3Ø v¸AÐ>Ð>Ð>à€NÝ˜D¨Ð*Ñ*Ô*ð =ð =‰ˆˆ3ÝÐTÐTÐTÐTÐ6SÐTÑTÔTÑTÔTˆØð 	=Ø˜aÑˆNØ�MŠMÐ; Ð;Ð;Ð;Ñ<Ô<Ð<øåÐOÐO¨DÐOÑOÔOÑOÔO€FÝÐRÐR¨dÐRÑRÔRÑRÔR€GÝÐYÐYÐTXÐYÑYÔYÑYÔY€Fð €JØÐ(Ò(Ð(Øˆ
ˆ
Ø	ð �Fð ˜wð Ýˆv˜ÑÑ Ô  4Ò'Ð'ØˆJØ�MŠMØT˜6ÐTÐTÐT°gÐTÐTÐTÐTñô ð ð 
˜1Ò	Ð	+ €Bð ØÝ˜‘Y”YÝ˜V QÑ'Ô'Ý˜g qÑ)Ô)Ø)Ð-=Ò=Ð=�D�DØ Ð*ˆJˆJ dà&ð
ð 
ð 
r   Údescriptionc                óŠ   ‡— | pd                      ¦   «         Šg d¢}|D ]$\  }}t          ˆfd„|D ¦   «         ¦  «        r|c S Œ%dS )NÚ ))Ú	groceries)ú# groceriesÚgroceryÚzeptoÚ	instamartÚ	bigbasketÚblinkit)Úfood)ú# foodÚzomatoÚswiggyÚ
restaurant)Útaxi)ú# taxiÚuberÚola)Úbills)ú# billÚrechargeúbill payment)zsalary / payroll)ÚsalaryÚpayrollÚwageÚstipend)zupi / digital pay)ÚupiÚgpayÚphonepeÚpaytmÚbhim)zneft / imps / rtgs)ÚneftÚimpsÚrtgs)z
atm / cash)Úatmzcash wdlzcash withdrawal)z
card spend)ÚposÚvisaÚ
mastercardÚcard)Úcheque)ru   ÚchqÚcheck)zinterest / charges)ÚinterestÚchargeÚfeeÚgstÚpenalty)Útransfer)r}   ÚtfrÚselfc              3  ó    •K  — | ]}|‰v V — Œ	d S r-   © )r0   r1   Úds     €r   r2   z"_rough_category.<locals>.<genexpr>q   s'   øè è € Ð$Ð$˜!ˆq�AˆvÐ$Ð$Ð$Ð$Ð$Ð$r   Úother)ÚlowerrA   )rM   ÚrulesÚlabelÚkeysr‚   s       @r   Ú_rough_categoryrˆ   `   sw   ø€ Ø	Ð	˜×!Ò!Ñ#Ô#€Aðð ð €Eð ð ð ‰ˆˆtÝÐ$Ð$Ð$Ð$˜tÐ$Ñ$Ô$Ñ$Ô$ð 	ØˆLˆLˆLð	àˆ7r   ©Ústatement_totalsÚ
validationrŠ   údict[str, Any] | Nonec               óØ
  — g }| D ]Æ}g }dD ]e}|                      |¦  «        �N	 |                     t          t          ||         ¦  «        ¦  «        ¦  «         ŒN# t          t
          f$ r Y Œaw xY wŒf|rt          |¦  «        dk    rŒ‚|r-t          |¦  «        dk    rt          d„ |D ¦   «         ¦  «        rŒ±|                     |¦  «         ŒÇ|p| } t          t          d„ | D ¦   «         ¦  «        d¦  «        }t          t          d„ | D ¦   «         ¦  «        d¦  «        }d„ | D ¦   «         }	|	rd|d	k    r^|d	k    rX|	D ]5}t          |d
         ¦  «        }
|
d	k    r||
z  }Œ#|t          |
¦  «        z  }Œ6t          |d¦  «        }t          |d¦  «        }|pi }d}|                      d¦  «        €|                      d¦  «        �”|                      d¦  «        �#t          t          |d         ¦  «        d¦  «        }|                      d¦  «        �#t          t          |d         ¦  «        d¦  «        }t          |                      d¦  «        pd¦  «        }t          ||z
  d¦  «        }d„ | D ¦   «         }|r|d	         nd }|r|d         nd }t          | t          d¬¦  «        }t          | t          d¬¦  «        }|r!t          |d	         ¦  «        d	k    r|d	         nd }|r!t          |d	         ¦  «        d	k    r|d	         nd }t          d„ | D ¦   «         ¦  «        }d„ |                     d¦  «        D ¦   «         }t          t!          | ¦  «        ¦  «        }|                      d¦  «        €|                      d¦  «        �ct#          |                      d¦  «        pd	¦  «        }t#          |                      d¦  «        pd	¦  «        }||z   d	k    rt          ||z   ¦  «        }i dd“dt          t!          | ¦  «        ¦  «        “d|“d|“d|“d|“d|“d|“d |“d|                      d¦  «        “d|                      d¦  «        “d!|“d"|“d#|“d$|rt          t          |¦  «        d¦  «        nd “d%|r|pi                       d&¦  «        nd “d'|rt          t          |¦  «        d¦  «        nd “|r|pi                       d&¦  «        nd |d d d d d d d(œ¥}d)}|s|rd*|pd+› d,|pd+› �}d-t!          | ¦  «        › d.|› d/|d0›d1|d0›d2|d0›�
}|dk    rWd3|d0›d4|d0›d2|d0›�}|                      d¦  «        �4|d5|                      d¦  «        › d6|                      d¦  «        pd	› d7�z  }d|||dd8œS )9Nr3   i€ðúg    eÍÍAc              3  ó<   K  — | ]}|t          |¦  «        k    V — Œd S r-   )Úint)r0   Úvs     r   r2   z,_calculate_bank_statement.<locals>.<genexpr>ˆ   s,   è è € Ð,GÐ,G¸Q¨Qµ#°a±&´&ª[Ð,GÐ,GÐ,GÐ,GÐ,GÐ,Gr   c              3  ó4   K  — | ]}t          |¦  «        V — Œd S r-   ©r   r5   s     r   r2   z,_calculate_bank_statement.<locals>.<genexpr>�   s(   è è € Ð6Ð6¨A�* Q™-œ-Ð6Ð6Ð6Ð6Ð6Ð6r   r:   c              3  ó4   K  — | ]}t          |¦  «        V — Œd S r-   )r   r5   s     r   r2   z,_calculate_bank_statement.<locals>.<genexpr>Ž   s(   è è € Ð4Ð4¨!� 1™œÐ4Ð4Ð4Ð4Ð4Ð4r   c                ó�   — g | ]C}|                      d ¦  «        ­|                      d¦  «        ­,|                      d¦  «        ®A|‘ŒDS )r   Nr   r   r.   r5   s     r   ú
<listcomp>z-_calculate_bank_statement.<locals>.<listcomp>‘   sP   € ð ð ð ØØ�5Š5�‰>Œ>Ð! a§e¢e¨H¡o¤oÐ&=À!Ç%Â%ÈÁ/Ä/ÐB]ð 	
ØB]ÐB]ÐB]r   r   r   Ú
line_itemsÚ	money_outÚmoney_inÚsourceÚstatement_headerc                ó    — g | ]K}|                      d ¦  «        ¯t          |                      d ¦  «        ¦  «                             ¦   «         ‘ŒLS )Údate)r   r%   Ústripr5   s     r   r•   z-_calculate_bank_statement.<locals>.<listcomp>ª   sE   € ÐGÐGÐG¨A¸¿º¸v¹¼ÐG�S�—’�v‘”ÑÔ×%Ò%Ñ'Ô'ÐGÐGÐGr   éÿÿÿÿT)ÚkeyÚreversec              3  óx   K  — | ]5}t          t          |                     d ¦  «        pd¦  «        ¦  «        V — Œ6dS )rM   rO   N)rˆ   r%   r   r5   s     r   r2   z,_calculate_bank_statement.<locals>.<genexpr>³   sC   è è € ÐRÐRÈ•?¥3 q§u¢u¨]Ñ';Ô';Ð'A¸rÑ#BÔ#BÑCÔCÐRÐRÐRÐRÐRÐRr   c                ó   — g | ]
\  }}||d œ‘ŒS ))ÚcategoryÚcountr�   )r0   Únamer¤   s      r   r•   z-_calculate_bank_statement.<locals>.<listcomp>´   s4   € ð ð ð áˆD�%ð  EÐ*Ð*ðð ð r   é   Úpayments_madeÚpayments_receivedr"   r9   Ú
line_countÚnet_cashflowr<   r=   ÚnetÚtransaction_countÚtotals_sourceÚ
date_startÚdate_endÚlargest_withdrawalÚlargest_withdrawal_descrM   Úlargest_deposit)Úlargest_deposit_descÚtop_categoriesÚassets_totalÚliabilities_totalÚequity_totalÚcurrent_ratioÚdebt_to_equityÚworking_capitalrO   z
 | period ú?õ    â†’ zBank statement: z transactionsz | money in ú,.2fz | money out ú | net z8Statement totals (from document header): money paid/out z | money received/in ú | z payments made, z	 received©r'   r‹   ÚmetricsÚsummaryr"   )r   r?   r   r	   r   r   ÚmaxÚallrD   rB   r%   Úsortedr   r   r   Úmost_commonrC   r�   )r#   r‹   rŠ   Ú
clean_rowsr6   Úvalsr1   r—   r˜   Úamount_onlyÚamtÚheaderr­   r«   Údatesr®   r¯   Úout_rowsÚin_rowsÚlargest_outÚ
largest_inÚcatsr´   Ú	txn_countÚmadeÚrecvrÁ   ÚperiodrÂ   s                                r   Ú_calculate_bank_statementrÖ   v   s8  € ð (*€JØð ð ˆØˆØ.ð 	ð 	ˆAØ�uŠu�Q‰xŒxÐ#ðØ—K’K¥¥E¨!¨A¬$¡K¤KÑ 0Ô 0Ñ1Ô1Ð1Ð1øÝ!¥:Ð.ð ð ð Ø�Dðøøøð $ð
 ð 	•C˜‘I”I 
Ò*Ð*ØØð 	•C˜‘I”I Ò$Ð$­Ð,GÐ,GÀ$Ð,GÑ,GÔ,GÑ)GÔ)GÐ$ØØ×Ò˜!ÑÔÐÐØÐ˜€Då•cÐ6Ð6°Ð6Ñ6Ô6Ñ6Ô6¸Ñ:Ô:€IÝ•SÐ4Ð4¨tÐ4Ñ4Ô4Ñ4Ô4°aÑ8Ô8€Hðð Øðñ ô €Kð ð (�x 1’}�}¨°aª¨Øð 	&ð 	&ˆAÝ˜˜(œÑ$Ô$ˆCØ�aŠxˆxØ˜C‘��à�S ™XœXÑ%�	�	Ý˜ 1Ñ%Ô%ˆÝ˜) QÑ'Ô'ˆ	àÐ# €FØ €Mà‡z‚z�+ÑÔÐ*¨f¯jªj¸Ñ.DÔ.DÐ.PØ�:Š:�kÑ"Ô"Ð.Ý�e F¨;Ô$7Ñ8Ô8¸!Ñ<Ô<ˆIØ�:Š:�jÑ!Ô!Ð-Ý�U 6¨*Ô#5Ñ6Ô6¸Ñ:Ô:ˆHÝ˜FŸJšJ xÑ0Ô0ÐFÐ4FÑGÔGˆå
�˜9Ñ$ aÑ
(Ô
(€CØGÐG°ÐGÑGÔG€EØ"Ð,��q”�¨€JØ!Ð+ˆu�RŒyˆy t€Hå�d¥
°DÐ9Ñ9Ô9€HÝ�T�y°$Ð7Ñ7Ô7€GØ!)ÐS­j¸À!¼Ñ.EÔ.EÈÒ.IÐ.I�(˜1”+�+Èt€KØ&ÐN­9°W¸Q´ZÑ+@Ô+@À1Ò+DÐ+D�˜”�È$€JåÐRÐRÈTÐRÑRÔRÑRÔR€Dðð à×+Ò+¨AÑ.Ô.ðñ ô €Nõ
 •c˜$‘i”iÑ Ô €IØ‡z‚z�/Ñ"Ô"Ð.°&·*²*Ð=PÑ2QÔ2QÐ2]Ý�6—:’:˜oÑ.Ô.Ð3°!Ñ4Ô4ˆÝ�6—:’:Ð1Ñ2Ô2Ð7°aÑ8Ô8ˆØ�$‰;˜Š?ˆ?Ý˜d T™kÑ*Ô*ˆIðØÐ)ðà•e�C ™IœIÑ&Ô&ðð 	�Hðð 	�Yð	ð
 	˜ðð 	�yðð 	˜ðð 	ˆsðð 	˜Yðð 	˜Ÿš OÑ4Ô4ðð 	˜VŸZšZÐ(;Ñ<Ô<ðð 	˜ðð 	�jðð 	�Hðð 	À;ÐX�e¥J¨{Ñ$;Ô$;¸QÑ?Ô?Ð?ÐTXðð  	"È[Ð#b KÐ$5°2×#:Ò#:¸=Ñ#IÔ#IÐ#IÐ^bð!ð" 	¸jÐR�5¥¨:Ñ!6Ô!6¸Ñ:Ô:Ð:Èdð#ð$ JTÐ ] Ð!1¨r× 6Ò 6°}Ñ EÔ EÐ EÐY]Ø(àØ!ØØØØð5ð ð €Gð: €FØð H�Xð HØG˜jÐ/¨CÐGÐG°h°oÀ#ÐGÐGˆð	R�3˜t™9œ9ð 	Rð 	R°6ð 	Rð 	RØÐQð	Rð 	RØ09ÐQð	Rð 	RØGJÐQð	Rð 	Rð ð Ð*Ò*Ð*ðØ'ÐUðð ØCKÐUðð àÐðð ð 	ð
 �:Š:�oÑ&Ô&Ð2ØðC�f—j’j Ñ1Ô1ð Cð CØ—:’:Ð1Ñ2Ô2Ð7°aðCð Cð CñˆGð Ø ØØØ)ðð ð s   £5AÁA-Á,A-)r#   úlist[dict[str, Any]] | Nonec               óh   — |pg }|rt          |d¬¦  «        n	dg ddddddœ}t          ||| ¬¦  «        S )zDBuild bank-statement metrics from totals parsed out of the PDF text.r9   r!   Tr   Nr;   r‰   )rL   rÖ   )rŠ   r#   r‹   s      r   Úcalculate_from_statement_totalsrÙ   ú   sc   € ð ˆ:�2€DØHLð •˜tÐ3CÐDÑDÔDÐDØØØØØØØ)ðSð S€Jõ % T¨:ÐHXÐYÑYÔYÐYr   c                ó  ‡— d„ | D ¦   «         }d„ | D ¦   «         }d„ | D ¦   «         }t          t          |¦  «        d¦  «        }t          t          |¦  «        d¦  «        }t          t          |¦  «        d¦  «        }|s|rt          ||z
  d¦  «        n|}d}	d}
d}| D ]Þ}|                     d¦  «        pd› d|                     d	¦  «        pd› �                     ¦   «         Št	          t          |¦  «        ¦  «        }t          ˆfd
„dD ¦   «         ¦  «        r!t          ˆfd„dD ¦   «         ¦  «        s|	|z  }	Œ�t          ˆfd„dD ¦   «         ¦  «        r|
|z  }
Œ¾t          ˆfd„dD ¦   «         ¦  «        r||z  }Œß|	dk    r|
dk    r|dk    r	|r|r|}	|}n!|	dk    r|r|
s|r|}	t          |
|z   d¦  «        }|
rt          |	|
z  d¦  «        nd }|rt          |
|z  d¦  «        nd }|	s|
rt          |	|
z
  d¦  «        nd }i dd“dt          t          | ¦  «        ¦  «        “d|“d|“d|“d|“d| r t          |t          | ¦  «        z  d¦  «        nd“d|rt          t          |¦  «        d¦  «        nd“d|rt          t          |¦  «        d¦  «        nd“d|	rt          |	d¦  «        nd “d|
rt          |
d¦  «        nd “d |rt          |d¦  «        nd “d!|	s|
s|r|nd “d"|“d#|“d$|“}g }|d         �|                     d%|d         d&›�¦  «         |d         �|                     d'|d         d&›�¦  «         |d          �|                     d(|d          d&›�¦  «         |�|                     d)|› �¦  «         |�|                     d*|› �¦  «         |�|                     d+|d&›�¦  «         |s|rt          | ¦  «        › d,|d&›d-|d&›d.|d&›�}nt          | ¦  «        › d/�}|r|d0d0                     |¦  «        z   z  }|d1         |||dd2œS )3Nc                ó,   — g | ]}t          |¦  «        ‘ŒS r�   )r   r5   s     r   r•   z,_calculate_balance_sheet.<locals>.<listcomp>  s   € Ð+Ð+Ð+ �z˜!‰}Œ}Ð+Ð+Ð+r   c                ób   — g | ],}|                      d ¦  «        ®t          |d          ¦  «        ‘Œ-S )r   r   r5   s     r   r•   z,_calculate_balance_sheet.<locals>.<listcomp>  s3   € ÐLÐLÐL A°·²°w±´Ð1K�e�A�g”JÑÔÐ1KÐ1KÐ1Kr   c                ób   — g | ],}|                      d ¦  «        ®t          |d          ¦  «        ‘Œ-S )r   r   r5   s     r   r•   z,_calculate_balance_sheet.<locals>.<listcomp>  s3   € ÐOÐOÐO a°1·5²5¸±?´?Ð3N�u�Q�x”[Ñ!Ô!Ð3NÐ3NÐ3Nr   r:   r   ÚaccountrO   ú rM   c              3  ó    •K  — | ]}|‰v V — Œ	d S r-   r�   ©r0   r1   Úaccts     €r   r2   z+_calculate_balance_sheet.<locals>.<genexpr>  s;   øè è € ð 
ð 
àð �ˆIð
ð 
ð 
ð 
ð 
ð 
r   )ÚassetÚcashÚ
receivableÚ	inventoryÚprepaidÚ	equipmentÚ	machineryÚpropertyÚplantÚbuildingÚvehicleÚ	furnitureÚgoodwillÚ
investmentzbank accountzcash at bankzcash in bankc              3  ó    •K  — | ]}|‰v V — Œ	d S r-   r�   rá   s     €r   r2   z+_calculate_balance_sheet.<locals>.<genexpr>&  s'   øè è € ÐTÐT A�a˜4�iÐTÐTÐTÐTÐTÐTr   )ÚpayableÚloanÚborrowÚ	overdraftc              3  ó    •K  — | ]}|‰v V — Œ	d S r-   r�   rá   s     €r   r2   z+_calculate_balance_sheet.<locals>.<genexpr>(  ó;   øè è € ð 
ð 
àð �ˆIð
ð 
ð 
ð 
ð 
ð 
r   )
Úliabilitrò   ró   Údebtrô   ÚaccruedÚunearnedrõ   ÚmortgageÚbondc              3  ó    •K  — | ]}|‰v V — Œ	d S r-   r�   rá   s     €r   r2   z+_calculate_balance_sheet.<locals>.<genexpr>0  r÷   r   )ÚequityÚcapitalÚretainedÚstockÚownerÚshareholderÚdrawingsÚsurplusr   é   r"   Úbalance_sheetr©   Útotal_amountr<   r=   r«   Úaverage_lineÚmax_lineÚmin_linerµ   r¶   r·   Úliabilities_and_equityr¸   r¹   rº   úassets r½   úliabilities úequity úcurrent ratio úD/E úworking capital z line items | debits z | credits r¾   zG line items | classified balances below (do not use line-sum as assets)r¿   r'   rÀ   )rD   rB   r   r„   r   r   rA   r	   rC   rÃ   Úminr?   Újoin)r#   r‹   ÚamountsrH   rI   r	  r<   r=   r«   ÚassetsÚliabilitiesrÿ   r6   rÊ   r  r¸   r¹   rº   rÁ   ÚextrarÂ   râ   s                        @r   Ú_calculate_balance_sheetr    s
  ø€ Ø+Ð+ dÐ+Ñ+Ô+€GØLÐL¨ÐLÑLÔL€FØOÐO¨4ÐOÑOÔO€Gå�˜W™œ qÑ)Ô)€LÝ�˜F™œ QÑ'Ô'€KÝ�˜W™œ qÑ)Ô)€LØ39Ð
W¸WÐ
W�%�˜lÑ*¨AÑ
.Ô
.Ð
.È<€Cà€FØ€KØ€FØð ð ˆØ—%’%˜	Ñ"Ô"Ð( bÐGÐG¨1¯5ª5°Ñ+?Ô+?Ð+EÀ2ÐGÐG×MÒMÑOÔOˆÝ•*˜Q‘-”-Ñ Ô ˆåð 
ð 
ð 
ð 
ðð
ñ 
ô 
ñ 
ô 
ð 	õ ÐTÐTÐTÐTÐ)SÐTÑTÔTÑTÔTð	ð �c‰MˆFˆFÝð 
ð 
ð 
ð 
ðð
ñ 
ô 
ñ 
ô 
ð 	ð ˜3ÑˆKˆKÝð 
ð 
ð 
ð 
ðð
ñ 
ô 
ñ 
ô 
ð 	ð �c‰MˆFøà�‚{€{�{ aÒ'Ð'¨F°aªK¨K¸F¨KÀw¨KØˆØ!-ÐÐà�QŠ;ˆ;˜6ˆ; {ˆ;°fˆ;Ø ˆFÝ!& {°VÑ';¸QÑ!?Ô!?Ðà6AÐK•E˜& ;Ñ.°Ñ2Ô2Ð2Àt€MØ7=ÐG•U˜;¨Ñ/°Ñ3Ô3Ð3À4€NØ9?ÐYÀ;ÐY•e˜F [Ñ0°!Ñ4Ô4Ð4ÐUY€Oð(Ø˜ð(à•e�C ™IœIÑ&Ô&ð(ð 	˜ð(ð 	�{ð	(ð
 	˜ð(ð 	ˆsð(ð 	¸dÐK�˜l­S°©Y¬YÑ6¸Ñ:Ô:Ð:Èð(ð 	¨gÐ>•E�#˜g™,œ,¨Ñ*Ô*Ð*¸3ð(ð 	¨gÐ>•E�#˜g™,œ,¨Ñ*Ô*Ð*¸3ð(ð 	¨FÐ<�˜f aÑ(Ô(Ð(¸ð(ð 	°kÐK�U ;°Ñ2Ô2Ð2Àtð(ð 	¨FÐ<�˜f aÑ(Ô(Ð(¸ð(ð 	!¸VÐ"gÀ{Ð"gÐV\Ð"gÐ"8Ð"8Ðcgð(ð 	˜ð(ð 	˜.ð(ð  	˜?ð!(€Gð& €EØˆ~ÔÐ*Ø�ŠÐ=˜w ~Ô6Ð=Ð=Ð=Ñ>Ô>Ð>ØÐ"Ô#Ð/Ø�ŠÐG GÐ,?Ô$@ÐGÐGÐGÑHÔHÐHØˆ~ÔÐ*Ø�ŠÐ=˜w ~Ô6Ð=Ð=Ð=Ñ>Ô>Ð>ØÐ Ø�ŠÐ5 mÐ5Ð5Ñ6Ô6Ð6ØÐ!Ø�ŠÐ,˜NÐ,Ð,Ñ-Ô-Ð-ØÐ"Ø�ŠÐ>¨Ð>Ð>Ð>Ñ?Ô?Ð?àð 	
�ð 	
å�4‰yŒyð Xð XØ!ÐWðXð XØ3?ÐWðXð XØMPÐWðXð Xð 	ˆõ �4‰yŒyð Hð Hð Hð 	ð
 ð -Ø�5˜5Ÿ:š: eÑ,Ô,Ñ,Ñ,ˆð ˜ÔØ ØØØ(ðð ð r   )r"   rŠ   c               ó6  — t          | |¬¦  «        }| s3|r*|                     d¦  «        €|                     d¦  «        €dd||dœS |dk    s,|r<|                     d¦  «        €|                     d¦  «        �t          | ||¬	¦  «        S t          | |¦  «        S )
uJ   Deterministic totals â€” bank statement cashflow or balance-sheet metrics.r!   r—   Nr˜   FzNo rows to calculate.)r'   Úerrorr‹   r"   r9   r‰   )rL   r   rÖ   r  )r#   r"   rŠ   r‹   s       r   Ú	calculater  }  sÛ   € õ ˜t°=ÐAÑAÔA€JØð 
Ð)ð 
Ø×Ò˜[Ñ)Ô)Ð5Ð9I×9MÒ9MÈjÑ9YÔ9YÐ9eð Ø,Ø$Ø*ð	
ð 
ð 	
ð Ð(Ò(Ð(Øð )à×!Ò! +Ñ.Ô.Ð:Ð>N×>RÒ>RÐS]Ñ>^Ô>^Ð>jå(Ø�*Ð/?ð
ñ 
ô 
ð 	
õ $ D¨*Ñ5Ô5Ð5r   Újobc                ó(  — |                       d¦  «        pg }|                       d¦  «        pi }|                      d¦  «        pi }|                      d¦  «        p|                       d¦  «        pi }|                       d¦  «        p|                       d¦  «        pd                     ¦   «         }|                       d¦  «        p+|                      d¦  «        p|                      d¦  «        pd	}d
|                       d¦  «        › �d|› �d|                       d¦  «        › d|                       d¦  «        › �dg}|dk    �r=|                     d¦  «         |                     |                      d¦  «        pd¦  «         |                      d¦  «        �+|                     d|                      d¦  «        › �¦  «         |                      d¦  «        �+|                     d|                      d¦  «        › �¦  «         |                      d¦  «        �+|                     d|                      d¦  «        › �¦  «         |                      d¦  «        r+|                     d|                      d¦  «        › �¦  «         |                      d¦  «        �A|                     d|                      d¦  «        › d |                      d!¦  «        › �¦  «         |                      d"¦  «        s|                      d#¦  «        rE|                     d$|                      d"¦  «        pd%› d&|                      d#¦  «        pd%› �¦  «         |                      d'¦  «        �D|                     d(|                      d'¦  «        › d)|                      d*¦  «        pd› d+�¦  «         |                      d,¦  «        �D|                     d-|                      d,¦  «        › d)|                      d.¦  «        pd› d+�¦  «         |                      d/¦  «        pg }|r=|                     d0d1                     d2„ |dd3…         D ¦   «         ¦  «        z   ¦  «         |                     d¦  «         |                     d4¦  «         |dd5…         }	t	          |¦  «        d6k    r0|dd5…         d7d8t	          |¦  «        d6z
  › d9�igz   |d:d…         z   }	nt	          |¦  «        d5k    r|}	|	D �]}
t          |
t          ¦  «        sŒt          |
                      d7¦  «        pd¦  «                             d;¦  «        r,|                     d<|
                      d7¦  «        › �¦  «         Œ||                     d<|
                      d=¦  «        pd› d>|
                      d7¦  «        pd%› d?|
                      d@¦  «        › dA|
                      dB¦  «        › dC|
                      dD¦  «        › �
¦  «         �Œ|                     d¦  «         |                     dE¦  «         |r|                     |ddF…         ¦  «         n|                     dG¦  «         |                     d¦  «         |                     dH¦  «         dI                     |¦  «        S |                     dJ¦  «         |r|                     |ddK…         ¦  «         n|                     dL¦  «         |                     d¦  «         |                     dM¦  «         |ddN…         D ]‰}
|                     d<|
                      d7¦  «        pd%› dO|
                      dP¦  «        pdQ› dR|
                      d@¦  «        › dS|
                      dB¦  «        › dC|
                      dD¦  «        › �
¦  «         ŒŠ|s|                     dT¦  «         |                     d¦  «         |                     dU¦  «         |                      dV¦  «        dWu rC|                     dX|                      dY¦  «        › dZ|                      d[¦  «        › d\�¦  «         n,|                      dV¦  «        d]u r|                     d^¦  «         |                      d_¦  «        �,|                     d`|                      d_¦  «        › d\�¦  «         |                      da¦  «        �,|                     db|                      da¦  «        › d\�¦  «         |                      dc¦  «        �,|                     dd|                      dc¦  «        › d\�¦  «         |                      de¦  «        �,|                     df|                      de¦  «        › d\�¦  «         |                      dg¦  «        �,|                     dh|                      dg¦  «        › d\�¦  «         |                      di¦  «        �,|                     dj|                      di¦  «        › d\�¦  «         |                       d¦  «        r|                     dk¦  «         dI                     |¦  «        S )lz=Context for the chat LLM: document text + supporting figures.r#   ÚcalculationrÁ   r‹   Údocument_textÚtext_previewrO   r"   r    z
Filename: ÚfilenamezDocument type: zExtraction: Úsource_typez | OCR=Úocr_usedr9   zK=== BANK STATEMENT SUMMARY (prefer these totals for cashflow questions) ===rÂ   z(no summary yet)r˜   Nz,Total money in (deposits/credits/received): r—   z1Total money out (withdrawals/debits/spent/paid): rª   u   Net cashflow (in âˆ’ out): r­   zTotals source: r§   zPayments made: z; payments received: r¨   r®   r¯   zDate range seen: r»   r¼   r²   zLargest deposit: ú (r³   ú)r°   zLargest withdrawal: r±   r´   zRough narration categories: ú, c              3  ó<   K  — | ]}|d          › d|d         › �V — ŒdS )r£   õ   Ã—r¤   Nr�   )r0   Úcs     r   r2   z%format_job_context.<locals>.<genexpr>Ð  s8   è è € ÐOÐOÀ˜q œ}Ð<Ð<°°'´
Ð<Ð<ÐOÐOÐOÐOÐOÐOr   é   z0=== SAMPLE TRANSACTIONS (first 25 + last 25) ===é   é2   rM   u   â€¦ u    more rows â€¦içÿÿÿu   â€¦z- rœ   r¿   z | out=r   z | in=r   z
 | amount=r   z@=== PDF DOCUMENT TEXT (may be truncated for long statements) ===i@  z(No readable text extracted.)zÒAnswer using the BANK STATEMENT SUMMARY for totals. For 'how much spent/paid', use money out. For 'received/deposited', use money in. Do not invent balance-sheet ratios (current ratio, D/E, assets/liabilities).ú
zQ=== PDF DOCUMENT TEXT (read this carefully; answer from what is written here) ===ià.  z0(No readable text extracted from the PDF pages.)z'=== SUPPORTING EXTRACTED LINE ITEMS ===é<   z | account=rÞ   ú-z	 | debit=z
 | credit=z(No structured line items.)uW   === FIGURE CHECKS (for your reasoning only â€” do not copy this format to the user) ===r>   FzSheet does not balance: debits r<   z vs credits r=   ú.TzDebits equal credits.rµ   zAssets come to r¶   zLiabilities come to r·   zEquity comes to r¸   zCurrent ratio is about r¹   zDebt-to-equity is about rº   zWorking capital is about z"Text may include OCR draft values.)	r   r�   r?   r  rC   Ú
isinstanceÚdictr%   Ú
startswith)r  r#   ÚcalcrÁ   r‹   Údoc_textÚkindÚlinesrÑ   Úsampler6   s              r   Úformat_job_contextr;  ™  s¨
  € à�7Š7�6‰?Œ?Ð ˜b€DØ�7Š7�=Ñ!Ô!Ð' R€DØ�hŠh�yÑ!Ô!Ð' R€GØ—’˜,Ñ'Ô'ÐF¨3¯7ª7°<Ñ+@Ô+@ÐFÀB€JØ—’˜Ñ(Ô(ÐI¨C¯GªG°NÑ,CÔ,CÐIÀr×PÒPÑRÔR€Hà�Š�Ñ Ô ð 	Ø�8Š8�OÑ$Ô$ð	à�;Š;�Ñ'Ô'ð	ð ð	 	ð 	+�S—W’W˜ZÑ(Ô(Ð*Ð*Ø ˜$Ð Ð ØK�s—w’w˜}Ñ-Ô-ÐKÐK°c·g²g¸jÑ6IÔ6IÐKÐKØ
ð	€Eð ÐÒÑØ�ŠÐbÑcÔcÐcØ�Š�T—X’X˜iÑ(Ô(Ð>Ð,>Ñ?Ô?Ð?Ø�;Š;�zÑ"Ô"Ð.Ø�LŠLÐaÈÏÊÐT^ÑH_ÔH_ÐaÐaÑbÔbÐbØ�;Š;�{Ñ#Ô#Ð/Ø�LŠLÐgÈWÏ[Ê[ÐYdÑMeÔMeÐgÐgÑhÔhÐhØ�;Š;�~Ñ&Ô&Ð2Ø�LŠLÐT°w·{²{À>Ñ7RÔ7RÐTÐTÑUÔUÐUØ�;Š;�Ñ'Ô'ð 	KØ�LŠLÐI¨7¯;ª;°Ñ+GÔ+GÐIÐIÑJÔJÐJØ�;Š;�Ñ'Ô'Ð3Ø�LŠLðI '§+¢+¨oÑ">Ô">ð Ið IØ&-§k¢kÐ2EÑ&FÔ&FðIð Iñô ð ð �;Š;�|Ñ$Ô$ð 	¨¯ª°JÑ(?Ô(?ð 	Ø�LŠLØk G§K¢K°Ñ$=Ô$=Ð$DÀÐkÐkÈ7Ï;Ê;ÐWaÑKbÔKbÐKiÐfiÐkÐkñô ð ð �;Š;Ð(Ñ)Ô)Ð5Ø�LŠLðA G§K¢KÐ0AÑ$BÔ$Bð Að AØ—K’KÐ 6Ñ7Ô7Ð=¸2ðAð Að Añô ð ð �;Š;Ð+Ñ,Ô,Ð8Ø�LŠLðD w§{¢{Ð3GÑ'HÔ'Hð Dð DØ—K’KÐ 9Ñ:Ô:Ð@¸bðDð Dð Dñô ð ð �{Š{Ð+Ñ,Ô,Ð2°ˆØð 	Ø�LŠLØ.Ø—)’)ÐOÐOÀdÈ2ÈAÈ2ÄhÐOÑOÔOÑOÔOñPñô ð ð 	�Š�RÑÔÐØ�ŠÐGÑHÔHÐHØ�c�r�c”ˆÝˆt‰9Œ9�rŠ>ˆ>Ø˜#˜2˜#”Y =Ð2W½¸T¹¼ÀR¹Ð2WÐ2WÐ2WÐ"XÐ!YÑYÐ\`ÐadÐaeÐaeÔ\fÑfˆFˆFÝ�‰YŒY˜Š^ˆ^ØˆFØð 		ñ 		ˆAÝ˜a¥Ñ&Ô&ð ØÝ�1—5’5˜Ñ'Ô'Ð-¨2Ñ.Ô.×9Ò9¸%Ñ@Ô@ð Ø—’Ð8 !§%¢%¨Ñ"6Ô"6Ð8Ð8Ñ9Ô9Ð9ØØ�LŠLðZ�Q—U’U˜6‘]”]Ð( bð Zð Z¨Q¯UªU°=Ñ-AÔ-AÐ-HÀSð Zð ZØ—u’u˜W‘~”~ðZð ZØ-.¯UªU°8©_¬_ðZð ZØHIÏÊÈhÉÌðZð Zñô ð ñ ð 	�Š�RÑÔÐØ�ŠÐWÑXÔXÐXàð 	:Ø�LŠL˜ % 4 %œÑ)Ô)Ð)Ð)à�LŠLÐ8Ñ9Ô9Ð9Ø�Š�RÑÔÐØ�Šð[ñ	
ô 	
ð 	
ð
 �yŠy˜ÑÔÐð 
‡L‚LÐdÑeÔeÐeØð IØ�Š�X˜f˜u˜fÔ%Ñ&Ô&Ð&Ð&à�ŠÐGÑHÔHÐHà	‡L‚L�ÑÔÐØ	‡L‚LÐ:Ñ;Ô;Ð;Ø�#�2�#ŒYð 
ð 
ˆØ�Šð\�—’�}Ñ%Ô%Ð,¨ð \ð \¸¿º¸yÑ9IÔ9IÐ9PÈSð \ð \Ø—U’U˜7‘^”^ð\ð \Ø/0¯uªu°X©¬ð\ð \ØJKÏ%Ê%ÐPXÉ/Ì/ð\ð \ñ	
ô 	
ð 	
ð 	
ð ð 4Ø�ŠÐ2Ñ3Ô3Ð3à	‡L‚L�ÑÔÐØ	‡L‚LÐjÑkÔkÐkØ‡~‚~�jÑ!Ô! UÐ*Ð*Ø�Šð9¨j¯nªn¸]Ñ.KÔ.Kð 9ð 9Ø!—~’~ nÑ5Ô5ð9ð 9ð 9ñ	
ô 	
ð 	
ð 	
ð 
�Š˜
Ñ	#Ô	# tÐ	+Ð	+Ø�ŠÐ,Ñ-Ô-Ð-Ø‡{‚{�>Ñ"Ô"Ð.Ø�ŠÐE w§{¢{°>Ñ'BÔ'BÐEÐEÐEÑFÔFÐFØ‡{‚{Ð&Ñ'Ô'Ð3Ø�ŠÐO¨G¯KªKÐ8KÑ,LÔ,LÐOÐOÐOÑPÔPÐPØ‡{‚{�>Ñ"Ô"Ð.Ø�ŠÐF¨¯ª°NÑ(CÔ(CÐFÐFÐFÑGÔGÐGØ‡{‚{�?Ñ#Ô#Ð/Ø�ŠÐN¨w¯{ª{¸?Ñ/KÔ/KÐNÐNÐNÑOÔOÐOØ‡{‚{Ð#Ñ$Ô$Ð0Ø�ŠÐP°·²Ð<LÑ0MÔ0MÐPÐPÐPÑQÔQÐQØ‡{‚{Ð$Ñ%Ô%Ð1Ø�ŠÐR°·²Ð=NÑ1OÔ1OÐRÐRÐRÑSÔSÐSØ
‡w‚wˆzÑÔð ;Ø�ŠÐ9Ñ:Ô:Ð:Ø�9Š9�UÑÔÐr   a  (?i)^\s*(what\s+is\s+(this|the|my)\s+(pdf|file|document|statement|bank\s+statement|balance\s*sheet|sheet|knowledge\s*base)(\s+about)?|what('?s|\s+is)\s+(this|it)\s+about|what\s+does\s+(this|the|my)\s+(pdf|file|document|statement|bank\s+statement|knowledge\s*base)\s+(contain|show|say|have)|describe\s+(this|the|my)\s+(pdf|file|document|statement|bank\s+statement|balance\s*sheet|knowledge\s*base)?|summarize\s+(this|the|my)\s+(pdf|file|document|statement|bank\s+statement|balance\s*sheet|knowledge\s*base)?|analy[sz]e\s+(this|the|my)?\s*(pdf|file|docu?m?e?n?t|statement|bank\s+statement|upload|uploads)?|analy[sz]e\s+(it|this)|(give\s+me\s+)?(an?\s+)?(overview|summary)\s+(of\s+)?(this|the|my)?\s*(pdf|file|document|statement|bank\s+statement|knowledge\s*base)?|tell\s+me\s+about\s+(this|the|my)\s+(pdf|file|document|statement|bank\s+statement|balance\s*sheet|knowledge\s*base)?|tell\s+me\s+about\s+(the\s+)?knowledge\s*base|what('?s|\s+is)\s+in\s+(my|the)\s+knowledge\s*base|tell\s+me\s+about\s+my\s+(finances?|upi|payments?|transactions?))\s*[?.!]?\s*$))rP   )rR   rP   rQ   rS   rT   rU   rV   zcountry delightÚ	beejapuriÚbbdailyÚ
milkbasketÚdunzoÚjiomartznature's basketznatures basket)rW   )rX   rY   rZ   r[   úfood delivery)r\   )r]   r^   r_   r\   Úcab)r`   )ra   rc   rb   ÚjioÚairtelÚelectricity)Ú	transfers)úmoney transferú
money sentúself transferz# money transferz!list[tuple[str, tuple[str, ...]]]Ú_CATEGORY_KEYSa  (?i)\b(how\s+much.*(spent|spend|paid|payment|debit|withdrawn|withdrawal|outflow|money\s+out|total\s+out)|total\s+(spent|spend|paid|payments?|debits?|withdrawals?|money\s+paid|money\s+out)|(spent|paid)\s+in\s+total|total\s+amount\s+(spent|paid)|money\s+paid)\bz¡(?i)\b(how\s+much.*(received|credited|deposit|money\s+in|inflow|total\s+in)|total\s+(received|credits?|deposits?|money\s+received|money\s+in)|money\s+received)\bz`(?i)\b(net\s+(cashflow|cash\s*flow|amount|total)|how\s+much\s+(left|net)|difference\s+between)\bz¹(?i)\b(how\s+many\s+(transactions?|payments?|txns?)(?:\s+\w+){0,4}|transactions?\s+(are\s+)?made|payments?\s+(are\s+)?made|transaction\s+count|number\s+of\s+(transactions?|payments?))\bÚquestionÚboolc                óx   — t          t                               | pd                     ¦   «         ¦  «        ¦  «        S )NrO   )rL  Ú_PDF_OVERVIEW_REÚmatchr�   )rK  s    r   Úis_pdf_overview_questionrP  h  s/   € ÝÕ ×&Ò&¨¨°B×'=Ò'=Ñ'?Ô'?Ñ@Ô@ÑAÔAÐAr   z&list[tuple[str, str, tuple[str, ...]]]Ú_MERCHANT_ALIAS_KEYSú# r  >   rB  ÚbillrW   r\   r`   rR   rb   r}   rP   rF  r[   rH  rc   rA  rI  rG  ú"tuple[str, tuple[str, ...]] | Nonec                ó  — | pd                      ¦   «         }g }t          D ]H\  }}}t          j        dt          j        |¦  «        › d�|¦  «        r|                     ||f¦  «         ŒIt          |¦  «        dk    r|d         \  }}||fS dS )uT   If the user names a specific merchant alias (Zepto, Blinkit, â€¦), return that only.rO   ú(?<![a-z0-9])ú(?![a-z0-9])r*   r   N)r„   rQ  ÚreÚsearchÚescaper?   rC   )rK  ÚqÚhitsÚaliasÚ_labelr‡   s         r   Ú_named_merchant_aliasr_  Œ  sž   € à	ˆ�R×ÒÑ Ô €AØ.0€DÝ3ð 'ð 'Ñˆˆv�tÝŒ9ÐD¥b¤i°Ñ&6Ô&6ÐDÐDÐDÀaÑHÔHð 	'Ø�KŠK˜ ˜Ñ&Ô&Ð&øÝ
ˆ4�y„y�A‚~€~Ø˜1”g‰ˆˆtØ�dˆ{ÐØˆ4r   c                óD  ‡‡— | pd                      ¦   «         Št          | ¦  «        }|r|S t          D ]G\  }}d„ t          D ¦   «         Š|‰v st	          ˆˆfd„|D ¦   «         ¦  «        r|dk    rd‰v rŒA||fc S ŒHt          j        d‰¦  «        }|rŽ|                     d¦  «                              ¦   «         }|                     d¦  «        rd	t          d
         d         fS t          D ]5\  }}|                     |¦  «        s|                     |¦  «        r||fc S Œ6d S )NrO   c                ó   — h | ]\  }}}|’Œ	S r�   r�   )r0   ÚaÚ_s      r   ú	<setcomp>z)_detect_spend_category.<locals>.<setcomp>¢  s   € Ð;Ð;Ð;™7˜1˜a �QÐ;Ð;Ð;r   c              3  óâ   •K  — | ]i}t          |¦  «        d k    ¯|                     d¦  «                             ¦   «         ‰v o(|                     d¦  «                             ¦   «         ‰vV — ŒjdS )r  rR  N)rC   Úlstripr„   )r0   r1   Ú	alias_setr[  s     €€r   r2   z)_detect_spend_category.<locals>.<genexpr>£  sv   øè è € ð 
ð 
àÝ�1‰vŒv˜Šzˆzð �XŠX�d‰^Œ^×!Ò!Ñ#Ô# qÐ(ÐT¨Q¯XªX°d©^¬^×-AÒ-AÑ-CÔ-CÈ9Ð-Tàˆzˆzˆzð
ð 
r   rW   rR   z:(?i)\bon\s+(grocer(?:y|ies)|food|taxi|bills?|transfers?)\br*   ÚgrocerrP   r   )	r„   r_  rJ  rQ  rA   rX  rY  Úgroupr5  )rK  Únarrowedr†   r‡   ÚmÚwordrg  r[  s         @@r   Ú_detect_spend_categoryrm  ™  s€  øø€ Ø	ˆ�R×ÒÑ Ô €Aå$ XÑ.Ô.€HØð ØˆÝ%ð ð ‰ˆˆtð <Ð;Õ&:Ð;Ñ;Ô;ˆ	Ø�Aˆ:ˆ:�ð 
ð 
ð 
ð 
ð 
àð
ñ 
ô 
ñ 
ô 
ˆ:ð ˜Šˆ 9° > >ØØ˜$�;ÐÐÐð õ 	Œ	ÐOÐQRÑSÔS€AØð #Ø�wŠw�q‰zŒz×ÒÑ!Ô!ˆØ�?Š?˜8Ñ$Ô$ð 	5Ø¥¨qÔ 1°!Ô 4Ð4Ð4Ý)ð 	#ð 	#‰KˆE�4Ø×Ò Ñ%Ô%ð #¨¯ª¸Ñ)?Ô)?ð #Ø˜d�{Ð"Ð"Ð"ð#àˆ4r   c                ój   ‡ — d                      ˆ fd„dD ¦   «         ¦  «                             ¦   «         S )Nrß   c              3  ó`   •K  — | ](}t          ‰                     |¦  «        pd ¦  «        V — Œ)dS )rO   N)r%   r   r/   s     €r   r2   z_row_blob.<locals>.<genexpr>¹  sK   øè è € ð ð Ø"#�ˆC�GŠG�A‰JŒJÐ˜"ÑÔðð ð ð ð ð r   )rM   ÚrawrÞ   rœ   )r  r„   r   s   `r   Ú	_row_blobrq  ¸  sH   ø€ Ø�8Š8ð ð ð ð Ø'Pðñ ô ñ ô ç‚e�g„gðr   r‡   útuple[str, ...]c                ó  — t          | ¦  «        }|D ]v}|                     ¦   «                              ¦   «         }|sŒ+|                     d¦  «        r||v r dS ŒHt	          j        dt	          j        |¦  «        › d�|¦  «        r dS ŒwdS )Nú#TrV  rW  F)rq  r„   r�   r5  rX  rY  rZ  )r   r‡   ÚblobrŸ   r1   s        r   Ú_row_matches_keysrv  ¾  s    € Ý�S‰>Œ>€DØð 
ð 
ˆØ�IŠI‰KŒK×ÒÑÔˆØð 	ØØ�<Š<˜ÑÔð 	Ø�DˆyˆyØ�t�tØåŒ9Ð@¥b¤i°¡l¤lÐ@Ð@Ð@À$ÑGÔGð 	Ø�4�4ð	àˆ5r   ú
str | Nonec                óÆ  ‡‡— t          |¦  «        }|sdS |                     ¦   «         }t                               |¦  «        st	          j        d|¦  «        sdS |\  }Š|                      d¦  «        pg }ˆfd„|D ¦   «         }t          | ¦  «        }|�s|                      d¦  «        pd}d}	d}
|                     ¦   «         D ]™}|                     ¦   «         Št          ˆfd	„‰D ¦   «         ¦  «        sŒ2t	          j	        d
|¦  «        D ]Q}	 |	t          |                     d¦  «                             dd¦  «        ¦  «        z  }	|
dz  }
ŒB# t          $ r Y ŒNw xY wŒš|
r(d|
› d|› dt          t          |	d¦  «        |¦  «        › d�S d|› d|                      d¦  «        › d�S t          t!          d„ |D ¦   «         ¦  «        d¦  «        }	g }|dd…         D ]}}t#          |                     d¦  «        pd¦  «                             d¦  «        d         dd…         }|                     |› dt          t)          |¦  «        |¦  «        › d�¦  «         Œ~d}|rdd                     |¦  «        z   d z   }t-          |¦  «        dk    rd!t-          |¦  «        dz
  › d"�nd}d#|› d$|                      d¦  «        › d%t          |	|¦  «        › d&t-          |¦  «        › d'|› d |› �S )(ua   Sum spend for a named category from extracted statement rows â€” never the whole-statement total.Nz0(?i)\b(spent|spend|paid|cost|expense|expenses)\br#   c                óZ   •— g | ]'}t          |‰¦  «        ¯t          |¦  «        d k    ¯%|‘Œ(S )r   )rv  r   )r0   r6   r‡   s     €r   r•   z2answer_category_spend_question.<locals>.<listcomp>Ü  s:   ø€ ÐSÐSÐS�QÕ"3°A°tÑ"<Ô"<ÐSÅÈAÁÄÐQRÒARÐARˆqÐARÐARÐARr   r!  rO   r   r   c              3  óD   •K  — | ]}|                      ¦   «         ‰v V — Œd S r-   )r„   )r0   r1   Úlows     €r   r2   z1answer_category_spend_question.<locals>.<genexpr>å  s0   øè è € Ð6Ð6¨A�q—w’w‘y”y CÐ'Ð6Ð6Ð6Ð6Ð6Ð6r   u&   (?i)-\s*(?:â‚¹|rs\.?)\s*([\d,]+\.?\d*)r*   ú,z0From the uploaded statement text, I found about rß   z outflow line(s) totaling r:   z'. This is not the full-statement total.zI couldn't find u-    transactions in the extracted lines from â€œr#  uD   â€�. Try asking about a merchant name that appears on the statement.c              3  ó4   K  — | ]}t          |¦  «        V — Œd S r-   r’   r5   s     r   r2   z1answer_category_spend_question.<locals>.<genexpr>ù  s(   è è € Ð5Ð5¨•j ‘m”mÐ5Ð5Ð5Ð5Ð5Ð5r   é   rM   Úpaymentr/  r0  r&  r'  z Examples: ú; r2  z (+z more)z	Spent on u    in â€œu   â€�: ú across z payment(s))rm  r„   Ú_SPEND_Q_RErY  rX  r   Ú_detect_currency_symbolÚ
splitlinesrA   Úfinditerr	   ri  Úreplacer   Ú_pretty_moneyrD   rB   r%   Úsplitr?   r   r  rC   )r  rK  Úcatr[  r†   r#   ÚmatchedÚcurÚtextÚtotalr\  Úlinerk  r:  r6   Údescr  Úmorer‡   r{  s                     @@r   Úanswer_category_spend_questionr‘  Î  s   øø€ å
  Ñ
*Ô
*€CØð ØˆtØ�ŠÑÔ€Aå×Ò˜8Ñ$Ô$ðåŒ9ÐHÈ!ÑLÔLðð ˆtà�K€Eˆ4Ø�7Š7�6‰?Œ?Ð ˜b€DØSÐSÐSÐS˜$ÐSÑSÔS€GÝ
! #Ñ
&Ô
&€CØñ 
à�wŠw�Ñ'Ô'Ð-¨2ˆØˆØˆØ—O’OÑ%Ô%ð 
	ð 
	ˆDØ—*’*‘,”,ˆCÝÐ6Ð6Ð6Ð6°Ð6Ñ6Ô6Ñ6Ô6ð Øå”[Ð!JÈDÑQÔQð ð �ðØ�U 1§7¢7¨1¡:¤:×#5Ò#5°c¸2Ñ#>Ô#>Ñ?Ô?Ñ?�EØ˜A‘I�D�DøÝ!ð ð ð Ø�Dðøøøð	ð ð 	ð9À4ð 9ð 9È%ð 9ð 9Ý)­%°°q©/¬/¸3Ñ?Ô?ð9ð 9ð 9ððl˜uð lð lØ—'’'˜*Ñ%Ô%ðlð lð lð	
õ
 •#Ð5Ð5¨WÐ5Ñ5Ô5Ñ5Ô5°qÑ9Ô9€EØ€FØ�R�a�RŒ[ð Gð GˆÝ�1—5’5˜Ñ'Ô'Ð4¨9Ñ5Ô5×;Ò;¸DÑAÔAÀ!ÔDÀSÀbÀSÔIˆØ�Š˜ÐEÐE¥­z¸!©}¬}¸cÑ!BÔ!BÐEÐEÐEÑFÔFÐFÐFØ€EØð 8Ø §	¢	¨&Ñ 1Ô 1Ñ1°CÑ7ˆÝ-0°©\¬\¸AÒ-=Ð-=Ð)•�W‘” Ñ!Ð)Ð)Ð)Ð)À2€Dð	:�Eð 	:ð 	: #§'¢'¨*Ñ"5Ô"5ð 	:ð 	:½MÈ%ÐQTÑ<UÔ<Uð 	:ð 	:Ý�g‘,”,ð	:ð 	:Ø+/ð	:ð 	:Ø27ð	:ð 	:ðs   Ä>EÅ
EÅEc                ó  — |                       d¦  «        pi }|                      d¦  «        pi }|                       d¦  «        p+|                      d¦  «        p|                      d¦  «        pd}|                       d¦  «        pi }|                      d¦  «        }|                      d¦  «        }|€*|                      d¦  «        �|                      d¦  «        }|€*|                      d¦  «        �|                      d¦  «        }|pd                     ¦   «         }|sdS t          |¦  «        rt          | ¦  «        S t	          | |¦  «        }	|	r|	S t          |¦  «        rt                               |¦  «        rdS t          j        d	|¦  «        rdS t          | ¦  «        }
t          ||
¦  «        }t          ||
¦  «        }d}|�O|�M	 t          |¦  «        t          |¦  «        z
  }nV# t          t          f$ r |                      d
¦  «        }Y n.w xY w|                      d
¦  «        �|                      d
¦  «        }t          ||
¦  «        }|dv s|s|�rËt                               |¦  «        ri|rgd}|                      d¦  «        �d|                      d¦  «        › d�}n.|                      d¦  «        �d|                      d¦  «        › d�}d|› |› d�S t                               |¦  «        ri|rgd}|                      d¦  «        �d|                      d¦  «        › d�}n.|                      d¦  «        �d|                      d¦  «        › d�}d|› |› d�S t                               |¦  «        r8|r6t          ||
¦  «        }t          ||
¦  «        }|r|rd|› d|› d|› d�S d|› d�S t                                |¦  «        rÕ|                      d¦  «        }|€|                      d¦  «        }|                      d¦  «        }|€|                      d¦  «        }g }|�|                     |› d�¦  «         |�|                     |› d�¦  «         |rdd                     |¦  «        › d�S |                       d¦  «        pg }|rdt'          |¦  «        › d�S t          j        d|¦  «        ro|s|rkg }|r|                     d|› �¦  «         |r|                     d |› �¦  «         |r|                     d!|› �¦  «         d"d#                     |¦  «        z   dz   S |d$k    s|                      d%¦  «        ��Ft          |                      d%¦  «        |
¦  «        }t          |                      d&¦  «        |
¦  «        }t          |                      d'¦  «        |
¦  «        }t          j        d(|¦  «        r|rd)|› d�S t          j        d*|¦  «        r|rd+|› d�S t          j        d,|¦  «        r|rd-|› d�S t          j        d.|¦  «        r.|                      d/¦  «        �d0|                      d/¦  «        › d�S t          j        d1|¦  «        r.|                      d2¦  «        �d3|                      d2¦  «        › d�S dS )4u\   Deterministic answers for spend/received/net/balance questions â€” values from the PDF only.r   rÁ   r"   rO   rŠ   r—   r˜   Nz`(?i)\b(each|every|per|all)\s+(date|day)\b|\bdate[\s-]?wise\b|\bday[\s-]?wise\b|\bdaily\s+spend\brª   >   r    r9   r§   r�  z	 paymentsz.Total spent (money paid) on this statement is r2  r¨   z/Total received (money in) on this statement is zNet cashflow is z (received u
    âˆ’ paid z).ú payments madeú payments receivedzThis statement shows ú and r#   úI extracted z" transactions from this statement.z3(?i)\b(total|totals|cashflow|cash\s*flow|summary)\bzspent/paid z	received únet zStatement totals: r€  r  rµ   r¶   r·   z(?i)\bassets?\bz#Total assets on this statement are z(?i)\bliabilitz(Total liabilities on this statement are z(?i)\bequity|capital\bz"Total equity on this statement is z(?i)\bcurrent\s+ratio\br¸   zCurrent ratio is z&(?i)\b(d/e|debt[\s-]*to[\s-]*equity)\br¹   zDebt-to-equity is )r   r�   rP  Údescribe_pdf_jobr‘  rm  r‚  rY  rX  rƒ  r‡  r	   r   r   Ú_RECEIVED_Q_REÚ	_NET_Q_REÚ_TXN_COUNT_Q_REr?   r  rC   )r  rK  r6  rÁ   r8  rË   r—   r˜   r[  Úcat_ansr‹  Úout_sÚin_sÚnet_valÚnet_sr  Úin_partÚout_partrÓ   rÔ   Úbitsr#   r  Úliabrÿ   s                            r   Ú answer_statement_metric_questionr¥    s�  € à�7Š7�=Ñ!Ô!Ð' R€DØ�hŠh�yÑ!Ô!Ð' R€Gà�Š�Ñ Ô ð 	Ø�8Š8�OÑ$Ô$ð	à�;Š;�Ñ'Ô'ð	ð ð	 	ð �WŠWÐ'Ñ(Ô(Ð.¨B€FØ—’˜KÑ(Ô(€IØ�{Š{˜:Ñ&Ô&€HØÐ˜VŸZšZ¨Ñ4Ô4Ð@Ø—J’J˜{Ñ+Ô+ˆ	ØÐ˜FŸJšJ zÑ2Ô2Ð>Ø—:’:˜jÑ)Ô)ˆà	ˆ�R×ÒÑ Ô €AØð Øˆtå Ñ"Ô"ð %Ý Ñ$Ô$Ð$õ -¨S°!Ñ4Ô4€GØð Øˆõ ˜aÑ Ô ð ¥[×%7Ò%7¸Ñ%:Ô%:ð Øˆtõ 
„yØkØ	ñô ð ð ˆtå
! #Ñ
&Ô
&€CÝ˜) SÑ)Ô)€EÝ˜ 3Ñ'Ô'€DØ€GØÐ 	Ð 5ð	2Ý˜H‘o”o­¨iÑ(8Ô(8Ñ8ˆGˆGøÝ�:Ð&ð 	2ð 	2ð 	2Ø—k’k .Ñ1Ô1ˆGˆGˆGð	2øøøà	�Š�^Ñ	$Ô	$Ð	0Ø—+’+˜nÑ-Ô-ˆÝ˜' 3Ñ'Ô'€EàÐ,Ð,Ð,°Ð,¸Ñ,Ý×Ò˜aÑ Ô ð 	T Uð 	TØˆEØ�{Š{˜?Ñ+Ô+Ð7ØJ 7§;¢;¨Ñ#?Ô#?ÐJÐJÐJ��Ø—’˜OÑ,Ô,Ð8ØI 6§:¢:¨oÑ#>Ô#>ÐIÐIÐI�ØSÀEÐSÈ5ÐSÐSÐSÐSå× Ò  Ñ#Ô#ð 	T¨ð 	TØˆEØ�{Š{Ð.Ñ/Ô/Ð;ØN 7§;¢;Ð/BÑ#CÔ#CÐNÐNÐN��Ø—’Ð/Ñ0Ô0Ð<ØM 6§:¢:Ð.AÑ#BÔ#BÐMÐMÐM�ØSÀTÐSÈ5ÐSÐSÐSÐSå×Ò˜AÑÔð 	/ 5ð 	/Ý# H¨cÑ2Ô2ˆGÝ$ Y°Ñ4Ô4ˆHØð ˜8ð ðA uð Að AØ!(ðAð AØ4<ðAð Að Aðð / eÐ.Ð.Ð.Ð.å×!Ò! !Ñ$Ô$ð 	TØ—;’;˜Ñ/Ô/ˆDØˆ|Ø—z’z /Ñ2Ô2�Ø—;’;Ð2Ñ3Ô3ˆDØˆ|Ø—z’zÐ"5Ñ6Ô6�ØˆDØÐØ—’˜tÐ3Ð3Ð3Ñ4Ô4Ð4ØÐØ—’˜tÐ7Ð7Ð7Ñ8Ô8Ð8Øð EØD¨w¯|ª|¸DÑ/AÔ/AÐDÐDÐDÐDØ—7’7˜6‘?”?Ð( bˆDØð TØS¥c¨$¡i¤iÐSÐSÐSÐSåŒ9ÐKÈQÑOÔOð 	@ÐUZð 	@Ð^bð 	@ØˆDØð 3Ø—’Ð1¨%Ð1Ð1Ñ2Ô2Ð2Øð 0Ø—’Ð.¨Ð.Ð.Ñ/Ô/Ð/Øð ,Ø—’˜N 5˜N˜NÑ+Ô+Ð+Ø'¨$¯)ª)°D©/¬/Ñ9¸CÑ?Ð?àˆÒÐ '§+¢+¨nÑ"=Ô"=Ñ"IÝ˜wŸ{š{¨>Ñ:Ô:¸CÑ@Ô@ˆÝ˜WŸ[š[Ð)<Ñ=Ô=¸sÑCÔCˆÝ˜wŸ{š{¨>Ñ:Ô:¸CÑ@Ô@ˆÝŒ9Ð'¨Ñ+Ô+ð 	C°ð 	CØB¸ÐBÐBÐBÐBÝŒ9Ð&¨Ñ*Ô*ð 	F¨tð 	FØE¸dÐEÐEÐEÐEÝŒ9Ð.°Ñ2Ô2ð 	B°vð 	BØA¸ÐAÐAÐAÐAÝŒ9Ð/°Ñ3Ô3ð 	G¸¿ºÀOÑ8TÔ8TÐ8`ØF w§{¢{°?Ñ'CÔ'CÐFÐFÐFÐFÝŒ9Ð>ÀÑBÔBð 	IÀwÇ{Â{ÐScÑGdÔGdÐGpØH¨¯ªÐ4DÑ(EÔ(EÐHÐHÐHÐHàˆ4s   ÇG- Ç-&HÈHrO   ÚvalueÚobjectÚcurrencyc                ó~   — | €d S 	 t          | ¦  «        d›}n# t          t          f$ r Y d S w xY w|r|› d�nd}|› |› �S )Nr½   rß   rO   )r	   r   r   )r¦  r¨  ÚnumÚprefixs       r   r‡  r‡  ‡  sp   € Ø€}ØˆtðÝ�u‘”Ð$Ð$ˆˆøÝ•zÐ"ð ð ð Øˆtˆtðøøøà'Ð/�ˆ^ˆ^ˆ^ˆ^¨R€FØÐ�cÐÐÐs   † ˜-¬-c                óP  — |                       d¦  «        pd› d|                       d¦  «        pd› �d d…         }d|v st          j        d|¦  «        rdS d|v st          j        d	|¦  «        rdS d
|v st          j        d|¦  «        rd
S d|v st          j        d|¦  «        rdS dS )Nr!  rO   rß   r"  i¸  u   â‚¹z(?i)\b(?:rs\.?|inr)\bú$z(?i)\busd\bu   â‚¬z(?i)\beur\bõ   Â£z(?i)\bgbp\b)r   rX  rY  )r  ru  s     r   rƒ  rƒ  ’  s¿   € Ø�gŠg�oÑ&Ô&Ð,¨"ÐNÐN¨s¯wªw°~Ñ/FÔ/FÐ/LÈ"ÐNÐNÈuÐPTÈuÔU€DØ�€}€}�œ	Ð":¸DÑAÔA€}ØˆuØ
ˆd€{€{•b”i °Ñ5Ô5€{ØˆsØ�€}€}�œ	 .°$Ñ7Ô7€}ØˆuØˆt€|€|•r”y °Ñ6Ô6€|ØˆtØˆ2r   c                ó†  — t          |                      d¦  «        pd¦  «        }|                      d¦  «        pg }|                      d¦  «        pi }|                     d¦  «        pi }|                      d¦  «        pi }|                     d¦  «        p|                      d¦  «        pi }|                      d¦  «        p)|                     d¦  «        p|                     d¦  «        }t          | ¦  «        }|d	k    �r]t          |                     d
¦  «        |¦  «        }	t          |                     d¦  «        |¦  «        }
t          |                     d¦  «        |¦  «        }|                     d¦  «        }|€|                     d¦  «        }|                     d¦  «        }|€|                     d¦  «        }d|› d�g}g }|�|                     |› d�¦  «         |�|                     |› d�¦  «         |r/|                     dd                     |¦  «        z   dz   ¦  «         n(|r&|                     dt          |¦  «        › d�¦  «         g }|
r|                     d|
› �¦  «         |	r|                     d|	› �¦  «         |r|                     d|› �¦  «         |r.|                     dd                     |¦  «        z   dz   ¦  «         |                      d¦  «        p|                      d¦  «        pd dd!…         }t          j        d"|¦  «        }|r-|                     d#| 	                    d$¦  «        › d�¦  «         nä|                     d%¦  «        s|                     d&¦  «        rºt          |                     d%¦  «        pd'¦  «         
                    d(¦  «        d)                              ¦   «         }t          |                     d&¦  «        pd'¦  «         
                    d(¦  «        d)                              ¦   «         }|                     d*|› d+|› d�¦  «         |                     d,¦  «         d-                     |¦  «        S t          |                     d.¦  «        |¦  «        }t          |                     d/¦  «        |¦  «        }t          |                     d0¦  «        |¦  «        }|                     d1¦  «        }|                     d2¦  «        }t          |                     d3¦  «        |¦  «        }t          |                     d4¦  «        p|                     d4¦  «        |¦  «        }t          |                     d5¦  «        p|                     d5¦  «        |¦  «        }g }|                     d6¦  «        d7u r;d }|r|r	d8|› d9|› d�}|                     d|› d:t          |¦  «        › d;|› �¦  «         n)|                     d|› d<t          |¦  «        › d;�¦  «         g }|r|                     d=|› �¦  «         |r|                     d>|› �¦  «         |r|                     d?|› �¦  «         |r.|                     d@d                     |¦  «        z   dz   ¦  «         g }|�|                     dA|› �¦  «         |�|                     dB|› �¦  «         |r|                     dC|› �¦  «         |r.|                     dDd                     |¦  «        z   dz   ¦  «         |                     d6¦  «        dEu r|                     dF¦  «         d-                     |¦  «        S )GuZ   Human overview of an uploaded statement â€” no LLM. Values come only from the PDF extract.r#  zthis PDFr#   r   rÁ   rŠ   r‹   r"   r9   r˜   r—   rª   r§   Nr¨   u   â€œu!   â€� is a bank / wallet statement.r“  r”  z	It lists r•  r2  r–  z transaction lines from it.zmoney paid/out zmoney received/in r—  zTotals from the document: r(  r!  r"  rO   iÐ  uK   (?i)(\d{1,2}\s+[A-Z]{3}'?\d{2,4}\s*[-â€“â€”]\s*\d{1,2}\s+[A-Z]{3}'?\d{2,4})zPeriod on the statement: r*   r®   r¯   r»   r/  r   zDates seen in lines: r¼   zcYou can ask how much was spent or received, how many payments were made, or about a specific month.rß   rµ   r¶   r·   r¸   r¹   rº   r<   r=   r>   Fz Debits are z but credits are u(   â€� is an unbalanced balance sheet with z line items.u   â€� is a balance sheet with r  r  r  zKey balances: r  r  r  zRatios: Tz%The debit and credit columns balance.)r%   r   rƒ  r‡  r?   r  rC   rX  rY  ri  rˆ  r�   ) r  r#  r#   r6  rÁ   rË   r‹   r8  r‹  r˜   r—   r«   rÓ   rÔ   ÚpartsÚ
count_bitsr£  rŒ  rÕ   r+   Úendr  r¤  rÿ   ÚcrÚdeÚwcr<   r=   ÚissueÚbalance_bitsÚ
ratio_bitss                                    r   r˜  r˜  Ÿ  s‚  € å�3—7’7˜:Ñ&Ô&Ð4¨*Ñ5Ô5€HØ�7Š7�6‰?Œ?Ð ˜b€DØ�7Š7�=Ñ!Ô!Ð' R€DØ�hŠh�yÑ!Ô!Ð' R€GØ�WŠWÐ'Ñ(Ô(Ð.¨B€FØ—’˜,Ñ'Ô'ÐF¨3¯7ª7°<Ñ+@Ô+@ÐFÀB€JØ�7Š7�?Ñ#Ô#Ð` t§x¢x°Ñ'@Ô'@Ð`ÀGÇKÂKÐP_ÑD`ÔD`€DÝ
! #Ñ
&Ô
&€CàÐÒÑÝ  §¢¨ZÑ!8Ô!8¸#Ñ>Ô>ˆÝ! '§+¢+¨kÑ":Ô":¸CÑ@Ô@ˆ	Ý˜GŸKšK¨Ñ7Ô7¸Ñ=Ô=ˆØ�{Š{˜?Ñ+Ô+ˆØˆ<Ø—:’:˜oÑ.Ô.ˆDØ�{Š{Ð.Ñ/Ô/ˆØˆ<Ø—:’:Ð1Ñ2Ô2ˆDàB�xÐBÐBÐBÐCˆØˆ
ØÐØ×Ò Ð5Ð5Ð5Ñ6Ô6Ð6ØÐØ×Ò Ð9Ð9Ð9Ñ:Ô:Ð:Øð 	PØ�LŠL˜ w§|¢|°JÑ'?Ô'?Ñ?À#ÑEÑFÔFÐFÐFØð 	PØ�LŠLÐN­¨D©	¬	ÐNÐNÐNÑOÔOÐOàˆØð 	7Ø�KŠKÐ5¨)Ð5Ð5Ñ6Ô6Ð6Øð 	9Ø�KŠKÐ7¨XÐ7Ð7Ñ8Ô8Ð8Øð 	&Ø�KŠK˜˜s˜˜Ñ%Ô%Ð%Øð 	OØ�LŠLÐ5¸¿	º	À$¹¼ÑGÈ#ÑMÑNÔNÐNð —’˜Ñ(Ô(ÐI¨C¯GªG°NÑ,CÔ,CÐIÀrÈ5ÈDÈ5ÔQˆÝ”ØZØñ
ô 
ˆð ð 	EØ�LŠLÐG°V·\²\À!±_´_ÐGÐGÐGÑHÔHÐHÐHØ�[Š[˜Ñ&Ô&ð 	E¨'¯+ª+°jÑ*AÔ*Að 	EÝ˜Ÿš LÑ1Ô1Ð8°SÑ9Ô9×?Ò?ÀÑEÔEÀaÔH×NÒNÑPÔPˆEÝ�g—k’k *Ñ-Ô-Ð4°Ñ5Ô5×;Ò;¸DÑAÔAÀ!ÔD×JÒJÑLÔLˆCØ�LŠLÐC°ÐCÐC¸SÐCÐCÐCÑDÔDÐDà�ŠØqñ	
ô 	
ð 	
ð �xŠx˜‰ŒÐå˜7Ÿ;š; ~Ñ6Ô6¸Ñ<Ô<€FÝ˜ŸšÐ%8Ñ9Ô9¸3Ñ?Ô?€DÝ˜7Ÿ;š; ~Ñ6Ô6¸Ñ<Ô<€FØ	�Š�_Ñ	%Ô	%€BØ	�ŠÐ%Ñ	&Ô	&€BÝ	�w—{’{Ð#4Ñ5Ô5°sÑ	;Ô	;€BÝ 
§¢¨}Ñ =Ô =Ð [ÀÇÂÈ]ÑA[ÔA[Ð]`ÑaÔa€KÝ  §¢°Ñ!?Ô!?Ð!^À7Ç;Â;È~ÑC^ÔC^Ð`cÑdÔd€Là€Eà‡~‚~�jÑ!Ô! UÐ*Ð*ØˆØð 	Q˜<ð 	QØP ;ÐPÐPÀÐPÐPÐPˆEØ�Šð�(ð ð ÅCÈÁIÄIð ð Øðð ñ	
ô 	
ð 	
ð 	
ð
 	�ŠÐX˜8ÐXÐXÅÀTÁÄÐXÐXÐXÑYÔYÐYà€LØð 0Ø×ÒÐ. fÐ.Ð.Ñ/Ô/Ð/Øð 3Ø×ÒÐ1¨4Ð1Ð1Ñ2Ô2Ð2Øð 0Ø×ÒÐ. fÐ.Ð.Ñ/Ô/Ð/Øð GØ�ŠÐ%¨¯	ª	°,Ñ(?Ô(?Ñ?À#ÑEÑFÔFÐFà€JØ	€~Ø×ÒÐ/¨2Ð/Ð/Ñ0Ô0Ð0Ø	€~Ø×Ò˜+ ˜+˜+Ñ&Ô&Ð&Ø	ð 3Ø×ÒÐ1¨RÐ1Ð1Ñ2Ô2Ð2Øð ?Ø�Š�Z $§)¢)¨JÑ"7Ô"7Ñ7¸#Ñ=Ñ>Ô>Ð>à‡~‚~�jÑ!Ô! TÐ)Ð)Ø�ŠÐ<Ñ=Ô=Ð=à�8Š8�E‰?Œ?Ðr   )r   r   r   r	   )r#   r$   r"   r%   r   r   )rM   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"   r%   rŠ   rŒ   r   r   )r  r   r   r%   )rK  r%   r   rL  )rK  r%   r   rT  )r   r   r   r%   )r   r   r‡   rr  r   rL  )r  r   rK  r%   r   rw  )rO   )r¦  r§  r¨  r%   r   rw  )/Ú__doc__Ú
__future__r   rX  Úcollectionsr   Útypingr   r   r   r   rL   rˆ   rÖ   rÙ   r  r  r;  ÚcompilerN  rJ  Ú__annotations__r‚  r™  rš  r›  rP  rQ  r^  Ú_keysÚ_krf  r„   r�   Ú_kkrC   r5  r?   r_  rm  rq  rv  r‘  r¥  r‡  rƒ  r˜  r�   r   r   ú<module>rÂ     sÃ  ðØ >Ð >Ð >à "Ð "Ð "Ð "Ð "Ð "à 	€	€	€	Ø Ð Ð Ð Ð Ð Ø Ð Ð Ð Ð Ð ðð ð ð ðð ð ð ðð ð ð ð" #ð,ð ,ð ,ð ,ð ,ð ,ð^ð ð ð ð4 /3ð	Að Að Að Að Að AðN )-ðZð Zð Zð Zð Zð Zð&mð mð mð mðf #Ø.2ð	6ð 6ð 6ð 6ð 6ð 6ð8Að Að Að AðH �2”:ðñô Ð ð$5ð 5ð 5€ð ð ð ñ ð6 ˆbŒjðñô €ð �”ðñô €ð ˆBŒJØgñô €	ð �"”*ðñô €ðBð Bð Bð Bð
 @BÐ Ð AÐ AÐ AÑ AØ#ð ;ð ;�M€FˆEØð ;ð ;ˆØ�iŠi˜‰oŒo×#Ò#Ñ%Ô%×+Ò+Ñ-Ô-ˆàð	àˆs�3‰xŒx˜1Š}ˆ}Øð ð ð ð$ �~Š~˜fÑ%Ô%ð%ð( Ø×#Ò# S¨&°3°&Ð$9Ñ:Ô:Ð:Ð:ð5;ð:
ð 
ð 
ð 
ðð ð ð ð>ð ð ð ðð ð ð ð 7ð 7ð 7ð 7ðt|ð |ð |ð |ð~ð ð ð ð ð
ð 
ð 
ð 
ðjð jð jð jð jð jr   