
    ,hw                       d Z ddlmZ ddlZddlmZ ddlmZ ddlmZ	 ddlm
Z dd	lmZ ddlZdd
lmZmZmZmZ dZh dZh dZh dZh dZh dZeez  ez  ez  ez  ZdZde dZdZde de dZde dZde de dZde de dZ de de d Z!d!e d"e d#e  d$Z"de d%e d&e" d'e d(e d)Z#d*e  Z$d+e  Z%d,e  d-e  d.Z&d/e d0e  d1e  de# Z'd2e  d3e d4Z(d2e  d3e d5Z)d6e  dZ*d7Z+e d8Z,d9e( Z-d:e  Z.d;e) d<e! d=e d>e d?e e d@e d?e e dAZ/dBe) dCe! dDe dEZ0e) dFe" de dGe d?e" dHe d8Z1e) dIe d8Z2e dJe dKe d?Z3e) dFe" de dGe d?e" dHe d8Z4 ejj                  dLe dMejl                        Z7 ejj                  dLe dNe dejl                        Z8 ejj                  dOe dPe dQejl                        Z9 ejj                  dRe" dSe dGe dTejt                        Z; ejj                  e      Z< ejj                  dUe d?      Z= ejj                  e dV      Z> ejj                  dUe* dWejt                        Z?dXZ@dYZAdZBdZZCd[ZDd\ZEd]ZFd^ZGd_ZHd`ZIdaZJdbZKdcZLddZM eeMe      	 	 	 	 	 	 	 	 	 	 ddf       ZNddgZOddhZPdddiZQddjZR G dk dl      ZS G dm dneS      ZT G do dp      ZU G dq dr      ZV eVds      j                  eBeFz  t      ZX eVdu      j                  eBeFz  t      ZY eVdv      j                  eBeFz  eEz  t      ZZ eVdw      j                  eBeFz  eGz  t      Z[ eVdx      j                  eBeFz  t      Z\ eVdy      j                  eBeFz  t      Z] eVdz      j                  eBeFz  t      Z^ eVd{      j                  eBeFz  t      Z_ eVd|      j                  eBeFz  eKz  t      Z` eVd}      j                  eBt      Za eVd~      j                  eBeFz  t      Zb eVd      j                  eBeFz  t      Zc eVd      j                  eBeIz  eFz  t      Zd eVd      j                  eBeJz  eFz  t      Ze eVd      j                  eBeFz  t      Zf eVd      j                  eBeFz  t      Zgy)zCSS selector parser.    )annotationsN)	lru_cache   )util)	css_match)	css_types)SelectorSyntaxError)MatchAnyIteratorcasti  >   :link:open:root:empty:muted:scope:checked:default:defined:enabled	:any-link	:disabled	:in-range	:optional	:required
:read-only:last-child:only-child:read-write:first-child:last-of-type:only-of-type:out-of-range:first-of-type:indeterminate:placeholder-shown>   :past:focus:hover:active:future:paused:target:playing:seeking:stalled:visited	:autofill
:buffering:fullscreen:local-link:focus-within:popover-open:user-invalid:focus-visible:target-within:volume-locked:picture-in-picture:host:current>   :matches:is:has:not:where	:contains:-soup-contains:-soup-contains-own>   :host-contextr>   r?   >   :dir:lang
:nth-child:nth-of-type:nth-last-child:nth-last-of-typez(?:\r\n|(?!\r\n)[\n\f\r])z	(?:[ \t]|)z"(?:/\*[^*]*\*+(?:[^/*][^*]*\*+)*/)z(?:|z(?:\\(?:[a-f0-9]{1,6}z?|[^\r\n\f]|$))z?|[^\r\n\f]|$|z))z8
(?:(?:-?(?:[^\x00-\x2f\x30-\x40\x5B-\x5E\x60\x7B-\x9f]|z>)+|--)
(?:[^\x00-\x2c\x2e\x2f\x3A-\x40\x5B-\x5E\x60\x7B-\x9f]|z)*)
z (?:[-+])?(?:[0-9]+n?|n)(?:(?<=n)z	*(?:[-+])z*(?:[0-9]+))?z(?:"(?:\\(?:.|z)|[^\\"\r\n\f]+)*?"|'(?:\\(?:.|z)|[^\\'\r\n\f]+)*?'|z+)z*(?P<cmp>[!~^|*$]?=)z*(?P<value>z)(?:z*(?P<case>[is]))?)?z*\]z\#z\.z(?P<tag_ns>(?:z|\*)?\|)?(?P<tag_name>z|\*)z\[z*(?P<attr_ns>(?:z|\*)?\|)?(?P<attr_name>z
(?P<name>:z)(?P<open>\(z*)?z*)z(?P<name>:(?=--)&z*\):z@Pz
(?P<pseudo_nth_child>z
(?P<nth_child>z|even|odd))(?:z*\)|(?P<of>*z*ofz*))
z
(?P<pseudo_nth_type>z
(?P<nth_type>z|even|odd))z*\)
z(?P<values>z*,z)*)z(?P<dir>ltr|rtl)z*?(?P<relation>[,+>~]|z(?![,+>~]))z(?:(\\[a-f0-9]{1,6}z?)|(\\[^\r\n\f])|(\\$))z?)|(\\[^\r\n\f])|(\\$)|(\\z'(?P<s1>[-+])?(?P<a>[0-9]+n?|n)(?:(?<=n)z*(?P<s2>[-+])z*(?P<b>[0-9]+))?z(?:(?P<value>z)|(?P<split>z*))^z*$$,                 @         i   i   i  )maxsizec                ~    t        |      }t        j                  | t        | ||      j	                         |||      S )zCached CSS compile.customflags)process_customcm	SoupSieve	CSSParserprocess_selectors)pattern
namespacesrc   rd   custom_selectorss        V/var/www/html/Resume-Scraper/venv/lib/python3.12/site-packages/soupsieve/css_parser.py_cached_css_compilern      sH     &f-<<#	
 


 
    c                 ,    t         j                          y)zPurge the cache.N)rn   cache_clear ro   rm   _purge_cachers      s     ##%ro   c                    i }| r| j                         D ]_  \  }}t        j                  |      }t        j	                  |      t        d| d      ||v rt        d| d      ||t        |      <   a |S )zProcess custom.z
