o
    tBhn                     @  s.  U d Z ddlmZ ddlZddlZddlZddlZddlZddlZddl	Z	ddl
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mZmZ zddlZddlZdZW n ey`   dZY nw ed	Zed
dZe ej!d Z"de#d< W d   n1 sw   Y  e$dZ%de#d< dZ&de#d< dZ'de#d< dZ(de#d< dZ)de#d< dZ*de#d< e+dZ,de#d< ddd"d#Z-dd$d%Z.dd(d)Z/dd.d/Z0dd1d2Z1dd5d6Z2dd:d;Z3dd=d>Z4G d?d@ d@e5Z6ddBdCZ7ddHdIZ8ddOdPZ9ddRdSZ:dTZ;de#dU< dVZ<de#dW< dXZ=de#dY< ddadbZ>G dcdd ddZ?ddfdgZ@ddidjZAddodpZBi ZCdqe#dr< ddvdwZD	xddd~dZEdddZFddddZGdddZHdddZIdddZJdddZKdddZLdddZMddddZNdddZOdddZPG dd dZQdddZRdddZSdddZTe
jUZVdddZWdddZXdS )z3Utility functions with no non-trivial dependencies.    )annotationsN)	resources)IOCallable	ContainerIterableSequenceSizedTypeVar)FinalLiteralTFTmypyzpy.typedtypeshedr   TYPESHED_DIRs=   ([ \t\v]*#.*(\r\n?|\n))??[ \t\v]*#.*coding[:=][ \t]*([-\w.]+)ENCODING_RE   DEFAULT_SOURCE_OFFSETP   DEFAULT_COLUMNS   MINIMUM_WIDTH
   MINIMUM_WINDOWS_MAJOR_VT100iZ)  MINIMUM_WINDOWS_BUILD_VT100)__init____new____call____init_subclass____class_getitem__SPECIAL_DUNDERSnamestrexclude_specialboolreturnc                 C  s$   |r| t v rdS | do| dS )zReturns whether name is a dunder name.

    Args:
        exclude_special: Whether to return False for a couple special dunder methods.

    F__)r    
startswithendswith)r!   r#    r)   `/var/www/html/riverr-enterprise-integrations-main/venv/lib/python3.10/site-packages/mypy/util.py	is_dunder8   s   r+   c                 C  s   t |  o| do| dS N_)r+   r'   r(   r!   r)   r)   r*   	is_sunderD   s   r/   mod_name	list[str]c                 C  s4   | g}d| v r|  ddd } ||  d| v s|S )zReturn the module and all parent module names.

    So, if `mod_name` is 'a.b.c', this function will return
    ['a.b.c', 'a.b', and 'a'].
    .   r   )rsplitappend)r0   outr)   r)   r*   split_module_namesH   s   
r7   modulesIterable[str]target
str | Nonec                 C  s   t | |}|d u rd S |d S Nr   )split_target)r8   r:   resultr)   r)   r*   module_prefixU   s   
r?   tuple[str, str] | Nonec                 C  sR   g }	 || v r|d |fS |dd}t|dkrd S |d }|d|d  q)NTr2   r3   r   )joinr4   leninsert)r8   r:   	remaining
componentsr)   r)   r*   r=   \   s   r=   objobjectc                 C  s,   | du rdS t t| }|dd dS )zReturn the last component of the type name of an object.

    If obj is None, return 'nil'. For example, if obj is 1, return 'int'.
    Nnilr2   z'>)r"   typesplitrstrip)rF   tr)   r)   r*   
short_typeh   s   rN   textbytestuple[str, int]c                 C  sZ   t | }|r'|drdnd}|dd}|ds!|dkr#d}||fS d}|d	fS )
z*PEP-263 for detecting Python file encodingr3         ascii)ziso-latin-1-zlatin-1-ziso-latin-1zlatin-1utf8rI   )r   matchgroupdecoder'   )rO   r>   lineencodingdefault_encodingr)   r)   r*   find_python_encodings   s   
r\   bc                 C  s   t | dd S )a2  Converts bytes into some human-readable representation. Unprintable
    bytes such as the nul byte are escaped. For example:

        >>> b = bytes([102, 111, 111, 10, 0])
        >>> s = bytes_to_human_readable_repr(b)
        >>> print(s)
        foo
 
        >>> print(repr(s))
        'foo\n\x00'
    rR   rI   )repr)r]   r)   r)   r*   bytes_to_human_readable_repr   s   r_   c                   @  s   e Zd ZdZdS )DecodeErrorzException raised when a file cannot be decoded due to an unknown encoding type.

    Essentially a wrapper for the LookupError raised by `bytearray.decode`
    N)__name__
