
    瞤dYg                        d Z ddlmZ ddlZddlmZ ddlZddlmZ ddl	Z	ddl
mZ dd	gZi d
dddddddddddddddddddddddddddddddddi ddddddd d!d"d!d#d!d$d!d%d!d&d'd(d)d*d)d+d)d,d-d.d/d0d1d2d1d3d1d1d1ddd4d5i d$dd6dd&dd7d'd8d-d9d-d:d-d"d-d;d-d<d-d=d-d>d-d d-d?d-d@d-d#d-dAd-dBZ G dC de          ZdS )Da  
'phylomedb' provides an access API to the data stored in the
phylogenetic database PhylomeDB *[1].

All methods to perform queries are implemented within the
PhylomeDBConnector class.

 *[1] PhylomeDB: a database for genome-wide collections of gene
 phylogenies Jaime Huerta-Cepas, Anibal Bueno, Joaquin Dopazo and Toni
 Gabaldon.

      PhylomeDB is a database of complete phylomes derived for
      different genomes within a specific taxonomic range. All
      phylomes in the database are built using a high-quality
      phylogenetic pipeline that includes evolutionary model testing
      and alignment trimming phases. For each genome, PhylomeDB
      provides the alignments, phylogentic trees and tree-based
      orthology predictions for every single encoded protein.
    )absolute_importN)strip   )	PhyloTree)mapPhylomeDBConnectorROOTED_PHYLOMESAth
   CrePfaPyoDdiGthLmaPteAgo	   CalCglCneDhaEcuGzeKlaNcrSceSpbYliAga   DmeAmeCelCbrCin   Dre   TniFruXtr   Gga   Mdo   MmsRno   )CfaBtaPtrMmuHsar9   DpuDpsTcaPhuApiDmoNviDyaCpiBomAae)r4      c                       e Zd ZdZ	 	 	 	 	 d'dZd Zd Zd	 Zd
 Zd Z	d Z
d Zd Zd Zd(dZd(dZd Zd Zd Zd Zd(dZd Zd(dZd(dZd Zd Zd Zd Zd Zd  Zd! Zd" Zd# Z d$ Z!d)d&Z"d%S )*r   aR   Reuturns a connector to a phylomeDB database.

    ARGUMENTS:
    ==========
    host: hostname in which phylomeDB is hosted.
    user: username to the database.
    passwd: password to connect database.
    port: port used to connect database.

    RETURNS:
    ========
    An object whose methods can be used to query the database.
  84.88.66.245	phylomeDBpublic  c           	         t          j        ||||t          |                    | _        | j                                        | _        |dk    rd| _        d| _        d| _        d	S d|z   | _        d|z   | _        d|z   | _        d	S )
za Connects to a phylomeDB database and returns an object to
        perform custom queries on it. )hostuserpasswddbportphyAdmintreesalgsphylomestrees_algs_	phylomes_N)	MySQLdbconnectint_SQLconnectioncursor_SQL_trees_table_algs_table_phylomes_table)selfrL   rO   rM   rN   rP   s         8lib/python3.11/site-packages/ete3/phylomedb/phylomeDB.py__init__zPhylomeDBConnector.__init__   s     &oT9=9?9;9<T	D D D '..00	:#*D#)D#-D   #+D=D#*4<D#.t#3D       c                     |                     d          }|D ]O}|                                }|dk    r3	 | j                            |dz             };# t          j        $ r  w xY wP|S )zT Executes a multi-line SQL command and returns the nombre of
        affected rows. ; )splitr   r]   executerX   Error)ra   cmdcommandscrowss        rb   _execute_blockz!PhylomeDBConnector._execute_block   s     99S>> 	 	A		ABww9,,QsU33DD}    
 s   AA$c           	         	 |dd         }t          |dd                   }d|d|d|d|d	}| j                            |          r#| j                                        \  }}d||fz  S dS # t          $ r t	          d	          w xY w)
