o
    f                     @  s  d dl mZ d dlZd dlZd dlZd dlZd dl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 d dlmZmZ d dlmZ d dlmZmZ d d	lmZmZmZ d d
lmZ d dlmZ d dlm Z  d dl!m"Z"m#Z#m$Z$ d dl%m&Z&m'Z'm(Z(m)Z)m*Z* d dl+m,Z,m-Z- G dd de.Z/G dd deZ0dIddZ1dJddZ2dKd d!Z3dLd%d&Z4dMd-d.Z5e6d/Z7dNd1d2Z8G d3d4 d4Z9G d5d6 d6e9Z:G d7d8 d8e9Z;G d9d: d:e9Z<G d;d< d<e9Z=e>d=Z?G d>d? d?ej@e? ZAdOdCdDZBG dEdF dFZCG dGdH dHZDdS )P    )annotationsN)asynccontextmanager)Enum)wrap_app_handling_exceptions)get_route_pathis_async_callable)run_in_threadpool)CONVERTOR_TYPES	Convertor)URLHeadersURLPath)HTTPException)
Middleware)Request)PlainTextResponseRedirectResponseResponse)ASGIAppLifespanReceiveScopeSend)	WebSocketWebSocketClosec                      s"   e Zd ZdZd
 fdd	Z  ZS )NoMatchFoundz}
    Raised by `.url_for(name, **path_params)` and `.url_path_for(name, **path_params)`
    if no matching route exists.
    namestrpath_paramsdict[str, typing.Any]returnNonec                   s0   d t| }t d| d| d d S )N, zNo route exists for name "z" and params "z".)joinlistkeyssuper__init__)selfr   r   params	__class__ I/var/www/NoticeGen/venv/lib/python3.10/site-packages/starlette/routing.pyr'   !   s   zNoMatchFound.__init__)r   r   r   r   r    r!   )__name__
__module____qualname____doc__r'   __classcell__r,   r,   r*   r-   r      s    r   c                   @  s   e Zd ZdZdZdZdS )Matchr         N)r.   r/   r0   NONEPARTIALFULLr,   r,   r,   r-   r3   &   s    r3   obj
typing.Anyr    boolc                 C  s4   t dt t| tjr| j} t| tjst| S )z~
    Correctly determines if an object is a coroutine function,
    including those wrapped in functools.partial objects.
    zViscoroutinefunction_or_partial is deprecated, and will be removed in a future release.)	warningswarnDeprecationWarning
isinstance	functoolspartialfuncinspectiscoroutinefunction)r9   r,   r,   r-   iscoroutinefunction_or_partial,   s   
rE   rB   Atyping.Callable[[Request], typing.Awaitable[Response] | Response]r   c                      d fd	d
}|S )zi
    Takes a function or coroutine `func(request) -> response`,
    and returns an ASGI application.
    scoper   receiver   sendr   r    r!   c                   s:   t | || d fd	d
}t| | ||I d H  d S )NrH   r   rI   r   rJ   r   r    r!   c                   s@   t  r I d H }nt I d H }|| ||I d H  d S N)r   r   )rH   rI   rJ   response)rB   requestr,   r-   appF   s
   z*request_response.<locals>.app.<locals>.apprH   r   rI   r   rJ   r   r    r!   )r   r   rH   rI   rJ   rN   rB   )rM   r-   rN   C   s   zrequest_response.<locals>.appNrO   r,   rB   rN   r,   rQ   r-   request_response;   s   rS   4typing.Callable[[WebSocket], typing.Awaitable[None]]c                   rG   )zM
    Takes a coroutine `func(session)`, and returns an ASGI application.
    rH   r   rI   r   rJ   r   r    r!   c                   s<   t | ||d d fd
