web/lib/Zend/Service/Console/Command/ParameterSource/ConfigFile.php
author Yves-Marie Haussonne <1218002+ymph@users.noreply.github.com>
Thu, 19 Nov 2015 11:18:45 +0100
changeset 1297 5b2b25cd48bf
parent 1230 68c69c656a2c
permissions -rw-r--r--
edito as default event
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
1230
68c69c656a2c upgrade Zend
Yves-Marie Haussonne <1218002+ymph@users.noreply.github.com>
parents:
diff changeset
     1
<?php
68c69c656a2c upgrade Zend
Yves-Marie Haussonne <1218002+ymph@users.noreply.github.com>
parents:
diff changeset
     2
/**
68c69c656a2c upgrade Zend
Yves-Marie Haussonne <1218002+ymph@users.noreply.github.com>
parents:
diff changeset
     3
 * Zend Framework
68c69c656a2c upgrade Zend
Yves-Marie Haussonne <1218002+ymph@users.noreply.github.com>
parents:
diff changeset
     4
 *
68c69c656a2c upgrade Zend
Yves-Marie Haussonne <1218002+ymph@users.noreply.github.com>
parents:
diff changeset
     5
 * LICENSE
68c69c656a2c upgrade Zend
Yves-Marie Haussonne <1218002+ymph@users.noreply.github.com>
parents:
diff changeset
     6
 *
68c69c656a2c upgrade Zend
Yves-Marie Haussonne <1218002+ymph@users.noreply.github.com>
parents:
diff changeset
     7
 * This source file is subject to the new BSD license that is bundled
68c69c656a2c upgrade Zend
Yves-Marie Haussonne <1218002+ymph@users.noreply.github.com>
parents:
diff changeset
     8
 * with this package in the file LICENSE.txt.
68c69c656a2c upgrade Zend
Yves-Marie Haussonne <1218002+ymph@users.noreply.github.com>
parents:
diff changeset
     9
 * It is also available through the world-wide-web at this URL:
68c69c656a2c upgrade Zend
Yves-Marie Haussonne <1218002+ymph@users.noreply.github.com>
parents:
diff changeset
    10
 * http://framework.zend.com/license/new-bsd
68c69c656a2c upgrade Zend
Yves-Marie Haussonne <1218002+ymph@users.noreply.github.com>
parents:
diff changeset
    11
 * If you did not receive a copy of the license and are unable to
68c69c656a2c upgrade Zend
Yves-Marie Haussonne <1218002+ymph@users.noreply.github.com>
parents:
diff changeset
    12
 * obtain it through the world-wide-web, please send an email
68c69c656a2c upgrade Zend
Yves-Marie Haussonne <1218002+ymph@users.noreply.github.com>
parents:
diff changeset
    13
 * to license@zend.com so we can send you a copy immediately.
68c69c656a2c upgrade Zend
Yves-Marie Haussonne <1218002+ymph@users.noreply.github.com>
parents:
diff changeset
    14
 *
68c69c656a2c upgrade Zend
Yves-Marie Haussonne <1218002+ymph@users.noreply.github.com>
parents:
diff changeset
    15
 * @category   Zend
68c69c656a2c upgrade Zend
Yves-Marie Haussonne <1218002+ymph@users.noreply.github.com>
parents:
diff changeset
    16
 * @package    Zend_Service_Console
68c69c656a2c upgrade Zend
Yves-Marie Haussonne <1218002+ymph@users.noreply.github.com>
parents:
diff changeset
    17
 * @subpackage Exception
68c69c656a2c upgrade Zend
Yves-Marie Haussonne <1218002+ymph@users.noreply.github.com>
parents:
diff changeset
    18
 * @version    $Id$
68c69c656a2c upgrade Zend
Yves-Marie Haussonne <1218002+ymph@users.noreply.github.com>
parents:
diff changeset
    19
 * @copyright  Copyright (c) 2005-2015 Zend Technologies USA Inc. (http://www.zend.com)
68c69c656a2c upgrade Zend
Yves-Marie Haussonne <1218002+ymph@users.noreply.github.com>
parents:
diff changeset
    20
 * @license    http://framework.zend.com/license/new-bsd     New BSD License
68c69c656a2c upgrade Zend
Yves-Marie Haussonne <1218002+ymph@users.noreply.github.com>
parents:
diff changeset
    21
 * @copyright  Copyright (c) 2009 - 2011, RealDolmen (http://www.realdolmen.com)
68c69c656a2c upgrade Zend
Yves-Marie Haussonne <1218002+ymph@users.noreply.github.com>
parents:
diff changeset
    22
 * @license    http://phpazure.codeplex.com/license
68c69c656a2c upgrade Zend
Yves-Marie Haussonne <1218002+ymph@users.noreply.github.com>
parents:
diff changeset
    23
 */
68c69c656a2c upgrade Zend
Yves-Marie Haussonne <1218002+ymph@users.noreply.github.com>
parents:
diff changeset
    24
68c69c656a2c upgrade Zend
Yves-Marie Haussonne <1218002+ymph@users.noreply.github.com>
parents:
diff changeset
    25
/**
68c69c656a2c upgrade Zend
Yves-Marie Haussonne <1218002+ymph@users.noreply.github.com>
parents:
diff changeset
    26
* @see Zend_Service_Console_Command_ParameterSource_ParameterSourceInterface
68c69c656a2c upgrade Zend
Yves-Marie Haussonne <1218002+ymph@users.noreply.github.com>
parents:
diff changeset
    27
*/
68c69c656a2c upgrade Zend
Yves-Marie Haussonne <1218002+ymph@users.noreply.github.com>
parents:
diff changeset
    28
require_once 'Zend/Service/Console/Command/ParameterSource/ParameterSourceInterface.php';
68c69c656a2c upgrade Zend
Yves-Marie Haussonne <1218002+ymph@users.noreply.github.com>
parents:
diff changeset
    29
68c69c656a2c upgrade Zend
Yves-Marie Haussonne <1218002+ymph@users.noreply.github.com>
parents:
diff changeset
    30
