
    5\h:                        d Z ddlZddlZddlZddlZ	 ddlmZ n# e$ r d ZY nw xY w	 ddlmZ n# e$ r d ZY nw xY wddl	m
Z
  G d d	          Z G d
 de          Ze G d de                      Ze G d de                      Z G d de          Z G d de          Z G d d          Z G d deej                  Z G d d          Z G d dee          Z G d dee          Z G d dee          Z G d  d!eej                  Z G d" d#          Z G d$ d%ee          Z G d& d'ee          Z G d( d)ee          Z G d* d+eej                  Z G d, d-e          Ze G d. d/e                      Ze G d0 d1e                      Z e G d2 d3ee                      Z!e
j"         G d4 d5eej                              Z#e$d6k    r ej%                     dS dS )7zB
Tests for object finalization semantics, as outlined in PEP 442.
    N)with_tp_delc                 ,     G d dt                     }|S )Nc                       e Zd Zd ZdS )with_tp_del.<locals>.Cc                      t          d          )Nzrequires _testcapi.with_tp_del	TypeErrorclsargskwargss      @/opt/python-3.11.14/usr/lib/python3.11/test/test_finalization.py__new__zwith_tp_del.<locals>.C.__new__   s     @AAA    N__name__
__module____qualname__r    r   r   Cr      s(        B B B B Br   r   )objectr   r   s     r   r   r      s;    	B 	B 	B 	B 	B 	B 	B 	B r   )
without_gcc                       G d d          }|S )Nc                       e Zd Zd ZdS )without_gc.<locals>.Cc                      t          d          )Nzrequires _testcapi.without_gcr   r
   s      r   r   zwithout_gc.<locals>.C.__new__   s     ?@@@r   Nr   r   r   r   r   r      s(        A A A A Ar   r   r   r   s     r   r   r      s9    	A 	A 	A 	A 	A 	A 	A 	A r   )supportc                       e Zd ZdZg Zg Zg Zg ZdZdZ	e
d             Ze
ej        d                         Zd Zd Zd Zd	S )
NonGCSimpleBasezd
    The base class for all the objects under test, equipped with various
    testing features.
    Fr   c                 0   | j                                          | j                                         t          j                                         t          j                     | j                                         | j                                         d S N)	survivorsclearerrorsgcgarbagecollect	del_callstp_del_callsr   s    r   _cleanupzNonGCSimpleBase._cleanup.   sx    




     r   c              #     K   t          j                    5  | j                                         | j                                         dt
          _        	 dV  | j        r| j        d         	 dt
          _        |                                  n%# dt
          _        |                                  w xY w	 ddd           dS # 1 swxY w Y   dS )zI
        A context manager to use around all finalization tests.
        FNr   T)	r   
