U
    ¾mœdV  ã                   @   s¨   d Z ddlZddlZddlm  mZ ddlm	Z	m
Z
mZmZmZmZ ddlmZ ddlmZmZ ejdd„ ƒZdd„ ZejG d	d
„ d
eƒƒZejG dd„ deƒƒZdS )z$ Test cases for misc plot functions é    N)Ú	DataFrameÚIndexÚSeriesÚ	TimestampÚinterval_rangeÚplotting)ÚTestPlotBaseÚ_check_plot_worksc               	   C   s6   t dddgiƒ} tjtdd�� |  ¡  W 5 Q R X d S )NÚAé   é   z#matplotlib is required for plotting©Úmatch)r   ÚpytestÚraisesÚImportErrorÚplot)Údf© r   úX/home/sam/Atlas/atlas_env/lib/python3.8/site-packages/pandas/tests/plotting/test_misc.pyÚtest_import_error_message   s    r   c               	   C   s"  t jjj} d}tjt|d�� | dg g i d� W 5 Q R X d}tjt|d��  | dttd�dd gi d� W 5 Q R X | dt	ƒ dgd	d
ddœd�\}}}}|dks t
‚|d	ks¬t
‚|d
ks¸t
‚|ddiksÈt
‚| dttd�g i d�\}}}}|d ksòt
‚|d ksþt
‚|dk�st
‚t|ƒdk�st
‚d S )Nz@Called plot accessor for type list, expected Series or DataFramer   Ú )Úbackend_nameÚdataÚargsÚkwargsz.should not be called with positional arguments)ZdtypeÚlineÚxÚyÚbarF)r   ÚkindÚgridr!   zpandas.plotting._matplotlibé   )r   Z_coreZPlotAccessorZ_get_call_argsr   r   Ú	TypeErrorr   Úobjectr   ÚAssertionErrorÚlen)ÚfuncÚmsgr   r   r    r   r   r   r   Útest_get_accessor_args    s6    
$
üür)   c                   @   s:   e Zd Zdd„ Zej di ddig¡dd„ ƒZdd	„ Zd
S )ÚTestSeriesPlotsc              	   C   sh   ddl m} tjdd�}t d ¡�, t||d� t||jd� ||dd�}W 5 Q R X | j|dgd� d S )	Nr   )Úautocorrelation_plotÚts©Úname)ÚseriesZTest)Úlabel)Úlabels)Úpandas.plottingr+   ÚtmÚmakeTimeSeriesÚassert_produces_warningr	   ÚvaluesZ_check_legend_labels)Úselfr+   ÚserÚaxr   r   r   Útest_autocorrelation_plotD   s    z)TestSeriesPlots.test_autocorrelation_plotr   Zlagé   c                 C   s0   ddl m} tjdd�}t|fd|i|—Ž d S )Nr   )Úlag_plotr,   r-   r/   )r2   r<   r3   r4   r	   )r7   r   r<   r8   r   r   r   Útest_lag_plotP   s    zTestSeriesPlots.test_lag_plotc                 C   s*   ddl m} tjdd�}t||dd� d S )Nr   )Úbootstrap_plotr,   r-   é
   )r/   Úsize)r2   r>   r3   r4   r	   )r7   r>   r8   r   r   r   Útest_bootstrap_plotW   s    z#TestSeriesPlots.test_bootstrap_plotN)	Ú__name__Ú
