
    id                     "   d dl mZ d dlmZ d dl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mZmZ ddlmZmZmZmZmZ ddlmZmZ dd	lmZ e	r
dd
lmZm Z m!Z!  G d de          Z"eee"         ee"ee#e$f         f         ee"e#e#f         f         Z% e             G d de                      Z& G d d          Z' G d d          Z(e)dk    r?d dl*mZ d dl+m,Z, d dl-m.Z. dZ/ e.j0        d          Z1 e            Ze2                    d           e3                    d           e3                    d           e3                     e,e/dd                     e3                                 e3                    d            e4e5                    e1                    Z6e3                    e6           e3                                 e3                    d            e3                    e1           e3                    d!           d"S d"S )#    )IntEnum)	lru_cache)filterfalse)
attrgetter)
TYPE_CHECKINGDictIterableList
NamedTupleOptionalSequenceTupleTypeUnion   )_is_single_cell_widthscached_cell_lencell_lenget_character_cell_sizeset_cell_size)Result	rich_repr)Style)ConsoleConsoleOptionsRenderResultc                   R    e Zd ZdZdZdZdZdZdZdZ	dZ
d	Zd
ZdZdZdZdZdZdZdZdS )ControlTypezDNon-printable control codes which typically translate to ANSI codes.r                        	   
                     N)__name__
__module____qualname____doc__BELLCARRIAGE_RETURNHOMECLEARSHOW_CURSORHIDE_CURSORENABLE_ALT_SCREENDISABLE_ALT_SCREEN	CURSOR_UPCURSOR_DOWNCURSOR_FORWARDCURSOR_BACKWARDCURSOR_MOVE_TO_COLUMNCURSOR_MOVE_TOERASE_IN_LINESET_WINDOW_TITLE     R/var/www/html/crypto-bot/backend/venv/lib/python3.11/site-packages/rich/segment.pyr   r       sj        NNDODEKKIKNONMrC   r   c                      e Zd ZU dZeed<   dZee         ed<   dZ	ee
e                  ed<   edefd            ZdefdZdefd	Zedefd
            Ze ed          dd deded         fd                        Zdeded         fdZed2d            Ze	 	 d3ded          dee         dee         ded          fd            Ze	 d4ded          deded          fd            Zeded          deed                   fd            Zeded          deeed          ef                  fd            Ze	 	 	 d5ded          dedee         dededeed                   fd            Z e	 	 d6ded          dedee         deded          f
d             Z!eded          defd!            Z"ed"eed                   deeef         fd#            Z#e	 	 	 d7d"eed                   d$ed%ee         dee         d&edeed                   fd'            Z$e	 d4d(e%d          d"eed                   d$ed%eded&edeed                   fd)            Z&e	 d4d(e%d          d"eed                   d$ed%eded&edeed                   fd*            Z'e	 d4d(e%d          d"eed                   d$ed%eded&edeed                   fd+            Z(eded          ded          fd,            Z)eded          ded          fd-            Z*eded          ded          fd.            Z+eded          ded          fd/            Z,eded          d0ee         deed                   fd1            Z-dS )8Segmenta  A piece of text with associated style. Segments are produced by the Console render process and
    are ultimately converted in to strings to be written to the terminal.

    Args:
        text (str): A piece of text.
        style (:class:`~rich.style.Style`, optional): An optional style to apply to the text.
        control (Tuple[ControlCode], optional): Optional sequence of control codes.

    Attributes:
        cell_length (int): The cell length of this Segment.
    textNstylecontrolreturnc                 4    | \  }}}|rdnt          |          S )zzThe number of terminal cells required to display self.text.

        Returns:
            int: A number of cells.
        r   )r   )selfrG   _stylerI   s       rD   cell_lengthzSegment.cell_lengthN   s%     !%fg/qq$/rC   c              #   v   K   | j         V  | j        | j        | j        V  d S d S | j        V  | j        V  d S N)rG   rI   rH   rL   s    rD   __rich_repr__zSegment.__rich_repr__X   sa      i<z%j      &% *,rC   c                 *    t          | j                  S )z#Check if the segment contains text.)boolrG   rQ   s    rD   __bool__zSegment.__bool__a   s    DIrC   c                     | j         duS )z,Check if the segment contains control codes.N)rI   rQ   s    rD   
