o
    Šåg‹Y  ã                   @   sú  d dl Z ddlmZ ddlmZ ddlmZ ddlmZ ddlmZ dd	lmZ dd
lmZ ddlm	Z	 ddlm
Z
 ddlmZ ddlmZ ddlmZ ddlmZ ddlmZ ddlmZ ddlmZ ddlmZ ddlmZ ddlmZ ddlmZ ddlmZ ddlmZ ddlmZ ddlmZ ddlmZ ddlm Z  G dd „ d ej!ƒZ"G d!d"„ d"ej!ƒZ#G d#d$„ d$ej$ƒZ%G d%d&„ d&ej!ƒZ&G d'd(„ d(ej$ƒZ'G d)d*„ d*ej!ƒZ(G d+d,„ d,ej!ƒZ)G d-d.„ d.ej*e)ƒZ+G d/d0„ d0ej!ƒZ,G d1d2„ d2ej$ƒZ-dS )3é    Né   )Útestingé   )Úassert_raises)Úconfig)Úengines)Úeq_)Úfixtures)Úis_not_none)Úis_true)Úne_)Úprovide_metadata)Úexpect_raises)Úexpect_raises_message)Úrequirements)Ú set_default_schema_on_connection)ÚColumn)ÚTableé   )Ú	bindparam)Údialects)Úevent)Úexc)ÚInteger)Úliteral_column)Úselect)ÚString)ÚCompiled)Úinspect_getfullargspecc                   @   s   e Zd ZdZdd„ ZdS )ÚPingTestTc                 C   sF   t j ¡ �}tt jj |jj¡ƒ W d   ƒ d S 1 sw   Y  d S ©N)r   ÚdbÚconnectr   ÚdialectÚdo_pingÚ
connectionÚdbapi_connection)ÚselfÚconn© r)   úa/var/www/html/flaskapp/venv/lib/python3.10/site-packages/sqlalchemy/testing/suite/test_dialect.pyÚtest_do_ping+   s
   ÿ"ÿzPingTest.test_do_pingN)Ú__name__Ú
__module__Ú__qualname__Ú__backend__r+   r)   r)   r)   r*   r   (   s    r   c                   @   s:   e Zd ZdZdd„ Zejeeƒ ƒd�dd„ ƒZdd„ Z	d	S )
ÚArgSignatureTestaË  test that all visit_XYZ() in :class:`_sql.Compiler` subclasses have
    ``**kw``, for #8988.

    This test uses runtime code inspection.   Does not need to be a
    ``__backend__`` test as it only needs to run once provided all target
    dialects have been imported.

    For third party dialects, the suite would be run with that third
    party as a "--dburi", which means its compiler classes will have been
    imported by the time this test runs.

    c                  c   sZ   � t jD ]} |  d¡st d|  ¡ qtg}|r+| d¡}| | ¡ ¡ |V  |sd S d S )NÚ_zsqlalchemy.dialects.%sr   )	r   Ú__all__Ú
startswithÚ	importlibÚimport_moduler   ÚpopÚextendÚ__subclasses__)ÚdÚstackÚclsr)   r)   r*   Ú_all_subclasses@   s   €

€
ýz ArgSignatureTest._all_subclasses)Úparamsc                 c   s   � |j V  d S r    )Úparam)r'   Úrequestr)   r)   r*   Úall_subclassesL   s   €zArgSignatureTest.all_subclassesc                 C   sL   |}|j D ]}| d¡r#t||ƒ}t|ƒ}t|jd|j› d|› d�ƒ qd S )NÚvisit_zCompiler visit method Ú.z:() does not accommodate for **kw in its argument signature)Ú__dict__r3   Úgetattrr   r
   Úvarkwr,   )r'   r@   r;   ÚkÚmethÚinspr)   r)   r*   Ú test_all_visit_methods_accept_kwP   s   


