o
    Œõ±jxŒ  ã                	   @  sD  d Z ddlm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 ddlmZ ddlmZ dd	lmZmZ dd
lmZmZmZmZmZmZ ddlmZ ddlmZmZ ddlm Z m!Z!m"Z" G dd„ dej#ƒZ$G dd„ deƒZ%	dJdKdd„Z&dLd)d*„Z'dMd/d0„Z(dNd5d6„Z)dOd;d<„Z*dNd=d>„Z+		?dPd@dAddBdCddDdEœdQdHdI„Z,dS )Rz*This is a python implementation of clip().é    )ÚannotationsN)Úislice)ÚLiteralÚCallableÚOptionalÚ
NamedTupleé   )Úwidth)Úiter_graphemes)Ú	HyperlinkÚHyperlinkParams)Ú_SGR_PATTERNÚ_SGR_STATE_DEFAULTÚ	_SGRStateÚ_sgr_state_updateÚ_sgr_state_is_activeÚ_sgr_state_to_sequence)Ú_clamp_ambiguous_width)Ú
TextSizingÚTextSizingParams)Ú_SEQUENCE_CLASSIFYÚ_HORIZONTAL_CURSOR_MOVEMENTÚINDETERMINATE_EFFECT_SEQUENCEc                   @  s0   e Zd ZdZe ¡ Ze ¡ Ze ¡ Ze ¡ Z	dS )Ú_HyperlinkActionz.Outcome of processing an OSC 8 hyperlink unit.N)
Ú__name__Ú
__module__Ú__qualname__Ú__doc__ÚenumÚautoÚNO_CLOSEÚEMPTYÚOUTSIDEÚVISIBLE© r$   r$   ú€/root/aizidognhua/tmp/workspace/projects/ec89d86c-575f-41c9-af57-ac45cbdbf775/venv/lib/python3.10/site-packages/wcwidth/_clip.pyr      s    r   c                   @  sn   e Zd ZU 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< dZ
ded< dZded< dS )Ú_HyperlinkResultzn
    Result of processing an OSC 8 hyperlink.

    Only the fields relevant to each action are populated.
    r   Úactionr   ÚintÚ	close_endÚinner_widthÚ ÚstrÚopen_seqÚclipped_innerÚ	close_seqÚclipped_widthÚ
hl_col_endN)r   r   r   r   Ú__annotations__r)   r*   r-   r.   r/   r0   r1   r$   r$   r$   r%   r&   %   s   
 r&   Úresultr,   Úcaptured_styleúOptional[_SGRState]Ú	end_styleÚreturnc                 C  s<   |durt |ƒ }r||  } t|du r|n|ƒr| d7 } | S )aZ  
    Apply SGR prefix/suffix around *result*.

    If an SGR state was captured at the first visible character, prefix the result with the
    corresponding SGR sequence, and suffix with a reset if any styles remain active at the end
    of the clipped region.

    *end_style* is the style in effect after the final SGR sequence emitted within the clip window,
    or ``None`` when no such sequence was emitted, the style at the first visible character is still
    in effect.  This matches :func:`wcwidth.propagate_sgr`, which decides the trailing reset by SGR
    state at the end of each line.
    Nz[0m)r   r   )r3   r4   r6   Úprefixr$   r$   r%   Ú_apply_sgr_wrap6   s   r9   ÚtextÚstartr(   ÚendÚfillcharÚtabsizeÚambiguous_widthÚterm_programú
bool | strÚcontrol_codesú$Literal['parse', 'strict', 'ignore']Úparamsr   Ú	match_endÚcolc                C  sæ   t  | |	¡\}}||fdkrttjƒS | |	|… }t|||||d�}|dkr-ttj|d�S |
| }||ks9|
|krAttj||d�S td||
 ƒ}||
 }t	|||||||d|d�	}t|||||d�}ttj
||| ¡ || ¡ ||d�S )	zé
    Process an OSC 8 hyperlink unit.

    Finds the matching close sequence, measures the inner text width, and determines whether the
    hyperlink is empty, outside the clip window, or visible (requiring inner-text clipping).
    )éÿÿÿÿrG   )rB   r>   r?   r@   r   )r)   )r)   r*   F)r=   r>   r?   r@   Úpropagate_sgrrB   )r)   r*   r-   r.   r/   r0   r1   )r   Ú
