
    cS                     4   d dl mZ d dlZd dlmZ d dlmZ d dlmZ erej        Znej	        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 Zd Zd Zd Zd Zd Zd Zd Zd Zd Zd Zd Z d Z!d Z"d  Z#d! Z$d" Z%d# Z&d$ Z'd% Z(d& Z)d' Z*d( Z+d) Z,dS )+    )absolute_importN)api)provide)_PY2selfc                    t          |           }t          |          }t          |j                  }t          |j                  }|D ]4}||v r|                    |           ||v r|                    |           5||k    sJ d S N)
getargspeclistargsremove)	function1	function2ignoredf1specf2specargs1args2params           >lib/python3.11/site-packages/anaconda_project/test/test_api.py_verify_args_matchr      s    	""F	""FEE    E> 	 LLE> 	 LLE>    c                    t          dt                                fd}|                     d|           t          j                    }t          ddddd	
          } |j        di |}d|k    sJ |d         k    sJ d S )N r   kwargsc                      | d<   |d<   dS Nr   r   *   r   r   r   paramss     r   mock_create_projectz0test_create_project.<locals>.mock_create_project(       v!xrr   z#anaconda_project.project_ops.create      foobarblah)directory_pathmake_directorynameicondescriptionr    r   )dictsetattrr   AnacondaProjectcreate_project)monkeypatchr#   pr   resultr"   s        @r   test_create_projectr6   %   s    r$&&)))F    
 =?RSSSA15uZ`aaaFQ''''F<VH%%%%%%%r   c                 0   ddl m} t          t          j        j        |j        g d            G d dt                    }|                     d|           t          j                    }t          dd	
          } |j        di |}||j
        k    sJ d S )Nr   )Project)r   plugin_registry
must_existscan_parentsr   c                       e Zd Zd ZdS )&test_load_project.<locals>.MockProjectc                     || _         d S r
   )r   )r   r   r   s      r   __init__z/test_load_project.<locals>.MockProject.__init__=   s     DKKKr   N)__name__
__module____qualname__r@   r   r   r   MockProjectr>   <   s#        	! 	! 	! 	! 	!r   rD   z anaconda_project.project.Projectr'   %   )r*   frontendr   )anaconda_project.projectr8   r   r   r1   load_projectr@   objectr0   r/   r   )r3   r8   rD   r4   r   projects         r   test_load_projectrK   6   s    000000s*7'XXXZ Z Z Z! ! ! ! !f ! ! ! :KHHHA444Fan&&v&&GW^######r   c                 x    t          dt                                fd}|                     d|           S )Nr   r   c                      | d<   |d<   dS r   r   r!   s     r    mock_prepare_without_interactionzR_monkeypatch_prepare_without_interaction.<locals>.mock_prepare_without_interactionJ   r$   r   z4anaconda_project.prepare.prepare_without_interaction)r/   r0   )r3   rN   r"   s     @r   (_monkeypatch_prepare_without_interactionrO   G   sQ    r$&&)))F    
 NPpqqqMr   c           	      n   ddl m} t          t          t          j        |          |g d           t          |           }t	          j                    }t          ddddd	d
dg          } t          ||          di |}d|k    sJ |d         d         |k    sJ |d         d= ||d         k    sJ d S )Nr   )prepare_without_interaction)r   modeprovide_whitelistrefreshr<   +   9   someenvr'   i  12)rJ   environenv_spec_namecommand_namecommandextra_command_argsr    r   rR   r   )anaconda_project.preparerQ   r   getattrr   r1   rO   r/   )r3   
api_methodprovide_moderQ   r"   r4   r   r5   s           r   !_test_prepare_without_interactionrc   S   s   DDDDDDws2J??2OOOQ Q Q Q 6kBBFA" )$&)3Z1 1 1F $WQ
##--f--F<(F#|3333x VH%%%%%%%r   c                 <    t          | dt          j                   d S )Nprepare_project_locally)rc   r   PROVIDE_MODE_DEVELOPMENTr3   s    r   test_prepare_project_locallyrh   h   s    %k3LgNnooooor   c                 <    t          | dt          j                   d S )Nprepare_project_production)rc   r   PROVIDE_MODE_PRODUCTIONrg   s    r   test_prepare_project_productionrl   l   s    %k3OQXQpqqqqqr   c                 <    t          | dt          j                   d S )Nprepare_project_check)rc   r   PROVIDE_MODE_CHECKrg   s    r   test_prepare_project_checkrp   p   s    %k3JGLfgggggr   c                 R   ddl m} t          t          j        j        |           t          dt                                fd}|                     d|           t          j                    }t          ddd	
          } |j        di |}d|k    sJ |d         k    sJ d S )Nr   )	unpreparer   r   c                      | d<   |d<   dS r   r   r!   s     r   mock_unpreparez&test_unprepare.<locals>.mock_unpreparez   r$   r   z"anaconda_project.prepare.unpreparerU   ,   -   )rJ   prepare_result	whitelistr    r   )r_   rr   r   r   r1   r/   r0   )r3   rr   rt   r4   r   r5   r"   s         @r   test_unpreparery   t   s    222222s*4i@@@r$&&)))F    
 <nMMMA"R2>>>FQ[""6""F<VH%%%%%%%r   c                 ^   dd l m} t          t          j        j        |j                   t          dt                                fd}|                     d|           t          j                    }t          dddd	
          } |j        di |}d|k    sJ |d         k    sJ d S )Nr   r   r   c                      | d<   |d<   dS r   r   r!   s     r   mock_set_propertiesz0test_set_properties.<locals>.mock_set_properties   r$   r   z+anaconda_project.project_ops.set_propertiesrU   r'   r(   r)   )rJ   r,   r-   r.   r    r   )anaconda_project.project_opsproject_opsr   r   r1   set_propertiesr/   r0   )r3   r~   r|   r4   r   r5   r"   s         @r   test_set_propertiesr      s    666666s*9;;UVVVr$&&)))F    
 EGZ[[[A"5u&IIIFQ''''F<VH%%%%%%%r   c                 ^   dd l m} t          t          j        j        |j                   t          dt                                fd}|                     d|           t          j                    }t          dddd	
          } |j        di |}d|k    sJ |d         k    sJ d S )Nr   r   r   c                      | d<   |d<   dS r   r   r!   s     r   mock_add_variablesz.test_add_variables.<locals>.mock_add_variables   r$   r   z*anaconda_project.project_ops.add_variablesrU   boorv   i90  )rJ   r[   vars_to_adddefaultsr    r   )r}   r~   r   r   r1   add_variablesr/   r0   )r3   r~   r   r4   r   r5   r"   s         @r   test_add_variablesr      s    666666s*8+:STTTr$&&)))F    
 DFXYYYA"ErERRRFQ_&&v&&F<VH%%%%%%%r   c                 ^   dd l m} t          t          j        j        |j                   t          dt                                fd}|                     d|           t          j                    }t          dddd	
          } |j        di |}d|k    sJ |d         k    sJ d S )Nr   r   r   c                      | d<   |d<   dS r   r   r!   s     r   mock_remove_variablesz4test_remove_variables.<locals>.mock_remove_variables   r$   r   z-anaconda_project.project_ops.remove_variablesrU   r   rv   rV   )rJ   r[   vars_to_removerw   r    r   )r}   r~   r   r   r1   remove_variablesr/   r0   )r3   r~   r   r4   r   r5   r"   s         @r   test_remove_variablesr      s    666666s*;[=YZZZr$&&)))F    
 GI^___A"E"UWXXXFQ))&))F<VH%%%%%%%r   c                 ^   dd l m} t          t          j        j        |j                   t          dt                                fd}|                     d|           t          j                    }t          dddd	
          } |j        di |}d|k    sJ |d         k    sJ d S )Nr   r   r   c                      | d<   |d<   dS r   r   r!   s     r   mock_set_variablesz.test_set_variables.<locals>.mock_set_variables   r$   r   z*anaconda_project.project_ops.set_variablesrU   r   rv   rV   )rJ   r[   vars_and_valuesrw   r    r   )r}   r~   r   r   r1   set_variablesr/   r0   )r3   r~   r   r4   r   r5   r"   s         @r   test_set_variablesr      s    666666s*8+:STTTr$&&)))F    
 DFXYYYA"E2VXYYYFQ_&&v&&F<VH%%%%%%%r   c                 ^   dd l m} t          t          j        j        |j                   t          dt                                fd}|                     d|           t          j                    }t          dddd	
          } |j        di |}d|k    sJ |d         k    sJ d S )Nr   r   r   c                      | d<   |d<   dS r   r   r!   s     r   mock_unset_variablesz2test_unset_variables.<locals>.mock_unset_variables   r$   r   z,anaconda_project.project_ops.unset_variablesrU   r   rv   rV   )rJ   r[   vars_to_unsetrw   r    r   )r}   r~   r   r   r1   unset_variablesr/   r0   )r3   r~   r   r4   r   r5   r"   s         @r   test_unset_variablesr      s    666666s*:K<WXXXr$&&)))F    
 FH\]]]A"ETVWWWFQ((((F<VH%%%%%%%r   c           	      d   dd l m} t          t          j        j        |j                   t          dt                                fd}|                     d|           t          j                    }t          dddd	d
dd          } |j        di |}d|k    sJ |d         k    sJ d S )Nr   r   r   c                      | d<   |d<   dS r   r   r!   s     r   mock_add_downloadz,test_add_download.<locals>.mock_add_download   r$   r   z)anaconda_project.project_ops.add_downloadrU   myenvr   bazfnamemd5r'   )rJ   r[   env_varurlfilenamehash_algorithm
hash_valuer    r   )r}   r~   r   r   r1   add_downloadr/   r0   )r3   r~   r   r4   r   r5   r"   s         @r   test_add_downloadr      s    666666s*79QRRRr$&&)))F    
 CEVWWWA" '"!&"$ $ $F Q^%%f%%F<VH%%%%%%%r   c                 ^   dd l m} t          t          j        j        |j                   t          dt                                fd}|                     d|           t          j                    }t          dddd	
          } |j        di |}d|k    sJ |d         k    sJ d S )Nr   r   r   c                      | d<   |d<   dS r   r   r!   s     r   mock_remove_downloadz2test_remove_download.<locals>.mock_remove_download  r$   r   z,anaconda_project.project_ops.remove_downloadrU   r)   	winnebagor   )rJ   r[   rw   r   r    r   )r}   r~   r   r   r1   remove_downloadr/   r0   )r3   r~   r   r4   r   r5   r"   s         @r   test_remove_downloadr     s    666666s*:K<WXXXr$&&)))F    
 FH\]]]A"F;X]^^^FQ((((F<VH%%%%%%%r   c                 b   dd l m} t          t          j        j        |j                   t          dt                                fd}|                     d|           t          j                    }t          dddgd	g
          } |j        di |}d|k    sJ |d         k    sJ d S )Nr   r   r   c                      | d<   |d<   dS r   r   r!   s     r   mock_add_env_specz,test_add_env_spec.<locals>.mock_add_env_spec  r$   r   z)anaconda_project.project_ops.add_env_specrU   r'   ab)rJ   r,   packageschannelsr    r   )r}   r~   r   r   r1   add_env_specr/   r0   )r3   r~   r   r4   r   r5   r"   s         @r   test_add_env_specr     s    666666s*79QRRRr$&&)))F    
 CEVWWWA"5C5C5IIIFQ^%%f%%F<VH%%%%%%%r   c                 Z   dd l m} t          t          j        j        |j                   t          dt                                fd}|                     d|           t          j                    }t          dd          } |j        di |}d	|k    sJ |d
         k    sJ d S )Nr   r   r   c                      | d<   |d<   dS r   r   r!   s     r   mock_remove_env_specz2test_remove_env_spec.<locals>.mock_remove_env_spec3  r$   r   z,anaconda_project.project_ops.remove_env_specrU   r'   rJ   r,   r    r   )r}   r~   r   r   r1   remove_env_specr/   r0   )r3   r~   r   r4   r   r5   r"   s         @r   test_remove_env_specr   -  s    666666s*:K<WXXXr$&&)))F    
 FH\]]]A"5)))FQ((((F<VH%%%%%%%r   c                 \   dd l m} t          t          j        j        |j                   t          dt                                fd}|                     d|           t          j                    }t          ddd	          } |j        di |}d
|k    sJ |d         k    sJ d S )Nr   r   r   c                      | d<   |d<   dS r   r   r!   s     r   mock_export_env_specz2test_export_env_spec.<locals>.mock_export_env_specG  r$   r   z,anaconda_project.project_ops.export_env_specrU   r'   r(   )rJ   r,   r   r    r   )r}   r~   r   r   r1   export_env_specr/   r0   )r3   r~   r   r4   r   r5   r"   s         @r   test_export_env_specr   A  s    666666s*:K<WXXXr$&&)))F    
 FH\]]]A"55999FQ((((F<VH%%%%%%%r   c                 d   dd l m} t          t          j        j        |j                   t          dt                                fd}|                     d|           t          j                    }t          dddgd	gd
          } |j        di |}d|k    sJ |d         k    sJ d S )Nr   r   r   c                      | d<   |d<   dS r   r   r!   s     r   mock_add_packagesz,test_add_packages.<locals>.mock_add_packages[  r$   r   z)anaconda_project.project_ops.add_packagesrU   r'   r   r   F)rJ   r[   r   r   pipr    r   )r}   r~   r   r   r1   add_packagesr/   r0   )r3   r~   r   r4   r   r5   r"   s         @r   test_add_packagesr   U  s    666666s*79QRRRr$&&)))F    
 CEVWWWA"ESESEW\]]]FQ^%%f%%F<VH%%%%%%%r   c                 `   dd l m} t          t          j        j        |j                   t          dt                                fd}|                     d|           t          j                    }t          dddgd 	          } |j        di |}d
