
    jKj7                     x   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Zd dlZd dlZd dl	m
Z
 d dlmZ d dlmZmZ d dlmZmZmZmZ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 	 d dl m!Z! dZ#g d	Z$d
gZ%dZ&dZ'dZ(dZ)dZ*dZ+ e,d      Z-dZ.dZ/ ej`                  dejb                        Z2d Z3dZ4 G d d      Z5ed   Z6 edi deed   eee7ef      f   de7dee7ee7e8f   f   de7dee9   d e7d!eee7ef      d"e7d#eed   eee7ef      f   d$e6d%e7d&e7d'ee7e7f   d(ee7   d)ed*   d+e8d,e7ee7e8f   e7eee7e8f      ee7e8f   eee7   eed   eee7ef      f   ee   e7ed-   ee7e8f   ee7e8f   d.d/0      Z: ed1d2d2      Z; ej`                  d3      Z<d4Z=d5 Z>d6 Z?dd7Z@ G d8 d9      ZAer ed:      ZBeeAeBf   ZCd; ZDd< ZEd=d>d?eFfd@ZGdA ZH	 	 	 ddBZI	 ddCZJdD ZKdE ZLdF ZM	 	 ddGZNdH ZOdI ZP	 	 	 	 ddJZQ eReSdK      ZTeTrdL ZUndM ZU	 	 	 	 ddNZV	 ddOZWdP ZXdQ ZYdR ZZddSZ[ddTZ\dU Z]dV Z^dW Z_dX Z`dY ZadZ Zbd[ Zcd\ Zdd] Zedd^Zfd_ Zgd` Zh ej                  dab      dc        Zjdd Zkde Zldf Zm ej                  dab      dg        Zndh Zo e j                  di       G dj dk             ZqdlZrdmZsdnZt e,do      Zu e,dp      Zv ej`                  dq      Zw ej`                  dr      Zxg dsZy ej`                  dtj                  ey            Z{duZ|dvZ}dw Z~dx Zdy Zdz Zd{ Zd| Zd} Zej
                  ej                  ej                  ej                  ej                  ej                  ej                  eef	Zd~ Zd Zd ZddZd Zd Zd Zd Zd Zdddde'fdZde'fdZde'fdZy# e"$ r dZ!Y Pw xY w)    N)Counter)datetime)	FrameTypeTracebackType)TYPE_CHECKINGAnyDictIteratorListLiteralOptionalPatternSetTuple	TypedDictTypeVarUnioncast)ExceptionArgExcInfo)BaseExceptionGroupi   )z(?i)passwordz
(?i)secretz
(?i)passwdz(?i)pwdz(?i)api_keyz
(?i)apikeyz(?i)authz(?i)credentialsz(?i)privatekeyz(?i)private_keyz	(?i)tokenz(?i)aws_access_key_idz	(?i)_passz(?i)sk_z(?i)jwtz(?i)connection_stringz(?i)connectionstringz(?i)conn_strz(?i)connstrz(?i)dsnz^__.*Tz-$$_posthog_redacted_based_on_masking_rules_$$z$$_posthog_value_too_long_$$i   2   z\.^$*+?{}[]|()   d   z1([a-z][a-z0-9+.\-]{0,30}://)(?=[^/@\s]*:)[^/\s]*@c                 N    d| vr| S t         j                  dt        z   dz   |       S )N://z\g<1>@)_URL_CREDENTIALS_REsubCODE_VARIABLES_REDACTED_VALUEvalues    h/Users/ahmed/devFolder/Ultron/claude-voice/.venv/lib/python3.12/site-packages/posthog/exception_utils.py_redact_url_credentialsr$   e   s2    E""0036     i (  c                   (    e Zd ZefdZd Zd Zd Zy)VariableSizeLimiterc                      || _         d| _        y Nr   max_sizecurrent_size)selfr+   s     r#   __init__zVariableSizeLimiter.__init__q   s     r%   c                 :    | j                   |z   | j                  k  S N)r,   r+   r-   sizes     r#   can_addzVariableSizeLimiter.can_addu   s      4'4==88r%   c                 .    | xj                   |z  c_         y r0   )r,   r1   s     r#   addzVariableSizeLimiter.addx   s    T!r%   c                 4    | j                   | j                  z
  S r0   r*   )r-   s    r#   get_remaining_spacez'VariableSizeLimiter.get_remaining_space{   s    }}t0000r%   N)__name__
__module____qualname__"DEFAULT_TOTAL_VARIABLES_SIZE_LIMITr.   r3   r5   r7    r%   r#   r'   r'   p   s     B 9"1r%   r'   )fatalcriticalerrorwarninginfodebugEventbreadcrumbsvaluescheck_in_idcontextsdistdurationenvironmenterrorsevent_id	exceptionlevelloggermessagemodulesmonitor_slugplatformpythonprofilerelease)check_intransaction)requestserver_namespans
stacktracestart_timestampstatusthreads	timestamprX   typeuser_metrics_summaryF)totali     z^[a-zA-Z0-9/+=]*$z
[Filtered]c                 0    | t         z
  j                         S r0   )epochtotal_secondsr!   s    r#   to_timestampri      s    EM((**r%   c                 $    | j                  d      S )Nz%Y-%m-%dT%H:%M:%S.%fZ)strftimer!   s    r#   format_timestamprl      s    >>122r%   c                 \    | t        j                         } nt        |       } | d   d} d| iS )z+Creates a hint with the exc info filled in.Nr   exc_info)sysrn   exc_info_from_errorrn   s    r#   event_hint_with_exc_inforr      s9     <<>&x0{!!r%   c                   P    e Zd ZdZdZd Zd Zed        Zed        Z	ed        Z
