
    UgS                     $   d Z ddl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
mZ ddlZddlZd Z G d d          Z G d	 d
e          Z edg d          Z G d de          ZddZd ZddZ G d de          Z G d de          ZdS )z=Extract reference documentation from the NumPy source tree.

    N)warn)
namedtuple)CallableMappingc                     | r9| d                                          s| d= | r| d                                          | r9| d                                          s| d= | r| d                                          | S )z<Remove leading and trailing blank lines from a list of linesr   strip)ls    T/var/www/surfInsights/venv3-11/lib/python3.11/site-packages/scipy/_lib/_docscrape.pystrip_blank_linesr      s    
 AaDJJLL aD  AaDJJLL 
 AbEKKMM bE  AbEKKMM H    c                   V    e Zd ZdZd Zd Zd Zd Zd Zd Z	d Z
d	 Zd
 ZddZd ZdS )Readerz!A line-based string reader.

    c                     t          |t                    r|| _        n|                    d          | _        |                                  dS )zs
        Parameters
        ----------
        data : str
           String with lines separated by '\n'.

        
N)
isinstancelist_strsplitreset)selfdatas     r   __init__zReader.__init__   sC     dD!! 	)DII

4((DI

r   c                     | j         |         S N)r   r   ns     r   __getitem__zReader.__getitem__,   s    y|r   c                     d| _         d S )Nr   )_lr   s    r   r   zReader.reset/   s    r   c                 l    |                                  s| | j                 }| xj        dz  c_        |S dS )N    )eofr!   )r   outs     r   readzReader.read2   s6    xxzz 	tw-CGGqLGGJ2r   c                 x    | | j         d          D ])}|                                r d S | xj         dz  c_         *d S Nr$   )r!   r
   )r   r   s     r   seek_next_non_empty_linezReader.seek_next_non_empty_line:   sM    dghh 	 	Awwyy 1		 	r   c                 <    | j         t          | j                  k    S r   r!   lenr   r"   s    r   r&   z
Reader.eofA   s    w#di..((r   c                     | j         }| |d          D ]V} ||          r| || j                  c S | xj         dz  c_         |                                 r| || j         dz            c S Wg S r*   )r!   r&   )r   condition_funcstartlines       r   read_to_conditionzReader.read_to_conditionD   s    L 	- 	-D~d## +E$'M****GGqLGGxxzz -E$'!)O,,,,-	r   c                 Z    |                                   d }|                     |          S )Nc                 ,    |                                   S r   r	   r2   s    r   is_emptyz0Reader.read_to_next_empty_line.<locals>.is_emptyQ   s    zz||##r   )r+   r3   )r   r7   s     r   read_to_next_empty_linezReader.read_to_next_empty_lineN   s9    %%'''	$ 	$ 	$ %%h///r   c                 2    d }|                      |          S )Nc                     |                                  o1t          |                                           t          |           k    S r   )r
   r.   lstripr6   s    r   is_unindentedz:Reader.read_to_next_unindented_line.<locals>.is_unindentedW   s0    JJLLFc$++--&8&8CII&EGr   )r3   )r   r<   s     r   read_to_next_unindented_linez#Reader.read_to_next_unindented_lineV   s(    	H 	H 	H%%m444r   r   c                 f    | j         |z   t          | j                  k     r| | j         |z            S dS Nr%   r-   r   s     r   peekzReader.peek[   s1    7Q;TY''!$$2r   c                 \    d                     | j                                                   S r?   )joinr   r
   r"   s    r   r7   zReader.is_emptya   s%    7749%%++----r   N)r   )__name__
__module____qualname____doc__r   r   r   r(   r+   r&   r3   r8   r=   r@   r7    r   r   r   r      s                   ) ) )  0 0 05 5 5
   . . . . .r   r   c                       e Zd Zd ZdS )