The name 'z)' is not a valid custom pseudo-class namezThe custom selector 'z' has already been registered)itemsr   lower	RE_CUSTOMmatchr	   KeyErrorcss_unescape)rc   rl   keyvaluenames        rm   re   re      s      ,,. 	9JC::c?Dt$,)Jtf<e*fgg''!6tf<YZ[[38\$/0	9 ro   c                F    dd}|st         nt        j                  ||       S )zs
    Unescape CSS value.

    Strings allow for spanning the value on multiple strings by escaping a new line.
    c                   | j                  d      r6t        | j                  d      dd d      }|dk(  rt        }t        |      }|S | j                  d      r| j                  d      dd }|S | j                  d      rd}|S d}|S )	z(Replace with the appropriate substitute.r   Nr[   r   rX         � )groupintUNICODE_REPLACEMENT_CHARchr)m	codepointr|   s      rm   replacezcss_unescape.<locals>.replace   s     771:AGGAJqrNB/IA~4		NE  WWQZGGAJqrNE  WWQZE  Ero   )r   
Match[str]returnstr)
RE_CSS_ESCRE_CSS_STR_ESCsub)contentstringr   s      rm   rz   rz      s     " %J.==gwOOro   c                z   g }t        |       }|dkD  xr | d   dk(  }|dk(  r|r|j                  d|         nt        |       D ]  \  }}t        |      }|dk(  r|j                  d       (d|cxk  rdk  sn |dk(  r|j                  d|dd	       Q|dk(  s|r*|dk(  r%d
|cxk  rdk  rn n|j                  d|dd	       |dv s:|dk\  s5d
|cxk  rdk  s*n d
|cxk  rdk  sn d|cxk  rdk  sn d|cxk  rdk  rn n|j                  |       |j                  d|         dj	                  |      S )zEscape identifier.r   -r   \r         xrW   0   9   )-   _   r^   A   Z   a   z   r   )lenappend	enumerateordjoin)identr   length
start_dashindexcr   s          rm   escaper     sG    FZF!/aCJ{z5'l#!%( 	(HE1AID h')+t+	T0A9Q-q121*
$)B[W[B[9Q-q12\)Y$->49C\X\C\*d*	0IT0ItW`OhdhOha 1#h'	( 776?ro   c                  (    e Zd ZdZddZddZddZy)	SelectorPatternSelector pattern.c                    || _         t        j                  |t        j                  t        j                  z  t        j
                  z        | _        y)Initialize.N)r}   recompileIXU
re_pattern)selfr}   rj   s      rm   __init__zSelectorPattern.__init__2  s2     	**WbddRTTkBDD.@Aro   c                    | j                   S )	Get name.)r}   r   s    rm   get_namezSelectorPattern.get_name8  s     yyro   c                :    | j                   j                  ||      S )Match the selector.)r   rx   )r   selectorr   rd   s       rm   rx   zSelectorPattern.match=  s     $$Xu55ro   N)r}   r   rj   r   r   Noner   r   r   r   r   r   rd   r   r   zMatch[str] | None__name__
__module____qualname____doc__r   r   rx   rr   ro   rm   r   r   /  s    B
6ro   r   c                  (    e Zd ZdZddZddZddZy)	SpecialPseudoPatternr   c                &   i | _         |D ]/  }|d   } |d   ||d         }|d   D ]  }|| j                   |<    1 d| _        t        j                  t        t        j
                  t        j                  z  t        j                  z        | _        y)r   r   r   rX   r   N)	patternsmatched_namer   r   PAT_PSEUDO_CLASS_SPECIALr   r   r   re_pseudo_name)r   r   pr}   rj   pseudos         rm   r   zSpecialPseudoPattern.__init__F  s      	0AQ4Dad41&GA$ 0(/f%0	0 ! jj)A244"$$;QSQUQUCUVro   c                R    | j                   dS | j                   j                         S )r   r   )r   r   r   s    rm   r   zSpecialPseudoPattern.get_nameS  s)     &&.rPD4E4E4N4N4PPro   c                   d}| j                   j                  ||      }|rft        j                  t	        |j                  d                  }| j                  j                  |      }|r|j                  |||      }|r|| _        |S )r   Nr}   )	r   rx   r   rv   rz   r   r   getr   )r   r   r   rd   r   r   r}   rj   s           rm   rx   zSpecialPseudoPattern.matchX  sx     %%h6::l1776?;<Dmm''-G x>(/D%ro   N)r   zCtuple[tuple[str, tuple[str, ...], str, type[SelectorPattern]], ...]r   r   r   r   r   rr   ro   rm   r   r   C  s    WQ
ro   r   c                  4    e Zd ZdZddZddZd	dZd
dZeZy)	_Selectorz
    Intermediate selector class.

    This stores selector data for a compound selector as we are acquiring them.
    Once we are done collecting the data for a compound selector, we freeze
    the data in an object that can be pickled and hashed.
    c                ,   |j                  dd      | _        |j                  dg       | _        |j                  dg       | _        |j                  dg       | _        |j                  dg       | _        |j                  dg       | _        |j                  dg       | _        |j                  d	d      | _        |j                  d
g       | _	        |j                  dg       | _
        |j                  dd      | _        |j                  dd      | _        y)r   tagNidsclasses
attributesnth	selectors	relationsrel_typecontainslangrd   r   no_matchF)r   r   r   r   r   r   r   r   r   r   r   rd   r   )r   kwargss     rm   r   z_Selector.__init__q  s     ::eT*::eR(zz)R0 **\26::eR(K4K4

:t4

:r2JJvr*	ZZ+


:u5ro   c                    |rG|d   }|j                   j                  |dd        t        j                  |j	                         g      S t        j                         S )zFreeze relation.r   r   N)r   extendctSelectorListfreeze)r   r   sels      rm   _freeze_relationsz_Selector._freeze_relations  sL     A,CMM  12/??CJJL>22??$$ro   c                   | j                   rt        j                         S t        j                  | j                  t        | j                        t        | j                        t        | j                        t        | j                        t        | j                        | j                  | j                        | j                  t        | j                        t        | j                        | j                         S )zFreeze self.)r   r   SelectorNullSelectorr   tupler   r   r   r   r   r   r   r   r   r   rd   r   s    rm   r   z_Selector.freeze  s     ==??$$;;dhhdll#doo&dhhdnn%&&t~~6dmm$dii 

 ro   c                @   d| j                   d| j                  d| j                  d| j                  d| j                  d| j
                  d| j                  d| j                  d	| j                  d
| j                  d| j                  d| j                  dS )zString representation.z_Selector(tag=z, ids=z
, classes=z, attributes=z, nth=z, selectors=z, relations=z, rel_type=z, contains=z, lang=z, flags=z, no_match=rO   )r   r   r   r   r   r   r   r   r   r   rd   r   r   s    rm   __str__z_Selector.__str__  s     TXXLtxxl*T\\DTTabfbqbqat u88,l4>>*<LHZ [(DMM3DGDII=X`aeakak`n o(+	
ro   N)r   r   r   r   )r   list[_Selector]r   ct.SelectorList)r   zct.Selector | ct.SelectorNullr   )	r   r   r   r   r   r   r   r   __repr__rr   ro   rm   r   r   h  s"    6 %(
 Hro   r   c                  2   e Zd ZdZ ede       eddeefddeefdde	efd	d
e
efddeeff       ede       ede       ede       ede       ede       ede       ede       ede       ede       ede      fZ	 	 d(	 	 	 	 	 	 	 d)dZd*dZd*dZd*dZ	 	 	 	 	 	 	 	 	 	 	 	 d+dZ	 	 	 	 	 	 	 	 	 	 d,dZ	 	 	 	 	 	 	 	 	 	 	 	 d-dZ	 	 	 	 	 	 	 	 	 	 	 	 	 	 d.dZ	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 d/d Zd*d!Z d*d"Z!d*d#Z"d*d$Z#	 	 d0	 	 	 	 	 	 	 d1d%Z$d2d&Z%d0d3d'Z&y)4rh   zParse CSS selectors.pseudo_closepseudo_contains)rE   rF   rG   pseudo_nth_child)rK   rM   pseudo_nth_type)rL   rN   pseudo_lang)rJ   
pseudo_dir)rI   pseudo_class_custompseudo_classpseudo_elementampat_ruleidclassr   	attributecombineNc                    |j                  dd      | _        || _        | j                  t        j                  z  | _        |i | _        y|| _        y)r    r   N)r   rj   rd   r   DEBUGdebugrc   )r   r   rc   rd   s       rm   r   zCSSParser.__init__  sD      ''9
ZZ$**,
"Nbro   c                   d}|j                  d      }|j                  d      r$t        j                  |j                  d            nd}|j                  d      rt        |j                  d      dd       nd}t        |j                  d            }d}	d}
d}|r)|d	k(  rt        j
                  nd
t        j                  z  }nLt        j                  |      dk(  r$t        j
                  t        j                  z  }d}	nt        j                  }|rY|j                  d      j                  d      rt        |j                  d      dd d      }nt        |j                  d            }|sd}n|j                  d      r.t	        j                  dt	        j                  |      z  |      }nS|j                  d      r.t	        j                  dt	        j                  |      z  |      }n|j                  d      r-t	        j                  dt	        j                  |      z  |      }n|j                  d      rH|rt        j                  |      rdnt	        j                  |      }t	        j                  d|z  |      }n}|j                  d      r-t	        j                  dt	        j                  |      z  |      }n?t	        j                  dt	        j                  |      z  |      }|j                  d      rd}|	r!|rt	        j                  |j                        }
t        j                  ||||
      }|rjt               }|j                   j#                  |       t        j$                  |j'                         gdd      }|j(                  j#                  |       d}|S |j                   j#                  |       d}|S )z8Create attribute selector from the returned regex match.FcmpcaseNattr_nsr   	attr_nameir   typeTr|   "'r   rT   z^%s.*rU   z.*?%s$rS   z.*?%s.*~z[^\s\S]z7.*?(?:(?<=^)|(?<=[ \t\r\n\f]))%s(?=(?:[ \t\r\n\f]|$)).*rP   z^%s(?:-.*)?$z^%s$!)r   r   rv   rz   r   r   DOTALL
startswithr   r   RE_WSsearchrj   r   SelectorAttributer   r   r   r   r   r   )r   r   r   has_selectorinverseopr  nsattris_typepattern2r|   rd   rj   sel_attrsub_selnot_lists                    rm   parse_attribute_selectorz"CSSParser.parse_attribute_selector  s    WWU^./ggfotzz!''&/*467ggi6H\!''),Sb12bAGGK01!S[RTTa299<EZZ'DD299$EGIIEwww**:6$QWWW%5a%;TB$QWWW%56G]]3jjBIIe,<!<eDG]]3jjRYYu-=!=uEG]]3jjbii.>!>FG]]3 ',u||E/BJ		RWHXEjj![^c!cejkG]]3jj299U3C!CUKG jj299U+;!;UCG}}S!wzz'//2H ''b'8DkG%%h/(8'94GHMM  *  NN!!(+ro   c                    |j                  d      rt        |j                  d      dd       nd}t        |j                  d            }t        j                  ||      |_        d}|S )z#Parse tag pattern from regex match.tag_nsNr
  tag_nameT)r   rz   r   SelectorTagr   )r   r   r   r  prefixr   s         rm   parse_tag_patternzCSSParser.parse_tag_pattern  s\     :;9Jaggh/45PT177:./..f-ro   c                "   t        j                  t        |j                  d                  }| j                  j                  |      }|;t        d| d|j                  d       | j                  |j                  d            t        |t        j                        sR| j                  |= t        || j                  | j                        j                  t              }|| j                  |<   |j                   j#                  |       d}|S )z
        Parse custom pseudo class alias.

        Compile custom selectors as we need them. When compiling a custom selector,
        set it to `None` in the dictionary so we can avoid an infinite loop.
        r}   zUndefined custom selector 'z' found at position r   rb   rd   T)r   rv   rz   r   rc   r   r	   endrj   
isinstancer   r   rh   rd   ri   
FLG_PSEUDOr   r   )r   r   r   r  r   r   s         rm   parse_pseudo_class_customz#CSSParser.parse_pseudo_class_custom'  s     L9:;;??6*%-fX5I!%%PQ(Ta  (BOO4F# DJJj1  #+DKKX&ro   c                z   d}t        j                  t        |j                  d                  }|j                  d      rd}|r0|t        v r(| j                  |||||j                  d            }||fS |s|t        v r|dk(  r%|xj                  t        j                  z  c_        n|dk(  r'|xj                  t        j                  z  c_        d}n|dk(  r%|xj                  t        j                  z  c_        n|d	k(  r%|xj                  t        j                  z  c_        nU|d
v r!|j                  j                  t                n0|dk(  r!|j                  j                  t"               n
|dk(  r!|j                  j                  t$               n|dk(  r!|j                  j                  t&               n|dk(  r!|j                  j                  t(               n|dk(  r!|j                  j                  t*               nr|dk(  r!|j                  j                  t,               nL|dk(  r!|j                  j                  t.               n&|dk(  r!|j                  j                  t0               n |dk(  r!|j                  j                  t2               n|dk(  r!|j                  j                  t4               n|dk(  r!|j                  j                  t6               n|dk(  r!|j                  j                  t8               nh|dk(  r!|j                  j                  t:               nB|dk(  r!|j                  j                  t<               n|dk(  rG|j>                  j                  t        j@                  dddddt        jB                                      n|dk(  rG|j>                  j                  t        j@                  dddddt        jB                                      n|dk(  rG|j>                  j                  t        j@                  dddddt        jB                                      n8|dk(  rF|j>                  j                  t        j@                  dddddt        jB                                      n|dk(  rr|j>                  jE                  t        j@                  dddddt        jB                               t        j@                  dddddt        jB                               g       nv|dk(  rq|j>                  jE                  t        j@                  dddddt        jB                               t        j@                  dddddt        jB                               g       d}||fS |rB|tF        v r:| jI                  ||j                  d      tJ        tL        z         d|_'        d}||fS |s|tP        v rd|_'        d}||fS |tR        v r*tU        d | d!| jV                  |jY                  d            tU        d!| d"| jV                  |jY                  d            )#zParse pseudo class.Fr}   openTr   r   r   r   r   )r   r   r   r   r&   r   r   r   r   r   r   r   r    r   r$   r'   r!   r   r   r%   r"   r   r#   z!Invalid syntax for pseudo class 'r  z' was detected as a pseudo-class and is either unsupported or invalid. If the syntax was not intended to be recognized as a pseudo-class, please escape the colon.)-r   rv   rz   r   PSEUDO_COMPLEXparse_pseudo_openr+  PSEUDO_SIMPLErd   r   SEL_ROOTSEL_DEFINED	SEL_SCOPE	SEL_EMPTYr   r   CSS_LINKCSS_CHECKEDCSS_DEFAULTCSS_INDETERMINATECSS_DISABLEDCSS_ENABLEDCSS_REQUIRED	CSS_MUTEDCSS_OPENCSS_OPTIONALCSS_READ_ONLYCSS_READ_WRITECSS_IN_RANGECSS_OUT_OF_RANGECSS_PLACEHOLDER_SHOWNr   SelectorNthr   r   PSEUDO_COMPLEX_NO_MATCHparse_selectorsr-  FLG_OPENr   PSEUDO_SIMPLE_NO_MATCHPSEUDO_SUPPORTEDr	   rj   start)r   r   r   r  	iselectoris_htmlcomplex_pseudor   s           rm   parse_pseudo_classzCSSParser.parse_pseudo_classC  s    L9:776?!Nf611#v|YXYX]X]^_X`aLj W$$i  Fm$; 		R[[(	:%		R^^+	8#		R\\)	8#		R\\)	11$$X.:%$$[1:%$$[1++$$%67;&$$\2:%$$[1;&$$\28#$$Y/7"$$X.;&$$\2<'$$]3=($$^4;&$$\2?*$$%56//$$%:;>)r~~a5%IZ[\=(r~~a5$HYZ[++r~~a4HYZ[?*r~~a4rGXYZ=(q%E5"//BSTq%E4ARS ?*q%D%ARSq%D$@QR  L, W$$+ *A A  AEE!Hj86KLCLL$ W$$#  F.D$DCLL W$$ ''%3F81=
  &F8 n n
	 ro   c                   |j                         }|j                  d      rd}nd}t        j                  t	        |d               |d<   t        j                  |j                  d|z               }|dk(  rd}d}	d	}
