o
    3Ihm                      @   s
  d dl Z d dlZd dlZd dlZd dlZd dlZd dlmZmZm	Z	m
Z
mZmZmZmZmZ d dlmZ 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 d dlmZ d dlZd dlm Z m!Z!m"Z" d d	l#m$Z$m%Z% d d
l&m'Z' d dl(m)Z) d dl*m+Z+m,Z, d dl-m.Z/m0Z0 d dl1m2Z2m3Z4 d dl5m6Z6 d dl7Z7d dl8Z8d dl9Z:d dl;m<Z< d dlm=Z= d dl>m?Z?m@Z@ e7AeBZCg dZDeEddZFeFeDvreGdeF deD dejHjIddejJjKejJjLejJjMgejNjOd ejHjIdejHPddd ejHjIdejHPddd ejHjId ejHPdd!dd" ejHQeF d#e"d$dfd%d&ZR			ddeejH deejH d eejH d$eejH fd'd(ZSeEd)d*kZTd+ZUd$ejVfd,d-ZWdd.d/ZXd$eYfd0d1ZZ	2										2dd3eYd4e[d5ee\ d6ee\ d7ee\ d8ee\ d9ee\ d:ee\ d;ee\ d<ee\ d=ee\ d>ee[ d$dfd?d@Z]dd#e!dAeYd$dfdBdCZ^	2	D											2dd4e[dEe\d6ee\ dFee\ d7ee\ d8ee\ dGee\ d9ee\ d:ee\ d;ee\ d<ee\ d=ee\ d>ee[ d$ee%ddf fdHdIZ_d$ee%ddf fdJdKZ`d$ee%ddf fdLdMZad$ee%ddf fdNdOZbd$ee%ddf fdPdQZcd$ee%ddf fdRdSZdd$ee%ddf fdTdUZed$ee%ddf fdVdWZfd$ee%ddf fdXdYZgd$ee%ddf fdZd[Zhd$ee%ddf fd\d]Zid$ee%ddf fd^d_Zjd$ee%ddf fd`daZkd$ee%ddf fdbdcZld$ee%ddf fdddeZmd$ee%ddf fdfdgZnd$ee%ddf fdhdiZoejpdjejqv rengnelgdkdlejrd$ee%ddf fdmdnZsejpdjejqv reognemgdkdlejrd$ee%ddf fdodpZtd$e
eg ee%ddf f  fdqdrZud$e
eg ee%ddf f  fdsdtZvd$e
eg ee%ddf f  fdudvZwd$e
eg ee%ddf f  fdwdxZxd$e
eg ee%ddf f  fdydzZyd$e
eg ee%ddf f  fd{d|Zzd$e
eg ee%ddf f  fd}d~Z{ejpdez ddlejrd$ee!ddf fddZ|ejpdex ddlejrd$ee!ddf fddZ}ejpdev ddlejrd$ee!ddf fddZ~ejpdeu ddlejrd$ee!ddf fddZejpde{ ddlejrd$ee!ddf fddZejpdew ddlejrd$ee!ddf fddZe6G dd de4Ze6G dd de2Zejpddde%d$ee!ddf fdd#ZG dd dZejpddde%d$eeddf fddZejpddde%d$ee ddf fddZejpddde%d$ee ddf fddZejpddde%d$ee ddf fddZejpddde%d$ee!ddf fddZejpddde%d$ee!ddf fddZejpddde%d$ee!ddf fddZG dd deZde)dede	e, deYd$eee, ee+ f f
ddZde)dede	e, deYd$eee, ee+ f f
ddZd$e
e fddZejpde ddlejrd$eeddf fddZdd Zde d$e[fddZejpdddlejrd$ed fddZejpd$ee?ge@f fddZejpde=d$e=fddZdS )    N)	Any	GeneratorIteratorListOptionalSequenceTupleCallablecast)UUID)ConnectError)Protocol)AsyncFastAPI)FastAPI)	ClientAPI	ServerAPIBaseAPI)SettingsSystem)embeddings_queue)Producer)SeqIdOperationRecord)ClientAdminClient)AsyncAdminClientAsyncClient)async_class_to_sync)	MagicMock)MonkeyPatch	Documents
EmbeddingsfastnormalslowPROPERTY_TESTING_PRESETr$   z!Invalid property testing preset: z. Must be one of .basei_ )deadlinesuppress_health_check	verbosity2   )max_examplesr%   d   r&   i  )r.   stateful_step_countapireturnc                 C   s   |    d S N)reset)r1    r5   V/home/air/sanwanet/gpt-api/venv/lib/python3.10/site-packages/chromadb/test/conftest.pyr4   U   s   r4   c                    sd   g d | ||d}| t}|dur* fdd|j D }tjtjjfi |S ttjtjjS )a%  Override Hypothesis settings for specific profiles.

    For example, to override max_examples only when the current profile is 'fast':

    override_hypothesis_profile(
        fast=hypothesis.settings(max_examples=50),
    )

    Settings will be merged with the default/active profile.
    )r*   r.   r0   r+   r#   Nc                    s   i | ]\}}| v r||qS r5   r5   ).0keyvalueallowable_override_keysr5   r6   