is_controlzSegment.is_controle   s     |4''rC   i @  segmentcut)rF   rF   c                    |\  }}}t           }|j        }||k    r| |d||          fS t          }t          ||z  t	          |          z            }		 |d|	         }
t          |
          }||z
  }|s" ||
||           |||	d         ||          fS |dk    rH |||	                   dk    r3 ||d|	         dz   ||           |d||	dz   d         z   ||          fS |dk    rK |||	dz
                     dk    r3 ||d|	dz
           dz   ||           |d||	d         z   ||          fS ||k     r|	dz  }	n|	dz  }	)a\  Split a segment in to two at a given cell position.

        Note that splitting a double-width character, may result in that character turning
        into two spaces.

        Args:
            segment (Segment): A segment to split.
            cut (int): A cell position to cut on.

        Returns:
            A tuple of two segments.
         TNr    r   )rF   rN   r   intlenr   )clsrX   rY   rG   rH   rI   _SegmentrN   	cell_sizeposbeforecell_posout_bys                rD   _split_cellszSegment._split_cellsj   s     'eW)+HHR8888+	3$D		122	$3$ZF''H^F HVUG44HT#$$Z88  ||		$s) 4 4 9 9HT$3$Z#-ug>>HS4a		?2E7CC  ||		$sQw- 8 8A = =HT)C!G)_s2E7CCHS4:-ug>>  #~~qq-	rC   c                    | \  }}}|dk    sJ t          |          rX|t          |          k    r| t          d||          fS t          |d|         ||          t          ||d         ||          fS |                     | |          S )ax  Split segment in to two segments at the specified column.

        If the cut point falls in the middle of a 2-cell wide character then it is replaced
        by two spaces, to preserve the display width of the parent segment.

        Args:
            cut (int): Offset within the segment to cut.

        Returns:
            Tuple[Segment, Segment]: Two segments.
        r   r[   N)r   r_   rF   rg   )rL   rY   rG   rH   rI   s        rD   split_cellszSegment.split_cells   s      $eWaxxxx!$'' 	c$iiWR8888TcT
E733STT
E733 
   s+++rC   c                      | d          S )zMake a new line segment.
rB   )r`   s    rD   linezSegment.line   s     s4yyrC   segments
post_stylec                 b     |}|r|j          fd|D             }r fd|D             }|S )a  Apply style(s) to an iterable of segments.

        Returns an iterable of segments where the style is replaced by ``style + segment.style + post_style``.

        Args:
            segments (Iterable[Segment]): Segments to process.
            style (Style, optional): Base style. Defaults to None.
            post_style (Style, optional): Style to apply on top of segment style. Defaults to None.

        Returns:
            Iterable[Segments]: A new iterable of segments (possibly the same iterable).
        c              3   T   K   | ]"\  }}} ||rd n
 |          |          V  #d S rP   rB   ).0rG   rM   rI   applyr`   s       rD   	<genexpr>z&Segment.apply_style.<locals>.<genexpr>   s\        )D&' D'<$$uuV}}gFF     rC   c              3   P   K   | ] \  }}} ||rd n|r|z   n|          V  !d S rP   rB   )rq   rG   rM   rI   r`   rn   s       rD   rs   z&Segment.apply_style.<locals>.<genexpr>   sr         *D&'  #M5;Kfz11      rC   )__add__)r`   rm   rH   rn   result_segmentsrr   s   `  ` @rD   apply_stylezSegment.apply_style   s    & # 	ME    -<  O  	     .=  O rC   FrW   c                 z    |rt          t          d          |          S t          t          d          |          S )a2  Filter segments by ``is_control`` attribute.

        Args:
            segments (Iterable[Segment]): An iterable of Segment instances.
            is_control (bool, optional): is_control flag to match in search.

        Returns:
            Iterable[Segment]: And iterable of Segment instances.

        rI   )filterr   r   )r`   rm   rW   s      rD   filter_controlzSegment.filter_control   s=      	@*Y//:::z)44h???rC   c              #      K   g }|j         }|D ]g}d|j        v rQ|j        sJ|\  }}}|rA|                    d          \  }}	}|r | | ||                     |	r|V  g }|j         }|A\ ||           h|r|V  dS dS )a   Split a sequence of segments in to a list of lines.

        Args:
            segments (Iterable[Segment]): Segments potentially containing line feeds.

        Yields:
            Iterable[List[Segment]]: Iterable of segment lists, one per line.
        rk   NappendrG   rI   	partition
r`   rm   rl   r}   rX   rG   rH   __textnew_lines
             rD   split_lineszSegment.split_lines   s       ! 	  	 Gw|##GO#!(eQ -,0NN4,@,@)E8T 2ss5%00111 -"


