
    Mhw                    	   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j5        dLe dMej6                  Z7 ej5        dLe dNe dej6                  Z8 ej5        dOe dPe dQej6                  Z9 ej5        dRe" dSe dGe dTej:                  Z; ej5        e          Z< ej5        dUe d?          Z= ej5        e dV          Z> ej5        dUe* dWej:                  Z?dXZ@dYZAdZBdZZCd[ZDd\ZEd]ZFd^ZGd_ZHd`ZIdaZJdbZKdcZLddZM eeMe          ddp            ZNddrZOddtZPdddyZQdd{ZR G d| d}          ZS G d~ deS          ZT G d d          ZU G d d          ZV eVd          W                    eBeFz            ZX eVd          W                    eBeFz            ZY eVd          W                    eBeFz  eEz            ZZ eVd          W                    eBeFz  eGz            Z[ eVd          W                    eBeFz            Z\ eVd          W                    eBeFz            Z] eVd          W                    eBeFz            Z^ eVd          W                    eBeFz            Z_ eVd          W                    eBeFz  eKz            Z` eVd          W                    eB          Za eVd          W                    eBeFz            Zb eVd          W                    eBeFz            Zc eVd          W                    eBeIz  eFz            Zd eVd          W                    eBeJz  eFz            Ze eVd          W                    eBeFz            Zf eVd          W                    eBeFz            ZgdS )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  )maxsizepatternstr
namespacesct.Namespaces | Nonecustomct.CustomSelectors | Noneflagsintreturncm.SoupSievec                    t          |          }t          j        | t          | ||                                          |||          S )zCached CSS compile.re   rg   )process_customcm	SoupSieve	CSSParserprocess_selectors)ra   rc   re   rg   custom_selectorss        T/var/www/html/test/jupyter/venv/lib/python3.11/site-packages/soupsieve/css_parser.py_cached_css_compilert      s[     &f--<#	
 	
 	
 



 
 
    Nonec                 8    t                                            dS )zPurge the cache.N)rt   cache_clear ru   rs   _purge_cacherz      s     ##%%%%%ru    dict[str, str | ct.SelectorList]c                   i }| |                                  D ]o\  }}t          j        |          }t                              |          t          d| d          ||v rt          d| d          ||t          |          <   p|S )zProcess custom.Nz
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)re   rr   keyvaluenames        rs   rm   rm      s      ,,.. 	9 	9JC:c??Dt$$,)*ft*f*f*fggg'''ZtZZZ[[[38\$//00ru   Fcontentstringboolc                R    dd}|st           nt                              ||           S )zs
    Unescape CSS value.

    Strings allow for spanning the value on multiple strings by escaping a new line.
    m
Match[str]ri   rb   c                Z   |                      d          rHt          |                      d          dd         d          }|dk    rt          }t          |          }nM|                      d          r|                      d          dd         }n|                      d          rd}nd}|S )	z(Replace with the appropriate substitute.r   Nr[   r   rX         � )grouprh   UNICODE_REPLACEMENT_CHARchr)r   	codepointr   s      rs   replacezcss_unescape.<locals>.replace   s     771:: 
	AGGAJJqrrNB//IA~~4		NNEEWWQZZ 	GGAJJqrrNEEWWQZZ 	EEEru   )r   r   ri   rb   )
RE_CSS_ESCRE_CSS_STR_ESCsub)r   r   r   s      rs   r   r      s7       " %8JJ.==gwOOOru   identc                   g }t          |           }|dk    o| d         dk    }|dk    r|r|                    d|             n t          |           D ]\  }}t          |          }|dk    r|                    d           1d|cxk    rdk    sn |dk    r|                    d|dd	           a|dk    s|r1|dk    r+d
|cxk    rdk    rn n|                    d|dd	           |dv sC|dk    s=d
|cxk    rdk    s0n 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|                    |           |                    d|            d                    |          S )zEscape identifier.r   -r   \r         xrW   0   9   )-   _   r^   A   Z   a   z   r   )lenappend	enumerateordjoin)r   r   length
start_dashindexcr   s          rs   escaper     s    FZZF!/aCJ{{z{l5ll####!%(( 	( 	(HE1AID  h'''')++++t++++	T0A0A19111122221***

