
    "e                     Z	   d Z ddlmZ ddlmZmZmZmZmZm	Z	 ddl
mZ ddlmZmZ ddlmZ ddlZddlZddlZddlZddlZddlmZ ej2                  Zej6                  j8                  Zej6                  j<                  Zej6                  j@                  Z 	 e! 	 ej6                  jH                  Z%d	 Z' e'       Z(	  ejR                  ejT                  jW                  d
d            Z, e-e,e.      s ej^                  d       g Z,ne,D  cg c]
  }  e0|        c} Z,	 d Z3d Z4d Z5i Z6ejn                  Z8e6fdZ9d Z:ejv                  dk(  r	 ddl<Z<ddl=m>Z>m?Z?m@Z@mAZA e<j                  j                  j                  ZEe?e@eAgeE_F        eAeE_G        e<j                  j                  j                  ZIe?e@eAgeI_F        eAeI_G        d ZJd ZKd ZL eLeM       eJZ3eKZ4eLZ5nererd Z5ne	rd Z5erd ZOnd ZOd ZPejT                  jW                  dd      j                         ZReRd k(  rd! ZSeSZTneRd"k(  rePZTnereOZTn
e	rd# ZSeSZTnePZTi fd$Zerd%nd&aUeaVd' ZWejT                  jW                  d(d)      j                         d*v ZXd+ ZYi ZZi Z[d, Z\d- Z]d. ZeZfd/Z^efd0Z_ee fd1Z`i Za eb       Zcd2 Z	 ej^                  Zderej                  Zd	 e%j                  Zgegj                  j                  d3      r! edd4        edd5        edd6        edd7       n~ej6                  j                  egj                        s$ edd8egj                          edd9        edd7       n5 eegj                        s# edd:egj                          edd;        edd7       d< Zmi fd=Znd> ZoenapeoaqdNd?Zrg asi Zti Zui Zvi Zw eex ej                  d@            azdA Z{dB Z|dC Z}dD Z~dE ZdF Z edG      adH ZdI Z ee,       e[fdJZe[fdKZdL ZdM Zy# e"$ r e#Z!Y dw xY w#  ej6                  jL                  Z%Y lxY wc c} w # e1$ r)  ej^                  d        ejd                          g Z,Y 5w xY w#  ej                  dkD  r ejd                          Y xY w# eh$ r e%j                  ZgY w xY w#   ejd                          Y 'xY w)Oa  
    This module provides utilities to get the absolute filenames so that we can be sure that:
        - The case of a file will match the actual file in the filesystem (otherwise breakpoints won't be hit).
        - Providing means for the user to make path conversions when doing a remote debugging session in
          one machine and debugging in another.

    To do that, the PATHS_FROM_ECLIPSE_TO_PYTHON constant must be filled with the appropriate paths.

    @note:
        in this context, the server is where your python process is running
        and the client is where eclipse is running.

    E.g.:
        If the server (your python process) has the structure
            /user/projects/my_project/src/package/module1.py

        and the client has:
            c:\my_project\src\package\module1.py

        the PATHS_FROM_ECLIPSE_TO_PYTHON would have to be:
            PATHS_FROM_ECLIPSE_TO_PYTHON = [(r'c:\my_project\src', r'/user/projects/my_project/src')]

        alternatively, this can be set with an environment variable from the command line:
           set PATHS_FROM_ECLIPSE_TO_PYTHON=[['c:\my_project\src','/user/projects/my_project/src']]

    @note: DEBUG_CLIENT_SERVER_TRANSLATION can be set to True to debug the result of those translations

    @note: the case of the paths is important! Note that this can be tricky to get right when one machine
    uses a case-independent filesystem and the other uses a case-dependent filesystem (if the system being
    debugged is case-independent, 'normcase()' should be used on the paths defined in PATHS_FROM_ECLIPSE_TO_PYTHON).

    @note: all the paths with breakpoints must be translated (otherwise they won't be found in the server)

    @note: to enable remote debugging in the target machine (pydev extensions in the eclipse installation)
        import pydevd;pydevd.settrace(host, stdoutToServer, stderrToServer, port, suspend)

        see parameter docs on pydevd.py

    @note: for doing a remote debugging session, all the pydevd_ files must be on the server accessible
        through the PYTHONPATH (and the PATHS_FROM_ECLIPSE_TO_PYTHON only needs to be set on the target
        machine for the paths that'll actually have breakpoints).
    )	pydev_log)DebugInfoHolder
IS_WINDOWS	IS_JYTHONDISABLE_FILE_VALIDATIONis_true_in_envIS_MAC)getfilesystemencoding)file_system_encodingfilesystem_encoding_is_utf8)
error_onceN)partialc                  p   d } 	 dd l }|j                  d      } | t        |       sGt        j
                  D ]4  }t        |      st        j
                  j                  |      dk(  s2|}  n | t        |       s-t        j
                  j                  t        j                        } | S # t        $ r Y w xY w)Nr   purelibzsite-packages)
	sysconfigget_pathImportErroros_path_existssyspathosbasenamedirname__file__)library_dirr   r   s      3/usr/lib/python3/dist-packages/pydevd_file_utils.py_get_library_dirr   L   s    K((3 ."=HH 	Dd#(8(8(>/(Q"	
 ."=ggoobkk2  s   B) )	B54B5PATHS_FROM_ECLIPSE_TO_PYTHONz[]zTExpected PATHS_FROM_ECLIPSE_TO_PYTHON loaded from environment variable to be a list.zEError loading PATHS_FROM_ECLIPSE_TO_PYTHON from environment variable.c                     | S N filenames    r   <lambda>r$   {   s    8     c                     | S r    r!   r"   s    r   r$   r$   |   s    H r%   c                     | S r    r!   r"   s    r   r$   r$   }   s    ( r%   c                    	 	 t        |      }| j                         }|j                  ||f      }|z|j                  |      }|t	        |       x}||<   |D ]>  }|j                         |k(  st
        j                  j                  | |      }||||f<    n t        d|d| d|      |} # t        $ r | cY S w xY w)NzUnable to find: z in z. Dir Contents: )	nextStopIterationlowerget
