o
    Ð­jv¸  ã                   @  sj  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B eB eB eB 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› d/e › d0e › de#› d1�	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› d@�Z/dAe)› dBe!› dCe› dD�Z0e)› dEe"› de› dFe› d(e"› dGe› d8�Z1e)› dHe› d8�Z2e› dIe› dJe› d(�Z3e)› dEe"› de› dFe› d(e"› dGe› d8�Z4e 5dKe› dL�ej6¡Z7e 5dKe› dMe› d�ej6¡Z8e 5dNe› dOe› dP�ej6¡Z9e 5dQe"› dRe› dFe› dS�ej:¡Z;e 5e¡Z<e 5dTe› d(�¡Z=e 5e› dU�¡Z>e 5dTe*› dV�ej:¡Z?dWZ@dXZAdZBdYZCdZZDd[ZEd\ZFd]ZGd^ZHd_ZId`ZJdaZKdbZLdcZMeeMdd�d˜dodp„ƒZNd™drds„ZOdšdudv„ZPd›dœd{d|„ZQd�d~d„ZRG d€d�„ d�ƒZSG d‚dƒ„ dƒeSƒZTG d„d…„ d…ƒZUG d†d‡„ d‡ƒZVeVdˆƒjWeBeFB d‰�ZXeVdŠƒjWeBeFB d‰�ZYeVd‹ƒjWeBeFB eEB d‰�ZZeVdŒƒjWeBeFB eGB d‰�Z[eVd�ƒjWeBeFB d‰�Z\eVdŽƒjWeBeFB d‰�Z]eVd�ƒjWeBeFB d‰�Z^eVd�ƒjWeBeFB d‰�Z_eVd‘ƒjWeBeFB eKB d‰�Z`eVd’ƒjWeBd‰�ZaeVd“ƒjWeBeFB d‰�ZbeVd”ƒjWeBeFB d‰�ZceVd•ƒjWeBeIB eFB d‰�ZdeVd•ƒjWeBeJB eFB d‰�ZeeVd–ƒjWeBeFB d‰�ZfeVd—ƒjWeBeFB d‰�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*(?P<cmp>[!~^|*$]?=)z*(?P<value>z)(?:z*(?P<case>[is]))?)?Ú*z\#z\.z(?P<tag_ns>(?:z|\*)?\|)?(?P<tag_name>z|\*)z\[z*(?P<attr_ns>(?:z|\*)?\|)?(?P<attr_name>z\]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                 C  s(   t |ƒ}t | t| ||d� ¡ |||¡S )zCached CSS compile.©rd   rf   )Úprocess_customÚcmÚ	SoupSieveÚ	CSSParserÚprocess_selectors)r`   rb   rd   rf   Úcustom_selectors© rq   úQ/var/www/html/CropPilot/venv/lib/python3.10/site-packages/soupsieve/css_parser.pyÚ_cached_css_compileÌ   s   	ý÷rs   ÚNonec                   C  s   t  ¡  dS )zPurge the cache.N)rs   Úcache_clearrq   rq   rq   rr   Ú_purge_cacheã   s   rv   ú dict[str, str | ct.SelectorList]c                 C  sn   i }| dur5|   ¡ D ]*\}}t |¡}t |¡du r"td|› d�ƒ‚||v r.td|› d�ƒ‚||t|ƒ< q
|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)rd   rp   ÚkeyÚvalueÚnamerq   rq   rr   rk   é   s   
rk   FÚcontentÚstringÚboolc                 C  s   d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]rh   ra   c                 S  st   |   d¡rt|   d¡dd… dƒ}|dkrt}t|ƒ}|S |   d¡r-|   d¡dd… }|S |   d¡r6d}|S d}|S )	z(Replace with the appropriate substitute.r   NrZ   r   rW   é   õ   ï¿½Ú )Úgrouprg   ÚUNICODE_REPLACEMENT_CHARÚchr)r„   Ú	codepointr   rq   rq   rr   Úreplaceÿ   s   