y)	AnnotatedValuezA
    Meta information for a data field in the event payload.
    r"   metadatac                      || _         || _        y r0   ru   )r-   r"   rv   s      r#   r.   zAnnotatedValue.__init__   s    
 r%   c                     t        |t              sy| j                  |j                  k(  xr | j                  |j                  k(  S )NF)
isinstancert   r"   rv   )r-   others     r#   __eq__zAnnotatedValue.__eq__   s4    %0zzU[[(LT]]enn-LLr%   c                 &    t        ddddggi      S )zxThe value was removed because it could not be parsed. This is done for request body values that are not json nor a form. remz!rawxru   rt   clss    r#   removed_because_raw_dataz'AnnotatedValue.removed_because_raw_data   s,     

 
	
r%   c                 &    t        ddddggi      S )zThe actual value was removed because the size of the field exceeded the configured maximum size (specified with the max_request_body_size sdk option)r}   r~   !configr   ru   r   r   s    r#   removed_because_over_size_limitz.AnnotatedValue.removed_because_over_size_limit   s,     !

 
	
r%   c                 .    t        t        dddggi      S )zHThe actual value was removed because it contained sensitive information.r~   r   sru   )rt   SENSITIVE_DATA_SUBSTITUTEr   s    r#   +substituted_because_contains_sensitive_dataz:AnnotatedValue.substituted_because_contains_sensitive_data	  s,     +!

 
	
r%   N)r8   r9   r:   __doc__	__slots__r.   r{   classmethodr   r   r   r<   r%   r#   rt   rt      sU     &I!
M 
 
 
 
 
 
r%   rt   Tc                 :    t        | dd       xs t        | dd       S )Nr:   r8   getattrr   s    r#   get_type_namer     s    3-Oj$1OOr%   c                 *    t        | dd       }|dvr|S y )Nr9   )Nbuiltins__builtins__r   )r   mods     r#   get_type_moduler   $  s!    
#|T
*C
44
r%   framer   returnc                     	 | j                   d   }|j                  d      ry	 dD ]  }	 | j                  |   r y y# t        t        f$ r Y +w xY w# t
        $ r Y 8w xY w)Nr8   zsentry_sdk.T)__traceback_hide____tracebackhide__F)	f_globals
startswithAttributeErrorKeyErrorf_locals	Exception)r   r   	flag_names      r#   should_hide_framer   ,  s    ooj)>>-( )
 ?		~~i( ) ?  H%   		s     > AAA	AAc              #   f   K   | }|)t        |j                        s| |j                  }|(y y wr0   )r   tb_frametb_next)tbtb_s     r#   iter_stacksr   >  s1     
C
/ .Ikk /s   ,11c                    d}d }|0t        |d      r$	 |j                  |      }||j	                         }|	 t        j                  |       }|sg d g fS t        d||z
        }t        |dz   |z   t        |            }		 ||| D 
cg c]  }
t        |
j                  d      |        }}
t        ||   j                  d      |      }||dz   |	 D 
cg c]  }
t        |
j                  d      |        }}
|||fS # t        t        f$ r d }Y w xY w# t        t        f$ r g d g fcY S w xY wc c}
w c c}
w # t        $ r g d g fcY S w xY w)N   
get_sourcer   re   z
)
max_length)hasattrr   ImportErrorIOError
splitlines	linecachegetlinesOSErrormaxminlenstrip_stringstrip
IndexError)filenamelinenor   loadermodulecontext_linessource
source_strlower_boundupper_boundlinepre_contextcontext_linepost_contexts                 r#   get_lines_from_filer   G  s    MFgfl;	**62J !**,F~	 ''1F 4|a-/0Kfqj=0#f+>K {62
2 F+
C2 	 
 $F6N$8$8$@ZX 
k:
: F+
C: 	 
 L,667 W% 	J	 ! 	 tR<	 



  4|sR   D  D D; #D1++D; #D69D;  DDD.-D.1
D; ;EEc                    	 | j                   j                  }	 | j                  d   }	 | j                  d   }|dz
  }||rt	        |||||      S g d g fS # t        $ r d }Y Kw xY w# t        $ r g d g fcY S w xY w# t        $ r d }Y Pw xY w)Nr8   