disable_gcr)   r$   r*   r    	_cleaningr%   r,   r+   s    r   testzNonGCSimpleBase.test7   s      !! 
	 
	M!!!""$$$(-O%: (*Q-'( -1) -1)
	 
	 
	 
	 
	 
	 
	 
	 
	 
	 
	 
	 
	 
	 
	 
	 
	 
	s)   ?CB/!C"B22CC
Cc                     dS )z8
        Check the object is sane (non-broken).
        Nr   selfs    r   check_sanityzNonGCSimpleBase.check_sanityI         r   c                    	 | j         sQ| j                            t          |                      |                                  |                                  dS dS # t          $ r%}| j                            |           Y d}~dS d}~ww xY w)z
        PEP 442 finalizer.  Record that this was called, check the
        object is in a sane state, and invoke a side effect.
        N)r/   r)   appendidr4   side_effect	Exceptionr%   r3   es     r   __del__zNonGCSimpleBase.__del__N   s    
	"> #%%bhh///!!###  """""# #  	" 	" 	"Kq!!!!!!!!!	"   AA 
B&BBc                     dS )z6
        A side effect called on destruction.
        Nr   r2   s    r   r9   zNonGCSimpleBase.side_effect[   r5   r   N)r   r   r   __doc__r#   r)   r*   r%   r/   	__slots__classmethodr,   
contextlibcontextmanagerr0   r4   r=   r9   r   r   r   r    r       s         
 IILFII! ! [!    [   
" " "    r   r    c                       e Zd Zd Zd ZdS )
SimpleBasec                 .    t          |           | _        d S r"   )r8   id_r2   s    r   __init__zSimpleBase.__init__c   s    d88r   c                     d S r"   r   r2   s    r   r4   zSimpleBase.check_sanityf   r5   r   N)r   r   r   rI   r4   r   r   r   rF   rF   a   s2          $ $ $ $ $r   rF   c                       e Zd ZdZdS )NonGCr   N)r   r   r   rA   r   r   r   rL   rL   j   s        IIIr   rL   c                       e Zd ZdZd ZdS )NonGCResurrectorr   c                 :    | j                             |            dS zF
        Resurrect self by storing self in a class-wide list.
        Nr#   r7   r2   s    r   r9   zNonGCResurrector.side_effectr         	d#####r   N)r   r   r   rA   r9   r   r   r   rN   rN   n   s(        I$ $ $ $ $r   rN   c                       e Zd ZdS )SimpleNr   r   r   r   r   r   rT   rT   x           Dr   rT   c                       e Zd Zd ZdS )SimpleResurrectorc                 :    | j                             |            dS rP   rQ   r2   s    r   r9   zSimpleResurrector.side_effect~   rR   r   Nr   r   r   r9   r   r   r   rX   rX   |   s#        $ $ $ $ $r   rX   c                   8    e Zd Zd Zd Zd Zd Zd Zd Zd Z	dS )	TestBasec                 Z    t           j        d d          | _        g t           j        d d <   d S r"   )r&   r'   old_garbager2   s    r   setUpzTestBase.setUp   s'    :aaa=
111r   c                     	 |                      t          j        g            | `t          j                     d S # | `t          j                     w xY wr"   )assertEqualr&   r'   r^   r(   r2   s    r   tearDownzTestBase.tearDown   sM    	RZ,,, JLLLLL  JLLLLs	    9 Ac                 z    |                      t          t          j                  t          |                     d S r"   )ra   sortedrF   r)   r3   idss     r   assert_del_callszTestBase.assert_del_calls   s/    
 455vc{{CCCCCr   c                 z    |                      t          t          j                  t          |                     d S r"   )ra   rd   rF   r*   re   s     r   assert_tp_del_callszTestBase.assert_tp_del_calls   s/    
 788&++FFFFFr   c                     |                      t          d t          j        D                       t          |                     d S )Nc              3   4   K   | ]}t          |          V  d S r"   r8   .0xs     r   	<genexpr>z,TestBase.assert_survivors.<locals>.<genexpr>   s(      DD!1DDDDDDr   )ra   rd   rF   r#   re   s     r   assert_survivorszTestBase.assert_survivors   s>    DDz/CDDDDDfSkkRRRRRr   c                     |                      t          d t          j        D                       t          |                     d S )Nc              3   4   K   | ]}t          |          V  d S r"   rl   rm   s     r   rp   z*TestBase.assert_garbage.<locals>.<genexpr>   s(      ::!1::::::r   )ra   rd   r&   r'   re   s     r   assert_garbagezTestBase.assert_garbage   s=    ::rz:::::F3KKHHHHHr   c                 B    t           j                                         d S r"   )rF   r#   r$   r2   s    r   clear_survivorszTestBase.clear_survivors   s    ""$$$$$r   N)
r   r   r   r_   rb   rg   ri   rq   rt   rv   r   r   r   r\   r\      s            D D DG G GS S SI I I% % % % %r   r\   c                   ^    e Zd ZdZd Zd Zej        d             Zej        d             Z	dS )SimpleFinalizationTestz.
    Test finalization without refcycles.
    c                     t                                           5  t                      }t          |          g}t	          j        |          }~t          j                     |                     |           | 	                    g            | 
                     |            d            t          j                     |                     |           | 	                    g            d d d            d S # 1 swxY w Y   d S r"   )rF   r0   rT   r8   weakrefrefr&   r(   rg   rq   assertIsr3   srf   wrs       r   test_simplez"SimpleFinalizationTest.test_simple   s   __ 	& 	&Aa55'CQBJLLL!!#&&&!!"%%%MM""$$%%%JLLL!!#&&&!!"%%%	& 	& 	& 	& 	& 	& 	& 	& 	& 	& 	& 	& 	& 	& 	& 	& 	& 	&   CC33C7:C7c                 b   t                                           5  t                      }t          |          g}t	          j        |          }~t          j                     |                     |           | 	                    |           | 
                     |            d            |                                  t          j                     |                     |           | 	                    g            d d d            n# 1 swxY w Y   |                      |            d            d S r"   )rF   r0   rX   r8   rz   r{   r&   r(   rg   rq   assertIsNotrv   r|   r}   s       r   test_simple_resurrectz,SimpleFinalizationTest.test_simple_resurrect   sE   __ 	& 	&!##Aa55'CQBJLLL!!#&&&!!#&&&RRTT4(((  """JLLL!!#&&&!!"%%%	& 	& 	& 	& 	& 	& 	& 	& 	& 	& 	& 	& 	& 	& 	& 	bbddD!!!!!s   C DD