z returns the protID of the Nr1   z) SELECT species, IF(gene="" OR gene=NULL,z&,protid) FROM proteins WHERE species="zP" AND (gene,proteome_id)=(SELECT gene, proteome_id FROM proteins WHERE species="z" AND protid=z%) ORDER BY length(seq) DESC LIMIT 1; %s%07dzinvalid phylome protein ID)rZ   r]   ri   fetchone
ValueError)ra   phyIDspc_codeprot_numberrk   spcprotids          rb   get_longest_isoformz&PhylomeDBConnector.get_longest_isoform   s    	)HeABBi..KK r}  r}  r}  ~F  ~F  ~F  GO  GO  GO  P[  P[  P[  \Cy  %% !Y//11
F3v,..t  	; 	; 	;9:::	;s   !A1 1Bc                     d|z  }g }| j                             |          r[| j                                         }|D ]?}|                     d|d         |d         fz            }|r|                    |           @|S )z/ Returns the phylomeID of the given external IDz?SELECT species,protid from id_conversion where external_id="%s"rq   r   r4   )r]   ri   fetchallry   append)ra   externalcommandidsmatchesmrt   s          rb   get_id_by_externalz%PhylomeDBConnector.get_id_by_external   s     TW_`9W%% 	(i((**G ( (00QqT!A$K1GHH (JJ'''
rd   c                    d|dd         t          |dd                   fz  }i }| j                            |          rJ| j                                        }|D ].\  }}|                    |g                               |           /|S )z: returns all the registered translations of a given seqid zRSELECT external_db,external_id from id_conversion where species="%s" and protid=%dNr1   )rZ   r]   ri   r{   
setdefaultr|   )ra   seqidrk   
conversionextidsrO   eids          rb   get_id_translationsz&PhylomeDBConnector.get_id_translations   s     cfklnmnlnfopstyz{z|z|t}p~p~e
9S!! 	:Y''))F! : :C%%b"--44S9999rd   c                    |                                 }d}d}g }t          j        ||          r+|                     |          }|                    |           nt          j        ||          rd|d|d}| j                            |          rN| j                                        D ]4\  }}|                     d||fz            }|                    |           5|                     |          }	|	r|	                    |	           |S )z Returns a list of phylome protein Ids associated to the
        given external queryID. If queryID is a phylomeDB id, it
        returns the longest isoform associated to the queryID's gene
        z^[\w\d\-_,;:.|#@\/\\()'<>!]+$z^\w{3}\d{7}$z0SELECT species,protid from proteins where name="z" or gene=""rq   )
r   rematchry   r|   r]   ri   r{   r   extend)
ra   queryIDQUERYID_GENERAL_REGEXP_FILTER!QUERYID_INTERNAL_ID_REGEXP_FILTERphyID_matchesrt   rk   ru   rx   hitss
             rb   	search_idzPhylomeDBConnector.search_id   s:   
 --// )I%,:)85w?? 	+,,W55E  ''''X3W== 	+ 	+X_X_X_`g`g`ghCy  %% 2)-););)=)= 2 2$Hf 44X&@Q5QRRE!((%1111 **733D +$$T***rd   c                 p    d}| j                             |          r| j                                         S dS )z( Returns all current available proteomeszSELECT * FROM proteomesNr]   ri   r{   ra   rk   s     rb   get_proteomesz PhylomeDBConnector.get_proteomes  s=    '9S!! 	(9%%'''	( 	(rd   c                 p    d}| j                             |          r| j                                         S dS )z& Returns all current available specieszSELECT * FROM speciesNr   r   s     rb   get_specieszPhylomeDBConnector.get_species  s?     &9S!! 	(9%%'''	( 	(rd   c                    d| j         z  }i }| j                            |          r| j                                        D ]}|d         }i ||<   |d         ||         d<   |d         dd         ||         d<   |d         ||         d	<   |d
         ||         d<   |d         ||         d<   |d         ||         d<   |d         ||         d<   |S )z( Returns all current available phylomes zTSELECT phylome_id,seed_proteome,proteomes,DATE(ts),name,description,comments FROM %sr   r4   seed_proteomeNr1   seed_speciesr   	proteomesr/   namer-   descriptiondater)   comments)r`   r]   ri   r{   )ra   rk   rT   phylo
phylome_ids        rb   get_phylomeszPhylomeDBConnector.get_phylomes#  s    dgkg{|9S!! 
	A++-- 	A 	A"1X
%'$8=a$_58=a!$^48=a$[18=a$V,8=a$]38=a$V,8=a$Z00rd   c                    d| j         d|d}| j                            |           | j                                        }|r<t	          t          t          |d                             d                              }nd}|S )z= Returns a list of proteomes associated to a given phylome_idzSELECT proteomes FROM  WHERE phylome_id="" r   ,N)r`   r]   ri   rr   listr   r   rh   )ra   r   rk   entriesproteomes_strings        rb   get_proteomes_in_phylomez+PhylomeDBConnector.get_proteomes_in_phylome4  s      ###ZZZ1	#)$$&& 	$#Cwqz/?/?/D/D$E$EFF#rd   Tc                    g }|rd|dd         d|dd         d}| j                             |          r| j                                         }i }d}|D ]o\  }}	}
}|
                                }
|dz  }|
s
d|z  }
|dz  }|
|vr
||	|
|f||
<   :t	          |          t	          ||
         d                   k    r	||	|
|f||
<   pd	 t          |                                          D             }nVd
|dd         d|dd         d}| j                             |          r#d | j                                         D             }|S )z+ Returns all sequences of a given proteome @SELECT species,protid,gene,seq FROM proteins WHERE proteome_id="r1   N" AND species="r   r   r4   phyunknown%dc                 4    g | ]}d |d         |d         fz  S )rq   r   r4    ).0vs     rb   
<listcomp>z=PhylomeDBConnector.get_seqids_in_proteome.<locals>.<listcomp>V  s)    YYYA(AaD!A$</YYYrd   z7SELECT species,protid FROM proteins WHERE proteome_id="c                 "    g | ]\  }}d ||fz  S )rq   r   )r   rw   rx   s      rb   r   z=PhylomeDBConnector.get_seqids_in_proteome.<locals>.<listcomp>[  s%    WWWJC(C</WWWrd   r]   ri   r{   r   lenr   values)ra   proteome_idfilter_isoformsseqidsrk   r   largest_isoformsunknown_counterspcsrx   geneseqs               rb   get_seqids_in_proteomez)PhylomeDBConnector.get_seqids_in_proteomeA  s     	X 	Xqrr???;rr???4Cy  %% Z),,..#% "#,3 	H 	H(DS::<<D#q(O -+o='1,#33326vd31G(..SC(8(>q(A$B$BBB26vd31G(.YY>N>U>U>W>W9X9XYYY#	X( qrr???;rr???4Cy  %% XWW$)BTBTBVBVWWWrd   c                    d|dd          d|d d         d}| j                             |          r| j                                         }|ri }d}|D ]o\  }}}	}
|	                                }	|dz  }|	s
d|z  }	|dz  }|	|vr
|||	|
f||	<   :t	          |
          t	          ||	         d                   k    r	|||	|
f||	<   pt          |                                          }n|}nd }|S )Nr   r1   r   r   r   r4   r   r   )ra   r   r   rk   r   r   r   r   rx   r   r   seqss               rb   get_seqs_in_proteomez'PhylomeDBConnector.get_seqs_in_proteome_  s<    122{2A209S!! 	i((**G #% "#,3 	H 	H(DS::<<D#q(O -+o='1,#33326vd31G(..SC(8(>q(A$B$BBB26vd31G(.,335566Drd   c                    d|dd         d|dd         d}i }| j                             |          rP| j                                         }|d         |d<   |d         |d	<   |d
         |d<   |d         |d<   |d         |d<   |S )z- Returns all info about a registered proteomezSSELECT proteome_id,species,source,comments,date FROM proteomes WHERE proteome_id ="r1   Nr   r   r   r   r4   speciesr   sourcer   r/   r   r]   ri   rr   )ra   r   rk   infoentrys        rb   get_proteome_infoz$PhylomeDBConnector.get_proteome_infoy  s      122{2A209S!! 	$I&&((E"'(D#AhDO"1XDN$QxD 8DLrd   c                 <   d|dd         d|dd         d}i }| j                             |          rf| j                                         }|d         |d<   |d         |d	<   |d
         |d<   |d         |d<   |d         |d<   |d         |d<   |d         |d<   |S )z* Returns orginal info about a given protidzVSELECT species,protid,proteome_id,name,gene,comments,seq FROM proteins WHERE species="Nr1   " and protid="r   r   r   r4   r   r   r   r   r/   r   r-   r   r)   r   r   )ra   rx   rk   r   r   s        rb   get_seqid_infoz!PhylomeDBConnector.get_seqid_info  s      bqbzzz&***& 9S!! 	#I&&((E#AhDO!!HDM"'(D 8DL 8DL$QxD(DKrd   c                 Z   d| j         d|d}i }| j                            |          r| j                                        }t	          |          |d<   |d         |d<   |d         dd         |d	<   |d
         |d<   |d         |d<   |d         |d<   |d         |d<   |d         |d<   |S )z  Returns info on a given phylomezGSELECT seed_proteome,proteomes,DATE(ts),name,description,comments FROM r   r   idr   r   Nr1   r   r4   r   r   r/   r   r   r   r-   r   )r`   r]   ri   rr   rZ   )ra   	phylomeidrk   r   all_infos        rb   get_phylome_infoz#PhylomeDBConnector.get_phylome_info  s      !!!999.9S!! 		0y))++H$'	NNDJ$,QKD!$,QKOD $,QKD$,QKDL$,QKD$,QKDL$,QKDrd   c                 ,   d|z  }| j                             |          r| j                                         S d|z  }i }| j                             |          r:| j                                         }|d         |d<   |d         |d<   |d         |d<   |S )	z0 Returns all information on a given species_codez4SELECT taxid,code,name from species where taxid="%s"z3SELECT taxid,code,name from species where code="%s"r   taxidr4   coder   r   r   )ra   taxid_or_coder~   r   r   s        rb   get_species_infoz#PhylomeDBConnector.get_species_info  s     IMZ9W%% 
	9%%'''K}]GDy  )) (	**,, %aW$QxV$QxVKrd   c                     d| j         d|d}| j                            |          r7| j                                        d         }|                     ||          }ng }|S )NzSELECT seed_proteome FROM r   ";r   )r   )r`   r]   ri   rr   r   )ra   r   r   rk   r   seedidss         rb   get_seed_idszPhylomeDBConnector.get_seed_ids  ss     GKG[G[G[]g]g]gh9S!! 	 I..003M11-Q`1aaGGGrd   c                     d|d d         dt          |dd                    d}| j                            |          r| j                                        S g S )Nz<SELECT seed_id, phylome_id FROM seed_friends WHERE species="r1   r   r   )rZ   r]   ri   r{   )ra   r   rk   s      rb   get_collateral_seedsz'PhylomeDBConnector.get_collateral_seeds  s_     2A2YYYs59~~~~'9S!! 	9%%'''Ird   c           
      J   |i i}d| j         d|d d         d|dd          d}| j                            |          rW| j                                        D ]=\  }}|||         v r"||         |                             |           1|g||         |<   >|r|                     |          D ]t\  }}d| j         d|d d         d|dd          d|d	}| j                            |          r1i ||<   d | j                                        D             ||         |<   u|S )	NSELECT phylome_id, method FROM  WHERE species="r1   " AND protid="r   SELECT method FROM " and phylome_id ="c                     g | ]
}|d          S r   r   r   methods     rb   r   z:PhylomeDBConnector.get_available_trees.<locals>.<listcomp>  s    *X*X*X6!9*X*X*Xrd   )r^   r]   ri   r{   r|   r   )	ra   r   
collateralrR   rk   r   r   cseedphyids	            rb   get_available_treesz&PhylomeDBConnector.get_available_trees  sn   r
rrE!""III79S!! 	8&*i&8&8&:&: 8 8"
Fu--%L,33F;;;;06xE%L,, 	Y $ 9 9% @ @ Y Yuu'''rrE!""IIIuuuF9$$S)) Y#%E%L*X*X49CUCUCWCW*X*X*XE%L'rd   c           
         |i i}d| j         d|d d         d|dd          d}i }| j                            |          rn| j                                        D ]T\  }}||vr	||gi||<   |||         v r"||         |                             |           >|||         vr|g||         |<   U|r|                     |          D ]}\  }}	d| j         d|d d         d|dd          d|	d	}| j                            |          r:d | j                                        D             |                    |	i           |<   ~|S )	Nr   r   r1   r   r   r   r   c                     g | ]
}|d          S r   r   r   s     rb   r   zEPhylomeDBConnector.get_available_trees_by_phylome.<locals>.<listcomp>  s    ?m?m?mfq	?m?m?mrd   )r^   r]   ri   r{   r|   r   r   )
ra   r   r   rR   rk   phyid2treesr   r   r   r   s
             rb   get_available_trees_by_phylomez1PhylomeDBConnector.get_available_trees_by_phylome  s   r
