U
    9%ek                     @   s  d dl Zd dlmZmZ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 d dlZdd Zdd Zd	d
 Zdd Zdd Zdd Zdd Zdd Zdd Zdd Zdd Zdd Zdd Zdd  Zd!d" Z d#d$ Z!d%d& Z"d'd( Z#d)d* Z$d+d, Z%d-d. Z&d/d0 Z'd1d2 Z(d3d4 Z)d5d6 Z*d7d8 Z+d9d: Z,d;d< Z-d=d> Z.d?d@ Z/dAdB Z0dCdD Z1dEdF Z2dGdH Z3dIdJ Z4dKdL Z5dMdN Z6dOdP Z7dQdR Z8dSdT Z9dUdV Z:G dWdX dXeZ;e<dYkre=  dS )Z    N)skip_unless_cc_53unittestCUDATestCaseskip_on_cudasim)numpy_support)cudafloat32float64int32	vectorizevoidint64c                 C   s    t d}t| | ||< d S N   )r   gridmathacosABi r   `/var/www/html/Darija-Ai-API/env/lib/python3.8/site-packages/numba/cuda/tests/cudapy/test_math.py	math_acos   s    
r   c                 C   s    t d}t| | ||< d S r   )r   r   r   asinr   r   r   r   	math_asin   s    
r   c                 C   s    t d}t| | ||< d S r   )r   r   r   atanr   r   r   r   	math_atan   s    
r   c                 C   s    t d}t| | ||< d S r   )r   r   r   acoshr   r   r   r   
math_acosh   s    
r   c                 C   s    t d}t| | ||< d S r   )r   r   r   asinhr   r   r   r   
math_asinh   s    
r!   c                 C   s    t d}t| | ||< d S r   )r   r   r   atanhr   r   r   r   
math_atanh$   s    
r#   c                 C   s    t d}t| | ||< d S r   )r   r   r   cosr   r   r   r   math_cos)   s    
r%   c                 C   s    t d}t| | ||< d S r   )r   r   r   sinr   r   r   r   math_sin.   s    
r'   c                 C   s    t d}t| | ||< d S r   )r   r   r   tanr   r   r   r   math_tan3   s    
r)   c                 C   s    t d}t| | ||< d S r   )r   r   r   coshr   r   r   r   	math_cosh8   s    
r+   c                 C   s    t d}t| | ||< d S r   )r   r   r   sinhr   r   r   r   	math_sinh=   s    
r-   c                 C   s    t d}t| | ||< d S r   )r   r   r   tanhr   r   r   r   	math_tanhB   s    
r/   c                 C   s&   t d}t| | || ||< d S r   )r   r   r   atan2r   r   Cr   r   r   r   
math_atan2G   s    
r3   c                 C   s    t d}t| | ||< d S r   )r   r   r   expr   r   r   r   math_expL   s    
r5   c                 C   s    t d}t| | ||< d S r   )r   r   r   erfr   r   r   r   math_erfQ   s    
r7   c                 C   s    t d}t| | ||< d S r   )r   r   r   erfcr   r   r   r   	math_erfcV   s    
r9   c                 C   s    t d}t| | ||< d S r   )r   r   r   expm1r   r   r   r   
math_expm1[   s    
r;   c                 C   s    t d}t| | ||< d S r   )r   r   r   fabsr   r   r   r   	math_fabs`   s    
r=   c                 C   s    t d}t| | ||< d S r   )r   r   r   gammar   r   r   r   
math_gammae   s    
r?   c                 C   s    t d}t| | ||< d S r   )r   r   r   lgammar   r   r   r   math_lgammaj   s    
rA   c                 C   s    t d}t| | ||< d S r   )r   r   r   logr   r   r   r   math_logo   s    
rC   c                 C   s    t d}t| | ||< d S r   )r   r   r   log2r   r   r   r   	math_log2t   s    
rE   c                 C   s    t d}t| | ||< d S r   )r   r   r   log10r   r   r   r   
math_log10y   s    
rG   c                 C   s    t d}t| | ||< d S r   )r   r   r   log1pr   r   r   r   
math_log1p~   s    
rI   c                 C   s&   t d}t| | || ||< d S r   )r   r   r   	remainderr1   r   r   r   math_remainder   s    
rK   c                 C   s    t d}t| | ||< d S r   )r   r   r   sqrtr   r   r   r   	math_sqrt   s    
rM   c                 C   s&   t d}t| | || ||< d S r   )r   r   r   hypotr1   r   r   r   
math_hypot   s    
rO   c                 C   s&   t d}t| | || ||< d S r   )r   r   r   powr1   r   r   r   math_pow   s    
rQ   c                 C   s    t d}t| | ||< d S r   )r   r   r   ceilr   r   r   r   	math_ceil   s    
rS   c                 C   s    t d}t| | ||< d S r   )r   r   r   floorr   r   r   r   
math_floor   s    
rU   c                 C   s&   t d}t| | || ||< d S r   )r   r   r   copysignr1   r   r   r   math_copysign   s    
rW   c                 C   s&   t d}t| | || ||< d S r   )r   r   r   fmodr1   r   r   r   	math_fmod   s    
rY   c                 C   s(   t d}t| | \||< ||< d S r   )r   r   r   modfr1   r   r   r   	math_modf   s    
r[   c                 C   s    t d}t| | ||< d S r   )r   r   r   isnanr   r   r   r   
math_isnan   s    
r]   c                 C   s    t d}t| | ||< d S r   )r   r   r   isinfr   r   r   r   
math_isinf   s    
r_   c                 C   s    t d}t| | ||< d S r   )r   r   r   isfiniter   r   r   r   math_isfinite   s    
ra   c                 C   s    t d}t| | ||< d S r   )r   r   r   degreesr   r   r   r   math_degrees   s    
rc   c                 C   s    t d}t| | ||< d S r   )r   r   r   radiansr   r   r   r   math_radians   s    
re   c                 C   s    t d}t| | ||< d S r   )r   r   r   truncr   r   r   r   
math_trunc   s    
rg   c                 C   s"   t d}| | ||  ||< d S r   r   r   r1   r   r   r   math_pow_binop   s    
ri   c                 C   s"   t d}| | ||  ||< d S r   rh   r1   r   r   r   math_mod_binop   s    
rj   c                   @   sN  e Zd ZdddZdddZdddZdd
dZdddZdd Zdd Z	dd Z
dd ZdddZdddZdddZdddZdd  Zdd!d"Zdd#d$Zdd%d&Zdd'd(Zd)d* Zd+d, Zd-d. Zd/d0 Zd1d2 Zd3d4 Zd5d6 Zd7d8 Zed9d: Zed;ed<d= Z d>d? Z!d@dA Z"dBdC Z#dDdE Z$dFdG Z%dHdI Z&dJdK Z'dLdM Z(dNdO Z)dPdQ Z*dRdS Z+dTdU Z,dVdW Z-dXdY Z.dZd[ Z/d\d] Z0d^d_ Z1d`da Z2edbdcdd Z3dedf Z4dgdh Z5didj Z6dkdl Z7dmdn Z8dodp Z9dqdr Z:dsdt Z;edudvdw Z<dxdy Z=dzd{ Z>d|d} Z?d~d Z@dd ZAdd ZBdd ZCdd ZDdd ZEdS )TestCudaMathr   r   c                 C   s   |  ||tjtj|| d S N)unary_templatenpZfloat16selffuncnpfuncstartstopr   r   r   unary_template_float16   s    z#TestCudaMath.unary_template_float16c                 C   s   |  ||tjtj|| d S rl   rm   rn   r   ro   r   r   r   unary_template_float32   s    z#TestCudaMath.unary_template_float32c                 C   s   |  ||tjtj|| d S rl   rm   rn   r	   ro   r   r   r   unary_template_float64   s    z#TestCudaMath.unary_template_float642   c                 C   s   |  ||tjtj|| d S rl   )rm   rn   r   r	   ro   r   r   r   unary_template_int64   s    z!TestCudaMath.unary_template_int64c                 C   s   |  ||tjtj|| d S rl   )rm   rn   uint64r	   ro   r   r   r   unary_template_uint64   s    z"TestCudaMath.unary_template_uint64c                 C   s   d}t ||||}t ||}	t|d d d }
t|d d d }t|
|f|}|d|f ||	 |t jkrd}n|t j	krd}nd}t j
j|||	|d d S )Nrz   r   gvIh%<=ư>gMbP?rtol)rn   linspaceastype
empty_liker   
from_dtyper   jitr	   r   testingassert_allclose)rp   rq   rr   npdtype	nprestypers   rt   nelemr   r   arytyperestypecfuncr   r   r   r   rm      s    