os_listdirr   r   joinFileNotFoundError)resolvediter_parts_lowercasecacheresolve_lowercaseresolved_lowerresolved_joineddir_contentsr#   s           r   _resolve_listingr7      s    
	 $%9 : ")))^5F$GH" 99^4L#7A(7KKu^4( @>>#'88&(ggll8X&FOAPE>+<=>	@ (%x)? @ @ #/   	O	s   B0 0B>=B>c                    	 |dgk(  r| S t        | t        |            S # t        $ rw t        j	                          	 t        | t        |            cY S # t        $ r> t        |      r,t        j                  d|| |       t        j                          |cY cY S w xY wt        $ rD t        j                  dk\  r,t        j                  d|| |       t        j                          |cY S w xY w)N zpydev debugger: critical: unable to get real case for file. Details:
filename: %s
drive: %s
parts: %s
(please create a ticket in the tracker to address this).   zepydev debugger: OSError: Unable to get real case for file. Details:
filename: %s
drive: %s
parts: %s
)r7   iterr/   _listdir_cacheclearr   r   critical	exceptionOSErrorr   DEBUG_TRACE_LEVELinfo)r0   parts_in_lowercaser#   s      r   _resolve_listing_partsrD      s     "%O$/A*BCC 	#Hd3E.FGG  	h'""O h(:	 ##%O	   ,,1NN7($6
 !s8     C*AC*ABC*BAC*)C*win32)MAX_PATHLPCWSTRLPWSTRDWORDc                     t        j                  t              }t        | |t              }|dk7  r|t        k  r|j                  } | S Nr   )ctypescreate_unicode_bufferrF   GetLongPathNamevaluer#   bufrvs      r   _convert_to_long_pathnamerS      s;    ..x8C 39BQw2>99Or%   c                     t        j                  t              }t        | |t              }|dk7  r|t        k  r|j                  } | S rK   )rL   rM   rF   GetShortPathNamerO   rP   s      r   _convert_to_short_pathnamerV      s;    ..x8C!(C:BQw2>99Or%   c                 l   d| v rt        |       } | j                  d      st        |       s| S t        j                  j                  t        j                  j                  |             \  }}|j                         }|j                  t        j                  j                        rL|dd  }|t        j                  j                  z  }|j                  t        j                  j                        rL|j                         j                  t        j                  j                        }t        |||       S )N~<r:   )convert_to_long_pathname
