U
    <c                     @   s>  d dl mZmZ d dlm  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mZmZ d dlmZ d dlZd dlmZ d dlmZmZmZmZ d dlZd dlmZ eej dZd	Zd
Z dd Z!G dd de"Z#e$ddgZ%dddejdfddZ&de e e fe e e fffde e e e fe e e e fffde e e e e fe e e e e fffde e e fe e e fffde e e e fe e e e fffde e e e e fe e e e e fffde e e fe e e fe fdffde e e fdfde e e e fdd d!fd"e e e e e fdfd#e e e e fd$dd$gffd%e e e fd&fd%e e e fd'd(fd)e e e e fd&d d*fd)e e e e fd'd(d*fd+e e e e e fd&fd,e'd-d.ggge'd/d$gggddd ffd0e'd-d.gggge'd/d$ggggddd ffd1e'd-d.ggggge'd/d$gggggddd ffd2e e e fd3fd4e e e e fd3fd5e e e fd6fd7e e e e fd
d8gffd9e e e e e fd$ddgffd:e e e fd6d d!fd;e e e e fd
d8gfd d!fd<e e e e e fd$ddgfd d!fd=e e e fd>d d?fd@e e e fd>fdAe e e fd>fdAe e e e fd>dBfdCe e e e fd>fdCe e e e e fd>dBfdDe e e fd>fdEe e e fdFd d!fdEe e e fdGdHfdIe e e fdJd d!fdIe e e fdJdHfdKe d/ e d/ e d/ fdJfdLe e e fdMd d!fdLe e e fdNdHfdOe e e fdJd d!fdOe e e fddHfdPe e e fdQfdPe e e fdRdHfdSe e e fdJfdSe e e fddHfdTe e e fdQfdTe e e fdRdHfdUe e e fdVd d!fdUe e e fdVdHfdWe e fdXfdWe e fdYdHfdZe e e fd[d d!fd\e e e fdJfd]e e e fdJfd^e e e fdJd d!fd_e e e fd`fdae e e fd`d d!fdae e e fd d$ejfdbd!fdce e e fdJd d!fdde e e fdJd d!fdee e e fdJd d!fdfe e e fd`d d!fdge e fee ffd ddhgffdge e fee feffdiddhgffdje e e fe e efe(ee effdke'd/dd.d
gd.d$dd
gge)dld$fd d!fdme'd/dd.dge)d
d$e'd d.gffdne e fe%e*e e%e+e dddfdodpfdnd e e e fe%e*e e%e+e e%e*e e%e+e dfdqdpfdnd e e e fe%e*e e%e+e e%e*e e%e+e dfdrdpfdne e fe%e*e e%e+e e%e*e e%e+e dfdsdpfdne e fe%e*e e%e+e de%e+e dfdtdpfdne e fe%e*e e%e+e e%e*e ddfdudpfdne e fe%e*e e%e+e dddfdvdpfdne e fe%e*e e%e+e e%e*e e%e+e dfdwdpfdne e fe%e*e e%e+e de%e+e dfdxdpfdne e fe%e*e e%e+e e%e*e ddfdydpfdze e e fe%e(e e%e+e ffd{e e e e fd
gfd dd|d}gffd{e e e e fd
ge%e)e fd~dd|d}gffd{e e e e fd
gde%e)e fddd|d}gffd{e e e e fd
ge%e)e e%e)e fddd|d}dgffde e e fd/e)d
ffde e e fdfdej,e*d$d
d de'd/d d.gfd fde)e de)e dffde)e de)e dddfdfde,e*e d	d/e-e*e d	d/ffdd$e fej.e dej/dffdde0d$1dffdd$e fe%e)d$e ffdd$e fe%e)d$e ffdd$e fe%e)d$e ffdd$e fe%e)d$e ffdd$e fe)d$e fdfdd$e fe)d$e fdfdd$e fe)d$e fdfdd$e fe)d$e fdfde fe fe fffdd$e fe%e)d$e ffdd$e fe%e)d$e ffdd$e fe%e)d$e ffde e fe e fe%e)e ffddde dd$fe2e d/d8d8gffddd/d/gffde e fe e fffde e fdJfde e fe e fffde e fe e fe e fffde e e fdJfde e e e fdd$gfddd.d
gddgffde e e e fe%e)e e e dffde e fdd ddddgdgffde e fddddddgdgffde'dddgge'd d d/ggffde e fe%ej.e e fej/dd/de%e*e ffde*d$d3 e%e)d$de%e*d$dffde*d$d3 e%e)d$de%e*d$ddddfdfde)e e e ,d4 5 ej.d/e e e fej6dej7e fe ej6dej.d/e e fej6dffde*e e eeddfde*e e eeddfde(d$d$8d/d/d$d$ddfde*e e eeddfde*e e eeddfde(d$d$8d/d/d$d$ddfde*e e eeddfde*e e eeddfde(d$d$8d/d/d$d$ddfde*e e eeddfde*e e eeddfde(d$d$8d/d/d$d$ddfde*e e eeddfde*e e eeddfde(d$d$8d/d$d$ddfde*e eeddfde*e eeddfde(d$d$8d/d$d$ddfde*e eeddfde*e eeddfde(d$d$8d/d$d$ddfde*e eeddfde*e eeddfde*e eeeeddfde*e eeeeddfde(d$d$d$8d/d/d$d$d$ddfde*e eeeeddfde*e eeeeddfde(d$d$d$8d/d/d$d$d$ddfde*e eeeeddfde*e eeeeddfde(d$d$8d/d/d$d$ddfde*e e eeddfde*e e eeddfde*e e eeddfde*e e eeddfde*e e eeddfde*e eeddfde*e eeddfde*e eeddfde*e eeddfde*e eeeeddfde*e eeeeddfde*e eeeeddfde*e eeeeddfgZ9dZ:dd Z;dd Z<dd Z=dd Z>dd Z?dd Z@G d d dZAdd ZBd7ddZCdddd	d
dddddh
ZDd8ddZEde e efe e fe e ffdde e fe e fdde e fe e fdde e fe e fdddde*d	dde*d	ddfddddd e*d/d/d/fddgZFd!d"d#d$d%hZGd&ZHd'd( ZId)d*d+d,ZJd-d. ZKd/d0 ZLd1d2 ZMd3d4 ZNd5d6 ZOdS (9      )BroadcastingList2BroadcastingList3N)module_testsnew_module_tests)is_iterable_of_tensors)deepcopy)AnyDictListUnioninf   
      c                 C   s$   t | trtdd | D S | S d S )Nc                 s   s   | ]}t |V  qd S N)unpack_variables).0elem r   U/tmp/pip-unpacked-wheel-gikjz4vx/torch/testing/_internal/jit_metaprogramming_utils.py	<genexpr>   s     z#unpack_variables.<locals>.<genexpr>)
isinstancetuple)argsr   r   r   r      s    
r   c                   @   s   e Zd ZdS )dont_convertN)__name__
__module____qualname__r   r   r   r   r   "   s   r   non_differentiabletensorTFc                    s`   t | ts| f}  fddtfdd| D }|rTfdd| D ni }||fS )Nc                    s  fdd}dd }t | tjs*t | tr.| S t | trbt| dkrb|tjd d}|_|S t | trt | d tjs||tj|  d	S t | t
r2t | jtjr| jjtjkr|| jjtj dS | jjtjkr||| jjtj dS ||| jj dS ||| jj dS t | tjr| jtjkrV|  } | jtjkrp| tj} |  jkrtd	d
|||  j d }o| p| |_|S t| rވ|  dS | S d S )Nc                    s     r|   dk r|  S t| S )N   )ZnumelcloneZnoncontiguous_liker    )non_contiguousr   r   maybe_non_contig,   s    z7create_input.<locals>.map_arg.<locals>.maybe_non_contigc                 S   s   |   S r   )Zconjr#   r   r   r   	conjugate2   s    z0create_input.<locals>.map_arg.<locals>.conjugater   r   )dtypedevice)r(   zFUser provided tensor is real for a test that runs with complex dtype, zwhich is not supported for now)r   torchSizer   r   lenrandnrequires_gradTensorrequires_grad_r   r    r'   floattodoubleZcfloatcdouble
is_complexRuntimeErrordetachr"   Zis_floating_pointcallable)argr%   r&   varvr(   r'   map_argr$   r-   r   r   r<   +   sB     
zcreate_input.<locals>.map_argc                 3   s   | ]} |V  qd S r   r   r   r8   r<   r   r   r   V   s     zcreate_input.<locals>.<genexpr>c                    s   i | ]\}}| |qS r   r   r   kr:   r>   r   r   
<dictcomp>W   s      z create_input.<locals>.<dictcomp>)r   r   items)Z	call_argsr-   r$   Zcall_kwargsr'   r(   Zargs_outZ
kwargs_outr   r;   r   create_input'   s    
+rC   Zconv1dZconv2dZconv3dZconv_transpose1dZconv_transpose2dZconv_transpose3dZconv_tbcr!   Z
avg_pool1d   Z
avg_pool2d )TZ
avg_pool3dZfractional_max_pool2drE   Z
max_pool1d)r!      )r!   rG   rG   rG   FTZwith_indicesZ
max_pool2d)Tzaten::max_pool2d_with_indicesZ
max_pool3dZmax_unpool1d       @   rG   Zmax_unpool2dZmax_unpool3dZ	lp_pool1d)rH   rE   r!   Z	lp_pool2dZadaptive_max_pool1d)r   Zadaptive_max_pool2d   Zadaptive_max_pool3dZadaptive_avg_pool1dZadaptive_avg_pool2dZadaptive_avg_pool3dZdropout)      ?)Tzaten::native_dropoutZalpha_dropoutZ	dropout2dZbatchedZ	dropout3dZfeature_alpha_dropout	threshold)皙?rH   )rM   rH   TinplaceZrelur   ZgluZhardtanh)      rK   )rO   rK   TZrelu6Zelu)?)rP   TZseluZceluZ
leaky_relu)g{Gz?Zrrelu)rM   333333?F)rM   rQ   FTZ
hardshrink)g?Z
tanhshrinkZsoftsignZsoftplusZsoftmin)r   softmaxZwith_all_argstanhsigmoidZsilulog_softmaxlinearzaten::linearZaddmmbilinearZ	embedding   Zembedding_bagZ
batch_normZtraining)Taten::_batch_norm_impl_indexZ	size_zeroZsize_zero_inferenceZwith_weight_and_bias_trainingZwith_only_bias_trainingZwith_only_weight_trainingZ	inferenceZwith_weight_and_bias_inferenceZwith_only_bias_inferenceZwith_only_weight_inferenceZinstance_normZ
layer_normzaten::contiguousrY   Zwith_only_weightZwith_only_biasZwith_weight_and_biaszaten::addcmulZ
group_normZlocal_response_norm)r!   Znll_loss)ZdimZpoisson_nll_lossfullZkl_divZcross_entropyr'   Z binary_cross_entropy_with_logitsZsmooth_l1_lossZ
huber_lossZl1_lossZmse_lossZ	with_gradZmargin_ranking_lossZhinge_embedding_lossZsoft_margin_lossZmultilabel_soft_margin_lossZcosine_embedding_loss)Zpixel_shuffle)rG   	   rI   rI   rD   )Zpixel_unshuffle)rG   rG      r]   rD   Zaffine_gridpad)rE   rE   rI   r!   Zpairwise_distanceZpdistZcosine_similarityZtriplet_margin_loss	normalizeZunfoldfold)rG   r]   r]   Zgrid_sampleZgumbel_softmax)rH   zaten::softmaxz	aten::addz	aten::divz	aten::neg)rH   ThardZmultilabel_margin_lossg?gɿgQ?Zmulti_margin_lossg      ?Zbinary_cross_entropyZmeanZsize_averageZctc_lossZupsample)NrH   Z
with_scale)rI   Z	with_sizeZinterpolateZ
nearest_4dZnearest_4d_with_scaleZnearest_4d_with_sizeZarea_4dZarea_4d_with_scaleZarea_4d_with_sizeZbilinear_4dZbilinear_4d_with_scaleZbilinear_4d_with_sizeZ
bicubic_4dZbicubic_4d_with_scaleZbicubic_4d_with_sizeZ
nearest_3dZnearest_3d_with_scaleZnearest_3d_with_sizeZarea_3dZarea_3d_with_scaleZarea_3d_with_sizeZ	linear_3dZlinear_3d_with_scaleZlinear_3d_with_sizeZnearest_5d_with_scaleZnearest_5d_with_sizeZarea_5dZarea_5d_with_scaleZarea_5d_with_sizeZtrilinear_5dZtrilinear_5d_with_scaleZtrilinear_5d_with_size)r!   NnearestNFZ%nearest_4d_not_recompute_scale_factor)rI   Nrb   NFZ/nearest_4d_with_size_not_recompute_scale_factor)NrH   rW   NFZ1bilinear_4d_with_scale_not_recompute_scale_factor)rI   NrW   NFZ0bilinear_4d_with_size_not_recompute_scale_factor)NrH   bicubicNFZ0bicubic_4d_with_scale_not_recompute_scale_factor)rI   Nrc   NFZ/bicubic_4d_with_size_not_recompute_scale_factor)NrH   rb   NFZ0nearest_3d_with_scale_not_recompute_scale_factorZ/nearest_3d_with_size_not_recompute_scale_factor)NrH   rV   NFZ/linear_3d_with_scale_not_recompute_scale_factor)rI   NrV   NFZ.linear_3d_with_size_not_recompute_scale_factorZ0nearest_5d_with_scale_not_recompute_scale_factorZ/nearest_5d_with_size_not_recompute_scale_factor)NrH   	trilinearNFZ2trilinear_5d_with_scale_not_recompute_scale_factor)rI   Nrd   NFZ1trilinear_5d_with_size_not_recompute_scale_factorz#
def the_method({}):
    return {}
