U
    ƒIÀdÁi  ã                   @   sà   d dl Z d dlmZ d dl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mZ ddlmZ ddlmZmZmZmZ dd	lmZmZ dd
lmZmZ eedf ZG dd„ dƒZ eG dd„ dƒƒZ!e!ƒ Z"G dd„ dƒZ#dS )é    N)Ú	lru_cache)ÚdumpsÚloads)Úrandint)ÚAnyÚDictÚIterableÚListÚOptionalÚTypeÚUnionÚcasté   )Úerrors)ÚColorÚColorParseErrorÚColorSystemÚ	blend_rgb)ÚResultÚ	rich_repr)ÚDEFAULT_TERMINAL_THEMEÚTerminalThemeÚStylec                   @   s@   e Zd ZdZdgZeddœdd„Zded ee	 dœd	d
„Z
dS )Ú_Bitz.A descriptor to get/set a style attribute bit.ÚbitN)Úbit_noÚreturnc                 C   s   d|> | _ d S )Nr   )r   )Úselfr   © r   úO/home/sam/Atlas/atlas_env/lib/python3.8/site-packages/pip/_vendor/rich/style.pyÚ__init__   s    z_Bit.__init__r   )ÚobjÚobjtyper   c                 C   s    |j | j@ r|j| j@ dkS d S )Nr   )Ú_set_attributesr   Ú_attributes)r   r!   r"   r   r   r   Ú__get__   s    z_Bit.__get__)Ú__name__Ú
__module__Ú__qualname__Ú__doc__Ú	__slots__Úintr    r   r
   Úboolr%   r   r   r   r   r      s   r   c                   @   s¨  e Zd ZU dZee ed< ee ed< eed< eed< ee ed< eed< ee	 ed< ddddd	d
dddddgZ
ddddddddddddddœZdddddddddd d!d!d"d"d#d#d$d$d%d&d'd'd(œZd)d)d)d)d)d)d)d)d)d)d)d)d)d)d)d)d)d*œeeeef  eeeef  ee ee ee ee ee ee ee ee ee ee ee ee ee ee eeeef  d*œd+d,„Zed d-œd.d/„ƒZed�ee ee d d0œd1d2„ƒZeeeeef  d d3œd4d5„ƒZed�eeeef  ed d6œd7d8„ƒZed9ƒZed:ƒZed;ƒZed<ƒZed=ƒZed>ƒZed?ƒZed@ƒZedAƒZ edBƒZ!edCƒZ"edDƒZ#edEƒZ$e%ed-œdFdG„ƒZ&ed-œdHdI„Z'ed-œdJdK„Z(e)edLœdMdN„Z*ee+dOdP�eedQœdRdS„ƒƒZ,eee- e-dTœdUdV„ƒZ.e/d-œdWdX„Z0eedYœdZd[„Z1eedYœd\d]„Z2ed-œd^d_„Z3e%ee d-œd`da„ƒZ4e%ee d-œdbdc„ƒZ5e%ee d-œddde„ƒZ6e%ed-œdfdg„ƒZ7e%d d-œdhdi„ƒZ8e%eeef d-œdjdk„ƒZ9e%d d-œdldm„ƒZ:ee+dndP�ed doœdpdq„ƒƒZ;e+dOdP�d‘ee< edrœdsdt„ƒZ=ee>d  d duœdvdw„ƒZ?ed d duœdxdy„ƒZ@d d-œdzd{„ZAe+d|dP�d d-œd}d~„ƒZBd’ee d dœd€d�„ZCd“e)jDdƒd„œeee) eed…œd†d‡„ZEd”ee d)dˆœd‰dŠ„ZFe+dOdP�ed  d dQœd‹dŒ„ƒZGed  d dQœd�dŽ„ZHd)S )•r   aÐ  A terminal style.

    A terminal style consists of a color (`color`), a background color (`bgcolor`), and a number of attributes, such
    as bold, italic etc. The attributes have 3 states: they can either be on
    (``True``), off (``False``), or not set (``None``).

    Args:
        color (Union[Color, str], optional): Color of terminal text. Defaults to None.
        bgcolor (Union[Color, str], optional): Color of terminal background. Defaults to None.
        bold (bool, optional): Enable bold text. Defaults to None.
        dim (bool, optional): Enable dim text. Defaults to None.
        italic (bool, optional): Enable italic text. Defaults to None.
        underline (bool, optional): Enable underlined text. Defaults to None.
        blink (bool, optional): Enabled blinking text. Defaults to None.
        blink2 (bool, optional): Enable fast blinking text. Defaults to None.
        reverse (bool, optional): Enabled reverse text. Defaults to None.
        conceal (bool, optional): Enable concealed text. Defaults to None.
        strike (bool, optional): Enable strikethrough text. Defaults to None.
        underline2 (bool, optional): Enable doubly underlined text. Defaults to None.
        frame (bool, optional): Enable framed text. Defaults to None.
        encircle (bool, optional): Enable encircled text. Defaults to None.
        overline (bool, optional): Enable overlined text. Defaults to None.
        link (str, link): Link URL. Defaults to None.

    Ú_colorÚ_bgcolorr$   r#   Ú_hashÚ_nullÚ_metaÚ_linkÚ_link_idÚ_ansiÚ_style_definitionÚ1Ú2Ú3Ú4Ú5Ú6Ú7Ú8Ú9Ú21Ú51Ú52Ú53)r   r   é   é   é   é   é   é   é   é	   é
   é   é   ÚdimÚboldÚitalicÚ	underlineÚblinkÚblink2ÚreverseÚconcealÚstrikeÚ
