
    BdUk                         d Z dZd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mZmZmZ ddlmZ  ed          Z G d de          Z ed          Z G d dej                  ZdS )zCyril Jaquierz Copyright (c) 2004 Cyril JaquierGPL    N   )DateDetector)datedetector)DatePatternRegexDateTemplate   )setUpMyTimetearDownMyTimeLogCaptureTestCase)	getLoggerfail2banc                   ~    e Zd Zd Zd Zed             Zd Zd Zd Z	d Z
d Zd	 Zd
 Zd Zd Zd Zd Zd Zd ZdS )DateDetectorTestc                 X    t          j        |            t                       d| _        dS zCall before every test case.N)r   setUpr
   _DateDetectorTest__datedetectorselfs    E/usr/lib/python3/dist-packages/fail2ban/tests/datedetectortestcase.pyr   zDateDetectorTest.setUp*   s*    4   ---$    c                 J    t          j        |            t                       dS zCall after every test case.N)r   tearDownr   r   s    r   r   zDateDetectorTest.tearDown0   s%    d###r   c                 v    | j         ,t                      | _         | j                                          | j         S )N)r   r   addDefaultTemplater   s    r   r   zDateDetectorTest.datedetector5   s5    	 %4))+++		r   c           	      V   t                      | _        | j                            d           dD ]}dD ]}||z  }|dz   }| j                            |          }|                     |d|d           |\  }}|                     t          |          |           |                     |	                    d          t          |          t          |          dz   f           d	D ]@}dD ];}||z  }|dz   }| j                            |          }|                     |           <Ad S )
NEPOCHiCCl   o& %s[%s]z[%s.555]zaudit(%s.555:101)* [sshd] error: PAM: Authentication failureParse epoch time for  failedr	   z.555)	12345678999999999999999991138049999AA1138049999)r   r   appendTemplater   getTime
assertTrueassertEqualintassertIngroupstrassertFalse)r   dateUnixdatelogdatelogmatchlogs         r   testGetEpochTimez!DateDetectorTest.testGetEpochTime<   sd   $$$$W---+ L Lh> L Lt(?D
=
=C'',,GOOGGGHHH#gxS\\8,,,MM(..##c(mmS]]65I%JKKKKL R  h>  t(?D
=
=C'',,GW	 r   c           	      F   t                      | _        | j                            d           dD ]}dD ]}dD ]}||z  }||z  }|dz   }| j                            |          }|                     |d|d           |\  }}|                     t          |          |           |                     |                    d          t          |                     d	D ]@}d
D ];}||z  }|dz   }| j                            |          }| 
                    |           <Ad S )NLEPOCHr	   i  i@B r    )r"   r#   r#   zaudit(%s:101)r$   r%   r&   r	   )r'   999999999999999999r)   r*   r!   r   r   r+   r   r,   r-   r.   r/   r1   r2   r3   )r   factr4   r5   dateLongr6   r7   r8   s           r   testGetEpochMsTimez#DateDetectorTest.testGetEpochMsTimeQ   sn   $$$$X...  
8 
8d, 	8 	8x7 8 84X8OT>>S ((--W	__WW$$$HIII$w	c'llH---	hnnQ''X77778	8 T  h>  t(?D
=
=C'',,GW	 r   c                    t                      | _        | j                            d           dD ]}dD ]}||z  }d|z  }| j                            |          }|                     |d|           |\  }}|                     t          |          |           |                     |                    d          t          |                     dD ]6}||z  }| j                            |          }| 
                    |           7d S )Nz(?<=\|\s){LEPOCH}(?=\s\|)r<   r    z"auth-error | %s | invalid passwordzParse epoch time failed: r	   )z	test%s123ztest-right | %stestztest%s | test-leftr>   )r   r?   r4   r@   r6   r7   r8   s          r   testGetEpochPatternz$DateDetectorTest.testGetEpochPatternh   s0   $$$$%ABBB  7 7d, 7 7x$H
.
9C'',,GOOGGccCDDD#gxS\\8,,,X^^A&&H66667 H  c	x3&&s++7G r   c                     d}d}| j                             |          \  }}|                     ||           |                     |                    d          d           d S )Nz9Jan 23 21:59:59 [sshd] error: PAM: Authentication failure  }Ar	   Jan 23 21:59:59)r   r,   r.   r1   )r   r6   r4   r7   r8   s        r   testGetTimezDateDetectorTest.testGetTime{   sh    C#(
 +33C88GX7H%%%8>>!$$&788888r   c           !         t                      }|                    d           t          j        }d} |ddddd          }d| |dddd	d          fd