þ€ûz1ArgSignatureTest.test_all_visit_methods_accept_kwN)
r,   r-   r.   Ú__doc__r<   r   ÚfixtureÚlistr@   rI   r)   r)   r)   r*   r0   2   s    
r0   c                   @   s:   e Zd ZdZdZdZedd„ ƒZej	dd„ ƒZ
dd	„ Zd
S )ÚExceptionTestz¶Test basic exception wrapping.

    DBAPIs vary a lot in exception behavior so to actually anticipate
    specific exceptions from real round trips, we need to be conservative.

    ÚeachTc              	   C   ó(   t d|tdtddd�tdtdƒƒƒ d S )NÚ	manual_pkÚidTF©Úprimary_keyÚautoincrementÚdataé2   ©r   r   r   r   ©r;   Úmetadatar)   r)   r*   Údefine_tablesk   ó   üzExceptionTest.define_tablesc                 C   sz   t j ¡ �.}| ¡ }| | jj ¡ dddœ¡ tt	j
|j| jj ¡ dddœƒ | ¡  W d   ƒ d S 1 s6w   Y  d S )Nr   Úd1©rQ   rU   )r   r!   r"   ÚbeginÚexecuteÚtablesrP   Úinsertr   r   ÚIntegrityErrorÚrollback)r'   r(   Útransr)   r)   r*   Útest_integrity_errort   s   ÿ
ü
"óz"ExceptionTest.test_integrity_errorc                 C   sš   t j ¡ �>}z| ttdƒƒ¡ J ‚ tjy3 } zt|ƒ}t|j	ƒt|ƒv s)J ‚W Y d }~nd }~ww t
|tƒs;J ‚W d   ƒ d S 1 sFw   Y  d S )Nu   mÃ©il)r   r!   r"   r_   r   r   r   Ú
DBAPIErrorÚstrÚorigÚ
isinstance)r'   r(   ÚerrÚerr_strr)   r)   r*   Útest_exception_with_non_ascii…   s   "€ý"òz+ExceptionTest.test_exception_with_non_asciiN)r,   r-   r.   rJ   Úrun_deletesr/   ÚclassmethodrZ   r   Ú$duplicate_key_raises_integrity_errorre   rl   r)   r)   r)   r*   rM   _   s    

