
    (iB              	       F   d dl mZ d dlZd dlZd dl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eeef   ded	eeef   fd
Zej(                  j+                  ej(                  j-                  ej(                  j/                  e      d            Z eej(                  j-                  ed            5 Z ej8                  e      Z eed      Zed   D ]4  Zdev s e ejC                  d            D ]  Z"ejG                  d        6 	 ddd        eej(                  j-                  ed            5 Z$ ej8                  e$      Z eed      Z%ddd        G d de      Z& G d d      Z' G d de'      Z( G d de'      Z) G d d      Z* G d d      Z+g Z,ed   D ]*  Z-e,j]                  e-d          e,j]                  e-d           , ed   D  ci c]  } | d!    e/| d   | d    z          c} Z0d	e
e1   fd"Z2d	ee1e
e   f   fd#Z3 e3       Z4 e2       Z5 e6d$ ed   D              Z7ed%   Z8d&e1d	e9fd'Z:d(eeee1      ee1   f   d	efd)Z;d*ee'   d	efd+Z<d*ee'   d	e*fd,Z=d-eee1   eee1      f   d	efd.Z>d!ed	e+fd/Z?y# 1 sw Y   xxY w# 1 sw Y   ?xY wc c} w )0    )EnumN)AnyDictListLiteralOptionalSetTupleUnion)NFCNFD   )InvalidNameflist_mapped_keyreturnc                 J    | |   D ci c]  \  }}||
 c}}| |<   | S c c}}w )z
    Takes a `[key, [value]]` mapping from the original ENS spec json files and turns it
    into a `{key: value}` mapping.
     )r   r   kvs       C/var/www/br/venv/lib/python3.12/site-packages/ens/_normalization.py_json_list_mapping_to_dictr      s0     ,-_+=>41a!Q$>AoH ?s   specsznormalization_spec.jsonmappedemoji  znf.jsondecompc                       e Zd ZdZdZy)	TokenTyper   textN)__name__
__module____qualname__EMOJITEXTr       r   r   r   >   s    EDr&   r   c                       e Zd ZU eej
                  ej                  f   ed<   eed<   e	e
   ed<   dZee	e
      ed<   dZeed<   de	e
   d	dfd
Zed	e	e
   fd       Zed	efd       Zy)Tokentype_original_text_original_codepointsN_normalized_codepointsF
restricted
codepointsr   c                 L    || _         dj                  d |D              | _        y )N c              3   2   K   | ]  }t        |        y wNchr.0cps     r   	<genexpr>z!Token.__init__.<locals>.<genexpr>M   s     %C"c"g%C   )r+   joinr*   )selfr.   s     r   __init__zToken.__init__K   s!    $.! gg%C
%CCr&   c                 J    | j                   r| j                   S | j                  S r2   )r,   r+   r;   s    r   r.   zToken.codepointsO   s-     ** ''	
 **	
r&   c                 ,    t        | j                        S r2   )_codepoints_to_textr.   r>   s    r   r    z
Token.textW   s    "4??33r&   )r!   r"   r#   r   r   r%   r$   __annotations__strr   intr,   r   r-   boolr<   propertyr.   r    r   r&   r   r(   r(   C   s    
)..)//1
22s)#26HT#Y/6JD49 D D 
DI 
 
 4c 4 4r&   r(   c                   J    e Zd ZU ej                  Zeej                     ed<   y)