$)B[B[B[B[W[B[B[B[B[B[1911112222\))Y$->->49C\C\C\C\X\C\C\C\C\****d****	0I0I0I0IT0I0I0I0ItW`OhOhOhOhdhOhOhOhOhOha    h1hh''''776??ru   c                  *    e Zd ZdZddZddZddZdS )SelectorPatternSelector pattern.r   rb   ra   ri   rv   c                    || _         t          j        |t          j        t          j        z  t          j        z            | _        dS )Initialize.N)r   recompileIXU
re_pattern)selfr   ra   s      rs   __init__zSelectorPattern.__init__2  s1     	*WbdRTkBD.@AAru   c                    | j         S )	Get name.)r   r   s    rs   get_namezSelectorPattern.get_name8  s     yru   selectorr   rh   rg   Match[str] | Nonec                8    | j                             ||          S )Match the selector.)r   r   )r   r   r   rg   s       rs   r   zSelectorPattern.match=  s     $$Xu555ru   N)r   rb   ra   rb   ri   rv   ri   rb   r   rb   r   rh   rg   rh   ri   r   __name__
__module____qualname____doc__r   r   r   ry   ru   rs   r   r   /  sZ        B B B B   
6 6 6 6 6 6ru   r   c                  *    e Zd ZdZddZddZddZdS )SpecialPseudoPatternr   patternsCtuple[tuple[str, tuple[str, ...], str, type[SelectorPattern]], ...]ri   rv   c                   i | _         |D ]7}|d         } |d         ||d                   }|d         D ]}|| j         |<   8d| _        t          j        t          t          j        t          j        z  t          j        z            | _        dS )r   r   r   rX   r   N)	r   matched_namer   r   PAT_PSEUDO_CLASS_SPECIALr   r   r   re_pseudo_name)r   r   pr   ra   pseudos         rs   r   zSpecialPseudoPattern.__init__F  s      	0 	0AQ4Dad41&&GA$ 0 0(/f%%0 ! j)A24"$;QSQUCUVVru   rb   c                F    | j         dn| j                                         S )r   Nr   )r   r   r   s    rs   r   zSpecialPseudoPattern.get_nameS  s%     &.rrD4E4N4N4P4PPru   r   r   rh   rg   r   c                $   d}| j                             ||          }|rpt          j        t	          |                    d                              }| j                            |          }|r |                    |||          }|r|| _        |S )r   Nr   )	r   r   r   r~   r   r   r   getr   )r   r   r   rg   r   r   r   ra   s           rs   r   zSpecialPseudoPattern.matchX  s     %%h66 	0:l1776??;;<<Dm''--G 0 x>> 0(/D%ru   N)r   r   ri   rv   r   r   r   ry   ru   rs   r   r   C  s^        W W W WQ Q Q Q
     ru   r   c                  6    e Zd ZdZddZdd
ZddZddZeZdS )	_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.
    kwargsr   ri   rv   c                   |                     dd          | _        |                     dg           | _        |                     dg           | _        |                     dg           | _        |                     dg           | _        |                     dg           | _        |                     dg           | _        |                     d	d          | _        |                     d
g           | _	        |                     dg           | _
        |                     dd          | _        |                     dd          | _        dS )r   tagNidsclasses
attributesnth	selectors	relationsrel_typecontainslangrg   r   no_matchF)r   r   r   r   r   r   r   r   r   r   r   rg   r   )r   r   s     rs   r   z_Selector.__init__q  s    ::eT**::eR((zz)R00 **\266::eR((K44K44

:t44

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

:u55ru   r   list[_Selector]ct.SelectorListc                    |rQ|d         }|j                             |dd                    t          j        |                                g          S t          j                    S )zFreeze relation.r   r   N)r   extendctSelectorListfreeze)r   r   sels      rs   _freeze_relationsz_Selector._freeze_relations  s[      	%A,CM  122///?CJJLL>222?$$$ru   ct.Selector | ct.SelectorNullc                   | j         rt          j                    S t          j        | j        t          | j                  t          | j                  t          | j                  t          | j	                  t          | 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   rg   r   s    rs   r   z_Selector.freeze  s     = 	?$$$;dhdl##do&&dhdn%%&&t~66dm$$di  
  ru   rb   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   rg   r   r   s    rs   __str__z_Selector.__str__  s    +TX + +tx + +T\ + +bfbq + +8+ ++/>+ +IM+ ++ +48M+ +LPI+ +aeak+ + + + +	
ru   N)r   r   ri   rv   )r   r   ri   r   )ri   r   r   )	r   r   r   r   r   r   r   r   __repr__ry   ru   rs   r   r   h  so         6 6 6 6 % % % %   (
 
 
 
 HHHru   r   c                     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	 	 dGdHd!ZdId(ZdId)ZdId*ZdJd/ZdKd0ZdLd3ZdMd8ZdNd=ZdId>Z dId?Z!dId@Z"dIdAZ#	 	 dOdPdCZ$dQdEZ%dOdRdFZ&dS )Srp   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combineNr   r   rb   re   'dict[str, str | ct.SelectorList] | Nonerg   rh   ri   rv   c                    |                     dd          | _        || _        | j        t          j        z  | _        |i n|| _        dS )r    r   N)r   ra   rg   r   DEBUGdebugre   )r   r   re   rg   s       rs   r   zCSSParser.__init__  sE      ''99
Z$*,
"Nbbru   r   r   r   r   has_selectorr   c                   d}|                     d          }|                     d          r't          j        |                     d                    nd}|                     d          r*t          |                     d          dd                   nd}t          |                     d                    }d}	d}
d}|r"|d	k    rt          j        nd
t          j        z  }n@t          j        |          dk    rt          j        t          j        z  }d}	nt          j        }|rv|                     d                              d          r,t          |                     d          dd         d          }n"t          |                     d                    }|sd}n|                    d          r,t	          j        dt	          j	        |          z  |          }nb|                    d          r,t	          j        dt	          j	        |          z  |          }n!|                    d          r+t	          j        dt	          j	        |          z  |          }n|                    d          rK|rt                              |          rdnt	          j	        |          }t	          j        d|z  |          }n|                    d          r+t	          j        dt	          j	        |          z  |          }nAt	          j        dt	          j	        |          z  |          }|                    d          rd}|	r|rt	          j        |j                  }
t          j        ||||
          }|rlt                      }|j                            |           t          j        |                                gdd          }|j                            |           n|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   r~   r   r   r   DOTALL
startswithr   r   RE_WSsearchra   r   SelectorAttributer   r   r   r   r   r   )r   r   r   r  inverseopr  nsattris_typepattern2r   rg   ra   sel_attrsub_selnot_lists                    rs   parse_attribute_selectorz"CSSParser.parse_attribute_selector  s    WWU^^./ggfooGtz!''&//***467ggi6H6HP\!''),,SbS1222bAGGK0011 	!S[[RTTa29<EEZ''D29$EGGIE 	7www**:66 7$QWWW%5%5ad%;TBB$QWWW%5%566 	GG]]3 	jBIe,<,<!<eDDGG]]3 	jRYu-=-=!=uEEGG]]3 	jbi.>.>!>FFGG]]3 	 ',Xu||E/B/BXJJ	RWHXHXEj![^c!cejkkGG]]3 	j29U3C3C!CUKKGG j29U+;+;!;UCCG}}S!!  	3w 	3z'/22H 'b'8DD 	,kkG%%h///(8(8'94GGHM  ****N!!(+++ru   c                   |                     d          r*t          |                     d          dd                   nd}t          |                     d                    }t          j        ||          |_        d}|S )z#Parse tag pattern from regex match.tag_nsNr  tag_nameT)r   r   r   SelectorTagr   )r   r   r   r  prefixr   s         rs   parse_tag_patternzCSSParser.parse_tag_pattern  st     :;9J9JTaggh//4555PT177:..//.f--ru   c                $   t          j        t          |                    d                              }| j                            |          }|Bt          d| d|                    d           | j        |                    d                    t          |t          j                  sG| j        |= t          || j        | j                                      t                    }|| 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   NzUndefined custom selector 'z' found at position r   rl   rg   T)r   r~   r   r   re   r   r	   endra   
isinstancer   r   rp   rg   rq   
FLG_PSEUDOr   r   )r   r   r   r  r   r   s         rs   parse_pseudo_class_customz#CSSParser.parse_pseudo_class_custom'  s    L99::;??6**%TfTT!%%PQ((TTa   (BO44 	+F# DJ  j11  #+DKX&&&ru   	iselector Iterator[tuple[str, Match[str]]]is_htmltuple[bool, bool]c                x   d}t          j        t          |                    d                              }|                    d          rd}|r7|t          v r.|                     |||||                    d                    }n|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_        nu|d	k    r|xj        t          j        z  c_        nS|d
v r!|j                            t                      n.|dk    r!|j                            t"                     n|dk    r!|j                            t$                     n|dk    r!|j                            t&                     n|dk    r!|j                            t(                     n|dk    r!|j                            t*                     nk|dk    r!|j                            t,                     nD|dk    r!|j                            t.                     n|dk    r!|j                            t0                     n|dk    r!|j                            t2                     n|dk    r!|j                            t4                     n|dk    r!|j                            t6                     n|dk    r!|j                            t8                     nZ|dk    r!|j                            t:                     n3|dk    r!|j                            t<                     n|dk    rD|j                            t          j         dddddt          j!                                         n|dk    rD|j                            t          j         dddddt          j!                                         nx|dk    rD|j                            t          j         dddddt          j!                                         n.|dk    rC|j                            t          j         dddddt          j!                                         n|dk    rm|j        "                    t          j         dddddt          j!                              t          j         dddddt          j!                              g           nr|dk    rl|j        "                    t          j         dddddt          j!                              t          j         dddddt          j!                              g           d}n|rJ|tF          v rA| $                    ||                    d          tJ          tL          z             d|_'        d}nx|s|tP          v r
d|_'        d}nc|tR          v r-tU          d | d!| j+        |,                    d                    tU          d!| d"| j+        |,                    d                    ||fS )#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   r~   r   r   PSEUDO_COMPLEXparse_pseudo_openr4  PSEUDO_SIMPLErg   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_selectorsr6  FLG_OPENr   PSEUDO_SIMPLE_NO_MATCHPSEUDO_SUPPORTEDr	   ra   start)r   r   r   r  r8  r:  complex_pseudor   s           rs   parse_pseudo_classzCSSParser.parse_pseudo_classC  s     L99::776?? 	"!N T	f6611#v|YXYX]X]^_X`X`aaLL R	Fm$;$;  		R[(			:%%		R^+		8##		R\)			8##		R\)			111$$X....:%%$$[1111:%%$$[1111+++$$%67777;&&$$\2222:%%$$[1111;&&$$\22228##$$Y////7""$$X....;&&$$\2222<''$$]3333=(($$^4444;&&$$\2222?**$$%56666///$$%:;;;;>))r~a5%IZIZ[[\\\\=((r~a5$HYHYZZ[[[[+++r~a4HYHYZZ[[[[?**r~a4rGXGXYYZZZZ=((q%E5"/BSBSTTq%E4ARARSS    ?**q%D%ARARSSq%D$@Q@QRR    LL 	*A A A  AEE!HHj86KLLLCLLL 	F.D$D$DCLLL'''%=F===

   &nF n n n

	   W$$ru   c                   |                                 }|                    d          rd}nd}t          j        t	          |d                             |d<   t          j        |                    d|z                       }|dk    rd}d}	d	}
nT|d
k    rd}d}	d	}
nFt          t          t                   t          	                    |                    }|
                    d          r|
                    d          dk    rdnd}|
                    d          }|                    d          }
|                    d          r|dz  }n|
r||dd         z  }n||z  }|
                    d          r|
                    d          dk    rdnd}|
                    d          r||
                    d          z  }nd}t          |d          }t          |d          }	|d         }|dk    r|
                    d          r8|                     ||                    d          t           t"          z            }nt$          }|dk    r2|j                            t+          j        ||
|	dd|                     n|dk    r1|j                            t+          j        ||
|	dd	|                     n|dk    rC|j                            t+          j        ||
|	d	dt+          j                                         nH|dk    rB|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   r~   r   r   r
   rb   RE_NTHr   r   endswithr  rh   rV  r4  r6  rW  CSS_NTH_OF_S_DEFAULTr   r   r   rT  r   )r   r   r   r  r8  mdictpostfixr   rb  rf  var	nth_parts_s1rc  _s2
pseudo_selnth_sels                    rs   parse_pseudo_nthzCSSParser.parse_pseudo_nth  s    99'(( 	GGG
<f#>#>??f*UYYuw7788fBBCCBBCCU3Zg)>)>??I"..W9??43H3HC3O3O##UWC$$A**S//C||C   s
 q"vq"..W9??43H3HC3O3O##UWCs## ys+++S"BS"B6]
hwwt}} /..y!%%((JQYDYZZ /\))r~b#r5%QQRRRR000r~b#r5$PPQQQ^++r~b#r4HYHYZZ[[[[222r~b#r4rGXGXYYZZZru   r   r   c                    t           t          z  }|dk    r|t          z  }n|dk    r|t          z  }n|dv r
|t          z  }|j                            |                     |||                     d}|S )z"Parse pseudo with opening bracket.rC   rB   )rD   rA   T)r6  rW  FLG_NOTFLG_RELATIVEFLG_FORGIVEr   r   rV  )r   r   r   r  r8  r   rg   s          rs   r?  zCSSParser.parse_pseudo_open  s     X%6>>WEEV^^\!EE&&&[ ET11)UEJJKKKru   r   r   r   tuple[bool, _Selector, str]c                   |                     d                                          }|st          }|t          k    rS||_        |d         j                            |           dt          z   }|                    t                                 n[|r(||_        |d         j                            |           n,|dd         t          k    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	   ra   )r   r   r   r  r   r   r   
combinators           rs   parse_has_combinatorzCSSParser.parse_has_combinator  s    WWZ((..00
 	'&J)))#CLbM#**3///]*HY[[)))) '"'..s3333!"".. *CECCL   Z'HkkS(**ru   r   	is_pseudo
is_forgivetuple[bool, _Selector]c	                x   |                     d                                          }	|	st          }	|sW|r|	t          k    rt	          d|	 d| d| j        |          |	t          k    r!d|_        |dd= |                    |           n|	t          k    rX|j        s|st          j
        dd          |_        |j                            |           |                    |           |dd= n;|j                            |           |	|_        |dd= |                    |           t                      }d}||fS )	r~  r  zThe combinator 'z' at position z , must have a selector before itTNrS   F)r   r  r  r  r	   ra   r   r   r   r   r/  r   r   r   r   )
r   r   r   r  r   r   r  r  r   r  s
             rs   parse_combinatorzCSSParser.parse_combinator,  sj    WWZ((..00
 	'&J 	& /?!?!?)hzhhhhhL   ---#aaaL  %%%---w 8y 8 nS$77CG$$Y///  %%%aaaLL$$Y///)aaaL  %%%kkS  ru   c                   |                     d          }|                    d          r0|j                            t	          |dd                              n/|j                            t	          |dd                              d}|S )zParse HTML classes and ids.r   .r   NT)r   r  r   r   r   r   )r   r   r   r  r   s        rs   parse_class_idzCSSParser.parse_class_id\  s     771::s## 	7K|HQRRL99::::GNN<55666ru   c                   t          j        t          |                    d                              }|dk    rt	          j        dt                     |dk    }t          |                    d                    }g }t                              |          D ]}|                    d          r|                    d          }	|		                    d          rt          |	d	d
         d          }	nt          |	          }	|
                    |	           |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   r~   r   r   warningswarnFutureWarning	RE_VALUESfinditerr  r   r   r   SelectorContains)
r   r   r   r  r   contains_ownr  r   tokenr   s
             rs   parse_pseudo_containszCSSParser.parse_pseudo_containsg  s9    L99::[  Mn   !66aggh//00''// 	# 	#E{{7## KK((E
++ ,$U1R4[$77$U++OOE""""B/,GGHHHru   c                   |                     d          }g }t                              |          D ]}|                     d          r|                     d          }|                    d          rt	          |dd         d          }nt	          |          }|                    |           |j                            t          j        |                     d}|S )zParse pseudo language.r  r  r   r  r   r  T)	r   r  r  r  r   r   r   r   SelectorLang)r   r   r   r  r  r   r  r   s           rs   parse_pseudo_langzCSSParser.parse_pseudo_lang  s     ""''// 		# 		#E{{7## KK((E
++ ,$U1R4[$77$U++OOE""""11222ru   c                    t          j        |                    d                    dk    rt          j        nt          j        }|xj        |z  c_        d}|S )zParse pseudo direction.dirltrT)r   r~   r   r   SEL_DIR_LTRSEL_DIR_RTLrg   )r   r   r   r  r   s        rs   parse_pseudo_dirzCSSParser.parse_pseudo_dir  sJ     #'*QWWU^^"<"<"E"E2>		U		ru   r   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!|                    t                                 	 	 t#          |          \  }}|dk    r%t%          d|                    d                     |dk    r|xj        t*          j        z  c_        d}n`|dk    r|                     |||          }nA|dk    r|                     |||||          \  }}n|dk    r%t%          d|                    d                     |dk    r|                     |||          }n|dv r|                     ||||          }n|dk    r|                     |||          }n|dk    r|                     |||          }d}nu|dk    r|sH|s?t;          d|                    d           | j        |                    d                    d|_        |
rd}n6t;          d|                    d           | j        |                    d                    |dk    rA|r|                      |||||	|          \  }}}	n| !                    ||||||||          \  }}n|dk    r| "                    |||          }n{|d k    rZ|r@t;          d!|                    d           d"| j        |                    d                    | #                    |||          }n|d#v r| $                    |||          }|%                    d          }n# tL          $ r Y nw xY w|
r|st;          d$| | j        |          |r|j'        s|st+          j(        d%d&          |_'        |r(|	|_)        |d'         j*                            |           n^|j*        +                    |           |d&d&= |                    |           n)|r'|r|s#d|_        |d&d&= |                    |           d}|st;          d| | j        |          |rt*          j,        |d'         _        |rt*          j-        |d'         _        |rt*          j.        |d'         _        |rt*          j/        |d'         _        |rt*          j0        |d'         _        t+          j1        d( |D             ||          S ))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  c                6    g | ]}|                                 S ry   )r   ).0ss     rs   
<listcomp>z-CSSParser.parse_selectors.<locals>.<listcomp>R  s     >>>q