D
c                    t                                           5  t                      }|                     t	          j        |                     t          |          g}~t	          j                     |                     |           | 	                    g            t	          j                     |                     |           | 	                    g            d d d            d S # 1 swxY w Y   d S r"   )
rF   r0   rL   assertFalser&   
is_trackedr8   r(   rg   rq   r3   r~   rf   s      r   test_non_gcz"SimpleFinalizationTest.test_non_gc   s   __ 
	& 
	&AR]1--...a55'CJLLL!!#&&&!!"%%%JLLL!!#&&&!!"%%%
	& 
	& 
	& 
	& 
	& 
	& 
	& 
	& 
	& 
	& 
	& 
	& 
	& 
	& 
	& 
	& 
	& 
	&s   CC((C,/C,c                    t                                           5  t                      }|                     t	          j        |                     t          |          g}~t	          j                     |                     |           | 	                    |           | 
                                 t	          j                     |                     |dz             | 	                    |           d d d            d S # 1 swxY w Y   d S N   )rF   r0   rN   r   r&   r   r8   r(   rg   rq   rv   r   s      r   test_non_gc_resurrectz,SimpleFinalizationTest.test_non_gc_resurrect   s+   __ 	' 	' ""AR]1--...a55'CJLLL!!#&&&!!#&&&  """JLLL!!#'***!!#&&&	' 	' 	' 	' 	' 	' 	' 	' 	' 	' 	' 	' 	' 	' 	' 	' 	' 	's   CC??DDN)