ParseErrorc                 X    | j         d         }t          | d          r| d| j        }|S )Nr   	docstring in )argshasattrrK   )r   messages     r   __str__zParseError.__str__f   s9    )A,4%% 	9 88dn88Gr   N)rC   rD   rE   rP   rG   r   r   rI   rI   e   s#            r   rI   	Parameter)nametypedescc                   .   e Zd ZdZi ddddgdg dg dg dg d	g d
g dg dg dg dg dg dg dg dddddi iZi fdZd Zd Zd Zd Z	d Z
d Zd Zd ZdEdZd Zd!Zd"Zd#ez   ez   d$z   ez   d%z   Ze                    d&d'          Ze                    d(d)          Zd*Z ej        d+ez   d,z             Z ej        d-ez   d.z   ez   d/z   d%z   d0z   ez             Zd1Zd2 Zd3 Zd4 Zd5 ZdFd7ZdGd9Z dHd;Z!d< Z"d= Z#d> Z$d? Z%d@ Z&dA Z'dB Z(dIdCZ)dDS )JNumpyDocStringzParses a numpydoc string to an abstract representation

    Instances define a mapping from section title to structured data.

    	Signaturer%   SummaryExtended Summary
ParametersReturnsYieldsReceivesRaisesWarnsOther Parameters
AttributesMethodsSee AlsoNotesWarnings
ReferencesExamplesindexc                    |}t          j        |                              d          }t          |          | _        t          j        | j                  | _        	 | 	                                 d S # t          $ r}||_         d }~ww xY wNr   )textwrapdedentr   r   _doccopydeepcopysections_parsed_data_parserI   rK   )r   rK   configorig_docstringes        r   r   zNumpyDocString.__init__   s    "OI..44T::	9%%	 M$-88	KKMMMMM 	 	 	(AK	s   A3 3
B
=BB
c                     | j         |         S r   )rq   )r   keys     r   r   zNumpyDocString.__getitem__   s     %%r   c                 d    || j         vr|                     d|z  d           d S || j         |<   d S )NzUnknown section %sFerror)rq   _error_location)r   rw   vals      r   __setitem__zNumpyDocString.__setitem__   sH    d'''  !5!;5 IIIII%(Dc"""r   c                 *    t          | j                  S r   )iterrq   r"   s    r   __iter__zNumpyDocString.__iter__   s    D%&&&r   c                 *    t          | j                  S r   )r.   rq   r"   s    r   __len__zNumpyDocString.__len__   s    4$%%%r   c                    | j                                          | j                                         rdS | j                                                                         }|                    d          rdS | j                             d                                          }|                    dt          |          z            p$|                    dt          |          z            S )NF
.. index::Tr$   -=)rm   r+   r&   r@   r
   
startswithr.   )r   l1l2s      r   _is_at_sectionzNumpyDocString._is_at_section   s    	**,,,9==?? 	5Y^^##%%==&& 	4Y^^A$$&&}}SR[))GR]]3s2ww;-G-GGr   c                     d}d}t          |          D ]\  }}|                                r nt          |d d d                   D ]\  }}|                                r n||t          |          |z
           S )Nr   r   )	enumerater
   r.   )r   docijr2   s        r   _stripzNumpyDocString._strip   s     ~~ 	 	GAtzz||  !TTrT++ 	 	GAtzz||  1SXXaZ<  r   c                    | j                                         }|                                 s| j                                         s{| j                             d                                          s|dgz  }|| j                                         z  }|                                 s| j                                         {|S )Nr   r%   )rm   r8   r   r&   r@   r
   )r   sections     r   _read_to_next_sectionz$NumpyDocString._read_to_next_section   s    )3355%%'' 	;	 	;9>>"%%++--  B4ty88:::G	 %%'' 	;	 	; r   c              #     K   | j                                         s|                                 }|d                                         }|                    d          r||dd          fV  n>t          |          dk     r
t          V  n!||                     |dd                    fV  | j                                         d S d S )Nr   ..r$      )rm   r&   r   r
   r   r.   StopIterationr   )r   r   rR   s      r   _read_sectionszNumpyDocString._read_sections   s      )--// 		2--//D7==??Dt$$ 2DHn$$$$TQ#####DKKQRR111111 )--// 		2 		2 		2 		2 		2r   Fc                    t          |          }g }|                                s|                                                                }d|v r!|                    d          d d         \  }}n|rd|}}n|d}}|                                }t          |          }t          |          }|                    t          |||                     |                                |S )N : r   r%   )
r   r&   r(   r
   r   r=   dedent_linesr   appendrQ   )	r   contentsingle_element_is_typerparamsheaderarg_namearg_typerT   s	            r   _parse_param_listz NumpyDocString._parse_param_list   s    7OO%%'' 	?VVXX^^%%F%+\\%%8%8!%<"(() 4)+VhHH)/hH1133D%%D$T**DMM)Hh==>>> %%'' 	?  r   z:(?P<role>\w+):z'`(?P<name>(?:~\w+\.)?[a-zA-Z0-9_\.-]+)`z(?P<name2>[a-zA-Z0-9_\.-]+)(|)rolerolenextrR   namenextz/(?P<description>\s*:(\s+(?P<desc>\S+.*))?)?\s*$z^\s*z\s*z^\s*(?P<allfuncs>z(?P<morefuncs>([,]\s+z)*)z(?P<trailing>[,\.])?r   c                     g } fd}g }|D ]}|                                 s j                            |          }d}|r[|                    d          }|                    d          r1|r/                     d|                    d          |fz  d           |s=|                    d          r(|                    |                                            |rg }|                    d	          }		 |	                                 snm ||	          \  }
}}|                    |
|f           |	|d                                          }	|	r(|	d         dk    r|	dd                                          }	t          t          d|g                    }|                    ||f           t          d|z            |S )z
        func_name : Descriptive text
            continued text
        another_func_name : Descriptive text
        func_name1, func_name2, :meth:`func_name`, func_name3

        c                    j                             |           }|st          d| z            |                    d          }|r|                    d          n|                    d          }|||                                fS )zMatch ':role:`name`' or 'name'.%s is not a item namer   rR   name2)	_func_rgxmatchrI   groupend)textmr   rR   r   s       r   parse_item_namez7NumpyDocString._parse_see_also.<locals>.parse_item_name  s}    $$T**A A !84!?@@@776??D&*@1776???0@0@Dquuww&&r   NrT   trailingzGUnexpected comma or period after function list at index %d of line "%s"Fry    allfuncsTr   ,r$   r   )r
   	_line_rgxr   r   r{   r   r   r   r   filterrI   )r   r   itemsr   restr2   
line_matchdescriptionfuncsr   rR   r   	match_ends   `            r   _parse_see_alsozNumpyDocString._parse_see_also  s    	' 	' 	' 	' 	'  	A 	AD::<< --d33JK %(..v66##J// %K %((03=>>*3M3M37399 $	 ) % % %
  A4??3#7#7 ADJJLL)))) A!''
330::<< ,;OD,A,A)D$	LL$...	

+1133D 0Q3#ABBx~~//0 F4+7788eT]++++ !84!?@@@r   c                 n   d }i }|                     d          }t          |          dk    r- ||d                              d                    d         |d<   |D ]W}|                     d          }t          |          dk    r- ||d                              d                    ||d         <   X|S )	zU
        .. index:: default
           :refguide: something, else, and more

        c                     d | D             S )Nc                 6    g | ]}|                                 S rG   r	   .0ss     r   
<listcomp>zFNumpyDocString._parse_index.<locals>.strip_each_in.<locals>.<listcomp>Q  s     +++!AGGII+++r   rG   )lsts    r   strip_each_inz2NumpyDocString._parse_index.<locals>.strip_each_inP  s    ++s++++r   z::r$   r   r   default:r   )r   r.   )r   r   r   r   r'   r2   s         r   _parse_indexzNumpyDocString._parse_indexJ  s    	, 	, 	, --%%w<<!*]71:+;+;C+@+@AA!DC	N 	A 	AD::c??D4yy1}},}T!W]]3-?-?@@DG
r   c                    |                                  rdS 	 | j                                        }d                    d |D                                                       }t          j        d          }|                    |          r|| d<   |                                  s	 ||| d<   |                                  s|                                 | d<   dS dS )	z%Grab signature (if given) and summaryNTr   c                 6    g | ]}|                                 S rG   r	   r   s     r   r   z1NumpyDocString._parse_summary.<locals>.<listcomp>e  s     #?#?#?!AGGII#?#?#?r   z^([\w., ]+=)?\s*[\w\.]+\(.*\)$rW   rX   rY   )	r   rm   r8   rB   r
   recompiler   r   )r   summarysummary_strcompileds       r   _parse_summaryzNumpyDocString._parse_summary]  s       	F	i7799G((#?#?w#?#?#?@@FFHHKz"CDDH~~k** $/[!**,, %DO""$$ 	D'+'A'A'C'CD#$$$	D 	Dr   c                 B   | j                                          |                                  t          |                                           }d |D             }d|v }d|v }|r|rd}t          |          |sd|v rd}t          |          |D ]\  }}|                    d          sad |                    d	          D             }d	                    |          }| 	                    |          r| 
                    d
|z             |dv r|                     |          | |<   |dv r|                     |d          | |<   |                    d          r|                     ||          | d<   |dk    r|                     |          | d<   || |<   d S )Nc                     h | ]\  }}|S rG   rG   )r   r   r   s      r   	<setcomp>z(NumpyDocString._parse.<locals>.<setcomp>x  s    BBB%5WgBBBr   r[   r\   z5Docstring contains both a Returns and Yields section.r]   z5Docstring contains a Receives section but not Yields.r   c              3   >   K   | ]}|                                 V  d S r   )
capitalizer   s     r   	<genexpr>z(NumpyDocString._parse.<locals>.<genexpr>  s*      FFa1<<>>FFFFFFr   r   zThe section %s appears twice)rZ   r`   ra   rb   )r[   r\   r^   r_   r]   T)r   r   rh   rc   )rm   r   r   r   r   
ValueErrorr   r   rB   getr{   r   r   r   )r   rp   section_nameshas_returns
has_yieldsmsgr   r   s           r   rr   zNumpyDocString._parses  s
   	++--..BBBBB=0.
 	": 	"ICS//! 	"jM99ICS//!"* 	( 	(Wg%%d++ 4FF7==3E3EFFF((7++88G$$ 4(()G+2*3 4 4 4  & & & $ 6 6w ? ?W ) ) ) $ 6 6D !7 !: !:W##L11 ( $ 1 1'7 C CWJ&&#'#7#7#@#@Z   'W)	( 	(r   Tc                     t          | d          r>	 t          j        | j                  }n# t          $ r d }Y nw xY w|d| j         d| dz   }|rt          |          t          |d           d S )N_objz in the docstring of rL   .   )
stacklevel)rN   inspectgetsourcefiler   	TypeErrorr   r   )r   r   rz   filenames       r   r{   zNumpyDocString._error_location  s    4   	M "0;;       KKKKKKLC 	$S//!######s   , ;;r   c                 *    |t          |          |z  gS r   r.   )r   rR   symbols      r   _str_headerzNumpyDocString._str_header  s    c$ii&''r      c                 ,    g }|D ]}|d|z  |z   gz  }|S )Nr   rG   )r   r   indentr'   r2   s        r   _str_indentzNumpyDocString._str_indent  s3     	' 	'DCJ%&&CC
r   c                 Z    | d         r!| d                              dd          gdgz   S dgS )NrW   *z\*r%   )replacer"   s    r   _str_signaturezNumpyDocString._str_signature  s;     	%--c599:bTAA4Kr   c                 .    | d         r| d         dgz   S g S )NrX   r%   rG   r"   s    r   _str_summaryzNumpyDocString._str_summary  s$    	? 		?bT))Ir   c                 .    | d         r| d         dgz   S g S )NrY   r%   rG   r"   s    r   _str_extended_summaryz$NumpyDocString._str_extended_summary  s(    "# 	*+rd22Ir   c                    g }| |         r||                      |          z  }| |         D ]}g }|j        r|                    |j                   |j        r|                    |j                   |d                    |          gz  }|j        rId                    |j                                                  r||                     |j                  z  }|dgz  }|S )Nr   r%   )r   rR   r   rS   rB   rT   r
   r   )r   rR   r'   parampartss        r   _str_param_listzNumpyDocString._str_param_list  s    : 	4##D)))Cd 8 8: -LL,,,: -LL,,,

5))**: 8"''%*"5"5";";"="= 84++EJ777CB4KC
r   c                 l    g }| |         r)||                      |          z  }|| |         z  }|dgz  }|S r?   )r   )r   rR   r'   s      r   _str_sectionzNumpyDocString._str_section  sI    : 	4##D)))C4:CB4KC
r   c                    | d         sg S g }||                      d          z  }|dgz  }d}| d         D ]\  }}t          |t                    sJ g }|D ]7\  }}|r
d| d| d}	n|r
d| d| d}	nd|z  }	|                    |	           8d                    |          }	||	gz  }|r/||                     d	                    |          g          z  }d}d
}||                     | j        g          z  }|r|dgz  }|dgz  }|S )Nrc   r%   Tr   z:``z`%s`_, r   F)r   r   r   r   rB   r   empty_description)
r   	func_roler'   last_had_descr   rT   linksfuncr   links
             r   _str_see_alsozNumpyDocString._str_see_also  s   J 	It
+++t
+ 	B 	BKE4eT*****E# # #
d *.t..t...DD *3y33D333DD"T>DT""""99U##DD6MC Bt''$(8999 $ %t'')?(@AAA 	B4KCt
r   c                    | d         }g }d}|                     dd          }|rd}|d|z  gz  }|                                D ];\  }}|dk    rd}|d                    |d                    |                    gz  }<|r|S dS )	Nrh   Fr   r%   Tz.. index:: %sz
   :{}: {}r  )r   r   formatrB   )r   idxr'   output_indexdefault_indexr   
referencess          r   
_str_indexzNumpyDocString._str_index  s    7m	2.. 	 L-/00#&99;; 	I 	IGZ)##LL'':1F1FGGHHCC 	J2r   c                    g }||                                  z  }||                                 z  }||                                 z  }dD ]}||                     |          z  }||                     d          z  }||                     |          z  }dD ]}||                     |          z  }dD ]}||                     |          z  }||                                 z  }d                    |          S )N)rZ   r[   r\   r]   r`   r^   r_   re   )rd   rf   rg   )ra   rb   r   )r   r   r   r   r  r  r  rB   )r   r  r'   
param_listr   s        r   rP   zNumpyDocString.__str__  s   t""$$$t  """t))+++B 	4 	4J4''
333CCt  ,,,t!!),,,4 	( 	(A4$$Q'''CC3 	4 	4J4''
333CCt   yy~~r   N)F)Tr   r   )r%   )*rC   rD   rE   rF   rp   r   r   r}   r   r   r   r   r   r   r   _role_funcbacktick
_funcplain	_funcnamer   _funcnamenext_descriptionr   r   r   r   r  r   r   r   rr   r{   r   r   r   r   r   r   r  r  r  rP   rG   r   r   rV   rV   p   s        RB4 	B 	b	
 	2 	" 	B 	" 	 	B 	b 	2 	B 	 	B  	b!" 	B#$ 	% H* *,    & & &) ) )' ' '& & &H H H! ! !	 	 	
2 
2 
2   J E>M/Ju},t3j@4GI%%fj99M!))&*==MEL
7Y.788I
		 	!	! $1	1 4:	: 			 	 	  		 I 4 4 4l  &D D D,%( %( %(N$ $ $ $( ( ( (                @  $     r   rV   r   c                     d|z  | S |                      d          }d                    fd|D                       S )Nr   r   c              3   "   K   | ]	}|z   V  
d S r   rG   )r   r   
indent_strs     r   r   zindent.<locals>.<genexpr>%  s'      33Z!^333333r   )r   rB   )strr   linesr  s      @r   r   r      sM    VJ
{IIdOOE993333U333333r   c                 v    t          j        d                    |                                         d          S )z"Deindent a list of lines maximallyr   )rk   rl   rB   r   )r!  s    r   r   r   (  s,    ?499U++,,224888r   r   c                 8    | dz   |t          |           z  z   dz   S rj   r   )r   styles     r   r   r   -  s     $;s4yy(4//r   c                   2     e Zd Zddi fdZd Z fdZ xZS )FunctionDocr	  Nc                     || _         || _        |'|t          d          t          j        |          pd}t
                              | ||           d S )NzNo function or docstring givenr%   )_fr  r   r   getdocrV   r   )r   r	  r   r   rs   s        r   r   zFunctionDoc.__init__2  s[    
;| !ABBB.&&,"Cc622222r   c                     t          | j        d| j        j                  }t	          j        | j                  r!t          | j        d| j        j                  }n| j        }||fS )NrC   __call__)getattrr(  	__class__rC   r   isclassr   )r   	func_namer	  s      r   get_funczFunctionDoc.get_func<  sY    DGZ1HII	?47## 	47J0@AADD7DYr   c                 J   d}|                                  \  }}ddd}| j        rR| j        |vrt          d| j        z             |d                    |                    | j        d          |          z  }|t                                          | j                  z  }|S )Nr%   functionmethod)r	  methzWarning: invalid role %sz.. {}:: {}
    

)r  )r0  r  printr  r   superrP   )r   r'   r	  r/  rolesr-  s        r   rP   zFunctionDoc.__str__D  s    --//i#!# # : 	8z&&04:=>>>)004:r1J1J-68 8 8C 	uww444
r   )rC   rD   rE   r   r0  rP   __classcell__)r-  s   @r   r&  r&  1  sb        "(d2 3 3 3 3          r   r&  c                   V    e Zd ZdgZddei fdZed             Zed             Zd Z	dS )ClassDocr+  Nr%   c                    t          j        |          s|t          d|z            || _        dt          j        v rddlm} nt                      }|	                    dd          | _
        |r|                    d          s|dz  }|| _        |%|t          d          t          j        |          }t                              | |           |	                    d	g           }||u rd }|	                    d
