
    -PhOQ                    "   d 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Zddl	Z	ddl
Z
ddlZddlZddlmZ ddlmZmZ ddlmZ ej        r1ddlmZ dd	lmZmZ dd
lmZ ej        edef         Zej         e         Z!dCdZ"dCdZ#dej$        v Z%dej$        v Z& G d dej'                  Z(e G d d                      Z) e)            Z*e*j+        Z+e*j,        Z,e*j-        Z-e*j.        Z.e*j/        Z/e*j0        Z0e*j1        Z1e*j2        Z2e*j3        Z3e*j4        Z4e*j5        Z5e*j6        Z6e*j7        Z7e*j8        Z8e*j9        Z9e*j:        Z:e*j;        Z;e*j<        Z<e*j=        Z=e*j>        Z>e*j?        Z?e*j@        Z@e*jA        ZAe*jB        ZBe*jC        ZCe*jD        ZDe*jE        ZE G d d          ZF G d d          ZGdDdEdZHdDdEdZIdFdZJdFd ZKdFd!ZLdFd"ZMdFd#ZNdFd$ZOdFd%ZPdFd&ZQdFd'ZRdFd(ZSdFd)ZTdGd.ZUdHd2ZVdId5ZWdJd8ZXejY        dKdLd>            ZZejY        dDdMdA            ZZdDdNdBZZdS )OzThis is (mostly) a standalone module used to write logging
information about Meson runs. Some output goes to screen,
some to logging dir and some goes to both.    )annotationsN)contextmanager)	dataclassfield)Path)Literal   )StringProtocolSizedStringProtocol)BaseNodeAnsiDecoratorreturnboolc                 X    t          j                                                    } | dk    S )Nwindows)platformsystemlower)platnames    O/var/www/html/test/jupyter/venv/lib/python3.11/site-packages/mesonbuild/mlog.py
is_windowsr   !   s&      &&((Hy      c                 @   ddl m} m} ddlm} | j        }|                    d          } |            }|                    | ||                    sdS t          |	                    ||j
        dz            pt          j                            d                    S )Nr   )windllbyref)DWORDiF   ANSICON)ctypesr   r   ctypes.wintypesr   kernel32GetStdHandleGetConsoleModer   SetConsoleModevalueosenvironget)r   r   r   kernelstdoutmodes         r   _windows_ansir,   %   s    $$$$$$$$%%%%%%_F  %%F577D  t55 u %%fdj3.>??\2:>>R[C\C\]]]r   CIGITHUB_ACTIONSc                      e Zd Z ej                    Z ej                    Z ej                    Z ej                    ZdS )	_SeverityN)	__name__
