
    Mh              	       "   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m	Z	 dZ
 G d de          Zdd	ed
edee         fdZ	 dde	eef         dededefdZdefdZ G d de          Ze G d de                      ZdefdZddedefdZdS )    N)literal_eval)total_ordering)
NamedTupleSequenceUnion)   u    u    c                   .    e Zd ZU eed<   eed<   eed<   dS )VersionmajorminormicroN__name__
__module____qualname__int__annotations__     K/var/www/html/test/jupyter/venv/lib/python3.11/site-packages/parso/utils.pyr   r      s+         JJJJJJJJJJJr   r   Fstringkeependsreturnc                    |r|                      d          }g }t          |          D ]<\  }}	 |d         }|t          v r|                    |           -# t          $ r Y 9w xY wt          |          D ]0}	 ||         ||dz            z   ||<   ||dz   = !# t          $ r Y -w xY w|                     d          s|                     d          s| dk    r|                    d           |S t          j        d|           S )a  
    Intended for Python code. In contrast to Python's :py:meth:`str.splitlines`,
    looks at form feeds and other special characters as normal text. Just
    splits ``\n`` and ``\r\n``.
    Also different: Returns ``[""]`` for an empty string input.

    In Python 2.7 form feeds are used as normal characters when using
    str.splitlines. However in Python 3 somewhere there was a decision to split
    also on form feeds.
    T   
 z
\n|\r\n|\r)	
splitlines	enumerate_NON_LINE_BREAKSappend
IndexErrorreversedendswithresplit)r   r   lstmergeilinelast_chrindexs           r   split_linesr4      sI     /%%  ~~ 	$ 	$GAt$8 ///LLOOO	     e__ 	 	E Z#eai.8E
	NN     ??4   	FOOD$9$9 	Vr\\JJrNNN
xv...s#   A
A#"A#8B
B#"B#utf-8strictsourceencodingerrorsc                       fd}t           t                    r S  |            	 t           |          S # t          $ r |dk    rt           d|          cY S  w xY w)aM  
    Checks for unicode BOMs and PEP 263 encoding declarations. Then returns a
    unicode object like in :py:meth:`bytes.decode`.

    :param encoding: See :py:meth:`bytes.decode` documentation.
    :param errors: See :py:meth:`bytes.decode` documentation. ``errors`` can be
        ``'strict'``, ``'replace'`` or ``'ignore'``.
    c                  L   t          d          }                     |           rdS t          j        d                              d          }t          j        d|          }|r=|                    d          }t          |t                    st          |dd          }|S S )	z
        For the implementation of encoding definitions in Python, look at:
        - http://www.python.org/dev/peps/pep-0263/
        - http://docs.python.org/2/reference/lexical_analysis.html#encoding-declarations
        zb'\xef\xbb\xbf'r5   s   (?:[^\r\n]*(?:\r\n|\r|\n)){0,2}r   s   coding[=:]\s*([-\w.]+)r!   asciireplace)r   
startswithr,   matchgroupsearch
isinstancestr)	byte_markfirst_two_linespossible_encodinger8   r7   s       r   detect_encodingz0python_bytes_to_unicode.<locals>.detect_encodingT   s     !!344	Y'' 	7(#FOOUUVWXXI&@&57 7 	!''**Aa%% /7I..H Or   r=   r5   )rB   rC   LookupError)r7   r8   r9   rH   s   ``  r   python_bytes_to_unicoderJ   I   s         . &#   H
68V,,,   Y
 vw/////s   < !A!A!c                  x    ddl m}  t          j        d|           }t	          d t          |          D              S )z`
    Returns a namedtuple of parso's version, similar to Python's
    ``sys.version_info``.
    r   )__version__z
[a-z]+|\d+c                 B    g | ]\  }}|d k    r|nt          |          S )   )r   ).0r0   xs      r   
<listcomp>z version_info.<locals>.<listcomp>   s.    IIIA!q&&QQc!ffIIIr   )parsorL   r,   findallr   r&   )rL   tupls     r   version_inforU   }   sG    
 "!!!!!:m[11DII4IIIJJr   c                   $    e Zd ZU eed<   eed<   dS )_PythonVersionInfor   r   Nr   r   r   r   rW   rW      s"         JJJJJJJJr   rW   c                   .     e Zd Z fdZ fdZd Z xZS )PythonVersionInfoc                     t          |t                    r4t          |          dk    rt          d          | j        | j        f|k    S t                                          |           | j        | j        fS N   z'Can only compare to tuples of length 2.)rB   tuplelen
ValueErrorr   r   super__gt__selfother	__class__s     r   ra   zPythonVersionInfo.__gt__   sl    eU## 	45zzQ !JKKKJ
+e33u
DJ''r   c                     t          |t                    r4t          |          dk    rt          d          | j        | j        f|k    S t                                          |           d S r[   )rB   r]   r^   r_   r   r   r`   __eq__rb   s     r   rg   zPythonVersionInfo.__eq__   sc    eU## 	55zzQ !JKKKJ
+u44ur   c                 .    |                      |           S N)rg   )rc   rd   s     r   __ne__zPythonVersionInfo.__ne__   s    ;;u%%%%r   )r   r   r   ra   rg   rj   __classcell__)re   s   @r   rY   rY      s`        ( ( ( ( (    & & & & & & &r   rY   c                 @   t          j        d|           }|t          d          t          |                    d                    }|                    d          }|!|dk    rd}n|dk    rd}nt          d          t          |          }t          ||          S )	Nz-(\d+)(?:\.(\d{1,2})(?:\.\d+)?)?((a|b|rc)\d)?$zNThe given version is not in the right format. Use something like "3.8" or "3".r!   r\   7rN   6z7Sorry, no support yet for those fancy new/old versions.)r,   r?   r_   r   r@   NotImplementedErrorrY   )versionr?   r   r   s       r   _parse_versionrq      s    HEwOOE} < = = 	= AEKKNNE} A::EEaZZEE%&_```JJEUE***r   rp   c                     | dt           j        dd         z  } t          | t                    st	          d          t          |           S )z
    Checks for a valid version number (e.g. `3.8` or `3.10.1` or `3`) and
    returns a corresponding version info that is always two characters long in
    decimal.
    Nz%s.%sr\   z#version must be a string like "3.8")sysrU   rB   rC   	TypeErrorrq   )rp   s    r   parse_version_stringru      sN     C,RaR00gs## ?=>>>'"""r   )F)r5   r6   ri   )r,   rs   astr   	functoolsr   typingr   r   r   r'   r   rC   boolr4   bytesrJ   rU   rW   rY   rq   ru   r   r   r   <module>r{      s   				 



       $ $ $ $ $ $ . . . . . . . . . .

     j   )/ )/ )/t )/ )/ )/ )/ )/Z GO1 1#u*1),1@C11 1 1 1hKg K K K K       
 & & & & &* & & &*+0 + + + +*# ## #1B # # # # # #r   