Ë
    Úx?i)@  ã                   óþ   — d Z ddlmZ ddlmZ ddlmZmZmZm	Z	m
Z
mZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZm Z m!Z!m"Z"m#Z#m$Z$m%Z%m&Z&m'Z'm(Z(m)Z)m*Z*  G d„ de«      Z+ G d„ de«      Z, G d	„ d
e«      Z-y)z<
Tests for transaction type constants and helper functions.
é    )ÚTestCase)Útransaction_types)%ÚWALLET_DEPOSITÚWALLET_DEPOSIT_CANCELÚWALLET_TRANSFERÚWALLET_WITHDRAWÚWALLET_WITHDRAW_REFUNDÚWALLET_ADJUSTÚWALLET_TOPUPÚWALLET_DEDUCTÚPACKAGE_ACTIVATIONÚPACKAGE_ACTIVATION_CANCELÚPACKAGE_UPGRADEÚPACKAGE_UPGRADE_CANCELÚPACKAGE_RENEWALÚPACKAGE_RENEWAL_CANCELÚPACKAGE_EXPIRY_REFUNDÚCOMMISSION_DISTRIBUTIONÚCOMMISSION_DISTRIBUTION_REVERSEÚROI_DISTRIBUTIONÚROI_DISTRIBUTION_REVERSEÚPRODUCT_ORDERÚPRODUCT_ORDER_CANCELÚPRODUCT_ORDER_REFUNDÚPRODUCT_ORDER_PARTIAL_REFUNDÚPRODUCT_REDEMPTIONÚPRODUCT_REDEMPTION_CANCELÚSYSTEM_ADJUSTMENTÚSYSTEM_REWARDÚSYSTEM_PENALTYÚSYSTEM_REVERSALÚSYSTEM_MIGRATIONÚ!CUSTOM_TRANSACTION_TYPE_RANGE_ENDÚ#CUSTOM_TRANSACTION_TYPE_RANGE_STARTÚget_custom_transaction_typesÚget_transaction_typeÚget_transaction_type_nameÚ register_custom_transaction_typeÚ"unregister_custom_transaction_typec                   ó4   — e Zd ZdZd„ Zd„ Zd„ Zd„ Zd„ Zd„ Z	y)	ÚTransactionTypeConstantsTestsz%Tests for transaction type constants.c                 óÌ  — | j                  t        d«       | j                  t        d«       | j                  t        d«       | j                  t        d«       | j                  t
        d«       | j                  t        d«       | j                  t        d«       | j                  t        d«       | j                  t        t        «       | j                  t        t        «       y	)
