o
    iYw                  	   @   s  d dl Z d dl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mZmZmZ d dlmZmZ d dlmZmZmZ d dlmZ d d	lmZ d d
lmZmZmZmZm Z m!Z!m"Z"m#Z# d dl$m%Z%m&Z& d dl'm(Z(m)Z) d dl*m+Z+ d dl,m-Z-m.Z.m/Z/m0Z0 d dl1m2Z2 d dl3m4Z4 d dl5m6Z6 d dl7m8Z8 d dl9m:Z:m;Z;m<Z< d dl=m>Z>m?Z?m@Z@mAZAmBZBmCZC dd ZDdd ZEdd ZFejGHdeAe@ e? eC eB e> dd ZIdd ZJd d! ZKd"d# ZLeM ZNeNjOZPeNjQZRe8eRd$d%ZSe8eRd&d%ZTeUeReSeTfZVePjW\ZXZYeVjWd$ ZZe[e\eRZ]e^e_ej\eReSeTfZ`d'd( Zad)d* Zbd+d, Zcd-d. Zdd/d0 Zed1d2 Zfd3d4 Zgd5d6 Zhd7d8 Zid9d: Zjd;d< ZkejGHd=d>d?gd@dA ZldBdC ZmdDdE ZnejGHdFd?dGgdHdI ZoejGHdJeAdKdL ZpdMdN ZqejGHdFg dOejGHd=d>dPgdQdR ZrdSdT ZsejGHdJeAdUdV ZtdWdX ZuejGHdYg dZd[d\ ZvejGHd]ed&d^e.ed&d^e-ed&d^gd_d` ZwG dadb dbeZxG dcdd ddeZyejGHdee.eydfdge fe/ex ejdhd difgdjdk Zzdldm Z{ejGHdne.efe/e!fgdodp Z|ejGHdqe^ej}e~gdrds Zdtdu Zdvdw Zdxdy Zdzd{ ZejGHd|e-d}fe.d~fgdd Zdd ZejGHde-e0gdd ZdS )    N)	cpu_count)datasets)ClassifierMixinclone)load_linnerudmake_classificationmake_multilabel_classificationmake_regression)DummyClassifierDummyRegressor)GradientBoostingRegressorRandomForestClassifierStackingRegressor)NotFittedError)SimpleImputer)LassoLinearRegressionLogisticRegressionOrthogonalMatchingPursuitPassiveAggressiveClassifierRidgeSGDClassifierSGDRegressor)jaccard_scoremean_squared_error)GridSearchCVtrain_test_split)OneVsRestClassifier)ClassifierChainMultiOutputClassifierMultiOutputRegressorRegressorChain)make_pipeline)	LinearSVC)DecisionTreeClassifier)shuffle)assert_almost_equalassert_array_almost_equalassert_array_equal)BSR_CONTAINERSCOO_CONTAINERSCSC_CONTAINERSCSR_CONTAINERSDOK_CONTAINERSLIL_CONTAINERSc            
      C   s   t jddd\} }| d d |d d }}| dd  |dd  }}t|}tdD ]}tdd}|||d d |f  |||d d |f< q,ttdd}||| ||}	t	||	 d S N   r   	n_targetsrandom_state2   r3   )
r   r	   np
zeros_likeranger   fitpredictr    r&   )
XyX_trainy_trainX_testy_test
referencesnrgry_pred rE   m/var/www/html/eduruby.in/lip-sync/lip-sync-env/lib/python3.10/site-packages/sklearn/tests/test_multioutput.pytest_multi_target_regression=   s   


rG   c                  C   s6  t jddd\} }| d d |d d }}| dd  |dd  }}t|}d}tdD ]3}tddd}	|	|d | |d ||f  |	||d  ||d |f  |	||d d |f< q.ttddd}	|	|d | |d |  |	||d  ||d   |	|}
t	||
 t