ù
ûþzcss_unescape.<locals>.replaceN)r„   r…   rh   ra   )Ú
RE_CSS_ESCÚRE_CSS_STR_ESCÚsub)r�   r‚   r�   rq   rq   rr   r}   ø   s   
r}   Úidentc                 C  sr  g }t | ƒ}|dko| d dk}|dkr|r| d| › �¡ n•t| ƒD ]�\}}t|ƒ}|dkr5| d¡ q#d|  kr?dksDn |dkrO| d|d›d	�¡ q#|dksY|rp|dkrpd
|  krcdkrpn n| d|d›d	�¡ q#|dv s¥|dks¥d
|  kr‚dks¥n d
|  kr�dks¥n d|  kr˜dks¥n d|  kr£dkr«n n| |¡ q#| d|› �¡ q#d |¡S )zEscape identifier.r   ú-r   ú\r‡   é   é   ÚxrV   é0   é9   )é-   é_   r]   éA   éZ   éa   éz   rˆ   )ÚlenÚappendÚ	enumerateÚordÚjoin)r‘   r‚   ÚlengthÚ
start_dashÚindexÚcrŒ   rq   rq   rr   Úescape  s$   ,&D
r¨   c                   @  s.   e Zd ZdZddd„Zdd	d
„Zddd„ZdS )ÚSelectorPatternúSelector pattern.r€   ra   r`   rh   rt   c                 C  s&   || _ t |tjtjB tjB ¡| _dS )úInitialize.N)r€   ÚreÚcompileÚIÚXÚUÚ
re_pattern)Úselfr€   r`   rq   rq   rr   Ú__init__2  s    zSelectorPattern.__init__c                 C  s   | j S )ú	Get name.)r€   ©r²   rq   rq   rr   Úget_name8  s   zSelectorPattern.get_nameÚselectorr¦   rg   rf   úMatch[str] | Nonec                 C  s   | j  ||¡S )úMatch the selector.)r±   r{   )r²   r·   r¦   rf   rq   rq   rr   r{   =  s   zSelectorPattern.matchN)r€   ra   r`   ra   rh   rt   ©rh   ra   ©r·   ra   r¦   rg   rf   rg   rh   r¸   ©Ú__name__Ú
__module__Ú__qualname__Ú__doc__r³   r¶   r{   rq   rq   rq   rr   r©   /  s
    

r©   c                   @  s.   e Zd ZdZddd„Zdd	d
„Zddd„ZdS )ÚSpecialPseudoPatternrª   ÚpatternsúCtuple[tuple[str, tuple[str, ...], str, type[SelectorPattern]], ...]rh   rt   c                 C  sh   i | _ |D ]}|d }|d ||d ƒ}|d D ]}|| j |< qqd| _t ttjtjB tjB ¡| _dS )r«   r   r†   rW   r   N)	rÂ   Úmatched_namer¬   r­   ÚPAT_PSEUDO_CLASS_SPECIALr®   r¯   r°   Úre_pseudo_name)r²   rÂ   Úpr€   r`   Úpseudorq   rq   rr   r³   F  s   ÿ zSpecialPseudoPattern.__init__ra   c                 C  s   | j du rdS | j  ¡ S )r´   Nrˆ   )rÄ   r¶   rµ   rq   rq   rr   r¶   S  s   zSpecialPseudoPattern.get_namer·   r¦   rg   rf   r¸   c                 C  sV   d}| j  ||¡}|r)t t| d¡ƒ¡}| j |¡}|r)| |||¡}|r)|| _|S )r¹   Nr€   )	rÆ   r{   r   ry   r}   r‰   rÂ   ÚgetrÄ   )r²   r·   r¦   rf   rÈ   r„   r€   r`   rq   rq   rr   r{   X  s   zSpecialPseudoPattern.matchN)rÂ   rÃ   rh   rt   rº   r»   r¼   rq   rq   rq   rr   rÁ   C  s
    

rÁ   c                   @  s<   e Zd ZdZddd„Zddd„Zddd„Zd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
   rh   rt   c                 K  s¬   |  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Úlangrf   r   Úno_matchF)rÉ   rÌ   rÍ   rÎ   rÏ   rÐ   rÑ   rÒ   rÓ   rÔ   rÕ   rf   rÖ   )r²   rË   rq   rq   rr   r³   q  s   z_Selector.__init__rÒ   úlist[_Selector]úct.SelectorListc                 C  s8   |r|d }|j  |dd… ¡ t | ¡ g¡S t ¡ S )zFreeze relation.r   r   N)rÒ   ÚextendÚctÚSelectorListÚfreeze)r²   rÒ   Úselrq   rq   rr   Ú_freeze_relations�  s
   z_Selector._freeze_relationsúct.Selector | ct.SelectorNullc                 C  sd   | j rt ¡ S t | 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Õ   rf   rµ   rq   rq   rr   rÜ   ‹  s   
õz_Selector.freezera   c                 C  sf   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=rN   )rÌ   rÍ   rÎ   rÏ   rÐ   rÑ   rÒ   rÓ   rÔ   rÕ   rf   rÖ   rµ   rq   rq   rr   Ú__str__Ÿ  s$   "ÿÿÿþþþþýÿz_Selector.__str__N)rË   r
   rh   rt   )rÒ   r×   rh   rØ   )rh   rß   rº   )	r½   r¾   r¿   rÀ   r³   rÞ   rÜ   rã   Ú__repr__rq   rq   rq   rr   rÊ   h  s    





rÊ   c                   @  sR  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		dWdXd!d"„ZdYd)d*„ZdYd+d,„ZdYd-d.„ZdZd3d4„Zd[d5d6„Zd\d9d:„Zd]d?d@„Zd^dEdF„ZdYdGdH„Z dYdIdJ„Z!dYdKdL„Z"dYdMdN„Z#		d_d`dPdQ„Z$dadSdT„Z%d_dbdUdV„Z&dS )crn   zParse CSS selectors.Úpseudo_closeÚpseudo_contains)rD   rE   rF   Úpseudo_nth_child)rJ   rL   Úpseudo_nth_type)rK   rM   Úpseudo_lang)rI   Ú
pseudo_dir)rH   Úpseudo_class_customÚpseudo_classÚpseudo_elementÚampÚat_ruleÚidÚclassrÌ   Ú	attributeÚcombineNr   r·   ra   rd   ú'dict[str, str | ct.SelectorList] | Nonerf   rg   rh   rt   c                 C  s>   |  dd¡| _|| _| jtj@ | _|du ri | _dS || _dS )r«   ú r‡   N)r�   r`   rf   r   ÚDEBUGÚdebugrd   )r²   r·   rd   rf   rq   rq   rr   r³   Ë  s   zCSSParser.__init__rÝ   rÊ   r„   r…   Úhas_selectorrƒ   c                 C  sP  d}|  d¡}|  d¡rt |  d¡¡nd}|  d¡r&t|  d¡dd… ƒnd}t|  d¡ƒ}d}	d}
d}|rD|d	kr>tjnd
tjB }nt |¡dkrTtjtjB }d}	ntj}|ru|  d¡ d¡rnt|  d¡dd… dƒ}nt|  d¡ƒ}|szd}nr| d¡r‹t dt 	|¡ |¡}na| d¡rœt dt 	|¡ |¡}nP| d¡r­t dt 	|¡ |¡}n?| d¡rÉ|r¹t
 |¡r»dnt 	|¡}t d| |¡}n#| d¡rÚt dt 	|¡ |¡}nt dt 	|¡ |¡}| d¡rìd}|	rö|röt |j¡}