zTestCudaMath.unary_templatec           
   	   C   s   t |}|jd }t jd||jdd|jt jt jg|d}t j|t jd}t	
|d d d td d d f|}	|	d|jf || t j||| |	d|jf | | t j|||  d S )N   g        g      ?g      ?dtyper   )rn   ZfinfoZtinyarraymaxinfnanr   r
   r   r   sizer   Zassert_array_equal)
rp   rq   rr   r   npmtypefiZdenormr   r   r   r   r   r   unary_bool_special_values   s    

&z&TestCudaMath.unary_bool_special_valuesc                 C   s   |  ||tjt d S rl   )r   rn   r   rp   rq   rr   r   r   r   !unary_bool_special_values_float32  s    z.TestCudaMath.unary_bool_special_values_float32c                 C   s   |  ||tjt d S rl   )r   rn   r	   r   r   r   r   !unary_bool_special_values_float64  s    z.TestCudaMath.unary_bool_special_values_float64c                 C   s   |  ||tjtj|| d S rl   rv   ro   r   r   r   unary_bool_template_float32  s    z(TestCudaMath.unary_bool_template_float32c                 C   s   |  ||tjtj|| d S rl   rx   ro   r   r   r   unary_bool_template_float64  s    z(TestCudaMath.unary_bool_template_float641   c                 C   s   |  ||tjtj|| d S rl   )rm   rn   r
   ro   r   r   r   unary_bool_template_int32  s    z&TestCudaMath.unary_bool_template_int32c                 C   s   |  ||tjtj|| d S rl   )rm   rn   r   ro   r   r   r   unary_bool_template_int64  s    z&TestCudaMath.unary_bool_template_int64c                 C   s   d}t ||||}t j|jt jd}	|d d d }