z Test wallet operation constants.éè  ié  iê  éë  iì  ií  iî  iï  N)ÚassertEqualr   r   r   r   r	   r
   r   r   ÚassertIsInstanceÚint©Úselfs    úK/home/cursorai/projects/django-wallet-utils/tests/test_transaction_types.pyÚ test_wallet_operations_constantsz>TransactionTypeConstantsTests.test_wallet_operations_constants9   s¦   € à×Ñœ¨Ô.Ø×ÑÔ.°Ô5Ø×Ñœ¨$Ô/Ø×Ñœ¨$Ô/Ø×ÑÔ/°Ô6Ø×Ñœ¨Ô-Ø×Ñœ tÔ,Ø×Ñœ¨Ô-ð 	×Ñœn¬cÔ2Ø×Ñœo¬sÕ3ó    c                 ó8  — | j                  t        d«       | j                  t        d«       | j                  t        d«       | j                  t        d«       | j                  t
        d«       | j                  t        d«       | j                  t        d«       y)	z!Test package operation constants.éÐ  iÑ  iÒ  iÓ  iÔ  iÕ  iÖ  N)r/   r   r   r   r   r   r   r   r2   s    r4   Ú!test_package_operations_constantsz?TransactionTypeConstantsTests.test_package_operations_constantsH   sw   € à×ÑÔ+¨TÔ2Ø×ÑÔ2°DÔ9Ø×Ñœ¨$Ô/Ø×ÑÔ/°Ô6Ø×Ñœ¨$Ô/Ø×ÑÔ/°Ô6Ø×ÑÔ.°Õ5r6   c                 ó´   — | j                  t        d«       | j                  t        d«       | j                  t        d«       | j                  t        d«       y)z&Test commission and rewards constants.é¸  i¹  é  i  N)r/   r   r   r   r   r2   s    r4   Ú!test_commission_rewards_constantsz?TransactionTypeConstantsTests.test_commission_rewards_constantsR   sF   € à×ÑÔ0°$Ô7Ø×ÑÔ8¸$Ô?Ø×ÑÔ)¨4Ô0Ø×ÑÔ1°4Õ8r6   c                 ó  — | j                  t        d«       | j                  t        d«       | j                  t        d«       | j                  t        d«       | j                  t
        d«       | j                  t        d«       y)z!Test product operation constants.é   i¡  i¢  é£  i¤  i¥  N)r/   r   r   r   r   r   r   r2   s    r4   Ú!test_product_operations_constantsz?TransactionTypeConstantsTests.test_product_operations_constantsY   sg   € à×Ñœ¨Ô-Ø×ÑÔ-¨tÔ4Ø×ÑÔ-¨tÔ4Ø×ÑÔ5°tÔ<Ø×ÑÔ+¨TÔ2Ø×ÑÔ2°DÕ9r6   c                 óà   — | j                  t        d«       | j                  t        d«       | j                  t        d«       | j                  t        d«       | j                  t
        d«       y)z Test system operation constants.éˆ  i‰  iŠ  i‹  iŒ  N)r/   r   r   r    r!   r"   r2   s    r4   Ú test_system_operations_constantsz>TransactionTypeConstantsTests.test_system_operations_constantsb   sT   € à×ÑÔ*¨DÔ1Ø×Ñœ¨Ô-Ø×Ñœ¨Ô.Ø×Ñœ¨$Ô/Ø×ÑÔ)¨4Õ0r6   c                 ó¼  — | j                  t        d«       | j                  t        d«       | j                  t        d«       | j                  t
        d«       | j                  t        d«       | j                  t        d«       | j                  t        d«       | j                  t        d«       | j                  t        d«       | j                  t        d«       y)z+Test that constants are in expected ranges.r-   r8   r;   r?   rC   ip  N)ÚassertGreaterEqualr   Ú
assertLessr   r   r   r   r   r   r   r   r"   r2   s    r4   Útest_constant_rangesz2TransactionTypeConstantsTests.test_constant_rangesj   s©   € ð 	×Ñ¤°Ô5Ø�‰œ tÔ,ð 	×ÑÔ 2°DÔ9Ø�‰Ô-¨tÔ4ð 	×ÑÔ 7¸Ô>Ø�‰Ô0°$Ô7ð 	×Ñ¤¨tÔ4Ø�‰Ô1°4Ô8ð 	×ÑÔ 1°4Ô8Ø�‰Ô(¨$Õ/r6   N)
Ú__name__Ú
__module__Ú__qualname__Ú__doc__r5   r9   r=   rA   rD   rH   © r6   r4   r+   r+   6   s#   „ Ù/ò4ò6ò9ò:ò1ó0r6   r+   c                   ó@   — e Zd ZdZd„ Zd„ Zd„ Zd„ Zd„ Zd„ Z	d„ Z
d	„ Zy
)Ú#TransactionTypeHelperFunctionsTestsz,Tests for transaction type helper functions.c                 ó  — | j                  t        d«      d«       | j                  t        d«      d«       | j                  t        d«      d«       | j                  t        d«      d«       | j                  t        d	«      d
«       y)z-Test get_transaction_type() with valid names.úwallet-depositr-   úwallet-withdrawr.   úroi-distributionr<   úproduct-order-partial-refundr@   úsystem-adjustmentrC   N)r/   r&   r2   s    r4   Útest_get_transaction_type_validzCTransactionTypeHelperFunctionsTests.test_get_transaction_type_valid„   su   € à×ÑÔ-Ð.>Ó?ÀÔFØ×ÑÔ-Ð.?Ó@À$ÔGØ×ÑÔ-Ð.@ÓAÀ4ÔHØ×ÑÔ-Ð.LÓMÈtÔTØ×ÑÔ-Ð.AÓBÀDÕIr6   c                 ó¸   — | j                  t        «      5 }t        d«       ddd«       | j                  dt	        j
                  «      «       y# 1 sw Y   Œ/xY w)z.Test get_transaction_type() with invalid name.zinvalid-typeNzUnknown transaction type)ÚassertRaisesÚ