d}t| | ||I d H  d S )N)rI   rJ   rH   r   rI   r   rJ   r   r    r!   c                   s    I d H  d S rK   r,   )rH   rI   rJ   )rB   sessionr,   r-   rN   ]   s   z+websocket_session.<locals>.app.<locals>.apprO   )r   r   rP   rQ   )rU   r-   rN   Z   s   zwebsocket_session.<locals>.appNrO   r,   rR   r,   rQ   r-   websocket_sessionR   s   rV   endpoint typing.Callable[..., typing.Any]r   c                 C  s"   t | s
t | r| jS | jjS rK   )rC   	isroutineisclassr.   r+   )rW   r,   r,   r-   get_namee   s   r[   pathparam_convertors dict[str, Convertor[typing.Any]]r   dict[str, str]tuple[str, dict[str, str]]c                 C  s^   t | D ]$\}}d| d | v r*|| }||}| d| d |} || q| |fS )N{})r$   items	to_stringreplacepop)r\   r]   r   keyvalue	convertorr,   r,   r-   replace_paramsk   s   

rj   z4{([a-zA-Z_][a-zA-Z0-9_]*)(:[a-zA-Z_][a-zA-Z0-9_]*)?}Atuple[typing.Pattern[str], str, dict[str, Convertor[typing.Any]]]c                 C  s  |  d }d}d}t }d}i }t| D ]X}|d\}}	|	d}	|	tv s0J d|	 dt|	 }
|t| ||	  7 }|d	| d
|
j
 d7 }|| ||	  7 }|d| 7 }||v rf|| |
||< | }q|rdt|}t|dkrdnd}td| d| d|  |r| |d dd }|t|d 7 }n|t| |d d 7 }|| |d 7 }t|||fS )a*  
    Given a path string, like: "/{username:str}",
    or a host string, like: "{subdomain}.mydomain.org", return a three-tuple
    of (regex, format, {param_name:convertor}).

    regex:      "/(?P<username>[^/]+)"
    format:     "/{username}"
    convertors: {"username": StringConvertor()}
    /^ r   r   :zUnknown path convertor ''z(?P<>)z{%s}r"   r4   szDuplicated param name z	 at path N$)
startswithsetPARAM_REGEXfinditergroupslstripr	   reescapestartregexaddendr#   sortedlen
ValueErrorsplitcompile)r\   is_host
path_regexpath_formatduplicated_paramsidxr]   match
param_nameconvertor_typeri   namesendinghostnamer,   r,   r-   compile_path}   s>   




r   c                   @  s4   e Zd ZdddZdddZdddZdddZdS )	BaseRouterH   r   r    tuple[Match, Scope]c                 C     t  rK   NotImplementedError)r(   rH   r,   r,   r-   matches      zBaseRoute.matchesr   r   r   r:   r   c                K  r   rK   r   )r(   r   r   r,   r,   r-   url_path_for   r   zBaseRoute.url_path_forrI   r   rJ   r   r!   c                   s   t  rK   r   r(   rH   rI   rJ   r,   r,   r-   handle   s   zBaseRoute.handlec                   s   |  |\}}|tjkr8|d dkr$tddd}||||I dH  dS |d dkr6t }||||I dH  dS || | |||I dH  dS )z
        A route may be used in isolation as a stand-alone ASGI app.
        This is a somewhat contrived case, as they'll almost always be used
        within a Router, but could be useful for some tooling and minimal apps.
        typehttp	Not Found  status_codeN	websocket)r   r3   r6   r   r   updater   )r(   rH   rI   rJ   r   child_scoperL   websocket_closer,   r,   r-   __call__   s   

zBaseRoute.__call__NrH   r   r    r   r   r   r   r:   r    r   rO   )r.   r/   r0   r   r   r   r   r,   r,   r,   r-   r      
    


