a
    ҏip                     @   s  U d dl Z d dlZd dl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mZmZmZ d dlmZmZmZ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" d dl#m$Z$m%Z%m&Z& d d	l'm(Z(m)Z) ej*d
krd dlm+Z+ nd dl,m+Z+ er$d dl-m.Z. d dl#m/Z/ d dl0m1Z1 edZ2G dd dZ3G dd dZ4da5e6e7d< e6dddZ8e6ddddZ9e6ee6ee6 f e6dddZ:d3e6ee6ee6 f e;e6dd d!Z<d4ee6ee6 f e;e6d"d#d$Z=d5ee6ee6 f e;e6d"d%d&Z>d6ee6ee6 f e;e6d"d'd(Z?d7ee6ee6 f e;e6d"d)d*Z@d8ee6ee6 f e;e6d"d+d,ZAe;e6d-d.d/ZBd9ee;e;e;e;eCee6ee6 f e;e;e;e6d0d1d2ZDdS ):    N)ChainMap)TYPE_CHECKINGAny	AwaitableCallableDictListOptionalPatternTupleTypeVarUnion)AriaRoleFilePayload	FloatRectFrameExpectOptionsFrameExpectResultPosition)filter_none)ElementHandle)ErrorKeyboardModifierMouseButtonlocals_to_paramsmonotonic_timeto_impl)Serializableparse_valueserialize_argument)escape_for_attribute_selectorescape_for_text_selector)      )Literal)Frame)JSHandle)PageTc                   @   s  e Zd Zddeeeee f eeee f d d ddddZedddZdee	e
gee f e
ed	d
dZeddddZde
ee dddZdee
eeeddddZdee ee
eee
eeedd
ddZdee ee
ee
eeedd	ddZdeee
ddddZdeee
eddd Z deeed!d"d#Z!deee
d$dd%d&Z"dee
eedd'd(d)Z#de
eedd*d+d,Z$deed f eeee f eeee f d d d d-d.d/Z%deeee f ed d0d1d2Z&deeee f ed d0d3d4Z'deeee f ed d0d5d6Z(de)eeeeeeeee f eeed d7d8d9Z*eeee f d d:d;d<Z+deeee f ed d0d=d>Z,deeee f ed d0d?d@Z-edAdBdCdDZ.de
e	ddEdFZ/ee	 ddGdHZ0ed ddIdJZ1ed ddKdLZ2ed dMdNdOZ3deeee f eeee f d d d dPdQdRZ4d d dSdTdUZ5d d dSdVdWZ6de
dddXdYZ7de
dddZd[Z8ed  dd\d]Z9edd^d_Z:dd eee
eeedd`dadbZ;dee
ee dcdddeZ<dee ee
eeeddfdgdhZ=de
eddidjZ>de
eddkdlZ?de
eddmdnZ@de
eddodpZAde
eddqdrZBde
eddsdtZCde
eddudvZDde
eddwdxZEde
eddydzZFdee
e
edd{d|d}ZGde
eHd~ eeeIjJf eeeHd eHd eHd ed  eeKdddZLde
ddddZMdeeee f eeee f eeee f eded f e
eeee dddZNdee
ddddZOdeeeIjJePeeeeIjJf  eeP f e
eddddZQdee ee
eeeddddZRde
ee dddZSdee
e
eddddZTdee
e
eddddZUdee
eeeddddZVee dddZWee dddZXde
eHd ddddZYdeee
eeeddddZZee[e\dddZ]ddddZ^dS )LocatorNr$   )frameselectorhas_texthas_not_texthashas_notreturnc                 C   s   || _ || _|j| _|jj| _|r>|  jdt|dd 7  _|rr|j |krTtd|  jdtj|jdd 7  _|r|  jdt|dd 7  _|r|}|j |krtd|  jd	t|j 7  _d S )
Nz >> internal:has-text=Fexactz2Inner "has" locator must belong to the same frame.z >> internal:has=)ensure_asciiz >> internal:has-not-text=z6Inner "has_not" locator must belong to the same frame.z >> internal:has-not=)	_frame	_selector_loop_connection_dispatcher_fiberr    r   jsondumps)selfr)   r*   r+   r,   r-   r.   locator r<   I/home/Claro/venv/lib/python3.9/site-packages/playwright/_impl/_locator.py__init__G   s&    	


zLocator.__init__r/   c                 C   s   d| j d| jdS )Nz<Locator frame=
 selector=>)r3   r4   r:   r<   r<   r=   __repr__h   s    zLocator.__repr__)tasktimeoutr/   c                    s   | j jj|}|rt | nd}| j|dI d H }|sJtd| j dz.|||r^|t  ndI d H W | I d H  S | I d H  0 d S )Nr   rE   zCould not resolve z to DOM Element)	r3   pageZ_timeout_settingsrE   r   element_handler   r4   Zdispose)r:   rD   rE   deadlinehandler<   r<   r=   _with_elementk   s    
zLocator._with_elementr&   c                 C   s   | j jS N)r3   rG   rB   r<   r<   r=   rG   }   s    zLocator.page)rE   r/   c                    s   |  dd |I d H S )Nc                 S   s   |   S rL   )bounding_boxh_r<   r<   r=   <lambda>       z&Locator.bounding_box.<locals>.<lambda>rK   r:   rE   r<   r<   r=   rM      s    zLocator.bounding_box)positionrE   forcenoWaitAftertrialr/   c                    s*   t t }| jj| jfddi|I d H S NstrictT)r   localsr3   checkr4   r:   rU   rE   rV   rW   rX   paramsr<   r<   r=   r\      s    
zLocator.check)
	modifiersrU   delaybutton
clickCountrE   rV   rW   rX   r/   c
                    s*   t t }
| jj| jfddi|
I d H S rY   )r   r[   r3   clickr4   )r:   r_   rU   r`   ra   rb   rE   rV   rW   rX   r^   r<   r<   r=   rc      s    
zLocator.click)	r_   rU   r`   ra   rE   rV   rW   rX   r/   c	           
         s*   t t }	| jj| jfddi|	I d H S rY   )r   r[   r3   dblclickr4   )
r:   r_   rU   r`   ra   rE   rV   rW   rX   r^   r<   r<   r=   rd      s    
zLocator.dblclick)type	eventInitrE   r/   c                    s*   t t }| jj| jfddi|I d H S rY   )r   r[   r3   dispatch_eventr4   )r:   re   rf   rE   r^   r<   r<   r=   rg      s    
zLocator.dispatch_event)
expressionargrE   r/   c                    s   |   fdd|I d H S )Nc                    s   |   S rL   )evaluaterN   ri   rh   r<   r=   rQ      rR   z"Locator.evaluate.<locals>.<lambda>rS   r:   rh   ri   rE   r<   rk   r=   rj      s    zLocator.evaluate)rh   ri   r/   c                    s&   t t }| jj| jfi |I d H S rL   )r   r[   r3   eval_on_selector_allr4   )r:   rh   ri   r^   r<   r<   r=   evaluate_all   s    
zLocator.evaluate_allr%   c                    s   |   fdd|I d H S )Nc                    s   |   S rL   )evaluate_handlerN   rk   r<   r=   rQ      rR   z)Locator.evaluate_handle.<locals>.<lambda>rS   rl   r<   rk   r=   ro      s    zLocator.evaluate_handle)valuerE   rW   rV   r/   c                    s*   t t }| jj| jfddi|I d H S rY   )r   r[   r3   fillr4   )r:   rp   rE   rW   rV   r^   r<   r<   r=   rq      s    
zLocator.fill)rE   rW   rV   r/   c                    s   | j d|||dI d H  d S )N )rE   rW   rV   )rq   )r:   rE   rW   rV   r<   r<   r=   clear   s    zLocator.clearselector_or_locatorr+   r,   r-   r.   r/   c                 C   sr   t |tr,t| j| j d| ||||dS t|}|j| jkrHtdt| j| j dt|j ||||dS )N >> )r+   r,   r.   r-   'Locators must belong to the same frame.z >> internal:chain=)	
isinstancestrr(   r3   r4   r   r   r8   r9   r:   ru   r+   r,   r-   r.   r<   r<   r=   r;      s(    
zLocator.locatortextr1   r/   c                 C   s   |  t||dS Nr0   r;   get_by_alt_text_selectorr:   r|   r1   r<   r<   r=   get_by_alt_text   s    zLocator.get_by_alt_textc                 C   s   |  t||dS r}   r;   get_by_label_selectorr   r<   r<   r=   get_by_label   s    zLocator.get_by_labelc                 C   s   |  t||dS r}   r;   get_by_placeholder_selectorr   r<   r<   r=   get_by_placeholder  s    zLocator.get_by_placeholderrolecheckeddisabledexpandedincludeHiddenlevelnamepressedselectedr1   r/   c                 C   s"   |  t|||||||||	|
d
S N)	r   r   r   r   r   r   r   r   r1   r;   get_by_role_selectorr:   r   r   r   r   r   r   r   r   r   r1   r<   r<   r=   get_by_role	  s    zLocator.get_by_roletestIdr/   c                 C   s   |  tt |S rL   r;   get_by_test_id_selectortest_id_attribute_namer:   r   r<   r<   r=   get_by_test_id%  s    zLocator.get_by_test_idc                 C   s   |  t||dS r}   r;   get_by_text_selectorr   r<   r<   r=   get_by_text(  s    zLocator.get_by_textc                 C   s   |  t||dS r}   r;   get_by_title_selectorr   r<   r<   r=   get_by_title-  s    zLocator.get_by_titleFrameLocatorr*   r/   c                 C   s   t | j| jd | S )Nrv   )r   r3   r4   r:   r*   r<   r<   r=   frame_locator2  s    zLocator.frame_locatorc                    s8   t t }| jj| jfddd|I d H }|s4J |S )NTattached)rZ   state)r   r[   r3   wait_for_selectorr4   )r:   rE   r^   rJ   r<   r<   r=   rH   5  s    
zLocator.element_handlec                    s   | j | jI d H S rL   )r3   Zquery_selector_allr4   rB   r<   r<   r=   element_handles@  s    zLocator.element_handlesc                 C   s   t | j| j dS Nz	 >> nth=0r(   r3   r4   rB   r<   r<   r=   firstC  s    zLocator.firstc                 C   s   t | j| j dS Nz
 >> nth=-1r   rB   r<   r<   r=   lastG  s    zLocator.lastindexr/   c                 C   s   t | j| j d| S Nz >> nth=r   r:   r   r<   r<   r=   nthK  s    zLocator.nth)r+   r,   r-   r.   r/   c                 C   s   t | j| j||||dS )Nr+   r,   r-   r.   r   )r:   r+   r,   r-   r.   r<   r<   r=   filterN  s    zLocator.filter)r;   r/   c                 C   s2   |j | j krtdt| j | jd t|j S )Nrw   z >> internal:or=r3   r   r(   r4   r8   r9   r:   r;   r<   r<   r=   or_^  s    zLocator.or_c                 C   s2   |j | j krtdt| j | jd t|j S )Nrw   z >> internal:and=r   r   r<   r<   r=   and_f  s    zLocator.and_c                    s*   t t }| jj| jfddi|I d H S rY   )r   r[   r3   focusr4   r:   rE   r^   r<   r<   r=   r   n  s    
zLocator.focusc                    s,   | j jd| jddtt I d H  d S )NblurT)r*   rZ   )r3   _channelsendr4   r   r[   rT   r<   r<   r=   r   r  s    zLocator.blurc                    s0   g }t |  I d H D ]}|| | q|S rL   )rangecountappendr   )r:   resultr   r<   r<   r=   all|  s    zLocator.allc                    s   | j | jI d H S rL   )r3   Z_query_countr4   rB   r<   r<   r=   r     s    zLocator.count)targetrV   rW   rE   rX   sourcePositiontargetPositionr/   c           	         s4   t t }|d= | jj| j|jfddi|I d H S )Nr   rZ   T)r   r[   r3   Zdrag_and_dropr4   )	r:   r   rV   rW   rE   rX   r   r   r^   r<   r<   r=   drag_to  s    

