
    bMhN                        d dl m Z m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 d dlZd dlmZ d dlmZ d dlmZmZ d dlmZ d d	lmZ ej        d
             Zej        d             Zej                            dddg          d             Zd Z d Z!d Z"ej                            dd dd e#d          dgfdd e#d          dgfdddgfd dd e#d          gfd ddgfdd e#d          gfg          d             Z$ej                            dd d d d d g          d             Z%d  Z&ej                            dg d!g d"d#g d$g d"d# ej'        g d%           ej'        g d$           ej'        g d"          d&g          d'             Z(d( Z)d) Z*d* Z+d+ Z,ej        -                    ed,-          d.             Z.ej                            di d/g ig          d0             Z/dmd2Z0dmd3Z1d4 Z2ej                            d5d6d7g          ej                            d8g d9          d:                         Z3d; Z4dmd<Z5d= Z6d> Z7d? Z8d@ Z9ej                            dAg dBdCdDfg dBdEdDfg dBdFdGfg dBdHdGfg dBdIdJfg dBdKdJfg dLdMdNfg dLdOdNfg dPdQdRfg dPdSdRfg dT ej:        ej;        U          dVfg dTdWdVf e dXdd           e dXdd          dgdYdZf e dXdd           e dXdd          dgd[d\f e dXddej<        ]           e dXddej<        ]          dgd^d_fg          de=d`e>dae>d1dfdb            Z?ej                            dAg dcdCdDfg dcdEdDfg dcdFdGfg dcdHdGfg dcdIdJfg dcdKdJfg dddMdNfg dddOdNfg dedQdRfg dedSdRfg df ej:        ej;        U          dVfg dfdWdVf e dXdd           e dXdd           e dXddg          gdYdZf e dXdd           e dXdd           e dXddg          gd[d\f e dXddej<        ]           e dXddej<        ]           e dXddgej<        ]          gd^d_fg          de=d`e>dae>d1dfdh            Z@dmdiZAdmdjZBdk ZCdl ZDdS )n    )datetimetimezoneN)iNaT)is_ci_environmentis_platform_windows)np_version_lt1p23)PandasColumn)ColumnNullType	DtypeKindfrom_dataframe)ArrowCTypesc                      t          j        t          d          dz  d          t          j        t          d          dz  d          dS )Ntestdata   T)orderedF)r   	unordered)pdCategoricallist     b/var/www/html/test/jupyter/venv/lib/python3.11/site-packages/pandas/tests/interchange/test_impl.pydata_categoricalr      sQ     >$z"2"2R"7FFF^D$4$4r$95III  r   c                  (    dddddt           j        giS )Nseparator datazabC|DeF,Hikz234,3245.67zgSaf,qWer|Grez
asd3,4sad|)npnanr   r   r   string_datar   #   s'     	F
 r   data)r   T)r   Fc                    t          j        d|| d                  i          }|                                                    d          }|j        d         t
          j        k    sJ |j        dk    sJ |j        t          j
        dfk    sJ |                                dk    sJ |j        }|d         | d         k    sJ |d         du sJ t          |d         t                    sJ t          j        |d         j        t          j        g d	                     t          j        |t)          |                                                     d S )
NAr      
is_orderedis_dictionaryT
categories)adest)r   	DataFrame__dataframe__get_column_by_namedtyper   CATEGORICAL
null_countdescribe_nullr
   USE_SENTINEL
num_chunksdescribe_categorical
isinstancer	   tmassert_series_equal_colSeriesassert_frame_equalr   )r    r   dfcoldesc_cats        r   test_categorical_dtyper@   0   sX   	s-d1g68	9	9B





