
     i                       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e.          Z/ G d de          Z0dBdZ1dCdZ2dDdZ3dEd"Z4dFd)Z5 ej6        d*          Z7dGd,Z8 G d- d.          Z9 G d/ d0e9          Z: G d1 d2e9          Z; G d3 d4e9          Z< G d5 d6e9          Z= ej>        d7          Z? G d8 d9ej@        e?                   ZAdHd=ZB G d> d?          ZC G d@ dA          ZDdS )I    )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                  $     e Zd ZdZd	 fdZ x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                    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__s       K/var/www/cyber-strat/venv/lib/python3.11/site-packages/starlette/routing.pyr*   zNoMatchFound.__init__!   sZ    4 0 0 2 23344TdTT&TTTUUUUU    )r   r   r    r!   r"   r#   )__name__
__module____qualname____doc__r*   __classcell__)r-   s   @r.   r   r      sQ         
V V V V V V V V V Vr/   r   c                      e Zd ZdZdZdZdS )Matchr         N)r0   r1   r2   NONEPARTIALFULL r/   r.   r6   r6   &   s        DGDDDr/   r6   obj
typing.Anyr"   boolc                    t          j        dt                     t          | t          j                  r!| j        } t          | t          j                  !t          j        |           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)r=   s    r.   iscoroutinefunction_or_partialrJ   ,   sf    
 M	3  
 S)+
,
, h S)+
,
, &s+++r/   rG   Atyping.Callable[[Request], typing.Awaitable[Response] | Response]r   c                     d
 fd	}|S )zi
    Takes a function or coroutine `func(request) -> response`,
    and returns an ASGI application.
    scoper   receiver   sendr   r"   r#   c                   K   t          | ||          d
fd	} t          |          | ||           d {V  d S )NrM   r   rN   r   rO   r   r"   r#   c                   K   t                    r            d {V }nt                     d {V } || ||           d {V  d S N)r   r	   )rM   rN   rO   responserG   requests       r.   appz*request_response.<locals>.app.<locals>.appF   s       && B!%g......!24!A!AAAAAAA(5'400000000000r/   rM   r   rN   r   rO   r   r"   r#   )r   r   )rM   rN   rO   rU   rT   rG   s       @r.   rU   zrequest_response.<locals>.appC   su      %$//	1 	1 	1 	1 	1 	1 	1 9*388NNNNNNNNNNNr/   rV   r<   rG   rU   s   ` r.   request_responserX   ;   s.    
O 
O 
O 
O 
O 
O Jr/   4typing.Callable[[WebSocket], typing.Awaitable[None]]c                     d
 fd	}|S )zM
    Takes a coroutine `func(session)`, and returns an ASGI application.
    rM   r   rN   r   rO   r   r"   r#   c                   K   t          | ||          dfd
} t          |          | ||           d {V  d S )N)rN   rO   rM   r   rN   r   rO   r   r"   r#   c                .   K               d {V  d S rR   r<   )rM   rN   rO   rG   sessions      r.   rU   z+websocket_session.<locals>.app.<locals>.app]   s-      $w--r/   rV   )r   r   )rM   rN   rO   rU   r]   rG   s       @r.   rU   zwebsocket_session.<locals>.appZ   sx      E7>>>	  	  	  	  	  	  	  9*388NNNNNNNNNNNr/   rV   r<   rW   s   ` r.   websocket_sessionr^   R   s.    O O O O O O Jr/   endpoint typing.Callable[..., typing.Any]r   c                x    t          j        |           st          j        |           r| j        S | j        j        S rR   )rH   	isroutineisclassr0   r-   )r_   s    r.   get_namerd   e   s;    "" !goh&?&? !  &&r/   pathparam_convertors dict[str, Convertor[typing.Any]]r    dict[str, str]tuple[str, dict[str, str]]c                   t          |                                          D ]]\  }}d|z   dz   | v rN||         }|                    |          }|                     d|z   dz   |          } |                    |           ^| |fS )N{})r'   items	to_stringreplacepop)re   rf   r    keyvalue	convertors         r.   replace_paramsrt   k   s    
 ;,,..// ! !
U9s?d""(-I''..E<<c	C77DOOC   r/   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                   |                      d           }d}d}t                      }d}i }t                              |           D ]}|                    d          \  }}	|	                    d          }	|	t          v sJ d|	 d            t          |	         }
|t          j        | ||	                                                   z  }|d	| d
|
j
         dz  }|| ||	                                         z  }|d|z  z  }||v r|                    |           |