rrE!""III7 9S!! 	>&*i&8&8&:&: > >"
F[00/4vh.?K
++k*555
+E299&AAAA+j"9996<XK
+E2 	n $ 9 9% @ @ n nuu'''rrE!""IIIuuuF9$$S)) n?m?mX\XaXjXjXlXl?m?m?mK**5"55e<rd   c                     |i i}d| j         d|d d         d|dd          d|}| j                            |          r&t          | j                                                  S i S )NzSELECT method, lk FROM r   r1   r   z" AND phylome_id=)r^   r]   ri   dictr{   )ra   r   r   rR   rk   s        rb   get_available_trees_in_phylomez1PhylomeDBConnector.get_available_trees_in_phylome  sz    r
rrE!""IIIyyB9S!! 		**,,---Ird   c                     d| j         d|d|dd         d|dd         d|d}| j                            |          rF| j                                        }|d	         }t	          |d
                   }t          |          }nd}d}||fS )z7 Returns the method-tree associated to a given protid. zSELECT newick,lk FROM  WHERE phylome_id= AND species="Nr1   r   z" AND method ="r   r   r4   )r^   r]   ri   rr   floatr   )	ra   rx   r   r   rk   r   nwlkts	            rb   get_treezPhylomeDBConnector.get_tree  s      


F2A2JJJvabbzzz&&&J9S!! 	I&&((EqBuQxB2AAABtrd   c           
      8   i }d}d}d}d}d| j         d|d|dd         d|dd         d	}| j                            |           | j                                        }	|	D ]!}
|
\  }}}|dk     r|||<   |||k    r|}|}|}"|rt	          |          }|||fS )	z Returns the winner ML treeNzSELECT newick,method,lk FROM r   r   r1   r   r   r   )r^   r]   ri   r{   r   )ra   rx   r   likelihoodswinner_model	winner_lkwinner_newickr   r~   resultrr   r   r   s                 rb   get_best_treez PhylomeDBConnector.get_best_tree  s     	   VBQBZZZE	'"""##%% 	' 	'AGBqAvv!#A%i$&I$%L$&M 	)-((AK))rd   c           
          d| j         d|d|dd         d|dd         d	}| j                            |           | j                                        S )zq Given a protID, it returns a tuple with the raw_alg, clean_alg and
        the number of seqs included.
        z(SELECT raw_alg,clean_alg,seqnumber FROM r   r   Nr1   r   r   r_   r]   ri   rr   ra   rx   r   r~   s       rb   get_algszPhylomeDBConnector.get_algs&  sf      zzz6"1":::fQRRjjjB	'"""y!!###rd   c           
          d| j         d|d|dd         d|dd         d	}| j                            |          r| j                                        S dS )zf Given a protID, it returns a tuple with the raw_alg and
        the number of seqs included.
        zSELECT raw_alg,seqnumber FROM r   r   Nr1   r   r   r  r  s       rb   get_raw_algzPhylomeDBConnector.get_raw_alg0  r      zzz6"1":::fQRRjjjB9W%% 	(9%%'''	( 	(rd   c           
          d| j         d|d|dd         d|dd         d	}| j                            |          r| j                                        S dS )zh Given a protID, it returns a tuple with the clean_alg and
        the number of seqs included.
        z SELECT clean_alg,seqnumber FROM r   r   Nr1   r   r   r  r  s       rb   get_clean_algz PhylomeDBConnector.get_clean_alg:  r  rd   c                     d| j         d|}i }| j                            |          rN| j                                        D ]4\  }}}|                    |g                               d||fz             5|S )Nz$SELECT species, protid, method from  where phylome_id=rq   )r^   r]   ri   r{   r   r|   )ra   r   rk   method2seqidsprx   r   s          rb   get_phylome_treesz$PhylomeDBConnector.get_phylome_treesE  s     		+9S!! 	S&*i&8&8&:&: S S"FF''33::8b&\;QRRRRrd   c                     d| j         d|}| j                            |          r| j                                        S dS )NzSELECT species, protid from z where phylome_id =r   )r_   r]   ri   r{   ra   r   rk   s      rb   get_phylome_algsz#PhylomeDBConnector.get_phylome_algsM  sL     		+9S!! 	9%%'''2rd   c                     d| j         d|d}i }| j                            |          r$| j                                        D ]