r   r   r   r@   r   r   r   cpython_onlyr   r   r   r   r   rx   rx      sz         & & &" " "  & & & ' ' ' ' 'r   rx   c                   (     e Zd Z fdZ fdZ xZS )SelfCycleBasec                 V    t                                                       | | _        d S r"   )superrI   r{   r3   	__class__s    r   rI   zSelfCycleBase.__init__   s$    r   c                 H    t                                                       d S r"   )r   r4   r   s    r   r4   zSelfCycleBase.check_sanity   s    r   )r   r   r   rI   r4   __classcell__r   s   @r   r   r      sQ                             r   r   c                       e Zd ZdS )SimpleSelfCycleNrU   r   r   r   r   r      rV   r   r   c                       e Zd ZdS )SelfCycleResurrectorNrU   r   r   r   r   r      rV   r   r   c                       e Zd Zd ZdS )SuicidalSelfCyclec                     d| _         dS )7
        Explicitly break the reference cycle.
        N)r{   r2   s    r   r9   zSuicidalSelfCycle.side_effect   s     r   NrZ   r   r   r   r   r      s#            r   r   c                   $    e Zd ZdZd Zd Zd ZdS )SelfCycleFinalizationTestzX
    Test finalization of an object having a single cyclic reference to
    itself.
    c                     t                                           5  t                      }t          |          g}t	          j        |          }~t          j                     |                     |           | 	                    g            | 
                     |            d            t          j                     |                     |           | 	                    g            d d d            d S # 1 swxY w Y   d S r"   )rF   r0   r   r8   rz   r{   r&   r(   rg   rq   r|   r}   s       r   r   z%SelfCycleFinalizationTest.test_simple  s   __ 	& 	&!!Aa55'CQBJLLL!!#&&&!!"%%%MM""$$%%%JLLL!!#&&&!!"%%%	& 	& 	& 	& 	& 	& 	& 	& 	& 	& 	& 	& 	& 	& 	& 	& 	& 	&r   c                 d   t                                           5  t                      }t          |          g}t	          j        |          }~t          j                     |                     |           | 	                    |           | 
                     |            d            |                                  t          j                     |                     |           | 	                    g            | 
                     |            d            d d d            d S # 1 swxY w Y   d S r"   )rF   r0   r   r8   rz   r{   r&   r(   rg   rq   r|   rv   r}   s       r   r   z/SelfCycleFinalizationTest.test_simple_resurrect  sL   __ 	& 	&$&&Aa55'CQBJLLL!!#&&&!!#&&&MM""$$%%%   """JLLL!!#&&&!!"%%%MM""$$%%%!	& 	& 	& 	& 	& 	& 	& 	& 	& 	& 	& 	& 	& 	& 	& 	& 	& 	&s   C>D%%D),D)c                 <   t                                           5  t                      }t          |          g}t	          j        |          }~t          j                     |                     |           | 	                    g            | 
                     |            d            t          j                     |                     |           | 	                    g            | 
                     |            d            d d d            d S # 1 swxY w Y   d S r"   )rF   r0   r   r8   rz   r{   r&   r(   rg   rq   r|   r}   s       r   test_simple_suicidez-SelfCycleFinalizationTest.test_simple_suicide%  s:    __ 	& 	&!##Aa55'CQBJLLL!!#&&&!!"%%%MM""$$%%%JLLL!!#&&&!!"%%%MM""$$%%%	& 	& 	& 	& 	& 	& 	& 	& 	& 	& 	& 	& 	& 	& 	& 	& 	& 	&s   C*DDDN)r   r   r   r@   r   r   r   r   r   r   r   r      sK         
& & && & &(& & & & &r   r   c                   $     e Zd Zd Z fdZ xZS )ChainedBasec                 0    d| _         || _        | |_        d S )NFsuicidedleftright)r3   r   s     r   chainzChainedBase.chain9  s    	


r   c                     t                                                       | j        rd S | j        }|j        r	 | j        }|j        rd S d S r"   )r   r4   r   r   r   )r3   r   r   r   s      r   r4   zChainedBase.check_sanity>  sl    = 	* 	* 	* 9D} * * JE~ * * * * *r   )r   r   r   r   r4   r   r   s   @r   r   r   7  sG          
* * * * * * * * *r   r   c                       e Zd ZdS )SimpleChainedNrU   r   r   r   r   r   O  rV   r   r   c                       e Zd ZdS )ChainedResurrectorNrU   r   r   r   r   r   R  rV   r   r   c                       e Zd Zd ZdS )SuicidalChainedc                 0    d| _         d| _        d| _        dS )r   TNr   r2   s    r   r9   zSuicidalChained.side_effectW  s     	