__module____qualname__enumautoNOTICEWARNINGERRORDEPRECATION r   r   r0   r0   8   sB        TY[[FdikkGDIKKE$)++KKKr   r0   c                     e Zd ZU dZded<    ee          Zded<   dZded	<   dZ	d
ed<   dZ
ded<   dZdZdZ ee          Zded<   dZdZded<   dZded<   ed`d            Zed`d            ZdadZdadZdbdZdcd Zdad!Zdad"Zddded&Zdfdgd,Zddd-dhd1Zddd'd2did4Zdd'ddd'd5djd7Z dkd9Z!dld;Z"ddd'ddd'd<dmd>Z#dnd?Z$dod@Z%dd'dd'ddd'dAdpdHZ&dd'dd'dddIdqdJZ'dd'dd'dddIdqdKZ(dd'dd'dddIdqdLZ)dd'dd'dddIdqdMZ*drdsdRZ+edtdudV            Z,dvdWZ-dwdYZ.ed`dZ            Z/dwd[Z0dxd]Z1dyd^Z2dad_Z3dS )z_LoggerNT.Optional[str]log_dir)default_factoryT.List[str]	log_depthFr   log_to_stderrzT.Optional[T.TextIO]log_filezT.Optional[float]log_timestamp_startzT.Set[T.Tuple[str, ...]]logged_oncer   zT.Optional['subprocess.Popen']	log_pagerzmeson-log.txtzT.ClassVar[str]
_LOG_FNAMEr   T.Iterator[None]c              #  H   K   d| _         	 d V  d| _         d S # d| _         w xY w)NTFlog_disable_stdoutselfs    r   
no_loggingz_Logger.no_loggingP   s>      "&	,EEE&+D###eD#++++s    	!c              #  V   K   | j         }d| _         	 d V  || _         d S # || _         w xY wNFrJ   )rM   restores     r   force_loggingz_Logger.force_loggingX   sF      )"'	.EEE&-D###gD#----    	(Nonec                    d| _         d S )NTlog_errors_onlyrL   s    r   	set_quietz_Logger.set_quieta   s    #r   c                    d| _         d S rP   rV   rL   s    r   set_verbosez_Logger.set_verbosed   s    $r   startfloatc                    || _         d S N)rD   )rM   r[   s     r   set_timestamp_startz_Logger.set_timestamp_startg   s    #(   r   c                    | j         0| j         j        }| j         }d | _         |                                 |S |                                  d S r^   )rC   nameclose
stop_pager)rM   pathexception_around_goers      r   shutdownz_Logger.shutdownj   sO    =$=%D$(M! DM!'')))Ktr   c                   |                                  sd S g }dt          j        v r%t          j        t          j        d                   }nt          j        d          }|sgt                      rYt          j        d          }|rCt          |          j	        d         dz  dz  }t          j        dt          |                    }|r|g}|sd S 	 t          j                                        }d|vrd	|d<   d
|vrd|d
<   t          j        |t          j        dd|          | _        d S # t           $ r:}dt          j        v r!ddlm}  |dt          |                     Y d }~d S d }~ww xY w)NPAGERlessgitr	   usrbin)rd   LESSRXFLVz-cTutf-8)stdintextencodingenv)MesonExceptionzFailed to start pager: )colorize_consoler&   r'   shlexsplitshutilwhichr   r   parentsstrcopy
subprocessPopenPIPErF   	Exceptionmesonlibru   )rM   	pager_cmdri   rj   rd   rt   eru   s           r   start_pagerz_Logger.start_pagert   s   $$&& 	F	bj  BJw$788II<''D @JLL @l5)) @99,Q/%7%?D!<SYY???D #!F	 	F	I *//##CS  #F3 D	'-iz37'sT T TDNNN 	I 	I 	I"*$$444444$n%Gs1vv%G%GHHH %$$$$$	Is   AD- -
E17/E,,E1c                    | j         rp	 | j         j                                         | j         j                                         n# t          $ r Y nw xY w| j                                          d | _         d S d S r^   )rF   rq   flushrb   OSErrorwaitrL   s    r   rc   z_Logger.stop_pager   s    > 	"$**,,,$**,,,,   N!!!!DNNN	" 	"s   <A 
AAlogdirr|   fatal_warningsc                    || _         t          t          j                            || j                  dd          | _        || _        d S )Nwrp   rs   )r>   openr&   rd   joinrG   rC   log_fatal_warnings)rM   r   r   s      r   
initializez_Logger.initialize   s@    RW\\&$/BBCRYZZZ"0r   TargsT.Sequence[TV_Loggable]keepdisplay_timestampc                   g }| j         1|r/d                    t          j                    | j         z
            g}|D ]}|t	          |t
                    r|                    |           0t	          |t                    r)|                    |                    |                     n|                    t          |                     |S )Nz[{:.3f}])	rD   formattime	monotonic
isinstancer|   appendr   get_text)rM   r   r   r   arrargs         r   process_markupz_Logger.process_markup   s    #/4E/$$T^%5%58P%PQQRC 	% 	%C{#s## %

3C// %

3<<--....

3s88$$$$
r   )sependnestedr   r   c                  | j         rd S t          j                    }t          ||||d |                                }| j        rs|r| j        d         dz   nd}g }|                    d          D ]2}	|	                                }	|                    |	r||	z   nd           3d	                    |          }| j
        r| j
        j        }