t ||||
¡}|�rtƒ }|j |¡ t | ¡ gdd¡}|j |¡ d}|S |j |¡ d}|S )z8Create attribute selector from the returned regex match.FÚcmpÚcaseNÚattr_nséÿÿÿÿrˆ   Ú	attr_nameÚir   ÚtypeTr   ©ú"ú'r   rS   z^%s.*rT   z.*?%s$rP   z.*?%s.*ú~z[^\s\S]z7.*?(?:(?<=^)|(?<=[ \t\r\n\f]))%s(?=(?:[ \t\r\n\f]|$)).*rO   z^%s(?:-.*)?$z^%s$ú!)r‰   r   ry   r}   r¬   r®   ÚDOTALLÚ
startswithr­   r¨   ÚRE_WSÚsearchr`   rÚ   ÚSelectorAttributerÊ   rÏ   r    rÛ   rÜ   rÑ   )r²   rÝ   r„   rø   ÚinverseÚoprú   ÚnsÚattrÚis_typeÚpattern2r   rf   r`   Úsel_attrÚsub_selÚnot_listrq   rq   rr   Úparse_attribute_selectorØ  s^   
$





ýz"CSSParser.parse_attribute_selectorc                 C  sH   |  d¡rt|  d¡dd… ƒnd}t|  d¡ƒ}t ||¡|_d}|S )z#Parse tag pattern from regex match.Útag_nsNrü   Útag_nameT)r‰   r}   rÚ   ÚSelectorTagrÌ   )r²   rÝ   r„   rø   ÚprefixrÌ   rq   rq   rr   Úparse_tag_pattern  s
   $zCSSParser.parse_tag_patternc                 C  sš   t  t| d¡ƒ¡}| j |¡}|du r'td|› d| d¡› �| j| d¡ƒ‚t	|t
