
    F\hl                     "   S 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
Jr  / SQr " S S\R                  5      r " S	 S
\R                  5      r " S S\5      r " S S\5      r " S S5      r " S S\\\5      r " S S\\\5      rS rS r " S S\5      r " S S\5      r " S S\5      r " S S\5      r " S S \5      r " S! S"\5      r " S# S$5      r " S% S&\\5      r " S' S(\\5      r  " S) S*\\5      r! " S+ S,\5      r"g)-z4Utilities for with-statement contexts.  See PEP 343.    N)dequewraps)
MethodTypeGenericAlias)asynccontextmanagercontextmanagerclosingnullcontextAbstractContextManagerAbstractAsyncContextManagerAsyncExitStackContextDecorator	ExitStackredirect_stdoutredirect_stderrsuppressaclosingchdirc                   f    \ rS rSrSr\" \5      rSrS r	\
R                  S 5       r\S 5       rSrg)r      z,An abstract base class for context managers. c                     U $ z0Return `self` upon entering the runtime context.r   selfs    !/usr/lib/python3.13/contextlib.py	__enter__ AbstractContextManager.__enter__   s        c                     gz9Raise any exception triggered within the runtime context.Nr   r   exc_type	exc_value	tracebacks       r   __exit__AbstractContextManager.__exit__   s     r    c                 P    U [         L a  [        R                  " USS5      $ [        $ )Nr   r'   )r   _collections_abc_check_methodsNotImplementedclsCs     r   __subclasshook__'AbstractContextManager.__subclasshook__"   s&    ((#221k:NNr    N)__name__
__module____qualname____firstlineno____doc__classmethodr   __class_getitem__	__slots__r   abcabstractmethodr'   r0   __static_attributes__r   r    r   r   r      sH    6#L1I 	   r    r   c                   f    \ rS rSrSr\" \5      rSrS r	\
R                  S 5       r\S 5       rSrg)r   )   z9An abstract base class for asynchronous context managers.r   c                    #    U $ 7fr   r   r   s    r   
__aenter__&AbstractAsyncContextManager.__aenter__1   s
        c                    #    g7fr"   r   r#   s       r   	__aexit__%AbstractAsyncContextManager.__aexit__5   s
         c                 P    U [         L a  [        R                  " USS5      $ [        $ )Nr@   rD   )r   r*   r+   r,   r-   s     r   r0   ,AbstractAsyncContextManager.__subclasshook__:   s-    --#221l3>@ @r    N)r2   r3   r4   r5   r6   r7   r   r8   r9   r@   r:   r;   rD   r0   r<   r   r    r   r   r   )   sH    C#L1I 	   r    r   c                   $    \ rS rSrSrS rS rSrg)r   B   zJA base class or mixin that enables context managers to work as decorators.c                     U $ )a  Return a recreated instance of self.

Allows an otherwise one-shot context manager like
_GeneratorContextManager to support use as
a decorator via implicit recreation.

This is a private interface just for _GeneratorContextManager.
See issue #11647 for details.
r   r   s    r   _recreate_cmContextDecorator._recreate_cmE   s	     r    c                 4   ^ ^ [        T5      UU 4S j5       nU$ )Nc                  j   > TR                  5          T" U 0 UD6sS S S 5        $ ! , (       d  f       g = fNrL   argskwdsfuncr   s     r   inner(ContextDecorator.__call__.<locals>.innerR   s(    ""$T*T* %$$s   $
2r   r   rU   rV   s   `` r   __call__ContextDecorator.__call__Q   s     	t	+ 
	+ r    r   Nr2   r3   r4   r5   r6   rL   rY   r<   r   r    r   r   r   B   s    P
r    r   c                   $    \ rS rSrSrS rS rSrg)AsyncContextDecoratorY   zPA base class or mixin that enables async context managers to work as decorators.c                     U $ )z-Return a recreated instance of self.
        r   r   s    r   rL   "AsyncContextDecorator._recreate_cm\   s	     r    c                 4   ^ ^ [        T5      UU 4S j5       nU$ )Nc                     >#    TR                  5        IS h  vN   T" U 0 UD6I S h  vN sS S S 5      IS h  vN   $  N% N N	! , IS h  vN  (       d  f       g = f7frP   rQ   rR   s     r   rV   -AsyncContextDecorator.__call__.<locals>.innerb   sA     ((**!40400 +**0 +***sP   A>AAA AAAA AAA
AAAr   rX   s   `` r   rY   AsyncContextDecorator.__call__a   s     	t	1 
	1 r    r   Nr[   r   r    r   r]   r]   Y   s    V
r    r]   c                   $    \ rS rSrSrS rS rSrg)_GeneratorContextManagerBasei   zBShared functionality for @contextmanager and @asynccontextmanager.c                     U" U0 UD6U l         XUsU l        U l        U l        [	        USS 5      nUc  [        U 5      R                  nX@l        g )Nr6   )genrU   rS   rT   getattrtyper6   )r   rU   rS   rT   docs        r   __init__%_GeneratorContextManagerBase.__init__l   sN    &&*.d'	49didIt,;t*$$Cr    c                 d    U R                  U R                  U R                  U R                  5      $ rP   )	__class__rU   rS   rT   r   s    r   rL   )_GeneratorContextManagerBase._recreate_cmz   s#     ~~diiDII>>r    )r6   rS   rU   ri   rT   N)r2   r3   r4   r5   r6   rm   rL   r<   r   r    r   rf   rf   i   s    L?r    rf   c                   $    \ rS rSrSrS rS rSrg)_GeneratorContextManager   z%Helper for @contextmanager decorator.c                 n    U ? U ?U ? [        U R                  5      $ ! [
         a    [        S5      S ef = fNzgenerator didn't yield)rS   rT   rU   nextri   StopIterationRuntimeErrorr   s    r   r   "_GeneratorContextManager.__enter__   sD     Ity$)	C>! 	C78dB	Cs    4c                 R   Uc"   [        U R                  5         [        S5      eUc  U" 5       n U R                  R                  U5         [        S5      e! U R                  R                  5         f = f! [         a     gf = f! [         a  nXBLs S nA$ S nAf[         aD  nXBL a  X4l         S nAg[        U[        5      (       a  UR                  UL a  X2l         S nAge S nAf[         a  nXBLa  e X4l         S nAgS nAff = f! U R                  R                  5         f = f)Ngenerator didn't stopFz#generator didn't stop after throw())
rw   ri   ry   closerx   throw__traceback__
isinstance	__cause__BaseExceptionr   typvaluer&   excs        r   r'   !_GeneratorContextManager.__exit__   s   ;%TXX%&'>?? } #u%F!"#HIIW HHNN$ !  ! ( '' <(1%  um44.*3'   
 #$-!
  si   A7 A B D
 A47