/**
68c69c656a2c upgrade Zend
Yves-Marie Haussonne <1218002+ymph@users.noreply.github.com>
parents:
diff changeset
    31
 * @category   Zend
68c69c656a2c upgrade Zend
Yves-Marie Haussonne <1218002+ymph@users.noreply.github.com>
parents:
diff changeset
    32
 * @package    Zend_Service_Console
68c69c656a2c upgrade Zend
Yves-Marie Haussonne <1218002+ymph@users.noreply.github.com>
parents:
diff changeset
    33
 * @copyright  Copyright (c) 2005-2015 Zend Technologies USA Inc. (http://www.zend.com)
68c69c656a2c upgrade Zend
Yves-Marie Haussonne <1218002+ymph@users.noreply.github.com>
parents:
diff changeset
    34
 * @license    http://framework.zend.com/license/new-bsd     New BSD License
68c69c656a2c upgrade Zend
Yves-Marie Haussonne <1218002+ymph@users.noreply.github.com>
parents:
diff changeset
    35
 * @copyright  Copyright (c) 2009 - 2011, RealDolmen (http://www.realdolmen.com)
68c69c656a2c upgrade Zend
Yves-Marie Haussonne <1218002+ymph@users.noreply.github.com>
parents:
diff changeset
    36
 * @license    http://phpazure.codeplex.com/license
68c69c656a2c upgrade Zend
Yves-Marie Haussonne <1218002+ymph@users.noreply.github.com>
parents:
diff changeset
    37
 */
68c69c656a2c upgrade Zend
Yves-Marie Haussonne <1218002+ymph@users.noreply.github.com>
parents:
diff changeset
    38
class Zend_Service_Console_Command_ParameterSource_ConfigFile
68c69c656a2c upgrade Zend
Yves-Marie Haussonne <1218002+ymph@users.noreply.github.com>
parents:
diff changeset
    39
	implements Zend_Service_Console_Command_ParameterSource_ParameterSourceInterface