rM   c                   @   sl   e Zd ZdZdZdd„ Zdd„ Zdd„ Zd	d
„ Ze	j
jdd„ ƒZe	j
je	j
jdd„ ƒƒZe	j
jdd„ ƒZdS )ÚIsolationLevelTestT©Úisolation_levelc                 C   sF   t  t¡}|d }|d }t|ƒ d|g¡}|r| ¡ S t d¡ d S )NÚdefaultÚ	supportedÚ
AUTOCOMMITz(no non-default isolation level available)r   Úget_isolation_levelsr   ÚsetÚ
differencer6   Ú	skip_test)r'   Úlevelsrs   rt   Úsr)   r)   r*   Ú _get_non_default_isolation_levelœ   s   
z3IsolationLevelTest._get_non_default_isolation_levelc                 C   s   t tjjjt t¡d ƒ d S )Nrs   )r   r   r!   r#   Údefault_isolation_levelr   rv   )r'   r)   r)   r*   Útest_default_isolation_level¨   s   þz/IsolationLevelTest.test_default_isolation_levelc                 C   s‚   |   ¡ }tj ¡ �.}| ¡ }t||ƒ |j|d� t| ¡ |ƒ |j 	|j
j¡ t| ¡ |ƒ W d   ƒ d S 1 s:w   Y  d S )Nrq   )r|   r   r!   r"   Úget_isolation_levelr   Úexecution_optionsr   r#   Úreset_isolation_levelr%   r&   )r'   Únon_defaultr(   Úexistingr)   r)   r*   Ú test_non_default_isolation_level®   s   
ÿ"óz3IsolationLevelTest.test_non_default_isolation_levelc              	   C   sÊ   t  t¡}|d }t|ƒ dg¡D ]Q}tj ¡ �$}|j|d� t| 	¡ |ƒ | 
¡ }| ¡  t| 	¡ |ƒ W d   ƒ n1 s?w   Y  tj ¡ �}t| 	¡ |d ƒ W d   ƒ n1 s]w   Y  qd S )Nrt   ru   rq   rs   )r   rv   r   rw   rx   r!   r"   r€   r   r   r^   rc   )r'   rz   Ú
all_levelsÚlevelr(   rd   r)   r)   r*   Útest_all_levelsÀ   s$   
ø
þÿ€õz"IsolationLevelTest.test_all_levelsc              
   C   s`   |}t tjdd|jjd t t¡d ¡f ƒ� |j	dd� W d  ƒ dS 1 s)w   Y  dS )z4test for the new get_isolation_level_values() methodúNInvalid value '%s' for isolation_level. Valid isolation levels for '%s' are %sÚFOOú, rt   rq   N)
r   r   ÚArgumentErrorr#   ÚnameÚjoinr   rv   r   r€   )r'   Úconnection_no_transr%   r)   r)   r*   Ú#test_invalid_level_execution_optionÖ   s   ÿýþþ"ôz6IsolationLevelTest.test_invalid_level_execution_optionc              
   C   sh   |t dd�d�}ttjdd|jjd t t	¡d ¡f ƒ� | 
¡  W d  ƒ dS 1 s-w   Y  dS )z…test for the new get_isolation_level_values() method
        and support for the dialect-level 'isolation_level' parameter.

        r‰   rq   ©Úoptionsrˆ   rŠ   rt   N)Údictr   r   r‹   r#   rŒ   r�   r   rv   r   r"   )r'   Útesting_engineÚengr)   r)   r*   Útest_invalid_level_engine_paramé   s   ÿýþþ
"ôz2IsolationLevelTest.test_invalid_level_engine_paramc                 C   sò   t  t¡}|d }tt|d ƒ |dg¡ƒd }|d|id�}| ¡ �}t| ¡ |ƒ W d   ƒ n1 s5w   Y  | ¡ �}|j	|d� t| ¡ |ƒ W d   ƒ n1 sVw   Y  | ¡ �}t| ¡ |ƒ W d   ƒ d S 1 srw   Y  d S )Nrs   rt   ru   r   rr   r�   rq   )
r   rv   r   Úsortedrw   rx   r"   r   r   r€   )r'   r“   rz   rs   rt   Úer(   r)   r)   r*   Ú%test_dialect_user_setting_is_restored   s$   
ÿü
ÿ
þ
"ÿz8IsolationLevelTest.test_dialect_user_setting_is_restoredN)r,   r-   r.   r/   Ú__requires__r|   r~   r„   r‡   r   ÚrequiresÚget_isolation_level_valuesr�   Ú#dialect_level_isolation_level_paramr•   Ú independent_readonly_connectionsr˜   r)   r)   r)   r*   rp   —   s    
rp   c                   @   sd   e Zd ZdZdZdZedd„ ƒZdd„ Zdd	„ Z	d
d„ Z
dd„ Zejje dddg¡dd„ ƒƒZdS )ÚAutocommitIsolationTestrN   )Ú
autocommitTc              	   C   s,   t d|tdtddd�tdtdƒƒdd� d S )	NÚ
some_tablerQ   TFrR   rU   rV   )Útest_needs_acidrW   rX   r)   r)   r*   rZ     s   
ûz%AutocommitIsolationTest.define_tablesc                 C   s–   |  ¡ }| | jj ¡ dddœ¡ | ¡  t| t| jjj	j
ƒ¡|r$dnd ƒ | ¡  |  ¡ � | | jj ¡ ¡ W d   ƒ d S 1 sDw   Y  d S )Nr   z	some datar]   )r^   r_   r`   r    ra   rc   r   Úscalarr   ÚcrQ   Údelete)r'   r(   rŸ   rd   r)   r)   r*   Ú_test_conn_autocommits(  s   ÿ
þ
"ÿz.AutocommitIsolationTest._test_conn_autocommitsc                 C   s<   |}|j dd�}|  |d¡ |j |jj¡ |  |d¡ d S )Nru   rq   TF)r€   r¥   r#   r�   r%   r&   )r'   rŽ   r(   Úc2r)   r)   r*   Útest_autocommit_on8  s
   z*AutocommitIsolationTest.test_autocommit_onc                 C   s   |}|   |d¡ d S )NF)r¥   ©r'   rŽ   r(   r)   r)   r*   Útest_autocommit_offA  s   z+AutocommitIsolationTest.test_autocommit_offc                 C   sB   |}|j dd�}|  |d¡ |j t t¡d d� |  |d¡ d S )Nru   rq   Trs   F)r€   r¥   r   rv   r   r¨   r)   r)   r*   Ú.test_turn_autocommit_off_via_default_iso_levelE  s   ÿÿzFAutocommitIsolationTest.test_turn_autocommit_off_via_default_iso_levelÚuse_dialect_settingFc                 C   sâ   |r
