aboutsummaryrefslogtreecommitdiffstats
path: root/phpBB/phpbb/log/log_interface.php
blob: 5932f722aa23eaf27cdd60b9f52180fcb7b88a72 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
<?php
/**
*
* This file is part of the phpBB Forum Software package.
*
* @copyright (c) phpBB Limited <https://www.phpbb.com>
* @license GNU General Public License, version 2 (GPL-2.0)
*
* For full copyright and license information, please see
* the docs/CREDITS.txt file.
*
*/

namespace phpbb\log;

/**
* The interface for the log-system.
*/
interface log_interface
{
	/**
	* This function returns the state of the log system.
	*
	* @param	string	$type	The log type we want to check. Empty to get
	*							global log status.
	*
	* @return	bool	True if log for the type is enabled
	*/
	public function is_enabled($type = '');

	/**
	* Disable log
	*
	* This function allows disabling the log system or parts of it, for this
	* page call. When add_log is called and the type is disabled,
	* the log will not be added to the database.
	*
	* @param	mixed	$type	The log type we want to disable. Empty to
	*						disable all logs. Can also be an array of types.
	*
	* @return	null
	*/
	public function disable($type = '');

	/**
	* Enable log
	*
	* This function allows re-enabling the log system.
	*
	* @param	mixed	$type	The log type we want to enable. Empty to
	*						enable all logs. Can also be an array of types.
	*
	* @return	null
	*/
	public function enable($type = '');

	/**
	* Adds a log entry to the database
	*
	* @param	string	$mode				The mode defines which log_type is used and from which log the entry is retrieved
	* @param	int		$user_id			User ID of the user
	* @param	string	$log_ip				IP address of the user
	* @param	string	$log_operation		Name of the operation
	* @param	int		$log_time			Timestamp when the log entry was added, if empty time() will be used
	* @param	array	$additional_data	More arguments can be added, depending on the log_type
	*
	* @return	int|bool		Returns the log_id, if the entry was added to the database, false otherwise.
	*/
	public function add($mode, $user_id, $log_ip, $log_operation, $log_time = false, $additional_data = array());

	/**
	* Delete entries in the logs
	*
	* @param 	string	$mode		The mode defines which log_type is used and from which log the entries are deleted
	* @param 	array	$conditions	An array of conditions, 3 different  forms are accepted
	* 								1) <key> => <value> transformed into 'AND <key> = <value>' (value should be an integer)
	*								2) <key> => array(<operator>, <value>) transformed into 'AND <key> <operator> <value>' (values can't be an array)
	*								3) <key> => array('IN' => array(<values>)) transformed into 'AND <key> IN <values>'
	*								A special field, keywords, can also be defined. In this case only the log entries that have the keywords in log_operation or log_data will be deleted.
	*/
	public function delete($mode, $conditions = array());

	/**
	* Grab the logs from the database
	*
	* @param	string	$mode			The mode defines which log_type is used and ifrom which log the entry is retrieved
	* @param	bool	$count_logs		Shall we count all matching log entries?
	* @param	int		$limit			Limit the number of entries that are returned
	* @param	int		$offset			Offset when fetching the log entries, f.e. when paginating
	* @param	mixed	$forum_id		Restrict the log entries to the given forum_id (can also be an array of forum_ids)
	* @param	int		$topic_id		Restrict the log entries to the given topic_id
	* @param	int		$user_id		Restrict the log entries to the given user_id
	* @param	int		$log_time		Only get log entries newer than the given timestamp
	* @param	string	$sort_by		SQL order option, e.g. 'l.log_time DESC'
	* @param	string	$keywords		Will only return log entries that have the keywords in log_operation or log_data
	*
	* @return	array			The result array with the logs
	*/
	public function get_logs($mode, $count_logs = true, $limit = 0, $offset = 0, $forum_id = 0, $topic_id = 0, $user_id = 0, $log_time = 0, $sort_by = 'l.log_time DESC', $keywords = '');

	/**
	* Get total log count
	*
	* @return	int			Returns the number of matching logs from the last call to get_logs()
	*/
	public function get_log_count();