__loader__re   )r   r   )f_codeco_filenamer   r   r   )r   	tb_linenomax_value_lengthabs_pathr   r   r   s          r#   get_source_contextr   u  s    <<++,. ]Fh"f.vf
 	
 tR<    4|  s3   A A' A; A$#A$'A87A8;B	B	c                 N    	 t        |       S # t        $ r t        |       cY S w xY wr0   )strr   	safe_reprr!   s    r#   safe_strr     s+     5z   s   
 $$c                 8    	 t        |       S # t        $ r Y yw xY w)Nz<broken repr>)reprr   r!   s    r#   r   r     s#    E{ s   
 	c                    |r| s|S 	 |j                  d      r|d d }| j                  dd      d   }|| k(  rt        j                  j	                  |      S t
        j                  |   j                  }|s|S |j                  |j                  t        j                  d      d   d      d   j                  t        j                        S # t        $ r |cY S w xY w)Nz.pyc.re   r      )endswithsplitospathbasenamero   rQ   __file__rsplitseplstripr   )r   r   base_modulebase_module_paths       r#   filename_for_moduler     s    6V$}Hll3*1-& 77##H--;;{3<<O~~.55bffa@CQGKRRFF
 	
  s   AC  C 8AC CCc                    t        | dd       }|sd }d }n,| j                  j                  }| j                  j                  }	 | j                  d   }|| j                  }dt        ||      xs d |rt        j                  j                  |      nd |xs d||d}t        | ||      \  |d<   |d<   |d<   |S # t
        $ r d }Y sw xY w)	Nr   r8   rT   z	<unknown>)rS   r   r   functionr   r   r   r   r   )r   r   r   co_namer   r   f_linenor   r   r   abspathr   )r   r   r   r   r   r   r   rvs           r#   serialize_framer     s     UHd+F<<++<<'', NN	 '9AT19BGGOOH-t+
B ASy*A=B}r.)2n+= I'  s   B7 7CCc                     t        | dd       S )Nerrnor   )	exc_values    r#   	get_errnor     s    9gt,,r%   c                 X    t        | dd      xs t        | dd      xs | }t        |      S )NrP   r}   detail)r   r   )r   rP   s     r#   get_error_messager     s;     		9b) 	9h+	  Gr%   c                 ~   i }|r|j                         nddd|d<   |||d   d<   |t        |      }nd}|5|d   j                  di       j                  di       j                  d	|       |||d   d
<   |dk(  }	|	s|||d   d<   d|d   d<   |	rd|d   vrd|d   d<   t        duxr t	        |t              }
|
rd|d   d<   t        |       |d<   t        |       |d<   t        |      |d<   t        }t        |      D cg c]$  }t        |j                  |j                  |      & }}|r|dd|d<   |S c c}w )zJ
    Creates a dict that goes into the events `exception.values` list
    genericT)ra   handled	mechanismNexception_idmetar   numberr   r   	parent_idchainedra   is_exception_groupr   r"   )r   r   raw)framesra   r\   )copyr   
setdefaultr   ry   r   r   r   DEFAULT_MAX_VALUE_LENGTHr   r   r   r   )exc_typer   r   r   r   r   r   exception_valuer   is_root_exceptionr   r   r  s                r#   !single_exception_from_error_tupler    s    O%	I$+O K  7C$^4)$$//;FFR	

*Xu
%17$X.$)!64=$[1/8$V,V?;+GG/8$V,+47 J%= =A$%9: / 9OH+H5OF0;OG/ b/ "B 	KKll-	

 "   395(I%s   )D:__suppress_context__c              #   h  K   | \  }}}g }t               }||t        |      |vr|||f |j                  |       |j                  t        |             |j                  r|j
                  }n|j                  }|y t        |      }|}t        |dd       }||t        |      |vry y y y y y w)N__traceback__)	setidappendr5   r	  	__cause____context__ra   r   )rn   r  r   r   seen_exceptionsseen_exception_idscauses          r#   walk_exception_chainr  4  s     "*)R U  %9%77Ir))
 ""9-""2i=1--!++!--}E{HI6B)  %9%77 & !7 & !s   B)B2,B2c              #      K   |  y wr0   r<   rq   s    r#   r  r  T  s     s   c                    t        | ||||||      }|g}|}|dz  }t        |d      xr |j                  }	|	rh|xr t        |d      xr |j                  du}
|
r|j                  }t	        t        |      |t        |dd      ||d      \  }}|j                  |       ng|xr t        |d      xr |j                  du}|rE|j                  }t	        t        |      |t        |dd      ||d      \  }}|j                  |       |xr t        |d	      }|rZt        |j                        D ]B  \  }}t	        t        |      |t        |dd      |||d
|z        \  }}|j                  |       D ||fS )zx
    Creates the list of exceptions.
    This can include chained exceptions and exceptions from an ExceptionGroup.
    )r  r   r   r   r   r   r   re   r	  r  Nr  )r  r   r   r   r   r   r  
exceptionszexceptions[%s])r  r   r	  r  exceptions_from_errorra   r   extendr  	enumerater  )r  r   r   r   r   r   r   parentr  should_supress_contextexception_has_causer  child_exceptionsexception_has_contentcontextr   idxes                     r#   r  r  Y  s    /!F JIAL 		12Uy7U7U    0	;/0##4/ 	
 ''E/De5/48#)"0,\+ ./  2	=12%%T1 	
 !++G/Dg!7OT:#)$0,\+ ./ #Gwy,'G	 4 45FC/Da1ot4#)#'#-0,\+ ./ 6 *%%r%   c           	          | \  }}}t         d uxr t        |t               }|rt        ||||dd      \  }}n3g }t        |       D ]#  \  }}}|j	                  t        ||||             % |j                          |S )Nr   )r  r   r   r   r   r   )r   ry   r  r  r  r  reverse)rn   r   r  r   r   r   _r  s           r#   exceptions_from_error_tupler&    s    
 'Hi+47 J%= /
