o
    $jx                  	   @   s  d Z ddlZddlZddlZddlmZ ddlmZ ddl	m
Z
mZ ddlm  mZ ddlmZ ddlZddlmZ ddlmZ ddlmZmZ ejd	d
 Zej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d Z&dd Z'dd  Z(d!d" Z)d#d$ Z*d%d& Z+d'd( Z,d)d* Z-ej.j/d+d,d-d. Z0ej.j/d+d,d/d0 Z1d1d2 Z2d3d4 Z3d5d6 Z4d7d8 Z5e6d9d:d; Z7d<d= Z8d>d? Z9ej.:d@ej;e<dAe=dAdej>gdBdC Z?ej.:dDdEdFgdGdH Z@dIdJ ZAdKdL ZBdMdN ZCej.:dOdEdFgdPdQ ZDej.:dOdEdFgdRdS ZEej.:dTdUdVgej.:dOdEdFgdWdX ZFej.:dTdUdVgej.:dYejGejHgdZd[ ZId\d] ZJd^d_ ZKej.Ld`dadb ZMej.Ld`dcdd ZNej.Ld`dedf ZOdgdh ZPdidj ZQej.:dkg dleHg dmfg dneHg dofgdpdq ZRdrds ZSdtdu ZTej.:dvejUejVej<gdwdx ZWdydz ZXd{d| ZYd}d~ ZZdd Z[dd Z\dd Z]dd Z^dd Z_ej.:dYejGejHgdd Z`dS )z
This module tests the functionality of StringArray and ArrowStringArray.
Tests for the str accessors are in pandas/tests/strings/test_string_array.py
    N)using_string_dtype)HAS_PYARROW)pa_version_under12p0pa_version_under19p0)is_dtype_equal)StringArrayNumpySemantics)ArrowStringArrayArrowStringArrayNumpySemanticsc                 C      | \}}t j||dS )zKFixture giving StringDtype from parametrized storage and na_value argumentsstoragena_valuepdStringDtype)Zstring_dtype_argumentsr   r    r   h/var/www/html/Deteccion_Ine/venv/lib/python3.10/site-packages/pandas/tests/arrays/string_/test_string.pydtype   s   r   c                 C   r
   )Nr   r   )Zstring_dtype_arguments2r   r   r   r   r   dtype2%   s   r   c                 C   s   |   S )z3Fixture giving array type from parametrized 'dtype')Zconstruct_array_typer   r   r   r   cls+   s   r   c                 C   s   t r!tjdtjdtjdtjdtjdtjdtjdtjdg}ntjdtjdtjdtjdg}|| }||}|t|| S )Npythonr   pyarrow)r   r   r   npnanNAindexmax)dtype1r   ZDTYPE_HIERARCHYZh1h2r   r   r   string_dtype_highest_priority1   s   

r!   c                  C   sZ   t d tt td} W d    n1 sw   Y  | tjdtjdks+J d S )Nr   Zpyarrow_numpyr   )	pytestimportorskiptmassert_produces_warningFutureWarningr   r   r   r   r   r   r   r   test_dtype_constructorD   s
   
r'   c                  C   s   t d td} td}tjdtjd}| tjdtjdks#J | |ks)J | |ks/J |tjdtjdks;J || ksAJ ||ksGJ |tjdtjdksSJ |tjdtddks`J || ksfJ ||kslJ d S )Nr   r   r   r   )r"   r#   r   r   r   r   r   float)r   r   Zdtype3r   r   r   test_dtype_equalityL   s   