<dictcomp>y   s
    z/override_hypothesis_profile.<locals>.<dictcomp>)getCURRENT_PRESET__dict__items
hypothesissettingsdefaultr
   )r$   r%   r&   override_profilesoverriding_profileoverridden_settingsr5   r:   r6   override_hypothesis_profileY   s   

rG   CHROMA_CLUSTER_TEST_ONLY1x   c                   C   s   t jjtddS )Nz5Requires Kubernetes to be running with a valid config)reason)pytestmarkskipifNOT_CLUSTER_ONLYr5   r5   r5   r6   skip_if_not_cluster   s   rP   c                  C   st   t jt jt jtd} td|   t j| s#td|  t	
dddddd	d
dddddddd| g d S )Nzopenssl.cnfzConfig path: zConfig file not found at opensslreqz-x509z-newkeyzrsa:4096z-keyoutzserverkey.pemz-outzservercert.pemz-days365z-nodesz-subjz/CN=localhostz-config)ospathjoindirnameabspath__file__printexistsFileNotFoundError
subprocessrun)config_pathr5   r5   r6    generate_self_signed_certificate   s2   r`   c                  C   s\   t  t jt j} | d | t jt jd |  d W  d    S 1 s'w   Y  d S )N) r      )socketAF_INETSOCK_STREAMbind
setsockopt
SOL_SOCKETSO_REUSEADDRgetsockname)sr5   r5   r6   find_free_port   s
   

$rl   Fportis_persistentpersist_directorychroma_server_authn_provider$chroma_server_authn_credentials_filechroma_server_authn_credentials"chroma_auth_token_transport_headerchroma_server_authz_providerchroma_server_authz_config_filechroma_server_ssl_certfilechroma_server_ssl_keyfile;chroma_overwrite_singleton_tenant_database_access_from_authc                 C   s   |r|rt ddddd||d|||||||d}nt ddddddd|||||||d}tjj|}tj| d| d	d
|
|	d dS )zRun a Chroma server locallychromadb.api.segment.SegmentAPI chromadb.db.impl.sqlite.SqliteDB7chromadb.segment.impl.manager.local.LocalSegmentManagerT)chroma_api_implchroma_sysdb_implchroma_producer_implchroma_consumer_implchroma_segment_manager_implrn   ro   allow_resetrp   rq   rr   rs   rt   ru   rx   F)r|   r}   r~   r   r   rn   r   rp   rq   rr   rs   rt   ru   rx   z0.0.0.0error   )hostrm   	log_leveltimeout_keep_alivessl_keyfilessl_certfileN)r   chromadbserverfastapir   uvicornr^   app)rm   rn   ro   rp   rq   rr   rs   rt   ru   rv   rw   rx   rB   r   r5   r5   r6   _run_server   sX   
r   attemptsc              
   C   sZ   z|    W d S  ty, } z|dkr|td t| |d  W Y d }~d S d }~ww )N      rb   )	heartbeatr   timesleep_await_server)r1   r   er5   r5   r6   r      s   
r   chromadb.api.fastapi.FastAPIr|   chroma_client_auth_providerchroma_client_auth_credentialsc                 #   s    t  tddd|||||	|f}dtdttddf f fdd}| rot }| |j|||||	|f}||E dH  z|	  W dS  t
tfyn } ztjdkran|W Y d}~dS d}~ww ||E dH  dS )	zmFixture generator that launches a server in a separate process, and yields a
    fastapi client connect to itspawnFNargsr2   c                 3   s    j t| dd}|  t ddrdndd
}t|}|t}|  tt|t	r4|nt
| |V  |  |  |  d S )NT)targetr   daemon	localhostF)
r|   chroma_server_hostchroma_server_http_portr   r   r   rs   chroma_server_ssl_verifychroma_server_ssl_enabledrx   )Processr   startr   r   instancer   r   
isinstancer   r   stopkillrV   )r   procrB   systemr1   r|   rs   r   r   rx   rv   ctxrm   r5   r6   r^   ,  s.   

z_fastapi_fixture.<locals>.runnt)rl   multiprocessingget_contextr   r   r   tempfileTemporaryDirectorynamecleanupPermissionErrorNotADirectoryErrorrT   )rn   r|   rp   r   rq   rr   r   rs   rt   ru   rv   rw   rx   r   r^   ro   r   r5   r   r6   _fastapi_fixture   sX   
.
r   c                   C   
   t ddS )NFrn   r   r5   r5   r5   r6   r   g     
r   c                   C   s   t dddS )NF'chromadb.api.async_fastapi.AsyncFastAPI)rn   r|   r   r5   r5   r5   r6   async_fastapik  s   r   c                   C   r   )NTr   r   r5   r5   r5   r6   fastapi_persistentr  r   r   c                   C   s   t   tddddS )NFz./servercert.pemz./serverkey.pem)rn   rv   rw   )r`   r   r5   r5   r5   r6   fastapi_sslv  s   r   c                  c   s    d} d}t dr"t dddd }tt dddd } td| |d	d
}t|}|t}t| |	  |V  |
  d S )Ni@  r   CHROMA_SERVER_HOSTra   :r   rb   r   T)r|   r   r   r   )rT   getenvsplitintr   r   r   r   r   r   r   )rm   r   rB   r   r1   r5   r5   r6   basic_http_client  s$   

