From da5c12133a6bc89f595231a83f8685b00a9f487e Mon Sep 17 00:00:00 2001 From: Rain Sallow Date: Tue, 12 May 2026 11:51:28 -0400 Subject: [PATCH 1/3] (maint) Fix typo in TeamCity build configuration The environment variable was defined incorreectly, so this build fell over unexpectedly. (cherry picked from commit 39a8f9ebd3379cd03b1364e28f011fe46e5dfcba) --- .teamcity/settings.kts | 1 + 1 file changed, 1 insertion(+) diff --git a/.teamcity/settings.kts b/.teamcity/settings.kts index 4ae9eedbfe..f4769c551f 100644 --- a/.teamcity/settings.kts +++ b/.teamcity/settings.kts @@ -381,6 +381,7 @@ object ChocolateyPosix : BuildType({ params { param("env.CAKE_NUGET_SOURCE", "") // The Cake version we use has issues with authing to our private source on Linux param("env.PRIMARY_NUGET_SOURCE", "") // As above there are issues with authing to our private source on Linux + param("env.NUGETDEVRESTORE_SOURCE", "") // As above there are issues with authing to our private source on Linux param("env.CHOCOLATEY_VERSION", "%dep.Chocolatey.build.number%") param("env.CHOCOLATEY_OFFICIAL_KEY", "%system.teamcity.build.checkoutDir%/chocolatey.official.snk") password("env.GITHUB_PAT", "%system.GitHubPAT%", display = ParameterDisplay.HIDDEN, readOnly = true) From b659b0aaf1653f6af7b581357d465362c6ebb68b Mon Sep 17 00:00:00 2001 From: Rain Sallow Date: Tue, 19 May 2026 14:33:15 -0400 Subject: [PATCH 2/3] (#3875) Improve handling for corrupt nuspec files Prior to these changes, the only error message the user would get is an unrecognisable "weird bad characters" message with no context. Instead, we now emit a more sensible and informative error to the user, as well as ensuring that the handling for failed installs and upgrades works correctly to move the corrupt files to lib-bad. Tests have been added to validate the previously not covered edge case. --- src/chocolatey.tests.integration/Scenario.cs | 18 +++-- .../scenarios/InstallScenarios.cs | 73 +++++++++++++++++++ .../scenarios/PackScenarios.cs | 6 +- .../services/ChocolateyPackageService.cs | 8 +- .../services/NugetService.cs | 49 +++++++++---- 5 files changed, 129 insertions(+), 25 deletions(-) diff --git a/src/chocolatey.tests.integration/Scenario.cs b/src/chocolatey.tests.integration/Scenario.cs index b6c24878fb..8a6dd8bb81 100644 --- a/src/chocolatey.tests.integration/Scenario.cs +++ b/src/chocolatey.tests.integration/Scenario.cs @@ -192,16 +192,22 @@ public static void InstallPackage(ChocolateyConfiguration config, string package NUnitSetup.MockLogger.Messages.Clear(); } - public static void AddFiles(IEnumerable> files) + public static void AddFiles(IEnumerable<(string name, string content)> files) { foreach (var file in files) { - if (_fileSystem.FileExists(file.Item1)) - { - _fileSystem.DeleteFile(file.Item1); - } - _fileSystem.WriteFile(file.Item1, file.Item2); + AddFile(file.name, file.content); + } + } + + public static void AddFile(string name, string content) + { + if (_fileSystem.FileExists(name)) + { + _fileSystem.DeleteFile(name); } + + _fileSystem.WriteFile(name, content); } public static void CreateDirectory(string directoryPath) diff --git a/src/chocolatey.tests.integration/scenarios/InstallScenarios.cs b/src/chocolatey.tests.integration/scenarios/InstallScenarios.cs index 20a2b1153f..1a8892c101 100644 --- a/src/chocolatey.tests.integration/scenarios/InstallScenarios.cs +++ b/src/chocolatey.tests.integration/scenarios/InstallScenarios.cs @@ -4208,6 +4208,79 @@ public void Should_have_executed_chocolateyInstall_script() } } + public class When_installing_a_package_with_corrupt_local_package_already_on_disk : ScenariosBase + { + private PackageResult _packageResult; + + public override void Context() + { + base.Context(); + + var corruptPackageFolder = Path.Combine(Scenario.GetPackageInstallPath(), Configuration.PackageNames); + Scenario.CreateDirectory(corruptPackageFolder); + + // Add a corrupt nuspec (full of null bytes) as an "already installed, but corrupted" package. + // The nupkg is intentionally missing here, since NuGet doesn't recognise the package as being "installed" + // even if files are present at the target install location, so it will blindly attempt to install a package. + var corruptNuspec = Path.Combine(corruptPackageFolder, Configuration.PackageNames + ".nuspec"); + Scenario.AddFile(corruptNuspec, new string((char)0, 1024)); + } + + public override void Because() + { + Results = Service.Install(Configuration); + _packageResult = Results.FirstOrDefault().Value; + } + + [Fact] + public void Should_not_install_where_install_location_reports() + { + Assert.That(_packageResult.InstallLocation ?? string.Empty, Is.Not.EqualTo(string.Empty)); + Assert.That(_packageResult.InstallLocation, Does.Not.Exist); + } + + [Fact] + public void Should_move_the_package_to_lib_bad_directory() + { + var packageDir = Path.Combine(Scenario.GetTopLevel(), "lib-bad", Configuration.PackageNames); + + Assert.That(packageDir, Does.Exist); + } + + + [Fact] + public void Should_contain_a_warning_message_that_it_did_not_install_successfully() + { + MockLogger.Messages.Should().ContainKey(LogLevel.Warn.ToStringSafe()) + .WhoseValue.Should().Contain(m => m.Contains("0/1")); + } + + + [Fact] + public void Should_not_have_a_successful_package_result() + { + _packageResult.Success.Should().BeFalse(); + } + + [Fact] + public void Should_not_have_inconclusive_package_result() + { + _packageResult.Inconclusive.Should().BeFalse(); + } + + [Fact] + public void Config_should_match_package_result_name() + { + _packageResult.Name.Should().Be(Configuration.PackageNames); + } + + [Fact] + public void Should_have_an_empty_version_string() + { + _packageResult.Version.Should().Be(string.Empty); + } + } + public class When_installing_a_package_with_non_normalized_version : ScenariosBase { private PackageResult _packageResult; diff --git a/src/chocolatey.tests.integration/scenarios/PackScenarios.cs b/src/chocolatey.tests.integration/scenarios/PackScenarios.cs index b0f2ddb49c..d086fe72a2 100644 --- a/src/chocolatey.tests.integration/scenarios/PackScenarios.cs +++ b/src/chocolatey.tests.integration/scenarios/PackScenarios.cs @@ -60,7 +60,7 @@ public override void BeforeEachSpec() protected void AddFile(string fileName, string fileContent) { - Scenario.AddFiles(new[] { new Tuple(fileName, fileContent) }); + Scenario.AddFile(fileName, fileContent); } } @@ -136,7 +136,7 @@ public override void Context() { Configuration = Scenario.Pack(); Scenario.Reset(Configuration); - Scenario.AddFiles(new[] { new Tuple("myPackage.nuspec", GetNuspecContent()) }); + Scenario.AddFile("myPackage.nuspec", GetNuspecContent()); if (!string.IsNullOrEmpty(ExpectedSubDirectory)) { @@ -600,7 +600,7 @@ public override void Context() Scenario.Reset(Configuration); Configuration.Version = "0.1.0"; Configuration.PackCommand.Properties.Add("commitId", "1234abcd"); - Scenario.AddFiles(new[] { new Tuple("myPackage.nuspec", NuspecContentWithVariables) }); + Scenario.AddFile("myPackage.nuspec", NuspecContentWithVariables); } public override void Because() diff --git a/src/chocolatey/infrastructure.app/services/ChocolateyPackageService.cs b/src/chocolatey/infrastructure.app/services/ChocolateyPackageService.cs index 14742a25a2..6db192d47e 100644 --- a/src/chocolatey/infrastructure.app/services/ChocolateyPackageService.cs +++ b/src/chocolatey/infrastructure.app/services/ChocolateyPackageService.cs @@ -1823,7 +1823,11 @@ private void MovePackageToFailedPackagesLocation(PackageResult packageResult) if (!string.IsNullOrWhiteSpace(packageResult.InstallLocation) && _fileSystem.DirectoryExists(packageResult.InstallLocation)) { - var normalizedVersion = new NuGetVersion(packageResult.Version).ToNormalizedStringChecked(); + // If there's no version information (certain edge cases on package install errors), fallback to an unknown version with a timestamp + // so this can't fail out unexpectedly. + var normalizedVersion = string.IsNullOrEmpty(packageResult.Version) + ? "unknown-{0}".FormatWith(DateTime.UtcNow.ToString("yyyy-MM-dd-HH-mm-ss")) + : new NuGetVersion(packageResult.Version).ToNormalizedStringChecked(); var failuresFolder = _fileSystem.CombinePaths(ApplicationParameters.PackageFailuresLocation, packageResult.Name, normalizedVersion); if (_filesService.MovePackageUsingBackupStrategy(packageResult.InstallLocation, failuresFolder, restoreSource: false)) @@ -1835,7 +1839,7 @@ private void MovePackageToFailedPackagesLocation(PackageResult packageResult) private void RestorePreviousPackageVersion(ChocolateyConfiguration config, PackageResult packageResult) { - if (packageResult.InstallLocation == null) + if (string.IsNullOrEmpty(packageResult.InstallLocation) || string.IsNullOrEmpty(packageResult.Version)) { return; } diff --git a/src/chocolatey/infrastructure.app/services/NugetService.cs b/src/chocolatey/infrastructure.app/services/NugetService.cs index 6313c337f5..6fe23d5dbe 100644 --- a/src/chocolatey/infrastructure.app/services/NugetService.cs +++ b/src/chocolatey/infrastructure.app/services/NugetService.cs @@ -50,6 +50,7 @@ using NuGet.Resolver; using NuGet.Versioning; using static chocolatey.StringResources; +using System.Xml; namespace chocolatey.infrastructure.app.services { @@ -954,7 +955,6 @@ Version was specified as '{0}'. It is possible that version } } - try { //TODO, do sanity check here. @@ -975,13 +975,18 @@ Version was specified as '{0}'. It is possible that version _nugetLogger, CancellationToken.None).GetAwaiter().GetResult()) { ValidatePackageHash(config, packageDependencyInfo, downloadResult); - - nugetProject.InstallPackageAsync( - packageDependencyInfo, - downloadResult, - projectContext, - CancellationToken.None).GetAwaiter().GetResult(); - + try + { + nugetProject.InstallPackageAsync( + packageDependencyInfo, + downloadResult, + projectContext, + CancellationToken.None).GetAwaiter().GetResult(); + } + catch (XmlException) + { + throw new ApplicationException("An unexpected error was encountered parsing a malformed nuspec file. This may occur if corrupt files are present in the package's install directory."); + } } var installedPath = nugetProject.GetInstalledPath(packageDependencyInfo); @@ -1042,7 +1047,16 @@ Version was specified as '{0}'. It is possible that version var logMessage = "{0} not installed. An error occurred during installation:{1} {2}".FormatWith(packageDependencyInfo.Id, Environment.NewLine, message); this.Log().Error(ChocolateyLoggers.Important, logMessage); - var errorResult = packageResultsToReturn.GetOrAdd(packageDependencyInfo.Id, new PackageResult(packageDependencyInfo.Id, version.ToFullStringChecked(), null)); + + // Set this install path if the folder does exist, to ensure otherwise unrecoverable scenarios still move corrupt files + // to lib-bad if they happen to be present, when the continueAction is set up to do so. + var packageInstallPath = _fileSystem.CombinePaths(nugetProject.Root, pathResolver.GetPackageDirectoryName(packageDependencyInfo)); + if (!_fileSystem.DirectoryExists(packageInstallPath)) + { + packageInstallPath = null; + } + + var errorResult = packageResultsToReturn.GetOrAdd(packageDependencyInfo.Id, new PackageResult(packageDependencyInfo.Id, version.ToFullStringChecked(), packageInstallPath)); errorResult.Messages.Add(new ResultMessage(ResultType.Error, logMessage)); if (errorResult.ExitCode == 0) { @@ -1801,11 +1815,18 @@ public virtual ConcurrentDictionary Upgrade(ChocolateyCon { ValidatePackageHash(config, packageDependencyInfo, downloadResult); - nugetProject.InstallPackageAsync( - packageDependencyInfo, - downloadResult, - projectContext, - CancellationToken.None).GetAwaiter().GetResult(); + try + { + nugetProject.InstallPackageAsync( + packageDependencyInfo, + downloadResult, + projectContext, + CancellationToken.None).GetAwaiter().GetResult(); + } + catch (XmlException) + { + throw new ApplicationException("An unexpected error was encountered parsing a malformed nuspec file. This may occur if corrupt files are present in the package's install directory."); + } } var installedPath = nugetProject.GetInstalledPath(packageDependencyInfo); From 4d5b9b40f282b6e4ae1183a1119ca468963bb66f Mon Sep 17 00:00:00 2001 From: AdmiringWorm Date: Wed, 10 Jun 2026 11:32:52 +0200 Subject: [PATCH 3/3] (maint) Update CREDIT Files for 2.7.3 --- docs/legal/CREDITS.pdf | Bin 172969 -> 172962 bytes 1 file changed, 0 insertions(+), 0 deletions(-) diff --git a/docs/legal/CREDITS.pdf b/docs/legal/CREDITS.pdf index 9627f8b67c7a55b5d6f2e0b51a394dedddabbff0..c39d541ccabf5534719e7f7dfd53baa39eedc17d 100644 GIT binary patch delta 18370 zcmajEWmKF|vNepmdvJG1(=<&t?he6&OK=VDq_N-<+#xu@C1?nc5D4zB!9BPK_?VeH zckYCDt*`%duUd6Zo!V7<*LnK+^b;fhCq@k#kYoI|@APifo@!Gda3UeK9>T`fwoDt9 z?s7gm9>3>__siY$+S1|l(UDOhvz`~Yi3rc1h_A$0FASC^0#?CR9t>#6uK&Of-mdB2 zOj6mff4QrfR)5_9m)jAU7h5x_48V=6?zp)7J@bg1vL`26-=v@m56@qZuM|ZBNItr% zez|!U*Ys|VZu3<-Yl-$1f%eeKfH)iaf>pmm)oFXL{=f|EVgl{3L$R4QDY3?vsDAB@ zG(0@upJz}q=ON{pr_1}fU2^OBT}+{N*9J57HmURu&5j?D4>Oas%9Cqra&o(J{c7db z!S3J@o_C%LtG>o}nUoU^^p08mYF}=!NUXD-gE1i&vdpilb~UuQ`|7^+ z`T?fS8dX@|nwU-k&-)aUKGCC$2F8@Uf$WI5j&iW#i9{N)$IZj^S;C?qK07LDZ9vC} z)0~7e<=(ik)99`0jmYW*P};41+9Q z3ha=d=3Ud{)r!ZR=;L`;-CbKPvn*pS*M^DNY3$Emir-`v+42|$+YJ<^Enr9(Y$oSO z1KUfYPm693Qab#WDY@UAG@8lHAtAvRy$_5Ni*3I?p%=K>GCf;BSti)P9XS->lu{g= zHo=h_I4cyOwnHEKo(Jx zpp5qNm@hd3zu=1?obw}@@+Da|Op6_TV&YczP9lqJpJtJLz;!%hLdjKQ&7$#G{PBK39Vw*SR)rkX|gd z^=RJDme5G662c5>s-*8pn9JrW?0#8x3NK}1Lii;|&FP2^P}=dU*z_i9&0kGR#eEnj zGMv%u^IH5sw?q?v>`Duh%rX#rC#mw%mV{DT4gW_BGn~)(452vmHNuaZ!akx(q~mls zw?xik1HI;~w%mcD_x3zS*hFLL;bcEzEbER-K9?a$m8Yb{y*S2-x3jiiqDe$8Y7@#w zPa187vUe8>6`bVM4|CvQ(e1*^A7dNccb*RGzm-$+b)0kL?^Q5{Ip+M>H|ytEEJ$^` zWwkjHBG(*OixA&{WaFQH1(eb3LB|K$xX93;irReQns}`EM|dHYXn*8!ibw>q2IR~6 zftt*OZqgcVW#5y#zC{*)4xh0ge1o%#fnBYK!0r!3 zLA9&?7rfI9yljk1?fi_1fXcZtONM?X!T_gk2O6!^ZgX0TS1=Aeo1x-m2`UZvB8+*# zJpNce4x<8{8?1&It#<_kegNllMY^>^1C&dwu}t2dis?cRpXu0Le{LSoFznEXI$qEH zyfF=T#&=HoWV%oiX)%2bsyv_vUdM?(sBHw$hsD*W@4vc0gDeFKxZgvtq|5B2abDDv!(G32gQTj^F= z@fHDh_)pZ5nVhV5r3j-p_P{t14d4_g4EjM7G}*kCyKS*2-J2!?A+j-B%g<7P%->yMBj4~3+Ctco4n z3zRY2ChfgdSwK3Sh4@M zuMoIyAL$AK`mp8r&d9^doQIl7ztCiuB6T~R7t*Gaf!p5asDl@vxNM42-`NTk$uRG8 zUBjNHIDZ$fUCLP|yja~{KwExPSD|>*3Qwc=0~UvtPK$Kj)pBFMnkiX>V@D78~_tEhQvxI^$L!j*On$9RPpfRC`6m^-Ns9(S==^C)=ZWo9x~X!%-H!quU*W@43({B+jM8vJCJ4LZP0&brah_ zlNOs+Y~DZeE*{^oy<_0*b>L2W>mye?V>=ABITkzl#PhWrZ#2Dm3l)S#YwCOAS#~F!LB6!waw3<_Q=Wd5r7oZHQW$#O2{-7qSO}krI z=;=k{8okoD^R=npZ#j+L)^b(lmC#NLOp%kj7&HJg;@c)(Zzabv{SoexTkH%MB7&D=D*uzZT&Fb0~IR9``yyPCD-l@GtoT)7XHoZHt0 z(eBrQQg3^)hg|($G{0H#4Q0>z7Ln@8k#%AXzqqm&tfQJC;$S0nxPK-;Vno~Ga0Xve z7lQOHvj#!2$UHF?MI}s&d#>%o9!bN!?Ny%)GmGf!Uc=e=to6Nu8VZ)lZj36f8Ccmt zD9vbrESsrhyI7p2KQeAIK`dcFc89&-QF#qb0wP_iFA^!p6aVCXC2>%?NCPC0{tBZ< zJuS9kZy~+hHVfxb#QW7J4sDPN&B*ZBwE^YCCI#ge498~ukxDw$#6Ry9My8+@>uWcv z*fQ%ym24k!$de)(Nr%XBSu^|sH(|Fc^=v2{KTDXbK3n$RQ?F*KBRlRJei!z^LW@;u z-SF}B&bSj~(MzNp&Jz_84i4|B?i{xckpg~uzgyGVZ6{HmAMGhWJep26Zb0RkcWhk{ zsPO$)8McA$7m_~grhR9xH6Cs?Fa38+8WRs-h8DW6h|q4J_zCrrK(4vSqXQzn=;y@H zdRm^Ze52ar&8s7vRB=u0FURSuV%o;k!>{dha1IX>tDD;1B^B-ZI$xhoZht%NAXwGu zt)HzQ!-WU^5T`}@5*wkBfIH0Q4}Bjw|8K3f{6pie{Oz-uHfdrE7t!RO!cm4 z|NfgkAxd;#b5_`|HhJ%3IOZN}L&^tVfwsGWUD%_K$o*Lfj3#vZC90i5(61eZF_*Ql z4aiV(7b}-RT0)3K8rB`ss;LTP3K$iUX>*DYIW2aA|1lnxhmV)QH%1zMwTQuOI$M2T zU`Iy?cewa4R=I}uk=qltqq^b}eU&kPx&LivnVL>s{^q*PLWMRE;!c}1e)9AS-Ud5- zU6C|3QmN9ey+P;*_OEJ-Qtw_?yM3*GDYB8_INY@@Sz2;E#Q(7LSVkjC$vJdvPh0*S zu3Muu5#=3^S;$6kQ3NuHQ=lX9KI>Y^!I&w+n`&IqhwL%HhAGUr?P9u~uK- zH#~my9-!L(!UrB_v{?!{v~QCPH7u-$p(1I@K_n!EtdwsM(vZ#s?GY1FXGat9U)CO8KcJz%v5(aXi68d=bYRrwVphyh`|C)w zJEkX772{@lf8o`=i|XSeoVqr>dVR*)(*x2!C_xZ!N8kW~UEiEf(JalSorTRz;C4*SLn|FBX!J#m?6UW(&rL^`8btUz1ovr1Xxatu zSG#scjFHl6<=>kmp1}yj5KOA5q>RMIJbl1o6j+_NO&kTmaneX+dtZ!s;FLb$I?!4y zz&VZ0d&=XHU5%%Xxb1plb-p2f5#UT9=0K{7h^JGXghfg#6k%Wpephz_{B8L(Bz63x=6H)BabK{ zuQZ1dIMZpFO%9mD;3)?DVb5);JqBNCuRzd+DOi_SvT?r8h1HNG^dzQab4Hvl(?5{@ zZ7HsM^h3>*OJAv~flues#(QyJEYb7%aW2rT7#WE(!K25-Bn;nd9XeL`;N8`?LO-2C!0ym zYEI0rWmC=!L_Y>-YVml#E#t+<*Akqz5TE`aWU5A762$#!z9GEKjWK+37T5@ z*7iF>-SwqiDttHzQn^c6dezFLw(>?uBoVr}tywhRkewJ3%zI-y4MOl$OJFi-pt2$| za7SvepGXp>n{$4eVk4X8Yht7cXZrG3=et7mnx07z`qk3-f@d@{w5*s)MTSv|Fp6!w z21!y%TYvyAXzvGTib1N&bl*%|dPP0yQiftK$3 z?p+x01$&y5o4or#j#XRthSoGklet&sbkM4CMJYS13M&+L^C8KV?X4H)a7S!EQ^6-y z|MDuTPWX`2BXf|91|}`&Cwm0KTaXZ?qMVbAhIB;`FGW7w92SQ|lhe7Ut~4QMt!JM} zwd;G>ATO`UiZ@>nI%CEb+K+-b&)Q|Rl!A#+@XEQNi_+RK+>D2GHyHz(JtK{XZEqsIE#BLy?~-k- z^ld|Ps!4G?S|!)v?Dr$!t2F6u@^4vO&Xp!uO{}Y%9SBhbqlZ>%sEFh@fUp?j;2T^C`uqSI+)Kr3N73PL@m^t-!vOX$B%7^U8LA`oz9YeO5{ zt{?A}xk;&#BPwmqJ`s1+8B}>XU{x3GNaxPik9Q%n?xvf)Cs-3l6rW>h;+JPaCU$S)FN%&lhh6OyZ!e~W*%&V&@k21alKKXV zLd%j0G8UTSGYm*W`i#i3hZT!dkF#jix7PoMyRc^~N@I?UeCSs5byWq5ZtL%8opu83 z==ZdPGB=|JC#}iGChe9g{E@Uibmx}p{_vSzPRQ!(pDOk0t`>H~Dv4iMi$&;;k_A&9jFBRU zEI36^B$l_9%!J;rD@Ubd8(E3?YhI1)gX@*#fBMLh4(B1mb-cmhion(>vivPBR%6DO z;%W^)#xkYD8J6he3QXzgu&~&!P$?Za1+sYhRu1;V7zvXpgmtdRwl1 zXy~ig{D+aRnZ7ivUHFq@!zaKhBV)&FgXJoaesP7#ChFk#;kfxYQsR>$%ay!!HKh+g zocrvmU}a0yi}ualXZXEvVH+(tJGj672R5NVr1A(?GJPxR9H?=Fes7#RlLB{=ArfBx z^)TtgULLf1sjN%F+_C%=6!rdXB~1{3QHvdU!ZQvcCd-Bn=gMCUN1p^!3yrO>2VyK@ z!3nlHV1A>pK+a27Q-GT|ciUlBl?wX%rey8^-#J_Y^OpO#?e9T%59Kx1qrpz)!M({lyO#pB>7so005amNRI+>A#UfAbFLicP*WU(b8FZ zp1xQs+Lv76BeawHSmveKTk{4#f2E?Bl{Uw1dz|7Ln zUCqO$-)u1k$(+tU4Ms>D8&RXv&>-6T7L)hLu;ntOeCzK;L}^F0VRa#Xdx9C=@fxS4D&U;!lJZR^sgv1 zfg1_hv@ik%wB;3H#QeYmRc|$F%TP|?3JQu8#<`D*PQ0A*Kxiovzb`UDt1lD8{zf^8 zlv}6Hd@GMwurAtdA+JwtnxFQ>?%>r3V_wuC~5Y=fjFudW0rf<%f$q-;Z3M_9?H znmh~XO~?UE|Gx4I$>fyv)4#Z-GQ?KKZuT-abZ!M>5TDna3$~Hi5`75aA>-%$d+zke z3}*Kf=yRoaVDpL|KzMoAVc}YpK>`&ZZBV(N9)UzjMq$<1ht{;U=QZ)haCu+rBDb;O z1-0E(v}u*k=f>jUSjV4+p9qA#4o`93DT|?3-4A=i= zRu2cG_2%kDrnSB-A$p6wV@H+ub>X6cdxl!j3%8{%OG^+{_Y(`vP@FW;7Tl!90^ zsPtG48E<01OlQ)x53+Q0ul3^RQ_8;T$JdiEzyft9kxmOHW=p2tT^yf%?N=p0GjgR_ zMnMYayI_*K16_2#_kPV`Xt!K&N~EzTNzq$?hSrxFt+md97De2&YT>-;bT6!5aVk~A zk5}P_@cDh}OI;0PDXZlR7N;e~My-d}WxEWX^DfAx04N1m|F`o;zz4#)Pi~s25si+2 z)?oAGv$~jQsC4$Mt!s<6@m#f`ZMHPvUvNo%RZQVy6#G66&6pag7lkrO)Um{&h3cm0!*RFgP5)|9| zIF)fWoB5l0zvUZT=1T>+-_cZ*?(~5?dYdL^dl$fFj-tyOLR|SyQZ4jCUOVveNc0Ps zG@dGnrktyg8ZtU&2i4}1vem3aF5I3++S(Ua{&}d>)d&S}`!Va?b#42$y4t;_=t_2* z2utfZt9qUL!;L0GL76U{@1^I%ncvxcM3w18UML2s{Yg)uTUDIP=RQwDqvKuv}Pm!(I40f8R-%;JfRSiRb8})`T3p@}iqFPTiIrAs+#49f=BH*{A0KKv`fob+QPFe~vlOO#@T5Out4W)n zOl{A+bSNcY&RNkAO|`_wvRhXg{6*#YV9zsoHqAjAsmQTso%PBT21F4f z%x14ziytYYgSu-5myCZYpd+TrDoX)qZM}alWoLrJSnIm0FULejiUnN^DcLYIYYrq;UQ?seORf&0rs4Lej~FhP;_ z`y?~-IRo3hR~Z-#;j%~Qb3>bg;ilk$kyx4^X|u<6yIZhmzITONWorl!$_`l7$9Op_ zzC(Qpe~~jGE={VT^+2DH_bASq_E__se<;i=K+iTcdM{KDPO_{T9Reptr&ZvpL#Hs~ zIh4+pEr%Oz2pF!xHK$PL2G(ZmWVO~sX*93clP(Xqq?IaR@U<@Uq9lpIgxrQcAQ|KbuS|MBu(mhp4I6V}aTfl|h7rz9^HY&l zLG9ojGlna>KPWCfJRBOZGB??iRg*5YHjF+EbMBy7R^}`e$-1 z4{E;I0-lnR*y#8-ajaBS75$&snO}TMu>IaL4n|G(kMMaP>`cdo=_K{Aqjx++94Ux5 z`>~A))hSytjQjFlNzB6z-AOwF0hIGz-I1pPja%naZN&k*^JVz}>;t-z^ow=*gesZs zp%yQ{Rd!E|Mz^f@A0yR@W?!f#g#Ba#EY6zq1nkw5Ny8)*h?}ny|ix6Z7jwjxSp?oRQU#cdk*KRH$$+ zb5JP<>ba$s{n=D!fQjioG@i(RrMoHLTIx@lpJus`FIPp}B(JQtMb7$$X5^jC8t8m4 zq&|bRu2dr;+hEu)z21vS@ZrQQQCNJqTfayWlgtC4JKp82+o-!l1pn)lZ&9U+PHa}L z5AQh2!1+Rz&$f{dTu%&-t!8^&+Rg*p)`QlV!D zI>qkEb`zs%6DKsSS$_i9;qZ)UeY6y&?G^|9MyA~~EJMjx>>23vA&Xs%Ia&kL*J$r) znJlJ>UdG1sZOrHI9m(h&*_sPSrbV4H@!;YyP8qwk>jqIpcbp&NA6_f=A^W}|pwIH` z=j}s4a6+(6p@uQxc_h_#LH(@RJb0<)DWL+sP0F>%dqOS!nSVHuL=X=?mTfk=r~t z)GX>9Y1CBMkr#Wf+j|=X25*krK1*e%ZUVO$`5L{0~NVWEu-)04+Qa2 zJe?EId7ArU=8JjA&EuGjHFdb^RdJ7U8$H-j@I#pJhYgclUmAjGF7*kra{O#p+C_y3 z%Xv);{1ggzbGToX=}zLzk6K~O4z^s{9$tI17{Jb$efBCo_fdYjA3ATN5$Eg=CxhE) zqsgx2`%&fdTBuOVMS|ec19`fo9Q$}D|4l8h&o&^*odG+55z4NQXdTa}xOK3w*Um>9 z9Gr7|cZF){F!jshJ!_&3Do5_{MQml>1n9T8>PV{u%K&@cHcxoVBFfH;Bf3c zaxyIObH|^@l|F})i)wI>diBXZ+;=6?fj1KAx+_Tmkd$j(TfH0`q0#WJikpZXG3Tx5 z)54OM8UopJTh2MjyC+_mJV98Gw>sXy&&3Hd2kTaC-mV`B^mtQ7)v#pH#7{^D2;^8n zQ`hY2_QHg55d+HDO19_QwgyZ&sNqpj8dI=GWuE>v^>Yh5=2vGDGZGapPLql+Ob3IG z^>A$yoO<@@B?`K418E9&bouQqGz)P%L+wvKka_PBN{&1wK@a#G96HVRooWc z7n0KVnRgYRI((_FkFf)uOhJgmbojJ7uP%Vw*4TDMDK=+7kvviuD8*<= z7z-Im2_7<15D0h|B8}nADQ%g1Jg?gsYL$X-g#Rt3h<_U$=|j9h884%97CT(FU8S`n}bNc9{gIf~7>d%7FUu?p0>8%8g|d>_vwhf~Ry zOYEx(JsOuY_)&G4G>6p4F`dI;8|`U=v*q2Ry04TiiLXhs!!0aa(N9z&bf$|r^AK6y z=)$W@I1A!qHhm?iu6;kYqnp)I`f8)-9;1P?=mFW~%LoWmWrNxrj-y|S9s1|b^axi! zWoWs)D|va4JQ%}{NT2ZL7Y%IgH%>kdT>&0zYkBRTF3qWcLrd4D$`Dg?Sf|hL_r@+Y zZcAoeQwzU5qP3A#A+nj7RSR%E3UtocggYTyYlsmgHLF7VS@FFgF$FD41S)ITH&zE# z$h(Ey2_DC@4$^f2@Ql342z{;CO$Jv#y3*w9xKnqS`1$A0JT zi^q#M7S1RmCz!cly6`2ehLLUrtj+5#Ne&fp+}~7yS?S>_AI(~oB--sYQBpo_VF=>) zHNJx%fJL~>tHH~%&Mm3ZC#co=g!IwPMhB+frAFfAi~isP2l6 zAnG5VP~o;`iP|V{C;l^^PoiwHLqWNzbH+V>9JneW@^r*r5MC zwJXM2mRaiWnm!|pKFmAH-Vu(GsbFpgWFm?pGX9c^#53P$(EM3}#{;+TyDaU(MkIY0 zs5)yZ*`kkPX;q?Ia(~`0Aso+|Psg54E!G{~n!sl3yf~IoqtrY-|TbUB|B*x z_pjPEC0^_~hK{cS(G}qSmSPd(?Y$gkOA{PdoDg}FQ4Bv7X+_pXCB<43NwJXjbN6AE z>YRahzd3Nhj7gb`aJ2NZj``hMuXr-VbgzxO#;!l@P!(l2IDLIzu2$JqPsW|UTV4`q z2$`atG*L`m+=D^*DM}6iC|&RUN9B~|O4T*TwvLM_3O>H4!p8?Jrh6zz)i`|0Ojc#o zTo*Z}Te1W#*?eWx%e;UiTDQ8Z^m4o+Szn={QzWW%x#LpA6l+)%WhY4C2u6Zm<7xp!osa4H zUE?1GTKj2U2lPmWt#NGhzQZC4GELqd0yW*QKzbxoip(TFA`L&{*%;(Tpj~XGt(%sK z0}b(b8ktR%Tynrik^~;o*Iu_IzOt4ohC*Re-3)iL3;D_Dm3L=*$Jn(vhn*99P&dDv9(vio`JOs5Kp}qTsdH83rg}{>yLZA) zwdr~rWGOypOBzuli2ZY@#}J;738{dH>M`qxPt zZ)C~^?$9W4?-ij*Mj4SeaC^~_wBOi@r37%eg*#JqD{zgyiQ8ib@@VwvmhJCS=Kk>g_y*|f< zB;O&BiO4k~@0fIwybZ#sAFDBWQG-6)aTI>g-=AiwJc;(Jd|aGXe`2Drn3}*%4CT`v{{I!+gG7@?pzD%W*=!(Xf}21%cjCM^bcsXC^9_RW)2jUe&6oy z8mCsb-xF2A9^Gzwk0?97+^tf*d>o2Pg&8lB+*XTn=6I7);kt9XKR$a35?1ay zgG=*L^v|;1)tDa5&L*e-Sy=h~$?fWwfm{)Thg)fCqil58)N4`@R!Yv>+}#Ta2wGg! zxyaazgfY!-d6%Yza=AcK6(?u9ySAe z#1vSV^ff=i9(GZRd7;`EW^6s)$pifIA>v*A32+TNis6yPt%AL=Si#IJiR|g&mnep7 zb{=}W!CJ3|NfXss5<)-31G2@=o!Qbz)FY)!ChApJU!9%b_6c`QHOb_rZcf6XNdOw_ zyeII9=r(s7BKASHQR=8WN|{PHEqI(4=OWzJ<3qzRY=@ful@9^Ts)(bF-*F83#ic2} zgMyT1MywTCC9~Z;$>!^}Xjf@v>t}1Y@DEPBeOj#;&;3mbAGYvYNy*q<^84UD8XP~` zMu}#Sm(hKow zPlyR||A-2@=aJ>e#==(9jm4&*w?zy6j>=XsW-8I2L6!54o%9gC$KeGsyy zWNRAd5ETBA`aMlc4JP{~cEvAN5>J8Fun1PaKc}ofSv9(bY()Co5GL{+(2G48ug|o( zVU$kcyvLbYazczw(U8$uQUygu;B4i=rt1!PX*f+H44Ni zatdrJ=Y@@WT-2;7F=t!52JCKD(L))1xa-^ztLV}5(FhJQe#_?RB}}syroPvOi+ei< z+P;d0*IBLQ;v9mI&TR`bV5&ixUMCI+!0;+6059Ykl9hheY5{d-I~8T6nRnq+dgBMp zN&U3qYmE-wbQ8+U8KV*qScP}ld7VB(cRnkA|3;{Wxh+~F&z0Cc|nZzCr0p$f2P-n}v>Fz+bfIM>1We$O5B+Gp3BU8!)XEK9!5fN*rQ4>szU zMJDH3Y@N^b$-2)hYdLm#c5-U8`kQ2mkG|xk3e5|x+w2xGY^I6cI|>Ook(#lvoENf1 zT3^S4#~`X|%-$1-XQlMJ0zMnVvfrpR3DTE%_MWa@#6+kR+)Q4EJ!yQZ_|Y|LzGyOA z)Tw!BMdYvbl}t&od+R@>ILEO#3BX>kY1 z1!vb;k5Eqcf{6gN|8N+iBJ#~ZkEC55d;QwM7i;c?f-qrby=m1DkP*mo zU3}f5#;9tY8@LlYiWrXhk#G{Z-gtJod}DDU@Ld=?iE4ngXNMcApw7VM%B62sww0U< z0$$~!-}8$zW=)tu-BX*TZl+-qzH8ey)FCu)PO+GxoJ5x;dRWu65Xvg-V;J5FH8s5| zjzF5@jV7U&e`HQ@AZsb>_${l93-(Ph6hKnNH}Zxu11f#% zEJ%Pvs@J8O_nNIw)yH6_uJ-mp8ua>;6RdCJv|^&Sfm>+NDrSIXmaW~T-MC=Yu{b7? zJ#-}ErGo5W6i-7FR`Yt68(}w!(w?=D*9?u2B>K4Wd?XyjR7*dMAxo-2vO7vcfmQEM z)GNwUaCdhh5?Y)RG&>ySCN{vkJP@yMOL9pVc<4WP6%hCNtx@SY28vGndznVrI-!v z=)FiiQE46-M)j9jvq|)(hi(fOuHXekWP>mshr-Zbzj`G>44+DCbh+_={H`0c_7-n| zRfE-u^CUCkHT9yEG0l#))5!dSiYcV@KScgEJyq<~OwV_PnZsdhUrZ+Y5UEog%#VUM zFxt}9-h(gwW1-b|?jdAnQZn?#Rbh?YLKrgSbPj>EeM1n67U2sy7XQ#1@&K(z?)4J0 zUh&`g`d5a51Ro~MvnAPV>Yi{>nR+q(6&2amKMRl~$QrPzZ^P>8wf0VeK#-#-AK%B( zPz*}KO_K~e)Uvq$Y=0yl#8vl|JZR)k<$GqU%g=!GQH-CEOn-&Wa6_rrHH)5$o@(*K0s2*v>bHP zc?T{y>C10U^hkdgg>$ zVYl(OtpRD?A^GC>hwqLVJK`0)7D{UIQv*Lh#w#jc=J;ti9leInOUR&~D*Gs5$+u0= zWr);yyIv7gR>A;IR&eG0^Ux53s+mhfR~SmbBKu~kC!&OjJXDkDnlgW|!B(#DqU-$x z-B=j-3|2PnnT_N4i$`-f{z9vfy~Huv9_G=7`!VPmVknlCYe+0joOLM zvGju|9OZY~7-jr|Rwu31n_@$4I7)*i+=HtxDX<_7ad_X9Vy$IFID3)|i`Ow~vN-yj zn-X)s(z~YNVh-uBduZr2m*dHGMoufoeW_j1MkEmfhxqF@E0;Gqo3yeLtg?o~P>@R5 z(vZ5zjc>W=Wm(#-+$9iCY-g^v#OMaxv3a1QQ=`P z(ZLF&e9ymCKThIRygpxkY4&}^jGyq5Tx{8zjmgTw|ETy?&<^|XOx5VvMjuYq`A`-4@6Obn6E zirS*}$Gqk%x)ED(x))%+D=P9_n$%ffs5|VG2+yj*m{cVv^q?&re=H@B+JvYFem*5H zZ`9FJk`ID0B3pp#;UxuCNci3$EmHXTfA?CYepr1E#Y4nFpyke14JN z`Eby5`nf_nuWjkFW@(yl+Bl%4t;#qZqr8&D3_fmmRJ;1>cjx7u<*MW#)Vy>(RY5S; zGYrI*D2%SQi75^EEHCuqgSb&VYCpSAvr$E-d|tSd2b!ujuCtN0$s|ATa`S^#r9E;U z**r22PRHuAgH1<$0{azbuTu}Du#4xHb-ae*(lAUW!KT4$?GQpU6;gT;9_Uhf^pZtjR+y&0CHLBudk=p-W=82u{DNZ=r9*4{*wIQKqxJr znLdrcHQ&wpI36n+?&Z&Pqrxi%H=DC@i3%DK!W!~$cMmJhGDOPZHVXx&p93%|0=17n zhT+Q2Uwpr>X{%B6E^N?N&0AQ0-!QFm5b~>!xohTkYcYf1OD}@^w|nTz#+k8p*TmRP z?DRHE;$4g1Lu`QjdL16<{H$pDij4>vVo34)dhf@v1e=H_N4!iM z#K;Xo-~JqRv)z;nTRgA-p2LC^Sl@V6PGmP0oS&7Q5+(7XqM@p!_ohZieYgfQPe*u0 zZdHY}iJ=K=kW~^ffI2cCCPK>G7L&>U_~*Ozb%l|J(f*V{xc-a@hPo_-Pn6o`1+p2 zc-g?tp5MAvvx3EAsmEA|3_TS@05e7OIxdG4InYB*4V>TCQSUh34VltA<&@@%#@;Jy zRN}*mb}o~nRQ-ICa@b%#=tQQ6?_v)1tq;IXXot_1o&-2`=DG_|X?z&Advo$9tb1QQt~T zh5pY!5~(dO;5E>}JOBWcmj?t1BPNG$A|^)|bb|qD0sr{WI?`hNDdFNpT3{!gF()DsGXJYUTF3~F8|AK+QWP(J9hCWP_>pB)ei z`OjL|zog*lgin$Gf)E4%@cq3Z2*3k*?)TKf&(?xKex2=ENnCpmi-7zlo*m>?ho@OJ}) zU_j_IdE^5Co+%dy3gLf-0u&5*h5{Jy)Ybpp)F3bq@3X*Q;6Ka$5B&cFKlq8=&ldAN zKQ$Q4`|L1a{^$JxhCDA582W$b#=rOn;s-pV7>J(-`mEFWd7ra{AH?^!VuJYjo{0~L zAN(8{ei;Ar=6X`XXZ3ud?6bNH-7~ z69DfUhy}j|uZ0C45A=-%7-9*w29ELx8Uv&Bv{ZO!2&ey?(XguEChFVw*>d#!Cz+Pes^ZV zt@_|cQ>&Kj^(@`zG`aoACH=_Nh#=xy$s*W$F-+X!m!!q_37P0CbsOFwfm#?DEuvq6dt$j;YRn2OQT!$PsR@6MdF~4FJ zsH^z8hR*^azt9O*qadS@Dh%X3!6<; zg~q8HjtjtxJKLm=b1Wr?6fg~J|gvI|F*80F=g2$5h z?D^)w;M`Ec$yjq4#!>p=rE4G>+&_*!%KpP9?R166mfseldE1gotH% zc=^^Ih`|05I0twNY=%;#*-C)={eBiBloLAIJ#ll16I`}8BSKbLOOIKP7l$xy4ze+Z zfoci?uq6!^^CoK2Bx>^3rN>7eZow&FHZ;t2sd<_6#!_#x86v_jzxZrEK+KB<$C!+| z7KjTc?@Tmi<`;rT@e4-;xHPX?!EiAqNA@|Kyy5;kOsY7YTV$CVTUukN4z4av2`k>jqrucYES1#U!&D~1 zC}L3lGBvgrI>aP64rSnUU|(X?H;;kIw`meiSn&jmB{u;|@NI}~EPSRc zN>bd7V{?5pYhRfU74KUtzotn!yr*Q11aFJksdFG~CZz*fM8&<>d3Jn~6o(JC4wqCx za=bamn&X@sv@a#iDkV}|SJ|o7n%f~-$ft4EoJL3C&VGvG# z5{I$ot_BeFMNm8Yvs zhXP5;-5?%QWhm*c0*ff++957|LtDV7tvt@2MY#_(VcB?ot(=UwSaP@56DL1Z<+?0_ zWpcR17I+FABV^3OIk#kD0noWCe+a}T9=g&RUB%o4{aJHXZ*ss7*%AKZ1OcV6Ir4(JlVSl&vQ6mHx6X#;(^2 zhdC?fx@Evl%@>0%(u+~NHFLNllfvC)$CWXzKMO2wdeW5s_z~`LvmZ_9o?8eN$VL?j z;bS`zcoOf0ClvOgV7EF~8YNi>Vv zZF-Wr9}W2v`es3hrS3L2qEgVP30goNV1BOz&qZFPQo2-DZsABh#3926_fe#d)iMnN zgKUh0zMH$GVdQNUZ}=rUA2*`+qv_|f-=E$5YkIKEB(RCP%``e524xG6(^y^g89%4X z+oMZKzUy^75>-9q&a-axM1Psw z*!JFf9?`PQ*HtSLEWx6YMBEY!&vg(kUx+;5-fvU7z9#)iAahFG_Q$)%Dn`dol^yV3 z9;)#kmH5!-PxPjTOIKDVXP8s!bZcw*Pfor)BBgpAW4VeerhF=h{5mszwzO*X02waH zg28u{s~z|{76al35Vw2{U5z^{fXZRsE( z?G$@ng8pZzkIuMP4O~!{It=MlP_(4b8f|PZbyt!pc`?E_-nJ|G`#Rr49(XjM?;&SHFXtsrk4}+}m{??)h9rBe%iU1xluwVR%^CjkI@tb4{Vcs2ac#lV z`WpWdqQ;I5Md~iw+ww-chI3B3Gsa4M+>gc%!el1kT1yow`49$WH<%4dX(U$#{D)A5 zHUUN~Ta=@5@mNKrZ+^q)F%Y(vpHD95F}lr-o7EW1Cy!|Rg5ce*HPT(aHoplWHnGdV zl?nd-Bp+tyALhkfgz2t4ja`H{cpb+Tg2C_w`_qY%GnIl_mq+li%V6@)OtSAWTalQn z)nvf?78_1l+p(j>20U0FX zb3*t01Lmfx_|M5uM-QgUZUzCKNhFBPE7aV1&2_W%DY!xV>4&RZpKMRl zE#w`zgS?(EQK^X9VPx~Lum|Dr3%d{Ss*pxQL1eM%IqbmvW?oy-pOccX3I3hx#7))C ztg*zl^P9hWKBnjWZg`L>EPVVT=^zpK7A?%w_ZQYGZBetf6;M97qgWD9dDw)1yvzBdsZvwga%R5**MGbQce665rmAMV9kP2{DG4t==yGO z-s*$U(A1>>pNHGQwBfCRV#+l}fT{0ME?9~1(|>NtW0 zF>jNbhTleJEz7|%Xd5h;?Ovq}GQUQglicT+zF{#;m)T%e_M-=Fp2(cTyQl(gGz_r_%(%j?g=$@k7>%57ug^X~rfAQy;VXXo!Tk3W|`zMWWC zpj}Q+D`qq6ghf6*{sAmx1x1}=KptKH1VNy>*HEeb?7;>>#^kq4UJKSRjC%*wm}G(0 zL8t40KgYT6I^RbfW$wvv)ItcLm;>eJV=8yA-M-49=Y@Pw5qBp@Pn(DaYJDZbYW@u~ zYNu%*JqXVcJQ)|K_DxqzEG8+v_cY=>wJmi*>(s#G3rd(Fm}~Z} z1t%X27RtGlJVkp8hdbMcy@3Fz{wj5sToik!qPs87tans_cM^9I-O8=Mxu39e9uwkR zd*`9m>y-LLkRS?Q7{9_Bj9QN!I}*qj@@A`3``SWF!0eXqFllLaV+&i5Q-5d@CwEhA zf->IkoDJ6Xuaw@jt>H8{gbAM&%WET~k zpYP$Z2BMD^PUppx+5hwMmv=ov&sjm3tVH1)=eka&3#9urNKt57D9Y(xvt?}_pWH#7 zYxm~`<&5gX4)OEJ^Gp;udZL*tI9lDv`xoP?G;Dh^@Fkj4JuoOu!i}L{aL!b(_W;l} z^Fid#V|(6{o=v_~+r|#RNy^PBR(}Z85C~%NrD~a~Jg0EO9ih?q8y;XSyp4AjBOjp? zK?y^`Ap%0n`QDN?6eyBdHd$9y2JFv%E4sc7ffPl@l}*sYop{p-)y+-BVZFn-%H}7d z+^QO_2?b0wze`xP(y|?KqQQH3ENYr`eJew`?(TVCVt{_|Ode=Y*fB#nFK_F zri&xkVuz)l-HTJ$(trrH3Wf^qN7sGn#9JpbJr3oh+_8wm*m*eHCNHXLd)ym)Nh|k) zDpb#_lOV3v%Z#cbNahI9U6s(~?hZ*84{n8Z2smBn!Q<{A>co2Fw)=2DXx;KSeGWVq zRY6|$ZR|?%u6p-GCo63|<0@(wV?E>P_s`4ScQ7Lh`J&Z>ZV)62Xuv!=)w}FHD|fIk zF>1%%bi!n3KNSq>)oK+1RN+hzIJ(vbs>$N`I}Kv^*ZpDhmP>vF!uD3{0{o$s!yUADDVW~vhxGaUrYphGmvff&8QhJ= zrWSUs3Xc*T_JRZod*@?jFpULJ!EDflLn*Hx$zAe>stinZ7N?*~aM&{};Art;nSzDk8bX12^OocvAsRt7>`*D5Ofy+)8JO%#o(Hqy{D zSze)Xg68cbE?!dSW=4LXYYE`Tw% zw{{hkV<8ZV%Xiwo$4U58nu;<^ZRsF34r|NSx~1{ zduq3~^pywIiMYv%%Oy(r@?s~-NHaV*J}c3Q!N&!&mDny`gf}L)4!Lh9qS{UC03O0{ z)q5ccoxk6a$2zcWquF)d&MP;YaNw5O&3=RB_WpgI5#DEE3GKh5MXS6K5g7Cl32Drt zG+6z!nHUa5no)uL+3`lY>9ray&d#TwV#QkH=UmXe@`UfgjS^3? zT=+^Tvs$JZS93#UaFI`JWfs1)*KCAGUn-*^Ze|Ead{vSFAMt4tAJ@w>wmH5b2dAZp z9RXMAQuHxA-6=6=&Z9w8w!`deiAgP0tG213CY6%xB!q#qw`i!!1(FESEz@7SBq;DA z;Aw2I_gYxwbkpkz?v-hnOe(BxtsNoQv_Cu$OMxT5$1r+ND4~bc{*64uq36KD0~~VYg6G8@vbtg|>f}1wO5E_D zc(kn#nuf|SEsrcRI^<>o{+mA}c;qlQ@n~5MkHP|&73{-eqvLxULd;M@C))&>Lfwk2 zdrvf$hAOBOFfl<}#7QN^sE0{~oGJ(7O(cVhoMz~1bpGO))r@plK zndv1Dr8#PRQmrGRwo*u|IsiKc$olCR0=?F&|k7z81Xo}y=uzI?7 z*zRYuM8HVOE9go0IG!FVUd%=}zJ)!@?87|aXq@;d17#>V!<3-CTi|SO( z+GK#E1$0MMvY4zftVT)7S4_+!t%z+B9pOu9PQ2k9TAF(Y3u#43>~Unx{CzZ1wnKYH z<~S5mOu8kqx#kPwAey|4KbPe?VHS};r)TBA|56{ct#I|sl6+YTA!WIFPDd2j%+RjG zKPPE4#A{(QGKr;nB%r7Em-UhnH-y2*=~F2>Z$P4ev`j}M490iC^1Io!@9ew%BaNpW zWeb8&M8FZO&A~18!#jPjSHZ@@QwbNn_3jp9R*f%qQ?Xu`^No^4evv}+d4gu1ZL6wnZXVyPnP|9j= zE*rF4F{6(GGhIxqRM?+k4I@cI+%HoKLh}v;D^;kis3O?P6+Fi;=qRVsRoAhjEAr@T zy6LDu=@ttQ--5GQ94KyA&^?^oi(ttmOcbldP_@79W5M^4L;f%fb-En0hVl0qO*=&z zioM~bHa$^HoVblt*e&5gqm(RL4A1wsBoRWJGITz_5Mwq^Qg0!B`;>1dB^m`gCvuLQ zI#z2{A%nGFFpTP-ix4Wa<6!-UW97;>dpc=HEf>zX6m@HUK4lCipJ{lN%P*bu{t6z` zq_I8?(&M-D3_)Y#9rcvKX4<%dwO;oRreLFQY&dq_bk#SsPS4B6F6Bbq`BJKM!C+rW zW`W=vcgMPDqxZunwIFL+kVo*Y6_^e!|T z(0$ssHkH=OaP|kX;MI%Qg*RkymBxo{$Tc=$REIV+m&@uz^sDr6$t|mUX>x`u*OU(0 zN|LMy5@w0?UGl957VSwcljLs+xC{?U%n>mpTDa5GOz25r=i*id40f?ZvbhK}*;wld z+9tw8niLW>-?SevNUJ}vNg5vLhEVWXv_TgWp`@Dbn^>ZvcX0B|dqm??4L?`q{~%Bn zwC62R)}^peri!Cbp^&Se)0LCa{m?{HfB}kLLn@x;^id8hIq-66)$&5?-tmI-9xz)b zEl7SaC)#lKBIKAri;I48H@)JG@r|i@itx9d@gxRmd?e_Z{pqY?ugNxuP9V2KXNm=l zLPuTj`<*~EK!39g*=w#+m4mjW4ClWk z+gEyq>)#u?{JXZvq3J1;Rl|*Hff!MP7ka5{IH|nkT`v3S-P}95B=Gn^_KAUD3 zwd8cPG}aq#C4zyFBQ@UAVR2n9FMEg$+EF>YzaJ(TN8jG|+kla4wlf>`HMS^4fZ3Qk zN+%!vv83SIAbxPRLn9*v$<^~RB9caJ83ax}?Kc&$Gae}0!)yaZ2m4_ZupN^!BDU4tjH1t$YYqv1pN#SMgwFm+j; z(#|CZp#$9ed-1EBazTBw)CbWUuO3uBTlyi!UnWWl)`bsa@6fe-X-p8#n5{cpO(g@4?U7Mrh}luq1x@rop2>V z<=&%T4Ewi)I?Vn^YQzouM@a}4Ts%DP6p5mmNLQDgl$*;mVZ#KycMECZpOcjcXY|R( zi@=dvp(1jx^3!HDwU=iEF7#F7A#4Jn@zxm-!P$XgOO1id$Bbvebq`3c)q+!TP8Ymx zE08hcFptFMTx5QvNBtc4ATL)wgxA!-vB~7n7xFxs^$Bs$a{U^*o);84NrZ$R?|+YCWUZc^Lb5Q(?R?MNy{p+uNQhZ*g73yAzT*qEl9D}+ zMgb#p-+q&`NH3zB&~{g^wUzPmbBem?&5v%i~M zh~&wk|J~(>b_Z0ZE%*BEt5fUDZ*w(mDxN7^zjPt);GyjyTm?8IA!n$ZHifJEJIGXJ zTju?4)T8`M%P~L$_n^+8I5-g7ELl{hE*sqyoAXJ|tlkDoH_^6i&WbjY}!)u0* z$cRfUx5FsWlo=0b47cWc3I$CNepeYV?UOo<8sRA`bwIJ*_8{Zs#SD#3n4fclB$Y?7 z1N~f9Zoh`*WHx?iR?^c^mfG|{hQtA(QuoyCaicsm&<0ELi1-uMNYP66Hq^fPmw;}p zaKxC=S&@{cONh2edg{3l;{o8$V|DRzWs6#e&>Pr z8Dt&X*t_-2x*=f%Y-2keu7n=f(X;+ToXjCl^8n(Qo1FEx(EVkx0Z zXSQ)vT1+a|imHTP*UM>w^+6lbb%2`ZaoRIpABQt(OoTE|U=ZHaX4uB- z4&CrgAQ~R3#5QklfuN>zsKo;_Y4$Ch*3!fJ@hcsQ3}ySZ5lacwL*=KB43h(bxSpA6 zy_t;5$48bzrIbHkkJI7$%8v~rY85)W8H~wUxAf(VGvtXl`H8DV9*pq}nwzfjzdMO) z@ED#5)3UECU^tEdgQB3zpjq0m#t(Xa{g|4>DVA_488Tqwguuja+Yx8Y5XZJ#u2smD z*m$aB)gyB%RZiZOYIG2WZzRlzU=z%bQ-6^MjKLi`sx24jaYVLKKocr*Exz5-YgOm1 z_cnSHM=L;*WSTZBj|IhM(0#l`1mhnuQ>p|%J)mel1r>^>9by}StMp|@J6BiiGZvIL zkyWxHMUGp#IYhKLQ4(8EIy7NV+=P2P(o{#Y8H^UeL;9REJcv;Y19b+Ut65<3qi=NN z##)}s)U5by6pURP&@CYMOZ%I3M3fSuii(;1*{_9Uxk}d3C)@n1O3Asr;ARE`>0>&IG>XTgxVRfCx)76Q%L(cTF6)1P1m|`1;gkeK~Xv5tjFBiYu-3 zIZ=XDp8;+DKM2I7j}$X#2-x!n?HzEUj|~I!gFecBEYD>0hSKP3I)003twi{dw1EoS zu+EGI7z_yjxxv8H=#wqEP=lE0R6DF1vDLwc*I3*6DjgBwr(t?!-RT(Pva&O7+H4;c zR6eHBC;Qi}4XQsibJB=W4k+k{Qd*fh*2QuaUa)=E&yeMBnCwvu!W`R-xm<1Mu0DnE z?j6Y2{uGOwiqYX&UdbVI4CaXCHpkPi#obU`e}<%ZY09=AD$Zv?GQ%F6yv$WAi5f>G zY=bEMl@!mybKBS9rQi*xLHI37{+vA^fQx2Idbq*D=7vqa;zvIeL zi}@0nPVkn!V00`!Tm8J=WFzm7UH@VYxe|m&`hFPltY8~fCA35!`=hT47Li?_B@D^b z%u^NSm)0-yl22}hXTsFzbvyLAu)QhlLvfjHa{EqHDgAC5h5eg0eTblk!;jm86R9#E z>Y}pFc1C?Xdy2uP{^#y@evitnM zm(JH5p-dfZ)CA)Yuw#;ykM<*u^4>s_lMX(7Tl5=puFGZ^T2vr%G~<#O+PN4u-U`RX z(JXkpmDA5<$RJc=ZYg%EUR#=f@B4Je+fG4mmk~;{1)=yWPq1!VQs^$mOMscgks-JGA1B z`u!vlsdA5(wzas5n=|Fw)Y;YvB3*Z-U8>&~OXvV!6dty2J zX-BZxgRp=-6v0KP{XU&Z7asVW2B+SQEk zCoa~Cmb+u7FcjgSsqC=;s7J~j3{uBt(&Ni@i5ErX-TngC!DebkF|YJHhk1g+K4%+T zZ!EK8tfwd22Ov_{L$R?_h2<66@+kS~IkY2VX?|GY<`}ImI!jVegXsc!e-hU0_d^FY z<7&o4!v``MqNM>&!aR)+HnkbT=KV~Sh)Y3>)A+XL^D^@pkuE_*W^YQ^o%n~PDy3nS z0|Sc2dpWVqRA=w7z3PA^!+~+T$Cca>qo!1jq8g@Tle}ul8qOGur?aHv6N&>&5VBA1 zccNh-Id!xJTd>Qr41pvBp?vqlAKEvv^8#SKA85Ay7V1y|j`hv^Eog@2IN0+59|a3G z!Dv@x;<36h!VtLy?$l-0pEPUHkiHY0XoUl+Pj8}DHE2)>gh8r|(dEmZhrcMMcyaZ~ zETpS}?#^96(MbzR5D5J3oVGq z884qxRY|bN>Cme@%$Vb|p`L1B1CEuc_(XwkL#-rQ=h3&}>^4jkDvFiri6Pct|2?A? z^J2O$r0P?JffZB`Y?BTk^T)E8#qkK!ur7)Cjp~nJ``}t~|i*ELxoPQZKQZYl{c8%I(?f9ZX;&h^E~8*XfQaqUw=l0(K*~s8oKFl3NQa zirOdj*fsdc<+D@+?bx<)7!givldmGaId)XNfxIL1LuF=xaPgOCOm}q(Fov%@&1Tp0 z9XjWd>0+=s02S4KHlrJm6~OD;XT#UkqvMYbUl&lCr7s*H@0xhamcB`1RspZ)+t% zH9X7n2icrMAlSagUtxdb@k=sWRXLpP!H^9Pb4*7IoG+Jk4_M}LtM@k^uE#+E!-?<78ti(UA2c8Bww)V_i8c?SK~ec0)9L74;p8F32Rw6< zL}Z1oDKBZG%3(Yfu}kfJ8dh*$<(A1n4ciiJ0;CXOh6R zLAPrGBI_(*VL^9id@2%$TTX1zMv@TaJb@*jvXPw5n3K)@ri~#C^lDfS-F3DDK0RX9 zicc~%uGiK>sSQ8oQ5iLZ-eXdHh)c65$x#&rC3e2U>MW*$!W=!CNkeRiE3)%du8#qG z>9^FJK?0#SLy>Fb`PviHGkdG6@Fm;rhO6MZ%mk(rv$>7gR->a=KD79VaDHULN|UFTTP#2J!p!=N0P}+>RX0^HHZLDC12L zC2%$U8R496g-%@Ma&h|SFFZVJvKfh*9W}?sO$6~bqhgP^wu}S*Bh0CGe!72d0@~rW zj35nz>b#uUrI{DL*iaJ;T;H>9ue+0O=cFRi4S%^94$;@Z!d|4+z#+`JFV32f(Fv=K zcg9-872{vZeG&WKagt!2?l*vZ^l}AYJr>PWf#NY&nKRD8at}*p@KFVEdxr)!!e|kJP(tEdDDN=Y7b!mQT zS6rqtTp^L|)$Dulvb=n%Z(JF_Of(`B>*lBO?GGz@BJaE+l0Y`KHF0!uFg3D4Hf`K| z11hP>U}injAc8?XqjJ%a{^R!l zd3#P5YJ0f9oOK~zy(K4Cw7Yz{FQ*x-{hrG5;CtLPnVW!IVwBDD%hZ+wPkpAqe;5aUDND@pdg_v`?DA$+N9(X5Ok- z`Ha9|J?M^ewrc#UEWnUmka1V$`U4z(WyhuJn;D-}d`p}haRcqqfL3op!j`8RDk2o^Jm_L|1<2AnDH79g;FslId^_jxK;#V(K86hA%6)Vw$GMA-uc1n+ibeDbj5mc>Yn2~ENj=!1AO@kP5~vN#ipTRg zot-Xz%E8bOAWTz3jChYNDk|y(GuaPU6pGSGpQ3yjx;yB?3#RrPu)SWZxg$L`E-_Nm+a_DlUDiPih!< zfm}NEI62`tB}0G6*K(4_3z1MXpcKr}n62WPG9*>C{fT1EYSYl%HO@J!YnJPPuK>=QWbR8BEu#?26 zhV9!$GG=6nBFl_APv8xBli(TBGJt5$M($Ef1A$v{J23O*Ccq^MD)*Sxefgd$uy!+6 zIj4!W!Jfs}-OS6x9AE9|@O|g3*2=(MCLPty^{ujaXs#Xu@f)@MO?Qq73(ySOg@uS< zo^xsHl~zWrqWWp@ZkNeXAaWobUY^H@8E0B3yF`e?*r3`m6|`3R#Lpd6guXp~vm6Pv z?~nrMp6)ZHIe<2^xkEyp4PFQUhebSEi3IaukszV)Av5@}6BE;jQBPwM?tAAjD<^XO z&&e{C+O=P%Ecnf$HQr;yt*!Co9}M5O7EtN3Z%|?Phf*lK+xNmL&8)|x{NZc{&EF=j z9=-}fFbt4t0N|R2(`VfTvxpbQ>!H&P2}7!DMNNuJS$o|{tZ4nl5EA*A_@yzb#S4ez zIL6Gd2=`|tlQQ-6X;Kn!g!iT6LVSKiDirD)qLYQ`Fg*LnTZTA&^_>jB)s|>^|6z?m z9y%;zM8!7!!zSze{x{g#l>GHr>FCF6y4n6YiWOTb*P04I>sb1 z8n-eSq927NQVi8mMt%h6@9)L%k;8vgk~VSf52p8*)tKSdQfBNN0!fzpgc>GCEQta@ zH%+Jkvf3$n9-q@JgfrnA!*%(6rkf%Bsmr3B_jv$^F6^w_Ef`oHvnX;NTs^{s@*LJu z!Qd&2!=?1t)@EIi@HZb?a|3l$#R1?hbpHV*0q)(ym~zv!8c7=sLt0F}1&))D_wOaG z(5n&nnX9p5m8pQ)D<|b0p$v1@{PlQDAm*{Qx}929_dU;CQ>1{y_iTWt>Rt$wLB)OG z77S|$yN0&;Cjz55dT+OnJ6~*aI+k5dzK}XGjU2jfseQiAxbn0k;p?{20f` zBI4{b=}WtRN+qp1`NBOSH>zt1KYa*h>?PX z1x+*el}m>g`nvxg&%|g}u~TmTf*YB`*u*OGkkLs5GJ!S4bCQkl zRvsVvLO##h&u!7>cJDwI2H=8}Y?Nj5R>;eU2*(9?5W^LIsLmn$+8^DI%21j$(7i3D z#T0iMcSk2$aq`KD9?jg6+5;;^^dg-~TH7;dlWB@0kt8ZeEN+BGf?&YcJS|Qu1)5QI zg_horo^me9;z3yis=EI%9V#Up!Y5yr4*u*g+~-0Aw=spw zm4JwD5{aJ~WRO18rxY~k9+w-mn70T^>mz(~ zKcbTDZ_LoTV;rSSzjBBFw#;gO1dm~ZH~bSdEgYW|SvjG!c)+Mb4TW=@spK$9>EqX$ zm|Vo;sc@PpV{09PuR{Gj8z>yB9ZSCAPKt2`B!xp;5hVx^3gr)q{3YgevkLFfY{V)% z(g-CiKCbU3U$p2;1p^gl-~XAooM=h@+V`G1UmlaDh9OVjThYmW{y3%vO!eNnpcii- z$se{B({)@1Xdd}FVEivSSy8AHwG5+GY6hjl&E%XFVQ7|h2eIbPw~cRO7ql6%(54-S zVTNixyH#0NK^P8$Ouu4aTPGeTV0!$r`;tnsI4wG%FO9QVe$5C??Tn`{O<}8p;4E`e zt&M?13c@8E+zz3&o_MpY(?w@3fzu%w%40-D1vUO>OhXZ=myErwZdFwr1|67E5xWI@ zILu8P-!0I4JraiB=(Up(O%VF^m&6gyA=jc&1fC^ykAMlp_6N z@`LwfIuLSR(v^<9;dpARGHVG1eZs}3tw5wblRmmRWn&g#rQ4r)v}yHKo4#D0H!JlJm8Y_tT)N?QxkEf`gpo^m<7#kyhFA z#38zuomJ2Am@Jx?Yiu98)<1H+y~Y;a1CN;M`!Ogex)TNg)77$j9$7v?d~ziUb9kA0 zdA~asY!TpF4pbkBz4uU}Y?#`}^yn7dLW4TZ6|tDp6ZK_Ns~gZ0_Gx=EPn8V8(OQpL zwV=ppx}uD-6e$6fJ6Q8^2nw(@n4%tTAwei2wc5wh`H>dw*{RD}#rTEC!(r=L#Y8Dr zM*=NBn`B0blOO#?w2H=5t{#rlx%u9gox-j|rMcG>=DQ? z>J}Xn>V<-)BHZT<+KxIQQPHN0iUR9*i39T+0!nqNBKf1X%%u`KN2iclbWyBD`zQKk zo7zDse1SLJ*;gPKE|xbrjolA@tgShVDr;PPq?lGQxy09HM0! zCWO7eU4|eorY20DH_DXqEjy_vH{Geg@+~SQN4ppC+s|q5k<-v>Ntmas&A|tYa6gUO4 z#JqoEAM9-r;r#jTH^r+;Z(_NOuBJrG$pzn5V+Wf$o3oU{l8m*Q%Fy&5qG3ZcvU|p$ zLN5us9%l>|3iwxaP>LsPPDgZP>79jt=lkVaxyZ-FkmB>#JaL`D*;UE+b3W7}aARRL zo@5)@nsw2n5Lc{^kEBOf7>g7A{>gaAwCFHgOpbL|JChA%5;QQcqi!0|qJt6YK?}7o zFmJ&`7cW}Eg4FAS^}CfuMBEi(2sdIK;yrP0OxlNG#Hx!O`?DeP=iBPTp_aZzS5%%k zlG^i`zynj96L;QGjqu)1Xc=<5V)(*T4{ZdAQ>=QDf<{$4q_xNs>U}GHwUG+$w#MZF zDs<=`=no%h!x(3;s>@Jdqb_i@7nnA>>G{om91EguaA4@JeR;l3{a!>3;Y2tBrr-)f zza9HzeldQN)xLgN*OB=K&Zn;7Mk18+Py}mCVMrnebxvje?UsiY3!C{ufKq;DUDZ#8 zw~Ydgs3QzwFy3ULr4UahIjv(&yQkZT$=}L93hU>}2zKWyI}z`0=C9y?lHr#UPj<~H z&SuYJ*m9IV@YK;=BTQN^Bo(axlU8$%v@`hqm8a37)d#vAgUx}m^|K5mr0->SkRKsa%Q^Fl_^h1`Os^x}A&u_O{iEIkG5zTvL*Uy3TIVo5-?# zlSCM3C{w{>ybV5>&vA~xe_gX7Hw9F;&24Q$Zu%L>xMS_<2aY($M+K)(z4nm%?vTo( z8A|g*U)F>&72f$Mhx)-c`ah^O%aN|~R0c5*KYcaVt4){?f_U6(QU%beJXAkk zfh3oG*X8NuhN5yboK4I#7|5+@J@1b{dIJVEG0(2eLsFe6T;JQRR`{7~3ZApheN2m*0)aKEB~ zIk;ZaK;XY<8~`xSD?Tm&CooAU3MTC3QOIx<41H2;Gz@klTr^DS8^~XV06-p&zm31p zKwRwqZRmvtz$EAtn70rR_g@hMu!GpSfPbF} z#KH47XzU6bxL?b%{|oB>K$@M06YwvGA^%&cFT!BJtGwgk zVt;i&9`64U{!dw+S9}}*0Qhfx9RDb_|IDp_;Lq`ra<3UVIRA!_1Hk!ri+GU*{~vs> z56$sX0SZn{^1CagX=YoljpTQF82R%_}?vq z1IW$!`Y=4ND+2V=Q~x#$0=)_y2Z;SOS|ASKf1~h%KL?1D{gvSthhKRNda0*ZhIu&t zJ`Cqe++U%t!zdx5JQ^7RB+ZF}$P^$E(9| zfnOuT#l`a~bX+{3|BmsCBiw-3&T#`@ddffh-@ogaHV^JTofIv_Xqzgs%wUu(jPFwfu6062JF$bTE*0Rmnr#Uh%QNKHy8P{(Wc& z2M-6&Uoio2vU9ykBu;klU!?2jG_}|B4UvdPckiiR<5JLH@a=y) zp#^@KL$4eG@x11Pu)l@|%=I!q|2E78e$@%VT%4~O4HpOm`nzPgK)_eI^+Nk+xBUnH z{|o;M@ztWl1!4#Mt&saApnu2xWxTvx1aNcyU0^`a%bxikCSE*zS;GO`e+TnrdFT08>eKui10aY4^j{0oKZIYV zHkdOBHV;O~&uLQxX={{j3-o4f!3