	/**
	* Get offset of the last valid page
	*
	* @return	int			Returns the offset of the last valid page from the last call to get_logs()
	*/
	public function get_valid_offset();
}
$E>92J{F4^p%uCX)dXa@G[_~Y1 {\GK">6Yz&%b=E0ny?|1ƩCk}W9s}U?אa \Uid%![T"f C(qKqŒw*k( v+_|6b εd}[9@Y {+Nh!" ;@JoN(Hc]ew\$'m@\2e?vBꊲ'* ׹*jao*F'c$!>g^aL8hsh@գgc*5%H/{7[݀$E@!܍泇vRR5b t_NɯJN1_R8̏`Yb%ʧR=\*}lT3e6H*OT3BLGG{0!K1}zF MqCcEr٥GT:dXI]#r@xflOTz87;)0tsRS9BQݩC+fB)t)P22Y/idmzIjn+Wi >O{~gR{)s<[/J,Hsd[%xEa?O$%~/(VbwG Ϲd/>Q(_e<#\tϠe(%[WqT> H1L &mrt.3 H}Oͪ(Z ay@~djBHӶGv}w;B3jeQ4ݔt+XFt+;uxše6l{}Jjנ8W+7urTÁdZBuc3jr;qOenc"C1vvwĒN_6.C 6Qo3p&vd4|,Ow?wK*s ^qfRss}eKQ)tx* ?_@xɔoBǧ N6X!]l{ < !j<&X){IgÎC⨵S<24Ӗ3lYRNE|M9<] @EҎvXs͹ ƻ9H3 Dd&^?t1eB(?TK ? zL1)aj=ߦ 2U/4#91јSUH[Cӯbu)N-*VYpbSh="*F)8Cgz0Aq}nU:cY5"SO~n*7>li$U׺`̼wh3;[LC>?K=&AM>+931xn ׌,EMڕ!]a<^p|{LK5jK`VIT[pْ %EKԻ$ױ\vsd Hsaۘ6'0" ؖ{o {a(ܿDZrarz;t7q!k>4X_RCb| +}ATw%nimHUF@UTSŶTy(H3i|5gu )݄s`o+Ϻ 3 " C9hKm9 Aĉfb5z(AvQq&S9A\%}èO2n,+W93K+=q+ +f2 ,˨wZc@U8~7\_Rڼl=&,G6٤._,2ξ&Wo{jL=Vr4>B;8qo^ DvoeiVy]߾Wn_trĨf_ l]>9,ovJ@bG>C4VDӿͱ,޾q+b5Fg$E  rwMՇbEwMBw1u'WjOުY4'i9nƕZށ=>fͰIc\RgvYv[ړp}<(PBS8(%Bz/ᐾ3SvcQGAArLJrp 9R:UY #dQu 9{UzZÁ>><ίK)׷)Uziqjɾ+CMbyI]0?U"ey6w[NvW৬€=%5KKGg sōJVjU-<l5UEeЄʍ2JՒuGQr [jҞ 5|:ݽXj8P vpQIkhUdrcˈXp kyV.(/`3ib(H37BcClw.V,+lM^ =L8/#GCdI`_f}Oˋ鑃H}$gYqFD/,WO}Nθퟏ"J.2^8mJ1ЅWv;z$>]äqk9fRWӽf\[=P =ox䙳֢M??`x4Z8*\գ#ZA>EDE~I $4|8.s=}c4YXO5b Ѱu>~"g}j=`X&ݠoTCD*)ݡ49L㋘1/T1b}᳼ݧV)eL1UjǟKC-VI_[={r2 S^}JTAVxT%?Κ,Y0i{ϯyUIVLJʥ )Rms~ٻrԉ9'6=˨/6"-Fko/.4.v5[Ѯ_hZ!PpŀV!w )б:{F7_ J=Kb1ݎ]HX<۩]fVs.9A( /:Y@Z|s3ՅW\V 'f:5sc2Qu~$URzp)oGhaxvQ{-+-ܜ6vEu3S`^(l1t)C#FlK<$_3FI'Z5iA4bxxSh%:"MSO/P;?GdDQI깳EfhS }I#s?.a9=:k5Rr:&zImbew2OL<`H ;$yA<;>x̗'fϓQZ/xQ=]:hflќ"]8[re nkіbkMk"4a'H]%Zx19>/ &8B8$j^c[jrMyP05 KρPW"57?D“DR&ׯBNۂ҃YR<ҳpW=BrK)7iH |`yg6J:̏2~>:?[~KxJ4h-T1[/5`cLg+[Z(_P%u,W1羏HaNK42Y,{lC$}rSeN;yP(bŕ #ά%ah`{^qj#/  @}CnDQj%tk~7Cv+\vV )9 c Dm4:Ƞⷦ:Q:gTFM K;ӎ -9vܳ 79&Kd9YzՎZ?6N eDD՘& c%r]y? + 1O36{-ձTi^qhtHD=Ior V`g~&-fS KT Qiؼґ6c~i^y.L44?}c w] a2[ hk <>)8͸"/cn]"ls(u@&z )`PØ[$:2rOӆixlp R>IUMZyrdلJP^8HG t^q>mBo_%fJc,ULJ;gqx ҂,x~퓺Tz+HGch ӿwӌWq<NW'iU$IhL-^/A 82+wq/Wݑa_E-#| e*Ml'&a0=ܽ{{#UO4/[!sõF389!6E^| Os= - ,9k,_q(mؐÉXkly(l'+sڭ] dH[)udGN- :cGw1#ג>'qXyn亃8[xBl\F-y?z%VɵT(u#A}X_NyVR)m}=u={ٓNJf9 <Y ;Tׂ%JxjBs+VâaeFLݖ\w0Ia^˼J:u:Hu<7m䌧LLl7ơuDzcUN=AHG}zͮYq9$H pBmSo bUsےN]YsRVx0|Uж4S~r'J,awDS齀W!##@\V[߹΃/dQoJ-bϡ b7APXԴ"R qUNvȿL`g&0نIG4i0qmz^uM!Nfql{ra%yjiYxՉIrXym]o0=҇\S.onX@;)% G)h[6nkb*m)>lGc]E~5 :fuu \YmH'%-`ݗ9c{q]$}Lx[Ң_ן؂58H\& i ٫N^F ך@q8K@凋Y'ZjK˓W\`hXBlCԀ.DeWxක7ϙ]cE5hbL=$q$ßyD#gC5nmxujqJx3ìݥ -ơ죣`pD`M=G).t O(T6!~j4BRgwtY"v V5 HWrjغI.׿{Za;oK?s yi k K!JPeTYܘsSsWJn-ms$Q.8A% 2lލ͜0`?[\s;m^RaĚ|&O׭e"cp*W_!g]WfP C- ⛡vehʊSXަFR2牞#ӗ&:uxDGW'M4ع/|K r V:ѨW ت)|)Qg6a?N#5h^ԑ[mmN*6A x`Jn4N,MJ%tѹ BTzEP<,2eHkѠ!zw^r\yc(` l<]]T@jYU%=66A ezrzZ+ҹңz$Gx۟Kc~-0>aJbm!@)䗁>-RtL=fl*@*{ClMj,y+ǖD|A\9E|#߸k*?S5CGXŇvo٧oP+Q%KǜjH=v~n*ǝ&Bo;_N\瑎+w,7>yS~F`4=}rnB&fEtnx+轴GIu^TE2eH,Ret%=]X^"ƽ[t GT^.m8@YtDC%ͷHM ǜ-w[GL}}i}K2gOz,q3r%]'Urf6k?<>m{t&TWCET熨E1jg(0`u1?-GU:~v_<o 24 d(\ Vx 2컂SUȋ=NK43Q3ewS w^=ۍ'&'i@&^c)/ZP^Dl9} ª" 2iops%Xy=)8y澫/Q81?7zd~^jZv@̗´ vi|Jb~۾[HgV@>{|U+̓虲菒Mf2(Դr#dȓC PW4ھ ؘ£->uޮ֎7lf Wsub7eg^7$<EX.&J#"v\zAH)IeF6~CUu_'re&,S]G  JId^>/ظnJޒH͌:u>% $=*gcOZ=jѬ+8~>s[ßYUFa6wӕ.6.ԽU=?dVS('IciLvGM(g ZC[b=}By}lg91KDcggtyQ:D?a2]㷏WO0%KP+^WPA7)2ժg&NPdUUHu{Gs뤾(3rSU3x8'<53Eڤ̩,k%'JKS[.8Q#{4L x !2kN̫2#Zxϱ$)OTKhm Wᶠq0.mP d:,uQy 8R2m;zdJ4D zmꑺ[m/ᛤ[WnT1]q#N?춵j;8m}XJ<+T]%㎛Ғ턬w봕} - kߍH,} Rj |N8`2Ѧ@ģ$|͚f§ {UtE )2,A"@h[F62r֥c3kh#W?Ë#"GVY;XuYcj^;^aYRK iKse%a5~}(Ae'J]-F\J؋ ' PWm*-}T/j@U3G,k_jކ֖.ڽG;S~Z% HiC1u+|P!]|+ @]DuidOz8u3Xg`!Ջ [!X`fW_TOVt*7pr8h1| K=զlC<-½KP}rˡ/5I5U(,^<"BXw5OÀ9Ik&EQI}QK3H;tϢm9) *}_4XF*~?B {)N82E<m9^lF]f"Hޯ_<h(`#c.dPֈ+$_0++2Pp;'̋Ѐ=î ԏ&wD4e8" ބňW~PRS*?lG^CGcԼ"VL,h&s:S4gaГ|m@K `!?6 A  -9,^l^8M1 O4(V@? CʰPPm]wXUQ9'ܒNEYjkCs0]nٖ[=ɛbU3쏊̮T# ͒O+y8PZ,2>1$9fvDZ0 N"VZ_8T@[⚰:q Ƹ] F֝?e(<_25wuf%MrTf$]m%BrdE|YB=YJJ&_DDaPEAm߻ js"~ 9xո%tmP>λ)J>DĵeWcjQYf89H4,G؅hVjGfc_lThZ|e@KݠBd5 r@BeJ,j2˵Q,pb@cNSK 7"JJ6~9Gb~Velhl<>'a+<̎~~|5[gqw֩VŮїT/nD~@|1tkH숚bqtdz5QWz$A$71P:#N~cMZVj ,%I7dTplƉ!@DkB/'Dm4\ΑVHgf7Aooq'HRI;b3 >t~;[]a`6]/⇿Ģ@"=?Ȱ¤3ֲD-,\[~R  a1{WncErCAͳ6زnCdXlLn߿8zj>Z iصsyb`qع\0,0:{u|k"NZ4 >jX7+֎rDpU*-.pWKO@ɸ+oZUf"IGftܠWmiKɭt-cw׭ U yEN`/p' _Imr Zn֤Wӳ/-of5%D@ZwNQ$ 0le.4Vgr6V[ RYE'V_0.s0p~V {`w-׶<USf=:E.8+2mXC+\t*YMlY MU7 [ĸШR^nei5;me!Ox: :h;ZC$|p/\zBUlgZȩ氘F3(:PJHT1@-6 d*@R}ЮmG gFqR4*jiMUb&^\6V0q ^+RbXh+ Kj&;oyMwҍ[4 :H[\ أ?ӇzftS3FrVu(xK&nl$dۍ&ZdhZ*7JvM.p(ݾcf;Oa zX}g8^dUsζpѭY 's۸!Z3]" ry 6sEo0I)+rQ;Sʾ2͔Wqu7(4W{~}ď|wAMޢ(μ;ڬn^BVi$sKOONEhcZ*ݖ=z~Y\>>UИK4o/esqUtsn%5"T#5cW瞚1znpOX@V-2za=((֨(a>qRjhd/ϷTV9X O5MI@ (3NKNA^O" MR2)I.e;0.p*8SEن:w_lQP)e*?<\0KWKN AW7+o> :3!: prAz\6jn?U ijg=L,XR xT[,5eu ɺ: 1;d욯0XCԥzq1 ӿ,0i/ '(m#lFYИ/t\F?ˆh1m3tq9Yj {Mg[v ̄OVK3AϾ*t<'t3) KSw6?0 aMa qFTk|~8r)'ѩ ЯVR2b^ x[]^[q̎gܨvm/D~wUS03sGؤFX+qҪ^`eKi3ˠS*u-2bWIOH^dVq"rMzbR *KCh-">RVLzǠ2z 8vx{̹#v{7[Ux2 ђˠ+o)*3>8}Ӈф6$AEDAQH/'8w\[koylqIE>1\[e.Huvt c8YaqE.@4M.k,g$JɳMyK<"\A&TQ 2Tv=pKE [+lQnO3o>ZY䎏 ၮc2keX$@Ҝ8P։gq_Hw#,wLbjXe4{:۪t\ };,N?"+sI 09u`qdi&ȑ>3l4%ЀNZBA!n^@' ) /]h+ hBm Zely؁`IǾ] rH{$Uq1u`ghZ Cvk2;e2h1Ǹ8!4B0WxXJk'誔j3U~mRG!GWb]7ߘM}+jLƨ %Yd%ɧE[{\GP.kݤ!>N<>0I-`*SKIL9D*pډK8.V,Oy͒ktw4ƾBBW=Hsۆ%AVzsz.'XVaTbD)cp}%GUZnh„5߹_BH~)-*VI;^ibiohy'|> 6N^/C+bXDb]{k;xƋ`짐 T,#ɞ\`0P#c ;[MbKfFk5+1nTql(6Uv H5_ }MJÌ&b)AnESլOY}H^kB] ]D\MGۃ%j6ڴߞ'/CN\-ҷMGL)Dɡr5nw&'r6rVslhշ~&L[ΖFhw`p>.53;4;LtX++~۟R"͟qw[IPm/NCoi8Z"얝ZE%aR;1TGxLwKI~p3m'_ *FGsQnJ7.\Cvu$ !-Ẃ F(Ejb_Hk5%-K0xKSnB{c%E s%hXXmeh5EsD) } imm뇝iwv3S]ɦ6s7蕽A@uWsG2 |h`+4Z`5ɟ`F` 5ĩ˛=-S8w`x]'}ˬ~uZ6 @*0WU7T CS]t)9)ٻ@{PQu `Q ^Aod8DerGQdN@^`a7d1+ Chy ܈+UxgFV$WH6GذKGl9G:_'L٩<O;;&Ņ-I9X!HCq4p=*µ= #4d@r*5!B>$W⊽`EMFxn 4z[)=as*$S- -)<$SFfMl)m50aj(#c/Ta(X5}/+fW|" >o xy^]\Ci<N㼺q׬ sFD]$MjKklPCW=D%lMeO0@Ԭ29a)3wp"clB3բ4J:>@lNvO2MTw)TTv x^?sjy1 }Z &6A{v_eDtQF7@we T>TuI 0 uI!YD%-S,`+ O7ub# 6 jٹ{h3 U]Uㅄ|YܸV4V4c~AFeE0uH$_/}AbK} ȝ oN7Q]Ow,Ǡ~UF.vaA[[);V=M`FMS SAa@#e2RsEbݓ2]3 ;lu!_aVU6|U@Cre~aobO/ng䵁~>x,rom15 Y|DRnKCؑYH^#"n4^kW1a#49mC]e<5o:B-S I%ac Q(.:1vshLO%>n+Wg*xB8猩SxkMfy6$Do2eL]<@^6m(QTᕞw()R{'E0ǙǨϾVtRN0rX8sS6A_dcZ-0h\|!2]l)a-{"ҟsܽp^C7R$HkDbd_#Z@+1}C}Pɛa0g/'n-z|ٍ 4kYddOU=+XpĘ$du4>:+X.X0ZB}B 7)) #28R;e UAm'{dz㈣׎Rm0GF`/'#O5HΩxفB>h#uɖŹ@^\S4Y,!8F ؒBrIQ53g'fKW?M y ĸS iJHd'&! ^='Rg5|/ay+#adk$ժ]h \xNZ)w18^D\7,9zQ^O/X_>HnxS2ꆯg-p4 (DСGՇdb|F1q7FcJ\zw3L^'(ۂca[ `XCk}B.vϙ XAÈl2 \-j2j7-׃"#'kmfY?%uFa_>刌o稦ת MTnO]?mYK(Bs"-њ=h7nV o9b bu?pv3ء}TtPHzYk|Z/c0'}LæKT }]\A5dro(")fi1. J+)1 n \&s5}0cu˽+i{'z,^@mWWܼ-pwTF.,1jcjm0p&Ш]s"&ZMCQ;R'^zK/}ϯSݹ3qzx_Yhi d73țASwRtid1q+BT6^."#*H}iZD ݚk d} Dl:@9==-]*s4k"zՔhPt%%/ިBT)B3gNG_YP<#`&,4Px$70~ fJ!P J o/K_+a+NE0G^ qI9``^4DW̊8)[Led/.)?wnE/1K$CeFO2BLtp"b`k>|i(LS ;S[JDBZ+} {I]wʒ?è[F..dv6R$Yufg r6୶^mu84JlpXcMh4J~w_lwU-h35^J{uǕ^D_X`.54]t1^d,.?QUwN<0̚ يmH  y17F/\S9vEؒ>3fɉ#$ Tl@=]j^uӈ?5e?=.q?ﺥ$#-Ov#!K-alTsst0*fGb{-e+A#&:"H.+6!UMllR:FH3s$b-LgX6 Oڥ#ci:/6E,Z_7S|W>^N (`yxTt`C)kZu"ЪܥsF?yЇ7(NT| {Dgn'YzFk*@ydrG"u0/pf;dJnPOE|x(2:>^_ m;=W%~h9qZrA5w,ܗzM%yNB4g*g7ﱻ q >H7#HϠy>ܙ#X,#df#ѺHV\ ^ m( Vus &}7咠VnP׾e@^P81+҅fjRh RJia7㫕4঩詤6XΣ`G~Ufڷ}=ePb]։ JM'd0P]*Q yr>I[4rfWc)5Ky G[\r]~ܿl;t"OA'W`yk Hylb⊎ݑzK~4~ˠq2l#6L3SM5.u kS͉VCq쌮jto!oĚmؕlO% |I1ɽbhJJ\렍"(M tUԫ2H&Rv.Vu=/PI8fPN^=MP&Hwq/E:12Sq 'Yl^x\[$jԋ>J01!mê^,PNWᙣNGsTnUŮD :cmhKW;S0D%ZRɺ~ג*2Iw}lb cbJiGF(㋋Y0B'@$R.~DFӐ1OEĬ_ U%)vȾU'Vfk+ib:`-V/eG`up8Fܿ d jf\Ϯ`iKŕ DEIx/dQ Bmv̝VQq5x 6 UR2yW4Vl3xz[o5EA{zo1vE8&:4bVdj,S94QZu_?nIbrQ 9SzMЂ 8*ɡ=O$~PVj^im Dt=%ު1,%(v&ًVAiYk 0] Dʓm6p;n@o!!(̄{.U_;٭o:.}@W]X~ ~vzZZwL2U)[^ :mp9xʷuᥒ3 B=|M,us7eo,]-dTE^<.v{VGۧ.9H`WGC>D $}(C)_\"2S:7HB}"("MTY턙 8>9Xq쯏 ߤ/ֽ|^iwPX%p;NP2DDPH&VLs 'V[SBW3(Z+lu^xseݦ?ɷ=2*0rJcbcJZSWJp?/U.!whMx0Ov^X/OMuUve.9+ )ly5/kViwJ{r 5.^ךG;t];`|&WBO"]Y9sb=Ecdi؃h~]~V{3Wū[˃;i%+ܜJu3äZ_r,S ɺL mB2f TaGX0ޞX_2A@enQl Tj\7h$yx`p"9)R Sa%:2cvAw>Z]Ը(ó lXDaYlWr>L3 ^ ls!4e+jrHe9nEe;,"tvR S&|})mF$$~-4tY* [hK#}AUq]:Iİ6LEXeHiз[~9}%a[d6e>+k)io#B-57`moW`%v"CR0XpSn,*g{fǺcIq9 +T_(=иL-ks XV9͆oQ ] ־,[da:7`Sx][kIE#}n+a9׎iƃ=_{2P^A~̀}qX U^"eR}2`#h5nkz_Im&a"lv/m)DiW XleA@j3. vmw7%ߝ;_it~R%gw(3JFga]8pj M6;\JK;x8O /$){ 1&1qXn!pߴ:-EF`1| \r0ĺzM ++z|x_-'IFUvvg!蟦RR bs_uIDD`=/@ڰ:7rNM$h($tNiza륽/rTϖ/g p(LcϥvZv)q)˚J94%׌$n#ZI wPHAtgW@h$bJܱ!ʛLc=8a!^s6VAO_6'` `9_M7ؚن>=w0*C.CyP,2];L"4(8զ oE]nF2 Fɀ4S>ιo, >Lf wɬlKEzonL.N5( %ntFHw,N$83 4{i[#U{iȰVNtް1xj ՛"njj?Pˏ D`C_rs449MȒ[},kd]wG+j1xZp :|gXriM<ښ 1 l-=MN>p$>w|~C:LL`ʩO>LO^Gd.贷ju_$U7GYo ˊ :Fpߔlf@>:Pj6j|b|u`JeG^TBp'1\F@\6 φҮ`JfCw'_m+~ &03_f22q gj4޻{wݱcB9c̦ig}VЖ.Ps %qڥ"mo&1L`,3w*ݗ+Yo*wу؀L^۬i0%`OȳY'a"ЗR[hftǬW],1c$O,ӜU@AcocY}%!Pc5RffR 7jޓIr+7 .O^I|ˢS7MAXGBiObm{6`}^X[m\-E @К, :ҿhgM(2B>2<رMN@M-b9@ۘ:UdfқS24 +}d0Eƒm0TNCǨl.jGX@R*&}/bYO:kOn ;'ؐAk< Ru2/X3QFJ:טP o-pu`$2uc Exrk?/m TM oL@QEXAq Xi.)$l7"P2SXwǞR#F{JQ'~Qي:)Ch7Uo6 #+ ȜHL)=qqߝ aÃŤ*x|iZ[,k 9p7ig媢qo['Σi38XUd ?'#k U6RehA?|eс]B ŧ/O8qTT/>o&pSPjbutGcG~(^۵%J00jY0=S}0Bo2EI *yno xWbY v` E a_fH]zWri*Bc=zo*ō͔ vHYg]C 8_2R\ˆ?V(O` hPC--cH M:4=:Ȓ+qv'1h-Y#[pT}L?s Cr .>s6:{iB]AU8 Sc %nrM 24 (}j5*]FF(A3 K{W{|>F13.CfkKJ%9%8@>Mk!#pŎ!srb kYd .Bxi@կ$]ζc#i4e9Om]9FUvi^ȤX G6z?FYl\fNF #8t bC[K (_Vo.wfqR2lRUqr AܢNS0 r~@Q)to#)85+BBm??r^o߾U,fTWXpSISLp}v^\.?-V%=5 1Xq}cQS4adS/ܶo'{{z432TܥK+:Et8A@rZGr7Hk}7g>mߩ{;AFKɡRDK3:d?e+f GLTx>ZX 7!=<^0nCQ ܚة6gD _ l6 *Fe0&d|J{J:?uksމ[h=fuEHYlT,j@!Y,3aPTvd =S ^){V{z.@65nbA)Q>zmߢio&s)P%…|k>HFj2)H ֞^-,Z]\6|F#c'dc\=Dbf/:V 1ET|PTQ2Efah3@J$P35dv<2Y(r@eZ0#!no0JɝBb ^9pEQ*Fs`roդ1udШ#yg""s)Oq. TnKG"n4V:x!0Yq^?D:;$mKWuY6W!xu #sxܷN < fd8${UjTuc ):?\m-قM):" )x " 0|jփQߓY,']%D *mxfB ug+X%Wi,B#=\_|;zTBdqE:kkKa)O+=َ@2t @+ òtLd̏ iC'&]. PY2M@6_; @>8jE(r:F~TZi U1 OuBpc"X>lԗߟ -B>4{u/ %`hB_=`f3y0/S38iP=6$= o̧Өx\rRX-KRiXzO}վvc^,&_LC=m ɜKlYasF#owiӣ W+ d^+FR:fѾ^ƐG~֩ SS~pI pg@AL*g$4\jMP2% h^!ZVug)]qmxt10q%'ø$%yn#fkgNA".j`=Wd;4¡FrԸhOt#\kx7Wc_=,sf9]W!A9yr(YَMGXf>;6P&vS6vfzz.\^JC87R&HJ+iy[Z̔ȖSdî*We5ʎyQo^{lJd0PI/ꏔP+.r!G1j:uV#L3lhvs,K w-]ϊ@VŸV%A֔n`(1% *>+勡Q -CmmsZf bd3,P q [آy;mEh ,m f8"Ьh?P³E,W+0fA[e WޛϞlx!huv9 (6Jx3MKa{In1=iN\k5ǧɆ"c}8h&#Y nj5!*8#;ں[.߿8^5GRyggž!iP\ѢyQ>DVdJ$a;eD1GUumP38{ Zf\nO x<ӻlANd>cm:'gxsCƆ W1}o:vHjB9O :w Qo}u d[L@y!ृ"RʅE5lf@ua4C{qv;E*r$$5C=׍&8fHë-&ʂTjp<*9؛w <ٓV,94SȞZ=gN72xi*l`8|J>?0"| mnN~># ha;EFL$OꥨΨSv絛Jxjϱh0KW(T 8X&#.* n)2ir~~^$,O5B ^s4Tݶv I' # SJ=<y߯qG-PNfFd}GrtykǀÍ/ٌУ}?uJSw٠&+bN/η5b/ER$dxѰ$lr,J+wic'@1!N !MԸ VQ)E/nt)oz7Ui11v,^I (74 JOSz:I;- Pr zv-}ɗ:4R"״fL sF³? &Gs'Т2X0JViY4;;1zSvHi5_X? cC/H0pCOMZhl.50^a-|C5G$RxVOa.M 3 όɿVHT/ Ǖ!qWSenoG˴;}G^9# :Oxe쿵b!Qa(ez.D[A)~j? ^*@Md֮lrC{0p,#8JԷx򵏹h?O8Z{ j ->/ه"(,zg$4ʍ#@LA[NץTt׎2: io\ 6 u Qϫ{a9\&L)@ |N|x߮PȐLOeobτ]fFokJl[[EK.uF;ԗf&3#];TOPl:zr7gYHlr*e1۰bDRMry1_aVIR{eO/^Siչ>KP^*)q˟QT[A4-u~.A>\?TC\&שVxwDp:=Ǡl']mρqu ~jbDj1hwjJeaX1hENҘ'fDr!S.c3B, J׌RFy4(pW _)FG;ׁґ=djO_sFO+`"VX1l:eּvĽVƋuS@?W[^S0둻\MLlv`8Qk-6޴Rqݐ%H0'9(Yz!7QLK@X̿*( ([vTXyKʤ';~:*EOM-P[YϪDhY [4MW'6"8v(g95ncqi~ Uud;faHA try!/{=E{}N&ܹN|bGpWF!0ּV`~t{#eo" []tQ&6Qy ɖp+O/Cf!sVp  P9DIP$HZ#kHܬD>t[qځK&5Wy0|-᳣kz81(6HmZe/"΂u`Ĥ6(7(%a\=Rbv.g.A(黱&hP*fVH Cߑ?ũrr7ieďg YЖSh\'?z]5hYp[(Ez<ʹ7m?; Tqiq>N[ aq45^n^Jv[B0@pq*W~xB]e]Zt6j|^k#8^O6g%(U:>5ը\1j M,%) n[ TM 5ッnL-h)4NM([>$(O pȰWsGԝYFڈY$mQ`tl|<rdnڃlE[,P`Haԅ|2~ `_ޗK/`U7`2r0f͗kln7ڣ\[C+(kWF\G&OpD|f](' vڲ c _0& OG&):Ζ:m%fW^UWqV$$d+ʀ䁟C0\NӴmI#S1ʐWWTj }1{UBVX]l3ķFz(3:H '!=I(t "p y"K~ McOs{:pAFgQoh}+T08=n%/+d;GKw?Do(0C+y>^LJ7nBW6w^ r3짷e4*f=g&H{0xDDUfܼ"bsr})GWEyihWFs46*0/s`+SeW==$]x$L@"yUHڴ)ݿ>%"Vǟ,y5ٱ$@׾K,bFu !}=ꐪQ'OKf$XãT 4kr=l@1T1;G;2^LDw͸ds\3_ZB2t<3 XN"X4z$ttDѰ`xQYZ`f,&3̏DV̭GǸ3a [LzxIU7pM:nO 3TJ]:oEXlHyBadQ6 GiL( _-$s -&avOiy-Cq[1cՇ#Bw w= ֝}ݶ2JUVIԬV41xMX؀zgMYՂ1`Tmm.yx+ .]5%5XͲ˚D)[Ua.~>ҬbG;&J4}gX6.$sjc@xKY[|\uEn !S-oiف[U9:VB08‹? "O!jxJtODQ r7n \ƃ7f$J"j=TΤ+a>jс$YGP1/ и2:a|ϣ|K;INjxltwlH(="5b& hwlo0,kOyWn@\,b&yFMO_'!Ph%=g=zyp50C]h'6ݮx~?sw߭3 @TC ;P B@^MKI"+ZF ]|#iqxHH~Djŭ!^Ld$tHU|`E-FɥÍlklɬrTU&  C7 N>-VWB+x2̿kˇgƯu1l0bJȈAL LDYz1&Pxe >kI 5;eSTХv2Ⱦob3Hl)NnӪ"LRq)#5F}K0!j5j z'I!.8nB؃` S R"|bZ^ͷ;-$ s粿SXY4H%S&Wzg1̗ѥgעkd֩J*CCs~}}Rg)`:ƨ:ͫ0Ԇo]9$b lM@'N}5:aƅUz9#fkbf7n䭰U~0op SU^>jUS#4Upʈ"NGgUbt"ӧʸJ(­n1[/:S%PmV:Ǒm<*ONC [*)2[H;->ImB^!d ԑ=mqVw0bޠ. S/@c֤Ry7k7r ~vŤ8-}=z !ͥۯN 2X&nL3!'Cǥwh ^ wGϥKKA}خ9\eS*&ܫY\nШ;q&.&;W^ީ42V+k,=XOu"tȶlglHn<0l!eiM"?^ڃ'wEu55ºQDR.Lg "Sv'boijMP5 +b`h Bg܂1G;u() )ׯMѻoHDٗ>u1X)Tsb~' St||+V-~IA!B,+#nLXgЫ:.!,|>8IJя6f_ӓ|a"}W2*p׽YV]Szʳ4$[\b5aInT\G9SzS7 Գ)pgW<W}uԒ_SIr4c]G? cP3cnQ!u ߧ'}T?]IRAu$:Y/m/57kC:8KAT\v-SDqH@azq X9l mZn*6t">rsgsbP5kV]\9 c#sė ǥ,wޛȞfMG@xKDrbYt&r(O|}CǢ욖XGc4E1 Wc v ]u2q yEU@V-LÿBZ,\-R"ϵ:Kl0%Dڲ]-%̧EZ$a ׊ v < 0Ōa*:\ߞڦOcwL57{M m6o鲡֥C5w@q8;2iͧF5=*u)+a^LyiGiaa4@cK*yXɩdZ[tbi93mCv[ gBLU2))W[wTVD8WK|ֳ2Y\̭Rϑ k-V Whs'L io*knepDdEn?BnxHPi[fk hsvj \aB7HJ3C 01lGx#-uHX "A0c!vƺQ 6o0 ,"I[A4z̰it-e.K;M 23[X2k)i񌋐h$Yh̢KP2>賷Mai4#.ZbA8{"Apmstf4,bF<@kF[&]+k_fD^@hVrLXh#"ݽ;{De):Sfx .Cdj 2g[:{ M*$6ȟ=*UjŶSx+Nf&+ {7[a~f