r   c                  c   j    t jdddd"} | d |   tdd| jddd	D ]}|V  qW d    d S 1 s.w   Y  d S )
Nw	.htpasswdFsuffixdeleteCadmin:$2y$05$e5sRb6NCcSH3YfbIxe1AGu2h5K7OOd982OXKmd8WyQ3DRQ4MvpnZS
;chromadb.auth.basic_authn.BasicAuthenticationServerProvider1chromadb.auth.basic_authn.BasicAuthClientProvideradmin:adminrn   rp   rq   r   r   r   NamedTemporaryFilewritecloser   r   fitemr5   r5   r6   0fastapi_server_basic_auth_valid_cred_single_user  s   

"r   c                  c   s    dddd} t jdddd1}|  D ]\}}|| d	| d
 q|  tdd|jdddD ]}|V  q2W d    d S 1 sCw   Y  d S )Nz<$2y$10$kY9hn.Wlfcj7n1Cnjmy1kuIhEFIVBsfbNWLQ5ahoKmdc2HLA4oP6iz<$2y$10$CymQ63tic/DRj8dD82915eoM4ke3d6RaNKU4dj4IVJlHyea0yeGDSz<$2y$05$e5sRb6NCcSH3YfbIxe1AGu2h5K7OOd982OXKmd8WyQ3DRQ4MvpnZS)useruser2adminr   r   Fr   r   
r   r   r   r   )r   r   r@   r   r   r   r   )credsr   r   credr   r5   r5   r6   3fastapi_server_basic_auth_valid_cred_multiple_users  s&   
"r   c                  c   r   )
Nr   r   Fr   r   r   r   zadmin:admin1r   r   r   r5   r5   r6   &fastapi_server_basic_auth_invalid_cred  s   

"r   c                  c   s    t jddddN} | d |   t jdddd$}|d |  tddd	d
| jd|jdD ]}|V  q2W d    n1 sBw   Y  W d    d S W d    d S 1 sZw   Y  d S )Nr   r   Fr   r   z.authzaL  
roles_mapping:
    admin:
        actions:
            [
                "system:reset",
                "tenant:create_tenant",
                "tenant:get_tenant",
                "db:create_database",
                "db:get_database",
                "db:list_collections",
                "db:create_collection",
                "db:get_or_create_collection",
                "collection:get_collection",
                "collection:delete_collection",
                "collection:update_collection",
                "collection:add",
                "collection:delete",
                "collection:get",
                "collection:query",
                "collection:peek",
                "collection:update",
                "collection:upsert",
                "collection:count",
            ]