zLocator.drag_to)r   rE   r/   c                    s*   t t }| jj| jfddi|I d H S rY   )r   r[   r3   get_attributer4   )r:   r   rE   r^   r<   r<   r=   r     s    
zLocator.get_attribute)r_   rU   rE   rW   rV   rX   r/   c                    s*   t t }| jj| jfddi|I d H S rY   )r   r[   r3   hoverr4   )r:   r_   rU   rE   rW   rV   rX   r^   r<   r<   r=   r     s    	
zLocator.hoverc                    s*   t t }| jj| jfddi|I d H S rY   )r   r[   r3   
inner_htmlr4   r   r<   r<   r=   r     s    
zLocator.inner_htmlc                    s*   t t }| jj| jfddi|I d H S rY   )r   r[   r3   
inner_textr4   r   r<   r<   r=   r     s    
zLocator.inner_textc                    s*   t t }| jj| jfddi|I d H S rY   )r   r[   r3   input_valuer4   r   r<   r<   r=   r     s    
zLocator.input_valuec                    s*   t t }| jj| jfddi|I d H S rY   )r   r[   r3   
is_checkedr4   r   r<   r<   r=   r     s    
zLocator.is_checkedc                    s*   t t }| jj| jfddi|I d H S rY   )r   r[   r3   is_disabledr4   r   r<   r<   r=   r     s    
zLocator.is_disabledc                    s*   t t }| jj| jfddi|I d H S rY   r   r[   r3   is_editabler4   r   r<   r<   r=   r     s    
zLocator.is_editablec                    s*   t t }| jj| jfddi|I d H S rY   r   r   r<   r<   r=   
is_enabled  s    
zLocator.is_enabledc                    s*   t t }| jj| jfddi|I d H S rY   )r   r[   r3   	is_hiddenr4   r   r<   r<   r=   r     s    
zLocator.is_hiddenc                    s*   t t }| jj| jfddi|I d H S rY   )r   r[   r3   
is_visibler4   r   r<   r<   r=   r     s    
zLocator.is_visible)keyr`   rE   rW   r/   c                    s*   t t }| jj| jfddi|I d H S rY   )r   r[   r3   pressr4   )r:   r   r`   rE   rW   r^   r<   r<   r=   r     s    
zLocator.press)ZjpegZpng)Zallowr   )hideinitial)cssZdevice)rE   re   pathqualityomitBackground
animationscaretscalemask
mask_colorr/   c                    s"   t t  |  fddI d H S )Nc                    s   | j f i td|i S NrE   )
screenshotr   rO   rE   r^   r<   r=   rQ     s   z$Locator.screenshot.<locals>.<lambda>r   r[   rK   )r:   rE   re   r   r   r   r   r   r   r   r   r<   r   r=   r     s    