jƒsC| j|= t|| j| jd�jtd�}|| 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   rj   ©rf   T)r   ry   r}   r‰   rd   rÉ   r   Úendr`   Ú
isinstancerÚ   rÛ   rn   rf   ro   Ú
FLG_PSEUDOrÑ   r    )r²   rÝ   r„   rø   rÈ   r·   rq   rq   rr   Úparse_pseudo_class_custom'  s&   ý
ÿþ
z#CSSParser.parse_pseudo_class_customÚ	iselectorú Iterator[tuple[str, Match[str]]]Úis_htmlútuple[bool, bool]c                 C  s  d}t  t| d¡ƒ¡}| d¡rd}|r)|tv r)|  ||||| d¡¡}||fS |�sº|tv �rº|dkr?| jt	j
O  _�nu|dkrO| jt	jO  _d}�ne|dkr]| jt	jO  _�nW|d	krk| jt	jO  _�nI|d
v rw|j t¡ �n=|dkrƒ|j t¡ �n1|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¡ 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¡ n¿|dk�r|j t¡ n³|dk�r|j t¡ n§|dk�r|j t¡ n›|dk�r/|j t	  dddddt	 !¡ ¡¡ n…|dk�rE|j t	  dddddt	 !¡ ¡¡ no|dk�r[|j t	  dddddt	 !¡ ¡¡ nY|dk�rq|j t	  dddddt	 !¡ ¡¡ nC|dk�r“|j "t	  dddddt	 !¡ ¡t	  dddddt	 !¡ ¡g¡ n!|dk�r´|j "t	  dddddt	 !¡ ¡t	  dddddt	 !¡ ¡g¡ d}||fS |�r×|t#v �r×|  $|| d¡t%t&B ¡ d|_'d}||fS |�sè|t(v �rèd|_'d}||fS |t)v �rût*d |› d!�| j+| ,d¡ƒ‚t*d!|› d"�| j+| ,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   ry   r}   r‰   ÚPSEUDO_COMPLEXÚparse_pseudo_openr  ÚPSEUDO_SIMPLErf   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   r`   Ústart)r²   rÝ   r„   rø   r  r   Úcomplex_pseudorÈ   rq   rq   rr   Úparse_pseudo_classC  s²   

U¬



