o $a$@sdZddlZddlZddlZddlmZddlmZmZmZm Z m Z m Z m Z m Z mZmZmZmZddlmZddlmZmZmZddlmZmZddlmZdd lmZdd lm Z m!Z!dd l"m#Z#dd l$m%Z%dd l&m'Z'm(Z(ddl)m*Z*m+Z+ddl,m-Z-ddl.m/Z/m0Z0m1Z1ddl2m3Z3ddl4m5Z5m6Z6m7Z7ddl8m9Z9m:Z:erddl;mZ>ddl?m@Z@e0AeBZCeDdZEeDdejFZGGddde%eHZIGdddeIZJGddde-ZKGdd d e3ZLGd!d"d"e%eHZMGd#d$d$e3ZNGd%d&d&e-ZOd'eHd(e e eHfd)d*ZPd+d,d-e ed.eHd/eHd0eQd1eHd2ejRd(ejSfd3d4ZTGd5d6d6e3ZUdJd8eHd9eHd(e efd:d;ZVGdd?d?e-ZXGd@dAdAe'ZYdBdCdDe'dEe!d(e eZfdFdGZ[dBdCd(e eHeffdHdIZ\dS)Kz sphinx.domains.std ~~~~~~~~~~~~~~~~~~ The standard domain. :copyright: Copyright 2007-2021 by the Sphinx team, see AUTHORS. :license: BSD, see LICENSE for details. N)copy) TYPE_CHECKINGAnyCallableDictIterableIteratorListOptionalTupleTypeUnioncast)nodes)ElementNodesystem_message) Directive directives) StringList)addnodes)desc_signature pending_xref)RemovedInSphinx50Warning)ObjectDescription)DomainObjType)___)XRefRole) docname_joinloggingws_re)SphinxDirective) clean_astextmake_id make_refnode) OptionSpec RoleFunction)Sphinx)Builder)BuildEnvironmentz ((?:/|--|-|\+)?[^\s=]+)(=?\s*.*)z`((~?\w*:)?\w+)`c@s|eZdZUdZdZeed<dZeddee gefed<dede d efd d Z d edede d dfd dZ d ed efddZ dS) GenericObjectzM A generic x-ref directive registered with Sphinx.add_object_type(). indextemplateNr+ parse_nodesigsignodereturncCsB|jr ||j||}|S||t||7}td|}|S)N )r/envclearr desc_namer"sub)selfr0r1namer:4/usr/lib/python3/dist-packages/sphinx/domains/std.pyhandle_signature8s zGenericObject.handle_signaturer9c Cst|j|jj|j|}|d|||}||jjjvr+||dvr+|d||jj||j rl|j d}|dkrW|j d| }|j |dd |f}nd}|j |f}|j d|||ddft t|jd} | j|j|||d dS) Nids:singleentriesr-stdlocation)r%r4statedocumentobjtypeappend make_old_idr=note_explicit_targetr.findstrip indexnoderStandardDomain get_domain note_object) r8r9r0r1node_id old_node_idcolon indextype indexentryrCr:r:r;add_target_and_indexBs    z"GenericObject.add_target_and_indexcC|jd|S)zGenerate old styled node_id for generic objects. .. note:: Old Styled node_id was used until Sphinx-3.0. This will be removed in Sphinx-5.0. -)rHr8r9r:r:r;rJ[zGenericObject.make_old_id) __name__ __module__ __qualname____doc__r.str__annotations__r/rrr<rWrJr:r:r:r;r,1s   r,c@seZdZedZdS)EnvVarenvironment variable; %sN)r\r]r^rr.r:r:r:r;rbds rbc @s@eZdZdZdejdddededee e e e ff dd Z d S) EnvVarXRefRolezQ Cross-referencing role for environment variables (adds an index entry). rGr4r+nodeis_refr2c Cs~|s|ggfS|d}d|d}t}d||ddfdtd||ddfg|d<tjdd|gd}|||||ggfS) N reftargetzindex-%sindexrAr-rcrBr=) new_serialnorrhrrtargetrK) r8rGr4rerfvarnametgtidrN targetnoder:r:r; result_nodesms   zEnvVarXRefRole.result_nodesN) r\r]r^r_rrGrboolr r rrror:r:r:r;rdhsrdc@sVeZdZUdZdZdZdZdZdZiZ e e d<de e fd d Zd edefd d ZdS)Targetz@ Generic target for user-defined cross-reference types. r-Fr@rT option_specr2c CsHtd|jd}t|j|jj|j|}t j dd|gd}| || |}||jjj vr=||dvr=|d||jj||g}|jr|j|f}d}|d}|dkrm|d|}||d d}tj|||ddfgd } |d| |j} d|jvr|jdd \} } tt|jd } | j| |||d |S) Nr3rr-rir=rAr>r?r@)rBrCrD)r"r7 argumentsrMr%r4rFrGr9rrkset_source_inforJr=rIrKr.rLrrhinsertsplitrrOrPrQ) r8fullnamerRrerSretrVrUrTinoder9rrCr:r:r;runs0      z Target.runr9cCrX)zGenerate old styled node_id for targets. .. note:: Old Styled node_id was used until Sphinx-3.0. This will be removed in Sphinx-5.0. rY)r9rZr:r:r;rJr[zTarget.make_old_idN)r\r]r^r_r. has_contentrequired_argumentsoptional_argumentsfinal_argument_whitespacerrr'rar rrzr`rJr:r:r:r;rq}s  !rqc@sVeZdZdZdededefddZdedededdfd d Zd ed edefd dZdS) Cmdoptionz; Description of a command-line option (.. option). r0r1r2c Csd}d}|dD]a}|}t|}|s!tjtd||dq |\}}|dr;|dr;|dd }d|}|rE|t dd7}|t ||7}|t ||7}|s_|}|g|d <n|d  ||d 7}q |sot |S) z/Transform an option description into RST nodes.rr-, znMalformed option description %r, should look like "opt", "-opt args", "--opt args", "/opt args" or "+opt args"rD[]Nr?allnamesr@)rvrMoption_desc_rematchloggerwarningrgroupsendswithr desc_addnamer6rI ValueError) r8r0r1count firstnamepotential_optionmoptnameargsr:r:r;r<s6      zCmdoption.handle_signaturerNcCsT|jjd}|dgD]F}dg}|r|||ds#|dd|}t|j|jj||}|d|| ||} | |jjj vrS| |dvrS|d| q |jj |t t |jd} |dgD]}| |||jj|dd qj|rtd |} ntd } |d D]} d | | g} |jdd| |dd ddfqdS)N std:programr cmdoption)rY/argrYr=rCrz%s command line optionzcommand line optionrz; rBpairr-)r4 ref_contextgetrI startswithjoinr%rFrGrJr=rKrrOrPadd_program_optiondocnamerrvrN)r8rr0r1 currprogramrprefixesprefixrRrSdomaindescroptionentryr:r:r;rWs8      $zCmdoption.add_target_and_indexrrcCst|d|S)zGenerate old styled node_id for cmdoption. .. note:: Old Styled node_id was used until Sphinx-3.0. This will be removed in Sphinx-5.0. rYrr%)r8rrr:r:r;rJszCmdoption.make_old_id) r\r]r^r_r`rr<rWrJr:r:r:r;rs !!rc@s@eZdZUdZdZdZdZdZiZe e d<de e fdd Z d S) ProgramzI Directive to name the program for which options are documented. Fr@rTrrr2cCsBtd|jd}|dkr|jjddgS||jjd<gS)NrYrNoner)r"r7rsrMr4rpop)r8programr:r:r;rzs  z Program.runN)r\r]r^r_r{r|r}r~rrr'rar rrzr:r:r:r;rs  rc@6eZdZdddededededeeeff dd Zd S) OptionXRefRoler4r+refnodehas_explicit_titletitlerkr2cCs|jd|d<||fS)Nr)rr)r8r4rrrrkr:r:r; process_linkszOptionXRefRole.process_linkNr\r]r^rrpr`r rr:r:r:r;r rliner2cCstd|dg}|S)Nz +: +)rerv)rpartsr:r:r;split_term_classifierssrr4r+ textnodes index_keysourcelinenorRrGc Cstjddg|R}||_||_|}|r|d|nt||d|}|d|||tt | d} | j |||dt } d||d|fg| d<|j|j| _| _|| |S) Nr-r=termrCrDrAmainrB)rrrrastextrIr%rKrrOrP _note_termrrh) r4rrrrrRrGrtermtextrCrNr:r:r;make_glossary_term$s   rc@sFeZdZUdZdZdZdZdZdej iZ e e d<de efdd Zd S) Glossaryz[ Directive to create a glossary with cross-reference targets for :term: roles. TrFsortedrrr2c Cst}|jj|_g}d}d}d}g}t|j|jjD]\}\}} |s5|r2|r2|ddd|| d}q|r|ds| drEd}qd}|ri|sZ||jj j t d|| d |||| fgt fd}nb|rz||jj j t d || d |r|dd||| fnB||jj j t d || d n2|rn/|sd}t|t|} |r|dd|| d|| n||jj j t d || d d}qg} |D]q\} } g}g}g}| D]8\}}} t|}|j|d| \}}t|j||d|| d|jjd }||_||||||q||t}| r0|j| | jdd|||| |tjdg|Rfqd |jvrR| jdddt}|dd|dd| D||7}||gS)NTFr?r@r-rz.. z,glossary term must be preceded by empty line)rrz3glossary terms must not be separated by empty linesz4glossary seems to be misformatted, check indentation)rRrGrcSstd|ddS)NNFDr) unicodedata normalizelower)xr:r:r;szGlossary.run..)keyclassesglossarycss|]}|dVqdS)r@Nr:).0itemr:r:r; szGlossary.run..)rrrFrGzipcontentitemsrIisspacerreporterrrrlenlstripr inline_textrr4 rawsourceextendrr definition nested_parsedefinition_list_itemoptionssortdefinition_list)r8rerB in_definition in_comment was_emptymessagesrrr indent_lenrtermsr termtexts termnodessystem_messagesrrsysmsgrdefnodedlistr:r:r;rzPs               z Glossary.runN)r\r]r^r_r{r|r}r~rflagrrr'rar rrzr:r:r:r;rBs  rr-textproductionGroupc Cs2t|dkr |d7}g}d}t|D]l}||kr,|||}|t|||d}d|vr]|ddkrI|d\}}|dd} n|ddkrX|dd}|} n |}|} n|}||} t |dd| d} | tj ||dgd 7} || | }q|t|kr|t||d||d|S) Nrr>r@~tokenrC)reftype refdomainrgxrefr) rtoken_refinditerstartrIrTextgrouprvrliteralend) rrretnodesposrtxtrrrrkrr:r:r; token_xrefss:         "rc@sReZdZUdZdZdZdZdZiZe e d<de e fdd Z d edefd d Zd S)ProductionListz0 Directive to list grammar productions. Fr@rTrrr2c Cstt|jd}t}||td}| d|j d d}d}d}|D]}|dkr8d|vr8| }q)|d7}z | dd\}} Wn t yRY|gSwt|} | }|| d<| drd |} t|j|jj| |} | d | ||} | |jjjvr| | d vr| d | |jj| | t|dkrd ||f}n|}|jd || |d | t| ||| q)|gS)NrCz\\\nr-r r>r@ tokennamezgrammar-token-%sr=z%s:%srrD)rrOr4rPrproductionlistrtrcompiler7rsrvrMr productionr%rFrGrIrJr=note_implicit_targetrrQrr)r8rre nl_escape_relinesriruler9tokenssubnoderrRrSobjNamer:r:r;rzsJ        zProductionList.runrcCstd|S)zGenerate old styled node_id for tokens. .. note:: Old Styled node_id was used until Sphinx-3.0. This will be removed in Sphinx-5.0. zgrammar-token-r)r8rr:r:r;rJr[zProductionList.make_old_idN)r\r]r^r_r{r|r}r~rrr'rar rrzr`rJr:r:r:r;rs  -rc@r) TokenXRefRoler4r+rrrrkr2cCsN|d}|js#|ddkr#d|vr|d\}}||fS|dd}||fS)Nrrr>r@)rrrv)r8r4rrrrkrr:r:r;rs  zTokenXRefRole.process_linkNrr:r:r:r;r rr cseZdZUdZdZdZeeddddeedd ddeed d d ddeed deeddeedddddZe e efe d<e e e eeedZe e eefe d<eddeeeejddedejddedddeddedejddZe e eeeffe d<iidd ed!fd"d ed#fd$d ed%fd&d'd(d)d&d*Zd+d,d-d.d/d0Zejd1ej d2ej!d3iZ"e ee#e$e e%e&ffe d4<dfd9d: Z' dd;e de d7d8f d?d@Z(e)d7e e$e e fe$e e fffdAdBZ*ddCe d;e dDe dEe+d7d8f dFdGZ,dCe d;e dd5d6d_e d`dadge dhe die;dje9d7e%e9fdqdrZ?d5d6d_e d`dadge dhe die;dje9d7e%e9fdsdtZ@d5d6d_e d`dadge dhe die;dje9d7e%e9fdudvZAd5d6d_e d`dadge dhe die;dje9d7e9fdwdxZBd5d6d_e d`dadge dhe die;dje9d7e%e9fdydzZCd5d6d_e d`dadhe die;dje9d7e4e$e e9ffd{d|ZDd7eEe$e e e e e eFffd}d~ZGddedeHd7e fddZIdie#d7eHfddZJdie#d7e%e fddZKdie#d7e%e fddZLd5d6d`dade dt|t|j|_|jjjD] \}}||j|<qdSN)super__init__rr%appregistryr)r8r4resettings __class__r:r;r(vs   zStandardDomain.__init__r9rrRrcCsj||jvr |j|||fkr ttd||j|j|d||f|j|<|r3|||f|j|<dSdS)aUAdd a hyperlink target for cross reference. .. warning:: This is only for internal use. Please don't use this from your extension. ``document.note_explicit_target()`` or ``note_implicit_target()`` are recommended to add a hyperlink target to the document. This only adds a hyperlink target to the StandardDomain. And this does not add a node_id to node. Therefore, it is very fragile to calling this without understanding hyperlink target framework in both docutils and Sphinx. .. versionadded:: 3.0 (duplicate label %s, other instance in %srN)r!rrrr4doc2pathr )r8r9rrRrr:r:r;note_hyperlink_target~s z$StandardDomain.note_hyperlink_targetcC|jdiS)Nrdata setdefaultr8r:r:r;rzStandardDomain.objectsrHlabelidrEcCsR||f|jvr|j||fd}tjtd||||d|jj|f|j||f<dS)zRNote a generic object for cross reference. .. versionadded:: 3.0 rz4duplicate %s description of %s, other instance in %srDN)rrrrr4r)r8rHr9r7rErr:r:r;rQs  zStandardDomain.note_objectcCs&tjdtdd||f|j||f<dS)Nz*StandardDomain.add_object() is deprecated.) stacklevel)warningswarnrr)r8rHr9rr7r:r:r; add_objectszStandardDomain.add_objectcCr1)z2.. note:: Will be removed soon. internal use only.rr2r5r:r:r;_termsszStandardDomain._termscCs*|d||||jj|f|j|<dS)zeNote a term for cross reference. .. note:: Will be removed soon. internal use only. rN)rQr4rr=r)r8rr7rEr:r:r;rszStandardDomain._note_termcCr1)Nrr2r5r:r:r;rr6zStandardDomain.progoptionscCr1)Nr r2r5r:r:r;r r6zStandardDomain.labelscCr1)Nr!r2r5r:r:r;r!r6zStandardDomain.anonlabelscCsd}t|jD]\}\}}||kr|j|=q t|jD]\}\}}||kr-|j|=qt|jD]\}\}}||krC|j|=q5t|jD]\}\}}}||krZ|j|=qKt|jD]\}\}}||krp|j|=qbdSr&)listrrrr=r r!)r8rrfn_lr:r:r; clear_docs,zStandardDomain.clear_docdocnames otherdatacCs|dD]\}}|d|vr||j|<q|dD]\}}|d|vr+||j|<q|dD]\}}|d|vrA||j|<q2|dD]\}}|d|vrW||j|<qH|dD]\}}|d|vrm||j|<q^dS)Nrrrrr r!)rrrr=r r!)r8rBrCrr3r:r:r;merge_domaindatas*          zStandardDomain.merge_domaindatac Cs`|jD]\}}|s q|j|}|durq|j|}t|tjr3d|vr3|j|d}|dd}|jdksBd|vsB|j drCq||j vr[t j t d|||j |d|d||f|j|<|jd krtttj|d}t|} n1|jd kr~t|} n'||r||} | sqntt|tjd} | r| d r| d } nq||| f|j |<qdS) Nrefidnamesrfootnoterefuridesc_r.rDsectionrubriccaption) nametypesrnameidsr= isinstancerrkrtagnamerr rrrr/r!rrr$is_enumerable_nodeget_numfig_titlenextitertraversertoctree) r8r4rrGr9explicitr7rersectnamerVr:r:r; process_docsJ              zStandardDomain.process_docrcCs||f|j||f<dSr&)r)r8rr9rr7r:r:r;rz!StandardDomain.add_program_option fromdocnamebuilderr*rXrolenamerc Ks|dtj}|d ddi|} t||} | ddur-| dd| dd|||kr6|| d<n td} || d <|| d <|||| d <|rV| d d |7<| | | S)N nodeclassr-internalTrrCzstd-rE refdocname refsectnamerH#r-r-)rr referenceinlinerrIrget_relative_uri) r8r[r\rr7rXr]rr^newnode innernodecontnoder:r:r;build_reference_nodes$   z#StandardDomain.build_reference_nodetyprkreric Csz|dkr|j}n+|dkr|j}n#|dkr|j}n|dkr |j}n|dkr(|j}n |dkr0|j}n|j}||||||||S)Nrrrrrr)_resolve_ref_xref_resolve_numref_xref_resolve_keyword_xref_resolve_doc_xref_resolve_option_xref_resolve_term_xref_resolve_obj_xref) r8r4r[r\rkrkreriresolverr:r:r; resolve_xref.szStandardDomain.resolve_xrefc CsT|dr|j|d\}} |} n |j|d\}} } |s dS||||| | dS)N refexplicitrcr-r-r-r)r!rrr rj) r8r4r[r\rkrkrerirr7rXr:r:r;rlBs z StandardDomain._resolve_ref_xrefc Cs||jvr|j|d\}} } n |j|d\}} d} |sdS||j| } || } | dur3dS| dkrH|jjdurHtj t d|d|Sz| ||| || } | durY|WSWnt yotj t d| |d|YSwzM|drz| }n|jj| d }| durd |vrtj t d ||d|WSd tt| }d |vsd |vr| r|j| |d}n |j|d}n||}Wn3ty}ztj t d|||d|WYd}~Sd}~wtytj t d||d|YSw|j|||| |dtj|dS)NrvrcrJFz(numfig is disabled. :numref: is ignored.rDzBFailed to create a cross reference. Any number is not assigned: %srur-z{name}zthe link has no caption: %s.number)r9rx)rxzinvalid numfig_format: %s (%r)zinvalid numfig_format: %sr)r^r)r rr! get_doctreer=get_enumerable_node_typeconfignumfigrrr get_fignumberrr numfig_formatrmapr`formatKeyError TypeErrorrjrnumber_reference)r8r4r[r\rkrkrerirr7figname target_nodefigtype fignumberrfignumnewtitleexcr:r:r;rmTsf      z#StandardDomain._resolve_numref_xrefc Cs,|j|d\}} } |sdSt|||| |S)Nrv)r rr&) r8r4r[r\rkrkrerirr7rr:r:r;rns z$StandardDomain._resolve_keyword_xrefc Csj|d|}t||d} | |jvrdS|dr|} nt|j| } tj| | dgd} t||| d| S)Nrefdocrgrurr) rr all_docsrr$titlesrrer&) r8r4r[r\rkrkrerirrrLrhr:r:r;ros   z StandardDomain._resolve_doc_xrefc Cs|d}|}|j||fd\} } | sDg} t|rBt|d\} }| | d| }|j||fd\} } | r=nt|sdSt||| | |S)Nrrcr@rY) rrMrr"rrvrIrr&) r8r4r[r\rkrkreriprognamerr7commands subcommandr:r:r;rps"      z#StandardDomain._resolve_option_xrefc CsR||||||||}|r|S||jvr'|j|\} } t||| | |SdSr&)rrrr=r&) r8r4r[r\rkrkreriresultrr7r:r:r;rqs z!StandardDomain._resolve_term_xrefc Cs\||pg}|D]} | |f|jvr|j| |f\} } nq d\} } | s&dSt||| | |S)Nrc)objtypes_for_rolerr&) r8r4r[r\rkrkreriobjtypesrHrr7r:r:r;rrsz StandardDomain._resolve_obj_xrefc Csg}|}dD]} ||||| | dkr|n|||} | r&|d| | fq|jD],} | |f} | dkr8| |f} | |jvrV|j| \} }|d|| t||| ||fq*|S)N)rrrzstd:r)rrtrIrrrole_for_objtyper&)r8r4r[r\rkreriresultsltargetroleresrHrrr7r:r:r;resolve_any_xrefs.   zStandardDomain.resolve_any_xrefc cs8|jjD]}|t|jj|d|ddfVq|jD]*\\}}}|r9d||g}||d|d|ddfVq||d|d|ddfVq|jD]\\}}}||||d|d|j|j dfVqL|j D]\}\}} } || d || dfVqkt |j } |j D]\}\}} || vr||d || dfVqdS) Nrr-r?rwrrr@r r) r4rr$rrrrrrattrsr setr!) r8rprogrinforwtyper9rr7 sectionnamenon_anon_labelsr:r:r; get_objectss(   zStandardDomain.get_objectsFrprimarycCs|jSr&)lname)r8rrr:r:r; get_type_nameszStandardDomain.get_type_namecCs |j|jvSr&)r-r%)r8rer:r:r;rQs z!StandardDomain.is_enumerable_nodecCs`||r.tt|}|j|jd\}}|r||S|D]}t|tjtj fr-t |SqdS)z?Get the title of enumerable nodes to refer them using its titleNNN) rQrrr%rr-rOrrLrr$)r8reelemr title_getterr r:r:r;rRs   zStandardDomain.get_numfig_titlecCsbdtdtdtfdd}t|tjrdSt|tjr%d|vr%||tjr%dS|j |j d \}}|S) zGet type of enumerable nodes.reclsr2cstfdd|DS)Nc3s|]}t|VqdSr&)rO)rchildrr:r;r&szMStandardDomain.get_enumerable_node_type..has_child..)any)rerr:rr; has_child%rZz:StandardDomain.get_enumerable_node_type..has_childrJ literal_blockr$r) rr rprOrrJ containerrr%rr-)r8rerrrr:r:r;rz#s   z'StandardDomain.get_enumerable_node_typerr.c Cs|dkr2|jdkr tS||jvrtd|dd}||j|vr*|j|dS|j||Sz|dd}|j|||WSttfyS}zt|d}~ww)NrJlatexrbr=rr-)r9tupletoc_secnumbersrrtoc_fignumbersr IndexError) r8r4r\rrr anchorname figure_idrr:r:r;r}3s    zStandardDomain.get_fignumbercCs`|ddkr.|d}t|d}|r|d||}|r,dd||gSdSdS)NrrrrgrrwrY)rr"rvrurr)r8rercommandrr:r:r;get_full_qualified_nameJs  z&StandardDomain.get_full_qualified_name)r4r+r2Nr-r&)F)Pr\r]r^r_r9rrrrrr`rarrrbrrrr rrrdr rrrerr r( initial_datadangling_warningsr"r#rr%rr r rr(r0propertyrrrQr<r=rrr r!rAr rDrGrYrrrjrrtrlrmrnrorprqrrrrintrrprrQrRrzr}r __classcell__r:r:r,r;rO)s           $  (    (" )    ?      "   rOr)r)rrecCs`|r|jdks |ddkrdS|d}||jvrtd}ntd}tj|||d|dddS) NrCrrrgzundefined label: %szDFailed to create a cross reference. A title or caption not found: %s)rErsubtypeT)r9r!rrr)r)rrerkmsgr:r:r;warn_missing_referenceYs  rcCs$|t|dtdddddS)Nzwarn-missing-referencebuiltinr8T)version env_versionparallel_read_safeparallel_write_safe) add_domainrOconnectr)r)r:r:r;setuphs  rr)]r_rrr:rtypingrrrrrrr r r r r rdocutilsrdocutils.nodesrrrdocutils.parsers.rstrrdocutils.statemachinersphinxrsphinx.addnodesrrsphinx.deprecationrsphinx.directivesrsphinx.domainsrr sphinx.localerr sphinx.rolesr sphinx.utilr r!r"sphinx.util.docutilsr#sphinx.util.nodesr$r%r&sphinx.util.typingr'r(sphinx.applicationr)sphinx.buildersr*sphinx.environmentr+ getLoggerr\rrrUrr`r,rbrdrqrrrrrrGrrrrrr rOrprrr:r:r:r;sx  8            36P y!A 4