underline2ÚframeÚencircleÚoverline)rN   ÚdrO   ÚbrP   ÚirQ   ÚurR   rS   rT   ÚrrU   ÚcrV   ÚsrW   ÚuurX   rY   rZ   ÚoN)ÚcolorÚbgcolorrO   rN   rP   rQ   rR   rS   rT   rU   rV   rW   rX   rY   rZ   ÚlinkÚmetac                C   s  d | _ d | _tttf tdœdd„}|d kr0d n||ƒ| _|d krFd n||ƒ| _t|d k	|d k	obd|d k	old|d k	ovd|d k	o€d|d k	oŠd|	d k	o”d	|
d k	ožd
|d k	o¨d|d k	o²d|d k	o¼d|d k	oÆd|d k	oÐdfƒ| _| j�r”t|rêdpìd|rôdpöd|oüd�pd|�rd�pd|�rd�pd|�r*d�p,d|	�r8d	�p:d|
�rFd
�pHd|�rTd�pVd|�rbd�pdd|�rpd�prd|�r~d�p€d|�rŒd�pŽdfƒnd| _	|| _
|d k�r®d nt|ƒ| _|�sÄ|�rÜtddƒ› t| jƒ› �nd| _d | _| j�p|�p|�p|�p| | _d S )N)rd   r   c                 S   s   t | tƒr| S t | ¡S ©N)Ú
isinstancer   Úparse)rd   r   r   r   Ú_make_color’   s    z#Style.__init__.<locals>._make_colorrC   rE   rI   é   é    é@   é€   é   é   é   é   é   r   r   é?B Ú )r4   r5   r   r   Ústrr-   r.   Úsumr#   r$   r2   r   r1   r   Úhashr3   r/   r0   )r   rd   re   rO   rN   rP   rQ   rR   rS   rT   rU   rV   rW   rX   rY   rZ   rf   rg   rk   r   r   r   r    z   s\    











óÿ#ï

óÿí&ÿzStyle.__init__©r   c                 C   s   t S )zCCreate an 'null' style, equivalent to Style(), but more performant.)Ú
NULL_STYLE)Úclsr   r   r   ÚnullÆ   s    z
Style.null)rd   re   r   c                 C   sV   |   t¡}d|_d|_||_||_d|_d|_d|_d|_	d|_
|pF| |_d|_|S )a  Create a new style with colors and no attributes.

        Returns:
            color (Optional[Color]): A (foreground) color, or None for no color. Defaults to None.
            bgcolor (Optional[Color]): A (background) color, or None for no color. Defaults to None.
        Nr   rv   )Ú__new__r   r4   r5   r-   r.   r#   r$   r2   r3   r1   r0   r/   )r|   rd   re   Ústyler   r   r   Ú
from_colorË   s    

