U Ï anã @srdZddlZddlmZddlmZddlmZddl m Z ddl m Z ddlmZdd lmZd d lmZd d lmZd d lmZd dlmZd dlmZd dlmZd dlmZd dlmZd dlmZd dlmZd dlm Z d dl!m"Z"ej#r ddl$Z%d dl&m'Z'ej(dej)dej*fdZ+dddddd d!d"d#œZ,e+e+d$œd%d&„Z-e.ej)d'ej/d(gdfd)œd*d+„Z0e.ej)d'ej1d(gdfd)œd,d-„Z2dFej3d0ej4e.ej4e.ej4ej5e6e6ej4e.d1œd2d3„Z7ej*e6d4œd5d6„Z8ej9ej:ej9e.ej;e.d7œd8d9„ZGd=d>„d>e?ƒZ@Gd?d@„d@e"ƒZAGdAdB„dBe"ƒZBGdCdD„dDeCƒZDGdEd'„d'e"ƒZEdS)Gz0Compiles nodes from the parser into Python code.éN)Úcontextmanager)Úupdate_wrapper)ÚStringIO)Úchain)Ú iskeyword)Úescape)ÚMarkupé)Únodes)ÚTemplateAssertionError)ÚSymbols)ÚVAR_LOAD_ALIAS)ÚVAR_LOAD_PARAMETER)ÚVAR_LOAD_RESOLVE)ÚVAR_LOAD_UNDEFINED)Ú EvalContext)Ú Optimizer)Ú_PassArg)Úconcat)Ú NodeVisitor)Ú EnvironmentÚF.)Úboundz==z!=ú>z>=ú.new_func)r ÚExprÚtÚAnyrÚcastr)r!r1r/r.r0Ú optimizeconst+sþ r6r#r$)Úopr"cs"tdtjtddœ‡fdd„ ƒ}|S)Nr#©r%r&r'r"cs”|jjrNˆ|jjkrN| dˆ›d¡| |j|¡| d¡| |j|¡n8| d¡| |j|¡| dˆ›d¡| |j|¡| d¡dS)Nz environment.call_binop(context, ú, ú(ú ú))Ú environmentÚ sandboxedZintercepted_binopsÚwriter-ÚleftÚright©r%r&r'©r7r/r0Úvisitor<sÿ þ  z_make_binop..visitor)r6r ÚBinExprr$©r7rDr/rCr0Ú _make_binop;srGcs"tdtjtddœ‡fdd„ ƒ}|S)Nr#r8cs`|jjr6ˆ|jjkr6| dˆ›d¡| |j|¡n| dˆ¡| |j|¡| d¡dS)Nzenvironment.call_unop(context, r9r:r<)r=r>Zintercepted_unopsr?r-r&rBrCr/r0rDTsÿ þz_make_unop..visitor)r6r Ú UnaryExprr$rFr/rCr0Ú _make_unopQs rIFTr)r&r=ÚnameÚfilenameÚstreamÚ defer_initÚ optimizedr"cCsHt|tjƒstdƒ‚| ||||||¡}| |¡|dkrD|j ¡SdS)z+Generate the python source for a node tree.z Can't compile non template nodesN)Ú isinstancer ÚTemplateÚ TypeErrorZcode_generator_classr-rLÚgetvalue)r&r=rJrKrLrMrNÚ generatorr/r/r0Úgeneratees ÿ  rT©Úvaluer"cCs†|dks|tks|tkrdSt|ƒttttttt hkr:dSt|ƒt t t t hkr`tdd„|DƒƒSt|ƒtkr‚tdd„| ¡DƒƒSdS)z)Does the node have a safe representation?NTcss|]}t|ƒVqdSr)©Ú has_safe_repr)Ú.0Úvr/r/r0Ú †sz has_safe_repr..css"|]\}}t|ƒot|ƒVqdSr)rW©rYÚkrZr/r/r0r[‰sF)ÚNotImplementedÚEllipsisÚtypeÚboolÚintÚfloatÚcomplexÚrangeÚstrrÚtupleÚlistÚsetÚ frozensetÚallÚdictÚitems©rVr/r/r0rX}s rX)r Únamesr"cCs<t|ƒ}z|D]}| |¡qWntk r4YnX|jS)z”Check if the names passed are accessed undeclared. The return value is a set of all the undeclared names from the sequence of names found. )ÚUndeclaredNameVisitorr-Ú VisitorExitÚ undeclared)r rorDr&r/r/r0Úfind_undeclaredŽsrsc@s*eZdZejejejfddœdd„ZdS)ÚMacroRefN©r&r"cCs||_d|_d|_d|_dS©NF)r&Úaccesses_callerÚaccesses_kwargsÚaccesses_varargs©r%r&r/r/r0Ú__init__žszMacroRef.__init__) Ú__name__Ú __module__Ú __qualname__r3ÚUnionr ÚMacroÚ CallBlockr{r/r/r/r0rtsrtc@sdeZdZdZdeejdejeddœdd„Zddœdd„Z de dd œd d „Z ddœd d„Z e Z dS)r$z&Holds compile time information for us.N)r+ÚparentÚlevelr"cCs~||_||_|dkr4t|d|_d|_d|_d|_n(t|j|d|_|j|_|j|_|j|_d|_d|_d|_ d|_ d|_ dS)N©rƒF) r+r‚r ÚsymbolsÚrequire_output_checkÚbufferÚblockÚtoplevelÚ rootlevelÚ loop_frameÚ block_frameÚ soft_frame)r%r+r‚rƒr/r/r0r{¨s  zFrame.__init__©r"cCs2t tt |j¡¡}|j |j¡|j  ¡|_|S)z!Create a copy of the current one.) r3r5r$ÚobjectÚ__new__Ú __class__Ú__dict__Úupdater…Úcopy©r%Úrvr/r/r0r”Ûs z Frame.copyF)Úisolatedr"cCs&|rt|j|jjddSt|j|ƒS)zReturn an inner frame.r r„)r$r+r…rƒ)r%r—r/r/r0Úinnerâsz Frame.innercCs| ¡}d|_d|_|S)a&Return a soft frame. A soft frame may not be modified as standalone thing as it shares the resources with the frame it was created of, but it's not a rootlevel frame any longer. This is only used to implement if-statements and conditional expressions. FT)r”rŠrr•r/r/r0Úsoftèsz Frame.soft)NN)F)r|r}r~Ú__doc__rr3ÚOptionalrbr{r”rar˜r™Ú__copy__r/r/r/r0r$¥süû 3 c@seZdZdZdS)rqz?Exception used by the `UndeclaredNameVisitor` to signal a stop.N©r|r}r~ršr/r/r/r0rqøsrqc@sTeZdZdZddœdd„Zejddœdd„Zejddœd d „Z ej ddœd d „Z dS) ÚDependencyFinderVisitorz.A visitor that collects filter and test calls.NrŽcCstƒ|_tƒ|_dSr))riÚfiltersÚtests©r%r/r/r0r{ÿsz DependencyFinderVisitor.__init__rucCs| |¡|j |j¡dSr))Ú generic_visitrŸÚaddrJrzr/r/r0Ú visit_Filters z$DependencyFinderVisitor.visit_FiltercCs| |¡|j |j¡dSr))r¢r r£rJrzr/r/r0Ú visit_Tests z"DependencyFinderVisitor.visit_TestcCsdS)zStop visiting at blocks.Nr/rzr/r/r0Ú visit_Block sz#DependencyFinderVisitor.visit_Block) r|r}r~ršr{r ÚFilterr¤ÚTestr¥ÚBlockr¦r/r/r/r0ržüs ržc@sJeZdZdZejeddœdd„Zej ddœdd„Z ej ddœd d „Z dS) rpz¡A visitor that checks if a name is accessed without being declared. This is different from the frame visitor as it will not stop at closure frames. N)ror"cCst|ƒ|_tƒ|_dSr))rirorr)r%ror/r/r0r{s zUndeclaredNameVisitor.__init__rucCsJ|jdkr8|j|jkr8|j |j¡|j|jkrFtƒ‚n|j |j¡dS)NÚload)ÚctxrJrorrr£rqÚdiscardrzr/r/r0Ú visit_Names  z UndeclaredNameVisitor.visit_NamecCsdS)zStop visiting a blocks.Nr/rzr/r/r0r¦!sz!UndeclaredNameVisitor.visit_Block) r|r}r~ršr3ÚIterablerfr{r ÚNamer­r©r¦r/r/r/r0rpsrpc@seZdZdZdS)Ú CompilerExitz¼Raised if the compiler encountered a situation where it just doesn't make sense to further process the code. Any block that raises such an exception is not further processed. Nrr/r/r/r0r°%sr°c @sJeZdZUdëdejeejeejejeeddœdd„Ze edœd d „ƒZ ee d d œd d„Z edœdd„Z eddœdd„Zdìeeddœdd„Zddœdd„Zdíe ddœdd„Zdîeejejddœdd„Zeddœd d!„Zdïeeejejdd"œd#d$„Zejejedd%œd&d'„Zedd(œd)d*„Zdðeejeje dd,œd-d.„Zdñejeje dd/œd0d1„Zdòejejejej feejej!eej"fdd2œd3d4„Z#ejejdd5œd6d7„Z$eddœd8d9„Z%dóeedd:œd;d<„Z&dôeeed?œd@dA„Z'eedBœdCdD„Z(ejej)ej*feej+ee,fdEœdFdG„Z-e,eddHœdIdJ„Z.ejedKœdLdM„Z/eedœdNdO„Z0ddœdPdQ„Z1eddœdRdS„Z2ddœdTdU„Z3eddVœdWdX„Z4eddVœdYdZ„Z5ddœd[d\„Z6edœd]d^„Z7edœd_d`„Z8eedœdadb„Z9eedVœdcdd„Z:ddœdedf„Z;eddœdgdh„Zej?eddEœdkdl„Z@ejAeddEœdmdn„ZBejCeddEœdodp„ZDejejEejFfeddEœdqdr„ZGejEeddEœdsdt„ZHejFeddEœdudv„ZIejJeddEœdwdx„ZKejLeddEœdydz„ZMej)eddEœd{d|„ZNej*eddEœd}d~„ZOejPeddEœdd€„ZQejReddEœdd‚„ZSejTeddEœdƒd„„ZUGd…d†„d†ejVƒZWeXej"ej"d‡œdˆd‰„ƒZYdZZejeWe[dŠ<eWdœd‹dŒ„Z\ejej"edœdŽd„Z]ej^eeWedœd‘d’„Z_ej^eeWddœd“d”„Z`ej^eeWddœd•d–„ZaejbeddEœd—d˜„ZcejdeddEœd™dš„ZeejfeddEœd›dœ„ZgejheddEœddž„ZiejjeddEœdŸd „ZkejleddEœd¡d¢„ZmejneddEœd£d¤„Zoej+eddEœd¥d¦„ZpejqeddEœd§d¨„ZrejseddEœd©dª„Zteud«ƒZveud¬ƒZweud­ƒZxeud®ƒZyeud¯ƒZzeud°ƒZ{eud±ƒZ|eud²ƒZ}eud³ƒZ~ed«ƒZ€ed¬ƒZed´ƒZ‚eƒej„eddEœdµd¶„ƒZ…eƒej†eddEœd·d¸„ƒZ‡ejˆeddEœd¹dº„Z‰eƒejŠeddEœd»d¼„ƒZ‹eƒejŒeddEœd½d¾„ƒZejŽeddEœd¿dÀ„Zeejejej feeej‘ddÁœdÂdăZ’eƒejeddEœdÄdÅ„ƒZ“eƒej eddEœdÆdÇ„ƒZ”eƒej•eddEœdÈdÉ„ƒZ–eƒdöejeeddÊœdËdÌ„ƒZ—ej˜eddEœdÍd΄Z™ejšeddEœdÏdЄZ›ejœeddEœdÑdÒ„ZejžeddEœdÓdÔ„ZŸej eddEœdÕdÖ„Z¡ej¢eddEœd×dØ„Z£ej¤eddEœdÙdÚ„Z¥ej¦eddEœdÛdÜ„Z§ej¨eddEœdÝdÞ„Z©ejªeddEœdßdà„Z«ej¬eddEœdádâ„Z­ej®eddEœdãdä„Z¯ej°eddEœdådæ„Z±ej²eddEœdçdè„Z³ej´eddEœdédê„ZµdS)÷r#NFTr)r=rJrKrLrMrNr"cCs²|dkrtƒ}||_||_||_||_d|_||_d|_|rFt|ƒ|_i|_ i|_ d|_ d|_ d|_ i|_i|_g|_d|_d|_d|_d|_d|_d|_g|_g|_dg|_dS)NFrr TÚcontext)rr=rJrKrLZcreated_block_contextrMr*rÚimport_aliasesÚblocksÚextends_so_farÚhas_known_extendsÚ code_linenor rŸÚ debug_infoÚ_write_debug_infoÚ _new_linesÚ _last_lineÚ _first_writeÚ_last_identifierÚ _indentationÚ _assign_stackÚ_param_def_blockÚ_context_reference_stack)r%r=rJrKrLrMrNr/r/r0r{-s8  zCodeGenerator.__init__rŽcCs |jdk Sr))r*r¡r/r/r0rNvszCodeGenerator.optimizedz te.NoReturn)ÚmsgÚlinenor"cCst|||j|jƒ‚dS)z*Fail with a :exc:`TemplateAssertionError`.N)r rJrK)r%rÁrÂr/r/r0Úfail|szCodeGenerator.failcCs|jd7_d|j›S)zGet a new unique identifier.r Zt_)r¼r¡r/r/r0Útemporary_identifier€sz"CodeGenerator.temporary_identifier)r'r"cCs | ¡|_| |j›d¡dS)z7Enable buffering for the frame from that point onwards.z = []N)rÄr‡Ú writeline©r%r'r/r/r0r‡…s zCodeGenerator.buffer)r'Úforce_unescapedr"cCs¤|sŒ|jjrl| d¡| ¡| d|j›d¡| ¡| d¡| ¡| d|j›d¡| ¡dS|jjrŒ| d|j›d¡dS| d|j›d¡dS)z(Return the buffer contents of the frame.zif context.eval_ctx.autoescape:zreturn Markup(concat(ú))úelse:zreturn concat(r<N)r+r,rÅÚindentr‡ÚoutdentÚ autoescape)r%r'rÇr/r/r0Úreturn_buffer_contentsŠs  z$CodeGenerator.return_buffer_contentscCs|jd7_dS)zIndent by one.r N©r½r¡r/r/r0rÊžszCodeGenerator.indentr )Ústepr"cCs|j|8_dS)zOutdent by step.NrÎ)r%rÏr/r/r0rË¢szCodeGenerator.outdent)r'r&r"cCs0|jdkr| d|¡n| |j›d|¡dS)z%Yield or write into the frame buffer.Núyield ú.append()r‡rÅ)r%r'r&r/r/r0Ú start_write¦s zCodeGenerator.start_writecCs|jdk r| d¡dS)z1End the writing process started by `start_write`.Nr<)r‡r?rÆr/r/r0Ú end_write­s zCodeGenerator.end_write)Úsr'r&r"cCs$| ||¡| |¡| |¡dS)z4Simple shortcut for start_write + write + end_write.N)rÒr?rÓ)r%rÔr'r&r/r/r0Ú simple_write²s  zCodeGenerator.simple_write)r r'r"cCs>z$| d¡|D]}| ||¡qWntk r8YnXdS)z•Visit a list of nodes as block in a frame. If the current frame is no buffer a dummy ``if 0: yield None`` is written automatically. ÚpassN)rÅr-r°)r%r r'r&r/r/r0Ú blockvisitºs  zCodeGenerator.blockvisit)Úxr"cCs€|jrp|jsR|j d|j¡|j|j7_|jdk rR|j |j|jf¡d|_d|_|j d|j¡d|_|j |¡dS)z&Write a string into the output stream.Ú NFz r) r¹r»rLr?r¶r¸r·Úappendr½)r%rØr/r/r0r?Ås zCodeGenerator.writer)rØr&Úextrar"cCs| ||¡| |¡dS)z!Combination of newline and write.N)Únewliner?)r%rØr&rÛr/r/r0rÅÓs zCodeGenerator.writeline)r&rÛr"cCs:t|jd|ƒ|_|dk r6|j|jkr6|j|_|j|_dS)z/Add one or more newlines before the next write.r N)Úmaxr¹rÂrºr¸)r%r&rÛr/r/r0rÜÚszCodeGenerator.newline)r&r'Ú extra_kwargsr"c Cs²tdd„tdd„|jDƒ|pdƒDƒƒ}|jD]}| d¡| ||¡q.|s |jD]}| d¡| ||¡qT|dk r | ¡D]\}}| d|›d|›¡q€|jr¾| d¡| |j|¡|rŠ|jdk rÚ| d ¡n | d ¡|jD].}| |j ›d ¡| |j |¡| d¡qê|dk rN| ¡D] \}}| |›d |›d¡q,|jdk r~| d ¡| |j|¡| d ¡n | d¡n$|jdk r®| d¡| |j|¡dS)a+Writes a function call to the stream for the current node. A leading comma is added automatically. The extra keyword arguments may not include python keywords otherwise a syntax error could occur. The extra keyword arguments should be given as python dict. css|]}tt t|¡ƒVqdSr))Úis_python_keywordr3r5rf)rYr]r/r/r0r[ïsÿz*CodeGenerator.signature..css|] }|jVqdSr))Úkey©rYrØr/r/r0r[ñsr/r9Nú=z, *z , **dict({z, **{ú: z}, **r<Ú}z, **) Úanyrr(Úargsr?r-rmZdyn_argsZ dyn_kwargsràrV) r%r&r'rÞZkwarg_workaroundÚargÚkwargràrVr/r/r0Ú signatureásFþ                 zCodeGenerator.signature)r r"c Cstƒ}|D]}| |¡q |j|jdf|j|jdffD]Ì\}}}|D]¼}||kr\| ¡||<| d¡| ¡| ||›d|›d|›d¡| ¡| d¡| ¡| d¡| d ||›d ¡| ¡| d |d d …›d|›d¡| ¡| ¡qDq6d S)aæFind all filter and test names used in the template and assign them to variables in the compiled namespace. Checking that the names are registered with the environment is done when compiling the Filter and Test nodes. If the node is in an If or CondExpr node, the check is done at runtime instead. .. versionchanged:: 3.0 Filters and tests in If and CondExpr nodes are checked at runtime instead of compile time. rŸr útry:z = environment.ú[ú]zexcept KeyError:z @internalcodeúdef z (*unused):zraise TemplateRuntimeError("No Néÿÿÿÿú named z found."))ržr-rŸr rÄrÅrÊrË)r%r rDr&Zid_maproÚ dependencyrJr/r/r0Úpull_dependenciess2   ý     ÿzCodeGenerator.pull_dependenciesc Csªg}|jj ¡D]z\}\}}|tkr&q|tkrP| |›d| ¡›d|›d¡q|tkrn| |›d|›¡q|tkr‚|  |¡qt dƒ‚q|r¦| d  |¡›d¡dS)Nú = r:r<zunknown load instructionú = missing) r…ÚloadsrmrrrÅÚget_resolve_funcr rrÚÚNotImplementedErrorÚjoin)r%r'ÚundefsÚtargetÚactionÚparamr/r/r0Ú enter_frameEs"  zCodeGenerator.enter_frame)r'Úwith_python_scoper"cCs>|s:g}|jjD]}| |¡q|r:| d |¡›d¡dS)Nròró)r…rôrÚrÅr÷)r%r'rýrørùr/r/r0Ú leave_frameUs   zCodeGenerator.leave_frameúasync Ú)Ú async_valueÚ sync_valuer"cCs|jjr |S|Sr))r=Úis_async)r%rrr/r/r0Ú choose_async]szCodeGenerator.choose_async)rJr"cCs| ¡›d|›S)Nrí)r)r%rJr/r/r0Úfunc`szCodeGenerator.func)r&r'r"c Csš| ¡}|j |¡t|ƒ}d}tƒ}g}t|jƒD]@\}}|jdkrJ|}|jdkr`| |j¡|  |j  |j¡¡q4t |j dƒ} d| krè|dk rÐz|j |t|jƒWqâtk rÌ| d|j¡YqâXn|  |j d¡¡d|_d| krd|kr|  |j d¡¡d|_d| kr@d|kr@|  |j d¡¡d|_d |_|j |¡| | d ¡›d d  |¡›d |¡| ¡| |¡| |¡| |¡t|jƒD]°\}}|j  |j¡} | d| ›d¡| ¡z|j |t|jƒ} Wn6tk r$| | ›d|j›d|j›d¡YnX| | ›d¡| | |¡| | ¡|  ¡q¦| !¡| "|j |¡|j#|dd|j$|dd|  ¡||fS)z/Dump the function def of a macro or call block.NÚcaller)r(Úvarargs)rr(rzhWhen defining macros or call blocks the special "caller" argument must be omitted or be given a default.Tr(rFÚmacror:r9ú):úif ú is missing:z = undefined("parameter z was not provided", name=r<rò)rÇ©rý)%r˜r…Ú analyze_nodertriÚ enumeraterærJr£rÚÚrefrsÚbodyÚdefaultsÚlenÚ IndexErrorrÃrÂÚdeclare_parameterrwrxryr†rÅrr÷rÊr‡rüÚpush_parameter_definitionsr-Úmark_parameter_storedrËÚpop_parameter_definitionsr×rÍrþ) r%r&r'Ú macro_refZexplicit_callerZskip_special_paramsræÚidxrçrrrÚdefaultr/r/r0Ú macro_bodycsr     ü  $   ÿ    zCodeGenerator.macro_body)rr'r"c Csrd dd„|jjDƒ¡}t|jddƒ}t|jjƒdkr>|d7}| d|›d |›d |j›d|j›d|j›d ¡dS) z.rJNr ú,zMacro(environment, macro, z, (z), z, context.eval_ctx.autoescape)) r÷r&ræÚgetattrrr?rxryrw)r%rr'Z arg_tuplerJr/r/r0Ú macro_def¶s(ÿzCodeGenerator.macro_defrucCs*d|j›}|jdk r&|›d|j›}|S)z.Return a human readable position for the node.zline Nú in )rÂrJ)r%r&r–r/r/r0ÚpositionÂs  zCodeGenerator.positioncCs*d dd„|j ¡ ¡Dƒ¡}d|›dS)Nr9css |]\}}|›d|›VqdS©rãNr/)rYrJrùr/r/r0r[Êsÿz3CodeGenerator.dump_local_context..Ú{rä)r÷r…Z dump_storesrm)r%r'Zitems_kvr/r/r0Údump_local_contextÉs  þz CodeGenerator.dump_local_contextcCs,| d¡| d¡| d¡| d¡dS)z·Writes a common preamble that is used by root and block functions. Primarily this sets up common local helpers and enforces a generator through a dead branch. z$resolve = context.resolve_or_missingz!undefined = environment.undefinedzcond_expr_undefined = Undefinedzif 0: yield NoneN©rÅr¡r/r/r0Ú write_commonsÐs   zCodeGenerator.write_commonscCs|j |j ¡¡dS)aQPushes all parameter targets from the given frame into a local stack that permits tracking of yet to be assigned parameters. In particular this enables the optimization from `visit_Name` to skip undefined expressions for parameters in macros as macros can reference otherwise unbound parameters. N)r¿rÚr…Zdump_param_targetsrÆr/r/r0rÜsz(CodeGenerator.push_parameter_definitionscCs|j ¡dS)z+Pops the current parameter definitions set.N)r¿Úpopr¡r/r/r0råsz'CodeGenerator.pop_parameter_definitions)rùr"cCs|jr|jd |¡dS)z€Marks a parameter in the current parameter definitions as stored. This will skip the enforced undefined checks. rîN)r¿r¬©r%rùr/r/r0rész#CodeGenerator.mark_parameter_storedcCs|j |¡dSr))rÀrÚr(r/r/r0Úpush_context_referenceðsz$CodeGenerator.push_context_referencecCs|j ¡dSr))rÀr'r¡r/r/r0Úpop_context_referenceósz#CodeGenerator.pop_context_referencecCs |jdS)Nrî©rÀr¡r/r/r0Úget_context_reföszCodeGenerator.get_context_refcCs |jd}|dkrdS|›dS)Nrîr±Úresolvez.resolver+r(r/r/r0rõùs zCodeGenerator.get_resolve_funccCs| ¡›d| |¡›dS)Nz .derived(r<)r,r$rÆr/r/r0Úderive_contextÿszCodeGenerator.derive_contextcCs|js dS||jdkS)z4Checks if a given target is an undeclared parameter.Frî)r¿r(r/r/r0Úparameter_is_undeclaredsz%CodeGenerator.parameter_is_undeclaredcCs|j tƒ¡dS)z+Pushes a new layer for assignment tracking.N)r¾rÚrir¡r/r/r0Úpush_assign_trackingsz"CodeGenerator.push_assign_trackingcCsˆ|j ¡}|js|js|jr |s$dSdd„|Dƒ}t|ƒdkr®tt|ƒƒ}|j  |¡}|jrv|  d|›d|›¡dS|jr–|  d|›d|›¡dS|  d|›d|›¡nx|jrÀ|  d ¡n|jrÒ|  d ¡n |  d ¡t |ƒD]6\}}|rú|  d ¡|j  |¡}|  |›d |›¡qä|  d¡|js„|js„|r„t|ƒdkrb|  d|d›d¡n"d   tt|ƒ¡}|  d|›d¡dS)zoPops the topmost level for assignment tracking and updates the context variables if necessary. NcSs g|]}|dd…dkr|‘qS)Nr Ú_r/rár/r/r0Ú sz5CodeGenerator.pop_assign_tracking..r z _loop_vars[ú] = z _block_vars[ú context.vars[z_loop_vars.update({z_block_vars.update({úcontext.vars.update({r9rãú})úcontext.exported_vars.add(rr<zcontext.exported_vars.update((rÈ)r¾r'rŒr‹r‰rÚnextÚiterr…rrÅrr?r÷Úmapr)r%r'ÚvarsZ public_namesrJrrÚ names_strr/r/r0Úpop_assign_tracking sJ ÿþýü         z!CodeGenerator.pop_assign_trackingc Cs|dkstdƒ‚t|j|jƒ}ddlm}m}|jjrDt||ƒ}nt|ƒ}|  d¡|  dd  |¡¡|j rtdnd}|  t j¡dk }| t j¡D]4} | j|jkr¼| d | j›d | j¡| |j| j<q”| t j¡D]v} | j|jkrÖ| j} | ¡|j| <} d | kr6|  d d¡\} }|  d | ›d |›d| ›¡qÖ|  d| ›d| ›¡qÖ|  d|j›¡|j | d¡›d|›ddd| ¡| ¡t|ƒ}dt|jdƒkrÆ|j  d¡}|  |›d¡|j !|¡d|_"|_#|oê|j$ |_%|rþ|  d¡| &|¡| '|j¡| (|j|¡|j)|dd| *¡|r¬|j$sX| ¡|  d¡| ¡|jjsv|  d¡n$|  d¡| ¡|  d¡| *¡| *d|j$ ¡|j +¡D]\}} |  | d|¡›d|›d| d¡| ¡| ¡t|ƒ}d|_,t| jd ƒ}d|kr4|j  d¡}|  |›d¡d!|krf|j  d!¡}|  |›d"|›d#|›d$¡|j !| ¡||_-|  d%¡| &|¡| '| j¡| (| j|¡|j)|dd| *¡q¶d  d&d'„|jDƒ¡}|j d(|›d)ddd*  d+d'„|j.Dƒ¡}|  d,|›¡dS)-Nzno root frame allowedr )ÚexportedÚasync_exportedz%from __future__ import generator_stopzfrom jinja2.runtime import r9rz, environment=environmentzblock z defined twiceÚ.zfrom z import z as zimport zname = Úrootz(context, missing=missingr )rÛr%r¡z = TemplateReference(context)Tzparent_template = Noner úif parent_template is not None:z4yield from parent_template.root_render_func(context)z=async for event in parent_template.root_render_func(context):z yield eventZblock_)r%ÚsuperrCz = context.super(z, block_r<z_block_vars = {}css|]}|›d|›VqdS)z: block_Nr/rár/r/r0r[«sz/CodeGenerator.visit_Template..z blocks = {räú&css |]\}}|›d|›VqdS)râNr/r\r/r/r0r[­sz debug_info = )/ÚAssertionErrorrr=rJZruntimer>r?rÚsortedrÅr÷rMÚfindr ÚExtendsÚfind_allr©r³rÃrÂÚ ImportedNameÚ importnamer²rÄÚrsplitrrÊr&r$rsrr…rr r‰rŠrµr†rürñr×rþrËrmrŒrˆr·)r%r&r'r+r>r?Zexported_namesZenvenvZ have_extendsrˆÚimport_ÚimpÚaliasÚmoduleÚobjrrJrŒrrZ blocks_kv_strZ debug_kv_strr/r/r0Úvisit_Template9s¬    ÿ         ÿ ý          zCodeGenerator.visit_TemplatecCsd}|jr8|jrdS|jdkr8| d¡| ¡|d7}|jrJ| |¡}n| ¡}|jr”| d|j ›d|¡| ¡| d|j ›d|¡|  ¡|j j sÄ|j dkrÄ| d |j ›d |›d |¡n@| | ¡›d |j ›d |›d |¡| ¡| d|¡|  ¡|  |¡dS)z.Call a block and register it for the template.rNúif parent_template is None:r zif len(context.blocks[z]) <= 1:z+raise TemplateRuntimeError("Required block z not found")zyield from context.blocks[z][0](r<zfor event in context.blocks[r Úevent)r‰rµr´rÅrÊÚscopedr.r,ÚrequiredrJrËr=rr‡rrÕ)r%r&r'rƒr±r/r/r0r¦°s@    þÿý zCodeGenerator.visit_BlockcCsÆ|js| d|j¡|jdkrV|js6| d¡| ¡| d¡|jrNtƒ‚n| ¡| d|¡|  |j |¡|  d|j ›d¡| d¡| ¡| d ¡| ¡|j r´d |_|jd 7_d S) zCalls the extender.z,cannot use extend from a non top-level scoperrBz5raise TemplateRuntimeError("extended multiple times")z+parent_template = environment.get_template(r9r<z9for name, parent_block in parent_template.blocks.items():z8context.blocks.setdefault(name, []).append(parent_block)Tr N)r‰rÃrÂr´rµrÅrÊr°rËr-Útemplater?rJrŠrBr/r/r0Ú visit_ExtendsÛs(      zCodeGenerator.visit_ExtendscCsp|jr| d¡| ¡d}t|jtjƒrVt|jjtƒr>d}qnt|jjt t fƒrnd}nt|jtj tj fƒrnd}| d|›d|¡|  |j|¡| d|j›d¡|jrè| ¡| d ¡| ¡| d ¡| ¡| d ¡| ¡d }|jr| | ¡›d | |¡›d¡n$|jjr,| d¡n| d¡d}|s\| ¡| d|¡| ¡|jrl| ¡dS)zHandles includes.rêZget_or_select_templateZ get_templateZselect_templateztemplate = environment.r:r9r<zexcept TemplateNotFound:rÖrÉFzUfor event in template.root_render_func(template.new_context(context.get_all(), True, z)):zGfor event in (await template._get_default_module_async())._body_stream:z6yield from template._get_default_module()._body_streamTrTN)Zignore_missingrÅrÊrOrWr ÚConstrVrfrgrhÚTupleÚListr-r?rJrËÚ with_contextrr$r=rrÕ)r%r&r'Ú func_nameZskip_event_yieldr/r/r0Ú visit_IncludesN    ÿ ÿ  zCodeGenerator.visit_IncludecCsŽ| | d¡›d¡| |j|¡| d|j›d¡|jrld| d¡›}| |›d| |¡›d¡n|jjr€| d ¡n | d ¡dS) Núawait zenvironment.get_template(r9z).Z make_moduleZ_asyncz(context.get_all(), True, r<z_get_default_module_async()z_get_default_module(context)) r?rr-rWrJr\r$r=r)r%r&r'Úf_namer/r/r0Ú_import_common9sÿ zCodeGenerator._import_commoncCsl| |j |j¡›d|¡|jr6| d|j›d¡| ||¡|jrh|j d¡sh| d|j›d¡dS)zVisit regular imports.ròr4r3r1úcontext.exported_vars.discard(r<N)rÅr…rrùr‰r?raÚ startswithrBr/r/r0Ú visit_ImportJs  zCodeGenerator.visit_Importc sª| |¡| d¡| |ˆ¡g}g}|jD]Â}t|tƒrF|\}}n|}| ˆj |¡›d|›d¡| dˆj |¡›d¡|  ¡d|  |¡›d|›}| ˆj |¡›d|›d |›d ¡|  ¡ˆj r.|  |¡| d ¡s.|  |¡q.|rXt|ƒd kr.|d }| d|›dˆj |¡›¡n*d ‡fdd„|Dƒ¡}| d|›d¡|r¦t|ƒd kr„| d|d ›d ¡n"d tt|ƒ¡} | d| ›d¡dS)zVisit named imports.zincluded_template = z = getattr(included_template, z , missing)r r z9the template {included_template.__name__!r} (imported on z%) does not export the requested name z = undefined(fz, name=r<r1r rr4r3r9c3s$|]}|›dˆj |¡›VqdSr")r…r)rYrJ©r'r/r0r[zsz1CodeGenerator.visit_FromImport..r5r6rbz)context.exported_vars.difference_update((rÈN)rÜr?rarorOrgrÅr…rrÊr!rËr‰rÚrcrr÷r:r) r%r&r'Z var_namesZdiscarded_namesrJrOÚmessageZnames_kvr<r/rer0Úvisit_FromImportUsN      ÿÿÿ    ÿ ÿzCodeGenerator.visit_FromImportc Csd| ¡}d|_| ¡}| ¡}|jpRdt|jdddƒkpRtdd„| tj¡Dƒƒ}d}|rh|j   d¡}|j j |dd |j rŽ|j j |d d |j r†| ¡}|j j |d d | | |¡›d |j ¡| ¡| |¡| | d d¡¡| |j|¡| d¡| | dd¡¡| d¡| ¡| d|j ¡| |j |¡| d¡| ¡| d¡| |j|¡| d¡|j|dd|jrÀ| | d¡›d|¡| ¡| |¡|j|_|rÖ| |›d¡| tj¡D],} | jdkrâ| jdkrâ| d| j¡qâ|j r0| ¡} | | ›d¡| | d d¡|¡| |j|¡|rx| d|›d| d¡›d¡n | d¡|j rš| |›d¡|jr®| d ¡nB|jj rÈ|sÈ| d!¡| |j!|¡|jj rð|sð| d"¡|j r| d"¡|jr| d#¡n| |r$d$nd¡| ¡| |¡| d%¡| "|j#|¡|j rl| | ›d&¡| ¡|j||joˆ|j d|j rÚ| d| ›d¡| ¡| |¡| "|j |¡| |¡| ¡|jr`| $|¡| ¡| %||¡| | d'¡›d(¡|jj r*| d!¡| |j!|¡|jj rL| d"¡| d)¡| &|¡dS)*NTÚloop)r)Úonly)rhcss|] }|jVqdSr))rU)rYrˆr/r/r0r[”sz*CodeGenerator.visit_For..r)Z for_branchÚelseÚtestz(fiter):z async for zfor r zauto_aiter(fiter)Zfiterú:r rÐér z%(reciter, loop_render_func, depth=0):róÚstorez8Can't assign to special loop variable in for-loop targetz = 1r9ZAsyncz LoopContext(r:Zreciterz auto_aiter(r<z&, undefined, loop_render_func, depth):z , undefined):z_loop_vars = {}z = 0r_zloop(z, loop))'r˜r‹Ú recursiversZiter_child_nodesrårIr r©r…rr Úelse_rkrÄrÅrrÊrürr-rùr?rËrþr‡r¯r«rJrÃrÂr=rr9r×rrÍrÒrÓ) r%r&r'r‹Z test_frameZ else_frameZ extended_loopZloop_refZloop_filter_funcrJZiteration_indicatorr/r/r0Ú visit_For‡sÒÿÿü       ÿ þ         ÿ         zCodeGenerator.visit_ForcCsÊ| ¡}| d|¡| |j|¡| d¡| ¡| |j|¡| ¡|j D]F}| d|¡| |j|¡| d¡| ¡| |j|¡| ¡qP|j rÆ| d¡| ¡| |j |¡| ¡dS)Nr rlzelif rÉ) r™rÅr-rkr?rÊr×rrËÚelif_rp)r%r&r'Zif_framerrr/r/r0Úvisit_If s&       zCodeGenerator.visit_IfcCs|| ||¡\}}| ¡|jrR|j d¡s>| d|j›d¡| d|j›d¡| |j |j¡›d¡|  ||¡dS)Nr1r7r<r4r3rò) rrÜr‰rJrcr?rÅr…rr)r%r&r'Z macro_framerr/r/r0Ú visit_Macro"s zCodeGenerator.visit_MacrocCsR| ||¡\}}| d¡| ||¡| ||¡|j|j|dd| |¡dS)Nz caller = T)Úforward_caller)rrÅrrÒÚ visit_CallÚcallrÓ)r%r&r'Z call_framerr/r/r0Úvisit_CallBlock,s    zCodeGenerator.visit_CallBlockcCsh| ¡}|j |¡| |¡| |¡| |j|¡| ||¡| |j |¡|  |¡|  |¡dSr)) r˜r…r rür‡r×rrÒr¤ÚfilterrÓrþ)r%r&r'Z filter_framer/r/r0Úvisit_FilterBlock4s     zCodeGenerator.visit_FilterBlockcCs|| ¡}|j |¡| |¡t|j|jƒD]2\}}| ¡| ||¡|  d¡| ||¡q,|  |j |¡|  |¡dS©Nrò) r˜r…r rüÚzipÚtargetsÚvaluesrÜr-r?r×rrþ)r%r&r'Z with_framerùÚexprr/r/r0Ú visit_With?s    zCodeGenerator.visit_WithcCs| |¡| |j|¡dSr))rÜr-r&rBr/r/r0Úvisit_ExprStmtKs zCodeGenerator.visit_ExprStmtc@s4eZdZUejejdefed<ejeed<dS)zCodeGenerator._FinalizeInfo.ÚconstÚsrcN)r|r}r~r3r›ÚCallablerfÚ__annotations__r/r/r/r0Ú _FinalizeInfoOs r†rUcCst|ƒS)z¼The default finalize function if the environment isn't configured with one. Or, if the environment has one, this is called on that function's output for constants. )rfrnr/r/r0Ú_default_finalizeSszCodeGenerator._default_finalizeÚ _finalizecsˆjdk rˆjSˆj}‰d}ˆjjr®d}ˆjj‰tjdtjdtjdi t ˆ¡¡}d}|dkr|t j t j dœ‡‡fdd„ }n2|›|›d }|dkr®t j t j dœ‡‡‡fd d„ }ˆ  ||¡ˆ_ˆjS) a‰Build the finalize function to be used on constants and at runtime. Cached so it's only created once for all output nodes. Returns a ``namedtuple`` with the following attributes: ``const`` A function to finalize constant data at compile time. ``src`` Source code to output around nodes to be evaluated at runtime. Nzenvironment.finalize(r±úcontext.eval_ctxr=rUcs ˆˆ|ƒƒSr)r/rn)rÚ env_finalizer/r0Úfinalizesz.CodeGenerator._make_finalize..finalizer9csˆˆˆj|ƒƒSr))r=rn©rrŠr%r/r0r‹‡s) rˆr‡r=r‹rr±Ú eval_contextÚgetÚfrom_objr3r4r†)r%r‹rƒÚpass_argr/rŒr0Ú_make_finalize]s0  ýûzCodeGenerator._make_finalize)Úgroupr"cCs tt|ƒƒS)z™Given a group of constant values converted from ``Output`` child nodes, produce a string to write to the template module source. )rr)r%r’r/r/r0Ú_output_const_reprsz CodeGenerator._output_const_repr)r&r'r‹r"cCs:| |j¡}|jjrt|ƒ}t|tjƒr0t|ƒS| |¡S)aCTry to optimize a child of an ``Output`` node by trying to convert it to constant, finalized data at compile time. If :exc:`Impossible` is raised, the node is not constant and will be evaluated at runtime. Any other exception will also be evaluated at runtime for easier debugging. ) Úas_constr+rÌrrOr Ú TemplateDatarfr‚)r%r&r'r‹r‚r/r/r0Ú_output_child_to_const”s  z$CodeGenerator._output_child_to_constcCsL|jjr| d¡n|jjr(| d¡n | d¡|jdk rH| |j¡dS)zXOutput extra source code before visiting a child of an ``Output`` node. z1(escape if context.eval_ctx.autoescape else str)(zescape(zstr(N)r+r,r?rÌrƒ©r%r&r'r‹r/r/r0Ú_output_child_pre©s    zCodeGenerator._output_child_precCs"| d¡|jdk r| d¡dS)zWOutput extra source code after visiting a child of an ``Output`` node. r<N)r?rƒr—r/r/r0Ú_output_child_post¹s  z CodeGenerator._output_child_postc Csø|jr"|jrdS| d¡| ¡| ¡}g}|jD]ˆ}z,|jsTt|tjƒsTt  ¡‚|  |||¡}Wn(tj t fk rŒ|  |¡Yq4YnX|r°t|dt ƒr°|d  |¡q4|  |g¡q4|jdk rt|ƒdkrê| |j›d¡n| |j›d¡| ¡|D]ª}t|t ƒrN| |¡}|jdkr>| d|¡n| |d¡nb|jdkrh| d|¡n | |¡| |||¡| ||¡| |||¡|jdk r| d¡q|jdk rä| ¡| t|ƒdkrÞdnd ¡|jrô| ¡dS) NrSrîr rÑz .extend((rÐrr<rÈ)r†rµrÅrÊr‘r r‚rOr•Ú Impossibler–Ú ExceptionrÚrhr‡rr“rÜr˜r-r™r?rË) r%r&r'r‹rÚchildr‚ÚitemÚvalr/r/r0Ú visit_OutputÄsZ  ý ú            zCodeGenerator.visit_OutputcCsF| ¡| |¡| |j|¡| d¡| |j|¡| |¡dSr{)r0rÜr-rùr?r&r=rBr/r/r0Ú visit_Assigns   zCodeGenerator.visit_AssigncCs¶| ¡| ¡}d|_|j |¡| |¡| |¡| |j|¡|  |¡|  |j |¡|  d¡|j dk r€| |j |¡n|  d|j›d¡|  d¡| |¡| |¡dS)NFz9 = (Markup if context.eval_ctx.autoescape else identity)(úconcat(r<)r0r˜r†r…r rür‡r×rrÜr-rùr?ryr¤r=rþ)r%r&r'rŒr/r/r0Úvisit_AssignBlocks         zCodeGenerator.visit_AssignBlockc Cs¨|jdkr4|js|js|jr4|jr4|jd |j¡|j |j¡}|jdkrš|j  |¡}|dk rv|dt krv|  |¡rš|  d|j›d|›d|›d¡dS|  |¡dS) Nrnrîrªrz(undefined(name=z) if z is missing else r<) r«r‰r‹rŒr¾r£rJr…rZ find_loadrr/r?)r%r&r'rrªr/r/r0r­3s. ÿÿÿ  ÿ þýÿzCodeGenerator.visit_NamecCsV|j |j¡}| d|›d¡| ¡| d¡| ¡| |›d|j›d¡dS)Nzif not isinstance(z , Namespace):zMraise TemplateRuntimeError("cannot assign attribute on non-namespace object")rërì)r…rrJrÅrÊrËÚattr)r%r&r'rr/r/r0Ú visit_NSRefLsÿzCodeGenerator.visit_NSRefcCs8| |j¡}t|tƒr&| t|ƒ¡n| t|ƒ¡dSr))r”r+rOrcr?rfr)r%r&r'ržr/r/r0Ú visit_ConstZs  zCodeGenerator.visit_ConstcCsJz| t| |j¡ƒ¡Wn*tjk rD| d|j›d¡YnXdS©Nz6(Markup if context.eval_ctx.autoescape else identity)(r<)r?rr”r+r ršÚdatarBr/r/r0Úvisit_TemplateDataas  ÿz CodeGenerator.visit_TemplateDatacCsV| d¡d}t|jƒD]"\}}|r.| d¡| ||¡q| |dkrLdnd¡dS)Nr:rîr9rz,)r<©r?rrmr-©r%r&r'rrr/r/r0Ú visit_Tupleis  zCodeGenerator.visit_TuplecCsF| d¡t|jƒD]"\}}|r*| d¡| ||¡q| d¡dS)Nrër9rìr©rªr/r/r0Ú visit_Listrs   zCodeGenerator.visit_ListcCs`| d¡t|jƒD]<\}}|r*| d¡| |j|¡| d¡| |j|¡q| d¡dS)Nr#r9rãrä)r?rrmr-ràrVrªr/r/r0Ú visit_Dictzs   zCodeGenerator.visit_Dictú+ú-Ú*ú/z//z**ú%ÚandÚorznot cCs`|jjrd}n|jjrd}nd}| |›d¡|jD]}| ||¡| d¡q6| d¡dS)Nz8(markup_join if context.eval_ctx.volatile else str_join)Z markup_joinZstr_joinz((r9rÈ)r+r,rÌr?r r-)r%r&r'r]rçr/r/r0Ú visit_Concat‘s   zCodeGenerator.visit_ConcatcCs>| d¡| |j|¡|jD]}| ||¡q| d¡dS)Nr:r<)r?r-rÚops)r%r&r'r7r/r/r0Ú visit_CompareŸs   zCodeGenerator.visit_ComparecCs*| dt|j›d¡| |j|¡dS)Nr;)r?Ú operatorsr7r-rrBr/r/r0Ú visit_Operand§szCodeGenerator.visit_OperandcCsT|jjr| d¡| d¡| |j|¡| d|j›d¡|jjrP| d¡dS)Nú(await auto_await(zenvironment.getattr(r9r<rÈ)r=rr?r-r&r£rBr/r/r0Ú visit_Getattr«s  zCodeGenerator.visit_GetattrcCs¢t|jtjƒr@| |j|¡| d¡| |j|¡| d¡n^|jjrR| d¡| d¡| |j|¡| d¡| |j|¡| d¡|jjrž| d¡dS)Nrërìrºzenvironment.getitem(r9r<rÈ) rOrçr ÚSlicer-r&r?r=rrBr/r/r0Ú visit_Getitem·s      zCodeGenerator.visit_GetitemcCs`|jdk r| |j|¡| d¡|jdk r:| |j|¡|jdk r\| d¡| |j|¡dS)Nrl)Ústartr-r?ÚstoprÏrBr/r/r0Ú visit_SliceÌs     zCodeGenerator.visit_Slice)r&r'Ú is_filterr"ccs|jjr| d¡|r@| |j|j›d¡|jj |j¡}n(| |j|j›d¡|jj |j¡}|dkr |js |r~dnd}| d|›d|j›d|j ¡t j dt j d t jd i t   |¡¡}|dk rÚ| |›d ¡dV| ||¡| d ¡|jjr | d ¡dS) Núawait auto_await(r:ryrkzNo rïr@r±r‰r=r9r<)r=rr?rŸrJrŽr rrÃrÂrr±rrré)r%r&r'rÁrZ type_namerr/r/r0Ú_filter_test_commonÖs4  ýû   z!CodeGenerator._filter_test_commonc Cs| ||d¡x|jdk r*| |j|¡nX|jjrP| d|j›d|j›d¡n2|jjrn| d|j›d¡n| d|j›d¡W5QRXdS)NTz(Markup(concat(z.)) if context.eval_ctx.autoescape else concat(rÈzMarkup(concat(r¡r<)rÃr&r-r+r,r?r‡rÌrBr/r/r0r¤s ÿzCodeGenerator.visit_Filterc Cs,| ||d¡| |j|¡W5QRXdSrv)rÃr-r&rBr/r/r0r¥szCodeGenerator.visit_Testcslˆ ¡‰ddœ‡‡‡fdd„ }ˆ d¡ˆ ˆjˆ¡ˆ d¡ˆ ˆjˆ¡ˆ d¡|ƒˆ d¡dS)NrŽcs8ˆjdk rˆ ˆjˆ¡dSˆ dˆ ˆ¡›d¡dS)Nz1cond_expr_undefined("the inline if-expression on z6 evaluated to false and no else section was defined."))Zexpr2r-r?r!r/©r'r&r%r/r0Ú write_expr2s  ÿz1CodeGenerator.visit_CondExpr..write_expr2r:z if z else r<)r™r?r-Úexpr1rk)r%r&r'rÅr/rÄr0Úvisit_CondExprs   zCodeGenerator.visit_CondExpr)r&r'rur"cCsÈ|jjr| d¡|jjr&| d¡n | d¡| |j|¡|rJddind}|jr\ddini}|jrnddini}|r†|j|f|Žn|sŽ|ršt |f|Ž}|  |||¡| d¡|jjrÄ| d¡dS)NrÂzenvironment.call(context, z context.call(rZ _loop_varsZ _block_varsr<) r=rr?r>r-r&r‹rŒr“rlré)r%r&r'rurÞZ loop_kwargsZ block_kwargsr/r/r0rv-s"     zCodeGenerator.visit_CallcCs"| |jd¡| |j|¡dS)Nrâ)r?ràr-rVrBr/r/r0Ú visit_KeywordDszCodeGenerator.visit_KeywordcCs&| d¡| |j|¡| d¡dS)NzMarkup(r<©r?r-rrBr/r/r0Úvisit_MarkSafeJs zCodeGenerator.visit_MarkSafecCs&| d¡| |j|¡| d¡dSr¦rÉrBr/r/r0Úvisit_MarkSafeIfAutoescapeOs z(CodeGenerator.visit_MarkSafeIfAutoescapecCs| d|j¡dS)Nz environment.©r?rJrBr/r/r0Úvisit_EnvironmentAttributeVsz(CodeGenerator.visit_EnvironmentAttributecCs| d|j›d|j›¡dS)Nzenvironment.extensions[z].)r?Ú identifierrJrBr/r/r0Úvisit_ExtensionAttribute[sz&CodeGenerator.visit_ExtensionAttributecCs| |j|j¡dSr))r?r²rKrBr/r/r0Úvisit_ImportedName`sz CodeGenerator.visit_ImportedNamecCs| |j¡dSr)rÌrBr/r/r0Úvisit_InternalNamecsz CodeGenerator.visit_InternalNamecCs| d¡dS)Nr±)r?rBr/r/r0Úvisit_ContextReferencefsz$CodeGenerator.visit_ContextReferencecCs| | |¡¡dSr))r?r.rBr/r/r0Úvisit_DerivedContextReferenceksz+CodeGenerator.visit_DerivedContextReferencecCs| d|¡dS)NÚcontinuer%rBr/r/r0Úvisit_ContinuepszCodeGenerator.visit_ContinuecCs| d|¡dS)NÚbreakr%rBr/r/r0Ú visit_BreaksszCodeGenerator.visit_BreakcCs:| ¡}|j |¡| |¡| |j|¡| |¡dSr))r˜r…r rür×rrþ)r%r&r'Ú scope_framer/r/r0Ú visit_Scopevs   zCodeGenerator.visit_ScopecCs| ¡}| |›d| |¡›¡| |›d¡| |j|¡| |¡|jdd}|j |¡|  |¡|  |j |¡|  |¡|  ¡dS)Nròz.vars = T)r—)rÄrÅr.r-r±r)r˜r…r rür×rrþr*)r%r&r'r«rØr/r/r0Úvisit_OverlayScope}s     z CodeGenerator.visit_OverlayScopec Cst|jD]h}| d|j›d¡| |j|¡z|j |j¡}Wntjk r\d|j_ YqXt |j|j|ƒqdS)Nzcontext.eval_ctx.ròT) ÚoptionsrÅràr-rVr”r+r ršr,Úsetattr)r%r&r'Úkeywordržr/r/r0Úvisit_EvalContextModifier‹s z'CodeGenerator.visit_EvalContextModifiercCsh| ¡}|j ¡}| |›d¡| ||¡|jD]}| ||¡q4|j |¡| d|›d¡dS)Nz = context.eval_ctx.save()zcontext.eval_ctx.revert(r<)rÄr+ÚsaverÅrÞrr-Úrevert)r%r&r'Z old_ctx_nameZ saved_ctxrœr/r/r0Úvisit_ScopedEvalContextModifier˜s    z-CodeGenerator.visit_ScopedEvalContextModifier)NFT)F)r )N)N)Nr)Nr)N)F)rÿr)N)F)¶r|r}r~r3r›rfÚTextIOrar{ÚpropertyrNrbrÃrÄr$r‡rÍrÊrËr ÚNoderÒrÓrÕr®r×r?rÅrÜrZCallr§r¨ÚMappingr4rérñrürþrrr€rrZrtrrr!r$r&rrrr)r*r,rõr.r/r0r=rPrRr©r¦rHrXÚIncluder^ZImportZ FromImportrardrgZForrqZIfrsrtrxZ FilterBlockrzZWithr€ZExprStmtrÚ NamedTupler†Ú staticmethodr‡rˆr…r‘r“r2r–r˜r™ZOutputrŸZAssignr Z AssignBlockr¢r¯r­ZNSRefr¤rYr¥r•r¨r«r[r¬ÚDictr­rGZ visit_AddZ visit_SubZ visit_MulZ visit_DivZvisit_FloorDivZ visit_PowZ visit_ModZ visit_AndZvisit_OrrIZ visit_PosZ visit_NegZ visit_Notr6ZConcatrµZComparer·ZOperandr¹ZGetattrr»ZGetitemr½r¼rÀrÚIteratorrÃr¤r¥ZCondExprrÇrvÚKeywordrÈZMarkSaferÊZMarkSafeIfAutoescaperËZEnvironmentAttributerÍZExtensionAttributerÏrJrÐZ InternalNamerÑZContextReferencerÒZDerivedContextReferencerÓÚContinuerÕZBreakr×ZScoperÙZ OverlayScoperÚZEvalContextModifierrÞZScopedEvalContextModifierrár/r/r/r0r#,s  ù ø Iÿþ ÿ þ  ÿ þ  üû 9+ þ S   .ÿþ w++4þ  2   0þ þ þ O     þ)ÿþþ þ þ þ þ þ þ)NFT)FršÚtypingr3Ú contextlibrÚ functoolsrÚiorÚ itertoolsrrÝrrßZ markupsaferrrr Ú exceptionsr Z idtrackingr r rrrrr*rÚutilsrrrDrÚ TYPE_CHECKINGZtyping_extensionsÚter=rÚTypeVarr„r4rr¸r6rfrErGrHrIrPr›rârarTrXr®räÚSetrsrtr$Ú RuntimeErrorrqržrpr›r°r#r/r/r/r0Ús~                    ø "þ ù ø  þ S