zLocator.screenshotc                    s   |  dd |I d H S )Nc                 S   s   | j |dS )NrF   )scroll_into_view_if_neededr   r<   r<   r=   rQ     rR   z4Locator.scroll_into_view_if_needed.<locals>.<lambda>rS   rT   r<   r<   r=   r     s    z"Locator.scroll_into_view_if_neededr   )rp   r   labelelementrE   rW   rV   r/   c           	         s*   t t }| jj| jfddi|I d H S rY   )r   r[   r3   select_optionr4   )	r:   rp   r   r   r   rE   rW   rV   r^   r<   r<   r=   r      s    

zLocator.select_option)rV   rE   r/   c                    s$   t t  |  fdd|I d H S )Nc                    s   | j f i td|i S r   )select_textr   r   r   r<   r=   rQ   4  s   z%Locator.select_text.<locals>.<lambda>r   )r:   rV   rE   r<   r   r=   r   1  s
    

zLocator.select_text)filesrE   rW   r/   c                    s*   t t }| jj| jfddi|I d H S rY   )r   r[   r3   set_input_filesr4   )r:   r   rE   rW   r^   r<   r<   r=   r   :  s    
zLocator.set_input_files)r_   rU   rE   rV   rW   rX   r/   c                    s*   t t }| jj| jfddi|I d H S rY   )r   r[   r3   tapr4   )r:   r_   rU   rE   rV   rW   rX   r^   r<   r<   r=   r   M  s    	
zLocator.tapc                    s*   t t }| jj| jfddi|I d H S rY   )r   r[   r3   text_contentr4   r   r<   r<   r=   r   ]  s    
zLocator.text_content)r|   r`   rE   rW   r/   c                    s*   t t }| jj| jfddi|I d H S rY   )r   r[   r3   re   r4   )r:   r|   r`   rE   rW   r^   r<   r<   r=   re   e  s    
zLocator.typec                    s   | j ||||dI d H  d S )N)r`   rE   rW   )re   )r:   r|   r`   rE   rW   r<   r<   r=   press_sequentiallys  s    zLocator.press_sequentiallyc                    s*   t t }| jj| jfddi|I d H S rY   )r   r[   r3   uncheckr4   r]   r<   r<   r=   r   |  s    
zLocator.uncheckc                    s   | j | jdI d H S )Nzee => ee.map(e => e.innerText)r3   rm   r4   rB   r<   r<   r=   all_inner_texts  s    zLocator.all_inner_textsc                    s   | j | jdI d H S )Nz&ee => ee.map(e => e.textContent || '')r   rB   r<   r<   r=   all_text_contents  s    zLocator.all_text_contents)r   ZdetachedhiddenZvisible)rE   r   r/   c                    s    | j j| jd||dI d H  d S )NT)rZ   rE   r   )r3   r   r4   )r:   rE   r   r<   r<   r=   wait_for  s    
zLocator.wait_for)r   rU   rE   rV   rW   rX   r/   c                    s>   |r | j |||||dI d H  n| j|||||dI d H  d S )N)rU   rE   rV   rW   rX   )r\   r   )r:   r   rU   rE   rV   rW   rX   r<   r<   r=   set_checked  s    	zLocator.set_checked)rh   optionsr/   c                    s\   d|v rt |d |d< | jjd| j|dt|I d H }|drXt|d |d< |S )NZexpectedValueexpect)r*   rh   Zreceived)r   r3   r   Zsend_return_as_dictr4   r   getr   )r:   rh   r   r   r<   r<   r=   _expect  s    