n|d
k(  rd}d}	d	}
nt        t        t           t        j                  |            }|j                  d      r|j                  d      dk(  rdnd}|j                  d      }|j                  d      }
|j                  d      r|dz  }n|
r	||dd z  }n||z  }|j                  d      r|j                  d      dk(  rdnd}|j                  d      r||j                  d      z  }nd}t        |d      }t        |d      }	|d   }|dk(  r|j                  d      r.| j                  ||j                  d      t         t"        z        }nt$        }|dk(  r7|j&                  j)                  t+        j,                  ||
|	dd|             d	}|S |dk(  r3|j&                  j)                  t+        j,                  ||
|	dd	|             d	}|S |dk(  rI|j&                  j)                  t+        j,                  ||
|	d	dt+        j.                                      d	}|S |dk(  rE|j&                  j)                  t+        j,                  ||
|	d	d	t+        j.                                      d	}|S )zParse `nth` pseudo.r   _child_typer}   r   evenrX   r   Toddr   s1r   r   an1Nr
  s2b0
   ofrK   FrM   rL   rN   )	groupdictr   r   rv   rz   r   r
   r   RE_NTHrx   r   endswithr  r   rI  r+  r-  rJ  CSS_NTH_OF_S_DEFAULTr   r   r   rG  r   )r   r   r   r  rN  mdictpostfixr   rW  r[  var	nth_parts_s1rX  _s2
pseudo_selnth_sels                    rm   parse_pseudo_nthzCSSParser.parse_pseudo_nth  s    99'(GG

<f#>?f**UYYuw78fBBCBBCU3Zg)>?I".9??43HC3O#UWC$A**S/C||C s
q"vq".9??43HC3O#UWCs#ys++S"BS"B6]
hwwt}..y!%%(JQYDYZ /\)r~~b#r5%QR  00r~~b#r5$PQ  ^+r~~b#r4HYZ[  22r~~b#r4rGXYZro   c                    t         t        z  }|dk(  r
|t        z  }n|dk(  r
|t        z  }n|dv r	|t        z  }|j
                  j                  | j                  |||             d}|S )z"Parse pseudo with opening bracket.rC   rB   )rD   rA   T)r-  rJ  FLG_NOTFLG_RELATIVEFLG_FORGIVEr   r   rI  )r   r   r}   r  rN  r   rd   s          rm   r2  zCSSParser.parse_pseudo_open  so     X%6>WEV^\!E&&[ ET11)UEJKro   c                   |j                  d      j                         }|st        }|t        k(  rH||_        |d   j
                  j                  |       dt        z   }|j                  t                      nS|r&||_        |d   j
                  j                  |       n&|dd t        k7  rt        d| | j                  |      d|z   }t               }d}|||fS )Parse combinator tokens.relationr
  rR   r   Nz%The multiple combinators at position F)