r   NrZ   r   r   r   r   r   U  s#            r   r   c                   T    e Zd ZdZd Zd Zd Zd Zd Zd Z	d Z
d	 Zd
 Zd Zd ZdS )CycleChainFinalizationTestz
    Test finalization of a cyclic chain.  These tests are similar in
    spirit to the self-cycle tests above, but the collectable object
    graph isn't trivial anymore.
    c                     d |D             }t          t          |                    D ]&}||                             ||dz
                      '|S )Nc                 "    g | ]} |            S r   r   )rn   r   s     r   
<listcomp>z:CycleChainFinalizationTest.build_chain.<locals>.<listcomp>h  s    ***3***r      )rangelenr   )r3   classesnodesis       r   build_chainz&CycleChainFinalizationTest.build_chaing  sX    **'***s5zz"" 	' 	'A!HNN51:&&&&r   c                    t          |          }t                                          5  |                     |          }d |D             }d |D             }~t	          j                     |                     |           |                     g            |                     d |D             d g|z             t	          j                     |                     |           d d d            d S # 1 swxY w Y   d S )Nc                 ,    g | ]}t          |          S r   rl   rn   r~   s     r   r   zKCycleChainFinalizationTest.check_non_resurrecting_chain.<locals>.<listcomp>q      (((Q2a55(((r   c                 6    g | ]}t          j        |          S r   rz   r{   r   s     r   r   zKCycleChainFinalizationTest.check_non_resurrecting_chain.<locals>.<listcomp>r       111a7;q>>111r   c                 "    g | ]} |            S r   r   rn   r   s     r   r   zKCycleChainFinalizationTest.check_non_resurrecting_chain.<locals>.<listcomp>w      111rbbdd111r   )	r   rF   r0   r   r&   r(   rg   rq   ra   )r3   r   Nr   rf   wrss         r   check_non_resurrecting_chainz7CycleChainFinalizationTest.check_non_resurrecting_chainm  s:   LL__ 
	' 
	'$$W--E((%(((C115111CJLLL!!#&&&!!"%%%11S111D6A:>>>JLLL!!#&&&
	' 
	' 
	' 
	' 
	' 
	' 
	' 
	' 
	' 
	' 
	' 
	' 
	' 
	' 
	' 
	' 
	' 
	's   B8C..C25C2c                 ~   t          |          }t                                          5  |                     |          }t          |          }d |D             }d |D             }d |D             }~t	          j                     |                     |           |                     |           |                     d |D             d g|z             | 	                                 t	          j                     |                     |           |                     g            d d d            d S # 1 swxY w Y   d S )Nc                 ,    g | ]}t          |          S r   rl   r   s     r   r   zGCycleChainFinalizationTest.check_resurrecting_chain.<locals>.<listcomp>  r   r   c                 V    g | ]&}t          |t                    t          |          'S r   )