J 
';H'E#Hi1(Ir9U (F
 r%   c                 T    	 t        |       S # t        $ r t        |       dd cY S w xY w)Nre   r   )r   UnicodeDecodeErrorr   r!   s    r#   	to_stringr)    s1    !5z !E{1R  !s   
 ''c              #      K   d| v r| d    d| v r)| d   j                  d      xs dD ]  }d|v s|d     d| v r*| d   j                  d      xs dD ]  }d|v s|d     y y w)Nr\   r_   rE   r<   rM   )get)eventthreadrM   s      r#   iter_event_stacktracesr.    s     uL!!EI&**84::Fv%\** ; e{+//9?R?Iy(-- @ s   /A*,A*A*c              #   h   K   t        |       D ]   }|j                  d      xs dD ]  }|  " y w)Nr  r<   )r.  r+  )r,  r\   r   s      r#   iter_event_framesr0    s5     ,U3
^^H-33EK 4 4s   02c                 b    t        |       D ]   }t        |j                  d      |||       " | S )Nr  )in_app_excludein_app_includeproject_root)r.  set_in_app_in_framesr+  )r,  r2  r3  r4  r\   s        r#   handle_in_appr6    s5    ,U3
NN8$))%		
 4 Lr%   c                    | sy | D ]  }|j                  d      }||j                  d      }t        ||      rd|d<   :t        ||      rd|d<   L|j                  d      }|`t        |      rd|d<   qt        ||      s~d|d<    | S )Nin_appr   TFr   )r+  _module_in_list_is_external_source_is_in_project_root)r  r2  r3  r4  r   current_in_appr   r   s           r#   r5  r5    s    8,%8$ 6>2"E(O 6>2#E(O 99Z(x(#E(Ox6"E(O; > Mr%   c                     t        | t              rt        | d      S t        | t              r&t	        |       dkD  r| d   d uxr t        | d   d      S y)N__posthog_exception_capturedre   F)ry   BaseExceptionr   tupler   )r?   s    r#   exception_is_already_capturedrA  %  s\    %'u<== 
E5	!c%j1nQxt# 
!H4)
 	
 r%   c                     t        | t              rt        | dd       t        | d|       y t        | t              r6t	        |       dkD  r'| d   !t        | d   dd       t        | d   d|       y y y y )Nr>  T__posthog_exception_uuidre   )ry   r?  setattrr@  r   )r?   uuids     r#   mark_exception_as_capturedrF  3  su    %'5t<148 
E5	!c%j1n8E!H<dCE!H8$?   '5	!r%   c                    t        | t              rt        |       dk(  r| \  }}}n|t        | t              rU	 t	        |        t        | dd       }|t        |       }| }nCt        j                         \  }}}|| ur'd }| }t        |       }nt        dt        |       z        |||f}t        rt        t        |      }|S # t
        $ r Y w xY w)N   r  z,Expected Exception object to report, got %s!)ry   r@  r   r?  construct_artificial_tracebackr   r   ra   ro   rn   
ValueErrorr   r   r   )r?   r  r   r   rn   s        r#   rp   rp   @  s    %CJ!O"')R	E=	)	*51 UOT2>E{HI&)lln#Hi%!	; G$u+UVV)R(H *O/  		s   B? ?	C
Cc                 F   t        | dd       y d}g }	 	 t        j                  |      }|dz  }|j	                  |       -# t        $ r Y nw xY w|j                          d }|D ].  }t        j                  |||j                  |j                        }0 t        | d|       y )Nr  r   re   )r   ro   	_getframerJ  r  r$  typesr   f_lastir   rD  )r"  depthr  r   r   s        r#   rI  rI  a  s    q/4(4EF
	MM%(EQJE 	e   		
 NN	B  UEMM5>>J  A#s   A 	AAc                 T    | y|sy|D ]  }|| k(  s| j                  |dz         s y y)NFr   Tr   )nameitemsitems      r#   r9  r9  z  s8    |4<4??4#:6  r%   c                 6    t        j                  d|       d u}|S )Nz [\\/](?:dist|site)-packages[\\/])research)r   external_sources     r#   r:  r:    s%     			5x@L  r%   c                 .    |y| j                  |      ryyNFTrQ  )r   r4  s     r#   r;  r;    s!     <(r%   c                 \    | j                  d      d|dz
   j                  dd      }|dz   S )zd
    Truncate a UTF-8-encodable string to the last full codepoint so that it fits in max_bytes.
    utf-8NrH  ignore)rK   ...)encodedecode)string	max_bytes	truncateds      r#   _truncate_by_bytesrd    s8    
 g&Q7>>wx>XIur%   c                 b    	 t        | j                  d            S # t        t        f$ r Y y w xY w)Nr\  )r   r_  UnicodeEncodeErrorr(  r!   s    r#   _get_size_in_bytesrg    s3    5<<()) 23 s    ..c                     | s| S |t         }t        |       }t        |       }|||kD  rt        | |      }n|||kD  r| d |dz
   dz   }n| S t	        ||xs |dd|dz
  |ggd      S )NrH  r^  z!limitr   )r   r~   ru   )r  rg  r   rd  rt   )r"   r   	byte_size	text_sizetruncated_values        r#   r   r     s    -
"5)IE
IZ!7,UJ?		9z#9 0*q.1E9)	sJNJ?@
 r%   c                     t        j                  d|       }|sy | |j                         d  }|rt        d |D              ry |j	                         S )Nz^\(\?[aiLmsux]*i[aiLmsux]*\)c              3   ,   K   | ]  }|t         v   y wr0   )_REGEX_METACHARACTERS).0cs     r#   	<genexpr>z+_extract_plain_substring.<locals>.<genexpr>  s     J	1A!66	s   )rV  matchendanylower)patterninline_flags	remainders      r#   _extract_plain_substringry    sQ     88;WEL((*,-IJ	JJ??r%   c                     | sy g }g }| D ]F  }t        |      }||j                  |       "	 |j                  t        j                  |             H |s|sy ||fS # t        $ r Y ]w xY wr0   )ry  r  rV  compiler   )patterns
substringsregexesrv  simples        r#   _compile_patterns_implr    s}    JG)'2f%rzz'23  g  	  s   $A	A('A(   )maxsizec                     t        |       S r0   )r  )patterns_tuples    r#   _compile_patterns_cachedr    s    !.11r%   c                 r    	 t        t        |             S # t        $ r t        t	        |             cY S w xY wr0   )r  r@  	TypeErrorr  list)r|  s    r#   _compile_patternsr    s4    6'h88 6%d8n556s    66c                     |y|\  }}|r| j                         }|D ]  }||v s y |D ]  }|j                  |       s y yrZ  )ru  rW  )rR  r|  r}  r~  
name_lowerr   rv  s          r#   _pattern_matchesr    sW    "JZZ\
AJ  >>$  r%   c                 >    | y| \  }}t        t        |            |fS )zCollapse a compiled ``(substrings, regexes)`` pair into a fast single-call matcher
    by compiling the literal substrings into one alternation regex. Returns ``None`` when
    there is nothing to match.N)_compile_substring_alternationr@  )compiledr}  r~  s      r#   _build_matcherr  	  s,     "J*5+<=wGGr%   c                 ^    | sy t        j                  dj                  d | D                    S )N|c              3   F   K   | ]  }t        j                  |        y wr0   )rV  escape)ro  r   s     r#   rq  z1_compile_substring_alternation.<locals>.<genexpr>  s     @Zryy|Zs   !)rV  r{  join)r}  s    r#   r  r    s(     ::chh@Z@@AAr%   c                     |y|\  }}| |j                  | j                               ry|D ]  }|j                  |       s y y)zMHot-path equivalent of ``_pattern_matches`` for a ``_build_matcher`` matcher.FT)rW  ru  )rR  matcher	substr_rer~  rv  s        r#   _matcher_matchesr    sN     Iw!1!1$**,!?>>$  r%   )frozenc                       e Zd ZU dZeeee   ee   f      ed<   eeee   ee   f      ed<   e	ed<   e
Ze	ed<   eZeed<   eddde
efd	       Zy)
_MaskingConfigzEverything the masking pipeline needs, compiled once per capture and threaded
    through instead of recompiling patterns per frame.maskr]  mask_url_credentialsdetect_secretsr   NTc           	      t     | t        t        |xs g             t        t        |xs g             |||      S )N)r  r]  r  r  r   )r  r  )r   mask_patternsignore_patternsr  r  r   s         r#   buildz_MaskingConfig.build8  s@      1-2E2 FG!"3O4Ir"JK!5)!
 	
r%   )r8   r9   r:   r   r   r   r   r   __annotations__bool%DEFAULT_CODE_VARIABLES_DETECT_SECRETSr  r  r   intr   r  r<   r%   r#   r  r  )  s    : hwg./  hwg./  @ND@.J. !<+
 
r%   r     gffffff@rH  0123456789abcdefABCDEFz()[]{}<>'"`,;zO\A[0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{12}\Zz\A[a-z][a-z.]*\Z)zsk-ant-[A-Za-z0-9_-]{16,}zsk-(?:proj-)?[A-Za-z0-9_-]{20,}zhf_[A-Za-z0-9]{34}zAKIA[0-9A-Z]{16}z<(?:ASIA|AGPA|AIDA|AROA|AIPA|ANPA|ANVA|ABIA|ACCA)[0-9A-Z]{16}zAIza[A-Za-z0-9_-]{35}zya29\.[A-Za-z0-9_-]{20,}zdo[opr]_v1_[a-f0-9]{64}z+(?:sk|pk|rk)_(?:live|test)_[A-Za-z0-9]{16,}z sq0[a-z]{3}-[A-Za-z0-9_-]{22,43}zgh[pousr]_[A-Za-z0-9]{36}zgithub_pat_[A-Za-z0-9_]{20,}z'gl(?:pat|ptt|rt|soat)-[A-Za-z0-9_-]{20}z#glsa_[A-Za-z0-9]{32}_[A-Fa-f0-9]{8}zxox[abeoprs]-[A-Za-z0-9-]{10,}zxapp-[0-9]-[A-Za-z0-9-]{10,}zSK[0-9a-fA-F]{32}z(SG\.[A-Za-z0-9_-]{22}\.[A-Za-z0-9_-]{43}zkey-[0-9a-f]{32}z[0-9a-f]{32}-us[0-9]{1,2}znpm_[A-Za-z0-9]{36}zpypi-AgEI[A-Za-z0-9_-]{50,}zdapi[0-9a-f]{32}zdp\.pt\.[A-Za-z0-9]{40,}zPMAK-[a-f0-9]{24}-[a-f0-9]{34}zlin_api_[A-Za-z0-9]{40}zntn_[A-Za-z0-9]{40,}z"shp(?:at|ca|pa|ss)_[a-fA-F0-9]{32}z$NR(?:AK|JS|II|MA|RA)-[A-Za-z0-9]{27}z<eyJ[A-Za-z0-9_-]{10,}\.[A-Za-z0-9_-]{10,}\.[A-Za-z0-9_-]{6,}r  zPRIVATE KEY-----   c                     d| v sd| v ryd| v r=d}| j                  d      D ]'  }|st        j                  |      s|dz  }|dk\  s' y y)	Nr   \T/r   re   r   F)r   _PATH_WORD_RErr  )r"   word_segmentssegments      r#   _looks_like_path_or_urlr    s[    ~
e|{{3'G=..w7" A%	 (
 r%   c                 `   d| v ryt        |       ryt        j                  |       ryt        |       }|j	                         }t
        j                  |      sydx}x}x}}d}|D ]g  }|j                         r y|j                         rd}|t        vs0d}3|j                         rd}|t        vsNd}Q|j                         rd}dd}d}i |ry||z   |z   |z   t        k  ryt        |       }	d}
|j                         D ]"  }||	z  }|
|t        j                   |      z  z  }
$ |
t"        k\  S )zGeneric gate: long, character-class-diverse, high-entropy strings that aren't
    structured ids/paths/reprs. Assumes ``len(value) >= _SECRET_MIN_LENGTH``. Cost is
    dominated by one C-level ``Counter`` pass; everything else runs over distinct chars. FTg        )r  _UUID_RErr  r   keys_SECRET_REJECT_CHARS
isdisjointisspaceislower_HEX_DIGITSisupperisdigit_SECRET_MIN_CHAR_CLASSESr   rE   mathlog2_SECRET_MIN_ENTROPY_BITS)r"   countsdistinct	has_lower	has_upper	has_digit
has_symbolhex_onlychnentropyoccurrencesps                r#   _is_high_entropy_secretr    s9    e|u%~~eU^F{{}H**845::I:	:I
H::<::<I$ ZZ\I$ ZZ\IJH " I	)J6:RRE
AG}}!O1tyy|## ' ...r%   c                     t         | v ryt        |       }|t        k  ryt        |       ry|t        k  rt
        j                  |       duS y)z5Last-resort credential check, layered cheapest first.TFN)_PEM_PRIVATE_KEY_MARKERr   _SECRET_MIN_LENGTHr  _KNOWN_SECRET_MAX_SCAN_LENGTH_KNOWN_SECRET_RErW  )r"   r  s     r#   _looks_like_secretr    sO    %'E
Au%))&&u-T99r%   c                     t        |       t        kD  rt        S t        | |j                        rt
        S |j                  rt        |       rt
        S |j                  rt        |       S | S )zApply the string masking policy: over-length cap, name/value patterns,
    entropy-based secret detection, then embedded URL credentials.)
r   #_MAX_VALUE_LENGTH_FOR_PATTERN_MATCHCODE_VARIABLES_TOO_LONG_VALUEr  r  r    r  r  r  r$   )r"   configs     r#   _mask_stringr    s[     5z77,,v{{+,,!3E!:,,""&u--Lr%   c                 L    	 t        |       j                  S # t        $ r Y yw xY w)Nunknown)ra   r:   r   r!   s    r#   _safe_type_namer    s)    E{''' s    	##c                 .   	 t        |       }t        |      t        kD  rt
        S t        ||j                        rt
        S |j                  rt        |      rt
        S |j                  rt        |      S |S # t        $ r dt        |       z   dz   cY S w xY w)zLast-resort serialization for values we can't structurally decompose. Renders
    ``repr(value)`` but fails closed: redact entirely on any mask match, over-length
    repr, or a raising ``__repr__``.<>)r   r   r  r   r  r    r  r  r  r  r  r$   )r"   r  rendereds      r#   
_safe_reprr    s    2;
 8}::,,&++.,,!3H!=,,""&x00O  2_U++c112s   A7 7BBc                 R   t        | t              ry	 t        j                  |       rBt        j                  |       D ci c]#  }|j
                  t        | |j
                        % c}S t        | dd      }t        |t              r|rt        |      S yc c}w # t        $ r Y yw xY w)zReturn a ``name -> value`` mapping of an object's attributes, or ``None`` for
    values that should be treated as opaque leaves (built-ins, slotted objects, empty
    ``__dict__``).N__dict__)	ry   ra   dataclassesis_dataclassfieldsrR  r   r   dict)r"   finstance_dicts      r#   _extract_object_attrsr    s     %##E*<G<N<Nu<UV<UqAFFGE16622<UVVz48 -&=M"" W s(   ,B (B'B *B B 	B&%B&c                 J    t        | t               xr t        | t               S )zTrue for a class member that holds or produces a value (class attribute,
    ``@property``, descriptor) as opposed to a method or nested class.)ry   ra   _METHOD_MEMBER_TYPES)attrs    r#   _is_data_memberr  )  s$     $%%Tj?S.T*TTr%   c                 J   |j                   i S 	 t        |       j                  }i }|D ]f  }|j                  j                         D ]G  \  }}t        |t              s||vst        |      s(t        ||j                         s?t        ||<   I h |S # t        $ r i cY S w xY w)zRedact sensitively-named members declared on the object's type (class attributes,
    ``@property``, ``__slots__`` entries) which live on the class, not instance
    ``__dict__``. Only member *names* are read, never the getters.)r  ra   __mro__r   r  rS  ry   r   r  r  r    )r"   r  mromaskedklassrR  r  s          r#   _masked_type_membersr  /  s     {{	5k!! F....0JD$4%&#D)$T6;;7<t 1  M  	s   B B"!B"c                    i }| D ]  \  }}t        |      t        u r|x}}nht        |t              r|n
t        |      }|du xs? t        |t        t        f      xs' t        |t              xr t        j                  |      }	|	r|n|}t        |      t        kD  r
t        ||<   t        ||j                        r
t        ||<   t        ||||dz         ||<    |S )zMask a sequence of ``(key, value)`` pairs into a dict. A key matching the mask
    redacts its value; surviving values recurse through ``_mask_value``. Keys are kept
    JSON-serializable.Nre   )ra   r   ry   r  floatr  isfiniter   r  r  r  r  r    _mask_value)
rS  r  seenrO  resultkeyr"   out_keykey_strkey_is_json_safes
             r#   _mask_mappingr  F  s     F
U9 ##Gg'S1cs3xG t CcC:.CsE*At}}S/A 
 .c7Gw<==;F7Ogv{{3;F7O)%uqyIF7O% & Mr%   c           
         |j                   |j                  s|j                  s| S t        |       }|t        u rt        | |      S |t        u s|t        u r| S |t        u r"t        j                  |       r| S t	        |       S | | S |t        ury|t        urq|t        urit        | t              rt        | |      S t        | t              r t        j                  |       st	        |       S t        | t        t        t        f      r| S |t        k\  rt         S |
t#               }t%        |       }||v ry|j'                  |       t)        |      t*        kD  rt         S |t        u st        | t              r4t)        |       t,        kD  rt         S t/        | j1                         |||      S t        | t              rXt3        | d      rL| j4                  }t)        |      t,        kD  rt         S t/        t7        ||       |||      }t9        |       |d<   |S t        | t        t        f      rHt)        |       t,        kD  rt         S | D cg c]  }t;        ||||dz          }	}	  t        |       |	      S t?        |       }
|
Dt)        |
      t,        kD  rt         S t/        |
j1                         |||      }t9        |       |d<   |S tA        | |      }|rt9        |       |d<   |S tC        | |      S c c}w # t<        $ r |	cY S w xY w)zTurn any Python value into a JSON-safe, masked value. Single source of truth for
    what gets redacted; the result contains only JSON-native types so it can be handed
    straight to ``json.dumps``.z<circular ref>_fields	__class__re   )"r  r  r  ra   r   r  r  r  r  r  r  r  r  r@  ry   _MAX_MASK_DEPTHr  r  r  r5   r   _MAX_TOTAL_NODES_TO_MASK_MAX_COLLECTION_ITEMS_TO_SCANr  rS  r   r   zipr  r  r   r  r  r  )r"   r  r  rO  tobj_idr  r  rT  masked_itemsattrsmasked_memberss               r#   r  r  a  s    	++%% 	UACxE6**Cx19Eze,u<#e*<}}$1E>eS!v..eU#DMM%,@u:edC/0L,,|uYF~HHV
4y++,,DyJud+u:5500U[[]FD%@@ %GE9$=v;6600s65164G-e4{%$'u:5500OTUutD&$	BuU	 4;|,, "%(Eu:5500u{{}fdEB-e4{ *%8N&5e&<{# eV$$5 V  	   	 s   K(K- -K;:K;c                     t        |       |kD  r| d|dz
   dz   } |j                  t        |             sy|j                  t        |              | S )zSTruncate to ``max_length`` and charge against the size budget; ``None`` when spent.NrH  r^  )r   r3   r5   )r  limiterr   s      r#   	_finalizer    sL    
6{Z(*q.)E1??3v;'KKFMr%   c                    	 t        |       }|d}nt        |t              rt        |      }nt        |t              r!t        j                  |      st        |      }n}t        |t        t        f      r9t        t        |            }|j                  |      sy|j                  |       |S t        |t              r|}nt        j                  |fdd      }t        ||j                        S # t        $ rF 	 t!        |       }n# t        $ r dt#        |        d}Y nw xY wt        ||j                        cY S w xY w)zFormat one already-masked variable for the wire: finite numbers stay raw JSON
    numbers, everything else becomes a string. ``None`` when the size budget is spent.NNonec                     t        |       S r0   )r  )or  s    r#   <lambda>z"_encode_variable.<locals>.<lambda>  s    *Q"7r%   F)default	allow_nanr  r  )r  ry   r  r   r  r  r  r  r   r3   r5   jsondumpsr  r   r   r  r  )r"   r  r  safer  result_sizer  s    `     r#   _encode_variabler    s!   "?5&)<Fd#YFe$T]]4-@YFsEl+c$i.K??;/KK$Kc"F ZZ7F &*;*;<< ?	5!%0H 	5?512!4H	57F,=,=>>?sC   BC5 C5 0AC5 5	E?DED'$E&D''EEc                 V    t        | t        d       t        t        t        t
        f      S r0   )ry   ra   r  r  r  r   r!   s    r#   _is_simple_typer    s    ed4j$UC@AAr%   c                     t        ||j                        rG|j                  t        t                    sy|j                  t        t                     t        | |<   yt        |||      }|y|| |<   y)zAdd one masked variable to ``result``; returns False when the budget is spent. A
    variable whose *name* matches the mask is redacted whole, value unread.FT)r  r  r3   r   r    r5   r  )r  rR  r"   r  r  encodeds         r#   _add_variabler    sg     fkk*s#@ABC5674tufg6GF4Lr%   c                    	 | j                   j                         }i }i }|j                         D ].  \  }}t	        ||j
                        r|t        |      r|n||<   0 i }t        |      D ]  }t        ||||   ||      r|c S  t        |      D ]  }t        ||||   ||      r|c S  |S # t        $ r i cY S w xY w)zSerialize one frame's locals into a ``name -> wire value`` dict. Scalars are
    emitted before complex values so the cheapest context survives a tight size budget.)	r   r  r   rS  r  r]  r  sortedr  )	r   r  r  
