
    xkde                        d dl mZ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mZmZmZmZmZmZmZmZmZmZ d dlZddlmZmZ ddlmZ  ed          Zg dZd	ed
edefdZ dee         dee         fdZ! G d de"          Z# G d de"          Z$dedefdZ% G d d          Z& G d d          Z'ee'e&f         Z( G d de)          Z* G d de)          Z+ G d de)          Z,e-dk    r ej.                      e+            Z/e/D ]'Z0 ej1        d e0                                z             ( e d!d"          Z2 ej1        d#e2z              ej1         e d$d"                      ej1         e d!d%                     dS dS )&    )absolute_importprint_functionN)
AnyDictCallableIterableIteratorListOptionalTupleTypeVarUnion   )DistInfoTemplate)_deb822T)	is_mirrorDeb822SourceEntrySourceEntryNullMatcherSourcesListSourceEntryMatcher
master_uricompare_urireturnc                 P   |                     d          }|                      d          } || k    rdS 	 |                    d          d         }|                     d          d         }n# t          $ r Y dS w xY wd|v r&||                    d          dz   d         |k    rdS dS )zcheck if the given add_url is idential or a mirror of orig_uri e.g.:
    master_uri = archive.ubuntu.com
    compare_uri = de.archive.ubuntu.com
    -> True
    z/ Tz//r   F.N)rstripsplit
IndexErrorindex)r   r   compare_srv
master_srvs       8/usr/lib/python3/dist-packages/aptsources/sourceslist.pyr   r   D   s     $$T**K""4((Jj  t!''--a0%%d++A.

   uu kk+*;*;C*@*@1*D*F*FG:UUt5s   6A+ +
A98A9sc                 :    t          t          |                     S )a-  simple and efficient way to return uniq collection

    This is not intended for use with a SourceList. It is provided
    for internal use only. It does not have a leading underscore to
    not break any old code that uses it; but it should not be used
    in new code (and is not listed in __all__).)listset)r&   s    r%   uniqr*   a   s     A<<    c                   n    e Zd ZdedefdZ	 ddddee         dee         fd	Zddd
ee         ddfdZdS )SingleValuePropertykeydocc                 "    || _         || _        d S Nr.   __doc__selfr.   r/   s      r%   __init__zSingleValueProperty.__init__l       r+   Nobjr   objtyper   c                 B    |j                             | j        d           S r1   )sectiongetr.   r5   r8   r9   s      r%   __get__zSingleValueProperty.__get__p   s     {tx...r+   valuec                 F    ||j         | j        = d S ||j         | j        <   d S r1   )r;   r.   )r5   r8   r?   s      r%   __set__zSingleValueProperty.__set__u   s-    =DH%%%$)CK!!!r+   r1   )	__name__
__module____qualname__strr6   r   typer>   rA    r+   r%   r-   r-   k   s        C c    
 CG/ /&/19$/	#/ / / /
*. *x} * * * * * * *r+   r-   c                   n    e Zd ZdedefdZ	 ddddee         dee         fd	Zddd
ee         ddfdZ	dS )MultiValuePropertyr.   r/   c                 "    || _         || _        d S r1   r2   r4   s      r%   r6   zMultiValueProperty.__init__}   r7   r+   Nr8   r   r9   r   c                 r    t                               |j                            | j        d                    S N )r   mysplitr;   r<   r.   r=   s      r%   r>   zMultiValueProperty.__get__   s*     ""3;??48R#@#@AAAr+   valuesc                 J    d                     |          |j        | j        <   d S )N )joinr;   r.   )r5   r8   rO   s      r%   rA   zMultiValueProperty.__set__   s"     # 0 0DHr+   r1   )
rB   rC   rD   rE   r6   r   rF   r
   r>   rA   rG   r+   r%   rI   rI   |   s        C c    
 CGB B&B19$B	cB B B B
1. 1S	 1d 1 1 1 1 1 1r+   rI   propc                     | S r1   rG   )rS   s    r%   DeprecatedPropertyrU      s    Kr+   c                      e Zd Zdeeej        ef                  defdZde	de	fdZ
 edd          Z ed	d
          Z e ed	d
                    Z edd          Z e edd                    Z edd          Z e edd                    Z edd          Zedefd            Zej        deddfd            Zedee         fd            Zej        dee         ddfd            Zedefd            Zej        deddfd            Zedefd            Zedefd            ZdefdZdefdZdeddfdZdS ) r   r;   filec                     |t          j        d          | _        n6t          |t                    rt          j        |          | _        n|| _        t	          | j                  | _        || _        d | _        d S rL   )r   Sectionr;   