users:
- id: admin
  role: admin
    r   r   r   z?chromadb.auth.simple_rbac_authz.SimpleRBACAuthorizationProvider)rn   r   r   rp   rq   rt   ru   r   )server_authn_fileserver_authz_filer   r5   r5   r6   %fastapi_server_basic_authn_rbac_authz  s@   
	"r   c               	   c   sl    t jdddd#} | d |   tddddd	| jd
D ]}|V  qW d    d S 1 s/w   Y  d S )Nr   z.authnFr   z
users:
  - id: admin
    tokens:
      - admin-token
  - id: singleton_user
    tenant: singleton_tenant
    databases:
      - singleton_database
    tokens:
      - singleton-token
Tz1chromadb.auth.token_authn.TokenAuthClientProviderzadmin-tokenz;chromadb.auth.token_authn.TokenAuthenticationServerProvider)rn   rx   r   r   rp   rq   r   r   r5   r5   r6   2fastapi_fixture_admin_and_singleton_tenant_db_user  s"   
"r   c                  c   0    t ddd} t| }|  |V  |  dS )Fixture generator for returning a client configured via environmenet
    variables, intended for externally configured integration tests
    Tr   r   r|   Nr   r   r   r   rB   r   r5   r5   r6   integration&     r   c                  c   r   )r   Tr   r   Nr   r   r5   r5   r6   async_integration3  r   r   c               	   c   s:    t dddddddd} t| }|  |V  |  dS )z>Fixture generator for segment-based API using in-memory Sqlitery   rz   r{   FT)r|   r}   r~   r   r   rn   r   Nr   r   r5   r5   r6   sqlite_fixture@  s   	r   c               
   c   s    t  } tddddddd| jd}t|}|  |V  |  z|   W dS  tt	fyE } zt
jdkr8n|W Y d}~dS d}~ww )z?Fixture generator for segment-based API using persistent Sqlitery   rz   r{   T)r|   r}   r~   r   r   r   rn   ro   r   N)r   r   r   r   r   r   r   r   r   r   rT   )	save_pathrB   r   r   r5   r5   r6   sqlite_persistent_fixtureQ  s2   

r   c               
   c   s<    t ddddddddd} t| }|  |V  |  dS )	z:Fixture generator for system using ephemeral Rust bindings!chromadb.api.rust.RustBindingsAPIrz   r{   FTra   r|   r}   r~   r   r   rn   r   ro   Nr   r   r5   r5   r6   rust_ephemeral_fixturep  s   
r   c               
   c   sF    t  } tddddddd| jd}t|}|  |V  |  dS )z0Fixture generator for system using Rust bindingsr   rz   r{   Tr   N)r   r   r   r   r   r   r   )r   rB   r   r5   r5   r6   rust_persistent_fixture  s    
r   CHROMA_RUST_BINDINGS_TEST_ONLY)paramsrequestc                 c       |   E d H  d S r3   paramr   r5   r5   r6   sqlite     r   c                 c   r   r3   r   r   r5   r5   r6   sqlite_persistent  r   r   c                  C   sd   t ttttg} dtjv r| t | t	 dtjv rtt	g} dtjv r't
g} dtjv r0ttg} | S )NCHROMA_INTEGRATION_TESTCHROMA_INTEGRATION_TEST_ONLYrH   r   )r   r   r   r   r   rT   environappendr   r   r   r   r   fixturesr5   r5   r6   system_fixtures  s    





r  c                  C   s   dd t  D } | S )Nc                 S   s    g | ]}|t tttfvr|qS r5   )r   r   r   r   )r7   fixturer5   r5   r6   
<listcomp>  s    z/system_http_server_fixtures.<locals>.<listcomp>)r  r  r5   r5   r6   system_http_server_fixtures  s   r  c                  C   s   t tg} | S r3   )r   r   r  r5   r5   r6   system_fixtures_auth  s   r  c                  C   
   t g} | S r3   )r   r  r5   r5   r6    system_fixtures_authn_rbac_authz     r	  c                  C   r  r3   )r   r  r5   r5   r6   1system_fixtures_root_and_singleton_tenant_db_user  r
  r  c                  C   r  r3   )r   r  r5   r5   r6   system_fixtures_wrong_auth     r  c                  C   r  r3   )r   r  r5   r5   r6   system_fixtures_ssl  r  r  module)scoper   c                 c   r   r3   r   r   r5   r5   r6   system_wrong_auth     r  c                 c   r   r3   r   r   r5   r5   r6   system_authn_rbac_authz  r  r  c                 c   r   r3   r   r   r5   r5   r6   system_http_server  r  r  c                 c   r   r3   r   r   r5   r5   r6   r        r   c                 c   r   r3   r   r   r5   r5   r6   