zStyle.from_color)rg   r   c                 C   sj   |   t¡}d|_d|_d|_d|_d|_d|_d|_t	|ƒ|_
tddƒ› t|j
ƒ› �|_d|_| |_|S )z—Create a new style with meta data.

        Returns:
            meta (Optional[Dict[str, Any]]): A dictionary of meta data. Defaults to None.
        Nr   ru   )r~   r   r4   r5   r-   r.   r#   r$   r2   r   r1   r   ry   r3   r/   r0   )r|   rg   r   r   r   r   Ú	from_metaã   s    

zStyle.from_meta)rg   Úhandlersr   c                 K   s2   |dkri n|}|  dd„ | ¡ D ƒ¡ |  |¡S )a€  Create a blank style with meta information.

        Example:
            style = Style.on(click=self.on_click)

        Args:
            meta (Optional[Dict[str, Any]], optional): An optional dict of meta information.
            **handlers (Any): Keyword arguments are translated in to handlers.

        Returns:
            Style: A Style with meta information attached.
        Nc                 S   s   i | ]\}}d |› �|“qS )ú@r   )Ú.0ÚkeyÚvaluer   r   r   Ú
<dictcomp>  s      zStyle.on.<locals>.<dictcomp>)ÚupdateÚitemsr�   )r|   rg   r‚   r   r   r   Úonø   s    zStyle.onr   r   rC   rD   rE   rF   rG   rH   rI   rJ   rK   rL   rM   c                 C   s   | j S )z+Get a link id, used in ansi code for links.)r3   ©r   r   r   r   Úlink_id  s    zStyle.link_idc                 C   s  | j dk�rg }|j}| j}|d@ rŒ|d@ r>|| jr8dndƒ |d@ rX|| jrRdndƒ |d	@ rr|| jrld
ndƒ |d@ rŒ|| jr†dndƒ |d@ �r|d@ r°|| jrªdndƒ |d@ rÊ|| jrÄdndƒ |d@ rä|| j	rÞdndƒ |d@ rþ|| j
rødndƒ |d@ �r|| j�rdndƒ |d@ �rž|d @ �rD|| j�r>d!nd"ƒ |d#@ �rb|| j�r\d$nd%ƒ |d&@ �r€|| j�rzd'nd(ƒ |d)@ �rž|| j�r˜d*nd+ƒ | jdk	�r¶|| jjƒ | jdk	�rÖ|d,ƒ || jjƒ | j�rð|d-ƒ || jƒ d. |¡�pþd/| _ | j S )0z-Re-generate style definition from attributes.Né   r   rO   znot boldrC   rN   znot dimrE   rP   z
not italicrI   rQ   znot underlineéð  rl   rR   z	not blinkrm   rS   z
not blink2rn   rT   znot reversero   rU   znot concealrp   rV   z
not strikeé   rq   rW   znot underline2rr   rX   z	not framers   rY   znot encirclert   rZ   znot overlinerŠ   rf   ú Únone)r5   Úappendr#   rO   rN   rP   rQ   rR   rS   rT   rU   rV   rW   rX   rY   rZ   r-   Únamer.   r2   Újoin)r   Ú
attributesr’   Úbitsr   r   r   Ú__str__  sV    







zStyle.__str__c                 C   s   | j  S )z;A Style is false if it has no attributes, colors, or links.)r0   r‹   r   r   r   Ú__bool__K  s    zStyle.__bool__)Úcolor_systemr   c                 C   s4  | j dk�r.g }|j}| j}| j| j@ }|rÜ|d@ r@||d ƒ |d@ rT||d ƒ |d@ rh||d ƒ |d@ r|||d ƒ |d@ r¬tdd	ƒD ]}|d|> @ rŽ||| ƒ qŽ|d
@ rÜtd	dƒD ]}|d|> @ r¾||| ƒ q¾| jdk	rü| | j |¡ 	¡ ¡ | j
dk	�r"| | j
 |¡j	dd�¡ d |¡| _ | j S )z­Generate ANSI codes for this style.

        Args:
            color_system (ColorSystem): Color system.

        Returns:
            str: String containing codes.
        Nr   r   rC   rE   rI   rD   rŽ   rJ   r�   é   F©Ú
foregroundú;)r4   r’   Ú
_style_mapr$   r#   Úranger-   ÚextendÚ	downgradeÚget_ansi_codesr.   r”   )r   r™   Úsgrr’   rž   r•   r   r   r   r   Ú_make_ansi_codesO  s@    