ttdrJ d S )	Nr0   r   r1   r4         r3   max_iterpartial_fit)r   r	   r6   r7   r8   r   rL   r:   r    r&   hasattrr   )r;   r<   r=   r>   r?   r@   rA   
half_indexrB   sgrrD   rE   rE   rF   (test_multi_target_regression_partial_fitO   s    
  

rP   c                  C   sd   t jddd\} }ttdd}d}tjt|d || | W d    d S 1 s+w   Y  d S )N   r   r1   r5   zat least two dimensionsmatch)r   r	   r    r   pytestraises
ValueErrorr9   )r;   r<   rC   msgrE   rE   rF   'test_multi_target_regression_one_targetf   s   "rX   sparse_containerc                 C   s   t jddd\}}|d d |d d }}|dd  }ttdd}ttdd}||| || || t|||| | d S r/   )r   r	   r    r   r9   r&   r:   )rY   r;   r<   r=   r>   r?   rC   Z
rgr_sparserE   rE   rF   #test_multi_target_sparse_regressiono   s   
rZ   c                  C   s   g dg dg} ddgddgg}ddg}t t }d}tjt|d || || W d    n1 s4w   Y  t td	d
}|| || d S )NrQ      r0      rI      T㥛 	@X9v@g?g333333?zdoes not support sample weightsrR   r   r5   )r    r   rT   rU   rV   r9   r   )r;   r<   wrC   rW   rE   rE   rF   $test_multi_target_sample_weights_api   s   
rc   c                  C   s   g dg dg} ddgddgg}ddg}t tddd	}|| || ddg}t tddd	}|| || || d d || d d ksJJ d S )
Nr[   r]   r`   ra          @      ?r   rI   rJ   )r    r   rL   r:   )r;   r<   rb   rgr_wrC   rE   rE   rF   +test_multi_target_sample_weight_partial_fit   s   ,rg   c                  C   s   g dg dg} ddgddgg}ddg}t tdd}|| || g dg dg dg}ddgddgddgg}t tdd}||| g d	g d
g}t|||| d S )Nr[   r]   r`   ra   rd   re   r   r5   g      ?g      @      @ri   g      @g      @)r    r   r9   r&   r:   )Xwywrb   rf   r;   r<   rC   r?   rE   rE   rF    test_multi_target_sample_weights   s   rm   rQ   r5   r\   c                  C   sf   t dddd} t| dd}|ttt |jd }|tt |jd }t dkr/||us1J d S d S )Nlog_lossrQ   rI   lossr3   rK   r^   )Zn_jobsr   )r   r   rL   r;   r<   classesestimators_r   )sgd_linear_clfZmorest1est2rE   rE   rF   8test_multi_output_classification_partial_fit_parallelism   s   


rv   c                  C   sb   t ddd} t| }|tt t|drJ t dddd} t| }|tt t|ds/J d S )NrQ   rI   rJ   predict_probarn   ro   )r   r   r9   r;   r<   rM   )rs   multi_target_linearrE   rE   rF   'test_hasattr_multi_output_predict_proba   s   ry   c            	      C   s  t ddd} ddi}dd }t| ||dd	d
}t|}|tt |t t ddd} t| }|tt d}d}d}tjt	|d}|t W d    n1 sSw   Y  t
|jjt	saJ |t|jjv skJ t
|jjjt	suJ |t|jjjv sJ d S )NrQ   rI   rJ   rp   )Zhingern   Zmodified_huberc                 S   s   t | drdS dS )Nrw   re   g        )rM   )	estimatorr;   r<   rE   rE   rF   custom_scorer   s   
z6test_multi_output_predict_proba.<locals>.custom_scorerr0   raise)Z
param_gridZscoringcvZerror_scorez8probability estimates are not available for loss='hinge'z0'SGDClassifier' has no attribute 'predict_proba'8'MultiOutputClassifier' has no attribute 'predict_proba'rR   )r   r   r   r9   r;   r<   rw   rT   rU   AttributeError
isinstancevalue	__cause__str)	rs   paramr{   Zgrid_clfrx   Z
inner2_msgZ
inner1_msg	outer_msg	exec_inforE   rE   rF   test_multi_output_predict_proba   s4   
r   c                  C   s2  t dddd} t| }tjd d }|jtd | td | td |t}tt	f|jks0J |t|d  t|d   |t}tt	f|jksLJ t
dD ]F}t| } | jtd | td ||f t| d t| t|d d |f  | t|d  t|d |f  t| t|d d |f  qPd S )	Nrn   rQ   rI   ro   r   r\   )rq   r0   )r   r   r;   shaperL   r<   rq   r:   	n_samples	n_outputsr8   r   r(   )rs   rx   rN   Zfirst_predictionsZsecond_predictionsirE   rE   rF   ,test_multi_output_classification_partial_fit  s$    

 r   c                  C   sZ   t dddd} t| }d}tjt|d |tt W d    d S 1 s&w   Y  d S )Nrn   rQ   rI   ro   z8classes must be passed on the first call to partial_fit.rR   )r   r   rT   rU   rV   rL   r;   r<   )rs   rx   rW   rE   rE   rF   Gtest_multi_output_classification_partial_fit_no_first_classes_exception-  s   "r   c                  C   s   t ddd} t| }|tt |t}ttf|jksJ |	t}t