find_closer&   r   r    r	   r!   r"   ÚmaxÚclipr#   Ú	make_openÚ
make_close)r:   r;   r<   r=   r>   r?   r@   rB   rD   rE   rF   Úclose_startr)   Ú
inner_textr*   r1   Úinner_clip_startÚinner_clip_endr.   r0   r$   r$   r%   Ú_process_hyperlinkL   sR   
ýÿú	ýørR   Úcellsúdict[int, tuple[str, int]]Ú	sequencesúlist[tuple[int, int, str]]c                 C  s\  i }|D ]\}}}|  |g ¡ ||f¡ q| ¡ D ]}	|	 ¡  q| r(t|  ¡ ƒnd}
|r2t| ¡ ƒnd}t|
|ƒ}g }d}t||ƒ}||krŽ| |d¡D ]	\}}| |¡ qL||kr_|d7 }qB|| v ru| | \}}| |¡ ||prd7 }n||  kr|
kr†n n| |¡ |d7 }||ksFt| ¡ ƒD ]}||kr¨|| D ]	\}}| |¡ qžq”d 	|¡S )z»
    Reconstruct the output string from painter's algorithm state.

    Walks columns left-to-right, interleaving escape sequences and cell content, filling gaps with
    *fillchar*.
    rG   r   r$   r   r+   )
Ú
setdefaultÚappendÚvaluesÚsortrJ   ÚkeysÚminÚgetÚsortedÚjoin)rS   rU   r;   r<   r=   Úseqs_by_colÚcol_posÚorderÚseq_textÚentriesÚmax_cell_colÚmax_seq_colÚmax_colÚpartsÚwalk_colÚ	col_limitÚ_Ú	cell_textÚcell_wÚcr$   r$   r%   Ú_reconstruct_painter’   s>   




ð€
ro   rH   ÚboolÚstrictú4tuple[str, Optional[_SGRState], Optional[_SGRState]]c                   sà  g }
d}d}d}d}|rt nd}|t| ƒk �rh| | }||kr:|dvr:|dur)�n?|  d|d ¡}|dkr7�n1|}q|dk�r¥t | |¡}|sQ|
 |¡ |d7 }q| d¡dur{|r{|dur{t|| ¡ ƒ}|durv||k rv|
 | ¡ ¡ |}| ¡ }qt	 
| ¡ ¡ }rût| |||||||	|| ¡ |d�}|jtju r§|
 | ¡ ¡ | ¡ }nS|jtju r±|j}nI|jtju rÀ||j7 }|j}n:|
 |j¡ |
 |j¡ |
 |j¡ |rÚ|du rÚ|}|rò|duròt |j¡D ]}t|| ¡ ƒ}|}qæ||j7 }|j}q| d	¡ }du�r„| d
¡�pd}| d¡}|du�sJ ‚ttj||	d�||ƒ}| |¡}||k�rK|| |k�rK|
 | ¡ ¡ |�rF|du �rF|}||7 }n4||k �r{|| |k�r{g ‰ d‡ fdd„}t||||||||ƒ}|
 ˆ ¡ |�rz|du �rz|}n||7 }| ¡ }q| ¡ }|�r›t |¡�r›t d|› d|›�ƒ‚|
 |¡ | ¡ }q|dk�rí|dk�rã||||   }||k �râ||  k�rÈ|k �rÙn n|
 d¡ |�rÙ|du �rÙ|}|d7 }||k �s¼n|
 d¡ |d7 }qt!t"| |d�ƒ}t#|||d�}|dk�r||  k�r|k �rn nI|
 |¡ nC||k�r1|| |k�r1|
 |¡ |�r0|du �r0|}n'||k �rX|| |k�rX|
 |t$||| ƒt%||ƒ  ¡ |�rX|du �rX|}||7 }|t|ƒ7 }|t| ƒk sd &|
¡||fS )z£
    Clip text without cursor movement (simple append-to-output path).

    Returns ``(result, captured_style, end_style)``.  The caller applies SGR wrapping.
    r   Nú	úr   rG   Ú