r)   c                 C   s  t dt jdt jdg| di}| jtju rd}nd}t||ks#J | jtju r,d}nd}t|j|ks7J | j	d	krK| jt ju rKd
}d| d}n0| j	d	kr_| jtju r_d}d| d}n| j	dkrs| jtju rsd}d| d}nd}d| d}t|jj|ksJ d S )NAabr   z     A
0    a
1  NaN
2    bz      A
0     a
1  <NA>
2     bz.0      a
1    NaN
2      b
Name: A, dtype: strz40       a
1    <NA>
2       b
Name: A, dtype: stringr   r   <z+>
['a', <NA>, 'b']
Length: 3, dtype: stringr	   z'>
['a', nan, 'b']
Length: 3, dtype: strr   r   StringArray)
r   	DataFramearrayr   r   r   r   reprr*   r   )r   dfexpectedZarr_namer   r   r   	test_repra   s*    r4   c                 C   sr   | j dkr| jtju rt| dksJ d S t| dksJ d S | jtju r/t| dks-J d S t| dks7J d S )Nr   zstring[pyarrow]z<StringDtype(na_value=nan)>zstring[python]z-<StringDtype(storage='python', na_value=nan)>)r   r   r   r   r1   r   r   r   r   test_dtype_repr~   s   
r5   c                 C   s:   | j g d|d}|d d usJ |d |jju sJ d S )N)r+   Nr,   r      )_from_sequencer   r   )r   r   r+   r   r   r   test_none_to_nan   s   r8   c                 C   s   | j ddg|d}d}tjt|d d|d< W d    n1 s!w   Y  d}tjt|d td	d
g|d d < W d    d S 1 sFw   Y  d S )Nr+   r,   r   z!Invalid value '10' for dtype 'strmatch
   r   zInvalid value for dtype 'strr6      )r7   r"   raises	TypeErrorr   r0   )r   r   arrmsgr   r   r   test_setitem_validates   s   
"rA   c                 C   s<   t jddg| d}d|d< t jddg| d}t|| d S )Nr+   cr   dr   r   r0   r$   assert_extension_array_equal)r   r?   r3   r   r   r   test_setitem_with_scalar_string   s   rF   c                 C   sf   t jg d| d}tdd g}| }||ddg< t jdt jdg| d}t|| t|| d S )Nr+   r,   rB   r   r*   r   r6   rB   )r   r0   r   copyr   r$   rE   assert_numpy_array_equal)r   r?   valueZ
value_origr3   r   r   r   $test_setitem_with_array_with_missing   s   rK   c                 C   s   t t jddd}d |d< || }t|j| sJ |d}t|| ||jd  }|| }t|j| s:J ||j}t|| d S )N2000   )Zperiodsr   zdatetime64[ns])	r   SeriesZ
date_rangeastyper   r   r$   assert_series_equalZiloc)r   serZcastedresultZser2Zcasted2result2r   r   r   test_astype_roundtrip   s   


rU   c                 C   s   t jg d| d}t jg d| d}|| }t jg d| d}t|| ||}t|| ||}t jg d| d}t|| |j|dd}t jg d| d}t|| d S )	N)r+   r,   rB   NNr   )xyNzN)axbyNNN)xaybNNN-)
fill_value)rY   rZ   zc-z-zN)r   rO   r$   rQ   addZradd)r   r+   r,   rS   r3   r   r   r   test_add   s   