!!%  - w 	JJJJJ	 	rC   c              #     K   g }|j         }|D ]i}d|j        v rS|j        sL|\  }}}|rC|                    d          \  }}	}|r | | ||                     |	r|dfV  g }|j         }|C^ ||           j|r|dfV  dS dS )a2  Split a sequence of segments in to a list of lines and a boolean to indicate if there was a new line.

        Args:
            segments (Iterable[Segment]): Segments potentially containing line feeds.

        Yields:
            Iterable[List[Segment]]: Iterable of segment lists, one per line.
        rk   TFNr|   r   s
             rD   split_lines_terminatorzSegment.split_lines_terminator  s       ! 	  	 Gw|##GO#!(eQ -,0NN4,@,@)E8T 2ss5%00111 -#Tl***!!%  - w 	 -	  	 rC   Tlengthpadinclude_new_linesc              #     K   g }|j         }| j        } | d          }	|D ]}
d|
j        v r|
j        s{|
\  }}}|rr|                    d          \  }}}|r | | ||                     |r> |||||          }|r|                     |	           |V  |                                 |r ||
           |r |||||          V  dS dS )a  Split segments in to lines, and crop lines greater than a given length.

        Args:
            segments (Iterable[Segment]): An iterable of segments, probably
                generated from console.render.
            length (int): Desired line length.
            style (Style, optional): Style to use for any padding.
            pad (bool): Enable padding of lines that are less than `length`.

        Returns:
            Iterable[List[Segment]]: An iterable of lines of segments.
        rk   )rH   r   N)r}   adjust_line_lengthrG   rI   r~   clear)r`   rm   r   rH   r   r   rl   r}   r   new_line_segmentrX   rG   segment_styler   r   r   cropped_lines                    rD   split_and_crop_lineszSegment.split_and_crop_lines2  sV     * ! 33t99 	  	 Gw|##GO#)0&mQ %,0NN4,@,@)E8T :ss5-88999 %'9'9 &3( ( ( - B(//0@AAA****

  % w 	I$$T6CHHHHHHHH	I 	IrC   rl   c                 z   t          d |D                       }||k     r$|r| | d||z
  z  |          gz   }n|dd         }nw||k    rgg }|j        }d}|D ]X}|j        }	||	z   |k     s|j        r ||           ||	z  }*|\  }
}}t	          |
||z
            }
 | | |
|                      n
|dd         }|S )a  Adjust a line to a given width (cropping or padding as required).

        Args:
            segments (Iterable[Segment]): A list of segments in a single line.
            length (int): The desired width of the line.
            style (Style, optional): The style of padding if used (space on the end). Defaults to None.
            pad (bool, optional): Pad lines with spaces if they are shorter than `length`. Defaults to True.

        Returns:
            List[Segment]: A line of segments with the desired length.
        c              3   $   K   | ]}|j         V  d S rP   )rN   )rq   rX   s     rD   rs   z-Segment.adjust_line_length.<locals>.<genexpr>t  s%      BB''-BBBBBBrC   r]   Nr   )sumr}   rN   rI   r   )r`   rl   r   rH   r   line_lengthr   r}   rX   segment_lengthrG   r   r   s                rD   r   zSegment.adjust_line_lengtha  s   & BBTBBBBB  #33sf{.B'CU#K#K"LL76!!H_FK 	 	!(!4/&88GO8F7OOO>1KK-4*D-(v/CDDDF33t]33444AAAwHrC   c                 H    t           t          fd|D                       S )zGet the length of list of segments.

        Args:
            line (List[Segment]): A line encoded as a list of Segments (assumes no '\\n' characters),

        Returns:
            int: The length of the line.
        c              3   :   K   | ]\  }}}| |          V  d S rP   rB   )rq   rG   rH   rI   	_cell_lens       rD   rs   z*Segment.get_line_length.<locals>.<genexpr>  s7      SS';tUG7S99T??SSSSSSrC   )r   r   )r`   rl   r   s     @rD   get_line_lengthzSegment.get_line_length  s-     	SSSStSSSSSSrC   linesc                 r    | j         |rt          fd|D                       nd}|t          |          fS )zGet the shape (enclosing rectangle) of a list of lines.

        Args:
            lines (List[List[Segment]]): A list of lines (no '\\n' characters).

        Returns:
            Tuple[int, int]: Width and height in characters.
        c              3   .   K   | ]} |          V  d S rP   rB   )rq   rl   r   s     rD   rs   z$Segment.get_shape.<locals>.<genexpr>  s-      @@$--@@@@@@rC   r   )r   maxr_   )r`   r   	max_widthr   s      @rD   	get_shapezSegment.get_shape  sJ     -DIPC@@@@%@@@@@@q	3u::&&rC   widthheight	new_linesc                 <  	 |pt          |          }|r | dz  dz             gn | dz            g}| j        	|d|         }	fd|D             |dd<   t          |          |k     r)|                    |g|t          |          z
  z             |S )a  Set the shape of a list of lines (enclosing rectangle).

        Args:
            lines (List[List[Segment]]): A list of lines.
            width (int): Desired width.
            height (int, optional): Desired height or None for no change.
            style (Style, optional): Style of any padding added.
            new_lines (bool, optional): Padded lines should include "
". Defaults to False.

        Returns:
            List[List[Segment]]: New list of lines.
        r]   rk   Nc                 ,    g | ]} |           S ))rH   rB   )rq   rl   r   rH   r   s     rD   
<listcomp>z%Segment.set_shape.<locals>.<listcomp>  s9     
 
 
=AtU%888
 
 
rC   )r_   r   extend)
r`   r   r   r   rH   r   _heightblankshaped_linesr   s
     ` `    @rD   	set_shapezSegment.set_shape  s    * &CJJ 1:XSSut#U++,,C%KQV@W@W?X 	 !3XgX
 
 
 
 
 