\  }}|||<   |S )NzSELECT method,count(*) from r  z GROUP BY method)r^   r]   ri   r{   )ra   r   rk   counterr   ns         rb   count_treeszPhylomeDBConnector.count_treesU  sk     			+9S!! 	$!Y//11 $ $	"#rd   c                     d| j         d|d}| j                            |          r| j                                        d         S dS )NzSELECT count(*) from r  rf   r   r  r  s      rb   
count_algszPhylomeDBConnector.count_algs^  sS     yyy*9S!! 	I&&((++1rd   Nc                 >   i }t          |          t          k    r|g}|D ]}|                     |          }t          j        |          D ]\  }}||k    r|D ]}|                     ||          \  }	}
}|+|                    |          }|                    |           nf|t          v r6|                    t          |                   }|                    |           n'|                    |	                                           |
                    |          d         }|                                }i }i }i }d |D             D ]}|j        D ]}|dd         }|                    |t          g                                         |           |                    |t          g                                         |j                   |                    |t          g                                         |j                   |||g||<   ϐ|S )a   Returns the orthology predictions of the given seqid in all
        phylomes.

        Only seed trees will be used to detect orthologies, and trees will
        be rooted as the default policy defined in the API. If phylome has
        an asociated dictionary of species ages,
        root_to_farthest_oldest_leaf algorithm will be applied. Otherwise,
        midpoint is used.

        You can also provide your own species age dictionary to force the
        rooting of the trees according to such data.


        ARGUMENTS:
        ==========

         seqid: the ID of a sequence in the phylomeDB format.
          i.e. Hsa0000001

         sp2age: a dictionary of species code ages (key=species_code,
          value=age).  i.e. {"Hsa":1, "Dme":4, "Ath":10}

        RETURNS:
        =========

        A dictionary of orthologs and inparalogs found in each scanned
        phylomes.

         Nr   c                 (    g | ]}|j         d k    |S )S)etype)r   xs     rb   r   z4PhylomeDBConnector.get_orthologs.<locals>.<listcomp>  s    EEEAard   r1   )typestrr   six	iteritemsr  get_farthest_oldest_leafset_outgroupr	   get_midpoint_outgroupget_leaves_by_nameget_my_evol_events	orthologsr   setaddupdate