isinstancerE   _linerW   template)r5   r;   rW   s      r%   r6   zDeb822SourceEntry.__init__   si    ?"?2..DLL%% 	#"?733DLL"DL&&
	,0r+   otherr   c                     | j         |j         k    ol| j        |j        k    o\| j        oU| j                            d          |j                            d          k    o| j        |j        k    o| j        |j        k    S z+equal operator for two sources.list entries/disabledrF   urir   distcompsr5   r]   s     r%   __eq__zDeb822SourceEntry.__eq__   s     MU^+ *	UZ'** $$	(8(8(=(==* 	UZ'	*
 
ek)	
r+   ArchitectureszThe list of architecturesTypeszThe list of typesURIszURIs in the sourceSuiteszSuites in the source
ComponentszComponents in the sourcec                     | j         j        S )1Legacy attribute describing the paragraph header.r;   headerr5   s    r%   commentzDeb822SourceEntry.comment   s     |""r+   rr   Nc                     || j         _        dS )rn   Nro   )r5   rr   s     r%   rr   zDeb822SourceEntry.comment   s     &r+   c                 d    	 t          j        | j        d                   S # t          $ r Y d S w xY w)NTrusted)apt_pkgstring_to_boolr;   KeyErrorrq   s    r%   trustedzDeb822SourceEntry.trusted   sA    	)$,y*ABBB 	 	 	44	s   ! 
//r?   c                 ^    |	 | j         d= d S # t          $ r Y d S w xY w|rdnd| j         d<   d S )Nru   yesnor;   rx   r5   r?   s     r%   ry   zDeb822SourceEntry.trusted   s[    =L+++    05&>ee$DL###s    
c                 ^    t          j        | j                            dd                     S )zCheck if Enabled: no is set.Enabledr{   )rv   rw   r;   r<   rq   s    r%   rb   zDeb822SourceEntry.disabled   s*     )$,*:*:9e*L*LMMMMr+   c                 V    |rd| j         d<   d S 	 | j         d= d S # t          $ r Y d S w xY w)Nr|   r   r}   r~   s     r%   rb   zDeb822SourceEntry.disabled   sS     	&*DL###L+++   s    
((c                     | j          S )z7A section is invalid if it doesn't have proper entries.)r;   rq   s    r%   invalidzDeb822SourceEntry.invalid   s     <r+   c                     | j         S )z The entire (original) paragraph.)r[   rq   s    r%   linezDeb822SourceEntry.line   s     zr+   c                 N    |                                                                  S r1   rE   striprq   s    r%   __str__zDeb822SourceEntry.__str__   s    xxzz!!!r+   c                 *    t          | j                  S )z(Section as a string, newline terminated.)rE   r;   rq   s    r%   rE   zDeb822SourceEntry.str   s    4<   r+   enabledc                     | | _         dS )z.Deprecated (for deb822) accessor for .disabledN)rb   )r5   r   s     r%   set_enabledzDeb822SourceEntry.set_enabled   s    #r+   ) rB   rC   rD   r   r   r   rY   rE   r6   r   rg   rI   architecturestypesrU   r-   rF   urisrc   suitesrd   re   propertyrr   setterboolry   rb   r   r   r   r   rG   r+   r%   r   r      s       
1w/C)D E 
1S 
1 
1 
1 
1

C 

C 

 

 

 

 '&8STTMw(;<<E11';NOOPPDf&:;;D

