
    6hQ                    6   S SK Jr  S SKJrJr  S SKJr  S SKJrJ	r	J
r
Jr  S SKJrJrJrJrJrJrJr  S SKJr  S SKJr  SS	KJrJrJr  \R:                  " 5       r " S
 S5      r " S S5      r  " S S\5      r " S S\5      r! " S S\\RD                  5      r#g)    )annotations)IterableIterator)_)binhexnullrevsha1nodeconstants)ancestor	changelogdagopencodingerrormanifestpycompat)
repository)
stringutil   )gitutilindexr   c                      \ rS rSrSrS rSS jrS r     SS jrS S jr	S!S	 jr
  S"S
 jrS rS rS"S jrS r   S#S jrS rS rS rS rS rS rS r   S$S jrS%S jrS rS rS rS rSrg)&baselog&   z9Common implementations between changelog and manifestlog.c                    Xl         X l        g N)gitrepo_db)selfgrdbs      2/usr/lib/python3/dist-packages/hgext/git/gitlog.py__init__baselog.__init__)   s        c                l    [        U R                  R                  S5      R                  5       S   5      $ )NzSELECT ncommits FROM cacher   )intr   executefetchoner   s    r!   __len__baselog.__len__-   s+    488##$@AJJLQOPPr$   c                    [         er   NotImplementedErrorr)   s    r!   filesbaselog.files0       !!r$   c                    [         er   r-   )r   exclusivefilessharedfilesrevisionscounttrackedsize
storedsizes         r!   storageinfobaselog.storageinfo3   
     "!r$   c                    [         er   r-   )r   states     r!   verifyintegritybaselog.verifyintegrity=   r1   r$   Nc                    [         er   r-   r   startstops      r!   revsbaselog.revs@   r1   r$   c                    [         er   r-   )r   deltas