>>>ru   )2r   r  r   rW  r6  rz  ry  FLG_HTMLFLG_DEFAULTFLG_INDETERMINATEFLG_IN_RANGEFLG_OUT_OF_RANGEFLG_PLACEHOLDER_SHOWNr{  r  printr   nextNotImplementedErrorrZ  rg   r   rC  r7  r\  r  rw  r  r  r	   ra   r   r  r  r+  r1  r  r4  StopIterationr   r/  r   r   r   SEL_DEFAULTSEL_INDETERMINATESEL_IN_RANGESEL_OUT_OF_RANGESEL_PLACEHOLDER_SHOWNr   )r   r8  r   rg   r   r   r  closedr   r   is_openr  is_relativeis_notr:  
is_defaultis_indeterminateis_in_rangeis_out_of_rangeis_placeholder_shownr  r   r   s                          rs   rV  zCSSParser.parse_selectors  s    kk		& ux'((+,,	5</00ego&&ux'((%+-..
(9 9::5</00u'7788#E,A$ABB%+-..
 : 	. -+,,, +)*** /-... *())) +)*** .,--- 42333 /-... 31222# 86777 .,---  	*Y[[)))D	A!iQ )##-.XAGGTUJJ.X.XYYYE\\II-II#'LL111#'#A#A#q,#W#WLLN**,0,C,CCLZcel,m,m)L'',,,-.^RSRYRYZ[R\R\.^.^___---#'#=#=c1l#S#SLLCCC#'#8#8ay#Y#YLLM))#'#9#9#q,#O#OLLL((#'#8#8a#N#NL"GGN**' ,) "5 O1771:: O O $ !

