
    Ki                    "   U d Z ddlmZ ddlZddlZddlZddlZddlZddlZddl	m
Z
 ddlmZmZ ddlmZmZ ddlmZmZ  ej(                  e      Z eh d	      Zd
Z ej4                  dej6                        Z ej:                         Zi Zde d<   dZ!ddZ"	 	 	 	 	 	 	 	 ddZ#ddZ$ ej4                  d      Z%d dZ&dZ' ejP                  d      d!d       Z) ej4                  d      Z*d"dZ+	 	 d#	 	 	 	 	 	 	 d$dZ,d%dZ-	 d&	 	 	 	 	 	 	 d'dZ.y)(a  Graph-powered refactoring operations.

Provides rename previews, dead code detection, refactoring suggestions,
and safe application of refactoring edits to source files. All file writes
go through a preview-then-apply workflow with expiry enforcement and path
traversal prevention.
    )annotationsN)Path)AnyOptional   _has_framework_decorator_matches_entry_name)
GraphStore_sanitize_name>   db.ModelBaseModelStackResource	BaseModel	Construct	TableBaseNestedStackBaseSettingsDeclarativeBase)r   r   Pipeline	ResourcesLayerz=^(mock[A-Z_]|Mock[A-Z]|createMock[A-Z])|(Mock|Stub|Fake|Spy)$zdict[str, dict]_pending_refactorsiX  c                     t        j                          } t        j                         D cg c]  \  }}| |d   z
  t        kD  r| }}}|D ]	  }t        |=  t	        |      S c c}}w )zGRemove expired refactors from the pending dict.  Returns count removed.
created_at)timer   itemsREFACTOR_EXPIRY_SECONDSlen)nowridrexpireds       f/home/jay/workspace/scripts/.codegraph-venv/lib/python3.12/site-packages/code_review_graph/refactor.py_cleanup_expiredr'   8   sq    
))+C,224Q< #:: 	G   $s#$w<s   A#c           	     h   | j                  |d      }d}|D ]  }|j                  |k(  s|} n ||r|d   }|t        j                  d|       yg }|j	                  |j
                  |j                  ||dd       | j                  |j                        }|D ]=  }|j                  dk(  s|j	                  |j
                  |j                  ||dd       ? | j                  |d	      }	|D 
ch c]  }
|
d
   |
d   f }}
|	D ][  }|j
                  |j                  f}||vs |j	                  |j
                  |j                  ||dd       |j                  |       ] | j                  |j                        }|D ]k  }|j                  dk(  s|j
                  |j                  f}||vs0|j	                  |j
                  |j                  ||dd       |j                  |       m dddd}|D ]  }
||
d   xx   dz  cc<    t        j                         j                  dd }|dt!        |      t!        |      ||t#        j"                         d}t$        5  t'                |t(        |<   ddd       t        j+                  d|||t-        |             |S c c}
w # 1 sw Y   2xY w)af  Build a rename edit list for *old_name* -> *new_name*.

    Finds the node via ``store.search_nodes(old_name)``, collects
    definition and reference sites, generates a unique ``refactor_id``,
    and stores the preview in the thread-safe ``_pending_refactors`` dict.

    Returns:
        A refactor preview dict, or ``None`` if the node is not found.
    
   )limitNr   z!rename_preview: node %r not foundhigh)filelineoldnew