sgr_params©rD   rE   rF   Úts_metaÚts_textr+   Úts_term©rB   Úsr,   Ú_wr(   Ú_colr7   ÚNonec                   s   ˆ   | ¡ d S ©N)rX   )r{   r|   r}   ©Úts_partsr$   r%   Ú	_ts_writeG  s   z_clip_simple.<locals>._ts_writeú*Indeterminate cursor sequence at position ú, ú	ú ©r;   ©r?   r@   )r{   r,   r|   r(   r}   r(   r7   r~   )'r   ÚlenÚfindr   ÚmatchrX   Úgroupr   r<   r   ÚparserR   r'   r   r    r!   r)   r"   r*   r-   r.   r/   r   Úfinditerr   r   Úfrom_paramsÚdisplay_widthÚmake_sequenceÚ_text_sizing_clipÚextendr   Ú
ValueErrorÚnextr
   r	   r\   rJ   r_   ) r:   r;   r<   rH   r?   r@   r=   r>   rq   rB   ÚoutputrF   Úidxr4   r6   Úcurrent_styleÚcharÚnext_escÚmÚhl_stateÚrÚsgr_mrw   rx   ry   ÚtsÚts_widthr‚   ÚseqÚnext_tabÚgraphemeÚ
grapheme_wr$   r€   r%   Ú_clip_simpleÉ   s  	


ü



þ

ý
€ÿÿ





û€
ÿ

€
€" �í r¥   rŸ   r   Úwrite_cellsúCallable[[str, int, int], None]c              	     sê  ˆ  |¡}||kr|| |krˆˆ ¡ ||ƒ || S ||ks%|| |kr)|| S td|| ƒ}	t||| ƒ| }
ˆjj‰g }ˆjjdkrnttˆj	ƒˆjjƒD ]	}| 
|ˆf¡ qOtˆjjt|ƒ ƒD ]	}| 
dˆf¡ qcntˆj	ƒD ]}| 
|t|||d�ˆ f¡ qsg ‰ d‡ ‡‡‡fdd	„}||	 }d}|D ]T\}}|| }||	kr§|}q˜||
kr­ n@t||
ƒt||	ƒ }||krÐ|dkrÐˆ sÈ|t||	ƒ }ˆ  
||f¡ n||ƒ |t||	ƒ }t|ƒD ]
}ˆ|d
|| ƒ qß|}q˜||ƒ || S )zÂ
    Emit tokens for a text-sizing (OSC 66) sequence, clipped to (start, end).

    Calls *write_cells(text, width, col)* for each emitted cell or sequence. Returns new column
    position.
    r   r+   rˆ   Ú	flush_colr(   r7   r~   c                   sŠ   ˆ sd S dd„ ˆ D ƒ}t dd„ ˆ D ƒƒ}tˆˆjjdkr t|ƒndˆjjˆjjˆjjˆjjƒ}ˆt	|d 
|¡ˆjƒ ¡ || ƒ ˆ  ¡  d S )Nc                 S  s   g | ]}|d  ‘qS )r   r$   ©Ú.0Úur$   r$   r%   Ú
<listcomp>¹  s    z4_text_sizing_clip.<locals>.flush.<locals>.<listcomp>c                 s  s   � | ]}|d  V  qdS )r   Nr$   r©   r$   r$   r%   Ú	<genexpr>º  s   € z3_text_sizing_clip.<locals>.flush.<locals>.<genexpr>r   r+   )Úsumr   rD   r	   r‰   Ú	numeratorÚdenominatorÚvertical_alignÚhorizontal_alignr   r_   Ú
terminatorr‘   Úclear)r¨   ÚtextsÚtotal_wrD   ©Úpending_unitsÚscalerŸ   r¦   r$   r%   Úflush¶  s    üýz _text_sizing_clip.<locals>.flushr   N)r¨   r(   r7   r~   )r�   r‘   rJ   r\   rD   r¹   r	   r   r
   r:   rX   Úranger‰   )rŸ   rF   r;   r<   r=   r?   r@   r¦   r    Ú	rel_startÚrel_endÚunitsÚgrk   rº   Úflush_col_posÚunit_posÚ	unit_textÚunit_wÚunit_endÚoverlapÚ	abs_startÚir$   r·   r%   r’   ˆ  s^   