g           }|	                    dd          r||urd }	d| j        fd| j        ffD ]\  }
}| |
         sg }t'          |          D ]r}||v s|r||vr	 t          j        t)          | j        |                    }|                    t-          |d |	|                               c# t.          $ r Y ow xY w|| |
<   d S d S d S )Nz$Expected a class or None, but got %rsphinxr   )ALLshow_inherited_class_membersTr   z&No class or documentation string givenmemberszexclude-membersshow_class_membersc                 2    | sg S |                                  S r   )
splitlines)r   s    r   splitlines_xz'ClassDoc.__init__.<locals>.splitlines_xy  s     *I<<>>)r   rb   ra   r%   )r   r.  r   _clssysmodulessphinx.ext.autodocr=  objectr   show_inherited_membersendswith_modpydocr)  rV   r   methods
propertiessortedr,  r   rQ   AttributeError)r   clsr   
modulenamefunc_docrs   r=  _members_excluderC  fieldr   doc_listrR   doc_items                  r   r   zClassDoc.__init__Z  s\   s## 	KCcIJJJ	s{"".......((C&,jj2D': ':#  	j11#66 	#J	;{ !IJJJ,s##Cc***::i,,s??H::/44::*D11 	+hc6I6I* * *
 #,T\!:".!@!B + +uE{ +!H &u 	! 	! H,,!) -.2(.B.B$!',|GDIt4L4L'M'MH$OO )$LL4J4J K KM M M M- ! ! ! D!"*DK)	+ 	+6I6I+ +s    AF55