||fd| |ddddd          fd| |ddddd          fd | |ddddd          fd| |ddddd          fd| |ddddd          fd| |ddddd          fd| |ddddd          fd| |ddddd          fd| |ddddd          fd| |ddddd          fd| |dddd	d          fd|dz   |fd
|dz   |fd|dz   |fd |dz   |fd
|dz    |ddddd          fd |dz    |ddddd          fd
|dz    |dddd d          fd |d!z    |dddd d          fd|d"z   |fd|d#z    |ddddd          fd|d$z    |ddddd          fd|d%z    |dddd	d          ffD ]\  }}}t                              d&||           ||_        |                    |          \  }}	|                    |          }
|                     |
|d'|
d(|d)|d*|d+|j        d,           | 	                    t          t          |d-d.           d |_        d S )/Nz#^%ExY-%Exm-%Exd %H:%M:%S(?: ?%Exz)?z2017-01-23 15:00:00i  r	         r   zUTC+0300   UTCzUTC-0430      zGMT+12      CETz+0100zCEST-01CEST   z+0200zCET+01zCET+0100zCET+0130z GMTz -1045   -   z -10:45z +0945   z +09:45z Zz CETz CESTz	 CET+0130z== test %r with TZ %rzwrong offset z != z by z with default TZ z ()
default_tzzWRONG-TZ)r   r+   datetimelogSysdebugrX   r,   utcfromtimestampr.   assertRaises
ValueErrorsetattr)r   dddtlogdtdtUTCtzr6   desiredr7   _vals              r   testDefaultTimeZonez$DateDetectorTest.testDefaultTimeZone   s    ~~"9:::"
%
"T1b"a
 
 % rr$2r1--.	urr$2r2../rr$2q!,,-rr$2r1--.	rr$2r1--.rr$2r1--.rr$2r1--.
rr$2r1--.rr$2r1--.rr$2r1--.rr$2r1--.rr$2r2../fe$	fe$fe$fe$	h4B2 6 67iD!RB!7!78	h4B2 6 67iD!RB!7!78d
E"frr$2r1556grr$2r1556k!22dAr2r#:#:;= $f $fb#w@ 
<<'b1112="**S//ZWa			W	%	%3C?BssGGGSSSRTRTRTVXVcVcVcdf f f f J\:FFF"---r   c                 z   d}dD ]4\  }}}}||dk    r|}t                               d||||f           |dudf| dfdfD ]\  }}||z   d	z   }|s|d
k    rt                               d||           | j                            |          }	|rv|                     |	dd|d|d|d|           |	\  }
}|                     |
|d|d|d|
d|d	           |                     |                    d          |           n |                     |	dd|d|d|	           | j                            |          x\  }}}| j                            ||          }	t                               d|r|j        nd           |rv|                     |	dd|d|d|d|           |	\  }
}|                     |
|d|d|d|
d|d	           |                     |                    d          |           n |                     |	dd|d|d|	           t                               d           6dS )zKTest detection of various common date/time formats f2b should understand
		rE   )")FTrF   N)FFzSun Jan 23 21:59:59 2005N)FFzSun Jan 23 21:59:59N)FFzSun Jan 23 2005 21:59:59N)FTz2005/01/23 21:59:59N)FTz2005.01.23 21:59:59N)FTz23/01/2005 21:59:59N)FTz23/01/05 21:59:59N)FTz23/Jan/2005:21:59:59N)FTz23/Jan/2005:21:59:59 +0100N)FTz01/23/2005:21:59:59NFTz2005-01-23 21:59:59N)FTz2005-01-23 21:59:59,000N)FTz23-Jan-2005 21:59:59N)FTz23-Jan-2005 21:59:59.02N)FTz23-Jan-2005 21:59:59 +0100N)FTz23-01-2005 21:59:59NTT