r   stripWS_COMBINATORCOMMA_COMBINATORr   r   r   r   r	   rj   )r   r   r   r  r   r   r   
combinators           rm   parse_has_combinatorzCSSParser.parse_has_combinator  s     WWZ(..0
&J))#CLbM##**3/]*HY[)'"''..s3!". *;E7CLL  Z'HkS(**ro   c	                L   |j                  d      j                         }	|	st        }	|sP|r	|	t        k7  rt	        d|	 d| d| j
                  |      |	t        k(  rd|_        |dd= |j                  |       n|	t        k(  r[|j                  s|st        j                  dd      |_        |j                  j                  |       |j                  |       |dd= n8|j                  j                  |       |	|_        |dd= |j                  |       t               }d}||fS )	rr  rs  zThe combinator 'z' at position z , must have a selector before itTNrS   F)r   rt  ru  rv  r	   rj   r   r   r   r   r&  r   r   r   r   )
r   r   r   r  r   r   	is_pseudo
is_forgiver   rw  s
             rm   parse_combinatorzCSSParser.parse_combinator,  s    WWZ(..0
&J/?!?)&zl.GghLL  --#aL  %--wwy nnS$7CG$$Y/  %aL$$Y/)aL  %kS  ro   c                    |j                  d      }|j                  d      r+|j                  j                  t	        |dd              d}|S |j
                  j                  t	        |dd              d}|S )zParse HTML classes and ids.r   .r   NT)r   r  r   r   rz   r   )r   r   r   r  r   s        rm   parse_class_idzCSSParser.parse_class_id\  sq     771:s#KK|HQRL9:  GGNN<56ro   c                6   t        j                  t        |j                  d                  }|dk(  rt	        j
                  dt               |dk(  }t        |j                  d            }g }t        j                  |      D ]b  }|j                  d      r|j                  d      }	|	j                  d      rt        |	d	d
 d      }	nt        |	      }	|j                  |	       d |j                  j                  t        j                  ||             d}|S )zParse contains.r}   rE   z\The pseudo class ':contains' is deprecated, ':-soup-contains' should be used moving forward.rG   valuessplitr|   )r  r  r   r
  T)r   rv   rz   r   warningswarnFutureWarning	RE_VALUESfinditerr  r   r   r   SelectorContains)