/
/
4
4C9Q<900000>Q!<b AAAAA>>q    'HL!T!W,,,,O$,,,,h|,l;;;;;#RY/H/H/H%I%I   "nR-=-=-?-?@@AAAAAr   c                  |   t          j        dd          } g d}|                     d|                     |                                          i          }|                                }t          |          }t          j        |g d          }t          j	        d|i          }t          j        ||           d S )Npyarrow11.0.0)	MonTuerD   WedrD   ThuFriSatSunweekday)rD   rE   rF   rG   rH   rI   rJ   )r'   )pytestimportorskiptablearraydictionary_encoder.   r   r   r   r-   r8   r<   )paarrrN   exchange_dfresultrK   expecteds          r   test_categorical_pyarrowrV   D   s    		Y	1	1B
I
I
ICHHi#!@!@!B!BCDDE%%''KK((FnIII  G |Y011H&(+++++r   c                     t          j        dd          } d g}|                     d|                     |d                                          i          }|                                }t          j        j        	                    |          }t          j
        dt          j        t          j        g          i          }t          j        ||           d S )NrB   rC   rR   float64)rL   rM   rN   rO   rP   r.   r   apiinterchanger   r-   r   r   r   r8   r<   rQ   rR   rN   rS   rT   rU   s         r   test_empty_categorical_pyarrowr\   S   s    		Y	1	1B&CHHeRXXc955GGIIJKKE%%''KV..{;;F|UBNBF8$<$<=>>H&(+++++r   c                     t          j        dd          } ddg}|                     d|                     |d          i          }|                                }t          |          }t          j        dddgi          }t          j	        ||           | j
                            | j                            |          |          sJ d S )NrB   rC   rD   rE   rK   large_string)rL   rM   rN   rO   r.   r   r   r-   r8   r<   TableequalsrZ   r[   s         r   test_large_string_pyarrowra   _   s    		Y	1	1B%.CHHi#~!>!>?@@E%%''KK((F|Y788H&(+++ 8??2>88@@%HHHHHHHr   )offsetlengthexpected_valuesffffff
@r    @r$      c                    t          j        dd          }g d}|                    d|i                              | |          }|                                }t          |          }t          j        d|i          }t          j	        ||           |j
                            |j                            |          |          sJ d S )NrB   rC   )re   Nrf   rR   )rL   rM   rN   slicer.   r   r   r-   r8   r<   r_   r`   rZ   )	rb   rc   rd   rQ   rR   rN   rS   rT   rU   s	            r   test_bitmasks_pyarrowrj   n   s     
	Y	1	1B


CHHeS\""((88E%%''KK((F|UO455H&(+++ 8??2>88@@%HHHHHHHr   c                  h    t           j                            d                              dd          S )Nrg   id   r   randomdefault_rngintegersr   r   r   <lambda>rq      s&    	%%a((11$<< r   c                  h    t           j                            d                              dd          S )Nrg   r$   rl   rm   r   r   r   rq   rq      s&    	%%a((11!S99 r   c                  d    t           j                            d                                          S )Nrg   )r   rn   ro   r   r   r   rq   rq      s"    	%%a((//11 r   c                  j    t           j                            d                              ddg          S )Nrg   TF)r   rn   ro   choicer   r   r   rq   rq      s(    	%%a((//u>> r   c                  L   t          t          j                            d                              dd          t          j                            d                              dd          t          j                            d                              dd                    S )Nrg   il  i4  r$         )yearmonthday)r   r   rn   ro   rp   r   r   r   rq   rq      s~    &&q))224>>)''**33Ar::	%%a((11!R88
 
 
 r   c                     d\   fdt                    D              t          j                   }|                                }|                                k    sJ |                                k    sJ t          |                                          t                                                     k    sJ d}t           fd|D                       }t          |                    |                    }t          |                    |                    }t          j        ||           t          |j        d         t                    sJ t          |j        d         t                    sJ d S )N)
   rx   c                     i | ]:}d t          |dz  z
  z  dz              fdt                    D             ;S )r>   rg   r$   c                 $    g | ]}             S r   r   ).0_r    s     r   
<listcomp>z-test_dataframe.<locals>.<dictcomp>.<listcomp>   s    2P2P2Pa44662P2P2Pr   )intrange)r   iNCOLSNROWSr    s     r   
<dictcomp>z"test_dataframe.<locals>.<dictcomp>   sh        	1c1uqy=E)A-..002P2P2P2P5<<2P2P2P  r   )r   rg   c              3   f   K   | ]+}t                                                    |         V  ,d S N)r   keys)r   idxr    s     r   	<genexpr>z!test_dataframe.<locals>.<genexpr>   s8      <<S$tyy{{##C(<<<<<<r   _INTERCHANGE_PROTOCOL_BUFFERS)r   r   r-   r.   num_columnsnum_rowsr   column_namesr   tupler   select_columnsselect_columns_by_namer8   r<   r7   attrs)	r    r=   df2indicesnamesrT   rU   r   r   s	   `      @@r   test_dataframer      s    LE5     u  D 
d		B




