
    g	                       S SK Jr  S SKrS SKrS SKrS SKrS SKrS SKrS SKrS SK	r	S SKJ
r
  S SKJr  S SKJr  S SKJrJr  S SKJr  S SKJrJr  S S	KJrJrJr  S S
KJr  S SKJr  S SKJ r   S SK!J"r"J#r#J$r$  S SK%J&r&J'r'J(r(J)r)J*r*  S SK+J,r,J-r-   " S S\.5      r/ " S S\5      r0S-S jr1    S.S jr2    S/S jr3S0S jr4        S1S jr5\Rl                  " S5      r7    S2S jr8 " S S5      r9 " S S\95      r: " S S \95      r; " S! S"\95      r< " S# S$\95      r=\R|                  " S%5      r? " S& S'\R                  \?   5      rA    S3S( jrB " S) S*5      rC " S+ S,5      rDg)4    )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                  0   ^  \ rS rSrSrSU 4S jjrSrU =r$ )NoMatchFound   zq
Raised by `.url_for(name, **path_params)` and `.url_path_for(name, **path_params)`
if no matching route exists.
c                   > SR                  [        UR                  5       5      5      n[        TU ]  SU SU S35        g )N, zNo route exists for name "z" and params "z".)joinlistkeyssuper__init__)selfnamepath_paramsparams	__class__s       J/home/matz/Project1/venv/lib/python3.13/site-packages/starlette/routing.pyr%   NoMatchFound.__init__!   s=    4 0 0 2345dV>&QSTU     )r'   strr(   zdict[str, typing.Any]returnNone)__name__
__module____qualname____firstlineno____doc__r%   __static_attributes____classcell__)r*   s   @r+   r   r      s    
V Vr-   r   c                       \ rS rSrSrSrSrSrg)Match&   r         r.   N)r2   r3   r4   r5   NONEPARTIALFULLr7   r.   r-   r+   r:   r:   &   s    DGDr-   r:   c                    [         R                  " S[        5        [        U [        R
                  5      (       a-  U R                  n [        U [        R
                  5      (       a  M-  [        R                  " U 5      $ )zr
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)objs    r+   iscoroutinefunction_or_partialrL   ,   sZ    
 MM` S)++
,
,hh S)++
,
,&&s++r-   c                r   ^ [        U 5      (       a  U O[        R                  " [        U 5      mSU4S jjnU$ )z]
Takes a function or coroutine `func(request) -> response`,
and returns an ASGI application.
c                t   >^#    [        XU5      mSUU4S jjn[        UT5      " XU5      I S h  vN   g  N7f)Nc                X   >#    T" T5      I S h  vN nU" XU5      I S h  vN   g  N N7fNr.   )scopereceivesendresponsefrequests       r+   app*request_response.<locals>.app.<locals>.appH   s*     wZ'H54000 (0s   *&*(**rQ   r   rR   r   rS   r   r0   r1   )r   r   )rQ   rR   rS   rW   rV   rU   s       @r+   rW   request_response.<locals>.appE   s5     %$/	1 	1 +38NNNs   ,868rY   )r   rF   rG   r	   )rH   rW   rU   s     @r+   request_responser[   :   s5     "$''Y->->?PRV-W O Jr-   c                   ^  SU 4S jjnU$ )zE
Takes a coroutine `func(session)`, and returns an ASGI application.
c                p   >^#    [        XUS9mSUU4S jjn[        UT5      " XU5      I S h  vN   g  N7f)N)rR   rS   c                2   >#    T" T5      I S h  vN   g  N7frP   r.   )rQ   rR   rS   rH   sessions      r+   rW   +websocket_session.<locals>.app.<locals>.app\   s     w-s   rY   )r   r   )rQ   rR   rS   rW   r_   rH   s       @r+   rW   websocket_session.<locals>.appY   s5     E>	  	  +38NNNs   *646rY   r.   )rH   rW   s   ` r+   websocket_sessionrb   Q   s    O Jr-   c                D    [        U SU R                  R                  5      $ )Nr2   )getattrr*   r2   )endpoints    r+   get_namerf   d   s    8Z););)D)DEEr-   c                    [        UR                  5       5       HQ  u  p4SU-   S-   U ;   d  M  X   nUR                  U5      nU R                  SU-   S-   U5      n UR	                  U5        MS     X4$ )N{})r"   items	to_stringreplacepop)pathparam_convertorsr(   keyvalue	convertors         r+   replace_paramsrs   h   su    
 ;,,./