td d d }t|
|f|}|d|f ||	 t j	|||	 d S )Nrz   r   r   )
rn   r   r   emptyshaper
   r   r   r   r   )rp   rq   rr   r   r   rs   rt   r   r   r   ZiarytypeZoarytyper   r   r   r   unary_bool_template  s    z TestCudaMath.unary_bool_templatec                 C   s   |  ||tjtj|| d S rl   )binary_templatern   r   ro   r   r   r   binary_template_float32'  s    z$TestCudaMath.binary_template_float32c                 C   s   |  ||tjtj|| d S rl   )r   rn   r	   ro   r   r   r   binary_template_float64*  s    z$TestCudaMath.binary_template_float64c                 C   s   |  ||tjtj|| d S rl   )r   rn   r   r	   ro   r   r   r   binary_template_int64-  s    z"TestCudaMath.binary_template_int64c                 C   s   |  ||tjtj|| d S rl   )r   rn   r|   r	   ro   r   r   r   binary_template_uint640  s    z#TestCudaMath.binary_template_uint64c                 C   s   d}t ||||}t ||}	t|d d d }
t|d d d }t|
|
|f|}|d|f |||	 t j	||||	 d S )Nrz   r   )
rn   r   r   r   r   r   r   r   r   r   )rp   rq   rr   r   r   rs   rt   r   r   r   r   r   r   r   r   r   r   3  s    zTestCudaMath.binary_templatec                 C   sH   |  ttj | ttj | jttjddd | jttjddd d S Nr   rs   rt   )rw   r   rn   Zarccosry   r{   r}   rp   r   r   r   test_math_acos@  s    zTestCudaMath.test_math_acosc                 C   sH   |  ttj | ttj | jttjddd | jttjddd d S r   )rw   r   rn   Zarcsinry   r{   r}   r   r   r   r   test_math_asinK  s    zTestCudaMath.test_math_asinc                 C   s<   |  ttj | ttj | ttj | ttj d S rl   )rw   r   rn   Zarctanry   r{   r}   r   r   r   r   test_math_atanV  s    zTestCudaMath.test_math_atanc                 C   sT   | j ttjddd | jttjddd | jttjddd | jttjddd d S )Nr      r   )rw   r   rn   Zarccoshry   r{   r}   r   r   r   r   test_math_acosh_  s    zTestCudaMath.test_math_acoshc                 C   s<   |  ttj | ttj | ttj | ttj d S rl   )rw   r!   rn   Zarcsinhry   r{   r}   r   r   r   r   test_math_asinhh  s    zTestCudaMath.test_math_asinhc                 C   sT   | j ttjddd | jttjddd | jttjddd | jttjddd d S )Nr   g?r   )rw   r#   rn   Zarctanhry   r{   r}   r   r   r   r   test_math_atanhq  s    zTestCudaMath.test_math_atanhc                 C   s<   |  ttj | ttj | ttj | ttj d S rl   )rw   r%   rn   r$   ry   r{   r}   r   r   r   r   test_math_cosz  s    zTestCudaMath.test_math_cosc                 C   s   |  ttj |  ttj |  ttj | j ttj	dd | j t
tjdd | j ttjdd | j ttjdd |  ttj |  ttj |  ttj d S )Nr   rs   )ru   r'   rn   r&   r%   r$   r5   r4   rC   rB   rE   rD   rG   rF   r=   r<   rM   rL   rS   rR   rU   rT   r   r   r   r   test_math_fp16  s    zTestCudaMath.test_math_fp16z(numpy does not support trunc for float16c                 C   s   |  ttj d S rl   )ru   rg   rn   rf   r   r   r   r   test_math_fp16_trunc  s    z!TestCudaMath.test_math_fp16_truncc                 C   s<   |  ttj | ttj | ttj | ttj d S rl   )rw   r'   rn   r&   ry   r{   r}   r   r   r   r   test_math_sin  s    zTestCudaMath.test_math_sinc                 C   s<   |  ttj | ttj | ttj | ttj d S rl   )rw   r)   rn   r(   ry   r{   r}   r   r   r   r   test_math_tan  s    zTestCudaMath.test_math_tanc                 C   s<   |  ttj | ttj | ttj | ttj d S rl   )rw   r+   rn   r*   ry   r{   r}   r   r   r   r   test_math_cosh  s    zTestCudaMath.test_math_coshc                 C   s<   |  ttj | ttj | ttj | ttj d S rl   )rw   r-   rn   r,   ry   r{   r}   r   r   r   r   test_math_sinh  s    zTestCudaMath.test_math_sinhc                 C   s<   |  ttj | ttj | ttj | ttj d S rl   )rw   r/   rn   r.   ry   r{   r}   r   r   r   r   test_math_tanh  s    zTestCudaMath.test_math_tanhc                 C   s<   |  ttj | ttj | ttj | ttj d S rl   )r   r3   rn   Zarctan2r   r   r   r   r   r   r   test_math_atan2  s    zTestCudaMath.test_math_atan2c                 C   s@   t dd }| t| | t| | t| | t| d S )Nc                 S   s
   t | S rl   )r   r6   xr   r   r   ufunc  s    z)TestCudaMath.test_math_erf.<locals>.ufunc)r   rw   r7   ry   r{   r}   rp   r   r   r   r   test_math_erf  s    