n | j        rt          j        }
nt          j        }
	 t          |d|
           d S # t           $ r? |                    dd                              d          }t          |d|
           Y d S w xY w)	N)r   r   filez|  
)r   r   asciireplace)rK   ioStringIOprintgetvaluerA   rx   stripr   r   rF   rq   rB   sysstderrr*   UnicodeEncodeErrorencodedecode)rM   r   r   r   r   iostrrawprependlinesloutputcleaneds               r   force_printz_Logger.force_print   ss   " 	Ft#E2222nn> 	#39AdnR(4//rGEYYt__ 7 7GGIIA5Wq[[26666))E""C > 	 ^)FF 	 ZFFZF	0#2F++++++! 	0 	0 	0jj)44;;GDDG'r///////	0s   .D AE
E)r   r   r   TV_Loggablec                   t          |d|          }| j        .t          || j        ||d | j                                         d S d S )NFr   r   r   )r   rC   r   r   )rM   r   r   r   r   r   s         r   debugz_Logger.debug   sW    T5*;<<=$3T]====M!!!!! %$r   is_errorr   r   r   r   r   c               
   t          |d|          }| j        ,t          || j        ||d | j                                         |                                 rt          |d|          }| j        r|rt          ||||d d S d S )NFr   T)r   r   r   )r   rC   r   r   rv   rW   r   )rM   r   r   r   r   r   r   r   s           r   _logz_Logger._log   s     T5*;<<=$3T]====M!!!  "" 	@ t->??C# 	?x 	?V#>>>>>>	? 	?r   cmdc                    t           sd S d |D             }|                     d                    |d                    |                               d S )Nc                    g | ]}d | d 	S )"r:   .0xs     r   