# # 
 (, !%1TPQ

TT LGGAJJ  
 I%%" 6:6O6OL)Xu7 73c88 -1,A,AL)Y	S]_d- -)cc K''#'#@#@a#V#VLLE\\# 1^!''!**^^^ LGGAJJ  
 $(#9#9#q,#O#OLLO++#'#6#6sA|#L#LLaCA!H <  	 	 	D	  	6 	%<U<<    	 7 49 4.d33 &'"'..s3333$$Y///aaaL  %%%%  	  	 ) 	 CL!!!S!!!L 	 &:5::    	1"$.IbM 	7"$"6IbM 	2"$/IbM 	6"$"5IbM 	;"$":IbM >>I>>>PPPs   KS 
S+*S+ra   c              #  f  K   t                               |          }|r|                    d          nd}t                              |          }|r|                    d          dz
  nt          |          dz
  }| j        rt          d|           ||k    rd}| j        D ]}|	                    ||| j
                  }|rv|                                }| j        r>t          d| d|                    d          d|                    d                      |                    d          }||fV   n|V||         }|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    | j        rt          d           dS dS )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   r4  	RE_WS_ENDrZ  r   r  r  
css_tokensr   rg   r   r   r	   ra   )	r   ra   r   r   r4  vr   r   msgs	            rs   selector_iterzCSSParser.selector_iterT  s      w''$a1W%%"#;qwwqzzA~~#g,,*:: 	.,,,---sllA_  GGGUDJ77 ::<<Dz ^\\\QWWQZZ\\PQPWPWXYPZPZ\\]]]EE!HHE'MMME yEN 88MeMMCC#XXI%IICC#XXFuFFCC#XXPPPCCEqEEeEEC)#t|UCCC5 sll6 : 	$"#####	$ 	$ru   c                `    |                      |                     | j                  ||          S )zProcess selectors.)rV  r  ra   )r   r   rg   s      rs   rq   zCSSParser.process_selectors}  s,     ##D$6$6t|$D$DeUSSSru   )Nr   )r   rb   re   r
  rg   rh   ri   rv   )r   r   r   r   r  r   ri   r   )r   r   r   r   r  r   r8  r9  r:  r   ri   r;  )