confidenceCALLSkindr,   r-   IMPORTS_FROM)r+   mediumlowr0   r      rename)refactor_idtypeold_namenew_nameeditsstatsr   z8rename_preview: created refactor %s (%s -> %s, %d edits))search_nodesnameloggerwarningappend	file_path
line_startget_edges_by_targetqualified_namer3   r-   search_edges_by_target_nameadduuiduuid4hexr   r   _refactor_lockr'   r   infor!   )storer;   r<   
candidatesnodecr=   
call_edgesedge
bare_edgeseseenkeyimport_edgesr>   r9   previews                    r&   rename_previewr[   I   s    ##HB#7JD 66XD |
!}|:HE"$E 
LL  **4+>+>?J 99LL		$  228'2JJ,12qQvY&	"2D2 
~~tyy)d?LL		$  HHSM
 ,,T-@-@AL 99&>>499-C$ NN II##"(   !A.E $ao!#$ **,""2A&K""8,"8,iikG 
 2*1;'2 KKBXxU Ni 3X2 2s   3J##J((J1c                4    t        |       ryt        |       ryy)ai  Check if a node looks like an entry point by name or decorator.

    Unlike ``flows.detect_entry_points()`` which treats ALL uncalled functions
    as entry points, this checks only for conventional name patterns and
    framework decorators -- the indicators that a function is *intentionally*
    an entry point rather than simply unreferenced dead code.
    TFr   )rQ   s    r&   _is_entry_pointr]      s      %4     z([\\/]__tests__[\\/]|\.spec\.[jt]sx?$|\.test\.[jt]sx?$|[\\/]test_[^/\\]*\.py$|[\\/]e2e[_-]?tests?[\\/]|[\\/]test[_-]utils?[\\/])c                >    t        t        j                  |             S )z2Return True if *file_path* looks like a test file.)bool_TEST_FILE_REsearch)rD   s    r&   _is_test_filerc      s    $$Y/00r^      i   )maxsizec                n    | j                  dd      j                  d      }t        d |dd D              S )zGReturn directory segments long enough to serve as package-name anchors.\/c              3  L   K   | ]  }t        |      t        k\  r|d vr|  yw))homesrclibappN)r!   _MIN_PKG_SEGMENT_LEN).0ps     r&   	<genexpr>z!_path_segments.<locals>.<genexpr>   s-      q6))a7T.T 	
s   "$N)replacesplittuple)rD   partss     r&   _path_segmentsrw      sA     dC(..s3E ":  r^   z[A-Z][A-Za-z0-9_]*c                    | j                  ddg      }t               }|D ]F  }|j                  |j                  fD ])  }|s|j	                  t
        j                  |             + H |S )zCCollect class names that appear in function params or return types.FunctionTest)kinds)get_nodes_by_kindsetparamsreturn_typeupdate_TYPE_IDENT_REfindall)rO   funcsnamesftexts        r&   _collect_type_referenced_namesr      sm    ##:v*>#?EeE ;XXq}}- 	;D^33D9:	;; Lr^   c           	     l  -./ | j                  |r|gnddg|      }t        |       }i }| j                  }|j                  d      j	                         D ]J  }d|d   v r|d   j                  dd      d   n|d   }|j                  |d   g       j                  |       L i -|j                  d	      j	                         D ]1  }-j                  |d   t                     j                  |d          3 i .|j                  d
      j	                         D ]  }|d   .|d   <    	 d0	 	 	 	 	 	 	 d1-.fd}	g }