||<   |                                }|rQd                    t          |                    }t          |          dk    rdnd}t!          d| d| d|            |r>| |d                             d          d         }|t          j        |          dz   z  }n"|t          j        | |d                   dz   z  }|| |d         z  }t          j        |          ||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%   r7   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)re   is_host
path_regexpath_formatduplicated_paramsidxrf   match
param_nameconvertor_typers   namesendinghostnames                 r.   compile_pathr   }   sM    //#&&&GJK
C%%d++  %*\\%%8%8"
N'..s33o---7n777 .--#N3	biS5;;==%8 9:::
<Z<<)/<<<<
tC%++--/00v
**)))!!*---'0$iikk R		&!23344-..22PPP%PP$PPQQQ 2:##C((+bi))C//

biSTT
++c11
4:K:j!!;0@@@r/   c                  .    e Zd ZddZddZddZddZdS )	BaseRouterM   r   r"   tuple[Match, Scope]c                    t                      rR   NotImplementedError)r+   rM   s     r.   matcheszBaseRoute.matches       !###r/   r   r   r    r>   r   c                   t                      rR   r   )r+   r   r    s      r.   url_path_forzBaseRoute.url_path_for   r   r/   rN   r   rO   r   r#   c                "   K   t                      rR   r   r+   rM   rN   rO   s       r.   handlezBaseRoute.handle   s      !###r/   c                ~  K   |                      |          \  }}|t          j        k    r`|d         dk    r%t          dd          } ||||           d{V  n-|d         dk    r!t	                      } ||||           d{V  dS |                    |           |                     |||           d{V  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   r6   r9   r   r   updater   )r+   rM   rN   rO   r   child_scoperS   websocket_closes           r.   __call__zBaseRoute.__call__   s       "\\%00{EJV}&&,[cJJJhugt4444444444v+--"0"2"2%oeWd;;;;;;;;;F[!!!kk%$///////////r/   NrM   r   r"   r   r   r   r    r>   r"   r   rV   )r0   r1   r2   r   r   r   r   r<   r/   r.   r   r      sd        $ $ $ $$ $ $ $$ $ $ $0 0 0 0 0 0r/   r   c                  J    e Zd Zdddddd#dZd$dZd%dZd&dZd'd!Zd(d"ZdS ))RouteNT)methodsr   include_in_schema
middlewarere   r   r_   r`   r   list[str] | Noner   
str | Noner   r?   r   "typing.Sequence[Middleware] | Noner"   r#   c                  |                     d          s
J d            || _        || _        |t          |          n|| _        || _        |}t          |t          j                  r!|j	        }t          |t          j                  !t          j        |          st          j        |          rt          |          | _        |dg}n|| _        |*t          |          D ]\  }}	}
 ||	d| j        i|
| _        |d | _        n4d |D             | _        d| j        v r| j                            d           t%          |          \  | _        | _        | _        d S )Nrw    Routed paths must start with '/'GETrU   c                6    h | ]}|                                 S r<   )upper).0methods     r.   	<setcomp>z!Route.__init__.<locals>.<setcomp>   s     AAAvFLLNNAAAr/   HEAD)r   re   r_   rd   r   r   rD   rE   rF   rG   rH   
isfunctionismethodrX   rU   reversedr   r   r   r   r   rf   )r+   re   r_   r   r   r   r   endpoint_handlerclsargskwargss              r.   r*   zRoute.__init__   s    s##GG%GGGG	 *.,HX&&&D	!2#)9+<== 	5/4 )9+<== 	5.// 	 73CDT3U3U 	 '11DH '  DH!%-j%9%9 > >!T63d=48=f==?DLLAAAAADL$$  (((COPTCUCU@)4+@+@+@r/   rM   r   r   c                   |d         dk    rt          |          }| j                            |          }|r|                                }|                                D ](\  }}| j        |                             |          ||<   )t          |                    di                     }|	                    |           | j
        |d}| j        r|d         | j        vrt          j        |fS t          j        |fS t          j        i fS )Nr   r   r    r_   r    r   )r   r   r   	groupdictrm   rf   convertdictgetr   r_   r   r6   r:   r;   r9   	r+   rM   
route_pathr   matched_paramsrq   rr   r    r   s	            r.   r   zRoute.matches   s   =F""'..JO))*55E 
3!&!2!2"0"6"6"8"8 T TJC*.*?*D*L*LU*S*SN3''"599]B#?#?@@"">222+/=UU< 3E(O4<$G$G =+55 :{22z2~r/   r    r>   r   c               8   t          |                                          }t          | j                                                  }|| j        k    s||k    rt	          ||          t          | j        | j        |          \  }}|rJ t          |d          S )Nr   re   protocolr   r(   rf   r   r   rt   r   r   r+   r   r    seen_paramsexpected_paramsre   remaining_paramss          r.   r   zRoute.url_path_for  s    +**,,--d388::;;49 > >t[111!/d3["
 "
 $###D62222r/   rN   r   rO   r   c                   K   | j         rg|d         | j         vrXdd                    | j                   i}d|v rt          d|          t          dd|          } ||||           d {V  d S |                     |||           d {V  d S )Nr   Allowr%   rU   i  )r   headerszMethod Not Allowed)r   r&   r   r   rU   )r+   rM   rN   rO   r   rS   s         r.   r   zRoute.handle  s      < 
	1E(O4<??		$, 7 78G~~#WEEEE,(c7   (5'400000000000((5'400000000000r/   otherc                    t          |t                    o/| j        |j        k    o| j        |j        k    o| j        |j        k    S rR   )rD   r   re   r_   r   r+   r   s     r.   __eq__zRoute.__eq__+  sI    ue$$ .	UZ'./. -		
r/   c                ~    | j         j        }t          | j        pg           }| j        | j        }}| d|d|d|dS )N(path=, name=z
, methods=r}   )r-   r0   r   r   re   r   )r+   
class_namer   re   r   s        r.   __repr__zRoute.__repr__3  sT    ^,
+,,Y	dQQDQQ4QQWQQQQr/   )re   r   r_   r`   r   r   r   r   r   r?   r   r   r"   r#   r   r   rV   r   r>   r"   r?   r"   r   	r0   r1   r2   r*   r   r   r   r   r   r<   r/   r.   r   r      s         %)"&9='V 'V 'V 'V 'V 'VR   $3 3 3 31 1 1 1
 
 
 