GGc                 `      j         g S  fdt          j         j                   D             S )Nc                     g | ]O\  }}|                     d           r	|j        v #t          |t                    8                    |          M|PS _)r   extra_public_methodsr   r   _is_show_memberr   rR   r	  r   s      r   r   z$ClassDoc.methods.<locals>.<listcomp>  sp     5 5 5t--5 999"422 :,,T22 : 999r   rD  r   
getmembersr"   s   `r   rM  zClassDoc.methods  G    9I5 5 5 5w'9$)'D'D 5 5 5 	5r   c                 `      j         g S  fdt          j         j                   D             S )Nc                     g | ]\\  }}|                     d           sB|)t          |t                    st          j        |          E                    |          Z|]S r[  )r   r   propertyr   isdatadescriptorr^  r_  s      r   r   z'ClassDoc.properties.<locals>.<listcomp>  st     5 5 5t,,5\Zh%?%?\-d33 ",,T22 " !\\r   r`  r"   s   `r   rN  zClassDoc.properties  rb  r   c                 8    | j         rdS || j        j        vrdS dS )NTF)rI  rD  __dict__)r   rR   s     r   r^  zClassDoc._is_show_member  s,    & 	4ty)))5tr   )
rC   rD   rE   r]  r&  r   re  rM  rN  r^  rG   r   r   r:  r:  V  s        &< $k2+ 2+ 2+ 2+h 5 5 X5 5 5 X5    r   r:  r  r  )rF   r   rk   r   rL  warningsr   collectionsr   collections.abcr   r   rn   rE  r   r   	ExceptionrI   rQ   rV   r   r   r   r&  r:  rG   r   r   <module>rm     s      				        " " " " " " - - - - - - - -  



  I. I. I. I. I. I. I. I.X        J{$<$<$<==	m m m m mW m m m`4 4 4 49 9 9
0 0 0 0" " " " ". " " "JQ Q Q Q Q~ Q Q Q Q Qr   