BB
DBDD&
C%5*C%$C%%D2DD
D&r   N)r2   r3   r4   r5   r6   r   r'   r<   r   r    r   rs   rs      s    
 0C7!r    rs   c                   $    \ rS rSrSrS rS rSrg)_AsyncGeneratorContextManager   z*Helper for @asynccontextmanager decorator.c                    #    U ? U ?U ? [        U R                  5      I S h  vN $  N! [
         a    [        S5      S ef = f7frv   )rS   rT   rU   anextri   StopAsyncIterationry   r   s    r   r@   (_AsyncGeneratorContextManager.__aenter__   sL      Ity$)	Ctxx(((! 	C78dB	Cs%   A) ') A) A  Ac                   #    Uc*   [        U R                  5      I S h  vN    [        S5      eUc  U" 5       n U R                  R                  U5      I S h  vN    [        S5      e NJ! U R                  R                  5       I S h  vN    f = f! [         a     gf = f NJ! [         a  nXBLs S nA$ S nAf[         aJ  nXBL a  X4l         S nAg[        U[        [        45      (       a  UR                  UL a  X2l         S nAge S nAf[         a  nXBLa  e X4l         S nAgS nAff = f! U R                  R                  5       I S h  vN    f = f7f)Nr|   Fz$generator didn't stop after athrow())r   ri   ry   acloser   athrowr   r   rx   r   r   r   s        r   rD   '_AsyncGeneratorContextManager.__aexit__   s6    ;,DHHo%%,&'>?? } #hhooe,,,F("#IJJe & ((//+++ &  -% ( '' <(1%  u}6H&IJJ.*3'   
 #$-!
 hhoo'''s   EB A*B A, 
EB& B$B& D/ *B ,B
BBE
B!E B!!E$B& &
D,0B82D,3E8D,
D
E0D
E	D

D,D'"E'D,,E/EEEEr   N)r2   r3   r4   r5   r6   r@   rD   r<   r   r    r   r   r      s    
 5C7(r    r   c                 0   ^  [        T 5      U 4S j5       nU$ )a  @contextmanager decorator.

Typical usage:

    @contextmanager
    def some_generator(<arguments>):
        <setup>
        try:
            yield <value>
        finally:
            <cleanup>

This makes this:

    with some_generator(<arguments>) as <variable>:
        <body>

equivalent to this:

    <setup>
    try:
        <variable> = <value>
        <body>
    finally:
        <cleanup>
c                     > [        TX5      $ rP   )rs   rS   rT   rU   s     r   helpercontextmanager.<locals>.helper/  s    'd99r    r   rU   r   s   ` r   r	   r	     s     6 4[: :Mr    c                 0   ^  [        T 5      U 4S j5       nU$ )a  @asynccontextmanager decorator.

Typical usage:

    @asynccontextmanager
    async def some_async_generator(<arguments>):
        <setup>
        try:
            yield <value>
        finally:
            <cleanup>

This makes this:

    async with some_async_generator(<arguments>) as <variable>:
        <body>

equivalent to this:

    <setup>
    try:
        <variable> = <value>
        <body>
    finally:
        <cleanup>
c                     > [        TX5      $ rP   )r   r   s     r   r   #asynccontextmanager.<locals>.helperP  s    ,T4>>r    r   r   s   ` r   r   r   5  s     6 4[? ?Mr    c                   *    \ rS rSrSrS rS rS rSrg)r
   iV  a
  Context to automatically close something at the end of a block.

Code like this:

    with closing(<module>.open(<arguments>)) as f:
        <block>

is equivalent to this:

    f = <module>.open(<arguments>)
    try:
        <block>
    finally:
        f.close()

c                     Xl         g rP   thingr   r   s     r   rm   closing.__init__g      
r    c                     U R                   $ rP   r   r   s    r   r   closing.__enter__i  s    zzr    c                 8    U R                   R                  5         g rP   )r   r}   r   exc_infos     r   r'   closing.__exit__k  s    

r    r   N	r2   r3   r4   r5   r6   rm   r   r'   r<   r   r    r   r
   r
   V  s     r    r
   c                   *    \ rS rSrSrS rS rS rSrg)r   io  ar  Async context manager for safely finalizing an asynchronously cleaned-up
resource such as an async generator, calling its ``aclose()`` method.

Code like this:

    async with aclosing(<module>.fetch(<arguments>)) as agen:
        <block>

is equivalent to this:

    agen = <module>.fetch(<arguments>)
    try:
        <block>
    finally:
        await agen.aclose()

c                     Xl         g rP   r   r   s     r   rm   aclosing.__init__  r   r    c                 "   #    U R                   $ 7frP   r   r   s    r   r@   aclosing.__aenter__  s     zz   c                 T   #    U R                   R                  5       I S h  vN   g  N7frP   )r   r   r   s     r   rD   aclosing.__aexit__  s     jj!!!s   (&(r   N)	r2   r3   r4   r5   r6   rm   r@   rD   r<   r   r    r   r   r   o  s    ""r    r   c                   *    \ rS rSrSrS rS rS rSrg)_RedirectStreami  Nc                     Xl         / U l        g rP   _new_target_old_targets)r   
new_targets     r   rm   _RedirectStream.__init__  s    %r    c                     U R                   R                  [        [        U R                  5      5        [        [        U R                  U R                  5        U R                  $ rP   )r   appendrj   sys_streamsetattrr   r   s    r   r   _RedirectStream.__enter__  sC      dll!;<T\\4#3#34r    c                 j    [        [        U R                  U R                  R	                  5       5        g rP   )r   r   r   r   pop)r   exctypeexcinstexctbs       r   r'   _RedirectStream.__exit__  s!    T\\4#4#4#8#8#:;r    r   )	r2   r3   r4   r5   r   rm   r   r'   r<   r   r    r   r   r     s    G
 
<r    r   c                       \ rS rSrSrSrSrg)r   i  a  Context manager for temporarily redirecting stdout to another file.

# How to send help() to stderr
with redirect_stdout(sys.stderr):
    help(dir)

# How to write help() to a file
with open('help.txt', 'w') as f:
    with redirect_stdout(f):
        help(pow)
stdoutr   Nr2   r3   r4   r5   r6   r   r<   r   r    r   r   r     s    
 Gr    r   c                       \ rS rSrSrSrSrg)r   i  zCContext manager for temporarily redirecting stderr to another file.stderrr   Nr   r   r    r   r   r     s
    MGr    r   c                   *    \ rS rSrSrS rS rS rSrg)r   i  a'  Context manager to suppress specified exceptions

After the exception is suppressed, execution proceeds with the next
statement following the with statement.

     with suppress(FileNotFoundError):
         os.remove(somefile)
     # Execution still resumes here if the file was already removed
c                     Xl         g rP   _exceptions)r   
exceptionss     r   rm   suppress.__init__  s    %r    c                     g rP   r   r   s    r   r   suppress.__enter__      r    c                     Uc  g [        XR                  5      (       a  g[        U[        5      (       a#  UR                  U R                  5      u  pEUc  gUeg)NTF)
issubclassr   BaseExceptionGroupsplit)r   r   r   r   matchrests         r   r'   suppress.__exit__  sT     ?g//00g122!--(8(89KE|Jr    r   Nr   r   r    r   r   r     s    &r    r   c                   f    \ rS rSrSr\S 5       r\S 5       rS rS r	S r
S rS	 rS
 rSS jrSrg)_BaseExitStacki  z.A base class for ExitStack and AsyncExitStack.c                     [        X5      $ rP   r   cmcm_exits     r   _create_exit_wrapper#_BaseExitStack._create_exit_wrapper      '&&r    c                   ^ ^^ UU U4S jnU$ )Nc                    > T" T0 TD6  g rP   r   r$   r   tbrS   callbackrT   s      r   _exit_wrapper8_BaseExitStack._create_cb_wrapper.<locals>._exit_wrapper  s    d#d#r    r   r   rS   rT   r   s   ``` r   _create_cb_wrapper!_BaseExitStack._create_cb_wrapper  s    	$r    c                 "    [        5       U l        g rP   )r   _exit_callbacksr   s    r   rm   _BaseExitStack.__init__  s    $wr    c                 f    [        U 5      " 5       nU R                  Ul        [        5       U l        U$ )z@Preserve the context stack by transferring it to a new instance.)rk   r   r   )r   	new_stacks     r   pop_all_BaseExitStack.pop_all  s+    JL	$($8$8	!$wr    c                     [        U5      n UR                  nU R                  X5        U$ ! [         a    U R	                  U5         U$ f = f)zRegisters a callback with the standard __exit__ method signature.

Can suppress exceptions the same way __exit__ method can.
Also accepts any object with an __exit__ method (registering a call
to the method instead of the object itself).
)rk   r'   _push_cm_exitAttributeError_push_exit_callbackr   exit_cb_typeexit_methods       r   push_BaseExitStack.push  sX     :	2"++K
 t1  	+$$T* 	+s   , A
Ac                     [        U5      n UR                  nUR                  nU" U5      nU R                  X5        U$ ! [         a(    [	        SUR
                   SUR                   S35      Sef = f)zEnters the supplied context manager.

If successful, also pushes its __exit__ method as a callback and
returns the result of the __enter__ method.
'.z6' object does not support the context manager protocolN)rk   r   r'   r   	TypeErrorr3   r4   r   r   r   r.   _enter_exitresults         r   enter_context_BaseExitStack.enter_context  s     2h	S]]FLLE 2%  	Sa/q1A1A0B CG H INRS	Ss   A   2A2c                `    U R                   " U/UQ70 UD6nXl        U R                  U5        U$ )zLRegisters an arbitrary callback and arguments.

Cannot suppress exceptions.
)r   __wrapped__r   r   r   rS   rT   r   s        r   r   _BaseExitStack.callback  s9    
 //H4H4H %-!  /r    c                 J    U R                  X5      nU R                  US5        g)z;Helper to correctly register callbacks to __exit__ methods.TN)r   r   r   r   r   r   s       r   r   _BaseExitStack._push_cm_exit#  s"    11">  5r    c                 <    U R                   R                  X!45        g rP   )r   r   )r   r   is_syncs      r   r   "_BaseExitStack._push_exit_callback(  s    ##W$78r    )r   N)T)r2   r3   r4   r5   r6   staticmethodr   r   rm   r   r   r  r   r   r   r<   r   r    r   r   r     sN    8' '  
'(&6
9r    r   c                   *    \ rS rSrSrS rS rS rSrg)r   i-  ao  Context manager for dynamic management of a stack of exit callbacks.

For example:
    with ExitStack() as stack:
        files = [stack.enter_context(open(fname)) for fname in filenames]
        # All opened files will automatically be closed at the end of
        # the with statement, even if attempts to open files later
        # in the list raise an exception.
c                     U $ rP   r   r   s    r   r   ExitStack.__enter__8  s    r    c                   ^ US   nUS Ln[         R                  " 5       mU4S jnSnSnU R                  (       af  U R                  R                  5       u  pxU(       d   e Uc  SnO[	        U5      X"R
                  4nU" U6 (       a  SnSnS nU R                  (       a  Mf  U(       a   UR                  n
UeU=(       a    U$ ! [         a  n	U" X5        SnU	n S n	A	NOS n	A	ff = f! [         a	    W
Ul        e f = f)N   c                 P   >  U R                   nUb  X!L a  g UTL a  OUn M  Xl         g rP   __context__new_excold_excexc_context	frame_excs      r   _fix_exception_context2ExitStack.__exit__.<locals>._fix_exception_contextB  <    %11&+*@)+%  #*r    FNNNTr   	exceptionr   r   rk   r   r   r  )r   exc_detailsr   received_excr"  suppressed_excpending_raiser  cbr  	fixed_ctxr!  s              @r   r'   ExitStack.__exit__;  s   !n$ MMO		*  ""..224KGN7;"2K"&s)S2C2C"CK{#%)N$)MC """$   OO		 .. ! &w4 $	 ! "+s$   !-C )C% 
C"CC"%C8c                 *    U R                  SSS5        gz%Immediately unwind the context stack.N)r'   r   s    r   r}   ExitStack.closeq  s    dD$'r    r   N)	r2   r3   r4   r5   r6   r   r'   r}   r<   r   r    r   r   r   -  s    4/l(r    r   c                   b    \ rS rSrSr\S 5       r\S 5       rS rS r	S r
S rS	 rS
 rS rSrg)r   iw  a  Async context manager for dynamic management of a stack of exit
callbacks.

For example:
    async with AsyncExitStack() as stack:
        connections = [await stack.enter_async_context(get_connection())
            for i in range(5)]
        # All opened connections will automatically be released at the
        # end of the async with statement, even if attempts to open a
        # connection later in the list raise an exception.
c                     [        X5      $ rP   r   r   s     r   _create_async_exit_wrapper)AsyncExitStack._create_async_exit_wrapper  r   r    c                   ^ ^^ UU U4S jnU$ )Nc                 2   >#    T" T0 TD6I S h  vN   g  N7frP   r   r   s      r   r   >AsyncExitStack._create_async_cb_wrapper.<locals>._exit_wrapper  s     D)D)))s   r   r   s   ``` r   _create_async_cb_wrapper'AsyncExitStack._create_async_cb_wrapper  s    	*r    c                   #    [        U5      n UR                  nUR                  nU" U5      I Sh  vN nU R                  X5        U$ ! [         a(    [	        SUR
                   SUR                   S35      Sef = f NL7f)zEnters the supplied async context manager.

If successful, also pushes its __aexit__ method as a callback and
returns the result of the __aenter__ method.
r  r  zC' object does not support the asynchronous context manager protocolN)rk   r@   rD   r   r  r3   r4   _push_async_cm_exitr  s         r   enter_async_context"AsyncExitStack.enter_async_context  s      2h	'^^FMME
 bz!  +  	'a/q1A1A0B CT U "&'	' "s%   BA
 BA?B
2A<<Bc                     [        U5      n UR                  nU R                  X5        U$ ! [         a    U R	                  US5         U$ f = f)zRegisters a coroutine function with the standard __aexit__ method
signature.

Can suppress exceptions the same way __aexit__ method can.
Also accepts any object with an __aexit__ method (registering a call
to the method instead of the object itself).
F)rk   rD   r<  r   r   r   s       r   push_async_exitAsyncExitStack.push_async_exit  sZ     :	8",,K
 $$T7  	2$$T51 	2s   , AAc                b    U R                   " U/UQ70 UD6nXl        U R                  US5        U$ )zVRegisters an arbitrary coroutine function and arguments.

Cannot suppress exceptions.
F)r9  r  r   r  s        r   push_async_callback"AsyncExitStack.push_async_callback  s;    
 55hNNN %-!  6r    c                 F   #    U R                  SSS5      I Sh  vN   g N7fr0  )rD   r   s    r   r   AsyncExitStack.aclose  s     nnT4...s   !!c                 J    U R                  X5      nU R                  US5        g)zDHelper to correctly register coroutine function to __aexit__
method.FN)r4  r   r  s       r   r<  "AsyncExitStack._push_async_cm_exit  s$     77D  6r    c                    #    U $ 7frP   r   r   s    r   r@   AsyncExitStack.__aenter__  s
     rB   c                   ^#    US   nUS Ln[         R                  " 5       mU4S jnSnSnU R                  (       at  U R                  R                  5       u  px Uc  SnO[	        U5      X"R
                  4nU(       a  U" U6 n	OU" U6 I S h  vN n	U	(       a  SnSnS nU R                  (       a  Mt  U(       a   UR                  nUeU=(       a    U$  NE! [         a  n
U" X5        SnU
n S n
A
NQS n
A
ff = f! [         a	    WUl        e f = f7f)Nr  c                 P   >  U R                   nUb  X!L a  g UTL a  OUn M  Xl         g rP   r  r  s      r   r"  8AsyncExitStack.__aexit__.<locals>._fix_exception_context  r$  r    Fr%  Tr&  )r   r(  r   r)  r"  r*  r+  r  r,  cb_suppressr  r-  r!  s               @r   rD   AsyncExitStack.__aexit__  s    !n$ MMO		*  ""..224KG;"2K"&s)S2C2C"CK"$k"2K(*K(8"8K%)N$)MC """,   OO		 ..+ #9 ! &w4 $	 ! "+s`   AD2C CC D1D9C7 DC 
C4C/*D/C44D7D

Dr   N)r2   r3   r4   r5   r6   r  r4  r9  r=  r@  rC  r   r<  r@   rD   r<   r   r    r   r   r   w  sR    
 ' '  
$$/78/r    r   c                   :    \ rS rSrSrS
S jrS rS rS rS r	S	r
g)r   i  a7  Context manager that does no additional processing.

Used as a stand-in for a normal context manager, when a particular
block of code is only sometimes used with a normal context manager:

cm = optional_cm if condition else nullcontext()
with cm:
    # Perform operation, using optional_cm if condition is True
Nc                     Xl         g rP   enter_result)r   rS  s     r   rm   nullcontext.__init__  s    (r    c                     U R                   $ rP   rR  r   s    r   r   nullcontext.__enter__  s       r    c                     g rP   r   r   excinfos     r   r'   nullcontext.__exit__  r   r    c                 "   #    U R                   $ 7frP   rR  r   s    r   r@   nullcontext.__aenter__  s        r   c                    #    g 7frP   r   rX  s     r   rD   nullcontext.__aexit__  s     rF   rR  rP   )r2   r3   r4   r5   r6   rm   r   r'   r@   rD   r<   r   r    r   r   r     s     )!!r    r   c                   *    \ rS rSrSrS rS rS rSrg)r   i"  zHNon thread-safe context manager to change the current working directory.c                     Xl         / U l        g rP   )path_old_cwd)r   ra  s     r   rm   chdir.__init__%  s    	r    c                     U R                   R                  [        R                  " 5       5        [        R                  " U R
                  5        g rP   )rb  r   osgetcwdr   ra  r   s    r   r   chdir.__enter__)  s*    RYY[)
r    c                 `    [         R                  " U R                  R                  5       5        g rP   )re  r   rb  r   rX  s     r   r'   chdir.__exit__-  s    
""$%r    )rb  ra  Nr   r   r    r   r   r   "  s    R&r    r   )#r6   r:   re  r   r*   collectionsr   	functoolsr   typesr   r   __all__ABCr   r   objectr   r]   rf   rs   r   r	   r   r
   r   r   r   r   r   r   r   r   r   r   r   r    r   <module>rp     s9   : 
 	 
    *SWW 0#'' 2v .F  ? ?0G! G!RG( G(TBB$ 2"* "4<, <$o  o $% $NQ9 Q9jF( 6 F(TM/^%@ M/`(*E 6&" &r    