isinstancerX   r8   r   s     r   r   zGCycleChainFinalizationTest.check_resurrecting_chain.<locals>.<listcomp>  s.    UUUaJqBS4T4TUBqEEUUUr   c                 6    g | ]}t          j        |          S r   r   r   s     r   r   zGCycleChainFinalizationTest.check_resurrecting_chain.<locals>.<listcomp>  r   r   c                 "    g | ]} |            S r   r   r   s     r   r   zGCycleChainFinalizationTest.check_resurrecting_chain.<locals>.<listcomp>  r   r   )
r   rF   r0   r   r&   r(   rg   rq   ra   rv   )r3   r   r   r   rf   survivor_idsr   s          r   check_resurrecting_chainz3CycleChainFinalizationTest.check_resurrecting_chain{  s~   LL__ 	& 	&$$W--EE

A((%(((CUU5UUUL115111CJLLL!!#&&&!!,///11S111D6A:>>>  """JLLL!!#&&&!!"%%%	& 	& 	& 	& 	& 	& 	& 	& 	& 	& 	& 	& 	& 	& 	& 	& 	& 	&s   C<D22D69D6c                 B    |                      t          gdz             d S N   )r   r   r2   s    r   test_homogenousz*CycleChainFinalizationTest.test_homogenous  s#    ))=/A*=>>>>>r   c                 B    |                      t          gdz             d S r   )r   r   r2   s    r   test_homogenous_resurrectz4CycleChainFinalizationTest.test_homogenous_resurrect  s%    %%'9&:Q&>?????r   c                 B    |                      t          gdz             d S r   )r   r   r2   s    r   test_homogenous_suicidalz3CycleChainFinalizationTest.test_homogenous_suicidal  s$    ))?*;a*?@@@@@r   c                 N    |                      t          t          gdz             d S r   r   r   r   r2   s    r   test_heterogenous_suicidal_onez9CycleChainFinalizationTest.test_heterogenous_suicidal_one  s&    ))?M*JQ*NOOOOOr   c                 Z    |                      t          gdz  t          gdz  z              d S r   r   r2   s    r   test_heterogenous_suicidal_twoz9CycleChainFinalizationTest.test_heterogenous_suicidal_two  s;    ))!]Oa$77	9 	9 	9 	9 	9r   c                 N    |                      t          t          gdz             d S r   )r   r   r   r2   s    r   test_heterogenous_resurrect_onez:CycleChainFinalizationTest.test_heterogenous_resurrect_one  s'    %%'9=&IA&MNNNNNr   c                 Z    |                      t          t          t          gdz             d S r   r   r   r   r   r2   s    r   test_heterogenous_resurrect_twoz:CycleChainFinalizationTest.test_heterogenous_resurrect_two  s8    %%@1D	F 	F 	F 	F 	Fr   c                 r    |                      t          gdz  t          gdz  z   t          gdz  z              d S r   r   r2   s    r   !test_heterogenous_resurrect_threez<CycleChainFinalizationTest.test_heterogenous_resurrect_three  sN    %% 1$'::o=NQR=RR	T 	T 	T 	T 	Tr   N)r   r   r   r@   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   `  s           ' ' '& & &&? ? ?@ @ @A A AP P P9 9 9O O OF F FT T T T Tr   r   c                       e Zd Zd Zd ZdS )
LegacyBasec                     	 | j         s=| j                            t          |                      |                                  d S d S # t
          $ r%}| j                            |           Y d }~d S d }~ww xY wr"   )r/   r)   r7   r8   r4   r:   r%   r;   s     r   r=   zLegacyBase.__del__  s    	" > $%%bhh///!!#####$ $  	" 	" 	"Kq!!!!!!!!!	"s   AA 
A7A22A7c                    	 | j         sQ| j                            t          |                      |                                  |                                  dS dS # t          $ r%}| j                            |           Y d}~dS d}~ww xY w)zJ
        Legacy (pre-PEP 442) finalizer, mapped to a tp_del slot.
        N)r/   r*   r7   r8   r4   r9   r:   r%   r;   s     r   
__tp_del__zLegacyBase.__tp_del__  s    	"> #!((D222!!###  """""# #  	" 	" 	"Kq!!!!!!!!!	"r>   N)r   r   r   r=   r   r   r   r   r   r     s2        " " "
" 
" 
" 
" 
"r   r   c                       e Zd ZdS )LegacyNrU   r   r   r   r   r             Dr   r   c                       e Zd Zd ZdS )LegacyResurrectorc                 :    | j                             |            dS rP   rQ   r2   s    r   r9   zLegacyResurrector.side_effect  rR   r   NrZ   r   r   r   r   r     s#        $ $ $ $ $r   r   c                       e Zd ZdS )LegacySelfCycleNrU   r   r   r   r   r     r   r   r   c                   4     e Zd ZdZ fdZd Zd Zd Z xZS )LegacyFinalizationTestz5
    Test finalization of objects with a tp_del.
    c                     t           j                                         t          j                     t	                                                       d S r"   )r&   r'   r$   r(   r   rb   r   s    r   rb   zLegacyFinalizationTest.tearDown  s@     	


r   c                 *   t                                           5  t                      }t          |          g}t	          j        |          }~t          j                     |                     |           | 	                    |           | 
                    g            |                      |            d            t          j                     |                     |           | 	                    |           d d d            d S # 1 swxY w Y   d S r"   )rF   r0   r   r8   rz   r{   r&   r(   rg   ri   rq   r|   r}   s       r   test_legacyz"LegacyFinalizationTest.test_legacy  s0   __ 	* 	*Aa55'CQBJLLL!!#&&&$$S)))!!"%%%MM""$$%%%JLLL!!#&&&$$S)))	* 	* 	* 	* 	* 	* 	* 	* 	* 	* 	* 	* 	* 	* 	* 	* 	* 	*s   C!DDDc                    t                                           5  t                      }t          |          g}t	          j        |          }~t          j                     |                     |           | 	                    |           | 
                    |           |                      |            d            |                                  t          j                     |                     |           | 	                    |dz             | 
                    |           d d d            n# 1 swxY w Y   |                      |            d            d S r   )rF   r0   r   r8   rz   r{   r&   r(   rg   ri   rq   r|   rv   r}   s       r   test_legacy_resurrectz,LegacyFinalizationTest.test_legacy_resurrect  so   __ 	' 	'!##Aa55'CQBJLLL!!#&&&$$S)))!!#&&&MM""$$%%%  """JLLL!!#&&&$$S1W---!!#&&&	' 	' 	' 	' 	' 	' 	' 	' 	' 	' 	' 	' 	' 	' 	'  	bbddD!!!!!s   DD33D7:D7c                 l   t                                           5  t                      }t          |          g}t	          j        |          }~t          j                     |                     g            | 	                    g            | 
                    g            |                     |           |                      |            d            d t          j        d         _        d d d            n# 1 swxY w Y   |                     g            |                      |            d            d S )Nr   )rF   r0   r   r8   rz   r{   r&   r(   rg   ri   rq   rt   r   r'   r|   r}   s       r   test_legacy_self_cyclez-LegacyFinalizationTest.test_legacy_self_cycle  sJ   __ 	% 	%!!Aa55'CQBJLLL!!"%%%$$R(((!!"%%%$$$RRTT4((( $BJqM	% 	% 	% 	% 	% 	% 	% 	% 	% 	% 	% 	% 	% 	% 	% 	BbbddD!!!!!s   CC66C:=C:)	r   r   r   r@   rb   r   r   r   r   r   s   @r   r   r     so             * * *" " "&" " " " " " "r   r   __main__)&r@   rC   r&   unittestrz   	_testcapir   ImportErrorr   r0   r   r    rF   rL   rN   rT   rX   r\   TestCaserx   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   mainr   r   r   <module>r     sQ        				  %%%%%%%       $$$$$$$             ? ? ? ? ? ? ? ?D$ $ $ $ $ $ $ $     O    $ $ $ $ $ $ $ $	 	 	 	 	Z 	 	 	$ $ $ $ $
 $ $ $% % % % % % % %<>' >' >' >' >'Xx'8 >' >' >'B               	 	 	 	 	mV 	 	 		 	 	 	 	=*; 	 	 	    v   7& 7& 7& 7& 7&(*; 7& 7& 7&t* * * * * * * *0	 	 	 	 	K 	 	 		 	 	 	 	&7 	 	 	    k6   GT GT GT GT GT8+< GT GT GTZ" " " " " " " "0 	 	 	 	 	Z 	 	 	 $ $ $ $ $
 $ $ $ 	 	 	 	 	mZ 	 	 	 	>" >" >" >" >"Xx'8 >" >" >"B zHMOOOOO s    &&1 <<