zLocator._expectc                    s   | j | jI d H  d S rL   )r3   Z
_highlightr4   rB   r<   r<   r=   	highlight  s    zLocator.highlight)NNNN)N)N)NNNNN)	NNNNNNNNN)NNNNNNNN)NN)NN)N)NN)NNN)NNN)NNNN)N)N)N)	NNNNNNNNN)N)N)N)NNNN)N)N)NNNNNN)N)NNNNNN)N)N)N)N)N)N)N)N)N)NNN)
NNNNNNNNNN)N)NNNNNNN)NN)NN)NNNNNN)N)NNN)NNN)NNNNN)NN)NNNNN)___name__
__module____qualname__ry   r   r
   r>   rC   r   r   floatr   r'   rK   propertyrG   r	   r   rM   r   boolr\   r   r   r   intrc   rd   r   rg   r   r   rj   rn   ro   rq   rs   r;   r   r   r   r   r   r   r   r   r   rH   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#   pathlibPathbytesr   r   r   r   r   r   r   r   re   r   r   r   r   r   r   r   r   r   r   r<   r<   r<   r=   r(   F   s      !                         
  
          
                   
      
                                              		       r(   c                   @   s  e Zd ZdeddddZd(edef eeee f eeee f ddeddd	Zd)eeee f e	dd
ddZ
d*eeee f e	dd
ddZd+eeee f e	dd
ddZd,ee	e	e	e	eeeee f e	e	e	ddddZeeee f ddddZd-eeee f e	dd
ddZd.eeee f e	dd
ddZed dddZed ddd Zed dd!d"Zed d#d$d%Zedd&d'ZdS )/r   r$   N)r)   frame_selectorr/   c                 C   s"   || _ |j| _|jj| _|| _d S rL   )r3   r5   r6   r7   _frame_selector)r:   r)   r  r<   r<   r=   r>     s    
zFrameLocator.__init__r(   rt   c                 C   sl   t |tr,t| j| j d| ||||dS t|}|j| jkrHtdt| j| j d|j ||||dS )N$ >> internal:control=enter-frame >> r   rw   )rx   ry   r(   r3   r	  r   
ValueErrorr4   rz   r<   r<   r=   r;     s(    
zFrameLocator.locatorr{   c                 C   s   |  t||dS r}   r~   r   r<   r<   r=   r     s    zFrameLocator.get_by_alt_textc                 C   s   |  t||dS r}   r   r   r<   r<   r=   r     s    zFrameLocator.get_by_labelc                 C   s   |  t||dS r}   r   r   r<   r<   r=   r     s    zFrameLocator.get_by_placeholderr   c                 C   s"   |  t|||||||||	|
d
S r   r   r   r<   r<   r=   r     s    zFrameLocator.get_by_roler   c                 C   s   |  tt |S rL   r   r   r<   r<   r=   r      s    zFrameLocator.get_by_test_idc                 C   s   |  t||dS r}   r   r   r<   r<   r=   r   #  s    zFrameLocator.get_by_textc                 C   s   |  t||dS r}   r   r   r<   r<   r=   r   (  s    zFrameLocator.get_by_titler   c                 C   s   t | j| j d| S )Nr
  r   r3   r	  r   r<   r<   r=   r   -  s    zFrameLocator.frame_locatorr?   c                 C   s   t | j| j dS r   r  rB   r<   r<   r=   r   3  s    zFrameLocator.firstc                 C   s   t | j| j dS r   r  rB   r<   r<   r=   r   7  s    zFrameLocator.lastr   c                 C   s   t | j| j d| S r   r  r   r<   r<   r=   r   ;  s    zFrameLocator.nthc                 C   s   d| j d| jdS )Nz<FrameLocator frame=r@   rA   )r3   r	  rB   r<   r<   r=   rC   >  s    zFrameLocator.__repr__)NNNN)N)N)N)	NNNNNNNNN)N)N)r   r   r   ry   r>   r   r
   r(   r;   r  r   r   r   r   r  r   r   r   r   r   r  r   r   r   rC   r<   r<   r<   r=   r     s   	    
              r   zdata-testid_test_id_attribute_namer?   c                   C   s   t S rL   r  r<   r<   r<   r=   r   E  s    r   )attribute_namer/   c                 C   s   | a d S rL   r  )r  r<   r<   r=   set_test_id_attribute_nameI  s    r  )r   test_idr/   c                 C   s   d|  dt |d dS )Nzinternal:testid=[=T]r   )r   r  r<   r<   r=   r   N  s    r   )	attr_namer|   r1   r/   c                 C   s   d|  dt ||d dS )Nzinternal:attr=[r  r0   r  r  )r  r|   r1   r<   r<   r=   get_by_attribute_text_selectorT  s    r  r{   c                 C   s   dt | |d S )Nzinternal:label=r0   r    r|   r1   r<   r<   r=   r   Z  s    r   c                 C   s   t d| |dS )NZaltr0   r  r  r<   r<   r=   r   ^  s    r   c                 C   s   t d| |dS )Ntitler0   r  r  r<   r<   r=   r   b  s    r   c                 C   s   t d| |dS )Nplaceholderr0   r  r  r<   r<   r=   r   f  s    r   c                 C   s   dt | |d S )Nzinternal:text=r0   r  r  r<   r<   r=   r   l  s    r   )rp   r/   c                 C   s   | rdS dS )Ntruefalser<   )rp   r<   r<   r=   bool_to_js_boolp  s    r  r   c
                 C   s   g }