|D ]  //j                  st        /j                        r&/j                  j                  d      rB/j                  j                  d      r/j                  j                  d      ry/j                  dk(  r/j                   r/j                  st        /j                        r t"        j%                  /j                        rt'        /      r/j(                  dk(  r/j                  |v r/j(                  dk(  rt+        /      rd}/j(                  dk(  r/j,                  n,/j                   r/j,                  j                  dd      d   nd}|rW| j/                  |      }|D ch c]0  }|j(                  dk(  r|j0                  j                  dd      d   2 }}|t2        z  rd}/j(                  dk(  r|rt5        /fdt6        D              r/j(                  dk(  r|r /j(                  dk(  r&/j                   rt5        /fdt6        D              r5/j8                  j;                  dd      }t=        |t>        t@        f      rG|rE/j(                  dv rt5        d |D              r/j(                  dk(  rt5        d |D              r/j(                  dk(  r/j                   r/j,                  j                  dd      d   }| j/                  |      }|D cg c]  }|j(                  dk(  s|j0                    }}|D ]  }| d/j                   }| jC                  |      }|3/j                  dz   |z   dz   /j                  z   }| jC                  |      }|]|j8                  j;                  dd      }t=        |t>        t@        f      st5        d |D              s n d}|| jE                  /j,                        }t5        d |D              s;/j                   r//j                    d/j                   }|| jE                  |      z   }t5        d |D              s| jG                  /j                  d      }|j                  d d!/j                   f      j	                         }|D cg c]  }| jI                  |       }}||z   }|D cg c],  } |	|j                  /j                  /j                        r|. }}||z   }t5        d" |D              sY| jG                  /j                  d#      } | D cg c],  } |	|j                  /j                  /j                        r|. } }|| z   }/j(                  dk(  r4t5        d$ |D              s"| jG                  /j                  d      }!||!z   }t5        d% |D              }"t5        d& |D              }#t5        d' |D              }$t5        d( |D              }%t5        d) |D              }&|"xs |#xs
 |$xs |%xs |& }'/j(                  dk(  rT|'rR/j,                  dz   }(/j                  dz   })|j                  d*d+|( d+d+|) d+f      jK                         d   }*|*dkD  rd}"|"rx|#r||$r|%r|&r/j(                  dk(  rƉ/j                   r|"sd/j                  z   }+/j,                  j                  |+      r/j,                  dtM        |+        }|j;                  |g       D ]`  }|j                  d,|/j                  f      j	                         },|,D ])  \  }|j                  d-|f      jK                         s'd}" n |"s` n |"ra|
j                  tO        /j                        tO        /j,                        /j(                  /j                  /jP                  d.        tR        jU                  d/tM        |
             |
S c c}w c c}w c c}w c c}w c c}w )2u  Find functions/classes with no callers, no test refs, no importers, and no references.

    Entry points (functions matching framework decorators or conventional name
    patterns like ``main``, ``test_*``, ``handle_*``) are excluded.

    .. note::

        **Caveats — dynamic dispatch patterns.**  Static analysis cannot track
        all runtime-determined call patterns.  Functions registered via fully
        dynamic keys (``map[computedKey()] = fn``), ``Reflect.apply``, or
        runtime ``require()`` may still appear as dead code.  Treat results as
        hints, especially for TypeScript projects that use map-based dispatch,
        plugin registries, or dynamic requires.

    Args:
        store: The GraphStore instance.
        kind: Optional filter (e.g. ``"Function"`` or ``"Class"``).
        file_pattern: Optional file-path substring filter.

    Returns:
        List of dead-code dicts with name, qualified_name, kind, file, line,
        and a top-level ``caveats`` note.
    ry   Class)r{   file_patternzLSELECT source_qualified, target_qualified FROM edges WHERE kind = 'INHERITS'::r   rr   r   zISELECT file_path, target_qualified FROM edges WHERE kind = 'IMPORTS_FROM'zbSELECT name, COUNT(*) FROM nodes WHERE kind IN ('Function', 'Class') AND is_test = 0 GROUP BY namec                   | |k(  ry|rj                  |d      dk(  ry
j                  | d      D ]   }d|v r|j                  d      d   n|}|j                  d      r|dd }|j                  |d	z         r y|j                  |      s|j                  |d	z         r y
j                  |d      D ]q  }d|v r|j                  d      d   n|}|j                  d      r|dd }|j                  |d	z         r  y|j                  |      s|j                  |d	z         sp  y |j                  d	      r
t	        |      D ]	  }	|	|v s  y # y
)zA bare-name edge is plausible if it comes from the same file,
        from a file that has an IMPORTS_FROM edge whose target matches
        the node's file path, or the name is globally unique (no ambiguity).Tr   r    r   z/__init__.pyNirh   F)getrt   endswith