startswithr   r   r   
splitdrivenormpathuppersepr+   splitrD   )r#   drivepartss      r   _get_path_with_real_caserc      s     h3H=""3'~h/G77--bgg.>.>x.HILE5KKME""277;;/ab	$ ""277;;/ KKM''4E)%AAr%      c                 h    | j                  d      r| S ddlm}  ||       }|j                         }|S )NrY   r   )File)r[   java.iorf   getCanonicalPath)r#   rf   frets       r   get_path_with_real_caserk   	  s4    s#O N  "
r%   c                     | j                  d      st        |       s| S | j                         j                  d      }d}|r|d   dk(  r|dz  }|dd  }|r	|d   dk(  rt	        |||       S )NrY   /r9   r   r:   )r[   r   r+   r`   rD   )r#   rb   founds      r   rk   rk     sy    s#>(+CO &&s+aBSLE!"IE aB &eUH==r%   c                 "    | j                         S r    r+   r"   s    r   _normcase_windowsrq   #      ~~r%   c                 V    d| v rt        |       } t        |       } | j                         S )NrX   )rZ   _nt_os_normcaser+   r"   s    r   rq   rq   (  s*    (?/9H"8,~~r%   c                     | S r    r!   r"   s    r   _normcase_linuxrv   1  s    Or%   PYDEVD_FILENAME_NORMALIZATIONr9   r+   c                 "    | j                         S r    rp   r"   s    r   _normcase_lowerry   :  rr   r%   nonec                 "    | j                         S r    rp   r"   s    r   ry   ry   I  rr   r%   c                 @    	 ||    S #  t        |       x}|| <   |cY S xY wr    )_default_normcase)sNORMCASE_CACHE
normalizeds      r   normcaser   R  s3    a  ):1)==
^A&s    WINDOWSUNIXc                     t        |       S r    )_normcase_from_client)r~   s    r   normcase_from_clientr   _  s     ##r%   DEBUG_PYDEVD_PATHS_TRANSLATIONFalse)1truec                     t         }| dk(  rd} | dv sJ t        rt        d|        t        a| dk(  rt
        st        ant
        rt        a|| k7  r| a t        t               yy)a	  
    We need to set the IDE os because the host where the code is running may be
    actually different from the client (and the point is that we want the proper
    paths to translate from the client to the server).

    :param os:
        'UNIX' or 'WINDOWS'
    WINr   )r   r   zpydev debugger: client OS: N)
_ide_osDEBUG_CLIENT_SERVER_TRANSLATIONprintr   r   r   rq   rv   setup_client_server_paths_last_client_server_paths_set)r   prevs     r   
set_ide_osr   f  so     D	U{$$$$&56$	Y $5! $3!rz!"?@ r%   c                     t        |       d   S )aQ  
    This returns a filename that is canonical and it's meant to be used internally
    to store information on breakpoints and see if there's any hit on it.

    Note that this version is only internal as it may not match the case and
    may have symlinks resolved (and thus may not match what the user expects
    in the editor).
    r:   )get_abs_path_real_path_and_base_from_filer"   s    r   canonical_normalized_pathr     s     5X>qAAr%   c                     t        |       d   S )zR
    Provides a version of the filename that's absolute (and NOT normalized).
    r   r   r"   s    r   absolute_pathr          5X>qAAr%   c                     t        |       d   S )z+
    Provides the basename for a file.
    rd   r   r"   s    r   r   r     r   r%   c           	         	 ||    S #  | j                   t        k7  rt        d| dt        |       d      t        | | fcY S t        j
                  }|| | fcY S |j                  }|j                  }||t        | | fcY S  ||       }t        rt        }d}t        | |||      }d}t        | t        ||      }||f|| <   ||fcY S xY w)Nz<Paths passed to _abs_and_canonical_path must be str. Found: z ()FT)	__class__strAssertionErrortyper   r   abspathisabsos_path_real_path_global_resolve_symlinks_apply_func_and_normalize_case)	r#   NORM_PATHS_CONTAINERos_pathos_path_abspathos_path_isabsr   	normalizeabs_path	real_paths	            r   _abs_and_canonical_pathr     s   ##H--#$ jrtx  zB  uC  "D  E  E:X%%''?X%%!//"m&;?P?XX%%h'#/O	1(OUT]^	28=NPUW`a	 *29)<X&""s    :CC&CACc                     t         j                  D ]4  } |t        j                  j                  ||             } ||      s2|c S   |t        j                  j                  t        |             }|S r    )r   r   r   r.   _library_dir)r#   funcr   prs        r   _get_relative_filename_abs_pathr     s]     XX a*+!H 	RWW\\,12AHr%   c                    | j                  d      r| S  ||       }|s ||      st        | |      }|j                  d      }|dk(  r|j                  d      }|dk7  rt|dz  }|d | }||d  }	|	j                  d      r