r   c                   @  sT   e Zd Zdddddd)ddZd*ddZd+ddZd,d"d#Zd-d%d&Zd.d'd(ZdS )/RouteNT)methodsr   include_in_schema
middlewarer\   r   rW   rX   r   list[str] | Noner   
str | Noner   r;   r   "typing.Sequence[Middleware] | Noner    r!   c                C  s  | ds	J d|| _|| _|d u rt|n|| _|| _|}t|tjr.|j	}t|tjs%t
|s8t
|rEt|| _|d u rDdg}n|| _|d urat|D ]\}}	}
||	d| ji|
| _qP|d u rid | _ndd |D | _d| jv r|| jd t|\| _| _| _d S )Nrl    Routed paths must start with '/'GETrN   c                 S  s   h | ]}|  qS r,   )upper).0methodr,   r,   r-   	<setcomp>   s    z!Route.__init__.<locals>.<setcomp>HEAD)rv   r\   rW   r[   r   r   r?   r@   rA   rB   rC   
isfunctionismethodrS   rN   reversedr   r   r   r   r   r]   )r(   r\   rW   r   r   r   r   endpoint_handlerclsargskwargsr,   r,   r-   r'      s0   


zRoute.__init__rH   r   r   c           	      C  s   |d dkrPt |}| j|}|rP| }| D ]\}}| j| |||< qt|di }|	| | j
|d}| jrK|d | jvrKtj|fS tj|fS tji fS )Nr   r   r   rW   r   r   )r   r   r   	groupdictrc   r]   convertdictgetr   rW   r   r3   r7   r8   r6   	r(   rH   
route_pathr   matched_paramsrg   rh   r   r   r,   r,   r-   r      s   



zRoute.matchesr   r:   r   c                K  ^   t | }t | j }|| jks||krt||t| j| j|\}}|r)J t|ddS )Nr   r\   protocolrw   r%   r]   r   r   rj   r   r   r(   r   r   seen_paramsexpected_paramsr\   remaining_paramsr,   r,   r-   r        

zRoute.url_path_forrI   r   rJ   r   c                   sv   | j r/|d | j vr/dd| j i}d|v rtd|dtdd|d}||||I d H  d S | |||I d H  d S )Nr   Allowr"   rN   i  )r   headerszMethod Not Allowed)r   r#   r   r   rN   )r(   rH   rI   rJ   r   rL   r,   r,   r-   r     s   zRoute.handleotherc                 C  s.   t |to| j|jko| j|jko| j|jkS rK   )r?   r   r\   rW   r   r(   r   r,   r,   r-   __eq__+  s   



zRoute.__eq__c                 C  s@   | j j}t| jp	g }| j| j}}| d|d|d|dS )N(path=, name=z
, methods=rr   )r+   r.   r   r   r\   r   )r(   
class_namer   r\   r   r,   r,   r-   __repr__3  s   zRoute.__repr__)r\   r   rW   rX   r   r   r   r   r   r;   r   r   r    r!   r   r   rO   r   r:   r    r;   r    r   	r.   r/   r0   r'   r   r   r   r   r   r,   r,   r,   r-   r      s    
)


r   c                   @  sP   e Zd Zdddd%ddZd&ddZd'ddZd(ddZd)d!d"Zd*d#d$ZdS )+WebSocketRouteN)r   r   r\   r   rW   rX   r   r   r   r   r    r!   c          	      C  s   | ds	J d|| _|| _|d u rt|n|| _|}t|tjr+|j}t|tjs"t	
|s5t	|r;t|| _n|| _|d urWt|D ]\}}}||d| ji|| _qFt|\| _| _| _d S )Nrl   r   rN   )rv   r\   rW   r[   r   r?   r@   rA   rB   rC   r   r   rV   rN   r   r   r   r   r]   )	r(   r\   rW   r   r   r   r   r   r   r,   r,   r-   r'   ;  s   zWebSocketRoute.__init__rH   r   r   c           	      C  s   |d dkrAt |}| j|}|rA| }| D ]\}}| j| |||< qt|di }|	| | j
|d}tj|fS tji fS )Nr   r   r   r   )r   r   r   r   rc   r]   r   r   r   r   rW   r3   r8   r6   r   r,   r,   r-   r   X  s   


zWebSocketRoute.matchesr   r:   r   c                K  r   )Nr   r   r   r   r,   r,   r-   r   g  r   zWebSocketRoute.url_path_forrI   r   rJ   r   c                      |  |||I d H  d S rK   rN   r   r,   r,   r-   r   t     zWebSocketRoute.handler   r;   c                 C  "   t |to| j|jko| j|jkS rK   )r?   r   r\   rW   r   r,   r,   r-   r   w  
   


zWebSocketRoute.__eq__c                 C  s   | j j d| jd| jdS )Nr   r   rr   )r+   r.   r\   r   r(   r,   r,   r-   r   ~  s   zWebSocketRoute.__repr__)
r\   r   rW   rX   r   r   r   r   r    r!   r   r   rO   r   r   r   r,   r,   r,   r-   r   :  s    



