3ZTM2Î<<,rങb&bڌJYO&Nbx['I&>Cˑ룜"Q-EAjZ;I ,8ʀP TNe3zNiwJ -1ҋmf! |u-@àD"ݾ=9@Hɺ;E̻LR}$*#ռAɾ/wi)\5IMld T2b3J{} 躦Qz)@=U [HH!{GV^9abqGʤPP9PTvK(JNe/~UΓ{ QXG>Ap0 [+by#2x+ΠXkz+F-f#~~ʺ:tvsSԒܭ󯿩O`i5?=,J೺2/7!gGG%Zm wxwg`C>E*1{*JrdqNsLs?,Er.:KIEi AgT5Ta}7)龄tc<߫Yj7CI̩O[1 ݕ31ft0by Y)i(N E>u"G?)sިCW-Й\J]L玲: N<rr Ŀ:8"Yn<Y3bΩ{:|u8'5,&o;ht?S`c oTe%޲1l oJXnzz֚>e :8!"z@ܖ/d/{N:h{7Ae#yXMo ?:ӒJ6[da|13 lJha:u.KZjy6A2YlEMK2 37XȬ̥+R#-Ͻ{x bD3( )(UeM2j#QlwA-ձ콽{F< =i}(J@ Juh6ޕ;VQΕ6Ă+BXٺWP20D!k/inIƠs\\ԧ:̏ĒZ$.eQp?KZ4B^_9".28DrT5O(@65n.yN>M>^}7ˉK&+ck}Rg{)65o O/9,h0m4daât]{-ԝcE]e{- 5 Dʚ3<{n% ̛i ӄy m>boW^̿FXP*>6 UpxZ$ ǞS- efxt@R]y) ?ftin֎PS"IrW>ڻ+I('3Ng<89D^кa5rX~?]9ۯRHUȖ2W֜2N)ͫcxfx3{AAlN\wb[(Φ6`QZaD[e|dzzi:4]ܡ12K[ŎyTR!$v Vѫ#SW&[j5kvP։-H"$-)dMp=ge1iz]zwMc[i@BHLȥt ]:CNl_}@X"t P}QZS|ϴrN0,fd71u*,_s2{ ,mv1D$ާ\g5QMIr7pcOyjJ'M>iGXoG8\[IӺsk5ޑ젾jj [gQG  -=,"v;C>wtL9̒£15$9HL; 6¬g]>isO261/Ew`j3h-x [nYJfh(tvE*Ix$x&ne @i3VyԷqXZf)jl+VpDž(F FK3g@vAǤh^o˞DU)䅁eoHG4}Ѭ;_ 4thI$kw %t mYqv\{6#N+=ԟwxjMB@ċ|PgG2QCA*7R%EGyHnLD_jt&hv% j8/_B Tf(s4m0= w-9\Oiҝ8p#pV- ~6}8]1%F\;'~hCl{Nʸ 6o V]Exh8ˮt&3 ՜ǀ_L臘Uh*M+w2穉c=e`T@*}%XO0Ae_:ɔ8x9&,lyКU ^eQnX[BfcQ}ahG>j]'P\ b2:FݭQ^GjqDކ'IȠkmG3O5CL!&V#ϟ6zv$ ο?-6ɷJ[&Z)-ʡ6ZG?ƀqgwUCUSt@pydbhk\\@0k|N/e:d]Ы>oř^byDE!zqCj[B迹ݚ0|&߽:v>3O.Vr9vJzSL^ڄSx)һ6-^:?&]Y S #=Sě/^c5d44n.7)LvA* }0DPdn~BcxQUNMpm2; N' ׏ GIN@nSǕ-n{mpd˟QYogq{a )~񷑥5xΫGHT— w+&<3#fN|M+pXq5|uRU ;Pt F+IQ^NÖ 5>?GH46WU"ss jaDHGZX饙met汇 IB2͇'ks3Yr}Fp{[ X&xiia n"ěJE&G^{<j\Ϭ-_bݎ=&Oѹ51v sY& Et+n]-Dɝz]ZxIDY9*}0IqȺqO{Ԇ 9ZIY+ O6ڳwL=ި:i lAn=Saf}l"Ue|LCxAXv|,Ɍ|$# CC @/i#J#Cߔ٘/ߦ8`k6 ES c)p^P{l`47OEaC PȑWɟ# Ghl?mQ*^rf^ӟp1QF0Ut[J6^ OlX;7shSnцdݩjU6Vq_: exlXXҤtVmJ=D_wf wshGS!quǙK_b 7uA`" 8gF~!rˁ)n?^`۷R z{.o6 4X:G `_*IKfgĂ.S{P-&Xקf/B]1tb(Mz f|p"[feature/soft-delete] Handle soft deleting via Delete Icon
PHPBB3-9567
-rw-r--r--phpBB/includes/content_visibility.php1
-rw-r--r--phpBB/language/en/posting.php3
-rw-r--r--phpBB/posting.php35
-rw-r--r--phpBB/styles/prosilver/template/posting_delete_post_body.html38
4 files changed, 61 insertions, 16 deletions
diff --git a/phpBB/includes/content_visibility.php b/phpBB/includes/content_visibility.php
index da7e6b9c4f..6dffe73114 100644
--- a/phpBB/includes/content_visibility.php
+++ b/phpBB/includes/content_visibility.php
@@ -225,6 +225,7 @@ class phpbb_content_visibility
{
$where_sql .= ' AND post_visibility = ' . (int) $limit_visibility;
}
+
if ($limit_delete_time !== false)
{
$where_sql .= ' AND post_delete_time = ' . (int) $limit_delete_time;
diff --git a/phpBB/language/en/posting.php b/phpBB/language/en/posting.php
index c0edc068dd..a57a907423 100644
--- a/phpBB/language/en/posting.php
+++ b/phpBB/language/en/posting.php
@@ -78,6 +78,9 @@ $lang = array_merge($lang, array(
'DELETE_MESSAGE_CONFIRM' => 'Are you sure you want to delete this message?',
'DELETE_OWN_POSTS' => 'Sorry but you can only delete your own posts.',
'DELETE_POST_CONFIRM' => 'Are you sure you want to delete this post?',
+ 'DELETE_POST_SOFT' => 'Soft delete post',
+ 'DELETE_POST_SOFT_EXP' => 'Soft deleted posts can be recovered by a moderator',
+ 'DELETE_POST_REASON' => 'Soft delete reason',
'DELETE_POST_WARN' => 'Once deleted the post cannot be recovered',
'DISABLE_BBCODE' => 'Disable BBCode',
'DISABLE_MAGIC_URL' => 'Do not automatically parse URLs',
diff --git a/phpBB/posting.php b/phpBB/posting.php
index c7e96dd6c0..f82ae049dc 100644
--- a/phpBB/posting.php
+++ b/phpBB/posting.php
@@ -41,16 +41,10 @@ $cancel = (isset($_POST['cancel']) && !isset($_POST['save'])) ? true : false;
$refresh = (isset($_POST['add_file']) || isset($_POST['delete_file']) || isset($_POST['cancel_unglobalise']) || $save || $load || $preview);
$mode = request_var('mode', '');
-if ($submit && !$refresh)
+// If the user is not allowed to delete the post, we try to soft delete it, so we overwrite the mode here.
+if ($mode == 'delete' && (($auth->acl_get('m_softdelete', $forum_id) && $request->is_set_post('soft_delete')) || !$auth->acl_get('m_delete', $forum_id)))
{
- if (isset($_POST['soft_delete']))
- {
- $mode = 'soft_delete';
- }
- else if (isset($_POST['delete']))
- {
- $mode = 'delete';
- }
+ $mode = 'soft_delete';
}
$error = $post_data = array();
@@ -328,7 +322,8 @@ if ($mode == 'edit' && !$auth->acl_get('m_edit', $forum_id))
// Handle delete mode...
if ($mode == 'delete' || $mode == 'soft_delete')
{
- handle_post_delete($forum_id, $topic_id, $post_id, $post_data, ($mode == 'soft_delete'));
+ $soft_delete_reason = ($mode == 'soft_delete' && $auth->acl_get('m_softdelete', $forum_id)) ? utf8_normalize_nfc(request_var('delete_reason', '', true)) : '';
+ handle_post_delete($forum_id, $topic_id, $post_id, $post_data, ($mode == 'soft_delete'), $soft_delete_reason);
return;
}
@@ -1532,7 +1527,7 @@ function upload_popup($forum_style = 0)
/**
* Do the various checks required for removing posts as well as removing it
*/
-function handle_post_delete($forum_id, $topic_id, $post_id, &$post_data, $is_soft)
+function handle_post_delete($forum_id, $topic_id, $post_id, &$post_data, $is_soft = false, $soft_delete_reason = '')
{
global $user, $db, $auth, $config;
global $phpbb_root_path, $phpEx;
@@ -1553,9 +1548,9 @@ function handle_post_delete($forum_id, $topic_id, $post_id, &$post_data, $is_sof
$data = array(
'topic_first_post_id' => $post_data['topic_first_post_id'],
'topic_last_post_id' => $post_data['topic_last_post_id'],
- 'topic_posts' => $post_data['topic_posts'];
- 'topic_posts_unapproved' => $post_data['topic_posts_unapproved'];
- 'topic_posts_softdeleted' => $post_data['topic_posts_softdeleted'];
+ 'topic_posts' => $post_data['topic_posts'],
+ 'topic_posts_unapproved' => $post_data['topic_posts_unapproved'],
+ 'topic_posts_softdeleted' => $post_data['topic_posts_softdeleted'],
'topic_visibility' => $post_data['topic_visibility'],
'topic_type' => $post_data['topic_type'],
'post_visibility' => $post_data['post_visibility'],
@@ -1565,7 +1560,7 @@ function handle_post_delete($forum_id, $topic_id, $post_id, &$post_data, $is_sof
'post_postcount' => $post_data['post_postcount'],
);
- $next_post_id = delete_post($forum_id, $topic_id, $post_id, $data, $is_soft);//@todo: $reason);
+ $next_post_id = delete_post($forum_id, $topic_id, $post_id, $data, $is_soft, $soft_delete_reason);
$post_username = ($post_data['poster_id'] == ANONYMOUS && !empty($post_data['post_username'])) ? $post_data['post_username'] : $post_data['username'];
if ($next_post_id === false)
@@ -1589,7 +1584,15 @@ function handle_post_delete($forum_id, $topic_id, $post_id, &$post_data, $is_sof
}
else
{
- confirm_box(false, 'DELETE_POST', $s_hidden_fields);
+ global $template;
+
+ $template->assign_vars(array(
+ 'S_ALLOWED_DELETE' => $auth->acl_get('m_delete', $forum_id) || $auth->acl_get('f_delete', $forum_id),
+ 'S_ALLOWED_SOFTDELETE' => $auth->acl_get('m_softdelete', $forum_id) || $auth->acl_get('f_softdelete', $forum_id),
+ 'S_DELETE_REASON' => $auth->acl_get('m_softdelete', $forum_id),
+ ));
+
+ confirm_box(false, 'DELETE_POST', $s_hidden_fields, 'posting_delete_post_body.html');
}
}
diff --git a/phpBB/styles/prosilver/template/posting_delete_post_body.html b/phpBB/styles/prosilver/template/posting_delete_post_body.html
new file mode 100644
index 0000000000..4c69d1d9bc
--- /dev/null
+++ b/phpBB/styles/prosilver/template/posting_delete_post_body.html
@@ -0,0 +1,38 @@
+<!-- INCLUDE overall_header.html -->
+
+<form id="confirm" action="{S_CONFIRM_ACTION}" method="post">
+<div class="panel">
+ <div class="inner">
+
+ <h2>{MESSAGE_TITLE}</h2>
+ <p>{MESSAGE_TEXT}</p>
+
+ <!-- IF S_DELETE_REASON or (S_ALLOWED_DELETE and S_ALLOWED_SOFTDELETE) -->
+ <fieldset class="fields1">
+ <!-- IF S_ALLOWED_DELETE and S_ALLOWED_SOFTDELETE -->
+ <dl>
+ <dt><label for="soft_delete">{L_DELETE_POST_SOFT}:</label></dt>
+ <dd><label for="soft_delete"><input id="soft_delete" name="soft_delete" type="checkbox" checked="checked" value="1" /> {L_DELETE_POST_SOFT_EXP}</label></dd>
+ </dl>
+ <!-- ENDIF -->
+
+ <!-- IF S_DELETE_REASON -->
+ <dl>
+ <dt><label for="delete_reason">{L_DELETE_POST_REASON}:</label></dt>
+ <dd><input type="text" name="delete_reason" id="delete_reason" value="" class="inputbox autowidth" maxlength="120" size="45" /></dd>
+ </dl>
+ <!-- ENDIF -->
+ </fieldset>
+ <!-- ENDIF -->
+
+ <fieldset class="submit-buttons">
+ {S_HIDDEN_FIELDS}
+ <input type="submit" name="confirm" value="{L_YES}" class="button1" />&nbsp;
+ <input type="submit" name="cancel" value="{L_NO}" class="button2" />
+ </fieldset>
+
+ </div>
+</div>
+</form>
+
+<!-- INCLUDE overall_footer.html -->
`GtX BKb[<++)4=Kc:0 ,=+b7YRAO͎ޥwFޑuR,BІfC-v,!~~ApntL 4{\H5fwhFFaU#U)(+k[D:6[@ۖ5;K,awȝ k㊱i'JFH잽WˡOC=0TAGw!o* V]سSL)vJZW,_V`;Sy5u4R3Rb۵Ѭpge}h:c]v7!~c<ߋzep􄖸J7N)VpFQoqǨVS 섮TF;QVW|)WH`q˚`<ݓ@"Ui@RݽLE,=&DhZӔK 4DZtovYmisz@akiuo()1n#Dq0n7C?i)yXGLIȐ"~2qiF \`d*H j:AP* <a})B8똚:jǵU$|^PNȋvujƍ{&Cb'T]Ξ8}A \u]0o+G#) ܌K/j5^圗4pMڟ%vFȟG=ytsmg"@3Lr7msDY_M/E QȝQ{ΜYtM9gJ:CG"SEճkRNFjszC_|ykzTC\Zh3Wf ܐ%,^u0pQCUVFSPZՀT;#o|T>KljD猪(V(LyMU]Z!TC! |&ml"@ r=ζf;3 n|aOg2Q=u}R[z8]b-DQC׵/X+obmL2R<7Үρ6t`~"W%12*kΎ A*\b&$/t"ae48s#CN=4x,Z ?u'( e t öGm[K;+0Sw9X)e F9 <A7OPŰYsMS%KVBH*INL0B(D)3:~ŅRodw d8pg=m]S{ fjdPGפֿC\_ڰtT2\.*?U %`%qpVQ| += R)6YG!1 \nUC_yu!<ϭIタsn}2.|fMfE4a17%Qzt}zY7V'5YlK3d pgwh tWA#OkUFuS:ӈy<̪.еCl] 祪UhZI eFn*|Պ S־i<Bg_?=uʧ\UDT&c@uqi. ȑ&Lhvm]RCS 檡zdHdt;/H^[¤ A~)U gt */ƅW ~1x̉`BL{dzc҆":Fkm}wE-+ʥ y.szBŇ f*x9:Q۫P=S2l+W;ltN+ڣ譺gm.cK^Aձݴ)^j, {JVh{P$6o)@5C"cc^)FĜpa;";rn\mCAvB42I$ޘRvflCtJ `A`1g]EWgˆEPk}7 H%VU6! /Cϧسn5?2CջG\#?:4t0; "8YMpOШh]=9]+C1\> AۃRlsH0p鲦.\7LHIkI~E_rQKeJd1Vhs]#ȍv;~SDRM)}0jDXSȿ3 ߞt`V*3ASk'RٕӍ}AE˂YE~_Xc!N(L'u9j:CYI :"XyL2.pڱ2>S$튛EKcB/c}x?}Ead؍OxPd#8K1 9ZG¹~Ky%-Y('`~jMߎ?M DPVGi~z*xE |n/A!R䡔GsͻKtDFI.4'>Mԥ8>eO.o)  '~GL4(/āj\1f N8}VP8w7zVq΁Sdq DG/-|{0]o+Y s {bn$qEir%L-d畛T m~ qB/wDՠCʾ\-Z(;O][ 6/2W霨tǪe b $eUPPF?S5kANS[(fMQl뫀0|Z'Z?C 43uj[&IR{R)j[_:{$vɌ0 kX-za]&5Z]^`'ށ:thhPy( +Tз/XZXK{^'*Ლ֍`>A@CR]LRՄkRdwˮ$trg9Ѷp kBvA(d(2'`}}sX8ShOzLITz`,QdWL_` ͔OťaPq x7|FW/z3'T7Ymʹ0ʈsU[ 0Ω-p \Qv~I< f}T,Y e\.X|!lۢ#= Ld{Ƥ>/٬Jm2Ҭ_KK^.XEΏU^:gC{᝞ 6-xB : 6y1<"!t' ]c>9b IѓD_;\zY@w1pyCqD;a͵% 5žx-K1Gb\- Vj^%\͞cQ3T9'Ec@Pרk H%fY[?;xɞr|p3= P. U4 l\ cw$`*X} "e+ wiޕ+1*f@Jpbvs:KF @:hoM(i  <o8`~]VX:4O_JʂAvkU[0uJNk}9jȽmJnc9IwH^3+4(Q(&O"[@p7ġDܛٹtm2gWVR]lfOf"2I 0;U,RK45!щ20[n&zɈ>OUcSFRzMvI.ë ɝL | ѩJ>ҪeDtd: ۈ~#jһ٘4v ?)/b̥oӶ{@)ss?Rə|{66oeщivfͷ _c0 a|Zt'pX2g.i6k6ǬfPV9ls/ˉ'7SLrTjMh 1J.ysDݛA Id\"Z2<(~xtD\uNq_i$h\yٕ K{ EʿBǷb:h;U/,AitP=6>\ 8t@gVWQ57;hexe|iNcYtxp$ \2m-8LJYuT!!9'T|<{PXxZ `{ X6ݏ=,@f^T^Ѹ8N+cβV]Mx!٘2$5q[Qv:{`z>VҁوIaU=Kޒ*^Tmڴk4T.,5F|&壹h|3e5[Wl4P j|}Ӫ,_%$cP9ek4:Rؔ4$"",`st2Ae_%\ ؇T/\jrCTo&r*oRpSij ][à/T=@#|T[(KN'? 8Մvg[pg^ò:MaHt Iw͙6A%qFl^.ؓLY?D5Z|JE٩9$${هJcp _^hV#⛛MI׿]ܟ!42X<'lv$)zjbȜ;1UpA5;BFS>N<ϽPk}qАùGY@dF19 CZ '׷51[~{yfPB-KgP&_3טV*xC"wai]yX2AdgۊZᷫY5j3Cwj-R-|Qfy2 GiSiT^mt4.8 :~ cX?S_.28P҃]W R)@`׭dA߃ZTfF#$ {o1{:!(WĊ-`?bQ;Kz2 L2j>} a=( v*JB8CrХ\W$A #,ѡ>fVud ~$#woF)}Ż3-yz& !s!| j*WI3[&  ɢE댿|OR +` ,"e I8F5L.K`R^{`96y”nS<u|z4lQZLl.ɣbə(X t~;"S_ Q3{rَK)S\<3L\` wC4]=b8^j uQD[CC8G>5b61ygc<4W=MM+-W5aV1*ȥ ~ԁ~!fWp-jϲ[8:هIJ_Nדəz .^MBV{0:85%Y^դw.&G"V@]&8Xw{#+VWLS._ CG8IsЯ;t合=z} yq_$3> +}ԪRZ@5IbpO(Mo<רipH튟RUR724=<:Qq,s\,+]or&Ӆ]>J\-jn [Pl"-.^ǫ棩oc'9e|ڧ_mlRM~ N @sb׫|llgv+h %8 "g_csжܾgw1_]@*gtmOI@ԼN'gGȁ˪CӨdQq`,ލW,VM87/TZBDA%#uTlJЮY$eW0P{Md44"~9 Oz\/jgwέ4BGw_u+j‡efFXAf}j7 ;'g9/ &p@s8V Wt:{1e(FnfF㔉62c~^! $wU[z-xE)VC>f<^GV!eB^WMz5E˔RZh(ly)n)61 J\#oP"D4t-K ?;drµiIRZsEh)8ç'(n,4gi9*;^qhyyxo^֩[NIy Oo[dgqQʲÙƒ§J̿t)FuL) J@ϢPO7[+KӰ [䦴 < %Dc;4g4w|G0KY#( ?F%w;{r[ud#\Ua_4-kRÖ>\J F!9;m,DMXaE,Kn ؂z 8N,$2V4Fbe eflf@Ihڇ1ں82#$qO ""vaf(`1rL Ksγk9b&lF{/|Rjs_a!vCWͧa!W ZLA {}272 !, Ke4jebV?Y&Gr  b@~e gtw=Χۘ> v3K Bq),4ѭ}gFބ.ĘE S > Ed󇊰Jm"%u Kt^DŽ{VyΝH 7sjxy]$ǐ2t+kϜD"[ټwCX7%ٻ+C,ન=0MuԶyg)-EgDYǙ7 g(dhTzrbHU@DXfjfyL4W,W /\ܩZS#h#d<C!lJu#[1RI YAV宋,^l"h roE'H OjIecTU[G%%=9eڣظ9Vl\vDJu ӹQvm`[HVL?ͺΙN63LJYo+g*TJ]ͣ*?i况d1I#O-ԳmXJb 5Q-m.nvҀpHR(S4czXWq!x)f$%"Vi6b%򆪌5I[a{&0se-m67Ϟz#Bh2lm*xي BKtx [ȑ8Yx1$sISd7{xcgׄ!5@H@pПoƅ:Z2mj[?˪&'I,J{PRE,4& 0Yf ZⅵIjV/)M'Cs+r[Oܫ)ΉULˉx;O2 OR `TqrMk+qR3V7 r?"iUVz+l\ĞcҨ+4M3Dh~qlI=Xى5V~N&Y~]4n{)-%- 훽HBKWݟ cE`3(#?\1WOrdA sEea*aDA+΄^EіYNBxij{iJ{SkK4PiWh.*wlY÷}|>h !H gCxzA5iAjiNCh욙uW. 01n=@}`ÜҡR&*+jg5aIk'hW$ФXOYltE3e~ En OMEܠb1>δY * %*w7o bg+ qb,(C>{gV ,"ū@ЅzwŁkJKB)Ēvy8U0ziJЀvy7K_cY)QfO}tu!\? XLYT3A9F"yɊ)(g1Ƒ{ afʼkE [`a{{R05b!$Lkx+t3)ß ڬ{Rd.)@zbI],LTNфS^%B~1,b|OX@B>4oyu "Lq(Ȗ6Ž,._Yx=Ǟ,%shn4Y[f-Ա(KMB:X8p^@\{Rwճłb]3GIL+ٟ-qxaFǧfN_J/r-qrjBq~EdU21 bJ:Up8U*OPkZJ0/}$fera/1˺ߘX"\~]YJПr(Z2/ rgݬv.9pVkd$meGwŋXl}IY? o L㕆C".C+Q쪭GUȫƊ8wXӬL?4 fD|hݞկ 8ڍ(Hw{=Ê24FXŊ)+V\{*2Mڈ@xl!2O w2_T%2oh oP$ePǛDRvQ'a];tsTՓU+ǻ/qN>߂s6s]x<"K -8Jh!ώi{1(( ije47hCA,Ax+^Gx :wOiS24}uՓ,<9tj?: vZzAtK0L,0lBZIC2iF ɖ9 t!!52HXpߡJM"k*tʕzd. <@OEb^(!;WE 8$`3t$wV4Rqp(h 3wD%_!:l*<,[}KKY=쎓X4e1ڢ>G]L9ڊ$W S"K G^R$ Z`ݙKSe0u }pAٻcv#;Fpw4 m&-2f;;5x7gӐ㣠Tp^p {7&m#pn6+4=QI]VA`JWLt,,Jgha]\`}ac8w<GjlWÐ~q9QAKL+Ub~0RH޸yzqC}Zڸ] 4+KV㱫Jruh M&D2ȧEU[E-0Dyv PS)Sy8tQ,O-17JuñU?dfӺRIp#吠z5Pnjn׃(߃uM ,KtdSNC͊auψZrnoKt ۏ<`p<[H5pYJxD Q1 u͋ټ. }VZ˒j܍v-bNRK Z`4 6 μ)-(F/C9MDŽksY ̶B7j1!^LyGqW$W*w-M`nH{PՈ13 S? pܻE$$-K:̢2D;>aœ k.R_[DCYcR_!1RtF` s*(T漢+hI' 2(ʾk՛_u~9/*?ȉ ">٩D[:.L窧k˦oL` q}l2X$wVs4O9w{BϤ[+:k]kh%Ij KEW5@u6)`8nի=VF6塁nm2kDMEL F&{zܧݗLo3*pjWN ++4}QZ06`JWYOG/2.u&u.`+ zh+l9qhv'G2Ԛǁ _H%)aE=C;@һ`oiFE Ur9?ͱ8D.zl_.V{ĂҁT6, :i./H)H>ϑ~^+[j#y%ѸXWt_:p\Ţ=~V1h~R!}S:~L=0!AT㖾_x|jGN<[\1`,*!}$.4:4{+X̻ l%HAǥK2VlӤFkiO8U#=mޗEO !4&m +8]QK( #=DiYP8 x2Zo >$ip%7E銻S>"gO_9C3VȑC}xqDDđnWɆ9uBUE4W9U@$d%UnN^0%ɏ-.~Q,u)h_Ĵ(4/^yeu{W~gI6J/WGp~plFKKґ[ &W;W ԥKxNJ]C 41n& = t"#(?ԧ"ڣxup\]T'UԿ.Y8_9lO6UL1e\!Lm]sH4o)Ab*J8o[4ݟhVÂYoʖOom]/΀-k0Z3wn\g̥!DFڮPֿk фZ5&f=;b3n۸v% \{Ѣg]C~)""m*7GIb_Κd̜Et/#e[ke/I}2&2$Hl.8ѡ"'A_}J`E$n4*blW(ï(m>e02:Hqwy `!6b%湃so /zˠDY>H&-e3B݄o1T"kBNz!Ihݬ*bR"6t5{ S9ȏlDCpw]'5[Fy MS&Qz-}4mN@ n ٦- ׶ǧoK$>#D35B5BݬC{Krs(NZ1|b׳x9^u69-LiYV@(2[ZrlOc>Pj!szsH  ߵQD F(ƊN@R`7x戍ZDžDMsZCN-sywT$ok)AyP{F%= z惠)l<NLמJE!%|(N7FR\ VIX?%9F2g (5?Ef\)CO Nƪ*$LVw6ѫa2QLu~KKZ\|ǣFgo0Mc ߍd7LN8>vB,67?bfF֎Z>K:XdDMB@>} SZiStsl [J UX&Z`!*ǃ5!⒳=о$TeA(HByY%=ptB=E륲8Ϛ h5Jωyq { yvw}uԽSEmf6PxBoR6-Å] *֐ڮSs*yxʤڸъc_1ylqm 0sIG wf8^\H2x \{&d< E^ky',xV "d;h2=*)nGoL0 ~~ m)gЧ&4jx)ɶ e8 J0HO[cs1jOA`c4cCvvh_ߥmtB]0pאcfYZ-U1TN 1 uQӁNiNxtNiw>x:Da˲=ط&źRO½ -V୑+Vx(ÑnPlI ltnW'YX0,*da; j- "gA:T6imtue8EB(0ζ>vqq^ >LOٱ7`;ӊh'gw0/-Ro_ uIq2 ?p,Dv3 o'l҇{6C9dȰ/f40O9zS- .7:h. ?q\=op3|܅tDD ucx`NUJXѦ>774hC?Zs/igu+<Í8 M[|[僼 ubrBk H'T(o cgy֨9*8ʬio;'Et,x]\PS$^QoGq.gk6Al5Eg I̘O_g*Quy~8oZxUvGzlXQ=Z׭\F.ݗdNPQ`k/^BTnY,EgHcTu΢&V }#J; ؒgL|9z q΀8 #{AzD4K .ڀU99S/ Y|mhKbmޝF3 {^9)|],Im L gqr J-(5iY?-@͎K24:R 9v4&fB'boY;Y!yEЗ"2jlbzZ/_D)w2@==vMhM7iR9A>)jrO+37 7*Z8`EOB fs.H@؅ \|U4i;鬯^Q&t3~}bNw6RXl&ba AJ= '1$S?8H h /d .xGٙ:īOp`vV؊ꚻ m=IirN˄Ᾱcb&hRHn.dA^K8g1lA`T@RwbQ0LzB.Rܷ>H '>4Fjf8Y>/UD! ̾fA0ʣ?Edy7dA!ڋ뤉p|,vkyD6s;3.h)9 GI'vЩ)@7|?CXyy?u!:ޒQS3!5 ë !qDH 0+<SN.:!0_qeUXHX }_ c7hnJ>^5&BsUp->4t8wj>dY@nFZ>.htwA8NM *+,a^U/7^ݺ|Y`iw;x@L_VMySx HL޲:3AgϿT(]$~Yx{r+I[gƌ?VV@}H% AA&٤l.DYigّn^~8pabI#b!nIC|=;nPꋪ Ή?O{c = {9SΥ2}nSe3ZGm3 Ɲ *zfYNAx2z,\ګOoIKЧOPNuNy+usG nZUtZ1z6jgmjhN(_e72]S}^*~20#QooPPuxQ&>"--Ӌ+*.޶97}^6 )lY/1]㳜ѻi5hn_Qhi* F>mfQ7^Hv$kzMy0v rS>RD#M+hp)CB<\#R29XQr~NG .,l LҫL{ YP-tvw+[`E7ݿp+ phr;3:'{f#Sb" 2|]v]Cu삟%U-]VeHrǯ&S\`=iaTfߙ_!$5R7A?7w=GME3Y`'z}N@#Ғg %ұUa5A,O(JY佤I/]؋\qK;.[L th]#y==3anH#6&U]4Z(< :4DҼ^6| VK7n$ t>uzڵHF8:Ш}4Ao?8$Ȅ|n Yem9NweT@7pu7iQh=wr /q$ϒ+!n^{3n:TgYuP1EģRXoܱilCtƨ'W[@E$ ;jzcXOZI= {riLjc9S_'".{›5#Aװl_{e'oG(@Qڠ~Sf9 ֤ (%=N曩4udF2kZJ\GFBvlSk84 |I%5f*C6@(Hc'|j&JW壇[̥OfQHE#tEG y[wpޙuhXPx]/C*.* '-Xmtr; Z5bgj %HDB> 8ӕC/]:⃶} vn fH`dz Ip[;b}tY7C_s?]<WĂCilJyT_E)d^\BW]Py47`|m- :4+rI5۩ )Ŕ19r7IlQb%0lxΤԲ u7c12̥ME?qgBUSqBHC>*`f y[bf"TϷZ)Zۀ̵.Nq.Uxe3_U^3|+]ټȞPg`3)''<5nP"&t@x@] "woǾ8S4_}lPh2~nO/'ڹ]qUĈY]~`17;)5O]pwmHd Ȝ[ψ(èm*q 9»V/)\}K,~xGB>YS{ iTT6}6? ]|W.&ˆ>ڡvGHCoMJJZwkW!c&D5HݦZ!A'E V v4$t6~KCλ!"Zt ddmq9==Φ` +B6%O!xԺ‚N[vO5zΞA8=B^ sz!΄> բnD]Nc4;-> JFO#TY'^4asvaְխT@4,1U?e +J|Q!9 .K; .Na$Dwtaƶr|uE\WKPj"9Y I9mH(ؖM*_!uC}TSkl'o ּ DvDK?+Hs=߫Tr'gեGYks1"?΂`wiNZ4C@p8yW?W.)[x%+_aD 8 X2S}]G@ {Z: FO(0-Œ & 4,lh0 kN@3 6eB[0PEH, +[mDɾqiqڰ2i\/p/6VGγ{ՁW`csH|xg˿oh"WGd9j(->U7 ۀxPƛǛX R,Z{(U&t翉 经<(~{a`e J^WgN ,5vKgn5r೟Wd3,))@OVSp7ն\HXȯCR/"@^DJDȬޣJڮnD5ؕmKI;oҺ5wpw PG =)Ξe?xiM"˗EP2~^=W|ŷ'5zEg^#C|S R'}956bγe ,paHЕ]"ykMP"Dq\ #D) FΦhƨR4ta$Ra3N ?ϤN@e=!,}2z _D>@"pCȪA4yu? 8C5Ejk1' e1R}PgiU*ۦmI1L;MYҼT;%=3, J+@N@'(;/bU ǘP& %!A7c8j=Zz+L\mqbY!m=˕hSV^}v! h"0U;>S0aPJ^^0V۱uV'+`$R/ȏuL>mSq7KF4M/1;@_M@(pd{)@c[nH?6!HTaK*"O ɣ/DL&\ hrgLmM!)  [U6,a!n^F-z)P סT\J Rbd"ѰVc9@~IpH5])L@{D)lGʰu =˫YWxb$eKr} %6k2}=?6-[Ϟd=?dF,N= OzBqR_UӃ&.iWE*>c|mCҖ}\cѳG?/Fv#^ al[."O`APN(S^$g,5ACko ECmT- 3.CN}1,qLro'I?q/.D8nvJP]IMb࿺@C˝ǁ;ES/jvJDqC&)#xdon%\6sebGo8pN.,,'x,^J%q*B \m+V1H_65ԣ0xZw6 h $ZF_`zC8KC9lմ7Ja13q31.Xd{(vmug~E-eRˤp;7]3Ce CJQAy5ו`HHF 2mGpzޝІEݲQoR# hmJԅe,nT9~jي/1hN,9快{ 2,|[|k6:=vعpEF.]SRȅ |X $T^ԒDnvy"7w͙iEyp*k,{66ՙ}^6;)s*6IKؠbdhDðVl>"`Z1B[TU~_KB#IxXY6 |f(ho' WUw3]/NZ'{^V{$P(?طb,sdgWf~PbpA0Kz23ETF" 1DmZ x`ϗUHs ma`~b-U9G_kG4[c]˜  8[$F_H%vi Q ev%2F jCr.0"0ti h b`5- Xhw#ӳfWXFұ-pA=$!!M7|A%uFV\RҟYҞef=GKv {2sȀt{;w-8GtÖ*_?G3.,K,n2\f2hn)t߀1Jh}~OQ5Pz]&~2m(~=F f!;*@#7T8mh\ʡa9cCE&}| ,}X8^yD4HjD2m 6R'ʭM҂&>Pٲ)UmxeV*2ÝÔT=b ͏B>ڀ VXyb m ^P6I9e hsqf;X5 'hmU9J O&a$cx0abnW%H`(r67? pբum>$N6yRN6+GƩ2Ƌ鋒BFP}Nws/FSUSBw?4 !k2dݪ3^6Rk(EQ{Y[I5FBQ .tv˒*Pvj[,uvZ*P#5xkUEPGC s B&m4"'9&<[x kA.kCEGQ*ЌYb "u}((\fD Xg+P|jSƽpCD"SBo@SQT-| &-;#%߱JFgH,rEx 3'IƯE鰑~^ժ8EHnxiŞB}ҴQ4@Cu'вɵG':(͇\|oKAH6VQq.HvyXɦAZ.6Et_ =&(YlU% $~.Ņ{˻_1Rüȓ1pk~űՌ ȾgnCk;X0=z.}Ү~W9d7Y-']tpn<{yG|%&͕5W7^єERjWzLCD%!'ua78߸@ϚQfVe>٪II:ͳj J<ʎi(NZfy+`T96nDD42n32It8fNOx8Q_Ȥ_%+^'%'P0ʌ2?vtH9\L= p, L3qpV8G#C1Me(R}ӾJYF}Ў0 n#5 {)cZ4~]1=y@ #c fnڧ C 9x~zԬҎ?oW;K/&v-` a3|㴖װrk&N}oU}kjmˤM9ʩvacFq%th5[9œDNjL}l\sQ6HvMywNL[" 7vQ `Y:f?x"gc7P[d\#&q)P*Ӌ^}lG+xoo$k1y*7 B__DF*O<#&sYPJˁX)5-zIazʆ"RP BGr ne$6ȗpJ@|x\}x2zOt(oZnl '?Cf<:`(?E%xf::> HUU`s]S b^ʔi=h[ePA#YKeQY0F߾qhʉw!iėoǦt -rEU: {aqķ'~}W:;f݉)@#j[ :e@?*N43 y*xPq~_Fs_JO>#lL{Xh a\6@ğнۃ>2/{fa\`dUb]%gïCUGB} t \W7M៣?X(ѩ"_cB}ȃX umb&7[ ߆D%\/f<qRlNWWf |Q^}QȐ#f2PXjw1iT &gHx[MI+C. _>jnHHq5eud~"`u W|>׵#'['vcQ MJq# Ugl+mdq խPüPͲtCxkB,9Z\Mr$UHvQ$f;g6[Edˍ$Bg+sل2OX[?aS~;nZO /B<{Lhsv\8CVV=%kwN(vwZi5Y h)gs֊N*Qjk$7챛G;[ }"exek7kj\ڵ$@`6Q_) ##ڂl ys*]O\Pt1a>&yo#z`1YpnyzTնg\n-vUu!<̠)zЕb4cMvRDamHTI8>]mSH$)RGD"N^0{?'=ó7?dzk9+ wrL< zJъBA1%Dgy̻>yDh,Oy_˿n` %V#%6 Hw7/z,KNJ{țdN+/u~Rʷ~./MUzQF%`d55hãԣnKvj=^)x !FrWuts.:Z 7d/Vwު.ocoȃ09'8}~TӒc1V·C̭,oyC:dӸo+6Jle yCR9hrwzm*jxV/TB9JuY$yGt{jdދ:F[3f |WFIgNV7EC#΋JG=I 3MSݎ>R+ڶ{@ȑt.ݿ=r2aJz +,C[OAc(c,DB+*H?ȦA H'*Фi~WzT Lc bC=->c#ԉ\őDg t1>/\D|gdB_ w>)hi :(Z?NO,w'[ _Le&*?EVybXz#!:pnrP窆1 sxμ?f*fNS/ӂ,ܐCX0|hr/wB}%qNoSߥQ |vWD&^.p.ixχ@ES{i`ڏ;ҷ,Z+ }rFn?H|k̻@tJ(=8"YcKg^IA5{nJ[KiX>O4Sk_82B}Θ}uN|XVU6Y0}BWA*>qH d.z-ngp( @|JS[xEǘsAs|2[^N}.ZUg3a]PkJׁ;_O3!^fhE*}#%oVJ{PR\(,%L\`cO:< w0v(P zʿe-c#i@y l6zq7_c }z=b-3pOື H#8zwIVHJ;z~n c|[1Xe&4%U,tgy/-F( +8ۆ9cùqy_nPBv"9R-|] k~(Ks'ty'CA5N5$О ނGwD J}lqC\ZbB1KboxF' 4hg.B AŕEF-vjZre҆gTkSρ8J65-PNF^ YA%TAhGE׃<'aoAWNjm3J膅HO:T? {F\kӈiDz7/@|1˪ee Mf㗱z%_F!@W4-W0JR?*1Ts>}O$`Tm2zh*NW=r+J[y^+~I]wQn#; xU7'FM>*5):U5x22 C+b]SC畔- k>}2&*s~m=1ze:KH,dьu-'u"x jneo'˲hLR(>uMT#2%G&:4mɞ.Ќ ݿ5%ѿH$Jv3hS 꼯4YG3y֊be- 1NGo`utmH%RP,m{=g=7B~P5\9}hOzY..0%nB>#Ym eQwK*1 z:"#ssl/ϭxOnjr\{f9uuf wEt$큄9ޱJ;U wΤ#(py&C3nhb/Az4.g#Rm8b<7Sҧf% |^^qs|]T#]q  hj RssB ]}f6ƭפpQ3@ [q}EJ,jnnW)YyN>SM}q qj>Bm( 'BW7A. xGROz;=*<\2Hq[I@~Zb]VsxK~U9R\5PzvdsfPueq\#ѧΝǾsY8F#DTr 䁓ܭ ;:NEuZa~H .bLRI%dqIRCkJ83y ydI$wsr35wu Nft8fՒ}>nf~8 ͿĜIrzQTo=}TEAv6vsBP'P,vEo2aBe uϸA"T n8*eNB9zpQ2x҉ܸSѭa?V7fAS9k+j[mg'[r=2fR=BV [4D0Eē؊4J*X5a c: }0Fl 8d~ɥL_z*eF͟EJ>ҿEf=F,~W9tyXzg: rjhWJ󌯫$$yMi%#{j/4`PWJ`~O8U Y^$}yD> UtMAֱxBMP]91uFm:y0X$~),Z%$]8\{jP zRs$Q90-a22k''YjxHϹ{@ϑlkj*TX- < n;%Qhbw上.ַgiphe.u=sZ3ǤG|6i Ya,bH&BB;4U-{pdwSA dŢTXy%,|r][z|֪a;3TM y\?z#"k[%9NWOF;ɢ*.ئ w}$Ejca7qUD'Rf !.tGG|)=Ċ]}lź&d ML-LY/u5w6[+BH5IskQT K6”QSxfxŁ :iWӥ1a~*ы2ptx Dz050l@>&g{M, HNCI=,d0x';u1Ҋm=!^viD;_5\[b{j+HV<~wO qsO|Zw+V0g8 ~߬OlKQ 2?[ u!afI9k65 >DK]ig>11ҫɸjT~'z2 "S4{邐J@aWb04*UN'yVv>ΈRc)C-[l 0xR h= Si}4 cb>]K}B:ۅT2.3*~4AM9>͠_YF =;giWm be-vr ҵcʃp?Qޒ\ge\F̪F x6,vҍ}2¿Mθ;VEUrpE~sO51ٹ)yJrΜL^XE4]ip}~7-K2Vl/#RƖC\l777K<vl@#StN*BP?֫PbyW≑/+A.pJw4'9w;%7ؙj*ؙ :kTٷ:,%)e UpF}.u+˩.>hxfͮx!l޶aM5t[^9I'[\%ས7VĴi&w_S;,yg_$щyp鄖Pq'x}KFDZps۫EGiA Ry(66D]ƵϚLoxk$C9HCuO JiG>4B~Bj *l zyinQxB] =^kP5#3E%W,WᏄaNs8(M7w (e f/ F.6rI ;Tz.bѶa(flJ7v߾%2r }XruPS( q3:赿E_pXeI.ҖE Dz?싱cAR.{wwD2lpahA2[=(r0 =ib+@_UG&9BWUWA\~8e>?An8]M@ }D`K@dž)\_1u#{1'G "yWV ) -pr L iNrh1TIS{GwgW|0r?\7@5u8ȍ!|AEњ]"12Q{A=Ry2,S+N52B0yi?(@8a-P6-yZC9xB$'TaI֭O~x0P<ڙeDm"'oxjG;ޱ,Ј^Jc0U0Ć>UA=0-No n d/m-2Jr7^gN*?|~~C$=tÈ2c9 (N/ǛIf[wX+6h6Ñ߸ux6bn[M;6}/ŀ0LF{xzKoŇ-;U䜡jyNuEtgŀDDH$(D\;?S:\_9m`DE?wU%Nxlͪ-SBaWWfkRoI:8>g977iTp S2Spg>B$ f<>v{`Q@z30)%Xf3oGSp&xcm|# 8'9W*~oC8#eo6vatPFLu}"]Ҟc0r+ 4rM_q,۫'8V9Z'?VynhoE{(|h