|	dd  }	|dz   }|	j                  d      s|	j                  d	      r|	dd  }	|	r!|r |t        |      |	      }|S  |||	      }|S |rt        |      }|S )
NrY   .zip.egg   !r:   rm   \)r[   r   findr   )
r#   r   r   normalize_caser   r.   r   indzip_path
inner_paths
             r   r   r     s
   3 XAa /$?A
&&.C
byffVn
byqTc7stW
  % $ABJ#~H  %)>)>t)D#ABJ(+Z8 H :.HQKHr%   c                    t        |       ryt        j                  j                  |       s0t	        | t        j                  j
                        } t        |       ry| j                  d      }|dk(  r| j                  d      }|dk7  r|dz  }| d | }| |d  }|j                  d      r
|dd  }|dz   }t        j                  |t              }|y|t        u r 	 d	d l}|j                  |d
      }|t        |<   	 |j                  d      s|j                  d      r|dd  }|j                  |j                  dd            }t        ||      S t#        j$                  d|        y#  t        t        |<   Y yxY w# t         $ r Y yw xY w)NTr   r   r   r   r   r:   Fr   r   rm   r   z"os.path.exists(%r) returned False.)r   r   r   r   r   r   r   r[   _ZIP_SEARCH_CACHEr,   _NOT_FOUND_SENTINELzipfileZipFilegetinforeplacer.   KeyErrorr   debug)r#   r   r   r   zip_file_objr   _infos          r   existsr     s   h77=="28RWW__M(#
--
C
bymmF#
byqDS>cd^
  % $ABJ#~H(,,X7JK00&x=.:!(+
	$$S)Z-B-B4-H'^
 ((););D#)FGE*--
 	<hG#.A!(+  		s   E# 8AE7 #E47	FFz<frozenzHDebugger warning: It seems that frozen modules are being used, which mayzDmake the debugger miss breakpoints. Please pass -Xfrozen_modules=offz$to python to disable frozen modules.z^Note: Debugging will proceed. Set PYDEVD_DISABLE_FILE_VALIDATION=1 to disable this validation.z@Debugger warning: The os.path.realpath.__code__.co_filename (%s)z>is not absolute, which may make the debugger miss breakpoints.z_Debugger warning: It seems the debugger cannot find os.path.realpath.__code__.co_filename (%s).zDThis may make the debugger miss breakpoints in the standard library.c                 P    t        | t              r| j                  t              } | S r    )