zTestCudaMath.test_math_erfc                 C   s@   t dd }| t| | t| | t| | t| d S )Nc                 S   s
   t | S rl   )r   r8   r   r   r   r   r     s    z*TestCudaMath.test_math_erfc.<locals>.ufunc)r   rw   r9   ry   r{   r}   r   r   r   r   test_math_erfc  s    
zTestCudaMath.test_math_erfcc                 C   s<   |  ttj | ttj | ttj | ttj d S rl   )rw   r5   rn   r4   ry   r{   r}   r   r   r   r   test_math_exp  s    zTestCudaMath.test_math_expc                 C   s<   |  ttj | ttj | ttj | ttj d S rl   )rw   r;   rn   r:   ry   r{   r}   r   r   r   r   test_math_expm1  s    zTestCudaMath.test_math_expm1c                 C   sL   | j ttjdd | jttjdd | jttjdd | jttjdd d S Nr   r   )rw   r=   rn   r<   ry   r{   r}   r   r   r   r   test_math_fabs  s    zTestCudaMath.test_math_fabsc                 C   sP   t dd }| jt|dd | jt|dd | jt|dd | jt|dd d S )Nc                 S   s
   t | S rl   )r   r>   r   r   r   r   r     s    z+TestCudaMath.test_math_gamma.<locals>.ufunc皙?r   r   )r   rw   r?   ry   r{   r}   r   r   r   r   test_math_gamma  s    