linkmappertransactionaddrevisioncbduplicaterevisioncbs         r!   addgroupbaselog.addgroupC   r:   r$   c                    [         er   r-   )r   node1node2s      r!   commonancestorsheadsbaselog.commonancestorsheadsM   r1   r$   c                    [         er   r-   r   rC   s     r!   descendantsbaselog.descendantsP   r1   r$   c                    [         er   r-   r@   s      r!   headsbaselog.headsS   r1   r$   c                    [         er   r-   r   nodes     r!   childrenbaselog.childrenV   r1   r$   c                    [         er   r-   )r   nodes
nodesorderrevisiondataassumehaveparentrevisionss        r!   emitrevisionsbaselog.emitrevisionsY   s
     "!r$   c                    [         er   r-   )r   minlinks     r!   getstrippointbaselog.getstrippointb   r1   r$   c                    [         er   r-   r   revs     r!   
iscensoredbaselog.iscensorede   r1   r$   c                    [         er   r-   rj   s     r!   
parentrevsbaselog.parentrevsh   r1   r$   c                    [         er   r-   rZ   s     r!   rawdatabaselog.rawdatak   r1   r$   c                    [         er   r-   rZ   s     r!   revisionbaselog.revisionn   r1   r$   c                    [         er   r-   rj   s     r!   sizebaselog.sizeq   r1   r$   c                    [         er   r-   )r   rf   rH   s      r!   stripbaselog.stript   r1   r$   c	                    [         er   r-   )	r   ra   rH   linkrevp1p2r[   flags
cachedeltas	            r!   addrevisionbaselog.addrevisionw   s
     "!r$   c                    [         er   r-   )r   trr[   	tombstones       r!   censorrevisionbaselog.censorrevision   r1   r$   c                    U[         R                  :X  a  gU R                  R                  S[        R
                  " U5      45      R                  5       nUc!  [        R                  " US[        S5      5      eUS   $ )Nz(SELECT rev FROM changelog WHERE node = ?   00changelog.i   no noder   )
r
   nullidr   r'   r   	togitnoder(   r   LookupErrorr   r   nts      r!   rk   baselog.rev   so    !(((HH69J9J19M8O

(* 	
 9##A'7:GGtr$   c                    U[         :X  a  [        R                  $ U R                  R	                  SU45      R                  5       nUc$  [        R                  " SU-  S[        S5      5      e[        US   5      $ )Nz(SELECT node FROM changelog WHERE rev = ?   %dr      no revr   )
r	   r
   r   r   r'   r(   r   r   r   r   )r   rr   s      r!   r[   baselog.node   sm    <$+++HH6

(* 	
 9##EAI/?9NN1Q4yr$   c                    U R                   R                  S[        R                  " U5      45      R	                  5       nUb  US   c  U$ [        US   5      $ )aZ  Map any node to a non-synthetic node.

Indexing may have created synthetic nodes to handle octopus merges.
Certain operations on these made up nodes need to actually happen on
the real octopus merge commit.  Given any node, this function
returns the real commit hash.  One can think of this as hg-to-git
commit hash translation that always works.z.SELECT synthetic FROM changelog WHERE node = ?r   )r   r'   r   r   r(   r   r   s      r!   	syntheticbaselog.synthetic   sZ     HH<q!#
 (* 	
 9!H1Q4yr$   c                    U R                   R                  S[        R                  " U5      45      R	                  5       nUS L$ )Nz)SELECT node FROM changelog WHERE node = ?)r   r'   r   r   r(   r   s      r!   hasnodebaselog.hasnode   sB    HH7q!#
 (* 	
 }r$   )r   r   )returnr&   )FFFFF)r   z#Iterable[repository.iverifyproblem]r   NNN)NFF)Nr   N)r$   )__name__
__module____qualname____firstlineno____doc__r"   r*   r/   r8   r=   rC   rK   rP   rT   rW   r\   rc   rg   rl   ro   rr   ru   rx   r{   r   r   rk   r[   r   r   __static_attributes__ r$   r!   r   r   &   s    CQ"
 """  """"" "'"""""""" "" r$   r   c                  8    \ rS rSrS rS rS rS rS rS r	Sr
g	)
baselogindex   c                    Xl         g r   _log)r   logs     r!   r"   baselogindex.__init__   s    	r$   c                >    U R                   R                  U5      S:g  $ Nr   r   rk   )r   r   s     r!   has_nodebaselogindex.has_node   s    yy}}Q2%%r$   c                ,    [        U R                  5      $ r   )lenr   r)   s    r!   r*   baselogindex.__len__   s    499~r$   c           
         U R                   R                  U5      u  p#UUUSUUUU R                   R                  U5      4$ r   )r   ro   r[   )r   idxp1revp2revs       r!   __getitem__baselogindex.__getitem__   sI    yy++C0 IINN3
 	
r$   c                8    U R                   R                  U5      $ r   r   rZ   s     r!   rk   baselogindex.rev   s    yy}}T""r$   c                8    U R                   R                  U5      $ r   )r   get_revrZ   s     r!   r   baselogindex.get_rev   s    yy  &&r$   r   N)r   r   r   r   r"   r   r*   r   rk   r   r   r   r$   r!   r   r      s     &
$#'r$   r   c                     \ rS rSrSrS rS r\S 5       r\S 5       r	\S 5       r
S rS S
 jrS rS rS rS!S jrS"S jrS rS#S jrS rS"S jrS$S jrS$S jrS rS%S jrS rS rS r\rS rS rS r       S&S jr!Sr"g	)'r      s   extrac                \     U R                  U5        g! [        R                   a     gf = f)NTF)r[   r   r   rj   s     r!   __contains__changelog.__contains__   s-    	IIcN   		s    ++c                <    [        [        [        U 5      5      5      $ r   )iterranger   r)   s    r!   __iter__changelog.__iter__   s    E#d)$%%r$   c                    [        5       $ r   )setr)   s    r!   filteredrevschangelog.filteredrevs   s     ur$   c                    [        U 5      $ r   )r   r)   s    r!   r   changelog.index   s    D!!r$   c                    U R                   R                  S5       Vs0 s H  n[        US   5      US   _M     nn[        U[        R
                  '   U$ s  snf )NzSELECT node, rev FROM changelogr   r   )r   r'   r   r	   r
   r   )r   vr   s      r!   nodemapchangelog.nodemap   sa     XX%%&GH
H !IqtOH 	
 
 '.