1106513999N)FTz01-23-2005 21:59:59.252N)FFz@4000000041f4104f00000000N)FTz2005-01-23T20:59:59.252ZN)FTz2005-01-23T15:59:59-05:00Nrj   )FT20050123T215959N)FTz20050123 215959N)TTz<01/23/05@21:59:59>N)FTz050123 21:59:59N)TTzJan-23-05 21:59:59N)FTzJan 23, 2005 9:59:59 PMNrk   )TT1106513999.000N)TTz[1106513999.000]rn   )FTzaudit(1106513999.000:987)rn   )TTno date lineNNro   z
== test %r zbogus-prefix )Fword-boundaryz)[sshd] error: PAM: Authentication failurerq   z  -- test %-5s for %rz'getTime retrieved nothing: failure for z by prefix z, anchored: z, log: zgetTime comparison failure for z: by prefix z "z
" is not ""r	   z$getTime should have not matched for z Got: z  -- found - %rFz: "z  -- OK)	rZ   r[   r   r,   assertNotEqualr.   r1   	matchTimename)r   r4   anchoredboundsdaterdateshould_matchprefixr6   logtimelogUnixlogMatch	timeMatchtemplatert   s                  r   testVariousTimesz!DateDetectorTest.testVariousTimes   sR    (#( I I#hueH m//	<<xu=>>>
$	\?##  # #|V
 5.F
FC8V..
LL(,<<<'',,G 	`	$$Z_Z_Z_agagagiqiqiqsvsvwy y y$w	gxxPUPUPUW]W]W]_f_f_fhphphpqs s s	hnnQ''////	gttGLuufffV]V]^` ` ` )-(9(C(CC(H(HHYI''Y77G
LL"Y$IHMMEJJJ 	`	$$Z_Z_Z_agagagiqiqiqsvsvwy y y$w	gxxPUPUPUW]W]W]_f_f_fhphphpqs s s	hnnQ''////	gttGLuufffV]V]^` ` `
LLG#MI Ir   c                 r    |                      t          | j        j        | j        j        d                    d S )Nr   )r]   r^   r   r+   	templatesr   s    r   testAllUniqueTemplateNamesz+DateDetectorTest.testAllUniqueTemplateNames  s<    J 1 @#A&( ( ( ( (r   c           
         t          j        t          j        dddddd                                                    }| j                            d          }|                     |d            |\  }}|                     ||           |                     |                    d          d	           t          d          D ]^}| j                            d
          \  }}|                     ||           |                     |                    d          d           _| j                            d          \  }}|                     ||           |                     |                    d          d	           d S )Ni  
      r   %      z#2012/10/11 02:37:17 [error] 18434#0r	   z2012/10/11 02:37:17z#11/10/2012 02:37:17 [error] 18434#0z11/10/2012 02:37:17)