c                 C   s6   t | trt| S t | tjr*dt|  S t| S d S )Nztorch.)r   strasciir)   r.   )valuer   r   r   value_to_literalJ  s
    
rh   c                 C   s   d dd | D }|d }|dkr4|dd  }d |}|t|rTt|rTdnd7 }||7 }|dksr|d	krd
| |}n6|dkrd|| |}n|dkrd| |}ntd|S )N, c                 S   s    g | ]\}}|d  t | qS )=)rh   r?   r   r   r   
<listcomp>T  s     zget_call.<locals>.<listcomp>r   methodrG   rF   
functionalfunctionztorch.{}({})z	{}.{}({})nn_functionalztorch.nn.functional.{}({})zUnsupported function type)joinrB   r+   format	TypeError)method_name	func_typer   kwargsZ
kwargs_strZself_argZargument_strcallr   r   r   get_callS  s    
rw   c                 C   s   | t krdS | t  krdS | S )Nzmath.infz	-math.infr   )xr   r   r   get_constanth  s
    
ry   c                 C   s   g }g }g }| D ]}t |tjrNdt|}|| || || qt|rdt|}||d  || |t| qt |tr|d| q|tt	| q|||fS )Nzi{}z: List[torch.Tensor]z'{}')
r   r)   r.   rq   r+   appendr   listre   ry   )r   formalstensorsactualsr8   namer   r   r   get_script_argso  s$    