r   r   r   r   r  r   r8  r9  ri   r   )r   r   r   rb   r  r   r8  r9  r   rh   ri   r   )r   r   r   r   r  r   r   r   r   rb   r   rh   ri   r|  )r   r   r   r   r  r   r   r   r   r   r  r   r  r   r   rh   ri   r  )r   r   )r8  r9  r   rh   rg   rh   ri   r   )ra   rb   ri   r9  )r   rh   rg   rh   ri   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+  r1  r7  r\  rw  r?  r  r  r  r  r  r  rV  r  rq   ry   ru   rs   rp   rp     s        	(899 &K'#	 $%FH\^mn"$IK^`op
O_My./J	
 	
 	-/FGG(899(*<==w''	;//f%%++w''X..	;//3J> ;?	7 7 7 7 7D D D DL      8d% d% d% d%L? ? ? ?B   .)+ )+ )+ )+V.! .! .! .!`	 	 	 	   2   *    	uQ uQ uQ uQ uQn'$ '$ '$ '$RT T T T T T Tru   rp   zhtml|*:is(a, area)[href]r3  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]
    )
ra   rb   rc   rd   re   rf   rg   rh   ri   rj   )ri   rv   )re   rf   ri   r{   )F)r   rb   r   r   ri   rb   )r   rb   ri   rb   )hr   
__future__r   r   	functoolsr   r   r   r   rn   r   r   r	   r  typingr
   r   r   r   r   r@  rX  r>  rU  PSEUDO_SPECIALrY  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   rl  r   r  r  r  r  r   r  r  r6  ry  rz  r  r  r  rW  r  r  r  r{  	_MAXCACHErt   rz   rm   r   r   r   r   r   rp   rq   rE  rF  rG  rH  rI  rJ  rK  rN  rS  rn  rP  rO  rQ  rR  rM  rL  ry   ru   rs   <module>r     s
     " " " " " " 				                         % % % % % %  - - - - - - - - - - - -!   <   8	 	 	      !#99NJMddguu  ''0R(<<<<MMM'MMM 8C 8C  

 K#JJJJJqGqqGqqakqqqbcbbsbbubb#bbZ]bbb 
z		*	
NJ
N
Nj
N
N
N\\\j\\\\VZ\\AAAAAA HHHHHH ;j;;; 
<<< ,*,,  J  .  "% 2: =?AD IQ TVX[   
-  !   
 /dd5ddSddCddRWdd\_ddd-GGsGGGBBRBBCBBB2hhuhhhhPShhV[hh`chhh  RZMMMMrtTT
^R^^SZ^^^`b`dee	fsffQTfffhjhl	m	mBJJJJ3JJ#JJJBDQQ	
2bjc%%BJ3{{{##	BJ63666==	   

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