U
    md                  '   @   sl  d dl mZmZmZ d dl mZ d dl mZ d dlZd dlZ	d dl
mZ d dlmZ d dlmZ d dlmZ d	d
lmZ d	dlmZ d	dlmZ ddlmZmZmZ ddlmZmZ ddlmZ d	dl m!Z! ddl"m#Z#m$Z$m%Z% ddl&m'Z'm(Z(m)Z) ee#dG dd de'Z*ee$e#e(e%ddddddde*j+e*j,de*j-de*j.e*j/dddddddddddddddddfeee)ee0e)f f ee0ee0 f ee1 e1e2e3e1e0ee3 ee3 eed  ee3 ee0 ee0 ee0 eee3e3f  ee1e0f ee0 eeee2e2f   eee0  ee3 ee0 ee1 ee	j4 ee1 ee0e1df ee ee1 ee3 ee3 ee3 ee ee*e5df d"ddZ6dS )     )OptionalUnionMapping)Sequence)TupleN)AnnData)Axes)pyplot)	Normalize   )logging)_doc_params)Literal   )make_grid_specfix_kwdscheck_colornorm)	ColorLike_AxesSubplot)savefig_or_show)settings)doc_common_plot_argsdoc_show_save_axdoc_vboundnorm)BasePlotdoc_common_groupby_plot_args	_VarNames)common_plot_argsc                   @   sN  e Zd ZdZdZdZdZdZdZdZ	dZ
dZd	Zd
ZdZdZd
ZdZdZd*eeeeeef f eeee f ee eeeee  ee eeeef  ee eeeeef   eee  ee ee eeed eej  eej  ee! ee ee ee ee" dddZ#eeeee	e
eeedeefeeed  ee ee ee ee ee$ ee ee ee ee ee dddZ%dddeeefee ee ee ee ee ee dddZ&e'dddZ(d d! Z)d"d# Z*e+d+eee ee ee ee ed ee ee ee ee$ ee ee ee ee ee ee ee ee" d'd(d)Z,dS ),DotPlota	      Allows the visualization of two values that are encoded as
    dot size and color. The size usually represents the fraction
    of cells (obs) that have a non-zero value for genes (var).

    For each var_name and each `groupby` category a dot is plotted.
    Each dot represents two values: mean expression within each category
    (visualized by color) and fraction of cells expressing the `var_name` in the
    category (visualized by the size of the dot). If `groupby` is not given,
    the dotplot assumes that all data belongs to a single category.

    .. note::
       A gene is considered expressed if the expression value in the `adata` (or
       `adata.raw`) is above the specified threshold which is zero by default.

    An example of dotplot usage is to visualize, for multiple marker genes,
    the mean value and the percentage of cells expressing the gene
    across multiple clusters.

    Parameters
    ----------
    {common_plot_args}
    title
        Title for the figure
    expression_cutoff
        Expression cutoff that is used for binarizing the gene expression and
        determining the fraction of cells expressing given genes. A gene is
        expressed only if the expression value is greater than this threshold.
    mean_only_expressed
        If True, gene expression is averaged only over the cells
        expressing the given genes.
    standard_scale
        Whether or not to standardize that dimension between 0 and 1,
        meaning for each variable or group,
        subtract the minimum and divide each by its maximum.
    kwds
        Are passed to :func:`matplotlib.pyplot.scatter`.

    See also
    --------
    :func:`~scanpy.pl.dotplot`: Simpler way to call DotPlot but with less options.
    :func:`~scanpy.pl.rank_genes_groups_dotplot`: to plot marker
        genes identified using the :func:`~scanpy.tl.rank_genes_groups` function.

    Examples
    --------

    >>> import scanpy as sc
    >>> adata = sc.datasets.pbmc68k_reduced()
    >>> markers = ['C1QA', 'PSAP', 'CD79A', 'CD79B', 'CST3', 'LYZ']
    >>> sc.pl.DotPlot(adata, markers, groupby='bulk_labels').show()

    Using var_names as dict:

    >>> markers = {{'T-cell': 'CD3D', 'B-cell': 'CD79A', 'myeloid': 'CST3'}}
    >>> sc.pl.DotPlot(adata, markers, groupby='bulk_labels').show()

    Zdotplot_ZwinterdotN        g      i@black皙?      ?zFraction of cells