r   r   r   r  r   contains_ownr  r   tokenr|   s
             rm   parse_pseudo_containszCSSParser.parse_pseudo_containsg  s     L9:[ MMn !66aggh/0''/ 	#E{{7#KK(E
+$U1R[$7$U+OOE"	# 	B//,GHro   c                   |j                  d      }g }t        j                  |      D ]b  }|j                  d      r|j                  d      }|j                  d      rt	        |dd d      }nt	        |      }|j                  |       d |j                  j                  t        j                  |             d}|S )zParse pseudo language.r  r  r|   r  r   r
  T)	r   r  r  r  rz   r   r   r   SelectorLang)r   r   r   r  r  r   r  r|   s           rm   parse_pseudo_langzCSSParser.parse_pseudo_lang  s     "''/ 		#E{{7#KK(E
+$U1R[$7$U+OOE"		# 	12ro   c                    t        j                  |j                  d            dk(  rt        j                  nt        j
                  }|xj                  |z  c_        d}|S )zParse pseudo direction.dirltrT)r   rv   r   r   SEL_DIR_LTRSEL_DIR_RTLrd   )r   r   r   r  r|   s        rm   parse_pseudo_dirzCSSParser.parse_pseudo_dir  sD     #'**QWWU^"<"E2>>		U	ro   c           
        t               }g }d}d}g }dt        z   }	t        |t        z        }