"
"#
s   Ac                    U R                   R                  S5      R                  5       nU(       a  [        US   5      $ [        R
                  $ )Nz4SELECT node FROM changelog ORDER BY rev DESC LIMIT 1r   )r   r'   r(   r   r
   r   r   r   s     r!   tipchangelog.tip   sB    HHB

(* 	
 qt9 '''r$   Nc                t    Uc  U R                  5       nU R                  R                  SX45      nS U 5       $ )NzFSELECT rev FROM changelog WHERE rev >= ? AND rev <= ? ORDER BY REV ASCc              3  >   #    U  H  n[        US    5      v   M     g7fr   )r&   ).0r   s     r!   	<genexpr>!changelog.revs.<locals>.<genexpr>
  s     %1aAaD		1s   )tiprevr   r'   )r   rA   rB   r   s       r!   rC   changelog.revs  s?    <;;=DHH M	
 &1%%r$   c                f    U R                   R                  S5      R                  5       nUb  US   $ g)Nz3SELECT rev FROM changelog ORDER BY REV DESC LIMIT 1r   r   )r   r'   r(   r   s     r!   r   changelog.tiprev  s6    HHG

(* 	
 =Q4Kr$   c                   [         R                  R                  U5      (       a  [        R                  eU R
                  R                  S[        R                  " US-   5      45       Vs/ s H  n[        US   5      PM     nn[         R                  R                  U5      (       a  UR                  [         R                  5        [        U5      S:  a!  [        R                  " US[        S5      5      eU(       a  US   $ g s  snf )Nz,SELECT node FROM changelog WHERE node LIKE ?   %r   r   r   s   ambiguous identifier)r
   wdirhex
startswithr   WdirUnsupportedr   r'   r   sysstrr   nullhexappendr   r   AmbiguousPrefixLookupErrorr   )r   idx
candidatess       r!   _partialmatchchangelog._partialmatch  s    $$//33''' XX%%>d+-
 !I 	 
 $$//33/667z?Q22$a(?&@  a= 
s   +Dc                    g)Nr   r   rj   s     r!   r   changelog.flags)  s    r$   c           
        [        U5      n[        U[        U5      S-   5       H`  nUS U n[        U R                  R                  S[        R                  " US-   5      45      R                  5       S   5      nUS:X  d  M^  Us  $    U$ )Nr   z0SELECT COUNT(*) FROM changelog WHERE node GLOB ?   *r   )	r   r   r   r&   r   r'   r   r   r(   )r   r[   	minlengthnodehexattempt	candidatematchess          r!   shortestchangelog.shortest,  s    d)YGq(89G)I  F__Y%568 (*Q G !|   : r$   c                    U R                   R                  S5       Vs/ s H  n[        US   5      PM     nnU(       a#  [        U Vs/ s H  oDU;   d  M
  UPM     sn5      $ [        U5      $ s  snf s  snf )NzISELECT rev FROM changelog INNER JOIN heads ON changelog.node = heads.noder   )r   r'   r&   sorted)r   rC   r   	realheadsr   s        r!   headrevschangelog.headrevs:  s}     XX%%B
 !I 	 
 d=d9n1d=>>i  
 >s   A-	A2A2c           
        [        U[        5      (       a  U R                  U5      nOUnSS0nU[        R                  :X  a#  [
        R                  " U[        R                  S9$ U R                  U5      n[        R                  " U5      n[        R                  " U R                  U R                  USS9  U R                  R                  SU[        R                  45       Vs/ s H  nUS   PM
     nnU R                  R                  SU[        R                  45       Vs/ s H  nUS   PM
     nnU R                  U   n[
        R                  " US	UR                   R"                  R%                  S
5      UR                   R&                  R%                  S
5      4-  UR                   R(                  UR                   R*                  * S-  4UUUR,                  R%                  S
5      US9$ s  snf s  snf )Ns   branch   default)extrar   T)commitzBSELECT filename FROM changedfiles WHERE node = ? and filenode != ?r   zASELECT filename FROM changedfiles WHERE node = ? and filenode = ?s   %s <%s>utf8<   )r   userdater/   filesremoveddescriptionr  )
isinstancer&   r[   r
   r   hgchangelog_changelogrevisionr   r   r   r   _index_repo_commitr   r   r'   nullgitauthornameencodeemailtimeoffsetmessage)	r   	nodeorrevr   r  hnr   r/   r  cs	            r!   changelogrevisionchangelog.changelogrevisionF  s   i%%		)$AAJ'!(((11&7&>&>  NN1q!  txxDI XX%%3W__%
 aD 	 
 XX%%2W__%
 aD 	 
 LL--xx}}##F+QXX^^-B-B6-JKL((--!((//!1B!67%		((0
 	
#

s   %G0$G5c                    [        U5      nU R                  U R                  5       5      nU H  nXT:  d  M
  [        SU-  5      e   [        R
                  " U R                  XUS9$ )Ns   Invalid rev %r)stoprev	inclusive)listrk   r   
IndexErrorr   lazyancestorsro   )r   rC   r   r!  r   r   s         r!   	ancestorschangelog.ancestorst  s_    Dzhhtxxz"Aw !2Q!677  %%OOTi
 	
r$   c                X    [         R                  " XR                  U R                  5      $ r   )r   descendantrevsrC   ro   rS   s     r!   rT   changelog.descendants  s    ##D))T__EEr$   c                X    Uc  [         /n[        R                  " U R                  U5      $ )a  Return an object that can be used to incrementally compute the
revision numbers of the ancestors of arbitrary sets that are not
ancestors of common. This is an ancestor.incrementalmissingancestors
object.

'common' is a list of revision numbers. If common is not supplied, uses
nullrev.
)r	   r   incrementalmissingancestorsro   )r   commons     r!   incrementalmissingrevs changelog.incrementalmissingrevs  s'     >YF33DOOVLLr$   c                |    Uc  [         /nUc  U R                  5       nU R                  US9nUR                  U5      $ )a(  Return the revision numbers of the ancestors of heads that
are not ancestors of common.

More specifically, return a list of revision numbers corresponding to
nodes N such that every N satisfies the following constraints:

  1. N is an ancestor of some node in 'heads'
  2. N is not an ancestor of any node in 'common'

The list is sorted by revision number, meaning it is
topologically sorted.

'heads' and 'common' are both lists of revision numbers.  If heads is
not supplied, uses all of the revlog's heads.  If common is not
supplied, uses nullid.r,  )r	   r  r-  missingancestors)r   r,  rW   incs       r!   findmissingrevschangelog.findmissingrevs  sD      >YF=MMOE)))8##E**r$   c                   Uc  [         R                  /nUc.  U R                  5        Vs/ s H  o0R                  U5      PM     nnU Vs/ s H  o@R	                  U5      PM     nnU Vs/ s H  o@R	                  U5      PM     nnU R                  US9nUR                  U5       Vs/ s H  o0R                  U5      PM     sn$ s  snf s  snf s  snf s  snf )a  Return the ancestors of heads that are not ancestors of common.

More specifically, return a list of nodes N such that every N
satisfies the following constraints:

  1. N is an ancestor of some node in 'heads'
  2. N is not an ancestor of any node in 'common'

The list is sorted by revision number, meaning it is
topologically sorted.

'heads' and 'common' are both lists of node IDs.  If heads is
not supplied, uses all of the revlog's heads.  If common is not
supplied, uses nullid.r0  )r
   r   r  r[   rk   r-  r1  )r   r,  rW   r   r   r2  s         r!   findmissingchangelog.findmissing  s     >'../F=+/==?;?aYYq\?E;'-.v!((1+v.&+,e!e,)))8&)&:&:5&AB&A		!&ABB <., Cs   C
C
*C(Cc                   / nU R                  U5      nU R                  US-   S9 H  nU R                  U5       Vs/ s H  oU[        :w  d  M  UPM     nnU(       a2  U H*  nXS:X  d  M
  UR	                  U R                  U5      5        M,     Mh  U[        :X  d  Mt  UR	                  U R                  U5      5        M     U$ s  snf )z!find the children of a given noder   )rA   )rk   rC   ro   r	   r   r[   )r   r[   r  pr   prprevss          r!   r\   changelog.children  s    HHTNQ'A"&//!"4F"4BgR"4EFBw1.   g1& (  Gs   C C c                F    [         R                  " U R                  XX$5      $ r   )r   _reachablerootspurero   )r   minrootrW   rootsincludepaths        r!   reachablerootschangelog.reachableroots  s     ((OOWU
 	
r$   c                f    U R                  U5      U R                  U5      p!U R                  X5      $ r   )rk   isancestorrevr   abs      r!   
isancestorchangelog.isancestor  s*    xx{DHHQK1!!!''r$   c           	     h    U[         :X  a  gX:X  a  gX:  a  g[        U R                  X/U/SS95      $ )NTF)rA  )r	   boolrB  rF  s      r!   rE  changelog.isancestorrev  s=    <VUD''3'GHHr$   c                4   US:  d   U5       eU R                   R                  SU45      R                  5       nUc$  [        R                  " SU-  S[        S5      5      eU R                  [        US   5      5      U R                  [        US   5      5      4$ )Nr   z*SELECT p1, p2 FROM changelog WHERE rev = ?r   r   r   r   )r   r'   r(   r   r   r   rk   r   )r   rk   r   s      r!   ro   changelog.parentrevs  s    axxHH83&

(* 	
 9##ECK1A1Y<PPxxAaD	"DHHS1Y$777r$   c                    U R                  U5      U R                  U5      p![        R                  " U R                  X5       Vs/ s H  nU R	                  U5      PM     sn$ s  snf r   )rk   r   rP   ro   r[   )r   rG  rH  r   s       r!   rP   changelog.commonancestorsheads  s[     xx{DHHQK1 224??AI
I IIaLI
 	
 
s   A#c                    g)zAGit doesn't do named branches, so just put everything on default.)r  Fr   rj   s     r!   
branchinfochangelog.branchinfo  s     r$   c                    g r   r   )r   r   s     r!   delayupdatechangelog.delayupdate  s     	r$   c           	     0   / n[         R                  " U5      [         R                  " U5      nnU[        R                  :w  a  UR	                  U5        U(       a%  U[        R                  :w  a  UR	                  U5        Uc   eUu  nn[
        R                  [        R                  " [        R                  " U5      5      [        R                  " [        R                  " U5      5      [        U5      [        US-  5      * 5      nU R                  R                  S UUU[         R                  " U5      U5      nU R                  R                  R!                  SUSS9  ["        R$                  " U R                  U R&                  5        UR(                  $ )Nr	  zrefs/hg/internal/latest-commitT)force)r   r   r
   r   r   pygit2	Signaturer   unifromlocalr   personr  r&   r   create_commit
referencescreater   _index_repor   raw)r   r   r/   descrH   r   r   r
  r  r  p1copiesp2copies
filesaddedr  parentshp1hp2	timestamptzsigoids                        r!   addchangelog.add  sB     $$R('*;*;B*?S")))NN3")000NN3	2!!*"3"3D"9:!!*"2"24"89	Nr]N	
 ll((#sD'"3"3H"=w
 	&&,c 	' 	

 	$,,1wwr$   r   r   )r   r   )r   Fr   )F)NNNNNN)#r   r   r   r   _copiesstorager   r   propertyr   r   r   r   rC   r   r   r   r   r  r  r%  rT   r-  r3  r6  r\   rB  rI  rE  ro   _uncheckedparentrevsrP   rS  rV  rn  r   r   r$   r!   r   r      s     N&  
 " "  (	&(
!,
\
FM+0C4
(
I8 &
! +r$   r   c                  $    \ rS rSr\rS rS rSrg)manifestlogi0  c                &    U R                  SU5      $ Nr$   )getrZ   s     r!   r   manifestlog.__getitem__3  s    xxT""r$   c                   U[         R                  :X  a  [        R                  " X5      $ U R	                  U5      nU R
                  [        R                  " U5         nUR                  nU(       a7  UR                  S5      nU H   nXF   nU R
                  UR                     nM"     [        R                  " U R
                  U5      $ )N   /)r
   r   r   memtreemanifestctxr   r   r   r   treesplitr   gitmanifestgittreemanifestctx)r   relpathr[   r  r   partsr9  tes           r!   rw  manifestlog.get6  s    $+++..t==~~d#g//56KKMM$'ETLL'  --dllA>>r$   r   N)	r   r   r   r   r
   nodeconstantsr   rw  r   r   r$   r!   rt  rt  0  s    %M#?r$   rt  c                  l   ^  \ rS rSrU 4S jrS rS rS rSS jrSS jr	S r
S	 rS
 rS rS rSrU =r$ )filelogiE  c                   > [         TU ]  X5        [        U[        5      (       d   eX0l        [
        R                  U l        g r   )superr"   r  bytespathr
   r   )r   r   r    r  	__class__s       r!   r"   filelog.__init__F  s5     $&&&&	'..r$   c                    U[         R                  :X  a  gU R                  [        R                  " U5         R
                  $ rv  )r
   r   r   r   r   datarZ   s     r!   readfilelog.readL  s4    $+++||G--d34999r$   c                F   [        U5      S;  a  [        U5      n[        U[        5      (       a   S5       e[        U5      S:X  a  [        U5      n[        R
                  " U5      nX R                  ;   a  U$ [        R                  " U R                  U[        S5      5      e)N)   (   s   todo revnums for nodesr  s   no match found)r   r&   r  r   r   r   r   r   r   r  r   )r   r[   hnodes      r!   lookupfilelog.lookupQ  s    t9H$t9DdC  3335t9?t9D!!$'LL K		43D1EFFr$   c                *    U R                  U5      U:g  $ )z9Returns True if text is different than content at `node`.)r  )r   r[   texts      r!   cmpfilelog.cmp]  s    yy$&&r$   c                ^    U(       a   eU R                   R                  U5      R                  $ r   )r   create_blobrb  )r   r  metarH   linkr   r   s          r!   rn  filelog.adda  s$    x||''-111r$   c              #     #    U R                   R                  S[        R                  " U R                  5      [
        R                  45       H
  nUS   v   M     g 7f)Nz
SELECT rev FROM changelog
INNER JOIN changedfiles ON changelog.node = changedfiles.node
WHERE changedfiles.filename = ? AND changedfiles.filenode != ?
        r   )r   r'   r   fsdecoder  r   r  )r   clrevs     r!   r   filelog.__iter__e  sK     XX%%
 tyy)7??;
E (N
s   AAc                    U$ r   r   )r   frs     r!   r~   filelog.linkrevp  s    	r$   c                6   U R                   R                  S[        R                  " U R                  5      [
        R                  " U5      45      R                  5       nUc+  [        R                  " U R                  U[        S5      5      e[        US   5      $ )Nz
SELECT rev FROM changelog
INNER JOIN changedfiles ON changelog.node = changedfiles.node
WHERE changedfiles.filename = ? AND changedfiles.filenode = ?r   r   )r   r'   r   r  r  r   r   r(   r   r   r   r&   )r   r[   rows      r!   rk   filelog.revs  s~    hhA tyy)7+<+<T+BC
 (* 	 ;##DIItQz]CC3q6{r$   c                    U R                   R                  SU[        R                  " U R                  5      45      R                  5       nUc  [        SU R                  U4-  5      e[        US   5      $ )NzSELECT filenode FROM changedfiles
INNER JOIN changelog ON changelog.node = changedfiles.node
WHERE changelog.rev = ? AND filename = ?
zgitlog %r out of range %dr   )r   r'   r   r  r  r(   r#  r   )r   rk   maybes      r!   r[   filelog.node  so       (##DII./
 (* 	 =8DIIs;KKLL58}r$   c                   [         R                  " U5      n[        R                  " U R                  5      n/ nU R
                  R                  SX#45      R                  5        H  nUc  U R
                  R                  SX#45      R                  5       S   nUR                  S5      n[        R                  " U R                  U R
                  XcU5        U R                  U5      s  $ UR                  [        U5      5        M     U$ )NzTSELECT p1filenode, p2filenode FROM changedfiles
WHERE filenode = ? AND filename = ?
zASELECT node FROM changedfiles WHERE filenode = ? AND filename = ?r   ascii)r   r   r   r  r  r   r'   r(   decoder   fill_in_filelogr   rg  r   r   )r   r[   gngppsr9  r  s          r!   rg  filelog.parents  s    t$tyy)!! H	

 (*A y)):H (*Q	   w/%%dllDHHf"M||D))		#a&!%& 	r$   c                    g)NFr   rZ   s     r!   renamedfilelog.renamed  s    r$   )r   r  r   )r   zIterator[int])r   r   r   r   r"   r  r  r  rn  r   r~   rk   r[   rg  r  r   __classcell__)r  s   @r!   r  r  E  s@    /:

G'2	

2 r$   r  N)$
__future__r   typingr   r   mercurial.i18nr   mercurial.noder   r   r	   r
   	mercurialr   r   r  r   r   r   r   r   mercurial.interfacesr   mercurial.utilsr    r   r   r~  
get_pygit2rZ  r   r   rt  ifilestorager  r   r$   r!   <module>r     s    "
     '  
			J JZ '  'HV Vr
?' ?*agz.. ar$   