in group (%)zMean expression
in group皙?      ?F   vargroup)adata	var_namesgroupbyuse_rawlognum_categoriescategories_ordertitlefigsizegene_symbolsvar_group_positionsvar_group_labelsvar_group_rotationlayerexpression_cutoffmean_only_expressedstandard_scaledot_color_dfdot_size_dfaxvminvmaxvcenternormc                 K   s"  t j| |||f||||||	|
|||||||||d| | j|k}|d krl|jdd |jdd  }|d kr,|r| j| jdd d}n| jjdd }|dkr|j	|
ddd}|j|dddd}nD|dkr||
d8 }||d d}n|d kr n
td nd|j|jkrDtd	 tj|jd
d\}}t|t| jkr~|jd d |f }|j|j |j }|| _|| _| j| _| j| _| j| _ | j!| _"| j#| _$| j%| _&| j'| _(d| _)| j*| _+| j,| _-| j.| _/| j0| _1| j2| _3| j4| _5| j6| _7d
| _8d
| _9d S )N)r-   r.   r/   r0   r1   r2   r3   r4   r5   r6   r7   r=   r>   r?   r@   rA   r   )levelr)   r   axisr(   z(Unknown type for standard_scale, ignoredzthe given dot_color_df data frame has a different shape thanthe data frame used for the dot size. Both data frames needto have the same index and columnsT)Zreturn_indexF):r   __init__Zobs_tidyr,   sumcountmaskZmeanfillnasubmindivmaxloggwarningshapeerrornpuniquecolumnslenr+   iloclocindexr;   r<   DEFAULT_COLORMAPcmapDEFAULT_DOT_MAXdot_maxDEFAULT_DOT_MINdot_minDEFAULT_SMALLEST_DOTsmallest_dotDEFAULT_LARGEST_DOTlargest_dotDEFAULT_COLOR_ONcolor_onDEFAULT_SIZE_EXPONENTsize_exponentgridDEFAULT_PLOT_X_PADDINGplot_x_paddingDEFAULT_PLOT_Y_PADDINGplot_y_paddingDEFAULT_DOT_EDGECOLORdot_edge_colorDEFAULT_DOT_EDGELWdot_edge_lwDEFAULT_COLOR_LEGEND_TITLEcolor_legend_titleDEFAULT_SIZE_LEGEND_TITLE
size_titleDEFAULT_LEGENDS_WIDTHlegends_widthshow_size_legendshow_colorbar)selfr*   r+   r,   r-   r.   r/   r0   r1   r2   r3   r4   r5   r6   r7   r8   r9   r:   r;   r<   r=   r>   r?   r@   rA   kwdsZobs_boolZunique_var_namesZ
unique_idx rz   Q/home/sam/Atlas/atlas_env/lib/python3.8/site-packages/scanpy/plotting/_dotplot.pyrE   h   s    



 
zDotPlot.__init__)r   square)rZ   rd   r\   r^   r`   rb   rm   ro   rf   rg   	x_padding	y_paddingc                 C   s   || j kr|| _ || jkr || _|| jkr0|| _|| jkr@|| _|| jkrP|| _|| jkr`|| _|	| jkrp|	| _|| jkr|| _|| jkr|| _|
| j	kr|
| _	|| j
kr|| _
|| jkr|| _| S )a5          Modifies plot visual parameters

        Parameters
        ----------
        cmap
            String denoting matplotlib color map.
        color_on
            Options are 'dot' or 'square'. Be default the colomap is applied to
            the color of the dot. Optionally, the colormap can be applied to an
            square behind the dot, in which case the dot is transparent and only
            the edge is shown.
        dot_max
            If none, the maximum dot size is set to the maximum fraction value found
            (e.g. 0.6). If given, the value should be a number between 0 and 1.
            All fractions larger than dot_max are clipped to this value.
        dot_min
            If none, the minimum dot size is set to 0. If given,
            the value should be a number between 0 and 1.
            All fractions smaller than dot_min are clipped to this value.
        smallest_dot
            If none, the smallest dot has size 0.
            All expression fractions with `dot_min` are plotted with this size.
        largest_dot
            If none, the largest dot has size 200.
            All expression fractions with `dot_max` are plotted with this size.
        dot_edge_color
            Dot edge color. When `color_on='dot'` the default is no edge. When
            `color_on='square'`, edge color is white for darker colors and black
            for lighter background square colors.
        dot_edge_lw
            Dot edge line width. When `color_on='dot'` the default is no edge. When
            `color_on='square'`, line width = 1.5.
        size_exponent
            Dot size is computed as:
            fraction  ** size exponent and afterwards scaled to match the
            `smallest_dot` and `largest_dot` size parameters.
            Using a different size exponent changes the relative sizes of the dots
            to each other.
        grid
            Set to true to show grid lines. By default grid lines are not shown.
            Further configuration of the grid lines can be achieved directly on the
            returned ax.
        x_padding
            Space between the plot left/right borders and the dots center. A unit
            is the distance between the x ticks. Only applied when color_on = dot
        y_padding
            Space between the plot top/bottom borders and the dots center. A unit is
            the distance between the y ticks. Only applied when color_on = dot

        Returns
        -------
        :class:`~scanpy.pl.DotPlot`

        Examples
        -------

        >>> adata = sc.datasets.pbmc68k_reduced()
        >>> markers = ['C1QA', 'PSAP', 'CD79A', 'CD79B', 'CST3', 'LYZ']

        Change color map and apply it to the square behind the dot

        >>> sc.pl.DotPlot(adata, markers, groupby='bulk_labels')        ...               .style(cmap='RdBu_r', color_on='square').show()

        Add edge to dots and plot a grid

        >>> sc.pl.DotPlot(adata, markers, groupby='bulk_labels')        ...               .style(dot_edge_color='black', dot_edge_lw=1, grid=True)        ...               .show()

        )rZ   r\   r^   r`   rb   rd   rf   rm   ro   rg   ri   rk   )rx   rZ   rd   r\   r^   r`   rb   rm   ro   rf   rg   r}   r~   rz   rz   r{   style   s2    Y











zDotPlot.styleT)showrv   rw   rs   colorbar_titlewidthc                 C   s.   |sd| _ n|| _|| _|| _ || _|| _| S )a          Configures dot size and the colorbar legends

        Parameters
        ----------
        show
            Set to `False` to hide the default plot of the legends. This sets the
            legend width to zero, which will result in a wider main plot.
        show_size_legend
            Set to `False` to hide the dot size legend
        show_colorbar
            Set to `False` to hide the colorbar legend
        size_title
            Title for the dot size legend. Use '\n' to add line breaks. Appears on top
            of dot sizes
        colorbar_title
            Title for the color bar. Use '\n' to add line breaks. Appears on top of the
            color bar
        width
            Width of the legends area. The unit is the same as in matplotlib (inches).

        Returns
        -------
        :class:`~scanpy.pl.DotPlot`

        Examples
        --------

        Set color bar title:

        >>> adata = sc.datasets.pbmc68k_reduced()
        >>> markers = {{'T-cell': 'CD3D', 'B-cell': 'CD79A', 'myeloid': 'CST3'}}
        >>> dp = sc.pl.DotPlot(adata, markers, groupby='bulk_labels')
        >>> dp.legend(colorbar_title='log(UMI counts + 1)').show()
        r   )ru   rq   rs   rv   rw   )rx   r   rv   rw   rs   r   r   rz   rz   r{   legendh  s    -zDotPlot.legend)size_legend_axc              	   C   s  | j | j }d|  k r dkr*n nd}n|dkr8d}nd}t| j | j|d d d d }| jdksp| j dkr| j | j }|| j | }n|}|| j }|| j| j  | j }|jtt|d	 t	dt||d