ÿÿÿÿr’   c          (        sŽ  i ‰t ƒ ‰g ‰d‰d}
d}d‰ d}ˆrtnd‰d}	d+d,‡ ‡‡‡‡‡‡‡fdd„}|t| ƒk �r<| | }|
|kr‹|dvr‹|du sLd|  krJ|k rpn n$t|  d¡|  d¡|  d¡ƒ|k r`d}nt | |¡}|du rldn| ¡ }|dk r‹ˆ durz�nÂ|  d|d ¡}|dkrˆ�n´|}q)|dk�rht	 
| |¡}|s©ˆ |
ˆ|f¡ ˆd7 ‰|d7 }q)| d¡durÚˆrÚˆdurÚtˆ| ¡ ƒ‰ˆ durÕ|
|k rÕˆ |
ˆ| ¡ f¡ ˆd7 ‰ˆ}| ¡ }q)t | ¡ ¡ }�rut| ||ˆ||||	|| ¡ |
d�}|jtju �rˆ |
ˆ| ¡ f¡ ˆd7 ‰| ¡ }ne|jtju �r|j}nZ|jtju �r*|
|j7 }
|j}nJˆ |
ˆ|jf¡ ˆd7 ‰||j|j|
dd� |
|j7 }
ˆ |
ˆ|jf¡ ˆd7 ‰ˆ�rnˆdu�rnt |j¡D ]}tˆ| ¡ ƒ‰ˆ}�qa|j}
|j}q)| d¡ }du�r®| d¡�p†d}| d¡}|du�s“J ‚tt j!||	d�||ƒ}t"||
||ˆ|||ƒ}
| ¡ }q)| ¡ }|�rÅt# 
|¡�rÅt$d|› d|›�ƒ‚| d ¡ }du�rß|�rØt%|ƒd nd}
| ¡ }q)| d!¡ }du�r|�rðt%|ƒnd}|
| }|
|k �r||k�rt&t|
|ƒt'||ƒƒD ]	}|ˆd|ƒ �q|}
| ¡ }q)| d"¡ } du�rU| �r-t%| ƒnd}!|�rE|!|
k�rEt$d#|› d$|!› d%|
› d&�ƒ‚|
|!8 }
|
dk �rPd}
| ¡ }q)ˆ |
ˆ| ¡ f¡ ˆd7 ‰| ¡ }q)|dk�rtd}
|d7 }q)|dk�r‡|
dk�r‚|
d8 }
|d7 }q)|d'k�rÂ|dk�r±|
||
|   }"t&t|
|ƒt'|"|ƒƒD ]	}#|d(d|#ƒ �q¤|"}
nˆ |
ˆd'f¡ ˆd7 ‰|d7 }q)t(t)| |d)�ƒ}$t*|$||d*�}%|%dk�rñ||
  k�râ|k �rðn nHˆ |
ˆ|$f¡ ˆd7 ‰n;|
|k�r|
|% |k�r||$|%|
ƒ n(|
|k �r,|
|% |k�r,t||
ƒ}&t&t'||
|% ƒ|& ƒD ]}'|ˆd|&|' ƒ �q |
|%7 }
|t|$ƒ7 }|t| ƒk s0t+ˆˆ||ˆƒˆ |fS )-zœ
    Clip text with cursor movement (painter's algorithm path).

    Returns ``(result, captured_style, end_style)``.  The caller applies SGR wrapping.
    r   NFr{   r,   Úwr(   Ú	write_colÚis_hyperlinkrp   r7   r~   c                   s  |dkr| rˆ  |ˆ| f¡ ˆd7 ‰ˆrˆ du rˆ‰ dS t|ƒD ]I}|| }|dkrEˆ |d d¡d dkrEˆdfˆ|d < ˆ |d ¡ ˆ |d¡d dkr^ˆdfˆ|d < ˆ |d ¡ ˆ |d¡ ˆ |¡ q | |fˆ|< |r€t|ƒD ]	}ˆ || ¡ qvˆrŠˆ du rŒˆ‰ dS dS dS )zIWrite *w* cells of text *s* at *write_col*, handling wide-char splitting.r   r   N)r+   r   é   )rX   r»   r]   ÚdiscardÚpopÚadd)r{   rÈ   rÉ   rÊ   ÚoffsetÚsrc_col©r4   rS   r˜   r=   Úhyperlink_cellsrH   Ú	seq_orderrU   r$   r%   Ú_write_cells  s0    ÿz#_clip_painter.<locals>._write_cellsrs   úúrt   rG   r   ru   rv   T)rÊ   rw   rx   r+   ry   rz   rƒ   r„   Úhpa_nÚ
cforward_nÚcbackward_nz!Cursor left movement at position z would move z cells left from column z, exceeding string startr…   r†   r‡   rˆ   )F)
r{   r,   rÈ   r(   rÉ   r(   rÊ   rp   r7   r~   ),Úsetr   r‰   rJ   Úrfindr   Úsearchr<   rŠ   r   r‹   rX   rŒ   r   r   r�   rR   r'   r   r    r!   r)   r"   r*   r-   r.   r0   r/   r   rŽ   r1   r   r   r�   r’   r   r”   r(   r»   r\   r•   r
   r	   ro   )(r:   r;   r<   rH   r?   r@   r=   r>   rq   rB   rF   r—   r6   Únext_movementrÔ   r™   Úfoundrš   r›   rœ   r�   rž   rw   rx   ry   rŸ   r¡   r×   rØ   Ú	n_forwardÚmove_endrÇ   rÙ   Ú
n_backwardr¢   Úfill_colr£   r¤   Ú
clip_startrÏ   r$   rÑ   r%   Ú_clip_painterà  sT  ÿ "

ü

ÿ

þýÿÿÿÿÿ





ÿ
€
 �Ç ;ÿrä   rG   r†   é   Tr�   F)r=   r>   r?   rH   rB   Ú
overtypingr@   ræ   úOptional[bool]c                C  sæ   t |dƒ}|dk r|dkrtd|› �ƒ‚tj}||krdS |  ¡ r+|  ¡ r+| ||… S t|ƒ}d| v }
|r9|
s9d}|du rS|dkoQd	| v pQd
| v pQ|
oQtt 	| ¡ƒ}n|r[|dkr[d}|r_t
nt}t|| |||||	|||dk|d�
Ž S )uŽ  
    Clip text to display columns (start, end) while preserving all terminal sequences.

    This function extracts a substring based on visible column positions rather than character
    indices. Terminal escape sequences are preserved in output. If a wide character (width of 2) is
    split at a boundary, it is replaced with ``fillchar``.

    TAB characters (``\t``) are expanded to spaces up to the next tab stop, controlled by the
    ``tabsize`` parameter.  When cursor movement is detected, a "painter's algorithm" is used unless
    ``overtyping=False`` is set.  Cursor movement control codes are parsed for their effects instead
    of ignored.  For these operations, it is assumed that ``text`` begins at column 0.

    For text containing **OSC 8 hyperlinks**, the visible text inside a hyperlink is clipped to the
    requested column range and the hyperlink sequence is rebuilt::

        >>> clip('\x1b]8;;http://example.com\x07Click This link\x1b]8;;\x07', 6, 10)
        '\x1b]8;;http://example.com\x07This\x1b]8;;\x07'

    :param text: String to clip, may contain terminal escape sequences.
    :param start: Absolute starting column (inclusive, 0-indexed), default ``0``.
    :param end: Absolute ending column (exclusive).  The default value, ``-1``,
        signifies "to the end of the line", clipping only from *start* without
        requiring the caller to measure the display width of *text*.
    :param fillchar: Character to use when a wide character must be split at
        a boundary (default space). Must have display width of 1.
    :param tabsize: Tab stop width (default 8). Set to 0 to pass tabs through
        as zero-width (preserved in output but don't advance column position).
    :param ambiguous_width: Width to use for East Asian Ambiguous (A)
        characters. Default is ``1`` (narrow). Set to ``2`` for CJK contexts.
    :param propagate_sgr: If True (default), SGR (terminal styling) sequences
        are propagated, matching :func:`propagate_sgr`.  The result begins with
        any style active at the start position, retains any style changes
        occurring within the clipped region at their original position, and
        ends with a reset sequence if styles are active at the end position.
    :param control_codes: How to handle control characters and sequences:

        - ``'parse'`` (default): Track horizontal cursor movement and clip
          hyperlink text.  Cursor overwrite is always allowed, with best effort
          results; indeterminate sequences (home, clear, reset, etc.) are
          preserved as zero-width.
        - ``'strict'``: Like ``parse``, but raises :exc:`ValueError` on
          sequences with indeterminate effects (cursor home, clear screen,
          reset, vertical movement, etc.) matching :func:`width` behavior.
          Also raises on out-of-bounds horizontal cursor movement.
        - ``'ignore'``: All control characters are treated as zero-width.
          Cursor movement is not tracked (fastest path).

    :param overtyping: Whether to use the painter's algorithm for cursor
        movement (``\b`` backspace, ``\r`` carriage return, and CSI cursor
        left/right/position sequences).  When ``None`` (default), auto-detects
        by scanning for these characters in *text*.  Set to ``False`` for improved
        performance when the caller knows *text* contains no cursor movement
        characters.  Set to ``True`` to force the painter's algorithm (useful
        for testing).  Has no effect when ``control_codes='ignore'``.
    :param term_program: Terminal software identifier for table correction.
        ``False`` (default) disables override lookup.  ``True`` reads the
        ``TERM_PROGRAM`` or ``TERM`` environment variable for auto-detection.
        Accepts a canonical terminal name matching :func:`list_term_programs`,
        such as from XTVERSION_, ENQ_, or ``TERM_PROGRAM``.

        .. versionadded:: 0.8.0

    :returns: Substring of ``text`` spanning display columns (start, end),
        with all terminal sequences preserved and wide characters at boundaries
        replaced with ``fillchar``.

    :raises ValueError: If ``end`` is negative and not ``-1``, or if
        ``control_codes='strict'`` and an indeterminate-effect sequence or
        out-of-bounds cursor movement is encountered.

    SGR (terminal styling) sequences are propagated by default. The result
    begins with any active style and ends with a reset::

        >>> clip('\x1b[1;34mHello world\x1b[0m', 6, 11)
        '\x1b[1;34mworld\x1b[0m'
        >>> clip('\x1b[1mbold\x1b[m normal', 1, 9)
        '\x1b[1mold\x1b[m norm'

    Set ``propagate_sgr=False`` to disable this behavior.

    .. versionadded:: 0.3.0

    .. versionchanged:: 0.5.0
       Added ``propagate_sgr`` parameter (default True).

    .. versionchanged:: 0.7.0
       Added ``control_codes`` parameter (default 'parse').
       OSC 8 hyperlink-aware clipping.  OSC 66 text sizing protocol support.
       Added ``overtyping`` parameter (default None, auto-detect).

    .. versionchanged:: 0.8.4
       ``start`` now defaults to ``0`` and ``end`` to ``-1``, meaning "to the
       end of the line"::

           >>> clip('\x1b[1;34mHello world\x1b[0m', 6)
           '\x1b[1;34mworld\x1b[0m'

    Example::

        >>> clip('hello world', 0, 5)
        'hello'
        >>> clip('ä¸­æ–‡å­—', 0, 3)  # Wide char split at column 3
        'ä¸­ '
        >>> clip('a\tb', 0, 10)  # Tab expanded to spaces
        'a       b'
    r   rG   z5end must be -1 (to end of line) or non-negative, got r+   rt   FNÚignorerÕ   rÖ   rq   )
r:   r;   r<   rH   r?   r@   r=   r>   rq   rB   )rJ   r”   ÚsysÚmaxsizeÚisasciiÚisprintabler   rp   r   rÜ   rä   r¥   r9   )r:   r;   r<   r=   r>   r?   rH   rB   ræ   r@   Úhas_escÚfn_clipr$   r$   r%   rK   è  sF   
wÿýörK   r   )r3   r,   r4   r5   r6   r5   r7   r,   )r:   r,   r;   r(   r<   r(   r=   r,   r>   r(   r?   r(   r@   rA   rB   rC   rD   r   rE   r(   rF   r(   r7   r&   )rS   rT   rU   rV   r;   r(   r<   r(   r=   r,   r7   r,   )r:   r,   r;   r(   r<   r(   rH   rp   r?   r(   r@   rA   r=   r,   r>   r(   rq   rp   rB   rC   r7   rr   )rŸ   r   rF   r(   r;   r(   r<   r(   r=   r,   r?   r(   r@   rA   r¦   r§   r7   r(   )r   rG   )r:   r,   r;   r(   r<   r(   r=   r,   r>   r(   r?   r(   rH   rp   rB   rC   ræ   rç   r@   rA   r7   r,   )-r   Ú
__future__r   ré   r   Ú	itertoolsr   Útypingr   r   r   r   Ú_widthr	   r£   r
   Ú	hyperlinkr   r   Ú	sgr_stater   r   r   r   r   r   Ú
_constantsr   Útext_sizingr   r   Úescape_sequencesr   r   r   ÚEnumr   r&   r9   rR   ro   r¥   r’   rä   rK   r$   r$   r$   r%   Ú<module>   sH     	ÿ

F
7 
@
X  ýõ