9s?d"(-I''.E<<c	C7DOOC  0 r-   z4{([a-zA-Z_][a-zA-Z0-9_]*)(:[a-zA-Z_][a-zA-Z0-9_]*)?}c                   U R                  S5      (       + nSnSn[        5       nSn0 n[        R                  U 5       H  nUR	                  S5      u  pU	R                  S5      n	U	[        ;   d   SU	 S35       e[        U	   n
U[        R                  " XUR                  5        5      -  nUS	U S
U
R                   S3-  nX0XWR                  5        -  nUSU-  -  nX;   a  UR                  U5        XU'   UR                  5       nM     U(       aA  SR                  [        U5      5      n[        U5      S:  a  SOSn[!        SU SU SU  35      eU(       a3  XS R#                  S5      S   nU[        R                  " U5      S-   -  nOU[        R                  " XS 5      S-   -  nX0US -  n[        R$                  " U5      X64$ )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    r<   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)rn   is_host
path_regexpath_formatduplicated_paramsidxro   match
param_nameconvertor_typerr   namesendinghostnames                 r+   compile_pathr   z   s    //#&&GJK
C%%d+%*\\%%8"
'..s30^4L^L\\]2^^0#N3	bii5;;= 9::
ZL)//):!<<
C++-00v
**)!!*-'0$iik# ,& 		&!234-.20%	$PQQ:##C(+bii)C//
biiT
+c11
:K::j!;@@r-   c                  <    \ rS rSrSS jrS	S jrS
S jrS
S jrSrg)	BaseRoute   c                    [        5       erP   NotImplementedError)r&   rQ   s     r+   matchesBaseRoute.matches       !##r-   c                   [        5       erP   r   )r&   r'   r(   s      r+   url_path_forBaseRoute.url_path_for   r   r-   c                   #    [        5       e7frP   r   r&   rQ   rR   rS   s       r+   handleBaseRoute.handle   s     !##s   c                P  #    U R                  U5      u  pEU[        R                  :X  aJ  US   S:X  a  [        SSS9nU" XU5      I Sh  vN   gUS   S:X  a  [	        5       nU" XU5      I Sh  vN   gUR                  U5        U R                  XU5      I Sh  vN   g NV N3 N	7f)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   r:   r>   r   r   updater   )r&   rQ   rR   rS   r   child_scoperT   websocket_closes           r+   __call__BaseRoute.__call__   s      "\\%0EJJV}&,[cJut444  v+-"0"2%ed;;;[!kk%$/// 5 < 	0s6   AB&	B 
$B&.B"/+B&B$B&"B&$B&r.   NrQ   r   r0   ztuple[Match, Scope]r'   r/   r(   
typing.Anyr0   r   rY   )	r2   r3   r4   r5   r   r   r   r   r7   r.   r-   r+   r   r      s    $$$0r-   r   c                  x    \ rS rSrSSSSS.             SS jjrSS jrSS jrSS jrSS	 jrSS
 jr	Sr