|ddid�}n|ƒ j dd�}t t¡}|d }| ¡ �}|  |d¡ W d  ƒ n1 s/w   Y  | ¡ �}|j |d� |  |d¡ W d  ƒ n1 sOw   Y  | ¡ �}|  |d¡ W d  ƒ dS 1 sjw   Y  dS )	ztest #10147rr   ru   r�   rq   rs   TNF)r€   r   rv   r   r"   r¥   )r'   r“   r«   r—   rz   rs   r(   r)   r)   r*   Ú#test_dialect_autocommit_is_restoredS  s"   ÿ

ÿ
þ
"ÿz;AutocommitIsolationTest.test_dialect_autocommit_is_restoredN)r,   r-   r.   rm   r™   r/   rn   rZ   r¥   r§   r©   rª   r   rš   r�   Ú	variationr¬   r)   r)   r)   r*   rž     s    
		rž   c                   @   s   e Zd Zedd„ ƒZdS )ÚEscapingTestc              	   C   sØ   | j }td|tdtdƒƒƒ}| tj¡ tj ¡ �I}| | 	¡ t
dd�¡ | | 	¡ t
dd�¡ t| t|jjƒ |jjtdƒk¡¡dƒ t| t|jjƒ |jjtdƒk¡¡dƒ W d	  ƒ d	S 1 sew   Y  d	S )
z|test that the DBAPI accommodates for escaped / nonescaped
        percent signs in a way that matches the compiler

        ÚtrU   rV   zsome % value)rU   zsome %% other valuez'some % value'z'some %% other value'N)rY   r   r   r   Úcreater   r!   r^   r_   ra   r’   r   r¢   r   r£   rU   Úwherer   )r'   Úmr¯   r(   r)   r)   r*   Útest_percent_sign_round_tripq  s.   ÿÿú	ÿÿú"óz)EscapingTest.test_percent_sign_round_tripN)r,   r-   r.   r   r³   r)   r)   r)   r*   r®   p  s    r®   c                   @   s4   e Zd ZdZdZdd„ Zdd„ Zdd„ Zd	d
„ ZdS )Ú WeCanSetDefaultSchemaWEventsTestT)Údefault_schema_name_switchc                 C   sL   t jjj}t ¡ }| ¡ � W d   ƒ n1 sw   Y  t|jj|ƒ d S r    )r   r!   r#   Údefault_schema_namer   r“   r"   r   )r'   r¶   r”   r)   r)   r*   Útest_control_case–  s   

ÿz2WeCanSetDefaultSchemaWEventsTest.test_control_casec                 C   sx   t jjj}t ¡ }t |d¡dd„ ƒ}| ¡ �}|j 	|¡}t
|t jƒ W d   ƒ n1 s.w   Y  t
|jj|ƒ d S )Nr"   c                 S   ó   t t| tjƒ d S r    ©r   r   Útest_schema©r&   Úconnection_recordr)   r)   r*   Ú
on_connect¤  ó   ÿzMWeCanSetDefaultSchemaWEventsTest.test_wont_work_wo_insert.<locals>.on_connect)r   r!   r#   r¶   r   r“   r   Úlistens_forr"   Ú_get_default_schema_namer   rº   )r'   r¶   r”   r½   r(   Úwhat_it_should_ber)   r)   r*   Útest_wont_work_wo_insertŸ  s   



þz9WeCanSetDefaultSchemaWEventsTest.test_wont_work_wo_insertc                 C   st   t  ¡ }tj|ddd�dd„ ƒ}| ¡ �}|j |¡}t|tj	ƒ W d   ƒ n1 s+w   Y  t|jj
tj	ƒ d S )Nr"   T©ra   c                 S   r¸   r    r¹   r»   r)   r)   r*   r½   ³  r¾   zRWeCanSetDefaultSchemaWEventsTest.test_schema_change_on_connect.<locals>.on_connect)r   r“   r   r¿   r"   r#   rÀ   r   r   rº   r¶   )r'   r”   r½   r(   rÁ   r)   r)   r*   Útest_schema_change_on_connect°  s   