r   c           
      O   sD   t |\}}}t| |||}td||}tj|}	|	j|fS Nri   )	r   rw   script_templaterq   rp   r)   jitCompilationUnit
the_method)
rs   rt   r   ru   r|   r}   r~   rv   scriptCUr   r   r   gen_script_fn_and_args  s
    r   c                    s    fddS )Nc                     s<   t  f| |\}}|j| || }|j| _|S r   )r   assertExportImportgraph	graph_for
last_graph)r   ru   fnr}   outputrt   rs   	script_fnselfr   r   r     s
    z#create_script_fn.<locals>.script_fnr   )r   rs   rt   r   r   r   create_script_fn  s    r   c                   @   s   e Zd ZU ee ed< ee ed< ee ed< ee ed< eeef ed< ee ed< eeef ed< eeef ed< ed	d
 Z	dd Z
d dddZdS )SplitInputsall_tensorstensor_argsnontensor_args	arg_typestensor_kwargskwarg_ordernontensor_kwargskwarg_typesc                 C   s   t | tjpt| S r   )r   r)   r.   r   )r8   r   r   r   _is_tensor_input  s    zSplitInputs._is_tensor_inputc                    s    fdd|D  _  fdd| D  _ fdd|D  _ fdd|D  _ fdd| D  _ fdd| D  _ jd	d  j D  _d
d | D  _d S )Nc                    s   g | ]}  |rd ndqS tsr   r=   r   r   r   rk     s     z(SplitInputs.__init__.<locals>.<listcomp>c                    s$   i | ]\}}|  |rd ndqS r   r   r?   r   r   r   rA     s      z(SplitInputs.__init__.<locals>.<dictcomp>c                    s   g | ]}  |r|qS r   r   r=   r   r   r   rk     s     
 c                    s   g | ]}  |s|qS r   r   r=   r   r   r   rk     s     
 c                    s    i | ]\}}  |r||qS r   r   r?   r   r   r   rA     s     
  c                    s    i | ]\}}  |s||qS r   r   r?   r   r   r   rA     s     
  c                 S   s   g | ]\}}|qS r   r   r?   r   r   r   rk     s     c                 S   s   g | ]\}}|qS r   r   r?   r   r   r   rk     s     )	r   rB   r   r   r   r   r   r   r   )r   r   ru   r   r   r   __init__  s    zSplitInputs.__init__)otherc                 C   sT   | j |j krdS | j|jkr dS | j|jkr0dS | j|jkr@dS | j|jkrPdS dS )NFT)r   r   r   r   r   )r   r   r   r   r   nontensors_match  s    zSplitInputs.nontensors_matchN)r   r   r   r
   r   __annotations__re   r	   staticmethodr   r   r   r   r   r   r   r     s   