local_varsr  complex_rR  r"   r  s	            r#   _serialize_frame_variablesr#    s    ^^((*
  F!H!'')eD&--0AF?5)x> *
  FvVT6$<IM  x VT8D>67KM ! M#  	s   B1 1B?>B?c                 P    t         j                  |||||      }t        | ||      S )zSerialize a single frame's locals. Convenience wrapper that builds a one-off config;
    the hot path builds the config once - see ``attach_code_variables_to_frames``.)r  r  r  r  r   )r  r  r#  )r   r  r  r  r   r  r  r  s           r#   serialize_code_variablesr%     s9     !!#'1% " F &eWf==r%   c                 D    	 t        | |||||       y # t        $ r Y y w xY wr0   )attach_code_variables_to_framesr   )all_exceptionsrn   r  r  r  r  s         r#   #try_attach_code_variables_to_framesr)  5  s5    
' 	
  s    	c                 X   |\  }}}|y t        t        |            }	|	sy t        j                  ||||      }
t	               }| D ]b  }|j                  d      }|rd|vrt        |d   |	      D ]6  \  }}|j                  d      st        |j                  ||
      }|s2||d<   8 d y )N)r  r  r  r  r\   r  r8  code_variables)	r  r   r  r  r'   r+  r  r#  r   )r(  rn   r  r  r  r  r  r   	traceback	tb_framesr  r  rM   r\   serialized_frametb_item	variabless                    r#   r'  r'  J  s     &."Hi[+,I !!#'1%	 " F "#G#	]]<0