<listcomp>z*_Logger._debug_log_cmd.<locals>.<listcomp>   s     '''QA'''r   z!meson_ci!/{} {} )_in_cir   r   r   )rM   r   r   s      r   _debug_log_cmdz_Logger._debug_log_cmd   sU     	F''$'''

%,,S#((4..AABBBBBr   r   c                4    |                      d|g           d S )N
ci_include)r   )rM   r   s     r   cmd_ci_includez_Logger.cmd_ci_include   s     L4&11111r   )r   oncer   r   r   r   r   c          	     F     | j         |d|ir | j        ||||||d d S d S )Nr   r   )_should_logr   )rM   r   r   r   r   r   r   r   s           r   logz_Logger.log   sQ    
 4T--- 	vDIthv3Cctuuuuuu	v 	vr   c                ,    | j         r | j        |  d S d S r^   )rD   r   rM   r   s     r   log_timestampz_Logger.log_timestamp   s(    # 	DHdOOOO	 	r   c                   d	d|sdS t          fd|D                       }|| j        v rdS | j                            |           dS )
Nr   r   r   r|   c                    t          | t                    r| S t          | t                    r| j        S t          |           S r^   )r   r|   r   rr   )r   s    r   to_strz#_Logger._should_log.<locals>.to_str   s=    !S!! !]++ vq66Mr   Tc              3  .   K   | ]} |          V  d S r^   r:   )r   ar   s     r   	<genexpr>z&_Logger._should_log.<locals>.<genexpr>  s+      **&&))******r   F)r   r   r   r|   )tuplerE   add)rM   r   r   tr   s       @r   r   z_Logger._should_log   sw    	 	 	 	  	4****T*****   5Qtr   r   fatallocationr   r   r   r   severityr0   rargsr   r   T.Optional[BaseNode]c               b   ddl m}
m} |t          j        u rt          d          g}n\|t          j        u rt          d          g}n=|t          j        u rt          d          g}n|t          j
        u rt          d          g}|t          |	          z   } | j        |d|isd S |R ||j        t          j                              }t!          ||j                  }t%          j        d|g          }||z   } | j        |||||d	 | xj        dz  c_        | j        r|r |
d
          d S d S )Nr	   )ru   relpathzNOTICE:zWARNING:ERROR:zDEPRECATION:r   TV_LoggableList)r   r   r   r   z Fatal warnings enabled, aborting)r   ru   r   r0   r6   boldr7   yellowr8   redr9   listr   filenamer&   getcwdget_error_location_stringlinenoTcastr   log_warnings_counterr   )rM   r   r   r   r   r   r   r   r   r   ru   r   labelr   location_filelocation_strlocation_lists                    r   
_log_errorz_Logger._log_error  s    	65555555 y'''&*9oo%6EE***J''(EE((]]OEE...(()EtE{{"t1D11 	F#GH$5ry{{CCM4]HOTTL F#4|nEEM 4'D	4CS8LLLL!!Q&!!" 	Eu 	E .!CDDD	E 	E 	E 	Er   )r   r   r   r   r   r   c               D     | j         t          j        g|R ||||||ddS NTr   )r   r0   r8   rM   r   r   r   r   r   r   r   s           r   errorz_Logger.error3  sK    
 ty O O ODX`&,#3O O O 	Or   c               D     | j         t          j        g|R ||||||ddS r   )r   r0   r7   r   s           r   warningz_Logger.warning;  sL    
 ty0 O4 O Od%Zb&,#3O O O 	Or   c               D     | j         t          j        g|R ||||||ddS r   )r   r0   r9   r   s           r   deprecationz_Logger.deprecationC  sL    
 ty4 Ot O O$e^f&,#3O O O 	Or   c               D     | j         t          j        g|R ||||||ddS )NFr   )r   r0   r6   r   s           r   noticez_Logger.noticeK  sL    
 ty/ P$ P PTYa&,#3P P P 	Pr   r   r   prefixT.Optional[AnsiDecorator]c                B   |t          d          }|                                  g }t          fddD                       rht          t	          j                  t	          t          j                                        }|                    | dj	         dj
         d           |r|                    |           |                    t                               |                                 5   | j        |ddi d d d            d S # 1 swxY w Y   d S )Nr   c              3  >   K   | ]}t          |d           d uV  d S r^   )getattr)r   r   r   s     r   r   z$_Logger.exception.<locals>.<genexpr>X  s4      TT1wq!T""$.TTTTTTr   )r   r   colno:r   T)r   r   allget_relative_pathr   r   r&   r   r   r   r  r|   rR   )rM   r   r  r   rd   s    `   r   	exceptionz_Logger.exceptionS  s`   >]]F


46TTTT8STTTTT 	9 %T!&\\4	3D3DEEDKK477!(77QW777888 	 KKCFF!! 	+ 	+DHd*T***	+ 	+ 	+ 	+ 	+ 	+ 	+ 	+ 	+ 	+ 	+ 	+ 	+ 	+ 	+ 	+ 	+ 	+s   9DDDr   ra   T.Generator[None, None, None]c              #     K   | j                             |           	 d V  | j                                          d S # | j                                          w xY wr^   )rA   r   pop)rM   ra   s     r   r   z_Logger.nestedd  s^      d###	!EEEN     DN    s	   = Ac                    | j         S r^   )r>   rL   s    r   get_log_dirz_Logger.get_log_dirl  s
    |r   intc                *    t          | j                  S r^   )lenrA   rL   s    r   get_log_depthz_Logger.get_log_deptho  s    4>"""r   c              #  V   K   | j         }d| _         	 d V  || _         d S # || _         w xY w)Nr   r   )rM   olds     r   nested_warningsz_Logger.nested_warningsr  sF      '$%!	,EEE(+D%%%D%++++rS   c                    | j         S r^   r  rL   s    r   get_warning_countz_Logger.get_warning_count{  s    ((r   	to_stderrc                    || _         d S r^   )rB   )rM   r   s     r   redirectz_Logger.redirect~  s    &r   c                   | j         rt          j        nt          j        }t	          |dd           }||S 	 t                      r5t          j        |                                          ot                      }nJt          j        |                                          o#t          j
                            dd          dk    }n# t          $ r d}Y nw xY w||_        |S )Nrv   TERMdumbF)rB   r   r   r*   r  r   r&   isattyfilenor,   r'   r(   r   rv   )rM   r   _colorize_consoles      r   rv   z_Logger.colorize_console  s    #1Asz")&2Dd"K"K($$	&|| l$&Ifmmoo$>$>$R=??!!$&Ifmmoo$>$>$k2:>>RXZ`CaCaekCk! 	& 	& 	& %	&"3  s   BC CCc                    | j         rt          j        nt          j        }t	                      r$	 t          |d           d S # t          $ r Y d S w xY wd S )Nrv   )rB   r   r   r*   r   delattrAttributeError)rM   r   s     r   setup_consolez_Logger.setup_console  sm      $1Asz<< 	 233333!   	 	s   A 
AA)r   rH   )r   rT   )r[   r\   r   rT   )r   r=   F)r   r|   r   r   r   rT   T)r   r   r   r   r   r   r   r@   )
r   r|   r   r   r   r=   r   r=   r   rT   )
r   r   r   r=   r   r=   r   r   r   rT   )r   r   r   r   r   r   r   r=   r   r=   r   r   r   rT   )r   r|   r   r@   r   rT   )r   r|   r   rT   )r   r   r   r   r   r   r   r   r   r=   r   r=   r   r   r   rT   )r   r   r   rT   )r   r   r   r   r   r   )r   r0   r   r   r   r   r   r   r   r   r   r   r   r=   r   r=   r   r   r   rT   )r   r   r   r   r   r   r   r   r   r   r   r=   r   r=   r   rT   r^   )r   r   r  r  r   rT   )r   )ra   r|   r   r  r   r|   r   r  )r   r   r   rT   r   r   )4r1   r2   r3   r>   __annotations__r   r   rA   rB   rC   rD   r   rK   rW   setrE   r   rF   rG   r   rN   rR   rX   rZ   r_   rf   r   rc   r   r   r   r   r   r   r   r   r   r   r   r   r  r  r  r  r   r  r  r  r  r"  rv   r,  r:   r   r   r<   r<   ?   s          $G####"U4888I8888M%)H))))-11111O,1E#,F,F,FKFFFF04I4444"1J1111, , , ^, . . . ^.$ $ $ $% % % %) ) ) )   $I $I $I $IL" " " "1 1 1 1 1
     LP+/0 0 0 0 0 0: @D%)T" " " " " " 9> $(D
? 
? 
? 
? 
? 
?C C C C2 2 2 2 8=t#'#'&*	v v v v v v        !&T48"&t*.$(%E %E %E %E %E %EP !/3!$%)	O O O O O O #$15#D'+	O O O O O O "'d59#'+/	O O O O O O "04"4&*	P P P P P P+ + + + +" ! ! ! ! ^!   # # # # , , , ^,) ) ) )' ' ' '! ! ! !	 	 	 	 	 	r   r<   c                  4    e Zd ZdZdddZddZddZddZdS )r   z[0mFrr   r|   codequotedr   c                0    || _         || _        || _        d S r^   )rr   r5  r6  )rM   rr   r5  r6  s       r   __init__zAnsiDecorator.__init__  s    		r   
with_codesr   c                x    | j         }|r#| j        r| j        | j         z   t          j        z   }| j        rd| d}|S )Nr   )rr   r5  r   
plain_coder6  )rM   r9  rr   s      r   r   zAnsiDecorator.get_text  sN    y 	D$) 	D9ty(=+CCD; 	t;;;Dr   r  c                *    t          | j                  S r^   )r  rr   rL   s    r   __len__zAnsiDecorator.__len__  s    49~~r   c                D    |                      t                                S r^   )r   rv   rL   s    r   __str__zAnsiDecorator.__str__  s    }}-//000r   Nr-  )rr   r|   r5  r|   r6  r   )r9  r   r   r|   r0  r/  )r1   r2   r3   r;  r8  r   r=  r?  r:   r   r   r   r     sn        J    
      1 1 1 1 1 1r   c                  &    e Zd Zd