þz>WeCanSetDefaultSchemaWEventsTest.test_schema_change_on_connectc                 C   sœ   t  ¡ }tj|ddd�dd„ ƒ}| ¡ �(}| ¡ }|j |¡}t|t	j
ƒ | ¡  |j |¡}t|t	j
ƒ W d   ƒ n1 s?w   Y  t|jjt	j
ƒ d S )Nr"   TrÃ   c                 W   r¸   r    r¹   )r&   Úargr)   r)   r*   r½   Â  r¾   z\WeCanSetDefaultSchemaWEventsTest.test_schema_change_works_w_transactions.<locals>.on_connect)r   r“   r   r¿   r"   r^   r#   rÀ   r   r   rº   rc   r¶   )r'   r”   r½   r(   rd   rÁ   r)   r)   r*   Ú'test_schema_change_works_w_transactions¿  s   

ù	zHWeCanSetDefaultSchemaWEventsTest.test_schema_change_works_w_transactionsN)	r,   r-   r.   r/   r™   r·   rÂ   rÄ   rÆ   r)   r)   r)   r*   r´   ‘  s    	r´   c                   @   s   e Zd ZdS )Ú&FutureWeCanSetDefaultSchemaWEventsTestN)r,   r-   r.   r)   r)   r)   r*   rÇ   Ô  s    rÇ   c                   @   s€   e Zd ZdZejdddddddd	d
dddddddddddddd�Zeejj	dd„ ƒƒZ
ejdd„ ƒZedd„ ƒZedd „ ƒZd!S )"ÚDifficultParametersTestT)Úboring)zper cent)z
per % cent)z%percent)zpar(ens))zpercent%(ens)yah)zcol:ons)Ú_starts_with_underscore)zdot.s)zmore :: %colons%)Ú_name)Ú___name)z[BracketsAndCase])Ú	42numbers)zpercent%signs)z
has spaces)z	/slashes/)zmore/slashes)zq?marks)Ú1param)z1col:onÚ	paramname)Úargnamesc              	   C   sú   |}t d|tdtdd�t|tdƒdd�ƒ}| |¡ | | ¡  dd|d	i¡¡ t|j	| ƒ 
|j	| d	k¡}t| |¡d	ƒ t|j	| ƒ 
|j	| t|ƒk¡}| ||d	i¡ ¡ }t|j| d	ƒ t|j	| ƒ 
|j	|  d	d
g¡¡}| |¡ ¡ }d S )Nr¯   rQ   T)rS   rV   F)Únullabler   z	some namezsome other_name)r   r   r   r   r°   r_   ra   Úvaluesr   r£   r±   r   r¢   r   ÚfirstÚ_mappingÚin_)r'   rÏ   r%   rY   rŒ   r¯   ÚstmtÚrowr)   r)   r*   Ú!test_round_trip_same_named_columnö  s$   ü
"ÿz9DifficultParametersTest.test_round_trip_same_named_columnc              
   c   sx   � t d|tdtƒtdtdƒƒtdtdƒƒƒ}| |¡ | | ¡ dddd	œd
ddd	œdddd	œdddd	œg¡ |V  d S )NÚmytableÚmyidrŒ   rV   Údescr   ÚaÚa_desc)rÚ   rŒ   rÛ   r   ÚbÚb_descr   r£   Úc_descé   r9   Úd_desc)r   r   r   r   r°   r_   ra   )r'   rY   r%   rÙ   r)   r)   r*   Úmultirow_fixture  s$   €û




üþ
	z(DifficultParametersTest.multirow_fixturec                 C   sD   |}t |jjƒ |jjt|dd�k¡}| ||di¡}t|dƒ d S )NÚx©Úvaluer£   r   )r   r£   rÚ   r±   rŒ   r   r¢   r   ©r'   rÏ   r%   rã   Útbl1rÖ   Úresr)   r)   r*   Ú test_standalone_bindparam_escape5  s   ÿz8DifficultParametersTest.test_standalone_bindparam_escapec                 C   s`   |}t |jjƒ |jj t|ddgd�¡¡ |jj¡}| ||ddgi¡ 	¡ }t
|ddgƒ d S )NrÜ   rÞ   rå   r9   r   rá   )r   r£   rÚ   r±   rŒ   rÕ   r   Úorder_byÚscalarsÚallr   rç   r)   r)   r*   Ú*test_standalone_bindparam_escape_expanding@  s   

ýzBDifficultParametersTest.test_standalone_bindparam_escape_expandingN)r,   r-   r.   r/   r   ÚcombinationsÚtough_parametersr   r   Úunusual_column_name_charactersrØ   rK   rã   rê   rî   r)   r)   r)   r*   rÈ   Ú  sF    ê&