t        |t        z        }t        |t
        z        }t        |t        z        }t        |t        z        }t        |t        z        }t        |t        z        }t        |t        z        }t        |t        z        }t        |t        z        }t        |t        z        }| j                  r|rt        d       |
rt        d       |rt        d       |rt        d       |rt        d       |rt        d       |rt        d	       |rt        d
       |rt        d       |rt        d       |rt        d       |r|j!                  t                      	 	 t#        |      \  }}|dk(  rt%        d|j'                  d             |dk(  r'|xj(                  t*        j,                  z  c_        d}n|dk(  r| j/                  |||      }n|dk(  r| j1                  |||||      \  }}n|dk(  rt%        d|j'                  d             |dk(  r| j3                  |||      }n|dv r| j5                  ||||      }n~|dk(  r| j7                  |||      }nd|dk(  r| j9                  |||      }d}nH|dk(  r|sA|s8t;        d|j'                  d       | j<                  |j'                  d            d|_        |
rd}nt;        d|j'                  d       | j<                  |j'                  d            |dk(  r9|r| jA                  |||||	|      \  }}}	n| jC                  ||||||||      \  }}n|dk(  r| jE                  |||      }nk|d k(  rO|r9t;        d!|j'                  d       d"| j<                  |j'                  d            | jG                  |||      }n|d#v r| jI                  |||      }|jK                  d      }|	 |
r|st;        d$| | j<                  |      |r|jN                  s|st+        jP                  d%d&      |_'        |r&|	|_)        |d'   jT                  j!                  |       nW|jT                  jW                  |       |d&d&= |j!                  |       n%|r#|r|sd|_        |d&d&= |j!                  |       d}|st;        d| | j<                  |      |rt*        jX                  |d'   _        |rt*        jZ                  |d'   _        |rt*        j\                  |d'   _        |rt*        j^                  |d'   _        |rt*        j`                  |d'   _        t+        jb                  |D cg c]  }|je                          c}||      S # tL        $ r Y w xY wc c}w )(zParse selectors.FrR   z    is_pseudo: Truez    is_open: Truez    is_relative: Truez    is_not: Truez    is_html: Truez    is_default: Truez    is_indeterminate: Truez    is_in_range: Truez    is_out_of_range: Truez    is_placeholder_shown: Truez    is_forgive: TrueTr   zAt-rules found at position r   r   r   r   r   z!Pseudo-element found at position r   )r   r   r   r   r   z Expected a selector at position z)Unmatched pseudo-class close at position r  r   r   zTag name found at position z instead of at the start)r   r   z"Unclosed pseudo-class at position rS   Nr
  )3r   ru  boolrJ  r-  ro  rn  FLG_HTMLFLG_DEFAULTFLG_INDETERMINATEFLG_IN_RANGEFLG_OUT_OF_RANGEFLG_PLACEHOLDER_SHOWNrp  r  printr   nextNotImplementedErrorrM  rd   r   r6  r.  rQ  r  rl  r  r  r	   rj   r   rx  r|  r"  r(  r  r+  StopIterationr   r&  r   r   r   SEL_DEFAULTSEL_INDETERMINATESEL_IN_RANGESEL_OUT_OF_RANGESEL_PLACEHOLDER_SHOWNr   r   )r   rN  r   rd   r   r   r  closedr   r   is_openrz  is_relativeis_notrO  