R R R R R Rr/   r   c                  F    e Zd ZdddddZd dZd!dZd"dZd#dZd$dZdS )%WebSocketRouteN)r   r   re   r   r_   r`   r   r   r   r   r"   r#   c               .   |                     d          s
J d            || _        || _        |t          |          n|| _        |}t          |t          j                  r!|j        }t          |t          j                  !t          j
        |          st          j        |          rt          |          | _        n|| _        |*t          |          D ]\  }}} ||d| j        i|| _        t          |          \  | _        | _        | _        d S )Nrw   r   rU   )r   re   r_   rd   r   rD   rE   rF   rG   rH   r   r   r^   rU   r   r   r   r   rf   )	r+   re   r_   r   r   r   r   r   r   s	            r.   r*   zWebSocketRoute.__init__;  s/    s##GG%GGGG	 *.,HX&&&D	#)9+<== 	5/4 )9+<== 	5.// 	 73CDT3U3U 	 (22DHH  DH!%-j%9%9 > >!T63d=48=f==COPTCUCU@)4+@+@+@r/   rM   r   r   c                   |d         dk    rt          |          }| j                            |          }|r|                                }|                                D ](\  }}| j        |                             |          ||<   )t          |                    di                     }|	                    |           | j
        |d}t          j        |fS t          j        i fS )Nr   r   r    r   )r   r   r   r   rm   rf   r   r   r   r   r_   r6   r;   r9   r   s	            r.   r   zWebSocketRoute.matchesX  s    =K'''..JO))*55E /!&!2!2"0"6"6"8"8 T TJC*.*?*D*L*LU*S*SN3''"599]B#?#?@@"">222+/=UUz;..z2~r/   r    r>   r   c               8   t          |                                          }t          | j                                                  }|| j        k    s||k    rt	          ||          t          | j        | j        |          \  }}|rJ t          |d          S )Nr   r   r   r   s          r.   r   zWebSocketRoute.url_path_forg  s    +**,,--d388::;;49 > >t[111!/d3["
 "
 $###D;7777r/   rN   r   rO   r   c                D   K   |                      |||           d {V  d S rR   rU   r   s       r.   r   zWebSocketRoute.handlet  4      hhugt,,,,,,,,,,,r/   r   r?   c                l    t          |t                    o| j        |j        k    o| j        |j        k    S rR   )rD   r   re   r_   r   s     r.   r   zWebSocketRoute.__eq__w  s6    un-- 0	UZ'0/	
r/   c                @    | j         j         d| j        d| j        dS )Nr   r   r}   )r-   r0   re   r   r+   s    r.   r   zWebSocketRoute.__repr__~  s*    .)SSSSTYSSSSr/   )
re   r   r_   r`   r   r   r   r   r"   r#   r   r   rV   r   r   r   r<   r/   r.   r   r   :  s          9=V V V V V V:   8 8 8 8- - - -
 
 
 
T T T T T Tr/   r   c                  d    e Zd Z	 	 	 d#ddd$dZed%d            Zd&dZd'dZd(dZd)d!Z	d*d"Z
dS )+MountNr   re   r   rU   ASGIApp | Noneroutes!typing.Sequence[BaseRoute] | Noner   r   r   r   r"   r#   c                  |dk    s|                     d          s
J d            ||
J d            |                    d          | _        ||| _        nt	          |          | _        | j        | _        |*t          |          D ]\  }}} ||d| j        i|| _        || _        t          | j        dz             \  | _	        | _
        | _        d S )Nry   rw   r   z0Either 'app=...', or 'routes=' must be specified)r   rU   z/{path:path})r   rstripre   	_base_appRouterrU   r   r   r   r   r   rf   )	r+   re   rU   r   r   r   r   r   r   s	            r.   r*   zMount.__init__  s     rzzT__S11zz3UzzzOv11=  211KK$$	?&)DNN#6222DN>!%-j%9%9 > >!T63d=48=f==	COI&D
 D
@)4+@+@+@r/   list[BaseRoute]c                .    t          | j        dg           S Nr   )getattrr  r   s    r.   r   zMount.routes  s    t~x444r/   rM   r   r   c                   |d         dv r+|                     dd          }t          |          }| j                            |          }|r|                                }|                                D ](\  }}| j        |                             |          ||<   )d|                    d          z   }|d t          |                    }	t          |                     di                     }
|
                    |           |
|                     d|          ||	z   | j        d	}t          j        |fS t          j        i fS )
Nr   r   r   	root_pathry   rw   re   r    app_root_path)r    r  r  r_   )r   r   r   r   r   rm   rf   r   rp   r   r   r   rU   r6   r;   r9   )r+   rM   r  r   r   r   rq   rr   remaining_pathmatched_pathr    r   s               r.   r   zMount.matches  sN   =111		+r22I'..JO))*55E /!&!2!2"0"6"6"8"8 T TJC*.*?*D*L*LU*S*SN3''!$~'9'9&'A'A!A)*@S-@-@,@*@A"599]B#?#?@@"">222#. &+YY	%J%J!*\!9 $   z;..z2~r/   r    r>   r   c                  | j         ^|| j         k    rSd|v rO|d                             d          |d<   t          | j        | j        |          \  }}|st          |          S n| j         |                    | j         dz             r| j         |}n|t          | j                   dz   d          }|                    d          }d|d<   t          | j        | j        |          \  }}|||d<   | j	        pg D ][}	  |j
        |fi |}	t          |                    d          t          |	          z   |	j                  c S # t          $ r Y Xw xY wt          ||          )Nre   rw   )re   rz   r7   ry   r   )r   r   rt   r   rf   r   r   r   r   r   r   r  r   r   r   )
r+   r   r    re   r   remaining_name
path_kwargpath_prefixrouteurls
             r.   r   zMount.url_path_for  s   9 TTY%6%66[;P;P"-f"5"<"<S"A"AK%3 $"7& &"D" $ *D))))*Y$//$)c/"B"By !% "&c$)nnq&8&:&:!;$00J"$K,: $"7- -)K) %+5 (*  ,%,^PP?OPPC"(//44s3xx?#,      $   D4---s   >AE
EErN   r   rO   r   c                D   K   |                      |||           d {V  d S rR   r   r   s       r.   r   zMount.handle  r   r/   r   r?   c                l    t          |t                    o| j        |j        k    o| j        |j        k    S rR   )rD   r   re   rU   r   s     r.   r   zMount.__eq__  s6    ue$$ &	UZ'&EI%	
r/   c                \    | j         j        }| j        pd}| d| j        d|d| j        dS )Nry   r   r   , app=r}   )r-   r0   r   re   rU   r+   r   r   s      r.   r   zMount.__repr__  B    ^,
yBSSDISSSSdhSSSSr/   )NNN)re   r   rU   r   r   r  r   r   r   r   r"   r#   r"   r  r   r   rV   r   r   r0   r1   r2   r*   propertyr   r   r   r   r   r   r<   r/   r.   r   r     s         #48
 :>
 
 
 
 
 
6 5 5 5 X5   B. . . .B- - - -
 
 
 
T T T T T Tr/   r   c                  X    e Zd Zddd
Zed d            Zd!dZd"dZd#dZd$dZ	d%dZ
dS )&HostNhostr   rU   r   r   r   r"   r#   c                    |                     d          r
J d            || _        || _        || _        t	          |          \  | _        | _        | _        d S )Nrw   zHost must not start with '/')r   r!  rU   r   r   
host_regexhost_formatrf   )r+   r!  rU   r   s       r.   r*   zHost.__init__  s[    ??3''GG)GGGG		COPTCUCU@)4+@+@+@r/   r  c                .    t          | j        dg           S r  )r	  rU   r   s    r.   r   zHost.routes  s    tx2...r/   rM   r   r   c                *   |d         dv rt          |          }|                    dd                              d          d         }| j                            |          }|r|                                }|                                D ](\  }}| j        |                             |          ||<   )t          |                    di                     }|
                    |           || j        d	}	t          j        |	fS t          j        i fS )
Nr   r  rM   r!  ry   rz   r   r    )r    r_   )r   r   r   r#  r   r   rm   rf   r   r   r   rU   r6   r;   r9   )
r+   rM   r   r!  r   r   rq   rr   r    r   s
             r.   r   zHost.matches   s   =111E***G;;vr**0055a8DO))$//E /!&!2!2"0"6"6"8"8 T TJC*.*?*D*L*LU*S*SN3''"599]B#?#?@@"">222.9txPPz;..z2~r/   r    r>   r   c               R   | j         V|| j         k    rKd|v rG|                    d          }t          | j        | j        |          \  }}|st          ||          S n| j         |                    | j         dz             r| j         |}n|t          | j                   dz   d          }t          | j        | j        |          \  }}| j        pg D ]F}	  |j	        |fi |}t          t          |          |j        |          c S # t          $ r Y Cw xY wt          ||          )Nre   )re   r!  rz   r7   )re   r   r!  )r   rp   rt   r$  rf   r   r   r   r   r   r   r   r   )	r+   r   r    re   r!  r   r  r  r  s	            r.   r   zHost.url_path_for  so   9 TTY%6%66[;P;P??6**D%3 $"7& &"D" $ 5Dt44445Y$//$)c/"B"By !% "&c$)nnq&8&:&:!;%3 $"7& &"D" *  ,%,^PP?OPPC"C3<dSSSSSS#   D4---s   1D		
DDrN   r   rO   r   c                D   K   |                      |||           d {V  d S rR   r   r   s       r.   r   zHost.handle*  r   r/   r   r?   c                l    t          |t                    o| j        |j        k    o| j        |j        k    S rR   )rD   r   r!  rU   r   s     r.   r   zHost.__eq__-  s6    ud## &	UZ'&EI%	
r/   c                \    | j         j        }| j        pd}| d| j        d|d| j        dS )Nry   z(host=r   r  r}   )r-   r0   r   r!  rU   r  s      r.   r   zHost.__repr__4  r  r/   rR   r!  r   rU   r   r   r   r"   r#   r  r   r   rV   r   r   r  r<   r/   r.   r   r     s        V V V V V / / / X/   . . . .6- - - -
 
 
 
T T T T T Tr/   r   _Tc                  &    e Zd ZddZddZddZdS )_AsyncLiftContextManagercmtyping.ContextManager[_T]c                    || _         d S rR   )_cm)r+   r0  s     r.   r*   z!_AsyncLiftContextManager.__init__>  s    r/   r"   r-  c                8   K   | j                                         S rR   )r3  	__enter__r   s    r.   
__aenter__z#_AsyncLiftContextManager.__aenter__A  s      x!!###r/   exc_typetype[BaseException] | None	exc_valueBaseException | None	tracebacktypes.TracebackType | Nonebool | Nonec                >   K   | j                             |||          S rR   )r3  __exit__)r+   r7  r9  r;  s       r.   	__aexit__z"_AsyncLiftContextManager.__aexit__D  s"       x  9i@@@r/   N)r0  r1  )r"   r-  )r7  r8  r9  r:  r;  r<  r"   r=  )r0   r1   r2   r*   r6  r@  r<   r/   r.   r/  r/  =  sV           $ $ $ $A A A A A Ar/   r/  lifespan_contextStyping.Callable[[typing.Any], typing.Generator[typing.Any, typing.Any, typing.Any]]Etyping.Callable[[typing.Any], typing.AsyncContextManager[typing.Any]]c                p    t          j        |           t          j                  dfd            }|S )NrU   r>   r"   $_AsyncLiftContextManager[typing.Any]c                4    t           |                     S rR   )r/  )rU   cmgrs    r.   wrapperz+_wrap_gen_lifespan_context.<locals>.wrapperT  s    'S		222r/   )rU   r>   r"   rE  )
contextlibcontextmanagerrE   wraps)rA  rH  rG  s     @r.   _wrap_gen_lifespan_contextrL  M  sP    
 $%566D_T3 3 3 3 3 3 Nr/   c                  .    e Zd ZddZddZdd	ZddZdS )_DefaultLifespanrouterr  c                    || _         d S rR   )_router)r+   rO  s     r.   r*   z_DefaultLifespan.__init__\  s    r/   r"   r#   c                H   K   | j                                          d {V  d S rR   )rQ  startupr   s    r.   r6  z_DefaultLifespan.__aenter___  s2      l""$$$$$$$$$$$r/   exc_infoobjectc                H   K   | j                                          d {V  d S rR   )rQ  shutdown)r+   rT  s     r.   r@  z_DefaultLifespan.__aexit__b  s2      l##%%%%%%%%%%%r/   r+   r-  rU   c                    | S rR   r<   )r+   rU   s     r.   r   z_DefaultLifespan.__call__e  s    r/   N)rO  r  r"   r#   )rT  rU  r"   r#   )r+   r-  rU   rU  r"   r-  )r0   r1   r2   r*   r6  r@  r   r<   r/   r.   rN  rN  [  sd           % % % %& & & &     r/   rN  c                      e Zd Z	 	 	 	 	 	 d?ddd@dZdAdZdBd ZdCd!ZdCd"ZdAd#ZdAd$Z	dAd%Z
dDd'Z	 dEdFd,Z	 dEdGd.Z	 	 	 dHdId4Z	 dEdJd6Z	 	 	 dHdKd8ZdEdLd9ZdMd=ZdNd>ZdS )Or  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                  |g nt          |          | _        || _        || j        n|| _        |g nt          |          | _        |g nt          |          | _        |s|r0t          j        dt                     |rt          j        d           |t          |           | _        nt          j        |          r/t          j        dt                     t          |          | _        nJt          j        |          r/t          j        dt                     t!          |          | _        n|| _        | j        | _        |r,t'          |          D ]\  }}	}
 || j        g|	R i |
| _        d 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_foundr\  r]  r_  rA   rB   rC   rN  rA  rH   isasyncgenfunctionr   isgeneratorfunctionrL  rU   middleware_stackr   )r+   r   r[  r\  r]  r_  r`  r   r   r   r   s              r.   r*   zRouter.__init__j  s    #NbbV 0)0t~~g * 2""Z8H8H!,!422${:K:K 	 	MK #	       :J4:P:PD!!'11 	-MJ"  
 %8% %D!! (22 
	-MJ"  
 %?% %D!! %-D! $ 	T%-j%9%9 T T!T6(+D,A(SD(S(S(SF(S(S%%	T 	TT Tr/   rM   r   rN   r   rO   r   c                   K   |d         dk    r#t                      } ||||           d {V  d S d|v rt          d          t          dd          } ||||           d {V  d S )Nr   r   rU   r   r   r   )r   r   r   )r+   rM   rN   rO   r   rS   s         r.   rc  zRouter.not_found  s      =K'',..O!/%$777777777F
 E>>C0000(#FFFHhugt,,,,,,,,,,,r/   r   r   r    r>   r   c               v    | j         D ]"}	  |j        |fi |c S # t          $ r Y w xY wt          ||          rR   )r   r   r   )r+   r   r    r  s       r.   r   zRouter.url_path_for  si    [ 	 	E)u)$>>+>>>>>   4---s   
((c                r   K   | j         D ],}t          |          r |             d{V  " |             -dS )z7
        Run any `.on_startup` event handlers.
        N)r]  r   r+   handlers     r.   rS  zRouter.startup  sY        	 	G )) gii						 	r/   c                r   K   | j         D ],}t          |          r |             d{V  " |             -dS )z8
        Run any `.on_shutdown` event handlers.
        N)r_  r   rj  s     r.   rW  zRouter.shutdown  sZ       ' 	 	G )) gii						 	r/   c                B  K   d}|                     d          } |             d{V  	 |                     |          4 d{V }|.d|vrt          d          |d                             |            |ddi           d{V  d} |             d{V  ddd          d{V  n# 1 d{V swxY w Y    |dd	i           d{V  dS # t          $ r@ t          j                    }|r |d
|d           d{V  n |d|d           d{V   w xY w)z{
        Handle ASGI lifespan messages, which allows us to manage application
        startup and shutdown events.
        FrU   Nstatez:The server does not support "state" in the lifespan scope.r   zlifespan.startup.completeTzlifespan.shutdown.completezlifespan.shutdown.failed)r   messagezlifespan.startup.failed)r   rA  RuntimeErrorr   BaseExceptionr;  
format_exc)r+   rM   rN   rO   startedrU   maybe_stateexc_texts           r.   r`  zRouter.lifespan  s>     
 ))E**gii	?,,S11 	  	  	  	  	  	  	 [*e++*X   'N))+666dF$?@AAAAAAAAAgii	  	  	  	  	  	  	  	  	  	  	  	  	  	  	  	  	  	  	  	  	  	  	  	  	  	  	 $ $ <=>>>>>>>>>>>  	 	 	 +--H Ud$>8TTUUUUUUUUUUd$=(SSTTTTTTTTT	s1   C AB.C .
B88C ;B8<C A
Dc                D   K   |                      |||           d{V  dS )z;
        The main entry point to the Router class.
        N)rf  r   s       r.   r   zRouter.__call__  s8       ##E7D99999999999r/   c                
  K   |d         dv sJ d|vr| |d<   |d         dk    r|                      |||           d {V  d S d }| j        D ]u}|                    |          \  }}|t          j        k    r5|                    |           |                    |||           d {V   d S |t          j        k    r||}|}v|4|                    |           |                    |||           d {V  d S t          |          }	|d         dk    r| j	        r|	dk    rt          |          }
|	                    d          r|
d                             d          |
d<   n|
d         dz   |
d<   | j        D ]m}|                    |
          \  }}|t          j        k    rCt          |
          }t          t!          |          	          } ||||           d {V   d S n|                     |||           d {V  d S )
Nr   )r   r   r`  rO  r`  r   rw   re   r'  )r  )r`  r   r   r6   r;   r   r   r:   r   r[  r   endswithr  r9   r   r   r   r\  )r+   rM   rN   rO   rF   r  r   r   partial_scoper   redirect_scoperedirect_urlrS   s                r.   rU   z
Router.app  s     V} AAAAA5  "E(O=J&&--w555555555F[ 
	, 
	,E "'u!5!5E;
""[)))ll5'4888888888%-''GO + LL'''..666666666F#E**
=F""t'<"sARAR!%[[N""3'' F)7)?)F)Fs)K)Kv&&)7)?#)Ev&  %*]]>%B%B"{EJ&&#&^#<#<#<L/C4E4EFFFH"(5'4888888888FF	 ' ll5'400000000000r/   r   c                L    t          |t                    o| j        |j        k    S rR   )rD   r  r   r   s     r.   r   zRouter.__eq__(  s     %((HT[EL-HHr/   re   rU   r   r   c                ^    t          |||          }| j                            |           d S N)rU   r   )r   r   append)r+   re   rU   r   r  s        r.   mountzRouter.mount+  s4     d$///5!!!!!r/   r!  c                ^    t          |||          }| j                            |           d S r~  )r   r   r  )r+   r!  rU   r   r  s        r.   r!  zRouter.host1  s4     Ts...5!!!!!r/   r_   rK   r   r   r   c                b    t          |||||          }| j                            |           d S )N)r_   r   r   r   )r   r   r  )r+   re   r_   r   r   r   r  s          r.   	add_routezRouter.add_route7  sE     /
 
 
 	5!!!!!r/   rY   c                ^    t          |||          }| j                            |           d S )N)r_   r   )r   r   r  )r+   re   r_   r   r  s        r.   add_websocket_routezRouter.add_websocket_routeH  s4     thTBBB5!!!!!r/   typing.Callablec                X     t          j        dt                     d f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.rG   r  r"   c                <                         |            | S )N)r   r   r   )r  )rG   r   r   r   re   r+   s    r.   	decoratorzRouter.route.<locals>.decoratore  s4    NN"3     Kr/   rG   r  r"   r  rA   rB   rC   )r+   re   r   r   r   r  s   ````` r.   r  zRouter.routeQ  s`     	d	
 	
 	
	 	 	 	 	 	 	 	 	 	 r/   c                P     t          j        dt                     d f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.rG   r  r"   c                8                         |            | S )N)r   )r  )rG   r   re   r+   s    r.   r  z)Router.websocket_route.<locals>.decorator  s#    $$T4d$;;;Kr/   r  r  )r+   re   r   r  s   ``` r.   websocket_routezRouter.websocket_routeq  sT     	`	
 	
 	
	 	 	 	 	 	 	 	 r/   