__module__Ú__qualname__r:   r   ÚmarkÚparametrizer=   rA   r   r   r   r   r*   B   s   
r*   c                   @   sØ   e Zd Zejej dddg¡dd„ ƒƒZejj	dd„ ƒZ
ejj	dd	„ ƒZej d
¡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+S ),ÚTestDataFramePlotsÚ	pass_axisFTc           	   	   C   s  t j}d }|r | j dd¡\}}ttj d¡ dd¡ƒ}t	j
tdd�� t||d|d�}W 5 Q R X |d d j ¡ }d	d
dg}|  ||¡ | j|ddddd� |d d d |d< t	j
tdd�� t||d|d�}W 5 Q R X |d d j ¡ }dddg}|  ||¡ | j|ddddd� d S )Né   é*   éd   F)Zcheck_stacklevelgš™™™™™¹?)ÚframeZrange_paddingr9   r   z-2Ú0Ú2é   éZ   )Z
xlabelsizeZxrotZ
ylabelsizeZyrotr   z-1.0z-0.5z0.0)r   Úscatter_matrixÚpltÚsubplotsr   ÚnpÚrandomZRandomStateÚrandnr3   r5   ÚUserWarningr	   ZyaxisZget_majorticklabelsZ_check_text_labelsZ_check_ticks_props)	r7   rH   rQ   r9   Ú_r   ZaxesZaxes0_labelsÚexpectedr   r   r   Útest_scatter_matrix_axis`   s8    ü
ü
z+TestDataFramePlots.test_scatter_matrix_axisc              	      s”  ddl m‰  ddlm} |}t d ¡� t||dd� W 5 Q R X d}t||d|d�}| j| ¡ d d… ||d d d… d	� d
ddg}t||d|d�}| j| ¡ d d… ||d d d… d	� t||dˆ j	d�}‡ fdd„t
 dd|d  ¡ ¡D ƒ}| j| ¡ d d… ||d d d… d	� d}tt
j |¡t
j |¡t
j |¡dg| dœƒ}t||dd� d}t||d|d�}| j| ¡ d d… ||d d d… d	� d
ddg}t||d|d�}| j| ¡ d d… ||d d d… d	� t||dˆ j	d�}‡ fdd„t
 dd|d  ¡ ¡D ƒ}| j| ¡ d d… ||d d d… d	� dddg}	tdddgdddgdddg|	dœƒ}||d|	d�}| ¡ \}
}| j|
|	d� d S )Nr   ©Úcm)Úandrews_curvesÚName©rL   Úclass_column©z#556270z#4ECDC4z#C7F464©rL   r`   Úcolorr?   ©Ú
linecolorsÚmappingÚ
dodgerblueÚ
aquamarineÚseagreen©rL   r`   Zcolormapc                    s   g | ]}ˆ   |¡‘qS r   ©Újet©Ú.0Únr[   r   r   Ú
<listcomp>§   s     z:TestDataFramePlots.test_andrews_curves.<locals>.<listcomp>r   r
   ©r
   ÚBÚCr^   c                    s   g | ]}ˆ   |¡‘qS r   rk   rm   r[   r   r   rp   Ë   s     ÚbÚgÚrr   rI   ©rc   ©re   )Ú
matplotlibr\   r2   r]   r3   r5   r	   Ú_check_colorsÚ	get_linesrl   rT   ÚlinspaceÚnuniquer   rU   ÚrandÚget_legend_handles_labels)r7   Úirisr]   r   Úrgbar9   ÚcnamesÚcmapsÚlengthÚcolorsÚhandlesr1   r   r[   r   Útest_andrews_curves‰   s¶       ÿ  ÿ
   ÿ  ÿ   ÿ$  ÿ


üÿ	   ÿ  ÿ
   ÿ  ÿ   ÿ$  ÿ
$z&TestDataFramePlots.test_andrews_curvesc                    s¤  ddl m‰  ddlm} |}t||dd�}t| ¡ ƒ}t|j ¡ ƒ}d}t||d|d�}| j	| ¡ d d… ||d d d… d	� d
ddg}t||d|d�}| j	| ¡ d d… ||d d d… d	� t||dˆ j
d�}‡ fdd„t dd|d  ¡ ¡D ƒ}	| j	| ¡ d d… |	|d d d… d	� t||ddd�}t| ¡ ƒ|| k�sJt‚dddg}
tdddgdddgdddg|
dœƒ}||d|
d�}| ¡ \}}| j	||
d� d S )Nr   r[   ©Úparallel_coordinatesr^   r_   ra   rb   r?   rd   rg   rh   ri   rj   c                    s   g | ]}ˆ   |¡‘qS r   rk   rm   r[   r   r   rp   õ   s     z@TestDataFramePlots.test_parallel_coordinates.<locals>.<listcomp>r   F)rL   r`   Zaxvlinesrt   ru   rv   r   rI   rq   rw   rx   )ry   r\   r2   r‰   r	   r&   r{   ÚxaxisZget_ticklabelsrz   rl   rT   r|   r}   r%   r   r   )r7   r€   r‰   r   r9   ÚnlinesZnxticksr�   r‚   rƒ   r…   r†   r1   r   r[   r   Útest_parallel_coordinatesÖ   sl       ÿ  ÿ
   ÿ  ÿ   ÿ$  ÿ   ÿ
$z,TestDataFramePlots.test_parallel_coordinatesz$ignore:Attempting to set:UserWarningc                 C   sê   ddl m} tttdƒƒdd„ tdƒD ƒdd„ tdƒD ƒ dd„ tdƒD ƒ d	œƒ}||d
dd�}| ¡ \}}tdd„ |D ƒ|ƒ}t|dd„ d�}tt|dd… ƒt|dd… ƒƒ}|D ],\}	}
|	d |
d k rà|	d |
d k s¸t‚q¸dS )z
For #15908r   rˆ   é   c                 S   s   g | ]}d ‘qS )r   r   ©rn   rX   r   r   r   rp     s     zSTestDataFramePlots.test_parallel_coordinates_with_sorted_labels.<locals>.<listcomp>r?   c                 S   s   g | ]}d ‘qS )rI   r   rŽ   r   r   r   rp     s     c                 S   s   g | ]}d ‘qS )r   r   rŽ   r   r   r   rp     s     )ZfeatÚclassr�   T)Zsort_labelsc                 S   s   g | ]}|  ¡ ‘qS r   ©Ú	get_color)rn   Zpolyliner   r   r   rp     s     c                 S   s   | d S )Nr   r   )r   r   r   r   Ú<lambda>  ó    zQTestDataFramePlots.test_parallel_coordinates_with_sorted_labels.<locals>.<lambda>)Úkeyéÿÿÿÿr   N)	r2   r‰   r   ÚlistÚranger   ÚzipÚsortedr%   )r7   r‰   r   r9   Z	polylinesr1   Zcolor_label_tuplesZordered_color_label_tuplesZprev_next_tupelsÚprevZnxtr   r   r   Ú,test_parallel_coordinates_with_sorted_labels  s.    
ÿþþÿ ÿ ÿz?TestDataFramePlots.test_parallel_coordinates_with_sorted_labelsc              	      sÀ  ddl m‰  ddlm} |}t d ¡� t||dd� W 5 Q R X d}t||d|d�}dd	„ |jd d
… D ƒ}| j|d d… ||d d d… d� dddg}t||d|d� dd	„ |jd d
… D ƒ}| j|||d d d… d� t||dˆ j	d� ‡ fdd	„t
 dd|d  ¡ ¡D ƒ}dd	„ |jd d