ÿÿzStyle._make_ansi_codesrr   )Úmaxsize©r   r   c                 C   s8   zt |  |¡ƒW S  tjk
r2   | ¡  ¡  Y S X dS )zöNormalize a style definition so that styles with the same effect have the same string
        representation.

        Args:
            style (str): A style definition.

        Returns:
            str: Normal form of style definition.
        N)rw   rj   r   ÚStyleSyntaxErrorÚstripÚlower)r|   r   r   r   r   Ú	normalizez  s    zStyle.normalize)Úvaluesr   c                 G   s&   |D ]}|dk	r|  S qt dƒ‚dS )zPick first non-None style.Nz$expected at least one non-None style)Ú
ValueError)r|   r«   r†   r   r   r   Ú
pick_first‹  s    
zStyle.pick_firstc                 c   sè   d| j d fV  d| jd fV  d| jd fV  d| jd fV  d| jd fV  d| jd fV  d| jd fV  d| jd fV  d	| jd fV  d
| j	d fV  d| j
d fV  d| jd fV  d| jd fV  d| jd fV  d| jd fV  | jräd| jfV  d S )Nrd   re   rO   rN   rP   rQ   rR   rS   rT   rU   rV   rW   rX   rY   rf   rg   )rd   re   rO   rN   rP   rQ   rR   rS   rT   rU   rV   rW   rX   rY   rf   r1   rg   r‹   r   r   r   Ú__rich_repr__“  s"    zStyle.__rich_repr__)Úotherr   c                 C   s   t |tƒstS |  ¡ | ¡ kS rh   ©ri   r   ÚNotImplementedÚ__hash__©r   r¯   r   r   r   Ú__eq__¦  s    
zStyle.__eq__c                 C   s   t |tƒstS |  ¡ | ¡ kS rh   r°   r³   r   r   r   Ú__ne__«  s    
zStyle.__ne__c                 C   s8   | j d k	r| j S t| j| j| j| j| j| jfƒ| _ | j S rh   )r/   ry   r-   r.   r$   r#   r2   r1   r‹   r   r   r   r²   °  s    
úÿ
zStyle.__hash__c                 C   s   | j S )z.The foreground color or None if it is not set.)r-   r‹   r   r   r   rd   ¿  s    zStyle.colorc                 C   s   | j S )z.The background color or None if it is not set.)r.   r‹   r   r   r   re   Ä  s    zStyle.bgcolorc                 C   s   | j S )zLink text, if set.)r2   r‹   r   r   r   rf   É  s    z
Style.linkc                 C   s   | j dkp| j jS )z6Check if the style specified a transparent background.N)re   Ú
is_defaultr‹   r   r   r   Útransparent_backgroundÎ  s    zStyle.transparent_backgroundc                 C   s   t | jd�S )zA Style with background only.)re   )r   re   r‹   r   r   r   Úbackground_styleÓ  s    zStyle.background_stylec                 C   s&   | j dkri S ttttf t| j ƒƒS )z=Get meta information (can not be changed after construction).N)r1   r   r   rw   r   r   r‹   r   r   r   rg   Ø  s    z
Style.metac                 C   sr   | j r
tS |  t¡}d|_d|_d|_d|_| j|_| j	|_	| j
|_
| j
rVtddƒ› nd|_d|_ d|_d|_|S )z+Get a copy of the style with color removed.Nr   ru   rv   F)r0   r{   r~   r   r4   r5   r-   r.   r$   r#   r2   r   r3   r1   r/   ©r   r   r   r   r   Úwithout_colorÝ  s    
zStyle.without_colorrt   )Ústyle_definitionr   c                 C   s¬  |  ¡ dks|s|  ¡ S | j}d}d}i }d}t| ¡ ƒ}|D �]P}| ¡ }	|	dkrÀt|dƒ}	|	slt d¡‚zt	 
|	¡dk W n: tk
r¸ }
 zt d|	›d|
› �¡d‚W 5 d}
~
X Y nX |	}q>|	dkrþt|dƒ}	| |	¡}|dkrôt d	|	›�¡‚d
||< q>|	dk�r(t|dƒ}	|	�s"t d¡‚|	}q>|	|k�r@d|||	 < q>zt	 
|	¡ W n< tk
�rŠ }
 zt d|	›d|