__module____qualname____doc__r)   r)   r)   r*   r`      s    r`   sourcec              
   C  s`   |  drd}| dd } nt| \}}z| |}W |S  ty/ } ztt||d}~ww )zmRead the Python file with while obeying PEP-263 encoding detection.

    Returns the source as a string.
    s   ﻿rU   rS   N)r'   r\   rX   LookupErrorr`   r"   )re   rZ   r-   source_text	lookuperrr)   r)   r*   decode_python_encoding   s   
ri   pathreadCallable[[str], bytes]list[str] | Nonec                 C  sJ   z|| }W n
 t y   Y dS w z	t| }W |S  ty$   Y dS w )zaTry reading a Python file as list of source lines.

    Return None if something goes wrong.
    N)OSErrorri   
splitlinesr`   )rj   rk   re   source_linesr)   r)   r*   read_py_file   s   rq   rY   max_lenintcol	min_widthc                 C  s   |d| d k rd| d }t | |kr| dfS || |k r(| d| d dfS |t | | d k rL|| | d }d| ||| d   d |d fS d| | d  t | | d fS )a  Trim a line of source code to fit into max_len.

    Show 'min_width' characters on each side of 'col' (an error location). If either
    start or end is trimmed, this is indicated by adding '...' there.
    A typical result looks like this:
        ...some_variable = function_to_call(one_arg, other_arg) or...

    Return the trimmed string and the column offset to to adjust error location.
    rR   r3   r   N...rS   rB   )rY   rr   rt   ru   offsetr)   r)   r*   trim_source_line   s   
$"ry   list[tuple[int, str]]c                 C  s\   d}|| vrg S |  d}g }t|D ]\}}||r+||d |t|d  f q|S )Nz# mypy: 
r3   )rK   	enumerater'   r5   rB   )re   PREFIXlinesresultsirY   r)   r)   r*   get_mypy_comments   s   

r   z<?xml version="1.0" encoding="utf-8"?>
<testsuite errors="0" failures="0" name="mypy" skips="0" tests="1" time="{time:.3f}">
  <testcase classname="mypy" file="mypy" line="1" name="mypy-py{ver}-{platform}" time="{time:.3f}">
  </testcase>
</testsuite>
PASS_TEMPLATEa;  <?xml version="1.0" encoding="utf-8"?>
<testsuite errors="0" failures="1" name="mypy" skips="0" tests="1" time="{time:.3f}">
  <testcase classname="mypy" file="mypy" line="1" name="mypy-py{ver}-{platform}" time="{time:.3f}">
    <failure message="mypy produced messages">{text}</failure>
  </testcase>
</testsuite>
FAIL_TEMPLATEa5  <?xml version="1.0" encoding="utf-8"?>
<testsuite errors="1" failures="0" name="mypy" skips="0" tests="1" time="{time:.3f}">
  <testcase classname="mypy" file="mypy" line="1" name="mypy-py{ver}-{platform}" time="{time:.3f}">
    <error message="mypy produced errors">{text}</error>
  </testcase>
</testsuite>
ERROR_TEMPLATEdtfloatseriousmessagesversionplatformNonec           
      C  s   ddl m} |s|stj| ||d}n|s$tj|d|| ||d}ntj|d|| ||d}tj	tj
|}tj|sGt| t|d}	|	|d W d    d S 1 s`w   Y  d S )Nr   )escape)timeverr   r{   )rO   r   r   r   wbutf-8)xml.sax.saxutilsr   r   formatr   rA   r   osrj   dirnameabspathisdirmakedirsopenwriteencode)
r   r   r   rj   r   r   r   xmlxml_dirsfr)   r)   r*   write_junit_xml  s    
"r   c                   @  s$   e Zd ZdZdddZdd	d
ZdS )IdMapperzGenerate integer ids for objects.

    Unlike id(), these start from 0 and increment by 1, and ids won't
    get reused across the life-time of IdMapper.

    Assume objects don't redefine __eq__ or __hash__.
    r%   r   c                 C  s   i | _ d| _d S r<   id_mapnext_id)selfr)   r)   r*   r   $  s   