r   c                   @  sd   e Zd Z			d*ddd+ddZed,ddZd-ddZd.ddZd/d"d#Zd0d&d'Z	d1d(d)Z
dS )2MountNr   r\   r   rN   ASGIApp | Noneroutes!typing.Sequence[BaseRoute] | Noner   r   r   r   r    r!   c          	      C  s   |dks| dsJ d|d us|d usJ d|d| _|d ur'|| _nt|d| _| j| _|d urJt|D ]\}}}||d| ji|| _q9|| _t| jd \| _	| _
| _d S )Nrn   rl   r   z0Either 'app=...', or 'routes=' must be specified)r   rN   z/{path:path})rv   rstripr\   	_base_appRouterrN   r   r   r   r   r   r]   )	r(   r\   rN   r   r   r   r   r   r   r,   r,   r-   r'     s    	zMount.__init__list[BaseRoute]c                 C     t | jdg S Nr   )getattrr   r   r,   r,   r-   r        zMount.routesrH   r   r   c                 C  s   |d dv r_| dd}t|}| j|}|r_| }| D ]\}}| j| |||< q d|d }|d t	|  }	t
| di }
|
| |
| d|||	 | jd	}tj|fS tji fS )
Nr   r   r   	root_pathrn   rl   r\   r   app_root_path)r   r   r   rW   )r   r   r   r   r   rc   r]   r   rf   r   r   r   rN   r3   r8   r6   )r(   rH   r   r   r   r   rg   rh   remaining_pathmatched_pathr   r   r,   r,   r-   r     s&   



zMount.matchesr   r:   r   c          
   	   K  s(  | j d ur)|| j kr)d|v r)|d d|d< t| j| j|\}}|s(t|dS nf| j d u s6|| j d r| j d u r>|}n|t| j d d  }|d}d|d< t| j| j|\}}|d urd||d< | j	phg D ]%}z|j
|fi |}	t|dt|	 |	jdW   S  ty   Y qiw t||)Nr\   rl   )r\   ro   r4   rn   r   )r   r{   rj   r   r]   r   rv   r   r   r   r   r   r   r   r   )
r(   r   r   r\   r   remaining_name
path_kwargpath_prefixrouteurlr,   r,   r-   r     s:   





zMount.url_path_forrI   r   rJ   r   c                   r   rK   r   r   r,   r,   r-   r     r   zMount.handler   r;   c                 C  r   rK   )r?   r   r\   rN   r   r,   r,   r-   r     r   zMount.__eq__c                 C  2   | j j}| jpd}| d| jd|d| jdS )Nrn   r   r   , app=rr   )r+   r.   r   r\   rN   r(   r   r   r,   r,   r-   r        
 zMount.__repr__)NNN)r\   r   rN   r   r   r   r   r   r   r   r    r!   r    r   r   r   rO   r   r   r.   r/   r0   r'   propertyr   r   r   r   r   r   r,   r,   r,   r-   r     s    

!
!
r   c                   @  sX   e Zd Zd%d&d
dZed'ddZd(ddZd)ddZd*ddZd+d!d"Z	d,d#d$Z
dS )-HostNhostr   rN   r   r   r   r    r!   c                 C  s<   | dr	J d|| _|| _|| _t|\| _| _| _d S )Nrl   zHost must not start with '/')rv   r  rN   r   r   
host_regexhost_formatr]   )r(   r  rN   r   r,   r,   r-   r'     s
   zHost.__init__r   c                 C  r   r   )r   rN   r   r,   r,   r-   r     r   zHost.routesrH   r   r   c           
      C  s   |d dv rMt |d}|dddd }| j|}|rM| }| D ]\}}| j| |||< q&t	|di }|