|k    sJ |d         k    sJ d S )Nr   r   r   c                      | d<   |d<   dS r   r   r!   s     r   mock_remove_packagesz2test_remove_packages.<locals>.mock_remove_packageso  r$   r   z,anaconda_project.project_ops.remove_packagesrU   r'   r   )rJ   r[   r   r   r    r   )r}   r~   r   r   r1   remove_packagesr/   r0   )r3   r~   r   r4   r   r5   r"   s         @r   test_remove_packagesr   i  s    666666s*:K<WXXXr$&&)))F    
 FH\]]]A"ESEtLLLFQ((((F<VH%%%%%%%r   c                 Z   dd l m} t          t          j        j        |j                   t          dt                                fd}|                     d|           t          j                    }t          dd          } |j        di |}d	|k    sJ |d
         k    sJ d S )Nr   r   r   c                      | d<   |d<   dS r   r   r!   s     r   	mock_lockztest_lock.<locals>.mock_lock  r$   r   z!anaconda_project.project_ops.lockrU   r'   rJ   r[   r    r   )r}   r~   r   r   r1   lockr/   r0   )r3   r~   r   r4   r   r5   r"   s         @r   	test_lockr   }  s    666666s*/1ABBBr$&&)))F    
 ;YGGGA"E222FQVfF<VH%%%%%%%r   c                 Z   dd l m} t          t          j        j        |j                   t          dt                                fd}|                     d|           t          j                    }t          dd          } |j        di |}d	|k    sJ |d
         k    sJ d S )Nr   r   r   c                      | d<   |d<   dS r   r   r!   s     r   mock_updatez test_update.<locals>.mock_update  r$   r   z#anaconda_project.project_ops.updaterU   r'   r   r    r   )r}   r~   r   r   r1   updater/   r0   )r3   r~   r   r4   r   r5   r"   s         @r   test_updater         666666s*1;3EFFFr$&&)))F    
 ={KKKA"E222FQXF<VH%%%%%%%r   c                 Z   dd l m} t          t          j        j        |j                   t          dt                                fd}|                     d|           t          j                    }t          dd          } |j        di |}d	|k    sJ |d
         k    sJ d S )Nr   r   r   c                      | d<   |d<   dS r   r   r!   s     r   mock_unlockz test_unlock.<locals>.mock_unlock  r$   r   z#anaconda_project.project_ops.unlockrU   r'   r   r    r   )r}   r~   r   r   r1   unlockr/   r0   )r3   r~   r   r4   r   r5   r"   s         @r   test_unlockr     r   r   c                 ^   dd l m} t          t          j        j        |j                   t          dt                                fd}|                     d|           t          j                    }t          dddg	          } |j        di |}d