"
"
"
"
þÿ
þÿëï
ò
ý
üzCSSParser.parse_pseudo_classc                 C  s0  |  ¡ }| d¡rd}nd}t t|d ƒ¡|d< t | d| ¡¡}|dkr.d}d}	d	}
nq|d
kr9d}d}	d	}
nfttt t 	|¡ƒ}| 
d¡rQ| 
d¡dkrQdnd}| 
d¡}| d¡}
| d¡rg|d7 }n|
rr||dd… 7 }n||7 }| 
d¡r„| 
d¡dkr„dnd}| 
d¡r“|| 
d¡7 }nd}t|dƒ}t|dƒ}	|d }|dkrç| 
d¡r¹|  || d¡ttB ¡}nt}|dkrÑ|j t ||
|	dd|¡¡ d	}|S |dkrã|j t ||
|	dd	|¡¡ d	}|S |dkrÿ|j t ||
|	d	dt ¡ ¡¡ d	}|S |dk�r|j t ||
|	d	d	t ¡ ¡¡ d	}|S )zParse `nth` pseudo.rç   Ú_childÚ_typer€   rÐ   ÚevenrW   r   TÚoddr   Ús1r’   rˆ   ÚaÚnÚ1Nrü   Ús2ÚbÚ0é
   ÚofrJ   FrL   rK   rM   )Ú	groupdictrÉ   r   ry   r}   r   r	   ra   ÚRE_NTHr{   r‰   Úendswithr  rg   r;  r  r  r<  ÚCSS_NTH_OF_S_DEFAULTrÐ   r    rÚ   r9  rÛ   )r²   rÝ   r„   rø   r  ÚmdictÚpostfixr�   rF  rJ  ÚvarÚ	nth_partsÚ_s1rG  Ú_s2Ú
pseudo_selÚnth_selrq   rq   rr   Úparse_pseudo_nth©  sd   	
 



 



øû 
ý zCSSParser.parse_pseudo_nthr€   r¦   c                 C  sZ   t tB }|dkr|tO }n|dkr|tO }n|dv r|tO }|j |  |||¡¡ d}|S )z"Parse pseudo with opening bracket.rB   rA   )rC   r@   T)r  r<  ÚFLG_NOTÚFLG_RELATIVEÚFLG_FORGIVErÑ   r    r;  )r²   rÝ   r€   rø   r  r¦   rf   rq   rq   rr   r$  ê  s   