r`   c                 C   s   | j dkrd}tjjd |d}|| tjg d| d}tjg dgtd}tj	t
dd ||  W d    n1 s=w   Y  t|}tj	t
dd ||  W d    d S 1 s^w   Y  d S )Nr   z*Failed: DID NOT RAISE <class 'ValueError'>r=   reasonrG   r   z3 != 1r9   )r   r"   markxfailapplymarkerr   r0   r   objectr=   
ValueErrorrO   )r   requestrb   rc   r+   r,   sr   r   r   test_add_2d   s   




"rj   c                 C   sj   t jg d| d}g d}|| }t jg d| d}t|| || }t jg d| d}t|| d S )N)r+   r,   NNr   )rV   NrW   N)rY   NNN)r[   NNNrD   )r   r+   otherrS   r3   r   r   r   test_add_sequence   s   rl   c                 C   sP   t jg d| d}|d }t jg d| d}t|| d| }t|| d S )Nr+   r,   Nr   r<   )aabbNrD   )r   r+   rS   r3   r   r   r   test_mul   s   rp   zGH-28527)rb   c                 C   s   t jg d| d}t jg dgtd}||tu sJ || }t g dg| }t|| || }t g dg| }t|| d S )N)r+   r,   rB   rC   r   )trW   vw)atrZ   ZcvZdw)tar\   vcwd)	r   r0   r/   rf   __add__NotImplementedrP   r$   assert_frame_equalr   r?   r2   rS   r3   r   r   r   test_add_strings   s   r|   c                 C   s   t jddtjtjg| d}t dtjdtjgg}||tu s"J || }t dtjtjtjgg| }t	|| || }t dtjtjtjgg| }t	|| d S )Nr+   r,   r   rV   rW   rY   r[   )
r   r0   r   r   r/   rx   ry   rP   r$   rz   r{   r   r   r   test_add_frame  s     r}   c                    s   d| j  d tjg d|d}dt| }|jtju rFt fdd|D }| tjkr6d|d< nd	|d< t	
||tj d S |jd
krMdnd}tj fdd|D td}tj||d}t	|| d S )N__r+   NrB   r   r+   c                       g | ]	}t | qS r   getattr.0itemop_namerk   r   r   
<listcomp>%      z2test_comparison_methods_scalar.<locals>.<listcomp>Tr6   Fr   boolean[pyarrow]booleanc                    r   r   r   r   r   r   r   r   -  r   )__name__r   r0   r   r   r   r   operatorner$   rI   rP   Zbool_r   rf   rE   )comparison_opr   r+   rS   r3   expected_dtyper   r   r   test_comparison_methods_scalar  s   

r   c                 C   s   d| j  d}tjg d|d}t||tj}|jtju r:tj	| kr+tg d}ntg d}t
|| d S |jdkrAdnd}tjg d	|d}t
|| t
|| d S )
Nr~   r   r   TTTFFFr   r   r   )NNN)r   r   r0   r   r   r   r   r   r   r   r$   rI   r   rE   )r   r   r   r+   rS   r3   r   r   r   r   $test_comparison_methods_scalar_pd_na2  s   
r   c           	      C   s   d| j  d}tjg d|d}d}|dvr7tjtdd t||| W d    d S 1 s0w   Y  d S t|||}|jtj	u r\g dg d	d| }t|}t
|| d S g d
g dd| }|jdkrndnd}tj||d}t
|| d S )Nr~   r   r   *   )__eq____ne__z(Invalid comparison|not supported betweenr9   r   r   )FNF)TNTr   r   r   )r   r   r0   r"   r=   r>   r   r   r   r   r$   rI   r   rE   )	r   r   r   r+   rk   rS   Zexpected_datar3   r   r   r   r   )test_comparison_methods_scalar_not_stringD  s2   

r   c                 C   s&  d| j  d}tjg d|d}tjg d|d}| ||}| ||}t|| |jtju r^|jtju r^tj	| krBtg d}ntg d}t
|d ||d |d< t|| d S t||}	|	jdkrkd	}
nd
}
tjt|d dd}t
|d ||d |d< tj||
d}t|| d S )Nr~   r   r   NNrB   TTFr   rN   r   r   bool[pyarrow]rf   r^   r   )r   r   r0   r$   assert_equalr   r   r   r   r   r   rI   r!   r   fulllenrE   )r   r   r   r   r+   rk   rS   rT   r3   Z	max_dtyper   r   r   r   test_comparison_methods_arrayb  s(   




r   r   c           
      C   s   dd l }d| j d}t| }tjg d|d}tjg d|d}| ||}| ||}t|| tjg ddd}	t|d ||d |	d< t	||	 d S )	Nr   r~   r   r   r   )NNTr   rN   )
r   r   r   
ArrowDtypestringr0   r$   r   r   rE   )
r   r   par   r   r+   rk   rS   rT   r3   r   r   r   -test_comparison_methods_array_arrow_extension  s   

r   c           	      C   s  d| j  d}tjg d|d}g d}| ||}| ||}t|| |jtju rStj	| kr7tg d}ntg d}t
|d ||d |d< t|| d S |jdkrZd	nd
}tjt|d dd}t
|d ||d |d< tj||d}t|| d S )Nr~   r   r   r   r   r   rN   r   r   r   rf   r   )r   r   r0   r$   r   r   r   r   r   r   r   rI   r   r   r   rE   )	r   r   r   r+   rk   rS   rT   r3   r   r   r   r   test_comparison_methods_list  s"   


r   c                 C   sX  | t jju r	d}n	| tu rd}nd}tjt|d | tjddgdd W d    n1 s/w   Y  tjt|d | tg  W d    n1 sMw   Y  | t jju s\| tu rt| tjdtj	gt
d | tjdd gt
d nEtjt|d | tjdtj	gt
d W d    n1 sw   Y  tjt|d | tjdd gt
d W d    n1 sw   Y  tjt|d | tjdt jgt
d W d    n1 sw   Y  tjt|d | tjdtd	d
gt
d W d    n1 sw   Y  tjt|d | tjdtd	d
gt
d W d    d S 1 s%w   Y  d S )Nz7StringArray requires a sequence of strings or pandas.NAz?StringArrayNumpySemantics requires a sequence of strings or NaNzBUnsupported type '<class 'numpy.ndarray'>' for ArrowExtensionArrayr9   r+   r,   ZS1r   NaTns)r   arraysr.   r   r"   r=   rg   r   r0   r   rf   r   Z
datetime64Ztimedelta64)r   r@   r   r   r   test_constructor_raises  s:     $r   nar   c                 C   s>   t jtdt jg}tt jtjd| gdd| d S )Nr+   rf   r   )r   r   r.   r   r0   r   r$   rE   )r   r3   r   r   r   test_constructor_nan_like  s   r   rH   TFc           	      C   s   t jdt jgtd}| }t jdtjgtd}|j||| d}|tt	fv r7dd l
}||j|| dd}n|tu r@||}n||}t|| t|| d S )Nr+   r   )r   rH   r   TtypeZfrom_pandas)r   r0   r   rf   rH   r   r   r7   r   r	   r   r   r   r$   rE   rI   )	rH   r   r   Znan_arrZexpected_inputZna_arrrS   r   r3   r   r   r   test_from_sequence_no_mutate  s   
r   c                 C   s   t jg d| d}|d}tjg ddd}t|| t jdt jdg| d}| jtju r3t	}d}nt
}d}tj||d	 |d W d    d S 1 sOw   Y  d S )
N)123r   int64r6   r<      r   r   z#cannot convert float NaN to integerzJint\(\) argument must be a string, a bytes-like object or a( real)? numberr9   )r   r0   rP   r   r$   rI   r   r   r   rg   r>   r"   r=   )r   r?   rS   r3   errr@   r   r   r   test_astype_int  s   
"r   c                 C   sF   t jdt jdg| d}|d}t jdt jdgdd}t|| d S )Nr   r   r   Int64r6   r   )r   r0   r   rP   r$   rE   r   r?   rS   r3   r   r   r   test_astype_nullable_int  s   
r   c                 C   sF   t jdt jdg| d}||}t jdtjdg|d}t|| d S )Nz1.1z3.3r   g?gffffff
@)r   rO   r   rP   r   r   r$   rQ   )r   Zany_float_dtyperR   rS   r3   r   r   r   test_astype_float  s   
r   skipnac                 C   s.   t jg d|d}|j| d}|dksJ d S )NrG   r   r   abc)r   rO   sumr   r   r?   rS   r   r   r   test_reduce  s   r   c                 C   sD   t jg d|d}|j| d}| r|dksJ d S t |s J d S )N)Nr+   Nr,   rB   Nr   r   r   )r   rO   r   isnar   r   r   r   test_reduce_missing  s
   r   methodminr   c                 C   sZ   t jg d|d}t|| |d}|r#| dkrdnd}||ks!J d S ||jju s+J d S )Nr+   r,   rB   Nr   r   r   r+   rB   )r   rO   r   r   r   )r   r   r   r?   rS   r3   r   r   r   test_min_max&  s   r   boxc           	      C   s   |j dkr!|tju r!|tju rd}nd}tjjt|d}|| |g d|d}tt	| |}| dkr6dnd	}||ks>J d S )
Nr   z<'<=' not supported between instances of 'str' and 'NoneType'z0'ArrowStringArray' object has no attribute 'max'ra   r   r   r   r+   rB   )
r   r   r0   r"   rc   rd   r>   re   r   r   )	r   r   r   rh   rb   rc   r?   rS   r3   r   r   r   test_min_max_numpy2  s   

r   c                 C   s   t jdt jg| d}|jdd}t jddg| d}t|| |jtdd}t jddg| d}t|| d}tj	t
|d |jdd W d    d S 1 sRw   Y  d S )Nr+   r   r,   )rJ    Invalid value '1' for dtype 'strr9   r6   )r   r0   r   Zfillnar$   rE   r   str_r"   r=   r>   )r   r?   resr3   r@   r   r   r   test_fillna_argsC  s   "r   c                 C   s   t d}dd lm} tjg d| d}||}|jt|| dd}| jdkr1t	r1|
|}| jdkr>||| }||sEJ d S )Nr   r   rG   r   Tr   r   )r"   r#   Zpyarrow.computeZcomputer   r0   listlarge_stringr   r   chunked_arraycastr   equals)r   r   Zpcdatar?   r3   r   r   r   test_arrow_arrayU  s   



r   z0ignore:Passing a BlockManager:DeprecationWarningc           	      C   s6  t d}tjg d| d}td|i}||}| jdkr*|djdks)J n
|djdks4J t	d| |
 }W d    n1 sIw   Y  | jtju ra|sa|d jd	ks_J d S t|d jtjslJ |tj|| jd
}|r|jtj|tjd
|_t|| |jd |d jju sJ d S )Nr   rm   r   r+   r   r   r   string_storagerf   r   )r<   r+   )r"   r#   r   r0   r/   tabler   fieldr   option_context	to_pandasr   r   r   r   
isinstancer   rP   columnsr$   rz   loc	r   r   using_infer_stringr   r   r2   r   rS   r3   r   r   r   test_arrow_roundtripd  s(   



r   c                 C   sx   t d}|d|jg d| di}| }| r)ts)tjdg didd}ntjdg didd}t	
|| d S )Nr   r+   rm   r   strr   rf   )r"   r#   r   r0   r   r   r   r   r/   r$   rz   )r   r   r   rS   r3   r   r   r   test_arrow_from_string  s   
 r   c           	      C   s:  t d}tjg | d}td|i}||}| jdkr(|djdks'J n
|djdks2J |j|j	g |
 dg|jd}td	| | }W d    n1 sWw   Y  | jtju rpt sp|d jd
ksnJ d S t|d jtjs{J |tj|| jd}|r|jtj|tjd|_t|| d S )Nr   r   r+   r   r   r   r   )schemar   rf   r   )r"   r#   r   r0   r/   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   rP   r   r$   rz   r   r   r   r    test_arrow_load_from_zero_chunks  s(   


 
r   c                 C   s   | j tju r	d}n
| jdkrd}nd}tjdddtjg| d}|jdd	}tjg d
|g d |dd}t	
|| |jdd	}tjddg|d d |dd}t	
|| d S )Nr   r   int64[pyarrow]r   r+   r,   r   F)Zdropna)r<   r6   r6   )r   r6   r   countr   r   nameTr<   r6   )r   r   r   r   r   r0   r   value_countsrO   r$   rQ   )r   	exp_dtyper?   rS   r3   r   r   r   test_value_counts_na  s   
r   c                 C   s~   | j tju r
tj}n
| jdkrd}nd}tjdddtjg| d}|jdd}tjd	d
g|d d	 |ddd }t	
|| d S )Nr   zdouble[pyarrow]ZFloat64r+   r,   r   T)	normalizer<   r6   Z
proportionr   r   )r   r   r   float64r   r   rO   r   r   r$   rQ   r   r   rR   rS   r3   r   r   r    test_value_counts_with_normalize  s   
"r   zvalues, expectedrG   r   rm   )FFTc              	   C   s   t j| |d} d}tjt|dU t dd6 |  }t|| t |  }t |}t	|| t 
|  }t 
|}t|| W d    n1 sPw   Y  W d    d S W d    d S 1 shw   Y  d S )Nr   z"use_inf_as_na option is deprecatedr9   zmode.use_inf_as_naT)r   r0   r$   r%   r&   r   r   rI   rO   rQ   r/   rz   )valuesr3   r   r@   rS   r   r   r   test_use_inf_as_na  s    	

"r   c                 C   sr   | j tju r	d}n
| jdkrd}nd}tjg d| d}|jdd}tjg d	|d d
 |dd}t|| d S )Nr   r   r   r   )r+   r,   rB   r,   r   F)sort)r6   r<   r6   r   r   r   )	r   r   r   r   r   rO   r   r$   rQ   r   r   r   r   test_value_counts_sort_false  s   
r   c                 C   sf   | j dkrtd| j   tjg d| d}d|j  k r.|   kr.|jddk s1J  J d S )Nr   znot applicable for rG   r   r   T)deep)r   r"   skipr   rO   nbytesZmemory_usage)r   Zseriesr   r   r   test_memory_usage  s   
8r   float_dtypec                 C   s:   t jdg| d}||}t jdg|d}t|| d S )Ng?r   z0.1)r   rO   rP   r$   rQ   )r   r   rR   rS   r3   r   r   r   test_astype_from_float_dtype  s   
r   c                 C   sF   t jdt jdg| d}t|}tjd| jdgtd}t|| d S )Nr+   r,   r   )r   r0   r   r   r   rf   r$   rI   r   r   r   r   "test_to_numpy_returns_pdna_default  s   
r   c                 C   sJ   |}t jdt jdg| d}|j|d}tjd|dgtd}t|| d S )Nr+   r,   r   r   )r   r0   r   Zto_numpyr   rf   r$   rI   )r   Znulls_fixturer   r?   rS   r3   r   r   r   test_to_numpy_na_value  s
   r   c                 C   s   t jg d| d}|ddg}t g d}t|| |dt jg}t g d}t|| |g }t g d}t|| |d|g}t g d}t|| ||g}t g d}t|| d S )Nrm   r   r+   rB   TFFTFTr   )r   rO   isinr$   rQ   r   )r   Zfixed_now_tsri   rS   r3   r   r   r   	test_isin  s    
r   c                 C   sz   t jg d| d}|t jddg|d}t g d}t|| |t jdd g|d}t g d}t|| d S )Nrm   r   r+   rB   r   r   )r   rO   r   r0   r$   rQ   )r   r   ri   rS   r3   r   r   r   test_isin_string_array+  s   r   c                 C   s   t d}tjg d| d}|tjddgt| d}tg d}t	|| |tjdd gt| d}tg d}t	|| d S )Nr   rm   r   r+   rB   r   r   )
r"   r#   r   rO   r   r0   r   r   r$   rQ   )r   r   ri   rS   r3   r   r   r   test_isin_arrow_string_array7  s   
""r   c                 C   s   t jg d| d}tg d}d ||< |jd |jju sJ t jg d| d}d}tjt|d d||< W d    d S 1 sAw   Y  d S )NrG   r   )FTFr6   r   r9   )	r   rO   r   r0   r   r   r"   r=   r>   )r   rR   maskr@   r   r   r   (test_setitem_scalar_with_mask_validationD  s   
"r  c                 C   sD   g d}t j|t jd}tj|| d}tj|| d}t|| d S NrG   r   )r   r0   r   r   r$   rE   r   valsr?   rS   r3   r   r   r   test_from_numpy_strU  s
   r  c                 C   s2   g d}t j|| d}| }|}t|| d S r  )r   r0   tolistr$   r   r  r   r   r   test_tolist]  s
   r  c                 C   s   |g d| d}t dd dd}||}|tju rtjnt j}|g dtd}t|| t dd dd}||}|g d| d}| jd	kr^|tju rWt jg dtd}ntg d}t|| d S )
N)r+   ro   cccr   c                 S   s   t | S )N)r   rV   r   r   r   <lambda>j      z(test_numpy_array_ufunc.<locals>.<lambda>r6   r   c                 S   s   | d S )Nr<   r   r
  r   r   r   r  r  r  )rn   ZbbbbZccccccr   )	r   Z
frompyfuncr   rO   r0   rf   r$   r   r   )r   r   r?   Zstr_len_ufuncrS   Zexpected_clsr3   Zstr_multiply_ufuncr   r   r   test_numpy_array_ufunce  s   

r  )a__doc__r   numpyr   r"   Zpandas._configr   Zpandas.compatr   Zpandas.compat.pyarrowr   r   Zpandas.util._test_decoratorsutilZ_test_decoratorstdZpandas.core.dtypes.commonr   Zpandasr   Zpandas._testingZ_testingr$   Zpandas.core.arrays.string_r   Zpandas.core.arrays.string_arrowr   r	   Zfixturer   r   r   r!   r'   r)   r4   r5   r8   rA   rF   rK   rU   r`   rj   rl   rp   rc   rd   r|   r}   r   r   r   r   Z
skip_if_nor   r   r   Zparametrizer   r   r(   r   r   r   r   r   r   r   r   r   rO   r0   r   r   r   filterwarningsr   r   r   r   r   r   r   r   Zfloat16Zfloat32r   r   r   r   r   r   r  r  r  r  r   r   r   r   <module>   s    


	


 
$#



	