|tks+J |D ]}ttf|jks8J q-ttjt|dd| tdD ]3}t| }|ttd d |f  t|tt|d d |f ksoJ tt|	tt||  qJd S )N
   rQ   n_estimatorsr3   Zaxisr0   )r   r   r9   r;   r<   r:   r   r   r   rw   len	n_classesr(   r6   ZargmaxZdstackr8   r   list)forestZmulti_target_forestpredictionsrw   Zclass_probabilitiesr   Zforest_rE   rE   rF    test_multi_output_classification5  s    

&r   c                  C   s   t dd} t| }t|}|tt |t}ttf|j	ks!J t
dD ]%}t|}|ttd d |f  t|tt|d d |f ksJJ q%d S )Nr   r5   r0   )r#   r   r   r9   r;   r<   r:   r   r   r   r8   r   r   )ZsvcZmulti_class_svcZmulti_target_svcr   r   Zmulti_class_svc_rE   rE   rF   %test_multiclass_multioutput_estimatorR  s   

(r   c            
   	   C   s   d} t j| }|jdd}t g ddd}t g ddd}t j||gdd}tt| d	}|	|| |
|}t d
dgddgddgddgddggt g dg dg dg dg dgg}tt|D ]}	t||	 ||	  qmd S )Ni  )rI   rI   )size)bar   r   r   rI   rQ   )defr   r   r   r5   g7E-?gd]7 v?gYA?gzXP?gZ]3?gJE?gJo8?g[|c?gx?g{du?)ggK
?g!U5?g}i?)gg362?gPm?gKɱ?)g?gn۔~?g	2b?)g_E֖?glE?g
̖B?)g͢?g ?g}DBˉ?)r6   randomRandomStatenormalarrayZreshapeZconcatenater   r   r9   rw   r8   r   r&   )
seedrngr;   y1y2YclfZy_resultZy_actualr   rE   rE   rF   3test_multiclass_multioutput_estimator_predict_probad  s:   
	r   c            	      C   s   g dg dg} ddgddgg}t ddg}tddd	}t|}|| || g dg dg dg}ddgddgddgg}tddd	}t|}||| g d
g dg}t|||| d S )Nr[   r]   r0   r\   rd   re   r   rQ   r   rh   rj   )r6   asarrayr   r   r9   r&   r:   )	rk   rl   rb   r   clf_wr;   r<   r   r?   rE   rE   rF   /test_multi_output_classification_sample_weights  s   r   c            	      C   s   g dg dg dg} ddgddgddgg}t g d}tddd	}t|}|| || g dg dg dg dg}ddgddgddgddgg}tddd	}t|}||| g dg}t|||| d S )
Nr[   r]   rh   r0   r\   )rd   re   re   rQ      rJ   )r6   r   r   r   r9   r'   r:   )	rk   rl   rb   rs   r   r;   r<   r   r?   rE   rE   rF   ;test_multi_output_classification_partial_fit_sample_weights  s   
r   c                  C   s   t tdd} tt | tt W d    n1 sw   Y  t	t
tf}| tt tt | t| W d    n1 sEw   Y  d}tjt|d | ttd d df  W d    d S 1 skw   Y  d S )Nr   r5   zUnknown label typerR   rQ   )r   r#   rT   rU   r   scorer;   r<   r6   column_stackr   r   r9   rV   )mocZy_newrW   rE   rE   rF   test_multi_output_exceptions  s   "r   response_methodrw   r:   c                 C   sH   t t }tt t|| t W d   dS 1 sw   Y  dS )zECheck that we raise the proper error when the estimator is not fittedN)r   r   rT   rU   r   getattrr;   )r   r   rE   rE   rF   "test_multi_output_not_fitted_error  s   
"r   c                  C   s,  t t } t| dsJ | tt t| dsJ t t } t| dr%J d}d}tjt	|d}| 
t W d   n1 s@w   Y  t|jjt	sNJ |t|jjksXJ | tt t| dreJ tjt	|d}| 
t W d   n1 s|w   Y  t|jjt	sJ |t|jjksJ dS )zVCheck the behavior for the delegation of predict_proba to the underlying
    estimatorrw   r~   z3'LinearSVC' object has no attribute 'predict_proba'rR   N)r   r   rM   r9   r;   r<   r#   rT   rU   r   rw   r   r   r   r   )r   r   Z	inner_msgr   rE   rE   rF   (test_multi_output_delegate_predict_proba  s(   