isinstancebytesdecoder   r"   s    r   _path_to_expected_strr   h  s     (E"??#78Or%   c                 |    	 ||    S # t         $ r+ t        t        t        |                   }|df|| <   Y ||    S w xY w)NF)r   r   rk   r   )r#   r2   
translateds      r   _original_file_to_clientr   o  sN    .X .*+B=QYCZ+[\
%u-h?.s    -;;c                     | S r    r!   r"   s    r   _original_map_file_to_serverr   x  s	     Or%   c                     |r(| j                  d      s>| j                  d      s-| dz  } n'| j                  d      s| j                  d      r| d d } |dk7  r| j                  d|      } | S )Nrm   r   r   )endswithr   )r   r_   add_end_seps      r   	_fix_pathr     sc    }}S!$--*=CKD==t!49D
cz||C%Kr%   r:   c                 .    t         j                  | d      S rK   ),_client_filename_in_utf8_to_source_referencer,   )client_filenames    r   $get_client_filename_source_referencer     s    7;;OQOOr%   c                 .    t         j                  | d      S )Nr9   )$_source_reference_to_server_filenamer,   source_references    r   )get_server_filename_from_source_referencer     s    /334DbIIr%   c                 Z    t               }t        j                  d||        | t        |<   |S )NzACreated linecache id source reference: %s for server filename: %s)_next_source_referencer   r   /_line_cache_source_reference_to_server_filename)server_filenamer   s     r   %create_source_reference_for_linecacher     s0    -/OOWYikz{HW34DEr%   c                 ,    t         j                  |       S r    )r   r,   r   s    r   ,get_source_reference_filename_from_linecacher     s    :>>?OPPr%   c                 \    t               }t        j                  d|| |       | t        |<   |S )Nz;Created frame id source reference: %s for frame id: %s (%s))r   r   r   _source_reference_to_frame_id)frame_idoriginal_filenamer   s      r   $create_source_reference_for_frame_idr     s:    -/OOQScem  pA  B6>!"23r%   c                 ,    t         j                  |       S r    )r   r,   r   s    r   "get_frame_id_from_source_referencer     s    (,,-=>>r%   PYDEVD_RESOLVE_SYMLINKSc                     | a y r    )r   )resolve_symlinkss    r   set_resolve_symlinksr     s    /r%   c                    | dd a t        j                          t        j                          t	        t
        t        j                  d            at        rdndt        dk(  rdndi }i }g g }g g }t        |       D ]  \  }\  }}|j                  d      xr |j                  d      }|sRt        |d      }t        |d      }j                  ||f       j                  t        |      t!        |      f       t        |d      }t        |d      }|j                  ||f       |j                  t        |      t!        |      f        |z   |z   st"        at&        ay|ffd		}	|ffd
	}
|	a|
ay)z8paths is the same format as PATHS_FROM_ECLIPSE_TO_PYTHONNr:   r   rm   r   )rm   r   FTc                 d   	 ||    S # t         $ r 
k7  r| j                  
      } | }t        |       }	D ]d  \  }}|j                  |      sd}t        rt        j                  d|        || t        |      d  z   }t        rt        j                  d||        n d}
k7  r|j                  
      }|rt        |      }n_t        |      sI|j                  d      sCt        d| dj                  	D cg c]  }d|d	   d nc c}w c}             nt        |      }||| <   |cY S w xY w)