009MNN
O
OC*@AAF11(<RSSTTD|-GHHE# # # # X# ^&s &t & & & ^& $    X ^?Xd^ ? ? ? ? ^? N$ N N N XN _d t    _         X  c    X" " " " "!S ! ! ! !$4 $D $ $ $ $ $ $r+   r   c                       e Zd ZdZddedee         fdZdedefdZe	dede
e         fd	            Zdeddfd
ZdeddfdZdefdZdefdZdS )r   zsingle sources.list entryNr   rW   c                 h   d| _         d| _        d| _        g | _        d | _        d| _        d| _        g | _        d| _        || _	        |?t          j                            d          t          j                            d          z   }|| _        |                     |           d | _        g | _        d S )NFrM   zDir::EtcDir::Etc::sourcelist)r   rb   rF   r   ry   rc   rd   re   rr   r   rv   configfind_dirfindrW   parser\   children)r5   r   rW   s      r%   r6   zSourceEntry.__init__   s    	(*'+	 "
	<>**:669L9L&: : D 	

4,0+-r+   r]   r   c                     | j         |j         k    oe| j        |j        k    oU| j                            d          |j                            d          k    o| j        |j        k    o| j        |j        k    S r_   ra   rf   s     r%   rg   zSourceEntry.__eq__  sw     MU^+ *	UZ'*$$	(8(8(=(==* 	UZ'* 
ek)	
r+   c                 H   |                                  } g }d}d}d}t          t          |                     D ]}| |         dk    r2|r"d}d}|                    |           | |         }2d}|| |         z  }@| |         dk    rd}|| |         z  }Z|r:| |                                         s d}|                    |           | |         }| |                                         r|sd}|| |         z  }t          |          dk    r|                    |           |S )z|a split() implementation that understands the sources.list
        format better and takes [] into account (for e.g. cdroms)rM   F[T]r   )r   rangelenappendisspace)r   piecestmpp_foundspace_foundis         r%   rN   zSourceEntry.mysplit  sK    zz||s4yy!! 	 	AAw#~~ #"'K"GMM#&&&q'CC"G47NCCaCtAw 	T!W__%6%6 	#c"""1ga"" 7 "tAws88a<<MM#r+   c                    || _         |                                }|dk    s|dk    r	d| _        dS |d         dk    rRd| _        |dd                                                                         }|d         dvr	d| _        dS |dd         }|                    d          }|dk    r||dz   d         | _        |d|         }|                     |          }t          |          dk     r	d| _        dS |d                                         | _	        | j	        d	vr	d| _        dS |d                                         d         d
k    r|
                    d                              d                                          }|D ]{}	 |                    dd          \  }}|dk    r|                    d          | _        =|dk    rt          j        |          | _        ]d| _        e# t          $ r
 d| _        Y xw xY w|d                                         | _        t          | j                  dk     rd| _        |d                                         | _        t          |          dk    r|dd         | _        dS g | _        dS )zXparse a given sources.list (textual) line and break it up
        into the field we haverM   #TNr   r   )rpmrpm-srcdebdeb-src   )r   r   r   r   r   z[]=arch,ry      )r   r   r   rb   r    r   rr   rN   r   rF   popr   rv   rw   ry   	Exceptionrc   rd   re   )r5   r   r   r   optionsoptionr.   r?   s           r%   r   zSourceEntry.parse7  s    	zz||2::DLF7c>> DM!""X^^%%++--F!9 DDD#ABBxIIcNNq55A=DL8Dd##v;;??DLF1IOO%%	9@@@DLF!9??Q3&&jjmm))$//5577G! , ,
,!'c1!5!5JC f}}-2[[-=-=**	))'.'=e'D'D'+ ! ( ( (#'DLLL( !9??$$tx==1DL 1IOO%%	v;;??DJJJDJJJs   G--H H	new_valuec                     | | _         |r3| j                                                            d          | _        dS | j                                        d         dk    rd| j        z   | _        dS dS )z!set a line to enabled or disabledr   r   N)rb   r   lstripr   )r5   r   s     r%   r   zSourceEntry.set_enabledw  sq    % 	,	((**11#66DIII y  #s**$)O			 +*r+   c                 N    |                                                                  S )zdebug helperr   rq   s    r%   r   zSourceEntry.__str__  s    xxzz!!!r+   c                    | j         r| j        S d}| j        rd}|| j        z  }| j        r5| j        .|dd                    | j                  d| j        rdndd	z  }n@| j        |d
| j        rdndz  z  }n'| j        r |dd                    | j                  z  z  }|d| j        d| j        z  }t          | j
                  dk    r |dd                    | j
                  z   z  }| j        dk    r|d| j        z   z  }|dz  }|S )z!return the current line as stringrM   z# Nz [arch=r   z	 trusted=r{   r|   r   z [trusted=%s]z
 [arch=%s]rQ   r   z #
)r   r   rb   rF   r   ry   rR   rc   rd   r   re   rr   )r5   r   s     r%   rE   zSourceEntry.str  sM   < 	9= 	D	 	@$,":D+,,,,/4// DD \%O'Fuu$GGDD 	@L388D,>#?#???DDHHHdii00tz??QC#((4:....D<2D4<''Dr+   r1   )rB   rC   rD   r3   rE   r   r6   r   rg   staticmethodr
   rN   r   r   r   r   rG   r+   r%   r   r      s       ##. .S . . . . .(