d| j
dd |tt|d	  dd |D }|j|dd |jddddd |jd d |jd d |jd d |jd d |d | d }	|d| jd  d |j| j|	d dd | \}
}||
d |d	  d S )N333333?g333333?皙?g?r"   r   r         ?grayr!   d   )scolor	edgecolor	linewidthZzorderc                 S   s*   g | ]"}d  tj|d ddtqS )z{}r   r   )Zdecimals)formatrR   roundZastypeint).0xrz   rz   r{   
<listcomp>  s    z-DotPlot._plot_size_legend.<locals>.<listcomp>small)ZfontsizeyF)rD   leftZ	labelleftZ
labelrightrighttopr   bottomgg~jth?   g?)r   sizeg333333?)r\   r^   rR   arangerf   rb   r`   scatterrU   repeatro   
set_xticksset_xticklabelstick_paramsspinesZset_visiblerg   Zget_ylimset_ylim	set_titlers   Zget_xlimset_xlim)rx   r   diffstepZ
size_rangeZ	dot_rangeZsize_valuesr   labelsZymaxZxminZxmaxrz   rz   r{   _plot_size_legend  sV     
	   
zDotPlot._plot_size_legendc                 C   s   | j d }| j d }| j d }| j| | | |||g}t|dd|d\}}	| jrr||	d }
| |
 |
|d< | jr||	d }| || ||d	< d S )
Ng{Gz?gHzG?r   r   r   )ZnrowsZncolsheight_ratiosr      color_legend_ax)Zmin_figure_heightheightr   rv   Zadd_subplotr   rw   Z_plot_colorbar)rx   Z	legend_axZreturn_ax_dict	normalizeZcbar_legend_heightZsize_legend_heightZspacer_heightr   ZfigZ	legend_gsr   r   rz   rz   r{   _plot_legend  s,    


   

zDotPlot._plot_legendc                 C   s(  | j  }| j }| jd k	rF|jd d | jf }|jd d | jf }| jd k	rx|j| jd d f }|j| jd d f }| jr|j}|j}| j	
d| j| _d| j	kr| j	d= | j|||f| j| j| j| j| j| j| j| j| j| j| j| j| jj| jj| jj| jjd| j	\}}}|| | _| _|S )NrZ   )rZ   r\   r^   rd   
edge_coloredge_lwr`   rb   rf   rg   r}   r~   r>   r?   r@   rA   )r;   copyr<   Zvar_names_idx_orderrV   r0   rW   Zare_axes_swappedTry   getrZ   _dotplotr\   r^   rd   rm   ro   r`   rb   rf   rg   ri   rk   Z
vboundnormr>   r?   r@   rA   )rx   r=   Z	_color_dfZ_size_dfr   r^   r\   rz   rz   r{   	_mainplot  sP    




zDotPlot._mainplotReds   r   )rZ   rd   y_labelr\   r^   r:   r`   rb   rf   r   r   rg   r}   r~   r>   r?   r@   rA   c           $   	      s,  | j  j kstdt| jt jks0tdt| jt jksLtd|dkr j ddd  j ddd	d n4|dkr  d8    d 	d n|d	krt
 j \}}| d
 }| d
 }| j } j }t|d|}d|kr|d= |d	kr8t