ValueErrorr&   ÚassertInÚstrÚ	exception©r3   Úcms     r4   Ú!test_get_transaction_type_invalidzETransactionTypeHelperFunctionsTests.test_get_transaction_type_invalidŒ   sB   € à×ÑœzÔ*¨bÜ  Ô0÷ +ð 	�‰Ð0´#°b·l±lÓ2CÕD÷ +Ð*úó   –AÁAc                 ó  — | j                  t        d«      d«       | j                  t        d«      d«       | j                  t        d«      d«       | j                  t        d«      d«       | j                  t        d	«      d
«       y)z6Test get_transaction_type_name() with valid constants.r-   rQ   r.   rR   r<   rS   r@   rT   rC   rU   N)r/   r'   r2   s    r4   Ú$test_get_transaction_type_name_validzHTransactionTypeHelperFunctionsTests.test_get_transaction_type_name_valid“   su   € à×ÑÔ2°4Ó8Ð:JÔKØ×ÑÔ2°4Ó8Ð:KÔLØ×ÑÔ2°4Ó8Ð:LÔMØ×ÑÔ2°4Ó8Ð:XÔYØ×ÑÔ2°4Ó8Ð:MÕNr6   c                 ó    — | j                  t        d«      «       | j                  t        d«      «       | j                  t        d«      «       y)z7Test get_transaction_type_name() with invalid constant.éŸ† r   éÿÿÿÿN)ÚassertIsNoner'   r2   s    r4   Ú&test_get_transaction_type_name_invalidzJTransactionTypeHelperFunctionsTests.test_get_transaction_type_name_invalid›   s>   € à×ÑÔ3°EÓ:Ô;Ø×ÑÔ3°AÓ6Ô7Ø×ÑÔ3°BÓ7Õ8r6   c                 óÀ   — t         j                  }| j                  d|«       | j                  |d   d«       | j                  d|«       | j                  |d   d«       y)z"Test TRANSACTION_TYPES dictionary.rQ   r-   rS   r<   N)r   ÚTRANSACTION_TYPESrZ   r/   )r3   ri   s     r4   Ú!test_transaction_types_dictionaryzETransactionTypeHelperFunctionsTests.test_transaction_types_dictionary¡   s\   € ä-×?Ñ?ÐØ�‰Ð&Ð(9Ô:Ø×ÑÐ*Ð+;Ñ<¸dÔCØ�‰Ð(Ð*;Ô<Ø×ÑÐ*Ð+=Ñ>ÀÕEr6   c                 óÀ   — t         j                  }| j                  d|«       | j                  |d   d«       | j                  d|«       | j                  |d   d«       y)z'Test TRANSACTION_TYPE_NAMES dictionary.r-   rQ   r<   rS   N)r   ÚTRANSACTION_TYPE_NAMESrZ   r/   ©r3   rl   s     r4   Ú&test_transaction_type_names_dictionaryzJTransactionTypeHelperFunctionsTests.test_transaction_type_names_dictionary©   sZ   € ä!2×!IÑ!IÐØ�‰�dÐ2Ô3Ø×ÑÐ/°Ñ5Ð7GÔHØ�‰�dÐ2Ô3Ø×ÑÐ/°Ñ5Ð7IÕJr6   c                 óø   — t         j                  }t         j                  }|j                  «       D ]  \  }}| j	                  ||   |«       Œ |j                  «       D ]  \  }}| j	                  ||   |«       Œ y)zFTest that TRANSACTION_TYPES and TRANSACTION_TYPE_NAMES are consistent.N)r   ri   rl   Úitemsr/   )r3   ri   rl   ÚnameÚ
trans_types        r4   Útest_dictionary_consistencyz?TransactionTypeHelperFunctionsTests.test_dictionary_consistency±   sx   € ä-×?Ñ?ÐÜ!2×!IÑ!IÐØ 1× 7Ñ 7Ö 9ÑˆD�*Ø×ÑÐ3°JÑ?ÀÕFð !:ð !7× <Ñ <Ö >ÑˆJ˜Ø×ÑÐ.¨tÑ4°jÕAñ !?r6   c                 ó  — t         j                  }t         j                  }t        t        t
        t        t        t        g}|D ]@  }| j                  ||«       ||   }| j                  ||«       | j                  ||   |«       ŒB y)z0Test that all constants are in the dictionaries.N)r   ri   rl   r   r   r   r   r   r   rZ   r/   )r3   ri   rl   Ú	constantsÚconstantrq   s         r4   Ú test_all_constants_in_dictionaryzDTransactionTypeHelperFunctionsTests.test_all_constants_in_dictionary»   s{   € ä-×?Ñ?ÐÜ!2×!IÑ!IÐäœOÔ-=Üœ}Ô.Jð