XZ7),Z-A9)M%g#''1273C3CWfUI5> !12 *N $r%   r0   )NNN)NN)NNNN)Nr   r   Nr)   )r  	functoolsr  r   r  r   rV  ro   rM  collectionsr   r   r   r   typingr   r   r	   r
   r   r   r   r   r   r   r   r   r   r   posthog.argsr   r   r   r   r   r  $DEFAULT_CODE_VARIABLES_MASK_PATTERNS&DEFAULT_CODE_VARIABLES_IGNORE_PATTERNS+DEFAULT_CODE_VARIABLES_MASK_URL_CREDENTIALSr  r    r  r  r  	frozensetrn  r  r  r{  
IGNORECASEr   r$   r;   r'   LogLevelStrr   objectr  rC   rg   BASE64_ALPHABETr   ri   rl   rr   rt   r   	Annotatedr   r   r  r   r   r   r   r   r   r   r   r   r   r  r   r   HAS_CHAINED_EXCEPTIONSr  r  r&  r)  r.  r0  r6  r5  rA  rF  rp   rI  r9  r:  r;  rd  rg  r   ry  r  	lru_cacher  r  r  r  r  r  	dataclassr  r  r  r  r  r  r  r  _KNOWN_SECRET_PATTERNSr  r  r  r  r  r  r  r  r  r  r  FunctionTypeBuiltinFunctionType
MethodTypeMethodDescriptorTypeWrapperDescriptorTypeMethodWrapperTypeClassMethodDescriptorTyper   staticmethodr  r  r  r  r  r  r  r  r  r#  r%  r)  r'  r<   r%   r#   <module>rJ     s9        	 	 
    *   " /+   ( $. +3 &.2 + )- % O  >  ', # " !"34     !bjj8"-- 
 &/ "1 1 NO0tHtDcN33
0 	s	0
 	Dd3;//00 	0 	HUO0 	s0 	$tCH~&0 	C0 	THtDcN33
0  	!0$ 	#%0( 	3)0* 	4S>+0. 	/00 	GH%102 	6304 	3506 V$d3;'(K
 $3- HtDcN33
 h'12S&[! f-_0b g4	n 	q! "**12( +
3
	"A
 A
H Ana'(IP
[ T $ +b 4 4 "J-
 AH !,BC 7@ W&x B!.
$N
@B$2	:	!& S!2 "26H S!B "B
 d#
 
 $
L    01 !!12 2::V
 

./& N 2::chh'=>? ,  # 
-/`,, 
						##
 U.6\%~%?PB"8 8>4 84 8&?A1  s   "N. .N98N9