EmojiTokenr)   N)r!   r"   r#   r   r$   r)   r   rA   r   r&   r   rG   rG   \   s    %.__D')//
"4r&   rG   c                   J    e Zd ZU ej                  Zeej                     ed<   y)	TextTokenr)   N)r!   r"   r#   r   r%   r)   r   rA   r   r&   r   rI   rI   `   s    $-NND')..
!2r&   rI   c                   ^    e Zd ZU eed<   ee   ed<   	 	 ddedee   ddfdZedefd       Z	y)Labelr)   tokensNr   c                      || _         || _        y r2   )r)   rL   )r;   r)   rL   s      r   r<   zLabel.__init__h   s    
 	r&   c                 `    | j                   sydj                  d | j                   D              S )Nr0   c              3   4   K   | ]  }|j                     y wr2   r    r6   tokens     r   r8   zLabel.text.<locals>.<genexpr>u   s     ;euzz;   )rL   r:   r>   s    r   r    z
Label.textp   s%    {{ww;t{{;;;r&   )NN)
r!   r"   r#   rB   rA   r   r(   r<   rE   r    r   r&   r   rK   rK   d   sY    
IK " U 
	 <c < <r&   rK   c                   J    e Zd ZU ee   ed<   dee   ddfdZedefd       Z	y)ENSNormalizedNamelabelsnormalized_labelsr   Nc                     || _         y r2   )rV   )r;   rW   s     r   r<   zENSNormalizedName.__init__{   s	    'r&   c                 F    dj                  d | j                  D              S )N.c              3   4   K   | ]  }|j                     y wr2   rP   r6   labels     r   r8   z,ENSNormalizedName.as_text.<locals>.<genexpr>   s     <u

<rS   )r:   rV   r>   s    r   as_textzENSNormalizedName.as_text~   s    xx<<<<r&   )
r!   r"   r#   r   rK   rA   r<   rE   rB   r^   r   r&   r   rU   rU   x   s>    K($u+ ($ ( = = =r&   rU   groupsprimary	secondarynamec                      t               } t        j                         D ]  \  }}| j                  |        | j                  t	        t
        t        dj                  t	        t        |                                | S )Nr0   )	setVALID_BY_GROUPSitemsupdatemapordr   r:   r4   )	all_valid_name	valid_cpss      r   _extract_valid_codepointsrm      sd    I+113 $y#$Sc"''#c9*=">?@Ar&   c                     i } t         d   D ]W  }t        |d   |d   z         }g }|D ]  }t               }t        j                         D ]  \  }}||v s|j	                  |        t        |      dk(  r|j                  |h|f       bd}|D ]C  t        fd|D              sd}d   j                  |h       d   j                  |        n |r|j                  |h|f        |D ]r  }t               }	||d   v st               | |<   |D ]5  }
||
d   v r|	j                  |
d          | |   j                  |
d          7 | |   j                  |	      | |<   t Z | S )	a  
    Create a mapping, per confusable, that contains all the groups in the cp's whole
    confusable excluding the confusable extent of the cp itself - as per the spec at
    https://docs.ens.domains/ens-improvement-proposals/ensip-15-normalization-standard
    wholesvalidconfusedr   Fc              3   ,   K   | ]  }|d    v   yw)r   Nr   )r6   gentrys     r   r8   z2_construct_whole_confusable_map.<locals>.<genexpr>   s     9Q1a=9s   Tr   )
NORMALIZATION_SPECrd   re   rf   addlenappendanyrg   
difference)	whole_mapwholewhole_confusablesconfusable_extentsconfusable_cpr_   gngvextent_existsconfusable_cp_extent_groupscert   s              @r   _construct_whole_confusable_mapr      s    &(I#H- '&)%.5;L*L&M>@. 	IM"uF)//1 #B B&JJrN# %&!+"))M?F*CD %/ E9&99(,a8a/ %&--.GH'	I* / 	M47E'j 11+.5	-(, ?B$1-3::2a5A!-0771>	? ,5]+C+N+N/,	-(	3'R r&   c              #   2   K   | ]  }t        |        y wr2   rw   )r6   es     r   r8   r8      s     HqCFHr9   nsm_maxr7   c                 D    | t         d   D cg c]  }|d   	 c}v S c c}w )Nfencedr   )ru   )r7   r   s     r   
_is_fencedr      s%    *<X*FG&)GGGGs   cpsc                 2    dj                  d | D              S )Nr0   c              3   h   K   | ]*  }t        |t              rt        |      n
t        |       , y wr2   )
isinstancerC   r4   r@   r5   s     r   r8   z&_codepoints_to_text.<locals>.<genexpr>   s-      HJ:b#&B,?,CCs   02r:   )r   s    r   r@   r@      s     77 NQ  r&   rL   c           	      	   t        d | D              rydj                  d | D              }dj                  d | D              }| D cg c]  }|j                  D ]  }|  }}}t        |       dk(  r| d   j                  t
        j                  k(  r_|j                         }	 |j                  d       d	||j                  d	      d
 v rt        d| d      |dd dk(  rt        d| d      yd||j                  d      d
 v rt        d| d      t        |d         st        |d         rt        d| d      t        |      D ]F  \  }}|t        |      dz
  k(  r n0||dz      }t        |      s-t        |      s9t        d| d       t        d | D              rt        d| d      | D 	ch c]2  }	|	j                  t
        j                  k(  r|	j                  D ]  }| 4 }
}	}d
}t        j!                         D ]  \  }}|
j#                  |      s|} n |st        d| d      t$        d   D ]  }|d   |k(  sd|vr	|D cg c]  }t'        |      D ]  }t)        |        }}}d}t        |      D ]  \  }}||k  r|t$        d   v s|t        |      dz
  k(  r n|g}|dz   }||   }|t$        d   v r^|j+                  |       t        |      t,        kD  rt        dt,         d| d      |dz  }|t        |      k(  rn||   }|t$        d   v r^t        |      t        t/        |            k(  rt        d| d        n t/        t        j1                               }t/               }t/               }|
D ]  }t2        j5                  |      }|rAt        |      dkD  r3t        |      dk(  r nR|j7                  |      }|j9                  |       [t:        j                  |      dk(  r|c S |j9                  |        t        |      dkD  r}|D ]x  t        fd|D              st        |      dk(  r=d | d!| d"}|t        |      dkD  r|D cg c]  }| c} d#n d#z  }t        |      d$| d!| d" d#}t        |       |S c c}}w # t        $ r Y w xY wc c}}	w c c}}w c c}w )%z
    Validate tokens and return the label type.

    :param List[Token] tokens: the tokens to validate
    :raises InvalidName: if any of the tokens are invalid
    c              3   V   K   | ]!  }|j                   t        j                  k(   # y wr2   )r)   r   r$   rQ   s     r   r8   z6_validate_tokens_and_get_label_type.<locals>.<genexpr>   s     
=U5::(
=s   ')r   r0   c              3   4   K   | ]  }|j                     y wr2   rP   rQ   s     r   r8   z6_validate_tokens_and_get_label_type.<locals>.<genexpr>   s     88rS   c              3   p   K   | ].  }|j                   t        j                  k(  s!|j                   0 y wr2   )r)   r   r%   r    r6   ts     r   r8   z6_validate_tokens_and_get_label_type.<locals>.<genexpr>   s(      (!&&INN":(s   "66r   r   ascii_Nz9Underscores '_' may only occur at the start of a label: ''      z--z>A label's third and fourth characters cannot be hyphens '-': '_   z4Label cannot start or end with a fenced codepoint: 'z6Label cannot contain two fenced codepoints in a row: 'c              3      K   | ]9  }|j                   t        j                  k(  r|j                  d    t        d   v  ; yw)r   cmN)r)   r   r%   r.   ru   r   s     r   r8   z6_validate_tokens_and_get_label_type.<locals>.<genexpr>  s;      66Y^^# 	
Q-d33s   ?Az@At least one text token in label starts with a combining mark: 'z1Label contains codepoints from multiple groups: 'r_   rb   r   nsmz:Contiguous NSM sequence for label greater than NSM max of z: 'zBContiguous NSM sequence for label contains duplicate codepoints: 'c              3   4   K   | ]  }|t            v   y wr2   )re   )r6   r7   retained_group_names     r   r8   z6_validate_tokens_and_get_label_type.<locals>.<genexpr>m  s     O"2)<==Os   z)All characters in label are confusable: 'z' (z / )zLabel is confusable: ')allr:   r.   rw   r)   r   r%   encodedecodecountr   UnicodeDecodeErrorr   	enumeratery   re   rf   issubsetru   r   ri   rx   NSM_MAXrd   keysWHOLE_CONFUSABLE_MAPgetintersectionrv   GROUP_COMBINED_VALID_CPS)rL   
label_textconcat_text_tokens_as_strr   r7   all_token_cpsencodedcp_indexnext_cprR   text_token_cps_setchars_group_name
group_name	group_cpsgroupcnfd_cnfd_cps
next_indexcp_icontiguous_nsm_cpsretained_groupsconfused_charsbufferchar_cpgroups_excluding_cemsgrgnr   s                               @r   #_validate_tokens_and_get_label_typer      s    
=f
==888J " (( ! "(?A!,,?BR?R?M?
6{aF1INNinn<+224	NN7#/0I0O0OPS0T0VWW!"|1&  +1Q/47!"|1&   
]=..r2455G
|STU
 	
 -"#z-2C'DB:,aP
 	
 "-0 "s=)A--1-b>j1HTUV    
   *|1.
 	
 ::'""	  	
  !0!6!6!8 
I&&y1)
 ?
|1M
 	

 $H- $=,,5 (A#$sSTvFKCJ   
 )' 2 HD"z) /663w<!#33!.0T*%)AX
")*"5%);E)BB.55g>"#56@&1%//6is:,a%I'" !" '!OJ)S\9 %&-j&9G &);E)BB  ##56#cBT>U:VV"-!00:|1!># 18 I$P /..01OUNUF%  266w?3':#;a#??#q("1">">?R"S""7+%++G49## JJw   >Q#2 	'OOO v;!#&<s+;*<CA  /!3 ,;;CC;<A> 34A6C "#&& 1 =,-S1D0EQH  "#&&-	'0 y @& " 		B,N <s+   
R-&AR3 >7S"S	2	S3	S ?S c                 @   | D ]k  }|j                   t        j                  k(  s!|j                  D cg c]  }t	        |       }}t        |      }|D cg c]  }t        |       c}|_        m t        |       }t               }||_         | |_
        |S c c}w c c}w r2   )r)   r   r%   r+   r4   r   ri   r,   r   rK   rL   )rL   rR   r7   charsnfcr   
label_typer]   s           r   %_build_and_validate_label_from_tokensr     s     A::'','A'ABSWBEBe*C<?+@qCF+@E(A 5V<JGEEJELL C+@s   BBr   c                 2    dj                  d | D              S )Nr0   c              3      K   | ]7  }t        |t              rd j                  d |D              n
t        |       9 yw)r0   c              3   2   K   | ]  }t        |        y wr2   r3   )r6   r   s     r   r8   z8_buffer_codepoints_to_chars.<locals>.<genexpr>.<genexpr>  s     %1A%r9   N)r   listr:   r4   )r6   chars     r   r8   z._buffer_codepoints_to_chars.<locals>.<genexpr>  s9       *4D$)?%%%SYNs   =?r   )r   s    r   _buffer_codepoints_to_charsr     s     77   r&   c                    | st        g       S t        | t        t        f      r| j	                  d      } | j                  d      }t        d |D              rt        d      g }|D ]  }|D cg c]  }t        |       }}g }g }t        |      dkD  rd}d}	|	t        |      k  r}|d|	 }
t        |
      t        kD  rned|
v r@|
j                  d       |j                  d       t        |      dk(  rt        d	      |	dz  }	|
t        d
   v r|
}|	dz  }	|	t        |      k  r}|rSt        |      dkD  r|j                  t        |             g }|j                  t        |             |t        |      d }n|j!                  d      }|t        d   v rnq|t        d   v r%t        d   |   }|D ]  }|j                  |        nA|t"        v r|j                  |       n't        dt%        |       d| dt'        |       d      t        |      dkD  r(t        |      dk(  r|j                  t        |             t        |      dkD  rt)        |      }|j                  |        t        |      S c c}w )z
    Normalize an ENS name according to ENSIP-15
    https://docs.ens.domains/ens-improvement-proposals/ensip-15-normalization-standard

    :param str name: the dot-separated ENS name
    :raises InvalidName: if ``name`` has invalid syntax
    zutf-8rZ   c              3   8   K   | ]  }t        |      d k(    yw)r   Nr   r\   s     r   r8   z)normalize_name_ensip15.<locals>.<genexpr>  s     
3u3u:?
3s   zLabels cannot be emptyr   Nr   r   z(Empty name after removing 65039 (0xFE0F)r   ignoredr   zInvalid character: 'z' | codepoint z (r   )rU   r   bytes	bytearrayr   splitry   r   ri   rw   MAX_LEN_EMOJI_PATTERNremoveru   rx   rI   rG   popVALID_CODEPOINTSr4   hexr   )rb   
raw_labelsrW   	label_strr   _inputr   rL   emoji_codepoint	end_indexcurrent_emoji_sequenceleading_codepointr   r7   normalized_labels                  r   normalize_name_ensip15r     s     $$	D5),	-{{7#CJ

3

33233 B3	 #,,Q#a&,, &kAo"OIs6{*)/
);&-.1FF 44*11%8MM%(6{a')*TUUNI)-?-HH&<OQ	# s6{*& v;?MM)F"34F j9:O 4 67 %+JJqM!$(:9(EE&*<X*FF/9:KLF$ *b)* ),<<&78)237H3I2J K)):(;2cBS>T=UUVX 
 6{Q3v;!#3i/0k &kAot AH  !12EB3J .//E -s   /I8)@enumr   jsonostypingr   r   r   r   r   r	   r
   r   pyunormalizer   r   
exceptionsr   rB   r   pathabspathr:   dirname__file__specs_dir_pathopenspecloadr   ru   r   ranger   r   r   nfNFr   r(   rG   rI   rK   rU   r   dextendrd   re   rC   rm   r   r   r   maxr   r   rD   r   r@   r   r   r   r   )r   s   0r   <module>r      s2    		 	 	
	CH~		 
#s(^	 bggooh.G!QR	"'',,~'@
AB  d		$A3Ax@(  A:1775>*      
"'',,~y
12 1b		"A	#Ax	0B1 
4 425 53 3< <(= =  	H	% 4A##AiL1##AkN34
 <Nh;W67AfIs1Y<!K.011
3s8 0c3s8m)< 0f 78 ,. H,>w,GHH 
Y
'H3 H4 HU4S	?DI#=> 3 jU j jZ$u+ %  d3id3i.H(I c Y0 Y0): Y0k   1 1hs$   5(J/J8JJJJ