timemktimerY   	timetupler   r,   rs   r.   r1   range)r   mulogdatelogTimer~   is         r   testFullYearMatch_gh130z(DateDetectorTest.testFullYearMatch_gh130  sl    {8$T2r1b"==GGIIJJ"%%&KLL'gt$$$!GX7B8>>!$$&;<<<99 > >a,445Z[[WhGR   HNN1%%'<====+334YZZGX7B8>>!$$&;<<<<<r   c                 *   t                      }|                    d           |                     |j        d           |                     t
          |j        d           |                     |                    d                              d          d           t                      }d|_
        |                     d|j        v            d}|                     |                    d	|z   d	z                                 d          |           |                     |                    |                              d          |           d
}|                     |                    |                     t                      }d|_
        |                     d|j        v            d}|                     |                    d	|z                        |                     |                    |d	z                        |                     |                    d|z   dz                                 d          |           |                     |                    |                              d          |           d}|                     |                    |                     t                      }d|_
        |                     d|j        v            d}|                     |                    |                              d          |           d}|                     |                    |                              d          |           d}|                     |                    |                              d          |           d S )Nz^a{3,5}b?c*$z^(a{3,5}b?c*)$rp   aaaacr	   z'(?iu)**time:%ExY%Exm%ExdT%ExH%ExM%ExS**z**zTIME:20050102T010203XzTIME:50050102T010203z'{^LN-BEG}time:%ExY%Exm%ExdT%ExH%ExM%ExS^ztime:20050102T010203z##z...z	^%Y %b %dz(?iu)z2005 jun 03z2005 Jun 03z2005 JUN 03)r   setRegexr.   regexr]   	ExceptiongetDate	matchDater1   r   patternr3   r-   )r   tra   s      r   testDateTemplatez!DateDetectorTest.testDateTemplate#  s   nn!**^17,---Iqy"---1;;w''--a00'::: !7!)417?###"1;;sRx#~..44Q77<<<1;;r??((++R000"1;;r??### !7!)//#.!!!"1;;sRx(()))1;;rCx(()))1;;tby501177::B???1;;r??((++R000"1;;r??### !!)//'QW$%%%"d&&q{{2'<'<Q'?'?DDD"d&&q{{2'<'<Q'?'?DDD"d&&q{{2'<'<Q'?'?DDDDDr   c                 
   dD ]}t                      }|                    |           dD ]W}dD ]R}|                    ||z            }|                     |d         |d                                         fd|f           SXd S )N)z%H:%M:%Sz{UNB}%H:%M:%S)z%s testz%8s testztest %sztest %8s)	00:01:0200:01:200:1:20:1:2r   r   r   r   r   r   r	   g  gA)r   r+   r,   r.   r1   )r   dpr`   fmtra   r   s         r   testNotAnchoredCollisionz)DateDetectorTest.testNotAnchoredCollisionM  s    + @ @b2R< @ @s
 @ @ 
C"H		Q	qtQqTZZ\\*\2,>????@@	@ @r   c                 h   | j         }dD ]\  }}}t                              d|||f           t          |          D ]s}t                              d|           |                    |          \  }}|                     |           |                     |                    d          |           td S )N))z030324  0:03:59z9some free text 030324  0:03:59 -- 2003-03-07 17:05:01 ...r	   )z2003-03-07 17:05:01z+some free text 2003-03-07 17:05:01 test ...rJ   )z030324  0:04:00z{server mysqld[1000]: 030324  0:04:00 [Warning] Access denied ... foreign-input just some free text 2003-03-07 17:05:01 testr   )zSep 16 21:30:26z[server mysqld[1020]: Sep 16 21:30:26 server mysqld: 030916 21:30:26 [Warning] Access deniedrJ   )z2005-10-07 06:09:42zEserver mysqld[5906]: 2005-10-07 06:09:42 5907 [Warning] Access denied   )z2005-10-08T15:26:18.237955zFserver mysqld[5906]: 2005-10-08T15:26:18.237955 6 [Note] Access deniedr   )z051009 10:05:30z@server mysqld[1000]: 051009 10:05:30 [Warning] Access denied ...2   == test: %rzLine: %sr	   )r   rZ   r[   r   rt   r-   r.   r1   )r   r`   debitlinecntr   matchr   s           r   testAmbiguousInOrderedTemplatesz0DateDetectorTest.testAmbiguousInOrderedTemplatesb  s    " , ,udC  
<<tS1222#JJ , ,q
LLT"""ll4((OE8OOEU[[^^U++++	,#, ,r   c                    	 t           j        | _        t           j        t                                          dz   k     r&t                                          dz   t           _        | j         }d}dD ]n\  }}t          |||z   dz             D ]R}t                              d||z  |f           |                    ||z            \  }}|                     |           So	 | j        t           _        d S # | j        t           _        w xY w)Nr	   r   ))Gserver mysqld[5906]: 2005-10-07 06:09:%02i 5907 [Warning] Access deniedr   )zCserver mysqld[5906]: 051007 06:10:%02i 5907 [Warning] Access deniedrV   )r   r   r   )	r   logLevel _DateDetectorTest__old_eff_levelrZ   getEffectiveLevelr   r[   rt   r-   )r   r`   r   r   r   r   r   s          r   testLowLevelLoggingz$DateDetectorTest.testLowLevelLogging{  s   0&/4f6688:::"4466q8L21  {c
 1aeAg  \\-$(C111||D1H--_UH	__U  /<4/<////s   CC1 1Dc                     t          d          }|                     t          |j        d           |                     d|j        z             t                      }|                     t          |j        d           d S )Nz(%ExY%Exm%Exdz	(20050101zCompile %r failedro   )r   r]   r   r   assertLoggedru   r   r   )r   r   s     r   testWrongTemplatez"DateDetectorTest.testWrongTemplate  sn    ''!Iq{K888'!&0111nn!Iqy.99999r   N)__name__
__module____qualname__r   r   propertyr   r9   rA   rC   rG   rh   r   r   r   r   r   r   r   r    r   r   r   r   (   s           
   (  *  .  &	9 	9 	9/ / /bR R Rh( ( (= = =((E (E (ET@ @ @*, , ,20 0 0(: : : : :r   r   z%Y-%m-%d[T ]%H:%M:%S(?:\.%f)?%zc                   ,    e Zd Zd Zd Zd Zd Zd ZdS )CustomDateFormatsTestc                 `    t           j                            |            t                       dS r   )unittestTestCaser   r
   r   s    r   r   zCustomDateFormatsTest.setUp  s&    
$-----r   c                 `    t           j                            |            t                       dS r   )r   r   r   r   r   s    r   r   zCustomDateFormatsTest.tearDown  s+    
T"""r   c           
      (   t           j                             t                              d          d                   }|                     |t          j         ddddd                     |                     t          t          j        d            |                     t          t          j        |           |                     t                              d          d            |                     t                              d          d            |                     t                              d	          d            |                     t                              d
          d            t           j                             t                              d          d                   }|                     |t          j         ddddd                     t           j                             t                              d          d                   }|                     |t          j         ddddd                     t           j                             t                              d          d                   }|                     |t          j         ddddd                     t           j                             t                              d          d                   }|                     |t          j         ddddd                     d S )Nz2007-01-25T12:00:00Zr   i  r	      rK   rp   Zz2007-01-01T120:00:00Zz2007-13-01T12:00:00Zz2007-01-25T12:00:00+0400   z2007-01-25T12:00:00+04:00z2007-01-25T12:00:00-0400   z2007-01-25T12:00:00-04)rY   r\   iso8601r   r.   r]   	TypeError)r   r5   s     r   testIso8601z!CustomDateFormatsTest.testIso8601  s   			+	+