startswithrw   )	edge_file	node_file	node_name
imp_targetimp_pathimp_dirimp2	imp2_pathimp2_dirsegimporter_filesname_countss             r&   _is_plausible_callerz,find_dead_code.<locals>._is_plausible_caller0  so    	!A6!;(,,Y; 	$J48J4Fz''-a0JH  0"4C.''#6""9-1E1EhQTn1U&**:r:  374<DJJt,Q/T	%%n5(#H ++HsN;#''	2i6J6J9WZ?6[  ((-))4 $Cj(#$5	$: r^   z.d.ts__constructorF.NINHERITSTc              3  T   K   | ]  }j                   j                  |       ! y wN)r@   r   ro   srQ   s     r&   rq   z!find_dead_code.<locals>.<genexpr>  s      FQ499%%a(F   %(c              3  T   K   | ]  }j                   j                  |       ! y wr   )parent_namer   r   s     r&   rq   z!find_dead_code.<locals>.<genexpr>  s"     NQD$$--a0Nr   
decoratorsr   )ry   rz   c              3  p   K   | ].  }|d v xs$ |j                  d      xs |j                  d       0 yw))propertyabstractmethodclassmethodstaticmethodz.abstractmethodHostListenerN)r   r   ro   ds     r&   rq   z!find_dead_code.<locals>.<genexpr>  sJ      
 	 VV 4zz"344 ||N34s   46c              3  $   K   | ]  }d |v  
 yw)	dataclassNr   r   s     r&   rq   z!find_dead_code.<locals>.<genexpr>  s     <A{a'<   c              3  $   K   | ]  }d |v  
 yw)r   Nr   r   s     r&   rq   z!find_dead_code.<locals>.<genexpr>  s      E23(A-Er   c              3  :   K   | ]  }|j                   d k(    ywr1   Nr2   ro   rV   s     r&   rq   z!find_dead_code.<locals>.<genexpr>       7166W$7   c              3  :   K   | ]  }|j                   d k(    ywr   r2   r   s     r&   rq   z!find_dead_code.<locals>.<genexpr>  r   r   r1   r2   zDSELECT * FROM edges WHERE kind = 'CALLS' AND target_qualified LIKE ?z%::c              3  :   K   | ]  }|j                   d k(    yw	TESTED_BYNr2   r   s     r&   rq   z!find_dead_code.<locals>.<genexpr>  s     ;Q166[(;r   r   c              3  :   K   | ]  }|j                   d k(    ywr   Nr2   r   s     r&   rq   z!find_dead_code.<locals>.<genexpr>  s     +SQAFFj,@+Sr   c              3  :   K   | ]  }|j                   d k(    ywr   r2   r   s     r&   rq   z!find_dead_code.<locals>.<genexpr>  s     >!&&G+>r   c              3  :   K   | ]  }|j                   d k(    ywr   r2   r   s     r&   rq   z!find_dead_code.<locals>.<genexpr>  s     DaAFFk1Dr   c              3  :   K   | ]  }|j                   d k(    yw)r4   Nr2   r   s     r&   rq   z!find_dead_code.<locals>.<genexpr>  s     GAFFn4Gr   c              3  :   K   | ]  }|j                   d k(    yw)