| || jd	}	tj|	fS tji fS )
Nr   r   rH   r  rn   ro   r   r   )r   rW   )r   r   r   r  r   r   rc   r]   r   r   r   rN   r3   r8   r6   )
r(   rH   r   r  r   r   rg   rh   r   r   r,   r,   r-   r      s   



zHost.matchesr   r:   r   c          	   	   K  s   | j d ur&|| j kr&d|v r&|d}t| j| j|\}}|s%t||dS nQ| j d u s3|| j d rw| j d u r;|}n|t| j d d  }t| j| j|\}}| jpTg D ]!}z|j	|fi |}tt
||j|dW   S  tyv   Y qUw t||)Nr\   )r\   r  ro   r4   )r\   r   r  )r   rf   rj   r  r]   r   rv   r   r   r   r   r   r   )	r(   r   r   r\   r  r   r   r   r   r,   r,   r-   r     s.   




zHost.url_path_forrI   r   rJ   r   c                   r   rK   r   r   r,   r,   r-   r   *  r   zHost.handler   r;   c                 C  r   rK   )r?   r  r  rN   r   r,   r,   r-   r   -  r   zHost.__eq__c                 C  r   )Nrn   z(host=r   r   rr   )r+   r.   r   r  rN   r   r,   r,   r-   r   4  r   zHost.__repr__rK   r  r   rN   r   r   r   r    r!   r   r   r   rO   r   r   r   r,   r,   r,   r-   r    s    



r  _Tc                   @  s*   e Zd ZdddZdddZdddZdS )_AsyncLiftContextManagercmtyping.ContextManager[_T]c                 C  
   || _ d S rK   )_cm)r(   r
  r,   r,   r-   r'   >     
z!_AsyncLiftContextManager.__init__r    r  c                   s   | j  S rK   )r  	__enter__r   r,   r,   r-   
__aenter__A  s   
z#_AsyncLiftContextManager.__aenter__exc_typetype[BaseException] | None	exc_valueBaseException | None	tracebacktypes.TracebackType | Nonebool | Nonec                   s   | j |||S rK   )r  __exit__)r(   r  r  r  r,   r,   r-   	__aexit__D  s   z"_AsyncLiftContextManager.__aexit__N)r
  r  )r    r  )r  r  r  r  r  r  r    r  )r.   r/   r0   r'   r  r  r,   r,   r,   r-   r	  =  s    