t|d d }n|dk sL|dkrTtd|d	krdd}n|dk sx|dkrtd|dks|dkrt
|||}|| }|| | }|| }||
|	  |	 }t||||}|dkr|d	kr4ddlm} g }|||D ]&}||}||dkr*dnd q|d	krBdn|}|j j||d dD ]} |j|  d q\t||||d||d}|j||f| nV|d	krdn|}|d	krdn|}|||}!t||||!|||d}|j||f| t
 j d d
 }"||" |j fddt |"D dd t
 j d d
 }#|!|# |j" fddt |#D d d!dd" |j#d#d$d% |$d |%| |& j d d |'d j d  |d&kr|d
 }|d
 }|& j d | |  |'|  j d |  |r"|j$d'd(d)d* |(d' |||fS )+a
          Makes a *dot plot* given two data frames, one containing
        the doc size and other containing the dot color. The indices and
        columns of the data frame are used to label the output image

        The dots are plotted using :func:`matplotlib.pyplot.scatter`. Thus, additional
        arguments can be passed.

        Parameters
        ----------
        dot_size: Data frame containing the dot_size.
        dot_color: Data frame containing the dot_color, should have the same,
                shape, columns and indices as dot_size.
        dot_ax: matplotlib axis
        cmap
            String denoting matplotlib color map.
        color_on
            Options are 'dot' or 'square'. Be default the colomap is applied to
            the color of the dot. Optionally, the colormap can be applied to an
            square behind the dot, in which case the dot is transparent and only
            the edge is shown.
        y_label: String. Label for y axis
        dot_max
            If none, the maximum dot size is set to the maximum fraction value found
            (e.g. 0.6). If given, the value should be a number between 0 and 1.
            All fractions larger than dot_max are clipped to this value.
        dot_min
            If none, the minimum dot size is set to 0. If given,
            the value should be a number between 0 and 1.
            All fractions smaller than dot_min are clipped to this value.
        standard_scale
            Whether or not to standardize that dimension between 0 and 1,
            meaning for each variable or group,
            subtract the minimum and divide each by its maximum.
        smallest_dot
            If none, the smallest dot has size 0.
            All expression levels with `dot_min` are plotted with this size.
        edge_color
            Dot edge color. When `color_on='dot'` the default is no edge. When
            `color_on='square'`, edge color is white
        edge_lw
            Dot edge line width. When `color_on='dot'` the default is no edge. When
            `color_on='square'`, line width = 1.5
        grid
            Adds a grid to the plot
        x_paddding
            Space between the plot left/right borders and the dots center. A unit
            is the distance between the x ticks. Only applied when color_on = dot
        y_paddding
            Space between the plot top/bottom borders and the dots center. A unit is
            the distance between the y ticks. Only applied when color_on = dot
        kwds
            Are passed to :func:`matplotlib.pyplot.scatter`.

        Returns
        -------
        matplotlib.colors.Normalize, dot_min, dot_max

        zGplease check that dot_size and dot_color dataframes have the same shapezGplease check that dot_size and dot_color dataframes have the same indexzMplease check that the dot_size and dot_color dataframes have the same columnsr)   r   r   rC   r(   Nr   rZ   
   z)`dot_max` value has to be between 0 and 1z)`dot_min` value has to be between 0 and 1r|   )relative_luminanceg&1?z.15wr#   )rZ   rA   )r   r   r   r   none)r   rZ   r   Z	facecolorr   rA   r    )r   rZ   r   r   r   rA   c                    s   g | ]\}} j | qS rz   )rX   r   idx_	dot_colorrz   r{   r     s     z$DotPlot._dotplot.<locals>.<listcomp>F)minorc                    s   g | ]\}} j | qS rz   )rT   r   r   rz   r{   r     s     Z   center)ZrotationZhar   Zbothr   )rD   Z	labelsizer   Tr   r   )r   r   ))rP   AssertionErrorlistrX   rT   rJ   rK   rL   rM   rI   rR   indicesflattenvaluesplZget_cmapr   ceil