r   c                  C   s2   t dddddd\} }tdd |D }| |fS )	Ni  d      r   r   )r   
n_featuresr   Zn_informativer3   c                 S   s(   g | ]}d d t |ddd D qS )c                 S   s   g | ]}t |qS rE   )int).0ZyyyrE   rE   rF   
<listcomp>      zLgenerate_multilabel_dataset_with_correlations.<locals>.<listcomp>.<listcomp>z#06br\   N)format)r   yyrE   rE   rF   r     s   ( zAgenerate_multilabel_dataset_with_correlations.<locals>.<listcomp>)r   r6   r   )r;   r<   ZY_multirE   rE   rF   -generate_multilabel_dataset_with_correlations  s
   

r   chain_methoddecision_functionc                 C   sh   t  \}}tt | d||}||}|j|jksJ ||}|dk}t|| t|dr2J d S )Nr   r   rw   )	r   r   r#   r9   r:   r   r   r(   rM   )r   r;   r   classifier_chainY_predZ
Y_decisionY_binaryrE   rE   rF   5test_classifier_chain_fit_and_predict_with_linear_svc  s   



r   csr_containerc                 C   sX   t  \}}| |}tt ||}||}tt ||}||}t|| d S N)r   r   r   r9   r:   r(   )r   r;   r   X_sparser   ZY_pred_sparseZY_pred_denserE   rE   rF   6test_classifier_chain_fit_and_predict_with_sparse_data  s   


r   c            
      C   s   t  \} }| d dd d f }| dd d d f }|d dd d f }|dd d d f }tt }||| ||}tt }||| ||}	t||	ddt||ddks]J d S )NiX  samplesZaverage)r   r   r   r9   r:   r   r   )
r;   r   r=   r?   ZY_trainZY_testZovrZ
Y_pred_ovrchainZY_pred_chainrE   rE   rF   +test_classifier_chain_vs_independent_models  s   




r   )r:   rw   predict_log_probar   r   c                 C   s   t  \}}tt | d}||| ||}|j|jksJ dd |jD tt|jd |jd |jd  ks;J t	|||}|dkrKt
|}|dk}t|| t|ts[J d S )Nr   c                 S      g | ]}|j jqS rE   coef_r   r   crE   rE   rF   r   B  r   z9test_classifier_chain_fit_and_predict.<locals>.<listcomp>rQ   r         ?)r   r   r   r9   r:   r   rr   r   r8   r   r6   expr(   r   r   )r   r   r;   r   r   r   ZY_probr   rE   rE   rF   %test_classifier_chain_fit_and_predict6  s   




r   c                  C   sv   t  \} }tt }|| | || }|j|jksJ dd |jD tt| jd | jd |jd  ks9J d S )Nc                 S   r   rE   r   r   rE   rE   rF   r   V  r   z8test_regressor_chain_fit_and_predict.<locals>.<listcomp>rQ   )	r   r!   r   r9   r:   r   rr   r   r8   )r;   r   r   r   rE   rE   rF   $test_regressor_chain_fit_and_predictO  s   