NTz'pydev debugger: replacing to server: %sz7pydev debugger: sent to server: %s - matched prefix: %sFrY   zapydev debugger: unable to find translation for: "%s" in [%s] (please revise your path mappings).
z, "r   )r   r   r   r[   r   r   r>   lenr   r   r   r.   )r#   r2   r   translated_normalizedeclipse_prefixserver_prefixfound_translationxeclipse_seppaths_from_eclipse_to_python
python_seps           r   _map_file_to_serverz6setup_client_server_paths.<locals>._map_file_to_server  s]   .	?" ,	j(#++JD "J$9($C!1M 
*-(33NC(,%6!**+TV^_!.#n:M:N1O!OJ6!**+dfp  sA  B
* %*! j('//ZH
  +:6
%j1%005 #  $H$diiKg0ha1Q41A0h0h&ik "/z!:J(E(OY,	s#    AD/B(D/8D	$D/.D/c           
      2   	 ||    S # t         $ r t        |       }t        |      }t        |      }d}|j	                         |j	                         k7  rt
        rt        j                  d||       t              D ]o  \  }\  }}|j                  |      st
        rt        j                  d|       |   d   }||t        |      d  z   }	t
        rt        j                  d|	|       d} n7 t
        r.t        j                  d|D 
cg c]  }
|
d   	 nc c}
w c}
       |}	k7  r|	j                        }	t        |	      }	|	|f|| <   |	t        vr8|rd}n!t               }t        j                  d	||        |t        |	<   | t         |<   |	|fcY S w xY w)