ValueErrorZclipr   Zseaborn.utilsr   appendZpcolorr   Zset_linewidthr   r   r   Z
set_yticksZset_yticklabels	enumerater   r   r   rg   Z
set_ylabelr   r   Zset_axisbelow)$Zdot_sizer   Zdot_axrZ   rd   r   r\   r^   r:   r`   rb   rf   r   r   rg   r}   r~   r>   r?   r@   rA   ry   r   r   fracZ	mean_flatZ	old_ranger   r   r   Zcolor_valueZlumrD   r   Zy_ticksZx_ticksrz   r   r{   r   .  s    T






	

 




zDotPlot._dotplot)NFr&   NNNNNNNNr    FNNNNNNNN)r   r   NNNNr    r   r   NNFr$   r%   NNNN)-__name__
__module____qualname____doc__DEFAULT_SAVE_PREFIXrY   rc   r[   r]   r_   ra   rl   rn   re   rr   rp   rt   rh   rj   r   r   r   r   strr   r   boolr   r   floatr   pd	DataFramer   r
   rE   r   r   r   r   r   r   r   staticmethodr   rz   rz   rz   r{   r      s$  ;                     

 
v99$0                  r   )Zshow_save_axr   Zgroupby_plots_argsZvminmaxFr&   r    r   r'   )"r*   r+   r,   r-   r.   r/   r8   r9   rZ   r\   r^   r:   r`   r1   r   rs   r2   
dendrogramr3   r4   r5   r6   r7   	swap_axesr;   r   saver=   
return_figr>   r?   r@   rA   returnc!           #      K   s   |! d|}d|!kr|!d= t| ||f||||||||||||||||||| d|!}"|rf|"j|d |rr|"  |"j||	|
||!dtjdj||d}"|r|"S |"  t	tj
||d |dkrtjn|}|s|" S dS )	ab      Makes a *dot plot* of the expression values of `var_names`.

    For each var_name and each `groupby` category a dot is plotted.
    Each dot represents two values: mean expression within each category
    (visualized by color) and fraction of cells expressing the `var_name` in the
    category (visualized by the size of the dot). If `groupby` is not given,
    the dotplot assumes that all data belongs to a single category.

    .. note::
       A gene is considered expressed if the expression value in the `adata` (or
       `adata.raw`) is above the specified threshold which is zero by default.

    An example of dotplot usage is to visualize, for multiple marker genes,
    the mean value and the percentage of cells expressing the gene
    across  multiple clusters.

    This function provides a convenient interface to the :class:`~scanpy.pl.DotPlot`
    class. If you need more flexibility, you should use :class:`~scanpy.pl.DotPlot`
    directly.

    Parameters
    ----------
    {common_plot_args}
    {groupby_plots_args}
    size_title
        Title for the size legend. New line character (\n) can be used.
    expression_cutoff
        Expression cutoff that is used for binarizing the gene expression and
        determining the fraction of cells expressing given genes. A gene is
        expressed only if the expression value is greater than this threshold.
    mean_only_expressed
        If True, gene expression is averaged only over the cells
        expressing the given genes.
    dot_max
        If none, the maximum dot size is set to the maximum fraction value found
        (e.g. 0.6). If given, the value should be a number between 0 and 1.
        All fractions larger than dot_max are clipped to this value.
    dot_min
        If none, the minimum dot size is set to 0. If given,
        the value should be a number between 0 and 1.
        All fractions smaller than dot_min are clipped to this value.
    smallest_dot
        If none, the smallest dot has size 0.
        All expression levels with `dot_min` are plotted with this size.
    {show_save_ax}
    {vminmax}
    kwds
        Are passed to :func:`matplotlib.pyplot.scatter`.

    Returns
    -------
    If `return_fig` is `True`, returns a :class:`~scanpy.pl.DotPlot` object,
    else if `show` is false, return axes dict

    See also
    --------
    :class:`~scanpy.pl.DotPlot`: The DotPlot class can be used to to control
        several visual parameters not available in this function.
    :func:`~scanpy.pl.rank_genes_groups_dotplot`: to plot marker genes
        identified using the :func:`~scanpy.tl.rank_genes_groups` function.

    Examples
    --------

    Create a dot plot using the given markers and the PBMC example dataset grouped by
    the category 'bulk_labels'.

    .. plot::
        :context: close-figs

        import scanpy as sc
        adata = sc.datasets.pbmc68k_reduced()
        markers = ['C1QA', 'PSAP', 'CD79A', 'CD79B', 'CST3', 'LYZ']
        sc.pl.dotplot(adata, markers, groupby='bulk_labels', dendrogram=True)

    Using var_names as dict:

    .. plot::
        :context: close-figs

        markers = {{'T-cell': 'CD3D', 'B-cell': 'CD79A', 'myeloid': 'CST3'}}
        sc.pl.dotplot(adata, markers, groupby='bulk_labels', dendrogram=True)

    Get DotPlot object for fine tuning

    .. plot::
        :context: close-figs

        dp = sc.pl.dotplot(adata, markers, 'bulk_labels', return_fig=True)
        dp.add_totals().style(dot_edge_color='black', dot_edge_lw=0.5).show()

    The axes used can be obtained using the get_axes() method

    .. code-block:: python

        axes_dict = dp.get_axes()
        print(axes_dict)

    Z	color_map)r-   r.   r/   r8   r9   r:   r1   r2   r3   r4   r5   r6   r7   r;   r=   r>   r?   r@   rA   )Zdendrogram_keyr   )rZ   r\   r^   r`   ro   )r   rs   )r   r   N)r   r   Zadd_dendrogramr   r   poprn   r   Zmake_figurer   r   r   ZautoshowZget_axes)#r*   r+   r,   r-   r.   r/   r8   r9   rZ   r\   r^   r:   r`   r1   r   rs   r2   r   r3   r4   r5   r6   r7   r   r;   r   r   r=   r   r>   r?   r@   rA   ry   Zdprz   rz   r{   dotplot  sh      r   )7typingr   r   r   r   r   numpyrR   Zpandasr   Zanndatar   Zmatplotlib.axesr   Z
matplotlibr	   r   Zmatplotlib.colorsr
    r   rN   _utilsr   Z_compatr   r   r   r   r   r   r   Z	_settingsr   Z_docsr   r   r   Z_baseplot_classr   r   r   r   r[   r]   r_   rp   rr   r   r   r   r   r   dictr   rz   rz   rz   r{   <module>   s         