zIdMapper.__init__orG   rs   c                 C  s.   || j vr| j| j |< |  jd7  _| j | S )Nr3   r   )r   r   r)   r)   r*   id(  s   

zIdMapper.idN)r%   r   )r   rG   r%   rs   )ra   rb   rc   rd   r   r   r)   r)   r)   r*   r     s    
r   fullnamec                 C  s   |  ddd S )zBDrop the final component of a qualified name (e.g. ('x.y' -> 'x').r2   r3   r   )r4   )r   r)   r)   r*   
get_prefix/  s   r   tuple[str, str]c                 C  s&   |  dd}|d d|dd fS )zReturn one and two component prefixes of a fully qualified name.

    Given 'a.b.c.d', return ('a', 'a.b').

    If fullname has only one component, return (fullname, fullname).
    r2   rS   r   NrR   )rK   rA   )r   rE   r)   r)   r*   get_top_two_prefixes4  s   r   
cur_mod_idrelativeis_cur_package_init_filetuple[str, bool]c                 C  sp   |dkr|dfS |  d}|}|r|d8 }t||k}|dkr)d|d |  } | |r3d|  |fS d |fS )Nr   Tr2   r3    )rK   rB   rA   )r   r   r:   r   partsrelokr)   r)   r*   correct_relative_import?  s   
r   z$Final[dict[type[object], list[str]]]fields_cacheclstype[object]Sequence[str]c                   s>   dd l  | tvr |  fdd}dd |D t| < t|  S )Nr   c                   s     | p	 | S N)isgetsetdescriptorismemberdescriptor)r   inspectr)   r*   <lambda>X  s    z'get_class_descriptors.<locals>.<lambda>c                 S  s$   g | ]\}}|d kr|dkr|qS )__weakref____dict__r)   ).0xyr)   r)   r*   
<listcomp>Z  s   $ z)get_class_descriptors.<locals>.<listcomp>)r   r   
getmembers)r   membersr)   r   r*   get_class_descriptorsQ  s   r   r)   newold	copy_dict
skip_slotstuple[str, ...]c              	   C  s   t |dr|rt|j| _n|j| _t|jD ]+}||v rqzt ||r.t| |t|| n
t | |r8t| | W q tyB   Y qw dS )a   Copy state of old node to the new node.

    This handles cases where there is __dict__ and/or attribute descriptors
    (either from slots or because the type is defined in a C extension module).

    Assume that both objects have the same __class__.
    r   N)	hasattrdictr   r   	__class__setattrgetattrdelattrAttributeError)r   r   r   r   attrr)   r)   r*   replace_object_state^  s"   




r   path1path2c                 C  s   t |t | jv S )z8Given two paths, return if path1 is a sub-path of path2.)pathlibPathparents)r   r   r)   r)   r*   is_sub_path~  s   r   statusc                 C  s"   t j  t j  t|  dS )zKill the current process without fully cleaning up.

    This can be quite a bit faster than a normal exit() since objects are not freed.
    N)sysstdoutflushstderrr   _exit)r   r)   r)   r*   	hard_exit  s   

r   c                 C  s
   |  dS )z+Remove internal suffixes from a short name.')rL   r.   r)   r)   r*   unmangle  s   