dZddZddZd	S )AnsiTextr   'SizedStringProtocol'c                    || _         d S r^   )r   r   s     r   r8  zAnsiText.__init__  s    			r   r   r  c                >    t          d | j        D                       S )Nc              3  4   K   | ]}t          |          V  d S r^   )r  r   s     r   r   z#AnsiText.__len__.<locals>.<genexpr>  s(      --a3q66------r   )sumr   rL   s    r   r=  zAnsiText.__len__  s!    --49------r   r|   c                J    d                     d | j        D                       S )Nr   c              3  4   K   | ]}t          |          V  d S r^   )r|   r   s     r   r   z#AnsiText.__str__.<locals>.<genexpr>  s(      11!s1vv111111r   )r   r   rL   s    r   r?  zAnsiText.__str__  s%    ww11ty111111r   N)r   rB  r0  r/  )r1   r2   r3   r8  r=  r?  r:   r   r   rA  rA    sP           . . . .2 2 2 2 2 2r   rA  Frr   r|   r6  c                &    t          | d|          S )Nz[1mr6  r   rr   r6  s     r   r   r         y8888r   c                &    t          | d|          S )Nz[3mrJ  rK  rL  s     r   italicrO    rM  r   c                "    t          | d          S )Nr   rK  rr   s    r   plainrR    s    r"""r   c                "    t          | d          S )Nz[1;31mrK  rQ  s    r   r   r         |,,,r   c                "    t          | d          S )Nz[1;32mrK  rQ  s    r   greenrV    rT  r   c                "    t          | d          S )Nz[1;33mrK  rQ  s    r   r   r     rT  r   c                "    t          | d          S )Nz[1;34mrK  rQ  s    r   bluerY    rT  r   c                "    t          | d          S )Nz[1;36mrK  rQ  s    r   cyanr[    rT  r   c                "    t          | d          S )Nz[31mrK  rQ  s    r   
normal_redr]        z***r   c                "    t          | d          S )Nz[32mrK  rQ  s    r   normal_greenr`    r^  r   c                "    t          | d          S )Nz[33mrK  rQ  s    r   normal_yellowrb    r^  r   c                "    t          | d          S )Nz[34mrK  rQ  s    r   normal_bluerd    r^  r   c                "    t          | d          S )Nz[36mrK  rQ  s    r   normal_cyanrf    r^  r   fnamer
   r   r  c                    |  d| dS )Nr  r:   )rg  r   s     r   r   r      s    fr   targetr   currentc                    dg}|g|j         D ]>}	 |                     |          }t          g ||R  c S # t          $ r Y nw xY w|dgz  }?| S )z#Get the path to target from current.z..)r{   relative_tor   