EJ
 
 
QQQ |w&&7S5F5F+F GHHHrC   r`   c                     |t          |          z
  }|s
|dd         S |d|         }|r | d|z  dz   |          n | d|z  |          }||gg|z  z   }|S )a  Aligns lines to top (adds extra lines to bottom as required).

        Args:
            lines (List[List[Segment]]): A list of lines.
            width (int): Desired width.
            height (int, optional): Desired height or None for no change.
            style (Style): Style of any padding added.
            new_lines (bool, optional): Padded lines should include "
". Defaults to False.

        Returns:
            List[List[Segment]]: New list of lines.
        Nr]   rk   r_   r`   r   r   r   rH   r   extra_linesr   s           rD   	align_topzSegment.align_top  s    * s5zz) 	8Ogvg2;XC%K$&...S5[RWAXAX%	K//rC   c                     |t          |          z
  }|s
|dd         S |d|         }|r | d|z  dz   |          n | d|z  |          }|gg|z  |z   }|S )a  Aligns render to bottom (adds extra lines above as required).

        Args:
            lines (List[List[Segment]]): A list of lines.
            width (int): Desired width.
            height (int, optional): Desired height or None for no change.
            style (Style): Style of any padding added. Defaults to None.
            new_lines (bool, optional): Padded lines should include "
". Defaults to False.

        Returns:
            List[List[Segment]]: New list of lines.
        Nr]   rk   r   r   s           rD   align_bottomzSegment.align_bottom  s    * s5zz) 	8Ogvg2;XC%K$&...S5[RWAXAX	K'%/rC   c                     |t          |          z
  }|s
|dd         S |d|         }|r | d|z  dz   |          n | d|z  |          }|dz  }||z
  }	|gg|z  |z   |gg|	z  z   }|S )a  Aligns lines to middle (adds extra lines to above and below as required).

        Args:
            lines (List[List[Segment]]): A list of lines.
            width (int): Desired width.
            height (int, optional): Desired height or None for no change.
            style (Style): Style of any padding added.
            new_lines (bool, optional): Padded lines should include "
". Defaults to False.

        Returns:
            List[List[Segment]]: New list of lines.
        Nr]   rk   r   r   )
