U
    ªÊ¹jðd  ã                   @  sh  d dl mZ d dlZd dlZd dlZd dlZd dlZd dlZd dlZd dl	Z
d dlZd dlmZ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 d dlZd dlmZ e e¡Z d dl!Z!G dd„ deƒZ"G d	d
„ d
ej#ƒZ$G dd„ dƒZ%G dd„ deƒZ&ej'G dd„ dƒƒZ(edƒZ)ej'G dd„ dƒƒZ*ej'G dd„ de*ƒƒZ+G dd„ deee) ƒZ,G dd„ dƒZ-G dd„ dƒZ.G dd„ de,e. ƒZ/G dd„ dƒZ0G d d!„ d!e,e0 ƒZ1G d"d#„ d#ƒZ2G d$d%„ d%e,e- ƒZ3e 4¡ Z5G d&d'„ d'ƒZ6G d(d)„ d)ƒZ7ed'd*œd+d,„ƒZ8ed)d*œd-d.„ƒZ9ej'd/d0�G d1d2„ d2ƒƒZ:ej'd/d0�G d3d4„ d4e:ƒƒZ;d9d5d6œd7d8„Z<dS ):é    )ÚannotationsN)ÚABCÚabstractmethod)Úcontextmanager)
ÚAnyÚCallableÚDictÚGenericÚListÚ
NamedTupleÚOptionalÚSetÚTupleÚTypeVar)ÚCapturedTracebackc                   @  s&   e Zd ZU ded< ded< dd„ ZdS )Ú	CompileIdÚintÚframe_idÚframe_compile_idc                 C  s   | j › d| j› �S )Nú/)r   r   ©Úself© r   úL/var/www/html/bwave/python/venv/lib/python3.8/site-packages/torch/_guards.pyÚ__str__4   s    zCompileId.__str__N)Ú__name__Ú
__module__Ú__qualname__Ú__annotations__r   r   r   r   r   r   +   s   
r   c                   @  s\   e Zd ZdZdZdZdZdZdZdZ	dZ
d	Zd
d„ Zddœdd„Zddœdd„Zdd„ ZdS )ÚGuardSourcer   é   é   é   é   é   é   é   é   c                 C  sH   | t jt jt jt jt jfkr |S | t jt jt jfkr8|S t	t
| ƒƒ‚d S ©N)r   ÚLOCALÚLOCAL_NN_MODULEÚLOCAL_FSDP_MODULEÚ	SHAPE_ENVÚRANDOM_VALUEÚGLOBALÚGLOBAL_NN_MODULEÚGLOBAL_FSDP_MODULEÚNotImplementedErrorÚstr)r   Zlocals_Úglobals_r   r   r   ÚselectC   s    ûýzGuardSource.selectÚbool©Úreturnc                 C  s   | t jt jfkS r(   )r   r0   r+   r   r   r   r   Úis_fsdp_moduleZ   s    zGuardSource.is_fsdp_modulec                 C  s   | t jt jfkp|  ¡ S r(   )r   r/   r*   r8   r   r   r   r   Úis_nn_module]   s    þÿúzGuardSource.is_nn_modulec                 C  s   | t jt jt jfkS r(   )r   r)   r*   r+   r   r   r   r   Úis_localg   s
    ýzGuardSource.is_localN)r   r   r   r)   r.   r*   r/   ÚCONSTANTr-   r,   r+   r0   r4   r8   r9   r:   r   r   r   r   r   8   s   
r   c                   @  s   e Zd ZdS )ÚGuardBuilderBaseN©r   r   r   r   r   r   r   r<   }   s   r<   c                   @  s   e Zd ZU ded< ded< dS )Ú
ShapeGuardz
sympy.ExprÚexprr   ÚstackN©r   r   r   r   r   r   r   r   r>   �   s   
r>   c                   @  sò   e Zd ZU ded< ded< dZded< dZd	ed
< dZd	ed< dZded< dZded< dZ	dZ
dd„ Zdd„ Zdd„ Zdd„ Zeddœdd„ƒZeddœdd„ƒZedd „ ƒZd!d"„ Zd#d$„ Zd%d%d&œd'd(„Zd)d*„ Zd+d,„ Zd-d.„ Zd/d0„ ZdS )1ÚGuardÚSourceÚoriginating_sourcez)Callable[[GuardBuilderBase, Guard], None]Ú	create_fnFr5   Úis_volatileNzOptional[List[str]]Úguard_typesÚ	code_listzOptional[object]Úobj_weakrefzOptional[type]Úguarded_class_weakrefc                 C  s   t | j| jt| jƒfƒS r(   )ÚhashÚnameÚsourceÚidrE   r   r   r   r   Ú__hash__¦   s    zGuard.__hash__c                 C  s*   | j r| j jndt| jƒ| j|  ¡ jjfS )Néÿÿÿÿ)rM   ÚvalueÚlenrL   Úinner_create_fnÚ__code__Úco_firstlinenor   r   r   r   Úsort_key©   s
    