system_ssl  r  r  c                 c   r   r3   r   r   r5   r5   r6   system_auth	  r  r  c                   @      e Zd ZdS )AsyncClientCreatorSyncN__name__
__module____qualname__r5   r5   r5   r6   r        r  c                   @   r  )AsyncAdminClientSyncNr  r5   r5   r5   r6   r    r  r  function)r  c                 c   s:    |    | t}t|trt|}|V  d S |V  d S r3   )reset_stater   r   r   r   r   )r   r1   transformedr5   r5   r6   r1     s   



c                   @   s   e Zd ZU dZeed< g Zee ed< defddZ	de
de
d	efd
dZd	efddZde
de
d	efddZd	efddZdS )ClientFactorieszThis allows consuming tests to be parameterized by async/sync versions of the client and papers over the async implementation.
    If you don't need to manually construct clients, use the `client` fixture instead.
    _system_created_clientsr   c                 C   s
   || _ d S r3   )r$  )selfr   r5   r5   r6   __init__-  r   zClientFactories.__init__r   kwargsr2   c                 O   sl   | dd u r| jj|d< | jjjdkr'tttj|i |}| j	| |S t|i |}| j	| |S )NrB   r   )
r=   r$  rB   r|   r
   ClientCreatorr  creater%  r   )r&  r   r(  clientr5   r5   r6   create_client0  s   zClientFactories.create_clientc                 C   sL   | j jjdkrttt| j }| j| |S t	| j }| j| |S Nr   )
r$  rB   r|   r
   r)  r  from_system_asyncr%  r   from_system)r&  r+  r5   r5   r6   create_client_from_system@  s   z)ClientFactories.create_client_from_systemc                 O   s0   | j jjdkrttt|i |S t|i |S r-  )r$  rB   r|   r
   r   r  )r&  r   r(  r5   r5   r6   create_admin_clientO  s
   z#ClientFactories.create_admin_clientc                 C   s,   | j jjdkrttt| j S t| j S r-  )r$  rB   r|   r
   r   r  r/  )r&  r5   r5   r6   create_admin_client_from_systemX  s
   z/ClientFactories.create_admin_client_from_systemN)r  r  r  __doc__r   __annotations__r%  r   r   r'  r   r)  r,  r0  r   r1  r2  r5   r5   r5   r6   r#  $  s   
 	r#  c                 c   sP    |    t| }|V  t|jdkr&|j }|  ~t|jdksd S d S )Nr   )r!  r#  lenr%  popclear_system_cache)r   	factoriesr+  r5   r5   r6   client_factoriesb  s   
r9  c                 c   sd    |    | jjdkr ttt| }|  |V  |  d S t	
| }|  |V  |  d S r-  )r!  rB   r|   r
   r   r  r.  r4   r7  r)  r/  )r   r+  r5   r5   r6   r+  o  s   
r+  c                 c   sT    |    | jjdkrttt| }|V  |  d S t	| }|V  |  d S r-  )
r!  rB   r|   r
   r   r  r.  r7  r)  r/  )r  r+  r5   r5   r6   http_client  s   
r:  c                 c   s&    |    t| }|V  |  d S r3   )r!  r)  r/  r7  )r  r+  r5   r5   r6   
client_ssl  s
   
r;  c                 c       |    | t}|V  d S r3   r!  r   r   )r  r1   r5   r5   r6   api_wrong_cred     

r>  c                 c   r<  r3   r=  )r  r1   r5   r5   r6   api_with_authn_rbac_authz  r?  r@  c                 c   s"    | }|   |t}|V  d S r3   r=  )r  _sysr1   r5   r5   r6   api_with_server_auth  s
   

rB  c                   @   s>   e Zd Zdededee dedee	e e	e
 f f
