o
    Óó·iÖw  ã                   @   sÐ  d Z ddlZddlZddlZddlmZ ddlmZ ddlm	Z	m
Z
mZmZmZmZmZmZmZmZmZ ddlmZmZ ddlmZ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"m#Z# ddl$m%Z% ddl&m'Z' ddl(m)Z) ddl*m+Z+m,Z, ddl-m.Z.m/Z/m0Z0 ddl1m2Z2m3Z3m4Z4m5Z5 ddl6m7Z7m8Z8m9Z9 dd„ Z:de;de8de;fdd„Z<G dd„ de)j=ƒZ>G dd„ de)j=ƒZ?G dd „ d e)j=ƒZ@G d!d"„ d"e+ƒZAG d#d$„ d$e+ƒZBG d%d&„ d&e+ƒZCG d'd(„ d(e+ƒZDG d)d*„ d*ƒZEd+ZFG d,d-„ d-ejGejHƒZId.ee	e eJf ded/ fd0d1„ZKee9ƒG d2d3„ d3ƒƒZLG d4d5„ d5e+ƒZMd6d7„ ZNd8ZOeƒ ZPee9ƒG d9d:„ d:ƒƒZQee9ƒG d;d<„ d<ƒƒZRh d=£ZSG d>d?„ d?ƒZTeTƒ ZU	@	dGde8dAe7dBee; dCeee#gdDf  deVf
dEdF„ZWdS )HzG
twisted.web.util and twisted.web.template merged to avoid cyclic deps
é    N)ÚOrderedDict©Úescape)ÚIOÚAnyÚAnyStrÚCallableÚDictÚListÚMappingÚOptionalÚTupleÚUnionÚcast)ÚhandlerÚmake_parser)ÚAttributesNSImplÚLocator)Úimplementer)ÚDeferred)ÚLogger)Úurlpath)ÚFailure)ÚFilePath)ÚfullyQualifiedName)Úresource)ÚElementÚrenderer)ÚFlattenableÚflattenÚflattenString)ÚCDATAÚCommentÚTagÚslot)ÚIRenderableÚIRequestÚITemplateLoaderc                 C   s   dt | ƒ› d�S )aK  
    Wraps <pre> tags around some text and HTML-escape it.

    This is here since once twisted.web.html was deprecated it was hard to
    migrate the html.PRE from current code to twisted.web.template.

    For new code consider using twisted.web.template.

    @return: Escaped text wrapped in <pre> tags.
    @rtype: C{str}
    z<pre>z</pre>Nr   )Útext© r)   ú`C:\Users\psant\Downloads\PAF backend\school\venv\Lib\site-packages\twisted/web/_template_util.pyÚ_PRE,   s   r+   ÚURLÚrequestÚreturnc                 C   sH   t | tƒs	tdƒ‚| dd¡ | | ¡ ddt|  d¡ƒ d¡i }|S )a¿  
    Generate a redirect to the given location.

    @param URL: A L{bytes} giving the location to which to redirect.

    @param request: The request object to use to generate the redirect.
    @type request: L{IRequest<twisted.web.iweb.IRequest>} provider

    @raise TypeError: If the type of C{URL} a L{str} instead of L{bytes}.

    @return: A L{bytes} containing HTML which tries to convince the client
        agent
        to visit the new location even if it doesn't respect the I{FOUND}
        response code.  This is intended to be returned from a render method,
        eg::

            def render_GET(self, request):
                return redirectTo(b"http://example.com/", request)
    zURL must be bytess   Content-Types   text/html; charset=utf-8sÀ   
<html>
    <head>
        <meta http-equiv="refresh" content="0;URL=%(url)s">
    </head>
    <body bgcolor="#FFFFFF" text="#000000">
    <a href="%(url)s">click here</a>
    </body>
</html>
s   urlúutf-8N)Ú
isinstanceÚbytesÚ	TypeErrorZ	setHeaderÚredirectr   ÚdecodeÚencode)r,   r-   Úcontentr)   r)   r*   Ú
redirectTo;   s   


ÿ÷r7   c                       s:   e Zd ZdZdZdef‡ fdd„Zdd„ Zdd	„ Z‡  Z	S )
ÚRedirectz›
    Resource that redirects to a specific URL.

    @ivar url: Redirect target URL to put in the I{Location} response header.
    @type url: L{bytes}
    TÚurlc                    s   t ƒ  ¡  || _d S ©N)ÚsuperÚ__init__r9   )Úselfr9   ©Ú	__class__r)   r*   r<   n   s   

zRedirect.__init__c                 C   s   t | j|ƒS r:   )r7   r9   )r=   r-   r)   r)   r*   Úrenderr   s   zRedirect.renderc                 C   ó   | S r:   r)   ©r=   Únamer-   r)   r)   r*   ÚgetChildu   ó   zRedirect.getChild)
Ú__name__Ú
__module__Ú__qualname__Ú__doc__ÚisLeafr1   r<   r@   rD   Ú__classcell__r)   r)   r>   r*   r8   d   s    r8   c                   @   s&   e Zd ZdZdZdedefdd„ZdS )ÚParentRedirectuÆ  
    Redirect to the nearest directory and strip any query string.

    This generates redirects like::

        /              â†’  /
        /foo           â†’  /
        /foo?bar       â†’  /
        /foo/          â†’  /foo/
        /foo/bar       â†’  /foo/
        /foo/bar?baz   â†’  /foo/

    However, the generated I{Location} header contains an absolute URL rather
    than a path.

    The response is the same regardless of HTTP method.
    é   r-   r.   c                 C   s$   t tj |¡ ¡ ƒ d¡}t||ƒS )zN
        Respond to all requests by redirecting to nearest directory.
        ÚasciiN)Ústrr   ZURLPathZfromRequestÚherer5   r7   )r=   r-   rP   r)   r)   r*   r@   Ž   s   
zParentRedirect.renderN)rF   rG   rH   rI   rJ   r&   r1   r@   r)   r)   r)   r*   rL   y   s    rL   c                   @   s<   e Zd ZdZdZdd„ Zdd„ Zdd„ Zd	d
„ Zdd„ Z	dS )ÚDeferredResourcezT
    I wrap up a Deferred that will eventually result in a Resource
    object.
    rM   c                 C   s   t j | ¡ || _d S r:   )r   ÚResourcer<   Úd)r=   rS   r)   r)   r*   r<   ž   ó   
zDeferredResource.__init__c                 C   rA   r:   r)   rB   r)   r)   r*   rD   ¢   rE   zDeferredResource.getChildc                 C   s*   | j  | j|¡ | j|¡ ddlm} |S )Nr   )ÚNOT_DONE_YET)rS   ZaddCallbackÚ_cbChildÚ
addErrbackÚ_ebChildZtwisted.web.serverrU   )r=   r-   rU   r)   r)   r*   r@   ¥   s   zDeferredResource.renderc                 C   s   |  t ||¡¡ d S r:   )r@   r   ZgetChildForRequest)r=   Úchildr-   r)   r)   r*   rV   «   s   zDeferredResource._cbChildc                 C   s   |  |¡ d S r:   )ZprocessingFailed)r=   Úreasonr-   r)   r)   r*   rX   ®   ó   zDeferredResource._ebChildN)
rF   rG   rH   rI   rJ   r<   rD   r@   rV   rX   r)   r)   r)   r*   rQ   –   s    rQ   c                   @   s0   e Zd ZdZdd„ Zedd„ ƒZedd„ ƒZdS )	Ú_SourceLineElementa  
    L{_SourceLineElement} is an L{IRenderable} which can render a single line of
    source code.

    @ivar number: A C{int} giving the line number of the source code to be
        rendered.
    @ivar source: A C{str} giving the source code to be rendered.
    c                 C   s   t  | |¡ || _|| _d S r:   )r   r<   ÚnumberÚsource)r=   Úloaderr]   r^   r)   r)   r*   r<   ¼   s   
z_SourceLineElement.__init__c                 C   s   || j  dd¡ƒS )zA
        Render the line of source as a child of C{tag}.
        z  u    Â N)r^   Úreplace©r=   r-   Útagr)   r)   r*   Ú
sourceLineÁ   s   z_SourceLineElement.sourceLinec                 C   s   |t | jƒƒS )z>
        Render the line number as a child of C{tag}.
        N)rO   r]   ra   r)   r)   r*   Ú
lineNumberÈ   ó   z_SourceLineElement.lineNumberN)rF   rG   rH   rI   r<   r   rc   rd   r)   r)   r)   r*   r\   ²   s    	
r\   c                   @   s,   e Zd ZdZdd„ Zdd„ Zedd„ ƒZdS )	Ú_SourceFragmentElementa¾  
    L{_SourceFragmentElement} is an L{IRenderable} which can render several lines
    of source code near the line number of a particular frame object.

    @ivar frame: A L{Failure<twisted.python.failure.Failure>}-style frame object
        for which to load a source line to render.  This is really a tuple
        holding some information from a frame object.  See
        L{Failure.frames<twisted.python.failure.Failure>} for specifics.
    c                 C   ó   t  | |¡ || _d S r:   ©r   r<   Úframe©r=   r_   ri   r)   r)   r*   r<   Û   rT   z_SourceFragmentElement.__init__c                 c   sH   � | j d }| j d }t|d |d ƒD ]}|t ||¡ ¡ fV  qdS )a$  
        Find the source line references by C{self.frame} and yield, in source
        line order, it and the previous and following lines.

        @return: A generator which yields two-tuples.  Each tuple gives a source
            line number and the contents of that source line.
        rM   é   N)ri   ÚrangeÚ	linecacheÚgetlineÚrstrip)r=   Úfilenamerd   ZsnipLineNumberr)   r)   r*   Ú_getSourceLinesß   s   €

ÿz&_SourceFragmentElement._getSourceLinesc                 c   s\   � |   ¡ D ]&\}}| ¡ }|| jd krd}nd}t|di d|i¤Žƒ}t|||ƒV  qdS )zý
        Render the source line indicated by C{self.frame} and several
        surrounding lines.  The active line will be given a I{class} of
        C{"snippetHighlightLine"}.  Other lines will be given a I{class} of
        C{"snippetLine"}.
        rk   ZsnippetHighlightLineZsnippetLineÚclassNr)   )rq   Úcloneri   Ú	TagLoaderr\   )r=   r-   rb   rd   rc   ZnewTagZcssClassr_   r)   r)   r*   ÚsourceLinesì   s   €ùz"_SourceFragmentElement.sourceLinesN)rF   rG   rH   rI   r<   rq   r   ru   r)   r)   r)   r*   rf   Ð   s    
rf   c                   @   sH   e Zd ZdZdd„ Zedd„ ƒZedd„ ƒZedd	„ ƒZed
d„ ƒZ	dS )Ú_FrameElementa°  
    L{_FrameElement} is an L{IRenderable} which can render details about one
    frame from a L{Failure<twisted.python.failure.Failure>}.

    @ivar frame: A L{Failure<twisted.python.failure.Failure>}-style frame object
        for which to load a source line to render.  This is really a tuple
        holding some information from a frame object.  See
        L{Failure.frames<twisted.python.failure.Failure>} for specifics.
    c                 C   rg   r:   rh   rj   r)   r)   r*   r<   	  rT   z_FrameElement.__init__c                 C   ó   || j d ƒS )zY
        Render the name of the file this frame references as a child of C{tag}.
        rM   N©ri   ra   r)   r)   r*   rp     re   z_FrameElement.filenamec                 C   s   |t | jd ƒƒS )zc
        Render the source line number this frame references as a child of
        C{tag}.
        rk   N)rO   ri   ra   r)   r)   r*   rd     s   z_FrameElement.lineNumberc                 C   rw   )zV
        Render the function name this frame references as a child of C{tag}.
        r   Nrx   ra   r)   r)   r*   Úfunction  re   z_FrameElement.functionc                 C   s   t t|ƒ| jƒS )zn
        Render the source code surrounding the line this frame references,
        replacing C{tag}.
        N)rf   rt   ri   ra   r)   r)   r*   r^   #  s   z_FrameElement.sourceN)
rF   rG   rH   rI   r<   r   rp   rd   ry   r^   r)   r)   r)   r*   rv   þ   s    



rv   c                   @   s$   e Zd ZdZdd„ Zedd„ ƒZdS )Ú_StackElementzW
    L{_StackElement} renders an L{IRenderable} which can render a list of frames.
    c                 C   rg   r:   )r   r<   ÚstackFrames)r=   r_   r{   r)   r)   r*   r<   1  rT   z_StackElement.__init__c                    s   ‡ fdd„| j D ƒS )zW
        Render the list of frames in this L{_StackElement}, replacing C{tag}.
        c                    s   g | ]}t tˆ  ¡ ƒ|ƒ‘qS r)   )rv   rt   rs   )Ú.0ri   ©rb   r)   r*   Ú
<listcomp>:  s    ÿz(_StackElement.frames.<locals>.<listcomp>N)r{   ra   r)   r}   r*   Úframes5  s   
ÿz_StackElement.framesN)rF   rG   rH   rI   r<   r   r   r)   r)   r)   r*   rz   ,  s
    rz   c                   @   s€   e Zd ZdZdded  fdd„Zddee dee dee fd	d
„Zdee dee ddfdd„Zdee dee fdd„Z	dS )Ú
_NSContextzL
    A mapping from XML namespaces onto their prefixes in the document.
    NÚparentc                 C   s,   || _ |durt|jƒ| _dS ddi| _dS )ze
        Pull out the parent's namespaces, if there's no parent then default to
        XML.
        Nz$http://www.w3.org/XML/1998/namespaceÚxml)r�   r   Únss)r=   r�   r)   r)   r*   r<   D  s   z_NSContext.__init__ÚkrS   r.   c                 C   s   | j  ||¡S )z\
        Get a prefix for a namespace.

        @param d: The default prefix value.
        N)rƒ   Úget)r=   r„   rS   r)   r)   r*   r…   O  s   z_NSContext.getÚvc                 C   s   | j  ||¡ dS )zH
        Proxy through to setting the prefix for the namespace.
        N)rƒ   Ú__setitem__)r=   r„   r†   r)   r)   r*   r‡   W  s   z_NSContext.__setitem__c                 C   s   | j  |¡S )zH
        Proxy through to getting the prefix for the namespace.
        N)rƒ   Ú__getitem__)r=   r„   r)   r)   r*   rˆ   ]  s   z_NSContext.__getitem__r:   )
rF   rG   rH   rI   r   r<   rO   r…   r‡   rˆ   r)   r)   r)   r*   r€   ?  s    $r€   z4http://twistedmatrix.com/ns/twisted.web.template/0.1c                   @   s:  e Zd ZdZdee fdd„Zdeddfdd	„Zd1d
d„Z	d1dd„Z
dededdfdd„Zdee deddfdd„Zdee ddfdd„Zdeeef dee deddfdd„Zdeddfdd„Zd eeef dee ddfd!d"„Zd ed#ed$eddfd%d&„Zd'eddfd(d)„Zd1d*d+„Zd1d,d-„Zd.eddfd/d0„ZdS )2Ú_ToStanzd
    A SAX parser which converts an XML document to the Twisted STAN
    Document Object Model.
    ÚsourceFilenamec                 C   s   || _ tƒ | _d| _dS )zP
        @param sourceFilename: the filename the XML was loaded out of.
        FN)rŠ   r€   Ú	prefixMapÚinCDATA)r=   rŠ   r)   r)   r*   r<   m  s   
z_ToStan.__init__Úlocatorr.   Nc                 C   ó
   || _ dS )zY
        Set the document locator, which knows about line and character numbers.
        N)r�   )r=   r�   r)   r)   r*   ÚsetDocumentLocatoru  s   
z_ToStan.setDocumentLocatorc                 C   s   g | _ | j | _g | _g | _dS )z*
        Initialise the document.
        N)ÚdocumentÚcurrentÚstackÚ
xmlnsAttrs©r=   r)   r)   r*   ÚstartDocument{  s   
z_ToStan.startDocumentc                 C   ó   dS )z!
        Document ended.
        Nr)   r”   r)   r)   r*   ÚendDocument‡  ó    z_ToStan.endDocumentÚtargetÚdatac                 C   r–   )z6
        Processing instructions are ignored.
        Nr)   )r=   r™   rš   r)   r)   r*   ÚprocessingInstructionŒ  r˜   z_ToStan.processingInstructionÚprefixÚuric                 C   sV   t | jƒ| _|| j|< |tkrdS |du r| j d|f¡ dS | j d| |f¡ dS )z×
        Set up the prefix mapping, which maps fully qualified namespace URIs
        onto namespace prefixes.

        This gets called before startElementNS whenever an C{xmlns} attribute
        is seen.
        NÚxmlnszxmlns:%s)r€   r‹   ÚTEMPLATE_NAMESPACEr“   Úappend)r=   rœ   r�   r)   r)   r*   ÚstartPrefixMapping‘  s   	
z_ToStan.startPrefixMappingc                 C   s"   | j j}|dusJ dƒ‚|| _ dS )zb
        "Pops the stack" on the prefix mapping.

        Gets called after endElementNS.
        Nz$More prefix mapping ends than starts)r‹   r�   )r=   rœ   r�   r)   r)   r*   ÚendPrefixMapping§  s   
z_ToStan.endPrefixMappingÚnamespaceAndNameÚqnameÚattrsc                 C   sP  | j }| j ¡ }| j ¡ }|\}}|tkrO|dkrd}n3|dkrOz|d }	W n ty1   d}	Y nw t|d |	|||d�}
| j |
¡ | j	 |
¡ |
j
| _	dS d}t|ƒ}t| ¡ ƒD ]\}}|\}}|tkrhq[|dkrq|}||= q[tƒ }| ¡ D ]\\}}}| j |¡}|du rŒ|}n|› d	|› �}|||< qy|tkrÖ|d
krÖ| js«tdt› d�ƒ‚d|vr·tdt› d�ƒ‚td||||d�}|| jd j|d < | j |¡ |j
| _	dS | jrä| t| jƒ¡ g | _|tkrÿ|durÿ| j| }|durÿ| j| › d	|› �}t|ttttttf tf |ƒƒ||||d�}| j |¡ | j	 |¡ |j
| _	dS )a]  
        Gets called when we encounter a new xmlns attribute.

        @param namespaceAndName: a (namespace, name) tuple, where name
            determines which type of action to take, if the namespace matches
            L{TEMPLATE_NAMESPACE}.
        @param qname: ignored.
        @param attrs: attributes on the element being started.
        ÚtransparentÚ r$   )NÚdefaultN)NrC   )r¨   rp   rd   ÚcolumnNumberr@   ú:Úattrz<{z}attr> as top-level elementrC   z }attr> requires a name attribute)r@   rp   rd   r©   éÿÿÿÿ)Ú
attributesr@   rp   rd   r©   )rŠ   r�   ÚgetLineNumberÚgetColumnNumberrŸ   ÚKeyErrorr$   r’   r    r‘   Úchildrenr   ÚlistÚitemsr‹   r…   ÚAssertionErrorr#   r­   r“   Úupdater   r   r   r1   rO   )r=   r£   r¤   r¥   rp   rd   r©   ÚnsrC   r¨   Úslr@   Zorderedr„   r†   ZattrNSZjustTheNameZnonTemplateAttrsZattrNsÚattrNameZnsPrefixZattrKeyÚelrœ   r)   r)   r*   ÚstartElementNS±  s¢   

ýû€	

ÿ
ÿû
ÿø
z_ToStan.startElementNSÚchc                 C   s*   | j r| jd  |¡ dS | j |¡ dS )zm
        Called when we receive some characters.  CDATA characters get passed
        through as is.
        r¬   N)rŒ   r’   r    r‘   )r=   r»   r)   r)   r*   Ú
characters)  s   z_ToStan.charactersrC   c                 C   s.   | j  ¡  | j r| j d j| _dS | j| _dS )z’
        A namespace tag is closed.  Pop the stack, if there's anything left in
        it, otherwise return to the document's namespace.
        r¬   N)r’   Úpopr±   r‘   r�   )r=   rC   r¤   r)   r)   r*   ÚendElementNS3  s   
z_ToStan.endElementNSÚpublicIdÚsystemIdc                 C   r–   ©z#
        DTDs are ignored.
        Nr)   )r=   rC   r¿   rÀ   r)   r)   r*   ÚstartDTD>  r˜   z_ToStan.startDTDÚargsc                 G   r–   rÁ   r)   )r=   rÃ   r)   r)   r*   ÚendDTDC  r˜   z_ToStan.endDTDc                 C   s   d| _ | j g ¡ dS )zO
        We're starting to be in a CDATA element, make a note of this.
        TN)rŒ   r’   r    r”   r)   r)   r*   Ú
startCDATAH  s   z_ToStan.startCDATAc                 C   s*   d| _ d | j ¡ ¡}| j t|ƒ¡ dS )z‰
        We're no longer in a CDATA element.  Collect up the characters we've
        parsed and put them in a new CDATA object.
        Fr§   N)rŒ   Újoinr’   r½   r‘   r    r!   )r=   Úcommentr)   r)   r*   ÚendCDATAO  s   z_ToStan.endCDATAr6   c                 C   s   | j  t|ƒ¡ dS )z=
        Add an XML comment which we've encountered.
        N)r‘   r    r"   )r=   r6   r)   r)   r*   rÇ   X  s   z_ToStan.comment)r.   N)rF   rG   rH   rI   r   rO   r<   r   r�   r•   r—   r›   r¡   r¢   r   r   rº   r¼   r¾   rÂ   ÚobjectrÄ   rÅ   rÈ   rÇ   r)   r)   r)   r*   r‰   g  s2    



þýü
ûx"


	r‰   Úflr   c                 C   s€   t ƒ }| tjd¡ | tjd¡ | tjd¡ | tjd¡ tt| ddƒƒ}| 	|¡ | 
|¡ | tj|¡ | | ¡ |jS )z 
    Perform a SAX parse of an XML document with the _ToStan class.

    @param fl: The XML document to be parsed.

    @return: a C{list} of Stan objects.
    r   rM   rC   N)r   Ú
setFeaturer   Úfeature_validationÚfeature_namespacesÚfeature_external_gesÚfeature_external_pesr‰   ÚgetattrÚsetContentHandlerÚsetEntityResolverÚsetPropertyÚproperty_lexical_handlerÚparser�   )rÊ   ÚparserÚsr)   r)   r*   Ú_flatsaxParse_  s   


rØ   c                   @   s8   e Zd ZdZdeeef fdd„Zded fdd„Z	d	S )
Ú	XMLStringzH
    An L{ITemplateLoader} that loads and parses XML from a string.
    r×   c                 C   s(   t |tƒs
| d¡}tt |¡ƒ| _dS )z¸
        Run the parser on a L{io.StringIO} copy of the string.

        @param s: The string from which to load the XML.
        @type s: L{str}, or a UTF-8 encoded L{bytes}.
        Úutf8N)r0   rO   r4   rØ   ÚioÚStringIOÚ_loadedTemplate)r=   r×   r)   r)   r*   r<   }  s   

zXMLString.__init__r.   r   c                 C   s   | j S )zM
        Return the document.

        @return: the loaded document.
        N)rÝ   r”   r)   r)   r*   ÚloadŠ  s   zXMLString.loadN)
rF   rG   rH   rI   r   rO   r1   r<   r
   rÞ   r)   r)   r)   r*   rÙ   w  s    rÙ   c                   @   sF   e Zd ZdZedƒZddd„Zedd„ ƒZedd	„ ƒZ	ed
d„ ƒZ
dS )ÚFailureElementa  
    L{FailureElement} is an L{IRenderable} which can render detailed information
    about a L{Failure<twisted.python.failure.Failure>}.

    @ivar failure: The L{Failure<twisted.python.failure.Failure>} instance which
        will be rendered.

    @since: 12.1
    ao  
<div xmlns:t="http://twistedmatrix.com/ns/twisted.web.template/0.1">
  <style type="text/css">
    div.error {
      color: red;
      font-family: Verdana, Arial, helvetica, sans-serif;
      font-weight: bold;
    }

    div {
      font-family: Verdana, Arial, helvetica, sans-serif;
    }

    div.stackTrace {
    }

    div.frame {
      padding: 1em;
      background: white;
      border-bottom: thin black dashed;
    }

    div.frame:first-child {
      padding: 1em;
      background: white;
      border-top: thin black dashed;
      border-bottom: thin black dashed;
    }

    div.location {
    }

    span.function {
      font-weight: bold;
      font-family: "Courier New", courier, monospace;
    }

    div.snippet {
      margin-bottom: 0.5em;
      margin-left: 1em;
      background: #FFFFDD;
    }

    div.snippetHighlightLine {
      color: red;
    }

    span.code {
      font-family: "Courier New", courier, monospace;
    }
  </style>

  <div class="error">
    <span t:render="type" />: <span t:render="value" />
  </div>
  <div class="stackTrace" t:render="traceback">
    <div class="frame" t:render="frames">
      <div class="location">
        <span t:render="filename" />:<span t:render="lineNumber" /> in
        <span class="function" t:render="function" />
      </div>
      <div class="snippet" t:render="source">
        <div t:render="sourceLines">
          <span class="lineno" t:render="lineNumber" />
          <code class="code" t:render="sourceLine" />
        </div>
      </div>
    </div>
  </div>
  <div class="error">
    <span t:render="type" />: <span t:render="value" />
  </div>
</div>
Nc                 C   s   t  | |¡ || _d S r:   )r   r<   Úfailure)r=   rà   r_   r)   r)   r*   r<   ë  rT   zFailureElement.__init__c                 C   s   |t | jjƒƒS )zA
        Render the exception type as a child of C{tag}.
        N)r   rà   Útypera   r)   r)   r*   rá   ï  s   zFailureElement.typec                 C   s   |t | jjƒ d¡ƒS )zB
        Render the exception value as a child of C{tag}.
        rÚ   N)rO   rà   Úvaluer5   ra   r)   r)   r*   râ   ö  s   zFailureElement.valuec                 C   s   t t|ƒ| jjƒS )z–
        Render all the frames in the wrapped
        L{Failure<twisted.python.failure.Failure>}'s traceback stack, replacing
        C{tag}.
        N)rz   rt   rà   r   ra   r)   r)   r*   Ú	tracebacký  s   zFailureElement.tracebackr:   )rF   rG   rH   rI   rÙ   r_   r<   r   rá   râ   rã   r)   r)   r)   r*   rß   “  s    
ÿ
M

rß   c                 C   sN   g }t dt| ƒƒ |j¡ t|d tƒr|d  d¡ dd¡S |d  ¡  dS )a  
    Construct an HTML representation of the given failure.

    Consider using L{FailureElement} instead.

    @type myFailure: L{Failure<twisted.python.failure.Failure>}

    @rtype: L{bytes}
    @return: A string containing the HTML representation of the given failure.
    Nr   r/   rN   Úxmlcharrefreplace)	r    rß   ÚaddBothr    r0   r1   r4   r5   ZraiseException)Z	myFailureÚresultr)   r)   r*   ÚformatFailure  s
   rç   rM   c                   @   s,   e Zd ZdZd
dd„Zded fdd„Zd	S )rt   zJ
    An L{ITemplateLoader} that loads an existing flattenable object.
    rb   r   c                 C   rŽ   )z>
        @param tag: The object which will be loaded.
        Nr}   )r=   rb   r)   r)   r*   r<   -  s   zTagLoader.__init__r.   c                 C   s   | j gS r:   r}   r”   r)   r)   r*   rÞ   5  s   zTagLoader.loadN)rb   r   )rF   rG   rH   rI   r<   r
   rÞ   r)   r)   r)   r*   rt   '  s    
rt   c                   @   sT   e Zd ZdZdee fdd„Zded fdd„Zde	fd	d
„Z
ded fdd„ZdS )ÚXMLFilezF
    An L{ITemplateLoader} that loads and parses XML from a file.
    Úpathc                 C   s,   t |tƒstjdtdd� d| _	 || _dS )zf
        Run the parser on a file.

        @param path: The file from which to load the XML.
        zhPassing filenames or file objects to XMLFile is deprecated since Twisted 12.1.  Pass a FilePath instead.rk   )ÚcategoryÚ
stacklevelN)r0   r   ÚwarningsÚwarnÚDeprecationWarningrÝ   Ú_path)r=   ré   r)   r)   r*   r<   ?  s   
üzXMLFile.__init__r.   r   c                 C   sN   t | jtƒst| jƒS | j d¡�}t|ƒW  d  ƒ S 1 s w   Y  dS )zP
        Read and parse the XML.

        @return: the loaded document.
        ÚrN)r0   rï   r   rØ   Úopen)r=   Úfr)   r)   r*   Ú_loadDocS  s
   
$ÿzXMLFile._loadDocc                 C   s   d| j ›d�S )Nz<XMLFile of ú>)rï   r”   r)   r)   r*   Ú__repr___  r[   zXMLFile.__repr__c                 C   s   | j du r
|  ¡ | _ | j S )zl
        Return the document, first loading it if necessary.

        @return: the loaded document.
        N)rÝ   ró   r”   r)   r)   r*   rÞ   b  s   

zXMLFile.loadN)rF   rG   rH   rI   r   r   r<   r
   ró   rO   rõ   rÞ   r)   r)   r)   r*   rè   9  s    rè   >x   Ú
figcaptionÚisindexÚ
blockquoteÚembedÚkeygenÚstrikeÚsubÚh4ÚaÚtimeÚscriptÚhtmlÚlinkÚcaptionÚnavZinsZsampÚaddressZciter×   Úh6ÚhgroupÚformÚuÚtfootÚinputÚlabelÚmapÚappletÚh1ÚcolgroupÚbuttonÚsectionÚdivÚemÚaudioÚulÚprogressÚtitleÚbZbdoÚparamÚdfnÚwbrÚstrongÚtableÚdelÚthZabbrÚqÚcenterÚmetaÚareaÚnoscriptZdatalistÚfigureÚddÚh3ZkbdÚoptionÚtheadÚdirÚbrÚpreZmeterÚtrÚbaseÚoptgroupZcanvasÚmenuÚdtÚhrÚliri   ÚnoframesÚrubyÚasideÚheadÚrpÚbigrÉ   r^   ÚsummaryÚh5ÚpÚttÚtdÚtextareaZbdiÚheaderÚdlÚdetailsÚcommandÚfieldsetÚfontÚcodeÚselectÚcolÚiÚiframeÚmarkÚolÚsupÚstyleÚarticleÚrtÚspanÚimgÚframesetÚh2ÚvideoÚvarÚbodyÚtbodyZacronymÚfooterÚbasefontZlegendÚsmallÚoutputc                   @   s"   e Zd ZdZdedefdd„ZdS )Ú_TagFactorya†  
    A factory for L{Tag} objects; the implementation of the L{tags} object.

    This allows for the syntactic convenience of C{from twisted.web.template
    import tags; tags.a(href="linked-page.html")}, where 'a' can be basically
    any HTML tag.

    The class is not exposed publicly because you only ever need one of these,
    and we already made it for you.

    @see: L{tags}
    ÚtagNamer.   c                 C   s8   |dkrt dƒS | d¡}|tvrtd|›�ƒ‚t |ƒS )Nr¦   r§   Ú_zunknown tag )r#   ro   ÚVALID_HTML_TAG_NAMESÚAttributeError)r=   r_  r)   r)   r*   Ú__getattr__û  s   
z_TagFactory.__getattr__N)rF   rG   rH   rI   rO   r#   rc  r)   r)   r)   r*   r^  í  s    r^  ó   <!DOCTYPE html>ÚelementÚdoctypeÚ_failElementr   c                    sŠ   |durˆ  |¡ ˆ  d¡ ˆ du rt‰ tˆ|ˆj ƒ}dtdttd  f‡ ‡fdd„}ˆdœdtd	tdtfd
d„}| |¡ | 	|¡ t
S )aã  
    Render an element or other L{IRenderable}.

    @param request: The L{IRequest} being rendered to.
    @param element: An L{IRenderable} which will be rendered.
    @param doctype: A L{bytes} which will be written as the first line of
        the request, or L{None} to disable writing of a doctype.  The argument
        should not include a trailing newline and will default to the HTML5
        doctype C{'<!DOCTYPE html>'}.

    @returns: NOT_DONE_YET

    @since: 12.1
    Nó   
rà   r.   c                    sT   t jd| d� tˆdd ƒ}|d ur#|jr#ˆ d usJ ‚tˆˆ | ƒˆjƒS ˆ d¡ d S )Nz/An error occurred while rendering the response.)rà   Úsitesr   <div style="font-size:800%;background-color:#FFF;color:#F00">An error occurred while rendering the response.</div>)Ú
_moduleLogrà   rÐ   ZdisplayTracebacksr   Úwrite)rà   ri  ©rg  r-   r)   r*   Úeb%  s   ÿÿzrenderElement.<locals>.eb)r-   ræ   r-   c                S   s   |  ¡  | S r:   )Úfinish)ræ   r-   r)   r)   r*   rn  6  s   zrenderElement.<locals>.finish)rk  rß   r   r   r   r   rÉ   r&   rW   rå   rU   )r-   re  rf  rg  rS   rm  rn  r)   rl  r*   ÚrenderElement  s   

 

ro  )rd  N)XrI   rÛ   rm   rì   Úcollectionsr   r  r   Útypingr   r   r   r   r	   r
   r   r   r   r   r   Zxml.saxr   r   Zxml.sax.xmlreaderr   r   Zzope.interfacer   Ztwisted.internet.deferr   Ztwisted.loggerr   Ztwisted.pythonr   Ztwisted.python.failurer   Ztwisted.python.filepathr   Ztwisted.python.reflectr   Ztwisted.webr   Ztwisted.web._elementr   r   Ztwisted.web._flattenr   r   r    Ztwisted.web._stanr!   r"   r#   r$   Ztwisted.web.iwebr%   r&   r'   r+   r1   r7   rR   r8   rL   rQ   r\   rf   rv   rz   r€   rŸ   ÚContentHandlerÚEntityResolverr‰   rO   rØ   rÙ   rß   rç   rU   rj  rt   rè   ra  r^  ÚtagsrÉ   ro  r)   r)   r)   r*   Ú<module>   sz   4)..% "yt7|üÿþýüû