REFERENCESNr2   r   s     r&   rq   z!find_dead_code.<locals>.<genexpr>  s     FQVV|3Fr   c              3  :   K   | ]  }|j                   d k(    ywr   r2   r   s     r&   rq   z!find_dead_code.<locals>.<genexpr>  s     DaQVVz1Dr   zhSELECT COUNT(*) FROM edges WHERE kind = 'CALLS' AND (target_qualified LIKE ? OR target_qualified LIKE ?)%znSELECT n.qualified_name FROM nodes n WHERE n.parent_name = ? AND n.name = ? AND n.kind IN ('Function', 'Test')zISELECT 1 FROM edges WHERE target_qualified = ? AND kind = 'CALLS' LIMIT 1)r@   rG   r3   r,   r-   z%find_dead_code: found %d dead symbols) )r   strr   r   r   r   returnr`   )+r|   r   _connexecutefetchallrsplit
setdefaultrC   r}   rI   is_testrc   rD   r   r@   r   r   _MOCK_NAME_RErb   r]   r3   r	   rG   get_edges_by_sourcetarget_qualified_FRAMEWORK_BASE_CLASSESany_CDK_CLASS_SUFFIXESextrar   
isinstancelistru   get_noderF   rH   _row_to_edgefetchoner!   r   rE   rA   rN   )0rO   r3   r   rP   type_ref_namesclass_basesconnrowbaser   dead_is_framework_class	_check_qnoutgoingrV   
base_namesr   	parent_qnparent_edgesbase_class_names	base_namebase_method_qn
base_nodesbase_method_qn2
base_decosincomingclass_qnbaresuffix_rowsr$   suffix_edgesall_barebare_tbbare_inhhas_callershas_test_refshas_importershas_referenceshas_subclassesno_refsmember_prefixbare_prefixmember_callsmethod_suffixrowsr   r   rQ   s0                                                @@@r&   find_dead_coder     sB	   : ((tf:w"7! ) J 4E:N )+K;;D||Vhj8 .2SV^s1v}}T1%b)Qs1vr*11$7	8 +-N||Shj= 	!!#a&#%044SV<= #%K||	 hj	%
 "!fCF% :<((#&(36(	(T "$D X <<=8 >>""7+ 99%$))*<*<T*B 99%$*:*: <<=8##DII. 4  99DII$? 99$<T$B $+/99+?D''595E5ED&&sA.q14 	 00;H "QVVz%9 ""))$226J  33&*#99"F2EFF99
"': II#  N:MNN ZZ^^L"5
j4-0Zyy00  
 (  yyG#<<< 99
"t'7'7++223:1=I 44Y?L,8 '(AFFj<P""    . !	$-;a		{!;"^^N;
% -	9C?$))K $ "'!@J)!+!1!1!5!5lB!GJ!*tUm< E7AE B !" !	$,,T-@-@A 7h77D<L<L**+2dii[9H%";";H"EEH 7h7744TYYW4MD,,/tyyk"$ hj	 
 <GGaE..q1GLGl*H#'T^^TYYO H   (*H;(;;77		7TG"'T^^TYYO G   ')H99+S(+S(S888TH(*H>X>>D8DDGhGGFXFFD8DD  0= 0M 00!/
 99G //#5M))c/K<<L]O1%;-q'9: hj	L
 a" =M
 yyJ&4+;+;K #dii&&//>#223Hc-6H5HIH%0__Xr%B "	#||A '		2	 
 #(*  26 &-^#||!* "0 1	 
 'hj ) /3 %& '!#"& *4995&4T5H5H&I II NN OO eXt KK7TCKWb R Hs$   ;5d<d"d"d';1d,&1d1c                :   g }t        |       }|D ]7  }|j                  dd|d   j                          d|d    d|d   gdd	       9 | j                         }|ri }|D ]$  }|d
   }| j	                  |      }|D ]  }	|||	<   	 & |D 
ci c]  }
|
d
   |
d    }}
| j                  dg      }|D ]<  }|j                  |j                        }|"| j                  |j                        D cg c]  }|j                  dk(  r| }}|s\t               }|D ]1  }|j                  |j                        }|!|j                  |       3 t        |      dk(  st        t        |            }||k7  s|j                  |d|       }|j                  |d|       }|j                  ddt!        |j"                         d| d| dt!        |j                        gd| d| dd	       ? t$        j'                  dt        |             |S c c}
w c c}w )aI  Produce community-driven refactoring suggestions.

    Currently two categories:
    - **move**: Functions in Community A only called by Community B.
    - **remove**: Dead code (no callers, tests, or importers and not entry points).

    Returns:
        List of suggestion dicts with type, description, symbols, rationale.
    removezRemove unused r3   z 'r@   'rG   zANo callers, no test references, no importers, not an entry point.)r:   descriptionsymbols	rationaleidry   r1   r   z
community-movezMove 'z' from 'z' to 'zFunction is in community 'z+' but only called by members of community 'z'.z-suggest_refactorings: produced %d suggestions)r  rC   lowerget_communities_listget_community_member_qnsr|   r   rG   rF   r3   r}   source_qualifiedrI   r!   nextiterr   r@   rA   rN   )rO   suggestionsr   r   community_rowsnode_communitycrowcid
member_qnsqnr$   community_names	all_funcsfnodef_communityrV   incoming_callscaller_communitiesrT   c_communitytarget_communitysrc_nametgt_names                          r&   suggest_refactoringsr"  ?  s    )+K % D +AfIOO,=+>b61M*+,\	
 	 //1N)+" 	)Dt*C77<J  )%(r")	) )7+
#$AdGQvY+
 +

 ++ZL9	 %	E(,,U-A-ABK" !44U5I5IJ66W$ N  "!$& 8,001F1FG*&**;78 %&!+#'-?(@#A #{2.22;*[M@Z[H.22(J7G6H*I H  && &$^EJJ%?$@ A  (zz< %353G3G$H#I8
 C??GjL( 5%	N KK?[AQR_+
s   H1Hc           
     	   |j                         }t        5  t                t        j	                  |       }ddd       t
        j                  d|        dd|  ddS t        j                         |d   z
  }|t        kD  rEt        5  t        j                  | d       ddd       t
        j                  d| |       dd|  d	dS |j	                  d
g       }|s|r
dddg dg i dS ddg ddS |D ]0  }t        |d         j                         }	 |j                  |       2 ddlm}  |t               }	|D ]  }|	|d      j#                  |        i }
|	j%                         D ]*  \  }}t        |      }|j'                         st
        j                  d|       9	 |j)                  d      }|}d}|D ]  }|d   }|d   }||vrt
        j                  d||       )|j	                  d      }|t|j/                  d      }|dz
  }d|cxk  rt1        |      k  r5n n2|||   v r+||   j3                  ||d      ||<   dj5                  |      }n'|j3                  ||d      }n|j3                  ||d      }|dz  } |dkD  s#|||f|
|<   - |rddl}i }|
j%                         D ]b  \  }\  }}}t!        |j9                  |j/                  d      |j/                  d      d | d!| d"#            }dj5                  |      ||<   d t;        d$ |
j=                         D              }ddd|t?        |
jA                               g |d%}t
        jC                  d&| |t1        |
             |S tE               }d}|
j%                         D ]^  \  }\  } }}!t        |      }	 |jG                  |d       ||!z  }|jI                  tK        |             t
        jC                  d'|!|       ` t        5  t        j                  | d       ddd       d|t?        |      |d}t
        jC                  d)| |       |S # 1 sw Y   xY w# 1 sw Y   xY w# t        $ r( t
        j                  d||       dd|d    ddcY c S w xY w# t*        t,        f$ r"}t
        j                  d||       Y d}~Td}~ww xY w# t*        $ r"}t
        j                  d(||       Y d}~Wd}~ww xY w# 1 sw Y   xY w)*u  Apply a previously previewed refactoring to source files.

    Validates the refactor_id, checks expiry, ensures all edit paths are
    within the repo root, then performs exact string replacements on the
    target files.

    Args:
        refactor_id: ID from a prior ``rename_preview`` call.
        repo_root: Validated repository root path.
        dry_run: If True, compute the would-be changes and return a
            unified-diff representation per affected file, but do NOT
            write anything to disk. The ``refactor_id`` is preserved so
            the same preview can be committed afterwards via a second
            call without ``dry_run``. See: #176

    Returns:
        Status dict with applied count and modified files. When
        ``dry_run=True`` the dict additionally contains:

        - ``dry_run``: ``True``
        - ``would_modify``: list of file paths that would be changed
        - ``diffs``: map of file path → unified diff string showing the
          proposed change
    Nz1apply_refactor: unknown or expired refactor_id %serrorz