|k    sJ |d         k    sJ d S )Nr   r   r   c                      | d<   |d<   dS r   r   r!   s     r   mock_add_platformsz.test_add_platforms.<locals>.mock_add_platforms  r$   r   z*anaconda_project.project_ops.add_platformsrU   r,   /   rJ   r[   	platformsr    r   )r}   r~   r   r   r1   add_platformsr/   r0   )r3   r~   r   r4   r   r5   r"   s         @r   test_add_platformsr     s    666666s*8+:STTTr$&&)))F    
 DFXYYYA"FrdCCCFQ_&&v&&F<VH%%%%%%%r   c                 ^   dd l m} t          t          j        j        |j                   t          dt                                fd}|                     d|           t          j                    }t          dddg	          } |j        di |}d
|k    sJ |d         k    sJ d S )Nr   r   r   c                      | d<   |d<   dS r   r   r!   s     r   mock_remove_platformsz4test_remove_platforms.<locals>.mock_remove_platforms  r$   r   z-anaconda_project.project_ops.remove_platformsrU   r,   r   r   r    r   )r}   r~   r   r   r1   remove_platformsr/   r0   )r3   r~   r   r4   r   r5   r"   s         @r   test_remove_platformsr     s    666666s*;[=YZZZr$&&)))F    
 GI^___A"FrdCCCFQ))&))F<VH%%%%%%%r   c                 b   dd l m} t          t          j        j        |j                   t          dt                                fd}|                     d|           t          j                    }t          dddd	d