??)**1-
/ 
/$T1b"a((* * * Iw555Iw5557??2&&---7??3''...7??#:;;TBBB7??#9::DAAA			+	+
??-..q1
3 
3$T1b!Q'') ) ) 
		+	+
??.//2
4 
4$T1b!Q'') ) ) 
		+	+
??-..q1
3 
3$T1b"a((* * * 
		+	+
??+,,Q/
1 
1$T1b"a((* * * * *r   c                 0   t                      }|                                 dD ]\  }}}t                              d|||f           ||}n#t                      }|                    |           |                    |          }|rw|                     |           t          |t                    r0| 	                    ||d         
                    d                     | 	                    ||d                    | 	                    |d            d S )N)))rF   Nz*Test failure Jan 23 21:59:59 for 192.0.2.1)FNz7Test failure TestJan 23 21:59:59.011 2015 for 192.0.2.1)FNz3Test failure Jan 23 21:59:59123456789 for 192.0.2.1)Aug 8 11:25:50Nz@Aug 8 11:25:50 20030f2329b8 Authentication failed from 192.0.2.1)r   NzB[Aug 8 11:25:50] 20030f2329b8 Authentication failed from 192.0.2.1)zAug 8 11:25:50 2014NzEAug 8 11:25:50 2014 20030f2329b8 Authentication failed from 192.0.2.1)20:00:00 01.02.2003z%H:%M:%S %d.%m.%Y$z 192.0.2.1 at 20:00:00 01.02.2003)[20:00:00 01.02.2003]\[%H:%M:%S %d.%m.%Y\]192.0.2.1[20:00:00 01.02.2003])r   r   [20:00:00 01.02.2003]192.0.2.1)r   z\[%H:%M:%S %d.%m.%Y\]$r   )r   z^\[%H:%M:%S %d.%m.%Y\]r   )[17/Jun/2011 17:00:45]z^\[%d/%b/%Y %H:%M:%S\]z4[17/Jun/2011 17:00:45] Attempt, IP address 192.0.2.1)r   \[%d/%b/%Y %H:%M:%S\]z3Attempt [17/Jun/2011 17:00:45] IP address 192.0.2.1)r   r   z:Attempt IP address 192.0.2.1, date: [17/Jun/2011 17:00:45])F%H:%M:%S %d.%m.%Y192.0.2.1x20:00:00 01.02.2003)Fr   20:00:00 01.02.2003x192.0.2.1)r   **%H:%M:%S %d.%m.%Y**r   )r   r   r   )z*20:00:00 01.02.2003*z\**%H:%M:%S %d.%m.%Y\**ztest*20:00:00 01.02.2003*test)r   r   z192.0.2.1 20:00:00 01.02.2003)r   r   z20:00:00 01.02.2003 192.0.2.1)Nz%Y-%Exm-%Exd %ExH:%ExM:%ExS)0000-12-30 00:00:00 - 2003-12-30 00:00:00)2003-12-30 00:00:00z%ExY-%Exm-%Exd %ExH:%ExM:%ExSr   )r   Nr   )z200333 010203z%Y%m%d %H%M%S)text:200333 010203 | date:20031230 010203)20031230 010203%ExY%Exm%Exd %ExH%ExM%ExSr   )r   Nr   )z20030101 000000r   !00001230 010203 - 20030101 000000)N"{^LN-BEG}%ExY%Exm%Exd %ExH%ExM%ExSr   )r   r   z!20031230 010203 - 20030101 000000)20031230010203#{^LN-BEG}%ExY%Exm%Exd%ExH%ExM%ExS**2003123001020320030101000000)r   r   z#2003123001020320030101000000)r   r   z##2003123001020320030101000000)r   z!{^LN-BEG}%ExY%Exm%Exd%ExH%ExM%ExSz[20031230010203]20030101000000)  =`A.{^LN-BEG}%ExY-%Exm-%Exd %ExH:%ExM:%ExS(?: %z)? [2003-12-30 01:02:03] server ...)r   .{^LN-BEG}%ExY-%Exm-%Exd %ExH:%ExM:%ExS(?: %Z)?r   )  EgAr   $[2003-12-30 01:02:03 UTC] server ...)r   r   r   )r   r   "[2003-12-30 01:02:03 Z] server ...)r   r   z&[2003-12-30 01:02:03 +0000] server ...)r   r   r   r   r	   r   )r   r   rZ   r[   r+   r,   r-   
isinstancer2   r.   r1   )r   defDDmatchedr   r   r`   r5   s          r   testAmbiguousDatePatternz.CustomDateFormatsTest.testAmbiguousDatePattern  s'   
..%= L! L!wD| 
<<T2333j	BB	Bb
**T

4 !OOD'3 (	gtAw}}Q//0000	gtAw''''T4    YL! L!r   c                    dD ]\  }}}t                               d|||f           t                      }|                    |           |                    |          }|rw|                     |           t          |t                    r0|                     ||d         	                    d                     |                     ||d                    |                     |d            d S )N)
)g  ?|Az^%B %Exd %I:%ExM:%ExS**zJanuary 23 12:59:59)g  '\Az^%y %U %A %ExH:%ExM:%ExS**01 11 Wednesday 21:59:59)g  WAz^%y %W %A %ExH:%ExM:%ExS**r   )g  ZA^%y %W %w %ExH:%ExM:%ExS**z01 11 0 21:59:59)g  'YAr   z01 11 6 21:59:59)g  OA^%ExH:%ExM:%ExS**z21:59:59)g  @XAr   z00:00:01)g  MAz^%m/%d %ExH:%ExM:%ExS**z09/01 21:59:59)g   8=MAz^%Y-%m-%d**z
2004-09-01)g   @DMAz^%Y-%m-%d%z**z2004-09-01Zr   r	   r   )
rZ   r[   r   r+   r,   r-   r   r2   r.   r1   )r   r   r   r   r`   r5   s         r   testVariousFormatSpecsz,CustomDateFormatsTest.testVariousFormatSpecs  s      !  !wD* 
<<T23332R
**T

4 !OOD'3 (	gtAw}}Q//0000	gtAw''''T4    A !  !r   N)r   r   r   r   r   r   r   r   r   r   r   r   r     sd          
  
!* !* !*FO! O! O!b!! !! !! !! !!r   r   )
__author____copyright____license__r   r   rY   server.datedetectorr   serverr   server.datetemplater   r   utilsr
   r   r   helpersr   rZ   r   r   r   r   r   r   r   <module>r      s4  . 
2    . . . . . . ! ! ! ! ! ! @ @ @ @ @ @ @ @ B B B B B B B B B B      	:		n: n: n: n: n:) n: n: n:b 
=
>
>a! a! a! a! a!H- a! a! a! a! a!r   