B ª`«ã@s¨dZddlZddlmZddlmZddlmZddlmZ ddlm Z ddl Z d Z d d d d ddddddddddddddddddd d!hZ d"d#d$d%d&d'd(d)d*d+d,d-d.d/d0d1hZd2d3d4d5d6d7d8d9hZd#d(d:hZd;dd?d@hZe eBeBeBeBZdAZdB e¡ZdCZdDjeedEZdFjedGZdHjeedIZdJjedKZdLjedGZdMjeedNZdOjeedPZdQjedRZdSjedRZdTjedRZ dUjeeedVZ!dWjeedXZ"dYjeedXZ#dZjedRZ$d[jedGZ%d\ e"¡Z&d]jedRZ'd^je#eeeed_Z(d`je#eedaZ)dbje#eedcZ*ddje#edeZ+dfjeedgZ,dbje#eedcZ-e .dhjedGej/¡Z0e .dijeedIej/¡Z1e .djjedGej/¡Z2e .dkjeedPej3¡Z4e .e¡Z5e .dl e¡¡Z6e .dm e¡¡Z7e .dn e$¡ej3¡Z8doZ9dpZ:dZ;dqZdtZ?duZ@dvZAdwZBdxZCdyZDdzZEeeEd{d|d}„ƒZFd~d„ZGd€d„ZHddƒd„„ZId…d†„ZJGd‡dˆ„dˆeKƒZLGd‰dŠ„dŠeLƒZMGd‹dŒ„dŒeKƒZNGddŽ„dŽeKƒZOeOdƒjPe;e?BdZQeOd‘ƒjPe;e?BdZReOd’ƒjPe;e?Be>BdZSeOd“ƒjPe;e?Be@BdZTeOd”ƒjPe;e?BdZUeOd•ƒjPe;e?BdZVeOd–ƒjPe;e?BdZWeOd—ƒjPe;e?BdZXeOd˜ƒjPe;e?BeDBdZYeOd™ƒjPe;dZZeOdšƒjPe;e?BdZ[eOd›ƒjPe;e?BdZ\eOdœƒjPe;eBBe?BdZ]eOdœƒjPe;eCBe?BdZ^dS)žzCSS selector parser.éN)Ú lru_cacheé)Úutil)Ú css_match)Ú css_types)ÚSelectorSyntaxErroriýÿz :any-linkz:emptyz :first-childz:first-of-typez :in-rangez :out-of-rangez :last-childz :last-of-typez:linkz :only-childz :only-of-typez:rootz:checkedz:defaultz :disabledz:enabledz:indeterminatez :optionalz:placeholder-shownz :read-onlyz :read-writez :requiredz:scopez:definedz:activez:currentz:focusz:focus-visiblez :focus-withinz:futurez:hostz:hoverz :local-linkz:pastz:pausedz:playingz:targetz:target-withinz :user-invalidz:visitedz :containsz:-soup-containsz:-soup-contains-ownz:hasz:isz:matchesz:notz:wherez :host-contextz:dirz:langz :nth-childz:nth-last-childz:nth-last-of-typez :nth-of-typez(?:\r\n|(?!\r\n)[\n\f\r])z (?:[ \t]|{})z"(?:/\*[^*]*\*+(?:[^/*][^*]*\*+)*/)z(?:{ws}|{comments}))ÚwsÚcommentsz*(?:\\(?:[a-f0-9]{{1,6}}{ws}?|[^\r\n\f]|$)))rz/(?:\\(?:[a-f0-9]{{1,6}}{ws}?|[^\r\n\f]|$|{nl})))rÚnlz„ (?:(?:-?(?:[^\x00-\x2f\x30-\x40\x5B-\x5E\x60\x7B-\x9f]|{esc})+|--) (?:[^\x00-\x2c\x2e\x2f\x3A-\x40\x5B-\x5E\x60\x7B-\x9f]|{esc})*) )Úescz>(?:[-+])?(?:[0-9]+n?|n)(?:(?<=n){ws}*(?:[-+]){ws}*(?:[0-9]+))?zT (?:"(?:\\(?:.|{nl})|[^\\"\r\n\f]+)*?"|'(?:\\(?:.|{nl})|[^\\'\r\n\f]+)*?'|{ident}+) )r ÚidentzU (?:{ws}*(?P[!~^|*$]?=){ws}*(?P{value})(?:{ws}+(?P[is]))?)?{ws}*\] )rÚvaluez \#{ident})r z \.{ident}z6(?P(?:{ident}|\*)?\|)?(?P{ident}|\*)zD \[{ws}*(?P(?:{ident}|\*)?\|)?(?P{ident}){attr} )rr Úattrz$(?P:{ident})(?P\({ws}*)?)rr z#(?P:{ident})(?P\({ws}*)z(?P:(?=--){ident})z{ws}*\)z:{}z @P{ident}z} (?P{name} (?P{nth}|even|odd))(?:{wsc}*\)|(?P{comments}*{ws}{wsc}*of{comments}*{ws}{wsc}*)) )ÚnameÚwscr rÚnthzA (?P{name} (?P{nth}|even|odd)){ws}*\) )rrrz7{name}(?P{value}(?:{ws}*,{ws}*{value})*){ws}*\))rrr z{name}(?Pltr|rtl){ws}*\))rrz0{wsc}*?(?P[,+>~]|{ws}(?![,+>~])){wsc}*)rrz0(?:(\\[a-f0-9]{{1,6}}{ws}?)|(\\[^\r\n\f])|(\\$))z9(?:(\\[a-f0-9]{{1,6}}{ws}?)|(\\[^\r\n\f])|(\\$)|(\\{nl}))zL(?P[-+])?(?P[0-9]+n?|n)(?:(?<=n){ws}*(?P[-+]){ws}*(?P[0-9]+))?z-(?:(?P{value})|(?P{ws}*,{ws}*))z^{}*z{}*$z^{}$ú,ú ééééé é@é€éiiô)ÚmaxsizecCs(t|ƒ}t |t|||d ¡|||¡S)zCached CSS compile.)ÚcustomÚflags)Úprocess_customÚcmZ SoupSieveÚ CSSParserÚprocess_selectors)ÚpatternÚ namespacesrrÚcustom_selectors©r&úo/private/var/folders/fw/jsxvvqfs4sz4tdnfdvg5typ5vk77qg/T/pip-install-p7nfy4dm/soupsieve/soupsieve/css_parser.pyÚ_cached_css_compileÌsr(cCs t ¡dS)zPurge the cache.N)r(Ú cache_clearr&r&r&r'Ú _purge_cacheÚsr*cCsni}|dk rjx\| ¡D]P\}}t |¡}t |¡dkrDtd |¡ƒ‚||krZtd |¡ƒ‚||t|ƒ<qW|S)zProcess custom.Nz5The name '{}' is not a valid custom pseudo-class namez4The custom selector '{}' has already been registered) ÚitemsrÚlowerÚ RE_CUSTOMÚmatchrÚformatÚKeyErrorÚ css_unescape)rr%Úkeyr rr&r&r'ràs rFcCsdd„}|stnt ||¡S)zs Unescape CSS value. Strings allow for spanning the value on multiple strings by escaping a new line. cSsn| d¡r8t| d¡dd…dƒ}|dkr.t}t|ƒ}n2| d¡rV| d¡dd…}n| d¡rfd}nd}|S) z(Replace with the appropriate substitute.rNrrréu�Ú)ÚgroupÚintÚUNICODE_REPLACEMENT_CHARÚchr)ÚmÚ codepointr r&r&r'Úreplaceös    zcss_unescape..replace)Ú RE_CSS_ESCÚRE_CSS_STR_ESCÚsub)ÚcontentÚstringr;r&r&r'r1ïsr1cCsˆg}t|ƒ}|dko|ddk}|dkr@|r@| d |¡¡n>x:t|ƒD],\}}t|ƒ}|dkrr| d¡qLd|kr†dksn|dkr¢| d |¡¡qL|dks¶|rà|dkràd |krÊd krànn| d |¡¡qL|d ks^|d ks^d |kr d ks^nd |kr&d ks^nd |kr@dks^nd|krZdkrjnn | |¡qL| d |¡¡qLWd |¡S)zEscape identifier.rú-rz\{}u�ééz\{:x} é0é9)é-é_réAéZéaézr4)ÚlenÚappendr/Ú enumerateÚordÚjoin)r r@ÚlengthZ start_dashÚindexÚcr:r&r&r'Úescape s$  ,.P rTc@s(eZdZdZdd„Zdd„Zdd„ZdS) ÚSelectorPatternzSelector pattern.cCs&||_t |tjtjBtjB¡|_dS)z Initialize.N)rÚreÚcompileÚIÚXÚUÚ re_pattern)Úselfrr#r&r&r'Ú__init__)szSelectorPattern.__init__cCs|jS)z Get name.)r)r\r&r&r'Úget_name/szSelectorPattern.get_namecCs|j ||¡S)zMatch the selector.)r[r.)r\ÚselectorrRrr&r&r'r.4szSelectorPattern.matchN)Ú__name__Ú __module__Ú __qualname__Ú__doc__r]r^r.r&r&r&r'rU&srUc@s(eZdZdZdd„Zdd„Zdd„ZdS) ÚSpecialPseudoPatternzSelector pattern.cCspi|_xB|D]:}|d}|d||dƒ}x|dD]}||j|<q4Wq Wd|_t ttjtjBtjB¡|_dS)z Initialize.rr3rrN) ÚpatternsÚ matched_namerVrWÚPAT_PSEUDO_CLASS_SPECIALrXrYrZÚre_pseudo_name)r\reÚprr#Úpseudor&r&r'r]=s zSpecialPseudoPattern.__init__cCs |j ¡S)z Get name.)rfr^)r\r&r&r'r^JszSpecialPseudoPattern.get_namecCsVd}|j ||¡}|rRt t| d¡ƒ¡}|j |¡}|rR| |||¡}|rR||_|S)zMatch the selector.Nr) rhr.rr,r1r5reÚgetrf)r\r_rRrrjr9rr#r&r&r'r.Os zSpecialPseudoPattern.matchN)r`rarbrcr]r^r.r&r&r&r'rd:s rdc@s4eZdZdZdd„Zdd„Zdd„Zdd „ZeZd 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. cKs¬| dd¡|_| dg¡|_| dg¡|_| dg¡|_| dg¡|_| dg¡|_| dg¡|_| d d¡|_| d g¡|_ | d g¡|_ | d d ¡|_ | dd¡|_ dS)z Initialize.ÚtagNÚidsÚclassesÚ attributesrÚ selectorsÚ relationsÚrel_typeÚcontainsÚlangrrÚno_matchF) rkrmrnrorprrqrrrsrtrurrv)r\Úkwargsr&r&r'r]hsz_Selector.__init__cCs<|r0|d}|j |dd…¡t | ¡g¡St ¡SdS)zFreeze relation.rrN)rrÚextendÚctÚ SelectorListÚfreeze)r\rrÚselr&r&r'Ú_freeze_relationsxs z_Selector._freeze_relationsc Csh|jrt ¡St |jt|jƒt|jƒt|jƒt|j ƒt|j ƒ|  |j ¡|j t|jƒt|jƒ|j¡ SdS)z Freeze self.N)rvryZ SelectorNullZSelectorrmÚtuplernrorprrqr}rrrsrtrur)r\r&r&r'r{‚s z_Selector.freezecCs8d |j|j|j|j|j|j|j|j|j |j |j |j ¡ S)zString representation.zª_Selector(tag={!r}, ids={!r}, classes={!r}, attributes={!r}, nth={!r}, selectors={!r}, relations={!r}, rel_type={!r}, contains={!r}, lang={!r}, flags={!r}, no_match={!r})) r/rmrnrorprrqrrrsrtrurrv)r\r&r&r'Ú__str__–sz_Selector.__str__N) r`rarbrcr]r}r{rÚ__repr__r&r&r&r'rl_s   rlc @s"eZdZdZedeƒeddeefddeefdde efd d e efd d e effƒed e ƒede ƒedeƒedeƒedeƒedeƒedeƒedeƒedeƒf Zd8dd„Zdd„Zdd„Zdd„Zd d!„Zd"d#„Zd$d%„Zd&d'„Zd(d)„Zd*d+„Zd,d-„Z d.d/„Z!d0d1„Z"d9d2d3„Z#d4d5„Z$d:d6d7„Z%dS);r!zParse CSS selectors.Ú pseudo_closeÚpseudo_contains)z :containsz:-soup-containsz:-soup-contains-ownÚpseudo_nth_child)z :nth-childz:nth-last-childÚpseudo_nth_type)z :nth-of-typez:nth-last-of-typeÚ pseudo_lang)z:langÚ pseudo_dir)z:dirÚpseudo_class_customÚ pseudo_classÚpseudo_elementÚat_ruleÚidÚclassrmÚ attributeÚcombineNrcCs8| dd¡|_||_|jtj@|_|dkr.in||_dS)z Initialize.úu�N)r;r#rrÚDEBUGÚdebugr)r\r_rrr&r&r'r]ÂszCSSParser.__init__cCsRd}| d¡}| d¡r(t | d¡¡nd}| d¡rLt| d¡dd…ƒnd}t| d¡ƒ}d} d} |r~|d krxtjnd } nt |¡d kr˜tj} d } nd } |rÚ| d ¡ d¡rÊt| d ¡dd…d ƒ} qÞt| d ¡ƒ} nd} |sèd} nô| d¡r t dt | ¡| ¡} nÐ| d¡r0t dt | ¡| ¡} n¬| d¡rTt dt | ¡| ¡} nˆ| d¡r’| rrt   | ¡rvdnt | ¡} t d| | ¡} nJ| d¡r¶t dt | ¡| ¡} n&t dt | ¡| ¡} | d¡rÜd }| rô| rôt | j ¡} t   ||| | ¡}|r>tƒ}|j |¡t  | ¡gd d¡}|j |¡n |j |¡d }|S)z8Create attribute selector from the returned regex match.FÚcmpÚcaseNZattr_nséÿÿÿÿr4Ú attr_nameÚirÚtypeTr )ú"ú'rú^z^%s.*ú$z.*?%s$Ú*z.*?%s.*ú~z[^\s\S]z7.*?(?:(?<=^)|(?<=[ \t\r\n\f]))%s(?=(?:[ \t\r\n\f]|$)).*ú|z ^%s(?:-.*)?$z^%s$ú!)r5rr,r1rVrXÚ startswithrWrTÚRE_WSÚsearchr#ryZSelectorAttributerlrprMrzr{rq)r\r|r9Ú has_selectorZinverseÚopr“ÚnsrZis_typeZpattern2rr r#Zsel_attrZsub_selZnot_listr&r&r'Úparse_attribute_selectorÊsZ $           z"CSSParser.parse_attribute_selectorcCsH| d¡r t| d¡dd…ƒnd}t| d¡ƒ}t ||¡|_d}|S)z#Parse tag pattern from regex match.Ztag_nsNr”Ztag_nameT)r5r1ryÚ SelectorTagrm)r\r|r9r£Úprefixrmr&r&r'Úparse_tag_patterns $zCSSParser.parse_tag_patterncCs˜t t| d¡ƒ¡}|j |¡}|dkrJtd || d¡¡|j | d¡ƒ‚t |t j ƒs„d|j|<t ||j|jdjtd}||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. rNz2Undefined custom selector '{}' found at postion {}r)rr)rT)rr,r1r5rrkrr/Úendr#Ú isinstanceryrzr!rr"Ú FLG_PSEUDOrqrM)r\r|r9r£rjr_r&r&r'Úparse_pseudo_class_customs       z#CSSParser.parse_pseudo_class_customc Csìd}t t| d¡ƒ¡}| d¡r&d}|rN|tkrN| ||||| d¡¡}n–|s`|tkr`|dkrz|jt j O_nà|dkrš|jt j O_d}nÀ|dkr¶|jt j O_n¤|d krÒ|jt j O_nˆ|d krê|j t¡np|d kr|j t¡nV|d kr|j t¡n<|d kr8|j t¡n"|dkrR|j t¡n|dkrl|j t¡nî|dkr†|j t¡nÔ|dkr |j t¡nº|dkrº|j t¡n |dkrÔ|j t¡n†|dkrî|j t¡nl|dkr|j t¡nR|dkr"|j t¡n8|dkrP|j t  dddddt  ¡¡¡n |dkr||j t  dddddt  ¡¡¡nÞ|dkr¨|j t  dddddt  ¡¡¡n²|dkrÔ|j t  dddddt  ¡¡¡n†|dkr|j  t  dddddt  ¡¡t  dddddt  ¡¡g¡nB|dkrZ|j  t  dddddt  ¡¡t  dddddt  ¡¡g¡d}n„|r”|t!kr”| "|| d¡t#t$B¡d|_%d}nP|s°|t&kr°d|_%d}n4|t'krÖt(d )|¡|j*| +d¡ƒ‚nt,d )|¡ƒ‚||fS) zParse pseudo class.FrÚopenTrz:rootz:definedz:scopez:empty)z:linkz :any-linkz:checkedz:defaultz:indeterminatez :disabledz:enabledz :requiredz :optionalz :read-onlyz :read-writez :in-rangez :out-of-rangez:placeholder-shownz :first-childrz :last-childz:first-of-typez :last-of-typez :only-childz :only-of-typez$Invalid syntax for pseudo class '{}'z1'{}' pseudo-class is not implemented at this time)-rr,r1r5ÚPSEUDO_COMPLEXÚparse_pseudo_openrªÚ PSEUDO_SIMPLErryZSEL_ROOTZ SEL_DEFINEDZ SEL_SCOPEZ SEL_EMPTYrqrMÚCSS_LINKÚ CSS_CHECKEDÚ CSS_DEFAULTÚCSS_INDETERMINATEÚ CSS_DISABLEDÚ CSS_ENABLEDÚ CSS_REQUIREDÚ CSS_OPTIONALÚ CSS_READ_ONLYÚCSS_READ_WRITEÚ CSS_IN_RANGEÚCSS_OUT_OF_RANGEÚCSS_PLACEHOLDER_SHOWNrÚ SelectorNthrzrxÚPSEUDO_COMPLEX_NO_MATCHÚparse_selectorsr¬ÚFLG_OPENrvÚPSEUDO_SIMPLE_NO_MATCHÚPSEUDO_SUPPORTEDrr/r#ÚstartÚNotImplementedError)r\r|r9r£Ú iselectorÚis_htmlZcomplex_pseudorjr&r&r'Úparse_pseudo_class5s”               $ " " "    zCSSParser.parse_pseudo_classc Cs | ¡}| d¡rd}nd}t t|dƒ¡|d<t | d|¡¡}|dkr\d}d} d } nÚ|d krrd}d } d } nÄt |¡} |  d ¡r˜|  d ¡d kr˜d nd}|  d¡} |  d¡} |   d¡rÄ|d7}n| rÚ|| dd…7}n|| 7}|  d¡rþ|  d¡d krþd nd} |  d¡r| |  d¡7} nd} t |dƒ}t | dƒ} |d} |dkrÂ| d¡rn|  ||  d¡t tB¡}nt}| dkrš|j t || | dd|¡¡n&| dkr|j t || | dd |¡¡nV| dkrî|j t || | d dt ¡¡¡n*| dkr|j t || | d d t ¡¡¡d }|S)zParse `nth` pseudo.rƒZ_childÚ_typerrZevenrrTZoddrÚs1rAr4ÚaÚnÚ1Nr”Ús2ÚbÚ0é Zofz :nth-childFz:nth-last-childz :nth-of-typez:nth-last-of-type)Ú groupdictrkrr,r1ÚRE_NTHr.r5Úendswithr r6rÁrªr¬rÂÚCSS_NTH_OF_S_DEFAULTrrMryr¿rz)r\r|r9r£rÇZmdictZpostfixr?rËrÏÚvarZ nth_partsrÌZ pseudo_selZnth_selr&r&r'Úparse_pseudo_nthsX                "  zCSSParser.parse_pseudo_nthcCsFttB}|dkr|tO}|dkr(|tO}|j | |||¡¡d}|S)z"Parse pseudo with opening bracket.z:notz:hasT)r¬rÂÚFLG_NOTÚ FLG_RELATIVErqrMrÁ)r\r|rr£rÇrRrr&r&r'r°ÈszCSSParser.parse_pseudo_opencCsÀ| d¡ ¡}|st}|tkrd|s8td ||¡|j|ƒ‚||_|dj  |¡dt}|  t ƒ¡nH|r€||_|dj  |¡n$|dd…tkr¤td |¡|j|ƒ‚d|}t ƒ}d}|||fS) zParse combinator tokens.ÚrelationzAThe combinator '{}' at postion {}, must have a selector before itr”ú:rNz'The multiple combinators at position {}F) r5ÚstripÚ WS_COMBINATORÚCOMMA_COMBINATORrr/r#rsrrrMrl)r\r|r9r£rqrsrRÚ combinatorr&r&r'Úparse_has_combinatorÕs2 zCSSParser.parse_has_combinatorc Csª| d¡ ¡}|st}|s0td ||¡|j|ƒ‚|tkrr|jsP|sPt  dd¡|_|j   |¡|  |¡|dd…=n&|j   |¡||_ |dd…=|  |¡tƒ}d}||fS)zParse combinator tokens.rÛzAThe combinator '{}' at postion {}, must have a selector before itrœNF)r5rÝrÞrr/r#rßrmryr§rrrxrMrsrl) r\r|r9r£rqrrÚ is_pseudorRràr&r&r'Úparse_combinatorÿs*        zCSSParser.parse_combinatorcCsN| d¡}| d¡r.|j t|dd…ƒ¡n|j t|dd…ƒ¡d}|S)zParse HTML classes and ids.rÚ.rNT)r5r rorMr1rn)r\r|r9r£r_r&r&r'Úparse_class_ids   zCSSParser.parse_class_idc Cs¼t t| d¡ƒ¡}|dkr(t dt¡|dk}t| d¡ƒ}g}xXt |¡D]J}| d¡r^qN| d¡} |   d¡r†t| d d …d ƒ} nt| ƒ} |  | ¡qNW|j   t   t|ƒ|¡¡d }|S) zParse contains.rz :containsz\The pseudo class ':contains' is deprecated, ':-soup-contains' should be used moving forward.z:-soup-contains-ownÚvaluesÚsplitr )r™r˜rr”T)rr,r1r5ÚwarningsÚwarnÚ FutureWarningÚ RE_VALUESÚfinditerr rMrtryZSelectorContainsr~) r\r|r9r£rjZ contains_ownræreÚtokenr r&r&r'Úparse_pseudo_contains(s&   zCSSParser.parse_pseudo_containscCs‚| d¡}g}xXt |¡D]J}| d¡r*q| d¡}| d¡rRt|dd…dƒ}nt|ƒ}| |¡qW|j t |¡¡d}|S)zParse pseudo language.rærçr )r˜r™rr”T) r5rërìr r1rMruryZ SelectorLang)r\r|r9r£rærerír r&r&r'Úparse_pseudo_langAs    zCSSParser.parse_pseudo_langcCs6t | d¡¡dkrtjntj}|j|O_d}|S)zParse pseudo direction.ÚdirZltrT)rr,r5ryZ SEL_DIR_LTRZ SEL_DIR_RTLr)r\r|r9r£r r&r&r'Úparse_pseudo_dirVs zCSSParser.parse_pseudo_dirc Cs†tƒ}g}d}d}g}dt} t|t@ƒ} t|t@ƒ} t|t@ƒ} t|t@ƒ} t|t@ƒ}t|t@ƒ}t|t @ƒ}t|t @ƒ}t|t @ƒ}t|t @ƒ}|j r| rªtdƒ| r¶tdƒ| rÂtdƒ| rÎtdƒ|rÚtdƒ|rætdƒ|ròtd ƒ|rþtd ƒ|r td ƒ|rtd ƒ| r,| tƒ¡y8x0t|ƒ\}}|d krbtd | d¡¡ƒ‚nò|dkr~| |||¡}nÖ|dkr¢| |||||¡\}}n²|dkrÄtd | d¡¡ƒ‚n|dkrà| |||¡}nt|dkrþ| ||||¡}nV|dkr| |||¡}n:|dkr:| |||¡}d}n|dkrš|sjtd | d¡¡|j| d¡ƒ‚| rxd}Pn td | d¡¡|j| d¡ƒ‚nº|dkrâ| rÆ| ||||| |¡\}}} n| |||||| |¡\}}nr|dkrü| |||¡}nX|dkr<|r,td | d¡¡|j| d¡ƒ‚| |||¡}n|d krT|  |||¡}| !d¡}q4WWnt"k r|YnX| rž|sžtd! |¡|j|ƒ‚|r|j#sÀ| sÀt$ %d"d#¡|_#| rÞ| |_&|d$j' |¡n |j' (|¡|d#d#…=| |¡ntd% |¡|j|ƒ‚|r&t$j)|d$_*|r8t$j+|d$_*|rJt$j,|d$_*|r\t$j-|d$_*|rnt$j.|d$_*t$ /d&d'„|Dƒ| |¡S)(zParse selectors.FrÜ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: TruerŠzAt-rules found at position {}rr‡rˆr‰z#Pseudo-element found at position {}r‚)r„rƒr…r†Trz!Expected a selector at postion {}z*Unmatched pseudo-class close at postion {}rŽrrmz5Tag name found at position {} instead of at the start)rŒr‹z$Unclosed pseudo-class at position {}rœNr”z"Expected a selector at position {}cSsg|] }| ¡‘qSr&)r{)Ú.0Úsr&r&r'ú ôsz-CSSParser.parse_selectors..)0rlrÞÚboolrÂr¬rÚrÙÚFLG_HTMLÚ FLG_DEFAULTÚFLG_INDETERMINATEÚ FLG_IN_RANGEÚFLG_OUT_OF_RANGEÚFLG_PLACEHOLDER_SHOWNr‘ÚprintrMÚnextrÆr/rÅr­rÉrîrØrïrñrr#rárãr¦r©rårªÚ StopIterationrmryr§rsrrrxZ SEL_DEFAULTrZSEL_INDETERMINATEZ SEL_IN_RANGEZSEL_OUT_OF_RANGEZSEL_PLACEHOLDER_SHOWNrz)r\rÇrRrr|rqr£ÚclosedrrrsZis_openrâZ is_relativeÚis_notrÈZ is_defaultZis_indeterminateZ is_in_rangeZis_out_of_rangeZis_placeholder_shownr2r9r&r&r'rÁ^sò                                    zCSSParser.parse_selectorsc csft |¡}|r| d¡nd}t |¡}|r8| d¡dn t|ƒd}|jrXtd |¡ƒxø||krPd}xd|j D]Z}|  |||j ¡}|rp|  ¡}|jr´td ||  d¡| d¡¡ƒ| d¡}||fVPqpW|dkrZ||}|dkròd |¡}nN|dkrd  |¡}n8|d krd  |¡}n"|d kr4d  |¡}n d ||¡}t||j|ƒ‚qZW|jrbtdƒdS)zIterate selector tokens.rrz## PARSING: {!r}Nz#TOKEN: '{}' --> {!r} at position {}ú[z+Malformed attribute selector at position {}räz'Malformed class selector at position {}ú#z$Malformed id selector at position {}rÜz.Malformed pseudo-class selector at position {}z"Invalid character {!r} position {}z## END PARSING)Ú RE_WS_BEGINr¢rªÚ RE_WS_ENDrÅrLr‘rür/Ú css_tokensr.rr^r5rr#) r\r#r9rRrªÚvrrSÚmsgr&r&r'Ú selector_iterös>              zCSSParser.selector_itercCs| | |j¡||¡S)zProcess selectors.)rÁrr#)r\rRrr&r&r'r"szCSSParser.process_selectors)Nr)rr)rr)&r`rarbrcrUÚPAT_PSEUDO_CLOSErdÚ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_AT_RULEÚPAT_IDÚ PAT_CLASSÚPAT_TAGÚPAT_ATTRÚ PAT_COMBINErr]r¦r©r­rÉrØr°rárãrårîrïrñrÁrr"r&r&r&r'r!¤sJ     F X; *  )r!zhtml|*:is(a, area, link)[href])rz\ 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] ) )F)_rcrVÚ functoolsrr4rrr rryrrèr7r±rÃr¯rÀZPSEUDO_SPECIALrÄÚNEWLINEr/ZWSZCOMMENTSZWSCZ CSS_ESCAPESZCSS_STRING_ESCAPESÚ IDENTIFIERZNTHZVALUEZATTRrrrrrrgrr rrr r r rrr rWrXr<r=rÔrYrër¡rrr-rßrÞr¬rÙrÚr÷rörørÂrùrúrûÚ _MAXCACHEr(r*rr1rTÚobjectrUrdrlr!r"r²r³r´rµr¶r·r¸r¹r¾rÖr»rºr¼r½r&r&r&r'Ús\                     %E