Refactor 'z' not found or expired.)statusr$  r   z/apply_refactor: refactor %s expired (%.0fs old)z' has expired.r=   okTr   )r%  dry_runappliedfiles_modifiededits_appliedwould_modifydiffs)r%  r(  r)  r*  r,   z<apply_refactor: path traversal blocked for %s (repo_root=%s)zEdit path 'z' is outside repo root.)defaultdictz"apply_refactor: file not found: %szutf-8)encodingz%apply_refactor: could not read %s: %sr.   r/   z+apply_refactor: old text %r not found in %sr-   )keependsr   r   za/zb/   )fromfiletofilenc              3  (   K   | ]
  \  }}}|  y wr   r   )ro   _o_ncounts       r&   rq   z!apply_refactor.<locals>.<genexpr>  s     FMBE%Fs   )r%  r'  r(  r*  r+  r)  r,  uD   apply_refactor: dry-run %s — %d edits would be applied to %d filesz(apply_refactor: applied %d edit(s) to %sz&apply_refactor: could not write %s: %su1   apply_refactor: completed %s — %d edits applied)&resolverM   r'   r   r   rA   rB   r   r    popr   relative_to
ValueErrorr$  collectionsr-  r   rC   r   is_file	read_textOSErrorUnicodeDecodeError
splitlinesr!   rs   joindifflibunified_diffsumvaluessortedkeysrN   r}   
write_textrI   r   )"r9   	repo_rootr'  rZ   ager=   edit	edit_pathr-  edits_by_fileplannedfile_str
file_editsrD   originalexccontentfile_edits_appliedold_textnew_texttarget_linelinesidxrC  r,  new_content_count
diff_linestotal_editsresultr)  r*  	_originalr7  s"                                     r&   apply_refactorra    so   : !!#I	 6$((56 JKX!jE\,]^^ ))+-
-C
$$ 	6"";5	6H+WZ[!j^,TUUKK$E4A"$q "R 
 1UVWW  f&..0	
	!!),$ (+6t+<M 1d6l#**401 02G - 3 3 5 $H*N	  "NN?K	 **G*<H
  	$DE{HE{Hw&Ai ((6*K&**D*9!Ao(c%j(Xs-C!&s!3!3Hh!JE#J ggenG%ooh!DG!//(Ha@!#)	$, !!)74F GGHI$HN  "9@ 	25H5xfg22##T#2&&&5hZH: 3  J !ggj1E(O	2 FW^^5EFF("7<<>2 
 	Rc'l	
   #uNM5<]]_ S119k5N		S  w ?U"Ms9~.KKBE9US 
 2{D12   0&	F KKC[R_`Ma6 6	6 	6(  	LLN9
 "&tF|n4KL 	6 +, 	NNBIsS	P  	SLLA9cRR	S2 2sf    Q 	QQ R'A	S8S0 Q
Q,R
RR?R::R?	S-S((S-0S9)r   int)rO   r   r;   r   r<   r   r   zOptional[dict[str, Any]])rQ   r   r   r`   )rD   r   r   r`   )rD   r   r   ztuple[str, ...])rO   r   r   zset[str])NN)rO   r   r3   Optional[str]r   rc  r   list[dict[str, Any]])rO   r   r   rd  )F)r9   r   rJ  r   r'  r`   r   zdict[str, Any])/__doc__
__future__r   	functoolsloggingre	threadingr   rJ   pathlibr   typingr   r   flowsr	   r
   graphr   r   	getLogger__name__rA   	frozensetr   r   compile
IGNORECASEr   LockrM   r   __annotations__r    r'   r[   r]   ra   rc   rn   	lru_cacherw   r   r   r  r"  ra  r   r^   r&   <module>rw     s   #   	       @ -			8	$
 $ %   O  

MM  !&( O ( 	"hhh h 	h`" 

;1
   T" # 12 "&GG
G  G 	G^
Rz ooo o 	or^   