From deeeb411456374ce9d1841beda7e945b799ea7b6 Mon Sep 17 00:00:00 2001 From: MangMang <362165265@qq.com> Date: Tue, 13 May 2025 22:49:04 +0800 Subject: [PATCH] =?UTF-8?q?=E7=A7=BB=E9=99=A4=20SpringBoot=20JAR=20?= =?UTF-8?q?=E4=BC=98=E5=8C=96=E6=8C=87=E5=8D=97=E5=B9=B6=E6=B7=BB=E5=8A=A0?= =?UTF-8?q?=20Gitee=20SSH=20=E8=AE=BE=E7=BD=AE=E6=96=87=E6=A1=A3?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 原来的 SpringBoot JAR 优化指南 (SpringBoot打包体积优化) 已被删除,以简化仓库内容。同时,新增了一份全面的指南,帮助开发者设置 Gitee 的 SSH 密钥,以便安全访问仓库。新文档涵盖了使用现代 ed25519 加密标准进行密钥生成、配置和管理。 --- .../java/工具箱/Spring Boot JAR 瘦身与加密.md | 1225 +++++++++++++++++ .../java/工具箱/SpringBoot打包体积优化.md | 616 --------- src/programming/java/工具箱/WSL2.md | 558 ++++++++ ...s_create-8409f453e6780ca1a8db3ce33c74240b.png | Bin 0 -> 253945 bytes ...eys_list-bff1a324894abbdc3ab8f61c49bb63d5.png | Bin 0 -> 230477 bytes ...eys_show-a14cdfb89475debed237bfded2bd9848.png | Bin 0 -> 171180 bytes src/programming/java/工具箱/gitee-ssh.md | 190 +++ 7 files changed, 1973 insertions(+), 616 deletions(-) create mode 100644 src/programming/java/工具箱/Spring Boot JAR 瘦身与加密.md delete mode 100644 src/programming/java/工具箱/SpringBoot打包体积优化.md create mode 100644 src/programming/java/工具箱/WSL2.md create mode 100644 src/programming/java/工具箱/assert/sshkeys_create-8409f453e6780ca1a8db3ce33c74240b.png create mode 100644 src/programming/java/工具箱/assert/sshkeys_list-bff1a324894abbdc3ab8f61c49bb63d5.png create mode 100644 src/programming/java/工具箱/assert/sshkeys_show-a14cdfb89475debed237bfded2bd9848.png create mode 100644 src/programming/java/工具箱/gitee-ssh.md diff --git a/src/programming/java/工具箱/Spring Boot JAR 瘦身与加密.md b/src/programming/java/工具箱/Spring Boot JAR 瘦身与加密.md new file mode 100644 index 0000000..e16e128 --- /dev/null +++ b/src/programming/java/工具箱/Spring Boot JAR 瘦身与加密.md @@ -0,0 +1,1225 @@ +--- +icon: bi:arrows-expand +date: 2025-05-13 +category: + - 实用工具 + - JAVA + - SpringBoot + - JAR +tag: + - JAR包瘦身 +title: Spring Boot JAR 瘦身与加密 +--- + +Spring Boot JAR 瘦身与加密:构建安全高效的部署方案 + +# Spring Boot JAR 瘦身与加密:构建安全高效的部署方案 + +在 Spring Boot 应用程序部署过程中,我们常常面临两个主要挑战: + +1. **JAR 包体积过大**:Spring Boot 应用打包时会将所有依赖一起打包,导致最终 JAR 文件臃肿 +2. **代码安全性问题**:部署到客户环境或公开场合的 JAR 包可能被反编译,造成核心业务逻辑泄露 + +为了解决这些问题,本文将介绍一套完整的解决方案,包括 JAR 包瘦身和 JAR 包加密两部分,以及配套的自定义类加载器,实现高效安全的 Spring Boot 应用部署。 + +## 整体方案设计 + +该方案由两个主要项目组成: + +1. **spring-boot-jar-slim-encrypt**:用于将 Spring Boot 应用 JAR 包瘦身和加密 +2. **spring-boot-custom-classloader**:用于加载第三方JAR + +### 工作流程 + +``` +┌────────────────────┐ +│ 原始Spring Boot │ +│ JAR包 │ +└──────────┬─────────┘ + │ + ▼ +┌────────────────────┐ ┌────────────────────┐ +│ spring-boot-jar- │ │ │ +│ slim-encrypt工具 ├───►│ 提取依赖到libs目录 │ +└──────────┬─────────┘ └────────────────────┘ + │ + ▼ +┌────────────────────┐ +│ 瘦身后的JAR包 │ +└──────────┬─────────┘ + │ + ▼ +┌────────────────────┐ +│ XJar加密处理 │ +└──────────┬─────────┘ + │ + ▼ +┌────────────────────┐ +│ 加密后的JAR包 │ +│ (.xjar) │ +└──────────┬─────────┘ + │ + │ 部署 + ▼ +┌─────────────────────────────────────────┐ +│ 运行时环境 │ +│ ┌─────────────────┐ ┌───────────────┐ │ +│ │ 加密JAR (.xjar) │ │ 提取的依赖库 │ │ +│ └────────┬────────┘ └───────┬───────┘ │ +│ │ │ │ +│ │ │ │ +│ ▼ ▼ │ +│ ┌─────────────────────────────────┐ │ +│ │ PlainTextClassLoader │ │ +│ │ (自定义类加载器) │ │ +│ └─────────────┬─────────────┬─────┘ │ +│ │ │ │ +│ ▼ ▼ │ +│ ┌─────────────────┐ ┌───────────────┐ │ +│ │ 解密JAR内容 │ │ 加载外部依赖 │ │ +│ └─────────────────┘ └───────────────┘ │ +│ │ +└─────────────────────────────────────────┘ +``` + +1. 使用 spring-boot-jar-slim-encrypt 工具提取原始 JAR 包中的依赖 +2. 将依赖库单独存储在 libs 目录 +3. 对精简后的 JAR 包进行加密 +4. 使用自定义类加载器加载外部依赖 +5. 使用xJar进行解密 + +## 项目一:spring-boot-custom-classloader + +这是一个自定义类加载器项目,它实现了类加载器: + +### 1. JarClassLoader 接口 + +```java +package com.mangmang; + +import java.io.File; + +public interface JarClassLoader { + String JAR_EXTENSION = ".jar"; + + /** + * 从指定目录加载所有JAR文件 + * + * @param jarDir 包含要加载的JAR文件的目录路径 + * @throws IllegalArgumentException 如果jarDir为null或不存在 + */ + default void loadJar(String jarDir) { + if (jarDir == null || jarDir.trim().isEmpty()) { + throw new IllegalArgumentException("JAR目录路径不能为空"); + } + + File directory = new File(jarDir); + if (!directory.exists() || !directory.isDirectory()) { + throw new IllegalArgumentException("指定路径不是有效目录: " + jarDir); + } + + File[] jarFiles = directory.listFiles(this::isJarFile); + if (jarFiles == null) { + return; + } + + for (File jarFile : jarFiles) { + System.out.println("加载 》" + jarFile.getName()); + scanJarFile(jarFile); + } + } + + /** + * 递归扫描文件或目录以查找JAR文件 + * + * @param file 要扫描的文件或目录 + * @throws IllegalArgumentException 如果file为null + */ + default void scanJarFile(File file) { + if (file == null) { + throw new IllegalArgumentException("文件不能为null"); + } + + if (!file.exists()) { + return; + } + + if (isJarFile(file)) { + addJARFile(file); + } else if (file.isDirectory()) { + File[] files = file.listFiles(); + if (files != null) { + for (File f : files) { + scanJarFile(f); + } + } + } + } + + /** + * 检查文件是否为JAR文件 + */ + default boolean isJarFile(File file) { + return file.isFile() && file.getName().endsWith(JAR_EXTENSION); + } + + /** + * 将JAR文件添加到类加载器 + * + * @param jar 要添加的JAR文件 + * @throws IllegalArgumentException 如果jar为null或不是有效的JAR文件 + */ + void addJARFile(File jar); +} +``` + +这是一个接口,定义了 JAR 文件加载的核心方法: + +- `loadJar(String jarDir)`: 从指定目录加载所有 JAR 文件 +- `scanJarFile(File file)`: 递归扫描文件或目录查找 JAR 文件 +- `isJarFile(File file)`: 检查文件是否为 JAR 文件 +- `addJARFile(File jar)`: 将 JAR 文件添加到类加载器 + +### 2. PlainTextClassLoader 实现 + +```java +package com.mangmang; + +import org.springframework.boot.context.event.ApplicationStartingEvent; +import org.springframework.context.ApplicationListener; +import org.springframework.lang.NonNull; + +import java.io.File; +import java.lang.management.ManagementFactory; +import java.lang.reflect.Method; +import java.net.URL; +import java.net.URLClassLoader; +import java.util.ArrayList; +import java.util.List; +import java.util.Objects; + +/** + * 明文类加载器 + *
+ * 该类实现了自定义类加载器接口和Spring应用启动事件监听器接口。 + * 主要功能是在应用启动时,从JVM启动参数中查找指定路径的JAR文件并加载。 + * 通过反射机制将JAR文件动态添加到当前线程的类加载器中,实现运行时加载额外的类库。 + *
+ *+ * 使用方法: + * 1. 在JVM启动参数中添加 -Dexternal.jars.path=你的JAR文件目录路径 + * 2. 系统将自动加载该目录下所有的JAR文件 + *
+ *+ * 示例: + * java -Dexternal.jars.path.path=/path/to/jars -jar your-application.jar + *
+ */ +public class PlainTextClassLoader implements JarClassLoader, ApplicationListener+ * 在初始化时执行以下操作: + * 1. 设置当前线程的类加载器 + * 2. 输出启动日志信息 + * 3. 从JVM启动参数中检索包含"external.jars.path.path"的参数 + * 4. 提取路径值并调用loadJar方法加载指定目录下的JAR文件 + *
+ */ + public PlainTextClassLoader() { + // 设置当前线程的类加载器 + Thread.currentThread().setContextClassLoader(classLoader); + + // 打印启动信息 + System.out.println("启动自定义明文类加载器"); + + // 查找并加载外部JAR文件 + loadExternalJarsFromSystemProperties(); + } + + /** + * 从系统属性中查找并加载外部JAR文件 + */ + private void loadExternalJarsFromSystemProperties() { + List+ * 当Spring应用启动时会触发此方法。 + * 目前该方法为空实现,可以在此添加应用启动时需要执行的代码。 + *
+ * + * @param event Spring应用启动事件对象 + */ + + @Override + public void onApplicationEvent(@NonNull ApplicationStartingEvent event) { + // 应用程序启动事件的处理方法,目前为空 + } + + /** + * 将JAR文件添加到类加载器 + *+ * 通过反射机制调用URLClassLoader的addURL方法,将指定的JAR文件URL添加到当前类加载器。 + * 添加成功后,JAR文件中的类可以被当前JVM加载和使用。 + * 同时将已加载的JAR文件记录到jarFiles列表中。 + *
+ * + * @param jar 要添加到类加载器的JAR文件对象 + * @throws RuntimeException 如果添加过程中发生任何异常,将抛出RuntimeException + */ + @Override + public void addJARFile(File jar) { + if (jar == null) { + throw new IllegalArgumentException("JAR文件不能为null"); + } + + try { + addUrlToClassLoader(jar); + jarFiles.add(jar); + System.out.println(jarFiles); + } catch (Exception e) { + throw new RuntimeException("添加JAR文件到类加载器失败: " + jar.getName(), e); + } + } + + /** + * 通过反射将JAR文件URL添加到类加载器 + * + * @param jar 要添加的JAR文件 + * @throws Exception 如果反射操作失败 + */ + private void addUrlToClassLoader(File jar) throws Exception { + Method addUrlMethod = URLClassLoader.class.getDeclaredMethod("addURL", URL.class); + if (!addUrlMethod.isAccessible()) { + addUrlMethod.setAccessible(true); + } + URL jarUrl = jar.toURI().toURL(); + addUrlMethod.invoke(classLoader, jarUrl); + } +``` + +这是一个明文类加载器,实现了 `JarClassLoader` 接口和 Spring 的 `ApplicationListener+ * 此类提供了一个基于XJar加密技术的框架,用于压缩和加密JAR文件。 + * 它支持根据XML配置文件中的规则包含或排除特定的依赖项,并将结果保存为加密的JAR文件。 + * 程序从原始JAR文件开始,根据需要压缩它们,然后应用加密。 + *
+ */ +public class SpringBootJarSlimEncryptApplication { + + /** + * 类的Logger实例,用于记录程序执行过程中的各种级别的日志信息。 + */ + private static final Logger LOGGER = Logger.getLogger(SpringBootJarSlimEncryptApplication.class.getName()); + + /** + * 包含程序所有配置常量的内部静态类。 + * 这些常量定义了输入/输出目录、加密设置和其他程序所需的各种配置参数。 + */ + private static class Config { + /** + * 存储依赖项XML文件的目录路径。 + * 默认为"./xml/",可通过系统属性"xml.dir"覆盖。 + */ + static final String DEPENDENCY_XML_DIR = System.getProperty("xml.dir", "./config/xml/"); + + /** + * 存储原始JAR文件的目录路径。 + * 默认为"./rawJars/",可通过系统属性"raw.dir"覆盖。 + */ + static final String RAW_JAR_DIR = System.getProperty("raw.dir", "./config/rawJars/"); + + /** + * 存储压缩后JAR文件的目录路径。 + * 默认为"./compressJars/",可通过系统属性"compress.dir"覆盖。 + */ + static final String COMPRESS_JAR_DIR = System.getProperty("compress.dir", "./config/compressJars/"); + + /** + * 存储提取的库文件的目录路径。 + * 默认为"./libs/",可通过系统属性"libs.dir"覆盖。 + */ + static final String LIB_DIR = System.getProperty("libs.dir", "./config/libs/"); + + /** + * 存储加密后的XJar文件的目录路径。 + * 默认为"./xJars/",可通过系统属性"xjar.dir"覆盖。 + */ + static final String X_JAR_DIR = System.getProperty("xjar.dir", "./config/xJars/"); + + /** + * 控制是否启用压缩功能的标志。 + * 默认为true,可通过系统属性"compress.enable"覆盖。 + */ + static final boolean COMPRESS_ENABLED = Boolean.parseBoolean(System.getProperty("compress.enable", "true")); + + /** + * 定义要包含在XJar加密中的文件模式数组。 + * 这些文件将在加密过程中被加密。 + */ + static final String[] X_JAR_INCLUDES = new String[]{"/com/mangmang/**", "*.yaml", "*.yml", "mapper/**.xml"}; + + /** + * 定义要从XJar加密中排除的文件模式数组。 + * 这些文件在加密过程中将保持未加密状态。 + */ + static final String[] X_JAR_EXCLUDES = new String[]{"/com/mangmang/pinyin/**"}; + + /** + * 用于X_JAR文件加密的密码。 + */ + static final String ENCRYPTION_PASSWORD = "0755isa"; + + /** + * 包含要排除的依赖项列表的XML文件的名称。 + */ + static final String EXCLUSIONS_XML = "config/exclusions.xml"; + + /** + * 包含要包含的依赖项列表的XML文件的名称。 + */ + static final String INCLUDES_XML = "config/includes.xml"; + } + /** + * 应用程序的主入口点。 + * 4. 处理所有服务,根据需要进行压缩和加密 + * + * + * @param args 命令行参数,当前未使用 + */ + public static void main(String[] args) { + try { + //1. 确保所有必需的目录存在 + ensureDirectoriesExist(); + //2. 查找所有原始JAR服务 + Set+ * 对于列表中的每个服务,此方法会调用{@link #processService}方法, + * 并记录任何可能发生的错误。 + *
+ * + * @param serviceList 要处理的服务名称集合 + * @param includedJars 定义要包含的JAR的规则集合 + * @param exclusionJars 定义要排除的JAR的规则集合 + */ + private static void processAllServices(Set+ * 根据配置,此方法将执行以下操作之一: + * - 如果启用了压缩:压缩原始JAR文件,然后加密压缩后的JAR + * - 如果禁用了压缩:直接加密原始JAR文件 + *
+ * + * @param service 要处理的服务的名称 + * @param includedJars 要包含在压缩JAR中的JAR文件集合 + * @param exclusionJars 要从压缩JAR中排除的JAR文件集合 + * @throws Exception 如果在处理过程中发生错误 + */ + private static void processService(String service, Set+ * 此方法扫描配置的原始JAR目录,查找所有以.jar结尾的文件, + * 然后从文件名中删除.jar扩展名以获取服务名称。 + *
+ * + * @return 原始JAR目录中找到的服务名称的集合(不带.jar扩展名) + */ + private static Set+ * 此方法检查配置中定义的所有目录,并在必要时创建它们。 + * 这些目录包括: + * - 依赖项XML目录 + * - 原始JAR目录 + * - 压缩JAR目录 + * - 库目录 + * - X_JAR目录 + *
+ */ + private static void ensureDirectoriesExist() { + String[] dirs = { + Config.DEPENDENCY_XML_DIR, + Config.RAW_JAR_DIR, + Config.COMPRESS_JAR_DIR, + Config.LIB_DIR, + Config.X_JAR_DIR + }; + + for (String dir : dirs) { + File file = new File(dir); + if (!file.exists()) { + FileUtil.mkdir(file); + } + } + } + + + /** + * 从XML文件中加载JAR依赖项列表。 + *+ * 此方法解析指定的XML文件,查找依赖项元素,并提取artifactId和可选的version, + * 以构建JAR文件名列表。 + *
+ * + * @param xmlFile 包含依赖项列表的XML文件 + * @return 从XML文件中提取的JAR名称集合 + * @throws SAXException 如果在解析XML时发生错误 + */ + private static Set- * 该类实现了自定义类加载器接口和Spring应用启动事件监听器接口。 - * 主要功能是在应用启动时,从JVM启动参数中查找指定路径的JAR文件并加载。 - * 通过反射机制将JAR文件动态添加到当前线程的类加载器中,实现运行时加载额外的类库。 - *
- *- * 使用方法: - * 1. 在JVM启动参数中添加 -Dexternal.jars.path=你的JAR文件目录路径 - * 2. 系统将自动加载该目录下所有的JAR文件 - *
- *- * 示例: - * java -Dexternal.jars.path.path=/path/to/jars -jar your-application.jar - *
- */ -public class PlainTextClassLoader implements JarClassLoader, ApplicationListener- * 在初始化时执行以下操作: - * 1. 设置当前线程的类加载器 - * 2. 输出启动日志信息 - * 3. 从JVM启动参数中检索包含"external.jars.path.path"的参数 - * 4. 提取路径值并调用loadJar方法加载指定目录下的JAR文件 - *
- */ - public PlainTextClassLoader() { - // 设置当前线程的类加载器 - Thread.currentThread().setContextClassLoader(classLoader); - - // 打印启动信息 - System.out.println("启动自定义明文类加载器"); - - // 查找并加载外部JAR文件 - loadExternalJarsFromSystemProperties(); - } - - /** - * 从系统属性中查找并加载外部JAR文件 - */ - private void loadExternalJarsFromSystemProperties() { - List- * 当Spring应用启动时会触发此方法。 - * 目前该方法为空实现,可以在此添加应用启动时需要执行的代码。 - *
- * - * @param event Spring应用启动事件对象 - */ - - @Override - public void onApplicationEvent(@NonNull ApplicationStartingEvent event) { - // 应用程序启动事件的处理方法,目前为空 - } - - /** - * 将JAR文件添加到类加载器 - *- * 通过反射机制调用URLClassLoader的addURL方法,将指定的JAR文件URL添加到当前类加载器。 - * 添加成功后,JAR文件中的类可以被当前JVM加载和使用。 - * 同时将已加载的JAR文件记录到jarFiles列表中。 - *
- * - * @param jar 要添加到类加载器的JAR文件对象 - * @throws RuntimeException 如果添加过程中发生任何异常,将抛出RuntimeException - */ - @Override - public void addJARFile(File jar) { - if (jar == null) { - throw new IllegalArgumentException("JAR文件不能为null"); - } - - try { - addUrlToClassLoader(jar); - jarFiles.add(jar); - System.out.println(jarFiles); - } catch (Exception e) { - throw new RuntimeException("添加JAR文件到类加载器失败: " + jar.getName(), e); - } - } - - /** - * 通过反射将JAR文件URL添加到类加载器 - * - * @param jar 要添加的JAR文件 - * @throws Exception 如果反射操作失败 - */ - private void addUrlToClassLoader(File jar) throws Exception { - Method addUrlMethod = URLClassLoader.class.getDeclaredMethod("addURL", URL.class); - if (!addUrlMethod.isAccessible()) { - addUrlMethod.setAccessible(true); - } - URL jarUrl = jar.toURI().toURL(); - addUrlMethod.invoke(classLoader, jarUrl); - } -``` - -这是一个明文类加载器,实现了 `JarClassLoader` 接口和 Spring 的 `ApplicationListenerpL*UV{6#3wg-m1do%1g}OJP45^FXEr) zs=J#spO8zV`BdnwVhgx`BR@Tn8~ZcdFS;&H;QN81P;f&rrsY-(@$s!o06W`MaZQmJ zbs<@(WWbT7>hGFdWJF=t(T`W^pOux9J5?8#<1Q9_ZNF=D^gQberY*#T*jsp%DEhq# z;AJTWAc%f=2yYYq1?~SW3I@i*#Mk6Oye)m574&g!3aiQfT``36-h@fX7j)45lMiZ`aj)t1X6VPx% zPG4wxd4?MNm JTHI3dGGr>dpGoSA@ zd*s6ya7F%y_zuhbRC=|{6v+t*hwwL8|21Za#s)}K45Yt;6_u8Lp=BL4e`ncaOlSK0 z4m%{kYE^2~H*x|`<#1#3s5^(v@gFC`djhM|< H1z=vIzF9js27T5Z&f@obd z4@vWq>6ilr$@1sKMbJ@aBr6@+f&)Lz2HjWP@B0_7Ob zy})FO(O_YvBjOar4u%t!J8ju`Z=Yqie#uS; zTP$DsCZU=T as@Nl1$Bgw Vh72r2hI-1q&fL-1dwe2x*m^Un>|tqiOLJ|uM} zw`qRyn*mFHzfEJ-SV%+$>3UPtX+dDAEA26=^G=3UR179liMoY850 KXoDB1j;qh%h$#7l?OMJcdb)WZgT8c1Q^xOFC4BA zgK>EQ{r%+QnH<=8RR(JY0yxZvu;D;Oi1$f&7487(n%{iieoq-$nREKH1%gTo(`W)J z77&Iz9ZMOB0zoNmry9~7gF6XTX 9SwSh8<6*f$>Q+Loui45fD|#@aQb`0!MM9Ku6{_Axia!Lt zC6$JDA;i x6{#J C*(_%O}Fq~lvvHssW+hwqpUWBZwV9uaJ5ucJ)b>9$1}e-~Jhw%W@3 zy2JHBrQkiWplSGYCmZ|+5NAf<@Ox$`PvYt-sU|#Mx>AYya$2!7Jo;8`*z}rc%J~=k z`~uf+|My2toEY#2qSj@EX5YWzjj#dAG*-0u_<9EO5|@bo5p}KqjVkr-4j5<7M_gCL zZjqGIbzff3?EES1*6W|c{J5??mka;bldUU<3nooTk_-Ef@UlW_=7j03(Ra63mOY>U zjAG2oFk)h535khd!TNEtv#Ru$#5O`C4{3iZ6-2siICqa`zNE7qvYLMTX50+(hUs7! zwh;N`# KrF@r|-uMf+?E1@PDW?5pC+zs=m&T3(C< zazftILWM+3xDvMaKx9LZ^{P+GzY|G7Fg~GMMz2IyH#Cr}v)t;sGidwplqh7(n>Wn~ z<@q2jG`Kdq{V~Rn&sa7;W7Os+rc%s-LIewvANdZO@1--*edTw#4qv@J|A)2fS9x#; zC*#oH;u($tgeffr*-)J5Y420Kq!`KF`9e)&18}E04tTTdnEbJ|CEkgV)Lc;|d^ yeA-mqvFFF^IvvIB^XPP92?0Wv6RyD=TY$ zKXf!#eQQ3Zll+G2qmyd!Yve9?Z7~QEqgSa-D*RjzG-Jn6V8c0~wg=A6xfbMSuFbE` zJJkd5ht&e-j~XPw0PFkK1Y3=R6#n5*4F0MD=B8L4f4`1bgGNkn3&B`E?XRy%Wp{3I z0?zjs^}%<0V9#`60`JjM_;u{()LOCMD8PjJL}Ztte(|}aKKog0X(o%f!oIb;^6$6< zg&5dxwnXy&gCZiA2XXX>da0=7;3-Y{F0Rzb&H@ct&168^0uF9k+XumoX}{+3CxV!K zW a|og)zVzOB(U?zja)4ltZRR8CRs(;O%* zM5txNoEq07Bg>0`jt)W^_ezQTk5{zDD#m)d^_{sm5%3(o(SIg2f8`$mB*J4{# MX-?zI+L{e|5WvvO3blMJ?*K6MPn>rO=54^ z+E)j5)S;7?<3iF!+GsT1rxkGqu$r;<5A++(?v+c)ONYMr2eunDH8t#*j!0+odkU`i zfgJl*w-u`Csa)Atzf52 pSjM1w~tt~_-+{ye?&ufMa_S;@BOp&h8jcsGjziO;n^p=s%rrFlb;^}6 Y>#PTU3yt&wbEE$K3Px7u?|I%lpIz|wqcrzVjX2K#7K#2nKQ%l; zCo!_UFSBvMjq&(+bB`A)0ojEg{6a~I6(f%b1_Ik&vbM1pn=B(Xl^3<>zA5_lCGP&H z(;$*e`)O#)9r+XrJk!8qK)v6SvGLxW6gM89HU+Nka9q?yjU53>K#nr$(yLO57PU%+ zlvO9ZkVaMf@kF&$0cqG8rb89b!Fp?@Ych@AOb+;%!D2hNBGv`_*u;s$=bdWdJ_oM# z8#{Vy-zjHx*p^gOz$1Cvm)+h+3oO;elUNwKmLDoO!~P8oyD7+&p5jWC?!&vftCpf_ zs2ydodK?w#Ry$-DKKzha(k2GW3_cJJGIi?DmeCV`=Nu=%e ^0L|X84 #R0=nLR3&^Sc?$ z6jA8n(pFG$)uQ^;i*6M-xS?o>OGHfQgpEjerwPdI(X2}#hWPdMAPFrk9yHRqq~jH8 zTr5gyNRcVMc0Gj2AVz+Dy{S}4T `NTg?^1=ITnwy>DjB6!?&MNGu)K zt82_SyaK)5^g7JQK<8S19Wrb(V!w7Gjs{nvr*l3;MESCci$x9RDR( ?e@8=cuo9Um z5A*k`nc3+Gwyt;ZYhr&0px=!%LE8&HvxY_+Kj>qH w)At&x-)~apBHA^F*@RWD_n&h~zCvHTrRB9_@KRjPrK5wY%(#+^wa<*beT& z-plt_()Qo$UD4Ff1X*0+-on&8PC`vBxq0%J30!~Ef^pzn43D&f1g{N@dy)VTy+&Gh z7gvDk_I5 lbuf+%L+?$_IKjmuF+9O5vd**ySP~9$Le1OIBngX*`Ck zxC8Fgi0N`z%eERvh3r!D(IT2fl*z}&XG_Kn1$tYsbpxw>8F_>#EZj$He6Etp50iwf zFQ3LVuwW+{Wfb@N&B`&dw~UF3>I7|lf_FLZuYXy_)oB%9-CTgI2w zXfxFH{^k?6aG=KtZ*t@8O^+=X7`Nz)CC9?}&-yMnTli&Cpv>!8yMH_fyhQ>rLl-N# zDJ{fo2~ed0JfC #-1QIS6v8HKyC=JO*$T5eV8__z)Hfw zgZ0$%Ct^N~(xtS5QW4atg^&TU!NOIw5H>7gV>@8sSXe|K>e^{m6l*nU=q9xhiGW`> zaxj%MeLU4r;Y53oX4&1(n}~4M`;GQilaD~lm^lPuo+J&ZTMj5zfwVpvyeG|({lN_T z`VcCfukE?5cy?Q_HlE8dvCCd0eLH$`;jwpx^tnO4io!q*;Fu|bjFPnZl$>HPrAo|d zrdNHVdxVIY!7VKh4eA|Yj7Y~R1{|c?kMp7W8H?knIphjXYD)AL9TshR-}@Itx&VFb zuW#c~`N-=S5B(uyQ*AsxVyqJD4S1DboBDK>VZ*-)v^?5Q=H;Kb;36?~VY;z}{&I|P z08!xLsWh+?-=MQ6yW8Z8ce#lv^W9co1`x<*3#nc-VmLu2CZQX;FDq|NBeYE{wuQaU zM@GOv4`2hCIVgeULx;gCRbp0NtgI@kj@R>+><#r0Z#Fk`kdvKK5c8<0N@dB$y%wBF zZcYvr$TBTpa4BF&S>RY%r5ber#_);lqohMTp4! KlP-xDtfKezHCYrb#l0V!zZBfw-XICWoGg|UbNL%c7-HVlPt zqN L7YSJ{_7bv`qJZ z+UNH84Wf|8NLYWfmu1%s$5{c|vSJyr;OaeeiQN4VF|r)Gx{5cirrBePz!2S{QVuY6 zVZW|(E{G}Qh?~YxjFw>gae}9;tRAJDTvuNMjcsp (Q4W&z>#Q432yiQk-+Vx%uJ+tB|D5xG^O3*mKn8$@* zVW*8$sS)MA=o1~c J!FGY)WjM6w9#&Rd(> (Y{OKjIQ>~BC!b{NDh(rw9 Kjd!h`f#JikVJD?Vc_42AU#>0I=l2nM8thWz^0qV`EzP`Q} zFv Q_v9R!(nwyciyC6B$vR%DP=IuOwR}~O+E?&ih z^L$u$r7KZn=nsooyX+atgPORBq&wJNEsj#w)(*zj_e5V eY+TVJIf7LT|GPAzUiZP8`W(@ CpcA%*XBB z2&dD47x!`JugvX8@P3g%b-7J-Qm}+y @17-BtJDK z9IA=$R%gc>qfZJ=N<`~5T-mJ3%=IXK&HNH_HL)>@Zlx~cP}%7WP6m(4ZDU=9>^d87 z4$`k*j=dJ8dup(57n|F4??=9#7(p+4-%Y07>rD=RwoqsC5{8DVDyeG1w=IB$s?dZi z#l*x=GYXQeZ+bVepxpoYNJ>YEYO^zl)ztSSOu*wH6LqOpTp~^56PAF)Ql;WW+&F3N z(I>{miVqCbzz vtYrW2TG@<;1K~l$9W6HqeMgt? z(T;N&+4G?1#KIh%whIe<6}9Bhp>I34%46(&er^-=% x>bLf zM}m#Y%>3%3pY8ljen|7Y1yMd`!ehtaV_;>}DvtHG`{NIC7hu4ROh s_b?B0QeM@yJ6DQH%FFx7h&k584;;2k z{#Zbrmav*xo#nKFG$@_-qnDfo`T>vj?R{u@ @IjL1Wcq@hf_B$p?^w! 0J|2ZB+5gYS%Rt&!Wp#D%tc`6v z{DcM}Pesy!EPKCQ{h|``?TrVap1P^7pyO32;sIKJh#O~T6kJ@`jsn%!3pvmO11neV z**S@b&a+ML8qJTn86It%oTM|C$(`!2H7hpMJnCV~=@#qFuXqIndrdX{pemc*CmV6F zcG&iRX#ocKG &z==R#)9b&K%7C5iW6>AuQywILR>g z_c58D)gRMDD1q)=!skJA66C;+4)8lfd0#)HnHgmO%}qVdM`+{p=3&k@)Einn-JX p+oi;|qeWYY}Z@RxSY(-@Ou {gdh$PSEBfjVTu2;B3J3*|MZj-F~vBKi=Z z&7S~CO *3Fkaqfwu1IX$0i}}LDQXfiT zz8{E7hkxsIo7vO*pRdF@#akioGHu|HBCXLrEIM385bw8NH=2FQ;~bLcUz;vWtuqB% z(^_z0!Bk7+`t_Q&5WJQReu`;W+IPMcjLFP<5{a5qjY}k@bAKEc5dZ#TuHTdE`(ngL zRi8A5DJ2&T4cq=gMuYL5w~U)%Y0Q#Nd01>d3a+!n_mY^MNS;jb p zXT+=lus04(hW Wu$NWR`uy)!-I gg zzp8!lo#dMUp)Dm?2diG( %59P(H@hALRRWZ zVXePbt3GbT%v*)lC=|pSJs~dT-^yuA!SRwy*;-q>!#=#`Qip&W*sTPH!XJ=wP=M}X z?v2^<8Q!-E;{y8pA~$QVy^M+pfKm5XI(vGd>kbJ)W974K)I6@Ol2eeIcj0~S0`8kZ zEKi=759eeLp{vx0>{f_=ufg`M=UgiFB-JbiT^9=5v+=!R0#CP5+^)~j;YyG9YZ``o z!_oOlRvdUr*+MFNkE +iZnBd?+wqfn5y#Pa#=CPEt(!jP@{5N@#XA zy{UOjhywP0L4 S<6uMiVCCAF=YsqLwm!60BM%_!WJ}Yj*vJOM3gtO-yb`M2v%~id_L`d=Izc z&g=gyst|<1*!|^X V3=GIKbi=6S$>%c-7Z(Ybv*;}> z;Q =4_fJ~TD@jB zY#FSpD=7tqTg&f*Q4Ji37FM`kGMIwceEn<|`s`*-s01~;mp#Fxur{zUgskk324qN? zxpL)z+gZ8-8EJ_z+3KFv>7yn)gPgew*v9}SP+XMa7=TERhYQZ_^5qlnFu^DPkI2>$ zd`E~)9?yk?u-s@Hm3}B8c_OyVU$H>hd#RAE6;WT0uy+`TiS^N$(-y)*MlV5c*Y?Cq zAmsOo=4SdkSLa)rt2YQvvtIk}+`Fu4p-rP;)(Fsvks4+K1mth|PCZMT_K2Ulg?MZ8 zi_eMKw_rWD$6X1c !=K21qvv})Inkp<% z=A9I1neRM1*k{g|@Hov=d~vPYTAw}EjF)A!8) 9b~+2~u3tgn}@0VKWrIL1qJ zcnA0;t |@@r zxSu1O@;TtxYFM5?8)2e8mkYGYEXr+f8|}16!K-2Tw>NZ%dO%p%T1$Sl<~znac09P% z&c?jzq}J_*%$)~9i&|3&G9rCZNeap5nogl1!}x@>2O2bB6qqlyav9VGyOSyJV9dnL z a*6};gILWcG=0v;~{+p{wj zJ*R!MqEgZ?z7WUwc%k0@Q53gI5>VIFN(RU+a*Tp|upyfbMX%CB*)oWG+X2^7S63sY zdC;L?e`tzJ$ak-w>JqY(sp)BQY^4{zRLikzVCX9r!RZPUdCJzTbohYj3w!IP{G(9_ z1q+&iFr%!T&hJQombByeqn;p((;gkLR#tZN%Tc IH?Qi%;)>;T#eG=7yW0ld z$Xl)Gaf8c#< 8C_FAh6@;3}j HG60?R*SyAgv{K?qJFVYr2wE( z8CdWO*32wr`Ij%3oZSNoY_O{8-+0uB R2O$HZ**%7&XUnFAz z0NwUW8~2^PU-46-A2CiDV3flsn`<1fiLh4n5nV5_c61+U`gd!{ym_dsYQvLXGhP_R zp`W7z00sU1(xJVjeFecUA(~<{%^_5?@H{jVB5SLy0+qaLD^2cP!>j%_J>1DTJi(Jy zH`{tSW{e9>GUeU9W9G0ItS=A59cmjm%ZDj*T^hy(u7(f1MVp@>VSrsEyZN@=2|f{D zWdVYv&+K2N_0#DBk0I!;h~|%eZc~P^J&et(6aFyXJYQw&z68C#3+^c0kIPa?qVSm` zq1(ZTWYgCJO(8IOQ~#HjuKfC+>!L6Ui$?EQM%GsNmoGwZgb$k?cy-_8dd`|ELp0F8 zy9+%o17$JID?+lqmb;b6Wm1R8Nk+v1i;Co&YX8jO1fbH;XtnI *FAcLm)|aoP3s^hpkcY~V6Ul&g@i2~6xqZoTN%E8-2Pb2Jd?wvRDn3u(%o;^Sr3 zeEddDYb2F#AKcrAF$1ZM+!r^qcM`ZrqHC$%^yVv3$fc(I^@2<=0AJls3h}P?5+(oD zh~=xp&>2^OgE465+u6(IRB5iLXmEX@^prUP0R@4nr7;;PB;vO)%~}W;OF&R*#|siH z_T8I!ah>SJ0}pN)GI{jNO7PaXGIuJM7e?;m%g3|r@eA_11kB#cj>h9r($v*eE24!Z zg?PobyZuur!A@XluBS+U(9I#bZ%_M5v+=eW$-|3%#|x^}3I1zt0q}F&rsW22p<$Vp zy1Fs@Hznk0U+JJ_!;r>;Mgg3$JVCwK`$nWIcM|OO;?gmPXSs};d8TY`&~Rkpz87L& z+CiSpC3E*>UD6PXnIMc%ni+#Aewq|@wck`iuSjr%2Rlp1Z!rG;uUn6MbBI+BS?=C@ zsp$YAC0a(o?{2MJujF2GiPJ&?z7Ua7iutvx?me4|>T#!O2Hw!O1!API!^i$3J7ZVl zb=ALHunp3D?iUuGy7D&gOXJb!O0nPq{lB)^ W`WX7dY?B~lfQFHv^oVv&xY4IV==tJ--ZO(Gg_iLwPizKtuo zS1Vkzty1&A*_wObsYWb@n{zE&LOKcIeOU6oPUcsKqa&7|FE+rh)`wgpbi1e8bB=}| z3Dc0} d1+tD*YN;s*bUToEPQn66r~n~k}^-LpIR8AZBFUS zE|UkrZ8-n)(?5?+6)w@1DjsDd#jhoH6?e=jXgt8W8OtLynW7EsgMbaI@CD<68561j zs%gliLTLpJtir |1h?u0J`phMO3Ep}1wUh$fA=491oyF)w= zkKWAaB*oND zxuBZm(|!Rnt-}ku!Nw+8_^W`(%xq(u_T?NQ@GF`44R|<`;qyE$H9dWQ ^XdU-R^?`HB~ zjs5~}V8b$2?`CxleXg22mkGw~?9hi!*0cR!MzEfbM^^!FF82wYBZ*B8JKTBkc&$g& z7z)=y==sjm{hOAainedBJr}K93@w#Q?mKNl&!GlQudV48N@b8 cX#kKj8|p76 zArar@!BZ1w=dcO#R#wg(o?;ipxA7k~LLDJJ$y|D4b6zfA$L!%i1Nnj(*4$y~g4-@y zA;~}W&+ZpP=pSBCDGNnE9p8!EtG_hJcO|`iNd6cX9;w?i?NfGwV->1;hL#axk`R*V zQ)7OaStTc3u48I >r=hjn}hHJ&b*5&C}U7oSu*`8(FT3%u>E zy~2-|-B~BWfI{@pUb@#eX@z_=!HGiqqlHT6^>yNccyP+^Rd4&CzO`|2Xcx6bkb=}3 z;6s3hjxM|l_ncSNeuYP`!@aaXpuPLqK5OIts!efS#!urg?ODDVvt$q>4nLXZuI{o% zO(zspx#lL@T2pLXWSYTACLRKpe<>BXnYNe8LB}Sl1)G|pS(t+Hy 5P!ks}_NP7nq&|klBja4X?w>^E{ExRmJOQ;z{5uUXVAdFd 3Hk3i9M9%ovq9>=BJx6V64B%@0J;}4nyFsRTEUbj=Rxa}+-{FBK7 zKQRf*>6vo_nt6kbs0{n26_G&}QwVe$IQBt=Mnp!gOPKhF=%OMF)T+8$weOdy%WL{N zpr^-`(|JE%8xkVgPTZFHZY}&~x>AJhraY@Q?^8}f6$0A* !K^7C6Qosr!#+=*{!@sE~%{f zj3aZ;51?yql|&9SMd!%GfwQ7eWD&Wgt Oh?bFNEIXg)`MorsY zQ(d&ii)m?j;?jR`QS&D8CuZre3(71KQDWy =2#Acr+Fh;uBwSm{!>{XPAyz#x{EUc^`znk`+?Qque$x;s8H zeqCzFPton#mv+zre`f`-ksU_C*mZ7q>uu9-C9q8&?3W!jlX6}9NS|Up5nDac;b4L- zI$VAp7yI!X4njIj-SCh{EywD3$m_NX|I?*H*TZvP63|uOho1lmFF3!exr^PL2O%iW zerCu^HxV_9>3XLp*XaR?UE&WfjeheBYaOBIcP_DyP45r%?8+aVhLG`-PtKrtE}Zc} z6PGimWON@fR*0>W+T&0!e9AZ|I?Y!=IutcFw{SfzFD)=?9VPzzt@mfDh`1=%23#U6 zq+*q@kx=x@CZP`venlHBe7~0=$;-no0odBxmUwbq0;IgJzX3{j)*A!xhonsQ?9`p5 z?uF(GYDF6D;1{iLSkh_ddU_Ju9FgsyA&EzXO{dSr!%~Wvn*p~udLr !AwNt^3zkw=X%!6ZroykCM~*>r@x8pyD=5Q9>Iw==8THKR5zM zLMqqp4aFkuZM-gO*@e`p)uzk7fWf_{$WX9KmWWbl{uYxiS7ZYmRWB5_($=>GD~hHu z2Un5u(xS!4cc?~mhUgutLW=|}J{cPu_pjF%b8w5Y_)n~o^w|}oVRAyUiu!~lq;#E! zSr A-W zb0`zc%&Y*FR8@)V)gOgBQVSNDRNOqD7Mj5IHH?k ^%<7HTQbK>0h1_vqI zuQc3kuCwggvF>}XKKUSaeQ%SP57?EKK}#|@_#@M+kF+i!*xGlh36pY{q2m-SW`Cr} zxD*(8p>kHsa+>Dj(NMDX?m?!e=jJ^IoUB8gJp ?80L8}1KQpBMq4Jn6VESTXHE z_J9A%&H Y*X^ 4xv6CIi)As==x{+^2lE{40lF*B$6vt) z86&an(W`<-2FlgQ%ocN1G&Qj~?N>r6nG|JUzh9;6tHFd`zt+d`6Dz;!qdhOpFGe{) z1OkMMN@Ii-?uXBnB>gZV)M$%Q9;qlO4R=dy%Z^EPg>`KZj7>~J$Sj )o=TQ !f1yAkPSfT$&oKsBHQLzklg0HOgBMHR=?lcwyool z{Cup^sqGFQsHpBbNgBeHGb}^JNk|N;zr{FR^XE1-x?Q{Q3vtb}N1(2M9@VR0wjN9- z`Xx`34HK%eeJtr>N^WfITC+-DR({nGo5$xJR`Y}6!FWg^`LUs@6#eip1`E9cIHVw@ z^Hh!@v;L5>hFZK3;is`QA50IH^PPTY5HlLpHok-v5p6xEF#gWo#-?7&f<&BD$1q+7 zYCBc&IbH3kCsR@*eo3!RteIso7d=`-eQCD^TYumxQB@G2RGX| 4^t;`!N&2@UtV7ho|ms5?MsZ)$jHW~34!)Mgw!DrEM&hEUVc zd_g>%#_uHeAhkBgylrx?hejws#Ucv(z6+NxWL_ZBE2dLKCL+7tf5q)wQpo4WhiFsB z`U_}5%jufwqYHQ_$?Gea3=EbOu`A!`2)}jN*rRMKvj8)V$69V#;>xo1*eO5k@9)p> zf3c;D7bJtEC^maE-GEZ^VP0 !Je?cUQTAl@we-YXX}S}pSO$i zQ@!5~?~*~8G8fRP85!YZap9RN%YIMJ9j*iMBui(uqgTk~jcIL_y(k&a=@Z^mkd^J} zaIeO)o7;HdskA^l68$4}1^XUOMpA@)S52qc zf;YcZcRdm5d)?)n*AP~r<>J%Xw_`nQxu-eciNY_dd~Xjdj*-HgqJYbplekb3`mT#G zG}s>yLPoA;nF?c25Hk-)=kG<-(BxWE+(n$4{m)xU9bbg)<}8U6iDh6v4-mH ?mm3RapoVwKacG<*IfsU_7a@WUcd1;6$i9oRnSJBeycp3oVXFljjGT`qY z23Z*BtdA@mAq#gQ5UNRTZ^Hg *j9Qf+N*=-9_Z7T2?_B0>BJ3O;^R`-~@<>Es_3gA3X~{AO;+k@Vlg35ij2k0=(d zE_PK)7>@dI9i 5kgwR67(qDGwZbpW4(5G4U^I;TmK1 zTF14&T`$lF@bh?EytkJGgr+%LI{8&Kwwt6RRwLrqZtZ?{0KrQY((Z8l=i7)b*g);U zzNjQ#B|ltXEaP-NLuOFTQ|=9&X-Ma?%Z7$3Q*4CvJSZsXO)Ql=$X_mzao75{&SI zOoR$(*RCtsY0OFkR&^>jk8!lNxW>&|u=uW$f8KksS^G7#4|w?0*iii>+tR!F6hH`& ztV+vEix~q5hI6K_&`Zf7L&nk=FncjeU*2y7PBvRVCH1676oDV2UC+Q8B6lXXVh6C! zx9$#r#pQJM#~$f#XC^L!MrqI8#Vq^oh &we8AH6|i=0*c|vZ&~#;4Q0+nf%iIO`Dz8$m5h#(mg%Fk}QtB zTBx=Ab5or6mD55(*yKI}e%ESoADDVB_x@I%&IuLJRHdL9N(#g_`U r zRR_cPQffsK>q{7Q&&yXyi2$M69jXckv{XVNZLm5`n84uh*us)3P+%RK<3mo<&J0zq zgf+^Q(4X}RJH7McIOkvt<)fRc)v2qQ)v277W~VD3T~2q2>GR(P-p+{kgxu@9zGu8W zBwHjMjFAOag4i-)SiY8|V|LEnGIo%J0TWgijp>5!m3t+5esmA%`#Cu|#{3eb(yOa$ z1HC`c HPjQugE8bav#x5!i(5dbC%9;&V3V9}yz<>Psfp_?ayvxMIH6K~N_D`pk-Ccuc zS5U!UT7cWQ@3C09tYruc0Vm+}KV)-5*#45B--3dwKu}_z<8#{GSuoHZxAzizu91fF zKP! hfQjoUC%tuU{oJZ!V>`SMM$hdooL~|4!^W9kZ z7Ppo#=I`^SP=MYJN4u~{xGbi;ri#GS4z Q_$g2Vw} zvBb#qYK5+)Wz-Bh6c|k6&0#PcNBVbIPEvZoY;jc-jDlE82HwSNve#cp)4otjgwv(b zCudW+xw;v>g)vc_%#x@Ut3^D8xr1iH&j={Iksw>KeZ$y3nnCZCP4(7Bb7^QgNyudZ z8;Z>X3omjgW%FqKgZufRc}K2iT*n?kz|BR3m#iI$Wr^*yOnNp;0u48%ZO^|}IsOx+ z;EXSTmhZkef oS*hF8hZNyIh4Mo&q!I~WtbnLpIpkk@T-tK#FtJw3l3 za+l{9B(ACZ{ZpS1jh7O`X0GsZ23>iBA)iB WGXO!I}FqXAvu;O?zB_T=hU_qD+PMm;8opCH`s4 z@QygGz;)@Clo|B+r}#z7V?l *qoHW%#bE>$?wNfqh$=n}UoMI`FKlZ(e`98b`LRF0&|%m{Ij= zMUbCh5ZJ_C(y!A(V74^wavieMnriWy8pk0GnK*ZB7>XUi4nlWwwK+Py{euGwTCH0v z+ of~xMgBDyEyhKOo; zU`)0kYu=7x;C89OY1(W>m@AP3=>AlInIGEQ|6RPa71%RzegAvLc-@rU$n+bYN@AjL zq>6yH1;kBKXhrfcZcfZ6(@Zto7Lvxi)P|_yk$-Y;Zfn`FCIIouepRYi^PL_Wa2ri* zGpDN%1R?-E%o~9w?^KK?fSji1k6Ew7a8JxlYs{`Q1)Gwy-xe*w|L|)4xc$%-_`0sF z<#wj-vAcmhZF%V{$a6BywV^nl+U3q?snph`N)wIb8zgTkG(u4K*oomhExi6Rmr1 zx|c2nZ_7hJrGxl_kB_RPzg-CVn?!b-KHFxflRcjF92}4dI*6>Svo+7D`$wm|7ZR!G z!66~s1yaB1FD|ll$tT-vN-ohvHiffk_^9Bi6mka5@jGv=69hg9LL*1fuI;J~=o-Ji zZ}l=T<~g=VL-tO2t=?0hMj89QZy0ElEP@KnS`2j65Ce88GJAw%zWp#)r%W_7p`GC$ zr+?V?vG-cc4sL1Ec}#wwOxka@!kdqJA+3<)%J({rZe>9Ot^$9eN{`f1ExnuWD+2tl z{ieloW7~7h`@dtwj)23aSXy7i`$)|AlXG!NM$Z&2>qqlv!sqb2N;HSG U@+budfx!!4#IE}J)>G6e z9unRoL%KsAZ7xMBj9%{O`Rj5i*1c1y)8?f6ppvg0Ika9eb?qIkvV8i{>XRQ${69pU z1y`F**sY5fZ*h0m7I$|o?(Po739c>f6u013+_kv7yL<59oV?#T-#YmLN!H3_=AON; zy&p+faElkyA7Nxp&c;5<5>HXxe-+hL(jE^o>;7jyr-@PzhcdZA5=o(C)9pea^e@mG zmjnWf_0I)XG{aZTSD$^i%+E1 m%^CxIXWBwA NTb}nk!Ea`Z?QP zuA@on$6`@4dxZw0`~V}j-%K-fu_G(>3na*|mkwI$nmd~{ex&=Vzu~VgPpbJHdn?l= zg*H(=&ex+L29=(+V|!XR-r7D!I+FzqDjn;fH-cW~ Fhu>by)DD&(54cEoFm=e|Y2n&DN7#&cgvFf o|INk3C^ zo7w)_(h9qN$Unnx*ITu6n6TO)*jzPs=8PK7XY&H>=q)*!s#fOM_vj09-LXnJ)-=63 z9o;b4`AiPv+;%ja4afsVMfQ(kFGbbj>zpnva(-5(IXR&hqmSzd#8SeGSlTiS*`t*= z5iD_*K$1x_62e_#HHdC$(I(>aMRDqS>GEQQ=i71?@Yw$G{g^Vv|Klvzc&5*LxgPxG z{TgKTrrT}Q?DqZgV|Bwc@;yyDw{K>5Pj%v6mZTF|H8JTcDQ*ZSY4yJ*;`U(MG#tH= z>>6RUkMU>@g$y1D8vOkayBz@pus*&e@!q=tOKKw*&iraw#@pF6YI$%<@J}1)mq6|n zjwz%&EKsL7NXyjHM=x`>RXup20F6zoT|?mIyS0)o9)#xqC({0l`_yWv933^#;$jw- zcs!`6XCU=iiC`aJ3AacR5Ybzc(pqnC iw_qd&mn9XK530;D~u&&Kp7q!=-^t zkt(?`tMs^8XPiNzAAX*S-S %kYA5>zxrRx)t(A)Pp?S*0-?w%BqU5H)YGqJR^~JuMlw(6Et3*VnsdH z!WI_M%Jub-hJ^;_>sMP@YN!m{q5i?XOXs|%L1u-(ihTKcatY=K$C;0!linTyM*Kc3 zrJTrbY|ghyGTYr&Q!H+% KfP~<0$ zFK=5Bq}a&W 8aB zbnJ(MAQZv01SV9o7af)-1c`#$dOGavi#bQ{2BW^-&y<7~SK)>7^B-wO)Y+b$LLw_n z-XvDobu^Tccmcm5!$oAYeszMpf5}2u_f5=1)#G;IJp>BS_r1FI(XQOU*=K7N`@C;m zwPwu~`5UJ7p@iqE|7y5)PiS$|vr;!Gd0#@ilIwM^>|?ijq1mT}p>WG;6zfJTuLl4M zm}SNE2v`!tyP=;KQ>a7(JP?UEh!+CeTe@0ev)jQC4+3#KO9;Cie2ELWP_AtR9RG6O z6KZva7Sid?R}OvO7t1z%%;r&HSQqp_*65fzZ`=ymjRx4LcG=k5_CLBj<;5dlHP5bH zyxbLtT?bTDSBu*LG9v q}tO|3$lvs z)z!A1H>4eZ3dth&gM(oL2x6x0Q@lQ;>b3h=E4Hm=v_-e;o^$|5`vJT8VNAT}w7kEw znH%~CNTm7yvkTSm!)wEDMxDqmwYAj(WicmnCB`>Em)*B|rw@~kheZN)jfKA2x!B!Z z3>Tvqf|MXqKM>)g{Xa|Jj!SkRP09A4g%+~s-CfS+Ul-)fm+d*%YXk8X6(C=~H>CIF zCJJXj8dxkN1hAZ-6Vs8TK0PJ$9VARdg&*d~7#FLp6|cd~>CDK~3p1sl=YmHnqdF92 z`zdi2uiip=P-LTqG>|^R7&pfr2hfta?k{tb8-=2Jq)i)`M<|nE(I1)3#hMv5s8FY1 zwYWPkejF8~Rt4r;@yBco7b-ak!p%H|*PH4qXFc)!7leSQoMg=hh=_=P1nn}0ie~u3 z1eU0%`YD+mLWjQR;$0ra&bBwzwxS}j!Vvg4S;mcGnFalmjug$g5WpBfTa+~G3xysg zLi^9xZVVS;Q|#Q_{;qjf3V`Cj+oajyr~NPP#4%J>;qYl9z}oRpfrGp7Dq-{YqDZ@f zR9qt&h%M;hcYrz&$Lz*6Y}Va Deva|SCEY^P zk8%2EMyD?5-q2(R7SDHoh`t2#0EVG_0QTv~C{WP*rynPOor#+0ojVtz6_C1d%_($j z%M||WKRMU9>*kr@jYFzyuQok8Gx)>35yUV@ZpM7mRWUd4tF_ouSa!N%K?*6#7i7jF z<4CApTvUXA?cyS)lh;-}dSMNwfuvVpBK`?o36PHpF4-UZ(A@>D*oLn#U3gC)L2s}z z;jo_{3Cv}6r>!Hwt^)62+KDxz5OFYyBk=0}nR4`+a`icacsuI19EZuVdZ9aq=*}l{ z{MxCo1zwx@Kcn4!sM&rI* I~{(v@=hKQIKDX#u$Oi-D6YwH&8yJUzeq%TA4kCV-pm^iZpRRj~v z8`VQuIh7mC$7Qp{kRxS=HWxuZu R+m;GcDK{ohdI=~h3`7~yh$_^!Ha#8Y#ttZ&$x;#SW)}t7CMIhi&hxP z$ys!U3{zcq1hK@o_X0CBHa$aj!s0vqh|Be$yttB2N3BoonV$x%UbYLB{hZfbhpPSn zR@@+|DcGs*yEg6fD|#$bsfbOoP^b6u1j!>s#%f6)U8LQ;-F7q3%4>W1?NTh@9S`HV zLcMQx(MVr}LHQE(M3YL(J)Z{2#e^+0At#l=bm#Xsx`*44-j0r$0(4sCgou#M2!+p$ zMlfZsP9NX|e-K)$J8knyQIUn%FaP2W42UlF_jD24>$#h?*PdgS5fbWGRqfDzeYr}S zO2|lr^m)i>Q}u~3b^c8F<=1&x&l=CohafBKqV4~-;I(tW?fXu;9~26Ifpt4}(o3cN z2`E#*jrWa)71zb(dnu3J$u$vS3a4u5r#!Dn!7$v<4_W#wZqQg=q5APnjZIPUoEI0w z)lxD~N2~z>7~C}-N?yD=J_};w-S#wnlzm}h1YsxMZ&hGPJnW?JcO&^{5*;&?P^OAg zM^{(hB+d#%YE84DA5YY1_j*Zv)jkiO;5WLzkStLI#G$^>i+pU=r!4#^>vMkU;BC1$ zwBT{O!!z`{MvZ3+RR5{_oD{#ok2O3z?xw)VAYp3SQ7V@sx9JZyBcc~#5d&1}d!VLn z{hcq=Q5~h~6}}g*(1?<>i-QgvrVJA%7?PCoV6~rnsc9^lSWs?D-FkojdVO6D>Qb&t z!5*vrx76(u;WZ@ql#6@y9&xrFb;b3+(JNf2pS8-D_p& ^)k k;;@uw?glUNoSb5VD> w$|G8kw1!qi(nfgV_`jo|b3#mL7yFsrEN^d*YpP3DK)=z_mA&3e_gl|$I2;|<7t zN*J1J_^(EOA6gg&yS?UkgU QtXih+`U{{w|7Ua>Dk{^Rf`K3O ztO`(!Tr6l6T3ZY4r0Y9hKyAuPepH85op$@G3w+&|-rs$`)RDcKy6x&`0t-Od)(SH= z-|~uD5z)rHbs{`@16~@GL VY`qKq5ond6v*U@I@q}1z50~UY0mt_1Yxuv`nC?h_b<3gq ztp;5EW%N)-mwdUnN|9$t^My*tyo(YNId85Y5}>8%B}d$O)2T>I;j?+-;%fXHb0tEc z{PnBJ@E9>O>;bL3oXNN8kZG`F0s6M1!RPnfNA!%0OwrU_4(GTZ5r`(Z_)lt;%)e<^ zKl3Pd*ieWk?O~7AJlI67rzde1vM0c8q*h^V4c&?=M`BW>GIyfTk<`Ha2d(h90ky5~ zliX`O`Mi$lVo6zhQ>)qqU`;L$7JdJsK~`9IUQ5U21?rH4ZogLiT9dzmgM&k9WhLB( zu-VPeA37RvNmXFzS_o`pnjf*wOCso@s!jUbPNa)f07Y%n7C{4a{{ Cg zRMDYos531$lbL3fR$fUSDe3Lr=G&3lFe(O@!MG^jfC;x70hJ)_w3G5;ZA4s-h}R!E z0o=9KRhQ#w6@9-2F(yME(%RaY;i;+c4S17_w+*Mwh=vBL*PWdqNUF1J=r$}FRISq{ zqfPX7;~8gsQIcym5VM4&wFW^`agd}gBcZ9Zfdk|&!rtC`h_CH@{hewC8c~%A_;{Rb z5MogYpj{R>IvS{1D5|rflkZO4A}Hjukb>;|^twWVWPW# #KS@XW!z>l=uGf5+2?7|^ znM|TYenNaaF+1icC~lg>hPIQCW0RTATRICvUR=|v!Xg(w7S_}-z=a6FNId8t@3 C|!LG~8h<1Q8<^Xwv~HSW`cL)=kf@2Xk*eiLenN=tRr}b0gx&T!C_qdAS-( z*G6-1`1xbRz8*tl^t@>k)R_A9sHiiVF_{>tm~{5Y{-MIaCA2WqJalS;3c>qa-0RDX zxK25^O=?Nt$sE!^FmEf}X6KQ}Hqx7Oavv^M^oX>s?x=T|PP5hbHz}pr21S@3M?2x+ zQbfWoNDvM1ZCXtT?tf;Z$1h}2FTu4RQ=5K)1Kv4LeIMwZ;7!=lPhuFSow#}|zlqms z_ef}!wvw4?*Af|5k~UnqUM!}Xcm`yNhGf^ nV{$&Rz8J}E}qQRN;<@N1t!AeKo?hGjM3JjYV zj~8*acWZdIPX=_lS7?cJb;np2B{ic#y}y4(Lsad3$1IuLe2q?<$!HeB9JkM?FHsTU zE?0BVQC(D6{d1naZzw;S4F?CCXVMd%aLUcivegd#3Qe|!%C4L}FzJw4d8xTtWgZ_T zFs>MdTT%|PB5@?)@uWvySis~@P|#Kme$OFE8YNNEwj_9u2V{ER?vhz#Mwj#kk!N-P z37fohgoT4EOY})3uBa@S^-{TSPL_`Pj4EvfpbdGa3FA>?CF}jDuf9Ab53$2=*OiEd z7UI@h^Vtrj!OfG~D>pib{YY+yI=P!&Tr94OQ8@Sn?39=4m46txbeyA}t8~;V5tp_) zN`@!X*?4eZ*=C`9@&g+DbMuh@9d~! $R&ybY&usb?N{B z{8SDd9jxi2@Wve*{5Q?NudQbh%bVK~E|?vr(R8O`t$edqO)j*@2M4gL9UtJ{iaK4) zy M1BqoQ_Dz<8;Mv^4JfS=iQ}4M-2hExP*j$Nq@x #RNKS6@uZuM< zo%0cFY~p;WIYP&|E3o{^$|=00R6T)`Dvk)B;2jvfyy4@yVa{M<12dT6*`1 ) zyZ|%edY0QU*<`1W3docdmsB!U#=0{&w*1@-{C)RuBQ|rd%F(Q?v~j+32rml*0 z(h55fBnu)8?L%QaquH2i4+0;~3PPa!<}_5yXH=POY(D zeC6y-ty!s!r0l88!P#88S@rBUtnA6neg7OEi|%=`Su7PoD8zcd!LFPuEkCv#6YD!T zmgYh4M*&)4+ckf>q5hMb^=a$2Yftp!YWhoPINU$Uy~xPZ)9a 8`&v(SPnrqWF_DiUd^ z!~0sh+at{9?%`fs%JFD_f6vwsN_UN)$)9TtpfK6st1a^vDb{JT0qtz5x}P5e(pte< zU0u~cjO}d*`-4kb0{t1|F5o-?;V+Lvg6$u_y(;iRsh7NAVwVsf-|RU>xM+Zmj1;SX z%Lmy$V3HEu4+lNq(x0QbVdrWFGpXr2*R0WOyIlN^rd_bxYl6yqV!4rF$qhk0m#hu_ z2~Ww#yM=?dx8Wvxk%}b22D7_5XCt$Y=R`)zDUY4)nMPUO%GDbqAA@S=l5}W9I-h;i zEmc@i2luyQr-a|is)5j0e`Q7Z`bGh@uyP0N ; z5jp_9o%tEn!3PerTwi1G8P|o@B{tBZFI86Rt!7l)wzgBQiPF8I$Sg89mlQ~qUzG&Q z5P=Y(fe)* _Gb(BXkP&pA^#@ >WgHkX}WgsKfsHaIjuNp3>Iz{ohB8z~i%*FzQ>7GBWa z4w%god5f%@h<)I?C&4Gij0*0vdoB^$$fX(VAE}Lvw*Af_@GHMJ( u zg#h)HqqEp-G8?bRJ>K t{XTd=&ui4uZk|suC|<>THGnIIs~GG1ewKHJ-KLK zYBDL00nfmamHv+fv%*0(M>}rnqLlcEYd3Jtg{_;d9w0)_n>nU9mBuD8O(abL;NdtB zLwJBAy*l#KV54|$kKj_84?H~4rjOv71T;;P@`ZTV^>!5_1h>!b)C-x>vxgsuox}aP zxi9CNzuBYT%c~sv?-NxsgWm_JEtc6ku%pb~Ua@Su&peq61&Y{%qv?1(cj^}00_s@3 z8)a-F+dZA;oGf2Uq8X+H+#Lmm8G=MxRnlg9ZX_!paU~0k_`urSIIwn`XEs`eCX3n- z8KpLmrLHyh>mGlGS+|UFXGyb_>QUhuuOfc-#es#;+v*{zT|y!osm8*6X=!=i>O!;B z2wI%&^$dhKZam7B&;#HK@p>u5^u?pmdwYjz*ZLwtmc6=xqilUq?% w|`^}MWOU^M;X9{@7ocmC)EKv>qAI)V9x zjmjNFV?!~fuJ;tHuNXx39)&kE6z<0u7^Vrye}3%)y@sui0zVlImpY`kwF458GQ-%d zSo2GPZXISpu Em(|N(Va>(mG*biW@haEHvu2w zg3&o_FC`ot0T)kJ>LP dO1V<+VMT-*;pg!T?7xpIM<8NP} zld>^uGgKEKxk{S>tLn 7u&WVvC)bCria{+=3pQ`gf&K&r+itg(D>LVOtWY?mx2 z$|sC;OwOy#{~C_y0rYS&5T}HOfvI)8K+ frxXAO6DPRic5k_r51IU74VZ^OeQ zR17p?;E)p&{HQ(qPE{kx=ymF*Q %CU?_V1sV%a&k!t;HN4ll~upov32i65xFA@1a>)wA1*` *no_M9NYNRq`m#2yrw*hf1d%Pr)-rM)epAwF zW0{$>H6=ZtgzxU|c5MBF7AC0-b8^aIWB}4>1Qu0O1r$&)vNQGq-T**(LIMU|B1dSE z1vbRi5f$^rTCCOy6PJ#yn8jXea#RnZ^A_gRsP6M>cfD{L>AAf%>f{ho_2ZiaRT%jo z5pw@=+)m8c$nE@aObI?;zD8H@_ZVqxQPB;8FsM7P2j|z5blz}b@mLWU$&sItHQcMH zEr8uMtcSF; f?G(Bw|WMT5l1mReA4sG1Bm+gM$&od@llCvmw4&N^-32aFEejf|7WXkjRD zW>NWhikj4xTRE=tI+&ZQ!<`#!=+hQ0CmCPIUJxdv)_o2Ndf&@lyj#1xI8h_cn#`T* zTj=n;yOSaF-tD4}?{@kS^}V|`p`sZu` &3zgvciEEmAplD7K zIR7$-B*j*kf(aH~_zoZ2`1s^xfS>eItLV?&+BdMPmrT?dx7@-o?LP}3d!D%l8}?n= z!9M%N1{hq?(;dB vZ|I(M5*X^JA@R|&Y znw6EcAoxq!vU7ME>~5!JazBc4-%8*6mHw--ZDN9%vhNPLz}q7wkN<8o1Le0Qd?;Yy z<`Z(72ASmgf#Aw26;!~JK9Aq!ZiBz2&KhfO$tO6vZ@6hH`uxvc;72+;})RkrpRq zm`WO(o(J`MIca$gN|&4!;5D{L-PDwG`$d{3-`o3ZNmJ8Gq(^xx0eWm}wy{7d7%g1- zd#>QsHlGC(lZ(|9+x~7791^=14qw9uC&$D|fB&xc)0f|^7EDu1q7}rFeuXDf24iQ? zH-ccLw3~Vl1vPKORXl=By@Xn~+R+9}wI?-VvJf+>5Mbv4tUa%k`vRwGlg+MR;C0*2 z8aiUuYW)$lt=s5a?x$w>&v)oQL<5qhwhk4Z0vKVqnjE(Bx-dsRR5(XIs99N4?iu*k zeE(i@c}^`H1qQCG!NNs+I|gkpslpEz0hz-~+7Xaya7z=wG|IB7*PadJtitFJ+HuGL z02(-mI{KjosIZUo#R(4&Gka@``TY5_h=v6m10%C1Nn*oO8ml2>vjO$iSup<4(6DjM ztQ* JQ}7%=f1FZvs>PR~#{VhK$wk4gRKG<(lpglaSSx zCIUPb+CnbBH{YRVhsUgUPy8T4V*Ii!bBVMf!`GOf%vI|RC(UQk!bXn^^0pkOZXKIN zGbL^1XuUx}+6~r1j>)O{MhgZF${x4jobl1Pvo2-IY=+uTjx z-7Ld!etXu+39eYHN;n{hVeC+!HVWB%hq_ a>~yYFu7j*m}+VejvgqQw#?1sOFTcV?tXdOlunJQ=R)0ZUx4@Xw-kkIAX2Yj?cI zAP|DAm9DlIOikC55CLK4ydzEtOP}kMP_fkSGccn~qhN=?f=qyS%rGE FHohYkG60YzsCZ I z_uvs^^s2Pr$L(wAp9W4`UbcosKrnTah*%AmN>0%fVM|`8D--ea3z?w2DS~S4s8kg+ zUvp%s{)~z&s^CUdP+0hd5EHSi%)9e(&@24w-d_4yK#fjH5Xk?fLPlQ4`r)>ts1X%X zf&H%*(<&h|vj!5l!nNu~q$2JHCdK+5LF}d+X?^|5=Z~jbqpr{jEo93M^+mX+ZX(jC zmOpgoo2}R>*buxd+iwpQclL@E1T!1d^Q|zxgY<0*xjO`npi;lfe2}G?V^a26D*JpZ z7Q{D}T5NVZ*mwmwY$HgC`&*H9EaO!8wufJgJ(XFT99Q!AOd%9A0_Nn>`KX$&SY4xj z3y+6_ou*}}62&1Gb Nv|D`0j{ir%a8O-QDOI?`fTZ4>@stG!qn7Dud{*np`SOV*U+dC)l zT3X&Mr2t-DoD*vy9)Zx_UXzqdO{rijCPlUEuj9l?*S@W}$*U*y$cL0n6j;*exe{B` zRp%zp2Nt~aFf`Pki#bm6MuSt7T^gFrRj+QY0^I~Wj%5+7BO<2fXCs%F>D1LXkvMb& zSP!gt A1e7Wo 6oM;OK|466@fg?@fOmZM@PsHlW>;NhZudSfl*VG+k# z+Wj*sqDHU3O#~w&v#92SMg0qLfLMvRl@>x|WK?|JH@Mo`>(X*lnkE<0_nR_g9`k9V zc_cxBAID#P^a33V`2^ 7~4$oAUZ&>vTY0pbC >Gq&d6&kuO zFjm^}*n-C-qty2bC+qc+jjj>$*T3I0uUnXcf^snUlKMbKE+>LHb7|*a99n*3=Y(y% zW`I&L D7IAoLwl0k{Wif`5&jYIw(`N_@WTRnl<7%ajviRVA~M?d#N$SV8E&)a zz$<}RO+_p3;?0@NIuI> (aQGZP~Z1r0+;+XXoE9_ArRzbUt z=FqeI9T=>Iny9L5n9JEW|88#RoYzed#vr=Cxw(0Lz-n CBe3wK43-sxtI!uFr0*t9ENp(P5_|tD4Ji zEs{)uO1!HgT&(IZfJ1gZQAIQKIdEU#vAOJ6)8+r6t6ANZ#-t>#64m*3DMZBQqq+de zEp56@q=A8y(#jMrhR`H_kL-}L734^und*Z^BeIQpLPYtAm3pzlrnsd~Vo!*GxkOka znDMRl@#)3%EcITy)ffM!8hiIn2cOtU=;e2%=jk{c JI>Q MlaZM;?R;LB}%Cc6()r4A)uku3- zxmB&LyrpGjQc{CRpiUIAjJyR)k>VkbUZwNL<8)M zecxk|c vn~2s#c3x1B`;%J^x@dM~nt-uFvaGT{KtMMj3Fh3)v!EDKY@UQ~0% z3E|HNr~#vNB>~SnTgyaO-1?p`i;9mk!oKLj??<^SSQ6~|OZfh2#@^4n>I-@T{IpKK zuuBTLFHIAK8iG7F0*-bd^`L>_U$w? X|4V(vi4$unErbIa)osBxbofSist4jMycQxs&PmWWDQ01%77`?C0zbD9$D z29MwKu9uG|d!}34N}`X>Y=wMbaH}lAy_i_YxS+$&E{=v_y1cs4a(at@3E>5W(#m`9 zFCIJj2%wPpc{H>eX-_TE*lZp+UPnC|n@3kyPqji%b6`>tJr##UCvKCwTeM%(<~b2X zj7VC24Fw+!#(!Bep9$IQM`YZZQWcfdrjzk0LFW&{^Oa6)h!v$~y4>Xsv!9=PgB*Dk zA>37_+Bqt45^W+dFf?F#lBk}k`iro}?$Oi1VIz6-7Nz-nntx4snTif?8vvl9t{%Dg z@Nf-2f-q*|%5rs2Zf9qN8qdZjzud2Xq8YLe_mC4N#3u52v*+ed>Qp&gl%GdM7pFD6 zJw2Jl6wmSw3`hpQvz*q;L1U|B@AJQ7#`&Q^s#6+mFs&vHRJ#%{WJyBA#c{ThP`TS& zHf&{V%JO%}A@+ca>LJQMi~DX*H@BVs5myG+5Vwx?TE97Mo2<$73EcwdkF>gZ>3dz- zd#5jtO9-zPp#h%YanHZgdRMgnX*EcANXP2@QnEJqsmv+kTzu+F9MP;~TNg!Y&2FDr zI}AfpHRrND?-_?X^`*5+e2$OsKiphg8+9X9_(J4Ya7Vrv3& fE7lP`6f+`a>eMdYOLl!Z1o%VX@e-o*!%bzb#?l~h@# z=fNMp8Bf1)c-`hG7Y1ckR1A1 iHyPo?3LQUxcf@-tJcHmu_4~R`;X?|zIQ>bSo=}5&uucWKz$>+uN zHns6_@OCP8ftZVc!4sTA9Ip~Sq@0tkDl%}TeYgr@^O043A63kpKS=zl#xCgX?QOcT zifyaD2N{CrKQosh({v6V@DLDW3_4kISLqcJxQ_uJTILJ5Zqoth{Wc5n?XE90L_A); zv!ySgE!w_M^2%f^G`dB~+*)Ny1l2_zRqGvN)+{I3m7oD83u@qEYkMXki(yxR;|mYKXw+Y2)~ff6sd9W_)=kJ zcdCv3F*(5_dTVW3^ys)7wZoBaejVWM3gryK_sF(YbP(JG1PH@7ViK~PuM7_%pqZV_ z4rn(RliYDO2(NqMT@c@N*&N2q86yZ88eZMs1|_q_i)_WG{G`q&?=8=-DJoKg+d$ze zl8UM{;!eGnhKXSyoLOEUhsPBM>fF67tV46k8Kq#=?zMPaE=R+S{Pw8aA&Qb4iGhiT z-B=tMEd`e3z6y}My@oKTh1;K>KSf#FIOP5{pdX{4CW*DoQQ4A*w?E%zH=)#gj}Kp9 z E%Z(BzPQr-QXFC@_CqmETK_qU+tActJB6 zrG D_R`0N@ zn+GW$AEaOyX!ViQvgGDOl(a mqRdA$`VVsC zJ3bLH(^ve+-U3QwugI3DWkcU(M;z4q>;y|JRMQ^7zWTlWH5-DI*=>rb$d--1Qm=Gd z4giDrrW)qMWE6FNsg+EcOv^WaP ztuy)w1wFsE%)8HCK4AF0L!gt%1DNdglxT78bx1FtnQ`NaVSILRq2|y80|Ud5xpTsf zJG8b}>7YHz<>BF3(AH#VA(o_+iDR_KuoniOFDfcylo) jyb1n_zoeH@-iI< z2jlvC6mwu>bJ`Mc08GkbT03+M#742K)U8FqADdl}NzHvbs&Toxx|Ur#y#PVRf}*aM zkGG?M{>6zi4d*dqcCQ;`bWtgUdpn&rQ4j^Uud?v_-!^hvTU${LMdsqdu2%n-L;q^M zdJO-rE{3tt=-5<_ej6KPjj7$7O`-Yug*eioV$=!^xf}K)7QISVO%08xF&*CJzb2d> z7wf@bp=Dw6`u@KjGH|aJ4Ot4aYkI2bvQ?VO%B)nh1LDvn!p|kSWqd-#v2XR@jjGw4 zG1s5B`NT83=TGv>fF+M{`Cmh3=m9u29S>aL4%WV0jee7^_CdWS%nS_WPA^oI8-Gqc z$*9@PVSfY9oJ#E)9zVnvWixPVq+GbUWXdak8^r>lWT0t(7BX|c-q(#gz~ d4!@j0{5J-; z(w#bn1Mt;fAE&f!V^>#3_)7aJXFsdgw`_<(OY&?3Q5*XQBr8CW;uQx=r`a69;dlGZ z7A1=_ua83I=~afYRqlnwg^C1`3(HaIKWnRr17$LD3g5sSN6IQ>Y!oP4FArL^4r5aH z0SbJSqraYCz?Z#GQ7f3UGed(CCjXu}%Y{0DS5?*Dvrj!EBMLML+nF<#WytVF_iv?( zYx6$(r?3DIw7J|6Aq?H?VghWhs|Zbqs>ob^Tk1xUlHhXlWMOl2f8PtayHr$KQx_fZ z{5+=`WgIUN;Mz>phe3RnzuK l}eO)m34h}?mwW fNWr)L{{YGYK@O7!YUV5xBzJKEhOkLz6g1{8y{GhUZfSa2eRcdib zerKTp9R38cj+1iks8GH2jPJRUl7x#5emO(=cQ)HLb}u6*(rRp+%(bkQr`b(9d}J|k zarFlXfFvVTn3P^p>;I1cHUhqER`R(Q!;;&rBxhQ*C{NhsSwPc*X`nh=Ps2)h1dSt; z<_S&1z#ytW)T@7JD6g%}@%4(T$j?~h)2gD|W_%b`=-%F*L;SS{pNdi^uTc|iji4(S zc(b7#TiacOz9Gmy*D5Xm6qKyvprWQKt;~ApC|(y_uXS@NKTT!|nS_861#Gxn+Q+YC zH5UyHSU?utz{h242rHjg0@CD#`<|ZmCCWm6cD@Pt50KvLDPuPkXY}LUv_3GIL{>>b zZ15( F=gU!E9+|-Fl^K`Q&?20Lc@wN%QT0oKWLddlWqmzndb%_XYHF=}rvByJ z*Z7C=;$o>3Rbdt`LxZV;f v(s)(_Tbd$m^H#<=sr5a5R6v0X2Lo~3)v^6&VlQ|n} z)9bU5pw|WT9~uT`wP~rozdv^3K2U2uPSSqG{7(Nts5NW(^z>9pVB`8XB*|L@c}n1M z1@HxvuqfEqsT({4oW#P>%)U`0z}1qOaBj8X@pnz`wrBEliF~H; G|<(j*ef`0YVY= _!HY(M^eb-wA{ Ug?SumjHNC3K{$}S@T+=)IuJ(n7^x7l8C2RtcuJPfw; zxL+15 cHHG%|^HsO{E_+gw+b0%sU1XIjA~))r!YOhn z{5%X3&xVm!?^@+SGwn2#9uN+Tu)7KHptLZlv%Pw|wFBjKl*6 Hs>OU9)aojQo`i5O5`KPjkb8U`o@_`>^yL|+b>2K9930#>Y4?W# zr>&f@vj6kblNcY0b(Q(A@A^Ymp7 +9>QIxVN#QMIt)2-RP}k>-7XTrfB><>YQ9>bb<>T}MTyXfY{K z`^G;r&8QTb*|Q)d3on-s097(&1TQ5$RBy84d!-)_{okx$sV)MqCL^K`tu~v!IyIr? zE{BYQB;p$7K+Hycg@un3oSYnX1=&U)QYuQzIyG2&<`IwG3ga7I(^w9A*48jbMsC#~ zxDd1Co>;x#n`mOB7F3Oz9jWy>2sD)J1wL2I rpw~@(3~5= zc(njZXTX?;YmX6b!6@j+;+~#qigq$3J(U&S+Ud2hiTS5jJ4s2ZeQOQ*`1;ny&Y!)X z;FkY7a<;Yk%-<((jM&i&Fu^J^S6PCEI0OVXf2&-A{roz=3y-`r>Cg6(k&%gPz+|ka z!(UzBN&N>~XVrf2CyzKN?J3X;e#OEIL_J$HwzmF4>hJcW6OFRmuGZv@0c(qHsIiYC z36Px7t7^!>%lpA?IrzUUfM_E>_+hK9CIuTfp}bny4gh>x77oQJJTtlQPU1gMsDQ?h zj*qb2PpqV*xpb{`>>q?{`1db9!haUzIWP8-;ji?!Zr 6twmuRT0=xY?H@gfWCC*67LhsX| z1oar9vIZ?8F_)>V9+N`MO7guqf@|v2SA7Ha8jKH0EtLk@`Or^qelRUw^zv|z2k;gy zy5$5TscFKgN=A-Z-B(WtJ3BkovwwAMrx%RI+QOwYoIDmri p}Sw2c`j$Wx&-u`z&(F6c`NoXfsrx;(iUnkl56 zFU|b**Vy-|m6i+y{;#i0w}>)1-CpY2 5K1zV~Z z0c;Y2U{*me>?|&8uu@4cZA2`k#f%tLzw};u35i lfjU z@^Mw%i6QRp2O|HMn_LxriVxhUH;YvLVjF%GbZ#yC^#+nDfv3;^L!Ob?^n5^K@PUwv z3WUT$Ku${f^7U(Y2}yuNQEK-ecWlRM78!*|t!$@JMh05Ahl5W=Gyma*D`qL@a%$;7 zS7mFNU%DD~bJ}A+*jdTZrUY-p%Fajk`DU-_m^ffnE%$$FfxTc_ulvlPJ{-IbN2bL2 z%sXG+{e7=?L^)OEyDR5wQtpQ91n)l+@;Cqe`=imX%$upvLR?II8+63JS!VavrV&4j zx5C@{tT=J3yzt1&c8~Fm-N$*I=f44kmx0Vd=0?Z19J2w%<2MSjq^ha_1tq0MwyVvS zwarCfTpTVAi_BnCRpvLIZ@>BosjW-xdVo^~G4Mi$IWlq?C8u%n(Oug=lS{bMv)|;pR%Y*UQVrCwop{Y zIB-KWz$OYA (Z#|wr9avFYq+{SxM{@LM=i^RI0GJ{NN7pFIG6;)Nl|5ZG2wADuE zhnLu1c>l9_YIlIX2`H%SP!P1&3z1jp5fMRvu*&~A#Ehvm{hRF|PA}Dre{R+e4g-y^ z6{Xd+^-HZ%A=^D7KwvTDcX}NQ#ziOJ%A{;~hbm?|hOX*d!6<(|kI0YpM4GIL3UNSl zD+ss#mk$nUq#D8-rBuW6rjs6wcG{RW^Vo_r^OoO-*@D^Prdh(*$2rcCU%sB)VA;%< z{VPOkhw&Waj-N8lUkttPnbmdicbqy5B{dq6r0}NVexYblMn@m }lEWa4$r$n*0n(h}=8JK3Gk29yvxQvYFYeGaF z$u5r9-GQ|0xPTYIehKOARx1*%&W4)(Lw0T3KDRbY*&aR`8oB%6B`5aRLpnP|*vfHj zKKd`@Wf&V9LqdnMb2#J_0&abc^G-vLNB0G$Zs3PF1O>kizxae&?Ucc9hKpBDh)wdW zZ`*lfDfE4RH|t=X^*LC6MWPHr2)wG; G@ z3 UAD{n!H-GTh#x}0k^*Zr9&vUMG_G!xsx7&6aRwm)Dt_SYB)euI= z*0__erIr>Izpva2Di6wpBKb#ziVheodOP6kE4GoU1`*7 d#3=cCd;5sikEt*A$HGMbsk82&3(=z1By)s;3**GbHJ>o zg&-3Qqlx$W =bt1vG3jDd&dw*uU2;WjAv7* zB+IoexLc~5cIjhz 5NyjlMO$YE8ce z97dNOY!LlwN^>>HP}?{(DoT9>Pip(TH^zI!Y9NSAr+<9fVi=@DpsMQj@+{$#2RRyc z?0a5%dbL+=8CaK~7GtF3WDlLp#EH Zv#clW zU0Jl45;Rp6yV~9Xw9s7Uad39jvXs(Kyfy$5JqK1*t?_bC&&ncvI95DS(U>3{&ovc? z9A%;HcBmbn+qW-Dn$B@xEazQ?TdzgC()r^*lHENBdr@;$@TI||cjCt8$EeBodq;vf zjc!{>)E6QjHJf*+J{j*7dy3kRsDm>xiHk|<8-QSwswB*b&tD6VFh935a9;CR`^Y8D zy!M^j1i==x4>m>#OlGQ#GaNzKL#K8fOY_g@Ex##W2>tA2&VpCUrL)&R%Sql!SD6&j z?}-cyAFvyaF`#>!HP#ry&k*HuLe!DsR(OFtlqUi;Oh(hA!%~8 Z9uDA zYj%~