event_typerG   typing.Callable[[], typing.Any]c                    |dv sJ |dk    r| j                             |           d S | j                            |           d S )N)rS  rW  rS  )r]  r  r_  )r+   r  rG   s      r.   add_event_handlerzRouter.add_event_handler  sZ     44444""O""4(((((##D)))))r/   c                L     t          j        dt                     d f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.rG   r  r"   c                4                         |            | S rR   )r  )rG   r  r+   s    r.   r  z"Router.on_event.<locals>.decorator  s    "":t444Kr/   r  r  )r+   r  r  s   `` r.   on_eventzRouter.on_event  sL    T	
 	
 	
	 	 	 	 	 	 	 r/   )NTNNNN)r   r  r[  r?   r\  r   r]  r^  r_  r^  r`  ra  r   r   r"   r#   rV   r   rY  r   rR   )re   r   rU   r   r   r   r"   r#   r,  )NNT)re   r   r_   rK   r   r   r   r   r   r?   r"   r#   )re   r   r_   rY   r   r   r"   r#   )
re   r   r   r   r   r   r   r?   r"   r  )re   r   r   r   r"   r  )r  r   rG   r  r"   r#   )r  r   r"   r  )r0   r1   r2   r*   rc  r   rS  rW  r`  r   rU   r   r  r!  r  r  r  r  r  r  r<   r/   r.   r  r  i  s        59!%"&NROS 15<T :><T <T <T <T <T <T|- - - -. . . .      ? ? ? ?:: : : :01 01 01 01dI I I I ;?" " " " " ;?" " " " " %)"&" " " " "*  	" " " " " %)"&    @    (* * * *     r/   r  )r=   r>   r"   r?   )rG   rK   r"   r   )rG   rY   r"   r   )r_   r`   r"   r   )re   r   rf   rg   r    rh   r"   ri   )re   r   r"   ru   )rA  rB  r"   rC  )E
__future__r   rI  rE   rH   r   r;  typestypingrA   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   r6   rJ   rX   r^   rd   rt   r   r   r   r   r   r   r   r   TypeVarr-  AsyncContextManagerr/  rL  rN  r  r<   r/   r.   <module>r     sZ   " " " " " "          				        * * * * * *       E E E E E E > > > > > > > > 3 3 3 3 3 3 ; ; ; ; ; ; ; ; : : : : : : : : : : . . . . . . + + + + + + & & & & & & M M M M M M M M M M C C C C C C C C C C C C C C : : : : : : : :V V V V V9 V V V    D   , , , ,   .   &' ' ' '    bjOPP7A 7A 7A 7At0 0 0 0 0 0 0 0<bR bR bR bR bRI bR bR bRJET ET ET ET ETY ET ET ETPoT oT oT oT oTI oT oT oTdCT CT CT CT CT9 CT CT CTL V^DA A A A Av9"= A A A           q q q q q q q q q qr/   