r   c                 C   sb   t  \}}| |}tt ddtt ddg}|D ]}||| ||}|j|jks.J qd S )Nr0   r}   )r   r   r   r!   r   r9   r:   r   )r   r;   r   r   Zbase_chainsr   r   rE   rE   rF   7test_base_chain_fit_and_predict_with_sparse_data_and_cv[  s   

r   c                  C   s   t  \} }tt tt fD ][}t|jddd}|| | t|j|jd}|| | t	|j|j t
|jt
tdksCJ t|jdksLJ tt|jdksWJ t|j|jD ]\}}t|j|j q^qd S )Nr   *   )orderr3   r   r^   )r   r   r   r!   r   r   
set_paramsr9   Zorder_r(   r   r   r8   r   setziprr   r'   r   )r;   r   r   Zchain_randomZchain_fixedrt   ru   rE   rE   rF   test_base_chain_random_orderj  s   
r   zchain_type, chain_method))
classifierr:   )r   rw   )r   r   )r   r   )	regressor c                 C   s   t  \}}| dkrtt |d}ntt }||| t|jdd}||| ||}||}|j	|j	ks<J t
||krEJ t|trWt||dddksUJ d S t||dk s`J d S )	Nr   r   r0   r   r   r   g?g      ?)r   r   r   r!   r   r9   r   r   r:   r   r6   allr   r   r   )Z
chain_typer   r;   r   r   Zchain_cvZ	Y_pred_cvr   rE   rE   rF   (test_base_chain_crossval_fit_and_predict|  s   




r   rz   )r   c                 C   sR   |  tt t| jtsJ t| jtksJ tt	| jD ]	\}}t
|| qd S r   )r9   r;   r<   r   Zclasses_r   r   r   r   rq   r(   )rz   Zestimator_classesZexpected_classesrE   rE   rF   test_multi_output_classes_  s   r   c                          e Zd Zd fdd	Z  ZS )DummyRegressorWithFitParamsNc                       || _ t |||S r   _fit_paramssuperr9   selfr;   r<   sample_weight
fit_params	__class__rE   rF   r9        zDummyRegressorWithFitParams.fitr   __name__
__module____qualname__r9   __classcell__rE   rE   r   rF   r         r   c                       r   )DummyClassifierWithFitParamsNc                    r   r   r   r   r   rE   rF   r9     r   z DummyClassifierWithFitParams.fitr   r   rE   rE   r   rF   r     r   r   zestimator, datasetZprior)Zstrategyr0   r1   c                 C   s@   |\}}t |}| j|||d | jD ]	}d|jv sJ qd S )N)
some_paramr   )r6   r7   r9   rr   r   )rz   Zdatasetr;   r<   r   Zdummy_estimatorrE   rE   rF   *test_multioutput_estimator_with_fit_params  s   

r   c                  C   s   t jd} tjddd\}}| |jd }G dd dt}t| }d|i}|j	||fi | |j
D ]	}|j|u s>J q5d S )Nr   r0   r1   c                       s   e Zd Z fddZ  ZS )z0test_regressor_chain_w_fit_params.<locals>.MySGDc                    s$   |d | _ t j||fi | d S )Nr   )sample_weight_r   r9   )r   r;   r<   r   r   rE   rF   r9     s   
z4test_regressor_chain_w_fit_params.<locals>.MySGD.fitr   rE   rE   r   rF   MySGD  s    r   r   )r6   r   r   r   r	   Zrandr   r   r!   r9   rr   r   )r   r;   r<   weightr   modelZ	fit_paramestrE   rE   rF   !test_regressor_chain_w_fit_params  s   

r  zMultiOutputEstimator, Estimatorc                 C   s|   t jd}|dd|ddd}}|jddg|jdd	gd
t}t j	||< t
t | }| ||||| d S )Nr   r4   r\   rQ   r   )r4   r0   r   g{Gz?gGz?)p)r6   r   r   ZrandnZbinomialchoicer   Zastypeboolnanr"   r   r9   r   )ZMultiOutputEstimator	Estimatorr   r;   r<   maskpiperE   rE   rF   test_support_missing_values  s   
 
r  
order_typec                 C   s   g dg dg dg}ddgddgddgg}| ddg}t tddd|d	}||| g dg}ddgg}t||| d S )
Nr[   r]   rh   r0   r\   rQ   r   r   r   )r   r   r9   r'   r:   )r  r;   r<   r   r   r?   r@   rE   rE   rF   !test_classifier_chain_tuple_order  s   

r  c                  C   s   g dg dg dg} ddgddgddgg}t ddg}tt |d}tjtdd	 || | W d    d S 1 s<w   Y  d S )
Nr[   r]   rh   r0   r\   rQ   r   zinvalid orderrR   )tupler   r   rT   rU   rV   r9   )r;   r<   r   r   rE   rE   rF   )test_classifier_chain_tuple_invalid_order  s   "r  c           	      C   sn   t dddddd\}}t||dd\}}}}d}tt g ddd	d
}||| t||  d s5J d S )Nr   rI   r0   r   )r   r   r   Zn_labelsr3   r5   z\[Chain\].*\(1 of 3\) Processing order 0, total=.*\n\[Chain\].*\(2 of 3\) Processing order 1, total=.*\n\[Chain\].*\(3 of 3\) Processing order 2, total=.*\n$)r   rQ   r\   Tr   r3   verbose)r   r   r   r$   r9   rerS   
readouterr)	capsysr;   r<   r=   r?   r>   r@   patternr   rE   rE   rF   test_classifier_chain_verbose  s   

r  c           	      C   sj   t dddd\}}t||dd\}}}}d}tt g dddd	}||| t||  d s3J d S )
N}   r0   r   )r   r2   r3   r5   z\[Chain\].*\(1 of 3\) Processing order 1, total=.*\n\[Chain\].*\(2 of 3\) Processing order 0, total=.*\n\[Chain\].*\(3 of 3\) Processing order 2, total=.*\n$)rQ   r   r\   Tr  )r	   r   r!   r   r9   r  rS   r  )	r  r;   r<   r=   r?   r>   r@   r  r   rE   rE   rF   test_regressor_chain_verbose)  s   r  c                  C   sJ   t dd\} }tdtddfgt dd}t|d| |}||  d	S )
zkTest that MultiOutputRegressor checks the fitted estimator for
    predict. Non-regression test for #16549.T)Z
return_X_yZsgdrQ   r5   r\   )Z
estimatorsZfinal_estimatorr}   )rz   N)r   r   r   r   r    r9   r:   )r;   r<   ZstackerregrE   rE   rF   4test_multioutputregressor_ducktypes_fitted_estimator<  s   r  zCls, methodr9   rL   c                 C   s`   t dd\}}| t }tjtdd t||||dd W d   dS 1 s)w   Y  dS )zgCheck that we raise an error when passing metadata not requested by the
    underlying classifier.
    r4   )r   zis only supported ifrR   rQ   )testN)r   r   rT   rU   rV   r   )ZClsmethodr;   r<   r   rE   rE   rF   test_fit_params_no_routingL  s
   