… D ƒ}| j|||d d d… d� ddddgddddgddddgg}	tdddgdddgdddgdddgdœƒ}||d|	d�}| ¡ \}
}| j|
|	d� d S ) Nr   r[   )Úradvizr^   r_   ra   rb   c                 S   s   g | ]}|  ¡ d kr|‘qS ©r   ©Ú	get_label©rn   Úpr   r   r   rp   -  s      z2TestDataFramePlots.test_radviz.<locals>.<listcomp>é   r?   )Ú
facecolorsrf   rg   rh   ri   c                 S   s   g | ]}|  ¡ d kr|‘qS r�   rž   r    r   r   r   rp   2  s      rj   c                    s   g | ]}ˆ   |¡‘qS r   rk   rm   r[   r   r   rp   6  s     r   c                 S   s   g | ]}|  ¡ d kr|‘qS r�   rž   r    r   r   r   rp   7  s      g        ç      ð?ç      à?r   rI   rt   ru   rv   rq   rw   )r£   )ry   r\   r2   rœ   r3   r5   r	   Úpatchesrz   rl   rT   r|   r}   r   r   )r7   r€   rœ   r   r�   r9   r¦   r‚   rƒ   r…   r†   r1   r   r[   r   Útest_radviz   s0    $
$"$ÿzTestDataFramePlots.test_radvizc              	   C   s  |j ddd� ¡ }t|jƒ}|jd|d�}dd„ |D ƒ|ks@t‚d}tjt|d	�� |jd|d
g d� W 5 Q R X tjt|d	�� |jd|d d… d� W 5 Q R X d}tjt|d	�� |jd|d� W 5 Q R X |j ddd�jdd|d d… d�}dd„ |D ƒ}||d d… dg k�st‚d S )Nr^   r   )ZaxisT)rS   Útitlec                 S   s   g | ]}|  ¡ ‘qS r   ©Z	get_titler    r   r   r   rp   I  s     z:TestDataFramePlots.test_subplot_titles.<locals>.<listcomp>zjThe length of `title` must equal the number of columns if using `title` of type `list` and `subplots=True`r   zkittens > puppiesr   zNUsing `title` of type `list` is not supported unless `subplots=True` is passedFZ
SepalWidth)r   r   r•   )rS   Zlayoutr¨   c                 S   s   g | ]}|D ]}|  ¡ ‘qqS r   r©   )rn   Zsublistr9   r   r   r   rp   c  s       rI   r   )	ZdropÚheadr–   Úcolumnsr   r%   r   r   Ú
ValueError)r7   r€   r   r¨   r   r(   Z
title_listr   r   r   Útest_subplot_titlesB  s*    
ÿ ÿ  
ÿz&TestDataFramePlots.test_subplot_titlesc                 C   sz   t t d¡ƒ}t |d¡ tj ¡ }t |d¡ tj ¡ }||ksFt‚ddlm} |ddd�}|ddd�}||ksvt‚d S )N)r?   r?   r   ©Úget_standard_colorsr   rU   ©Ú
color_type)	r   rT   Zzerosr   r‰   rU   r%   Ú!pandas.plotting._matplotlib.styler¯   )r7   r   Zrand1Zrand2r¯   Úcolor1Úcolor2r   r   r   Ú$test_get_standard_colors_random_seedf  s    