› �¡d‚W 5 d}
~
X Y nX |	}q>tf |||dœ|—Ž}|S )a  Parse a style definition.

        Args:
            style_definition (str): A string containing a style.

        Raises:
            errors.StyleSyntaxError: If the style definition syntax is invalid.

        Returns:
            `Style`: A Style instance.
        r‘   NrŠ   rv   zcolor expected after 'on'zunable to parse z as background color; Únotz,expected style attribute after 'not', found Frf   zURL expected after 'link'Tz as color; )rd   re   rf   )r¨   r}   ÚSTYLE_ATTRIBUTESÚiterÚsplitr©   Únextr   r§   r   rj   r   Úgetr   )r|   r»   r½   rd   re   r•   rf   ÚwordsÚoriginal_wordÚwordÚerrorÚ	attributer   r   r   r   rj   ð  sb    


ÿþ

ÿ




ÿþzStyle.parse)Úthemer   c                 C   s
  |pt }g }|j}| j}| j}| jr.|| }}| jr`|dkrB|jn| |¡}t 	t
||jdƒ¡}|dk	r’| |¡}|d|j› �ƒ |d|j› �ƒ |dk	r¸|j|dd�}|d|j› �ƒ | jrÆ|dƒ | jrÔ|d	ƒ | jrâ|d
ƒ | jrð|dƒ | j�r |dƒ d |¡S )zGet a CSS style rule.Ng      à?zcolor: ztext-decoration-color: Fr›   zbackground-color: zfont-weight: boldzfont-style: italicztext-decoration: underlineztext-decoration: line-throughztext-decoration: overlinez; )r   r’   rd   re   rT   rN   Úforeground_colorÚget_truecolorr   Úfrom_tripletr   Úbackground_colorÚhexrO   rP   rQ   rV   rZ   r”   )r   rÇ   Úcssr’   rd   re   rÈ   Útheme_colorr   r   r   Úget_html_style3  s>    
ÿÿ
zStyle.get_html_style)Ústylesr   c                 C   s   t |ƒ}t|t|ƒƒS )zªCombine styles and get result.

        Args:
            styles (Iterable[Style]): Styles to combine.

        Returns:
            Style: A new style instance.
        ©r¾   rx   rÀ   ©r|   rÐ   Úiter_stylesr   r   r   ÚcombineX  s    
zStyle.combinec                 G   s   t |ƒ}t|t|ƒƒS )zÊCombine styles from positional argument in to a single style.

        Args:
            *styles (Iterable[Style]): Styles to combine.

        Returns:
            Style: A new style instance.
        rÑ   rÒ   r   r   r   Úchaine  s    
zStyle.chainc                 C   s~   | j r
tS |  t¡}| j|_| j|_| j|_| j|_| j|_| j	|_	| j
|_
| j
r^tddƒ› nd|_| j|_d|_ | j|_|S )zwGet a copy of this style.

        Returns:
            Style: A new Style instance with identical attributes.
        r   ru   rv   F)r0   r{   r~   r   r4   r5   r-   r.   r$   r#   r2   r   r3   r/   r1   r¹   r   r   r   Úcopyr  s    
z
Style.copyro   c                 C   sh   | j r
tS |  t¡}| j|_| j|_| j|_| j|_| j|_| j	|_	d|_
d|_| j|_d|_ d|_|S )z€Get a copy of this style with link and meta information removed.

        Returns:
            Style: New style object.
        Nrv   F)r0   r{   r~   r   r4   r5   r-   r.   r$   r#   r2   r3   r/   r1   r¹   r   r   r   Úclear_meta_and_linksˆ  s    
zStyle.clear_meta_and_links)rf   r   c                 C   sn   |   t¡}| j|_| j|_| j|_| j|_| j|_| j|_||_|rPt	ddƒ› nd|_
d|_d|_| j|_|S )zÆGet a copy with a different value for link.

        Args:
            link (str, optional): New value for link. Defaults to None.

        Returns:
            Style: A new Style instance.
        r   ru   rv   NF)r~   r   r4   r5   r-   r.   r$   r#   r2   r   r3   r/   r0   r1   )r   rf   r   r   r   r   Úupdate_linkŸ  s    	
zStyle.update_linkrv   F)r™   Úlegacy_windows)Útextr™   rÙ   r   c                C   sd   |r|dkr|S | j p|  |¡}|r6d|› d|› d�n|}| jr`|s`d| j› d| j› d|› d�}|S )	aD  Render the ANSI codes for the style.

        Args:
            text (str, optional): A string to style. Defaults to "".
            color_system (Optional[ColorSystem], optional): Color system to render to. Defaults to ColorSystem.TRUECOLOR.

        Returns:
            str: A string containing ANSI style codes.
        Nz[Úmz[0mz]8;id=r�   z\z]8;;\)r4   r¤   r2   r3   )r   rÚ   r™   rÙ   ÚattrsÚrenderedr   r   r   Úrender¶  s    
ÿzStyle.render)rÚ   r   c                 C   s(   |p
t | ƒ}tj |  |¡› d�¡ dS )zÉWrite text with style directly to terminal.

        This method is for testing purposes only.

        Args:
            text (Optional[str], optional): Text to style or None for style name.

        Ú
N)rw   ÚsysÚstdoutÚwriterÞ   )r   rÚ   r   r   r   ÚtestÐ  s    	z
Style.testc                 C   sÔ   |d ks|j r| S | j r|S |  t¡}d |_d |_|jp<| j|_|jpJ| j|_| j|j @ |j|j@ B |_| j|jB |_|j	p‚| j	|_	|j
p�| j
|_
|j |_ | jr¼|jr¼t| j|j–ƒ|_n| jpÆ|j|_d |_|S rh   )r0   r~   r   r4   r5   r-   r.   r$   r#   r2   r3   r1   r   rg   r/   )r   r   Ú	new_styler   r   r   Ú_addÜ  s*    

ÿz
Style._addc                 C   s   |   |¡}|jr| ¡ S |S rh   )rå   rf   rÖ   )r   r   Úcombined_styler   r   r   Ú__add__õ  s    
zStyle.__add__)NN)N)N)N)rv   )N)Ir&   r'   r(   r)   r
   r   Ú__annotations__r+   r,   Úbytesr*   rž   r½   r   rw   r   r   r    Úclassmethodr}   r€   r�   rŠ   r   rO   rN   rP   rQ   rR   rS   rT   rU   rV   rW   rX   rY   rZ   ÚpropertyrŒ   r—   r˜   r   r¤   r   rª   Ú	StyleTyper­   r   r®   r´   rµ   r²   rd   re   rf   r·   r¸   rg   rº   rj   r   rÏ   r   rÔ   rÕ   rÖ   r×   rØ   Ú	TRUECOLORrÞ   rã   rå   rç   r   r   r   r   r      s^  
õóêííL   ÿ þ".+A$ þûúc                   @   sd   e Zd ZdZdgZdddœdd„Zedœd	d
„Zee	dœdd„ƒZ
e	ddœdd„Ze	dœdd„ZdS )Ú
StyleStackzA stack of styles.Ú_stackr   N)Údefault_styler   c                 C   s   |g| _ d S rh   ©rï   )r   rð   r   r   r   r      s    zStyleStack.__init__rz   c                 C   s   d| j ›d�S )Nz<stylestack ú>rñ   r‹   r   r   r   Ú__repr__  s    zStyleStack.__repr__c                 C   s
   | j d S )z&Get the Style at the top of the stack.éÿÿÿÿrñ   r‹   r   r   r   Úcurrent  s    zStyleStack.currentr¦   c                 C   s   | j  | j d | ¡ dS )z}Push a new style on to the stack.

        Args:
            style (Style): New style to combine with current style.
        rô   N)rï   r’   r¹   r   r   r   Úpush  s    zStyleStack.pushc                 C   s   | j  ¡  | j d S )z}Pop last style and discard.

        Returns:
            Style: New current style (also available as stack.current)
        rô   )rï   Úpopr‹   r   r   r   r÷     s    
zStyleStack.pop)r&   r'   r(   r)   r*   r    rw   ró   rë   r   rõ   rö   r÷   r   r   r   r   rî   ý  s   rî   )$rà   Ú	functoolsr   Úmarshalr   r   Úrandomr   Útypingr   r   r   r	   r
   r   r   r   rv   r   rd   r   r   r   r   Úreprr   r   Úterminal_themer   r   rw   rì   r   r   r{   rî   r   r   r   r   Ú<module>   s&   (     `