r   c                    s$   t   fdd}|fS )Nc                     sF   t |   fddtjD } fddj D }||S )Nc                    s(   g | ] \}}|d kr | nt qS r   next)r   ir   )r   r}   r   r   rk     s     z<partial_apply_nontensors.<locals>.new_fn.<locals>.<listcomp>c                    s*   i | ]"\}}||d kr | nt qS r   r   )r   r@   r   )ru   r}   r   r   rA     s      z<partial_apply_nontensors.<locals>.new_fn.<locals>.<dictcomp>)iter	enumerater   r   rB   )Ztensors_Z	full_argsZfull_kwargsr   r   inputsru   )r}   r   new_fn  s    z(partial_apply_nontensors.<locals>.new_fn)r   )r   r   ru   r   r   r   r   partial_apply_nontensors  s    
r   c                    s    fddS )Nc                     s   t | |\}} rtds^tjj||jdd}|j|j ||j } r|_|_	n$
j	| j|j }j}|j|j _|j_|S )NtracedF)Zcheck_trace)r   hasattrr)   r   tracer   r   r   r   split_inputs
assertTruer   r   r   )r   ru   Z
fn_tensorsr   r   r   cache_traced_fnr   r   	traced_fnr   r   r     s    
z#create_traced_fn.<locals>.traced_fnr   )r   r   r   r   r   r   create_traced_fn  s    r   Ztest_norm_fro_defaultZtest_norm_fro_cpuZtest_norm_nucZtest_norm_froZtest_norm_nuc_batchedZtest_nn_unfoldZtest_nn_ctc_lossZtest_nn_foldZtest_to_sparseZtest_to_sparse_dimc              	   G   s   d|  }|dkr|d | }|dk}t |fd d }d }t |\}	}
t|j}tt|	}|f|	 }|f| }tj  t| df| \}}W 5 Q R X ||fS )NZtest_nn_rF   _rN   r   ro   )rC   r   datar   r)   Z_jit_internalZ_disable_emit_hooksr   )r   Z	self_sizer   Zvariant_name
extra_args	test_nameZno_gradZself_variableru   args_variablekwargs_variableZself_tensorZargs_tensorf_args_variableZf_args_tensorr   r   r   r   r   (get_nn_functional_compiled_fn_and_inputs  s    


r   ZBilinear)module_nameconstructor_args
input_sizer   ZRNNCell)r   r   r   ZLSTMCellZGRUCellZMultiheadAttention)      )r   r   r   r   r   )r   r   r   r   ZslowTestZTransformer)rG   rG   rG   rG   r!   )rE   rG   rG   Z$test_nn_AdaptiveAvgPool2d_tuple_noneZ$test_nn_AdaptiveAvgPool3d_tuple_noneZ$test_nn_AdaptiveMaxPool2d_tuple_noneZ$test_nn_AdaptiveMaxPool3d_tuple_noneZtest_nn_CrossMapLRN2dz 
def forward({}):
    return {}
