
    h`i                       S SK Jr  S SKrS SKrS SKrS SKrS SKrS SKJrJrJ	r	J
r
  S SKJr  S SKJr  S SKrS SKrSr\" \5      r0 r\R(                  " SS9rS S	 jrS!S
 jr\R0                   " S S5      5       r\" S5      r " S S\R6                  5      r " S S\R6                  5      r " S S\\   5      rS"S#S jjrS$S jr      S%             S&S jjr!      S'S jr"\R0                   " S S5      5       r# " S S5      r$S(S jr%S r&S)S jr'\&       S*                   S+S jj5       r(g),    )annotationsN)GenericTypeVarCallableIterable)Template)StringIOa  {% if not embed %}
<!DOCTYPE html>
<html>
<head>
{% endif %}
    {% if not head %}
        <style>
            .railroad-heading {
                font-family: monospace;
            }
        </style>
    {% else %}
        {{ head | safe }}
    {% endif %}
{% if not embed %}
</head>
<body>
{% endif %}
<meta charset="UTF-8"/>
{{ body | safe }}
{% for diagram in diagrams %}
    <div class="railroad-group">
        <h1 class="railroad-heading" id="{{ diagram.bookmark }}">{{ diagram.title }}</h1>
        <div class="railroad-description">{{ diagram.text }}</div>
        <div class="railroad-svg">
            {{ diagram.svg }}
        </div>
    </div>
{% endfor %}
{% if not embed %}
</body>
</html>
{% endif %}
   )startc                   U [         ;   a	  [         U    $ [        R                  " SSU 5      nUSS R                  5       (       d  SU 3nUR	                  5       R                  S5      nU S[        [        5      S 3=[         U '   nU$ )zC
Converts a string into a valid HTML bookmark (ID or anchor name).
z[^a-zA-Z0-9-]+-Nr
   z04d)_bookmark_lookupresubisalphalowerstripnext_bookmark_ids)sbookmarks     L/var/www/html/env/lib/python3.13/site-packages/pyparsing/diagram/__init__.py_make_bookmarkr   ?   s     	"" vv'a0H BQ<!!xj> ~~%%c*H(0z43Fs2K%LLQ(O    c                    SU ;  a  U $ [         R                  " S5      R                  5       R                  U 5      n[        R
                  " SSU5      nU$ )N
z#.*$z\s*\n\s* )	pyparsingRegexsuppresstransform_stringr   r   )	regex_str	collapseds     r   _collapse_verbose_regexr&   U   sJ    9(113DDYOI{B	2Ir   c                  L    \ rS rSr% SrS\S'   S\S'   SrS\S	'   \S
 5       rSr	g)NamedDiagram]   zC
A simple structure for associating a name with a railroad diagram
strnameintindexNzrailroad.DiagramItemdiagramc                0    [        U R                  5      nU$ N)r   r+   )selfr   s     r   r   NamedDiagram.bookmarkg   s    !$)),r    )
__name__
__module____qualname____firstlineno____doc____annotations__r.   propertyr   __static_attributes__r3   r   r   r(   r(   ]   s0     IJ$(G!( r   r(   Tc                  4   ^  \ rS rSrSrSrSU 4S jjrSrU =r$ )EachItemp   z
Custom railroad item to compose a:
- Group containing a
  - OneOrMore containing a
    - Choice of the elements in the Each
with the group label indicating that all must be matched
z[ALL]c                   > [         R                  " [        U5      S-
  /UQ76 n[         R                  " US9n[        TU ]  X0R                  S9  g )Nr
   item)label)railroadChoicelen	OneOrMoresuper__init__	all_label)r1   itemschoice_itemone_or_more_item	__class__s       r   rI   EachItem.__init__{   sD    ooc%j1n=u=#--;?)@r   r3   )returnNone)	r4   r5   r6   r7   r8   rJ   rI   r;   __classcell__rN   s   @r   r>   r>   p   s     IA Ar   r>   c                  0   ^  \ rS rSrSrSU 4S jjrSrU =r$ )AnnotatedItem   z;
Simple subclass of Group that creates an annotation label
c                :   > [         TU ]  X!(       a  SU S3OSS9  g )N[]r   rB   rC   )rH   rI   )r1   rC   rB   rN   s      r   rI   AnnotatedItem.__init__   s!    d%AeWA,RHr   r3   )rC   r*   rP   rQ   )r4   r5   r6   r7   r8   rI   r;   rR   rS   s   @r   rU   rU      s    I Ir   rU   c                  P    \ rS rSrSrS	S jr\S
S j5       r\S 5       r	SS jr
Srg)EditablePartial   zz
Acts like a functools.partial, but can be edited. In other words, it represents a type that hasn't yet been
constructed.
c                (    Xl         X l        X0l        g r0   funcargskwargs)r1   ra   rb   rc   s       r   rI   EditablePartial.__init__   s    		r   c                *    [        U[        U5      US9$ )z
If you call this function in the same way that you would call the constructor, it will store the arguments
as you expect. For example EditablePartial.from_call(Fraction, 1, 3)() == Fraction(1, 3)
r`   )r]   list)clsra   rb   rc   s       r   	from_callEditablePartial.from_call   s     DtDz&IIr   c                     U R                   S   $ )Nr+   )rc   r1   s    r   r+   EditablePartial.name   s    {{6""r   c                <   U R                   R                  5       nU R                  R                  5       n[        R                  " U R
                  5      nUR                  U R                  ;   a  XR                  UR                  5      -  nU R
                  " U0 UD6$ )z,
Evaluate the partial and return the result
)rb   copyrc   inspectgetfullargspecra   varargspop)r1   rb   rc   arg_specs       r   __call__EditablePartial.__call__   sy     yy~~!!# ))$))4t{{*JJx//00Dyy$)&))r   )rb   ra   rc   N)ra   Callable[..., T]rb   rf   rc   dictrP   rQ   )ra   rv   rP   EditablePartial[T])rP   r<   )r4   r5   r6   r7   r8   rI   classmethodrh   r:   r+   rt   r;   r3   r   r   r]   r]      s;    
 J J # #*r   r]   c                   / nU  H  nUR                   c  M  [        5       n UR                  S5      nUR                   R                  UR                  US9  UR                  nUR                  S:X  a  US-  nUR                  USUR                  5       UR                  S.5        M     [        R                  " SX1S.UD6$ ! [
         a(    UR                   R                  UR                  5         Nf = f)	z
Given a list of NamedDiagram, produce a single HTML string that visualises those diagrams
:params kwargs: kwargs to be passed in to the template
css)r{   r   z (root)r   )titletextsvgr   )diagramsembedr3   )r.   r	   getwriteStandalonewriteAttributeErrorwriteSvgr+   r-   appendgetvaluer   templaterender)r   r   rc   datar.   ior{   r|   s           r   railroad_to_htmlr      s    
 D??"Z	/**U#COO++BHH#+> ==AYE2;;=gN^N^	
 $ ??@D@@@  	/OO$$RXX.	/s   5C/C43C4c                   [        U [        5      (       a;  [        U R                  5      U l        [        U R                  5      U l        U " 5       $ [        U [
        5      (       a  U  Vs/ s H  n[        U5      PM     sn$ [        U [        5      (       a/  U R                  5        VVs0 s H  u  p!U[        U5      _M     snn$ U $ s  snf s  snnf )zK
Recursively resolves a collection of Partials into whatever type they are
)
isinstancer]   resolve_partialrb   rc   rf   rw   rK   )partialxkeys      r   r   r      s     '?++&w||4(8y	GT	"	",34Gq"G44	GT	"	"6=mmoFoFC_Q''oFF	 5Fs   *C*Cc           
        [        U=(       d    0 S9n[        U USUUUUS9  [        U 5      nXv;   a,  U R                  (       d	  SXg   l        Xg   R                  XvSS9  [        UR                  R                  5       5      n[        U5      S:  a  [        5       n	/ n
U Hb  nUR                  S:X  a  M  UR                  c  M$  UR                  U	;  d  M6  U	R                  UR                  5        U
R                  U5        Md     U
 Vs/ s H  n[        U5      PM     nnOU Vs/ s H  n[        U5      PM     nn[        US	 S
9$ s  snf s  snf )a  
Convert a pyparsing element tree into a list of diagrams. This is the recommended entrypoint to diagram
creation if you want to access the Railroad tree before it is converted to HTML
:param element: base element of the parser being diagrammed
:param diagram_kwargs: kwargs to pass to the Diagram() constructor
:param vertical: (optional) - int - limit at which number of alternatives should be
   shown vertically instead of horizontally
:param show_results_names - bool to indicate whether results name annotations should be
   included in the diagram
:param show_groups - bool to indicate whether groups should be highlighted with an unlabeled
   surrounding box
:param show_hidden - bool to indicate whether internal elements that are typically hidden
   should be shown
)diagram_kwargsN)lookupparentverticalshow_results_namesshow_groupsshow_hiddenr   T)forcer
   z...c                    U R                   $ r0   r-   )diags    r   <lambda>to_railroad.<locals>.<lambda>  s    TZZr   )r   )ConverterState_to_diagram_elementid
customNamer+   mark_for_extractionrf   r   valuesrF   setaddr   r   sorted)elementr   r   r   r   r   r   root_iddiagsseendeduped_diagsdr   resolveds                 r   to_railroadr      s8   . >+?R@F- kG!!#%FO ++G4+H '')*E
5zA~uAvvvv!affD&8 $$Q'  =JJMOG,MJ =BBEOG,EB( 788 K Cs   E$Ec                8    U c  g[        [        U5      5      U :  $ )z>
Returns true if we should return a vertical list of elements
F)rF   _visible_exprs)specificationexprss     r   _should_verticalr     s"     >%()]::r   c                      \ rS rSr% SrS\S'   S\S'   S\S'   S\S	'   S
rS\S'   S
rS\S'   SrS\S'   Sr	S\S'    S       SS jjr
Srg
)ElementStatei)  z4
State recorded for an individual pyparsing Element
pyparsing.ParserElementr   r]   	convertedr   r,   numberNr*   r+   ztyping.Optional[int]parent_indexFboolextractcompletec                V   SU l         U R                  (       dL  U(       a  X0l        O>U R                  R                  (       a  U R                  R                  U l        OSU l        U(       d+  U R                  (       a-  [        U R                  5      (       a  UR                  U5        ggg)a~  
Called when this instance has been seen twice, and thus should eventually be extracted into a sub-diagram
:param el_id: id of the element
:param state: element/diagram state tracker
:param name: name to use for this element's text
:param force: If true, force extraction now, regardless of the state of this. Only useful for extracting the
root element when we know we're finished
Tr   N)r   r+   r   r   r   _worth_extractingextract_into_diagram)r1   el_idstater+   r   s        r   r    ElementState.mark_for_extraction@  sq      yy 	(( LL33		
 T]]'8'F'F&&u- (G]r   )r   r+   )NF)r   r,   r   r   r+   r*   r   r   )r4   r5   r6   r7   r8   r9   r+   r   r   r   r   r;   r3   r   r   r   r   )  sz    
 %$KD#)-L&-GTHd RW..!/.7:.JN. .r   r   c                  v    \ rS rSrSrSSS jjrSS jrSS jrSS jrSS jr	SS	 jr
SS
 jrSS jrSS jrSrg)r   i^  zJ
Stores some state that persists between recursions into the element tree
Nc                z    0 U l         0 U l        SU l        SU l        U=(       d    0 U l        [        5       U l        g )Nr
   r   )_element_diagram_statesr   unnamed_indexr-   r   r   extracted_diagram_names)r1   r   s     r   rI   ConverterState.__init__c  s7    @B$BD"#
$2$8b14$r   c                     X R                   U'   g r0   r   )r1   r   values      r   __setitem__ConverterState.__setitem__p  s    ,1$$S)r   c                     U R                   U   $ r0   r   r1   r   s     r   __getitem__ConverterState.__getitem__s  s    ++C00r   c                    U R                   U	 g r0   r   r   s     r   __delitem__ConverterState.__delitem__v  s    ((-r   c                    XR                   ;   $ r0   r   r   s     r   __contains__ConverterState.__contains__y  s    2222r   c                0     X   $ ! [          a    Us $ f = fr0   )KeyError)r1   r   defaults      r   r   ConverterState.get|  s#    	9 	N	s    c                D    U =R                   S-  sl         U R                   $ )zD
Generate a number used in the name of an otherwise unnamed diagram
r
   )r   rk   s    r   generate_unnamedConverterState.generate_unnamed  s!     	a!!!r   c                D    U =R                   S-  sl         U R                   $ )z+
Generate a number used to index a diagram
r
   r   rk   s    r   generate_indexConverterState.generate_index  s     	

a
zzr   c           	        X   nUR                   (       a  S[        UR                  5       3n[        R	                  [
        R                  UR                  US9nSUR                   R                  ;   a  XBR                   R                  S'   O?SUR                   R                  ;   a%  XBR                   R                  S   UR                  '   UR                  R                  [
        R                  :X  a  UR                  R                  S   nOUR                  n[        R	                  [        UR                  [        R                  " [
        R                  U40 U R                  D6UR                  S9U R                   U'   X	 g)z
Used when we encounter the same token twice in the same tree. When this
happens, we replace all instances of that token with a terminal, and
create a new subdiagram for the token
#r}   hrefrB   rK   )r+   r.   r-   N)r   r   r+   r]   rh   rD   NonTerminalrc   r   r   ra   Groupr(   Diagramr   r   r   )r1   r   positionr   retcontents         r   r   #ConverterState.extract_into_diagram  s9    ; ??~hmm456D!++H,@,@x}}[_+`C///14&&v.HOO222IL&&w/0E0EF ""hnn4((//7G((G.88#--  '-1-@-@ //  9  
e Kr   )r   r   r   r   r-   r   r0   )r   typing.Optional[dict]rP   rQ   )r   r,   r   r   )r   r,   rP   r   )r   r,   )rP   r,   )r   r,   )r4   r5   r6   r7   r8   rI   r   r   r   r   r   r   r   r   r;   r3   r   r   r   r   ^  s4    721.3" r   r   c                F    U R                  5       n[        S U 5       5      $ )z
Returns true if this element is worth having its own sub-diagram. Simply, if any of its children
themselves have children, then its complex enough to extract
c              3  @   #    U  H  oR                  5       v   M     g 7fr0   )recurse).0childs     r   	<genexpr>$_worth_extracting.<locals>.<genexpr>  s     5H5}}Hs   )r   any)r   childrens     r   r   r     s!    
  H5H555r   c                P   ^         S                   SU 4S jjjnU$ )z
decorator to ensure enhancements to a diagram item (such as results name annotations)
get applied on return from _to_diagram_element (we do this since there are several
returns in _to_diagram_element)
c	                   > T" U UUUUUUUU5	      n	U(       a[  U	bX  U R                   n
U
(       aE  U R                  (       a  SOSn[        R                  [        R
                  U	[        U
5       U 3S9n	U	$ )Nr   *rZ   )resultsNamemodalResultsr]   rh   rD   r   repr)r   r   r   r   r-   	name_hintr   r   r   r   element_results_name	modal_tagfns               r   _inner0_apply_diagram_item_enhancements.<locals>._inner  s     

 #/#*#6#6 #")"6"6BC	%//NN!"678D 0  
r   NNr   NFFFr   r   r    typing.Optional[EditablePartial]r   r   r   r,   r-   r,   r   r*   r   r   r   r   r   r   rP   r  r3   )r  r  s   ` r    _apply_diagram_item_enhancementsr	    s     "&#(!!#(#0# # 	#
 # # !# # # 
*# #J Mr   c                    [         R                  [         R                  [         R                  R                  4nU  Vs/ s H  n[        X!5      (       a  M  UPM     sn$ s  snf r0   )r    ParseElementEnhancePositionTokenAnd
_ErrorStopr   )r   non_diagramming_exprses      r   r   r     sX    %%   A!3 	
  s   AAc	                r   U R                  5       n	U=(       d(    U R                  =(       d    [        U 5      R                  n
[	        U 5      nU R
                  nU R                  (       dj  [        U [        R                  [        R                  45      (       a;  U	(       a4  U	S   R                  (       d  U
nOSn[        U R                  UUUUUUUUS9	$ [        U 5      (       a  UR                  U5      nU(       ad  UR                  bW  UR                  XUS9  S[!        UR                  5       3n["        R%                  [&        R(                  UR                  US9nU$ XR*                  ;   aM  UR*                  U   R,                  S   n["        R%                  [&        R(                  US[!        U5       3S9nU$ U R.                  (       d  U(       d  g[        U [        R0                  5      (       a  U	(       d  g[3        [5        S U	 5       5      5      S	:X  aF  [3        U	5      S
:  a7  ["        R%                  [&        R6                  S[9        [3        U	5      5      S9nGO[;        X95      (       a$  ["        R%                  [&        R<                  / S9nGO["        R%                  [&        R>                  / S9nGOb[        U [        R@                  [        RB                  45      (       aa  U	(       d  g[;        X95      (       a%  ["        R%                  [&        RD                  S/ S9nGO["        R%                  [&        RF                  / S9nGO[        U [        RH                  5      (       a"  U	(       d  g["        R%                  [J        / S9nGO[        U [        RL                  5      (       a  ["        R%                  [N        SSS9nGOW[        U [        RP                  5      (       a  ["        R%                  [N        SSS9nGO[        U [        RR                  5      (       a  ["        R%                  [N        SSS9nGO[        U [        RT                  5      (       aG  U(       a  ["        R%                  [N        SSS9nGO["        R%                  [&        RT                  SUS9nGO}[        U [        RV                  5      (       ah  [        U 5      R                  RY                  5       nUS:X  a$  ["        R%                  [&        R>                  / S9nGO["        R%                  [N        USS9nGO[        U [        RZ                  5      (       a$  ["        R%                  [&        R\                  SS9nGO[        U [        R6                  5      (       a  U R^                  bT  UUUUUUUU/n[        U R^                  R                  ) U R                  -   S   Ra                  U R                  5      /UQ76 $ ["        R%                  [&        R6                  SS9nGO[        U [        Rb                  5      (       a  U R^                  bT  UUUUUUUU/n[        U R^                  R                  ) U R                  -   S   Ra                  U R                  5      /UQ76 $ ["        R%                  [&        Rb                  SS9nGOk[        U [        Rd                  5      (       a  U R                  (       d  SnGO7[        U [        Rf                  5      (       a#  ["        R%                  [&        R>                  / S9nO[3        U	5      S:  a+  U(       d$  ["        R%                  [&        RT                  SU
S9nO[        U [        Rh                  5      (       a:  [k        U Rl                  5      n["        R%                  [&        Rn                  U5      nOb[3        U	5      S:  a#  ["        R%                  [&        R>                  / S9nO0["        R%                  [&        Rn                  U Rp                  5      nUnUc  g[s        U UUUURu                  5       S9X+'   U R                  (       a  X+   R                  XU R                  5        SnU	 H  nSUR,                  ;   a  UR,                  S   Rw                  US5        [        UUUUUUUUS9nUbL  SUR,                  ;   a  UUR,                  S'   Mf  SUR,                  ;   a  UUR,                  S   U'   US	-  nM  M  SUR,                  ;   d  M  UR,                  S   U	 M     U(       ap  SUR,                  ;   a  [3        UR,                  S   5      S:X  d   SUR,                  ;   a4  UR,                  S   c$  ["        R%                  [&        Rn                  U
5      nX;   a	  SX+   l<        X;   a  X+   Rz                  (       at  X+   Rx                  (       aa  UR}                  U5        UbM  UR*                  U   R,                  S   nS[!        U5       3n["        R%                  [&        R(                  UUS9nU$ )a  
Recursively converts a PyParsing Element to a railroad Element
:param lookup: The shared converter state that keeps track of useful things
:param index: The index of this element within the parent
:param parent: The parent of this element in the output tree
:param vertical: Controls at what point we make a list of elements vertical. If this is an integer (the default),
it sets the threshold of the number of items before we go vertical. If True, always go vertical, if False, never
do so
:param name_hint: If provided, this will override the generated name
:param show_results_names: bool flag indicating whether to add annotations for results names
:param show_groups: bool flag indicating whether to show groups using bounding box
:param show_hidden: bool flag indicating whether to show elements that are typically hidden
:returns: The converted version of the input element, but as a Partial that hasn't yet been constructed
r   N)r   r   r   r-   r   r   r   r   )r+   r   r   r+   c              3  P   #    U  H  oR                   UR                  4v   M     g 7fr0   )r+   r   )r   r  s     r   r   &_to_diagram_element.<locals>.<genexpr>Y  s     :EqFFAMM*Es   $&r
      r   )rB   repeat)rK   NOT)rC   rB   	LOOKAHEAD
LOOKBEHINDrZ   tokenconverterrA   )r
   ..)r   r   r   r   r   rK   )r   r   r   r-   r   r   r   rB   T)?r   r   typer4   r   r   r   r    ForwardLocatedr   exprr   r   r+   r   r   r]   rh   rD   r   r   rc   show_in_diagramr  rF   r   rG   r*   r   StackSequenceOr
MatchFirstrE   HorizontalChoiceEachr>   NotAnyrU   
FollowedBy
PrecededByr   TokenConverterr   OptOptional	not_enderset_name
ZeroOrMoreEmptyr  r!   r&   patternTerminaldefaultNamer   r   insertr   r   r   )r   r   r   r   r-   r   r   r   r   r   r+   r   r  propagated_name	looked_upr   r   r}   rC   rb   collapsed_pattterminalir  rB   s                            r   r   r     sp   4 OOED**Dd7m.D.DD wKE"..  !!!!
 
 Qx**&*O&*O*LL!!%-'9 + +
 
 !!JJu%	3 ))%i)H~inn567D!++H,@,@y~~\`+aCJoo% ??5)008D!++$$4.:N9O6P , C J "";'9==)) s:E::;q@SZRS^!++""CE
O , C h..!++HNN"+EC!++H,=,=R+HC	GillI,@,@A	B	BH,,!++HOOQb+IC!++H,E,ER+PC	GY^^	,	,''';	GY--	.	.''U'L	GY11	2	2''[r'R	GY11	2	2''\PR'S	GY__	-	-!++M"+MC!++T1E , C 
GY55	6	6W&&,,.$$!++H,=,=R+HC!++MR+PC	GY]]	+	+''(9(9'C	GY00	1	1("	D '##(((7<<7@II',,W  ''(:(:'F	GY11	2	2("	D '##(((7<<7=FFw||T  ''(;(;"'E	GY__	-	-g6H6H	GY::	;	;''(9(9'D	Ua 4''Rt'L	GY__	-	-0A''(9(9>J	Ua''(9(9'D",,X->->@S@ST
{ !$$&FM ))%9K9KL	Acjj JJw&&q$/"1##	
 #%)

6"CJJ&)-

7#A&Q ' 

"

7#A&5 : 	CJJ	3szz'':#;q#@cjj SZZ%7%?''(9(94@ !%6=00V]5K5K##E*???5)008D~d+,-D!++$$4d , C Jr   )r   r*   rP   r*   )r$   r*   rP   r*   )F)r   list[NamedDiagram]rP   r*   )r   rx   rP   r<   )N   FFF)r   r   r   r   r   r,   r   r   r   r   r   r   rP   r8  )r   r,   r   !Iterable[pyparsing.ParserElement]rP   r   )r   r   rP   r   )r   r:  r  r  ))
__future__r   	itertoolsrD   r    dataclassestypingr   r   r   r   jinja2r   r   r	   ro   r   jinja2_template_sourcer   r   countr   r   r&   	dataclassr(   r<   r   r>   rU   r]   r   r   r   r   r   r   r   r	  r   r   r3   r   r   <module>rC     s   "          	" H *+  a(,    CLAx~~ A"IHNN I'*gaj '*TA6$ -1$;9$;9);9 ;9 	;9
 ;9 ;9 ;9|	;	;@	;		; 1. 1. 1.hR Rj6,^
 " "$y$y,y y 	y
 y y y y y &y "yr   