r   existingContainer[str]c                 C  sL   | d }||vr
|S d}|t | |v r |d7 }|t | |v s|t | S )zGet a simple redefinition name not present among existing.

    For example, for name 'foo' we try 'foo-redefinition', 'foo-redefinition2',
    'foo-redefinition3', etc. until we find one that is not in existing.
    z-redefinitionrR   r3   )r"   )r!   r   r_namer   r)   r)   r*   get_unique_redefinition_name  s   r   programc                 C  s,   t jdd dk rt dj| d dS dS )zAReport issues with the Python used to run mypy, dmypy, or stubgenNrR   )rS      zXRunning {name} with Python 3.6 or lower is not supported; please upgrade to 3.7 or newerr.   )r   version_infoexitr   )r   r)   r)   r*   check_python_version  s   r   tuple[int, int, int]c                 C  s@   dd | D }dd |D }dd | D }t |t |t |fS )zDCount total number of errors, notes and error_files in message list.c                 S     g | ]}d |v r|qS ): error:r)   r   er)   r)   r*   r         zcount_stats.<locals>.<listcomp>c                 S  s   h | ]	}| d d qS ):r   )rK   r   r)   r)   r*   	<setcomp>  s    zcount_stats.<locals>.<setcomp>c                 S  r   ): note:r)   r   r)   r)   r*   r     r   rw   )r   errorserror_filesnotesr)   r)   r*   count_stats  s   r   msgc                 C  sV   d}g }d}| D ]}|dkr|r| | d}q|dkr| }||7 }q| | |S )z=Split line of text into words (but not within quoted groups).r   T ")r5   )r   	next_wordresallow_breakcr)   r)   r*   split_words  s   


r   c                   C  s   t tddpt jptS )zIGet current terminal width if possible, otherwise return the default one.MYPY_FORCE_TERMINAL_WIDTH0)rs   r   getenvshutilget_terminal_sizecolumnsr   r)   r)   r)   r*   get_terminal_width  s
   r  first_offset
num_indentc           
      C  s   t | }|d}g }|r8|d}|r|| n|| }t|t| d |kr/|d| 7 }n|| |}|s|| dd|  }	|	|S )a  Wrap a long error message into few lines.

    Breaks will only happen between words, and never inside a quoted group
    (to avoid breaking types such as "Union[int, str]"). The 'first_offset' is
    the width before the start of first line.

    Pad every next line with 'num_indent' spaces. Every line will be at most 'max_len'
    characters, except if it is a single word or quoted group.

    For example:
               first_offset
        ------------------------
        path/to/file: error: 58: Some very long error message
            that needs to be split in separate lines.
            "Long[Type, Names]" are never split.
        ^^^^--------------------------------------------------
        num_indent           max_len
    r   r3   r   r{   )r   poprB   r5   rA   )
r   rr   r  r	  words	next_liner~   r   max_line_lenpaddingr)   r)   r*   	soft_wrap  s   



	
r  datac                 C  s   t |  S )zCompute a hash digest of some data.

    We use a cryptographic hash because we want a low probability of
    accidental collision, but we don't really care about any of the
    cryptographic properties.
    )hashlibsha256	hexdigest)r  r)   r)   r*   hash_digest  s   	r  cupc                 C  sH   t jdkr	J dd| dd  dg}t|dd	d
 }|S )z.Reproduce a gray color in ANSI escape sequencewin32Fz"curses is not available on Windowsr   NrI   mr   r3   	   )r   r   rA   rX   cursestparmr   )r  	set_colorgrayr)   r)   r*   parse_gray_color  s
   
r  c                   @  s   e Zd ZdZd5d	d
Zd6ddZd6ddZ			d7d8ddZ	d9d:ddZd;d!d"Z	d<d$d%Z
d=d'd(Zd>d?d-d.Zdd)d/d@d3d4ZdS )AFancyFormatterzcApply color and bold font to terminal output.

    This currently only works on Linux and Mac.
    f_outIO[str]f_errshow_error_codesr$   r%   r   c                 C  s   || _ tjdvrd| _d S ttdd}|s$| r| s$d| _d S tjdkr0|   | _n| 	  | _| jsH| j
| j| j| jdd| _d S d S )N)linuxdarwinr  TMYPY_FORCE_COLORr  r  r   )redgreenblueyellownone)r"  r   r   
dummy_termrs   r   r  isattyinitialize_win_colorsinitialize_unix_colorsREDGREENBLUEYELLOWcolors)r   r  r!  r"  force_colorr)   r)   r*   r     s&   