zTestCudaMath.test_math_gammac                 C   sP   t dd }| jt|dd | jt|dd | jt|dd | jt|dd d S )Nc                 S   s
   t | S rl   )r   r@   r   r   r   r   r     s    z,TestCudaMath.test_math_lgamma.<locals>.ufuncr   r   r   )r   rw   rA   ry   r{   r}   r   r   r   r   test_math_lgamma
  s    
zTestCudaMath.test_math_lgammac                 C   sL   | j ttjdd | jttjdd | jttjdd | jttjdd d S Nr   r   )rw   rC   rn   rB   ry   r{   r}   r   r   r   r   test_math_log  s    zTestCudaMath.test_math_logc                 C   sL   | j ttjdd | jttjdd | jttjdd | jttjdd d S r   )rw   rE   rn   rD   ry   r{   r}   r   r   r   r   test_math_log2  s    zTestCudaMath.test_math_log2c                 C   sL   | j ttjdd | jttjdd | jttjdd | jttjdd d S r   )rw   rG   rn   rF   ry   r{   r}   r   r   r   r   test_math_log10(  s    zTestCudaMath.test_math_log10c                 C   s<   |  ttj | ttj | ttj | ttj d S rl   )rw   rI   rn   rH   ry   r{   r}   r   r   r   r   test_math_log1p1  s    zTestCudaMath.test_math_log1pc                 C   sL   | j ttjdd | jttjdd | jttjdd | jttjdd d S )Ngdy=r   r   )r   rK   rn   rJ   r   r   r   r   r   r   r   test_math_remainder:  s    z TestCudaMath.test_math_remainderz3math.remainder(0, 0) raises a ValueError on CUDASimc                 C   sZ   t ttd d d ttdd }tdtj}|d |dd | t|d  d S )Nr   c                 S   s   t ||| d< d S )Nr   )r   rJ   )rr   yr   r   r   test_0_0B  s    z6TestCudaMath.test_math_remainder_0_0.<locals>.test_0_0)r   r   r   )	r   r   r   r	   r   rn   Zzeros
assertTruer\   )rp   r   r   r   r   r   test_math_remainder_0_0@  s
    
z$TestCudaMath.test_math_remainder_0_0c                 C   s<   |  ttj | ttj | ttj | ttj d S rl   )rw   rM   rn   rL   ry   r{   r}   r   r   r   r   test_math_sqrtL  s    zTestCudaMath.test_math_sqrtc                 C   s<   |  ttj | ttj | ttj | ttj d S rl   )r   rO   rn   rN   r   r   r   r   r   r   r   test_math_hypotU  s    zTestCudaMath.test_math_hypotc           
      C   s   d}t dd||}t j|t jd}t |}t|d d d }t	|td d d |ft
}|d|f ||| t |}tt|D ]}	t||	 ||	 ||	< qt jjt ||||dd d S )Nrz   r      r   r   r~   r   )rn   r   r   Zaranger
   r   r   r   r   r   rQ   rangelenr   rP   r   r   power)
rp   r   r   r   r   r2   r   r   ZCrefr   r   r   r   pow_template_int32^  s    