z7TestDataFramePlots.test_get_standard_colors_random_seedc                 C   sd   ddl m} |ddd�}|ddd�}|ddd�}t|ƒdks@t‚t|ƒdksPt‚t|ƒdks`t‚d S )Nr   r®   r   Údefaultr°   é	   r¢   )r²   r¯   r&   r%   )r7   r¯   r³   r´   Zcolor3r   r   r   Ú+test_get_standard_colors_default_num_colorsx  s    z>TestDataFramePlots.test_get_standard_colors_default_num_colorsc              	      s‚   t dddgdddgddd	gd
ddgdddgdddgdœƒ}|j ¡ j ¡ }dd„ | ¡ dd… D ƒ‰ t‡ fdd„ˆ D ƒƒs~t‚d S )Nz
2017-02-03z
2017-03-03z
2017-01-01zAlice Andersz	Bob BakerzCharlie Chaplingáz®Ga–Àg\�Âõ(Ü$@g     LÝ@iÒ  ix	  éû   i  iõ  iî	  é4   é    )zaccount-startÚclientZbalancezdb-idzproxy-idZrankc                 S   s   g | ]}|  ¡ ‘qS r   ©Úget_facecolor©rn   Úrectr   r   r   rp   �  s     z=TestDataFramePlots.test_plot_single_color.<locals>.<listcomp>r   rI   c                 3   s   | ]}|ˆ d  kV  qdS )r   Nr   )rn   rc   ©r…   r   r   Ú	<genexpr>‘  s     z<TestDataFramePlots.test_plot_single_color.<locals>.<genexpr>)r   r¼   Zvalue_countsr   r   Úget_childrenÚallr%   )r7   r   r9   r   rÁ   r   Útest_plot_single_colorƒ  s    úÿ
z)TestDataFramePlots.test_plot_single_colorc                 C   sª   ddl m} ddlm} | tdƒ¡}|d|d�}t|ƒt|ƒksFt‚tt	j
 dd¡td	ƒd
�}| t	 ddd¡¡}|jjjd|d�}|jd  ¡ |jd  ¡ ks¦t‚d S )Nr   r[   r®   r;   r   rw   é0   é   ZABCD©r«   é   )rÉ   é   )Zfigsizerc   é   )ry   r\   r²   r¯   Úgnuplotr—   r&   r%   r   rT   rU   rV   r–   r|   r
   r   r   r¦   r¾   )r7   r\   r¯   Zcolor_beforeZcolor_afterr   Z
color_listr¡   r   r   r   Ú%test_get_standard_colors_no_appending“  s    z8TestDataFramePlots.test_get_standard_colors_no_appendingc                    sÂ   ddg}ddg‰ t tj dd¡|d�}dddœ}|jd|d	�}d
d„ | ¡ ddd… D ƒ}t‡ fdd„t|ƒD ƒƒsxt‚|jd|d	�}dd„ | 	¡ dd… D ƒ}t‡ fdd„t|ƒD ƒƒs¾t‚d S )NÚart   )r¥   g¸…ëQ¸Î?g333333ã?)g333333Ó?çffffffæ?rÏ   r   rÈ   )rt   rÎ   r   )r    rc   c                 S   s   g | ]}|  ¡ d d… ‘qS )r   r•   r½   r¿   r   r   r   rp   ²  s     z<TestDataFramePlots.test_dictionary_color.<locals>.<listcomp>r   rI   c                 3   s   | ]\}}|ˆ | kV  qd S ©Nr   ©rn   Úindexrc   ©rY   r   r   rÂ   ³  s     z;TestDataFramePlots.test_dictionary_color.<locals>.<genexpr>r   c                 S   s   g | ]}|  ¡ ‘qS r   r�   r¿   r   r   r   rp   ·  s     c                 3   s   | ]\}}|ˆ | kV  qd S rÐ   r   rÑ   rÓ   r   r   rÂ   ¸  s     )
r   rT   rU   r~   r   rÃ   rÄ   Ú	enumerater%   r{   )r7   Ú
data_filesZdf1Z	dic_colorr9   r…   r   rÓ   r   Útest_dictionary_color¦  s    
z(TestDataFramePlots.test_dictionary_colorc                 C   sn   ddl m} |dddƒ|dddƒg}tdddgitddgƒd�}|j ¡ }td	d
„ t| ¡ |ƒD ƒƒsjt	‚d S )Nr   ©ÚTextrM   r   ZTotalrÎ   r   ©rÒ   c                 s   s"   | ]\}}|  ¡ |  ¡ kV  qd S rÐ   ©Zget_text©rn   rÎ   rt   r   r   r   rÂ   È  s   ÿz3TestDataFramePlots.test_bar_plot.<locals>.<genexpr>)
Úmatplotlib.textrØ   r   r   r   r   rÄ   r˜   Úget_xticklabelsr%   )r7   rØ   rY   r   Zplot_barr   r   r   Útest_bar_plotº  s     ÿ
ü
þz TestDataFramePlots.test_bar_plotc                 C   sp   ddl m} tdddœdddœgƒ}|jjdd d�}|ddd	ƒ|dddƒg}td
d„ t| ¡ |ƒD ƒƒslt‚d S )Nr   r×   r   )ÚwordÚvalueZknowledgr   rß   )r   ZlegendÚ1c                 s   s"   | ]\}}|  ¡ |  ¡ kV  qd S rÐ   rÚ   )rn   ÚactualrY   r   r   r   rÂ   Õ  s   ÿzPTestDataFramePlots.test_barh_plot_labels_mixed_integer_string.<locals>.<genexpr>)	rÜ   rØ   r   r   ZbarhrÄ   r˜   Zget_yticklabelsr%   )r7   rØ   r   Z	plot_barhZexpected_yticklabelsr   r   r   Ú*test_barh_plot_labels_mixed_integer_stringÍ  s     ÿþz=TestDataFramePlots.test_barh_plot_labels_mixed_integer_stringc                 C   sØ   t jjj}| j ¡ }| dd¡}|jd|d d d�|d d< |jd|d d d�|d d< |d d  ¡  |d d  ¡  ||d d dƒs’t	‚||d d dƒr¨t	‚||d d dƒs¾t	‚||d d	 dƒrÔt	‚d S )
Nr   rÇ   éç   r   r   ©Zsharexéé   r   rI   )
r   Ú_matplotlibÚtoolsÚ_has_externally_shared_axisrR   ÚfigurerS   Úadd_subplotÚtwinxr%   ©r7   r'   ÚfigÚplotsr   r   r   Ú&test_has_externally_shared_axis_x_axisÜ  s    

z9TestDataFramePlots.test_has_externally_shared_axis_x_axisc                 C   sØ   t jjj}| j ¡ }| dd¡}|jd|d d d�|d d< |jd|d d d�|d d< |d d  ¡  |d d  ¡  ||d d dƒs’t	‚||d d dƒr¨t	‚||d d dƒs¾t	‚||d	 d dƒrÔt	‚d S )
NrÇ   r   éA  r   r   ©ZshareyiE  r   rI   )
r   rç   rè   ré   rR   rê   rS   rë   Ztwinyr%   rí   r   r   r   Ú&test_has_externally_shared_axis_y_axisõ  s    

z9TestDataFramePlots.test_has_externally_shared_axis_y_axisc              	   C   sr   t jjj}| j ¡ }| dd¡}|jd|d d d�|d d< d}tj	t
|d�� ||d d d	ƒ W 5 Q R X d S )
NrÇ   r   rñ   r   r   rò   z&needs 'x' or 'y' as a second parameterr   Úz)r   rç   rè   ré   rR   rê   rS   rë   r   r   r¬   )r7   r'   rî   rï   r(   r   r   r   Ú4test_has_externally_shared_axis_invalid_compare_axis  s    

zGTestDataFramePlots.test_has_externally_shared_axis_invalid_compare_axisc                 C   s´  t tj d¡tj d¡dœƒ}| j ¡ }| dd¡}|jd|d d d�|d d< |jd	|d d d�|d d< |d d  ¡ }|d d  ¡ }|d
 j	|d d dd� 
d¡ |d
 j	|d d d� |d
 j	|d d dd� 
d¡ |d
 j	|d d d� |d
 j	|d d dd� 
d¡ |d
 j	|d d d� |d j	|dd� |d j	|dd� |d d j ¡  ¡ �rxt‚|d d j ¡  ¡ �s”t‚|d d j ¡  ¡ �r°t‚d S )Niè  )rÎ   rt   r   rI   rä   r   r   rå   ræ   rÎ   zExternal share only)r9   r¨   z"this label should never be visible)r9   zInternal share (twin) onlyz#this label should always be visibleZBothrt   Úgreen)r9   rc   Úyellow)r   rT   rU   rV   rR   rê   rS   rë   rì   r   Z
set_xlabelrŠ   rŸ   Zget_visibler%   )r7   r   rî   rï   Ztwin_ax1Ztwin_ax2r   r   r   Útest_externally_shared_axes  s0    
ÿÿÿz.TestDataFramePlots.test_externally_shared_axesc                 C   s:   t dgtdƒgd�}t|jƒ tddiƒ}t|jjƒ d S )Nr¤   z2022-02-22 22:22:22rÙ   r
   )r   r   r	   r   r   r   )r7   r   Úsr   r   r   Ú-test_plot_bar_axis_units_timestamp_conversionJ  s    þ
z@TestDataFramePlots.test_plot_bar_axis_units_timestamp_conversionc                 C   sv   ddl m} |dddƒ|dddƒg}tddgtdddd�gd	�}t|jjƒ td
d„ t|j ¡  	¡ |ƒD ƒƒsrt
‚d S )Nr   r×   z	([0, 1],)r   z	([1, 2],)r   Zboth)ÚclosedrÙ   c                 s   s"   | ]\}}|  ¡ |  ¡ kV  qd S rÐ   rÚ   rÛ   r   r   r   rÂ   a  s   ÿzFTestDataFramePlots.test_bar_plt_xaxis_intervalrange.<locals>.<genexpr>)rÜ   rØ   r   r   r	   r   r   rÄ   r˜   rÝ   r%   )r7   rØ   rY   rù   r   r   r   Ú test_bar_plt_xaxis_intervalrangeV  s    þþz3TestDataFramePlots.test_bar_plt_xaxis_intervalrangeN)rB   rC   rD   ÚtdZskip_if_no_scipyr   rE   rF   rZ   Zslowr‡   rŒ   Úfilterwarningsr›   r§   r­   rµ   r¸   rÅ   rÍ   rÖ   rÞ   rã   rð   ró   rõ   rø   rú   rü   r   r   r   r   rG   ^   s0   '
L
/

"$+rG   )Ú__doc__ÚnumpyrT   r   Zpandas.util._test_decoratorsÚutilZ_test_decoratorsrý   Zpandasr   r   r   r   r   r   Zpandas._testingZ_testingr3   Zpandas.tests.plotting.commonr   r	   Zskip_if_mplr   r)   Zskip_if_no_mplr*   rG   r   r   r   r   Ú<module>   s    
"