is_defaultis_indeterminateis_in_rangeis_out_of_rangeis_placeholder_shownr{  r{   r   ss                           rm   rI  zCSSParser.parse_selectors  s    k		& ux'(+,	5</0ego&ux'(%+-.
(9 9:5</0u'778#E,A$AB%+-.
 ::+,)*-.())*,-23-.12#67,- Y[)D	iQ )#-0KAGGTUJ<.XYYE\II-I#'L11#'#A#A#q,#WLN*,0,C,CCLZcel,m)L',,-0QRSRYRYZ[R\Q].^__--#'#=#=c1l#SLCC#'#8#8ay#YLM)#'#9#9#q,#OLL(#'#8#8a#NL"GN*')"5"B1771:, O $ !
# 
 (,!%1GPQ
|T LLGGAJ 
 I%"6:6O6OL)Xu73c8 -1,A,AL)Y	S]_d-)c K'#'#@#@a#VLE\#19!''!*E]^ LLGGAJ 
 $(#9#9#q,#OLO+#'#6#6sA|#LLaC H D 6%4UG<  779..d3'"''..s3$$Y/aL  % )CL!S!L &25':  "$..IbM"$"6"6IbM"$//IbM"$"5"5IbM"$":":IbM I>q
>PPq  		p  ?s   I=V0 W 0	V=<V=c              #  "  K   t         j                  |      }|r|j                  d      nd}t        j                  |      }|r|j	                  d      dz
  nt        |      dz
  }| j                  rt        d|       ||k  rd}| j                  D ]  }|j                  ||| j                        }|s#|j                         }| j                  r2t        d| d|j                  d      d|j	                  d              |j                  d      }||f  n |P||   }|dk(  rd	| }n)|d
k(  rd| }n|dk(  rd| }n|dk(  rd| }nd|d| }t        || j                  |      ||k  r| j                  rt        d       yyw)zIterate selector tokens.r   r   z## PARSING: NzTOKEN: 'z' --> z at position [z)Malformed attribute selector at position r~  z%Malformed class selector at position #z"Malformed id selector at position rR   z,Malformed pseudo-class selector at position zInvalid character z
 position z## END PARSING)RE_WS_BEGINr  r+  	RE_WS_ENDrM  r   r  r  
css_tokensrx   rd   r   r   r	   rj   )	r   rj   r   r   r+  vr}   r   msgs	            rm   selector_iterzCSSParser.selector_iterT  s     w'a1W%"#qwwqzA~#g,*:::L,-slA__ GGGUDJJ7::<DzzfQWWQZN-PQPWPWXYPZ|\]EE!HE'M yEN 8EeWMC#XA%IC#X>ugFC#XHPC.qe:eWEC)#t||UCC5 sl6 ::"# s   B3F6B?F6Fc                Z    | j                  | j                  | j                        ||      S )zProcess selectors.)rI  r  rj   )r   r   rd   s      rm   ri   zCSSParser.process_selectors}  s(     ##D$6$6t||$DeUSSro   )Nr   )r   r   rc   z'dict[str, str | ct.SelectorList] | Nonerd   r   r   r   )r   r   r   r   r  r  r   r  )r   r   r   r   r  r  rN   Iterator[tuple[str, Match[str]]]rO  r  r   ztuple[bool, bool])
r   r   r   r   r  r  rN  r  r   r  )r   r   r}   r   r  r  rN  r  r   r   r   r  )r   r   r   r   r  r  r   r   r   r   r   r   r   ztuple[bool, _Selector, str])r   r   r   r   r  r  r   r   r   r   rz  r  r{  r  r   r   r   ztuple[bool, _Selector])r   r   )rN  r  r   r   rd   r   r   r   )rj   r   r   r  )r   r   rd   r   r   r   )'r   r   r   r   r   PAT_PSEUDO_CLOSEr   PAT_PSEUDO_CONTAINSPAT_PSEUDO_NTH_CHILDPAT_PSEUDO_NTH_TYPEPAT_PSEUDO_LANGPAT_PSEUDO_DIRPAT_PSEUDO_CLASS_CUSTOMPAT_PSEUDO_CLASSPAT_PSEUDO_ELEMENTPAT_AMPPAT_AT_RULEPAT_ID	PAT_CLASSPAT_TAGPAT_ATTRPAT_COMBINEr  r   r"  r(  r.  rQ  rl  r2  rx  r|  r  r  r  r  rI  r  ri   rr   ro   rm   rh   rh     s    	(89 &K'#	 $%FH\^mn"$IK^`op
O_My./J	
 	-/FG(89(*<=w'	;/f%+w'X.	;/3J> ;?	77 87 	7
 
7DL8d%d% d% 	d%
 4d% d% 
d%L?? ? 	?
 4? 
?B  	
 4  
.)+)+ )+ 	)+
 #)+ )+ )+ 
