
    j              	          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 dZ	 G d de          Z
dd	ed
edd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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__     R/home/ubuntu/.hermes/hermes-agent/venv/lib/python3.11/site-packages/parso/utils.pyr   r      s+         JJJJJJJJJJJr   r   Fstringkeependsreturnz	list[str]c                    |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_linesr3      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'r4   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er7   r6   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<   r4   )rA   rB   LookupError)r6   r7   r8   rG   s   ``  r   python_bytes_to_unicoderI   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   ).0r/   xs      r   
<listcomp>z version_info.<locals>.<listcomp>   s.    IIIA!q&&QQc!ffIIIr   )parsorK   r+   findallr   r%   )rK   tupls     r   version_inforT   }   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   rV   rV      s"         JJJJJJJJr   rV   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.)rA   tuplelen
ValueErrorr   r   super__gt__selfother	__class__s     r   r`   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 rZ   )rA   r\   r]   r^   r   r   r_   __eq__ra   s     r   rf   zPythonVersionInfo.__eq__   sc    eU## 	55zzQ !JKKKJ
+u44ur   c                 .    |                      |           S N)rf   )rb   rc   s     r   __ne__zPythonVersionInfo.__ne__   s    ;;u%%%%r   )r   r   r   r`   rf   ri   __classcell__)rd   s   @r   rX   rX      s`        ( ( ( ( (    & & & & & & &r   rX   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[   7rM   6z7Sorry, no support yet for those fancy new/old versions.)r+   r>   r^   r   r?   NotImplementedErrorrX   )versionr>   r   r   s       r   _parse_versionrp      s    HEwOOE} < = = 	= AEKKNNE} A::EEaZZEE%&_```JJEUE***r   ro   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")sysrT   rA   rB   	TypeErrorrp   )ro   s    r   parse_version_stringrt      sN     C,RaR00gs## ?=>>>'"""r   )F)r4   r5   rh   )r+   rr   astr   	functoolsr   typingr   r   r&   r   rB   boolr3   bytesrI   rT   rV   rX   rp   rt   r   r   r   <module>rz      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   