zFancyFormatter.__init__c                 C  s   t jdksJ t jdkrSt  }|jtk s|jtk rdS ddl}|jj	}d}d}d}d}|
||||B |B  d	| _d
| _d| _d| _d| _d| _d| _d| _dS dS )SReturn True if initialization was successful and we can use colors, False otherwiser  Fr   Nr3   rR   r   iz[1mz[4mz[94mz[92mz[91mz[93mz[0mz[2mT)r   r   getwindowsversionmajorr   buildr   ctypeswindllkernel32SetConsoleModeGetStdHandleBOLDUNDERr1  r0  r/  r2  NORMALDIM)r   winverr9  r;  ENABLE_PROCESSED_OUTPUTENABLE_WRAP_AT_EOL_OUTPUT"ENABLE_VIRTUAL_TERMINAL_PROCESSINGSTD_OUTPUT_HANDLEr)   r)   r*   r-  $  s<   


z$FancyFormatter.initialize_win_colorsc                 C  s^  t jdksts	dS z7zt j }W n' tjy8   tdd}tj	| d W d   n1 s1w   Y  Y nw tj	|d W n tj
yK   Y dS w td}td}td	}td
}td}|ro|ro|ro|ro|sqdS | | _| | _| | _t|| _t|tj | _t|tj | _t|tj | _t|tj | _dS )r5  r  Fz	/dev/nullrb)fdNboldsmulsetafr  sgr0T)r   r   CURSES_ENABLEDr   filenoioUnsupportedOperationr   r  	setuptermerrortigetstrrX   r@  r>  r?  r  rA  r  
COLOR_BLUEr1  COLOR_GREENr0  	COLOR_REDr/  COLOR_YELLOWr2  )r   rH  r   rI  underr  set_eseqnormalr)   r)   r*   r.  I  s@   








z%FancyFormatter.initialize_unix_colorsFrO   r"   color1Literal['red', 'green', 'blue', 'yellow', 'none']rI  	underlinedimc                 C  sN   | j r|S |r| j}nd}|r|| j7 }|r|| j7 }|| j|  | | j S )z2Apply simple color and style (underlined or bold).r   )r+  r>  r?  rA  r3  r@  )r   rO   r[  rI  r]  r^  startr)   r)   r*   stylen  s   	

zFancyFormatter.styleNr   r1   fixed_terminal_width
int | Nonec                 C  sZ  |pt  }| }t|D ]\}}d|v r3|jddd\}}t||t|td d}|d | ||< |dt rd|vr|td	 }||d  }	|	d}
|
t }d
|	vrZd}n|	|
|		d
d  }|t d }t
|||t\}}dt | ||< dt| |  | }t|t|| krt|dkr|d	t|| d  d }|||d < q|S )zHImprove readability by wrapping error messages and trimming source code.r   error:r3   maxsplitzerror: )r  r   ^N~   rS   rv   )r  copyr|   rK   r  rB   r'   r   indexrindexry   r   )r   r   ra  widthnew_messagesr   rR  locr   marker_linemarker_columncolumnmarkerrr   source_linerx   new_marker_liner)   r)   r*   fit_in_terminal  s0   

 zFancyFormatter.fit_in_terminalrR  c                 C  s  d|v rL|j ddd\}}| js|| jdddd | | S |d}|d	kr5||d
 }|d
| }nd}|| jdddd | | | |d S d|v rk|j ddd\}}| | |}|| dd | S |dt rd|vr~| j|dddS | |dS |S )zBColorize an output line by highlighting the status and error code.r   rc  r3   rd  r&  TrI  [rI   Nr   r)  r   znote:r(  r   rf  r*  )r^  )rK   r"  r`  highlight_quote_groupsrfindunderline_linkr'   r   )r   rR  rn  r   codeposcode	formattedr)   r)   r*   colorize  s6   

zFancyFormatter.colorizer   c                 C  sp   | dd r	|S |d}d}t|D ]!\}}|d dkr'|| |d7 }q|| jd| d ddd7 }q|S )zMake groups quoted with double quotes bold (including quotes).

        This is used to highlight types, attribute names etc.
        r   rR   r   r   r*  Trv  )countrK   r|   r`  )r   r   r   r6   r   partr)   r)   r*   rx    s   
z%FancyFormatter.highlight_quote_groupsnotec                 C  sT   t d|}|s
|S | }| }|d| | j||| ddd ||d  S )zuUnderline a link in a note message (if any).

        This assumes there is at most one link in the message.
        zhttps?://\S*Nr*  T)r]  )researchr_  endr`  )r   r  rV   r_  r  r)   r)   r*   rz    s   0zFancyFormatter.underline_linkT	n_sourcesrs   	use_colorc                 C  s,   d| dt | }|s|S | j|dddS )zFormat short summary in case of success.

        n_sources is total number of files passed directly on command line,
        i.e. excluding stubs and followed imports.
        zSuccess: no issues found in  source filer'  Trv  plural_sr`  )r   r  r  r   r)   r)   r*   format_success  s   zFancyFormatter.format_success)blockersr  n_errorsn_filesr  c             	   C  sd   d| dt | d| dt | }|r|d7 }n|d| dt | d7 }|s*|S | j|d	d