"r  c                  C   sL   t t } d}tjt|d t| d W d    d S 1 sw   Y  d S )Nz:This 'MultiOutputRegressor' has no attribute 'partial_fit'rR   rL   )r    r   rT   rU   r   r   )r  rW   rE   rE   rF   *test_multioutput_regressor_has_partial_fitZ  s
   
"r  r	  c                 C   s   t ddgddgg}t ddgddgg}t }tt | |d|| W d   n1 s2w   Y  tt | ||d|| W d   dS 1 sRw   Y  dS )	z=Check that we warn about the deprecation of `base_estimator`.rQ   r\   r0   r^   r   )base_estimatorN)r   rz   )	r6   r   r   rT   ZwarnsFutureWarningr9   rU   rV   )r	  r;   r<   rz   rE   rE   rF   test_base_estimator_deprecationd  s   "r"  )r  numpyr6   rT   Zjoblibr   Zsklearnr   Zsklearn.baser   r   Zsklearn.datasetsr   r   r   r	   Zsklearn.dummyr
   r   Zsklearn.ensembler   r   r   Zsklearn.exceptionsr   Zsklearn.imputer   Zsklearn.linear_modelr   r   r   r   r   r   r   r   Zsklearn.metricsr   r   Zsklearn.model_selectionr   r   Zsklearn.multiclassr   Zsklearn.multioutputr   r   r    r!   Zsklearn.pipeliner"   Zsklearn.svmr#   Zsklearn.treer$   Zsklearn.utilsr%   Zsklearn.utils._testingr&   r'   r(   Zsklearn.utils.fixesr)   r*   r+   r,   r-   r.   rG   rP   rX   markZparametrizerZ   rc   rg   rm   Z	load_irisZirisdatar;   targetr   r   Zy3r   r<   r   r   r   r   r   uniquer   r   maprq   rv   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  r  r  r  r  r  r  r"  rE   rE   rE   rF   <module>   s    (
 
	
	

*-