68c69c656a2c upgrade Zend
Yves-Marie Haussonne <1218002+ymph@users.noreply.github.com>
parents:
diff changeset
    40
{
68c69c656a2c upgrade Zend
Yves-Marie Haussonne <1218002+ymph@users.noreply.github.com>
parents:
diff changeset
    41
	/**
68c69c656a2c upgrade Zend
Yves-Marie Haussonne <1218002+ymph@users.noreply.github.com>
parents:
diff changeset
    42
	 * Get value for a named parameter.
68c69c656a2c upgrade Zend
Yves-Marie Haussonne <1218002+ymph@users.noreply.github.com>
parents:
diff changeset
    43
	 *
68c69c656a2c upgrade Zend
Yves-Marie Haussonne <1218002+ymph@users.noreply.github.com>
parents:
diff changeset
    44
	 * @param mixed $parameter Parameter to get a value for
68c69c656a2c upgrade Zend
Yves-Marie Haussonne <1218002+ymph@users.noreply.github.com>
parents:
diff changeset
    45
	 * @param array $argv Argument values passed to the script when run in console.
68c69c656a2c upgrade Zend
Yves-Marie Haussonne <1218002+ymph@users.noreply.github.com>
parents:
diff changeset
    46
	 * @return mixed
68c69c656a2c upgrade Zend
Yves-Marie Haussonne <1218002+ymph@users.noreply.github.com>
parents:
diff changeset
    47
	 */
68c69c656a2c upgrade Zend
Yves-Marie Haussonne <1218002+ymph@users.noreply.github.com>
parents:
diff changeset
    48
	public function getValueForParameter($parameter, $argv = array())
68c69c656a2c upgrade Zend
Yves-Marie Haussonne <1218002+ymph@users.noreply.github.com>
parents:
diff changeset
    49
	{
68c69c656a2c upgrade Zend
Yves-Marie Haussonne <1218002+ymph@users.noreply.github.com>
parents:
diff changeset
    50
		// Configuration file path
68c69c656a2c upgrade Zend
Yves-Marie Haussonne <1218002+ymph@users.noreply.github.com>
parents:
diff changeset
    51
		$configurationFilePath = null;
68c69c656a2c upgrade Zend
Yves-Marie Haussonne <1218002+ymph@users.noreply.github.com>
parents:
diff changeset
    52
68c69c656a2c upgrade Zend
Yves-Marie Haussonne <1218002+ymph@users.noreply.github.com>
parents:
diff changeset
    53
		// Check if a path to a configuration file is specified
68c69c656a2c upgrade Zend
Yves-Marie Haussonne <1218002+ymph@users.noreply.github.com>
parents:
diff changeset
    54
		foreach ($argv as $parameterInput) {
68c69c656a2c upgrade Zend
Yves-Marie Haussonne <1218002+ymph@users.noreply.github.com>
parents:
diff changeset
    55
			$parameterInput = explode('=', $parameterInput, 2);
68c69c656a2c upgrade Zend
Yves-Marie Haussonne <1218002+ymph@users.noreply.github.com>
parents:
diff changeset
    56
68c69c656a2c upgrade Zend
Yves-Marie Haussonne <1218002+ymph@users.noreply.github.com>
parents:
diff changeset
    57
			if (strtolower($parameterInput[0]) == '--configfile' || strtolower($parameterInput[0]) == '-f') {
68c69c656a2c upgrade Zend
Yves-Marie Haussonne <1218002+ymph@users.noreply.github.com>
parents:
diff changeset
    58
				if (!isset($parameterInput[1])) {
68c69c656a2c upgrade Zend
Yves-Marie Haussonne <1218002+ymph@users.noreply.github.com>
parents:
diff changeset
    59
					require_once 'Zend/Service/Console/Exception.php';
68c69c656a2c upgrade Zend
Yves-Marie Haussonne <1218002+ymph@users.noreply.github.com>
parents:
diff changeset
    60
					throw new Zend_Service_Console_Exception("No path to a configuration file is given. Specify the path using the --ConfigFile or -F switch.");
68c69c656a2c upgrade Zend
Yves-Marie Haussonne <1218002+ymph@users.noreply.github.com>
parents:
diff changeset
    61
				}
68c69c656a2c upgrade Zend
Yves-Marie Haussonne <1218002+ymph@users.noreply.github.com>
parents:
diff changeset
    62
				$configurationFilePath = $parameterInput[1];
68c69c656a2c upgrade Zend
Yves-Marie Haussonne <1218002+ymph@users.noreply.github.com>
parents:
diff changeset
    63
				break;
68c69c656a2c upgrade Zend
Yves-Marie Haussonne <1218002+ymph@users.noreply.github.com>
parents:
diff changeset
    64
			}
68c69c656a2c upgrade Zend
Yves-Marie Haussonne <1218002+ymph@users.noreply.github.com>
parents:
diff changeset
    65
		}
68c69c656a2c upgrade Zend
Yves-Marie Haussonne <1218002+ymph@users.noreply.github.com>
parents:
diff changeset
    66
68c69c656a2c upgrade Zend
Yves-Marie Haussonne <1218002+ymph@users.noreply.github.com>
parents:
diff changeset
    67
		// Value given?
68c69c656a2c upgrade Zend
Yves-Marie Haussonne <1218002+ymph@users.noreply.github.com>
parents:
diff changeset
    68
		if (is_null($configurationFilePath)) {
68c69c656a2c upgrade Zend
Yves-Marie Haussonne <1218002+ymph@users.noreply.github.com>
parents:
diff changeset
    69
			return null;
68c69c656a2c upgrade Zend
Yves-Marie Haussonne <1218002+ymph@users.noreply.github.com>
parents:
diff changeset
    70
		}
68c69c656a2c upgrade Zend
Yves-Marie Haussonne <1218002+ymph@users.noreply.github.com>
parents:
diff changeset
    71
		if (!file_exists($configurationFilePath)) {
68c69c656a2c upgrade Zend
Yves-Marie Haussonne <1218002+ymph@users.noreply.github.com>
parents:
diff changeset
    72
			require_once 'Zend/Service/Console/Exception.php';
68c69c656a2c upgrade Zend
Yves-Marie Haussonne <1218002+ymph@users.noreply.github.com>
parents:
diff changeset
    73
			throw new Zend_Service_Console_Exception("Invalid configuration file given. Specify the correct path using the --ConfigFile or -F switch.");
68c69c656a2c upgrade Zend
Yves-Marie Haussonne <1218002+ymph@users.noreply.github.com>
parents:
diff changeset
    74
		}
68c69c656a2c upgrade Zend
Yves-Marie Haussonne <1218002+ymph@users.noreply.github.com>
parents:
diff changeset
    75
68c69c656a2c upgrade Zend
Yves-Marie Haussonne <1218002+ymph@users.noreply.github.com>
parents:
diff changeset
    76
		// Parse values
68c69c656a2c upgrade Zend
Yves-Marie Haussonne <1218002+ymph@users.noreply.github.com>
parents:
diff changeset
    77
		$iniValues = parse_ini_file($configurationFilePath);
68c69c656a2c upgrade Zend
Yves-Marie Haussonne <1218002+ymph@users.noreply.github.com>
parents:
diff changeset
    78
68c69c656a2c upgrade Zend
Yves-Marie Haussonne <1218002+ymph@users.noreply.github.com>
parents:
diff changeset
    79
		// Default value
68c69c656a2c upgrade Zend
Yves-Marie Haussonne <1218002+ymph@users.noreply.github.com>
parents:
diff changeset
    80
		$parameterValue = null;
68c69c656a2c upgrade Zend
Yves-Marie Haussonne <1218002+ymph@users.noreply.github.com>
parents:
diff changeset
    81
68c69c656a2c upgrade Zend
Yves-Marie Haussonne <1218002+ymph@users.noreply.github.com>
parents:
diff changeset
    82
		// Loop aliases
68c69c656a2c upgrade Zend
Yves-Marie Haussonne <1218002+ymph@users.noreply.github.com>
parents:
diff changeset
    83
		foreach ($parameter->aliases as $alias) {
68c69c656a2c upgrade Zend
Yves-Marie Haussonne <1218002+ymph@users.noreply.github.com>
parents:
diff changeset
    84
			if (array_key_exists($alias, $iniValues)) {
68c69c656a2c upgrade Zend
Yves-Marie Haussonne <1218002+ymph@users.noreply.github.com>
parents:
diff changeset
    85
				$parameterValue = $iniValues[$alias]; break;
68c69c656a2c upgrade Zend
Yves-Marie Haussonne <1218002+ymph@users.noreply.github.com>
parents:
diff changeset
    86
			} else if (array_key_exists(strtolower($alias), $iniValues)) {
68c69c656a2c upgrade Zend
Yves-Marie Haussonne <1218002+ymph@users.noreply.github.com>
parents:
diff changeset
    87
				$parameterValue = $iniValues[strtolower($alias)]; break;
68c69c656a2c upgrade Zend
Yves-Marie Haussonne <1218002+ymph@users.noreply.github.com>
parents:
diff changeset
    88
			} else if (array_key_exists(str_replace('-', '', $alias), $iniValues)) {
68c69c656a2c upgrade Zend
Yves-Marie Haussonne <1218002+ymph@users.noreply.github.com>
parents:
diff changeset
    89
				$parameterValue = $iniValues[str_replace('-', '', $alias)]; break;
68c69c656a2c upgrade Zend
Yves-Marie Haussonne <1218002+ymph@users.noreply.github.com>
parents:
diff changeset
    90
			} else if (array_key_exists(strtolower(str_replace('-', '', $alias)), $iniValues)) {
68c69c656a2c upgrade Zend
Yves-Marie Haussonne <1218002+ymph@users.noreply.github.com>
parents:
diff changeset
    91
				$parameterValue = $iniValues[strtolower(str_replace('-', '', $alias))]; break;
68c69c656a2c upgrade Zend
Yves-Marie Haussonne <1218002+ymph@users.noreply.github.com>
parents:
diff changeset
    92
			}
68c69c656a2c upgrade Zend
Yves-Marie Haussonne <1218002+ymph@users.noreply.github.com>
parents:
diff changeset
    93
		}
68c69c656a2c upgrade Zend
Yves-Marie Haussonne <1218002+ymph@users.noreply.github.com>
parents:
diff changeset
    94
68c69c656a2c upgrade Zend
Yves-Marie Haussonne <1218002+ymph@users.noreply.github.com>
parents:
diff changeset
    95
		if (strtolower($parameterValue) == 'true') {
68c69c656a2c upgrade Zend
Yves-Marie Haussonne <1218002+ymph@users.noreply.github.com>
parents:
diff changeset
    96
			$parameterValue = true;
68c69c656a2c upgrade Zend
Yves-Marie Haussonne <1218002+ymph@users.noreply.github.com>
parents:
diff changeset
    97
		} else if (strtolower($parameterValue) == 'false') {
68c69c656a2c upgrade Zend
Yves-Marie Haussonne <1218002+ymph@users.noreply.github.com>
parents:
diff changeset
    98
			$parameterValue = false;
68c69c656a2c upgrade Zend
Yves-Marie Haussonne <1218002+ymph@users.noreply.github.com>
parents:
diff changeset
    99
		}
68c69c656a2c upgrade Zend
Yves-Marie Haussonne <1218002+ymph@users.noreply.github.com>
parents:
diff changeset
   100
68c69c656a2c upgrade Zend
Yves-Marie Haussonne <1218002+ymph@users.noreply.github.com>
parents:
diff changeset
   101
		// Done!
68c69c656a2c upgrade Zend
Yves-Marie Haussonne <1218002+ymph@users.noreply.github.com>
parents:
diff changeset
   102
		return $parameterValue;
68c69c656a2c upgrade Zend
Yves-Marie Haussonne <1218002+ymph@users.noreply.github.com>
parents:
diff changeset
   103
	}
68c69c656a2c upgrade Zend
Yves-Marie Haussonne <1218002+ymph@users.noreply.github.com>
parents:
diff changeset
   104
}
#,ai\YEʝ }5!{5٘>?5o?+\k`?(X/b!?5k5L :M4_c.YP@̳VaB3L7xa};TS̡tvp_ajMdY Da#0Pc b1Ʃ mK*\pꐐ;Q 1(,Fgw)Q| d~k0Y >R_2&<\Q)  Ij϶1Mt@K!dc ؙm_w^rx>v)Q`J@_ ; >wS& ĠV $D2$ah.X ^hjWY7sFwdk˖W>jQW!ơ^=O!(Il  ZQ7Oa(O0 b0A '(0*O!ak (F vŪ*(*QarAn6v`12zT}BSل,a@TT.Ǡ{̒`6 e49; @ϔ@8vpvfQ(&|1g`K#bD% I`X-}-aL,HA!A9]݃CAݼZJm)rˣm/ltv9[<pgq>"QyqU.flI8.֗=NBBJVҏb{HܰmH#"  ,M۔\2 [iXUa &$ BH {CX[O;:7oM C-' cv r iސXȟ|gD Ȁc? {-A: Xɾ񎃸 y eV8xF*Ib!$ign`3r0L+!\SQFH!Wd$dREdcT FI//|ܴg)!P-:E?; v^]ih0L"߿E=dz{UbF5&e *0IRb(kNl dNl0Ǵ# :q|p/ #\Edxʶa@0EdȔJ1|k` R'a .22B(&0`0Hk4aaLȅFFH3) A j%"{"뢕ԆH2F0$RVMAY,l3|ڳlkdP'B0c% EbL H tC8% kX]cH(3co;Cam{0]CZ&H7 J/%m}]tMimAFe~mãCxZޢPW.!`I}#^+x^(G΀K d,H"G/*T4‘(B ~h4~(Mi7E8@Y&,HK h"Km4mdMR;Ma?[’QƮGٝ#*HhL4-S)aF@aOieN9сIFBҨCQ$__F@U}g)l=1hPL_.VZŢYTKAl9Z{O VE ~PCQU`wWE ߡK8>ğr`&MJXK$H!)nd%vG`!*9Tv]EONl->t)ؚJ]"_.W4@khg`Vq"og\dȃ512PA22M/|ƒVCEA(FaqKƨlz4 8|C1`x< D fHI\!˨SAJƱA!>!>} ]Wbc6 - V @", LlhVF[r>;[ǵ+k3shj6(xB)|De~60'Gm8цhxT)ơ§1q|- 2žam`}ge ar}$ XIAQ t*(&6, 3C {Cyzk3=xRE]'$/}*C^^/r[bW#4v2 qlm8B<[di AuqH BHq=d@GhCA& d,XDVyspaQ.=! QQ-Cy(x'NKꬪM5lϙmc|=Gp{rH ςT/pxݿ_Jn.Z]h6 gDA(!" 4 l_%Df Bh p5hCpdY ?%%7"q  hE2j!;B@ۖlkr`ȗ_R goPQ o1wMաǨ1OgΙLꓖ$ Cd$@BLd2BR&% 0dIa$O=mWe%tUH/tbk޿J>ǜaD( ( a p<"p8<5p}MnkÐ.>ꊢ[E<&.@S/ {'e2a  t r>:Xqy,qY]@i=lutgX[4=?pq#zˎ֘ug0"rY"ӬN`gO,NC=} >0-fc$!MHIWhQkh"vAMs]/Z%ֽ8gQ=$a,|2=YOB*GWSj-|Sh @6?`ň.SQǶLwCٛ x,>L 2[ 4LBRY%1*& hX v5hm- v\00;412 hi G cHeUR>qn:2]8ƫ" aowTmMDͭ.Lō,HVL<- T8UKV ɿm~clH&!Dl}I-^]7A*% =]ed@1dB%,ѫF\7xͦy=n;7/hO` jj@Đ3뫚d^Q!-!>pSJ fMj("% D! .P T{@HMc^ӝzÖnijg zJOBԷRW~le1_8\J~{3T)J#+O&n$}zHPԝ, e@fb\uBZHkҌe~3G_eQ@5 4AL_d%zu<ٮ}&>bV0쇶HDJm/iY&![DNr|7k #%wI0Ua GPv^ Xj:~#Nɤii H=ҼL"" }mpiIDlfM R"@Pq5;wyJwȸR\\{ JN& ʢ󠙂F b JY3Ken}Yah,2q=S q&<{'Mki1H 0 F3*H0Gh,B UPjPP'6q*KG+ d$QHl c,=`gC'iz5jc;i`9Z4@43VI!. CQǐܱ<BvV6F nDhBh۲we1{A>{|i Q$d-30h\ daLERDJpQȐܝF- ]`|d0IfxNKEJa(uzű8M! HqhKX1\nmvL4ǍZF 0aVcL'hK!$4RHPP, ACcTB,ИH2(BXتjUVYִtK|z"t&Aw74Vp|.r# dh+*GL˔P/xLx(^}=qXhYjï>>䥡D`RS12DR̐@"dIfԠ&$>901uyRg04ȪN6ÎFxG{l^8COx|uvG厷kmU+U>U/̕ KKZ(r9I+?vbBn @nuF2,>:%PdԎ\-=!CF - Ɠ@weܷZɌ p,j.2I 4:!iFiˀn)xGg*~!Tgu<>Vho5;D|7!P@J" E2HGJaRT jhd!sjv ݨc`Rc|&=pBNjN N6r"jȥCƆn;=TƑa0 _X]I,%=?9ET~B#q@Td4ɎtA4qxHdQ y<yz`G|Y@⽗y.b-9XFqpzO xk&#{ǫ1_,lS㤭L(X-=7.\UO;Jwd )g `c4l)|Ɓ^EiY aׂ W?c/ӻWAn6A| L'p>ϫ1჆YIWC$4K:!;}۷`)Oە+]g切<+)GP0aI$ @ͩp/cDX<֥5}<ǞLaW=<`GtgfZ$jWH`iB@0M d4(h3\2'ZxE!;UBb' "0"3 Jaz wgMGW5J7Q wǨ0D2a_/ُ^!b#n`~ (PJQDoX1.SGԇgZڅ=R$H:j.+OJ-2Qt_l-ťjڲݶ2uLFP30 ~vǘa8x{^t:'d2"Ǘgdy wܻ#F }LQ`euՊVJ RR6Hd7FC}8aar,CE RkVhG@gE:ufί|n7ʞT.C&QH1 sNhuKAdkas<5攵 mBQPD -qGA.k|X,!|F-af'0TQ:9D>q`!`(S%CB"Bf)"s#^=eCaqHdX.TiaZGV.ԐH QCWB.A /o B_ǐ{pTb|w~cn Fe6ajԡtdP`k`ډfR ڦ*MhJS+ǻ96Fo v q)_Ԟ + L=p\fZK͏ [A5L/sذ;,tlhpV yX]}xrk,ZG ȳlmT9=2S4lYR=N(w|X?"Jr#` ()#<7Z4XRWoH.1-R Pe!Pf'BB Pd{=@=K 8hEXzm^؆koqv={?Ork?S?TYM3FPc*! 8qR dn6о8CYKͭbث6phu/tE*RS̘dN\Lxi`~s~Cǥ [Z mFhZtGbhnB }(D qf pJ_@Y&dA ZJ9U%mr647"E\y4|{rM)*AA0:Ur˅|v1 ₡${ </?8<`&56(6m5puLЕ .'*]s O,d%<yäcxiBQܖ~EFlvRc2b!=yut~Ȫk;]̣au0٘md8"ap5sFGc4܎v #M ׵,mÂF|MP9*@32 ,k /Vtpy}inV%V4 T@j,dbB0d#`0UTF 0 ]u] 'irB)x[P}6*aSA2aUqTEOW()O7SQ%J9I(,ºlrxLBc@F0}w=!` A?) hh4ۃj{|C,N>^;PKE0 ,(Vl!~(TBMЛ0Y[lFRMPE*22Ko 3\)pbY  'Jp@_ۇط XKދ] Jspw.ݫT@6>.&16i)UÖu[x!;gQ#T24 H@B ?dFtB=txe*ɰ7iq+ EAm}dyBۇD<@ GSā2P!=8\/5Ni` 35.0_nN* BLH @@`"X$$Ķ,dԓ4]H061 (Cآ.`fŠ*olfET]bRQYps@4=khv @!o}g>qsp_ |GA>| a,Ed) ,#naYij  )U>'6Yrpy0X&뵈M3:,8>vt4=]fl4uU5FdhiAbb_CEcXsnH4t:&sV0򳆏ZU洚!x ȑ"_9DDs$Ϣ͖mKE%`(wg/>*) T$20`@-d¢ PQ') +yn ,7ދzc@H0d(GJNn)y)0kiH;MWooi|D!~8I7{ޙڻ$ё0%G9 *2-d*bRUBGSEa9!@PC()7P` ;<| C^mWv#lc1N!nןaᝏ7I~| h5hl!>q8jh}(}4J 6Ed0r$#hL>z!gֲ@g;[qvӴ_rm$ګGi2{;'TVQSPI$2 K~cTN7ݑkz<6k˶=+ a Kd P})b42ih2 # `‰&IRETw˫q˞T*s=A}ͷAZ=5PmtbHؤmhD U$YK`J0 ALb_Ց,xN0Q5DAQvu v`-yyT`f@@ ]e; y6xu' ńXajU/!HYhҬ{.elrҚmHT-JPG SUہ$Nޮޱ췔+Z4,UT>["ǀ>c n_8+g\V4 Iv#+a )D;ٌTˡ3:5g`@G}ptѵp>sF r{ i!&i"D[bl\Ho="*;a$GoO/ H JHx֬'fbg46W0eI,]|/3]n8n!}qݗL5>P Cxn:] "yRCC*)>F"c} %10 !9 $QJ$4k,QډBal@b\5 TY,Ad QNvs72.4Z`,ehDA@ۈgĮoYo`ô9hVEƀa֦2CHfϏMGa8`g";0{^fta[}Wn7OY/|:%+  G{'?)ְciLeT2($P"EPE&KLMo 0 VVL 8K^@2fݠbj֚HB1AHdȠ{pޯEYyp&@\2+&=><}2xwvm}a's[mH20F'$!f9ȫ{Ԟ+燹}h @{,܎nj`:Qƌ ( /z&'pWݯa(XNBH ~fNP}F͙`PMQ4!E[m :COW86 팞C(# A.Zoc>| @]X0D;NjeB=j+ jB/DRH*pSl6@T7ADBA2Ҩ  GByAp<77.Ubb4d=_W0fJV\׼ #נAιC؈)WV}c  4*)!0̟DS9oEPPKߔIA'OU(;YwtO~y|<7&6o0=p;ZR1{T[ݸ]^E(,ńGGg_n _~|+);MBDE;dI 5Bqa@D,,I4 UW hT>O7{럦=? LR" NG\I0D*y'X)> !)l%Y 0U 0ed dA ,,(V RIPcFEdO$&2bҒT'Cti*J!Tm"IX T"$@Ę(JBR V"JdAP*2 XZAd-a6@CdKDIb2QX( CrTIPaeQ JY\@H$N+-?LO(UIP3\v:ZO?s?|L) #D L:Y(LMDvوjbLVBbn3FbrB@zh?MTlXe‘ԀX60^mSFc}c+ JpcKk!Db.}m3uރ 'SWtլn9全lVbrdv*! 9ebVn S`H٦ A:hUsHaZnvo[BM 6 *rP<軔۟,_q"e D促~ajGsk1Ut0Yr>\9͒(s+j$ AG%DFhAQ5ASqn5ht#{^ju:>qdf:_gF*VС g9XGh ACM+^ |c `4Q"זj!32۪ aUQ-F`mҪ ?h'LEuRh\JDGZH?xP}GIYc07?y*V濆D҉b^Z>~ c0C-̚Ҵ(t&8/ӟEvJnFH MBҿeQ 3 p&'QokwpScF#(QwKx^(?ABI Oqq޴$Oyx趪~4Hrl~Zwɬa%ᄭ\a@ad)_>A 1X/dZ>SI1nf !nH U98{vDET=cON5+SE x ,00@ (w67_ʈv?/I>qҁˆ9cUF($l.Vk<)0P 4o D AxBnx(S]iu%)jX3%^j]'N:>.bŋ?ewH#:z٠t,'֪5uIP1HV58ޙ~}S왾}^ ҸmC͊҈IӆdTa9$Y1* !I&UbDD"( ۊC_4`Ad EH N5qT]Y7o#u߹i*1c#ؚXz7PAV EFs-&FH+ǝ[