C 
C 
 
 
 
 #c #d3i # # # \#J># >$ > > > >@	,T 	,d 	, 	, 	, 	," " " " "S      r+   r   c                   "    e Zd ZdZdedefdZdS )r   za Matcher that does nothingr&   r   c                     dS )NTrG   )r5   r&   s     r%   matchzNullMatcher.match  s    tr+   N)rB   rC   rD   r3   AnySourceEntryr   r   rG   r+   r%   r   r     s<        %%~ $      r+   r   c                      e Zd ZdZ	 	 d%dddededefd	Zd&dZd
ee	         fdZ
dee	gef         ded
ee	         fdZdddg fdedededee         dededee         dee         d
e	fdZded
dfdZded
dfdZd'dee         d
efd Zded
dfd!Zd&d"Zd#ee	         d
eee	         eeee	         f         f         fd$ZdS )(r   z6represents the full sources.list + sources.list.d fileT /usr/share/python-apt/templates/F)deb822withMatchermatcherPathr   c                    g | _         |  |rt          |          | _        nt                      | _        || _        |                                  d S r1   )r(   r   matcherr   r   refresh)r5   r   r   r   s       r%   r6   zSourcesList.__init__  sM     +-	< 	)-k::DLL&==DLr+   r   Nc                    g | _         t          j                            d          }t          j                            |          r|                     |           t          j                            d          }t          j                            |          r{t	          j	        |          D ]f}| j
        r|                    d          s|                    d          r3|                     t          j                            ||                     g| j         D ]#}|j        s| j                            |           $dS )z update the list of known entriesr   Dir::Etc::sourceparts.sourcesz.listN)r(   rv   r   	find_fileospathexistsloadr   listdirr   endswithrR   r   r   r   )r5   rW   partsdirsources       r%   r   zSourcesList.refresh  s!   	~''(>??7>>$ 	IIdOOO>**+BCC7>>(## 	<
8,, < <K <DMM*$=$= <$--C C < IIbgll8T::;;;i 	+ 	+F> +""6***	+ 	+r+   c              #   &   K   | j         D ]}|V  dS )zGsimple iterator to go over self.list, returns SourceEntry
        typesN)r(   )r5   entrys     r%   __iter__zSourcesList.__iter__  s.       Y 	 	EKKKK	 	r+   
predicatesattrsc              /   :  K                        dd           }| j        D ]x|r9j        r2|                    d          j                            d          k    r=t	          fdD                       rt	          fd|D                       rV  yd S )Nrc   r`   c              3   L   K   | ]}t          |          |         k    V  d S r1   )getattr).0r.   r   r   s     r%   	<genexpr>z%SourcesList.__find.<locals>.<genexpr>  s6      GG#763''5:5GGGGGGr+   c              3   .   K   | ]} |          V  d S r1   rG   )r   	predicater   s     r%   r   z%SourcesList.__find.<locals>.<genexpr>  sF       P P&/		&!!P P P P P Pr+   )r   r(   rc   r   all)r5   r   r   rc   r   s     ` @r%   __findzSourcesList.__find  s       iit$$i 	 	F vz cjjoo9J9J39O9O&O&OGGGGGGGGGG C P P P P3=P P P M M  	 	r+   rM   rF   rc   rd   
orig_compsrr   posrW   r   c	                    |                                 }|                    d          }	|	r|dd                                         }t                    |dd         }
|                     fd|	d|||          }|D ]?}|
D ]:}||j        v r/|
|
                    |          = t          |
          dk    r|c c S ;@|                     fdd|||	          }|D ]}|j        |	k    rEt          |j                  t          |
          k    rt          |j        |
z             |_        |c S |j        r2|	s0t          |j                  t          |
          k    rd|_        |c S |o|
                    d
          rZt          d|          }|g|_        |g|_        |g|_        |