g)Route   NT)methodsr'   include_in_schema
middlewarec               0   UR                  S5      (       d   S5       eXl        X l        Uc  [        U5      OUU l        XPl        Un[        U[        R                  5      (       a-  UR                  n[        U[        R                  5      (       a  M-  [        R                  " U5      (       d  [        R                  " U5      (       a  [        U5      U l        Uc  S/nOX l        Ub0  [        U5       H!  u  pn
U" U R                  /U	Q70 U
D6U l        M#     Uc  S U l        OPU Vs1 s H  oR#                  5       iM     snU l        SU R                   ;   a  U R                   R%                  S5        ['        U5      u  U l        U l        U l        g s  snf )Nru    Routed paths must start with '/'GETHEAD)r   rn   re   rf   r'   r   rE   rF   rG   rH   rI   
isfunctionismethodr[   rW   reversedr   upperr   r   r   r   ro   )r&   rn   re   r   r'   r   r   endpoint_handlerclsargskwargsmethods               r+   r%   Route.__init__   sZ    s##G%GG#	 *.,HX&D	!2#)9+<+<==/44 )9+<+<==.//73C3CDT3U3U'1DH '  H!%-j%9!6txx9$9&9 &: ?DL9@AvLLNADL$  (COPTCU@)4+@	 Bs   (Fc                *   US   S:X  a  [        U5      nU R                  R                  U5      nU(       a  UR                  5       nUR	                  5        H%  u  pVU R
                  U   R                  U5      XE'   M'     [        UR                  S0 5      5      nUR                  U5        U R                  US.nU R                  (       a%  US   U R                  ;  a  [        R                  U4$ [        R                  U4$ [        R                  0 4$ )Nr   r   r(   re   r(   r   )r   r   r   	groupdictrj   ro   convertdictgetr   re   r   r:   r?   r@   r>   	r&   rQ   
route_pathr   matched_paramsrp   rq   r(   r   s	            r+   r   Route.matches   s    =F"'.JOO))*5E!&!2"0"6"6"8JC*.*?*?*D*L*LU*SN' #9"599]B#?@"">2+/==U<<E(O4<<$G ==+55 ::{22zz2~r-   c               $   [        UR                  5       5      n[        U R                  R                  5       5      nXR                  :w  d  X4:w  a  [	        X5      e[        U R                  U R                  U5      u  pVU(       a   e[        USS9$ )Nr   rn   protocolr   r#   ro   r'   r   rs   r   r   r&   r'   r(   seen_paramsexpected_paramsrn   remaining_paramss          r+   r   Route.url_path_for  s|    +**,-d3388:;99 >t11!/0@0@$BWBWYd!e###D622r-   c                $  #    U R                   (       a]  US   U R                   ;  aJ  SSR                  U R                   5      0nSU;   a
  [        SUS9e[        SSUS9nU" XU5      I S h  vN   g U R	                  XU5      I S h  vN   g  N  N7f)Nr   Allowr    rW   i  )r   headerszMethod Not Allowed)r   r!   r   r   rW   )r&   rQ   rR   rS   r   rT   s         r+   r   Route.handle  s     <<E(O4<<?		$,, 78G~#WEE,-As\cd54000((54000 10s$   A)B+B,BBBBc                    [        U[        5      =(       aY    U R                  UR                  :H  =(       a9    U R                  UR                  :H  =(       a    U R                  UR                  :H  $ rP   )rE   r   rn   re   r   r&   others     r+   __eq__Route.__eq__"  sR    ue$ .		UZZ'./. -		
r-   c                    U R                   R                  n[        U R                  =(       d    / 5      nU R                  U R
                  pCU SU< SU< SU< S3$ )N(path=, name=z
, methods=r{   )r*   r2   r   r   rn   r'   )r&   
class_namer   rn   r'   s        r+   __repr__Route.__repr__*  sR    ^^,,
+,YY		dVD874(*WKqQQr-   )	rW   re   r   r   r'   ro   rn   r   r   )rn   r/   re    typing.Callable[..., typing.Any]r   list[str] | Noner'   
str | Noner   boolr   "typing.Sequence[Middleware] | Noner0   r1   r   r   rY   r   r   r0   r   r0   r/   r2   r3   r4   r5   r%   r   r   r   r   r   r7   r.   r-   r+   r   r      s|     %)"&9='V'V 3'V
 "'V 'V  'V 7'V 
'VR$	3	1
Rr-   r   c                  l    \ rS rSrSSS.         SS jjrSS jrSS jrSS jrSS jrSS	 jr	S
r
g)WebSocketRoutei1  N)r'   r   c               X   UR                  S5      (       d   S5       eXl        X l        Uc  [        U5      OUU l        Un[        U[        R                  5      (       a-  UR                  n[        U[        R                  5      (       a  M-  [        R                  " U5      (       d  [        R                  " U5      (       a  [        U5      U l        OX l        Ub0  [        U5       H!  u  pgnU" U R                  /UQ70 UD6U l        M#     [        U5      u  U l        U l        U l        g )Nru   r   )r   rn   re   rf   r'   rE   rF   rG   rH   rI   r   r   rb   rW   r   r   r   r   ro   )	r&   rn   re   r'   r   r   r   r   r   s	            r+   r%   WebSocketRoute.__init__2  s     s##G%GG#	 *.,HX&D	#)9+<+<==/44 )9+<+<==.//73C3CDT3U3U(2DH  H!%-j%9!6txx9$9&9 &: DPPTCU@)4+@r-   c                   US   S:X  a  [        U5      nU R                  R                  U5      nU(       a  UR                  5       nUR	                  5        H%  u  pVU R
                  U   R                  U5      XE'   M'     [        UR                  S0 5      5      nUR                  U5        U R                  US.n[        R                  U4$ [        R                  0 4$ )Nr   r   r(   r   )r   r   r   r   rj   ro   r   r   r   r   re   r:   r@   r>   r   s	            r+   r   WebSocketRoute.matchesO  s    =K''.JOO))*5E!&!2"0"6"6"8JC*.*?*?*D*L*LU*SN' #9"599]B#?@"">2+/==Uzz;..zz2~r-   c               $   [        UR                  5       5      n[        U R                  R                  5       5      nXR                  :w  d  X4:w  a  [	        X5      e[        U R                  U R                  U5      u  pVU(       a   e[        USS9$ )Nr   r   r   r   s          r+   r   WebSocketRoute.url_path_for^  s|    +**,-d3388:;99 >t11!/0@0@$BWBWYd!e###D;77r-   c                D   #    U R                  XU5      I S h  vN   g  N7frP   rW   r   s       r+   r   WebSocketRoute.handlei       hhut,,,     c                    [        U[        5      =(       a9    U R                  UR                  :H  =(       a    U R                  UR                  :H  $ rP   )rE   r   rn   re   r   s     r+   r   WebSocketRoute.__eq__l  s9    %0pTYY%**5LpQUQ^Q^bgbpbpQppr-   c                l    U R                   R                   SU R                  < SU R                  < S3$ )Nr   r   r{   )r*   r2   rn   r'   r&   s    r+   r   WebSocketRoute.__repr__o  s/    ..))*&WTYYMQRSSr-   )rW   re   r'   ro   rn   r   r   )
rn   r/   re   r   r'   r   r   r   r0   r1   r   r   rY   r   r   r   r.   r-   r+   r   r   1  s`      9=VV 3V
 V 7V 
V:	8-qTr-   r   c                      \ rS rSr   SSS.           SS jjjr\SS j5       rSS jrSS jrSS jr	SS	 jr
SS
 jrSrg)Mountis  Nr   c                  US:X  d  UR                  S5      (       d   S5       eUc
  Uc   S5       eUR                  S5      U l        Ub  X l        O[	        US9U l        U R                  U l        Ub0  [        U5       H!  u  pgnU" U R
                  /UQ70 UD6U l        M#     X@l        [        U R                  S-   5      u  U l	        U l
        U l        g )Nrw   ru   r   z0Either 'app=...', or 'routes=' must be specified)routesz/{path:path})r   rstriprn   	_base_appRouterrW   r   r'   r   r   r   ro   )	r&   rn   rW   r  r'   r   r   r   r   s	            r+   r%   Mount.__init__t  s     rzT__S11U3UU1&"4h6hh4KK$	?&)N#62DN>>!%-j%9!6txx9$9&9 &:	COPTPYPY\jPjCk@)4+@r-   c                0    [        U R                  S/ 5      $ Nr  )rd   r  r
  s    r+   r  Mount.routes  s    t~~x44r-   c                R   US   S;   Ga  UR                  SS5      n[        U5      nU R                  R                  U5      nU(       a  UR	                  5       nUR                  5        H%  u  pgU R                  U   R                  U5      XV'   M'     SUR                  S5      -   nUS [        U5      *  n	[        UR                  S0 5      5      n
U
R                  U5        U
UR                  SU5      X)-   U R                  S	.n[        R                  U4$ [        R                  0 4$ )
Nr   r   r   	root_pathrw   ru   rn   r(   app_root_path)r(   r  r  re   )r   r   r   r   r   rj   ro   r   rm   r   r   r   rW   r:   r@   r>   )r&   rQ   r  r   r   r   rp   rq   remaining_pathmatched_pathr(   r   s               r+   r   Mount.matches  s   =11		+r2I'.JOO))*5E!&!2"0"6"6"8JC*.*?*?*D*L*LU*SN' #9!$~'9'9&'A!A)*@S-@,@A"599]B#?@"">2#. &+YY	%J!*!9 $  zz;..zz2~r-   c                  U R                   b`  XR                   :X  aQ  SU;   aK  US   R                  S5      US'   [        U R                  U R                  U5      u  p4U(       d	  [        US9$ OU R                   b#  UR                  U R                   S-   5      (       a  U R                   c  UnOU[        U R                   5      S-   S  nUR                  S5      nSUS'   [        U R                  U R                  U5      u  ptUb  XdS'   U R                  =(       d    /  HF  n UR                  " U40 UD6n	[        UR                  S5      [        U	5      -   U	R                  S9s  $    [        X5      e! [         a     Mb  f = f)Nrn   ru   )rn   rx   r<   rw   r   )r'   r   rs   r   ro   r   r   r   r   r  r   r  r/   r   r   )
r&   r'   r(   rn   r   remaining_name
path_kwargpath_prefixrouteurls
             r+   r   Mount.url_path_for  sp   99 TYY%66[;P"-f"5"<"<S"AK%3D4D4DdF[F[]h%i"D#D)) $YY$//$))c/"B"Byy !% "&c$))nq&8&:!;$0J"$K,:4;K;KTMbMbdo,p)K%+5(**,,^P?OPC"(:(:3(?#c((JUXUaUabb + 4-- $ s   "AE33
F Fc                D   #    U R                  XU5      I S h  vN   g  N7frP   r  r   s       r+   r   Mount.handle  r  r  c                    [        U[        5      =(       a9    U R                  UR                  :H  =(       a    U R                  UR                  :H  $ rP   )rE   r  rn   rW   r   s     r+   r   Mount.__eq__  s6    %']DII,C]TYT]T]H]]r-   c                    U R                   R                  nU R                  =(       d    SnU SU R                  < SU< SU R                  < S3$ )Nrw   r   r   , app=r{   )r*   r2   r'   rn   rW   r&   r   r'   s      r+   r   Mount.__repr__  F    ^^,,
yyBVDII=xvdhh\QRSSr-   )r  rW   r'   ro   rn   r   r   )NNN)rn   r/   rW   ASGIApp | Noner  !typing.Sequence[BaseRoute] | Noner'   r   r   r   r0   r1   r0   zlist[BaseRoute]r   r   rY   r   r   r2   r3   r4   r5   r%   propertyr  r   r   r   r   r   r7   r.   r-   r+   r  r  s  s     #48l :>ll l 2	l
 l 7l 
l. 5 5B.6-^Tr-   r  c                  h    \ rS rSrSSS jjr\SS j5       rSS jrSS jrSS jr	SS jr
SS	 jrS
rg)Hosti  Nc                    UR                  S5      (       a   S5       eXl        X l        X0l        [	        U5      u  U l        U l        U l        g )Nru   zHost must not start with '/')r   hostrW   r'   r   
host_regexhost_formatro   )r&   r7  rW   r'   s       r+   r%   Host.__init__  sF    ??3''G)GG'		COPTCU@)4+@r-   c                0    [        U R                  S/ 5      $ r  )rd   rW   r
  s    r+   r  Host.routes  s    txx2..r-   c                    US   S;   a  [        US9nUR                  SS5      R                  S5      S   nU R                  R	                  U5      nU(       a  UR                  5       nUR                  5        H%  u  pgU R                  U   R                  U5      XV'   M'     [        UR                  S0 5      5      nUR                  U5        XR                  S	.n	[        R                  U	4$ [        R                  0 4$ )
Nr   r  rQ   r7  rw   rx   r   r(   )r(   re   )r   r   r   r8  r   r   rj   ro   r   r   r   rW   r:   r@   r>   )
r&   rQ   r   r7  r   r   rp   rq   r(   r   s
             r+   r   Host.matches  s    =11E*G;;vr*005a8DOO))$/E!&!2"0"6"6"8JC*.*?*?*D*L*LU*SN' #9"599]B#?@"">2.9xxPzz;..zz2~r-   c                  U R                   bZ  XR                   :X  aK  SU;   aE  UR                  S5      n[        U R                  U R                  U5      u  pEU(       d	  [        X4S9$ OU R                   b#  UR                  U R                   S-   5      (       a  U R                   c  UnOU[        U R                   5      S-   S  n[        U R                  U R                  U5      u  pEU R                  =(       d    /  H5  n UR                  " U40 UD6n[        [        U5      UR                  US9s  $    [        X5      e! [         a     MQ  f = f)Nrn   )rn   r7  rx   r<   )rn   r   r7  )r'   rm   rs   r9  ro   r   r   r   r  r   r/   r   r   )	r&   r'   r(   rn   r7  r   r   r#  r$  s	            r+   r   Host.url_path_for  s-   99 TYY%66[;P??6*D%3D4D4DdF[F[]h%i"D#D44 $YY$//$))c/"B"Byy !% "&c$))nq&8&:!;%3D4D4DdF[F[]h%i"D**,,^P?OPC"C3<<dSS + 4-- $ s   ?0D??
EEc                D   #    U R                  XU5      I S h  vN   g  N7frP   r  r   s       r+   r   Host.handle	  r  r  c                    [        U[        5      =(       a9    U R                  UR                  :H  =(       a    U R                  UR                  :H  $ rP   )rE   r5  r7  rW   r   s     r+   r   Host.__eq__  s6    %&\499

+B\txxSXS\S\G\\r-   c                    U R                   R                  nU R                  =(       d    SnU SU R                  < SU< SU R                  < S3$ )Nrw   z(host=r   r+  r{   )r*   r2   r'   r7  rW   r,  s      r+   r   Host.__repr__  r.  r-   )rW   r7  r9  r8  r'   ro   rP   r7  r/   rW   r   r'   r   r0   r1   r1  r   r   rY   r   r   r2  r.   r-   r+   r5  r5    s7    V / /..-]Tr-   r5  _Tc                  B    \ rS rSrSS jrSS jr        S	S jrSrg)
_AsyncLiftContextManageri  c                    Xl         g rP   _cm)r&   cms     r+   r%   !_AsyncLiftContextManager.__init__  s    r-   c                >   #    U R                   R                  5       $ 7frP   )rN  	__enter__r
  s    r+   
__aenter__#_AsyncLiftContextManager.__aenter__  s     xx!!##s   c                B   #    U R                   R                  XU5      $ 7frP   )rN  __exit__)r&   exc_type	exc_value	tracebacks       r+   	__aexit__"_AsyncLiftContextManager.__aexit__  s      xx  i@@s   rM  N)rO  ztyping.ContextManager[_T])r0   rI  )rW  ztype[BaseException] | NonerX  zBaseException | NonerY  ztypes.TracebackType | Noner0   zbool | None)r2   r3   r4   r5   r%   rS  rZ  r7   r.   r-   r+   rK  rK    s<    $A,A (A .	A
 
Ar-   rK  c                v   ^ [         R                  " U 5      m[        R                  " T5      SU4S jj5       nU$ )Nc                &   > [        T" U 5      5      $ rP   )rK  )rW   cmgrs    r+   wrapper+_wrap_gen_lifespan_context.<locals>.wrapper-  s    'S	22r-   )rW   r   r0   z$_AsyncLiftContextManager[typing.Any])
contextlibcontextmanagerrF   wraps)lifespan_contextr_  r^  s     @r+   _wrap_gen_lifespan_contextre  (  s8     $$%56D__T3 3 Nr-   c                  <    \ rS rSrSS jrS	S jrS
S jrSS jrSrg)_DefaultLifespani4  c                    Xl         g rP   _router)r&   routers     r+   r%   _DefaultLifespan.__init__5  s    r-   c                T   #    U R                   R                  5       I S h  vN   g  N7frP   )rj  startupr
  s    r+   rS  _DefaultLifespan.__aenter__8  s     ll""$$$   (&(c                T   #    U R                   R                  5       I S h  vN   g  N7frP   )rj  shutdown)r&   exc_infos     r+   rZ  _DefaultLifespan.__aexit__;  s     ll##%%%rp  c                    U $ rP   r.   )r&   rW   s     r+   r   _DefaultLifespan.__call__>  s    r-   ri  N)rk  r  r0   r1   )rs  objectr0   r1   )r&   rI  rW   rx  r0   rI  )	r2   r3   r4   r5   r%   rS  rZ  r   r7   r.   r-   r+   rg  rg  4  s    %&r-   rg  c                  P   \ rS rSr      SSS.               SS jjjrSS jrSS jrSS jrSS jrSS	 jr	SS
 jr
SS jrSS jrSSS jjrSSS jjr   S           S S jjr S       S!S jjr   S         S"S jjrSS#S jjrS$S jrS%S jrSrg)&r  iB  Nr  c               (   Uc  / O
[        U5      U l        X l        Uc  U R                  OUU l        Uc  / O
[        U5      U l        Uc  / O
[        U5      U l        U(       d  U(       a8  [        R                  " S[        5        U(       a  [        R                  " S5        Uc  [        U 5      U l        O[        R                  " U5      (       a,  [        R                  " S[        5        [        U5      U l        OM[        R                  " U5      (       a,  [        R                  " S[        5        [!        U5      U l        OX`l        U R"                  U l        U(       a1  ['        U5       H!  u  pn
U" U R$                  /U	Q70 U
D6U l        M#     g g )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  redirect_slashes	not_founddefault
on_startupon_shutdownrB   rC   rD   rg  rd  rI   isasyncgenfunctionr   isgeneratorfunctionre  rW   middleware_stackr   )r&   r  r{  r}  r~  r  lifespanr   r   r   r   s              r+   r%   Router.__init__C  sY    #NbV 0)0t~~g * 2"Z8H!,!42${:KMMK #	  :J4:PD!''11MMJ"
 %8%D! ((22MMJ"
 %?%D! %-! $%-j%9!6(+D,A,A(SD(SF(S% &: r-   c                   #    US   S:X  a  [        5       nU" XU5      I S h  vN   g SU;   a	  [        SS9e[        SSS9nU" XU5      I S h  vN   g  N0 N7f)Nr   r   rW   r   r   r   )r   r   r   )r&   rQ   rR   rS   r   rT   s         r+   r|  Router.not_found  sf     =K',.O!%$777
 E>C00(#FHut,,, 8 	-s!    AA*AAAAc                   U R                    H  n UR                  " U40 UD6s  $    [        X5      e! [         a     M3  f = frP   )r  r   r   )r&   r'   r(   r#  s       r+   r   Router.url_path_for  sL    [[E))$>+>> !
 4--   s   3
A Ac                   #    U R                    H+  n[        U5      (       a  U" 5       I Sh  vN   M$  U" 5         M-     g N7f)z'
Run any `.on_startup` event handlers.
N)r~  r   r&   handlers     r+   rn  Router.startup  s1      G ))i		 '   *A?Ac                   #    U R                    H+  n[        U5      (       a  U" 5       I Sh  vN   M$  U" 5         M-     g N7f)z(
Run any `.on_shutdown` event handlers.
N)r  r   r  s     r+   rr  Router.shutdown  s3      ''G ))i		 (r  c                T  #    SnUR                  S5      nU" 5       I Sh  vN    U R                  U5       ISh  vN nUb%  SU;  a  [        S5      eUS   R                  U5        U" SS05      I Sh  vN   SnU" 5       I Sh  vN   SSS5      ISh  vN   U" SS	05      I Sh  vN   g N Nt N< N- N! , ISh  vN  (       d  f       N4= f N)! [         aG    [
        R                  " 5       nU(       a  U" S
US.5      I Sh  vN    e U" SUS.5      I Sh  vN    e f = f7f)zc
Handle ASGI lifespan messages, which allows us to manage application
startup and shutdown events.
FrW   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   rd  RuntimeErrorr   BaseExceptionrY  
format_exc)r&   rQ   rR   rS   startedrW   maybe_stateexc_texts           r+   r  Router.lifespan  s    
 ))E*i	?,,S11[*e+*+ghh'N))+6F$?@AAAi 21   <=>>>% 	1
 B 2111  ?  	 ++-H$>8TUUU  $=(STTT	s   D(B.D(C B0C 6B85B26B8B4B8C B6C D((C)D(0C 2B84B86C 8C>C?CC D(4D%D	D%D D%%D(c                D   #    U R                  XU5      I Sh  vN   g N7f)z+
The main entry point to the Router class.
N)r  r   s       r+   r   Router.__call__  s      ##ED999r  c                  #    US   S;   d   eSU;  a  XS'   US   S:X  a  U R                  XU5      I S h  vN   g S nU R                   Hv  nUR                  U5      u  pgU[        R                  :X  a-  UR                  U5        UR                  XU5      I S h  vN     g U[        R                  :X  d  Mm  Ub  Mr  UnUnMx     Ub,  UR                  W5        UR                  XU5      I S h  vN   g [        U5      n	US   S:X  a  U R                  (       a  U	S:w  a  [        U5      n
U	R                  S5      (       a  U
S   R                  S5      U
S'   OU
S   S-   U
S'   U R                   HX  nUR                  U
5      u  pgU[        R                  :w  d  M,  [        U
S9n[        [!        U5      S	9nU" XU5      I S h  vN     g    U R#                  XU5      I S h  vN   g  GN GNN N N+ N7f)
Nr   )r   r   r  rk  r  r   ru   rn   r>  )r$  )r  r  r   r:   r@   r   r   r?   r   r{  r   endswithr  r>   r   r   r/   r}  )r&   rQ   rR   rS   rG   r#  r   r   partial_scoper   redirect_scoperedirect_urlrT   s                r+   rW   
Router.app  s    V} AAAA5 "(O=J&--555[[E "'u!5E

"[)ll54888%--'GO + !  LL'..666#E*
=F"t'<'<sAR!%[N""3'')7)?)F)Fs)Kv&)7)?#)Ev&%*]]>%B"EJJ&#&^#<L/C4EFH"54888 % ll54000S 6 9 7  9 	1sk   4G1G%A#G1G(G17G1<1G1-G+.B(G1'G1G-G1G/ G1(G1+G1-G1/G1c                b    [        U[        5      =(       a    U R                  UR                  :H  $ rP   )rE   r  r  r   s     r+   r   Router.__eq__  s!    %(HT[[ELL-HHr-   c                N    [        XUS9nU R                  R                  U5        g N)rW   r'   )r  r  append)r&   rn   rW   r'   r#  s        r+   mountRouter.mount  s     d$/5!r-   c                N    [        XUS9nU R                  R                  U5        g r  )r5  r  r  )r&   r7  rW   r'   r#  s        r+   r7  Router.host  s     T.5!r-   c                T    [        UUUUUS9nU R                  R                  U5        g )N)re   r   r'   r   )r   r  r  )r&   rn   re   r   r'   r   r#  s          r+   	add_routeRouter.add_route
  s1     /
 	5!r-   c                N    [        XUS9nU R                  R                  U5        g )N)re   r'   )r   r  r  )r&   rn   re   r'   r#  s        r+   add_websocket_routeRouter.add_websocket_route  s"     tTB5!r-   c                ^   ^ ^^^^ [         R                  " S[        5        SUUUUU 4S jjnU$ )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.c                .   > TR                  TU TTTS9  U $ )N)r   r'   r   )r  )rH   r   r   r'   rn   r&   s    r+   	decoratorRouter.route.<locals>.decorator8  s*    NN"3   Kr-   rH   typing.Callabler0   r  rB   rC   rD   )r&   rn   r   r'   r   r  s   ````` r+   r#  Router.route$  s,     	d	
	 	 r-   c                V   ^ ^^ [         R                  " S[        5        SUUU 4S jjnU$ )z
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.c                *   > TR                  TU TS9  U $ )N)r'   )r  )rH   r'   rn   r&   s    r+   r  )Router.websocket_route.<locals>.decoratorR  s    $$T4d$;Kr-   r  r  )r&   rn   r'   r  s   ``` r+   websocket_routeRouter.websocket_routeD  s,     	`	
	 	 r-   c                    US;   d   eUS:X  a  U R                   R                  U5        g U R                  R                  U5        g )N)rn  rr  rn  )r~  r  r  )r&   
event_typerH   s      r+   add_event_handlerRouter.add_event_handlerX  s?    4444"OO""4(##D)r-   c                R   ^ ^ [         R                  " S[        5        SUU 4S jjnU$ )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.c                ,   > TR                  TU 5        U $ rP   )r  )rH   r  r&   s    r+   r  "Router.on_event.<locals>.decoratorg  s    "":t4Kr-   r  r  )r&   r  r  s   `` r+   on_eventRouter.on_event`  s*    T	
	 	 r-   )r}  rd  r  r  r~  r{  r  )NTNNNN)r  r0  r{  r   r}  r/  r~  7typing.Sequence[typing.Callable[[], typing.Any]] | Noner  r  r  zLifespan[typing.Any] | Noner   r   r0   r1   rY   r   rw  r   rP   )rn   r/   rW   r   r'   r   r0   r1   rH  )NNT)rn   r/   re   Atyping.Callable[[Request], typing.Awaitable[Response] | Response]r   r   r'   r   r   r   r0   r1   )rn   r/   re   4typing.Callable[[WebSocket], typing.Awaitable[None]]r'   r   r0   r1   )
rn   r/   r   r   r'   r   r   r   r0   r  )rn   r/   r'   r   r0   r  )r  r/   rH   ztyping.Callable[[], typing.Any]r0   r1   )r  r/   r0   r  )r2   r3   r4   r5   r%   r|  r   rn  rr  r  r   rW   r   r  r7  r  r  r#  r  r  r  r7   r.   r-   r+   r  r  B  s    59!%"&NROS 15<T :><T1<T <T  	<T
 L<T M<T .<T 7<T 
<T|-.?6:01dI"" %)"&"" T" "	"
 "  " 
"*  	"" G" 	"
 
" %)"& " 	
   
@(*r-   r  )rK   r   r0   r   )rH   r  r0   r   )rH   r  r0   r   )re   r   r0   r/   )rn   r/   ro   z dict[str, Convertor[typing.Any]]r(   zdict[str, str]r0   ztuple[str, dict[str, str]])rn   r/   r0   zAtuple[typing.Pattern[str], str, dict[str, Convertor[typing.Any]]])rd  zStyping.Callable[[typing.Any], typing.Generator[typing.Any, typing.Any, typing.Any]]r0   zEtyping.Callable[[typing.Any], typing.AsyncContextManager[typing.Any]])E
__future__r   ra  rF   rI   r   rY  typestypingrB   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   r:   rL   r[   rb   rf   rs   r   r   r   r   r   r   r  r5  TypeVarrI  AsyncContextManagerrK  re  rg  r  r.   r-   r+   <module>r     s   "    	     *  E > 3 ; : : . + & M M C C :V9 VD ,
K.
>&F
6    	 jjOP5A
5AF5Ap0 0<^RI ^RB?TY ?TDaTI aTH;T9 ;T| ^^DAv99"= A 	i	J	 i ir-   