zCSSParser.parse_pseudo_openrÑ   r×   rÓ   útuple[bool, _Selector, str]c                 C  s¦   |  d¡ ¡ }|st}|tkr%||_|d j |¡ dt }| tƒ ¡ n$|r3||_|d j |¡ n|dd… tkrEtd|› �| j	|ƒ‚d| }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   r`   )r²   rÝ   r„   rø   rÑ   rÓ   r¦   Ú
combinatorrq   rq   rr   Úparse_has_combinator  s*   ý
zCSSParser.parse_has_combinatorrÒ   Ú	is_pseudoÚ
is_forgiveútuple[bool, _Selector]c	           
      C  sà   |  d¡ ¡ }	|	st}	|s3|r|	tkr!td|	› d|› d�| j|ƒ‚|	tkr2d|_|dd…= | |¡ n4|	tkrT|jsC|sCt	 
dd¡|_|j |¡ | |¡ |dd…= n|j |¡ |	|_|dd…= | |¡ tƒ }d}||fS )	r`  ra  zThe combinator 'z' at position z , must have a selector before itTNrP   F)r‰   rb  rc  rd  r   r`   rÖ   r    rÌ   rÚ   r  rÒ   rÙ   rÓ   rÊ   )
r²   rÝ   r„   rø   rÑ   rÒ   rg  rh  r¦   re  rq   rq   rr   Úparse_combinator,  s8   ý

€



zCSSParser.parse_combinatorc                 C  sT   |  d¡}| d¡r|j t|dd… ƒ¡ d}|S |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·   rq   rq   rr   Úparse_class_id\  s   

þzCSSParser.parse_class_idc           
      C  s´   t  t| d¡ƒ¡}|dkrt dt¡ |dk}t| d¡ƒ}g }t |¡D ]%}| d¡r.q&| d¡}	|	 	d¡rBt|	d	d
… dƒ}	nt|	ƒ}	| 
|	¡ q&|j 
t ||¡¡ d}|S )zParse contains.r€   rD   z\The pseudo class ':contains' is deprecated, ':-soup-contains' should be used moving forward.rF   ÚvaluesÚsplitr   )r  r  r   rü   T)r   ry   r}   r‰   ÚwarningsÚwarnÚFutureWarningÚ	RE_VALUESÚfinditerr  r    rÔ   rÚ   ÚSelectorContains)
r²   rÝ   r„   rø   rÈ   Úcontains_ownrm  rÂ   Útokenr   rq   rq   rr   Úparse_pseudo_containsg  s(   þ


zCSSParser.parse_pseudo_containsc                 C  s~   |  d¡}g }t |¡D ]%}|  d¡rq|  d¡}| d¡r(t|dd… dƒ}nt|ƒ}| |¡ q|j t |¡¡ d}|S )zParse pseudo language.rm  rn  r   r   r   rü   T)	r‰   rr  rs  r  r}   r    rÕ   rÚ   ÚSelectorLang)r²   rÝ   r„   rø   rm  rÂ   rv  r   rq   rq   rr   Úparse_pseudo_lang€  s   



zCSSParser.parse_pseudo_langc                 C  s6   t  | d¡¡dkrtjntj}| j|O  _d}|S )zParse pseudo direction.ÚdirÚltrT)r   ry   r‰   rÚ   ÚSEL_DIR_LTRÚSEL_DIR_RTLrf   )r²   rÝ   r„   rø   r   rq   rq   rr   Úparse_pseudo_dir•  s    zCSSParser.parse_pseudo_dirrØ   c              
   C  sÐ  t ƒ }g }d}d}g }dt }	t|t@ ƒ}
t|t@ ƒ}t|t@ ƒ}t|t@ ƒ}t|t@ ƒ}t|t@ ƒ}t|t	@ ƒ}t|t
@ ƒ}t|t@ ƒ}t|t@ ƒ}t|t@ ƒ}| jr–|rZtdƒ |
r`tdƒ |rftdƒ |rltdƒ |rrtdƒ |rxtdƒ |r~td	ƒ |r„td
ƒ |rŠtdƒ |r�tdƒ |r–tdƒ |rž| t ƒ ¡ �z	 t|ƒ\}}|dkrµtd| d¡› �ƒ‚|dkrÄ| jtjO  _d}nó|dkrÐ|  |||¡}nç|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}n“|dk�rX|�sB|�s?td| d¡› �| j| d¡ƒ‚d|_|
�rHd}nutd| d¡› �| j| d¡ƒ‚|dk�r}|�rn|   |||||	|¡\}}}	nI|  !||||||||¡\}}n:|dk�rŠ|  "|||¡}n-|d k�r«|�r£td!| d¡› d"�| j| d¡ƒ‚|  #|||¡}n|d#v �r·|  $|||¡}| %d¡}q¡W n
 t&�yÈ   Y nw |
�rÙ|�sÙtd$|› �| j|ƒ‚|�r
|j'�sê|�sêt (d%d&¡|_'|�rù|	|_)|d' j* |¡ n)|j* +|¡ |d&d&…= | |¡ n|�r"|�r|�s"d|_|d&d&…= | |¡ d}|�s/td|› �| j|ƒ‚|�r8tj,|d' _|�rAtj-|d' _|�rJtj.|d' _|�rStj/|d' _|�r\tj0|d' _t 1d(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 rP   Nrü   c                 S  s   g | ]}|  ¡ ‘qS rq   )rÜ   )Ú.0Úsrq   rq   rr   Ú
<listcomp>R  s    z-CSSParser.parse_selectors.<locals>.<listcomp>)2rÊ   rc  rƒ   r<  r  r]  r\  ÚFLG_HTMLÚFLG_DEFAULTÚFLG_INDETERMINATEÚFLG_IN_RANGEÚFLG_OUT_OF_RANGEÚFLG_PLACEHOLDER_SHOWNr^  r÷   Úprintr    ÚnextÚNotImplementedErrorr?  rf   rÚ   r(  r  rA  rw  r[  ry  r~  r   r`   rÖ   rf  rj  r  r  rl  r  ÚStopIterationrÌ   r  rÓ   rÒ   rÙ   ÚSEL_DEFAULTÚSEL_INDETERMINATEÚSEL_IN_RANGEÚSEL_OUT_OF_RANGEÚSEL_PLACEHOLDER_SHOWNrÛ   )r²   r  r¦   rf   rÝ   rÑ   rø   ÚclosedrÒ   rÓ   Úis_openrg  Úis_relativeÚis_notr   Ú
is_defaultÚis_indeterminateÚis_in_rangeÚis_out_of_rangeÚis_placeholder_shownrh  r~   r„   rq   rq   rr   r;  �  s"  	



ýý
ÿ
ÿ

ý

¿$ÿý


ý	zCSSParser.parse_selectorsr`   c           	   
   c  sn  � t  |¡}|r| d¡nd}t |¡}|r| d¡d nt|ƒd }| jr-td|›�ƒ ||kr¬d}| jD ]2}| 	||| j