r`   r   r   r   rH   r   r   r   	top_linesbottom_liness
             rD   align_middlezSegment.align_middle  s    * s5zz) 	8Ogvg2;XC%K$&...S5[RWAXAX1$	"Y.	I%-%	L0HHrC   c              #     K   t          |          }	 t          |          }n# t          $ r Y dS w xY wt          }|D ]>}|j        |j        k    r&|j        s ||j        |j        z   |j                  }8|V  |}?|V  dS )a)  Simplify an iterable of segments by combining contiguous segments with the same style.

        Args:
            segments (Iterable[Segment]): An iterable of segments.

        Returns:
            Iterable[Segment]: A possibly smaller iterable of segments that will render the same way.
        N)iternextStopIterationrF   rH   rI   rG   )r`   rm   iter_segmentslast_segmentra   rX   s         rD   simplifyzSegment.simplify&  s       X	..LL 	 	 	FF	 $ 	' 	'G!W]227?2'x %4l6H    #"""&s   # 
11c              #      K   |D ]@}|j         s|j        |V  |\  }}} | ||r|                    d          nd          V  AdS )zRemove all links from an iterable of styles.

        Args:
            segments (Iterable[Segment]): An iterable segments.

        Yields:
            Segment: Segments with link removed.
        N)rI   rH   update_link)r`   rm   rX   rG   rH   _controls         rD   strip_linkszSegment.strip_linksA  s         	L 	LG L'-"7(/%eXc$5 J 1 1$ 7 7 7dKKKKKK	L 	LrC   c              #   :   K   |D ]\  }}} | |d|          V  dS )zRemove all styles from an iterable of segments.

        Args:
            segments (Iterable[Segment]): An iterable segments.

        Yields:
            Segment: Segments with styles replace with None
        NrB   )r`   rm   rG   rM   rI   s        rD   strip_styleszSegment.strip_stylesR  sE       &. 	+ 	+!D&'#dD'******	+ 	+rC   c              #      K   i }|D ]J\  }}}|r3|                     |          }||j        }|||<    | |||          V  ; | |d|          V  KdS )zRemove all color from an iterable of segments.

        Args:
            segments (Iterable[Segment]): An iterable segments.

        Yields:
            Segment: Segments with colorless style.
        N)getwithout_color)r`   rm   cacherG   rH   rI   colorless_styles          rD   remove_colorzSegment.remove_color_  s       %'$, 	/ 	/ D% /"'))E"2"2"*&+&9O#2E%Lc$999999c$g......	/ 	/rC   cutsc              #     K   g }|j         }t          |          }	 t          |d          }|dk    rdS |dk    rng V  $d}|j        }|j        }	t
          }
|D ]}|\  }}}|r|r|n| |
|          z   }||k     r ||           |}n||k    rK ||            |	            V   |             |}t          |d          }|dk    r|r |	            V   dS nm|                    ||z
            \  }}|\  }}} ||            |	            V   |             |}t          |d          }|dk    r|r |	            V   dS | |	            V  dS )zDivides an iterable of segments in to portions.

        Args:
            cuts (Iterable[int]): Cell positions where to divide.

        Yields:
            [Iterable[List[Segment]]]: An iterable of Segments in List.
        Tr\   Nr   )r}   r   r   r   copyr   ri   )r`   rm   r   split_segmentsadd_segment	iter_cutsrY   rc   segments_clearsegments_copyr   rX   rG   rM   rI   end_posrd   s                    rD   dividezSegment.divideu  s      +-$+JJ		y"%%CbyyaxxHHH	 '-&+#	 #	 #	G$+!D&' !!(C##cIIdOO.CS==K(((!Cc>>K((('-//)))"N$$$!Cy"--Cbyy) 2"/-//111 '.&9&9#)&D&DOFG,3)D&'K''''-//)))"N$$$C9b))"99% .+moo---FFC  !F moorC   )rJ   rF   )NNF)NTT)NT)NNF).r.   r/   r0   r1   str__annotations__rH   r   r   rI   r   ControlCodepropertyr^   rN   r   rR   rT   rU   rW   classmethodr   r   rg   ri   rl   r	   rw   rz   r
   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   rB   rC   rD   rF   rF   <   s]        
 
 III!E8E?!!!/3GXh{+,3330S 0 0 0 X0v    $     (D ( ( ( X( Yy-9 -3 -5AU;V - - -  [-^,s ,u-A'B , , , ,4    [  "&&*	& &9%& & UO	&
 
)	& & & [&P ?D@ @	*@8<@	)	@ @ @ [@$ 8I#6 8DO;T    [8  	* 	%Y-.	/      [ < 
 "&"&,I ,I9%,I ,I 	,I
 ,I  ,I 
$y/	",I ,I ,I [,I\ 
 "&* *9o* * 	*
 * 
i* * * [*X 
T4	? 
Ts 
T 
T 
T [
T 'd4	?3 'c3h ' ' ' [' 
 !%!%! !DO$! ! 	!
 ! ! 
d9o	! ! ! [!F    )_DO$  	
   
d9o	   [8    )_DO$  	
   
d9o	   [8    )_DO$  	
   
d9o	   [<  3 8K    [4 L8I#6 L8I;N L L L [L  
+HY$7 
+HY<O 
+ 
+ 
+ [
+ /HY$7 /HY<O / / / [/* B	*B2:3-B	$y/	"B B B [B B BrC   rF   c                   H    e Zd ZdZddee         deddfdZ	 	 	 	 	 	 ddZdS )Segmentsa=  A simple renderable to render an iterable of segments. This class may be useful if
    you want to print segments outside of a __rich_console__ method.

    Args:
        segments (Iterable[Segment]): An iterable of segments.
        new_lines (bool, optional): Add new lines between segments. Defaults to False.
    Frm   r   rJ   Nc                 <    t          |          | _        || _        d S rP   )listrm   r   )rL   rm   r   s      rD   __init__zSegments.__init__  s    X"rC   consoler   optionsr   r   c              #      K   | j         r-t                                          }| j        D ]
}|V  |V  d S | j        E d {V  d S rP   )r   rF   rl   rm   )rL   r   r   rl   rX   s        rD   __rich_console__zSegments.__rich_console__  sp       > 	%<<>>D=  



  }$$$$$$$$$rC   r   r   r   r   r   rJ   r   )	r.   r/   r0   r1   r	   rF   rT   r   r   rB   rC   rD   r   r     s~         # #'!2 #t #PT # # # #	% 	%+;	%		% 	% 	% 	% 	% 	%rC   r   c                   P    e Zd Zddeee                  deddfdZ	 	 	 	 	 	 ddZdS )SegmentLinesFr   r   rJ   Nc                 <    t          |          | _        || _        dS )a=  A simple renderable containing a number of lines of segments. May be used as an intermediate
        in rendering process.

        Args:
            lines (Iterable[List[Segment]]): Lists of segments forming lines.
            new_lines (bool, optional): Insert new lines after each line. Defaults to False.
        N)r   r   r   )rL   r   r   s      rD   r   zSegmentLines.__init__  s     %[[
"rC   r   r   r   r   r   c              #      K   | j         r1t                                          }| j        D ]}|E d {V  |V  d S | j        D ]
}|E d {V  d S rP   )r   rF   rl   r   )rL   r   r   r   rl   s        rD   r   zSegmentLines.__rich_console__  s       > 	 ||~~H
    
       rC   r   r   )	r.   r/   r0   r	   r
   rF   rT   r   r   rB   rC   rD   r   r     sx        	# 	#htG}5 	#$ 	#SW 	# 	# 	# 	#
  
 +;
 	
  
  
  
  
  
 rC   r   __main__)r   )Syntax)Textzfrom rich.console import Console
console = Console()
text = Text.from_markup("Hello, [bold magenta]World[/]!")
console.print(text)zHello, [bold magenta]World[/]!zrich.Segmentz]A Segment is the last step in the Rich render process before generating text with ANSI codes.z
Consider the following code:
pythonT)line_numberszRWhen you call [b]print()[/b], Rich [i]renders[/i] the object in to the following:
zAThe Segments are then processed to produce the following output:
zS
You will only need to know this if you are implementing your own Rich renderables.N)7enumr   	functoolsr   	itertoolsr   operatorr   typingr   r   r	   r
   r   r   r   r   r   r   cellsr   r   r   r   r   reprr   r   rH   r   r   r   r   r   r   r^   r   r   rF   r   r   r.   rich.consolerich.syntaxr   	rich.textr   codefrom_markuprG   ruleprintr   render	fragmentsrB   rC   rD   <module>r      s               ! ! ! ! ! !                                           $ # # # # # # #       ?>>>>>>>>>>    '   * 	+	+uS#X
&'	+sC
 " {	 {	 {	 {	 {	j {	 {	 {	|% % % % % % % %2               2 z$$$$$$""""""D
 4<==DgiiGLL   MMg   MM4555MM&&xd;;;<<<MMOOOMM]   W^^D))**IMM)MMOOOMMVWWWMM$MM^    ; rC   