inparalogs)ra   r   sp2age
phylome2orsidavail_treesseedidrT   r   r   lksr   outgroup	seed_nodeevol_eventssp2orsp2inor2ineor  s                        rb   get_orthologsz PhylomeDBConnector.get_orthologsf  sM   < 
;;#GE &	> &	>C22377K$'M+$>$> $> $> S==% !> !>E%)%7%7%F%FNFC)#$#=#=f#E#Ex0000/11#$#=#=u?U#W#Wx0000q'>'>'@'@AAA !" 4 4S 9 9! <I"+">">"@"@KEEEEEEEE 
O 
O!" 	O 	OA!"2A2B!,,RR99==a@@@ ",,QB88??MMM ",,RR99@@NNNN	O */u(=Ju%%C!>$>J rd   )rG   rH   rI   rI   rJ   )T)N)#__name__
__module____qualname____doc__rc   ro   ry   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>  r   rd   rb   r   r      s*         +! "	4 4 4 46       	 	 	  B( ( (( ( (  "        <   4    "  "           (   0    * * *.$ $ $( ( (( ( (        H H H H H Hrd   )rB  
__future__r   r   stringr   rX   rg   r   r$  	six.movesr   __all__r	   objectr   r   rd   rb   <module>rH     ss  R & ' & & & & & 				              



      !2
3
2
b2
 	b2
 	b	2

 	b2
 	b2
 	b2
 	b2
 	b2
 	a2
 	a2
 	a2
 	a2
 	a2
  	a!2
" 	a#2
$ 	a%2
& 	a'2
 2
( 	a)2
* 	a+2
, 	a-2
0 	a12
2 	a32
4 	a52
6 	a72
8 	a92
< 	a=2
@ 	aA2
B 	aC2
D 	aE2
H 	aI2
L 	aM2
P 	aQ2
R 	aS2
T 	aU2
 2
V c2
 2
 2
j	
r	
q	
 	q	
 	a		

 	a	
 	a	
 	a	
 	a	
 	a	
 	a	
 	a	
 	a	
 	a	
 	a	
 	a	
  	a!	
" 	a#	
mI IVX X X X X X X X X Xrd   