¡}|rh| ¡ }| jr\td|› d| d¡›d| d¡› �ƒ | d¡}||fV   nq6|du r¨|| }|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s1| 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 rk  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_ENDr?  rŸ   r÷   rˆ  Ú
css_tokensr{   rf   r¶   r‰   r   r`   )	r²   r`   r„   r¦   r  Úvr€   r§   Úmsgrq   rq   rr   Úselector_iterT  sF   €


&

úæÿzCSSParser.selector_iterc                 C  s   |   |  | j¡||¡S )zProcess selectors.)r;  r¡  r`   )r²   r¦   rf   rq   rq   rr   ro   }  s   zCSSParser.process_selectors)Nr   )r·   ra   rd   rô   rf   rg   rh   rt   )rÝ   rÊ   r„   r…   rø   rƒ   rh   rƒ   )rÝ   rÊ   r„   r…   rø   rƒ   r  r  r   rƒ   rh   r!  )
rÝ   rÊ   r„   r…   rø   rƒ   r  r  rh   rƒ   )rÝ   rÊ   r€   ra   rø   rƒ   r  r  r¦   rg   rh   rƒ   )rÝ   rÊ   r„   r…   rø   rƒ   rÑ   r×   rÓ   ra   r¦   rg   rh   r_  )rÝ   rÊ   r„   r…   rø   rƒ   rÑ   r×   rÒ   r×   rg  rƒ   rh  rƒ   r¦   rg   rh   ri  )r   r   )r  r  r¦   rg   rf   rg   rh   rØ   )r`   ra   rh   r  )r¦   rg   rf   rg   rh   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  rA  r[  r$  rf  rj  rl  rw  ry  r~  r;  r¡  ro   rq   rq   rq   rr   rn   ¬  s^    ü



öÿçü

F
	

f
A

+
0


ü 
8)rn   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]
    )
r`   ra   rb   rc   rd   re   rf   rg   rh   ri   )rh   rt   )rd   re   rh   rw   )F)r�   ra   r‚   rƒ   rh   ra   )r‘   ra   rh   ra   )hrÀ   Ú
__future__r   r¬   Ú	functoolsr   rˆ   r   r   rl   r   rÚ   r   ro  Útypingr	   r
   r   r   rŠ   r%  r=  r#  r:  ÚPSEUDO_SPECIALr>  Ú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�   rP  r¯   rr  r  rœ  r�  rz   rd  rc  r  r\  r]  rƒ  r‚  r„  r<  r…  r†  r‡  r^  Ú	_MAXCACHErs   rv   rk   r}   r¨   r©   rÁ   rÊ   rn   ro   r*  r+  r,  r-  r.  r/  r0  r3  r8  rR  r5  r4  r6  r7  r2  r1  rq   rq   rq   rr   Ú<module>   sz   	ÿþ$




ÿþþþþþþþþÿþþ(("



%D     `ÿþÿüÿ
öÿôÿø
ÿüÿþÿþÿñÿþÿéÿüÿñÿñÿüÿ
ü