ˆ	ó
 "ˆHØ�M‰M˜(Ð$:Ô;Ø)¨(Ñ3ˆDØ�M‰M˜$Ð 1Ô2Ø×ÑÐ.¨tÑ4°hÕ?ñ	 "r6   N)rI   rJ   rK   rL   rV   r_   rb   rg   rj   rn   rs   rw   rM   r6   r4   rO   rO   �   s4   „ Ù6òJòEòOò9òFòKòBó@r6   rO   c                   ój   — e Zd ZdZd„ Zd„ Zd„ Zd„ Zd„ Zd„ Z	d„ Z
d	„ Zd
„ Zd„ Zd„ Zd„ Zd„ Zd„ Zd„ Zy)ÚCustomTransactionTypeTestsz/Tests for custom transaction type registration.c                 óŠ   — t        «       }t        |j                  «       «      D ]  }	 t        |«       Œ y# t        $ r Y Œw xY w)z+Clean up any custom types before each test.N©r%   ÚlistÚkeysr)   rY   ©r3   Úcustom_typesrq   s      r4   ÚsetUpz CustomTransactionTypeTests.setUpÎ   óE   € ô 4Ó5ˆÜ˜×*Ñ*Ó,Ö-ˆDðÜ2°4Õ8ñ .øô ò Ùðúó   ¨6¶	AÁAc                 óŠ   — t        «       }t        |j                  «       «      D ]  }	 t        |«       Œ y# t        $ r Y Œw xY w)z*Clean up any custom types after each test.Nr{   r~   s      r4   ÚtearDownz#CustomTransactionTypeTests.tearDownØ   r�   r‚   c                 ó\   — | j                  t        d«       | j                  t        d«       y)z-Test custom transaction type range constants.é'  iN  N)r/   r$   r#   r2   s    r4   Útest_custom_range_constantsz6CustomTransactionTypeTests.test_custom_range_constantsâ   s$   € à×ÑÔ<¸eÔDØ×ÑÔ:¸EÕBr6   c                 ód  — t        dd«       t        j                  }t        j                  }| j	                  d|«       | j                  |d   d«       | j	                  d|«       | j                  |d   d«       | j                  t        d«      d«       | j                  t        d«      d«       y)z+Test registering a custom transaction type.úcustom-rewardr†   N)r(   r   ri   rl   rZ   r/   r&   r'   ©r3   ri   rl   s      r4   Ú%test_register_custom_transaction_typez@CustomTransactionTypeTests.test_register_custom_transaction_typeç   sž   € ä(¨¸%Ô@ô .×?Ñ?ÐÜ!2×!IÑ!IÐØ�‰�oÐ'8Ô9Ø×ÑÐ*¨?Ñ;¸UÔCØ�‰�eÐ3Ô4Ø×ÑÐ/°Ñ6¸ÔHð 	×ÑÔ-¨oÓ>ÀÔFØ×ÑÔ2°5Ó9¸?ÕKr6   c                 óî   — t        dd«       t        dd«       t        dd«       | j                  t        d«      d«       | j                  t        d«      d«       | j                  t        d«      d«       y)z3Test registering multiple custom transaction types.r‰   r†   úcustom-penaltyé'  zaffiliate-bonusi'  N)r(   r/   r&   r2   s    r4   Ú#test_register_multiple_custom_typesz>CustomTransactionTypeTests.test_register_multiple_custom_types÷   sf   € ä(¨¸%Ô@Ü(Ð)9¸5ÔAÜ(Ð):¸EÔBà×ÑÔ-¨oÓ>ÀÔFØ×ÑÔ-Ð.>Ó?ÀÔGØ×ÑÔ-Ð.?Ó@À%ÕHr6   c                 óp  — | j                  t        «      5 }t        dd«       ddd«       | j                  dt	        j
                  «      «       | j                  t        «      5 }t        dd«       ddd«       | j                  dt	        |j
                  «      «       y# 1 sw Y   Œ~xY w# 1 sw Y   Œ;xY w)zHTest that registering a type outside the custom range raises ValueError.ÚinvalidrC   Nzmust be in rangei N  )rX   rY   r(   rZ   r[   r\   r]   s     r4   Ú&test_register_custom_type_out_of_rangezACustomTransactionTypeTests.test_register_custom_type_out_of_range  s†   € à×ÑœzÔ*¨bÜ,¨Y¸Ô=÷ +ð 	�‰Ð(¬#¨b¯l©lÓ*;Ô<à×ÑœzÔ*¨bÜ,¨Y¸Ô>÷ +ð 	�‰Ð(¬#¨b¯l©lÓ*;Õ<÷ +Ð*ú÷
 +Ð*ús   –B Á%B,Â B)Â,B5c                 óÒ   — t        dd«       | j                  t        «      5 }t        dd«       ddd«       | j                  dt	        j
                  «      «       y# 1 sw Y   Œ/xY w)z9Test that registering a duplicate name raises ValueError.r‰   r†   rŽ   Núalready exists©r(   rX   rY   rZ   r[   r\   r]   s     r4   Ú(test_register_custom_type_duplicate_namezCCustomTransactionTypeTests.test_register_custom_type_duplicate_name  sN   € ä(¨¸%Ô@à×ÑœzÔ*¨bÜ,¨_¸eÔD÷ +ð 	�‰Ð&¬¨B¯L©LÓ(9Õ:÷ +Ð*úó   ¢AÁA&c                 óÒ   — t        dd«       | j                  t        «      5 }t        dd«       ddd«       | j                  dt	        j
                  «      «       y# 1 sw Y   Œ/xY w)z:Test that registering a duplicate value raises ValueError.r‰   r†   r�   Nr”   r•   r]   s     r4   Ú)test_register_custom_type_duplicate_valuezDCustomTransactionTypeTests.test_register_custom_type_duplicate_value  sO   € ä(¨¸%Ô@à×ÑœzÔ*¨bÜ,Ð-=¸uÔE÷ +ð 	�‰Ð&¬¨B¯L©LÓ(9Õ:÷ +Ð*úr—   c                 ó²   — t        dd«       t        ddd¬«       | j                  t        d«      d«       t        j                  }| j                  d|«       y)z(Test overriding an existing custom type.r‰   r†   rŽ   T)ÚoverrideN)r(   r/   r&   r   rl   ÚassertNotInrm   s     r4   Ú"test_register_custom_type_overridez=CustomTransactionTypeTests.test_register_custom_type_override  sK   € ä(¨¸%Ô@Ü(¨¸%È$ÕOà×ÑÔ-¨oÓ>ÀÔFÜ!2×!IÑ!IÐØ×Ñ˜Ð 6Õ7r6   c                 ó2  — t        dd«       t        j                  }| j                  d|«       t	        d«       t        j                  }t        j
                  }| j                  d|«       | j                  d|«       | j                  t        d«      «       y)z-Test unregistering a custom transaction type.r‰   r†   N)	r(   r   ri   rZ   r)   rl   rœ   rf   r'   rŠ   s      r4   Ú'test_unregister_custom_transaction_typezBCustomTransactionTypeTests.test_unregister_custom_transaction_type(  sƒ   € ä(¨¸%Ô@ô .×?Ñ?ÐØ�‰�oÐ'8Ô9ô 	+¨?Ô;ô .×?Ñ?ÐÜ!2×!IÑ!IÐØ×Ñ˜Ð*;Ô<Ø×Ñ˜Ð 6Ô7Ø×ÑÔ3°EÓ:Õ;r6   c                 ó¸   — | j                  t        «      5 }t        d«       ddd«       | j                  dt	        j
                  «      «       y# 1 sw Y   Œ/xY w)z:Test that unregistering a built-in type raises ValueError.rQ   NzCannot unregister built-in©rX   rY   r)   rZ   r[   r\   r]   s     r4   Ú)test_unregister_builtin_type_raises_errorzDCustomTransactionTypeTests.test_unregister_builtin_type_raises_error:  sC   € à×ÑœzÔ*¨bÜ.Ð/?Ô@÷ +ð 	�‰Ð2´C¸¿¹Ó4EÕF÷ +Ð*úr`   c                 ó¸   — | j                  t        «      5 }t        d«       ddd«       | j                  dt	        j
                  «      «       y# 1 sw Y   Œ/xY w)z>Test that unregistering a non-existent type raises ValueError.znonexistent-typeNzis not registeredr¡   r]   s     r4   Ú-test_unregister_nonexistent_type_raises_errorzHCustomTransactionTypeTests.test_unregister_nonexistent_type_raises_errorA  sC   € à×ÑœzÔ*¨bÜ.Ð/AÔB÷ +ð 	�‰Ð)¬3¨r¯|©|Ó+<Õ=÷ +Ð*úr`   c                 ó¢  — t        «       }| j                  t        |«      d«       t        dd«       t        dd«       t        «       }| j                  t        |«      d«       | j	                  d|«       | j	                  d|«       | j                  |d   d«       | j                  |d   d«       d|d<   | j                  dt        «       «       y	)
z*Test getting all custom transaction types.r   r‰   r†   r�   rŽ   é   rd   ÚtestN)r%   r/   Úlenr(   rZ   rœ   )r3   r   s     r4   Ú!test_get_custom_transaction_typesz<CustomTransactionTypeTests.test_get_custom_transaction_typesH  s¿   € ô 4Ó5ˆØ×Ñœ˜\Ó*¨AÔ.ô 	)¨¸%Ô@Ü(Ð)9¸5ÔAô 4Ó5ˆØ×Ñœ˜\Ó*¨AÔ.Ø�‰�o |Ô4Ø�‰Ð&¨Ô5Ø×Ñ˜ oÑ6¸Ô>Ø×Ñ˜Ð&6Ñ7¸Ô?ð  %ˆ�VÑØ×Ñ˜Ô!=Ó!?Õ@r6   c                 ó&  — t        dd«       | j                  t        d«      d«       | j                  t        d«      d«       | j	                  t
        «      5  t        d«       ddd«       | j                  t        d«      «       y# 1 sw Y   Œ$xY w)z2Test that custom types work with helper functions.r‰   r†   znonexistent-customNrd   )r(   r/   r&   r'   rX   rY   rf   r2   s    r4   Ú,test_custom_types_work_with_helper_functionszGCustomTransactionTypeTests.test_custom_types_work_with_helper_functions^  sy   € ä(¨¸%Ô@ð 	×ÑÔ-¨oÓ>ÀÔFð 	×ÑÔ2°5Ó9¸?ÔKð ×ÑœzÕ*Ü Ð!5Ô6÷ +ð 	×ÑÔ3°EÓ:Õ;÷	 +Ð*ús   ÁBÂBc                 ó¦   — t        d«      }t        dd«       | j                  t        d«      |«       | j                  t        d«      t        «       y)zDTest that built-in types remain unchanged after custom registration.rQ   r‰   r†   N)r&   r(   r/   r   )r3   Úoriginal_wallet_deposits     r4   Ú6test_builtin_types_unchanged_after_custom_registrationzQCustomTransactionTypeTests.test_builtin_types_unchanged_after_custom_registrationo  sI   € ä"6Ð7GÓ"HÐä(¨¸%Ô@ð 	×ÑÔ-Ð.>Ó?ÐAXÔYØ×ÑÔ-Ð.>Ó?ÄÕPr6   N)rI   rJ   rK   rL   r€   r„   r‡   r‹   r�   r’   r–   r™   r�   rŸ   r¢   r¤   r©   r«   r®   rM   r6   r4   ry   ry   Ë   sV   „ Ù9òòòCò
Lò Iò
=ò;ò;ò8ò<ò$Gò>òAò,<ó"Qr6   ry   N).rL   Údjango.testr   Úwallet_utilsr   Úwallet_utils.transaction_typesr   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(   r)   r+   rO   ry   rM   r6   r4   Ú<module>r²      su   ðñõ !å *÷,÷ ,÷ ,÷ ,÷ ,÷ ,÷ ,÷ ,÷ ,õ ,ô^H0 Hô H0ôVG@¨(ô G@ôTlQ õ lQr6   