_NclAUJ"J[dm"VB+Hh)"%ߞIOҰ!Tˀ˺Zl8cvP<э֭C\X@wATRN|B= Åh9PtLqnhՁM?!a@R$niĎOm!t5Nj.M!#xR6,D|d/AtύKɜ>~tEᡇrHM6&&x0>x (21#0t s :iY"½A/iXi[Xp@AG3؂cy=\z_#/DB1u)i+L"J8LP6c/ Ck^{E9|ycS=&U=KpR"Ɗw;/!AL E>2J󆀘B DʳC$ %x3nK]'7nfF 2H3J4+gJsK4ؽ;  "@;$'-ӄMX+Ql#ZGmLb!q+>4mC Ja=_0O;KT&O񥒕Շz7~ySڑy{#C=OHEA"ީ@"ߠmT5+}H, r"n%  ozE>e^Gb*h ҏHDRwZ4{쓬b >~N(бbLZ[PW0nodmyi{,s|ZZMȻ*ZnL|V!A]߀>UYV$)ҁ6}AoK l8TpBtPICr5^ԭBP\qPೂ9H+8w^:i9M}PdfVv1܋fݲ'IBpjc/HũT,^<>ᢻv(:9bT"rߩSM ot\X@AFDYn1+:`ԡ.) 37:!0@ne!;7y<.lEMxL]s$߱6!T^ʐ,5>chm}2*mp, \"D#F㟱DRKЉw Ci7|3է$i.s.&I\B(TiԻr ^.TAS *29_iowmC*w~5Nz9=WǧQaa ߪx\F /t AOs0y[n'1JO]<͏G%*L2f]x A_Я%r\*At#<Ŷߣ7 ʫRVuƺVi๿̯-m_ܴ5^=8NBbFc@Kh }eȘ!fso!4 %*>✁+tQKc|2YM"s!f$dc~ \=H(~ b֦3be1s8`aÛQahd/ s)oe"/t_R$"(.Hk;TvG(]*O.XozTz!Dp:zzP%Ey&v =pm*yP}!{D7sĻyǏ :qt<ǼR{1D>b $oL-1+E69:c ܁$OC{A/3 3*0 2;_ă$ڜ,+# aHFRW"wW i(&4ʠt9CL Ry M$.be%Ҙl 1֫efR 1 \3Y}iR.da5 XLmKpCj a*_B@Q.a,,!o~ w%GB*Y)!h|lsIqh] oȋ='L%!\mxmRO ͷ|oF "^n2xHWmR'u/pF |,5)؊V_)l(4?Ӡ{u)e};65!ѫ=+,i b!'gq}5mǛ=i͗Y0kD) Xi'WԩfnvD*T&]U}MzD~^{=|4/E?KrAcʐ̒@$PXD B76xcɦVj|! :{j#f 83B4`QHh# a 9C<ǘb! MqJ 1AcI%6umfFȩ90̤$iʁwMkɝ^O?0XY>Ƹ#<$/5!іܦ96%vvW >:@~-w¾o6a/ImOv.6wXD(=.3 G5TjI$7N69JrY gL4 iDw,! ¡Nbt&2" S`=6HlJ ϊh9sۃ;& $PEb(2`n늢Xj0h\! F nx"Me຺R~hIF3:;[D.ٜ=h5c"ҩǝ:nIM<<$*l$t"0Q &4ZBJXxpGjDجՄAᔋôh"3Z{Xa ҥF $]\B]} yAzRN0Ng_̸{}~#S4$w URvvٖ-ϿQwu+o}ixL'eٴ(8̡1DQ{r 6%XQ 4z {Gs+wo0]mtK.㲼S=޹ѻ#L!L7ufXmUtm(Bi PlWAeL8ZQm®5eK/AQ1+Bj0]Nws&Y[CKږ$KZ 2 #^5ll#MA`h&JW>Y|qe&Mumk=W: nH[:a ZmԀ(6o' jhJEq*ٳJZa+@A>Ft_^@>(j? ۱x 1f)RzQ<`Ljt_uJ7^>%0^Opw% Y)Mv@jkm{%^v\R:(zd`:ZέsV&*xIuPE➭FȀ6/MR{Pr:Q CxhqW'UQxXLDLF%b?D>EGuI~oMQq[s\i_tP$[̙yb zW*6=.I؞/ >QdLR/Up3Vs G:(٭U:zp(ȣc/ u 7hٚ1, \\eBB? |@柎yQ8x=">(zSd"fBt0AIT B "Œd!YHEŅH(R" F00J*T >͇ jq8DN!Ҡ81?kC\C|^MC}^3aF]ҮZ~p|ho<&9؅Bd,Trz:qy䙊QBAH^l#GOZ .6*0DvME:u8VV7eiZP]wӶOMBlU؉ (~$ YXe uaіC0ǟ|e+:3s;G"ֿkYuvp30_ŭ>i]Gk{2 ;Iĭ r;Au죏28=0R,PU`Q^@ř"v X0G\8b{`P%0ձa!&Kq>N̞532/25ܒ,]yUPfJʒi) 3.HA=r8Ae<590 E,yGsU' iܟe-i`—n}+`d(@ w{5oN; f[Aa_jhB(l]l˃ ./+)\s6W.剖k]c$;d[rw>);=[pIrmCn U}iMm=8_,'#]B^+!!i4+3ߝc#[Q_itɛՍ&XIG{w% {B&0 J|&~+5p"4J!׮vESmFH@)45 M5\a{n;#mQknl>&xLwNƏ^uY5UDV 0pJB$Q&H r^Q%}25ۿ&yk <_5vLQ rG"0 E$ 1 > ߪJ$puN%e)A+g˝|0.৴ <,I@!A%eP5됡+tү^=[ff&8&d@BЇV]01$!_}ϐ.BQ e:܂ziV莑|'ވS5RɠafUDh6Z{tVA09V>inn2q MpgfHLR+\rYX8@+ځg]I >R1e 4}܀!t?F`* Ncm S~F{7NnUWz%k_-$XHO0} jڭ?p| GBCO)5:w*:%J5;zz#?6!$ۙچ K+gv"@: 6cl*9 MP&A? s@os7'\?֟Wi'jCUUUU2'?_0^rO׾3aշ|9ԟOdel|:XH0X?̍ap[Y"9Yv$}"ސ5o&Jp >u,gJ)p^L^g_@,mO79x3ee~F޹wWeY&QMV+XiA`9j};]RoRRfa( bPݧZmpHDxtlTZ$Ȅ0d@Zy${5jt%JFk YbRH5T$^3C¯6Z\yɽ*LAD6n^ @Z oy)+k:mnMK֜Ԗu߫wmNvt1/j 9grz|ygɖaQou ,~ڠ1+=`*ZV!"J9:p, xɠ]62 `߳U.ɆV%6=P!~LxZ5ә,E zTi^h@fS(kw-Zc Hy~=~`:Oi7)JW˯WXi[P*ٻ)F{)QBhwÝ\[d2eAeRM)$S$Jc_\JH ";fK 0{/fϰIƃWTϨA#H P5<.[Xe-H?v+B.(#Q&Yzdy}XOt|?U{,z,->X0<h1hI-uJ{  1,HB2 L:rC#ʎ:̄u?W/Y;vZ C@/oO؈mɹGhpOF%^7qh׸ءth> {0WYA鸂2"`̕N 7_+իWwt q33"X9v0j\0"0:y o)T !)_7nctQn͑h1.dV6K9 C$R1R@USxoȠ>LV7f)6>זּzyQ~zs0N n&,5-1<|ShU-3[q)k|; gY&صR%4$p4[\07uOj+uSgIm[맠UWbz;agɹ7 Z۩&{6A2S1x1SI~ʋy鶵TRT AUL%OuŔ6 e_IM v~pK;+!d!Z %P}K 3oۣ[e67%+3Yq)&$_m[x3))I&Pײ{a3ΰ6?o{ߣ1ozu MxC=;dx IS0D1apM0[PBWmk}`9ƚIzٴFAxE+f@a(v 0+Jم=]j3ܳ a |r>k:ǥ~kiՊӅZFd:5nWWf 7hNԽWZ.Hke}I ` A G ك; 338H e yxlFgh>>R룐gg:.C' Ol&{Ϸrd4#IaL|Œ8d`w"s+$d@d:U\݇z#{ڽ%Aq!$jf:A33EH' '㦘>6$=ӯvσŻ="%>n x=,8xwE֧%6) {>Ascʪ ީ62O@?=$<0Qʶc֚ FȠҮj w0yiVˌݼ5l[=2eYz,}q2qx\}k¼%Wyi3lDx Ab;IǞdk'{W߷`wC ȈGqf C`_w❿7wۃK̷HQAL>$canX%_) |[ b܆4K]OX&X2&@헄N-dDP BSSxnLxJ,`˱Nqd˚)d@_\go|+ϝUJ 72X`4 eC!z-\0M%VxV]xɡ} dE96D 8VB!i8Pgq쉵9 ۓ0gCh$=._ @A jx >,bBD@zpbk+|˱_@B5{Pc4Pݡڹ*z~iZ'f)<.Sc:2HBq K "CEϘB(ۄ7V #fO meflyuFdl߸q%{Ȁ/u+xg!6Yg4oQjf A.'rqQ3*I^p$i/@g!J⾐vT @ń,p5޵L]$~߅o<[ri@X:kc$Uљ1Tf$l=>og cVW9VqhYUk[U|c]l:<ې^vn;PlRmk;;>ŝ.SMڶgf暖]|B?PoAA:c'_F.Zxyڂm|놃/%CO-fMִ)c;ᱸM]2>T˳ղǼdZ.+F5ӻT4߷t&!U,h-C-l5ohyaHǘXl]n{> a7`3ɟzS8ݙ Jl8ې 𡖤Fң8t,A)=}]ˮM T"w ᑥV(00'-j,f.V2Xs+O%Tl@¸y hx,FA> go{hTѢŷv&Wz,f"xMhT&f$6(6AQ^dd{. 1<\Ƶ+ ׉5::y;O=+'K0rRW*Xr0rZuAפc--W0b%(N.BRVZ6 /l]Pf2ȺolZ6U[y hmlTu]I) Wdfp-Zߟ3S[Cucə@*BB^iHMSАʵEM<A%&3}mdV  &1kcNsfI}fF&ހ%z,x]NU['cl&!.?T{^>@6Qbi*[U:`j<@A d"hsDCdD1~{9e#8"Z% z΂.d+" ޖKC!!{=YXlr wfK7f2Tc"9ΛhC#b6Z3!WQ?rB)fsߋnf <(P [d{UfA^YaBS3[EpÀ}}Z=rk)T,Ykk1?p f@[A1A]}a a'D:H3>p>n?IPzC Rz>I%|#v:GܝLjh{] LH"}c4|b``? K|\c@.*N24e䴲ĸ6 .B})Iǟ(7A8]@5;#q+kק FOOiC=bP.bB<}`Sy n %_6=}씸Q0LL{:&sƥ7Z 6+jb a%xJCfFa;{_z!@wㅏ0Oo-d>xT z t$A`C^2 4%sp ($Yg vS_&?vfq7* {L6~fQq&$h")#莻n}H vHbx 6Bcg(.\$C=Ȍ7 /ъMƸWvxjsΎXp QsD㦓4kx|)ZU:GﯫWNUh&F#hU1,,A7,{C$ .a5#FF'&Њ}H\ǪMM8b`ͺp;?;2վԕa]!Faِ*gC,7ɇ/C:VYޝ 2|f@ !!@p[O,Z9>.R>]>nz_ (>p~*8unIlQ?*ڨ%,Ui8. -qGHWnսE\ku6CvԆy'+屧0UANXrةP6 Ι,$.H`}(gܲ*ڭ 6f&9_TGnLg([ڜ4[)LJW012Me*}:Նh9b$( BFO\1xyxŨ$!HWE|~Q͘ͅ@4 u]x0#XQӜ5}zZtLPW0$-x"Gz~VqlTRI>9h \%&!eү ֭Q36eREyIq&0\ʐdTX%VH&|w; yNNW$B>ۓǵƈ ܏YN/!}pϬ/S`a)ݔΜp4|4_E <<_aq;?߅|_+ ,͊u@ W+ZdOT @r v H8_.U #"dZ32^:du ?fdsX=RUWwm=:$5[='3iɏ txMIB0PZtn˽ JV`@k 0#d f!&Hsr,Ⱥ1)*z&*$ +c0`X]4XtJ z/ĐTx}E{r-k*P,(a\3b JG rjۃb% iz? m 5=\&nh$4=/ 7p cV7tԤ"|Q 4kX,6V03x3Q$/4x($ NY٠ {oPNB;,06=w}ˋ!-aݮclr翚5m$~Z=y0r?6{j0 Zu|ݞװC~qOޙx4?~?z<2n dA$4nf͊i32UUW6?>t8zXuB}ّ'iP)ᢿ7K6|*<2G[-=A d|0[a|4'o6ҕT]>\i:O|̶v{81^׉axbRqa (dP9Ed3L|_M'wXܐygJǷuOQ쮵${yJx1{m()羆CןQstz=0%yZwHCgn#>"5~>nZd;)#/mg?rQQm}ƶO8>Ȱt>(zHS C {wu^jɛV|ޏ_>#1$݋avTp(e @Tq&1E|KH \TT1|vwcC1,W:^*UaNls^2g2ܛߴn*}WSw8ySs׿w݈r`mSu1P|/=*Ro o{#κ0 qG.EHvoJ鿪"x%#S?Z|յ"C "@zbmf«%m(~urY!@&Ҹ1iUZ֘[I`A w^sK軛"l$de vpՉA{J^1:v:=FH2!Po!'|" g`|ZԶܵZո[m\յ 4)5[reCw c]0ϣBBsIڲm@`%֭p'V>ru!(V+VQ_iHH>lܨ'ڷ?f&*Q|,Sj.fB$ %'1->l̰ykMw9:퇾m^Oų BuZBYʐA)a/UF@ДOvx|z6閰m|ς߇i}d|d:HI=}?r4OC$@p,l\v&_Ѱ,,08bim"8PnQ !Xh~sj ')Dfa*h `29r`q4RT .VMB iŃ> U_ %ܡהZL_2 ;e\'C˼ӣ aZ#?+!Ed,; 'BA%8Z(ϟ_\% DDDf(+$k<ͫksd\F hOyMѠ4iMd IѴh4DL5"EQvR2m|d6Ш.|3&ZP!v\.7cw׬" |D98!Lj)I4"͊?%bU2802K\$穀 SJܑN$5b@