c                    s    fdd}|S )Nc                     s   t | \}}}ddg| }d|}d|}t||}g |drRdgG  fdddtjj  fdd	}	|	|}
r|
| |
|   |
j	t
_|
S )
Nri   r   zself.submodule({})Zis_constant	submodulec                       s&   e Zd ZZ fddZ  ZS )z>create_script_module.<locals>.script_module.<locals>.TheModulec                    s   t  |    | _d S r   )superr   r   r   )	TheModule	__class__r   	nn_moduler   r   r   _  s    zGcreate_script_module.<locals>.script_module.<locals>.TheModule.__init__)r   r   r   Z__constants__r   __classcell__r   )r   r   r   submodule_constants)r   r   r   \  s   r   c                    s     }t | ||  |S r   )re   Zdefine)r   module)r   r   r   make_modulec  s    
z@create_script_module.<locals>.script_module.<locals>.make_module)r   rp   rq   script_method_templategetr)   r   ZScriptModuleZassertExportImportModuler   create_script_moduler   )r   ru   r|   r}   r~   Zmethod_argsZcall_args_strrv   r   r   r   r   r   r   )r   r   r   script_moduleO  s     


z+create_script_module.<locals>.script_moduler   )r   r   r   r   ru   r   r   r   r   r   N  s    "r   rl   )rt   c                C   sv   t |\}}}t| |||}td||}	tj|	}
tj	|
j
j tj|
j
j tj|
j
jt|| d S r   )r   rw   r   rq   rp   r)   r   r   Z_CZ_jit_pass_inliner   r   Z_jit_pass_constant_propagationZ_jit_check_alias_annotationr   )rs   r   ru   Z	aten_namert   r|   r}   r~   rv   r   r   r   r   r   check_alias_annotations  s    r   c                  K   s6   d| kr| d S d| kr | d S d| kr2| d j S d S )Nr   fullnameconstructor)r   )ru   r   r   r   get_nn_module_name_from_kwargs}  s    r   c                  K   s>   d| kr| d }n"t f | }d| kr4d|| d }d|S )Nr   desc{}_{}z
test_nn_{})r   rq   )ru   r   r   r   r   get_nn_mod_test_name  s    