%)+V.!.! .! 	.!
 #.! #.! .! .! .! 
 .!`	2* 	uQ3uQ uQ 	uQ
 
uQn'$RTro   rh   zhtml|*:is(a, area)[href]r*  z\
    html|*:is(input[type=checkbox], input[type=radio])[checked], html|option[selected]
    z
    :checked,

    /*
    This pattern must be at the end.
    Special logic is applied to the last selector.
    */
    html|form html|*:is(button, input)[type="submit"]
    aF  
    html|input[type="checkbox"][indeterminate],
    html|input[type="radio"]:is(:not([name]), [name=""]):not([checked]),
    html|progress:not([value]),

    /*
    This pattern must be at the end.
    Special logic is applied to the last selector.
    */
    html|input[type="radio"][name]:not([name='']):not([checked])
    a  
    html|*:is(input:not([type=hidden]), button, select, textarea, fieldset, optgroup, option, fieldset)[disabled],
    html|optgroup[disabled] > html|option,
    html|fieldset[disabled] > html|*:is(input:not([type=hidden]), button, select, textarea, fieldset),
    html|fieldset[disabled] >
        html|*:not(legend:nth-of-type(1)) html|*:is(input:not([type=hidden]), button, select, textarea, fieldset)
    z|
    html|*:is(input:not([type=hidden]), button, select, textarea, fieldset, optgroup, option, fieldset):not(:disabled)
    z,html|*:is(input, textarea, select)[required]z2html|*:is(input, textarea, select):not([required])aW  
    html|input:is(
        :not([type]),
        [type=""],
        [type=text],
        [type=search],
        [type=url],
        [type=tel],
        [type=email],
        [type=password],
        [type=number]
    )[placeholder]:not([placeholder='']):is(:not([value]), [value=""]),
    html|textarea[placeholder]:not([placeholder=''])
    z*|*a  
    html|*:is(
        textarea,
        input:is(
            :not([type]),
            [type=""],
            [type=text],
            [type=search],
            [type=url],
            [type=tel],
            [type=email],
            [type=number],
            [type=password],
            [type=date],
            [type=datetime-local],
            [type=month],
            [type=time],
            [type=week]
        )
    ):not([readonly], :disabled),
    html|*:is([contenteditable=""], [contenteditable="true" i])
    z!
    html|*:not(:read-write)
    z
    html|input:is(
        [type="date"],
        [type="month"],
        [type="week"],
        [type="time"],
        [type="datetime-local"],
        [type="number"],
        [type="range"]
    ):is(
        [min],
        [max]
    )
    z*
    html|*:is(details, dialog)[open]
    z(
    html|*:is(video, audio)[muted]
    )
rj   r   rk   zct.Namespaces | Nonerc   ct.CustomSelectors | Nonerd   r   r   zcm.SoupSieve)r   r   )rc   r  r   z dict[str, str | ct.SelectorList])F)r   r   r   r  r   r   )r   r   r   r   )hr   
__future__r   r   	functoolsr   r   r   r   rf   r   r   r	   r  typingr
   r   r   r   r   r3  rK  r1  rH  PSEUDO_SPECIALrL  NEWLINEWSCOMMENTSWSCCSS_ESCAPESCSS_STRING_ESCAPES
IDENTIFIERNTHVALUEATTRr  r  r  r  r  r   r  r  r  r  r  r  r  r  r  r  r  r   r   r   r   ra  r   r  r  r  r  rw   rv  ru  r-  rn  ro  r  r  r  rJ  r  r  r  rp  	_MAXCACHErn   rs   re   rz   r   r   r   r   rh   ri   r8  r9  r:  r;  r<  r=  r>  rA  rF  rc  rC  rB  rD  rE  r@  r?  rr   ro   rm   <module>r     s    " 	     %  - -! < 8	  !#99NJMddguu  ''!0	RD(1(O</t>'"M 88C} E88C} E

 
*#iuMJG9$CG9L`ak`llnq
cU&se;ugT#FYZ]Y^^ab zl	*	J<'=j\
N%j\1HTUVZU[\ LSA (LRH -j\; 
e3< *+, J< ./ 0e>#k(1RDS
RSTVSWX[W\ ] 
-. /U+cU # 
 //{5'SEC5PQRWQXX[\_[``cd-..>se3G,RDC5B23;ugSRPSuTUV[U\\_`c_ddgh  RZZ05LMrttT
4RD8RSZR[[]^`b`d`de	>se=QTPUUefhjhlhl	mBJJ-wl3%r#cJBDDQ	

2bjjAcU!%BJJ3%r{#	BJJ!34A6=	   

    	 9$ & 	
  ,&P686 6("? "JA AHTT TTv *x/0 	  *x/0	  
 *x/+=>  
 *x/2CCD   *x/0   *x/0	  2*x/0  8*x/0  " *x/2GGH " !	*%  . *x/0/ 2  *x/0	   *|3h>? "  *'77(BC $  *x/0	 	  *x/0	 
ro   