d          } |j        di |}d|k    sJ |d         k    sJ d S )Nr   r   r   c                      | d<   |d<   dS r   r   r!   s     r   mock_add_commandz*test_add_command.<locals>.mock_add_command  r$   r   z(anaconda_project.project_ops.add_commandrU   	bokeh_appr,   file.pyr'   T)rJ   command_typer,   r]   r[   supports_http_optionsr    r   )r}   r~   r   r   r1   add_commandr/   r0   )r3   r~   r   r4   r   r5   r"   s         @r   test_add_commandr     s    666666s*68OPPPr$&&)))F    
 BDTUUUA"*# %(,. . .F Q]$$V$$F<VH%%%%%%%r   c                 `   dd l m} t          t          j        j        |j                   t          dt                                fd}|                     d|           t          j                    }t          dddd	d
          } |j        di |}d|k    sJ |d         k    sJ d S )Nr   r   r   c                      | d<   |d<   dS r   r   r!   s     r   mock_update_commandz0test_update_command.<locals>.mock_update_command  r$   r   z+anaconda_project.project_ops.update_commandrU   r   r,   r   r'   )rJ   r   r,   r]   new_namer    r   )r}   r~   r   r   r1   update_commandr/   r0   )r3   r~   r   r4   r   r5   r"   s         @r   test_update_commandr     s    666666s*9;;UVVVr$&&)))F    
 EGZ[[[A";VYafgggFQ''''F<VH%%%%%%%r   c                 Z   dd l m} t          t          j        j        |j                   t          dt                                fd}|                     d|           t          j                    }t          dd          } |j        di |}d	|k    sJ |d
         k    sJ d S )Nr   r   r   c                      | d<   |d<   dS r   r   r!   s     r   mock_remove_commandz0test_remove_command.<locals>.mock_remove_command  r$   r   z+anaconda_project.project_ops.remove_commandrU   r,   r   r    r   )r}   r~   r   r   r1   remove_commandr/   r0   )r3   r~   r   r4   r   r5   r"   s         @r   test_remove_commandr     s    666666s*9;;UVVVr$&&)))F    
 EGZ[[[A"6***FQ''''F<VH%%%%%%%r   c                 ^   dd l m} t          t          j        j        |j                   t          dt                                fd}|                     d|           t          j                    }t          dddd	
          } |j        di |}d|k    sJ |d         k    sJ d S )Nr   r   r   c                      | d<   |d<   dS r   r   r!   s     r   mock_add_servicez*test_add_service.<locals>.mock_add_service-  r$   r   z(anaconda_project.project_ops.add_servicerU   r   abcxyz)rJ   r[   service_typevariable_namer    r   )r}   r~   r   r   r1   add_servicer/   r0   )r3   r~   r  r4   r   r5   r"   s         @r   test_add_servicer  '  s    666666s*68OPPPr$&&)))F    
 BDTUUUA"EUZ[[[FQ]$$V$$F<VH%%%%%%%r   c                 ^   dd l m} t          t          j        j        |j                   t          dt                                fd}|                     d|           t          j                    }t          dddd	
          } |j        di |}d|k    sJ |d         k    sJ d S )Nr   r   r   c                      | d<   |d<   dS r   r   r!   s     r   mock_remove_servicez0test_remove_service.<locals>.mock_remove_serviceA  r$   r   z+anaconda_project.project_ops.remove_servicerU   iB  {   r  )rJ   r[   rw   r  r    r   )r}   r~   r   r   r1   remove_servicer/   r0   )r3   r~   r  r4   r   r5   r"   s         @r   test_remove_servicer  ;  s    666666s*9;;UVVVr$&&)))F    
 EGZ[[[A"CSXYYYFQ''''F<VH%%%%%%%r   c                 Z   dd l m} t          t          j        j        |j                   t          dt                                fd}|                     d|           t          j                    }t          dd          } |j        di |}d	|k    sJ |d
         k    sJ d S )Nr   r   r   c                      | d<   |d<   dS r   r   r!   s     r   
mock_cleanztest_clean.<locals>.mock_cleanU  r$   r   z"anaconda_project.project_ops.cleanrU   r  )rJ   rw   r    r   )r}   r~   r   r   r1   cleanr/   r0   )r3   r~   r  r4   r   r5   r"   s         @r   
test_cleanr  O  s    666666s*0+2CDDDr$&&)))F    
 <jIIIA"S111FQWvF<VH%%%%%%%r   c                 \   dd l m} t          t          j        j        |j                   t          dt                                fd}|                     d|           t          j                    }t          ddd	          } |j        di |}d