|d ur|
 dt|f |d ur8|
 dt|f |d urR|
 dt|f |d url|
 dt|f |d ur|
 dt|f |d ur|
 dt|f |d ur|
 dt||	df |d ur|
 d	t|f d
dd |
D }d|  | S )Nr   r   r   r   zinclude-hiddenr   r   r0   r   rr   c                 S   s&   g | ]}d |d  d|d  dqS )[r   r     r  r<   ).0tr<   r<   r=   
<listcomp>  rR   z(get_by_role_selector.<locals>.<listcomp>zinternal:role=)r   r  ry   r   join)r   r   r   r   r   r   r   r   r   r1   propsZ	props_strr<   r<   r=   r   t  s.    
r   )N)N)N)N)N)N)	NNNNNNNNN)Er8   r  syscollectionsr   typingr   r   r   r   r   r   r	   r
   r   r   r   Z playwright._impl._api_structuresr   r   r   r   r   r   Zplaywright._impl._connectionr   Z playwright._impl._element_handler   Zplaywright._impl._helperr   r   r   r   r   r   Zplaywright._impl._js_handler   r   r   Zplaywright._impl._str_utilsr   r    version_infor#   Ztyping_extensionsZplaywright._impl._framer$   r%   Zplaywright._impl._pager&   r'   r(   r   r  ry   __annotations__r   r  r   r  r  r   r   r   r   r   r  r  r   r<   r<   r<   r=   <module>   s   
4  
     q               