ddZdS )	
ProducerFnproducercollection_id
embeddingsnr2   c                 C   s   d S r3   r5   )r&  rD  rE  rF  rG  r5   r5   r6   __call__  s   zProducerFn.__call__N)r  r  r  r   r   r   r   r   r   r   r   rH  r5   r5   r5   r6   rC    s    rC  rD  rE  rF  rG  c           	      C   sF   g }g }t |D ]}t|}| ||}|| || q||fS r3   )rangenextsubmit_embeddingr   )	rD  rE  rF  rG  submitted_embeddingsseq_ids_r   seq_idr5   r5   r6   produce_n_single  s   
rP  c                 C   s<   g }g }t |D ]}t|}|| q| ||}||fS r3   )rI  rJ  r   submit_embeddings)rD  rE  rF  rG  rL  rM  rN  r   r5   r5   r6   produce_n_batch  s   rR  c                   C   s   t tgS r3   )rP  rR  r5   r5   r5   r6   produce_fn_fixtures  s   rS  c                 c   s    | j V  d S r3   r   r   r5   r5   r6   produce_fns  s   rT  c                 C   s
   dt _d S )NT)r   _called_from_test)configr5   r5   r6   pytest_configure  r   rW  c                 C   s   |   jdu S )ziReturns True if the client is in-process (a SQLite client), False if it's out-of-process (a HTTP client).N)get_settingsr   )r+  r5   r5   r6   is_client_in_process  s   rY  T)autouse)NNNc                 c   s4    | j j}td|  dV  td|  dS )z2Automatically logs the start and end of each test.zStarting test: NzFinished test: )noder   loggerdebug)r   	test_namer5   r5   r6   	log_tests  s
   r_  c                  C   s   dt dtfdd} | S )z"Return mock embeddings for testinginputr2   c                 S   s   dd | D S )Nc                 S   s    g | ]}t jg d t jdqS )g?g?g333333?)dtype)nparrayfloat32)r7   rN  r5   r5   r6   r    s     z=mock_embeddings.<locals>._mock_embeddings.<locals>.<listcomp>r5   )r`  r5   r5   r6   _mock_embeddings  s   z)mock_embeddings.<locals>._mock_embeddingsr    )rf  r5   r5   r6   mock_embeddings  s   rg  monkeypatchc                 C   s   t  t  t  t  t  t  t  t  t  t  t  d}| tdttjfi | t  t  t  t  t  t  d}t  }tg dg|j_tg dg|j	_|t  |f|d j
_| D ]\}}| j||dd q[| S )zMock common dependencies)PILtorchopenaicoheresentence_transformersollamaInstructorEmbeddingvoyageaitext2vec	open_clipboto3modules)z	PIL.Imagez)sentence_transformers.SentenceTransformerzollama.ClientzInstructorEmbedding.INSTRUCTORzvoyageai.Clientztext2vec.SentenceModelra  rr  F)raising)r   setattrsysdictrt  rc  rd  encode_textreturn_valueencode_imagecreate_model_and_transformsr@   )rh  mock_modulesmock_attributes
mock_modelrU   mockr5   r5   r6   mock_common_deps	  s<   
r  )r2   N)FNNNNNNNNNF)r   )Fr   NNNNNNNNNNF)r   rT   rc   r]   r   r   typingr   r   r   r   r   r   r   r	   r
   uuidr   rA   rL   r   httpxr   typing_extensionsr   chromadb.api.async_fastapir   chromadb.api.fastapir   chromadb.server.fastapir   chromadb.apir   r   r   chromadb.configr   r   chromadb.db.mixinsr   chromadb.ingestr   chromadb.typesr   r   chromadb.api.clientr   r)  r   chromadb.api.async_clientr   r   AsyncClientCreatorchromadb.utils.async_to_syncr   loggingrw  numpyrc  unittest.mockr   r   chromadb.api.typesr!   r"   	getLoggerr  r\  VALID_PRESETSr   r>   
ValueErrorrB   register_profileHealthCheckdata_too_largelarge_base_examplefunction_scoped_fixture	Verbosityverboseget_profileload_profiler4   rG   rO   COMPACTION_SLEEPMarkDecoratorrP   r`   r   rl   boolstrr   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r  r   FixtureRequestr   r   r  r  r  r	  r  r  r  r  r  r  r   r  r  r  r  r1   r#  r9  r+  r:  r;  r>  r@  rB  rC  rP  rR  rS  rT  rW  rY  r_  rg  r  r5   r5   r5   r6   <module>   sH   ,


+
		

>	

k	
9
  $$$

$$   

>









	