|k    sJ |d         k    sJ d S )Nr   r   r   c                      | d<   |d<   dS r   r   r!   s     r   mock_archivez"test_archive.<locals>.mock_archivei  r$   r   z$anaconda_project.project_ops.archiverU   r  F)rJ   r   	pack_envsr    r   )r}   r~   r   r   r1   archiver/   r0   )r3   r~   r  r4   r   r5   r"   s         @r   test_archiver  c  s    666666s*2K4GHHHr$&&)))F    
 >MMMA"se<<<FQY    F<VH%%%%%%%r   c                 ^   dd l m} t          t          j        j        |j                   t          dt                                fd}|                     d|           t          j                    }t          dddd	
          } |j        di |}d|k    sJ |d         k    sJ d S )Nr   r   r   c                      | d<   |d<   dS r   r   r!   s     r   mock_unarchivez&test_unarchive.<locals>.mock_unarchive}  r$   r   z&anaconda_project.project_ops.unarchiverU   r      )r   project_dir
parent_dirrF   r    r   )r}   r~   r   r   r1   	unarchiver/   r0   )r3   r~   r  r4   r   r5   r"   s         @r   test_unarchiver"  w  s    666666s*4k6KLLLr$&&)))F    
 @.QQQA233MMMFQ[""6""F<VH%%%%%%%r   c           	      d   dd l m} t          t          j        j        |j                   t          dt                                fd}|                     d|           t          j                    }t          dddd	d