dS )z)Format a short summary in case of errors.zFound z errorz in z filez$ (errors prevented further checking)z
 (checked r  )r&  Trv  r  )r   r  r  r  r  r  r   r)   r)   r*   format_error  s   $

zFancyFormatter.format_error)r  r   r!  r   r"  r$   r%   r   )r%   r$   )FFF)rO   r"   r[  r\  rI  r$   r]  r$   r^  r$   r%   r"   r   )r   r1   ra  rb  r%   r1   )rR  r"   r%   r"   )r   r"   r%   r"   )r  r"   r%   r"   )T)r  rs   r  r$   r%   r"   )r  rs   r  rs   r  rs   r  r$   r  r$   r%   r"   )ra   rb   rc   rd   r   r-  r.  r`  ru  r~  rx  rz  r  r  r)   r)   r)   r*   r    s$    


%)
%
 
r  typeshed_dirfilec                 C  sD   | d ur| nt } ztj| tj|f| kW S  ty!   Y dS w )NF)r   r   rj   
commonpathr   
ValueError)r  r  r)   r)   r*   is_typeshed_file  s   r  c                 C  s0   |  dsdS tdd tjtj| D S )Nz.pyiFc                 s  s    | ]}| d V  qdS )z-stubsN)r(   )r   	componentr)   r)   r*   	<genexpr>  s    z'is_stub_package_file.<locals>.<genexpr>)r(   anyr   rj   rK   r   )r  r)   r)   r*   is_stub_package_file  s   
"r  c                 C  s   | d uo| dkS r,   r)   r.   r)   r)   r*   unnamed_function  s   r  t0c                 C  s   t t |  d S )Ng    .A)rs   r   perf_counter)r  r)   r)   r*   time_spent_us  s   r  sint | Sizedc                 C  s&   t | tr| nt| }|dkrdS dS )Nr3   r  r   )
isinstancers   rB   )r  r  r)   r)   r*   r     s   r  )F)r!   r"   r#   r$   r%   r$   )r!   r"   r%   r$   )r0   r"   r%   r1   )r8   r9   r:   r"   r%   r;   )r8   r9   r:   r"   r%   r@   )rF   rG   r%   r"   )rO   rP   r%   rQ   )r]   rP   r%   r"   )re   rP   r%   r"   )rj   r"   rk   rl   r%   rm   )
rY   r"   rr   rs   rt   rs   ru   rs   r%   rQ   )re   r"   r%   rz   )r   r   r   r$   r   r1   rj   r"   r   r"   r   r"   r%   r   )r   r"   r%   r"   )r   r"   r%   r   )
r   r"   r   rs   r:   r"   r   r$   r%   r   )r   r   r%   r   )Fr)   )
r   rG   r   rG   r   r$   r   r   r%   r   )r   r"   r   r"   r%   r$   )r   )r   rs   r%   r   )r!   r"   r%   r"   )r!   r"   r   r   r%   r"   )r   r"   r%   r   )r   r1   r%   r   )r   r"   r%   r1   )r%   rs   )
r   r"   rr   rs   r  rs   r	  rs   r%   r"   )r  rP   r%   r"   )r  rP   r%   r"   )r  r;   r  r"   r%   r$   )r  r"   r%   r$   )r!   r;   r%   r$   )r  r   r%   rs   )r  r  r%   r"   )Yrd   
__future__r   r  rO  r   r   r  r  r   r   	importlibr   importlib_resourcestypingr   r   r   r   r   r	   r
   typing_extensionsr   r   r  _cursesrM  ImportErrorr   rj   	_resourcer"   parentr   __annotations__compiler   r   r   r   r   r   	frozensetr    r+   r/   r7   r?   r=   rN   r\   r_   	Exceptionr`   ri   rq   ry   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  time_refr  r  r)   r)   r)   r*   <module>   s    $










 
	




 







	
$
	 
~