|_        rt                    |_        ||j        _        |	|_        n|	rdnd|rdd                              z  nd||g}|                    |
           |r|                    d|z              d                    d |D                       dz   }t-          |          }|||_        | j                            |           |dk     r| j                            |           n| j                            ||           |S )z
        Add a new source to the sources.list.
        The method will search for existing matching repos and will try to
        reuse them as far as possible
        r   r   Nc                 4    t          | j                  k    S r1   r)   r   r&   r   s    r%   <lambda>z!SourcesList.add.<locals>.<lambda>       c!/**m; r+   F)rb   r   rF   rc   rd   r   c                 4    t          | j                  k    S r1   r   r   s    r%   r   z!SourcesList.add.<locals>.<lambda>  r   r+   )r   rF   rc   rd   r   )rW   rM   z	[arch=%s]r   rQ   c              3      K   | ]}||V  	d S r1   rG   )r   parts     r%   r   z"SourcesList.add.<locals>.<genexpr><  s'      ;;Td;D;;;;;;r+   r   )r   
startswithr   r)   _SourcesList__findre   r"   r   rb   r*   r   r   r   r   r   r(   r   r;   rp   rR   extendr   r   rW   r   r   insert)r5   rF   rc   rd   r   rr   r   rW   r   rb   re   sourcesr   new_comp	new_entrypartsr   s           `        r%   addzSourcesList.add  s>   " zz||??3'' 	%8??$$DM** 111++;;;;  
 
  	& 	&F! & &v|++ ekk(3345zzQ%& ++;;;;  
 
  	" 	"F(** v|$$E

22#'u(<#=#=FL " "v|$$E

22&+FO!MMM j 9 9)$T:::I#fIO!UIN $vI#IO >*.}*=*=	''.I$!)I  'R;HPsxx6666bE LL ,S7]+++88;;U;;;;;dBD#D))I!%	9%%%77IY''''IS),,,r+   source_entryc                 :    | j                             |           dS )z0remove the specified entry from the sources.listN)r(   remove)r5   r   s     r%   r   zSourcesList.removeI  s    	&&&&&r+   
backup_extc                    t           j                            d          }t          j                            ||z             r7t          j                            |          rt          j        ||z   |           t           j                            d          }t          j	        d|z            D ]<}t          j                            ||z             rt          j        ||z   |           =dS )z8restore sources.list files based on the backup extensionr   r   z%s/*N)
rv   r   r   r   r   r   shutilcopyr   glob)r5   r   rW   r   s       r%   restore_backupzSourcesList.restore_backupM  s    ~''(>??7>>$+,, 	11E1E 	1Kz)4000>**+BCCIfx/00 	5 	5Dw~~dZ/00 5D:-t444	5 	5r+   c                    t                      }|t          j        d          }| j        D ]R}|j        |vrGt
          j                            |j                  r#t          j	        |j        |j        |           S|S )zmake a backup of the current source files, if no backup extension
        is given, the current date/time is used (and returned)Nz%y%m%d.%H%M)
r)   timestrftimer(   rW   r   r   r   r   r  )r5   r   already_backupedr   s       r%   backupzSourcesList.backupX  s     +.%%}55Ji 	M 	MF{"222rw~~fk7R7R2FK6;;

)KLLLr+   c                    	 t          |d          5 }|                    d          r@t          j        |          D ]*}| j                            t          ||                     +n/|D ],}t          ||          }| j                            |           -ddd           dS # 1 swxY w Y   dS # t          $ r&}t          j
        d|d|d           Y d}~dS d}~ww xY w)z(re)load the current sourcesrr   Nzcould not open file 'z': r   )openr   r   Filer(   r   r   r   r   loggingwarning)r5   rW   fr;   r   r   excs          r%   r   zSourcesList.loadc  s]   
	LdC 1A==,, 1#*<?? K K	(():7D)I)IJJJJK !" 1 1!,T4!8!8	((00001 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1  	L 	L 	LOOcccJKKKKKKKKK	Ls;   B1 BB$B1 $B((B1 +B(,B1 1
C!;CC!c                    i }t          | j                  dk    r`t          j                            d          }d}t          |d          5 }|                    |           ddd           n# 1 swxY w Y   dS 	 | j        D ]}|j        |vrt          |j        d          ||j        <   n:|j                            d          r ||j                                     d           ||j                                     |	                                           	 |
                                D ]}|                                 dS # |
                                D ]}|                                 w xY w)zsave the current sourcesr   r   z## See sources.list(5) for more information, especialy
# Remember that you can only use http, ftp or file URIs
# CDROMs are managed through the apt-cdrom tool.
wNr   r   )r   r(   rv   r   r   r  writerW   r   rE   rO   close)r5   filesr   rp   r  r   s         r%   savezSourcesList.saveq  s   -/ty>>Q>++,BCCDE  dC  A                             F		) 7 7;e++)-fk3)?)?E&+&&[))*55 3&+&,,T222fk"((66667 \\^^  				 U\\^^  				s   A..A25A2<BE -E4sources_listc                    g }i }|D ]v}|j         
|j         j        r.|j         }||vrg ||<   ||         }|                    |           Dt          |j         j                  dk    r|                    |           w||fS )z5get all parent and child channels in the sources listNr   )r\   childr   r   r   )r5   r  parentsused_child_templatesr   r.   temps          r%   check_for_relationszSourcesList.check_for_relations  s     EG" 	+ 	+F& $ 	+o22202(-+C0F#### v/00144NN6*** -..r+   )Tr   )r   Nr1   )rB   rC   rD   r3   r   rE   r6   r   r	   r   r   r   r   r   r
   intr   r   r   r   r   r  r  r   r  r   r   r   r  rG   r+   r%   r   r     sd       @@ !=
    
     + + + +((>2    
#^$4d$:;
FI
	.	!
 
 
 
$ "')a aa a 	a
 Ia a a sma  }a 
a a a aF'; '4 ' ' ' '	5 	5 	5 	5 	5 	5	 	# 	# 	 	 	 	L L L L L L   6/$^4/	tN#T(D4H*H%II	J/ / / / / /r+   r   c                   .    e Zd ZdZdefdZdedefdZdS )r   ztmatcher class to make a source entry look nice
    lots of predefined matchers to make it i18n/gettext friendly
    r   c                 @   g | _         t          j        d|z            }|D ]|}t          j                            |          }|                    d          }|d|         }t          ||          }|j         D ]#}|j        | j                             |           $}d S )Nz	%s/*.infoz.infor   )base_dir)		templatesr  r   r   basenamer   r   	match_urir   )r5   r   
spec_filesr  r   rd   r\   s          r%   r6   zSourceEntryMatcher.__init__  s    )+Y{[899
 	4 	4A  ##AwA!A#AA444D N 4 4%1N))(3334 	r+   r   r   c                    d}| j         D ]}|j        |j        |j        y|j        r|j        k|j        dt          j        |j        |j                  rEt          j        |j        |j                  r&|j        |j        k    s|j        dk    rd}||_	         nS|
                    |j                  r8|j        1|j        *t          j        |j        |j                  rd}||_	         n|S )z%Add a matching template to the sourceFNr   T)r"  rc   rd   r$  
match_nameresearchr   rF   r\   r   )r5   r   foundr\   s       r%   r   zSourceEntryMatcher.match  s    	 	Hz!V[%8".'3J*K+Ih0&*== ,HX0&+>> , --%1G1G"*""6:..'3K+HX0&+>> , "*r+   N)	rB   rC   rD   r3   rE   r6   r   r   r   rG   r+   r%   r   r     s[         C    N t      r+   r   __main__zentry %sz!http://archive.ubuntu.com/ubuntu/z$http://de.archive.ubuntu.com/ubuntu/zis_mirror(): %sz http://archive.ubuntu.com/ubuntuz#http://de.archive.ubuntu.com/ubuntu)3
__future__r   r   r  ior  os.pathr   r(  r   r  typingr   r   r   r   r	   r
   r   r   r   r   rv   distinfor   r   rM   r   r   __all__rE   r   r   r*   r   r-   rI   rU   r   r   r   objectr   r   r   rB   init_configr   r   infomirrorrG   r+   r%   <module>r6     s  4 7 6 6 6 6 6 6 6  				   				                           ( ( ( ( ( ( ( (       GCLL  # C D    :HQK DG    * * * * *( * * *"1 1 1 1 1 1 1 1Q 1    _$ _$ _$ _$ _$ _$ _$ _$Do o o o o o o od {$556    &   x/ x/ x/ x/ x/& x/ x/ x/v1 1 1 1 1 1 1 1j zGkmmG / /Z%))++-.... Y+-S F GL"V+,,,GL	.0V	
 	
  
 GL	/1V	
 	
    % r+   