NFzCpydev debugger: translated_normalized changed path (from: %s to %s)z'pydev debugger: replacing to client: %sr   z7pydev debugger: sent to client: %s - matched prefix: %sTzGpydev debugger: to client: unable to find matching prefix for: %s in %sr:   z6Created source reference: %s for untranslated path: %s)r   r   rk   r   r+   r   r   r>   	enumerater[   r   r   r   r   r   r   r   )r#   r2   r   translated_proper_caser   path_mapping_appliedir   python_prefixr   r   r   r   initial_pathsr   r  s               r   _map_file_to_clientz6setup_client_server_paths.<locals>._map_file_to_client(  s   4	6?" 2	6$X.H%<X%F"$,X$6!#( $**,0F0L0L0NN2&&]24IK 7@@\6] 422NM(33MB6!**+TVkl &31%5a%8N!/2H]I[I\2]!]J6!**+dfpr  A+/(4 3&&'p->Z/[!/[/[]3
j('//
KH
.z:J  *+?@E(O!MM''($'='?$OO$\^npxyK[<ZHIQ45EF 455e2	6s$    BFA2FDA<FF)r   r   r=   r   r   r)   	itertoolscountr   r   r   r  r   r   appendr   r   r   map_file_to_clientr   map_file_to_server)paths!norm_filename_to_server_container!norm_filename_to_client_containerinitial_paths_with_end_sep)paths_from_eclipse_to_python_with_end_sepr  path0path1force_only_slashr  r
  r   r	  r   r  s              @@@@r   r   r     s    %*!H!(..00668$T9??1+=> $J!Y.$CK(*%(*%M!##% 02- 'u- j>E5 >>+6V5>>+;Ve[%8EeZ7E  %0(//1Fu1MxX]0_` %d3%T2"))5%.9188:OPU:VX`afXg9hij  />M#LOk#k '59 -N 1f -N 76 76r -,r%   c                 ,   	 ||    S #  | }|sd}|j                  d      r|t        |      |fcY S t        7t        |j	                  d      |j	                  d            }||||dz   d  fcY S |:|j                  d      r|d d }n#|j                  d      r|d t        d        d	z   }t        |      \  }}	 t        |      }nA# t        $ r5 t        |j	                  d      |j	                  d            }||dz   d  }Y nw xY w|||f}||| <   |cY S xY w)
N<string>rY   rm   r   r:   z.pycr   z	$py.classz.py)	r[   r   r   maxrfindr   r   os_path_basenameAttributeError)r#   NORM_PATHS_AND_BASE_CONTAINERri   r  r   canonical_normalized_filenamebaserj   s           r   r   r   i  s9    ,X66 A<<hqk1$$"*AGGCL!''$-0Aq!AEF)$$=zz&!crFK((K(()E12I!2L//	#$ABD 	AGGCL!''$-0AQUV9D	 5t;25%h/
s9    'D;D-A
D8CD;D?DDDc                    	 || j                   j                     S #  | j                   j                  }| |j                  d      r| j                  d   }t        ;|sd}t        |j                  d      |j                  d            }||||dz   d  fcY S t	        |      }||| j                   j                  <   |cY S xY w)N)zbuild/bdist.zbuild\bdist.r   r  rm   r   r:   )f_codeco_filenamer[   	f_globalsr   r  r  )framer  ri   r  rj   s        r   *get_abs_path_real_path_and_base_from_framer&    s    ,U\\-E-EFFLL$$=Q\\+LM
+A4< AGGCL!''$-0Aa1q56?"7:BE%ell&>&>?
s    A9B>&B>c                     dd l }	 |j                  |       }| dD ]  }t        ||d       }| ||       c S  y #  Y y xY w)Nr   )get_filename_get_filename)pkgutil
get_loadergetattr)mod_namer*  loaderattrmeths        r   get_fullnamer1    s^    ##H- 5 	&D64.DH~%	& s   : >c                     t         j                  D ]A  }t        || j                  dd            }t        j                  j                  |      s?|c S  y )N.rm   )r   r   r.   r   r   isdir)r-  r   mod_paths      r   get_package_dirr6    sH     h..sC8977=="O r%   )F)__doc___pydev_bundler   _pydevd_bundle.pydevd_constantsr   r   r   r   r   r	   (_pydev_bundle._pydev_filesystem_encodingr
   $_pydevd_bundle.pydevd_comm_constantsr   r   _pydev_bundle.pydev_logr   jsonos.pathr   r   r  ntpath	functoolsr   r   rt   r   r   r  r   r   r.   r/   	NameErrorIOErrorrealpathr   r   r   r   loadsenvironr,   r   r   listr>   tuple	Exceptionr?   rZ   convert_to_short_pathnamerk   r<   listdirr-   r7   rD   platformrL   ctypes.wintypesrF   rG   rH   rI   windllkernel32GetLongPathNameWrN   argtypesrestypeGetShortPathNameWrU   rS   rV   rc   r   rA   rq   rv   r+   _filename_normalizationry   r}   r   r   r   r   r   r   r  r   r   r   r   r   r   objectr   reportr   	func_codecoder  __code__r#  r[   r   r   r   r   r  r  r   r   r   r   r   r   r)   r  r   r   r   r   r   r   r   r   r   r   r   r&  r1  r6  )r   s   0r   <module>rY     sq  )V $4 4 J b .   
   //77## 	ww|| (((,  !
X#-4::bjjnn=[]a.b#c  2D9	qr')$ ;W'WQa'W$ 4 4 2   ZZ
 <J #6!H <<7<;DD --00AA$+VU#; "'!==11CC%,fe$<!#( 			B, 	!* $= $>!":: >  
  **..)H"MSSU g%  (& ()  ( (  "  ")v  $ #%**..1QSZ"["a"a"cgt"t #AN   " 	BBB <P  #F DR  Zhnr 'T  h 3lF* ** ""9-YZUV56opWW]]4++,QSWScScdOPopD$$%prv  sC  sC  	DUVop .0  . 1 
 !#  " ') $24 //1 , yq'9: PJQ? **CD 0
d-N 6 7
 1N"J Ur 4k    
( T (X  &I^_I#% &j",,q0I!N
  * ))*&Ist   O2 P  :,P# P
BQ "R =Q< 	B:R 2O=<O= P#*QQ"Q9<RR RR R*