dd          } |j        di |}d|k    sJ |d         k    sJ d S )Nr   r   r   c                      | d<   |d<   dS r   r   r!   s     r   mock_uploadz test_upload.<locals>.mock_upload  r$   r   z#anaconda_project.project_ops.uploadrU   Tr  r  r  z.zipLOTS)rJ   privatesitetokenusernamesuffix	log_levelr    r   )r}   r~   r   r   r1   uploadr/   r0   )r3   r~   r%  r4   r   r5   r"   s         @r   test_uploadr.    s    666666s*1;3EFFFr$&&)))F    
 ={KKKA"dC#V\hnoooFQXF<VH%%%%%%%r   )r   )-
__future__r   inspectanaconda_projectr   r   $anaconda_project.internal.py2_compatr   r   getfullargspecr   r6   rK   rO   rc   rh   rl   rp   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   <module>r4     s   ' & & & & &              $ $ $ $ $ $ 5 5 5 5 5 5 (#JJ 'J
 
 
 
& & &"$ $ $"	 	 	& & &*p p pr r rh h h& & &&& & &(& & &(& & &(& & &(& & &(& & &4& & &(& & &(& & &(& & &(& & &(& & &(& & &(& & &(& & &(& & &*& & &*& & &4& & &*& & &*& & &(& & &(& & &(& & &(& & &(& & & & &r   