C??%%%%<<>>U""""  ""##tDIIKK'8'88888G<<<<G<<<<<EC..w7788Fc88??@@H&(+++fl#BCTJJJJJhn%DEtLLLLLLLr   c            	         t          j        t          j        g d          t          j        g d          t          j        g d          d          t          j                            d          fdj        D             } |                                 D ]S\  }}j        	                    t          j
        t                              |d                   }d j        ||f<   T                                }|                    d	          j        | d	         k    sJ |                    d
          j        | d
         k    sJ |                    d          j        | d         k    sJ d S )N)      ?       @g      @g      @        )      ?      @      @g      @r   )r   r   r   r   r   xyzrg   c           	      Z    i | ]'}|                     d t                              (S )r   )lowhigh)rp   len)r   r>   r=   rngs     r   r   z,test_missing_from_masked.<locals>.<dictcomp>   s1    NNNCcllqs2wwl77NNNr   F)sizereplacer   r   r   )r   r-   r   rO   rn   ro   columnsitemsindexru   aranger   locr.   r/   r2   )	dict_nullr>   	num_nullsnull_idxr   r=   r   s        @@r   test_missing_from_maskedr      s|   	333441112233344	
 	

 
B )


"
"CNNNNN2:NNNI#//++ % %Y8JJryR))	5JII
 !%x}




C!!#&&1Ys^CCCC!!#&&1Ys^CCCC!!#&&1Ys^CCCCCCr   )r   r   r   )ffffff"@      %@皙'@)r   r   )r$   rg   r   )TTFr   c                     t          j        |           }|                                }|j        D ]"}|                    |          j        dk    sJ #d S )Nr   )r   r-   r.   r   r/   r2   )r    r=   r   col_names       r   test_mixed_datar      sh     
d		B




CJ @ @%%h//:a?????@ @r   c                  *   t          j        t          j        g d          t          j        g d          t          j        g d          d          } |                                 }| j        D ]"}|                    |          j        dk    sJ #d S )N)TNFNT)Nrg   Nr$   rg   )r   r   Nr   Nr   rg   )r   r-   r   rO   r.   r   r/   r2   )r=   r   r   s      r   test_mixed_missingr      s    	999::///0077788	
 	

 
B 



CJ @ @%%h//:a?????@ @r   c                 n   | d         dgz   }t          j        d|i          }|                                                    d          }|                                dk    sJ |j        dk    sJ |j        d         t          j        k    sJ |j	        t          j        dfk    sJ |dd          }|                                                    d          }|                                dk    sJ |j        dk    sJ |j        d         t          j        k    sJ |j	        t          j        dfk    sJ d S )Nr    r"      r$   r      )r   r-   r.   r/   r   r2   r0   r   STRINGr3   r
   USE_BYTEMASK)r   test_str_datar=   r>   	df_sliceds        r   test_stringr      s5    01RD8M	sM*	+	+B





/
/
4
4C88::????>Q9Q<9+++++!<a @@@@@122I

!
!
#
#
6
6s
;
;C88::????>Q9Q<9+++++!<a @@@@@@@r   c                      t          j        dg di          } |                                                     d          }t	          j        t          d          5  |j         d d d            d S # 1 swxY w Y   d S )Nr"   )r(   r}   r   r   znot supported yetmatch)r   r-   r.   r/   rL   raisesNotImplementedErrorr0   r=   r>   s     r   test_nonstring_objectr      s    	s.../	0	0B





/
/
4
4C	*2E	F	F	F  		                 s   A00A47A4c                     t          j        dt          j        d          t           j        gi          } |                                                     d          }|                                dk    sJ |j        dk    sJ |j        d         t          j
        k    sJ |j        t          j        t          fk    sJ t          j        | t#          |                                                      d S )Nr"   z
2022-01-01rg   r$   r   )r   r-   	TimestampNaTr.   r/   r   r2   r0   r   DATETIMEr3   r
   r4   r   r8   r<   r   r   s     r   test_datetimer     s    	sR\,77@A	B	BB





/
/
4
4C88::????>Q9Q<9-----!<d CCCCC"nR-=-=-?-?@@AAAAAr   zNumpy > 1.23 required)reasonc                  f   t          j        dt          j        g d          i          } |                                                     d          }t          j        |                                d         d                   }t          j        g dd          }t          j
        ||           d S )Nr"   )r(   br(   r    r   )r   r$   r   int8r0   )r   r-   r   r.   r/   r   from_dlpackget_buffersrO   r8   assert_numpy_array_equal)r=   r>   rT   rU   s       r    test_categorical_to_numpy_dlpackr     s     
sBN???;;<	=	=B





/
/
4
4C^COO--f5a899Fx			000H11111r   r(   c                     t          j        dd           ddlm} t	          j        |           } ||          }t          |          }t          j        ||d           d S )NrB   rC   r   r   F)check_column_type)rL   rM   pyarrow.interchanger   r   r-   r8   r<   )r    pa_from_dataframerU   arrow_dfrT   s        r   test_empty_pyarrowr     ss     	8,,,GGGGGG|D!!H  **HH%%F&(eDDDDDDr   returnc                  P   t          j        dd          } |                     g dg dg          }dg}|                     |g|          }t          j        t
          d          5  t          j        j        	                    |d	
           d d d            d S # 1 swxY w Y   d S )NrB   rC   )rg   rg      )r   r   rl   n_legs)r   z@Cannot do zero copy conversion into multi-column DataFrame blockr   F
allow_copy)
rL   rM   chunked_arrayrN   r   RuntimeErrorr   rY   rZ   r   )rQ   r   r   rN   s       r   test_multi_chunk_pyarrowr   &  s   		Y	1	1Byyy+++677FJEHHfXUH++E	P
 
 
 C C 	))%E)BBB	C C C C C C C C C C C C C C C C C Cs   ''BB"Bc                  T   t          j        dd           t          j        g dd          } t          j        | | gd                              d          }|                                }t          j        t          d	
          5  t          j	        j
                            |                    d                     d d d            n# 1 swxY w Y   t          j	        j
                            |                    d                    }t          j        dg did          }t          j        ||           t          j        ||           t!          |d         j        j        j                  dk    sJ t!          |d         j        j        j                  dk    sJ d S )NrB   rC   r$   rg   NInt64[pyarrow]r   T)ignore_indexr(   z:Found multi-chunk pyarrow array, but `allow_copy` is Falser   Fr   )r   r   Nr   r   NrX   rg   )rL   rM   r   r;   concatto_framecopyr   r   rY   rZ   r   r.   r-   r8   r<   r   rO   	_pa_arraychunks)serr=   df_origrT   rU   s        r   test_multi_chunk_columnr   2  s   
	8,,,
)LLL(8
9
9
9C	C:D	1	1	1	:	:3	?	?BggiiG	X
 
 
 N N 	))"*:*:e*:*L*LMMMN N N N N N N N N N N N N N N V..r/?/?4/?/P/PQQF |S"B"B"BC9UUUH&(+++ "g&&&r#w}&-..!3333ws|!+233q888888s   9CCCc                  |   t          j        dd           ddddddd} t          j        t	          d	i | gdd                                          }|                                }t          j        j        	                    |          d         
                                }t          j        d	i | }||k    sJ d S )
NrB   rC   i  r$   )ry   rz   r{   hourminutesecondtimestamp[ns][pyarrow]col0)r0   namer   )rL   rM   r   r;   r   r   r.   rY   rZ   r   itemr   )timestamp_argsr=   dfirT   rU   s        r   test_timestamp_ns_pyarrowr   G  s    
	8,,, N 
		#	#N	#	#$&
 
 
 hjj	  



CV..s33F;@@BBF|--n--HXr   tzUTCz
US/Pacificunit)r+   msusnsc                    t          j        ddd                              |                               |          }t          j        d|i          }t          j        |t          |                                                     d S )Nz
2018-01-01r   D)periodsfreqts_tz)	r   
date_rangetz_localizeas_unitr-   r8   r<   r   r.   )r  r  tz_datar=   s       r   test_datetimetzdtyper  _  s}    
 	lAC888DDRHHPPQUVV  
w(	)	)B"nR-=-=-?-?@@AAAAAr   c           	      T   t          j        dd          }dd lm} t	                      rIt                      r;t           j                            |j        d          }| 	                    |           |
                    t          ddd          d t          ddd          g          }|                    |d	          }|                    d
|i          }|                                }t          |          }t!          j        g dd
gd          }t%          j        ||           d S )NrB   rC   r   z_TODO: Set ARROW_TIMEZONE_DATABASE environment variable on CI to path to the tzdata for pyarrow.)r   r     r$   rg   Asia/KathmandurR   )z2020-01-01 00:00:00+05:45r   z2020-01-02 00:00:00+05:45zdatetime64[us, Asia/Kathmandu])r   r0   )rL   rM   pyarrow.computecomputer   r   markxfailArrowInvalidapplymarkerrO   r   assume_timezonerN   r.   r   r   r-   r8   r<   )	requestrQ   pcr  rR   rN   rS   rT   rU   s	            r   )test_interchange_from_non_pandas_tz_awarer  j  s9   		Y	1	1B       "!2!4!4 "{  ?; ! 
 
 	D!!!
((HT1a(($q!0D0DE
F
FC


S"2
3
3CHHeS\""E%%''KK((F|III.  H
 (F+++++r   c                    t          j        dddgi                                          }|                                                    d                                          d         }|d         }t
          j        dt          j        |d         f}|d         |fd<   fd	_        fd
_        | 	                    |dfd           t           j
        j                            |           d S )Nr(   foobarr    r$         r   c                       S r   r   )bufferss   r   rq   z?test_interchange_from_corrected_buffer_dtypes.<locals>.<lambda>  s     r   c                     S r   r   )r   columns    r   rq   z?test_interchange_from_corrected_buffer_dtypes.<locals>.<lambda>  s    v r   r.   c                     S r   r   )r   rZ   s    r   rq   z?test_interchange_from_corrected_buffer_dtypes.<locals>.<lambda>  s     r   )r   r-   r.   r/   r   r   UINTr   UINT8setattrrY   rZ   r   )monkeypatchr=   buffers_databuffer_dtyper$  r&  rZ   s       @@@r   -test_interchange_from_corrected_buffer_dtypesr.    s    	sUEN+	,	,	:	:	<	<B""$$K++C00F  ""G6?L?L	Q	L $A5GFO(F%5%5%5%5K"O-K-K-K-KLLLF%%b)))))r   c                      t          j        dg it                    } |                                 }t           j        j                            |          }t          j        | |           d S )Nr(   r   )	r   r-   strr.   rY   rZ   r   r8   r<   )r=   r   rT   s      r   test_empty_string_columnr1    s\    	sBis	+	+	+B




CV..s33F"f%%%%%r   c                  (   t          j        d           t          j        ddgid          } t          j        j                            |                                           }t          j        ddgid          }t          j	        ||           d S )NrB   r(   r   large_string[pyarrow]r   r0  )
rL   rM   r   r-   rY   rZ   r   r.   r8   r<   )r=   rT   rU   s      r   test_large_stringr4    s    
	"""	sSEl*A	B	B	BBV..r/?/?/A/ABBF|S3%L666H&(+++++r   c                      t          j        g dd                                          } |                                                                 }|dgk    sJ d S )Nr$   rg   r"  r   )r   0)r   r;   r   r.   r   )r=   r   s     r   test_non_str_namesr8    sV    	9991	%	%	%	.	.	0	0B++--ESE>>>>>>r   c                     t          j        g dg dd          } |                                 }t          j        t
          d          5  t           j        j                            |d           d d d            d S # 1 swxY w Y   d S )Nr6  r   r   r   )r7  r   a&  Expected a Series, got a DataFrame. This likely happened because you called __dataframe__ on a DataFrame which, after converting column names to string, resulted in duplicated names: Index\(\['0', '0'\], dtype='(str|object)'\). Please rename these columns before using the interchange protocol.r   Fr   )	r   r-   r.   rL   r   	TypeErrorrY   rZ   r   )r=   r   s     r   test_non_str_names_w_duplicatesr<    s    	III)))44	5	5B