r   c                  K   s6   t f | }|d}|dkr |S |d|d S d S )Nr   r   )r   find)ru   r   indexr   r   r   get_nn_module_class_from_kwargs  s
    

r   c                  O   s  t f |}d|kr"d|d kr"d S |}d|kr>d||d }tf |}|tkrTd S d|krf|d }nttj|}dt|krd S d|kr|d  }n|dd}tj	}d	|kr|d	  }t
|tjr|f}td
d |D rtj}n
|d f}d|kr||d  }d|kr ||d f }n,d|krLt|r<|f}||d  f }t||d\}}	tt|}
t|
}|
td ||f|
 |
  } }||fS )Nr   evalr   r   ZFunctionalModuleZconstructor_args_fnr   r   Zinput_fnc                 s   s   | ]}|  V  qd S r   )r4   )r   r    r   r   r   r     s     z<try_get_nn_module_compiled_mod_and_inputs.<locals>.<genexpr>r   r   Ztarget_sizeZ	target_fnr[   )r   rq   r   EXCLUDE_SCRIPT_MODULESgetattrr)   nnre   r   r2   r   r.   allr3   Z	is_tensorrC   r   r   r   )r   ru   r   r   r   r   Zinput_dtypeinputr   r   r   Zout_varmodr   r   r   )try_get_nn_module_compiled_mod_and_inputs  sL    







r   c                   C   s   t t t S r   )r   r   additional_module_testsr   r   r   r   get_all_nn_module_tests  s    r   )F)rF   )PZtorch.jit.annotationsr   r   Ztorch.nn.functionalr   rm   Fr)   Z
torch.cudaZ	torch.jitZtorch.jit._loggingZtorch.jit.frontendZ!torch.testing._internal.common_nnr   r   Z$torch.testing._internal.common_utilsr   collectionscopyr   typingr   r	   r
   r   mathZ
torch._sixr   Zset_default_dtyper2   LMSr   r   r   
namedtupler   rC   r    zerosZrandr,   ZonesrU   rR   randintZint64emptyZrandom_r*   rT   r6   r/   longrZ   viewZnn_functional_testsr   rh   rw   ry   r   r   r   r   r   r   ZEXCLUDE_SCRIPTr   r   r   r   r   r   r   r   r   r   r   r   r   r   r   <module>   s  C,04 "0,                                   &
 
"
* *"&     (""  ]		("'
%
	;