ValueError)ri  rj  accpartrd   s        r   r  r    s     %C+7?+  	%%d++D##d###### 	 	 	D	v Ms   "6
AA
input_listr@   c                    t          |           }|dk    r8d                    d                    | d d                   | d         g          S |dk    rd                    |           S |dk    r| d         S dS )N   z and z, r   r	   r   r   )r  r   )rq  r   s     r   format_listrt    sx    JA1uu||TYYz#2#77BHIII	
a||J'''	
a!}rr   liner  c                    |  d| dd|z   dS )a  Print a line with a caret pointing to the colno

    :param text: A message to display before the line
    :param line: The line of code to be pointed to
    :param colno: The column number to point at
    :return: A formatted string of the text, line, and a caret
    r   r   ^r:   )rr   ru  r  s      r   	code_linerx     s'     ,,d,,cEk,,,,r   TT.Union[str, os.PathLike]bannerforceLiteral[True]c                    d S r^   r:   rg  rz  r{  s      r   ci_fold_filer  *  s    ehehr   Literal[False]r=   c                    d S r^   r:   r~  s      r   r  r  -  s    svsvr   c                D   t           s|sd S t          r	d| d}d}n=|r|}d}n6dt          j        v r&dt          j                            |            d}d}nd S t          | dd	          5 }|                                }d d d            n# 1 swxY w Y   | d
| d
| d
S )Nz::group::==== z ====z::endgroup::r   MESON_FORCE_SHOW_LOGSz!==== Forcing display of logs for rrp   r   r   )r   _ci_is_githubr&   r'   rd   basenamer   read)rg  rz  r{  headerfooterfdatas          r   r  r  0  s    % t /&///	 	 BJ	.	.SRW5E5Ee5L5LSSS t	eS7	+	+	+ qvvxx              ********s   +BBBr1  r-  )rr   r|   r6  r   r   r   )rr   r|   r   r   )rg  r
   r   r  r   r|   )ri  r   rj  r   r   r   )rq  r@   r   r|   )rr   r|   ru  r|   r  r  r   r|   r.  )rg  ry  rz  r|   r{  r|  r   r|   )rg  ry  rz  r|   r{  r  r   r=   )rg  ry  rz  r|   r{  r   r   r=   )[__doc__
__future__r   r4   r&   r   r   r   r   rw   r~   ry   typingr   
contextlibr   dataclassesr   r   pathlibr   TYPE_CHECKINGtyping_extensionsr   _typingr
   r   mparserr   Unionr|   r   Listr   r   r,   r'   r   r  Enumr0   r<   _loggerr   rv   r   r  r   r  r   r  r  r  r   r   r   r   r  rN   r  r   r"  rX   r_   rZ   r,  rf   r   rc   r  r   rA  r   rO  rR  r   rV  r   rY  r[  r]  r`  rb  rd  rf  r   r  rt  rx  overloadr  r:   r   r   <module>r     s  . . # " " " " "  				 				 



             % % % % % % ( ( ( ( ( ( ( (      ? *))))))<<<<<<<<!!!!!!'#>?Kf[)O! ! ! !^ ^ ^ ^ 
	 BJ.    	    Y Y Y Y Y Y Y Yv
 '))'+ !	!%!- 
k%	)
	'	1 !%!

/1 1 1 1 1 1 1 1,2 2 2 2 2 2 2 29 9 9 9 99 9 9 9 9# # # #- - - -- - - -- - - -- - - -- - - -+ + + ++ + + ++ + + ++ + + ++ + + +          "	 	 	 	- - - -  h h h h  h v v v v  v+ + + + + + +r   