C	$	
 	
 	
 
A 
A 	))#%)@@@
A 
A 
A 
A 
A 
A 
A 
A 
A 
A 
A 
A 
A 
A 
A 
A 
A 
As   'A??BB)r    r0   expected_dtyper   Int64int64r   Int8r   zInt8[pyarrow]UInt64uint64zUInt64[pyarrow])r         @NFloat32float32zFloat32[pyarrow])TFNbooleanboolzboolean[pyarrow])much adoaboutN)na_valuer^   zstring[pyarrow]r  r   ztimestamp[ns]ztimestamp[us][pyarrow]ztimestamp[us])tzinfoz&timestamp[us, Asia/Kathmandu][pyarrow] timestamp[us, tz=Asia/Kathmandu]r0   r=  c                    t          j        dd          }dd lm} |dk    r|                    dd          }t          j        d| i|          }|                    |                                          d         }|j	        |k    sJ |d         
                                | d         k    sJ |d	         
                                | d	         k    sJ |d
         
                                J d S NrB   rC   r   rL  r  r  r(   r   r$   rg   rL   rM   r   rZ   	timestampr   r-   r   r.   typeas_pyr    r0   r=  rQ   pair=   rT   s          r   (test_pandas_nullable_with_missing_valuesrU    s    b 
	Y	1	1B%%%%%%;;;d,<==	sDk	/	/	/B 0 0 2 233C8F;.((((!9??Q''''!9??Q''''!9??$$$$$r   r6  )r   rC  g      @)TFF)rH  rI  nothingr"  c                    t          j        dd          }dd lm} |dk    r|                    dd          }t          j        d| i|          }|                    |                                          d         }|j	        |k    sJ |d         
                                | d         k    sJ |d	         
                                | d	         k    sJ |d
         
                                | d
         k    sJ d S rN  rO  rS  s          r   +test_pandas_nullable_without_missing_valuesrX    s   h 
	Y	1	1B%%%%%%;;;d,<==	sDk	/	/	/B 0 0 2 233C8F;.((((!9??Q''''!9??Q''''!9??Q''''''r   c                      t          j        dd           t          j        ddgid          } |                                                     d                                          d         }|J d S )NrB   rC   r(   r   r3  r   validity)rL   rM   r   r-   r.   r/   r   )r=   rT   s     r   test_string_validity_bufferr[  F  sm    
	8,,,	sSEl*A	B	B	BB22377CCEEjQF>>>>>r   c                  >   t          j        dd           t          j        ddd gid          } |                                                     d                                          d         }|J |d         }t          j        dt          j        d	f}||k    sJ d S )
NrB   rC   r(   r   r3  r   rZ  r$   =)
rL   rM   r   r-   r.   r/   r   r   BOOLr   )r=   rZ  rT   rU   s       r   &test_string_validity_buffer_no_missingr_  N  s    
	8,,,	sS$K(0G	H	H	HB!!44S99EEGG
SHa[F;#3S9HXr   c                     t          j        dg id          } |                                 }t           j        j                            |d          }t          j        dg id          }t          j        ||           d S )Nr(   r   r   Fr   )r   r-   r.   rY   rZ   r   r8   r<   )r=   r   rT   rU   s       r   test_empty_dataframera  Y  sy    	sBiv	.	.	.B




CV..su.EEF|S"IV444H&(+++++r   c                      t          j        dd          } dddgg dgi}|                     |          }t          |          }t	          j        |          }t          j        ||           d S )NrB   z14.0.0r(   r$   rg   r:  )rL   rM   rN   r   r   r-   r8   r<   )rQ   r    tblrT   rU   s        r   test_from_dataframe_list_dtyperd  b  so    		Y	1	1B1a&)))$%D
((4..CC  F|D!!H&(+++++r   )r   N)Er   r   numpyr   rL   pandas._libs.tslibsr   pandas.compatr   r   pandas.compat.numpyr   pandasr   pandas._testing_testingr8   pandas.core.interchange.columnr	   *pandas.core.interchange.dataframe_protocolr
   r   &pandas.core.interchange.from_dataframer   pandas.core.interchange.utilsr   fixturer   r   r  parametrizer@   rV   r\   ra   floatrj   r   r   rO   r   r   r   r   r   skipifr   r   r   r   r   r  r  r.  r1  r4  r8  r<  StringDtyper   utcr   r0  rU  rX  r[  r_  ra  rd  r   r   r   <module>rv     sq	         
      $ $ $ $ $ $        2 1 1 1 1 1           7 7 7 7 7 7        B A A A A A 5 5 5 5 5 5    	 	 	 "35I!JKKB B LKB&, , ,	, 	, 	,I I I +	
D3ec*+	
D55<<%&	
D3%	
AUU5\\"#	
Au	
Ae~
 
I I
 
I 
<<9911>>	
 	

 M M M4D D D0 
oo$5$5$566ii///00---..)))$$+++,,	
 	
 @ @ @@ @ @A A A$  	B 	B 	B %.EFF2 2 GF2 "sBi11E E 21E	C 	C 	C 	C9 9 9 9*  0 |455!8!8!899B B :9 65B, , ,:* * * **& & &, , ,  A A A" '	w(	'1	vv&	/LL	
 LL	

 
		Iy1			.	:			i0			0&9	$	$	$nbnbf&E&E&E~V	$	$	$&7HXdAq!!88D!Q#7#7>$	
 XdAq!!88D!Q#7#7>$	
 q!HL999q!HL999
 5.	
?(+ +X%
%%,/%	% % %Y+ +X%& '	GW%	$g.	FF#	OV,II	
 II	

 
		9i0			-y9			y&1			16:,,,BNBF+++	

 
*	)	)+<nMXdAq!!88D!Q#7#7$19M9MN$	
 XdAq!!88D!Q#7#7$19M9MN$	
 q!HL999q!HL999q!HL999
 5.	
G,/ /`(
((,/(	( ( (a/ /`($      , , ,, , , , ,r   