üzGuard.sort_keyc                 C  s   |   ¡ |  ¡ k S r(   )rV   ©r   Úotherr   r   r   Ú__lt__±   s    zGuard.__lt__c                 C  s    t | jtjƒr| jjS | jS d S r(   )Ú
isinstancerE   Ú	functoolsÚpartialÚfuncr   r   r   r   rS   ´   s    zGuard.inner_create_fnr2   r6   c                 C  s
   | j  ¡ S r(   )rD   rL   r   r   r   r   rL   º   s    z
Guard.namer   c                 C  s
   | j  ¡ S r(   )rD   Úguard_sourcer   r   r   r   rM   ¾   s    zGuard.sourcec                 C  sh   t | tjƒr\| ƒ }|dk	rFdtt| ƒƒ› d|jj› dtt|ƒƒ› d�S dtt| ƒƒ› d�S nt| ƒS dS )aÔ  
        This is a workaround of a Python weakref bug.

        `obj_weakref` is instance returned by `weakref.ref`,
        `str(obj_weakref)` is buggy if the original obj overrides __getattr__, e.g:

            class MyConfig(dict):
                def __getattr__(self, x):
                    return self[x]

            obj = MyConfig(offset=5)
            obj_weakref = weakref.ref(obj)
            str(obj_weakref)  # raise error: KeyError: '__name__'
        Nz<weakref at z; to 'z' at ú>z; dead>)rZ   ÚweakrefÚReferenceTypeÚhexrN   Ú	__class__r   r2   )rI   Úobjr   r   r   Úweakref_to_strÂ   s    ,zGuard.weakref_to_strc                 C  s`   d| j r| j j ¡ nd› dt| jƒ› d|  ¡ j› d| j› d| j› d|  | j	¡› d| j
› d�}|S )	Nz	
        Ú ú z&
        {
            'guard_types': z,
            'code': z,
            'obj_weakref': z
            'guarded_class': z
        }
        )rM   rL   ÚlowerÚreprrS   r   rG   rH   re   rI   rJ   )r   Úsr   r   r   Ú__repr__Û   s     ÿÿÿýü
ûú	zGuard.__repr__c                 C  s    dt | jƒ› d�}| jr$| jj ¡ nd}|d|› d�7 }|d|  ¡ j› d�7 }|d| j› d�7 }|d| j› d�7 }|d|  | j	¡› d�7 }|d	| j
› d�7 }|S )
NzName: Ú
rf   z    Source: z    Create Function: z    Guard Types: z    Code List: z    Object Weakref: z    Guarded Class Weakref: )ri   rL   rM   rh   rS   r   rG   rH   re   rI   rJ   )r   ÚoutputrM   r   r   r   r   ç   s    zGuard.__str__r<   )Úlocal_builderÚglobal_builderc                 C  s   |   | j ||¡| ¡S r(   )rE   rM   r4   )r   rn   ro   r   r   r   Úcreateò   s    zGuard.createc                 C  s
   | j  ¡ S r(   )rM   r9   r   r   r   r   r9   õ   s    zGuard.is_nn_modulec                 C  s
   | j  ¡ S r(   )rM   r8   r   r   r   r   r8   ø   s    zGuard.is_fsdp_modulec                 C  s
   | j  ¡ S r(   )rM   r:   r   r   r   r   r:   û   s    zGuard.is_localc                 C  sp   | j stƒ | _ | j  |¡ | j|d fks0tdƒ‚|| _| jsD|| _n| j |¡ | j|d fksftdƒ‚|| _d S )Nz+Guarded class id must be identical, or Nonez)Guarded object must be identical, or None)rG   ÚlistÚappendrJ   ÚAssertionErrorrH   ÚextendrI   )r   Z
guard_typeZguarded_classrH   rI   r   r   r   Úset_export_infoþ   s(    þýþýzGuard.set_export_info)r   r   r   r   rF   rG   rH   rI   rJ   r@   Ú
user_stackrO   rV   rY   rS   ÚpropertyrL   rM   Ústaticmethodre   rk   r   rp   r9   r8   r:   ru   r   r   r   r   rB   †   s4   

rB   ÚTc                   @  s   e Zd ZdS )ÚGuardEnvExprNr=   r   r   r   r   rz      s   rz   c                   @  s&   e Zd ZU ded< ded< dd„ ZdS )ÚDuplicateInputsrC   Úinput_source_aÚinput_source_bc                 C  s   | j | jkst‚d S r(   )r|   r}   rs   r   r   r   r   Ú__post_init__0  s    zDuplicateInputs.__post_init__N)r   r   r   r   r~   r   r   r   r   r{   +  s   
r{   c                   @  s0   e Zd Zeddœdd„ƒZeddœdd„ƒZdS )	ÚCheckpointablery   r6   c                 C  s   d S r(   r   r   r   r   r   Úcopy_graphstateB  s    zCheckpointable.copy_graphstate)Ústatec                 C  s   d S r(   r   ©r   r�   r   r   r   Úrestore_graphstateF  s    z!Checkpointable.restore_graphstateN)r   r   r   r   r€   rƒ   r   r   r   r   r   A  s   r   c                   @  s4   e Zd ZU eƒ Zded< dd„ Zdd„ Zdd„ Zd	S )
ÚGuardsCheckpointStateú
Set[Guard]Údynamo_guardsc                 C  s
   || _ d S r(   )r†   )r   r†   r   r   r   Ú__init__S  s    zGuardsCheckpointState.__init__c                 C  s"   | j  |j ¡}t|ƒdkrd S |S ©Nr   )r†   Ú
differencerR   ©r   rX   Úrr   r   r   Údiff]  s    zGuardsCheckpointState.diffc                 C  s   |   |¡d kS r(   ©rŒ   rW   r   r   r   Ú__eq__c  s    zGuardsCheckpointState.__eq__N)	r   r   r   Úsetr†   r   r‡   rŒ   rŽ   r   r   r   r   r„   P  s   

r„   c                   @  s2   e Zd ZU i Zded< dd„ Zdd„ Zdd„ Zd	S )
ÚModuleContextCheckpointStatezDict[str, torch.nn.Module]Ú
nn_modulesc                 C  s
   || _ d S r(   ©r‘   )r   r‘   r   r   r   r‡   j  s    z%ModuleContextCheckpointState.__init__c                 C  s2   t | j ¡ ƒ t |j ¡ ƒ¡}t|ƒdkr.d S |S rˆ   )r�   r‘   Úkeysr‰   rR   rŠ   r   r   r   rŒ   t  s    z!ModuleContextCheckpointState.diffc                 C  s   |   |¡d kS r(   r�   rW   r   r   r   rŽ   z  s    z#ModuleContextCheckpointState.__eq__N)r   r   r   r‘   r   r‡   rŒ   rŽ   r   r   r   r   r�   g  s   

r�   c                   @  s$   e Zd Zdd„ Zdd„ Zdd„ ZdS )ÚModuleContextc                 C  s
   i | _ d S r(   r’   r   r   r   r   r‡     s    zModuleContext.__init__c                 C  s   t t| jƒƒS r(   )r�   Údictr‘   r   r   r   r   r€   ‚  s    zModuleContext.copy_graphstatec                 C  s   t |tƒst‚|j| _d S r(   )rZ   r�   rs   r‘   r‚   r   r   r   rƒ   …  s    z ModuleContext.restore_graphstateN©r   r   r   r‡   r€   rƒ   r   r   r   r   r”   ~  s   r”   c                   @  s2   e Zd ZU i Zded< dd„ Zdd„ Zdd„ Zd	S )
ÚGlobalContextCheckpointStatezDict[str, Tuple[Callable, ...]]Úglobal_statec                 C  s
   || _ d S r(   ©r˜   )r   Zglobal_statesr   r   r   r‡   �  s    z%GlobalContextCheckpointState.__init__c                 C  s2   t | j ¡ ƒ t |j ¡ ƒ¡}t|ƒdkr.d S |S rˆ   )r�   r˜   r“   r‰   rR   rŠ   r   r   r   rŒ   —  s    z!GlobalContextCheckpointState.diffc                 C  s   |   |¡d kS r(   r�   rW   r   r   r   rŽ   �  s    z#GlobalContextCheckpointState.__eq__N)r   r   r   r˜   r   r‡   rŒ   rŽ   r   r   r   r   r—   Š  s   

r—   c                   @  s:   e Zd ZdZdddddddhZd	d
„ Zdd„ Zdd„ ZdS )ÚGlobalContextzz
    This keeps track of the global torch state during tracing of a function.
    For example, torch.is_grad_enabled.
    Zgrad_enabledZtorch_function_enabledZautocast_enabledZautocast_cpu_enabledZautocast_gpu_dtypeZautocast_cpu_dtypeZautocast_cache_enabledc                 C  s
   i | _ d S r(   r™   r   r   r   r   r‡   ±  s    zGlobalContext.__init__c                 C  s   t t| jƒƒS r(   )r—   r•   r˜   r   r   r   r   r€   ´  s    zGlobalContext.copy_graphstatec                 C  sf   t |tƒst‚|j| _t| jƒt| jƒkr>t| j ¡ ƒ| jksFtdƒ‚| j ¡ D ]\}}||ƒ qPd S )NzGlobal state mismatch)	rZ   r—   rs   r˜   rR   Ú_supported_global_statesr�   r“   Úvalues)r   r�   r]   Úargsr   r   r   rƒ   ·  s    ÿþýz GlobalContext.restore_graphstateN)r   r   r   Ú__doc__r›   r‡   r€   rƒ   r   r   r   r   rš   ¡  s   ù
rš   c                   @  sX   e Zd Zddd„Zdd„ Zdd„ Zdd	„ Zd
d„ Zddœddœdd„Zddœdd„Z	dS )Ú	GuardsSetNc                 C  s   |d krt ƒ }|| _d S r(   )r�   Úinner)r   r    r   r   r   r‡   Í  s    zGuardsSet.__init__c                 C  s
   t | jƒS r(   )Úiterr    r   r   r   r   Ú__iter__Ò  s    zGuardsSet.__iter__c                 C  s
   t | jƒS r(   )rR   r    r   r   r   r   Ú__len__Õ  s    zGuardsSet.__len__c                 C  s   t | j|j ƒS r(   )rŸ   r    rW   r   r   r   Ú__sub__Ú  s    zGuardsSet.__sub__c                 C  s
   t | jƒS r(   )r5   r    r   r   r   r   Ú__bool__Ý  s    zGuardsSet.__bool__r   ©ÚskiprB   )Úguardc                C  sN   || j krd S |jd kr*tjd| d�|_|jd kr>t ¡ |_| j  |¡ d S ©Nr    r¦   )r    r@   r   Úextractrv   ÚTracingContextÚextract_stackÚadd)r   r¨   r§   r   r   r   r­   à  s    



zGuardsSet.addr…   )Úothersc                 G  s&   |D ]}|D ]}| j |dd� qqd S r©   )r­   )r   r®   ÚoÚgr   r   r   Úupdateé  s    zGuardsSet.update)N)
r   r   r   r‡   r¢   r£   r¤   r¥   r­   r±   r   r   r   r   rŸ   Ì  s   
	rŸ   c                   @  s$   e Zd Zdd„ Zdd„ Zdd„ ZdS )ÚGuardsContextc                 C  s   t ƒ | _g | _d S r(   )rŸ   r†   Zaotautograd_guardsr   r   r   r   r‡   ð  s    zGuardsContext.__init__c                 C  s   t t| jjƒƒS r(   )r„   r�   r†   r    r   r   r   r   r€   ô  s    zGuardsContext.copy_graphstatec                 C  s   t |tƒst‚t|jƒ| _d S r(   )rZ   r„   rs   rŸ   r†   r‚   r   r   r   rƒ   ÷  s    z GuardsContext.restore_graphstateNr–   r   r   r   r   r²   ï  s   r²   c                   @  s2   e Zd Zeddœdd„ƒZdd„ Zedd„ ƒZd	S )
ÚCompileContextzOptional[CompileContext]r6   c                   C  s   t tdd ƒS ©NÚcompile_context©ÚgetattrÚ_TLSr   r   r   r   Úget  s    zCompileContext.getc                 C  s    |d kst |tƒst‚|| _d S r(   )rZ   r   rs   Ú
compile_id)r   rº   r   r   r   r‡     s    zCompileContext.__init__c                  C  s   t  ¡ } | d krd S | jS r(   )r³   r¹   rº   r   r   r   r   Úcurrent_compile_id  s    z!CompileContext.current_compile_idN)r   r   r   rx   r¹   r‡   r»   r   r   r   r   r³     s
   r³   c                   @  sx   e Zd ZdZeddœdd„ƒZdd„ Zedd	„ ƒZeej	d
d„ ƒƒZ
eej	dd„ ƒƒZeej	dd„ ƒƒZedd„ ƒZdS )r«   zÅ
    Provides the currently installed TracingContext, or None.

    Note that it is a staticmethod, and invocations outside of `with tracing()` (see below), are valid but
    will return None.
    zOptional[TracingContext]r6   c                   C  s   t tdd ƒS )NÚtracing_contextr¶   r   r   r   r   r¹   +  s    zTracingContext.getc                 C  s@   t ƒ | _tƒ | _tƒ | _|| _g | _d | _d | _	d | _
d | _d S r(   )r²   Zguards_contextr”   Zmodule_contextrš   Zglobal_contextÚ	fake_modeÚframe_summary_stackÚloc_in_frameZfw_metadataZparams_flatÚoutput_strides)r   r½   r   r   r   r‡   /  s    
zTracingContext.__init__c                  C  sD   t  ¡ } | d krt ¡ S t| jƒ}| jd k	r8| | j¡ tj |¡S r(   )	r«   r¹   Ú	tracebackÚStackSummaryrq   r¾   r¿   rr   Ú	from_list)r   r@   r   r   r   r¬   J  s    

zTracingContext.extract_stackc                  c  s˜   t  ¡ } | d k	stdƒ‚tjj | dg ¡�d tjj | dd ¡�F z
d V  W n4 tk
r~ } zt|dƒsld |_	‚ W 5 d }~X Y nX W 5 Q R X W 5 Q R X d S )Nú=Frame context manager must be called within an ongoing trace.r¾   r¿   Ú
real_stack)
r«   r¹   rs   ÚunittestZmockÚpatchÚobjectÚ	ExceptionÚhasattrrÅ   )ÚtcÚer   r   r   Úclear_frameV  s$    ÿþ  ÿþ

zTracingContext.clear_framec              
   c  s    t  ¡ }|d k	stdƒ‚| d k	r,|j | ¡ |j}d |_zHz
d V  W n8 tk
r| } zt|dƒsj| 	¡ |_
‚ W 5 d }~X Y nX W 5 | d k	r”|j ¡  ||_X d S )NrÄ   rÅ   )r«   r¹   rs   r¾   rr   r¿   ÚpoprÉ   rÊ   r¬   rÅ   )Úframe_summaryrË   ÚoldrÌ   r   r   r   Úcurrent_framex  s$    ÿþ



zTracingContext.current_framec                  c  s@   t  ¡ } | d krd V  d S | j}g | _z| jV  W 5 || _X d S r(   )r«   r¹   rÀ   )rË   Zold_output_stridesr   r   r   Úreport_output_strides�  s    z$TracingContext.report_output_stridesc                 C  s,   t  ¡ }|d k	stdƒ‚t | ||¡|_d S )Nz;Loc context manager must be called within an ongoing trace.)r«   r¹   rs   rÁ   ÚFrameSummaryr¿   )ÚfilenameÚlinenoZ
frame_namerË   r   r   r   Úset_current_locž  s    ÿþzTracingContext.set_current_locN)r   r   r   rž   rx   r¹   r‡   r¬   Ú
contextlibr   rÍ   rÑ   rÒ   rÖ   r   r   r   r   r«   #  s"   
 r«   )Úcontextc                 c  s*   t tdd ƒ}| t_z
| V  W 5 |t_X d S r´   )r·   r¸   rµ   )rØ   Úold_contextr   r   r   rµ   §  s
    
rµ   c              
   c  sš   t tddƒ}| t_zPz
| V  W n@ tk
r^ } z"t|dƒsL| dk	rL|  ¡ |_	‚ W 5 d}~X Y nX W 5 | dk	rŽ| jdk	rŽ| jjdk	rŽ| jj ¡  |t_X dS )zË
    This function installs the passed in tracing context as a dynamic scoped
    global variable.

    Calls to TracingContext.get() while not under a `with tracing()` context
    will return None.
    r¼   NrÅ   )
r·   r¸   r¼   r½   Z	shape_envÚcleanuprÉ   rÊ   r¬   rÅ   )rØ   rÙ   rÌ   r   r   r   Útracing±  s     	

ÿþ
ýrÛ   T)Úfrozenc                   @  sN   e Zd Zdd„ Zddœdd„Zddœdd	„Zdddœdd„Zddœdd„ZdS )rC   c                 C  s
   t ƒ ‚d S r(   ©r1   )r   Zcodegenr   r   r   ÚreconstructÐ  s    zSource.reconstructr   r6   c                 C  s
   t ƒ ‚d S r(   rÝ   r   r   r   r   r^   Ó  s    zSource.guard_sourcer2   c                 C  s
   t ƒ ‚d S r(   rÝ   r   r   r   r   rL   Ö  s    zSource.nameFrB   c                 C  s    |   ¡ tjkrtƒ ‚t| ||ƒS r(   )r^   r   r;   r1   rB   )r   ÚfnrF   r   r   r   Ú
make_guardÙ  s    zSource.make_guardr5   c                 C  s   |   ¡  ¡ S r(   )r^   r9   r   r   r   r   r9   Þ  s    zSource.is_nn_moduleN)F)r   r   r   rÞ   r^   rL   rà   r9   r   r   r   r   rC   Î  s
   rC   c                   @  s   e Zd ZU ded< dS )ÚChainedSourcerC   ÚbaseNrA   r   r   r   r   rá   å  s   
rá   r   )Úinputsc                 C  sZ  ddl m}m} ddlm} g }t ¡ }|dk	rN|j}|dk	rN| |ddf¡ ddl	m
} tt|ƒ ƒƒD ]"\}}	t|	|ƒrh| |	d|f¡ qh|| ƒ\}
}t|
ƒD ]$\}}t||ƒr | |jd|f¡ q |�rR|d \}}}|d	d… D ]f\}	}}||	ksætd
|› d|› d|› d|	› d|› d|› d|› d|› d|j› d|› d|› d|	j› �ƒ‚qæ|S dS dS )a˜  
    Attempts to "detect" what the current fake mode is.  If there is one ambiently
    available from TracingContext, we preferentially use that.  Otherwise, we
    heuristically detect the fake mode via the following sources, in order of
    priority:

        - Currently active fake mode on stack
        - Fake mode associated with passed in tensors (inputs does not
          have to be flattened)
    r   )Ú
FakeTensorÚFakeTensorMode)Útree_flattenNztracing context)Ú _get_current_dispatch_mode_stackzactive fake modezfake tensor inputr    zfake mode (z) from rg   z doesn't match mode (z

fake mode from z allocated at:
z
fake mode from )Ztorch._subclasses.fake_tensorrä   rå   Ztorch.utils._pytreeræ   r«   r¹   r½   rr   Ztorch.utils._python_dispatchrç   Ú	enumerateÚreversedrZ   rs   r@   )rã   rä   rå   ræ   Z
fake_modesrØ   r½   rç   ÚiÚmZflat_inputsÚ_Z
flat_inputZdesc1Úi1Zdesc2Úi2r   r   r   Údetect_fake_modeê  s0    


Nÿrï   )N)=Ú
__future__r   r×   ÚdataclassesÚenumr[   ÚloggingÚ	threadingrÁ   Zunittest.mockrÆ   r`   Úabcr   r   r   Útypingr   r   r   r	   r
   r   r   r   r   r   ZtorchZtorch.utils._tracebackr   Ú	getLoggerr   ÚlogZsympyr   ÚEnumr   r<   r>   Ú	dataclassrB   ry   rz   r{   r   r„   r�   r”   r—   rš   rŸ   r²   Úlocalr¸   r³   r«   rµ   rÛ   rC   rá   rï   r   r   r   r   Ú<module>   sb   0

E 

+# 	