r	  lifespan_contextStyping.Callable[[typing.Any], typing.Generator[typing.Any, typing.Any, typing.Any]]Etyping.Callable[[typing.Any], typing.AsyncContextManager[typing.Any]]c                   s&   t |  t d fdd}|S )NrN   r:   r    $_AsyncLiftContextManager[typing.Any]c                   s   t  | S rK   )r	  r   cmgrr,   r-   wrapperT  s   z+_wrap_gen_lifespan_context.<locals>.wrapper)rN   r:   r    r  )
contextlibcontextmanagerr@   wraps)r  r   r,   r  r-   _wrap_gen_lifespan_contextM  s   
r$  c                   @  s4   e Zd ZdddZdddZdddZdddZdS )_DefaultLifespanrouterr   c                 C  r  rK   )_router)r(   r&  r,   r,   r-   r'   \  r  z_DefaultLifespan.__init__r    r!   c                      | j  I d H  d S rK   )r'  startupr   r,   r,   r-   r  _     z_DefaultLifespan.__aenter__exc_infoobjectc                   r(  rK   )r'  shutdown)r(   r+  r,   r,   r-   r  b  r*  z_DefaultLifespan.__aexit__r(   r  rN   c                 C  s   | S rK   r,   )r(   rN   r,   r,   r-   r   e  s   z_DefaultLifespan.__call__N)r&  r   r    r!   )r+  r,  r    r!   )r(   r  rN   r,  r    r  )r.   r/   r0   r'   r  r  r   r,   r,   r,   r-   r%  [  r   r%  c                   @  s   e Zd Z						dPdddQddZdRddZdSd"d#ZdTd$d%ZdTd&d'ZdRd(d)ZdRd*d+Z	dRd,d-Z
dUd/d0Z	dVdWd5d6Z	dVdXd8d9Z			dYdZd?d@Z	dVd[dBdCZ			dYd\dEdFZdVd]dGdHZd^dLdMZd_dNdOZdS )`r   NTr   r   r   redirect_slashesr;   defaultr   
on_startup7typing.Sequence[typing.Callable[[], typing.Any]] | Noneon_shutdownlifespanLifespan[typing.Any] | Noner   r   r    r!   c                C  s  |d u rg nt || _|| _|d u r| jn|| _|d u rg nt || _|d u r)g nt || _|s2|r?tdt	 |r?td |d u rIt
| | _n%t|rZtdt	 t|| _nt|rktdt	 t|| _n|| _| j| _|rt|D ]\}}	}
|| jg|	R i |
| _qxd S d S )NzThe on_startup and on_shutdown parameters are deprecated, and they will be removed on version 1.0. Use the lifespan parameter instead. See more about it on https://www.starlette.io/lifespan/.zThe `lifespan` parameter cannot be used with `on_startup` or `on_shutdown`. Both `on_startup` and `on_shutdown` will be ignored.zjasync generator function lifespans are deprecated, use an @contextlib.asynccontextmanager function insteadzdgenerator function lifespans are deprecated, use an @contextlib.asynccontextmanager function instead)r$   r   r/  	not_foundr0  r1  r3  r<   r=   r>   r%  r  rC   isasyncgenfunctionr   isgeneratorfunctionr$  rN   middleware_stackr   )r(   r   r/  r0  r1  r3  r4  r   r   r   r   r,   r,   r-   r'   j  sN   

zRouter.__init__rH   r   rI   r   rJ   r   c                   s^   |d dkrt  }||||I d H  d S d|v rtddtddd}||||I d H  d S )Nr   r   rN   r   r   r   )r   r   r   )r(   rH   rI   rJ   r   rL   r,   r,   r-   r6    s   
zRouter.not_foundr   r   r   r:   r   c             	   K  s@   | j D ]}z|j|fi |W   S  ty   Y qw t||rK   )r   r   r   )r(   r   r   r   r,   r,   r-   r     s   

zRouter.url_path_forc                   .   | j D ]}t|r| I dH  q|  qdS )z7
        Run any `.on_startup` event handlers.
        N)r1  r   r(   handlerr,   r,   r-   r)       
zRouter.startupc                   r:  )z8
        Run any `.on_shutdown` event handlers.
        N)r3  r   r;  r,   r,   r-   r-    r=  zRouter.shutdownc              	     s  d}| d}| I dH  zE| |4 I dH /}|dur,d|vr%td|d | |ddiI dH  d}| I dH  W d  I dH  n1 I dH sMw   Y  W n# tyv   t }|rk|d	|d
I dH   |d|d
I dH   w |ddiI dH  dS )z{
        Handle ASGI lifespan messages, which allows us to manage application
        startup and shutdown events.
        FrN   Nstatez:The server does not support "state" in the lifespan scope.r   zlifespan.startup.completeTzlifespan.shutdown.failed)r   messagezlifespan.startup.failedzlifespan.shutdown.complete)r   r  RuntimeErrorr   BaseExceptionr  
format_exc)r(   rH   rI   rJ   startedrN   maybe_stateexc_textr,   r,   r-   r4    s4   
(
zRouter.lifespanc                   s   |  |||I dH  dS )z;
        The main entry point to the Router class.
        N)r9  r   r,   r,   r-   r     s   zRouter.__call__c                   s  |d dv s	J d|vr| |d< |d dkr#|  |||I d H  d S d }| jD ]-}||\}}|tjkrH|| ||||I d H   d S |tjkrU|d u rU|}|}q(|d urk|| ||||I d H  d S t|}	|d dkr| j	r|	dkrt
|}
|	dr|
d d|
d< n|
d d |
d< | jD ]&}||
\}}|tjkrt|
d}tt|d	}||||I d H   d S q| |||I d H  d S )
Nr   )r   r   r4  r&  r4  r   rl   r\   r  )r   )r4  r   r   r3   r8   r   r   r7   r   r/  r   endswithr   r6   r   r   r   r0  )r(   rH   rI   rJ   rA   r   r   r   partial_scoper   redirect_scoperedirect_urlrL   r,   r,   r-   rN     sJ   







z
Router.appr   c                 C  s   t |to
| j|jkS rK   )r?   r   r   r   r,   r,   r-   r   (  s   zRouter.__eq__r\   rN   r   r   c                 C     t |||d}| j| d S N)rN   r   )r   r   append)r(   r\   rN   r   r   r,   r,   r-   mount+     zRouter.mountr  c                 C  rJ  rK  )r  r   rL  )r(   r  rN   r   r   r,   r,   r-   r  1  rN  zRouter.hostrW   rF   r   r   r   c                 C  s"   t |||||d}| j| d S )N)rW   r   r   r   )r   r   rL  )r(   r\   rW   r   r   r   r   r,   r,   r-   	add_route7  s   zRouter.add_routerT   c                 C  rJ  )N)rW   r   )r   r   rL  )r(   r\   rW   r   r   r,   r,   r-   add_websocket_routeH  s   zRouter.add_websocket_routetyping.Callablec                   s&   t dt d fdd}|S )	z
        We no longer document this decorator style API, and its usage is discouraged.
        Instead you should use the following approach:

        >>> routes = [Route(path, endpoint=...), ...]
        >>> app = Starlette(routes=routes)
        zThe `route` decorator is deprecated, and will be removed in version 1.0.0.Refer to https://www.starlette.io/routing/#http-routing for the recommended approach.rB   rQ  r    c                   s   j |  d | S )N)r   r   r   )rO  rQ   r   r   r   r\   r(   r,   r-   	decoratore  s   zRouter.route.<locals>.decoratorNrB   rQ  r    rQ  r<   r=   r>   )r(   r\   r   r   r   rS  r,   rR  r-   r   Q  s   
zRouter.routec                   s"   t dt d fdd}|S )	a  
        We no longer document this decorator style API, and its usage is discouraged.
        Instead you should use the following approach:

        >>> routes = [WebSocketRoute(path, endpoint=...), ...]
        >>> app = Starlette(routes=routes)
        zThe `websocket_route` decorator is deprecated, and will be removed in version 1.0.0. Refer to https://www.starlette.io/routing/#websocket-routing for the recommended approach.rB   rQ  r    c                   s   j |  d | S )N)r   )rP  rQ   r   r\   r(   r,   r-   rS    s   z)Router.websocket_route.<locals>.decoratorNrT  rU  )r(   r\   r   rS  r,   rV  r-   websocket_routeq  s   zRouter.websocket_route
event_typerB   typing.Callable[[], typing.Any]c                 C  s4   |dv sJ |dkr| j | d S | j| d S )N)r)  r-  r)  )r1  rL  r3  )r(   rX  rB   r,   r,   r-   add_event_handler  s   zRouter.add_event_handlerc                   s    t dt d fdd}|S )NzThe `on_event` decorator is deprecated, and will be removed in version 1.0.0. Refer to https://www.starlette.io/lifespan/ for recommended approach.rB   rQ  r    c                   s     |  | S rK   )rZ  rQ   rX  r(   r,   r-   rS    s   z"Router.on_event.<locals>.decoratorrT  rU  )r(   rX  rS  r,   r[  r-   on_event  s   zRouter.on_event)NTNNNN)r   r   r/  r;   r0  r   r1  r2  r3  r2  r4  r5  r   r   r    r!   rO   r   r.  r   rK   )r\   r   rN   r   r   r   r    r!   r  )NNT)r\   r   rW   rF   r   r   r   r   r   r;   r    r!   )r\   r   rW   rT   r   r   r    r!   )
r\   r   r   r   r   r   r   r;   r    rQ  )r\   r   r   r   r    rQ  )rX  r   rB   rY  r    r!   )rX  r   r    rQ  )r.   r/   r0   r'   r6  r   r)  r-  r4  r   rN   r   rM  r  rO  rP  r   rW  rZ  r\  r,   r,   r,   r-   r   i  sF    
>








2
 

r   )r9   r:   r    r;   )rB   rF   r    r   )rB   rT   r    r   )rW   rX   r    r   )r\   r   r]   r^   r   r_   r    r`   )r\   r   r    rk   )r  r  r    r  )E
__future__r   r!  r@   rC   r|   r  typestypingr<   r   enumr   starlette._exception_handlerr   starlette._utilsr   r   starlette.concurrencyr   starlette.convertorsr	   r
   starlette.datastructuresr   r   r   starlette.exceptionsr   starlette.middlewarer   starlette.requestsr   starlette.responsesr   r   r   starlette.typesr   r   r   r   r   starlette.websocketsr   r   	Exceptionr   r3   rE   rS   rV   r[   rj   r   rx   r   r   r   r   r   r  TypeVarr  AsyncContextManagerr	  r$  r%  r   r,   r,   r,   r-   <module>   sR    






:eHr
F