rÈ   c                   @   s^   e Zd ZdZdZedd„ ƒZejdd„ ƒZ	dd„ Z
d	d
„ Zdd„ Zdd„ Zdd„ Zdd„ ZdS )ÚReturningGuardsTestz=test that the various 'returning' flags are set appropriatelyTc              	   C   rO   )Nr¯   rQ   TFrR   rU   rV   rW   rX   r)   r)   r*   rZ   T  r[   z!ReturningGuardsTest.define_tablesc                    s   | j j‰‡ ‡fdd„}|S )Nc              
      s8  |   ˆjj¡} |rd|sDttjdˆ jj› dˆ jj› d�ƒ� ˆ  	| |dddi|dddi|d	dd
ig¡}W d   ƒ d S 1 s=w   Y  d S ˆ  	| |dddi|dddi|d	dd
ig¡}t
| ¡ g d¢ƒ d S |sˆttjƒ� ˆ  	| |dddi¡ W d   ƒ d S 1 s�w   Y  d S ˆ  	| |dddi¡}t
| ¡ dgƒ d S )NzDialect z\+zW with current server capabilities does not support .*RETURNING when executemany is usedr   rU   r\   r   Úd2r   Úd3)©r   )r   )r   rõ   )Ú	returningr£   rQ   r   r   ÚStatementErrorr#   rŒ   Údriverr_   r   rí   r   rf   )rÖ   ÚexecutemanyÚid_param_nameÚexpect_successÚresult©r%   r¯   r)   r*   Úgoa  sF   ÿþ


ýþ"ù


ýþÿ"ÿÿz(ReturningGuardsTest.run_stmt.<locals>.go)r`   r¯   )r'   r%   rþ   r)   rý   r*   Úrun_stmt]  s   /zReturningGuardsTest.run_stmtc                 C   ó&   | j j}| ¡ }||dd|jjƒ d S )NFrQ   )r`   r¯   ra   r#   Úinsert_returning©r'   r%   rÿ   r¯   rÖ   r)   r)   r*   Útest_insert_single’  s   z&ReturningGuardsTest.test_insert_singlec                 C   r   )NTrQ   )r`   r¯   ra   r#   Úinsert_executemany_returningr  r)   r)   r*   Útest_insert_many™  s
   ÿz$ReturningGuardsTest.test_insert_manyc                 C   ó`   | j j}| | ¡ dddœdddœdddœg¡ | ¡  |jjtdƒk¡}||d	d|j	j
ƒ d S ©
Nr   r\   r]   r   ró   r   rô   Úb_idF)r`   r¯   r_   ra   Úupdater±   r£   rQ   r   r#   Úupdate_returningr  r)   r)   r*   Útest_update_single¢  ó   ýþ	z&ReturningGuardsTest.test_update_singlec                 C   r  ©
Nr   r\   r]   r   ró   r   rô   r  T)r`   r¯   r_   ra   r	  r±   r£   rQ   r   r#   Úupdate_executemany_returningr  r)   r)   r*   Útest_update_many²  ó   ýþ	ÿz$ReturningGuardsTest.test_update_manyc                 C   r  r  )r`   r¯   r_   ra   r¤   r±   r£   rQ   r   r#   Údelete_returningr  r)   r)   r*   Útest_delete_singleÄ  r  z&ReturningGuardsTest.test_delete_singlec                 C   r  r  )r`   r¯   r_   ra   r¤   r±   r£   rQ   r   r#   Údelete_executemany_returningr  r)   r)   r*   Útest_delete_manyÔ  r  z$ReturningGuardsTest.test_delete_manyN)r,   r-   r.   rJ   r/   rn   rZ   r   rK   rÿ   r  r  r  r  r  r  r)   r)   r)   r*   rò   O  s    

4	rò   ).r4   Ú r   r   r   r   r   r	   r
   r   r   r   Ú
assertionsr   r   r   Ú	provisionr   Úschemar   r   r   r   r   r   r   r   r   r   Úsql.compilerr   Úutilr   ÚTestBaser   r0   Ú
TablesTestrM   rp   rž   r®   r´   ÚFutureEngineMixinrÇ   rÈ   rò   r)   r)   r)   r*   Ú<module>   sP   	
-8 Y!
Cÿu