zTestCudaMath.pow_template_int32c                 C   s8   |  ttj | ttj | tj | tj d S rl   )r   rQ   rn   r   r   r   r   r	   r   r   r   r   test_math_powo  s    zTestCudaMath.test_math_powc                 C   s    |  ttj | ttj d S rl   )r   ri   rn   r   r   r   r   r   r   test_math_pow_binopx  s    z TestCudaMath.test_math_pow_binopc                 C   s<   |  ttj | ttj | ttj | ttj d S rl   )rw   rS   rn   rR   ry   r{   r}   r   r   r   r   test_math_ceil  s    zTestCudaMath.test_math_ceilc                 C   s<   |  ttj | ttj | ttj | ttj d S rl   )rw   rU   rn   rT   ry   r{   r}   r   r   r   r   test_math_floor  s    zTestCudaMath.test_math_floorc                 C   s   |  ttj d S rl   )ry   rg   rn   rf   r   r   r   r   test_math_trunc  s    zTestCudaMath.test_math_truncz%trunc only supported on NumPy float64c                 C   s.   |  ttj | ttj | ttj d S rl   )rw   rg   rn   rf   r{   r}   r   r   r   r   test_math_trunc_non_float64  s    z(TestCudaMath.test_math_trunc_non_float64c                 C   s(   | j ttjdd | jttjdd d S r   )r   rW   rn   rV   r   r   r   r   r   test_math_copysign  s    zTestCudaMath.test_math_copysignc              	      sd   fdd} fdd}d}  d( |tdd|tjtd d  d	 W 5 Q R X   d
. |ttjtj gtjtd d  d	 W 5 Q R X   d |tjtd d  d	 W 5 Q R X   d( |tdd|tjtd d  d	 W 5 Q R X   d. |ttjtj gtjtd d  d	 W 5 Q R X   d |tjtd d  d	 W 5 Q R X d S )Nc                    sv   t jt jg| d}t |}t |}t|||ft}|dt|f |||  t 	|  t 	| d S )Nr   r   )
rn   r   r   
zeros_liker   r   r[   r   r   r\   )r   r   r   r   r2   r   r   r   r   modf_template_nan  s    

z6TestCudaMath.test_math_modf.<locals>.modf_template_nanc                    s   |  |} t| }t| }t|||ft}|dt| f | || t| \}} t	||  t	|| d S r   )
r   rn   r   r   r   r[   r   rZ   r   Zarray_equal)r   r   r   r   r2   r   DEr   r   r   modf_template_compare  s    


z:TestCudaMath.test_math_modf.<locals>.modf_template_comparerz   zfloat32 modf on simple floatr   
   )r   r   zfloat32 modf on +- infinityzfloat32 modf on nanzfloat64 modf on simple floatzfloat64 modf on +- infinityzfloat64 modf on nan)ZsubTestrn   r   r   r   r   r	   )rp   r   r   r   r   r   r   test_math_modf  s.    	


 

zTestCudaMath.test_math_modfc                 C   s(   | j ttjdd | jttjdd d S r   )r   rY   rn   rX   r   r   r   r   r   test_math_fmod  s    zTestCudaMath.test_math_fmodc                 C   s(   | j ttjdd | jttjdd d S r   )r   rj   rn   rX   r   r   r   r   r   test_math_mod_binop  s    z TestCudaMath.test_math_mod_binopc                 C   sX   |  ttj | ttj | ttj | ttj | ttj | ttj d S rl   )	r   r]   rn   r\   r   r   r   r   r   r   r   r   r   test_math_isnan  s    zTestCudaMath.test_math_isnanc                 C   sX   |  ttj | ttj | ttj | ttj | ttj | ttj d S rl   )	r   r_   rn   r^   r   r   r   r   r   r   r   r   r   test_math_isinf  s    zTestCudaMath.test_math_isinfc                 C   sX   |  ttj | ttj | ttj | ttj | ttj | ttj d S rl   )	r   ra   rn   r`   r   r   r   r   r   r   r   r   r   test_math_isfinite  s    zTestCudaMath.test_math_isfinitec                 C   s    |  ttj | ttj d S rl   )r   rc   rn   rb   r   r   r   r   r   test_math_degrees  s    zTestCudaMath.test_math_degreesc                 C   s    |  ttj | ttj d S rl   )r   re   rn   rd   r   r   r   r   r   test_math_radians  s    zTestCudaMath.test_math_radiansN)r   r   )r   r   )r   r   )r   rz   )r   rz   )r   r   )r   r   )r   r   )r   r   )r   r   )r   r   )r   rz   )r   rz   )F__name__
__module____qualname__ru   rw   ry   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   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      s   













				
													
				
,rk   __main__)>numpyrn   Znumba.cuda.testingr   r   r   r   Znumba.npr   Znumbar   r   r	   r
   r   r   r   r   r   r   r   r   r!   r#   r%   r'   r)   r+   r-   r/   r3   r5   r7   r9   r;   r=   r?   rA   rC   rE   rG   rI   rK   rM   rO   rQ   rS   rU   rW   rY   r[   r]   r_   ra   rc   re   rg   ri   rj   rk   r   mainr   r   r   r   <module>   sh   $    =
