From 8a343fc6b1664671ed4dedd66cea818d3a68b7d6 Mon Sep 17 00:00:00 2001 From: amalhub Date: Wed, 4 Oct 2017 15:49:37 +0530 Subject: [PATCH 01/32] App-mgt store device validation for install --- .../impl/SubscriptionManagementAPIImpl.java | 8 +++---- .../core/impl/SubscriptionManagerImpl.java | 21 ++++++------------- 2 files changed, 10 insertions(+), 19 deletions(-) diff --git a/components/application-mgt/org.wso2.carbon.device.application.mgt.api/src/main/java/org/wso2/carbon/device/application/mgt/api/services/impl/SubscriptionManagementAPIImpl.java b/components/application-mgt/org.wso2.carbon.device.application.mgt.api/src/main/java/org/wso2/carbon/device/application/mgt/api/services/impl/SubscriptionManagementAPIImpl.java index cf0de355b5..20effa969a 100644 --- a/components/application-mgt/org.wso2.carbon.device.application.mgt.api/src/main/java/org/wso2/carbon/device/application/mgt/api/services/impl/SubscriptionManagementAPIImpl.java +++ b/components/application-mgt/org.wso2.carbon.device.application.mgt.api/src/main/java/org/wso2/carbon/device/application/mgt/api/services/impl/SubscriptionManagementAPIImpl.java @@ -52,17 +52,17 @@ public class SubscriptionManagementAPIImpl implements SubscriptionManagementAPI{ Object result; SubscriptionManager subscriptionManager = APIUtil.getSubscriptionManager(); try { - String applicationUUTD = installationDetails.getApplicationUUID(); + String applicationUUID = installationDetails.getApplicationUUID(); String versionName = installationDetails.getVersionName(); if (!installationDetails.getDeviceIdentifiers().isEmpty()) { List deviceList = installationDetails.getDeviceIdentifiers(); - result = subscriptionManager.installApplicationForDevices(applicationUUTD, versionName, deviceList); + result = subscriptionManager.installApplicationForDevices(applicationUUID, versionName, deviceList); } else if (!installationDetails.getUserNameList().isEmpty()) { List userList = installationDetails.getUserNameList(); - result = subscriptionManager.installApplicationForUsers(applicationUUTD, userList); + result = subscriptionManager.installApplicationForUsers(applicationUUID, userList); } else if (!installationDetails.getRoleNameList().isEmpty()) { List roleList = installationDetails.getRoleNameList(); - result = subscriptionManager.installApplicationForRoles(applicationUUTD, roleList); + result = subscriptionManager.installApplicationForRoles(applicationUUID, roleList); } else { result = "Missing request data!"; return Response.status(Response.Status.BAD_REQUEST).entity(result).build(); diff --git a/components/application-mgt/org.wso2.carbon.device.application.mgt.core/src/main/java/org/wso2/carbon/device/application/mgt/core/impl/SubscriptionManagerImpl.java b/components/application-mgt/org.wso2.carbon.device.application.mgt.core/src/main/java/org/wso2/carbon/device/application/mgt/core/impl/SubscriptionManagerImpl.java index 6fc19346fd..3667e0953d 100644 --- a/components/application-mgt/org.wso2.carbon.device.application.mgt.core/src/main/java/org/wso2/carbon/device/application/mgt/core/impl/SubscriptionManagerImpl.java +++ b/components/application-mgt/org.wso2.carbon.device.application.mgt.core/src/main/java/org/wso2/carbon/device/application/mgt/core/impl/SubscriptionManagerImpl.java @@ -19,7 +19,6 @@ package org.wso2.carbon.device.application.mgt.core.impl; import org.apache.commons.logging.Log; import org.apache.commons.logging.LogFactory; -import org.wso2.carbon.context.PrivilegedCarbonContext; import org.wso2.carbon.device.application.mgt.common.DeviceIdentifier; import org.wso2.carbon.device.application.mgt.common.exception.ApplicationManagementException; import org.wso2.carbon.device.application.mgt.common.services.SubscriptionManager; @@ -41,7 +40,6 @@ import org.wso2.carbon.device.mgt.core.service.DeviceManagementProviderService; import java.sql.SQLException; import java.util.ArrayList; import java.util.List; -import java.util.Map; /** * This is the default implementation for the Subscription Manager. @@ -63,13 +61,9 @@ public class SubscriptionManagerImpl implements SubscriptionManager { org.wso2.carbon.device.mgt.common.DeviceIdentifier deviceIdentifier = new org.wso2.carbon.device.mgt .common.DeviceIdentifier(device.getId(), device.getType()); try { - DeviceManagementDAOFactory.openConnection(); - // todo: replace this with boolean:deviceExsits(deviceId) operation - Map currentDevices = DeviceManagementDAOFactory.getDeviceDAO().getDevice(deviceIdentifier); - DeviceManagementDAOFactory.closeConnection(); - - if (currentDevices.isEmpty()) { - log.error("Device with ID: " + device.getId() + " not found to install the application."); + DeviceManagementProviderService dmpService = DataHolder.getInstance().getDeviceManagementService(); + if (!dmpService.isEnrolled(deviceIdentifier)) { + log.error("Device with ID: " + device.getId() + " is not enrolled to install the application."); } else { if (log.isDebugEnabled()) { log.debug("Installing application to : " + device.getId()); @@ -96,10 +90,8 @@ public class SubscriptionManagerImpl implements SubscriptionManager { // DAOFactory.getSubscriptionDAO().addDeviceApplicationMapping(device.getId(), applicationUUID, false); failedDeviceList.remove(device); } - } catch (DeviceManagementException | DeviceManagementDAOException | OperationManagementException | InvalidDeviceException | SQLException e) { + } catch (DeviceManagementException | OperationManagementException | InvalidDeviceException e) { throw new ApplicationManagementException("Failed to install application " + applicationUUID + " on device " + deviceIdentifier, e); - } finally { - DeviceManagementDAOFactory.closeConnection(); } } return failedDeviceList; @@ -110,15 +102,14 @@ public class SubscriptionManagerImpl implements SubscriptionManager { throws ApplicationManagementException { log.info("Install application: " + applicationUUID + " to: " + userList.size() + " users."); List deviceList = new ArrayList<>(); - int tenantId = PrivilegedCarbonContext.getThreadLocalCarbonContext().getTenantId(); for (String user : userList) { try { - List devicesOfUser = DeviceManagementDAOFactory.getDeviceDAO().getDevicesOfUser(user, tenantId); + List devicesOfUser = DataHolder.getInstance().getDeviceManagementService().getDevicesOfUser(user); for (Device device : devicesOfUser) { deviceList.add(new DeviceIdentifier(device .getDeviceIdentifier(), device.getType())); } - } catch (DeviceManagementDAOException e) { + } catch (DeviceManagementException e) { log.error("Error when extracting the device list from user[" + user + "].", e); } } From 5c23d42de163f45386c6fc62a181e29c541acc8b Mon Sep 17 00:00:00 2001 From: megala21 Date: Thu, 5 Oct 2017 11:33:02 +0530 Subject: [PATCH 02/32] Adding icon support for platform --- .../device/application/mgt/api/APIUtil.java | 34 +++- .../api/services/PlatformManagementAPI.java | 30 ++-- .../impl/ApplicationManagementAPIImpl.java | 38 +++- .../impl/PlatformManagementAPIImpl.java | 52 +++++- .../impl/SubscriptionManagementAPIImpl.java | 8 +- .../application/mgt/common/Platform.java | 6 + ...ApplicationStorageManagementException.java | 2 +- .../PlatformStorageManagementException.java | 33 ++++ .../ResourceManagementException.java | 33 ++++ .../services/ApplicationStorageManager.java | 7 +- .../services/PlatformStorageManager.java | 56 ++++++ .../pom.xml | 3 +- .../mgt/core/config/Extension.java | 3 +- .../impl/ApplicationStorageManagerImpl.java | 90 ++-------- .../core/impl/PlatformStorageManagerImpl.java | 166 ++++++++++++++++++ .../core/impl/SubscriptionManagerImpl.java | 21 ++- .../mgt/core/internal/DataHolder.java | 16 +- .../mgt/core/internal/ServiceComponent.java | 15 +- .../core/util/ApplicationManagementUtil.java | 18 +- .../mgt/core/util/StorageManagementUtil.java | 86 +++++++++ .../main/resources/conf/application-mgt.xml | 9 +- 21 files changed, 570 insertions(+), 156 deletions(-) create mode 100644 components/application-mgt/org.wso2.carbon.device.application.mgt.common/src/main/java/org/wso2/carbon/device/application/mgt/common/exception/PlatformStorageManagementException.java create mode 100644 components/application-mgt/org.wso2.carbon.device.application.mgt.common/src/main/java/org/wso2/carbon/device/application/mgt/common/exception/ResourceManagementException.java create mode 100644 components/application-mgt/org.wso2.carbon.device.application.mgt.common/src/main/java/org/wso2/carbon/device/application/mgt/common/services/PlatformStorageManager.java create mode 100644 components/application-mgt/org.wso2.carbon.device.application.mgt.core/src/main/java/org/wso2/carbon/device/application/mgt/core/impl/PlatformStorageManagerImpl.java create mode 100644 components/application-mgt/org.wso2.carbon.device.application.mgt.core/src/main/java/org/wso2/carbon/device/application/mgt/core/util/StorageManagementUtil.java diff --git a/components/application-mgt/org.wso2.carbon.device.application.mgt.api/src/main/java/org/wso2/carbon/device/application/mgt/api/APIUtil.java b/components/application-mgt/org.wso2.carbon.device.application.mgt.api/src/main/java/org/wso2/carbon/device/application/mgt/api/APIUtil.java index a9d65a947b..97b9db0be3 100644 --- a/components/application-mgt/org.wso2.carbon.device.application.mgt.api/src/main/java/org/wso2/carbon/device/application/mgt/api/APIUtil.java +++ b/components/application-mgt/org.wso2.carbon.device.application.mgt.api/src/main/java/org/wso2/carbon/device/application/mgt/api/APIUtil.java @@ -23,12 +23,7 @@ import org.apache.commons.logging.LogFactory; import org.wso2.carbon.context.PrivilegedCarbonContext; import org.wso2.carbon.device.application.mgt.api.beans.ErrorResponse; import org.wso2.carbon.device.application.mgt.common.exception.ApplicationManagementException; -import org.wso2.carbon.device.application.mgt.common.services.ApplicationManager; -import org.wso2.carbon.device.application.mgt.common.services.ApplicationReleaseManager; -import org.wso2.carbon.device.application.mgt.common.services.ApplicationStorageManager; -import org.wso2.carbon.device.application.mgt.common.services.LifecycleStateManager; -import org.wso2.carbon.device.application.mgt.common.services.PlatformManager; -import org.wso2.carbon.device.application.mgt.common.services.SubscriptionManager; +import org.wso2.carbon.device.application.mgt.common.services.*; import org.wso2.carbon.device.mgt.core.service.DeviceManagementProviderService; import javax.ws.rs.core.Response; @@ -47,6 +42,7 @@ public class APIUtil { private static ApplicationReleaseManager applicationReleaseManager; private static ApplicationStorageManager applicationStorageManager; private static SubscriptionManager subscriptionManager; + private static PlatformStorageManager platformStorageManager; public static ApplicationManager getApplicationManager() { if (applicationManager == null) { @@ -147,7 +143,31 @@ public class APIUtil { } return applicationStorageManager; } - public static Response getResponse(ApplicationManagementException ex, Response.Status status) { + + /** + * To get the Platform Storage Manager from the osgi context. + * + * @return PlatformStoreManager instance in the current osgi context. + */ + public static PlatformStorageManager getPlatformStorageManager() { + if (platformStorageManager == null) { + synchronized (APIUtil.class) { + if (platformStorageManager == null) { + PrivilegedCarbonContext ctx = PrivilegedCarbonContext.getThreadLocalCarbonContext(); + platformStorageManager = (PlatformStorageManager) ctx + .getOSGiService(PlatformStorageManager.class, null); + if (platformStorageManager == null) { + String msg = "Platform Storage Manager service has not initialized."; + log.error(msg); + throw new IllegalStateException(msg); + } + } + } + } + return platformStorageManager; + } + + public static Response getResponse(Exception ex, Response.Status status) { return getResponse(ex.getMessage(), status); } diff --git a/components/application-mgt/org.wso2.carbon.device.application.mgt.api/src/main/java/org/wso2/carbon/device/application/mgt/api/services/PlatformManagementAPI.java b/components/application-mgt/org.wso2.carbon.device.application.mgt.api/src/main/java/org/wso2/carbon/device/application/mgt/api/services/PlatformManagementAPI.java index 8dd3da5e4a..f60e7199f1 100644 --- a/components/application-mgt/org.wso2.carbon.device.application.mgt.api/src/main/java/org/wso2/carbon/device/application/mgt/api/services/PlatformManagementAPI.java +++ b/components/application-mgt/org.wso2.carbon.device.application.mgt.api/src/main/java/org/wso2/carbon/device/application/mgt/api/services/PlatformManagementAPI.java @@ -28,8 +28,11 @@ import io.swagger.annotations.ExtensionProperty; import io.swagger.annotations.Info; import io.swagger.annotations.SwaggerDefinition; import io.swagger.annotations.Tag; +import org.apache.cxf.jaxrs.ext.multipart.Attachment; +import org.apache.cxf.jaxrs.ext.multipart.Multipart; import org.wso2.carbon.apimgt.annotations.api.Scopes; import org.wso2.carbon.device.application.mgt.api.beans.ErrorResponse; +import org.wso2.carbon.device.application.mgt.common.ApplicationRelease; import org.wso2.carbon.device.application.mgt.common.Platform; import javax.validation.constraints.Size; @@ -96,7 +99,6 @@ import javax.ws.rs.core.Response; "such as get all the available platform for a tenant, etc.") @Path("/platforms") @Produces(MediaType.APPLICATION_JSON) -@Consumes(MediaType.APPLICATION_JSON) public interface PlatformManagementAPI { String SCOPE = "scope"; @@ -181,9 +183,9 @@ public interface PlatformManagementAPI { @POST @Produces(MediaType.APPLICATION_JSON) - @Consumes(MediaType.APPLICATION_JSON) + @Consumes(MediaType.MULTIPART_FORM_DATA) @ApiOperation( - consumes = MediaType.APPLICATION_JSON, + consumes = MediaType.MULTIPART_FORM_DATA, produces = MediaType.APPLICATION_JSON, httpMethod = "POST", value = "Add Platform", @@ -209,19 +211,16 @@ public interface PlatformManagementAPI { response = ErrorResponse.class) }) Response addPlatform( - @ApiParam( - name = "platform", - value = "The payload of the platform", - required = true) - Platform platform + @Multipart(value = "Platform", type = "application/json" ) Platform platform, + @Multipart(value = "icon", required = true) Attachment iconFile ); @PUT @Path("/{identifier}") @Produces(MediaType.APPLICATION_JSON) - @Consumes(MediaType.APPLICATION_JSON) + @Consumes(MediaType.MULTIPART_FORM_DATA) @ApiOperation( - consumes = MediaType.APPLICATION_JSON, + consumes = MediaType.MULTIPART_FORM_DATA, produces = MediaType.APPLICATION_JSON, httpMethod = "PUT", value = "Update Platform", @@ -247,11 +246,8 @@ public interface PlatformManagementAPI { response = ErrorResponse.class) }) Response updatePlatform( - @ApiParam( - name = "platform", - value = "The payload of the platform", - required = true) - Platform platform, + @Multipart(value = "Platform", type = "application/json" ) Platform platform, + @Multipart(value = "icon", required = false) Attachment iconFile, @ApiParam( name = "identifier", required = true) @@ -343,7 +339,7 @@ public interface PlatformManagementAPI { ); @GET - @Path("tags") + @Path("tags/{name}") @Produces(MediaType.APPLICATION_JSON) @Consumes(MediaType.APPLICATION_JSON) @ApiOperation( @@ -374,6 +370,6 @@ public interface PlatformManagementAPI { Response getPlatformTags( @ApiParam(name = "name", value ="The initial part of the name of platform tags that we need to retrieve", required = true) - @QueryParam("name") @Size(min = 3) String name + @PathParam("name") @Size(min = 3) String name ); } diff --git a/components/application-mgt/org.wso2.carbon.device.application.mgt.api/src/main/java/org/wso2/carbon/device/application/mgt/api/services/impl/ApplicationManagementAPIImpl.java b/components/application-mgt/org.wso2.carbon.device.application.mgt.api/src/main/java/org/wso2/carbon/device/application/mgt/api/services/impl/ApplicationManagementAPIImpl.java index 03633f65b6..2043014fc0 100644 --- a/components/application-mgt/org.wso2.carbon.device.application.mgt.api/src/main/java/org/wso2/carbon/device/application/mgt/api/services/impl/ApplicationManagementAPIImpl.java +++ b/components/application-mgt/org.wso2.carbon.device.application.mgt.api/src/main/java/org/wso2/carbon/device/application/mgt/api/services/impl/ApplicationManagementAPIImpl.java @@ -32,6 +32,7 @@ import org.wso2.carbon.device.application.mgt.common.Filter; import org.wso2.carbon.device.application.mgt.common.ImageArtifact; import org.wso2.carbon.device.application.mgt.common.exception.ApplicationManagementException; import org.wso2.carbon.device.application.mgt.common.exception.ApplicationStorageManagementException; +import org.wso2.carbon.device.application.mgt.common.exception.ResourceManagementException; import org.wso2.carbon.device.application.mgt.common.services.ApplicationManager; import org.wso2.carbon.device.application.mgt.common.services.ApplicationReleaseManager; import org.wso2.carbon.device.application.mgt.common.services.ApplicationStorageManager; @@ -97,6 +98,9 @@ public class ApplicationManagementAPIImpl implements ApplicationManagementAPI { String msg = "Error occurred while getting the application list"; log.error(msg, e); return Response.status(Response.Status.BAD_REQUEST).build(); + } catch (ApplicationStorageManagementException e) { + log.error("Error occurred while getting the image artifacts of the application", e); + return APIUtil.getResponse(e, Response.Status.INTERNAL_SERVER_ERROR); } } @@ -132,6 +136,9 @@ public class ApplicationManagementAPIImpl implements ApplicationManagementAPI { } catch (ApplicationManagementException e) { log.error("Error occurred while getting application with the uuid " + uuid, e); return APIUtil.getResponse(e, Response.Status.INTERNAL_SERVER_ERROR); + } catch (ApplicationStorageManagementException e) { + log.error("Error occurred while getting the image artifacts of the application with the uuid " + uuid, e); + return APIUtil.getResponse(e, Response.Status.INTERNAL_SERVER_ERROR); } } @@ -252,6 +259,10 @@ public class ApplicationManagementAPIImpl implements ApplicationManagementAPI { return APIUtil.getResponse(new ApplicationManagementException( "Exception while trying to read icon, " + "banner files for the application " + applicationUUID, e), Response.Status.BAD_REQUEST); + } catch (ResourceManagementException e) { + log.error("Error occurred while uploading the image artifacts of the application with the uuid " + + applicationUUID, e); + return APIUtil.getResponse(e, Response.Status.INTERNAL_SERVER_ERROR); } } @@ -259,8 +270,8 @@ public class ApplicationManagementAPIImpl implements ApplicationManagementAPI { @PUT @Path("/upload-image-artifacts/{uuid}") public Response updateApplicationArtifacts(@PathParam("uuid") String applicationUUID, - @Multipart("icon") Attachment iconFile, @Multipart("banner") Attachment bannerFile, @Multipart - ("screenshot") List attachmentList) { + @Multipart("icon") Attachment iconFile, @Multipart("banner") Attachment bannerFile, + @Multipart("screenshot") List attachmentList) { ApplicationStorageManager applicationStorageManager = APIUtil.getApplicationStorageManager(); try { InputStream iconFileStream = null; @@ -282,15 +293,15 @@ public class ApplicationManagementAPIImpl implements ApplicationManagementAPI { .uploadImageArtifacts(applicationUUID, iconFileStream, bannerFileStream, attachments); return Response.status(Response.Status.OK) .entity("Successfully updated artifacts for the application " + applicationUUID).build(); - } catch (ApplicationManagementException e) { - String msg = "Error occurred while updating the artifact for the application " + applicationUUID; - log.error(msg, e); - return APIUtil.getResponse(e, Response.Status.BAD_REQUEST); } catch (IOException e) { log.error("Exception while trying to read icon, banner files for the application " + applicationUUID); return APIUtil.getResponse(new ApplicationManagementException( "Exception while trying to read icon, banner files for the application " + applicationUUID, e), Response.Status.BAD_REQUEST); + } catch (ResourceManagementException e) { + log.error("Error occurred while uploading the image artifacts of the application with the uuid " + + applicationUUID, e); + return APIUtil.getResponse(e, Response.Status.INTERNAL_SERVER_ERROR); } } @@ -328,6 +339,9 @@ public class ApplicationManagementAPIImpl implements ApplicationManagementAPI { String msg = "Error occurred while deleting the application: " + uuid; log.error(msg, e); return APIUtil.getResponse(e, Response.Status.INTERNAL_SERVER_ERROR); + } catch (ApplicationStorageManagementException e) { + log.error("Error occurred while deleteing the image artifacts of the application with the uuid " + uuid, e); + return APIUtil.getResponse(e, Response.Status.INTERNAL_SERVER_ERROR); } } @@ -358,6 +372,10 @@ public class ApplicationManagementAPIImpl implements ApplicationManagementAPI { log.error(errorMessage, e); return APIUtil.getResponse(new ApplicationManagementException(errorMessage, e), Response.Status.INTERNAL_SERVER_ERROR); + } catch (ResourceManagementException e) { + log.error("Error occurred while uploading the releases artifacts of the application with the uuid " + + applicationUUID + " for the release " + applicationRelease.getVersionName(), e); + return APIUtil.getResponse(e, Response.Status.INTERNAL_SERVER_ERROR); } } @@ -394,6 +412,10 @@ public class ApplicationManagementAPIImpl implements ApplicationManagementAPI { return APIUtil.getResponse(new ApplicationManagementException( "Error while updating the release artifacts of the application with UUID " + applicationUUID), Response.Status.INTERNAL_SERVER_ERROR); + } catch (ResourceManagementException e) { + log.error("Error occurred while updating the releases artifacts of the application with the uuid " + + applicationUUID + " for the release " + applicationRelease.getVersionName(), e); + return APIUtil.getResponse(e, Response.Status.INTERNAL_SERVER_ERROR); } } @@ -470,6 +492,10 @@ public class ApplicationManagementAPIImpl implements ApplicationManagementAPI { } catch (ApplicationManagementException e) { log.error("Error while deleting application release with the application UUID " + applicationUUID, e); return APIUtil.getResponse(e, Response.Status.INTERNAL_SERVER_ERROR); + } catch (ApplicationStorageManagementException e) { + log.error("Error occurred while deleting the releases artifacts of the application with the uuid " + + applicationUUID + " for the release " + version, e); + return APIUtil.getResponse(e, Response.Status.INTERNAL_SERVER_ERROR); } } diff --git a/components/application-mgt/org.wso2.carbon.device.application.mgt.api/src/main/java/org/wso2/carbon/device/application/mgt/api/services/impl/PlatformManagementAPIImpl.java b/components/application-mgt/org.wso2.carbon.device.application.mgt.api/src/main/java/org/wso2/carbon/device/application/mgt/api/services/impl/PlatformManagementAPIImpl.java index 7868733c33..49448ab824 100644 --- a/components/application-mgt/org.wso2.carbon.device.application.mgt.api/src/main/java/org/wso2/carbon/device/application/mgt/api/services/impl/PlatformManagementAPIImpl.java +++ b/components/application-mgt/org.wso2.carbon.device.application.mgt.api/src/main/java/org/wso2/carbon/device/application/mgt/api/services/impl/PlatformManagementAPIImpl.java @@ -19,13 +19,20 @@ package org.wso2.carbon.device.application.mgt.api.services.impl; import org.apache.commons.logging.Log; import org.apache.commons.logging.LogFactory; +import org.apache.cxf.jaxrs.ext.multipart.Attachment; +import org.apache.cxf.jaxrs.ext.multipart.Multipart; import org.wso2.carbon.context.PrivilegedCarbonContext; import org.wso2.carbon.device.application.mgt.api.APIUtil; import org.wso2.carbon.device.application.mgt.api.services.PlatformManagementAPI; +import org.wso2.carbon.device.application.mgt.common.ImageArtifact; import org.wso2.carbon.device.application.mgt.common.Platform; import org.wso2.carbon.device.application.mgt.common.exception.PlatformManagementException; +import org.wso2.carbon.device.application.mgt.common.exception.PlatformStorageManagementException; +import org.wso2.carbon.device.application.mgt.common.exception.ResourceManagementException; import org.wso2.carbon.device.application.mgt.core.exception.PlatformManagementDAOException; +import java.io.IOException; +import java.io.InputStream; import java.util.ArrayList; import java.util.List; import javax.validation.constraints.Size; @@ -118,6 +125,8 @@ public class PlatformManagementAPIImpl implements PlatformManagementAPI { if (platform == null) { return Response.status(Response.Status.NOT_FOUND).entity("Platform not found").build(); } + ImageArtifact icon = APIUtil.getPlatformStorageManager().getIcon(id); + return Response.status(Response.Status.OK).entity(platform).build(); } catch (PlatformManagementDAOException e) { log.error("Error while trying the get the platform with the identifier : " + id + " for the tenant :" @@ -127,17 +136,26 @@ public class PlatformManagementAPIImpl implements PlatformManagementAPI { log.error("Error while trying the get the platform with the identifier : " + id + " for the tenant :" + tenantId, e); return APIUtil.getResponse(e, Response.Status.NOT_FOUND); + } catch (PlatformStorageManagementException e) { + log.error("Platform Storage Management Exception while trying to update the icon for the platform : " + + id + " for the tenant : " + tenantId, e); + return APIUtil.getResponse(e, Response.Status.NOT_FOUND); } } @POST @Override - public Response addPlatform(Platform platform) { + public Response addPlatform(@Multipart("platform") Platform platform, @Multipart("icon")Attachment icon) { int tenantId = PrivilegedCarbonContext.getThreadLocalCarbonContext().getTenantId(true); try { if (platform != null) { if (platform.validate()) { APIUtil.getPlatformManager().register(tenantId, platform); + + if (icon != null) { + InputStream iconFileStream = icon.getDataHandler().getInputStream(); + APIUtil.getPlatformStorageManager().uploadIcon(platform.getIdentifier(), iconFileStream); + } return Response.status(Response.Status.CREATED).build(); } else { return APIUtil @@ -152,20 +170,41 @@ public class PlatformManagementAPIImpl implements PlatformManagementAPI { log.error("Platform Management Exception while trying to add the platform with identifier : " + platform .getIdentifier() + " for the tenant : " + tenantId, e); return APIUtil.getResponse(e, Response.Status.INTERNAL_SERVER_ERROR); + } catch (IOException e) { + log.error("IO Exception while trying to save platform icon for the platform : " + platform.getIdentifier(), + e); + return APIUtil.getResponse(e, Response.Status.INTERNAL_SERVER_ERROR); + } catch (ResourceManagementException e) { + log.error("Storage Exception while trying to save platform icon for the platform : " + platform + .getIdentifier(), e); + return APIUtil.getResponse(e, Response.Status.INTERNAL_SERVER_ERROR); } } @PUT @Path("/{identifier}") @Override - public Response updatePlatform(Platform platform, @PathParam("identifier") @Size(max = 45) String id) { + public Response updatePlatform(@Multipart("platform") Platform platform, @Multipart("icon") Attachment + icon, @PathParam("identifier") @Size(max = 45) String id) { int tenantId = PrivilegedCarbonContext.getThreadLocalCarbonContext().getTenantId(true); try { APIUtil.getPlatformManager().update(tenantId, id, platform); + if (icon != null) { + InputStream iconFileStream = icon.getDataHandler().getInputStream(); + APIUtil.getPlatformStorageManager().uploadIcon(platform.getIdentifier(), iconFileStream); + } return Response.status(Response.Status.OK).build(); } catch (PlatformManagementException e) { log.error("Error while updating the platform - " + id + " for tenant domain - " + tenantId, e); return APIUtil.getResponse(e, Response.Status.INTERNAL_SERVER_ERROR); + } catch (IOException e) { + log.error("IO Exception while trying to update the platform icon for the platform : " + platform + .getIdentifier(), e); + return APIUtil.getResponse(e, Response.Status.INTERNAL_SERVER_ERROR); + } catch (ResourceManagementException e) { + log.error("Storage Exception while trying to update the platform icon for the platform : " + platform + .getIdentifier(), e); + return APIUtil.getResponse(e, Response.Status.INTERNAL_SERVER_ERROR); } } @@ -175,12 +214,17 @@ public class PlatformManagementAPIImpl implements PlatformManagementAPI { public Response removePlatform(@PathParam("identifier") @Size(max = 45) String id) { int tenantId = PrivilegedCarbonContext.getThreadLocalCarbonContext().getTenantId(true); try { + APIUtil.getPlatformStorageManager().deleteIcon(id); APIUtil.getPlatformManager().unregister(tenantId, id, false); return Response.status(Response.Status.OK).build(); } catch (PlatformManagementException e) { log.error("Platform Management Exception while trying to un-register the platform with the identifier : " + id + " for the tenant : " + tenantId, e); return APIUtil.getResponse(e, Response.Status.INTERNAL_SERVER_ERROR); + } catch (PlatformStorageManagementException e) { + log.error("Platform Storage Management Exception while trying to delete the icon of the platform with " + + "identifier for the tenant :" + tenantId, e); + return APIUtil.getResponse(e, Response.Status.INTERNAL_SERVER_ERROR); } } @@ -205,9 +249,9 @@ public class PlatformManagementAPIImpl implements PlatformManagementAPI { } @GET - @Path("tags") + @Path("tags/{name}") @Override - public Response getPlatformTags(@QueryParam("name") String name) { + public Response getPlatformTags(@PathParam("name") String name) { if (name == null || name.isEmpty() || name.length() < 3) { return APIUtil.getResponse("In order to get platform tags, it is required to pass the first 3 " + "characters of the platform tag name", Response.Status.INTERNAL_SERVER_ERROR); diff --git a/components/application-mgt/org.wso2.carbon.device.application.mgt.api/src/main/java/org/wso2/carbon/device/application/mgt/api/services/impl/SubscriptionManagementAPIImpl.java b/components/application-mgt/org.wso2.carbon.device.application.mgt.api/src/main/java/org/wso2/carbon/device/application/mgt/api/services/impl/SubscriptionManagementAPIImpl.java index 20effa969a..cf0de355b5 100644 --- a/components/application-mgt/org.wso2.carbon.device.application.mgt.api/src/main/java/org/wso2/carbon/device/application/mgt/api/services/impl/SubscriptionManagementAPIImpl.java +++ b/components/application-mgt/org.wso2.carbon.device.application.mgt.api/src/main/java/org/wso2/carbon/device/application/mgt/api/services/impl/SubscriptionManagementAPIImpl.java @@ -52,17 +52,17 @@ public class SubscriptionManagementAPIImpl implements SubscriptionManagementAPI{ Object result; SubscriptionManager subscriptionManager = APIUtil.getSubscriptionManager(); try { - String applicationUUID = installationDetails.getApplicationUUID(); + String applicationUUTD = installationDetails.getApplicationUUID(); String versionName = installationDetails.getVersionName(); if (!installationDetails.getDeviceIdentifiers().isEmpty()) { List deviceList = installationDetails.getDeviceIdentifiers(); - result = subscriptionManager.installApplicationForDevices(applicationUUID, versionName, deviceList); + result = subscriptionManager.installApplicationForDevices(applicationUUTD, versionName, deviceList); } else if (!installationDetails.getUserNameList().isEmpty()) { List userList = installationDetails.getUserNameList(); - result = subscriptionManager.installApplicationForUsers(applicationUUID, userList); + result = subscriptionManager.installApplicationForUsers(applicationUUTD, userList); } else if (!installationDetails.getRoleNameList().isEmpty()) { List roleList = installationDetails.getRoleNameList(); - result = subscriptionManager.installApplicationForRoles(applicationUUID, roleList); + result = subscriptionManager.installApplicationForRoles(applicationUUTD, roleList); } else { result = "Missing request data!"; return Response.status(Response.Status.BAD_REQUEST).entity(result).build(); diff --git a/components/application-mgt/org.wso2.carbon.device.application.mgt.common/src/main/java/org/wso2/carbon/device/application/mgt/common/Platform.java b/components/application-mgt/org.wso2.carbon.device.application.mgt.common/src/main/java/org/wso2/carbon/device/application/mgt/common/Platform.java index 3ac3ef3ead..cf85852df0 100644 --- a/components/application-mgt/org.wso2.carbon.device.application.mgt.common/src/main/java/org/wso2/carbon/device/application/mgt/common/Platform.java +++ b/components/application-mgt/org.wso2.carbon.device.application.mgt.common/src/main/java/org/wso2/carbon/device/application/mgt/common/Platform.java @@ -60,6 +60,8 @@ public class Platform { private boolean defaultTenantMapping; + private ImageArtifact icon; + public Platform(Platform platform) { this.id = platform.getId(); this.name = platform.getName(); @@ -180,6 +182,10 @@ public class Platform { return !(name == null || identifier == null); } + public void setIcon(ImageArtifact icon) { + this.icon = icon; + } + /** * Represents a property of a {@link Platform}. */ diff --git a/components/application-mgt/org.wso2.carbon.device.application.mgt.common/src/main/java/org/wso2/carbon/device/application/mgt/common/exception/ApplicationStorageManagementException.java b/components/application-mgt/org.wso2.carbon.device.application.mgt.common/src/main/java/org/wso2/carbon/device/application/mgt/common/exception/ApplicationStorageManagementException.java index cba6915bcb..0bf95ab7c2 100644 --- a/components/application-mgt/org.wso2.carbon.device.application.mgt.common/src/main/java/org/wso2/carbon/device/application/mgt/common/exception/ApplicationStorageManagementException.java +++ b/components/application-mgt/org.wso2.carbon.device.application.mgt.common/src/main/java/org/wso2/carbon/device/application/mgt/common/exception/ApplicationStorageManagementException.java @@ -22,7 +22,7 @@ package org.wso2.carbon.device.application.mgt.common.exception; /** * Represents the exception thrown during storing and retrieving the artifacts. */ -public class ApplicationStorageManagementException extends ApplicationManagementException { +public class ApplicationStorageManagementException extends ResourceManagementException { public ApplicationStorageManagementException(String message, Throwable ex) { super(message, ex); } diff --git a/components/application-mgt/org.wso2.carbon.device.application.mgt.common/src/main/java/org/wso2/carbon/device/application/mgt/common/exception/PlatformStorageManagementException.java b/components/application-mgt/org.wso2.carbon.device.application.mgt.common/src/main/java/org/wso2/carbon/device/application/mgt/common/exception/PlatformStorageManagementException.java new file mode 100644 index 0000000000..c98ab3ad0e --- /dev/null +++ b/components/application-mgt/org.wso2.carbon.device.application.mgt.common/src/main/java/org/wso2/carbon/device/application/mgt/common/exception/PlatformStorageManagementException.java @@ -0,0 +1,33 @@ +/* + * Copyright (c) 2017, WSO2 Inc. (http://www.wso2.org) All Rights Reserved. + * + * WSO2 Inc. licenses this file to you under the Apache License, + * Version 2.0 (the "License"); you may not use this file except + * in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + * + */ + +package org.wso2.carbon.device.application.mgt.common.exception; + +/** + * Represents the exception thrown during storing and retrieving those artifacts. + */ +public class PlatformStorageManagementException extends ResourceManagementException { + public PlatformStorageManagementException(String message, Throwable ex) { + super(message, ex); + } + + public PlatformStorageManagementException(String message) { + super(message); + } +} diff --git a/components/application-mgt/org.wso2.carbon.device.application.mgt.common/src/main/java/org/wso2/carbon/device/application/mgt/common/exception/ResourceManagementException.java b/components/application-mgt/org.wso2.carbon.device.application.mgt.common/src/main/java/org/wso2/carbon/device/application/mgt/common/exception/ResourceManagementException.java new file mode 100644 index 0000000000..11ecb5a2cd --- /dev/null +++ b/components/application-mgt/org.wso2.carbon.device.application.mgt.common/src/main/java/org/wso2/carbon/device/application/mgt/common/exception/ResourceManagementException.java @@ -0,0 +1,33 @@ +/* + * Copyright (c) 2017, WSO2 Inc. (http://www.wso2.org) All Rights Reserved. + * + * WSO2 Inc. licenses this file to you under the Apache License, + * Version 2.0 (the "License"); you may not use this file except + * in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + * + */ + +package org.wso2.carbon.device.application.mgt.common.exception; + +/** + * Represents the exception that will be thrown when there is an issue while managing the resources. + */ +public class ResourceManagementException extends Exception { + ResourceManagementException(String message, Throwable ex) { + super(message, ex); + } + + public ResourceManagementException(String message) { + super(message); + } +} diff --git a/components/application-mgt/org.wso2.carbon.device.application.mgt.common/src/main/java/org/wso2/carbon/device/application/mgt/common/services/ApplicationStorageManager.java b/components/application-mgt/org.wso2.carbon.device.application.mgt.common/src/main/java/org/wso2/carbon/device/application/mgt/common/services/ApplicationStorageManager.java index 4f2b675dd6..e1597f8786 100644 --- a/components/application-mgt/org.wso2.carbon.device.application.mgt.common/src/main/java/org/wso2/carbon/device/application/mgt/common/services/ApplicationStorageManager.java +++ b/components/application-mgt/org.wso2.carbon.device.application.mgt.common/src/main/java/org/wso2/carbon/device/application/mgt/common/services/ApplicationStorageManager.java @@ -21,6 +21,7 @@ package org.wso2.carbon.device.application.mgt.common.services; import org.wso2.carbon.device.application.mgt.common.ImageArtifact; import org.wso2.carbon.device.application.mgt.common.exception.ApplicationStorageManagementException; +import org.wso2.carbon.device.application.mgt.common.exception.ResourceManagementException; import java.io.InputStream; import java.util.List; @@ -38,7 +39,7 @@ public interface ApplicationStorageManager { * @throws ApplicationStorageManagementException Application Storage Management Exception. */ public void uploadImageArtifacts(String applicationUUID, InputStream iconFile, InputStream bannerFile, - List screenshots) throws ApplicationStorageManagementException; + List screenshots) throws ResourceManagementException; /** * To upload release artifacts for an Application. @@ -47,8 +48,8 @@ public interface ApplicationStorageManager { * @param binaryFile Binary File for the release. * @throws ApplicationStorageManagementException Application Storage Management Exception. */ - public void uploadReleaseArtifacts(String applicationUUID, String versionName, InputStream binaryFile) throws - ApplicationStorageManagementException; + public void uploadReleaseArtifacts(String applicationUUID, String versionName, InputStream binaryFile) + throws ResourceManagementException; /** * To get released artifacts for the particular version of the application. diff --git a/components/application-mgt/org.wso2.carbon.device.application.mgt.common/src/main/java/org/wso2/carbon/device/application/mgt/common/services/PlatformStorageManager.java b/components/application-mgt/org.wso2.carbon.device.application.mgt.common/src/main/java/org/wso2/carbon/device/application/mgt/common/services/PlatformStorageManager.java new file mode 100644 index 0000000000..5b3f373221 --- /dev/null +++ b/components/application-mgt/org.wso2.carbon.device.application.mgt.common/src/main/java/org/wso2/carbon/device/application/mgt/common/services/PlatformStorageManager.java @@ -0,0 +1,56 @@ +/* + * Copyright (c) 2017, WSO2 Inc. (http://www.wso2.org) All Rights Reserved. + * + * WSO2 Inc. licenses this file to you under the Apache License, + * Version 2.0 (the "License"); you may not use this file except + * in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + * + */ + +package org.wso2.carbon.device.application.mgt.common.services; + +import org.wso2.carbon.device.application.mgt.common.ImageArtifact; +import org.wso2.carbon.device.application.mgt.common.exception.PlatformStorageManagementException; +import org.wso2.carbon.device.application.mgt.common.exception.ResourceManagementException; + +import java.io.InputStream; + +/** + * This class manages all the storage related requirements of Platform. + */ +public interface PlatformStorageManager { + /** + * To upload image artifacts related with an Application. + * + * @param platformIdentifier Identifier of the platform + * @param iconFile Icon File input stream + * @throws PlatformStorageManagementException Platform Storage Management Exception. + */ + public void uploadIcon(String platformIdentifier, InputStream iconFile) throws ResourceManagementException; + + /** + * To get the icon for a particular platform. + * + * @param platformIdentifier Identifier of the platform. + * @return the icon for the given platform. + */ + public ImageArtifact getIcon(String platformIdentifier) throws PlatformStorageManagementException; + + /** + * To delete the icon of a particular platform + * + * @param platformIdentifier Identifier of the platform to which delete icon. + * @throws PlatformStorageManagementException PlatformStorageManagement Exception. + */ + public void deleteIcon(String platformIdentifier) throws PlatformStorageManagementException; +} diff --git a/components/application-mgt/org.wso2.carbon.device.application.mgt.core/pom.xml b/components/application-mgt/org.wso2.carbon.device.application.mgt.core/pom.xml index 04b388cedd..b1a17af986 100644 --- a/components/application-mgt/org.wso2.carbon.device.application.mgt.core/pom.xml +++ b/components/application-mgt/org.wso2.carbon.device.application.mgt.core/pom.xml @@ -77,7 +77,8 @@ org.wso2.carbon.ndatasource.core, org.wso2.carbon, org.apache.commons.io, - org.apache.commons.codec.binary;version="${commons-codec.wso2.osgi.version.range}" + org.apache.commons.codec.binary;version="${commons-codec.wso2.osgi.version.range}", + org.wso2.carbon.base !org.wso2.carbon.device.application.mgt.core.internal.*, diff --git a/components/application-mgt/org.wso2.carbon.device.application.mgt.core/src/main/java/org/wso2/carbon/device/application/mgt/core/config/Extension.java b/components/application-mgt/org.wso2.carbon.device.application.mgt.core/src/main/java/org/wso2/carbon/device/application/mgt/core/config/Extension.java index 9ce5c282f7..07e3b09a85 100644 --- a/components/application-mgt/org.wso2.carbon.device.application.mgt.core/src/main/java/org/wso2/carbon/device/application/mgt/core/config/Extension.java +++ b/components/application-mgt/org.wso2.carbon.device.application.mgt.core/src/main/java/org/wso2/carbon/device/application/mgt/core/config/Extension.java @@ -87,7 +87,8 @@ public class Extension { VisibilityTypeManager, SubscriptionManager, VisibilityManager, - ApplicationStorageManager + ApplicationStorageManager, + PlatformStorageManager } } diff --git a/components/application-mgt/org.wso2.carbon.device.application.mgt.core/src/main/java/org/wso2/carbon/device/application/mgt/core/impl/ApplicationStorageManagerImpl.java b/components/application-mgt/org.wso2.carbon.device.application.mgt.core/src/main/java/org/wso2/carbon/device/application/mgt/core/impl/ApplicationStorageManagerImpl.java index cbf3e935ce..5ee902e0d6 100644 --- a/components/application-mgt/org.wso2.carbon.device.application.mgt.core/src/main/java/org/wso2/carbon/device/application/mgt/core/impl/ApplicationStorageManagerImpl.java +++ b/components/application-mgt/org.wso2.carbon.device.application.mgt.core/src/main/java/org/wso2/carbon/device/application/mgt/core/impl/ApplicationStorageManagerImpl.java @@ -19,8 +19,6 @@ package org.wso2.carbon.device.application.mgt.core.impl; -import org.apache.commons.codec.binary.Base64; -import org.apache.commons.io.IOUtils; import org.apache.commons.logging.Log; import org.apache.commons.logging.LogFactory; import org.wso2.carbon.context.PrivilegedCarbonContext; @@ -30,6 +28,7 @@ import org.wso2.carbon.device.application.mgt.common.ImageArtifact; import org.wso2.carbon.device.application.mgt.common.exception.ApplicationManagementException; import org.wso2.carbon.device.application.mgt.common.exception.ApplicationStorageManagementException; import org.wso2.carbon.device.application.mgt.common.exception.DBConnectionException; +import org.wso2.carbon.device.application.mgt.common.exception.ResourceManagementException; import org.wso2.carbon.device.application.mgt.common.exception.TransactionManagementException; import org.wso2.carbon.device.application.mgt.common.services.ApplicationStorageManager; import org.wso2.carbon.device.application.mgt.core.dao.common.DAOFactory; @@ -37,18 +36,18 @@ import org.wso2.carbon.device.application.mgt.core.exception.ApplicationManageme import org.wso2.carbon.device.application.mgt.core.internal.DataHolder; import org.wso2.carbon.device.application.mgt.core.util.ConnectionManagerUtil; import org.wso2.carbon.device.application.mgt.core.util.Constants; +import org.wso2.carbon.device.application.mgt.core.util.StorageManagementUtil; import java.io.File; import java.io.FileInputStream; import java.io.FileNotFoundException; -import java.io.FileOutputStream; import java.io.IOException; import java.io.InputStream; -import java.io.OutputStream; -import java.nio.file.Files; import java.util.Arrays; import java.util.List; +import static org.wso2.carbon.device.application.mgt.core.util.StorageManagementUtil.saveFile; + /** * This class contains the default concrete implementation of ApplicationStorage Management. */ @@ -70,7 +69,7 @@ public class ApplicationStorageManagerImpl implements ApplicationStorageManager @Override public void uploadImageArtifacts(String applicationUUID, InputStream iconFileStream, InputStream bannerFileStream, - List screenShotStreams) throws ApplicationStorageManagementException { + List screenShotStreams) throws ResourceManagementException { int tenantId = PrivilegedCarbonContext.getThreadLocalCarbonContext().getTenantId(true); Application application = validateApplication(applicationUUID); String artifactDirectoryPath = storagePath + application.getId(); @@ -78,7 +77,7 @@ public class ApplicationStorageManagerImpl implements ApplicationStorageManager log.debug("Artifact Directory Path for saving the artifacts related with application " + applicationUUID + " is " + artifactDirectoryPath); } - createArtifactDirectory(artifactDirectoryPath); + StorageManagementUtil.createArtifactDirectory(artifactDirectoryPath); if (iconFileStream != null) { try { saveFile(iconFileStream, artifactDirectoryPath + File.separator + Constants.IMAGE_ARTIFACTS[0]); @@ -155,15 +154,14 @@ public class ApplicationStorageManagerImpl implements ApplicationStorageManager @Override public void uploadReleaseArtifacts(String applicationUUID, String versionName, InputStream binaryFile) - throws ApplicationStorageManagementException { + throws ResourceManagementException { Application application = validateApplication(applicationUUID); String artifactDirectoryPath = storagePath + application.getId(); - if (log.isDebugEnabled()) { + if (log.isDebugEnabled()) log.debug("Artifact Directory Path for saving the application release related artifacts related with " + "application " + applicationUUID + " is " + artifactDirectoryPath); - } - createArtifactDirectory(artifactDirectoryPath); + StorageManagementUtil.createArtifactDirectory(artifactDirectoryPath); if (binaryFile != null) { try { saveFile(binaryFile, artifactDirectoryPath + File.separator + versionName); @@ -207,7 +205,7 @@ public class ApplicationStorageManagerImpl implements ApplicationStorageManager File artifactDirectory = new File(artifactDirectoryPath); if (artifactDirectory.exists()) { - deleteDir(artifactDirectory); + StorageManagementUtil.deleteDir(artifactDirectory); } } @@ -219,14 +217,14 @@ public class ApplicationStorageManagerImpl implements ApplicationStorageManager File artifact = new File(artifactPath); if (artifact.exists()) { - deleteDir(artifact); + StorageManagementUtil.deleteDir(artifact); } } @Override public void deleteAllApplicationReleaseArtifacts(String applicationUUID) throws ApplicationStorageManagementException { - Application application = validateApplication(applicationUUID); + validateApplication(applicationUUID); try { List applicationReleases = DataHolder.getInstance().getReleaseManager() .getReleases(applicationUUID); @@ -256,12 +254,7 @@ public class ApplicationStorageManagerImpl implements ApplicationStorageManager "Image artifact " + name + " does not exist for the " + "application with UUID " + applicationUUID); } else { try { - ImageArtifact imageArtifact = new ImageArtifact(); - imageArtifact.setName(imageFile.getName()); - imageArtifact.setType(Files.probeContentType(imageFile.toPath())); - byte[] imageBytes = IOUtils.toByteArray(new FileInputStream(imageArtifactPath)); - imageArtifact.setEncodedImage(Base64.encodeBase64URLSafeString(imageBytes)); - return imageArtifact; + return StorageManagementUtil.createImageArtifact(imageFile, imageArtifactPath); } catch (FileNotFoundException e) { throw new ApplicationStorageManagementException( "File not found exception while trying to get the image artifact " + name + " for the " @@ -273,61 +266,6 @@ public class ApplicationStorageManagerImpl implements ApplicationStorageManager } } - /** - * To save a file in a given location. - * - * @param inputStream Stream of the file. - * @param path Path the file need to be saved in. - */ - private void saveFile(InputStream inputStream, String path) throws IOException { - OutputStream outStream = null; - try { - byte[] buffer = new byte[inputStream.available()]; - inputStream.read(buffer); - outStream = new FileOutputStream(new File(path)); - outStream.write(buffer); - } finally { - if (inputStream != null) { - inputStream.close(); - } - if (outStream != null) { - outStream.close(); - } - } - } - - /** - * This method is responsible for creating artifact parent directories in the given path. - * - * @param artifactDirectoryPath Path for the artifact directory. - * @throws ApplicationStorageManagementException Application Storage Management Exception. - */ - private void createArtifactDirectory(String artifactDirectoryPath) throws ApplicationStorageManagementException { - File artifactDirectory = new File(artifactDirectoryPath); - - if (!artifactDirectory.exists()) { - if (!artifactDirectory.mkdirs()) { - throw new ApplicationStorageManagementException( - "Cannot create directories in the path to save the application related artifacts"); - } - } - } - - /** - * To delete a directory recursively - * - * @param artifactDirectory Artifact Directory that need to be deleted. - */ - private void deleteDir(File artifactDirectory) { - File[] contents = artifactDirectory.listFiles(); - if (contents != null) { - for (File file : contents) { - deleteDir(file); - } - } - artifactDirectory.delete(); - } - /** * To validate the image artifact names. * @param name Name of the image artifact. @@ -354,7 +292,7 @@ public class ApplicationStorageManagerImpl implements ApplicationStorageManager * could not be found. */ private Application validateApplication(String uuid) throws ApplicationStorageManagementException { - Application application = null; + Application application; try { application = DataHolder.getInstance().getApplicationManager().getApplication(uuid); } catch (ApplicationManagementException e) { diff --git a/components/application-mgt/org.wso2.carbon.device.application.mgt.core/src/main/java/org/wso2/carbon/device/application/mgt/core/impl/PlatformStorageManagerImpl.java b/components/application-mgt/org.wso2.carbon.device.application.mgt.core/src/main/java/org/wso2/carbon/device/application/mgt/core/impl/PlatformStorageManagerImpl.java new file mode 100644 index 0000000000..d748d79afc --- /dev/null +++ b/components/application-mgt/org.wso2.carbon.device.application.mgt.core/src/main/java/org/wso2/carbon/device/application/mgt/core/impl/PlatformStorageManagerImpl.java @@ -0,0 +1,166 @@ +/* + * Copyright (c) 2017, WSO2 Inc. (http://www.wso2.org) All Rights Reserved. + * + * WSO2 Inc. licenses this file to you under the Apache License, + * Version 2.0 (the "License"); you may not use this file except + * in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + * + */ + +package org.wso2.carbon.device.application.mgt.core.impl; + +import org.apache.commons.logging.Log; +import org.apache.commons.logging.LogFactory; +import org.wso2.carbon.base.MultitenantConstants; +import org.wso2.carbon.context.CarbonContext; +import org.wso2.carbon.context.PrivilegedCarbonContext; +import org.wso2.carbon.device.application.mgt.common.ImageArtifact; +import org.wso2.carbon.device.application.mgt.common.Platform; +import org.wso2.carbon.device.application.mgt.common.exception.ApplicationStorageManagementException; +import org.wso2.carbon.device.application.mgt.common.exception.PlatformManagementException; +import org.wso2.carbon.device.application.mgt.common.exception.PlatformStorageManagementException; +import org.wso2.carbon.device.application.mgt.common.exception.ResourceManagementException; +import org.wso2.carbon.device.application.mgt.common.services.PlatformManager; +import org.wso2.carbon.device.application.mgt.common.services.PlatformStorageManager; +import org.wso2.carbon.device.application.mgt.core.internal.DataHolder; +import org.wso2.carbon.device.application.mgt.core.util.Constants; +import org.wso2.carbon.device.application.mgt.core.util.StorageManagementUtil; +import org.wso2.carbon.utils.multitenancy.MultitenantUtils; + +import java.io.File; +import java.io.FileNotFoundException; +import java.io.IOException; +import java.io.InputStream; + +import static org.wso2.carbon.device.application.mgt.core.util.StorageManagementUtil.saveFile; + +/** + * This is the concrete implementation of {@link PlatformStorageManager} + */ +public class PlatformStorageManagerImpl implements PlatformStorageManager { + private static final Log log = LogFactory.getLog(ApplicationStorageManagerImpl.class); + private String storagePath; + + /** + * This creates a new instance of PlatformStorageManager. + * @param storagePath Storage path to store the artifacts related with platform. + */ + public PlatformStorageManagerImpl(String storagePath) { + this.storagePath = storagePath; + } + + @Override + public void uploadIcon(String platformIdentifier, InputStream iconFileStream) throws ResourceManagementException { + int tenantId = PrivilegedCarbonContext.getThreadLocalCarbonContext().getTenantId(true); + Platform platform = validatePlatform(tenantId, platformIdentifier); + + if (platform.isFileBased()) { + throw new ApplicationStorageManagementException("Icons for the file based platforms need to be added " + + "directly to the deployment location inside icon folder"); + } + if (platform.isShared() && tenantId != MultitenantConstants.SUPER_TENANT_ID) { + throw new PlatformStorageManagementException("Platform " + platformIdentifier + " is a share platform from " + + "super-tenant. Only the super-tenant users can modify it"); + } + if (log.isDebugEnabled()) { + log.debug("Artifact Directory Path for saving the artifacts related with application " + + platformIdentifier + " is " + storagePath); + } + StorageManagementUtil.createArtifactDirectory(storagePath); + if (iconFileStream != null) { + try { + saveFile(iconFileStream, storagePath + File.separator + platform.getId()); + } catch (IOException e) { + throw new ApplicationStorageManagementException( + "IO Exception while saving the icon file in the server for the platform " + + platformIdentifier, e); + } + } + } + + @Override + public ImageArtifact getIcon(String platformIdentifier) throws PlatformStorageManagementException { + int tenantId = PrivilegedCarbonContext.getThreadLocalCarbonContext().getTenantId(true); + Platform platform = validatePlatform(tenantId, platformIdentifier); + String imageArtifactPath = storagePath + platform.getId(); + File imageFile = null; + + if (platform.isFileBased()) { + imageFile = new File(MultitenantUtils.getAxis2RepositoryPath(CarbonContext.getThreadLocalCarbonContext(). + getTenantId()) + Constants.PLATFORMS_DEPLOYMENT_DIR_NAME + File.separator + + Constants.IMAGE_ARTIFACTS[0] + File.separator + platformIdentifier); + } else { + imageFile = new File(imageArtifactPath); + } + + if (!imageFile.exists()) { + return null; + } else { + try { + return StorageManagementUtil.createImageArtifact(imageFile, imageArtifactPath); + } catch (FileNotFoundException e) { + throw new PlatformStorageManagementException( + "File not found exception while trying to get the icon for the " + "platform " + + platformIdentifier, e); + } catch (IOException e) { + throw new PlatformStorageManagementException( + "IO Exception while trying to detect the file type of the platform icon of " + + platformIdentifier, e); + } + } + } + + @Override + public void deleteIcon(String platformIdentifier) throws PlatformStorageManagementException { + int tenantId = PrivilegedCarbonContext.getThreadLocalCarbonContext().getTenantId(true); + Platform platform = validatePlatform(tenantId, platformIdentifier); + String imageArtifactPath = storagePath + platform.getId(); + + if (platform.isShared() && tenantId != MultitenantConstants.SUPER_TENANT_ID) { + throw new PlatformStorageManagementException("Platform " + platformIdentifier + " is a share platform from " + + "super-tenant. Only the super-tenant users can modify it"); + } + if (platform.isFileBased()) { + throw new PlatformStorageManagementException("Platform " + platformIdentifier + " is a file based one. " + + "Please remove the relevant icon file directly from file system."); + } + + File imageFile = new File(imageArtifactPath); + if (imageFile.exists()) { + imageFile.delete(); + } + } + + /** + * To validate the platform, whether the given identifier has a valid platform. + * + * @param tenantId ID of the tenant + * @param identifier Identifier of the platform + * @return Platform related with the particular identifier. + */ + private Platform validatePlatform(int tenantId, String identifier) throws PlatformStorageManagementException { + Platform platform; + try { + PlatformManager platformManager = DataHolder.getInstance().getPlatformManager(); + platform = platformManager.getPlatform(tenantId, identifier); + } catch (PlatformManagementException e) { + throw new PlatformStorageManagementException("Platform Management Exception while getting the platform " + + "related with the identifier " + identifier); + } + + if (platform == null) { + throw new PlatformStorageManagementException("Platform does not exist with the identifier " + identifier); + } + return platform; + } +} diff --git a/components/application-mgt/org.wso2.carbon.device.application.mgt.core/src/main/java/org/wso2/carbon/device/application/mgt/core/impl/SubscriptionManagerImpl.java b/components/application-mgt/org.wso2.carbon.device.application.mgt.core/src/main/java/org/wso2/carbon/device/application/mgt/core/impl/SubscriptionManagerImpl.java index 3667e0953d..6fc19346fd 100644 --- a/components/application-mgt/org.wso2.carbon.device.application.mgt.core/src/main/java/org/wso2/carbon/device/application/mgt/core/impl/SubscriptionManagerImpl.java +++ b/components/application-mgt/org.wso2.carbon.device.application.mgt.core/src/main/java/org/wso2/carbon/device/application/mgt/core/impl/SubscriptionManagerImpl.java @@ -19,6 +19,7 @@ package org.wso2.carbon.device.application.mgt.core.impl; import org.apache.commons.logging.Log; import org.apache.commons.logging.LogFactory; +import org.wso2.carbon.context.PrivilegedCarbonContext; import org.wso2.carbon.device.application.mgt.common.DeviceIdentifier; import org.wso2.carbon.device.application.mgt.common.exception.ApplicationManagementException; import org.wso2.carbon.device.application.mgt.common.services.SubscriptionManager; @@ -40,6 +41,7 @@ import org.wso2.carbon.device.mgt.core.service.DeviceManagementProviderService; import java.sql.SQLException; import java.util.ArrayList; import java.util.List; +import java.util.Map; /** * This is the default implementation for the Subscription Manager. @@ -61,9 +63,13 @@ public class SubscriptionManagerImpl implements SubscriptionManager { org.wso2.carbon.device.mgt.common.DeviceIdentifier deviceIdentifier = new org.wso2.carbon.device.mgt .common.DeviceIdentifier(device.getId(), device.getType()); try { - DeviceManagementProviderService dmpService = DataHolder.getInstance().getDeviceManagementService(); - if (!dmpService.isEnrolled(deviceIdentifier)) { - log.error("Device with ID: " + device.getId() + " is not enrolled to install the application."); + DeviceManagementDAOFactory.openConnection(); + // todo: replace this with boolean:deviceExsits(deviceId) operation + Map currentDevices = DeviceManagementDAOFactory.getDeviceDAO().getDevice(deviceIdentifier); + DeviceManagementDAOFactory.closeConnection(); + + if (currentDevices.isEmpty()) { + log.error("Device with ID: " + device.getId() + " not found to install the application."); } else { if (log.isDebugEnabled()) { log.debug("Installing application to : " + device.getId()); @@ -90,8 +96,10 @@ public class SubscriptionManagerImpl implements SubscriptionManager { // DAOFactory.getSubscriptionDAO().addDeviceApplicationMapping(device.getId(), applicationUUID, false); failedDeviceList.remove(device); } - } catch (DeviceManagementException | OperationManagementException | InvalidDeviceException e) { + } catch (DeviceManagementException | DeviceManagementDAOException | OperationManagementException | InvalidDeviceException | SQLException e) { throw new ApplicationManagementException("Failed to install application " + applicationUUID + " on device " + deviceIdentifier, e); + } finally { + DeviceManagementDAOFactory.closeConnection(); } } return failedDeviceList; @@ -102,14 +110,15 @@ public class SubscriptionManagerImpl implements SubscriptionManager { throws ApplicationManagementException { log.info("Install application: " + applicationUUID + " to: " + userList.size() + " users."); List deviceList = new ArrayList<>(); + int tenantId = PrivilegedCarbonContext.getThreadLocalCarbonContext().getTenantId(); for (String user : userList) { try { - List devicesOfUser = DataHolder.getInstance().getDeviceManagementService().getDevicesOfUser(user); + List devicesOfUser = DeviceManagementDAOFactory.getDeviceDAO().getDevicesOfUser(user, tenantId); for (Device device : devicesOfUser) { deviceList.add(new DeviceIdentifier(device .getDeviceIdentifier(), device.getType())); } - } catch (DeviceManagementException e) { + } catch (DeviceManagementDAOException e) { log.error("Error when extracting the device list from user[" + user + "].", e); } } diff --git a/components/application-mgt/org.wso2.carbon.device.application.mgt.core/src/main/java/org/wso2/carbon/device/application/mgt/core/internal/DataHolder.java b/components/application-mgt/org.wso2.carbon.device.application.mgt.core/src/main/java/org/wso2/carbon/device/application/mgt/core/internal/DataHolder.java index a153b0bc14..31de14afa3 100644 --- a/components/application-mgt/org.wso2.carbon.device.application.mgt.core/src/main/java/org/wso2/carbon/device/application/mgt/core/internal/DataHolder.java +++ b/components/application-mgt/org.wso2.carbon.device.application.mgt.core/src/main/java/org/wso2/carbon/device/application/mgt/core/internal/DataHolder.java @@ -18,15 +18,7 @@ */ package org.wso2.carbon.device.application.mgt.core.internal; -import org.wso2.carbon.device.application.mgt.common.services.ApplicationManager; -import org.wso2.carbon.device.application.mgt.common.services.ApplicationReleaseManager; -import org.wso2.carbon.device.application.mgt.common.services.ApplicationStorageManager; -import org.wso2.carbon.device.application.mgt.common.services.CategoryManager; -import org.wso2.carbon.device.application.mgt.common.services.CommentsManager; -import org.wso2.carbon.device.application.mgt.common.services.LifecycleStateManager; -import org.wso2.carbon.device.application.mgt.common.services.PlatformManager; -import org.wso2.carbon.device.application.mgt.common.services.SubscriptionManager; -import org.wso2.carbon.device.application.mgt.common.services.VisibilityManager; +import org.wso2.carbon.device.application.mgt.common.services.*; import org.wso2.carbon.device.mgt.core.service.DeviceManagementProviderService; import org.wso2.carbon.user.core.service.RealmService; @@ -57,6 +49,8 @@ public class DataHolder { private ApplicationStorageManager applicationStorageManager; + private PlatformStorageManager platformStorageManager; + private static final DataHolder applicationMgtDataHolder = new DataHolder(); private DataHolder() { @@ -154,4 +148,8 @@ public class DataHolder { public ApplicationStorageManager getApplicationStorageManager() { return applicationStorageManager; } + + public void setPlatformStorageManager(PlatformStorageManager platformStorageManager) { + this.platformStorageManager = platformStorageManager; + } } diff --git a/components/application-mgt/org.wso2.carbon.device.application.mgt.core/src/main/java/org/wso2/carbon/device/application/mgt/core/internal/ServiceComponent.java b/components/application-mgt/org.wso2.carbon.device.application.mgt.core/src/main/java/org/wso2/carbon/device/application/mgt/core/internal/ServiceComponent.java index bc0919d8e6..bb12107284 100644 --- a/components/application-mgt/org.wso2.carbon.device.application.mgt.core/src/main/java/org/wso2/carbon/device/application/mgt/core/internal/ServiceComponent.java +++ b/components/application-mgt/org.wso2.carbon.device.application.mgt.core/src/main/java/org/wso2/carbon/device/application/mgt/core/internal/ServiceComponent.java @@ -23,15 +23,7 @@ import org.apache.commons.logging.LogFactory; import org.osgi.framework.BundleContext; import org.osgi.service.component.ComponentContext; import org.wso2.carbon.device.application.mgt.common.exception.InvalidConfigurationException; -import org.wso2.carbon.device.application.mgt.common.services.ApplicationManager; -import org.wso2.carbon.device.application.mgt.common.services.ApplicationReleaseManager; -import org.wso2.carbon.device.application.mgt.common.services.ApplicationStorageManager; -import org.wso2.carbon.device.application.mgt.common.services.CategoryManager; -import org.wso2.carbon.device.application.mgt.common.services.CommentsManager; -import org.wso2.carbon.device.application.mgt.common.services.LifecycleStateManager; -import org.wso2.carbon.device.application.mgt.common.services.PlatformManager; -import org.wso2.carbon.device.application.mgt.common.services.SubscriptionManager; -import org.wso2.carbon.device.application.mgt.common.services.VisibilityManager; +import org.wso2.carbon.device.application.mgt.common.services.*; import org.wso2.carbon.device.application.mgt.core.config.ConfigurationManager; import org.wso2.carbon.device.application.mgt.core.dao.common.DAOFactory; import org.wso2.carbon.device.application.mgt.core.exception.ApplicationManagementDAOException; @@ -115,6 +107,11 @@ public class ServiceComponent { DataHolder.getInstance().setApplicationStorageManager(applicationStorageManager); bundleContext.registerService(ApplicationStorageManager.class.getName(), applicationStorageManager, null); + PlatformStorageManager platformStorageManager = ApplicationManagementUtil + .getPlatformStorageManagerInstance(); + DataHolder.getInstance().setPlatformStorageManager(platformStorageManager); + bundleContext.registerService(PlatformStorageManager.class.getName(), platformStorageManager, null); + bundleContext.registerService(Axis2ConfigurationContextObserver.class.getName(), new PlatformManagementAxis2ConfigurationObserverImpl(), null); diff --git a/components/application-mgt/org.wso2.carbon.device.application.mgt.core/src/main/java/org/wso2/carbon/device/application/mgt/core/util/ApplicationManagementUtil.java b/components/application-mgt/org.wso2.carbon.device.application.mgt.core/src/main/java/org/wso2/carbon/device/application/mgt/core/util/ApplicationManagementUtil.java index 8f8868a000..acc83f34ae 100644 --- a/components/application-mgt/org.wso2.carbon.device.application.mgt.core/src/main/java/org/wso2/carbon/device/application/mgt/core/util/ApplicationManagementUtil.java +++ b/components/application-mgt/org.wso2.carbon.device.application.mgt.core/src/main/java/org/wso2/carbon/device/application/mgt/core/util/ApplicationManagementUtil.java @@ -21,15 +21,7 @@ package org.wso2.carbon.device.application.mgt.core.util; import org.apache.commons.logging.Log; import org.apache.commons.logging.LogFactory; import org.wso2.carbon.device.application.mgt.common.exception.InvalidConfigurationException; -import org.wso2.carbon.device.application.mgt.common.services.ApplicationManager; -import org.wso2.carbon.device.application.mgt.common.services.ApplicationReleaseManager; -import org.wso2.carbon.device.application.mgt.common.services.ApplicationStorageManager; -import org.wso2.carbon.device.application.mgt.common.services.CategoryManager; -import org.wso2.carbon.device.application.mgt.common.services.CommentsManager; -import org.wso2.carbon.device.application.mgt.common.services.LifecycleStateManager; -import org.wso2.carbon.device.application.mgt.common.services.PlatformManager; -import org.wso2.carbon.device.application.mgt.common.services.SubscriptionManager; -import org.wso2.carbon.device.application.mgt.common.services.VisibilityManager; +import org.wso2.carbon.device.application.mgt.common.services.*; import org.wso2.carbon.device.application.mgt.core.config.ConfigurationManager; import org.wso2.carbon.device.application.mgt.core.config.Extension; @@ -99,6 +91,14 @@ public class ApplicationManagementUtil { return getInstance(extension, ApplicationStorageManager.class); } + public static PlatformStorageManager getPlatformStorageManagerInstance() throws + InvalidConfigurationException { + ConfigurationManager configurationManager = ConfigurationManager.getInstance(); + Extension extension = configurationManager.getExtension(Extension.Name.PlatformStorageManager); + return getInstance(extension, PlatformStorageManager.class); + } + + private static T getInstance(Extension extension, Class cls) throws InvalidConfigurationException { try { Class theClass = Class.forName(extension.getClassName()); diff --git a/components/application-mgt/org.wso2.carbon.device.application.mgt.core/src/main/java/org/wso2/carbon/device/application/mgt/core/util/StorageManagementUtil.java b/components/application-mgt/org.wso2.carbon.device.application.mgt.core/src/main/java/org/wso2/carbon/device/application/mgt/core/util/StorageManagementUtil.java new file mode 100644 index 0000000000..d644fb52cd --- /dev/null +++ b/components/application-mgt/org.wso2.carbon.device.application.mgt.core/src/main/java/org/wso2/carbon/device/application/mgt/core/util/StorageManagementUtil.java @@ -0,0 +1,86 @@ +package org.wso2.carbon.device.application.mgt.core.util; + +import org.apache.commons.codec.binary.Base64; +import org.apache.commons.io.IOUtils; +import org.wso2.carbon.device.application.mgt.common.ImageArtifact; +import org.wso2.carbon.device.application.mgt.common.exception.ApplicationStorageManagementException; +import org.wso2.carbon.device.application.mgt.common.exception.ResourceManagementException; + +import java.io.*; +import java.nio.file.Files; + +public class StorageManagementUtil { + /** + * This method is responsible for creating artifact parent directories in the given path. + * + * @param artifactDirectoryPath Path for the artifact directory. + * @throws ApplicationStorageManagementException Application Storage Management Exception. + */ + public static void createArtifactDirectory(String artifactDirectoryPath) throws ResourceManagementException { + File artifactDirectory = new File(artifactDirectoryPath); + + if (!artifactDirectory.exists()) { + if (!artifactDirectory.mkdirs()) { + throw new ResourceManagementException( + "Cannot create directories in the path to save the application related artifacts"); + } + } + } + + /** + * To delete a directory recursively + * + * @param artifactDirectory Artifact Directory that need to be deleted. + */ + public static void deleteDir(File artifactDirectory) { + File[] contents = artifactDirectory.listFiles(); + if (contents != null) { + for (File file : contents) { + deleteDir(file); + } + } + artifactDirectory.delete(); + } + + + /** + * To save a file in a given location. + * + * @param inputStream Stream of the file. + * @param path Path the file need to be saved in. + */ + public static void saveFile(InputStream inputStream, String path) throws IOException { + OutputStream outStream = null; + try { + byte[] buffer = new byte[inputStream.available()]; + inputStream.read(buffer); + outStream = new FileOutputStream(new File(path)); + outStream.write(buffer); + } finally { + if (inputStream != null) { + inputStream.close(); + } + if (outStream != null) { + outStream.close(); + } + } + } + + /** + * To create {@link ImageArtifact}. + * + * @param imageFile Image File. + * @param imageArtifactPath Path of the image artifact file. + * @return Image Artifact. + * @throws IOException IO Exception. + */ + public static ImageArtifact createImageArtifact(File imageFile, String imageArtifactPath) throws IOException { + ImageArtifact imageArtifact = new ImageArtifact(); + imageArtifact.setName(imageFile.getName()); + imageArtifact.setType(Files.probeContentType(imageFile.toPath())); + byte[] imageBytes = IOUtils.toByteArray(new FileInputStream(imageArtifactPath)); + imageArtifact.setEncodedImage(Base64.encodeBase64URLSafeString(imageBytes)); + return imageArtifact; + } + +} diff --git a/features/application-mgt/org.wso2.carbon.device.application.mgt.server.feature/src/main/resources/conf/application-mgt.xml b/features/application-mgt/org.wso2.carbon.device.application.mgt.server.feature/src/main/resources/conf/application-mgt.xml index dd88d20bf5..bd74672de3 100644 --- a/features/application-mgt/org.wso2.carbon.device.application.mgt.server.feature/src/main/resources/conf/application-mgt.xml +++ b/features/application-mgt/org.wso2.carbon.device.application.mgt.server.feature/src/main/resources/conf/application-mgt.xml @@ -46,9 +46,6 @@ org.wso2.carbon.device.application.mgt.core.impl.VisibilityManagerImpl - - org.wso2.carbon.device.application.mgt.core.impl.VisibilityTypeManagerImpl - org.wso2.carbon.device.application.mgt.core.impl.ApplicationStorageManagerImpl @@ -56,5 +53,11 @@ 6 + + org.wso2.carbon.device.application.mgt.core.impl.PlatformStorageManagerImpl + + repository/resources/platforms + + \ No newline at end of file From f417f7854e3dc375803ea48ff598ad4002a8fd42 Mon Sep 17 00:00:00 2001 From: megala21 Date: Thu, 5 Oct 2017 13:28:00 +0530 Subject: [PATCH 03/32] Adding icon update --- .../api/services/PlatformManagementAPI.java | 53 +++++++++++++++++-- .../impl/PlatformManagementAPIImpl.java | 39 +++++++++----- 2 files changed, 73 insertions(+), 19 deletions(-) diff --git a/components/application-mgt/org.wso2.carbon.device.application.mgt.api/src/main/java/org/wso2/carbon/device/application/mgt/api/services/PlatformManagementAPI.java b/components/application-mgt/org.wso2.carbon.device.application.mgt.api/src/main/java/org/wso2/carbon/device/application/mgt/api/services/PlatformManagementAPI.java index f60e7199f1..ace466cdd8 100644 --- a/components/application-mgt/org.wso2.carbon.device.application.mgt.api/src/main/java/org/wso2/carbon/device/application/mgt/api/services/PlatformManagementAPI.java +++ b/components/application-mgt/org.wso2.carbon.device.application.mgt.api/src/main/java/org/wso2/carbon/device/application/mgt/api/services/PlatformManagementAPI.java @@ -212,15 +212,15 @@ public interface PlatformManagementAPI { }) Response addPlatform( @Multipart(value = "Platform", type = "application/json" ) Platform platform, - @Multipart(value = "icon", required = true) Attachment iconFile + @Multipart(value = "icon", required = false) Attachment iconFile ); @PUT @Path("/{identifier}") @Produces(MediaType.APPLICATION_JSON) - @Consumes(MediaType.MULTIPART_FORM_DATA) + @Consumes(MediaType.APPLICATION_JSON) @ApiOperation( - consumes = MediaType.MULTIPART_FORM_DATA, + consumes = MediaType.APPLICATION_JSON, produces = MediaType.APPLICATION_JSON, httpMethod = "PUT", value = "Update Platform", @@ -246,8 +246,11 @@ public interface PlatformManagementAPI { response = ErrorResponse.class) }) Response updatePlatform( - @Multipart(value = "Platform", type = "application/json" ) Platform platform, - @Multipart(value = "icon", required = false) Attachment iconFile, + @ApiParam( + name = "platform", + value = "The payload of the platform", + required = true) + Platform platform, @ApiParam( name = "identifier", required = true) @@ -372,4 +375,44 @@ public interface PlatformManagementAPI { required = true) @PathParam("name") @Size(min = 3) String name ); + + @POST + @Path("/{identifier}/icon") + @Produces(MediaType.APPLICATION_JSON) + @Consumes(MediaType.MULTIPART_FORM_DATA) + @ApiOperation( + consumes = MediaType.MULTIPART_FORM_DATA, + produces = MediaType.APPLICATION_JSON, + httpMethod = "POST", + value = "Update Platform icon", + notes = "This will update the platform icon", + tags = "Platform Management", + extensions = { + @Extension(properties = { + @ExtensionProperty(name = SCOPE, value = "perm:platform:update") + }) + } + ) + @ApiResponses( + value = { + @ApiResponse( + code = 200, + message = "OK. \n Successfully updated the platform icon"), + @ApiResponse( + code = 400, + message = "Bad Request. \n Invalid request parameters passed."), + @ApiResponse( + code = 500, + message = "Internal Server Error. \n Error occurred while updating the platform icon.", + response = ErrorResponse.class) + }) + Response updatePlatformIcon( + @ApiParam( + name = "identifier", + required = true) + @PathParam("identifier") + @Size(max = 45) + String identifier, + @Multipart(value = "icon") Attachment iconFile + ); } diff --git a/components/application-mgt/org.wso2.carbon.device.application.mgt.api/src/main/java/org/wso2/carbon/device/application/mgt/api/services/impl/PlatformManagementAPIImpl.java b/components/application-mgt/org.wso2.carbon.device.application.mgt.api/src/main/java/org/wso2/carbon/device/application/mgt/api/services/impl/PlatformManagementAPIImpl.java index 49448ab824..a62a52e52f 100644 --- a/components/application-mgt/org.wso2.carbon.device.application.mgt.api/src/main/java/org/wso2/carbon/device/application/mgt/api/services/impl/PlatformManagementAPIImpl.java +++ b/components/application-mgt/org.wso2.carbon.device.application.mgt.api/src/main/java/org/wso2/carbon/device/application/mgt/api/services/impl/PlatformManagementAPIImpl.java @@ -184,27 +184,14 @@ public class PlatformManagementAPIImpl implements PlatformManagementAPI { @PUT @Path("/{identifier}") @Override - public Response updatePlatform(@Multipart("platform") Platform platform, @Multipart("icon") Attachment - icon, @PathParam("identifier") @Size(max = 45) String id) { + public Response updatePlatform(Platform platform, @PathParam("identifier") @Size(max = 45) String id) { int tenantId = PrivilegedCarbonContext.getThreadLocalCarbonContext().getTenantId(true); try { APIUtil.getPlatformManager().update(tenantId, id, platform); - if (icon != null) { - InputStream iconFileStream = icon.getDataHandler().getInputStream(); - APIUtil.getPlatformStorageManager().uploadIcon(platform.getIdentifier(), iconFileStream); - } return Response.status(Response.Status.OK).build(); } catch (PlatformManagementException e) { log.error("Error while updating the platform - " + id + " for tenant domain - " + tenantId, e); return APIUtil.getResponse(e, Response.Status.INTERNAL_SERVER_ERROR); - } catch (IOException e) { - log.error("IO Exception while trying to update the platform icon for the platform : " + platform - .getIdentifier(), e); - return APIUtil.getResponse(e, Response.Status.INTERNAL_SERVER_ERROR); - } catch (ResourceManagementException e) { - log.error("Storage Exception while trying to update the platform icon for the platform : " + platform - .getIdentifier(), e); - return APIUtil.getResponse(e, Response.Status.INTERNAL_SERVER_ERROR); } } @@ -265,4 +252,28 @@ public class PlatformManagementAPIImpl implements PlatformManagementAPI { return APIUtil.getResponse(e, Response.Status.INTERNAL_SERVER_ERROR); } } + + @POST + @Path("{identifier}/icon") + @Override + public Response updatePlatformIcon(@PathParam("identifier") String identifier, @Multipart("icon") Attachment + icon) { + try { + if (icon != null) { + InputStream iconFileStream = icon.getDataHandler().getInputStream(); + APIUtil.getPlatformStorageManager().uploadIcon(identifier, iconFileStream); + return Response.status(Response.Status.OK) + .entity("Icon file is successfully updated for the platform :" + identifier).build(); + } else { + return Response.status(Response.Status.BAD_REQUEST).entity("Icon file is not provided to update") + .build(); + } + } catch (ResourceManagementException e) { + log.error("Resource Management exception while trying to update the icon for the platform " + identifier); + return APIUtil.getResponse(e, Response.Status.INTERNAL_SERVER_ERROR); + } catch (IOException e) { + log.error("IO exception while trying to update the icon for the platform " + identifier); + return APIUtil.getResponse(e, Response.Status.INTERNAL_SERVER_ERROR); + } + } } From 2fcf1c4e708ccc1ae4593b1480db67d392a30a49 Mon Sep 17 00:00:00 2001 From: megala21 Date: Thu, 5 Oct 2017 13:49:18 +0530 Subject: [PATCH 04/32] Refactoring --- .../device/application/mgt/api/APIUtil.java | 10 +++-- .../impl/PlatformManagementAPIImpl.java | 39 +++++++++++-------- .../core/impl/SubscriptionManagerImpl.java | 21 +++------- .../mgt/core/internal/DataHolder.java | 15 ++++++- .../mgt/core/internal/ServiceComponent.java | 12 +++++- .../core/util/ApplicationManagementUtil.java | 11 +++++- .../mgt/core/util/StorageManagementUtil.java | 25 +++++++++++- .../src/test/resources/application-mgt.xml | 2 +- .../main/resources/conf/application-mgt.xml | 2 +- 9 files changed, 95 insertions(+), 42 deletions(-) diff --git a/components/application-mgt/org.wso2.carbon.device.application.mgt.api/src/main/java/org/wso2/carbon/device/application/mgt/api/APIUtil.java b/components/application-mgt/org.wso2.carbon.device.application.mgt.api/src/main/java/org/wso2/carbon/device/application/mgt/api/APIUtil.java index 97b9db0be3..7755a77af9 100644 --- a/components/application-mgt/org.wso2.carbon.device.application.mgt.api/src/main/java/org/wso2/carbon/device/application/mgt/api/APIUtil.java +++ b/components/application-mgt/org.wso2.carbon.device.application.mgt.api/src/main/java/org/wso2/carbon/device/application/mgt/api/APIUtil.java @@ -22,9 +22,13 @@ import org.apache.commons.logging.Log; import org.apache.commons.logging.LogFactory; import org.wso2.carbon.context.PrivilegedCarbonContext; import org.wso2.carbon.device.application.mgt.api.beans.ErrorResponse; -import org.wso2.carbon.device.application.mgt.common.exception.ApplicationManagementException; -import org.wso2.carbon.device.application.mgt.common.services.*; -import org.wso2.carbon.device.mgt.core.service.DeviceManagementProviderService; +import org.wso2.carbon.device.application.mgt.common.services.ApplicationManager; +import org.wso2.carbon.device.application.mgt.common.services.ApplicationReleaseManager; +import org.wso2.carbon.device.application.mgt.common.services.ApplicationStorageManager; +import org.wso2.carbon.device.application.mgt.common.services.LifecycleStateManager; +import org.wso2.carbon.device.application.mgt.common.services.PlatformManager; +import org.wso2.carbon.device.application.mgt.common.services.PlatformStorageManager; +import org.wso2.carbon.device.application.mgt.common.services.SubscriptionManager; import javax.ws.rs.core.Response; diff --git a/components/application-mgt/org.wso2.carbon.device.application.mgt.api/src/main/java/org/wso2/carbon/device/application/mgt/api/services/impl/PlatformManagementAPIImpl.java b/components/application-mgt/org.wso2.carbon.device.application.mgt.api/src/main/java/org/wso2/carbon/device/application/mgt/api/services/impl/PlatformManagementAPIImpl.java index a62a52e52f..46ddae38c4 100644 --- a/components/application-mgt/org.wso2.carbon.device.application.mgt.api/src/main/java/org/wso2/carbon/device/application/mgt/api/services/impl/PlatformManagementAPIImpl.java +++ b/components/application-mgt/org.wso2.carbon.device.application.mgt.api/src/main/java/org/wso2/carbon/device/application/mgt/api/services/impl/PlatformManagementAPIImpl.java @@ -29,6 +29,7 @@ import org.wso2.carbon.device.application.mgt.common.Platform; import org.wso2.carbon.device.application.mgt.common.exception.PlatformManagementException; import org.wso2.carbon.device.application.mgt.common.exception.PlatformStorageManagementException; import org.wso2.carbon.device.application.mgt.common.exception.ResourceManagementException; +import org.wso2.carbon.device.application.mgt.common.services.PlatformStorageManager; import org.wso2.carbon.device.application.mgt.core.exception.PlatformManagementDAOException; import java.io.IOException; @@ -61,6 +62,7 @@ public class PlatformManagementAPIImpl implements PlatformManagementAPI { @Override public Response getPlatforms(@QueryParam("status") String status, @QueryParam("tag") String tag) { int tenantID = PrivilegedCarbonContext.getThreadLocalCarbonContext().getTenantId(true); + PlatformStorageManager platformStorageManager = APIUtil.getPlatformStorageManager(); if (log.isDebugEnabled()) { log.debug("API request received for getting the platforms with the status " + status); @@ -92,25 +94,25 @@ public class PlatformManagementAPIImpl implements PlatformManagementAPI { } else { results = platforms; } - - if (tag != null) { - if (results != null) { - for (Platform platform : results) { - if (platform.getTags() != null && platform.getTags().contains(tag)) { - filteredPlatforms.add(platform); - } + if (results != null) { + for (Platform platform : results) { + if (tag == null || tag.isEmpty() || (platform.getTags() != null && platform.getTags() + .contains(tag))) { + platform.setIcon(platformStorageManager.getIcon(platform.getIdentifier())); + filteredPlatforms.add(platform); } } - } else { - filteredPlatforms = results; - } - if (log.isDebugEnabled()) { - log.debug("Number of platforms with the status " + status + " : " + results.size()); + if (log.isDebugEnabled()) { + log.debug("Number of platforms with the status " + status + " : " + results.size()); + } } return Response.status(Response.Status.OK).entity(filteredPlatforms).build(); } catch (PlatformManagementException e) { log.error("Error while getting the platforms for tenant - " + tenantID, e); return APIUtil.getResponse(e, Response.Status.INTERNAL_SERVER_ERROR); + } catch (PlatformStorageManagementException e) { + log.error("Error while getting platform icons for the tenant : " + tenantID, e); + return APIUtil.getResponse(e, Response.Status.INTERNAL_SERVER_ERROR); } } @@ -126,7 +128,9 @@ public class PlatformManagementAPIImpl implements PlatformManagementAPI { return Response.status(Response.Status.NOT_FOUND).entity("Platform not found").build(); } ImageArtifact icon = APIUtil.getPlatformStorageManager().getIcon(id); - + if (icon != null) { + platform.setIcon(icon); + } return Response.status(Response.Status.OK).entity(platform).build(); } catch (PlatformManagementDAOException e) { log.error("Error while trying the get the platform with the identifier : " + id + " for the tenant :" @@ -137,8 +141,8 @@ public class PlatformManagementAPIImpl implements PlatformManagementAPI { + tenantId, e); return APIUtil.getResponse(e, Response.Status.NOT_FOUND); } catch (PlatformStorageManagementException e) { - log.error("Platform Storage Management Exception while trying to update the icon for the platform : " + - id + " for the tenant : " + tenantId, e); + log.error("Platform Storage Management Exception while trying to update the icon for the platform : " + id + + " for the tenant : " + tenantId, e); return APIUtil.getResponse(e, Response.Status.NOT_FOUND); } } @@ -205,8 +209,9 @@ public class PlatformManagementAPIImpl implements PlatformManagementAPI { APIUtil.getPlatformManager().unregister(tenantId, id, false); return Response.status(Response.Status.OK).build(); } catch (PlatformManagementException e) { - log.error("Platform Management Exception while trying to un-register the platform with the identifier : " - + id + " for the tenant : " + tenantId, e); + log.error( + "Platform Management Exception while trying to un-register the platform with the identifier : " + id + + " for the tenant : " + tenantId, e); return APIUtil.getResponse(e, Response.Status.INTERNAL_SERVER_ERROR); } catch (PlatformStorageManagementException e) { log.error("Platform Storage Management Exception while trying to delete the icon of the platform with " diff --git a/components/application-mgt/org.wso2.carbon.device.application.mgt.core/src/main/java/org/wso2/carbon/device/application/mgt/core/impl/SubscriptionManagerImpl.java b/components/application-mgt/org.wso2.carbon.device.application.mgt.core/src/main/java/org/wso2/carbon/device/application/mgt/core/impl/SubscriptionManagerImpl.java index 6fc19346fd..3667e0953d 100644 --- a/components/application-mgt/org.wso2.carbon.device.application.mgt.core/src/main/java/org/wso2/carbon/device/application/mgt/core/impl/SubscriptionManagerImpl.java +++ b/components/application-mgt/org.wso2.carbon.device.application.mgt.core/src/main/java/org/wso2/carbon/device/application/mgt/core/impl/SubscriptionManagerImpl.java @@ -19,7 +19,6 @@ package org.wso2.carbon.device.application.mgt.core.impl; import org.apache.commons.logging.Log; import org.apache.commons.logging.LogFactory; -import org.wso2.carbon.context.PrivilegedCarbonContext; import org.wso2.carbon.device.application.mgt.common.DeviceIdentifier; import org.wso2.carbon.device.application.mgt.common.exception.ApplicationManagementException; import org.wso2.carbon.device.application.mgt.common.services.SubscriptionManager; @@ -41,7 +40,6 @@ import org.wso2.carbon.device.mgt.core.service.DeviceManagementProviderService; import java.sql.SQLException; import java.util.ArrayList; import java.util.List; -import java.util.Map; /** * This is the default implementation for the Subscription Manager. @@ -63,13 +61,9 @@ public class SubscriptionManagerImpl implements SubscriptionManager { org.wso2.carbon.device.mgt.common.DeviceIdentifier deviceIdentifier = new org.wso2.carbon.device.mgt .common.DeviceIdentifier(device.getId(), device.getType()); try { - DeviceManagementDAOFactory.openConnection(); - // todo: replace this with boolean:deviceExsits(deviceId) operation - Map currentDevices = DeviceManagementDAOFactory.getDeviceDAO().getDevice(deviceIdentifier); - DeviceManagementDAOFactory.closeConnection(); - - if (currentDevices.isEmpty()) { - log.error("Device with ID: " + device.getId() + " not found to install the application."); + DeviceManagementProviderService dmpService = DataHolder.getInstance().getDeviceManagementService(); + if (!dmpService.isEnrolled(deviceIdentifier)) { + log.error("Device with ID: " + device.getId() + " is not enrolled to install the application."); } else { if (log.isDebugEnabled()) { log.debug("Installing application to : " + device.getId()); @@ -96,10 +90,8 @@ public class SubscriptionManagerImpl implements SubscriptionManager { // DAOFactory.getSubscriptionDAO().addDeviceApplicationMapping(device.getId(), applicationUUID, false); failedDeviceList.remove(device); } - } catch (DeviceManagementException | DeviceManagementDAOException | OperationManagementException | InvalidDeviceException | SQLException e) { + } catch (DeviceManagementException | OperationManagementException | InvalidDeviceException e) { throw new ApplicationManagementException("Failed to install application " + applicationUUID + " on device " + deviceIdentifier, e); - } finally { - DeviceManagementDAOFactory.closeConnection(); } } return failedDeviceList; @@ -110,15 +102,14 @@ public class SubscriptionManagerImpl implements SubscriptionManager { throws ApplicationManagementException { log.info("Install application: " + applicationUUID + " to: " + userList.size() + " users."); List deviceList = new ArrayList<>(); - int tenantId = PrivilegedCarbonContext.getThreadLocalCarbonContext().getTenantId(); for (String user : userList) { try { - List devicesOfUser = DeviceManagementDAOFactory.getDeviceDAO().getDevicesOfUser(user, tenantId); + List devicesOfUser = DataHolder.getInstance().getDeviceManagementService().getDevicesOfUser(user); for (Device device : devicesOfUser) { deviceList.add(new DeviceIdentifier(device .getDeviceIdentifier(), device.getType())); } - } catch (DeviceManagementDAOException e) { + } catch (DeviceManagementException e) { log.error("Error when extracting the device list from user[" + user + "].", e); } } diff --git a/components/application-mgt/org.wso2.carbon.device.application.mgt.core/src/main/java/org/wso2/carbon/device/application/mgt/core/internal/DataHolder.java b/components/application-mgt/org.wso2.carbon.device.application.mgt.core/src/main/java/org/wso2/carbon/device/application/mgt/core/internal/DataHolder.java index 31de14afa3..5019ac1cd9 100644 --- a/components/application-mgt/org.wso2.carbon.device.application.mgt.core/src/main/java/org/wso2/carbon/device/application/mgt/core/internal/DataHolder.java +++ b/components/application-mgt/org.wso2.carbon.device.application.mgt.core/src/main/java/org/wso2/carbon/device/application/mgt/core/internal/DataHolder.java @@ -18,7 +18,16 @@ */ package org.wso2.carbon.device.application.mgt.core.internal; -import org.wso2.carbon.device.application.mgt.common.services.*; +import org.wso2.carbon.device.application.mgt.common.services.ApplicationManager; +import org.wso2.carbon.device.application.mgt.common.services.ApplicationReleaseManager; +import org.wso2.carbon.device.application.mgt.common.services.ApplicationStorageManager; +import org.wso2.carbon.device.application.mgt.common.services.CategoryManager; +import org.wso2.carbon.device.application.mgt.common.services.CommentsManager; +import org.wso2.carbon.device.application.mgt.common.services.LifecycleStateManager; +import org.wso2.carbon.device.application.mgt.common.services.PlatformManager; +import org.wso2.carbon.device.application.mgt.common.services.PlatformStorageManager; +import org.wso2.carbon.device.application.mgt.common.services.SubscriptionManager; +import org.wso2.carbon.device.application.mgt.common.services.VisibilityManager; import org.wso2.carbon.device.mgt.core.service.DeviceManagementProviderService; import org.wso2.carbon.user.core.service.RealmService; @@ -152,4 +161,8 @@ public class DataHolder { public void setPlatformStorageManager(PlatformStorageManager platformStorageManager) { this.platformStorageManager = platformStorageManager; } + + public PlatformStorageManager getPlatformStorageManager() { + return platformStorageManager; + } } diff --git a/components/application-mgt/org.wso2.carbon.device.application.mgt.core/src/main/java/org/wso2/carbon/device/application/mgt/core/internal/ServiceComponent.java b/components/application-mgt/org.wso2.carbon.device.application.mgt.core/src/main/java/org/wso2/carbon/device/application/mgt/core/internal/ServiceComponent.java index bb12107284..9de7e593b2 100644 --- a/components/application-mgt/org.wso2.carbon.device.application.mgt.core/src/main/java/org/wso2/carbon/device/application/mgt/core/internal/ServiceComponent.java +++ b/components/application-mgt/org.wso2.carbon.device.application.mgt.core/src/main/java/org/wso2/carbon/device/application/mgt/core/internal/ServiceComponent.java @@ -23,12 +23,20 @@ import org.apache.commons.logging.LogFactory; import org.osgi.framework.BundleContext; import org.osgi.service.component.ComponentContext; import org.wso2.carbon.device.application.mgt.common.exception.InvalidConfigurationException; -import org.wso2.carbon.device.application.mgt.common.services.*; +import org.wso2.carbon.device.application.mgt.common.services.ApplicationManager; +import org.wso2.carbon.device.application.mgt.common.services.ApplicationReleaseManager; +import org.wso2.carbon.device.application.mgt.common.services.ApplicationStorageManager; +import org.wso2.carbon.device.application.mgt.common.services.CategoryManager; +import org.wso2.carbon.device.application.mgt.common.services.CommentsManager; +import org.wso2.carbon.device.application.mgt.common.services.LifecycleStateManager; +import org.wso2.carbon.device.application.mgt.common.services.PlatformManager; +import org.wso2.carbon.device.application.mgt.common.services.PlatformStorageManager; +import org.wso2.carbon.device.application.mgt.common.services.SubscriptionManager; +import org.wso2.carbon.device.application.mgt.common.services.VisibilityManager; import org.wso2.carbon.device.application.mgt.core.config.ConfigurationManager; import org.wso2.carbon.device.application.mgt.core.dao.common.DAOFactory; import org.wso2.carbon.device.application.mgt.core.exception.ApplicationManagementDAOException; import org.wso2.carbon.device.application.mgt.core.util.ApplicationManagementUtil; -import org.wso2.carbon.device.application.mgt.core.util.Constants; import org.wso2.carbon.device.mgt.core.service.DeviceManagementProviderService; import org.wso2.carbon.ndatasource.core.DataSourceService; import org.wso2.carbon.user.core.service.RealmService; diff --git a/components/application-mgt/org.wso2.carbon.device.application.mgt.core/src/main/java/org/wso2/carbon/device/application/mgt/core/util/ApplicationManagementUtil.java b/components/application-mgt/org.wso2.carbon.device.application.mgt.core/src/main/java/org/wso2/carbon/device/application/mgt/core/util/ApplicationManagementUtil.java index acc83f34ae..1604b4768d 100644 --- a/components/application-mgt/org.wso2.carbon.device.application.mgt.core/src/main/java/org/wso2/carbon/device/application/mgt/core/util/ApplicationManagementUtil.java +++ b/components/application-mgt/org.wso2.carbon.device.application.mgt.core/src/main/java/org/wso2/carbon/device/application/mgt/core/util/ApplicationManagementUtil.java @@ -21,7 +21,16 @@ package org.wso2.carbon.device.application.mgt.core.util; import org.apache.commons.logging.Log; import org.apache.commons.logging.LogFactory; import org.wso2.carbon.device.application.mgt.common.exception.InvalidConfigurationException; -import org.wso2.carbon.device.application.mgt.common.services.*; +import org.wso2.carbon.device.application.mgt.common.services.ApplicationManager; +import org.wso2.carbon.device.application.mgt.common.services.ApplicationReleaseManager; +import org.wso2.carbon.device.application.mgt.common.services.ApplicationStorageManager; +import org.wso2.carbon.device.application.mgt.common.services.CategoryManager; +import org.wso2.carbon.device.application.mgt.common.services.CommentsManager; +import org.wso2.carbon.device.application.mgt.common.services.LifecycleStateManager; +import org.wso2.carbon.device.application.mgt.common.services.PlatformManager; +import org.wso2.carbon.device.application.mgt.common.services.PlatformStorageManager; +import org.wso2.carbon.device.application.mgt.common.services.SubscriptionManager; +import org.wso2.carbon.device.application.mgt.common.services.VisibilityManager; import org.wso2.carbon.device.application.mgt.core.config.ConfigurationManager; import org.wso2.carbon.device.application.mgt.core.config.Extension; diff --git a/components/application-mgt/org.wso2.carbon.device.application.mgt.core/src/main/java/org/wso2/carbon/device/application/mgt/core/util/StorageManagementUtil.java b/components/application-mgt/org.wso2.carbon.device.application.mgt.core/src/main/java/org/wso2/carbon/device/application/mgt/core/util/StorageManagementUtil.java index d644fb52cd..4c8f01250d 100644 --- a/components/application-mgt/org.wso2.carbon.device.application.mgt.core/src/main/java/org/wso2/carbon/device/application/mgt/core/util/StorageManagementUtil.java +++ b/components/application-mgt/org.wso2.carbon.device.application.mgt.core/src/main/java/org/wso2/carbon/device/application/mgt/core/util/StorageManagementUtil.java @@ -1,3 +1,21 @@ +/* +* Copyright (c) 2017, WSO2 Inc. (http://www.wso2.org) All Rights Reserved. +* WSO2 Inc. licenses this file to you under the Apache License, +* Version 2.0 (the "License"); you may not use this file except +* in compliance with the License. +* You may obtain a copy of the License at +* +* http://www.apache.org/licenses/LICENSE-2.0 +* +* Unless required by applicable law or agreed to in writing, +* software distributed under the License is distributed on an +* "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY +* KIND, either express or implied. See the License for the +* specific language governing permissions and limitations +* under the License. +* +*/ + package org.wso2.carbon.device.application.mgt.core.util; import org.apache.commons.codec.binary.Base64; @@ -6,7 +24,12 @@ import org.wso2.carbon.device.application.mgt.common.ImageArtifact; import org.wso2.carbon.device.application.mgt.common.exception.ApplicationStorageManagementException; import org.wso2.carbon.device.application.mgt.common.exception.ResourceManagementException; -import java.io.*; +import java.io.File; +import java.io.FileInputStream; +import java.io.FileOutputStream; +import java.io.IOException; +import java.io.InputStream; +import java.io.OutputStream; import java.nio.file.Files; public class StorageManagementUtil { diff --git a/components/application-mgt/org.wso2.carbon.device.application.mgt.core/src/test/resources/application-mgt.xml b/components/application-mgt/org.wso2.carbon.device.application.mgt.core/src/test/resources/application-mgt.xml index c2cac41857..618a2093b9 100644 --- a/components/application-mgt/org.wso2.carbon.device.application.mgt.core/src/test/resources/application-mgt.xml +++ b/components/application-mgt/org.wso2.carbon.device.application.mgt.core/src/test/resources/application-mgt.xml @@ -58,4 +58,4 @@ - \ No newline at end of file + diff --git a/features/application-mgt/org.wso2.carbon.device.application.mgt.server.feature/src/main/resources/conf/application-mgt.xml b/features/application-mgt/org.wso2.carbon.device.application.mgt.server.feature/src/main/resources/conf/application-mgt.xml index bd74672de3..38bf6168c7 100644 --- a/features/application-mgt/org.wso2.carbon.device.application.mgt.server.feature/src/main/resources/conf/application-mgt.xml +++ b/features/application-mgt/org.wso2.carbon.device.application.mgt.server.feature/src/main/resources/conf/application-mgt.xml @@ -60,4 +60,4 @@ - \ No newline at end of file + From 813302e55527ef2b767d331847359e08133ed276 Mon Sep 17 00:00:00 2001 From: megala21 Date: Thu, 5 Oct 2017 13:55:34 +0530 Subject: [PATCH 05/32] Refactoring --- .../impl/PlatformManagementAPIImpl.java | 2 +- .../core/impl/PlatformStorageManagerImpl.java | 23 ++++++++++--------- 2 files changed, 13 insertions(+), 12 deletions(-) diff --git a/components/application-mgt/org.wso2.carbon.device.application.mgt.api/src/main/java/org/wso2/carbon/device/application/mgt/api/services/impl/PlatformManagementAPIImpl.java b/components/application-mgt/org.wso2.carbon.device.application.mgt.api/src/main/java/org/wso2/carbon/device/application/mgt/api/services/impl/PlatformManagementAPIImpl.java index 46ddae38c4..32984446e0 100644 --- a/components/application-mgt/org.wso2.carbon.device.application.mgt.api/src/main/java/org/wso2/carbon/device/application/mgt/api/services/impl/PlatformManagementAPIImpl.java +++ b/components/application-mgt/org.wso2.carbon.device.application.mgt.api/src/main/java/org/wso2/carbon/device/application/mgt/api/services/impl/PlatformManagementAPIImpl.java @@ -141,7 +141,7 @@ public class PlatformManagementAPIImpl implements PlatformManagementAPI { + tenantId, e); return APIUtil.getResponse(e, Response.Status.NOT_FOUND); } catch (PlatformStorageManagementException e) { - log.error("Platform Storage Management Exception while trying to update the icon for the platform : " + id + log.error("Platform Storage Management Exception while trying to get the icon for the platform : " + id + " for the tenant : " + tenantId, e); return APIUtil.getResponse(e, Response.Status.NOT_FOUND); } diff --git a/components/application-mgt/org.wso2.carbon.device.application.mgt.core/src/main/java/org/wso2/carbon/device/application/mgt/core/impl/PlatformStorageManagerImpl.java b/components/application-mgt/org.wso2.carbon.device.application.mgt.core/src/main/java/org/wso2/carbon/device/application/mgt/core/impl/PlatformStorageManagerImpl.java index d748d79afc..d0b71fcd2d 100644 --- a/components/application-mgt/org.wso2.carbon.device.application.mgt.core/src/main/java/org/wso2/carbon/device/application/mgt/core/impl/PlatformStorageManagerImpl.java +++ b/components/application-mgt/org.wso2.carbon.device.application.mgt.core/src/main/java/org/wso2/carbon/device/application/mgt/core/impl/PlatformStorageManagerImpl.java @@ -69,12 +69,12 @@ public class PlatformStorageManagerImpl implements PlatformStorageManager { + "directly to the deployment location inside icon folder"); } if (platform.isShared() && tenantId != MultitenantConstants.SUPER_TENANT_ID) { - throw new PlatformStorageManagementException("Platform " + platformIdentifier + " is a share platform from " - + "super-tenant. Only the super-tenant users can modify it"); + throw new PlatformStorageManagementException("Platform " + platformIdentifier + + " is a shared platform from super-tenant. Only the super-tenant users can modify it"); } if (log.isDebugEnabled()) { - log.debug("Artifact Directory Path for saving the artifacts related with application " - + platformIdentifier + " is " + storagePath); + log.debug("Artifact Directory Path for saving the artifacts related with application " + platformIdentifier + + " is " + storagePath); } StorageManagementUtil.createArtifactDirectory(storagePath); if (iconFileStream != null) { @@ -82,8 +82,8 @@ public class PlatformStorageManagerImpl implements PlatformStorageManager { saveFile(iconFileStream, storagePath + File.separator + platform.getId()); } catch (IOException e) { throw new ApplicationStorageManagementException( - "IO Exception while saving the icon file in the server for the platform " - + platformIdentifier, e); + "IO Exception while saving the icon file in the server for the platform " + platformIdentifier, + e); } } } @@ -127,8 +127,8 @@ public class PlatformStorageManagerImpl implements PlatformStorageManager { String imageArtifactPath = storagePath + platform.getId(); if (platform.isShared() && tenantId != MultitenantConstants.SUPER_TENANT_ID) { - throw new PlatformStorageManagementException("Platform " + platformIdentifier + " is a share platform from " - + "super-tenant. Only the super-tenant users can modify it"); + throw new PlatformStorageManagementException("Platform " + platformIdentifier + " is a shared platform " + + "from super-tenant. Only the super-tenant users can modify it"); } if (platform.isFileBased()) { throw new PlatformStorageManagementException("Platform " + platformIdentifier + " is a file based one. " @@ -154,13 +154,14 @@ public class PlatformStorageManagerImpl implements PlatformStorageManager { PlatformManager platformManager = DataHolder.getInstance().getPlatformManager(); platform = platformManager.getPlatform(tenantId, identifier); } catch (PlatformManagementException e) { - throw new PlatformStorageManagementException("Platform Management Exception while getting the platform " - + "related with the identifier " + identifier); + throw new PlatformStorageManagementException( + "Platform Management Exception while getting the platform " + "related with the identifier " + + identifier); } if (platform == null) { throw new PlatformStorageManagementException("Platform does not exist with the identifier " + identifier); } - return platform; + return platform; } } From 4cdb1fc4c9e3570ea17058d5eb9e556188342690 Mon Sep 17 00:00:00 2001 From: Menaka Jayawardena Date: Mon, 2 Oct 2017 12:19:52 +0530 Subject: [PATCH 06/32] Stepper header implementation stage 1. --- .../public/themes/default/default-theme.css | 59 +++++++++++++++++-- .../AppPublisherBase/BaseLayout.jsx | 29 ++++++--- .../Application/ApplicationListing.jsx | 2 +- .../Application/Create/ApplicationCreate.jsx | 30 +++++++++- 4 files changed, 104 insertions(+), 16 deletions(-) diff --git a/components/application-mgt/org.wso2.carbon.device.application.mgt.publisher.ui/src/main/resources/publisher/public/themes/default/default-theme.css b/components/application-mgt/org.wso2.carbon.device.application.mgt.publisher.ui/src/main/resources/publisher/public/themes/default/default-theme.css index 0afbb7ba5f..2470cc0c5c 100644 --- a/components/application-mgt/org.wso2.carbon.device.application.mgt.publisher.ui/src/main/resources/publisher/public/themes/default/default-theme.css +++ b/components/application-mgt/org.wso2.carbon.device.application.mgt.publisher.ui/src/main/resources/publisher/public/themes/default/default-theme.css @@ -85,6 +85,31 @@ body { float: right; } +#header-button { + border-radius: 50%; + background-color: transparent; + border: none; + height: 50px; + width: 50px; + margin-right: 10px; + position: relative; +} + +#header-button:hover { + background-color: #4353bd; + cursor: pointer; +} + +#header-button i { + position: absolute; + bottom: 19px; + left: 17px; +} + +#header-button { + outline: none; +} + .btn-header { margin-top: 15px; margin-right: 20px; @@ -104,7 +129,7 @@ body { position: relative; float: right; top: 75px; - left: 80px; + left: 150px; margin-right: 16px; } @@ -127,26 +152,33 @@ body { top: 100px; } +#app-main-content { + height: 100%; + position: inherit; + top: 125px; +} + /* Holds the app publisher pages. */ #application-content { height: auto; width: 80%; - margin: 150px auto; + margin: 20px auto; box-shadow: -2px 4px 8px 0 rgba(0, 0, 0, 0.2), 0 6px 20px 0 rgba(0, 0, 0, 0.19); padding: 10px 10px 10px 10px; } .stepper-header { width: 100%; - border-bottom: solid 1px cornflowerblue; + color: #BaBaBa; padding-bottom: 5px; margin-bottom: 10px; } .platform-link-placeholder { color: #888888; + width: 80%; float: right; - margin-right: 20px; + margin: 10px auto; padding-bottom: 10px; } @@ -232,6 +264,25 @@ body { overflow-y: auto; } +#secondary-button { + float: right; + background-color: transparent; + border: none; +} + +#secondary-button:hover { + background-color: #e9e9e9; + outline: none; + cursor: pointer; +} + +.step-index { + height: 20px; + width: 20px; + background-color: #2196F3; + border-radius: 50%; +} + #img-btn-screenshot { margin: 0 5px 0 5px; } diff --git a/components/application-mgt/org.wso2.carbon.device.application.mgt.publisher.ui/src/main/resources/publisher/src/components/AppPublisherBase/BaseLayout.jsx b/components/application-mgt/org.wso2.carbon.device.application.mgt.publisher.ui/src/main/resources/publisher/src/components/AppPublisherBase/BaseLayout.jsx index 843788c7c3..2e1858a815 100644 --- a/components/application-mgt/org.wso2.carbon.device.application.mgt.publisher.ui/src/main/resources/publisher/src/components/AppPublisherBase/BaseLayout.jsx +++ b/components/application-mgt/org.wso2.carbon.device.application.mgt.publisher.ui/src/main/resources/publisher/src/components/AppPublisherBase/BaseLayout.jsx @@ -20,8 +20,8 @@ import PropTypes from 'prop-types'; import React, {Component} from 'react'; import {withRouter} from 'react-router-dom'; import AuthHandler from "../../api/authHandler"; +import {Button, Col, Container, Input, Row,} from 'reactstrap'; import ApplicationCreate from '../Application/Create/ApplicationCreate'; -import {Col, Container, Input, Row,} from 'reactstrap'; import FloatingButton from "../UIComponents/FloatingButton/FloatingButton"; import {FormattedMessage} from 'react-intl'; @@ -70,17 +70,21 @@ class BaseLayout extends Component { this.setState({openModal: false}); } + onClickPlatforms() { + window.location.href = "/assets/platforms"; + } + render() { return ( - +
-
+
+ +
+ +
+
- - {this.props.children} - +
+ + + {this.props.children} + + +
diff --git a/components/application-mgt/org.wso2.carbon.device.application.mgt.publisher.ui/src/main/resources/publisher/src/components/Application/ApplicationListing.jsx b/components/application-mgt/org.wso2.carbon.device.application.mgt.publisher.ui/src/main/resources/publisher/src/components/Application/ApplicationListing.jsx index 491601580c..5b9eac328d 100644 --- a/components/application-mgt/org.wso2.carbon.device.application.mgt.publisher.ui/src/main/resources/publisher/src/components/Application/ApplicationListing.jsx +++ b/components/application-mgt/org.wso2.carbon.device.application.mgt.publisher.ui/src/main/resources/publisher/src/components/Application/ApplicationListing.jsx @@ -246,7 +246,7 @@ class ApplicationListing extends Component { {application.platform} {application.status} - diff --git a/components/application-mgt/org.wso2.carbon.device.application.mgt.publisher.ui/src/main/resources/publisher/src/components/Application/Create/ApplicationCreate.jsx b/components/application-mgt/org.wso2.carbon.device.application.mgt.publisher.ui/src/main/resources/publisher/src/components/Application/Create/ApplicationCreate.jsx index 5586997e14..d42c98c1de 100644 --- a/components/application-mgt/org.wso2.carbon.device.application.mgt.publisher.ui/src/main/resources/publisher/src/components/Application/Create/ApplicationCreate.jsx +++ b/components/application-mgt/org.wso2.carbon.device.application.mgt.publisher.ui/src/main/resources/publisher/src/components/Application/Create/ApplicationCreate.jsx @@ -71,7 +71,7 @@ class ApplicationCreate extends Component { * Handles next button click event. * */ onNextClick() { - console.log("Handle Next"); //TODO: Remove this + console.log(this.state.stepIndex); //TODO: Remove this const {stepIndex} = this.state; this.setState({ stepIndex: stepIndex + 1, @@ -108,10 +108,11 @@ class ApplicationCreate extends Component { * This clears the data in the current step and returns to the previous step. * */ onPrevClick() { + console.log(this.state.stepIndex); const {stepIndex} = this.state; if (stepIndex > 0) { this.removeStepData(); - this.setState({stepIndex: stepIndex - 1}); + this.setState({stepIndex: stepIndex - 1, finished: false}); } }; @@ -204,6 +205,10 @@ class ApplicationCreate extends Component { } } + setStepHeader(stepIndex) { + + } + render() { const {finished, stepIndex} = this.state; @@ -218,7 +223,26 @@ class ApplicationCreate extends Component {
- + + +
+
1
+
General Info
+
+ + + 2 + Select Platform + + + 3 + Screenshots + + + 4 + Release + +
From 7fa3c886fb1e1db3017c00dc7d6aba47f74962cc Mon Sep 17 00:00:00 2001 From: Menaka Jayawardena Date: Tue, 3 Oct 2017 15:01:58 +0530 Subject: [PATCH 07/32] Api integration: Application Create steps. --- .../src/main/resources/publisher/package.json | 22 +- .../public/themes/default/default-theme.css | 99 +++-- .../AppPublisherBase/BaseLayout.jsx | 39 +- .../Application/ApplicationListing.jsx | 136 +++--- .../Application/Create/ApplicationCreate.jsx | 84 ++-- .../Application/Create/CreateSteps/Step1.jsx | 176 ++++++-- .../Application/Create/CreateSteps/Step2.jsx | 53 ++- .../Application/Create/CreateSteps/Step3.jsx | 44 +- .../Application/Create/CreateSteps/Step4.jsx | 36 +- .../Edit/Base/ApplicationEditBaseLayout.jsx | 1 + .../Application/View/ApplicationView.jsx | 170 +++---- .../{PlatformView.jsx => Platform.jsx} | 17 +- .../components/Platform/PlatformCreate.jsx | 414 ++---------------- .../components/Platform/PlatformListing.jsx | 152 ++----- .../UIComponents/DataTable/DataTable.jsx | 2 +- .../UIComponents/DataTable/DataTableRow.jsx | 2 +- .../src/components/User/Login/Login.jsx | 43 +- 17 files changed, 635 insertions(+), 855 deletions(-) rename components/application-mgt/org.wso2.carbon.device.application.mgt.publisher.ui/src/main/resources/publisher/src/components/Platform/{PlatformView.jsx => Platform.jsx} (63%) diff --git a/components/application-mgt/org.wso2.carbon.device.application.mgt.publisher.ui/src/main/resources/publisher/package.json b/components/application-mgt/org.wso2.carbon.device.application.mgt.publisher.ui/src/main/resources/publisher/package.json index 9c9755c4a1..f64919b7fe 100644 --- a/components/application-mgt/org.wso2.carbon.device.application.mgt.publisher.ui/src/main/resources/publisher/package.json +++ b/components/application-mgt/org.wso2.carbon.device.application.mgt.publisher.ui/src/main/resources/publisher/package.json @@ -10,18 +10,18 @@ "license": "Apache License 2.0", "dependencies": { "axios": "^0.16.2", - "bootstrap": "^4.0.0-alpha.6", + "bootstrap": "^4.0.0-beta", "flux": "^3.1.3", "history": "^4.7.2", "latest-version": "^3.1.0", - "material-ui": "^0.19.1", - "prop-types": "^15.5.10", - "qs": "^6.5.0", - "react": "^15.6.1", - "react-addons-css-transition-group": "^15.6.0", - "react-addons-transition-group": "^15.6.0", - "react-dom": "^15.6.1", - "react-dropzone": "^4.1.2", + "material-ui": "^0.19.3", + "prop-types": "^15.6.0", + "qs": "^6.5.1", + "react": "^15.6.2", + "react-addons-css-transition-group": "^15.6.2", + "react-addons-transition-group": "^15.6.2", + "react-dom": "^15.6.2", + "react-dropzone": "^4.1.3", "react-images-uploader": "^1.1.0", "react-material-ui-form-validator": "^0.5.1", "react-modal": "^2.3.2", @@ -43,8 +43,8 @@ "css-loader": "^0.28.7", "less": "^2.7.2", "less-loader": "^4.0.4", - "mocha": "^3.4.1", - "mock-local-storage": "^1.0.2", + "mocha": "^3.5.3", + "mock-local-storage": "^1.0.5", "node-sass": "^4.5.3", "react-intl": "^2.4.0", "sass-loader": "^6.0.6", diff --git a/components/application-mgt/org.wso2.carbon.device.application.mgt.publisher.ui/src/main/resources/publisher/public/themes/default/default-theme.css b/components/application-mgt/org.wso2.carbon.device.application.mgt.publisher.ui/src/main/resources/publisher/public/themes/default/default-theme.css index 2470cc0c5c..3aef9f7675 100644 --- a/components/application-mgt/org.wso2.carbon.device.application.mgt.publisher.ui/src/main/resources/publisher/public/themes/default/default-theme.css +++ b/components/application-mgt/org.wso2.carbon.device.application.mgt.publisher.ui/src/main/resources/publisher/public/themes/default/default-theme.css @@ -39,13 +39,16 @@ body { } #login-container { - width: 50%; - margin: 0 auto } #login-card { + width: 20%; + height: 50%; + margin: 10% auto; + padding: 10px; border-radius: 0; - background-color: #BaBaBa; + background-color: #ffffff; + box-shadow: -2px 4px 8px 0 rgba(0, 0, 0, 0.2), 0 6px 20px 0 rgba(0, 0, 0, 0.19); } /* Base layout container */ @@ -130,7 +133,7 @@ body { float: right; top: 75px; left: 150px; - margin-right: 16px; + margin-right: 40px; } #search { @@ -148,14 +151,13 @@ body { /* Application Add button */ #add-btn-container { position: absolute; - left: 12%; + left: 11%; top: 100px; } #app-main-content { - height: 100%; - position: inherit; - top: 125px; + margin-top: 140px; + max-width: 98%; } /* Holds the app publisher pages. */ @@ -163,8 +165,8 @@ body { height: auto; width: 80%; margin: 20px auto; - box-shadow: -2px 4px 8px 0 rgba(0, 0, 0, 0.2), 0 6px 20px 0 rgba(0, 0, 0, 0.19); - padding: 10px 10px 10px 10px; + box-shadow: 2px 4px 8px 0 rgba(0, 0, 0, 0.2), 0 6px 20px 0 rgba(0, 0, 0, 0.19); + padding: 0 10px 10px 10px; } .stepper-header { @@ -183,10 +185,17 @@ body { } #application-list { - margin-top: 20px; transition: margin-right .5s; } +.app-list-table-header { + height: 100px; +} + +#app-visibility-default { + display: none; +} + #app-image-screenshot { width: 300px; height: 300px; @@ -207,7 +216,6 @@ body { height: 150px; border-radius: 5%; position: relative; - background-color: rgba(157, 159, 157, 0.53); border: dashed #888888 2px; } @@ -223,7 +231,6 @@ body { margin: 0 5px 0 5px; border-radius: 10%; position: relative; - background-color: rgba(157, 159, 157, 0.53); border: dashed #888888 2px; } @@ -238,7 +245,6 @@ body { height: 150px; border-radius: 10%; position: relative; - background-color: rgba(157, 159, 157, 0.53); border: dashed #888888 2px; } @@ -249,6 +255,7 @@ body { } #screenshot-container { + max-width: 600px; display: flex; overflow-x: auto; height: 200px; @@ -266,12 +273,13 @@ body { #secondary-button { float: right; + color: #979797; background-color: transparent; border: none; } #secondary-button:hover { - background-color: #e9e9e9; + background-color: #d8d8d8; outline: none; cursor: pointer; } @@ -327,12 +335,12 @@ body { } /* Application View */ + #application-view-content { width: 100%; } - #application-view-row { - margin: 10px 10px 20px 20px; + margin: 10px 10px 0 20px; } #app-icon { @@ -366,14 +374,14 @@ body { } /* Application Edit Base Layout */ + #application-edit-header { - height: 50px; + height: 40px; width: 100%; - margin: 0; - font-size: 20px; - border-bottom: solid 1px #d8d8d8; + margin-top: 20px; + margin-bottom: 20px; + font-size: 25px; } - .application-header-text { margin: 10px 0px 0px 10px; } @@ -399,13 +407,14 @@ body { } /*Tab styling*/ + div.tab { float: left; border-right: 1px solid #d8d8d8; height: 100%; } - /* Style the tab buttons */ + div.tab button { display: block; background-color: inherit; @@ -418,24 +427,23 @@ div.tab button { cursor: pointer; transition: 0.3s; } - /* Change background color of buttons on hover */ + div.tab button:hover { background-color: #ddd6d7; cursor: pointer; } - /* Create an active/current "tab button" class */ + div.tab button.active { background-color: #1b3bcc; color: white; } - - #application-edit-main-container { display: flex; } + #application-edit-outer-content { height: auto; width: 100%; @@ -453,13 +461,13 @@ div.tab button.active { .back-to-app { position: absolute; - height: 40px; - width: 40px; + height: 50px; + width: 50px; border-radius: 50%; } .back-to-app i { - padding: 10px 10px 10px 10px; + padding: 12px 10px 10px 12px; } .back-to-app:hover { @@ -469,11 +477,11 @@ div.tab button.active { } /* Create Release and Release management */ + .release-header { margin-top: 20px; margin-bottom: 20px; } - .release-create { height: 150px; margin-bottom: 20px; @@ -523,12 +531,39 @@ div.tab button.active { } /* Application Edit General Info */ + .app-edit-general-info { margin-top: 20px; max-width: 100%; } - .save-info { float: right; margin-bottom: 10px; } + +/* Platform Specific Styles. */ +#platform-listing { + margin: 10px; +} + +.create-platform { + padding-left: 90%; +} + +#platform-list { + margin-top: 20px; + display: flex; + flex-flow: wrap; +} + +#platform-content { + width: 200px; + height: 300px; + margin: 10px; + box-shadow: 2px 4px 8px 0 rgba(0, 0, 0, 0.2), 0 6px 20px 0 rgba(0, 0, 0, 0.19); +} + +#platform-content:hover { + background-color: #f2f2f2; + cursor: pointer; +} diff --git a/components/application-mgt/org.wso2.carbon.device.application.mgt.publisher.ui/src/main/resources/publisher/src/components/AppPublisherBase/BaseLayout.jsx b/components/application-mgt/org.wso2.carbon.device.application.mgt.publisher.ui/src/main/resources/publisher/src/components/AppPublisherBase/BaseLayout.jsx index 2e1858a815..de5828aaad 100644 --- a/components/application-mgt/org.wso2.carbon.device.application.mgt.publisher.ui/src/main/resources/publisher/src/components/AppPublisherBase/BaseLayout.jsx +++ b/components/application-mgt/org.wso2.carbon.device.application.mgt.publisher.ui/src/main/resources/publisher/src/components/AppPublisherBase/BaseLayout.jsx @@ -76,7 +76,7 @@ class BaseLayout extends Component { render() { return ( - +
-
- -
- -
-
- -
- - - {this.props.children} - - -
-
-
+ +
+ +
+ +
+
+ +
+ + + {this.props.children} + + +
+
+
+
- +
); } } diff --git a/components/application-mgt/org.wso2.carbon.device.application.mgt.publisher.ui/src/main/resources/publisher/src/components/Application/ApplicationListing.jsx b/components/application-mgt/org.wso2.carbon.device.application.mgt.publisher.ui/src/main/resources/publisher/src/components/Application/ApplicationListing.jsx index 5b9eac328d..3d05b1b889 100644 --- a/components/application-mgt/org.wso2.carbon.device.application.mgt.publisher.ui/src/main/resources/publisher/src/components/Application/ApplicationListing.jsx +++ b/components/application-mgt/org.wso2.carbon.device.application.mgt.publisher.ui/src/main/resources/publisher/src/components/Application/ApplicationListing.jsx @@ -22,6 +22,8 @@ import {Button, Col, Row, Table} from 'reactstrap'; import Drawer from '../UIComponents/Drawer/Drawer'; import ApplicationView from './View/ApplicationView'; import {FormattedMessage} from 'react-intl'; +import ApplicationMgtApi from "../../api/applicationMgtApi"; +import AuthHandler from "../../api/authHandler"; /** * The App Create Component. @@ -36,10 +38,10 @@ class ApplicationListing extends Component { super(); this.searchApplications = this.searchApplications.bind(this); this.onRowClick = this.onRowClick.bind(this); - this.setData = this.setData.bind(this); this.sortData = this.sortData.bind(this); this.compare = this.compare.bind(this); - this.handleButtonClick = this.handleButtonClick.bind(this); + this.onAppEditClick = this.onAppEditClick.bind(this); + this.getSelectedApplication = this.getSelectedApplication.bind(this); this.state = { searchedApplications: [], applications: [], @@ -57,7 +59,6 @@ class ApplicationListing extends Component { }; } - applications = [ { id: "3242342ffww3423", @@ -84,35 +85,57 @@ class ApplicationListing extends Component { }, ]; - componentWillMount() { + headers = [ + { + data_id: "image", + data_type: "image", + sortable: false, + label: "" + }, + { + data_id: "applicationName", + data_type: "string", + sortable: true, + label: "Application Name", + sort: this.sortData + }, + { + data_id: "platform", + data_type: "image_array", + sortable: false, + label: "Platform" + }, + { + data_id: "category", + data_type: "string", + sortable: false, + label: "Category" + }, + { + data_id: "status", + data_type: "string", + sortable: false, + label: "Status" + }, + { + data_id: "edit", + data_type: "button", + sortable: false, + label: "" + } + ]; - // let getApps = ApplicationMgtApi.getApplications(); - // getApps.then(response => { - // let apps = this.setData(response.data.applications); - // console.log(apps); //TODO: Remove this. - // this.setState({searchedApplications: apps}); - // // console.log(this.setState({data: response.data}), console.log(this.state)); - // }).catch(err => { - // AuthHandler.unauthorizedErrorHandler(err); - // }); - } - /** - * Extract application from application list and update the state. - * */ - setData(applications) { - let apps = []; - for (let app in applications) { - let application = {}; - application.id = applications[app].uuid; - application.applicationName = applications[app].name; - application.platform = applications[app].platform.name; - application.category = applications[app].category.id; - application.status = applications[app].currentLifecycle.lifecycleState.name; - apps.push(application); - } + componentWillMount() { - this.setState({searchedApplications: apps}); + let getApps = ApplicationMgtApi.getApplications(); + getApps.then(response => { + console.log(response.data.applications); + this.setState({searchedApplications: response.data.applications}); + // console.log(this.setState({data: response.data}), console.log(this.state)); + }).catch(err => { + AuthHandler.unauthorizedErrorHandler(err); + }); } /** @@ -154,34 +177,22 @@ class ApplicationListing extends Component { return 0; } - onRowClick() { + onRowClick(uuid) { + let selectedApp = this.getSelectedApplication(uuid); let style = { - width: '500px', - marginLeft: '500px' + width: '550px', + marginLeft: '550px' }; let appListStyle = { - marginRight: '500px', + marginRight: '550px', }; - this.setState({drawer: style, appListStyle: appListStyle}); - } - - handleButtonClick() { - console.log("Application Listing"); - this.props.history.push("apps/edit/fdsfdsf343"); + this.setState({drawer: style, appListStyle: appListStyle, application: selectedApp[0]}); } - remove(imageId) { - let tmp = this.state.image; - - console.log(imageId); - - let rem = tmp.filter((image) => { - return image.id !== imageId - - }); - this.setState({image: rem}); + onAppEditClick(uuid) { + this.props.history.push("apps/edit/" + uuid); } closeDrawer() { @@ -196,6 +207,12 @@ class ApplicationListing extends Component { this.setState({drawer: style, appListStyle: appListStyle}); } + getSelectedApplication(uuid) { + return this.state.searchedApplications.filter(application => { + return application.uuid === uuid; + }); + } + render() { return ( @@ -213,7 +230,7 @@ class ApplicationListing extends Component { - + {/* TODO: Remove console.log and add sort method. */} - {this.applications.map( + {this.state.searchedApplications.map( (application) => { return ( - - this.onRowClick(application.uuid)}> + - - - - + + + + @@ -259,7 +275,7 @@ class ApplicationListing extends Component { - + ); diff --git a/components/application-mgt/org.wso2.carbon.device.application.mgt.publisher.ui/src/main/resources/publisher/src/components/Application/Create/ApplicationCreate.jsx b/components/application-mgt/org.wso2.carbon.device.application.mgt.publisher.ui/src/main/resources/publisher/src/components/Application/Create/ApplicationCreate.jsx index d42c98c1de..38620bf8f2 100644 --- a/components/application-mgt/org.wso2.carbon.device.application.mgt.publisher.ui/src/main/resources/publisher/src/components/Application/Create/ApplicationCreate.jsx +++ b/components/application-mgt/org.wso2.carbon.device.application.mgt.publisher.ui/src/main/resources/publisher/src/components/Application/Create/ApplicationCreate.jsx @@ -21,7 +21,7 @@ import {withRouter} from 'react-router-dom'; import AuthHandler from "../../../api/authHandler"; import {Step1, Step2, Step3, Step4} from './CreateSteps/index'; import ApplicationMgtApi from '../../../api/applicationMgtApi'; -import {Button, Col, Modal, ModalBody, ModalFooter, ModalHeader, Row} from 'reactstrap'; +import {Col, Modal, ModalBody, ModalHeader, Row} from 'reactstrap'; import {FormattedMessage} from 'react-intl'; /** @@ -49,7 +49,11 @@ class ApplicationCreate extends Component { finished: false, stepIndex: 0, stepData: [], - isDialogOpen: false + isDialogOpen: false, + generalInfo: {}, + platform: {}, + screenshots: {}, + release: {} }; } @@ -61,10 +65,11 @@ class ApplicationCreate extends Component { this.setState({open: this.props.open}); } - + /** + * Resets the form and closes the modal. + * */ onClose() { - this.setState({stepIndex: 0}, this.props.close()); - + this.setState({stepIndex: 0, generalInfo: {}, platform: {}, screenshots: {}, release: {}}, this.props.close()); } /** @@ -111,7 +116,6 @@ class ApplicationCreate extends Component { console.log(this.state.stepIndex); const {stepIndex} = this.state; if (stepIndex > 0) { - this.removeStepData(); this.setState({stepIndex: stepIndex - 1, finished: false}); } }; @@ -123,10 +127,24 @@ class ApplicationCreate extends Component { * */ setStepData(step, data) { console.log(step, data, this.state.stepData); //TODO: Remove this - let tmpStepData = this.state.stepData; - tmpStepData.push({step: step, data: data}); - - this.setState({stepData: tmpStepData}, this.onNextClick()) + switch (step) { + case "generalInfo": { + this.setState({generalInfo: data}, this.onNextClick()); + break; + } + case "platform": { + this.setState({platform: data}, this.onNextClick()); + break; + } + case "screenshots": { + this.setState({screenshots: data}, this.onNextClick()); + break; + } + case "release": { + this.setState({release: data}, this.onNextClick()); + break; + } + } }; /** @@ -135,9 +153,10 @@ class ApplicationCreate extends Component { removeStepData() { let tempData = this.state.stepData; tempData.pop(); - this.setState({stepData: tempData}); + this.setState({stepData: tempData, stepIndex: 0}); }; + /* ----------------- Deprecated ----------------- */ /** * Handles the Yes button in app creation cancellation dialog. * Clears all the form data and reset the wizard. @@ -154,6 +173,8 @@ class ApplicationCreate extends Component { this.setState({isDialogOpen: false}); }; + /* ---------------------------------------------- */ + /** * Defines all the Steps in the stepper. (Wizard) * @@ -168,35 +189,36 @@ class ApplicationCreate extends Component { case 0: return ( ); case 1: return ( ); case 2: return ( ); case 3: { return ( ) } @@ -252,22 +274,6 @@ class ApplicationCreate extends Component { - - {stepIndex === 0 ?
: - } - - {finished ? - : - } -
); } diff --git a/components/application-mgt/org.wso2.carbon.device.application.mgt.publisher.ui/src/main/resources/publisher/src/components/Application/Create/CreateSteps/Step1.jsx b/components/application-mgt/org.wso2.carbon.device.application.mgt.publisher.ui/src/main/resources/publisher/src/components/Application/Create/CreateSteps/Step1.jsx index 4d1732f17b..9f011fdf67 100644 --- a/components/application-mgt/org.wso2.carbon.device.application.mgt.publisher.ui/src/main/resources/publisher/src/components/Application/Create/CreateSteps/Step1.jsx +++ b/components/application-mgt/org.wso2.carbon.device.application.mgt.publisher.ui/src/main/resources/publisher/src/components/Application/Create/CreateSteps/Step1.jsx @@ -20,6 +20,7 @@ import PropTypes from 'prop-types'; import React, {Component} from 'react'; import {Badge, FormGroup, Input, Label} from 'reactstrap'; import {FormattedMessage} from 'react-intl'; +import {Badge, Button, Form, FormGroup, Input, Label, ModalFooter} from 'reactstrap'; /** * The Second step of application create wizard. @@ -42,22 +43,32 @@ import {FormattedMessage} from 'react-intl'; class Step1 extends Component { constructor() { super(); + this.onTextFieldChange = this.onTextFieldChange.bind(this); + this.setStepData = this.setStepData.bind(this); + this.onCancelClick = this.onCancelClick.bind(this); + this.onVisibilityChange = this.onVisibilityChange.bind(this); + this.onVisibilityItemSelect = this.onVisibilityItemSelect.bind(this); + this.handleRequestDelete = this.handleRequestDelete.bind(this); this.state = { tags: [], - icon: [], - title: "", + name: "", errors: {}, - banner: [], defValue: "", category: 0, - visibility: 0, - description: "", - screenshots: [], - identifier: "", - shortDescription: "" + visibility: "", + description: "" }; } + componentWillMount() { + const defaultVals = this.props.defaultData; + + if(defaultVals) { + this.setState(defaultVals); + } + + } + /** * Create a tag on Enter key press and set it to the state. * Clears the tags text field. @@ -85,48 +96,101 @@ class Step1 extends Component { * Handles Chip delete function. * Removes the tag from state.tags * */ - handleRequestDelete(event) { - this.chipData = this.state.tags; - console.log(event.target); - const chipToDelete = this.chipData.map((chip) => chip.value).indexOf(event.target.value); - this.chipData.splice(chipToDelete, 1); - this.setState({tags: this.chipData}); + handleRequestDelete(key) { + let chipData = this.state.tags; + const chipToDelete = chipData.map((chip) => chip.key).indexOf(key); + chipData.splice(chipToDelete, 1); + this.setState({tags: chipData}); }; /** * Creates an object with the current step data and persist in the parent. * */ setStepData() { - let stepData = {}; - this.props.setData("step1", {step: stepData}); + const {name, description, tags, visibility} = this.state; + let stepData = { + name: name, + description: description, + tags: tags, + visibility: visibility + }; + this.props.setStepData("generalInfo", stepData); }; + onCancelClick() { + this.props.close(); + } + /** * Set text field values to state. * */ - onTextFieldChange(event, value) { - let field = event.target.id; + onTextFieldChange(event) { + let field = event.target.name; + console.log(field, event.target.value); switch (field) { - case "name": { - this.setState({name: value}); + case "appName": { + this.setState({name: event.target.value}); break; } - case "shortDescription": { - this.setState({shortDescription: value}); - break; - } - case "description": { - this.setState({description: value}); - break; - } - case "identifier": { - this.setState({identifier: value}); + case "appDescription": { + this.setState({description: event.target.value}); break; } } }; + onVisibilityChange(event) { + console.log(event.target.value); + this.setState({visibility: event.target.value}); + } + + onVisibilityItemSelect(event) { + + } + render() { + + const {visibility} = this.state; + + let visibilityItem = () => { + switch (visibility) { + case("public"): { + return
+ } + case("roles"): { + return + + + + + + + } + case ("groups"): { + return + + + + + + + } + default: { + return
+ } + } + }; + return (
@@ -135,13 +199,27 @@ class Step1 extends Component { - + - + @@ -176,9 +267,10 @@ class Step1 extends Component { {this.state.tags.map(tag => { return ( this.handleRequestDelete(tag.key)} > {tag.value} @@ -189,6 +281,10 @@ class Step1 extends Component {
+ + + +
); } diff --git a/components/application-mgt/org.wso2.carbon.device.application.mgt.publisher.ui/src/main/resources/publisher/src/components/Application/Create/CreateSteps/Step2.jsx b/components/application-mgt/org.wso2.carbon.device.application.mgt.publisher.ui/src/main/resources/publisher/src/components/Application/Create/CreateSteps/Step2.jsx index edc7b5ce71..3143b2eb85 100644 --- a/components/application-mgt/org.wso2.carbon.device.application.mgt.publisher.ui/src/main/resources/publisher/src/components/Application/Create/CreateSteps/Step2.jsx +++ b/components/application-mgt/org.wso2.carbon.device.application.mgt.publisher.ui/src/main/resources/publisher/src/components/Application/Create/CreateSteps/Step2.jsx @@ -20,7 +20,7 @@ import PropTypes from 'prop-types'; import React, {Component} from 'react'; import AuthHandler from "../../../../api/authHandler"; import PlatformMgtApi from "../../../../api/platformMgtApi"; -import {FormGroup, Input, Label} from 'reactstrap'; +import {Button, FormGroup, Input, Label, ModalFooter} from 'reactstrap'; import {FormattedMessage} from 'react-intl'; /** @@ -41,24 +41,28 @@ class Step2 extends Component { super(); this.setPlatforms = this.setPlatforms.bind(this); this.setStepData = this.setStepData.bind(this); + this.onCancelClick = this.onCancelClick.bind(this); + this.onBackClick = this.onBackClick.bind(this); this.platforms = []; this.state = { - finished: false, - stepIndex: 0, store: 1, platformSelectedIndex: 0, platform: "", - platforms: [], - stepData: [], - title: "", - titleError: "" + platforms: [] }; } + componentWillMount() { + const {defaultData} = this.props; + + if (defaultData) { + this.setState(defaultData); + } + } + componentDidMount() { //Get the list of available platforms and set to the state. PlatformMgtApi.getPlatforms().then(response => { - console.log(response); this.setPlatforms(response.data); }).catch(err => { AuthHandler.unauthorizedErrorHandler(err); @@ -83,18 +87,26 @@ class Step2 extends Component { * Persist the current form data to the state. * */ setStepData() { - let step = { - store: this.state.store, - platform: this.state.platforms[this.state.platformSelectedIndex] + const {store, platform} = this.state; + let data = { + store: store, + platform: platform[0] }; - this.props.setData("step2", {step: step}); + this.props.setStepData("platform", data); + } + + onCancelClick() { + this.props.close(); + } + + onBackClick() { + this.props.handlePrev(); } /** * Triggers when changing the Platform selection. * */ onChangePlatform(event) { - console.log(event.target.value, this.state.platforms); let id = event.target.value; let selectedPlatform = this.state.platforms.filter((platform) => { return platform.identifier === id; @@ -122,16 +134,27 @@ class Step2 extends Component { - + + {this.state.platforms.length > 0 ? this.state.platforms.map(platform => { return ( - ) }) : } + + + + +
); } diff --git a/components/application-mgt/org.wso2.carbon.device.application.mgt.publisher.ui/src/main/resources/publisher/src/components/Application/Create/CreateSteps/Step3.jsx b/components/application-mgt/org.wso2.carbon.device.application.mgt.publisher.ui/src/main/resources/publisher/src/components/Application/Create/CreateSteps/Step3.jsx index ed2e294f75..61b14509d3 100644 --- a/components/application-mgt/org.wso2.carbon.device.application.mgt.publisher.ui/src/main/resources/publisher/src/components/Application/Create/CreateSteps/Step3.jsx +++ b/components/application-mgt/org.wso2.carbon.device.application.mgt.publisher.ui/src/main/resources/publisher/src/components/Application/Create/CreateSteps/Step3.jsx @@ -19,7 +19,7 @@ import PropTypes from 'prop-types'; import Dropzone from 'react-dropzone'; import React, {Component} from 'react'; -import {FormGroup, Label} from 'reactstrap'; +import {Button, FormGroup, Label, ModalFooter} from 'reactstrap'; import AppImage from "../../../UIComponents/AppImage/AppImage"; import {FormattedMessage} from 'react-intl'; @@ -40,22 +40,23 @@ import {FormattedMessage} from 'react-intl'; class Step3 extends Component { constructor() { super(); + this.setStepData = this.setStepData.bind(this); + this.onBackClick = this.onBackClick.bind(this); + this.onCancelClick = this.onCancelClick.bind(this); this.state = { - tags: [], icon: [], - title: "", errors: {}, banner: [], - defValue: "", - category: 0, - visibility: 0, - description: "", screenshots: [], - identifier: "", - shortDescription: "" }; } + componentWillMount() { + const {defaultData} = this.props; + + this.setState(defaultData); + } + /** * Handles Chip delete function. * Removes the tag from state.tags @@ -72,15 +73,26 @@ class Step3 extends Component { * Creates an object with the current step data and persist in the parent. * */ setStepData() { + + const {icon, banner, screenshots} = this.state; + let stepData = { - icon: this.state.icon, - banner: this.state.banner, - screenshots: this.state.screenshots + icon: icon, + banner: banner, + screenshots: screenshots }; - this.props.setData("step2", {step: stepData}); + this.props.setStepData("screenshots", stepData); }; + onCancelClick() { + this.props.close(); + } + + onBackClick() { + this.props.handlePrev(); + } + /** * Removed user uploaded banner. * */ @@ -126,7 +138,6 @@ class Step3 extends Component { onDrop={(screenshots, rejected) => { let tmpScreenshots = this.state.screenshots; tmpScreenshots.push(screenshots); - console.log(screenshots); //TODO: Remove this this.setState({ screenshots: tmpScreenshots }); @@ -191,6 +202,11 @@ class Step3 extends Component { + + + + + ); } diff --git a/components/application-mgt/org.wso2.carbon.device.application.mgt.publisher.ui/src/main/resources/publisher/src/components/Application/Create/CreateSteps/Step4.jsx b/components/application-mgt/org.wso2.carbon.device.application.mgt.publisher.ui/src/main/resources/publisher/src/components/Application/Create/CreateSteps/Step4.jsx index 5674e822fa..c5f59724c2 100644 --- a/components/application-mgt/org.wso2.carbon.device.application.mgt.publisher.ui/src/main/resources/publisher/src/components/Application/Create/CreateSteps/Step4.jsx +++ b/components/application-mgt/org.wso2.carbon.device.application.mgt.publisher.ui/src/main/resources/publisher/src/components/Application/Create/CreateSteps/Step4.jsx @@ -18,7 +18,7 @@ import PropTypes from 'prop-types'; import React, {Component} from 'react'; -import {Collapse, FormGroup, Input, Label, FormText} from 'reactstrap'; +import {Button, Collapse, FormGroup, FormText, Input, Label, ModalFooter} from 'reactstrap'; import Switch from '../../../UIComponents/Switch/Switch' /** @@ -47,8 +47,8 @@ class Step4 extends Component { constructor() { super(); this.handleToggle = this.handleToggle.bind(this); - this.handlePrev = this.handlePrev.bind(this); - this.handleToggle = this.handleToggle.bind(this); + this.onCancelClick = this.onCancelClick.bind(this); + this.onBackClick = this.onBackClick.bind(this); this.handleFinish = this.handleFinish.bind(this); this.state = { showForm: false, @@ -66,13 +66,18 @@ class Step4 extends Component { this.props.handleFinish(); } - /** - * Invokes Prev button click. - * */ - handlePrev() { + onCancelClick() { + this.props.close(); + } + + onBackClick() { this.props.handlePrev(); } + onSubmit() { + + } + /** * Handles release application selection. * */ @@ -104,12 +109,12 @@ class Step4 extends Component {
- - Info: - Enabling this will create a release for the current Application. - To upload the Application, please visit to the Release management section of - Application Edit View. - + + Info: + Enabling this will create a release for the current Application. + To upload the Application, please visit to the Release management section of + Application Edit View. +
{/*If toggle is true, the release form will be shown.*/} @@ -140,6 +145,11 @@ class Step4 extends Component { + + + + + ); } diff --git a/components/application-mgt/org.wso2.carbon.device.application.mgt.publisher.ui/src/main/resources/publisher/src/components/Application/Edit/Base/ApplicationEditBaseLayout.jsx b/components/application-mgt/org.wso2.carbon.device.application.mgt.publisher.ui/src/main/resources/publisher/src/components/Application/Edit/Base/ApplicationEditBaseLayout.jsx index 9e0029bba5..e3c2935e3f 100644 --- a/components/application-mgt/org.wso2.carbon.device.application.mgt.publisher.ui/src/main/resources/publisher/src/components/Application/Edit/Base/ApplicationEditBaseLayout.jsx +++ b/components/application-mgt/org.wso2.carbon.device.application.mgt.publisher.ui/src/main/resources/publisher/src/components/Application/Edit/Base/ApplicationEditBaseLayout.jsx @@ -89,6 +89,7 @@ class ApplicationEdit extends Component { +
diff --git a/components/application-mgt/org.wso2.carbon.device.application.mgt.publisher.ui/src/main/resources/publisher/src/components/Application/View/ApplicationView.jsx b/components/application-mgt/org.wso2.carbon.device.application.mgt.publisher.ui/src/main/resources/publisher/src/components/Application/View/ApplicationView.jsx index 85cb7b5fa3..d421901f2d 100644 --- a/components/application-mgt/org.wso2.carbon.device.application.mgt.publisher.ui/src/main/resources/publisher/src/components/Application/View/ApplicationView.jsx +++ b/components/application-mgt/org.wso2.carbon.device.application.mgt.publisher.ui/src/main/resources/publisher/src/components/Application/View/ApplicationView.jsx @@ -47,91 +47,95 @@ class ApplicationView extends Component { } render() { - const platform = this.state.application; - console.log(platform); + if (this.state.application.length === 0) { + return
+ } else { + const app = this.state.application; + console.log(app); + return ( +
+
+ +
+
+
+ + + + {app.name} + + + Last updated on {app.modifiedAt} + + + + +
+ +
+ 2k Installs + + + + + + + + + + +

View in Store

+ + + +
+
+ +
+ + : + + + +

{app.description}

+ + + + + + : + + + +

[list of tags...]

+ + + + + + : + + + +

Production

+ + + + + + : + + + +

v1.0

+ + + + - return ( -
-
- -
-
+ ); -
- - - - Facebook - - - Last updated on 2017-09-23 - - - - -
- -
- 2k Installs - - - - - - - - - - - View in Store - - - -
-
- -
- - : - - - -

sdfjlkdsjfsjdfjsdf sfjdslkjfdsflkjdsfslkdjfl j

- - - - - - : - - - -

[list of tags...]

- - - - - - : - - - -

Production

- - - - - - : - - - -

v1.0

- - - - - ); + } } } diff --git a/components/application-mgt/org.wso2.carbon.device.application.mgt.publisher.ui/src/main/resources/publisher/src/components/Platform/PlatformView.jsx b/components/application-mgt/org.wso2.carbon.device.application.mgt.publisher.ui/src/main/resources/publisher/src/components/Platform/Platform.jsx similarity index 63% rename from components/application-mgt/org.wso2.carbon.device.application.mgt.publisher.ui/src/main/resources/publisher/src/components/Platform/PlatformView.jsx rename to components/application-mgt/org.wso2.carbon.device.application.mgt.publisher.ui/src/main/resources/publisher/src/components/Platform/Platform.jsx index dce6e9f716..e9b206d91b 100644 --- a/components/application-mgt/org.wso2.carbon.device.application.mgt.publisher.ui/src/main/resources/publisher/src/components/Platform/PlatformView.jsx +++ b/components/application-mgt/org.wso2.carbon.device.application.mgt.publisher.ui/src/main/resources/publisher/src/components/Platform/Platform.jsx @@ -18,21 +18,28 @@ import React, {Component} from 'react'; /** - * Platform view component. + * Platform component. + * In Platform listing, this component will be displayed as cards. * */ -class PlatformView extends Component { +class Platform extends Component { constructor() { super(); } render() { + const {platform} = this.props; + console.log(platform); return ( -
- Platform View +
+
    +
  • Name: {platform.name}
  • +
  • Description: {platform.description}
  • +
  • Status: {platform.enabled}
  • +
); } } -export default PlatformView; +export default Platform; diff --git a/components/application-mgt/org.wso2.carbon.device.application.mgt.publisher.ui/src/main/resources/publisher/src/components/Platform/PlatformCreate.jsx b/components/application-mgt/org.wso2.carbon.device.application.mgt.publisher.ui/src/main/resources/publisher/src/components/Platform/PlatformCreate.jsx index 6d30a2007a..6d8d3162d6 100644 --- a/components/application-mgt/org.wso2.carbon.device.application.mgt.publisher.ui/src/main/resources/publisher/src/components/Platform/PlatformCreate.jsx +++ b/components/application-mgt/org.wso2.carbon.device.application.mgt.publisher.ui/src/main/resources/publisher/src/components/Platform/PlatformCreate.jsx @@ -15,416 +15,58 @@ * specific language governing permissions and limitations * under the License. */ - -import PropTypes from 'prop-types'; -import Chip from 'material-ui/Chip'; -import Dropzone from 'react-dropzone'; import React, {Component} from 'react'; -import Toggle from 'material-ui/Toggle'; -import MenuItem from 'material-ui/MenuItem'; -import TextField from 'material-ui/TextField'; -import FlatButton from 'material-ui/FlatButton'; -import IconButton from 'material-ui/IconButton'; -import SelectField from 'material-ui/SelectField'; -import RaisedButton from 'material-ui/RaisedButton'; -import PlatformMgtApi from '../../api/platformMgtApi'; -import Clear from 'material-ui/svg-icons/content/clear'; -import {GridList, GridTile} from 'material-ui/GridList'; -import Close from 'material-ui/svg-icons/navigation/close'; -import {Card, CardActions, CardTitle} from 'material-ui/Card'; -import AddCircleOutline from 'material-ui/svg-icons/content/add-circle-outline'; +import {Button, FormGroup, Label, Modal, ModalBody, ModalFooter, ModalHeader, Input} from "reactstrap"; /** - * Platform Create component. - * Contains following components: - * * Platform Name - * * Platform Description - * * Platform Icon - * * Whether the platform needs an app to be installed. - * * Whether the platform is enabled by default. - * * Whether the platform is shared with tenants. + * Platform view component. * */ class PlatformCreate extends Component { constructor() { super(); - this.onCreatePlatform = this.onCreatePlatform.bind(this); - this.handleToggle = this.handleToggle.bind(this); - this.addProperty = this.addProperty.bind(this); - this.addTags = this.addTags.bind(this); - this.clearForm = this.clearForm.bind(this); - this.onPropertySelect = this.onPropertySelect.bind(this); - this.handleTagChange = this.handleTagChange.bind(this); - this.removeIcon = this.removeIcon.bind(this); - this.onTextChange = this.onTextChange.bind(this); - this.renderChip = this.renderChip.bind(this); - this.removeProperty = this.removeProperty.bind(this); + this.onCancelClick = this.onCancelClick.bind(this); this.state = { - tags: [], - defValue: "", - enabled: true, - allTenants: false, - files: [], - platformProperties: [], - selectedProperty: 0, - name: "", - description: "", - property: "", - icon: [], - identifier: "", - propertyTypes: [ - {key: 0, value: 'String'}, - {key: 1, value: 'Number'}, - {key: 2, value: 'Boolean'}, - {key: 3, value: 'File'}] - }; - } - - /** - * Handles toggle button actions. - * One method is used for all the toggle buttons and, each toggle is identified by the id. - * */ - handleToggle(event) { - switch (event.target.id) { - case "enabled" : { - let enabled = this.state.enabled; - this.setState({enabled: !enabled}); - break; - } - case "tenant" : { - let allTenants = this.state.allTenants; - this.setState({allTenants: !allTenants}); - break; - } + open: false } } - /** - * Triggers the onChange action on property type selection. - * */ - onPropertySelect(event, index, value) { - console.log(this.state.propertyTypes[value]); - this.setState({selectedProperty: value}); - } - /** - * Handles Chip delete function. - * Removes the tag from state.tags - * */ - handleTagDelete(key) { - this.chipData = this.state.tags; - const chipToDelete = this.chipData.map((chip) => chip.key).indexOf(key); - this.chipData.splice(chipToDelete, 1); - this.setState({tags: this.chipData}); + componentWillReceiveProps(props, nextprops) { + this.setState({open: props.open}) } - /** - * Create a tag on Enter key press and set it to the state. - * Clears the tags text field. - * Chip gets two parameters: Key and value. - * */ - addTags(event) { - let tags = this.state.tags; - if (event.charCode === 13) { - event.preventDefault(); - tags.push({key: Math.floor(Math.random() * 1000), value: event.target.value}); - this.setState({tags, defValue: ""}); - } + componentWillMount() { + this.setState({open: this.props.open}); } - /** - * Creates Chip array from state.tags. - * */ - renderChip(data) { - return ( - this.handleTagDelete(data.key)} - style={this.styles.chip} - > - {data.value} - - ); - } - - /** - * Set the value for tag. - * */ - handleTagChange(event) { - let defaultValue = this.state.defValue; - defaultValue = event.target.value; - this.setState({defValue: defaultValue}) - } - - /** - * Remove the selected property from the property list. - * */ - removeProperty(property) { - let properties = this.state.platformProperties; - properties.splice(properties.indexOf(property), 1); - this.setState({platformProperties: properties}); - } - - /** - * Add a new platform property. - * */ - addProperty() { - let property = this.state.property; - let selected = this.state.selectedProperty; - - this.setState({ - platformProperties: - this.state.platformProperties.concat([ - { - key: property, - value: this.state.propertyTypes[selected].value - }]), - property: "", - selectedProperty: 0 - }); - } - - /** - * Triggers in onChange event of text fields. - * Text fields are identified by their ids and the value will be persisted in the component state. - * */ - onTextChange(event, value) { - let property = this.state.property; - let name = this.state.name; - let description = this.state.description; - let identifier = this.state.identifier; - - switch (event.target.id) { - case "name": { - name = value; - this.setState({name: name}); - break; - } - - case "description": { - description = value; - this.setState({description: description}); - break; - } - - case "property": { - property = value; - this.setState({property: property}); - break; - } - case "identifier": { - identifier = value; - this.setState({identifier: identifier}); - } - } - }; - - /** - * Create platform object and call the create platform api. - * */ - onCreatePlatform(event) { - //Call the platform create api. - event.preventDefault(); - let platform = {}; - platform.identifier = this.state.identifier; - platform.name = this.state.name; - platform.description = this.state.description; - platform.tags = this.state.tags; - platform.properties = this.state.platformProperties; - platform.icon = this.state.icon; - platform.enabled = this.state.enabled; - platform.allTenants = this.state.allTenants; - platform.defaultTenantMapping = true; - - PlatformMgtApi.createPlatform(platform); - - } - - /** - * Remove the uploaded icon. - * */ - removeIcon(event) { - event.preventDefault(); - this.setState({icon: []}); - } - - /** - * Clears the user entered values in the form. - * */ - clearForm(event) { - event.preventDefault(); - this.setState({ - enabled: true, - allTenants: false, - files: [], - platformProperties: [], - selectedProperty: 0, - name: "", - description: "", - property: "", - }) + onCancelClick() { + this.setState({open: false}) } render() { - const { - platformProperties, - allTenants, - enabled, - selectedProperty, - propertyTypes, - name, - tags, - defValue, - description, - identifier, - property - } = this.state; - return ( -
- - - -
-
- -
- -
- -
-
- -
- -
- -
-
- {tags.map(this.renderChip, this)} -
-
-
-

Platform Properties

-
- {platformProperties.map((p) => { - return
{p.key} : {p.value} - - - -
- })} -
-
- - - {propertyTypes.map((type) => { - return - })} - - - - -
-
-
-
-

Platform Icon*:

- - {this.state.icon.map((tile) => ( - - - }> - - - ))} - {this.state.icon.length === 0 ? - { - this.setState({icon, rejected}) - }} - > -

+

-
:
} - -
-
- - - -
- - +
+ + Create Platform + + + + + + + + + + + + + + +
); } } -PlatformCreate.prototypes = {}; - export default PlatformCreate; diff --git a/components/application-mgt/org.wso2.carbon.device.application.mgt.publisher.ui/src/main/resources/publisher/src/components/Platform/PlatformListing.jsx b/components/application-mgt/org.wso2.carbon.device.application.mgt.publisher.ui/src/main/resources/publisher/src/components/Platform/PlatformListing.jsx index 3ba0b50fd9..9101c8d300 100644 --- a/components/application-mgt/org.wso2.carbon.device.application.mgt.publisher.ui/src/main/resources/publisher/src/components/Platform/PlatformListing.jsx +++ b/components/application-mgt/org.wso2.carbon.device.application.mgt.publisher.ui/src/main/resources/publisher/src/components/Platform/PlatformListing.jsx @@ -15,145 +15,61 @@ * specific language governing permissions and limitations * under the License. */ - import React, {Component} from 'react'; -import {withRouter} from 'react-router-dom'; -import TextField from 'material-ui/TextField'; -import AuthHandler from "../../api/authHandler"; -import DataTable from '../UIComponents/DataTable/DataTable'; +import {Button, Col, Row} from "reactstrap"; +import Platform from "./Platform"; import PlatformMgtApi from "../../api/platformMgtApi"; -import {Card, CardActions, CardTitle} from 'material-ui/Card'; +import AuthHandler from "../../api/authHandler"; +import PlatformCreate from "./PlatformCreate"; /** - * The App Create Component. - * - * Application creation is handled through a Wizard. (We use Material UI Stepper.) - * - * In each step, data will be set to the state separately. - * When the wizard is completed, data will be arranged and sent to the api. + * Platform view component. * */ class PlatformListing extends Component { + constructor() { super(); - this.setPlatforms = this.setPlatforms.bind(this); + this.onPlatformCreateClick = this.onPlatformCreateClick.bind(this); this.state = { platforms: [], - asc: true - }; - } - - headers = [ - { - data_id: "image", - data_type: "image", - sortable: false, - label: "" - }, - { - data_id: "platformName", - data_type: String, - sortable: true, - label: "Platform Name", - sort: this.sortData - }, - { - data_id: "enabled", - data_type: String, - sortable: false, - label: "Enabled" - }, - { - data_id: "fileBased", - data_type: String, - sortable: false, - label: "File Based" - } - ]; - - componentDidMount() { - let platformsPromise = PlatformMgtApi.getPlatforms(); - platformsPromise.then( - response => { - let platforms = this.setPlatforms(response.data); - this.setState({platforms: platforms}); - } - ).catch( - err => { - AuthHandler.unauthorizedErrorHandler(err); - } - ) - } - - /** - * Create platform objects from the response which can be displayed in the table. - * */ - setPlatforms(platforms) { - let tmpPlatforms = []; - - for (let index in platforms) { - let platform = {}; - platform.id = platforms[index].identifier; - platform.platformName = platforms[index].name; - platform.enabled = platforms[index].enabled.toString(); - platform.fileBased = platforms[index].fileBased.toString(); - tmpPlatforms.push(platform) + openModal: false } - - return tmpPlatforms; - } - - /** - * Handles the search action. - * When typing in the search bar, this method will be invoked. - * */ - searchApplications(word) { - let searchedData = []; - } - - /** - * Handles sort data function and toggles the asc state. - * asc: true : sort in ascending order. - * */ - sortData() { - let isAsc = this.state.asc; - let datas = isAsc ? this.data.sort(this.compare) : this.data.reverse(); - this.setState({data: datas, asc: !isAsc}); } - compare(a, b) { - if (a.applicationName < b.applicationName) - return -1; - if (a.applicationName > b.applicationName) - return 1; - return 0; + componentWillMount() { + PlatformMgtApi.getPlatforms().then(response => { + console.log(response); + this.setState({platforms: response.data}); + }).catch(err => { + AuthHandler.unauthorizedErrorHandler(err); + }) } - onRowClick(id) { - //TODO: Remove this - console.log(id) + onPlatformCreateClick() { + this.setState({openModal: true}); } render() { return ( -
- - - - - - - - +
+ +
+ +
+
+ +
+ {this.state.platforms.map(platform => { + return ( + + ) + })} +
+
+
); } } -PlatformListing.propTypes = {}; - -export default withRouter(PlatformListing); +export default PlatformListing; diff --git a/components/application-mgt/org.wso2.carbon.device.application.mgt.publisher.ui/src/main/resources/publisher/src/components/UIComponents/DataTable/DataTable.jsx b/components/application-mgt/org.wso2.carbon.device.application.mgt.publisher.ui/src/main/resources/publisher/src/components/UIComponents/DataTable/DataTable.jsx index 2f27a42a51..1ccd6f433d 100644 --- a/components/application-mgt/org.wso2.carbon.device.application.mgt.publisher.ui/src/main/resources/publisher/src/components/UIComponents/DataTable/DataTable.jsx +++ b/components/application-mgt/org.wso2.carbon.device.application.mgt.publisher.ui/src/main/resources/publisher/src/components/UIComponents/DataTable/DataTable.jsx @@ -93,7 +93,7 @@ class DataTable extends Component { } handleBtnClick(id) { - this.props.handleButtonClick(id); + this.props.onAppEditClick(id); } render() { diff --git a/components/application-mgt/org.wso2.carbon.device.application.mgt.publisher.ui/src/main/resources/publisher/src/components/UIComponents/DataTable/DataTableRow.jsx b/components/application-mgt/org.wso2.carbon.device.application.mgt.publisher.ui/src/main/resources/publisher/src/components/UIComponents/DataTable/DataTableRow.jsx index efbb827c52..9046c2cbb4 100644 --- a/components/application-mgt/org.wso2.carbon.device.application.mgt.publisher.ui/src/main/resources/publisher/src/components/UIComponents/DataTable/DataTableRow.jsx +++ b/components/application-mgt/org.wso2.carbon.device.application.mgt.publisher.ui/src/main/resources/publisher/src/components/UIComponents/DataTable/DataTableRow.jsx @@ -63,7 +63,7 @@ class DataTableRow extends Component { handleBtnClick(event) { event.stopPropagation(); console.log(event.target['id']) - this.props.handleButtonClick(event.target['id']); + this.props.onAppEditClick(event.target['id']); } render() { diff --git a/components/application-mgt/org.wso2.carbon.device.application.mgt.publisher.ui/src/main/resources/publisher/src/components/User/Login/Login.jsx b/components/application-mgt/org.wso2.carbon.device.application.mgt.publisher.ui/src/main/resources/publisher/src/components/User/Login/Login.jsx index 7108253c00..6bcce4ab3c 100644 --- a/components/application-mgt/org.wso2.carbon.device.application.mgt.publisher.ui/src/main/resources/publisher/src/components/User/Login/Login.jsx +++ b/components/application-mgt/org.wso2.carbon.device.application.mgt.publisher.ui/src/main/resources/publisher/src/components/User/Login/Login.jsx @@ -20,7 +20,7 @@ import qs from 'qs'; import React, {Component} from 'react'; import {Redirect, Switch} from 'react-router-dom'; import AuthHandler from '../../../api/authHandler'; -import {Button, Card, CardBlock, CardTitle, Col, Form, FormGroup, Input, Label} from 'reactstrap'; +import {Button, Card, CardBlock, CardTitle, Form, FormGroup, Input, Label} from 'reactstrap'; /** * The Login Component. @@ -132,27 +132,32 @@ class Login extends Component { {/*TODO: Style the components.*/} - WSO2 IoT APP Publisher + + WSO2 IoT APP Publisher + +
- - -
- - - + + + - - - - - + + + - - - - + + From 34ff40ef211ba039884e1ba106c4676434ab6952 Mon Sep 17 00:00:00 2001 From: Menaka Jayawardena Date: Tue, 3 Oct 2017 16:56:43 +0530 Subject: [PATCH 08/32] Added form validations for application create. --- .../public/themes/default/default-theme.css | 4 ++ .../publisher/src/common/validator.js | 38 +++++++++++++ .../Application/Create/ApplicationCreate.jsx | 2 +- .../Application/Create/CreateSteps/Step1.jsx | 55 +++++++++++++++---- .../Application/Create/CreateSteps/Step2.jsx | 30 ++++++++-- .../Application/Create/CreateSteps/Step3.jsx | 50 ++++++++++++----- 6 files changed, 150 insertions(+), 29 deletions(-) create mode 100644 components/application-mgt/org.wso2.carbon.device.application.mgt.publisher.ui/src/main/resources/publisher/src/common/validator.js diff --git a/components/application-mgt/org.wso2.carbon.device.application.mgt.publisher.ui/src/main/resources/publisher/public/themes/default/default-theme.css b/components/application-mgt/org.wso2.carbon.device.application.mgt.publisher.ui/src/main/resources/publisher/public/themes/default/default-theme.css index 3aef9f7675..9792737464 100644 --- a/components/application-mgt/org.wso2.carbon.device.application.mgt.publisher.ui/src/main/resources/publisher/public/themes/default/default-theme.css +++ b/components/application-mgt/org.wso2.carbon.device.application.mgt.publisher.ui/src/main/resources/publisher/public/themes/default/default-theme.css @@ -211,6 +211,10 @@ body { height: 300px; } +#form-error { + color: red; +} + .application-create-banner-dropzone { width: 300px; height: 150px; diff --git a/components/application-mgt/org.wso2.carbon.device.application.mgt.publisher.ui/src/main/resources/publisher/src/common/validator.js b/components/application-mgt/org.wso2.carbon.device.application.mgt.publisher.ui/src/main/resources/publisher/src/common/validator.js new file mode 100644 index 0000000000..11654012f0 --- /dev/null +++ b/components/application-mgt/org.wso2.carbon.device.application.mgt.publisher.ui/src/main/resources/publisher/src/common/validator.js @@ -0,0 +1,38 @@ +/* + * Copyright (c) 2017, WSO2 Inc. (http://www.wso2.org) All Rights Reserved. + * + * WSO2 Inc. licenses this file to you under the Apache License, + * Version 2.0 (the "License"); you may not use this file except + * in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ + +'use strict'; + +/** + * This Utility class will contain basic methods for form validation. + * */ +export const validateURL = (value) => { + +}; + +export const validateNull = (value) => { + return !value; +}; + +export const validateEmpty = (array) => { + return array.length > 0; +}; + +export const validateEmptyObject = (object) => { + return Object.keys(object).length > 0; +}; diff --git a/components/application-mgt/org.wso2.carbon.device.application.mgt.publisher.ui/src/main/resources/publisher/src/components/Application/Create/ApplicationCreate.jsx b/components/application-mgt/org.wso2.carbon.device.application.mgt.publisher.ui/src/main/resources/publisher/src/components/Application/Create/ApplicationCreate.jsx index 38620bf8f2..42112f1125 100644 --- a/components/application-mgt/org.wso2.carbon.device.application.mgt.publisher.ui/src/main/resources/publisher/src/components/Application/Create/ApplicationCreate.jsx +++ b/components/application-mgt/org.wso2.carbon.device.application.mgt.publisher.ui/src/main/resources/publisher/src/components/Application/Create/ApplicationCreate.jsx @@ -126,7 +126,7 @@ class ApplicationCreate extends Component { * @param data: The form data of the step. * */ setStepData(step, data) { - console.log(step, data, this.state.stepData); //TODO: Remove this + console.log(step, data, this.state); //TODO: Remove this switch (step) { case "generalInfo": { this.setState({generalInfo: data}, this.onNextClick()); diff --git a/components/application-mgt/org.wso2.carbon.device.application.mgt.publisher.ui/src/main/resources/publisher/src/components/Application/Create/CreateSteps/Step1.jsx b/components/application-mgt/org.wso2.carbon.device.application.mgt.publisher.ui/src/main/resources/publisher/src/components/Application/Create/CreateSteps/Step1.jsx index 9f011fdf67..bffa63b599 100644 --- a/components/application-mgt/org.wso2.carbon.device.application.mgt.publisher.ui/src/main/resources/publisher/src/components/Application/Create/CreateSteps/Step1.jsx +++ b/components/application-mgt/org.wso2.carbon.device.application.mgt.publisher.ui/src/main/resources/publisher/src/components/Application/Create/CreateSteps/Step1.jsx @@ -18,9 +18,9 @@ import PropTypes from 'prop-types'; import React, {Component} from 'react'; -import {Badge, FormGroup, Input, Label} from 'reactstrap'; import {FormattedMessage} from 'react-intl'; -import {Badge, Button, Form, FormGroup, Input, Label, ModalFooter} from 'reactstrap'; +import {Badge, Button, Form, FormFeedback, FormGroup, Input, Label, ModalFooter} from 'reactstrap'; +import * as validator from '../../../../common/validator'; /** * The Second step of application create wizard. @@ -49,6 +49,7 @@ class Step1 extends Component { this.onVisibilityChange = this.onVisibilityChange.bind(this); this.onVisibilityItemSelect = this.onVisibilityItemSelect.bind(this); this.handleRequestDelete = this.handleRequestDelete.bind(this); + this.validate = this.validate.bind(this); this.state = { tags: [], name: "", @@ -63,7 +64,7 @@ class Step1 extends Component { componentWillMount() { const defaultVals = this.props.defaultData; - if(defaultVals) { + if (defaultVals) { this.setState(defaultVals); } @@ -114,19 +115,49 @@ class Step1 extends Component { tags: tags, visibility: visibility }; - this.props.setStepData("generalInfo", stepData); + + let {errorCount, errors} = this.validate(); + + if (errorCount !== 0) { + this.setState({errors: errors}); + } else { + this.props.setStepData("generalInfo", stepData); + } }; onCancelClick() { this.props.close(); } + /** + * Validate the form fields. + * */ + validate() { + const {name, description, tags} = this.state; + let errorCount = 0; + let errors = {}; + if (validator.validateNull(name)) { + errorCount++; + errors.name = "Application Title is Required!"; + } + + if (validator.validateNull(description)) { + errorCount++; + errors.description = "Description is Required!" + } + + if (!validator.validateEmpty(tags)) { + errorCount++; + errors.tags = "You need to enter at least one tag!" + } + return {errorCount, errors}; + } + /** * Set text field values to state. * */ onTextFieldChange(event) { let field = event.target.name; - console.log(field, event.target.value); switch (field) { case "appName": { this.setState({name: event.target.value}); @@ -166,7 +197,7 @@ class Step1 extends Component { onChange={this.onVisibilityItemSelect} > - + @@ -192,7 +223,7 @@ class Step1 extends Component { }; return ( -
+
@@ -207,6 +238,7 @@ class Step1 extends Component { value={this.state.name} onChange={this.onTextFieldChange} /> + {this.state.errors.name}
@@ -293,8 +329,7 @@ class Step1 extends Component { Step1.prototypes = { handleNext: PropTypes.func, handlePrev: PropTypes.func, - setData: PropTypes.func, - removeData: PropTypes.func + setData: PropTypes.func }; export default Step1; diff --git a/components/application-mgt/org.wso2.carbon.device.application.mgt.publisher.ui/src/main/resources/publisher/src/components/Application/Create/CreateSteps/Step2.jsx b/components/application-mgt/org.wso2.carbon.device.application.mgt.publisher.ui/src/main/resources/publisher/src/components/Application/Create/CreateSteps/Step2.jsx index 3143b2eb85..d6d627cee0 100644 --- a/components/application-mgt/org.wso2.carbon.device.application.mgt.publisher.ui/src/main/resources/publisher/src/components/Application/Create/CreateSteps/Step2.jsx +++ b/components/application-mgt/org.wso2.carbon.device.application.mgt.publisher.ui/src/main/resources/publisher/src/components/Application/Create/CreateSteps/Step2.jsx @@ -20,8 +20,9 @@ import PropTypes from 'prop-types'; import React, {Component} from 'react'; import AuthHandler from "../../../../api/authHandler"; import PlatformMgtApi from "../../../../api/platformMgtApi"; -import {Button, FormGroup, Input, Label, ModalFooter} from 'reactstrap'; +import {Button, FormFeedback, FormGroup, Input, Label, ModalFooter} from 'reactstrap'; import {FormattedMessage} from 'react-intl'; +import * as validator from '../../../../common/validator'; /** * The first step of the application creation wizard. @@ -43,11 +44,13 @@ class Step2 extends Component { this.setStepData = this.setStepData.bind(this); this.onCancelClick = this.onCancelClick.bind(this); this.onBackClick = this.onBackClick.bind(this); + this.validate = this.validate.bind(this); this.platforms = []; this.state = { + errors: {}, store: 1, platformSelectedIndex: 0, - platform: "", + platform: {}, platforms: [] }; } @@ -80,7 +83,7 @@ class Step2 extends Component { platform = platforms[index]; tmpPlatforms.push(platform); } - this.setState({platforms: tmpPlatforms, platformSelectedIndex: 0, platform: tmpPlatforms[0].name}) + this.setState({platforms: tmpPlatforms, platformSelectedIndex: 0}) } /** @@ -92,7 +95,14 @@ class Step2 extends Component { store: store, platform: platform[0] }; - this.props.setStepData("platform", data); + + const {errorCount, errors} = this.validate(); + + if (errorCount > 0) { + this.setState({errors: errors}) + } else { + this.props.setStepData("platform", data); + } } onCancelClick() { @@ -103,6 +113,17 @@ class Step2 extends Component { this.props.handlePrev(); } + validate() { + const {store, platform} = this.state; + let errors = {}; + let errorCount = 0; + if (!validator.validateEmptyObject(platform)) { + errorCount++; + errors.platform = "You must select an application platform!" + } + return {errorCount, errors}; + } + /** * Triggers when changing the Platform selection. * */ @@ -149,6 +170,7 @@ class Step2 extends Component { ) }) : } + {this.state.errors.platform} diff --git a/components/application-mgt/org.wso2.carbon.device.application.mgt.publisher.ui/src/main/resources/publisher/src/components/Application/Create/CreateSteps/Step3.jsx b/components/application-mgt/org.wso2.carbon.device.application.mgt.publisher.ui/src/main/resources/publisher/src/components/Application/Create/CreateSteps/Step3.jsx index 61b14509d3..76384d2214 100644 --- a/components/application-mgt/org.wso2.carbon.device.application.mgt.publisher.ui/src/main/resources/publisher/src/components/Application/Create/CreateSteps/Step3.jsx +++ b/components/application-mgt/org.wso2.carbon.device.application.mgt.publisher.ui/src/main/resources/publisher/src/components/Application/Create/CreateSteps/Step3.jsx @@ -19,7 +19,8 @@ import PropTypes from 'prop-types'; import Dropzone from 'react-dropzone'; import React, {Component} from 'react'; -import {Button, FormGroup, Label, ModalFooter} from 'reactstrap'; +import * as validator from '../../../../common/validator'; +import {Button, FormFeedback, FormGroup, Label, ModalFooter} from 'reactstrap'; import AppImage from "../../../UIComponents/AppImage/AppImage"; import {FormattedMessage} from 'react-intl'; @@ -42,6 +43,7 @@ class Step3 extends Component { super(); this.setStepData = this.setStepData.bind(this); this.onBackClick = this.onBackClick.bind(this); + this.validate = this.validate.bind(this); this.onCancelClick = this.onCancelClick.bind(this); this.state = { icon: [], @@ -57,18 +59,6 @@ class Step3 extends Component { this.setState(defaultData); } - /** - * Handles Chip delete function. - * Removes the tag from state.tags - * */ - handleRequestDelete(event) { - this.chipData = this.state.tags; - console.log(event.target); //TODO: Remove Console log. - const chipToDelete = this.chipData.map((chip) => chip.value).indexOf(event.target.value); - this.chipData.splice(chipToDelete, 1); - this.setState({tags: this.chipData}); - }; - /** * Creates an object with the current step data and persist in the parent. * */ @@ -82,7 +72,14 @@ class Step3 extends Component { screenshots: screenshots }; - this.props.setStepData("screenshots", stepData); + const {errorCount, errors} = this.validate(); + + if (errorCount > 0) { + this.setState({errors: errors}) + } else { + this.props.setStepData("screenshots", stepData); + } + }; onCancelClick() { @@ -93,6 +90,28 @@ class Step3 extends Component { this.props.handlePrev(); } + validate() { + const {icon, banner, screenshots} = this.state; + let errors = {}, errorCount = 0; + + if (!validator.validateEmpty(icon)) { + errorCount++; + errors.icon = "You must upload an icon image!" + } + + if (!validator.validateEmpty(banner)) { + errorCount++; + errors.banner = "You must upload a banner image!" + } + + if (!validator.validateEmpty(screenshots)) { + errorCount++; + errors.screenshots = "You must upload at least one screenshot image!" + } + + return {errorCount, errors}; + } + /** * Removed user uploaded banner. * */ @@ -146,6 +165,7 @@ class Step3 extends Component { :
}
+ {this.state.errors.screenshots}
@@ -173,6 +193,7 @@ class Step3 extends Component { :
}
+ {this.state.errors.icon}
@@ -199,6 +220,7 @@ class Step3 extends Component { :
}
+ {this.state.errors.banner}
From 55f3b4d0ee2e3bdcea55fd3a49dfed5aef3fad82 Mon Sep 17 00:00:00 2001 From: Menaka Jayawardena Date: Wed, 4 Oct 2017 01:32:54 +0530 Subject: [PATCH 09/32] Revert "Moving css files to publica foler" This reverts commit f441976 --- .../main/resources/publisher/public/index.html | 10 +++++----- .../UIComponents/AppImage/AppImage.js | 16 ++-------------- .../src/components/UIComponents/Chip/Chip.jsx | 17 +---------------- .../components/UIComponents/Drawer/Drawer.jsx | 15 ++------------- .../FloatingButton/FloatingButton.jsx | 18 +----------------- .../ImageUploader/ImageUploader.jsx | 16 ++-------------- .../Notifications/NotificationItem.jsx | 14 +------------- .../Notifications/NotificationView.jsx | 13 ------------- .../components/UIComponents/Switch/Switch.jsx | 18 +----------------- .../main/resources/publisher/webpack.config.js | 1 + 10 files changed, 16 insertions(+), 122 deletions(-) diff --git a/components/application-mgt/org.wso2.carbon.device.application.mgt.publisher.ui/src/main/resources/publisher/public/index.html b/components/application-mgt/org.wso2.carbon.device.application.mgt.publisher.ui/src/main/resources/publisher/public/index.html index fdbaea7b4a..3d41cf4be5 100644 --- a/components/application-mgt/org.wso2.carbon.device.application.mgt.publisher.ui/src/main/resources/publisher/public/index.html +++ b/components/application-mgt/org.wso2.carbon.device.application.mgt.publisher.ui/src/main/resources/publisher/public/index.html @@ -21,14 +21,14 @@ - - + + - - + + ehUc&_7T=d+~b#WAxQ)M!GaFv`8g2W z_UX+d>LCyWTRaI9kPQn)C;(45>K{zS^#KF~fWgP(Mq>NBoqoqAyUhBgG5v=moMc@K*#a}5kSSv8asUm zHYnFBTR4Lyjhyx;2N_0Y2VjBHdPb)=7|tcKdd+ToJfYJlw~t$mNG4zN>F?(c2!+C7 z^BNwPFBpx+V)Gds7EdUZ(&;v`*lK(~qEf5X=r+0Te8OV0+w3;79*j5i$!&MM^(AH6 zdvY+nDYDsIKv)6*_dkD8vbf3niwAas$a=_5?h#)wD~@nb-Jysg|6TBdH&S5nM4wa% zFftb*P_}MQe^`N05p%VTIj2iT$O=kI z_d5GS5SoOcMhQ!G_HkohuUdk?l-;=0H|L4o1Nx=&syK9HEzTV6?g#qWz7;%R_-K27 zErMP#>(nDThdl*1RS8iMOl3K`CvKXXLuJ2_DM<`l}PjuD?La;*x41Om= znq7p3;P8mDre&Z>T3r+e`u=_XJ7~F>`FX&A(Jy%L^HHT-20LX`lZMPrs&XsI%R3h%}*p75kO6>b+ zpq$fFSy5k6mP+Rm3jXvd4$TZ-l+H%;=~ms8oY&QDGS(!U+PrJTZKfS__=3v8lgz%6 z(rGt$(!f;vYOLL(K2zX%t2mA5>3s9U`Z%NCO+MY*O}zQrJ%M?bNJH^#3#BmWvmnzMfWk3-cO9Cbzu}Cgoa893tp0+s;Pkzq(jk&g zVLDlcsA^XAgLTO-7KlD|&?LaoBq5~56>G8@UF=l`cf_S~DPC$2AScVwbT-XG-4b#u z*g!ixcR}dKfMFN|P&Z2ahbAL^U;IbTl8~)~4F|Q6Xz!D#1-&Ce++`&x{Qo#n%>oPZL+s>LictH%YD7Ww|pr7b6i*cFJz_e zVR?;bk+aSx=&YkQCTA^_-M1He=;Q7!?-F`_7>&-pNvn6i#`=Y*wV@?yd-rwL`8X$c zgU&TV4Y&ZkW+^P9;!3@}GeFNMx7l2Ue=Mt>_e&d=`gO(eSe;qTw&ndq4Mew_`0+#w z+wZp}Dor~~x#C4KtU|7I8tiz|4gswdQA83eBKxvpXolGaNr(u zrY`i`Ry?r)BOVha6rIJAMU#b#SlT=p5$?oT*k4?fg_uzjRW!^T7GntW2y>(E5dCe$ ztER@~x$P$D;RkB&9_sEMa_>H>Sh6-*vZh&*UfLvH0&U}1UL0{GSsu!E5{&Oe$$?5v zMOjT|Syg9Qjd-RxFr3XfANt?<5I`tHAmjIFXS>SQ);%W^bJ(n@9X%KtduQDEX!ms9be|_trlAd zXf3ImFE$H(0@fV3EdG`(x{mq3;gip6nsOPRns~09_A$!1#!6}(s=U~iiF02f-FyzU z`mC${fUwf@!OWC|kT&fT3P&Qrfuxxr7Wo6fgwQzm`;)*CnUssLm)1uab5S)Ss9glf zWd&O=;9MKmz%WmhsT{D*E}(kI95-hdKX!mx5z1UOg>t3e=IGM_3FfeaEO#!>D=ys0^y zHkiWfZ2#=Jhi+)vsBEdVp|m5lC$%BySm{XCTy7D!i`w0svaP`&00M(g_31eL!9n;z z4*OrWdBBkPk>UYC=LOOchy+-~!G`+n8SrReF3_0>jP=L!=S}*t3}os}*FDyW)yb=| zSD~-MU89<{akn9O!L-0Wg+sBX+jU|`57{twu4Ff_4= zPbjNE)ymgR)U;h@Tz){Itq#zc`x|Md z{@?M{ZZcxJ!zr}rr14;3P2Z-gm*Xqs-;egpq(+#`Yid$g<>-RR##u@?!D_>nk2-ndCFg?GZ2p8!sF-Zd zh{a+dz+k>!?lAV-)})&lIAXPI*mdKwP&g(&Ml8qkv@KQF^Rf$`haqmqiku9vMwcfP z2*b%+NJ{ayn8^oB04UuL;Z+C(j^_=cU9jEjrdlQt#pZ`dBocvEB#?v#5)>MP<#z4I zeI=+^?;fLR&At<*_gON&K9s^Or|bRxh)yA1k6`d?<7O8!(iFL$3qgCjma+G-NChgB zn`}VOYd97=5R;=EbMbggEg!D3a=1h0X7Sc07_|iF#f4kD3=>dhIp_7|X}r2+omi8N z@A)p}vVJ=5JCh&5=B$6ttPe4kEB4NjF%*}>j zKvbjewGvkhDU$^U;{yhBfWd6B(#DWcN$@v(a392v zV}MMAIuf4n?&&QMNpjXWYLqR^ODrM9s3NJb+tm|TpeV#D7lY*?PgQa(^7bs{*8Mnb zMJ+12NJmUwhmeDTD0O}6EHDtPtq_~Si0GKWX?{}2YFclM%k)39KufjP{6BV=*P2-k zyY)Wa8 zgGEFoajEKJ!`!FC;>mm(m*Z?6Dzh(Q|6WgiW z18I?FPk7iOyj#gEC{LY1rBqN@Ssud;Qyj;lehx~obi53BPew%^p%e`I=i?5nD5og1 zRhwJDewj=rQkm^ruk3eX9FX^FcoI!(2n%Jx=>C1eU@#e0|Lj6#*+?pvE0!r}y1Q^^ zbTBLhwm#QfJUb^SOxYX9X0}-m^h{E*)tKe^C*RwvLF8kAQTvKaD$I36ec`!_Corj8 z?k>C~95A%{H2)uwhVy7x&paEKkSLYIuWIukwIP7k_Lu(?37W-wGnLawpdZ~xYCp22K#kL6Yi!k4~f|#ID z{{%tH6=!~)F_^ooq@{<#G`ddk-9|e?6S3b7TmAAZcrRw`M{t7if4O9J}`^r=xoFT*vi)=Cuv8U4swMG!vco?92CMHnRjQ zSRhY|el$GhUvS@x+Lq09uE(>OH6F&+hkQ<<8=W~%(~ShYMY^WadJR&Sd${@%rPx@XvjyWtf(H9m?SS+A>I@2B$@ zm+h~U#U6dvVK`dqZj#Va;PTdZJl?eV{+r&~7{((=;p~qf2tgRko28yYB0)Fi88Wf@ z{3u&uXIo#NPLfm7cwFtFO;%H3;YwU~+rT)Nt(fSHi6R=4g@VG{Vt6dN1Uf410#Hm_EHSw4(2e6FM#zRn>6)f+S7QfR#v)L zetL2yQ>*VoAK%6>Zr-O7Bv;Nbye}=WPBL*qNi8XEVwg2`&iItNl!GYvA+#DE@GFc% zqL~K5DjcRk#ZlC^LnLOT`qIf%Sc3S!KR~{HFkHPpYbgdnD?(j`P1k!`&Cws7=qCo% zs|tlB4nD|I#zNriFte=Xg=Yrs8$xide*eFh?k9>bU-Ws;+(YDpoTK^ZWU`)-cBL&l z4&6=^Q#CEm)JULUqIeu;qB_b@Hi(+5bMW7Xl?Z&HtLE#UDSTjd8UXNzcqYzVS|R`f z@JIiz+V=z@od0hhF}&HA%yKCi%~^Lgc)b3(VlCSgFB&Y$Zcr6~E8d*H6vnky>WjJm zUm>8df5#D7+vE_;Ovwp;1QEcPgQq@5=qfNU0E^RRIi^Q0`0!>x%(}&!KKZ?z(9}DK z`>}`b&4D&!Dl-C`m@p7UYjKKu*tQCb{)cSf(nR8ID^7kMArcs<)U#I+;$E*J+Jo% zGzy7&czptaS7P#&^PtLHW4MM2uH`4Mn+;pwyI0^2jV^c>+MnyW$BDud>ApGsMo&>$ zT#Poldd63h<+2fAg10i}15KRk9Z1Hw zC_&p0^fh&HuXU`E`a_F>TI}Yh)YHcXw$$R812uf|5bH`n)5)64H(p3(>}wX5(-KNC zYdKy!{h!j0YxF4*HmIr*P^=~*KP51Q3dMuK+oy1i&V0jc@ho)Vh{{RrVpZ=2E-A73 zGI=tiz*^>9c6o3)_eJ{ujk8#5N?o}xZ(G0iW*1D&!*n=tZObtO^)0Vd3EI?lJf}}> zUJ0|-C*fuPBB@~dZ=s$0lr$Nt5$ug|WdxQ=frat_g*Zl~S3v;s5{P^TTAOIn%_`lv zUYdJ}zo*q9>X)uZ-`yn4$;%^0NfQ;UK<4|V7?nm!gpK%Pg_6liqUa%9xCV<9s>OWP zyp;>&`9L84D;%btlYkv?lm?Irat=Zykh}ne%~~O|l3Ht;!ei5IY4_o-YFCgWU>m8$ zj=F(y&ph$lfAH>1x~`{ykVDo8is-OtVIyZ~SiD$dh0@fF!`ZPbXWE0b@^fNVzZ!=Yo1!uv?~(RWi0-BQU>I2)JVjNle)@kV)}_?Cw11JMiSb}>I+1$@bxGYU;(kOv`nQm~ zB!V{Z21l1SES(R+`W$6nk?G?@EclNyt#^Ef_c=B$)*7;4`9zQ5dxv-sAyr8Mog^Tp zuIP?7HcLAuszKBmg^%oVUdJ#rj75;>2|u-XpD*t;e|hj5J;BFubERZmngj^2rLbZ-oAdx8mm=^U?N7)3u&8%3Lq zQ$%C2Q?3spyP}_lhf}gE7A=$zWB%{6(1J;?UY91<<(P$NcuYYttRYZ2o|)z@B$F{; z=vb=F@^~#8ILw+K3Zd0#J1X6IB^Rek`9YqtPLB&hV7XIc0Jnv~z#qk+Cmw897FLPQ+k0w!aLF-XvsU5S8>g_>@?lsa?44HMq{12Yo zfG4C}-yPHRt^8Vx7&jWt1rU?#c7NnU38F_Iq#w!Bd`Oyb*QJoENqAvsl2G%cQCh+V!k`oH2551x}Vh5IiD5Aa_S=CLeaODS*6 z`Eri#Gd7F$GV)wEgYDvT8xO@NUlM-4SR`j<8oUK-JRu!(a2h#@BiWs&DxDLEbKYZ< zrX0B-z97`|Q6$enWNiR-Es_JRp=@BWmTi*8Nhu^@FoGc8zklJ=0k;_VD^7c(FJ2>tR71r#|?^8+ujAKr~B<=fsmu^hN#1K0r+w++E08IBW3 z`%a{u{5fMokbDld5Xf92C?wQe>9f97NN1kyn&-6A?^yVfTP2VKR`cZ*taom^Jc|`t zb-w?_dY*?F=%X^N7d|evbMXpQt2X}&xt&vBTbmv)3H`?dQ-rKH9QcLC5OS-L{}*{j zk(@@h(~N}p4AZ18_$6z$BOR!cJ4onOja*pz@iu0NZdu$8QO(=N3BY4G8hl1?;Q=Bm)&?%2iqf%S~j0k%gDRp(h$nrTtq*|_vWNn zC-_*UeF@<-p9dE)`$Ov89`=IcDHcnoe9p6e8p&OF9Hg)xLC@IT_+8Pe>RIEGZ1LJ5OI8mXE@j({ zxW;g^X8{h`7|?0?1!NFGlb%Y>h}4ivr&?GuWJO{wBVvc6Rat*!&cLRi3X4@FVd-So ziB;46V>s<23KjR53F=ioMUKfZK1BKaA_=d>V#{PCDqN7&0GHh9y&Nfr5At;;!_a~> z5Gs<{Y&H81a6Ybbf}!(v@!*^Wn3N`2LBrStc6v?s76Dz498c4S_|lc+j--=iWMr%; zvGz{cV&!Gemk2Q@TN%ROWzph~LmdL67!w=|UHf&n3NjEsm2AH_0v*z;`Y-hdV_9FI z(Up3RSWS$zW-AlMwX^zixnQQ)7n>{kd1bNiWaz`8qf^o5dXbf4EEZ$Z5?Wozg&u0= zC6YzFLkAP;A(AfoF_J+#O_D&JqH-lmxu44Ibz$W&ehk3?c4xqcZw^u`d?Z@+#Vard z=Y!o7YUL{&Y&9&1e|O;H#_Yzmp{faD{$`FIsWD#UScPSyRyi2DccO{Dy5|-$$Ch2k z41>)2tVE}BQL_-`bx)@|LVdyt@p-Z?B@-~={ukgcO=j4Ht2L~+{FvFKty#^cCG-0Q z)3*~q(GwG}_AQ#2FBAqz)B2B|`Ci!a>!I)8fwSQYo5d$%nGq2*Z{k|!1-9WWIXhZ+ z`J)<%cqkTYrU!xJ3Y`YH+0MPE$N5ohUKV7Ds$sLi1X;9=tE&fBpxf*YX!q0<6L2>3 z!b|J^E}pLm^Ax*Af0ei(VFu?fO);Wd6~sc7uW73iYYtDgP-@8o*si(Ly>-;=*{?Pa3i3{9W+A|BD}#0?}>6 z%@B?41o^$Wmu^yO>ox*08=ot>t@YNFlN~@c`SZ-&o*RZ`V$TYgTfGpH&-U*Po&DZ} z$J+*Y001&^4RF&v?Id_78#X&LOX|?t^ln%ZeQH>3#+OS-6!(^wZx^qwg;!U~)IN+1 zwN)?PfIZ5y)oD*JQC0Flo{?RG+$SZ zojjh0gGpnLlT+H;xu;gS>o3i{yad zsj3S?_%(#q^!ZlfkXstVw$7!V3S7$d!1}As>};QiGwgWjMu4)aeZoKH=~YjyD_r`W z_lqQC?%WHWerapm9y9fv>E-t)7#3>N&1Cf;W6#Vy`aC|uw5{}Ocm`}5ik>&@jC{4S zreWh5n~&z|r`cC`Z7kh^>h%fIL2#4|R z$q6`vdj#jU?+ooXDK>cWwE7*bsx^wv&S_L^iW#0AJV)Gqk*y^_c~v}_d8i)nDg>Dg zBR~DdAyA`J))h`mQjKY;tbkTn)pNpwH9+xFNu8U z=%Jr?sLCIfV(!fhG|fxfRzXw`Wy--l{*MBKs`;bL5d{&)aFp+GbT40o=Oy(}J`pg4?BNzYrwII3n1uw9|TAJ{$# z6lZxUp74kaN3lS%1uG`A*<56?R4L6?sLjCLN)*p@FuKolCZkRNp+`CUDD=6MK!6CD za>!U6r^=ldDPBAIn+D2WK|Y^IT;W&JQ7tk=rhHK_`JjeI?Zmx8QYogk6M!{i`JyBg zD*+2RbDs6647G{PyTxQRwoD^AH2^Ns3F3(19AZ?%5?x|#?K56oEE;_GI!!%~RB(}N zP{saZb#*q&9?!@|R3t?0J(^q)1*O1aQ2TeD8bRSi*#6@{N8nx6{gg>|vc#>zQGfTK zusZfBZPdJPuog$u)IQH+kTEQm`-*v>&(@qi@YPa(s<~IR3W`8riwokSiWQYGeLL%&JHBy0vRg;=Aux?|x5Iul)L*W@P^Ln%Fl7SKFmKXIRQND@3GAX!3% zPRJwtQNTa|RfwAM)XNA*UsWcBzbaG}xH7e~lc-l{6jLRM^c*4@Q6T}tN@zt^kK98i zxKrQ-fv3}zV>OnSfm{66gEN{tnxzE_lI=(qQ@tv~+}GCX-)bO7 zkrri`mx!(+L_=3ct2j;sAU`iE-B=%=Xbj3UJbh=5o+9h)u)tSB{2ncNiT==ONO* z?|3#XkUar?<^5-ZAyQyp#~7bAEdLTZkzHotO52*0SN-NlY)VEk1TnC2cSgdt-vgit z-A9-%cEi=RBg6))6YfG8phjA*X1sOy+2u) z_$S^h%9o8%k&<&@ruj=qtC*M(EF+xCy=s!7i(yL`M+%B`c~8yxE?I z+mP_Z`soPQY9KNaj>kM{E_$;Bc5z_CBp zS7@n)ldO3XuC(;1JMFbwJf+rbwR(|iD6r<) zLM%1@V4s4ICLdiqI(mJ*f1Z86zqtMF=_pq&CyG|Fr|TD3-R++rUmsqc-VQ{#6QE$m z3+qcH3heYc!tp4^D)L#gpSBLSllp@L4*;NYhw@a_ z)+PJfbID2&(Vli+ag&?IL`l{mV>q>6vb>d(>sx4|1X$BH}~-PR1x zy;j#R8TB$t4+v$`MTA^^2|>M{Q)B^}Q-;z+x&I6h-ecH^tIshu_gM$CJs0y=BMb(c z(Q+DD&ZpjVM=a0#6%>1YSj~F~t@Qzy?;g4D9-I3;NCyIvnU#qOB{r6pu5TL;F;@b? zU6YPTC2@mHBU0I7(ZF~-nN%xQ+v5?npGvt{JwlPg^`uyT!RkLZl%gD?|>5+YdC z5OO#PQ;232duENRaC&?uBohFZGX{gfK&X&$D^ACM>CgMgDiJ;U-_fk4(y{6E|I?B; zOsAck-fZ&~o73fbx6x(y7Z4N%hyU+)Zlddr+$XKs*|!D;crjH+#uVYm(@{dQ61V^NLmxEm1U zl+=ri5f3`Mv#V`w#wq&@`n8mv^(yO?>a42^Po2a@Y0lMyNqS${Woet%7TB%siJRTu znd{Zu^PL<3IACjnd13G%<3K}Qae10E3HfOWWR$23_()KdAVWw9^$u8+DgORPO!;YG zQ1F~>P|31OB#Knd1N~7-MmHit^E3FgP7&FL=1A?WAz{ebY&5Ynr)4?=`4TUko$DTo zO>Tj-zoyX_RR{WA=BXLh!ugq5)yC&L6dz{o^AK;rswdk!8oVH&6n2+huvB3SsRK`Ap*?dn5M(PF2~~6prX{ROGU$ z%xTNugh;Spp4CyNlAdC2B$aU_V)YG>y7lDeYpzFW65pDp3KC*|BsK9IGD_B&rd-?N zdPP8uZPKJKp7c`tR%HtxkP(z9*Ez}LMl?F3AX=SS?+?jw9C;a_b&Ly?0;vKXS1wYI z=@Kqr2gu-1dol=f7v$(QP32-3BYVS3=Z(aT)&g2-V~<$U}-jAPr^17$CUz{BUf%a>0)(Zy~X-?xjz? ze;I%@Lz!;(0+N)VYH0eyPjXckYb`GAl$%S4WCpyuwZ+aRil!!b%=dsN-4Q(oGJd~2@7pkq1t5LjK;lj- z&XQx!vT4yXLmnhYOuTWYj0orPFrj_@MxL=Q+p;w+8&fXw_I*4FwfaVfnP^l20uKU!B(W8$=Kk- zB5{)TYO$?#Ckqj0S^-^=N%{vg`iKFaCCc-O`@qhuU;-RG@CXBoP$UHK&e^;$)=oB{G|2oHvVjDDq2fK!Ua5cEW(mm7~BYu?@U+?i6HxF^(y3 z`J>D%dXwIN>Z*R#zAozk(b=PZ{!A&L-f3%Hv3ia#G-@6hH+-Pu`6{RS$Yz_uE2rz3(UcYNUKUs{ZO7 zaB$JZRZ-P8UTXiyk5tYq(MPrZ{n6p{x*>Eh=mzw8?Di8RYx((TbMsLHKLF%zz-X`MbWy1-U8=vWje9cA^6DQ!sl}eCB&5h|j8uGD)?B^h z=dMWi)ZCb!ynyiUVzuKl1YEzrH2|{2EqlXgBq0BwMQEpoNh)QXZFk%+txW3U`tDN1rRjpb!iCAKJjxCq# zxl|~#98oBpS9$*XQvH5oJ3JOH{U-eh^{N?KZ2bhd_9C;Y{5ZKQY~9Uy*=e-ghlzWD z!GD0%yKj2>L*LKo1HUW)*SlIp?B3cr#p>i!+5ITKl}obo%?HR^7C5Ycq6tURvjTOZ zY?QYZ(NeZ*=JH`&jUj6qv1~%u3ib(x{NegKjAFWgt8k7O!QmQ`)SE9QvrT)VV*UE@3(7v zvS>IY6@C1`vd4E3IYs@WdlEN+%% zbuz-9yEwza;3#z$8GHqUv=_{zi_H_o5?Y;Abevya0g13wKw_oU#3_@h09=Z45)EAX z@t(uUo7S-Zz}jEu6{1_aK!Tx4GW(AC6H$*vAPd00BNzaHG1MbYWeWR@jS?bJG;tg3 z1Thr$&B8~+TXl5voX3xj{mQ$CjI?vlolz$Ek3QB-f!V1S9z9f2_jQ~4ZWyU*yHF3zn-ynn9>EC!BOyI;v>m7&boWIJ3vHtS)rZ0qrWQ!{Ia{{VoQi zLjC&+1<7Cfm5YubFJ(oshh)WmRwPwMU1R2NMM-POr8$KVaSZLMu$L@up%J87PN5Z~ z+)km_gZjVdBkoZv!wcCb^i+cck<=~yBGgxI{groW%4=>DQn?+#>DJ}F9(}z%GJ?Jn}j}jzDaS(v2gjAVw!*iWfBZg zMNA{B>YW4XmS_kpWEx90NJLbwL@vKh2xP)%Oj5yUkOU-R%9393R4Q93DGQoK6Y*^( zrOZg0jl{O>!(g0fDps^3sZvG*(F_l0)3M0z2_AV8&P`Mm#UAQQQfL563X~|8 zXG_d<8b)R-LyIZr>B-8B8x!ONmDkpy5MXdC98Qaq=?yM)y3G#9wt@d(UG7bUs4hJ{ z!B+PcxI%)b8e|hPVIco9?VUt|pmSFB-SIeK$5HOyZC4%aq|hIQ{Jd;Jp|WJMi+ll5 z43&z`a=ApAtPVS@oQeBs2C8RGSnh+jRN(J8y5HheNt(W{N7Wqn=RWVd{`lB0MHTOd z@%kA9O<}g^WR!yz6l_&JUBhVTKR7rX8+%LgjnnB3w6uHrLqv+<7tBhY0%FGnSYa2I z?h$QXuN@7NZAaC*uLP6|5ywR?9dB$Q6qKE?m_a13NKuD8QmM{n!BC}9eBMi2swUqj zDIxYrVwubiD@efz;Nf#R&qA|T-M`ML+q5;XL$?UO-}j@N>~;R!BmgB-fteTYHEw7) z1+K@qDkF0DZ#UV!kSU07D*oMbW&rtk(hnFEWZ>y^P@@2tDO50ocob;V()q|G964W6 zeZxKyKF1)YgMJBhpCSA!`VCkBM1FbtMntUUZAODvXe8>o0Wzu3K;ri(ZwMqL!C_W| zV(|zPTqe@eZFpsc<@hudX0PDQLX7nWWVDK@Vf<*Qvu^ruHP_JCVUqs+!1Q7~76hJ>=^o%;? z=r#?-KnykhviNj4xbs&u+4PUZB7D|$}lQJ<1st+ijAAZ;W?=xCAz6 zN}>~Yh-zzJ*Eng;H(4OY3>*+ZG=anfXQd7s;2G^}z~7Y%Njd7UkBBzWr&{KFK_Qfc z_qY-XiK+Orsj5tyNSN*EvH=){6BlG|d!dZbF{!}RMv#mKWv&#Fl2anfEEQ*Sk ziqQEoN9$U9PQQj}&Q-?cYk9w0uy)&w4+#DhuRWPvS~}6fRaAaG&mx^VCQ{5SLM|*U zwz)`)qwUQ5XTF!KSq{mCl5*UNnr0Bprw8IrriXO>{6|6P4FA)3@q14L;iWEf@JJXM z8-x?b3I*kYHr_@nB+3#Yy<%^x+!!e}CvflQZH4py1vNm*zt`)mzv9F=W~8)w%XGal z*7{T4FVCWOX`zH+0Vc<2{bk zncGT~n^&4&b2sc6l@TT?i+}y9aJGt57 zxUXgID_p%m{SUsFWcrF-Uh9_qjgxzD4F3NF?qhA=w!%|?JfCtBTCZrld~W`*e)dXX5+7fzKI z3}CK#o%B?+5zpBtnHL+8NSP%K0IC2HfB=XZsG#)#0B9wI>1C9X>C(5eb3$9bOVr1t zZNJid-?a95z81s;k}t=8&B{f(yE5E48^mvinud-6_%r<~V}scFm&OnCi4?fK<{>^eA@SqPBc zHh`)+!v)u`KKG}!uIu%jMq12aVo+zpAuNUlw5B)=Lv8?oCK%u0?fF0R*ua(my$E84 zJD!4bu}LIkI|N?m^Opvb8YO&jDlQbAV`C9?=g(_ypoZvVqGes(%umZP>7byLRP48D zB}~STd}hA1B|b??Q@7!WOAO)d5$uCH(6hjrC1k>^0IK?7*4l_>DvDb~!ipR+g#EYl z7&1C|JZ|MKmKc^rU=Nm|@T~se7LpvDY?8Q@Rz_UpAoWxkjYJu8^5k>c$LdG6C%mq) z+RpuL&y>ksQx9I(y{EJF??sdSj2BC1wdF6x%9~@MvMQW*sRXPcDZWjSX=YdL>)WKANW}R|*dLyHe2O`_V zO#XMxL&X0UFs+J0 zq9&b$CmDrZp6@Hu6yv^##c9s(Oxi3X-b;2TG}@1L#^GcXvjVB1E``!*9QSRi3LCr6 z6aGG10DZfE2SO%3N%bb5iPHiL*)(Ptpfiu`}F|jGE48CX%cX5#y0FCIBA!opgzo0Uc|WTrpr(W1|EpOFiX}~ zL=Kslrw_k)wS8>lVJOsy4YjcaO{zEC;2BC^{1wtxgI$;V{b*CB*kskI^kejtZRO5x ze!pnMOqK0#6zr!@==i7NjU-bpZ>w!$RaYtumzu(4g!i`9O{+I`&Y~hQ(-C(1iUDc3 zGgDBe(l4AZsIini&4&R8Fwe1P;565iRI;Z7HR|BrXoRvV(WUSi&2kIK@J&)q;*+K3 zwAX3>I@GF+WUg-Ja-Vj0;+$2E`ZUAhVqluFaKfeBC5B=F-ui5nQCQ_T#aR|s+V(qW ztJ)ild6wzVjZwJw(26t}>W9~Id>M;JAaBnND{Egi^XpdW%2D`cxpdH#V#t<@O@mFA zulspyAG6A^P|P%$N~io=2CvlONG=z0wN&es$_z9MwI9F*!JZfbV@@DhG3CfAmx361 zgeyA2d>{hGnF_wk76On~A)ncYw36To$-N37eN)<#2&puDKt&;GAQ{Q4I+l&CrTSP@ zL#_EomsN$DCzEnyQk>67!RfhM@uW+9V8muBf#I+14V8}WzS5qI*JT4y=fDjXb1$C43W zf&(M8%i={e2?{q-&mred{kTAHD3t(d)`}ezH*9=_ktNN#IqEGCe~cTT-0H)xAO8vr zXlOggVjpeKOd~*}yqnZ-LZi=O69ws9_-HW6C>M!M4$dveAYwXYx3?6!=&w^Z>Y0r6 z`BdIf&%%$?L6SoG(HV)gCjz+sznQ4Cs6q5WBGWF!RzXXL?Sh~#Ne99t(Aks{*r*V2 zSUl!fFrsmFW=grtW^H0NL^?Guht4T}dvxnfLU@NZMJ4*-1wnrb5Tl^D3TKfBBLz}U zaTq7yRWcIY86d;hXu!Tj>D=iM@{pI-Yk+3|&CdDgj)WAnRAZYg8%^SOhyfgCgQjoT zdEYmB*j{beTO)8EQuL8;NfS=6m0oqH4D&XaIR~5?@te5tlt!^&0-ZN(5(t^3P8r0|Ck>BfBm$?|*-G4>Tx z4{(oxby6+!jWJKm{q8*vGR_$d74wGgKtOUNPu+)#v8)b|jgL7EKIqjV){uRZB_G`+ zDxX>!AXxSKJ11`4@??!>DE5hGx?bO4fm$!IZY+k)Wag-uFi(=0|E6^8CAeK+1`|1w z9OIAu%R4L7b~>LWhx6#*Fq|E50R#?08K1%tqRKQYiK%_&a>ZHIELaNKAU> z;*QEm8Yg)WtnD%x*SyQgx4?sjm!rBOGXa;gSuL)D1R=shYd^|BVbFU3HjcUCvnKn9 z#ATo==ki$}i=b<)>ND}jdOGhSQzKYP&qF!1T9y5VV-3U$VZGuYUGRY{RU-w#Jd=L% z69@QYyV!-_t!7vR(4XsA7~|ed+$#w?&2-JXTzAUl#dwp0@R{0l;dDEX#U+O2?@QAUi1H3=T3|hLhzX6b5Cf5QAnPl zl;^3wD5?v%IalCJ73u(s*v#j2V&WydC9W4`E`c?q5niTuUSzhtt9ybvU3t(LV%8Wn?;<3c5ZJ;j;CGt=J-+58Zk!yEMng!Z#!r##xKgkt(rS+vGmczTBu4|Xrmai z*<@gQD!Ur?C;SnL`%9U9m`b-M3Wl*@SBbGz zeqwmPqM+bK$AhL>V#(-2#nbw!P#r3nnh>HgN|%+CgX0P$ZUa{Q__mekxpM1HYBh?F z^?i_OU>K|naA}%-lXeP@91ry6a&3>&rM~p@N@=K94~xk0UCK?CEPHvZ_&E-4Y6bqW z%26L^xJ`W_)4-t%zAHy}3>s+SLh@1_kx2%v)FPLRg<2~L;VAFdp`decHR@(KWgQj` zE(S1JRoLh_`9)IO(UNC5sEc_-K+!@Zog+a93#@39RV-~vpF>;XLVF3b(PuRe`9d+- zQ7-*EnHT(%WHiqszR~atTzMOJE@fNO#>$xwQ`*xF1?&g3t3ZT~^sLDgng=7) zqv4_Xodl*_$W<3tji|i1IAsd2kxbDjxk40~!GK^%lkGzEZkv*F-b_0#f=cgEZBUk_ zg|7c>4_H#)A_H|#!>LlH4DT4!P)8sm$99JzWCMB;ifGb*nWwvkU+IW@Yg|Z` zO90EAESrtmjU5$(z(vN~U87MwN%w1*zoluc9V?~Ne%cS#Zdaf8m%aWO?JFFJf`a&@E5>U_&NWOGvms&`de#|?=soR*1 zX-3NBCda>Gtil;h;&7#Qx|0LKRBF#?T&R1&}+n*|36glM)I1~k+?SVbznUWuIbc97X=k&EECE_$*c*5(%hlRqy7yGTJ5 z7$+jkDO5qITsac3>4R3NyUrYO@Lz*Ot2fn6Xuh2{HWvL>?iXywY8`2lj}N!e4AZ-! zWEva&NQg%u-|TrapWaXEw>4&P=TQnJIBCtmN^!uC@f?}mFL zO!t!Af3q|?pQ3;`@#6@Jy1FI3DN%lxnuCH^9wRUl6BPJFA}cX)M;-FtHjhngUu;L$ zc+%kbwu2+KzxWlo^O6y!#Y}3z^iCuo#ezcRld?()De(NL|=WiK@6PAX2 za9Q}IvxITYgr=&*jZS~}dPz;y-^K}VSpj`0e`L8rgMd*AzD^2JsM+^4U>cmXW?AXp zN;GhgFQL;x%Q~^zTdtw&^CFi^ON7j20^5uUrrru;`2wAM3;3aOCj`~<{)9k9> zn}dg@dFEr3TNcV(Z&soPFO{VTKpIzobyx_4LwZ^prp7RzYe>$Y-)aEhGX;%3obW47*S_apFn$u zZKk@lD^$AZWOaBH1xg%bAd#&{=CG=ud_t&Ade&ouS?a|FH+YtP_Y1%-xmm zu9%d28|W3vkvYFjR6fPGk0_HI(xLR;wFZ`6dhbJG9|>xM#;pv*kpY4J5B?b8V@_*U z;;B#xB`H)pUoL8=@Z%F=ZK3h3^)t=3^pokR#u&-Ft%!Z7ut?K5ug$R{C~H5c1AL)~ z`81{)bPkFIG4mN}KgNFzG~4`99G_1E@yKgK#9|v;Efc=cez+;hGMDg6=NDl)yfSQE zW{eKf+9PL|X)hJF)M{EWV%q^#khIHSkJA&#Y! zq=-0#MD*29(&s{(E0H7Pd4gCO}APIFl(I1&O3ihe~9-*eSBFPv}MiDgzwS zAsUF>1f>d%`*nGF-Q zZ~KE=oWFm}jy*VoQ;HSu&d8Du02n0he}yu}c?uhZjTA+v{JgwMbX@n$3JuaK^tZ1N3i2g*bCzXg-WFGlZe&?Us3m?1uo~KaXLkv4ox~*@YLO_`j)06 zi+X&eZ#EB4N|fD<=O^eQ+7NFFTb+}QM?iHF(Idgd#fVAA|*kS@%00s=N9?@B9l1qdvZ zh9U!c#60A|`xob$NBnhj*ED7eMp&ece_lGzioE*gQ*ks?NI$!e=x%pxtcnn5ivSC{ z7T+Q0`2ITQxSs41{kU>~fHy)NZ=)#>dqJFevHPqj8kUJCYVlqJRI*O%b&$!>n*cTe zI@T#B;8plJ+Ud`|Z0dvjur9zS`0nEp_~uY}@tSTb{oSjbb(h7dBc2-g41$4}A5tBL zzK`~fxQaY!zeWl#J|&|Q?S!kjLp{Q;YrRqn4fUn+zt;zO6py1M^rK{yd-$cTU6mvh3>=syB+|<54_&n)om}SGWJ7kwlaFPmK{M>OGHR4< zbL#2URKysdY1??HQ?mxpeuf{9pXCyK zQ@fgwWDV#+xyeEoV1wo(nUQ@|I0-*$f34WyRx*Zk%If_S2E^oDN95JWUnI@JY>QAWa)<&14ml5qglMuVvo?S5o-v67rR3 zn$h+3efC2;b>pwQ^Xe3oH&5SQr`KT+Yy?qb%cm*C8rkG(4}JdVF1m`Ygm;XL3T5(K zVH<%lx$Ez$B%(V=yiiVFh{U2+)TGM(>@d0s?`W%zqvWi%_OI1Vl9CjhRjRt^AE8ng7M;(<=}H;PwHLfJa&F}& zTJ?dApb9o8Lu%hw6R3vy5mlNuV!x7|Iu) zY0z+lBB&RD@&@5E+|`H_EW3Om5xSe3)z5w`;P)~XLjF;i!)GcZ0F1UK)K-1S__^;+ zS(n~Oi(3BF@=`>2=1li=O8ZG3#v2ZMJEF(m^{4$6Kx%%L*s*lASCq9&usE~9*uVuf&A`Q+e15H%qj$|KIEjgcCRbGZ^nKRx2UhS1d{8}lek@zaAV1qv! zzE*hUk!K{pnTPO_LmH>+bqb}5b68@oC zWU;dXjEFD)1&)Iq84+OQiV2%}&m^>$s>1s}_Q~9xeW4cH_S$sP5|(2hA`vgCGPTVF z<8B86vd=JV2?ht^@`!4sO`6F{TD9@4U-1GE258yJj_pwpz9C_DnLKWeDU_7c*u-ox z!|{VDmPJ-4uF(hJdTj1PHJl8QE1fQ69bv=iiyUT}BW0lJ)PaW8L7Ff4hP)MT?yAIA}$yj!aE!k1l zj%m28)pQNgNzXRE12*6{EGaFmggAn^+^=Eo3 z0%YZTKsS={LX1rJn79O|j}L0Mm3a~n^k?lB$IzoL7jVTw9j#PGIj%`ex^c`g-ritp zx!fxjAP*6;n8Q{xHBQw*Qyf5%QiEsv0Ih|Uwk6UHo@%a|-$k1<{)_l*6~RO4DzuK_))h=I&v9erwd@RkB!uZD+YLExF$@MR*Z?9qpLE6uH;7G zyH=6@#5vuq1CZQ{G{pUTU^?^T{sR^3qer2o^qs5FOxkHc>VSRtL-xbxT)50_w=7QK z&$r1NUb=nF?HVgWPGY8uIU5g1WRK!DGKs?^=M=F1T#iIh8KE`r2mc+aVIigy+So>S z+d&Umy?`&`DGX#2d<*h}L-X^4w5kX4f&)sjLkkerb4@l0Ny2B7MEX4krv~%R-%8dnW=6cPZEtPM<~8x zugbA<4c+S0Fzsv|XrK`DN~*;C(%K4jt94W`WhJpvO{*p}=)9(S^Yj|5z@6j-KY01c zJ%(X5PdqJBzO+I;|M!yOs*_@YrgoG5TSYOgxU#>&FDS`55$~G83$v*1;_rci6YL#! z_jzgC_rx>*5 z7*`l^S2c0iZA2C1et;P&N_zmx>Ir9M^#ocD1(5F3;wOIo!Y9vHuI$IVcOZ7NcOZ5j zI6e;7DEH1a#JfTB36$Jy773$;;I{gRU2{FvS@EeZWgs}P6}n5E6nOnDno%w!c;tE9O}EVEht zmUb`rgX7_Wmq$GJMFKnerM~_CasB=Ik5_0!Xqjg!Jok@I%x;$@DGu4KtJQ8ohY|A~ zGW_1M+_G$3@|3^*B1D+6%GGrIiIDyHYGcR!!}`!J00Ia8gS3%MIQ>jtp_2mVc9CN0 zkS(Hv%dtktezFRetUY#66;Qb4MCCUt3pg7SS41jo)9 zb4pZjSPpIvvgWmw|1T>x)(@Gi(gi@^N?OGWvmW$nU&_8ORnSIb@{~KLWAqrZruVMz zgrpV6Z^)jh@2&w5xU$}gsMqM&$!~D>F93l{?ZuSoB%%O~NQM=A@*l381X*aG4Lq7} zr{&w_oj(?%pv2-1pj%dN+u>ydy&MO>mg{fP3cy)yNWeLOz@2|;%wKujzXBj|XM8vP zaA)U3@Wb(?f6IMmc6SW!jPhZb7@}Rt3-(#FWMGjyQ6lbCdSu> z<5nZshJ1kLk@_5`7x$9UVcStdYsFlyrY+FLfOD@HYUP1OD@& zan9}Y8{JX?Xpb^cYm+-L{3*I)a=`nhJ@yA7D_ZWLS7ZEzudHHC_#A#zeV(61bp6%a z8tS|PnV~@L+n>Jb0M1P2$D=|??jewTqrV=W!ac)1t%NFhHIVj0#AQd4nn`3c6VA9T z;P@Ap6SggD|Mgh0X;JvO)v<}`odp=$MbFRsi;q~2@1{}NbzBTOciU5&=dd@NFI+v;I&aXrI6f10_|Z* z0OfE}V;(^9=71;9%l#9*{o><=V&i?+?t3=JHplV`#te1S-((YpUC^qRmJRIbs|_j! zYCgnjX6DgI7|1MWXb>c`UC`g%!Uv$>cFn1XLDk0 zP2cL)+T8^x0MP$y#pIcJ5h^kT&UH-G7a!E5)YNZNF$gR)i#Vt+X6vRsgP90N7fgju zs6}90|0u67wUXx$Rm-psA~8WE9|9D6;ygyuknaDl-Xs=%6Z>cZ3SgSnl3RVGY2!9| zKgZ*!uscchuS!+7gM6BSHG9D?MCQ+Q`#p~inc3rl8qL%Ar6fBZV5yaE38b6f*MR$J z<&DN}mslvBODfe@{BtUDjQ>7MtWbiQ=r=lsj+PtTt(f+Ig?3-rx_it%<`>s=!8h`s+D(^sZRK_6G;yBN8al-5WzYt z5+T0>TBQ#H6aWa8Yf&JC^PYyeasVR2HB(fOlz6LbR8nqsNxJG%%iBPSPIVURUR{Vg z13wDMr=~4JLC8{$MPxlG;T`w0M^t=CF42+p#;-Xoj z!npig3W{51k-8vL41+37S` zT*Sv%2ZhYnNJ&n|rwWqaz~|Bfwa5bw_cy+4l`f(;+y`R85sA{UnAppa{CR# z9|(!INLPZDMvg*BKC3im(eFOaLwdRmLSm9A2E^t0R($KiD73s{ru6o$kfOVYlRxuC z??>=Y#t+uFQANrSjDLh9xgi zd=?7u&l&Fmn&Yw&;>s(7u>i%FM*&@2-OpJ*g?NLb86C-#``st&ajO$Gho4!jd>o^S zwffWDj<4XQAAPd(-Kp-1>dRuo2kF~3js*S;>;o3t#dVUVd{kOZ?sQnabfY<8 zEAQyQyM!QcEp5oOXJwCet{42?CNHaK$j`_WXDgYrR=6#}=IQ1LJC0{1nv&J!kC&ab z@fV_NNoxJE*TIQk5g1GZgGGtpb5g(koOVlo{Bp}^hSKqC71pCCN7J&3vSU*W@EKSF zqgEsoF>CNRTsmc+DmRvw8Jm^Pl$9*-a+?!Vu9E3synvqZf$q9@@H3v;XX@T{O}~Sl zBeZIrt$)`+oMBQ;MOTWHo}3HF;T_86%47$>)4 z9)S|mdTYYf39(@skSGEGy-PNSt~9Nbi_>27eQWP@e9}+ewr$fXso!fu)gYlEYKQ_T zf|UY|_9ptgIr~O+)7SK@spKY7_*74$mol-E!Ij;!?b^#vH98yJf}&DtWlo8Skx7wq`o9#p>Xg>tWx=rLDDCkCJH*wU8Lac5%}h zzz2od9e|DXCh;n#T2v*l>1|cPK$MfI7Bx%p3SZDENe!DL1BgjO)#_)@sm{m8s4rHo z00^7}x(lV9riQ0QML&imfDkaNSZGcxcht9G;dX;S6^Or&q=qX>&nZ|Al2nW8ycK03 zGK-?LBkw#(xYOL4tJQyukeb#=%qoE!5qRmyTn@k>olM}NkOVFx(b$;Dz6LzO_aG3){dRRk3-p}(M#+5 z*1~b?{R8Ih&JN}skbDCK5IFMW%8`3p)!z^wXCSWpv)=Wk?f&}lx&j4m!=z%11W!LD z%tYt2I>hkJn)YWy9&ZEZdOY023~^cDpyb?xwa;qPvC?yo(Rfn&QQf1DNRs)l5R6jl z@(cBNM`=phcHw%nCO)5m#q+U=pID;KYT9NkR7(F2$mlk7GpL#>I6l=s=zHX>*1qKM zCB-|QHK+ho_Ymm|P@E3|5s<-?tH!eWzdSVj)?CSwtO&q1o%X7%(>|La+;XtfM(*cX3y0gV! z!FVCy+lkGy@31Vy?wN(?CWO*DRb zL4<+~&-Jc#NDY}G+|QME+B)o%7SKX`KER~nrIu{GV@Q2}0} z(Zu7HW>Hb<3EO*b0>Z{CCrgL zE?|5cx)q3}364m$$F+EC1R;ANaTk=zzK0b16(23q-+=B@Vf|{I#WhD;a{U{fgtb!& zOm(lsb!JY7Z7ho=eT^wqtpuFnTXXB0BokkaPDsqgD%o55T zzBjk7e;3^g6fqa<&^q(d27pqc%ly12>kvw1eYVq*t84at-M?qde^;T$K-7Sg-$}0` zJ$AXREC$BR2gRrau=xknZzdV;ac;m~K8(xHm7v%~q$FhDM#ISqZP=Voh-KXLPs6;b zU6o69VVnnMM@kAB)R-Q5$Xqw?Eu?>Sek$^jAM3#$Kw!WZ*uHq6+<)3YjLxwZ96v; zIV5D0mKd8HliW(rfDBi6*kIPaZIFhYJ&u)wx?kj0<%-AHcF`ewk0Xij6csEbF>p28 zyHGGhR>4C4eIhs=t{4U@W2(J%lL)aut@AG-;uHzGvWs; z6p>nb33hH;Jq9j=Ltn5lX=zZyWM8M4r9p9OiYwH_1M2^G7x&~eASx)N0Gh0VB%2!F zQGO8erp=0frF7X#Eb5Jau=T)7vn1?hSrj^Az=EfkrFm7KlpCUlIPmH+?rkyP<-#1h zPrVdM+Ifc1Vp#{NP2rde5*|Q%KT3Q0go;!6ZWX)$R?v3e_ExD`cB%d4w2V6xIK(mC z{;@#lCQzuReQQ5L*m`g6O?-k*0GvJbD)ajt=g1(!U@)Sgn1&nJwd!OR3p(vm( z5R*=ha>+-#Lo!Ww%@P-QkLhU^4RmW=F_?M5m~>G_^L+`kZrKb<6*lp6GOV^|jIu0DJ_i?>e)x);JjKb3!NINW zDw7~18x4x)A)A7DL4&qswsk187_-RfPjRLr%Jy$%w=9E?0IWGt)?AR|Q@DUU?4;&o zWqg0@icX4-YX-Ek^m#<4CbAi>WOA+x_-%!TS_WX z9>a3`L?=nUB1Qy02Pmh=P9nl(G!O5`eqOao>)+kkItK=?r8@qY3VaHE;;?oq@-)o( z&5U>C0;2?sZiiOrFGP7$$Mpi=Iv1hhSYwJe-d?00dlEPA%u0_QlDTHOVf?8t*Ie)3 z%Z%A#T`PA~Ff7Bm?Ii}fVs8J*<{3X7OkuTWa31&_d*8%JmxuSxa|e47v<_o@~P3b&@( zZAs+PbV@T%0jVb^uYRCjT4(LHSFYU3T?J0bx?9ad5>pD@w3I{t#Em6H5(H$kp_O!9 z*)hqZi{*?-I8IP4!ME#bOPvn0lIqI=)4|n>JE^7oT@npD`j7M5>G^^#f!+g%dHH__5@ytshsap4f$2Tn4viME`N^@1W8S;~n(9NG zQ~-w-b-2HyQ`7m9Z?8oO^3ep_ss#MFlqNeu4(NBiMBNgo0EMYJHYY`LG&(G!bcu54 zwEK)=8oQJl9qW%wu}i<2aXSInu#;U4=x04!g5Ozc;*w^dG;%%Wm!`C6lf5dR9eAC3 zkf*b7l1|K{t;4>wrNtR2wkb_ka8_kZ7XA8ok3c~eMY-AZ=5&{Eye8(+USn0% zsdQ_Axj)@CRoaHrQEV=Eoppz}Nwzil@syt}Ib1Nr8g9UyuXwGT0|;E@*I!>3v=cQ; z>4rW#x6LaS{CZjc?LZ^}1TH1*-;S7PSg>tjqr3u`Pxxf^(d-oC3*{~QYz#AD{i29p z+)Ay8mF*x$B6rdk)MvXrf)%?VT4}Vyi&cm7rS*xuq!oi6EHP*zmk&ve@(9yhHR>#t z^V<3N702qSb+hLGStm%w;(eR|iMIm#OCz!JKk3-K@xIe@^O(_cHF|Ax;*pzvecrLlxVim!bRhRLz#3eD|LN_ zn`)mSl0AQ&ax}TjvUUjB1rWGf#C6yD`ru7qGc>@@*mKWC?;+C$-3HB->^Q(;zE5hU$;h8|6NUr z)Fp^=o!Ax?HTcc&f>1pcy1DYs`I|p18^RN-ukgE>Y9X_KvZ+Nzv6elfGq|&GE zI`!z0RgNTn17HsQ2bd}P>BT;R(TA$a!E(=Iytr8~#=!d^-)2x-VEZ*+?71#0)Zga; zj72NE4CywdG~Kv22(ykraevx*R#i(_SgQTSxi=vYN2#8)K`mXXdw#(WOnt*Y&s z&5DqQqsS=oaNf|{tA+YXq3ehi1>%1AjNR}@3N`&AABk9GE`@5j z4%D{lLOEq*7{Qc%M!i`AP#1J_9;d0}4u{Ni0O}F!(T-o6K4V|ufj3=5V9_B$Bf<0W z-8%+$FD*X{@TqE_6be)m7;0ggpMiW!t9vfcQ)jb~S3(x*nMvvB!WaHs8p$)RWT&4~ z0gqs{VM1eKe01cN~5O#c73U`CvY6*hBU-EvTt@Y{6LYlu{Jxwoq$1n1@xernkky%1*;j z{efI-GxzwtDChqO(53ox%vuWpvg%-K?qq6|w_O4}0WPrWt$~ahE+G5JD8=o!%$&3o zYI+vHy{vCvGI)aanVcCA1;%G=!h1Rn0ij~>HC`2!0{gB8la(RZkPI+Gz_n+g{lgHY z%g~x3qaa+1ame`b_VDu0y~TT94Ul)nAm?y=CE-ts>3d4H0=E8pH-mB1ao z=vXHY*rwW;8iyh6Z;aktY3yP{0UjOrxLPs&O4 z%(b>0j1)|p$=mtGIu%9E)%Vv5h7)6PKy-*PY(R?wCvuQ~4%nthOpPOuwsLYA6!L-o zqa#tw#3f(FF1I_&woTJtX;rzK=ezdx?>4H{H92P;Dra*7dQ0`Sj4FtSdOSD_qG$~W ztfXsi2XzE7QLFZMBn{B8vB%^4dx==vU-C8(w*3^x^uKKMQ<5m#?WXcb&tb{n9d}&{ zr!^tHt?E{6CB#xXpvC}lKSikcF3QM)*aaFGOJvd@EjwErD?3eJf*yYo>^4IGJ*IM( z@=pWhWcfA?{7yQ4iF&4i`cL)xHv%P|Nfu6;bt=;2_3P*-N7c?42w@EHiTZx`yQ+)P z3t;r}jrmS$u(h@=d~zgPm>lOa0~zOh0rYUSRQ>!SAcCXUd~9w;G9yV&;9M@L(k)L_ z3JT?PF=g?OurHxbHPQS@4?4S-LLO&4UI;PS=-9t%h^K zbjGmERdq1%=&a9~i#zGe=Q3CM*MT=kkK5BC4g3~Ic_$sGugx$|{S|HE{c)5#?Kmwm z^AwAA!2P}1``rY}k#v-Vbk3RR_IY&>>C8Hsi%K5861$^j(p0r;ub&qS|==KpO# zR^|T<0@AatIcUF6It>d=^Cmm}oD7U|J8f1tEqbP3D#4ai9na^@ zcO9%yD4jzKVm0LMLtS57hP0|&u{G)=Phy0zx-zFhfyDgV#C7vg?7PiU6@EeCci;fG_#Xlcmhe zVt)^*o5E5vtS?KMc|-vtt0V~Q?p`UF@7eN+#*<&1`f=FXv*L@8X!V4o)8cnve2{205M*Bb77{5ghY*5l3}FC)5b@(d zyb#M(tF;|*7)ZXYb|Q(IORep83L83B`5PV!vhAEnJ?-Ypc~lfw$MnFwhb<|jFvZx= zVkfl}#F$-PkSdnpl2Z&$dPhZ#Svp58Qm( zptd>yPk^{&u0HO}%Jspg5UOZ-SsUntm@&wk#fIA0XCAz#ea$N=F6_w}5Y_o8eHrJI z%{@Y^c;hGNRo41D9{ee@8SZ!1#a(Vw3M?rq8uBVU^mpMcd@}wGB|nsJ&L($U>o5Hn zO({NDys|Yx8Z&7eF%Hw#@E=JThX9LQM?O3BXaaFRy~iX2DDtEqnA?~=Z_H=T|9BVV zV?M}Av~T{I=A+2KjN&UA43aiLu-%d9%Yl=yyUTr*FZ{0|;p7my%WwcxK&!t*;K^!X zD)+`E{aUn45!buCVv7fOjZVlv$0UmL<)BSnrEU%nF`=Vo(ua*Tzb7g1xBch4)z0s2 z$<`3aN(N^{>$>#K3QDY1CfAIhyIQEnN=UUXO`uxaf1d>KXmW82c#<>&T%{1}iu*>f6#N$AUKN(Jcc_ z6UorEYUK>dL91HOCWjoq5}#a6Roc8|O0!zVjY8s|L_m0YzFERQ45`)!+NZVUKU)=znRI)S<0J!we&j5v0{IprjImL9~b5-_K71FQcDX3Q< zO9STv5E0gM>&?}So#D9o3ga7-#F0CKt*iI(<32-D)kn7`B@CF#_YPnnAJGvuP zOf5P$w#HbkE~$LKd?=Z~2j8=Q$$#l((lg#T09vUnffBU->aQ0JM!o76iVgCn1_NyD zGDjY002dsZRKZjwKA(&d#x}mU5spjc(qFC|n7Ymf3a-;zezEUl9IVVym_)ZL06*1| zt8N2}RL-o9qYbz8v>+*QOW~Z^^oP8-e86E6Pf?DxX*b+W^4e+`@MX#3LL`tW89&Q0 zu})~?Ufl?pHzhG~U&>Eb zfd+M|pXHr$cF$Jt=uM508wb%g9i}$BLGi+(Hk~) zDB4Iv2E7nw3|y@V)J3E@(GCbaFwZ#%d~kBYjP3?q=>OJk(WKScsAf|+&_M*yL(A14M5fW zTACYB=?k^h>5}a^6veT;0lWb=c=oQF!*HYNz@$VVL~P1o zKKf!Nh&ttnWE6A^chc>CBqlC3?n}>(I4b5`Zr9XYl}>oVSTOLJvBXDn09+o8Q|d&f zd0$xgExJg|B`s5?(-}SK2YjGk;$l7m(saV!)l{UW#7;Z`)&W1l zN&>0hm1Jo-&APEYlU2s_yF$uOY|8jro6>W(BCSJNYGm0?EyiZf=5M~nCiybZIQ?BF zTU`zNTvkS7ipwY)@732qT*glKAFRaz=49g#Yp;JXA z9`lU$#stFkb%6ht6vzg!wjAC!d2`AM3dO{O32{50dRjxgbOQ+2CB#)v zQ8%fZKg3%7X9)|F`=(oFHv-mmLDP8t0|;E`=ox_nZ@=m@WwVY6rsE6n?->GX-yp_UofK!vtbYY@ex`{g#K`VKEV(LGcqw=PilTD_)WcCGelYxR}5+#L_RCPk^o;uzZ3xV z??e0EaqE~*;y*nrCS6_{9^#>tkr^k=Gf_=U}xDGYfHERZI z0Fvj9wRaB~Yvo-l^18LeLa0Y$X|eVO708%9~@=g1EKOi z5<#IG1H;{=#ZAqwIx()k<|4Lz?Lfxzsa`TW}V;KST-;v9U~L1UO}76#*zXH%acWm$6rq{(ps1j?p4)Pc=mZS z@Ay)|*E$m)B_%t^-Q;@z^v0HZP0hJac1*P@G_+=xAPn#vG%A-vMHBJdbQGRTG3)xc z&PkSr<^Vw8Xa!7+jK~EFe$=jlxQbFik$t_Vo2s(L-tv7zaJ~Jp=Fd%qpoIJ*CCA#q z6n`MPH5~dc&DU=s*oO=aR{*p`ylt97XDeOtcxQ=)J-8dZh#G%q=mbB#S z))2y5Rb%ekN-tU#CfDlh_c%9Zk?!h0`q^`4u+>$yKRd~%)J3AY)b`2((U6~yN_chv zAV$9c5ThVK5&Og|f~;!Nq&Dvr|K#kG(+QgMG|ZuQ70Bjjjh<CQ3FDp1c5a`uYekM9uEeT5 zW^QN@35KK`ls6Obu__U4|yWa21)@-vpOZ@lY@`~CE8CciE7Sjy;$ z?ptp6i|%u)k88aD{JP%eH9j}CHMT##Ieza_mO7pKu$G*GEGgkvY6@ScoVM^3@F8Pr zU1K2igQo-VU>}~(F39o2H*^NvvYiM0?bQF$z0HrRFZM_PQ7)V^Gw|q;I#&4O zh_3H@tmeesGnE))!8{w`Oh4YW4&{yAP}vN!A$(fc4pK%V-B^D)nOUz5w&XYch(!G1-KL&o1v|h26mHco0#`=df-&t0)VhKj% z^1tO9%O941UQ|?PL~94q<|Pg&ecVS)+|~BLtKo|Maj_BU!4Qx0EYTA8e}xbU(YXo! z_|%2>i`Z_RLwXz+5Kn`9>Ct3}D2Gl&=B3ub1rO6x3nHS@3epl%Q;Q=b(u>mSXbbH5 zI(;<-jzzj#wPr?*bK4Jf^;hBdH(UBw&zF^B*oZN%5%LvPm72Ln%xt-?_UEc8uUl zx93QM2giT4!c$SF zNgYMZ4y85+oSDmH)AEE|TK*AB^H7(DBvR5bcq~GlBzAHvIrtz+>J4K+@r{-Zfs#{k z8BA!DHgc!Du4e_8@|03Ta=#%zl6qRx-A1lSJ5VXf$fYuKQU;#6@4Df-Zvc%;wty0| zP*ffb|E1t)qN{DbF7r8hE1gQr{i9aHYe37WjCtl_UZt3z`Mm{TsCVTbbZdNf9y&a< zcnOSwNDe|HoPvUzREI!liDzBs@Muw@{0|K#Si@doWJ;TP97E1X-lV-Pda@tI>i}wm zJO55NN#OO=5rb?oNxOV$K%=+J+2~DrA7!IM%5Rvn(Oa}g6QgRA>+ih7Sst0dP2JuA z?XuBFJTYjT>Ji~hzTZ%JK|R$(Fo5o6>G zC86VM9dY=)0|V-b33MVaH6f}P(c(HS*IX8s_^-G(cHZ(X~$@ zpKnkJ%4~0m$kN>`@}<}fPTmu^N4rm19orn}AKzRphfin^2#h9FX)!+w5_xz)G$=^q z)G<27BE9;O4WV8WmR)WBf2E}$K{k`96(ICvc23hHM zoNCxdNY~RG4GNYl^y9ndnoAFgt97&U^4!Fq(PX}_+9|pz5Do6q?ScVniq0?H4HCy! zC8?DSEhG+ppAa~kx0#L0@LYRw!ax1B*VQA=os?~U4xN}HPl4#`BsmGPN|!I5`rq<= z#tF=H4r_Nay5-aNClnSl&12>pSQgro9$z@%hm<^X)t`7;v;{y&Cej3pM?u{Tc19;d zzv^H7z1>XsGtvMWX0y}NvZZ=ux-3P>Wpu~I<$80f6A~vy8%aAso}i1QQ@BSJ-Hy-# z7DbjW-0T9;S7dD1c3tSBuVE%Srm6QL79YxZ&E^tw@7TYHIIjU7tCJ@i4Pm+Z`t&ai z5m{#QNUd-s$y>|NjD$3#eCa}Tf#@xz)+8H+l_oPmp-Leq!A+xKQJfai#kR|UJnSB1 zKiOh1*Z%y#z;-;?$9}X!=cJ|3($(Q$6-Tn(jyUxT_w=F`XJ)ky4w~_>;?3sW0%d@O zFCCSmKX^Gojs>>=Vvx&{+^u}eQbVjxL;YIEl3ALUeF+e)jb;`!lw#=LSi* zhNNrkk=~p8J}DbwyxUx8qx)}RM>Ip9te$ke*A$Zs-Uo@ICwE8M8+MyF8*POcHouf1 ztWt?^ffh+FDyAl?(TOdj1g+Yj^!H{^$~bHS*$UEHROOXlj|~J3o=IzZ?Cq?yuVSm8C2}1rhK&vWToT zR5pX%h;Hy%v|Eq%!?S)UNPPRfXJQ^L&*szpl~2h;6%puwBO1ACPCFe`<5~`PUpw=# zJC2pCXNcAUNV|^|pACM}>E*?vmp?CqV+KD*CG|1U5&TE9FCT()FTc(5KfLvku(AK< zRaHn4l7puw$7o~7c;X*0H%^~dPw*&os2VB@NG|>j9dxbxFY_Ta0{t62y6)fJDydooIs^ zAE;Vtv3??68@ofmpqbW4T*#3qRU!hQCg~yYP60^Z`n+f$12GlS$D>?j@7$qqpn{(0 z#j=0WJnwolbv)2#$`BM_P{kB7@P`dKu}VHn9O!;?eNkdxU!eS}=`1VAWlDLUVYC;? zlTGT>rjoU`NQ-QRO^h$FbI|Src7x@=*8`HLDJK|egH22&-q!ic$H+3@us}wW*BX#( zybRN`@0td$YGF9`>T=d@%}6gAY}j9}hb{`~kg%M4I`<3+P{aQrh6JBhdRrjflh|k_R zPeLO9>K$MBpvfe?G%)BUf3nnKbuF?CFJyK0(De^On!aldIT%*fT5T3tdv%VL6ZmWu zt$7+~@!Z}S8#0RURto0Ka25nLW7?P~6q#t(i)oss>svo!ggI+hM}{r#xwiw@xv687 zOah*&`96=7rgoAfXplRe>DiPak1W+OF<;!evS?9PA;&J;8;_3z;-IWNRI!Q_vG~MX ze|z7Vm%{llw8Q-fK5T4@u_^`j|WPF;OX$J|fO-JLsci8KPoRyoj|vQ64%V%ZkosX0=T9 zkoH67A3dEJ3{dU9jzo%kvZV2WD)2pqfq4v0hRplA8?(!qMd@XBwoUeqh1Y-qE@FIC z)Q67F1TMnG*vL@kZiVqWL6T!s6s=>!g)q|+bp~K-vZ+ko7G>_M= zfgKz28Clr^TKzBDTHBZ-@ddyZw9tuEvK*JyXUjy$GAmTl_ZihF6+IjLFQ z=;u7h3ltv_i6TwiPo10K#WZ5CvYa@IYI&Cr zM0ii+8d+FG`dR3wJPv0+cucO&2wf{oTk;d5Tr$x)LpmTBv&-VQ1$5-(NDLW`g<-!A}ZC-vcSo zWE3NrekM<5?_}ZAe}{Z_%@6oqHh()QdpS6zY0B_bK9A!9D*%31{oZ9Bc924p8ID%; zbmN?<6Ct|MFeoBAr;wPru)1f<+C6WN_B6iND(tTL_Qbd*R1a2fD;MWBvy`~ z9c-58GlWh?)6i+?F`3&1e}B`Y>W6A3$Npd%b!yLW!uMXMnd$1f+KSI8%V=dgsjsm$ zsC??^5a&hlwZ8E!B0MEQw1&L5wa{hgRrBs{H@S1L)(F(X#fA5+};Rkf#wz$*GZ>{&G^fzdz-5la6icAV)i&e=W9Z$}8D;b};T~?$CT)I7x_QdsY^|AOa|H6qR1qXJR z8@eX5wJO+PvMped=W2_<+wA}ZuBlULd_o@Daj&;jDSn~{N~iXeyJY$w{hsK?9_^%7 zj_Z7X&Qs5+3jDR&g2#Z)+dbKjyiZl&MXK^NbWi_hUYfd6T<}+TO(fd%W2K+P-WycZ z6Iwa0XS(B5>d5b#v!lfiRMy3ni&Pan0xsSh%+>Rp{_1fg?-`))KYVM7zZg3sw96N7 z`l-Ula`dLaq1FfR8%=WY-hhD24NUs~TJ^XHql6R|E|*y@CTVTUj$Qv&v$$TB@;*zC!IGpn4;9g>NR9r!1wN?coHhr#&SoMJX zARiGeZv5lF7_l4c`3<8M=|cp zQ0eRD3)G#KQaBq40JG8!qP`Rg_%me#;fLYdhrXcH0S^4{1b@aBBFeW;*(fN zkf-U3VHJ^ODDJQhQ2SCYvSX~qn> zVdu~Pdqe%2zt;R^eR=5!PQCl;sK1t9NU4`@TZ?ycGW$2tsQi40^-pq2dRVhlcNzSa zT6tIHOz_wB==VC?2##A3kUpbN_4v6Jny|tzb+J!{i6Ndv5i8TPd+veHJSn zL0)A)N&z4MF*!kR#ZgVS?yypC?un*Hw7PYG#jn)Fon;+!R>%#zEq?X}`B#6hGB&?L za**7~Lmry>ebKZil9PCQ7Jkv>H_2K~n+wf8OI`bSCC%->`QVV5J=%Y+a}2)uDd<=2 z{*3o?<{R$O*!D9jn*MTK;LknK048x2Cn?Bc4!ykcX7 zz6nQ9uHW20%=fIa-JGbptSajg$^TaWXR2E)@Oy=>DM>SlSHrVPB`3DVB-W+7cI@~8 z4SKPA-$;FJ`d9zCemZT$Hp0m{yBxn2m|6fRASE6Tvz!yVr@i&HRtU%s6d5kF`IEcj zhiKoTZ_mCCCFOmPmLorAf24 zI`;S30Jh|?YaB><0y4_5{M^dn=VxUIX%xV_IPg#ZL>Q>N+F52h%^8B=?Nt-PlK`0P zzLR^F3j)g88|)qCb?xmobmAt8Vp87G4Z9@`6hOT8PwsnKDJmEBd5V4toJ%*9+og@6 zk0Hmr4{g^snxIEZSs#Y(A&`P%q+mJsbr?(kFN}%NpKPkf*1NFYNkt)KnUK{pdbXz_ zg+f`$vL7IdYpflsu^ek^1X_sNbeRA$8)`lXPik)f@^&Ro$bLNT|Hs|U zU55M=dZV8Z46a7z4(p44Q{>aB(Ykc-aqXr}!c|l+!H{7HE7a7~6v!51T-3qR-bHHl zCmuVaH$WASsnKE=2LpZ-87TC>bZ{2LIEuXG$f#FrThw4+5HKlOlF!7{?JzAZMJ+(+ zwjhx|eL6aJI^AVle}eC#d(62f*l_)7S)oY)VcN~UpJb2s?(zITgLVTwGAj}FbxqMF z0ZKswvU*iw_PRAjdtMQV12o^u=CJ(kjvWTr*B4Wlik^HqIAt4lcGcVY(_(e>uZ11o zg+UhrMh0}$NTBu8q*H#1h6A3J$3;Q1tX$haguM8a3yA$ONFCzwsbd^Uhj#&f?eNmE z>M)v^L8T?Yhkb_zH`-cdT@b4jHlC-`Uv4#cf9Qa_>LvmT@eJsQ>(&i;84E3!3b8w z)Gw1obX4;p>F=E%qUH>?rTM&hZuZ_UJcpzN^6oeF9i^Y87h(&)?6`nQKGKyfQ4NuY zvangrouu(oD&6dRh}%-^#rAfbb&O%hz&nW^hp)F)zlvQ=CMT1yB!T;h+ZV+I!^hwk z@NTS&O(&G=$;3lgFYmSgn=k-m8Utebv6-wd+JBNSHZM+DRoll*Vkct*Vq#cOZ4evd zg|(Fyy9d#en-g{`me4{=Zp4a=v&MMAc$F5`>F>rHAxO$;T>!!l{mzv8Oc$~xG_?yAO1E3@F zzY_q~a25q6}e#(x;Sh=I8EQcQbyVn>Z{iB*^VcxFgiEx zS(7jwt$(;1zdkjo%Vp`Mj0?flCaX7Vl7m>xn$&ULOp+PB2J`-rYH{s5xc?;a@#5z( z?^b9z3ZI-3G+xYlcrrEU);Oq#;|VBU>VL!rgw7EFucm`ppdV6_bt3kqegjNn7V1r@ zK|T3f8kg|+D2g;MrV?B~ss)`~!pnp|(;ZC!X5S9t4}=))pR_%1y)RlUSfM!xZrjK0 zC59wi0a&%By?G+>f;2f#OCC&uP#r^$h=om9q$^;4tJM zBisPCidTG;^?F?rt}60x zEI!YFRfNaNZE!nPB{ov&t2M80u9e)RP944%bUGF9uFxBB(a@F424(zP0qpJ>rC>9Dov`R5#^w7!Rxg@0|$91DO6|4|Db>%+f8`dehw!Vw7+SxE-q zvFuE#b|(zGIBXM~D};4@{_?>pP3<+q6f)TB9OFin*UMoqXAn`&IGAHsit_5n!D5FO zQc~_lgJ+|(c5p+;G4lT?4t>=Br2}t8W380(nMc^Lb7tX6P(GuuZF9E7fHjtgJ`6r( zpBn@H8HG!p$xcd8qbC$zhYV3gQ5&vCBQlHf3T7FNMEGw}t~hz}xJ9FmkZg0dM2Z@* z(T|zH2CfPi1*r`m7U0>8RJcjt$c?B4oVT=}e{d3(MOPFYEpb=f<_H&5K=dS=lS#i~ zRbXc*pUt@+I}H}T8E&uu)NG>al$=ZBN#`)}V8V?+8=uh=Ol%4+D_ZoRB5Ib2hI}R- z-Ed^up@L;5HVh=9VTLVw0hbiL3rVn*zThZ^KP}iE>K1I>6kp&`NUsWnOF81=kVOxL z8s|g=Ikno+RUt3`(tHqPW_u4Pwr2{nb0 zkLXzGg!kcONP*p&bm?i)bm?APcQ0Z&Bl>Q5r|xKRwBB|6VuF4~T3RI8gGv70wa&=@ zyQbc1zVVwPM*iB0*D*bkUk4A%UE8cT{bv=sLt>KjzeXBMp2bE>K0|gBzEGsL;Zy$e zC|A3<)NWanU7llu63uyK5n)ct=rW#7fvuknrox@I`30p#EWW@qOy$jvl9JaCo`{GJ#@ct^nA;L7cF;Bv2&ylg&IJv3eUkd_OF<1UIf;fWB9k;A|$m(8is#OI0O9 zrfj+L=|P3Mp(T5TcILRX3!{&(o&)MU<}CnyxEe-N zUBS+BZSHC!lbOm1G>>{l#sJmRi>JZtUm?+9Xyi-yzI83($SSQlFCR?w$7{sWQerk` zU16*@SAwvRphF$G$Uy#ZM`I*YiCxhkTk2U>LVBwV`u)T%$M?Cg`Ss+C(t{z{v3^P0 zS<%TGl^OdXONP(}4<6}NoZ?d)aV}h?d9g}UVn$-zdIQt5!12KR_aXdEz%*#Fd(P6a zD6$xi#kp(5r8s{(n)>R7ewSq&?CqVbpJWIWvylZB9B^^2AU1Uf3mAv%zL#VE0^g?~ z_M^W#R9;w;OUR-SFV)H{U`Bz-gt!6$kCEAeqxlAYxeKy3&AYC&x+2kZ#+wPOc zQnL*%WSQG6s)!%Zg{^Dkr}P?cvwbg9{Q|>WhZAK95}=6*nMETpj439 z7o?zEGWu$GAIy0d?g?S^0xyX{gJLXBl(5jeXr~LUn?>W`P6}8uyvfk9NBx|>6!6kGCYFFdo zS4Y)nzJL0k}u4`a}%JdCB)5O?rSceOo$7EwYEzKxNcJTtQC!AZ3gdH69 z1>oT_LUCB{YMi}`R;Rfs42*J#o+mw16voOWdWG~1ClJa-zU(l!^&wrm=oRSIlhcDC z-a2_lTZ6*t%21_GSJYgRK(SmI;OyajVHkhy1l zdVZ9Zbx;!YvScPKGb`vtc`VN?Ou*6mHh*4*_$x84mXyHo0+R zmrF_yyoG@n7o=w_gQQ%#+6pVI&JSD)Gc`vF--*jdR7jGU*KzC*L@*JER>m`E0N`OfMJ(28E%~6xOu>(lSDOPbY%LrynzE#b*_y6`(9SuX;p> zr?S@SrVtS+Fvj2eE*kiMC19>~eXJ~pnW4ixhkQ(CE{$blJyZ0~+lG_H2lo1M(irzb zj=wtb_iV!1cODdu5;Q#``0SGp-m!b@jTaurhfjP{F~013XKe9@gof6}5xzvto4X6A zkFS+CGm%L`PSg$G2@}6f-)o@ccsG%_e_go!IsW6`;BcWT;wRDL?Nl0Wd#i(C`!G*F z=<+Y{cSZsKNPo0XA7dvElj&L&6|^&z=YPZ5{&W^oBADESjUp4d7ju=Saz?@)<5LV* zJ5YopA51xHa_bZ}3x|zG5HXYkv=k=i6Y&kDy}SNnK~5!%$4@xlQ~Wic;JGgM{Z|-d zLcIP)YWkurSn6LT`Z0(MV#XfKJB<5P_ZPTg$67hpuU%Y9r}e(jorib`=Wm|@Flime z+VW;NM}rf044}AJs|7<=-;oATle>*qai_0}{eK*Nn!wVcR=3`>)%-m37H&F3%kse= z4=)~V?D5cY&r+Oi2T^qZa$K)(7Kvcd^2vAbN3i6`{xZ+0A7EJF?V) z8kts>Qu&VsuYK$H&8YEu+YXaKsAxX9hE*f?69{{sA>@-w2{EMAZf}7-%$CK;w zSXC_}`MsaNz@yU4&l|x;fVr>%n6(b8e|+jrsA4I|$148XI#?1~b-3NteA((AeG`4O z=}Q7n2X_-o6sol1F^AW;H_#RjTMU^16}eP*_}r&G!?dD&!lBhDVFRjIha2wf!%Mx*?390QOsRVPw#cQaj^3aol3)|QO= z4%$?RG#su&@%Es*&pSYru9B%7-KZ=Qw!#C@q~x4Vn;O8--oc0ZmX7b)SUMnWYUCYVvq2@#(Qg?euBZc`Bs*h^c^MAZBeD zdCXjlz+E2{cj9`~02;v{r38@AP|(w>-y4WgqSM?v(AsS@24&=HtLmYSrza^5h|x*Z zov8rOoc^h)$32Npb*fwcn!@e_yI&?iWON!zcRi~O5QA8;WRFRY*Y^g9kx5G0`Fc$e zn3=R7zn5!p_PNASlSx|br?umT!ueYpn!83Zy<@jM2CWMp9c#>*zM-wm@3q>UeSYF- zX-S%@X3tn_hRM~xoH~5wwWJX%lu$`pE@antu(z-H+D@*x3M86_r`?=_%L@*E(&I5> z`t$TXWUozasz+a(*;Ln~H9cpiVZWj@*!Z{G0cWEq>q)f$+I& ztOg)`ztp>3A6UNXkwz$xk@Ikb_49k#D$Z3uan!U`%~T0XrtHT|HckbJ*p4VUK2jns z?Z{l`tSnkjL~%Fewzg`7`WgX2^ikHkPoH~wdG_unJ^OBB++OCsA`f&s@toT{sBP(; zq=!0R&ht9J1dA7ScR}yE23B{{D6yAg`w~Y@ON#LmyIsWeG-TL9AP}G>9s(3V-GPn- zhtNBms-frx$T`RCtUf0$Y=D?TqL*TXaTdAPs#$BUS6~(cb^S{Vf9M87R|QQ*g)Niaes(ON(xG7=TJVp{-yp*&oxkg)<1#3n>|P%8p!&)Kr7&`vB0xiK(J{>-=8VniNO6$9`e;E;w&~fU zMrg*026gU4N^iFxyS&h9srTA6a?hjL_>Zbz^L_U$O`=;Tm$j{vM~TO7ysyVbk=K5V zz-ibgbaT2BsX2m*P@SjLeZA#5a^UZw`2DnT0(qPGPsHN+y=DdHswR$vHWsxkY_~C! z;`i=tn*xaU-AMq@S{zBd1E`xbs9<-iZH^|>QNqWl5*`Vn zmZTW4TLe#mI2&8{9ztT1b`_6oroH!BCyvQgR`+A8m>Qt4K52Tl>l4GR>Gp^_bsxj` zsI-SE5B)@CXlKvZdxcvQ_Sxvja~GWz;=ph=In7yACHT6 zMu(uU9fNP=9rsKWvq0=Yuvz3ak`%*si{L2`r=fN4Av|P5 zFnn(7!GB>MY@pg*jTO_=dt09veH-c%lB`Q|_R*tmmmYKVy=>^`K0v|9)Kps?vS-Ga zUN5o1#7>Nv>-|=r5Pw5j8!W0yV$K`0o|1MxDxOgf(;m1ijTr#bonlIKeFKnhwt2Lz z6}fu8I_cG?c)f-r$Ou^R;GZcD*blpJdPYO1%aaieZdqQNqf#R2srA&-q zF<4?hDWqAMnNS)Ci(Hw5J`e%N1guOsKKo^ng8&3%9li)faPY~=M4AP03&c2Ul2 zL}y6qSZZ7x#kOwp5$=IlN6_#+NM6ks+?}8OESp?bREk$P@y26y;HMmyT7zpC2$Kg6EHayx=|T0g6W%xE&E171_p|K2`I}z zy$^uq>tAc)$HL3|o4tAi2-Tv(ZE?dTT1=bozoP}g@(%A#8DQ;bPDc%!b-AYj*>~@z z?_+?-=eUp0&wtK}e;VN>DfPNAc)$ZKL4Qb-s%tXscxz6fO6rWEC zVxE2W44y$4JZn&+aKL`C$0ll$WvlP->{b^;=7R~hqKMfhZ$i_KPEyy=Iw&+ouHg{Hl}MH;$-pB#3hVMOG0&? z6(IWfRz>>TgRHV2A()cshB?Bh7d4WI{0jDDS?c+p4T>{RzEifQAM2rP;D@{B;K6SSG}_kErY7n--C#=RFStx zf`|3-_8>w+K-T#{bu;XwvN8*~B~nMZtT-+FlHx>!_9>Gx?M<9k!=*0dh!zn#bR>>V zjF9!G3z9CwFthBtJiFY<+nCYCadMMtE>ECJ-3U6c14yBk*da6b6H?{S;5fZaAVSmt zCdUnMgF%9L9%dkWg6%V%b?X zwRNn)9CETb)NlQQn!;3TK;@8I1#wiy09`g2V**GRQOC3)Kb??3Ll9R+5hEtpozo5n z|BnpU!I}uHAsP4%sR)gf;8$%6cUcKbALd)Xe*@q8vKy$i|Fi`D5(67y5s)Dh<_P13vR>LVn#jcP>)StqH30s$>cHO}!d+4a#P>2F2!R%% zRO-c3E=xj~0DbazLm0aos7T2yKf@#6cB=e={$~MMXrTaHxVOk6U`1q{igqpv1sEFs z0L9XuMyM9GOHjHu+V=vD)^B1l9Lj|sjP%4QK&sJIA#n>57q4yM=_4tyTae14x;ta^ z(1A0`c%{LgLDbS4e!(>0{-#rs-;Nn$9K{VB z@}JCXpK^bT0(^xuqV-Pt{3OT`CgUgpDKx>2Me`efFoqE%#f2-|;Jurnt~%rtb-hk4 z6osfJ(gnXsh~PO1h25b@3$B2_EItp?02y(_q$>`y^#v8XtYFavwvotXhoqAHoa_k6;&JYF_Zp3fs~k-UNPZZ zAVjc?hix-R;k8o9_(_rZe}_i5hU?X3^?o%#Q#%Rfs?8L!u!4y8gd%hu9V2X+pL%ameR5!UjEuXKx&F=F>j=d>z>F-UpDBadgw` zP!sHYpr1Q9L83Z2-Duugx+MM9LPUs2@qnFJ;^8>CO@@$Ez~CSCNY7F)Fb7P);P+6G z_`+yPEo;EE?PmF?n#HJdbYg~j4#lECXar=U7^Mb`rzO2QATtx$YlYE`T0|2*C&D6N zre}&IL8Z_rNSnlN*VL(%#$P8! z$>xZMq)MO~waFlj!9uv0B2lBJ9+I2e^#zHU9zD0lGk~zggg2I|fRlYOwvJc#FV1}Za$I037=<&=k|^1KD)qTpOXE% zy2q@38G5529H-7Sg}Ra^O)`J|dW_kh33KZOzF2wzH*a~^C*seE>Aw_H>(#EuK)v@< z_0{D`a6u=|@hK7%h_=*nr{MP7Y>5t?JJ{hXoDm7GHDEa?yUdWYyG@9}y@m8x(`DO0 ze|ibx&X$C<{y%{K5=LC771q|pdT;$=O|9J8T8H4k-v=3+FtVVnImd;WgO#jmeRfjif(rWZ=(8BdJFK+2{Ou-Q4L9Wv z%&@l#;ViT#rS3_CMSYu81l~?c#oEW!#aNM>M$ohrt;|RR+g&uweHnoMyzVt(#7HB5 z^OtL?@j9*wZA|VGc=}CPfo`fLUL8+E%;5uiSFo>IQp zu%(TmF?btCP9<;^DlCSDMl?99N|KLviGHL;QP(fH8 z5T)d^F0$|Q89`?i@erqM?{DL;c0s2I5hPhWA-8B{;C$QN5SVhQap%X6qg#HfeMz$+ zLza&dW8+!hu783jE71u6yVPCp?};x3_Iv3iwX+$#CV56Lc{h(Q_5AynuRj)i^-{tF z0ywuxUu_9+uDdhPr#~x%&l$w2Z`^%5oX@KKTThH@ew zP$j9~T>LmvIDP?cqzuq#FRg|gbN`8d=a?XiiQcm%EZX`ZeMq<8^gC%c|& z8TLpaAT%N4y4zwgUr<~Qz|qotYupB@?6#jj7i^@i=&kb1jt@^eOqe`@R%2#4YjZbD zUb>@pHiJ81-|enTGOeAtl_s#ygX@Qc6itW~MySA$^2Hd~7Y~)#$j)lov#2YKu?TjY z%Azz}S@3j}Qe~Nn6?D3KX(4i_Do|`}Sl*8^7E@|rqVY*_1w+}TOD{u9F7bm5vXU{rJ-M?mf3rwCV$+oqdeuuB zv8eWvdjrQ`?6YbnCeP0yA=dD20@4mV>1Ow4&}Woc5&Q|E3YDV7SRugz*rAI=s~JSD z(?a@4fnWF!f0xBOhlnFYmj~sxO074$NR1w1K-LHrMXWXlg6++$ez`LSAW}SDT95>+ z5y!kQ*^OXsejKS>9smvPv?VQtELp`eFHjI>I7ab#BMGFF|0tKXpyR34dO2IiQ_+gi zN>+8=?k4R-KGSMI`+Xd*5jnchyd$m-45#{l&N2};$>l@gLIfPqeQv{`okp`vNa*kT zfBj!FV^;CC3v=%n%Bg^k&Z*6VgM9?O$Y~~CyZQmDPZ$XY^)iz5ISD`<^^qb*b-$BD zORGB%xh(o1yM8UUBXO|9MGKmQD2qBihsSh-c9+MmuNqKhl`mD*3CiA)MLqhSgPKT; z%>D&Hasd~)qCyHakPca7wKJsSCAo`j;6?!ddF>l)AK-iSo8AH_6%D9{gE|G7noC9; zNt{Gsu(1l!6=9FSGP9qBk?^v+>DkdY8F3a4R{;qUdFf4z&o^F#ulL#-6f~B?*gY17 zARZKxX~N}~xrOXydVmEQ4`)7lK2rfaT0o6pU9HukpAS!}Y&u3Yk(DZ(a-ed)BrY{} z*hx&4CAeSOL)CllNrMAGX9@B*z&gJ%-ofa1>>(T-0x)DOb)uWui>#Vp47-Dvo{N*W z0Zs^qz3<4chRsRL;8fW!EO&yQI#`tH=@f8Abt*CU3yto<&fI zC4W2X`y2^gF|FLbFVx!FQR`T_7UCf~>?U^+1el(DofxcsogAE0127XZ27dQ$H1x^e zserL`4NPV7@U}yk(1XiHL#QVtcjMt{ZX;B$RhfLE);kCW#iBqT`?mH#6l(-!b<2G~ zK#ttsIv{w1eljY!lxB=VR$)vnPou0SiWCK^O8nlG44=ChVsJRWe-K;(MOG1_6g13c`%+6 zg#iX|kd1RD6ei3m8^{r60Iy7QB}xb>z*GpGxYQrF2vq`W z2LdBwUpYQ=xa+$~LW!3?XdB!|Jm8X--8u9{ly5`&Qk%IbxNavSoE}oC*!qeyAn|7=-C9l-pPuH~U!@HPiwkn)I+1~>uHL9FCAsgW#!x3HK zLg}&g5d*Zuhcx)0ka!woJO%s7?{$LQhG%8XEUpGd)vp!k!~KV52Gi{ql-;FJ1UUhy1xc^hZZ5A$dAF2{#xwUr^WvLiijTxM3|?Vv4blLd z>lp9{p*e;@ND>$)B)65OSrF2NG;CZkN8GUVw|5!L)k-g#&-~;v{i9_9&iQ{M-+~0R z;I;lFo1oQ&*$MyLnVHauRXW6cpqS7!)o2?NQ~yo)tB zFXk{QG#}kbQAs`b78Gb$4a>^bj3|%9R293@d$KrRRx&)+=i?N;7~++}*N=H=EfX9= z@La>NPYG&kb_3^)c#WJp2)fXvF)ON=+Z}h$*=$z9`6Y&%!JoXpHHV!yXM0cn_WZv) z@LOL4TZaSr`QU1=%=&ccoQKhH_?7^PIO#bHXIl~Y67>#34FFatpyXwdB(h8}I?gZu z&qBq?2$8(6Xxn*`_(~NP2RQ4Sauy8`!E?7E){$wh29Cwym;M11HFlI*RKNk2L081= zODQ~mkcZj{m9DNYGMUUFvsn04Bsv*BE;N9?^GdvChKfOVSx3Gbg4zzt(asPaJ@Zf- zEVRSo(YAog%LjuuG2oHoH$6!S_JowbNo@?a*8zMKYBevb$ixw3mqn`P0J{09i{4aAEDGu zc)cOTh(6n9yveTY`fklbQl86qW!@g)aJ2F&biu^tK{@NGiO8S)SKdaeKg=iNcPAz) zdhHuYuSKp!U5(O`voOVoUKSK=FNLN*@;)t*cjM)+&TggeYu~Gvz6vZ+x>o;9L4PNY zDkR^zPIKbDl0GxL7M{Kdeo_yis>3yyod}ml&33Kp2<)*hOipLGW%kuwuBwx5z+$`B z!xAKi-WDjIsl}{dRa9xE~?)=n|kC?1Bu~GxxrP5}#9@WqsF^{gn*u4G zErhrp^FL^6Of6RG>4fyBquzJ61FA%i@%qv!rmpG;D0ETcJ?|?C?tVmm+*Bk$YdS$Y zazGW^>X1Wov^Yv2K_WVL7)P_$FvFmN=0j<|DxZ4fvyuyHdU(Z-3r}GR*ML{h6%`6V zg@kXjx^Oo;MU{W(R`hbVF~J^(g)l3dysJ8#*_Cm>xJRZkK~ko4Iv^}tN#|o{VMOFf z8LzWu20sM3hqc}$VA_>y{*Xd4GMhz+=;Bttc|GIe79sLnv`SuQB(pbAG%Ovp%Mvoh zyJTDOMRnsd`LGi^LzLEYPUu`Cbf>~|*`u<^rwThN>w;Q7q;19mi`f(INLov-30Etv za6km`KVinKl`c7jPX`)+6~H`Vmd6><5)hOhteDB0>rEeW=qt{ZUY>clJdAN%-VCJn zF4z2K*02ftf33Er26@_6iL9Qn`Dj#=aaaz;4bAK*mdV~s*#E1_PFoDNJ{WLgf*p=9 zgMbhqtIW;tRm()6mhtIX3A+r)*!=+{=57zwsAh_>Qr*TBJ}r1AyFzmXnZchv1&rqt zH&mijo>%UTgfv^Y0Aw4d9A#MXkT* z#~wJpJMMS$o`<7TEia2$v%5;9O$u{ zI9XP{uZ*giK2#OZcJw59Pv-jehJ-0_gnxAHCx3hEJznTt6xc0AOIC zxL+zNKdmm@cDcRmEqo5&w!U3(t#myH;xl#4c!Px7+9$kk?;_ufkxOF3Dp4}!!2u38 zk377QWT^lgVN9{xAFNUx5R>fophU|2{nLzr4i{TqW4`Yc(q9 zQu;l4m?Ig5!TXu)dAIJy7!Z=m+uGSm47n7Qx)jH>Zwgu_(4(g`j;7YCdz~&#I&L9h zkcv${pIJb15saDLXJLOHQ>`r84!ip3c70w@i!d7Osl5p{qE%2}6ol}vol>M!2Ne>~E zv>FZr^@pT)l+EI(<99}U^8@@K{hmY~KEijhGg!i(5757D3doYO5-D5*VxB8|GcE5d zr(nnv$E9J76!#gw5NuF42J{^QL>jM-Ppx$Gd&MU1^Bf}Y2XpiAp>kG+iB#OGNp)P* zewt9%9tkjx%1Bz+8{gn)GlwZXNmx59T#rU$IfR^;l{=E$p$Be$ffBppbP+hWqh(#d zbg^CH)vJaBbg65G!v>T^5=xTCKC~d~-(KYk7v|&8(Z}9{W)1@9RUQsa{MkVBNH#-= zAq;lO{8C#bJzrr^Lzk;W^KQ&rp$4N_TJq@q+8+&Zk9;#CKV`c0oNh=@Vl+ky#WMp+P)oRdh`iX&c_ z*XJxh+X{BeZg~nUS6`QOWiY};Xcw`b1(L>uN+x3bJcvc%Gv_lhHjce(Rdd1=t^qCm zD6cWgnmIJL>%8FB6vzgr9-^-y@~wML2F)@`j$xx z3YMaE6@_+q$&kjMTc7CslJ%zd$n6KL@5#F=79A%6_L)BhBCW3g`7%o(kI2b zZWBP*LYefn?K+TSLUYK;bHLDoNln^&$^9ovq`MqMKo@-hZ%Mz)?jMj1yP_Mk`Itr! z3?n>F1g8zqRb9GnWNIe9fj%@tKxlyCS~chwE%69(Uxe17(M>pYI~%DH9`FckN(edD zaUF61YeXHAioJa52U(O~7zk(Gs#a%?_fx>znJ>>KyZe6HD6s!%{$L-#8!JN$cDTME zgbC-ZQhTc={VB_}V?YnlSOP;6Z-VFJ+a-=ufu15=(N%HDp67c4X+!~RAoJ2g&>}Eh z949f2OO6Qp3ObWYqNd;SJz@d~Elnm22<+w}nsyO^-nSr2g_$U+h3a8{5l0*_MeaN&|kFuqtN2dcoK%(!o~=Q^iKdo47Eu9sKge| zrMG^yVDqx*=3J}Y!*-1H9g>uOg!y(1+(YhosC*}xopWku#2baR>gWV-hbN8xOPxRF zl2b%9rLwd; z_>8zLO)!jZhpa$g8m)}74kep&C*Me?;!8mqTs2U!Gl#(r1LHwCriEiEq1LspZt?9I*US2dbTd&``k$__Q6xyiH_7azEA%3Swop16tJAI^0 zRcenG7jG8^I`6^`Bd{=lb=$V~94f>vpjCq=J?!_-Y@DR9ilTTFO~E1-RuqeaaqoY> z`@8A?*_F+>(`2%;B70;_R)&s^4X1y~iJE0rH#O^6TV0$!o(%IO41tcQNq`R))0d2J zG#a=UI`O#E`#?E7dOQzn!y5N4KdN$iOD0^yHc~p3IA4Mtf0N(nre~^i%fya2NoK>? zKIC(qHL)H(6Y2lGX!<>XDozeSDTY-$os6 z)-(Hf~HLw+H*e5EV5_vv1$*Zribdxdp^?kHvLaTHbNG&38NDOL|mE-xdX0b zqY3d(%}{fHlp|bZqC8Q#+`~L%Y1N3?V3R~=igXp8l6l(|s@WM;WvZAfZC8BvE-xFo zK~$bYt^EGij^e?aHI*#&10r|*;((=Ja3kho-AQgf`|2Qq!1Ikx>*%GD47`*@)J&~X z1Wg+R90o0I;JAGG6ydCnp)h;3`Ba~EZKw;x{29Q~%mzwu>`TiC#gBK~Db79y2 zhSzh~NN~ddJ$WPW+&Kdt77uudF4dhjme^e#p`BX0Wo*V@8sQYK;mP3wKoOi5XFOF; zG2ueZB}j$0YUzrwIUGkT*D+V}vc^@GF0ZjaR*lj#a*#D5mWrSUU!4aw^_6Jb3oROH z$dVD-(R9Uxs*IaMur-ruFsh#hIK<5FM%h9M13yM?!0Z_R_EHist!g zvF$n$+TmZIVj9SB^Br#9DwCz{$2#E0=*!aCJ*F^NrbzerDt!s}4a`B_-FJojbPeMP z%_jj5Z$PK7A;F;k0s3#%$LcQO)QrcU;EZ*8Yx_`epRMKV9M(b^_=0oaZv;081a}Am zPY4CCZSSx+l7@U!JudA$ppP|dZe2CMK&WubaV!69_I zjP2Cs$8JCubaTF2l-D;Q>9 zYJlkv74$=!Av8jeegP~rHJ#cHY4TGFomHz(2rla2X$U{uX>778K!%EM`pXg)rtogc zL`f4<*(uBQz!O#j9izfl%0&kC8u8%=JetJQjgQV?AK~vH56JWH(DMcG{@T!)&2FfV zQUyzdDbI!(Hw(1|Tbv>{@u2M*)+gC@uw=@V?pg>H=)Ix!O_UtMmknKHnJEIFrr_;@ zTwG{c>G0lM^#?z-H3mO1Li5_2Fby{!96mE-5gVd*$yc=!B8W(l`h4UY;6b0q4l|zr z1nN?&!Iqs6)Dt?BcCG3JoISBao!$!Orw**;kv=31Fj0cJc9gbZS&J$yRYuOP%+Yu1 z!kqVAn)GaF>uGc<{--9Si-Kr1fM8J)d2}-=b*l9ZZq8o5uv~!zRUtHzAbw48SZ~3E z;y%{W3A{7`2<*idGW$d^q!XD+EHh-6BWJoq6NKw}uT^NMF#af?@MSSc-l^vf500jw z+E{5kiB#kgES5Ffwiv4k)!DM821E?3SaF9u_TH| zh;J`g0@rxOCF8TeDx{Ao%5&O;(HX2gmEc15`QlOE)jn#OA5XUDrUA3H1(;2oP{uo` zQGX_wd9>_LqE|P{=p4Y#83!qi3 zlP_`xQFdi4HLG#Cx_UPkgrd(R&Fjg?P?qSOe%G<>lsHt2Hm=?46J&GI|AY7sQ7sC3 z`P_t}q0Zqc2y$kCHM3mJ>(e`CgFm;Lf~<7@K5B6IT=sze159N@|ILyjdM7V#kjhgI z%BG&XIu_lFy*eMptR(jdNRGmVEZ2jJpCV2>Bb`Tj6L_NBN#}gksRWs zvVvn2V!JV`&u$5F|Wl54psScJssf5BQyZs)C>FLsbG4Xef!}xYCmi zuSj1Ub?1Q!U_Gp_sZA1|PRBgn--9FZ!x3Evm(!j?pW~b3E*x1}5J|s6b;t@Ce*_`K(rc6x74eqP| z{fxo91}kgrMgQEF(ig{hsCwf9L2-G3Ol8Bb9%2fn!WD#T=y@@ws6|=X(K{U_@GAAd zdNc#}WibA*VcT&ERnRWOC7nLN(q8})BwkI-i`s}b-#5y8t*HeeRWT{aKpjv-mJ_Rs zI6F*pnYKx=b^_B%4$xc5$7~NvUN@q=m5XI8hh-ZHUxlJ#9FxXesq@Kx_+29)9m{-m=g)t>d>$$O# zo>B9!xGHPasYcF`A#Z%C*)1UT25<$5e0k6rGc0oStPRnRP!~GdbnIRuk%%Ay15Zfc z0gaS>$2P5A%4uqj`B?}mV#Il=13hgL3^pfAQHLJ5XX~@evSj0T!#C0uC2XvW!?S@f* zI7i{wj_5;ato8cN1X)4wh2lbpVpkfH2RNgNLoQ=*Qa|D{E90hXFiS~Y79fjDm+II< zP$h<^A8HC&b@mL~4BAE?&Um|k7Mq}Q*?HyCv1%2w@U3xokFKT%-&dcW4jBE2EFwKxgO9Y1Ur<7hH*cG2pNiRS%Hvcx|os@IxH&-fn&p zbR}m3cgG{nGlN7^AxI5o&!GFm3cY<#fT9z+-qdo8QTz^S$I%YN(EYhPvo!_pNk90% zW#E6#b95?>V_e3yH3ip|k(v-%0PyeK{sKgZ@2}w_{0sWE(Sie{_KhdCqzvhG#)x#( z$*^6kR$X{?W-qzz8u1T^C&ac|RO=hn8OQ6RYB%AqtagGM*oxhuE9Fp? z=n{4?LA-!Z3N36KBJ-yct=NlCPTR_A)>9{S^@Y_8VEtv?U#}n6e^)L3f?rr;g=ko; z`}40?Za9*!SI?;h%e0qh+in!(@-iT|X1Yn8xs)y|>J&V)i(!%h&Qc{aISi-w9Qn(3l#2(fQ0?4|?H!G^%#~__=#6QRNk` zl0G@;-Ej?{)$^KH4#nJ^){KUE2Koa*Az9L!L~Y9Wb}Sdvb((|U;g4D9SHS>*MK z7T>|O8u0fVy)B*p_%xRcz!u;&<~4&((<_O{z@Tp!NFGEI9;i@k3CnO78T{dXpphC0!(jr)1zO#%sWOy*MD~4O)oq}ZmlOg3h5QA=rhLJauGO*WbEJdb)&4lzm5I``e^`gAG}P+Al8bJ^17g@C zeIRE)m=%voTkes^wQ;Z+Gd%lCc%7FRx(5iCX~Mv=+1JNQx+(9%c)JBj%_ewsXKjmI z%NJwR7Wqo5S#vUH>1{Yk)H2I~$++Q}FtIM_b~{K!EdX?S?;2+Tmpo;+KhI>$H;P&miifonLKQ~l-fYpfw%WC*BPB`v)8@@5~9;v$N;iMD;V5*vp@t8n!!he@`XW7a#{n}kb;0aA%AGj z>sVhP?<2$yWX0&9M||f;G!NeX4!)X}t_8UQGLXW|Q4#s-ufTnudT`cR2iNGip#rO3 z?xfrRCP6jb`5euApqEF0UFI3jZX2#w(0uI73;vk?wu&}Xl|`E=%)FpvC%=HPPY%Y_ z!_#)_$Q{;w=*4#uiM^R`%e1yZA#(Y`U!E>y<(Pa6ycRp`^;A_ovt3*>qI-x zJQ+IAMZeJ^W(kIg=6=o_#yvnd;;=mOg%!JHW9M$$M7XaG6-+EY@L8}sKqzs1$y~Hx zjjwg}n?V;npr+{B89D_`qNiZ@DaFTgRBK_j$Wtgmj(hg@2@8XmNBI-Dj@AjCoHzD+ zaHe)PgTvw(lk@9v_UU}bk7wO|;or_oa~jzNIZf=uc7$pxJX(Wa&z3g`Ru&^M*pa2+ zbbzo5XW@j~CGP565f2>!mpV9Sgv;VJrViuNL!Y>6))g7wCF}rT2D!A#kRWFoAej+% zimwb4Pl9a!sb!aI6UM$$^HGt=N8a$RgdRQH1S|FrC(2(GUv#fFV)#UJcWjuR`rCye z7fH3tLvTgiJC|KxyV|$iY;f)46RX|tlywKTlGW(s8(^=UC3`IMwL2lgn3=uut$GTbPIUfdP}i;{T!8O3dIzd zMZn+)bJ4@h404}0vlIg*LGZ#Qqh)TtGJBdq3Z-Ug8}Cc ziZdtx-}wSG@Zr5njse5m%|0GK?v_`Bpt=v-{wDPbBiNH8?1D@IT)?FlA>3`43pOW( z-01Bi#X>;Po4k4+dE?75LJ)!w01cyF?;Ib|`@H;_Vw161|vFGbP3kobbN;T6$sbG{5ywq{xK102lcVLx+!s`9~ zx5igab-O&m$@9&4~6sdSI_RdNB^;i^_5qk-%iz1b}#3WGIANQlkJ{IpZnA-BR`HJjQy-R z_ErYEX2_YVZ-sEI755iQQ|k=X!&K<74d3#C7cL?VuN#c7d$hZOL7R!OUT7+X7 z;x&`6aNu@6PxHrX8C)G89E7v57d{g<;nF$k`9}U=)o!&p6j!d!nnSUJjuHm_afDNF zK0p}ShK38X<8ysfAmo1srMh~p}l%&@=AsVg@at+NIV)=K(7 z^}m(&jq1Iw42QcGWS1ng&%o|UF&s1g2Lv%jaXGV)okMckAIze8j2cIssFOlA@`R~n z4R{5x7}j7;P^YyB|Bsvevmh;IDYMb`&T_z;JXmB3@7sKf6%!i*>H4xy%dJ4L{2Jie zdDeg&aSNK`L{P@QV!D6I>)NkLcsbUtIui=>1|j*GuW`efCmbq ztI_BU8Z|n}@72`4(@##J7^RWMbo5czJ4$!7SNueyyP2e|dG=Au00toEG9%Q9;p8$k zela-*EJ_Josae-nt%rEhqzSuAiU$`{{|BxFK?hxGf zIe@t#a+fEX3FJiohB~BLkUc8bYoIKQd_JOd+W7q*nF;_X+Ej2PW?kCX0uu>}vxTiP z<_;3aiG^GC?$E5;we+5p1tcUg5h2jTq?A}oP%tli2o=XK+y!DIhH(LUc?k)YjGreg z7;F~-t;326QC-0-07J7KHsBre8Lu2I^Y9?Y_U*!RPrG7v~mVyiC8~S zZVyO}=`(_woP-ID14wBQ3Sp_lmCLkM?Pf=lg;RO{WEI};z5MTpb_a+Dw>BZ)HUI!{ z1fci1=m5;U?+6d*h+q)xo=~}qIikpsbKad} z@v=&^-U?HP?ar!Si?llb2;!3?nE4W>il{1;ee_VvdQNHSROy3uSLh>hi8l%pc~Utz z%yzaJsUbh!Gt^#(l%-tyn6=Du!=Rf=-qQGNq8O9##U3I$KRQXAuXRbXCMCjJszScr z22tEs1-q-%YhRdlzgKF4tL9-%kYg!z)~rLb~R3a@)xwvuIvi}DIOoz3UGD=2Q+LR=1# zURxBs2_-m!wL*G4Wp7?%o=~iO?Wo#YY9g_fBTBb~xE4b;q{xAzAA*X7(e?tWTxq=( zpkq$%|2=x1pd@imu0nI0Wo{#+K!P5qsE-_yjGJUeZdGA%yl*%XwnmDY;^IsAZh^HVN;?$AKUKI0cN3`EeyVB&<^D-v zF}$~z_{~?nzSC3=x_EdMgr#k|odzjI9;(9DaXi&PH4N``7W?NewMEP0d^OJ3RE*H( zV)wdSE79l^csh(HOWs|mTnTiQI8(CZ+b07rtK%5G-2usyt9OggJJ|Z$pXn$HV2%xm(teU-Exdv1xpC< z0FG|=EJi!p8qbQUuG{+fR>kfi@IF82maRCvYLKf<`{$yj+=Cj$9*6W8fqvoHK$+Tb z`yVE5X4M#c%i!tu9N(>S4^9NVCAam(N(himq$fujn-Q!N==c||7KAzlQ^``yR@mAU z)jK^#DN_b+V_>ZgjH)bnbb8{$I?>@4U3_-HyrLo zAx&jzjDz}{v#h0TkCD5U&GrYs>!e!*6EfiERw%2px1YRrfweVM8HkkvV9Ev52aQhx zYyqG)fE*8SL4Y;^1OPk)0Dw1g+N!LlwsG>j?{9s&ATl1p$5X~}iEAl1TB>YH9C>1} zQMKS4#i?J4eL-;y3ED1l%_K+j2;Vvfo7+q)*b&_l+6hp7SJj~szcElV*RW8D3T+l2V6{yp776%6*iJek$ zMaRgO&0dz$$CNY@lCB}EM8*aOtHSCMWj%!5v{d)rd+a;h0D!3=+QC$?hn`kpGTfw& zB5+ESnlP!0g=3BE%w1{HXDdshvYq`ch7|oxLQd%o3)(XI%3x{g;;v)$af%k-*l=y? z-d=Qelbx;D!P3&Wz_Vk|&($dHe5PT>p@eN0ve_hWIEbVcu_o4w$+9b=IP8S3 z9xj4V?cNCeJI87J3yOk>$}9HwKeSuSoY!NQq^O|1j5NPF%ULTR&V_jh25Vz60GpK8l(aoYbAx7 z(v3$wpfEl-24!b7KX*T8iFc#QYy!Uy`z>cIRcDp&xB~2v=a?#9j11YeIjy)MxT{cf zQ*z1;P9=zJSsVi~BAGgY<}gXVi$NlNs(AjKR&s?qT@xWZk~p$u#Y=5PrIj1Fi@!Sm z;>cU6BHq=EZWt!24@|2z`!ZYW-)YYh$h8+J2b%R9IRCbu=Fcb&^|EEw5bIJ3cFl{e z(o6DmN{ZR(DK+DkDWFzD5OC^pTEJZ;Av=kfiW$7wsV)_wl__9VLJ)-hX=_%l#95cq zJjuKBly~p-IxXgSA)!v;{B0 z+hI!KWgQ<_Z&2dia|evZ)Si+j=PnqLsh}}3byd^H~1$WIIT#E{h zuWdqcXA#RmW3z&&ASog^x|cP%8~)1NUrO-?JS3qzu`{_d3TCI^AXSSqV+#JA5d7V2 zo7Cehac8Kc{X8l8rSr3q_(In>Ykw{~0wfCVxu=U-w0gw9Rf&p(Fp?njeW4IjTnCl- z3L>-eANIBCYu6rEx$jLoE7%9iunJ zK4TBUEu~?69yRt4gHew7zXL~r{?W5&4_-40I0H7|Khyi-{HS+^(gWv* zs{WBicvTn$j$q_m(X6ly`~lOz9q_dFbU}4;uO?}K19C<0o|&;vP1t*kO`<1H_S@3+ zYhP5I?x!Z}J!RjksO^ou`H7pNo@vV7CKO8x1BTHv2Us`q3z5{bm@&Ae>Y3U5Vis&U zi?W{*D=`z;UgmT!8k7<2wa#e0BHff7o>9t)J&mIDeRvt~oPlWOI%-~z$MZc!?J~~i zV_||sCD|k2T}5-t>=DISMQe!C7>iasmaorJI9L6roELNVCdF4=4dFMj>fDCd>3i(r z_4=P$N4ybpH_hjMjZCyMt~Gs{Y$BK=FR*ZtS2>dyh#Q|Z=ZNz; z_YaAX0R%v~;~k24BDzv^?m4E+F?sl3y*2z-jj}-VUrEp-yJRR)F%(BbDW!rHySWAp zmO2oTr5PL^l`hcW#oYCbDqnL$78iQFV;U1+fYN-f9lNE3@I-LQz(B)>iZW!Sj6qTq z&N-;HRH7#ON;PyWOD$|ESL%?I+NB=j=~^1lpBLsPBcF}3UNa*twAhANNgxUS(HP)8 zhplZVjD&k>=rpD~auTx>ojxT}v4qmfVny2m$FSXC;)N4Vqv;f0n|6+B5}9R@_L)zP zQD8vex&HSH+=m~I(XX&LribD$=n<$>=Ef)PT|9a%qrh{-eOgt#}SqC z-NHn^jx{V7zfypu>H^2cUN@LvX%9WxPHz;1Dv=0gglZQvnYQ9sP3dacT(ucJjYeXz zxSbc^rBI_{_-Jr|8Ri^#aqy3cR4BxSspX5DY8N~I8I+feDlqrADcq4qIBM!9W6<48#jbD5=$bR_WG&^eG0VGi5S-w@_y zr5nVc8tyB=as>cy%s?rD10v6L;iQ5UVmmorMd<@}lZtFSFOft(B1ZuOc9W<`QKU68 z7Wspm2J9!}BgBY2`4E+&?;ovW@UOc`Rj(bHR>dx zV<%3ZIlJ|n3Ap})5MA_y$s>mK(!6_!5PuyZPJR=I&72}P7uVrA;3t8ThD{u`vCaOm zgr1xZ_!do>{KoWj%@2u$p27PeC#OssHKmNclTApY47{_AFx=o+GT@44h+FGlNqr~W zAmsY%r_d%LH@&VmtBJ1t)On!O3|u-Bf!)Oq?>G&w{S>!+YNAc4P78TW=4U*W>aaUV zHxVB)glH_!>k(8TY$YPDMQIydgC|5&s$o40Fz4dOWHf6=ZHkclM0lD_0tet`AglcK z$&<$*t81z?!{9VrhzcZhM>p1DON{}g0*OFtSy|MJoE<_#a#+|#vZWf*L0Uj2X}%z1 zah^uUkZfT;DHM(qS)5K9Nkt@!t|xIqGZG?%l3ijCqLUVqsd(oMj)6Fa;7Gx-8AlrRr9r%Mls zmvog36Pl3KVit)&UPsI!uZeqzBrG63q|qc-DkiI?RJ>nIhD)u;2;l?L9Oon1eL*5S z1P{|WsR3ET&SeET zGDmnx3Z#x?ggBB+6(^8fVHH_~wzr5sl2oA)*@gON2r*=cxR1X-Np3|>$wzSfN@k0{ zl4%_84EL`b+J&Yc*jVs!U}Ir9gm$K{*;pX|3CD+;5hT(&4s0y!4k?r5@M|^}b_XAe z(`1iSNtScGGu*#&$nTSud@L{yY%J765KX5Ak!(SJ9mm^}kz}I3>Nv2mvmGU%GxPNd z@X-&ppU5Am57o59FU<3}Qit^^lh{e8@+^A3kIU;}M~bse}OBfI!Bj4$$GY+UVg?Ex}Y+XnZ+ zgNzR>`FKk{it{CS<8O2DEaw}R{{a5s*QP%h-JqQn|7*_po%0;ycQ(!zzGuA0_}@O~ zJbljet!56HAZ-Hd8_`xdS;6sVp$o5*I?=lh8t z@SUOQU|N8Fzb5Q7-QfHQ`6x{X-R&p-oX*f6mG>A=vN6}RCCyaXC~Y8f7~Gn7aUU`g z*BuyM8BRc7y_j4?JAE~M$Q01kha6W+K+D~5FqyZLR3cv~v3qC9Tap%XjPVnDt|xD> zGSW)O7gmnZSuvNFjIUxPPtu2%tt8!exh!7iFv$GwxL&C_M0!dy$Y9M*GC;mTCZLaZ z*nR#Ea&}Mp2{hK$^qrhZvQ+saQ__^COAkeO~6jWpxTI);~L?;W<`&>nwW765-5E$J<%pkCllZbD9I z7Law?V$^jF^|}%t`8U+zg0{wy6WSn*OAzD&lW!BbY+56B2j1=hN01Y8An}Gi%;7j< z_-q3_PJ~?ggX2?`Yb-bGCO^nDCbw)o(^X8bL5?!r2DsZoFR->eIUKA_#zV-p8uFIxN9Jl=OgE%{ zrZ2TIY6GkP-TCdGL+nd(%6`xdzZ{mR;#qm_}@N4w1-k2^!&3S2AKnbeI& zJ2fJ$w0B5XHhv6N6-GYRE6|6LWDl&s)zWlRjo97vv-AzhIiXJ&dyfC}kjWSWE;E6D zz_dpii@b&DS1H!?k-Ubq)2t$G)%vxUFun$|+9?6!{Q~X%2s-_YOi*E*XL)c8`P50zvbIxd7g_XlL6tICtIi09| zR&z_8Tn2!KxLkNe$Eh++)m56cq@R>drmMNU2|V#W>=W<>cs&PtXdFA#{#$c<9l*wv zU9%i?&uEYF38&Rpa|?`&4;d{oe&IBGp0pJ^f_E)=vgTSc0OLAb-V0grPvm`J(?z5I zonfy!gGMfr_HrI+>m-tc@@|at@1PZb(8@6q3f}7gc(yT_WyP5)+hId8J5JRZujc<@ z6FA_}wCBG+{|lSK;eE)1|HD?0j+%auTEWKon{r(CFc9Uhe^nP-^rfmd|1RhBuj=Bz$TibVp^_KoOieLEvE;&O%t>4@HyMa~`8bcm`EE>D zph?*e@}yjzODfnQ?k5_ii}|sO=TX8F%v+w}xD6T^2fbH9`U>xo<>EEy*^y+IcCTe_ zgE@~d2Kr|V=sX#^d>?5g9wo1fL&EtbvwWV6*Y+Wkv`feo$iMNhEi*OS$N|` z`br^(nhH+1$L3a-Npr}C=Gr3Cob}NukqmH3A_F0xw}@THSh0{y5hq}N5C^^-3;E)M z`N2O)KVdNB`z+i`Lp}_)!E%x!3nW!~k3;~*M+vTHf!?%ar?{6akj{_@@ZU_y#nc<` zO_E&5BzB)4`^W;imJG#Q#Z!<>=R{Z2PEku*VJrtohsktl2XM24?8mWAqJa5RG7sm& zS^a3Uzc?53mAPb^xSsSypL4|lWGZZ{t?FDxYJxt+VP13=W95$d4eT%Jkm)ymu>LaG z{_bG?V12SXfa7;9^NMRY-^*~raP;cI@M(W=eA~Cf>b5@^-t5}3o-^FqAHX---Noug z{xM)_jbk+%4>m67=Xf?o>cQYs4+j|87^?>xbNhqg1&2NS?A+-g$}!qe4@N^c7!9%K z%u^v!QKVGE|50BWK^xOoev!D2rBoYixgSh}S^1EF5Esjx0P0R@l=%Wr*sq>BYaljY z^?On`O67oNxEbI^qx3Y4(l9j3eu6n;O{l+M_H*Oyxwz5*{$ov;e}3wTng>w)#k!mS zaMM$LKmn=w&+#tRvl1S*VwSTwOX<*X^9>F9$^OurhH8(@PXee5{w%*nJP%;4S$aK7tnB%3s$u6PK1_=m6xlE>Vvs74?=&OaHA! zEltw;{0{KQ$x0uZ;1S#aq!AUI89X$2RM@rOK6oi9CR44+1i0#wK(Z6? z?4-v5&kMni!&3!#?f@QQg{KhktP=N#9|ImDE%PV-ZTt)TcLE*~=o#o67#J7^c;W+F zSmD_Ncn&+jGr$6myB$0uIXo2b)R;`BUrmop7flA!9@9osUsIMT*;HTIpcL00Q06LQ zlmSYArMHr;yjJ^F?cLfhYrm+yQ~PP{k=nzL&p%%DxZUHXk8VE-ebo3-qel%N)qkXW zo`m#GQCxmBEX6!`tpl{78M$fHVZHHYWZg02C2Kf=LJoC1E6-M35$=DTyReB$~vK zSfVF!q#21P2_%sukz@k?8ZhL2{TJB1gzka-19^22w`eA(-vKuXKvMODf2F35f#eNws5p#_Av46jVm~p5mWqSO1TvQ{A_vGBvVe?$^)`T} zi-YN8GLg&^Q^|0$kSr#fAfdd)II)@7Tx=mGib>?OIGnssTZ$dTu3|eeLmVlN5?hm5 zVzSs$Oe2M)m@FbINfB91){wQ31sljl^l&}dM&2S@$e+L!h; zkm$|^=j@y^N>}weMNNwhg^kOc#UX=Z3^Y10u>H6U105P;5TXqGBZIo)#%1sM$uX&L<*1_cGSH(bchFWHk7@VU!_snSz5Q6}sOSHkKeT<<_w80md zYjjxzT^3l>Gv{;~IA_EuC$g+p&S~N!KAF<5p&6;iPkfzd2DC{H+E0c zJv}kZ2WP}6J84ma8F9vHC;Eml(1}hr#<8;kmP}#E5Emr*EYZ8*X*ZTkX31)n9A^oh zzG*bEvjBFM%90_Lvp0-xuB-x(R;C)kwB8o2G6}su7fKH z@m7Yy-`EnqPy_OnL?;H3I&u;T(*{F2I{u;|!K!FHy(nY}!-Znur0|XCDu#-!#XjOB zu|j+zwUJIqie|8;N>d}}$zRLAXkE0i+CJLZ+Uri!oGv&AI!|*x>8!ZqxSXjIS|_c} zv^uxy{N_5))mT@m+o|r`^_=QWs#jX?wwumvzS~WmPS-&1R)OdFByx=8x#d*#4y6E+Vcc%9$?>j!pJ|#ZYzMXtaeZThe@+sTaA=#* z1EJ?aZ-@RECWSQ!iw_$bb~o&oaM$qQ@HXLn!ncS25#bUM8j%(;IAUSMohD0~lr-7f zq@u~)rcOA0u5O{Ue)4_KKVqxiPXjDl=+q)Uv3ZQB_gjM5jlOjh-1@ z7+o5DG5Tio7tzmSTw{V`+QjsVnG{nPvpeQg%>CF-u~o5mVjsu8&nYzg7n(O}9^X8xdH?34o6l`t+WbiKQ_XKS zf7~Lx#rhV9T2!^T)8cW97cGNZ_G-De<%O32XnDWo53Ph&4O+#u>dzCz!YeP{N)mJ^zjn{&P2z<%ZZD*DIwH}tFz}l} zO$IF)^y8r428R!h9XxaJ-oZzPBo1jkWXcfZkROM}4J{aYXIO(_Ylb%%K52Nt@FOFd zjK~~uZN#k+UyKw+x{RDY^3JH1qxz4UJ!f|&~n7HnK_ZlTY@u?wd!ELbEgTDWM{ zqS8fgFETDVx9HlUTZ^6)>I$O^vkP+yhZg1)ZY!)=?6G*{;*!P37T;d{d`Y7v)0b2& zxwGW)QnECBY5LO9OD8SOTUxU8{?eLdfy?5TwOQ7GS;4Yx%M8n|FMGaBS?;nta(SQS zqnGC`U$}hL@+U=UMGK3HiXN^QzT#GKTJiScnw2A0UR%|F)i*Iy0uN#X09E&wqWhHwU^dbuf4nWd5KiwUy@joRWiI}S;@ANizT;9 zo~_fZYqGA*x<2c2*DYLEy3V-n=DH{Az19b=k6xd?zSsKP^+oIVu0OT@*7|QYxNZpC z&|yRW4bwMl+;C*WxeeDg+}`kT!;c%KjXoRWHfC%bym8vb;*C2up4oVFEFWLO|=8DZXH$UD&wzzKb+Y+}W zd&|HrW4FxTQnY2~mWnM`{`T+Imb+WN*`kzsl!lkKEbUO*qjYfT{L*t<1GlDa?Xq>? zw(xDS+mg3sZ5z97`nF};s@@Xbs`u9R?ZMk)w;$Qje8=t`#+@EJr|sOl^W4tIyIgh+ z+*P>i+^*ZZb-UN>{>Prdd$#Ynvgi5U=)Ilx9@~3nZ`I!0dvCv8v0vElwZHlP0|#6W zOgT_~F!A7$gT{k3hmsF1IduDQ%fr(SA3OZTkq$?W9hHyvIlBAkFUMSuO*&R`?8Wiu zmkDLl%8JVF8k-nL8+X6s@lMe@_se^fUn~FOgmfbIM4uB2Puw}# z=Va;07w-;#cjGDDsk~FCPB%C`|MdMc!Dn`!dH!DJd(+-KQ{i7xT5-KXIV+!yKHKZ; z$g@RfE6(0N``fv=b2;axpDQ@`_PN{Vo}G_8pM8G*`O@>Z&;NEI^g{N9*%vlnsJ`(0 z{lNEIzCY#t-R~RUzxMv^i^9d|i$gCKUEF=qc=5``=NFX^d_G9~p#KM}J}CX5{DXg7 zBA5Iwg^(@ZPSlm zNVt&XHvNoL65Ksnl*y98B`PQAPQzdN#WkZL?g^eDNeOgHWhJeuqF;-*USwZ~!6Cpu zuM;|BtxtnFn=>&;dV@Zd$^@drha7kj@0{FA!@ zS3}I@mJvf8y`iz51LO*TTvh0FxX`H=9BzQhi#5QL2JE7-u8e4`FdL+5+%d@2hB~@3 zC%gM~bcTBDrop4y;G{En@nSyJ2BI_g@jLzu{17n&{e^o1M}nBZ4(||tAoUCpu9&hn zW&c2(GE9hW>#?ba3CHD!8DIXMy?LD}!$eD!(X_Of4qQcdDnr?^O4(bij26PNB0|X| zQ=H^2zlAw!FY`z^qZ7_*_kwW|%toSquro%&P+w;ds}0UNgDXqRJVje4gLQ_0YD2KD zEYfxp&?kmRgoh_3CZ{ANc>DNxha`rF1k2uDKEAl{lC|C;N#WrsDG6Ra3GvBdc0tLt zn`htNe&F<_`BU=VoVEQ%)y?v^j@*@mb6ck_SW9R2D~NyX`k{T*-d}y~_w?$r19Qd? zo0*(mdGN@Go)^x0d{(U~T{MS{rG|_(eXm)hsl?2^A!gwzm}Tb?Lvy{MrFld}bWBux z8IFr^Hg2NM;KF)zr{UdxW$x70IZ;>UXLlKnzN+O6;kvRIyJrEqvP9cuTr!I6TSR(WE3Z8t8v{riq}wWA`p!zIV^EqJ1UZyL8O%-l=o8px?WE*}lC?Ew_4f z?9^Rxn)Mb8auYr z@9m^%?ZA0yrthU{;3o(p-vaYBzv7aj@`bB1O8)Z|I0j*ZKB_|iPXgVyb zdk$ST``v*fw)Qyq?#Y7Tt2<{aW7=-dDZJnBo@R9G)Ni^pi>2>0&X^lNwM2ZF^hU;z z@P5g!4W7#AhC+q}P#-QsWF|pC!C*f~8!k9BEtGGlGu%m(6e`Vxx8#xV2tm?_dP7|l z_0*9RUtd{p_ttr!SK-9HkhVE4hcEx|T2Z)sT)8N8qeVjOAUb`#(nQ%;SJ|gDnLc5V z5JOk+wq?{Apw?Mek807pjsQQ&9_~pxAtEKghqwy?%KOLU@TE6CSr9HCqp3m%<;~hp z22B`8AJ9Q{X&?G%(u6^^x0F0yXCq;V*cURb9(+{*(k5RS@z>QE>M#)#mZA|8#4ult zr&bgrXohm98ExXS%Y}x;DYxEVbiz<5-tJdAnf6ikPTJN_c|Mc|DBlj^^=FY1DN#BJ ziQAAEoKZg?dD$idATZEEkav)Kh&x1>dxEf!u2!a2DwAkQrRZioK<%K&JlSz{9_s>3i@#pQ&{;XWSaN)9|g$tJoQOdW6$D01u)s8h9T$A!q=ZMukj8hC!n6x@Dnd6nMtcRn|4d9*R^}3^8_gCvJt8c5yDAXqq6-JS`Gl}7@D|5Cz z#3j=&5XQbBouHs3CMnDa2#E+M7WqMagQW19Z2DEffc$ZrR-Y9#RQl%9w=46N1%gnq zRPb1RAZOx+t;KQ$CI2j&@pQQ|ghfXWF?}z-1gw!{hIKsM0Ir(~u2s@~MCc%604x>b zd6qn7m-#HwBQdz?%CvSMyFqhQ8ye~ifh;Wxv3o?I5^a|lS!g<2cerwZ6lCg9f)G@7 zAuAC=3y&mLapIzh%F7QgD=#%-#mYJJR?S~_L`+!p=DdYVr^x&M z_1WeA@93jWO}qT~vs3aL%a$!(TEJ;C1>@5LW-4|N_NvKcpt>@_1}!sM zC=(J)=hv%Fa~@xBPQ4ZNw$_sdv5t6$aHggSG{`+dD=xo!^-}FLVPSP`0j-cd>35}y zfo4w@f2wII9H#M{RyKn_JON7peAfmiGb9xFrz-yI;i4X65I`c@7}`)zXYi~>TIOR1 zo|CSukzE-WQ2`(sPfv&&F*!LU*~8llY-BYs%xKph?B}10!SCguK!MVDA75=aH<7%PK^kWG!6Z8384PR5 z%>Rku!k*6S;v$=k&)jxCZQqa&p8S6Ew(^8F-#cnm*r9@1OV?^DgBxtBAMoO;Z}U{; z`9}|xM>H9Wc|KSq99TQKM@HV&FK%pJa|Zm-mGiCvYaDuWZ|a}}b=2Ni$pV(EJ%?lu)?!wuYJrGmd15v@?a!YVOq{<-`SaFo<>mVM6X*W>g9|@z+dgZ~md*3$lr~*D zX57L>xnm2Z#A$~kqbufI`}EUmb1I@E4^O-B@y9i#GfPWn&Rw}mY&>Dr@~M-TEMfH0 z6Md!@ddV{PxGs8JSM9M%FJ;6Awo&U=7wG zKAte8EHcK+hnm(LZMLreCx1|F#bc^f9{scHj#U3v`O_w@4P3W!!seBWzxXWu^^R2Y z&o40_dZc_0yX28l-PnIqKz&*}xa0ium)_sB5z2#L<&*1B#5cjXfqK-k6cIDf*K8Ii zqi3>98|Z6Zb_DeKB$SOnDJo8&GI7HO6iZpIL@i}Ohp!_#XNLFy))ed%bX>MW2bHxz z2L@B??W^&oNz|KW_UkiL@7|*S2g;HS%Hm5uy2}Ve6R^%l#5_(1{#fbzPc5mcowCL@Q^ZIbTh*fj zz)ZCLg${w~%xA_UXx!)#y{3*EP*5R?-y1MW+)o6us` z+DupGZ=3!YqI6}Uc9+naZEcr8z0AZjH~+&SNub(&wF#o^0~ML#L4pE_D3BnW`-02^ zi6_5B&5y&AQ#`q(lrK4d{Z+?Y-}p5{=M{PQ{&U~Bg3gkh;QU&`ob^sR<$_{Rt}Dyk zJZLs;nRB8|c)O2AD22)}4^MiXPN#F|hLrYTupI^U-lSpB`4?m6ggerE^rs_((nd8PN#)1rNowwszI}W~r_XbwUHz zdS3#U7<5eo=s7JcW6SKy!P;_g9B9EeS|;|Wpka(p_2sMS4k`>PbF#4kv&&qn%Uij0 zb`b`hoa3^>Wvh!g$T-f0GF==b!W2c23Ucvk?e?OpLc&2I@@j2Q`rR{`&QO+X3@@^U zM#3g=Mmc2uallp&k~omrY<_>ChgEaX_|y;Pj-Rf~%?=cBl+NxFsye`S8P_bqJt$sc zlRUFkLvhK;HO!I+mD4XDQ(^9?!c9u;*UDkqd&$Om3zbzgbyCrWV&yxHp|Wz=masJofahJ&dJLhYZ`;HOZo0HrT}|1-Y*wZm+GrGDPmrM zD+b4Gz)=TL0?eaj71OE$QdPY1X&q+ZvP6%B`Ks(x62qQ@T?kK>J(w^6*%Xf-l2`30 zk=C>n->Y>IwhDV{e=pS-wkn9pwZJoj;{_fzi~YwzP~lM-!`P(ETwfD`O*Tuv=N z@AQ$AFx8mqM5h@iv*amzw1Xwx*z>1OCMRK#@i=>H2ut)x;9GmOD|Xt2@eZ?M8T68S z?bu53gIYn@EELwxWl*~S=9!?kPe5;hh`Hbh{JR;Q!L6Fj>pX0jVe>lsc~5}o!WcY2 zU*>Nsgz2p;LB26FFCkuHt^;lYnx}gyOgBlNBr2xs%1iJ{o0l)BzbI5VAK$nC`eVb~ z?ZL|Xg7kj&5}JjGv1lAwzg?8`_rAEG+`9NOJ(70bYQ{Sv3mF~kwc?$tYZdPfeX>#~ zBNr=$UptDSZ@3DeBu^uG>~oo2eVynOV*KR^9YUb=W4Jdm94G=XTN z9wJ|07x88s=-df1-$`v#C3;>=odFp?k{R*KAnx-lNtHqHt6B1tUG88B&cL)R(IYX) z4wP=JBeO{dD4fmH65s?+Kn$feLsGMjt4BaZJsaqZxSRT0mNadK4c z4L(6<7cM#jtu9Zb8PJU<-=K@=Iw}srK*C>;<~-Ro-*vU?4p(WAv70L}G7w35lxr(j z0V04+SfC&ifC$eB=t-?7&Y-=kWm;WR>7`McEK(vho|PELVbTt$$}}OHzML$rqP6eT zUO)#Ncxa}%FaM7WgyAs=)yB>O0}ctM)508K1!N>ZZh;%DCr;JIWbj#9-3+H*P9vSB zI~6*ucajGgdpR>b9|XwRSW+x$FurIfgE7v^mC|V8@#)JQgJh0Tlu56KvIy8bLXs{9#hwr>Q3DL_1gBIeFy9jU(@VCiGE$ zRd&*$v<@_+3mvZPP<|DzP+}ril$X~`#PlJDk?E%EK&=aOWV#un4g|p!CNqmLdtg$N z=5f^m zc3be}r)dRzdBP)ZvCkbAdeoU|nZFG?M$y@y!KKrc`P%LR5bo8cY-(nf>3@N_k^O&P zs{GJ=R@z^pZ`Jc&-!4Fev+w_e!+&dz!}k_~m_W`te~Cl>!~-(N!x5o&-Uy=$;Zthh z)y}K0;*~q?Vb8I(8*eBmzJ}p|XSb&{Z%&yx&OhwK2%n(Kdc zo+;pTrwYh2?kBC z0!?dGe~N>QuuhyHs5Le)A%=ivi-%lVr9@XMG13H$_lxf}-te3-*|QEfy36IL#dqtV zvmBI(s;^&BVD8+%m;^mw_9D4Uca;zSe5QO_Sy8(Cvc^yo_G3-$zr`7)l|++!AOz+LMl;W=XAO^Az8N6h2Q$5Jm>c zL3HM)wT}+gKDteF-*`jn@FE*6QFy0`{1MK)5dr$2Z8{h#+o$=ae_pBVGAIuk$n}-G24(jp`o~H7u6U{@ z^S$@PQ!lc`=ZhBA)Z=|i2R?7(tPWyzIh+o&0*Ah-L7XWxuZ^t@ z7Se0a3117h7@c_mzMFv0NnHEMl)071uu*rg;tEf=&=>p9^|D3;7dkS?$V6CVv;1;1pupY%hSJ@O^A`nl+8DZ!d zjp5Hvc-wW9D|97qI~4t7>wRUColtP}Afo~_ngj!;4qd3sKYLa#_#<4Yf^2_zmqsn2ktg2P$vWY4;j`MNbWaBaJuo~-rqSXKoLSe# zR8eJ*i@0VQ<|o@xGfLcA$`;iqzIXB-{SLBQLYzAKU>w5e@;FQQ(#d4DbkdC_CU%dn zpQN%gHzWq@GL!MRLj_2EV2-L?uKh6C07H@eF8nUZ$Zm!Eh2h}nYm9W;i~tG+9H4v8FOQ{s>sW#P85 zfZ-KxaZ|yIoRDDgtztO}PI@2s419dyjZH~1$2N#fTl~gn?&#*N$HxzuJS;=byY!x+_V<<(64y+6-7vFzW-s2~ z)sXp7Sc`VYYDqRRxR@!5PY={CtE0sG&!sWblzRAt*iwnNtq06nYGk`)MhbVmY1zbp zFEzNEV>7hwKFs}=Bt<=_9KSu$Z&zi)rcqb!S1vCeFfS~8&fpcx=r7+X4|;ZAE&J8( z&g=pQ+siZG_v@@gW%sYL@Gr*cH;hwb>~P?Kar<2bS%uP`u-I~%uRV0kx1HeY0}U;} z&|r>1i-SgH28i(b@C{{xMyWmW!;6>SpZiG?jK$-(E-qX=D@QK=oF;x7`7fGue~&z3 z#l78;Z-2#TXEA&_MTC%{l9VP$yRB7e1S=GD1%^$^GIJ_qG~m0vmD!o} z&vxCud(TYsBLMfmflD9Iz)&+bxe!)?wvu@r!h|qfJmuAO?$?16WGD0DyyB>XXtP5z z^YJ*)geI5(+wehnczXxIdB@zaaJ`CHdh!hd%?sHNm0zi6#h3SM(?xOf@{yZTy0$#G zZ$z<9pg+&`rZLZ=|3wp&Kkm-aY`fYbzMw@H@yh=Bng-LEPmF>Zh;S7P<-T@ne-0zy z32yd$wP%cSsf{+QE**P+B-SXss|`Mob{K*ruqR_n>q;71r+jem;ECPA?IZm>5*qdC z_27Ycpk(>cvvpiHO7fWD%S&o1z=2#(>hDJWVI%Zp<-&@ZgXPsytpR}>#nng+L zhhBbMS+ug>%!u&WeO4Bmsi|ky%9j_a??r`e@efaKX@()v*)!Fr(mKH^+V% z3v|#}fiMZnJZ;M{Y$n8gKVs!NEA85J(ovf*gwK5Zts5N z130Ubhgp1|7F1Twr%irfoiTedwO-Pm2@|$PBpjHs??UCIiKFJ#shXPGe|iAMV^!DQBS#LL@aS>vEMfW1 z#l_>DYP$=|H?Qo}uI3(gu<*WdzV}1~C=IdyvPMG*jNSDzs_ZrAn}_OG7VF0SVJnY%UxLJTt$IMSD8PAk{DCFzE$n zIs^}S^7UY7O18l9O3dLfD&2cPHA>C>`^wA8wX0W_tXs8mtq}2yrYP5b@_DXYr%68@ zxqttN&!LA84{?}QD?_EGfQi{5z0DYMFhU$gpUVzaE^^QrhWwIH3 z*Zay)@jDCbmgpo0eDVQRiIsDs3cE_V|J91JN$?PN^HRK{)Q09Cu`#jn#>&K11EBer z7I%LmBI1p1E0>vNb?40d7vX~ZS{tVMKg?_^1i#kdDKtN)N#PLSc5|2msep3jqh473 zrkLqkL*^_Ch+v-xXm2ZGeSC%0qq4>~t~7YYF3s_2QdcaN!3Qs;mfL#`)=C&|v^@qk z$5pf)LFSuB+d)db;*TkB>f6E>-q_Q=SA9SC#gvcvXKegy4jeKzt_Pdn6$uO2aP-$0 zf~)ZXJnvvw=6~tDVbR0(_MaL%Y>w;U8dH=;6jffnUw-x;95pkBj~m^;=*E?AD?a*B z7AiC)!^h2_0d0E)M6Js&Jach{{QA^^ZPPk6j^32N#(1k(9yhEv`W$TfUdYv?!Zxu) z_3(MGieet5qFz|N(JVsAuBWhJo$M3};@1$cu41| zE7LJ4YjuM-YHzmWWCq0I4uU_~Jw$Aiuyb5lRpsaj_gg}t*x z*Oyg*BNkJ{$AH6G^(s5aN(XMTPRD33XWMxPiDcC4v6oE_?oYRhhOy znRtz+cIhI#d|Ab1A;qp~qPdH6Z|nm8Pr2+Mb+{i$MZjPCfrM)K)P-KcNMX8AD6ALY z{o$@5+|~Bdj?_-q7HZcspAZ~EZYbN?ZGhW&w>fSr+_t*OR+v34ZXhv2tL01Xdwu0b zceZ~XAU8gANvYcLaf}>wbB9uOi54wdBp7P5OG*U8%PL{rDf({hMAk7g4*!AEI@rt2 z`{h7u4*lZTRW+t+mLaNz`+zpEIW%|w80WAhpi(5DHXs(81^^sKm&r+!v0>q;O{6rZ8{X7a=lr`BG`objw1&PF`Me&pN5u4fV>TyL9a` zvDwSOiM#7)wo-XY##AYk;cPJI?hIgb^a-gWu3AnGbISkIC)81xTC-Q^SbI)PC@n1# zy|y7@i?x-itQU63uVGJrL-Sgxp2fmo6*h?odH89{n;|C(Z;sm;6T557jly@(OV;*r z&==5bhI#{o)zy}?IchKOa`ju~iF4xkxcX1uaF zbb>ebVK8{TCl2mE82=_Vy|{1GgbAbeUHmQdox&UAcSbecIq_!UiI6u_o*uqAbT%Hn;wY1B=DSgptgE5sc|&hDZ%~TFTU2+G;eNcS4nF-54jb3v z>vjkep zxJPT^T;k&7z1v;xS6pFRcjgZtG2Mmk7RGGozo%7cY28a>Hf*K!u7CUS5jk(#hQ-SB ztr*9#rhjVs<2#)!GBlPLyzOSC5PxM6c9aA>$Jj1aO%|brc;P#ZB2vuew{MCs4?tpD zOel-$@nFF-!GhGW>*-OWPIq3oq9{J8MRLiC)t!t(hZ#GU6mLvykrcP8xaN(YjvV^w zr$a}6n$RY_?Q4Za#a&K}7+sOIVMR&GYi*iuDBhBFdercDx~yIy%&Aa*r_L2;sFQ*( ze`8GiF(xdw$_HP*;H2n-X^xNTyLND=$W@3hPlpvw zxcT8H!(s;WmesQ}Joqj*$W(Z{*&mEOcxl-m-0WlM*!#+0+FV&c5gA{pEN8J`F!cvL z6zdC{YU8&q-Ku;^!;lH!0fDTA{OQBxj}~LW_z9C$D@(C{APmiFWx|C4yMbAkYZ)s& z7yS_Ydqw!o%$xlccWEx@GXdW-8NhdkG}9Y=&DDjlNg}Hb=HhF%(KPVwWeyf1A_^1j z3N)@Zgy_nmY~AP5#2P=JDyT8imVIZ8Cb0M?S-Fnek73-M%jC3=50j6H;nLipecN|H z%=cHyEm)E7FJ1oDn(I#=4(^+gL0#{EOC?FH*j~JLTaZm90|pEpJ$mqf{P?kK~BUh<~5K0P+$=1bOOSmv@}=QsQgJ= zQ3F1LRHl(dW`Kkk3Rj}RVs|vPDpy{tx6(at6RY4f#qZ5~V6W zCu&~nkV)yWF>x%0dpOAx$KyM;;bObrzD9&}JDOqo8nP>&&JZt(!HD_sU=&y;*w~Jd z8vBsap!wIB7JTJ@xJu}=VnYE7<-Og4U z?eB37WO1bqtB_5uRY8hHt%A+t#%x$WHh0saj!B8HXC@?dlrH3M-I_aL!-fednVBgm zojarb5kwMymwrb3Zp?zR>@!l;9E)_d4l-yV_y#elCs5$ua+4`;hwn5fi zVJ#i4l$I%r=)5x8vgRzl8I@D2jG%9o(ycGuw=%psB z8>KJ<)tA{o_QH;1*k0}BwIjbNdQaqcw|hCL?GZ4B!);`SyQ_gy&{`3L}I^G1GUFx!M5k<5+tyB%Zs{x zX`Zz>#y2whPof9fwe8rxdHdahd~p8S1FyH~(51X2|Ab8UbWY9e)v;rtG_^%yRLi&~ z^57XWCZ!B$;5#&9^4#f@<=7Uj;@Y&B53hG_2xbhSt-leJ=j$|;vQop_+5&&yb3T`~ z%&q^^eXC9y`D&Bu?Xx;{n2J=Ltjy4|vyp*1^WrFXmY8=fM8No=gM`T=htCSEEOU;| z@0mHV$t9^}?R?{c%noA2%c=>f=|Le%GyFd&3>T?T&>7%s7d2*;Pb*Y`sIKP0`R>kK zxA5ZzxeNKdzC~n`_${q3I8pKAkErHFHmhrwFolj0GobNxd=Ih}RR9!*0Uc9SB~1B; zc?@PKUFmV0y0JJ1)<>(K)=5P$0v`-+>IEP$8_yvToLnMOXsB!3KHJx6GjlTg1}4_& zkv(+U#AeOn!nI2oEJK7Xv>0Qo!8h)B{kGi>YL(1#w66FYtOAVz3wKx;Ek2e{V}vcj z>LtuA!S(YyVif9RzVI=x$TRCcePcBiyV;k!1{v?UFy?RpU*J<+(~NE`Id6G7%^1ke z2$C{)n+j&y2B8zS$?|{Ou0ONlt?d=>y|w-9(VRX#`}ObDD@V#(|K5A+-`sHe^oE>q zxqaX4HGVu>x`&RPL^g|y#1qi583>`$iWzhYzkdoot%tD9BE(~)pRgHu2kJ+hs8&2A zoWZMsuVN2FWu;BFz=^t99l!EAI?ymg>R9SR9Y@3{)M1H+=Gs-IEOj}FZOvlv%|?vX z4#-K?{ztryLn8j~A=Gi0=&)VS0!J|H!(g=zRb3-q3e^Z?nvy3Tm0Cg8`ZImwZkA?z zCli}{|1Ue4WZAsopIL=i@8>ond@0bs>vg>T=f`n>qfBtPtA z5_XnM8IU)>uXQI={-@KD`V6F7KW2SH43nmTHdqM9ml)X|wRW%<2f>TT>5{ujyt{X*L5tPsg|cb$Z6CM9%OvQ>-VtkfiuI>%UU*voS?(h zvV34)En8PDOLEBu)N2_{wO-x`2g>}S75-xNJ$wQngC4@SBaH@caDd($bnnKJe3lS) zZwgDY`B_6&gjrE;EXikyf!)hy2|>arMlk&VA|3|0#nx0mwZ@`w2ZKr;s_^0vs*X!| zUD)y@A}!LKSBpDDX1yTV8S;H9m-HvQi9^K6qBxZW;Mi>`F+OGN3T7T;!1|!w>KfC~ z_LE;Qu+BCaG!FJa#dDFMKKS2_b3Jk0g(dk|uQm?G*~u=R13f2rV((NjZk0!Rw#1AZ z@-9eZo2W2>X4{87gRqq7|k*l)r65N+;*so2&B zuE#h`h+a3t1Q(?+R?GTeE}us-Y<=Ja!pmcd%gdX7LixU0)(2jm_Aqs@^?}!KAky@L!3iGX7yo5~(qU!k;FQqY~IgF=Gl zXj4!&-aLk|p{A*_E)dc_kdF!ch2}9dmrt;k&!b<_Nox5$v^u}nTjvQHNn{Mi&11`#L&+hVc19^NayDGZ;(NnrLEg~!SlUIVrZBM71G5%`cc z)1Bt67`->84cM@vS3m5>7<@3Z`-Z}B_Gw~e|*qiK`U z?|S`EMENd_gxKX@^?JBKsqI~oNX7L{qp@A1^OAU4Gc`Ea^dabs$DnimMn9DQ%HZ*w!>{380`1vz|E+ZgY)=6%S+ie!#T&)mS_F!9Yc5Ha|EGLe|xb43|MOJPpS zK60Z<33a@!69&w2?R6CvyX|xpn?G1Ks4yq3r@Aecj-_>vES+pI+qn*r*Zf;y>bzRjpPWssOHd(%e;h0X@u?yALs&~8n2M#^NYa3{ zr&mL>>vAV5^r~Ihq(RSC01OHI^J6V-?;|)}{geRnI;%0-7H=wF5^@Y{wTsxMYJ{uw zRd99NV=0Xz$!vld?SIq7&V_cJ8UvJf5N1QI(QV6rEMtx5b?) z-8&5uV-GIY1k5f49Sl?2vsh`+0ao+4z1Wu9i#+aE^8oiVEj)w&ON;T$g+MFMn9F=+ zEt5yPv%t2^OM>>?9L#x?@QR8TFWM8Y<-4T0f`Fp+jyt1=A`-#$%X$(#!8nlUjuC1(>&Fn z!$a7)UX!W;B3KRO_ne-x{p+lva=lY3_DJ*kpl326*W+MQ1S0AM9u)Y@Egx%BgFYNS zbAwO8*l`5(iVsNJ9PP(K|6na(VL=nYR=Kd;kA+a?^TU@GE&CJ34H>K4|LhCpTk7>` z{~d{vbMFl0>#o?q(lfesw>7C>bXD9J9}L-*w`kX1jr&;T-+S)eN~@ z(U87xbcs)Jy}h34vGYd1lpY^j->Q4{hQg~D3&a+SwK9{f-7%Ij%^7Nzt-e!yxoq{_ z>1*)4;9Kp>WUDWb8i<4;f$;*1edKzghlS>kTl7RDE6tnBFg;-|lSju{^h5v~?SQ8N zrU0fV@PGK|11x%izr*zedk1ts&a5W_?*~2$WO^b{7syC85a6UCv5c`99^M!8dpRS` zeF>Nn!21%gGr$mVA)q>d^(BDy1&Kpn7)|qcNp6N&Pc&xK-&og}wbz)n$C78@>A!?R z#CLJZr5MQwDa^hkf?cw(WvzZbX3}a^lh!`g0aFo!)vs4p$F_0^Qh^^m4BkN&fhNV& zG!Va0rdHu6^sc!5VU6%1S{i1Wg&5S+j`l4#X;l%=ja{~I6Kj*d%#~)hZ`2sY?OS{S z23EN-z-;9P=nPGn;cX#OZqjnPRgGOlPaIGV{XU-rK5Q(u!Wf8RI2SMQtZ+s$`~?_}S6U&r^E{9*5d zKF64)j}J&A)elKNONJl;ae+_F?J?QI%ah!6v*dw4r~IDxQ*S0=*ty<2)tgBkyjXtE z@2MZV&(8IJseWAYpe`Q!#bxI}-uFCs6wR>LXRz0QTHjQk!(Kn2zP^5H{ciP#)Sp~G zzrI;|3IzUkDFG4UmOV-qdO}Y^8a+q|Q9u)l2m;cJiUcWA1QQUY6Y8}920^8SCV~Z2mNgGuVFN1{$Uggi&zYIsnTWqz{=fJ0c|U*e&9E~&JM)zDoafZFZJ8=h-O*XeUk!-9s^7(%De z8@eyyS%$rFnyW(Gi02{aEF`Du`|v&FUtFKoFP!-u|1OO7e*PV5(SIj4Tl%kM?=$%c z%h2w+#xp=8LrO;?Z^G+>gz5Fr0iS>lL7!6bse*)Hv~?9O>>b^%q}{@Huy^4b7U|Ic z1UWz-sC$feyTZh970w!5pDYJZ{JGgyTvvwkb;jHYBRc@>TG0LO6^BE1fTqyZo3h^2 z)Y9d^bJgE<;?t08`2H>?pN4R-_hj0+v_Km1>9mxzoHUb98}A_70lx$K-(l$ZrtN?& z(INehpU*s_?CbD$z~v$rK!RW7qMP;oyA!sNnMlyH1I_tv;k*z>&OgeQ0LY%jdB{`lC*nG6_!g}L9*)+alu z_f2ntHJXLp1ox_A)z49(78d)A9PdJs$x<@Vl^h6W-by+xz@eglMo|W&bO?dBvCQTz z!S~e5{~y}W&?k(M_6o+R0mie`g&0bTSs;e>M^;A4HGN|RoqCHX5+R2U(KwJ2W6K}* zwxg(bAbcY{A)(rf(rdTD(PobnBrfPs&B-6e-bDlrnwf>ztO1~%3-b>J(3)w5+ACH{ zA?FufxZv~EObsO$YE_r7GLi}tjVwb^r~LWnYaR@x7-GE>9nE3hW!QqJxgG=Wf}Rm= zxI2g^7;^v1pf%_s#J>ha1Zi*%^Dq7__}ANi%D)WVgX}eU2IzGNaB*&fr0ZQp`T(gO z;8v+beK^2NL7zNCk@y4-mQj+iFoV3l)E;g#+kTDr4iytZb|RZ=B-D0GX9>d^PJ(OY_VAu1Z^;nCS8)Fe}j)hwcp4h}#_n8MWt20k!p3kIppBa-$>pl|$QHTRAJ-mmp zsKSUx!jg?~9OSAD@vmC^h4UGiN8X5g!6S$Nd-f6I9b<#<7~(oFUa)veExWAo4%(OK z9W<}^V@Lfjccx(fh(88dEJzokBSEg|hy6xA;#LG5IHG@K9>#t~%T~#TSL=j5 zB^ERy3#=(6$ z09&(iv+f6dupLB<2sB2VNUFzmy5@yx!)^&`f0tS#|S$j2v!x)MTbi>bjJJ5UU4Kw=c<0obwNENZb#l5FFMe4)_J*&DlWrfj1}M%fb@E^2g%0@aDvu<9)s%V(Hh4yiS}^ zeiHAC-B>PC%XWjs?m4bK5^q-md{>EJeD z+<}3Icc4u?A9Lj{y!$ShNxAFByXm?sg0GWY(o)}J+)r}0IIZosXoFouV7umAQ~S3v zeR2D7?`X*6$fpU1Oit!Oqea|EZzZj!0=i1ei==Y&$9tZZ7YZ5%_cr7GW_v+zLje$X znDo$aLl32QR)*e*@2~goqwn4L9`ppsMQeby5JmV5W+n}X8d$r9Wy~k83FIW$S*PP#JjnZ}49Qv)3I= z(&4+}FgdHeR;DxIq{M|h_tbnFrYjoD&Lx5YqWCq-i5ddL5Cu^kw~l}Q09u~cxL#EE zxNCb%pD}c97B->B2Ht%1qna9O{8l||)Ckp8Hmh6bnkuam_>2*I5si6h&ong+{_rBm znH3A0tZJf6+uN>5VUqz(R7_wKu(#?ar<$B^0)I~`Y|P#RxMcA$!)Cq@&w(wP^tXxO z%-@XXlbp}bM;+aIAvxcQsWADKVM8Z5pX}Kr=Wj6OeAuqN9y++leqKhOQt_#x8s>Gf zK;gpP(Wxb=3scDg#epTkzKssP`(`m2a=y8DXTeUAg?*HX%hnM5j@nV^jtI8nX4mhK z6I-|{PNkerQQ*gNrNpG9rnF1ZrdNz_$fC4`PFD(LPj>6`LX*P;(UuzY~24tkMp=0}8VH=0RT${Oq)}5OyS- zIh51Ie|kvwM>=^}|C-4o7k9r1*G%5U>&yD9%L#9pu$M3QzIINhYv*)%=D-_3qUwtr zn0ENqI%;o+I2@w%mX?WzB59NCweZltr@7x!#KAO4O!Na@GSktUWTk;dfP*^99 z;jp#@Z?Y?%;#iV%yjzo@om3~E0xAG)5wb=a85E^>GX7kAAf9ZbND0h|5A7Km@ILVyyo2|KyLoT8Q)Uug zgz+qvN!-?+fi}^e!EJKd37ex$&4co)YdqTXDeoE79_$%^Gxv22 z71}f4VDJ{=VB-&~***;PM&2*)57~$LJ=}K$;u?Ktj0x^Lcr@SN$?SV8>U*nmtpcs6 z@2yf=<+L*UPHTTP+dlXmuzlPgvJJFGUs{Ly!p~>h2R$FQk4}c|qxGrQ=UbC~xOGfx z>PBno1`gB>niKfr35yitg?B*ipCeYXKYoJjNthV8j_2|9g1|+SAFU1}d#}-^!LBVK zdv6=GsZH%Rk^kLj(_r}D+1}gcK%43|r`nuvL*rX3h{PP6*z#gkgc_!)DJkP$eHn8=HYHA7UE?{}wdxXh@H$WiKNfj2d??^dUTh-}9PY zNHT2W9B(wD{Jcd*s2{#Go(nmEs|q3aoK$g3%;l4y$^l+!Q^YB?)ktJTXs<2i*DxWF z?m)%^m<=Dw z@Fs4tF6Luo?r=hPct?{)6GMjsrdne+aeyz?wQc`MlR%;n!iyVlOktyHl)@v41-6gG zD*}DwQFjRJ9XNGO z(d^$xZh@H<@7T%VeD1H?v~v}gDm z$!>sWll*YUZ@gBF_R*R!+BXE%5Q6?ID+bT;46++g`$&FR2W<`U5@lrQs-i;*e3N?% z>XTgyl0twkk_z;3~@UYu7lsxrvc>i ziJ?yi=-NU$jK;w^27Q8KaI=_%b#2N}oQ7e^P`1f1`lVf`{~GMq&8}ZDt5GiRNg|Y! zXt2@$HL!sLbJ%!3+rXdUd0&p}?X^zE@9DZy#Mi+A-BrwIU|hi*4-z{$I4yNdB#a}2HLhB%wi0sQWEv}Y>s_19AS;SXIJ+UuDK@_xrUC$)bR zbgEa_&yKo@e1DGVXOE)&F6vxVAd3C$Q7KV5Q3X-`ql%)6qe`Q!7y;vbV`*$;fk&fk=K=WJ+XCWI<&A$fC&N$kNDg*nFt| z$L>gwK^YF_*cV!Zoj^WBgkdWP|=Mi)er#VZ;VU4#RkEZBx~ zAMhZfv6EPl_(9>)sUuR{Jcp}VppLOy_HIi9oMS@k2E%XF-Xti;hjsVVF_+Oq3~=Bq zY;Onf>~u&q7Ulr!pVn5uz69%pjftf8p?qk^&626;%v20%sUK)xl|0!IZ8n7o|Y zA6bkYEl$i;Za=tdLu!Xc_3Czy>(V0xNZDxkkb~;emjgi+Rugt`O7ur@O@R+L;J$}- z7DWDkRwA^j_?vwfqz#cf9|0y9R0n`=z~8x62A+bg}*3MdMO z4Iw$qZ1JB0+}*LWaL@qnvPJ2cSHijLSrE5$V%ck{-8K!o0^S{Ct-FW2^PyM5=7bn) z6Uv!|2g}OAZefxnkgy!gMI=wIUCjfEMPSd!2zjm-maQZ1Ah zOjKioVI-?Y5&_2}RD_oWy=(Ng;r``0ZZ zEQW%*_*EGJGVE>$26hgIivA6YC|aig(K_C;hWIL)4psD3al_Jv@Wc%|Bd^PjNrzl!T4M{Ts~v;d8Op+TS{2GCPL&JICkgpWvmwW*z_Cd5mV$^T%RE0?D`F^ zHF$1QXMdSCf~YtHwUQX7$$JXKDThk37=w2MnZZ1>UFd`+EM* z?+b=j8s>SpxbV7gve=W9s)dswgiAW)=O*gu*+|9qt=TC9Gv$-|@JHf)`vt-by>F4W zUHOFdC-^PUKT0d}ZlOad9ir(_h=ZrD72`>uBlrS@?g;`qRP2tZi~t!&6Q?m!XhTJc zK2Wr64?Ku;rL{e7?A25ExM!?hJ;U8?(BQ6k|5oj5ffxr^fPgU}ke4qIk?$yl%xUCv zPMpxbrrL_jv|E&B`f1qWlOgfX10%2REu=6$-dz}+qCo8ra0(Bq#RfCU$qSHZb>Pn- zCYH?}K6KX1VZ&!nxUN;pE?ru-x=wFAWcswB!=_9b*6P~MZQ5LS9gSHJ_zI7~N)>O> zBg<&my6qJsVOa9Shh7P5ngKk+bp(OFhzw(~v}gY|xsBR3Ov@PFrD*o-(hfx(Tegdi zoEzWZuCW7FkwW9TPy2^@t^Nz%h02}4Ehtt&NChfpppp&?aqzgU*HAa%Xn=*wo&e;` zPUUvdH1YbNU~B{Xj54^?YiHha!-m{eou=G->(x(pXwgMKHfr&0UE4Oi?SWBUb3iY^ zrv`oAsQ-u@`#OZaXdx+}S#Y@0p^RD-j1FcP{vcoixkI>#cs(H}WUIN!YPvG!OI04< zr3^i$oZqDX2owc)By>qm5XH4uE)(Aep5^&QOggFr1}EA!y+J~(HPOjddJ$~mb}W&- zw{|PI<>ta}x8B^mal@>vhK-wl+jZ#Bt_6bz6*SDsY}7OxZYWXnzV?dL+)1EKlJRYC zM)T9vT&XSbyrR7VQQal{#khC7JK4C`9v@9zRnz@H?tN{xJ6S#fUQ@GD`$wQV<`mj= zjhmJset)ZWLauS&3m%sXs&?hn_wcqz1RY{3p5UT~@xW8hns&S*+dzxSH|yH_i$&kA z!+VFV**vVP&`xa7QZuu&rc4;tvv&l-?=Y@4t+g)#appWi@`crcU1uRVVsCVvlsY-6 z?pTEfx=sv%HG1gR^#AbdkGdQeY;=0rkz1*&3X! zJuXKCI7CyKbmD~E{Wi5nxZc!$M;)x`_+3L9Yp%_}g&aapFh)|is&|iaPnS#ScdF}g zU{;NHzkyE_o1Tra(`oFg?L35BaB%$v2M-Uz>j}3i9#f-^f9ox&96I#iiPDD{ze>c( zOP0QenA+*sdjt4KZ_n4e828Kl z+#aYK+81%cyibb6=GZv`(lm*#d^3o)2=I`3 zT&P?GSe(MBYf;JjHee3Ucdc|WT5Y=Ex-S4SmA4;Ol6ERdhqX1AQC0`oF~<9;E+5|C zF4!LOMZ2jbn2ouh!wi#dA}Jog%#`PFpg$0gjTVhGc@||#G@uiKQth@>ps3o)owmCw zpRpDafxVEJHdlS7X82&`qCaeqy0K>5h7D@haWuvQy{9Sxn|KPeY#)oRt;eEOMK1671z3{$zBn!|} z9q207E4*PE*C>OD7_oEcy6t@sitJ)CND-I;pg=+Xy*wev+#M#A-(`0dSj$qJlBsI7 zKT8#_EARL})XUc>*DKerDcAkSXgt`a&+UUvALn2`RJRH3g&hm?Hw5%VII^+e>FHE~ z7+SY!qUWeYYovHSF*x3WXe{%h=;CM+CAs+!;vh4i)%FDhOTMkv9p$V8{FKxuk%S~- zS6E_t9$ZZwT!1=-GcG?rHap9$!yOkEo1D~9?eG=KgB<y~(Q`)#aBbK9^^-4?k2zUYUf;asRmI;AAJ9egxf}Y7 zT3YCHXPzT?Ec8a`a|8IOt@Jsz>{y)*VS!-+xfp@k}Pe)l2qr4oPaS*5ez_nZ8scim#plZ83R#Klu&DeP>i!iggT5Di0|xqW3JQqvBsPPCQT zkqQR0FElYBE*WH&n?*6@jDnY#poF22m2z_BroZld=D_1+GWOe&g>WTb6!{D9IxnNQ zG!QA5?>&3*;@NvI%Tx8YY`9(IZl56U_7C0vuz9^F-|xd7 zeYg7#bC1Se-~LyotCe_u7Vq7Nn1b(c%#eN1uS0t$X}=9WgA<6221f3{Lio=cV^14r z+{eUaX~_5M1q<7hybwFr1v0qKQ-j~rs~_ybWaDEyfalG-^>xnGm`|=vn|r2 z8%8EK>5|!JT>bp@V-KA=d3bzzey;xoR3n&W?X3U>@=jzrgZ(j81lHxMm_u2Eeu5Z)&;G*|`Xwz19);&AU`Pa^#T(qKW za?KkZI&EE8@+|fjtjD&ph;i*B5u5Ft>EM=YO(z>Jp>cX6RE9PJpH!+VRwx@4L-W;f zqHokqaS4qFG%rx&)kcTq13vkeBfIJ{vmqJW2wnm%|VFzc>*wTv~ zqw26+OLxaE*y9pA6<+M}NCc_BeTpI+nwF;EXJVZ(`COBmYcgRwA%1(;7dwhvu zJU#Yum?A$GGgm&$F%r6Gty_NA=l91<+iB9rqE%Dj{{CL6p5B>c#zpX$@_N+zf>O#{ zo)(6GnB73uNLofzyYB8SY5`F$K!@TMknyVMP|yNKJe*FaFA%6oha4O#DqB>wfQ*XI zu$7+39*MPS)ij1*IfYGC!l_qj?6P1RuXFqUn$-}Rp-q`Q^ zj$EEFcKGPChhMs=E3YgcH)HnHyWba|4;|inTuEQ|wq4Jyy>($~`kda6ZQs4z-E&M) z_Zx>kMsq7%cgqp#5$sKAmVD=!SvK8TVQ1{DBYtmpjbq6;LWD#jF!iYqRDB63YNiqj zT^m!HFS66})FX1|qG^-vNZnGQlusSlZPcJ!I=t}m@>Qa);(u88l*j?=&pbTip3;TI zJ90`>hV|^w>7%D-iLTFxb~-Hyw3+!P_*$^$1dBP=41O z*{Veu!Et+D_t`??-aK`Auhz3{e)ldl@51&-^2|)|?FMRdra#4M-PyS4!z<{Ml15;_n=0OF|APH5t>D28Zo zB!Gq))TAX{`1s>X7eD&=qCZPXd|>h7`;|ohcMmRJe4o+^6^K6;Ek%;J8Go(hhw|Io zm%mF$w7@9EBEcpv!5fkSl?17gh0(23x}@|?8JRLAWnRjPl(5^pyKtGLZUJa+7{Ai< zjKWSvig$h(7bMA6!@@-Tr{cc+)Zty~bkq_G>MvT~Tue;5p>@58`f6lmD|_|Ltt-1c?#0sW-*r^aK0W>}zu&TM%B*WUe+c)^l*rrdbb$>LxkWX>8T@BCG5W^(0b1YZtg7%_<$4KcnW_2vXkTE7hXa&HlTB zWU1U&Ge+IKk@i2TGnD~;69cP7FQbKQ-L+bH#YA!<$OIcfV#(TM3pC8AbBWeKE1^|u zl(|f_%3NlA>breizE6k)XMXZ6T|Rda%1SL?A%6W%p6=4gA5c$;3nEFrDgXKU4_~j4 z$GZ1<7m?}0HAW5xz8J+!nk{v(Lk`Zd*de2&nPg;V>5Ux#$Y`mv$R&{JLySF}o=S{*QAPexl!q&-p4J^ zh-*Lsri?KUG(cl~qcO$~zoDfMLI-r%QJ}ZmM;YHbM>)+dQ@HZeoROH?Jo(+I@raC3Wix#^ z+E5?dcL-M>4vKu%yB%{A%y~1^a)+MkuxojeVmwW0QMMKFUctp&oW zFHXFA1FFzcagV+X(zEvwO4oD7-g)cu9fgs%*1xm<-1^Jwm)F-h$T%gm2f@XJnCWEL zmqk2-;{|sXGKs0i)&p_r$fC6^N4n1*lDpnby{=WgI!S7s%%~a5JCwTRh4)426KTU} z{}G7=TJNn>{w_ZCUn>)O_fgbs?uaETMQi^FwVqf!XuQ5wuYF$=TcF+IYk)b`cPJfa9(*5VQ?G~-&@!i{gI8Z9ozW{5A7Sf!VGv|n2 zfpVcu!g_)o;uGle4-h63+1%k5pB!il4*_8^#UjS;WbCi~?_<3vxa7`Ze-(!UEUQ9L!-iyg*aUhS&R()3i*ZS zgl!X)2!;EV$;cg4$PTJ`AO{onWIv`fv!IH@UL2Ga?Xnr9@g|{VLJ>?Ep;IsmBU~xb zD9aHWn{P^%Ss9s@2?^#dCF1q9oA%18fBq;x@$D_&v0piX3OHwa_w3g1vBhq!?sd;r z9oZw@@>{t_j1&>5v*w@tcFhmf;g{u6$e>utYxDtyivA4$36~MDY$~S}*L*NW! z9uOu-H8(zj9Y8Egrs8hOSGjWsHf!H7Sx<^e%a4)A56a`Q`Kk31^`!dk(+AA$;Ejj& z{_(ttb?U8C;oSGn_U~7^DfeZk>*~6CbtcY}lZ~3{it8q(z2m-40A zGwzusddu;92X6HL^X9#`joLec7UZQ%ySM$w>yCX^e~N9)IzGq7U}}um81iw=3E?+@ z0;VID(TusYa^^#WVg|klSBt;}y#g|OW6R3Mx`{<59Pz|r7RK3H0HmKZv`L4e+N&ow zBCIQziKJ6wT~pt$qBtUP7xSol#iOA( zBKBeMSi$E;TnI4;f$w1_J_HG2PB4y}ZuokMtA5k><$uAd>iR6*DJQ~IH*|f9rtMl^IHzy=y%-7yq_vrJYc-(z$^FP|Q^9yIInRTK>NO+D49ibM;O3aUfzE{2$)0@ZMMhR1bbqu*Ql* zZ4L5EVmLvW5jw10X@vl9A1>rW*sX>bOj~{$mO==(HceF&7+#@C#mCZRw#sT3#Ds5z zD*fO1kIQf&KEB+c`D06kx>!tDga34o|L}!Fhkn-+{XfWJS++qm5q*^B{W< z*`z&|xt5MRJFM^AV86s{<)BYYJS&8h-}sNgOXyP{5EH3SYG>sh|GF<;d;L4*aetBS zsqy>&`N*`AHK1eorSuc%OS0uFWO2`Gxm~qRti_t*s0JLdCZxmyRl|u@5#&ftXbR#+ z&->5!-8||1Mc?xEw>&k-Cnqr*>YtEs{Cn9!yt{p2Qi8veod@Zu9Lor+2;`)D#RDN8 z#AC@k2oAv@zee6MFj>SwzQ4QZ34ZNu}<`;w-feU{_?4&^ZPAyr>Rr?og(fSpd64%8>A59CF&pz7Xw9_($D|G zkMgl;+T2hdg7G1k|Hcq*+oR2it~(3~>52wj65yh$y>(SKLDtRjRv`}3u8$+?h{Dg@ z)!uNeF0CPy_KjxWZ7hP15Dmy*n}#YFrl1MJD?U&*fG>)(`({&DmNw)edMK4mul4X*K{?Szwb68lw4*L2E_XNjdbLUo&4qis=( zw~D~QQh=!Ft)#;_IxVFGp@xwo*T!wVYJEmMuC<{xcen&WQfAR6EiJTpkvW=Jv*js6 zeW#4vR82d4|E&AU0D>q_%h#}l9opnQvajN$m!5z6#XT$k`Wif(SDg|cb6*?9xE4fzhgTYF4 zTWICRAgHY{a-=>*pQn?bOuwx#qLJQ8@2vOHQ9l@z7>SC)36U9*9U^-~YPS_e4vrif zd3WTJ$Tg8%I~vfXvDvUU=Ef##V90KNcN{3LMH{AEej17YyP#p1vKIIj^3x2yg^Zc2 zLVU=QGfB)c))Hf{*y3@t3+QLG!@g&A&0!%An#{1p+UtSW4s{`YBTa<|!Pq_HwF^EJ z4teifUW*6k2#o2a0lYt!$cN1R(QMbB#OWY@3hj2p#hCp-Tnu;u7M#f=f^jT3XZ%Ct zx4IGGM&CCBPocb0H?T)&ewlakdISfgiDQk$>bKQZuLw`XDyvuq=@m{-gn)p1pue_) zZWJXMUtRHF{06SB;wS@cm}O7~TIt){EqZ+^)y~V;HRv9p*XbU6!?jt>W&O|9u-DY_ zmkX9Ga;uLjO0NM!v;wqGMf(owKj`0sUo?fB*q<>$5^}tS2)y^kB~V#x%IAleU$+hy zs76J{Fk)}7tk5a`gx8B7EA1L_+T*hdJG^=(0&qL%-v7_ z#OJ&8`5|n7m-m1jhv_kwzC(l)ponOmVIiUTCiwQcaNX!XEM*5D4$?csMw_t*F9c23 zE+ntL>nrlk`RSjB9$Y{1z*wSd<<=$*kNqItl^u4JHg2T6Z152`^)-?rnXmkE+NSJo z7dRWxQ;?O;%sh;T0?#4+p)lD$Vd^%W{ zrGMM|2fsdiKlE165Ev8JBn-aN*cPqVmM84Kq}ks5opcL`g|sgxfoHykk0e*X&P%=J z0ku|@CCGS{I)tA@f(PVrJ3>k=@d8duhj@W1GFK2Ul9a(>!nZ<^DENL{PN%a+)2e%Ybg*+xU)mTkk62W)Uk&SsU=QX$lr=amB!VQ*Qm{AY^#H6gWSp$ z&Wxc}yTGshb-N~ph7fI{@l!|g=z09H*67iCdJ%ehfc13DFmjVP=RRi^959Te*3}&`I)Y~?%lE7 z=YK=F&bNJsSN*&D9g&O@Lcf41{Vbml`U&@jJtE@J!14x%M5Gti3B^TNXs031B*H59 zWY8PT`ie!W>?E{Kg5DSEY*5xI0w95RHx3n)$qLJA6*62aD8Ch%=Ubw7HZu#MB_lxr`<^g&fOqn^CJ^rYUmWSWW?^~5oiFoa~>G>A7Xgjr_JcyqlXS1 zMQI#o1n)2_ez%$bek_eKH;6ibR@fqctChxx@fi!Ac^8O}Vh~Jwo@0eDKLOYBCb@VW zB;`~@C#57I)2tw=KmM_kn^)m_-^5-J9$#BufREg$TTSX{nn*J?pfu6peKB<98WI1K z_`rwyL_Os%8=u&|UPLQ*b$t7w>aW0QuTegGY{`=Cyti{M8~cBI@Om+9(6NxYTT(=5 ztU;yLQuao}QtHj2gDaMjr6Ag&C$aP?2^w{1*u4!A14-XIVQjI^oiMiTgGC82FZosq zBZrh7QLYVh6AgTo;ZH|iKJBrh&QONRhX-E*k0>_o29x| zvyVT>cr7=KHDMK%^{WVg69AA16`=#84-^BCfPgqn6m|wFz%~9BF(g2XWXMPg&$9_W z-tg%9=IF%OWDan2M*t7m9IWcY2y+W6g_)*^k-kdo`sn+SL&i`0{E+-mw3=E{GF5)~ z_59L>^S{zMJ^E|5U3~e^}rvm8btH7R#+aiaK+Bb4BEja*J5}Pw}B_MSse*!Y{jt z{rso;-{kg>KpgAy95)9PS0Y-rpk=kIB#c+y2_O@(TkBF}&vI$#)1y{DL zq5{HOP&U{Rh?!snVj}ew5!`=>jvTh~3iYn!`o z$=Dl*57^56C3>yFd_|&aD)*PyrPW{F#jTSd@zStZGf7NTtM+a}s^s3j+DL7R29U?O z+Hw@MH`Gb*QotG%MszndNo+c+aRC%>Qzg}WXpyqn!GmsOs2)<0rX}IL=UgFfA7P$~ zFR;AGp0(b@E{Op%sG>tk3}KhV^p7cuA?y;mv>S)Lqhm^97Sbgb&Pdgy^+_>UU3oqI zzk=H-D3BH7VQ!<8AV^tfCl~pA)5Z9&RXIW&QGd4Mb_V?KBk4>ayTF(`r=Dz0S5R-D z>9WKz+Ba(J$)U{!tspiOOL}sCJ}5C(t?|j#JC9ziwU{)R=Vr5fPacrRpB6`d7w;M4 zsSm|?Mk8y5>4&MrYJ+3(1idBB2BCGq@F!S{M0G_ESPK-;%vf=^SR&R4SSGN*>QwKY zUuR{VO-Rl2P63!kMV~si)&Z5VE<&0YTP6&!LgfM?$A1S+RopM1cl)GJ)T=KaQqC#< zXxNhcE;QKW)t8y}w+8K>OxITP9lXohu(+32U%Xog4KzT9VuCa!oKuKe1;FBkj~mI! z@NrY!q3IRH;iYs5w<7Z#*Xftj3^-JT(uP+Nv}h4MCkF@8=WWvzOqXGOOTFxqO;M}v zw2!npM2WN($C($`jybc|b{KMYxz&!&U9mq{vv!ki@Wp9F2u*zI)ZpF(9hzdsS}^Y) z%xeqpr+QlOCSGm4kL}skU|J+--}pSxX>Fo6?42MwBP^I>uE76Hj~7cU$_-;4-Gf+Q z|Fhp;y8PY#pAe3<;?DAAOP9?a;a>4K(cx^%uSMReC){I~pWN2+${cUl2bq6qCOR}+>g$Z)a!Yrou84JL0KpQawVP=$F8gCg^-GVXi z?r(lWs;}9Aoc-?}eKluLGhb@27O%al^(bB3w0&YiZtCLsHH+?E+^AhbLfb}*?@=Pa zbFZscS9~FpqGRP7@?zrm@=Q!UIb3Y78zq{2pZMC35#cpIg@qm2@zmR4VQQQ^{QLbF zA9y#^<2*jMGHsN}&Dugy=`992DUQ%(B!thvkK{ zkb`!Qv{>-Q`9A#r(o0s?)vcEg;cXN%{=EBse2NCuJM1i0--C7*`xqNW7L2iF+987$ zM8*gt_l9gdJnF%hd)~ZsB=q{4;j)Psgcn0zZG!#vulQ)QxA4qbO|ZCt*A*Vgk~)V1 z*uA6Jq3rG)a6*T@1r`jFiO5};mlm{PC@CW9z=t32mu=;n3ZkVakH2G*a_G&Cn~tbk zP$F91HErmiIkZlngFR>++E<6Q6T;9n)+vv@)kq#E>%`L0n1fnWO8cly@9;qXvMC%G zxL_-hJZ^VtPPf|W)3SWN%O}jHZr-=%kxJTNA@>}SkKNJtMsh1*JV{=m?TYLyu%2D1 zwV?(&4OdsN{g@+Xv;80}z!*2wKIK6(TM}x8;2I=nz}M4Ui(H;2#&|g-!=MislVwwD zYH@dO4nen7HmM@GHhhNoMuz|$wwRx=2bvIW*dPJn=0Plh&0LIuh3*R13M6Aw!3_$< z`N+FSLol}zKC;ZKxC2jq1~&BRO9&Bp;l6PT9t>AysVG(IJfOZXXSjR$r}C{cEx(X& zouu93;0k?%zT_nyZ`ffd4muva-4Psb-tH}eZ~(G~2m*49l{#2a>8f&3CtcJvIt1uY z>>{0(4h3|mGOzKs=s0qT=@%SRX{Rl?J8gU99|J_vIwB0jW!50fW--zk0gTuWS3=7-ul4yJN$v%{G(C!B&t4v>oN3TwNWTm9K5e+#&di?|8J zpTF_9F=IpnS##%Iv`A1lWTg0O=GIB8UzRWQxrvMOjKB0?46Xjg#5h6@bgXlcqs`90Uu5YKK%>(DrwP`!KH zJ$=x!R=%g7_K5^-pZtkRYy91R@~IcYBi0hWw<`X!uwS>De`x#4eLfy@ws#P=o;Zo| zq}l<5RzvmoA_xyD;#@=^LZ$kl5h)Ql5d{(bBZ?x5BT6HT8g{~UC;YfB<}Dit=alK^ zKNTCjIRuWng$@Ba6r*HiMOEXIjR}IPF;*I`Lg=PXxCugc;{tqDQQ5evF$vxHNkwtv z(#8OfBB{kK-yr2(L9>=jOBCzL@D>z?%Wt5bL8rFQGvKX~T0)va?j-2Q~mH=@tYC5Ofi9ylILENgG&4ft>WOUem<)|BFsJ462x z{|Fq#x}$hB;vYa@L0p3wlI9rqASZ;Y%)V>Gtpw{kimJnTY?F1!*JO(?$K{D`%HMw5|3ffF4Q>9^rz)APkT?oEzSUv#3*E^qZACo^*Z1w>E&7d~nT8s69S^|i#dCC}vZ1gtUS``jG zBm>`MSmR*j%X(u|H0pXRJS(wPl!UP*mh=yDEyBr&)O~!asER!qt4zb*=8e!&=yq&t zHh(-}VAuqA%Cfa-Al`?G2FpSJArgO98`tVBJdD2M&K#Ql|Su~*(me;jvni;|1BMxm|HsL<9}imeXr1J;a& z{3vLi!>MmcBwpRk9&JP>!!ZVuwoerBFQTgpV_QdeiS8RcGI~n%yyz9t8>7Sj*xu~) zFy-vzgVSal7WUtw%SgDK5u{#*4r63Q4@We11Bo8F8=ztT-M`kdnHB?cSv<1HT!pJU3eUnBeO-Y)U z#8HN6hzrF?8{-W(C0S4~;$p2>AUe=+KgvVDS-y_i=>;_M%B||qO9QO&7cWV~>DTPU z3=qA%0-Mh_n1gs^Zar-D#i7GHTozWxc&aReS!mv@^=9qt-pDA077+D6BnVRfYxOo6 zy-nVNx-95za^K{U$y1W&C10VphW?(WV!i|t?u0^M{XBK7h3&c-PAe>5+!OgLjJYO_{iyrvGo%- zG-VrgTIeD%PizjDH42HPq@8R^zo+w#xtK^yZkpCN>D(nm%+F}xi(Rt*0pEr5nR2%F zvVTh*(b&IVZTtSWa;3O?+k%$$IF3YU!D0+Y}=5J7)aK6rDm8O&gj$GYxU-=s&(f z|I=zm()`(+2L}Mt?*63KtoH=mkWYDEeko4>*}U(YD6a!Sq>Il{(vau=M&M#>51WpR z#XPEw)jEhS?%3UeorJN~hC${nrNX=C=ukz696F@523m3Jm_4mRGwO|Q)tVRITCTfSYOpFmK$jy6gd2 zE!rIuk&EwM^q{Z|l~-xLmyOc*{kPZr@xc>X<0a>NTa)?^ss;;foWtw{GDn zefv!3yq-gwmga0PUbOJhnaloCuI?~koE2AZjMr>;Lmsb#e;6-|LjG*LiZDPGm948< zBStKzbwO(wi?(36ya75yQ*ELG94e|>pQNvf&95L&S)*G~+`1HXjQ;P8uPyH5PsTSs zIKCT}Etoq)zAthP{5Ij%NyWb$xT^28Y1xBi2hG7%CJ*k@b?C;YAL>0b zJ#Eggwa;O2hcz(<_tqN+4J=n1TNv5U+lPb40@Dxi?2FkhW#-xAd>eRh2tU-o1p*#E z@gNqlELLR+G~RkD=^pbCO;g{y%EJD!$y_jV+R`w{aO{K%jR}@bK!_n>|0pDr>sAV+ zt~fzLYdWZ5pX`11s2Wyt@#wQJeXIl{4Y8w|F^1O`ye(V-*V`vr9SOLQBd8h}V356y z{){sE}sie_D{NvCz&?TD;4R0nPqF7e@JghAE zFJMTFN1AIgxiM}>wKT(GPq-alE-VXI{Ku8>vW4>>id2-AO5`df8`aS)!+qXQa>mQ6 zb$#{AYTFl<>-vKTDki-O@z1Cua}d&JU!y;cOg`QSt;q^9Oi^7JMKKuT#0*qcc|^Do zWZ_8v1}8wac6`TNUnmFv^oY5uF0OldFbw!gNKob`-UJ`xLN&sH-xE)&lb z47hv`wl!`Oe8XBjtzRf2o10;+SKh>|lVHLg+7!`27_CAK(cOScuUIHnQ3eFsW;11l z+J>ZZE8Coe_A@|!d$h&ULCtdOCn3K)wR4pGrF-#O`SBqO9O)-sgtB@MaCybzBVK!+w?for6;0^>&b19$6+I}Z|h zjtkYfX|=JmYE7V{NJdb`q1&u*6@v7zEi6dqdu-?(G?LA2ixNsB^If_WKSl-LhrrLErvGPx_|x zzSB3Y&mDL4ndZB*_Y_)`o(G#OTF~HOkBFp&xo35QduKO&&_e;h3x_oxKe@rEg>TEt zM;4B1FlA!nVGG|O`XQ{o2ep>kUi&z(vSbkr6S8&UPzHl}>afe$#{v1w_Hh6=vX28C zaE@^Rf_7GR7BGQ=LjdO+hDO->o@W~qjZF=9> zx~H#K+g|rhYBaO_r=;`cvm2F6YkV(0{=DJdMoN=sOL{h%a7Ux-OP)>IIju*d+lm_X zoVF8uifn=7!bTv*q7bMd+YCxz51d5_!KIAayOH%cu>qkJiPee{8eu^)KR~vQ2V7SM?RqR)=eE~!MRtC6ZlZSF{rqR2zcAg?KG#!H z@!6-l-6M<17I|pt)LW)ayXB6yOXPV*Hmr(X}n ze_wy96rT7>Q&z8Agpx)<>#e~OYZ#k+dE4Zmx}cHOT@dOksjD<>H^eOqIJzS?l2vku(@lBLDde! zc5pLDMnF(-M1rM9JhsXK95;m95MkS#Q_yUPS>!B@j$^YIY!r1#uFXq>A1^&mchYE( zCW9ZuhiaaXFM8EmuVfB)ubVn`!Gdr8g-u*BY~uPJ?x$&6aTvn?(|&Rji_}Phq5eo#2Ts8UN$MTW``{Lk^yX7KLf~ch5v9H)cFXUyI zT_G2Zk&75Z?hoy@EMGnujhdb+ zTE0V=aIkTXSpm$rEfmw56e{3<1_Ph{>xQyu8b6EH^|Rl zeEuKuO{BuH)Kv z^$EQO^cRCwW~)_!7bRxrr)4K6iY2>+k}7uV%@&C7rij1s?=I`f>M!m@$dcLYT?m%O z@vxM@H9KJMi?x;}9@ie2AC}3a8C1nQkv&ah^qw~VFP*Of4(H;w`ucfyP05Js&~YAg z43`itJyHDT9*+D8w2e%jwuj~Ah9!py*Q=uQK>f41D`s@V{jK#xCC$3OR$qA25c7B& zNbEKP3_aY{Ssn~KuJ4BBI0aHv0kT+&VBai77YPjvNMiTHCJ70FSQT)5UhBN6enSw$mXodq&z$$HnZKVmqA?vu9rD6obg& zPC)~EV(oL}r%|FnFi^Jk_y6g6?dPdEie7U2=xLfV@v8RibHrDQK5g{q>6$XBU2glf z1Nn@;#95B~z;Wsy?)a&HD83CnNg7YGetWIsx!N!8{u3tjcem=)sg?ZBebYpIZhZ|t zM}$86FNQwLFWdv}xMKkBxu!L$mxO-%C-;LE`pL0jE8%m}ToH%{BMgFA7912XyHi*K~m{1ZMC4A!5Y?M+F`Fdg|R%D(o@-vg&$a~kbGu3Q0KVBrq zhpF0t$T_2XcB+em(lko+lTTir5hY&`x2PKx(X~gW4AlIh$OG4ltX8p)bUmbwj(xP7 zuS-4ooVZ=vR!UjKy>cmn` z#ebS>@dqC&#uTGT>d61|KGf+J77n%6p)p$)0CJJp5~Sfq75Cf9+F6BJs!MQw6@v8*kKXvplMd>7#uGg}WYn!6u$LTQaO|*9zG4MhmiD zU`p%`Y;S~%ufk|y6P&yWjiPa{H!+$}yug@X(q~H`*mAZzJu|I+es+E`17M_y**>Ms zS)ok5Z^oL*kH~dm;!T~V++Ey!%^JB*>E++2d(Izx>F(7Nx3=4mbnnF3-EWyqHYEdx zwl#F$MC>uM3>nZ7jmxr;wMVnoX9d(*3a?j*qYO!JoiK7tK_KFMN%($k;sj~BsUbbc zo6&&$#oo+RLjOR=5{w=pdJbL8MapCdyw(V-H#(}dm@s+9q~SBht9K? z53d|LD-$@j13OKbQPfiWdTQl8lV-H<-ravrKe6n_{y+k`wC{(0-Tl9H@6&A7q{+9; zL$|RfKLNWzhFfA!&IzK&SQ`+p8OxOBfmUuKJT#UJ@d!K8GW;fWcGuC2@p{io2JZ{HNJiO7??*>p20@)Ot~_pTp~a=@C*7xIhIj`Rc3#; z)hFxSUe1T6{ANmR{%=|_L!R<&+^BeDqDU2=!AbL3xp;Gxp% zY;Cp{85?BC0|jHd?d@JAp0TFDEWiXJL((LLUBo#oE|^ysJYy6K1dqIfTxzNUIHFyC zIpbE=E>_+?T)~y6WNUd8c(NDeH=6R$yOl?d`NyGklo#-Y`Ub`;k?`-$+zSU7Vo>1# z{-L9tafw(D*bMi?)@~I{m%t(-liaH}YJwfMAXqP(%c!=e&p*UDl}Wd-zl;Ijwi z*XfTo+cbU64%rk9!9LYkt`D0H+j5q80|XVOu6GY%+gGAo?{1E~kt}iAxUQ>weU=== zct2U^#P#)Zy*8bnk61Li zu2Kx7vHk)Wtptj3H}UP6@mO=oW=ZQLxC_w!V67kn-kyQ(D+%rXToC*opO9-$2gbdJ z$tA+Zd_)ABT;L!_mRlTjvZsy$WQrE|f);!~~pvaJf* zJG9XB;gp<*8d(y&@h+N5@G_b@GoUMxq8E&$P9=Y*@7OWl*|Y1Eh!d*+9c7e?N_D8A zxVU`HnsT{QS*rW5_b2M;XBFnK9pXL{D4rZ~hUlj`lia&2PM*bXjIs;6sXLX_6Pg^d z^VznITAeVG4(&aOV>{rLdIH2Qadx5a!w-F5f4x97|6V>Mp87`oBBQkZ<&~A?{tv`X znc(+gO?5{M!g9=24C)1jsLNVI9AsdfIA+NT!SIGFT;wGjm}5watT-1Qpe#vBkmT%1 zM~9HOXiMGlMhOb=G22g>Le?Cp5AF2H4CV1!Qvd28YmX7QgV8 zQuYcmTHtf0v=*Eqz@D;T5M4{jF2!^xqeB55&e2U<=+K|;JO@V{W_CCIzK9MvIM8lr zUuX!^vawAT7)Vqg;fI#kY~@Y$I{$q>|Fr;$Y^tm-zx185#6KVXqCP?n(h>KGK0fX2 zqcw{To_OUxqP>U?rb96`y2^DD-K!uQ0_FOmTNPwUpd?@FSTyw$KS90$>t#^;{7{7hxDf+lm8eEHJeFQ(m*JFURKdHEK;po%f$q(FNV?_O@&U`Pfkw<_2=O+1UQN1Xo;eem6J+Ae~_;qrOpS9E+{yA&Nc$lrhw8jsc*8ebm`8-742KnYN z=KpaRDV!-ML^HwhYv!Vo9yERy6b_YvF;Uo!(3V^k1Bd8ez9AWaDca+=Jl?bO(q1Rz z4{xq>_ZqVG{-jokw~cvj^~0WSU9v`8^?SE`_chn`>FI9MzHZ|tX=!4hyymEgME&pG z4|IO*XWiZZlhO&V|0v&>RQzV2$U0*6l(}1Vy=>N4%-cjT}1p)>0H%?jXJn`0A+2QYX)Ms z9&v34ve`k`an~2FUtLkR?bYz`43|2MZe}ge5y{GV&T!MCR*w-fh$5D`$}}jJ4RvfA5$5KJP6M2?G`5xF$-5g=iDfKP*)=6*<(n8w#m|?>N_Wz)7 z^qx8AFCJRHZqk7?_(0a<6=N^Ann~cJRNU?JQmnyjqh-mS6Z+tXogv3MhjjsX#F*O@;XEqQ+Y9|V;IqZkv0I-rM z5A6FGl6vmKX^MBl(>~u2vE*w-8Q=8pFE5k7HG3@e;X79?H!MQXcWM1!1%FpL^ZvJJ z-r?sO9XNsO4auj)@(<+;SiUU6yzj#p+R3gLf+)YdE-c>f@RIN*W{C?y<54Ms54}}% zND-v#;!sg3ss!n}0!m*o9V&6CC=*)*^uYqUaE|WXLWlnJgL5K);6?9ldQ1@=a&SNx zww*6hxRx!egmxO*6rFkfG|5nY-#GN#hLpU<^^nGYZ4du-KFs4?%Ib?3o_aAN;xWqI zS3Wb8VX_DJQ3>}d8E7aL(lL*LwVm)7SSME=19SwsFdd4iH&sYsAYEAWr~aZ-++Qff z$YCLcn7SQJSMfV2#G-)i<}v%<=shJ?KeryekB;gd+vR$oW5H$!RIJNWL%q)=s4S2I zXoG#EEO)Ve#PE&cI{87jFwL-i1pd!)OiPe2xE_5_zEHs#a6jY=!Ws(67fOcpd^ZXR zKz?gy(4PJ(KW9B?^&&t28WT$9w+blHkfW#o0v8rg3)cz zl0rJ1$J;Ah?PA)|Rcc=$4rl=Q`1e?>w`1(wuKT$?oe=9dkFgP+HpUk6#vC4-=H}SE z{ikEY*pzPSOE2@@#mI}j%H>^^f%jKuoXWsRq-Nm#I3UTJK6&sJeZuHulw>T-PFaqT7E|a zw!6u%65l=!5#fMo{Xew531Ae(@&`QKy*nFnkU$9G-rRu@NVqRCfpA~pl$#_#2;s;k zAp`{^h;kp{7Kj*B6i}39jZqN|K0yT!@V*U-Pf^t1jhIZnU-iuFfxP2;|L@~HJ2SI0 z-PP6A)zwwiRnYYeV+GoSwb}*kAEK69{;XZFcUY&+RaYN<8}a$xc*S}~E6`4K(oSo0 zk=m^10_!!_Hz{^wbieDTSkT*6`}yBNt3~zS3(bljh%CYHE+@Wr)d16#DKY6W88K8vj6EhPhN{4YtRkj7=2%Qs%=wt= zn3@=>f_^|1F(vq&Mu*13?2q*|(3sI5hFC7$TSC)zW3OD9kwjrsT#Y2Uiwub*x}(uf zrQ#}4gAx-G!*v=oWP~6^+NP-g>~YT=Fl7YUjMP}U=YTFRRN^}+F92_!8#(Zh=c%GP zye1s>iTXul#(u(2_7;##BmP)BVB~<`?2E4bMh--)K2crIaEo2m6 z#mlb%bAVzug_BU=lMsqDSIEm7#Ov0JY^LRW@{{)CXQ#9)2(Z29j*aCH9N2CRv6kJg zg#}%D<<(0@;*7ne`v_ibv84kTek-z1170I=uDP<^0HQZEF14l1ZRZQ}e}Iu+6LsYT zW6}HHYCn8hrG00>_~3yZVz2eS+qKY;FHgVx)d#Ps`TKVj@7uBuG+Y5b&(!M}-_vq@ z3zT{`41P&67&jpv@942F9>zOgVREWUK@Kcn=C_o`&G>en@`;B={|%qk>!Uo4sE=qP zP0y6Z}1)JAslt+q1>%VK9btt zROE%oi;-6&ksPHZv66_$(UF;v`H?Flw?-a_bVi7*q zM8qV=q{fVn(U+U8F$ZFtF{fha`aV~R|NScL(673f#hYgx- z>Xsq&cq^b;inl^E8>7>#o|}qjR{wUMa*u~*{|#T&>jTZ|@ms)G|My&=It;^27?2RY zy9WjtM8U+L36S1zf}z&>s{w-zIlEkdB1mynQ&OR7yNnNmc`0>Ea$Z6gCCBFpPyNy$ zW7aP>Pww%N`W~6@6uK&+xj4O#VKo23YQkv#(RET-N*G3^1d-7zs+-j`qvv#;)GVc$ zIWLjdi+pp?$2{O4dt~LGIxm5|3cndVuQr~So4iC#v(b9@VIxI}R}w8%I_zwz2X=Y1 z+JxQb%#$8d(Ms#yHHeS#$}c2nQ{P#XF;dM5+U7OQ30k^NYM#=ZdV!E!71gb3C{P!| zaN#*c=F-<3;IbcLs*(K;{XihBII-$j3VKrp?BE}M?~gHg0BxZ^Gv)8jZS=eHyXSXn zw3Nej{c4#wF2C!DdU5m?W2x&`%lPZ~LgtR6oG|cjo~=s}(!b2y7)n)&dE-_Jk_crU zu68xz(vt%bR=oTLTo$X0bP0VS+yN0LJSc!724F#vnXpihrkj!KTfBFaJ$^-dNPF-{ z_ITN5ZT|OcEF1r$Hm{tQ)n)Vk$aY#*#+TN;%6rzWp-wV0&gu;?n|n7O_0RteW{R$& z!z_dWbEwpI_dLLE`SR-3uUH?~A?@Q!m%jd5`)C*YT#I6RwH)?&8GBJHV5M3L!OIEb zmO|i|;#u|qmUTJWM`I}0Xh;%1iA*3XUU;r)uEz|Iz`#<9)}#|O>MB*#hP&PK_-xA#?33TFngO9 zB4fDa7pHbvhnnC8+(>=6dBw;>>9g-0^7_a7bnpp>Goi~Yf^SF^d~*?-2-Z`>uhx`q zq)aI1C<$alqVDi8Nj7L1ko3$8nIy5rdF@w_F`xtX0-h+tYEzgIsUtnm5w1k5(gcZ2 zw|WL&BbNjj&}LSjoxG{*89r^~nw{=`Y2Uwg`$O%zJ+ScQi~Pm-!ckk+uGu`kC|(Ez z7q+t0Tl?^|zxrh?W^X^6_1YY^^!aJXr2Q42Fn!`=X8(@$?Va}Bb72S14DBBr)tG3A zDc$QYTi?NWC6eDABD=v;oBHT8L1p+L>OI^gz5GH*f$7zCSC~ac4MNaG-#wWWJdLC5 z5KU#QBj`25!rZu^K}9xB;DT4JFREJi$d1xIl-{tWZn2{{m!+o_t&|vuieeV+xdTtY z=c9OA*^0aGSX=h)*@A~VwRNr>Fd~D!`*hapbJjdLMf*d$B=$ch``4-dlI05cS|VjE zLd-YAWiJW~dXzb{P3@p}m~cvl;qBxa9gg>On19dW zljbe9u!uGY=Yu-h?wR>@|zU{)+7k&ER zp5+HxPa9vNc8WEXCuJO;sQ zDI@K(SI7wpBjT0F7ED=B9Y6_c8$na)rZW%Uu*7I>KfK~m+|EfQFDg>|oNQN%w zzUZL6;d--|rQQ5#{CPHI#C)*xh&EM{ogY7Z!VeKDFK91m=MS@Ye`2rK+0mWn4o*9j zb^Ec~e$}qa&M@T&#%2Y^rnOQjBiR_P#6HR;$<0maL!L-5$4Uy7bb}KKUhYz^3<~{t z3`Ipv%X&m3aHY3|q*_iz4HYRZA#jzpEN=-x%z2RQaY)!-Hi zYAUMm5(UihO6f<7@lA#r1OT@zl$M{_l#y$(9vCbH>%ox|es%p2Af*Zs1dSm+m&2An zCs{wR!V*YVO$uz9ccmC>$}!OzGPg4{$uylvvCAB8A9J&thtRSh<#^!7RgT2ou6imQ zD)u+$)oPVg)@r&63>;HQ6jf_*UExqm=n-Cp(i+d{ODL_?6nei(J+A_p8B|Xa3Yrt% z`VJ&?@nTzYPUvXp;z5!Z{iJG55Y*}WGi>Sz;Wf*+ zj(X7z<&!LjPBPNW<0o}_CXtx(3JEA)@exQn>BUH4!h`-1sm;Lh^>7J1j80X0NiG)t zY`vmA&(fGu;2MyUwspd>^XHGP!+^GI_Ci7kmbWWm2w@kX@{2!1_(QRfM~j##@36T@B=6^$hB-@lGwhbL-T?EuO5GSAKRniLYg zLG_m{&toq5!e`>}{|28Sr$QWHhqe2~Mg$+7GE%PnttD0davb1^2lno*dj{Z@tsik{ zbk5EpAAV!<D>JpL5;!%1Pk+FmhJ8gR*cK5p6#Hvwixg#+q4GI&2bNQE-z{yCqD*GlYA8(IOiWk^+1E%iy=DgJD>3jGz zb_F^BBj30jOxXs~ChBc;fDZFhsmq%p+em}XL66Pbl-g)o)3m;+p!nZN#+THTa`9y} zbu=w$YR2Z(+iL?D_4bPS!=64#a+dAs$|b<3w}*J+kYjWlw8f5yVgW-BQ%O38`sT8| z=Jw{KWk_$H(cICzq`7Z7ev>=P~iWYN3p=Kjt&` znHKozp?~wVV?JY_X@QQEXhqrtUq$;d)NeM!a+!@)3||*1$myyiSqItT)HQe)^dsM0 ziZ`KG4ngQD44YYBjO{10KCxYS5_oT>^E^pQsLyqg{6fgZNrw&V%@gV|qh3{P?;B25 zq|QmMl+KvG$()|Jk;HB73gZdik8ofRn!(;GsJ3C78Xir|KJTvs?6 zmf#mUy<#?L;L5T@C4Wo8l`3`)`t{$m+1cIZF69L4{{N~?9gRkt7@wcrZSETOyLX!s zg%XDvXoO-A(U>do81HAfY*I zx2X=50Xc47_g2&mdgz9_yI~L$ed%F|8|HhJpV`R2!K}aThS}E14fDNs*oZQ{VRq%i zMC}}b7ED_9i*?t(NBMz``CI)r;^dOM{yldDlZGDk+sW815p$j_@{+72c68j!@iy%K z81M09_y4cP+pzy*ykY-$kN5w@51>MO)`Bx3=mYHRSc5VxuPOe(#VpX*4{~jSO{YOm;6b$%df?|s6)PcC-j%ZpCa7+Nw06byS_=vc9vz*ymU44 z@H@S}P@_JTO&SpaEwpaR$R`6wW^_IoI3i%%NDbH;eIVKyeJc7ww3TAIqfgYQXQ+9ZDl;Dz|0UiS{=-v7u49|0fyK`nRJ zy%8d@uxjkZg9~gGh@=d=PxLA~?j3>k3Cm34U>eDJ?+)58b#ar?#H=B|-{c(>`E z-;x$3A4Ho9@xglyJ_wpLX~N`91|O7ks@n9ri4TrxCFjLX)DWel29S|WH^f=N45jhk z;}T%h0lyqBBuyvkbSm;aG%a;K9va+>H$GPvp*^zSfd0ks`Z`I|77tBp&oJFrANA4P z5w|N1fcstAv&;c~bR6aTkk2Q}xmKVZCV3jqJL}J_jq3lz`&rr{#6KfGL0p~Y=KlI? zc&^(!KhxhQ7_1Fgj)@=Beq;1a+DfI2fI8@1%Pzc0a}eoJjCZKMzJ9cppnYb;ym%eb zogpJgZKRYDh(0K^kmLhY?^!7$P`#KJlfr3CBS1%(+@AM3(_X>$o4f8E%4d+njJi$R zvFjpz6Km8BKhG)xrn$A)x3q z<$yMTyNwqNI*$DYyX)Sie8h&EbxWO-#0h=lgOdcg-s^Sm%9iWB3Ag(_Io`JEdff`q z`Dd&UW0OhaZjPgg8x!9|3v#_j-9+cP`g#wFkn4TK#fYmBwBG;Sf-c7kXLYRgHmn~E zr!{F$!7j4FkcC{qv=5`rSZY93yYua;+tswIZ)XK7X@?~YIg4PdYnRfF7gm6laVc@6#fk@)D~T_SCys|}*Lix79G^-LuHxDUCh%kf zrZnXkqGW*ft6=vw-qB&eT+;D^xfJM`OQxOOyFQvrdVOAVDbC%dUSEHAeUsp?k#3Hu zG*)YJpz?~!>--vkeCfs;C;KG4Waf8%ExS)sSl7UJ2_Se zu>rt_Ck}F6G`8SXjg76L{1i3R{ZyQ7Fow@_xb*8q(0_~*oCg88&>nuNuXl0O?^06|m zODf^;dA`p2oBqtH%$f5qpINoJ;s9!kR}cxUp2IJqKU3hLn%Y2NAuNI=BXe@a0p^6C zIR=L*qeU$n1G}*mR1Uvyn0OJqDlB^Rfvj83SSr|TZMO@x(R+2C_bikK6jn7jDU6{P ztrN9J*u>NFJ-Bs`QU28HqxZ=AX1>=#`-a(ml4IH)^(CU+!3dtXTv1N(R5XKr0v^5( z&*MZ_Jg|wbSf%ynb^Jm3yqkR94Xu#fdvtvxzM2vI0f^W|(c$Rin%=0@t7+Di0L|2n zvw{D32Ia^T_#FMhEVsm1DQ}1o3)#oMFKu3?BK776{1L6?Z(3hN!w*$289QL#DmbGR zvkhlhDIF-r(R@~{;gA%yKN0zoDRxDuvO?Fh_!!`Pn*6)thItCXt=1>yv}thkR;ZGR z+t16KkK7ybs3Hs%h%Vv`1PnK4IL+!>I8tZ9f-8vA54E}*4#h%?3npOp9QJyG|_C!(|0EdnL?^1AID z;!LFzVaEr1Jw&R~QJ!1Sg~W#p9tFn%@94MsFUGTOzR5bRdK_Fb$U~{^`&(!{3m07u zt{b*EHg@r_^$#ChH@rADwrJ>vgLOd%*KIg>aNYWc#p*G`hm9UPY}jb_>X_j}M~}hP zUjuP9hMrwp$X{8=vR6Ej(!G1i<0Ye39_`zsN8h6>#a$&&Jic;d$XWc<|2Wx?*0pn7>kzco- z06*yL&L!t_9!ySez~F6Bq)ZKT?wA>bg_$f#g$_+KZjZ?uv~+F7;C|hPgjQG|yFGRA zz4swC_9t_uc2BB1DNjXB0T1!ViNHl$%6uE2L_wel6LK<{ zCLGh(&D+$Bqp+?6ByW>l!BtIH5Wle@psRGcT1f>Y@B(K%LTh_5CnP?PmuO6hCJjZj zJsRi5qJ2_uAi)uypwBc#y+Tz31*&R`v_*C!VAO;>lM(weS~K%$!wZWse|xJ1b+)j@#XR-@d@d=aiL}ZGZjSw~ngC zg}YX7#~tv*m4lEYLqKcM@XRSuoXvIg__*arsn5ifPi_+Pc$_l|^mGB`@ldaGd@vy5 zD5;;9F9LkDV!RLqkNHH;E&ARF6sO0`rh}!#aT`VB5V9VNt20jZc4>rw7%~`Nw6)h8 zZ=`f>)Gnk&(+TZw-?Fwz?yAfC&#;-7SLHTYTl?Go9r(8&M@j$MUgsEbtDm~Iarm|} zzHQg+Wpy|weP{MgX06+LXz4NvAB#CRQ~Ta>0_!u$9S_v6!Tg4=E9fU3^8S0Ep9E#8 zzP|Yw|KwsvcKC!i(cYQhyOhGu#M?_t387I>parWUIL;miqKFGQ9`8W_g0SKVMKp&g zFw*lJh{17N^ZY3ph(Q$cKT5aYu@i$X!Xm|XttGcSwxd^m*U+BJ`hKHb+Kzv$fi+rzaU0Lw2EIK5(JS6nZqm9beq3hs1l;`kn z^u0B*ll4;iD%p~kL?$_VCpmA?3B|{ov@M*u+R~zg<3ORFRfF8sT6o>IMfeJ@TO_CH z?ztr<&{Ph+9=O6y_T&tSq4!;8a733L8VidRypTW4ExT9TwQujr6?-gv!=TiDg9i6c z8ORzQT)*z&gKIZDynW1wp`*tR9X3X@5ZkmwsJYvYmW(WUVrP!pYgF#Ak;8IEcdr{* z^0-_{j;?es7k?NGmg8L54`LDU(h}4HUqvHhrd*QEY2ub>aQLx-*9-uoLwtI;D|mST zP{x7?uXn(MN$q2`sqp#2H0XwN)|6(7f(|#~Ht7{=^tcfiCVx|X<&93+U3+AAEZ?}a z?6qT=iz5+7q*u6=UH5z+4p@dl9tZxcFkt6Q4WP(owL(_rWvxak~kFe<@`I!vX zRReRI%h4EHiE=73kRH{QO3zl39S&i>;X^FIDK5|=;0Y{>xj;5F7LTNKvF)~ffClE=UEzBEoKm^e$ z-HZe%k&X28;>hf7gSSvzoTcf+lNlewoh|L`c@|Np^w>Ny#)ted8_UlXY}a9 zhF<=XrEBNDNz$I_*6WsAMMA$`+7;HOYhTHq=GXtGjSH1vuN&VP$6z;8WI>hq}JCoyqB_s0*jO%({GhPkUl+ z_oTT!`hv4(h;y1*SAP9(w&vDjsN+bz#<$42KtK#|SsHul@^OalfVw(RT>~#TJA^pL zm~~Mf3uRqTqK|rAu%%O7V!o#?AD$!GG1b+X*rxMVSr^882y{Bh)*rB!j>PFm^2s&= zznEtOy&Z-Sz2yd9SqsiDHlc)=h^Rw67LFJ3p~Ptr8B+RXFzf_bf9>K2A8X%U|2X4t zchU5UbNlKeF-J?*tvzV{Aw^rDee~&X+F91@{I@K;Pgm=U-*^4%mam?;D{b1@`|deQ zYs=yK4i?HsNVx&bY|e7WMgxd2Em%_Fh{e5E0z_t!`y9)!XK)_cGU6TU?cfF?9}W*>--GpWjhtt;>;Z9_H)B73}K;q6sGf&ai#Wok;d1NxB(d9 zGH-btFa}WUe8VZw6bYqd=62Jh>^Nq&9?Nu!D(dTqgvc}yOp#KtTO?0ttcJ4Evvr^B zx^|KcVdKY*vrM}_np1oQKsFcqtmiQI^?jC+(@C;xbM{MaW!{*qz#}q)zPyvC6T|kF zV=%q2?dlBDV@+_>)$}AcNJj?R4U=1-#yz^l(OKBAND^)&hH>b(ssR$0&9vwXw5ZCby(e#JfPuP?N>KDe*! zLzeVK|BI~Chh_Ud(%!7@|LE&1d_lrI7JmNFq4V061qpfDl{bz6=k+JG;e3bM0qa#q z1(Ba+zhoz||Mv0xhqt9yAP_7;zNhl_y`N2=0xbXNUVE3;4IB1r+-G3rgOLLhnl(vm zK5^<~_wjUVtH+-Y@ZV-t7vdxf$(q?L#L@&?n&$BF&sSVcTSI1o{42cIK9i#o_k|!0 zG7a(i8AlU<>1g*$xQQc4`gnrZOW3m}d)-3f>VlyO#W-|t8t#tcLE{t`X9I(_{mWk* zNz3~UOwGQnfB)3w$qka1r}poETXyQee#?_W^l)5Rk=hpXVUKc1d~CUd{ZdcZCjx;H$jshdMxcpc z?D6TiDMd4ZP#NIWIU5ljqH5b{*2ZJU5ZMEBE;L*;e^L8t6FXd2w|e62S6I|0Z7grF zW1{%vVC})Hw^X2Hez%a^dq4I{-@x}SUQDU4tt)|@#EugPCsUPP`y}7QUP3mZHUtk5(RC*2sIShGm;_ksGv|*?CITX zyH>DE%i}+2^^MfV*BShL8^bL(zOEhrfGeFlYl_A?lRlFv+4W0VDr}!toVW!)bty1= zR-{@+TOhhiR!T}2Ed912qOFxp)qSW=glAAR(_=hIeA zit2WI%Ho_4KH$TU*Yfc8#g(tx+Z+gMGk3w_?X{CIel(V_h*;v$k2qy0`ejqn`Ag<= zb&uz{nCVNF*KaeqxVDbEn7~DV3aVP)w&ZNJ>FB>Q`7`yjmfP5a+fF)T^Broa;lJyJ&LjN?9YoVQ3@T zAQ=ff)o7;c8qHm!5n!fA4`atjss^x4OcAIQ5S=|bEEcL`q;d(P1sUGhQ2LWRr2i*{ zBI7z#e<50)7o=S{O|)2JM^4wG*UIdT(Msktg2-@S9&9)F%LIBjkFisRZs*6pIE&cY5tl1@fOQ$|3);cW2&l$ISf9Wy>Jmf4~)|)xBr?z;7lbtTxy;#$i4y4UldS$LgetCQ1#b zSe?eOsA^bvG*0_~3DJL+W}>RLU+n-(aErD>W*phE?vN1wV13$m@6#nAz0bLG=Z0G> z++tD3)^@7xB+mcTt#6C?yGO0OchxGjOV^ZcokzCnF=f)!N9#sd{5M-*i-NBTpJ#oV z$BDII-8jQt-v(R<_HVo4s{)=p*W%!>W8Y4;7Q_3`y@6#!P@!GIM09MAE{J-^cFlR~ zpJTOm9$YZ?q-7K96{fwo`Q_KwgNF$PdmdpEiQw(g@RmfpeqtKZ*Uw}cQtHN%>FUrx zMw{=DbiAcU$3ap}q}MGX)W>^nC1KOKJe|A^r*A@|&}mxgJiM=Y&Cpwi-uCRK?WZP> z=s)cE+EqulPfHz?nK7i_lorE#^i3agOSchxbf2j$Tg^(zU%os)Wp=BUQ~KmCTBId) zN$cOWYu~VMF7TLRS=pAL9OD8@1YE9LNKUkv&CM|8bW=`(PLd*VE;X9i(edx}4U37_GuFIafW>t|FP`&_;6%9W*}ZS6Jo7uN*jp(()U zL%?T(vRbEksUa{yaPP!{JFl}4q$h!0%J+1GD?yE-RW1QeeF-%QaO$%sB;k+iSOP?> z@`PgvurxaoN)mYC@phhFtE)-71pTOl^wu>}H)B5)t*49fu>UAMT%pOUyMd@@<;@#k z_#9WiJap=_%<-8yS5F=O$;waMk+EQfBkwTZpD}*K+|0r1rYDXb7`-|!dc&*-Dj$1L z9htXq?97ba7zYMjpCT4XdK#toU!GYr`)>+uKF3x01((24By<&fE3f@4ZfSdiH9Z`R zClVWPlV^JO1%U>|qS{~B?l}XeP0TJl$<>R`9Xq@D{%e8uxOlGdhVIS z3-=!QQw5ATg~46|j8>d_kbFsMgl>emOdq9ldv!__B*juQ#*#>j5 z8`|`v^FV|JxjQo3^Z~$}lh`*<^{EZAA=$20b}7(iD72+>O@$y?xlC-t=^4n2^KeH$ zs23`isTnXt3NLi`FCke;IpIna3 z8>yi&ZzSZj2_>AHXRb&}2DZ}Faq29>R#zaZqCmZi4l{1WHEGZ=#R4x>Y!2KXh*(?= zMg&d^ToAZC&_dvcA+&KQ6{JN%0EjN^753TFpRp(3(LS#HLcR2q_VGK+Pgup>wacjd zYmt~(dj!CvAMwER-MDO^r0V^U*fgQ_>4#gR#V=G0;Nv;LF_RbaReU>_a2T2_AhA!l z8qWH?qjh{%OL~X38#`Le`D+ncfsaCcjipH9&6wAc-Q2W2b6mYGtmthc8HP&6$CXBt zMwTM&+v?A>%cqa5TaRAVv6nvm^d(+j$Cho{xSZGP^n|qsF}F8Emcm&S!oBQ`*{(Uq zNKffC&7i12gN8$fcuOlgqa6?%#ILo1;#UZ2gum(NPb2V?c;qUS_4+Jl((!?)F}yWt z<13DYKO2rkqIq~b{Ba^kzK_nxm*YVF6YE(r00*RbIyOfVl-rtw(5{Ar6=UuR#E9h& zR=@Vkn{UIZ>A8EB+*z{7^}*}f$LF*kRd({B;=8x9NTAp;NjSQctTWzXDQ3AbOu7 z`GB_o;__E0JsELRUpWK}!4ua2Vn=wG87Tmn%Z#jLGtRI#-uPlx=G>_PL9Yd>b7#Uy z!B3vFzs9PyNXzDm2PdzHZ?iSGxWjEtL&IlwEt)cW-;7Dqa;ZQ0$V2Y5e^X}0|T;wOSQkTPFcok+C|D>Zvk|cGdnhI+_7uprfs}E z@QB?)KY(YmzvawD2*6>$Vi1u5+n4ML$YCEvE9?Lzd084|4&@ z3p`^xYz?7awgxYbL+l2&hS0haewW+UfVpU$fIbB)ck6wU?8=;mKEkWJ8#E^+_cqrW z)5K5aN#%ko7LyZp2}REa0AIv3Y>`MGNQTUcQd_xAE;F`iwgtB3Hp_HZdmAtyqtPQ6 z5~gcBmP^@P{)ftD{tijIVx9JcdPZYHY`_ZBj@P~?`tsT{033ZrAH;lIT1~B|&pKoB zUvK8Ci!q2iJc9?-bv(0Y55CsNw;!$=QvNI>PP0!{K1-HauN-1?wRM%!@+#vAK%qr} z1gfdPl{>sZFkP3c#}HJ&Wv3sj@QEH*0Jk^B6>tSG$_Ik6Bde|+ESWJ|G<$ItMM=Kr z8v*O>W$_dHRSUFihRaW_weJ18LvX}m@SUp>OVFPX6E8mNq1&U!H*CR;S|I-9=}X66 z`cma5i|0=Q_1C`l=vmjJYIgP=uvkc(vFT_-C`PPUANnz;ffSj$u<55y<5fwgv<6JU zO@NZ8EC)3;`(GxMtD5xSlvat<;?wCC$Ly%cr`uE%r2X}>=}ACn(WL+tT`W^xt~-Z` z)cs|4MZ@l~?hg(ZTJZB4%W&|Y2#WV&*H*=;gNSFoJ~L5Nu18EI$*@(#yizk$CS zW^l=tJgcqF+Iw`v6txWR@bgpOAenR27oY!P;U~AP*yM6<&s}dvh^sUE`z<8?^bYes zyI;-DduHRWTb@a1d7WZk(mXf^oHjsaA`eb|DA*)gnMX?^NTQ0c<^A=GPoYRW0( zE-Dt)T{$B<)$QcS*Q^CtHt*G7wba{wRgULvH{p#Y>u?2FWOkc?B-b${*YKW_3HJ()-8Lob>+j+@iDLO)X?tzbTD$v$Ww>t?o@2Fj?67 zcQr&D-Li7o!Gp_6wy-OEtf!ZiE+C6U3*3vdEPJ3!T%Q$2_$`dZUa+jz%SoECtSnrYgW?C#yz1iqr;l z#5}2CN<&Mb)7_XyX+Ub7CM4xY$M@)B)m^qsNxB>RWy!1jN#@|{!Ht^^+W5T#hYuZO zeYr~gM4en%I9ctIlF|h*(jIC9#>@szIbEMwH=WQP_DO=W!Yy(rk}67-axA?*Y84AS zh_DR%m;3YSmDBte_%HXDJJm?Jy@M$b8@-8|$a$T;cY?k9THX6>?TZNarTuEz{MRD( z2>Y3Ece~{)OM$uvd;CD!-C?zqUX6t9$|P%wH66LZyl?`^2ZmXcp4{i+#IdqS%vI_C8gEMJL{p0?q|!7pG6Ii<~4 zhd`u=bO8wb%u%D?8@O)*%qt9z*|HTncQKN`a_G>@oJHKPt=;k3+m`QS%WNWpQbfr^ zpF62YYIwR| zhM&W)#IMw^-0zqlB@C?gtMLmcAW_K!ts7HbzF%%4_3A-5!iSS$xQ9N$Z0OCSr%xZ@ zEb!%DS^plxZ&gdy5AVg$sS_tu#_n8gX%P_>F=OKJzNxmpdjEjeTJ*0K@~hmef7Bn6 z-OS!t%)WYcD%iJEwgRs)4>s}cgr&Z*wA#C!#VROF2*=wY&gSN8dce>E^5Abp6UiK_ z9#Zd5ULv~VFR>1HZzK0tX7%q@5NGc)I!!}s2IYar0;>Yg2U-fj1_Cnz9f2i*U<2+^aoNeFUylN8pn<(XQiGHR zU<1MAkKt@$cEB@Yfc^#!5Z@&n0ewI8VF1(1c=nc^a#q2 z4cha-8eqa&9ccYup!IkZx~a<9%-sX`VBDk!Ah`H$-8~e?|H0M!*Q~wY#6(YQa+N$NaQT@C1utDLa_wf_{j`}Y87!BLD zPaiAwArL^e*;ydlGZ-`umHIFUL^Q*lF%qHfez*yZ{QTe~1Da~>{t=Jdrex_pL)3P| zc!l1C==f_~J+N;512(=hZP?&}J2M9NUfwRM!=xEQJFIOVk&G@+Eh?I-cJ0@%D+?Sx ze?-^Vuwjl7UEfQ$&!(W3oa&k2xCnqnL8ElV?b1O#O-B_XF$&?y;%Yc2qkpI#Ft8K<4I`m$D zp#DvMPUNFb!0DT;F}af)K0i1xPPmkw|0x=31_tTS&ikYWeYqcQSVf&rLoX^w7@xX*>`E1 zxUpVu+1aiMZzV)oE zP?SxFtAUTr4xR`8(zn_>xK>yKbrRA2oDml&#-CRzDA1%Kmi^s=1PRrx7^GzfEBDbY z#cS?fv=N=W{^~n_6&9{9&}!a!Mf=MtPHtYdX79S~M@5%a#doe+o3B3n%?Gbcc`~W} zGlj2w^}#dhqIK(5uU&~@0Q=IoaE<(KpXOwv9pb0j-uyWR-px-A z8bWxaGuwkCy~mptcsY4Y@c)Hj*VV9zq=$wu$a^Gr=YO*A>hMc-ps#(`HGBuS&-@|x zRi!?h@zUi#-h3b7OM4#7-V*!h$~)F>v!01+ac^_`^|RqUk<{$`m)a$SW^V!IU^6zY z&M|gC@!5~x*t7Kn#shXGfiuF8I1}~x>*M9@y|?nRB4Xq@qIpF3XxuoI)L(D@@@QIrY4f6jEtal@k0m6YTz2lg_s%VUF0tLw z!c%X(Rl9FV+1@*rZ{8wWFW9oaz_EsW&M3C@6-$UgE5m&K8O%tw+mDF)FHwNBt>*JkvOnK)Tvz`2k*|bal99f>yrcX)X!fg>dHZRz-dG*I1 z^dCHwS^xP7Yo=Y&u4oUVywJMMz4qp;ZpP3RRi|IPclQaMe~@m;jy)5_8ixn= z?E6V|qmZc4zhMIe?+rJ#uoN`>h-rjan)Ga z^UG!x7do=%%xcE2@m&YCbIoJ9IQOjU?FaU&4aemy&zpZ|uWq1;+u_4wF??JM4<5-s zZgg;=Ex*mj9}#dd2*Y25Iw3oBoRZP8QctYn}Q#-4(Hmxigou9i_#ky5y>C21MLg=$XAl;{v zHL!vt+$HaE&BJr64q;3K} zeSL6l#HZ6&#`oU;zy~K9J~*46C}ACV>6&nZU$sGFXPLjR*PPcy7^C z-K)@Wn)NlkiZ;*PyZ5;hd-j}seDbJKlP0H+oWxqLyZ`=mSJoUju!fDe?Y0r$kGkzP zxER4F4Qs#w=z_^d(4ZRWAZTiXZ?>SiY)xc{}`|{&3?<`sgssBUp;Hi%A&P9^A>mRdj8lWU;O!!cI2tATQu9% zB8)vWtb32;hqh0fL!trbY7+W!7X8rWA)IU^?jz+PvnMx^hmJuWs<3xR>HzJdmxS;? ziACi3_}_>{;*mMG&AH=`Xa7;ZY~Iwl-&P#G^w7qv+-=+D&s-P1WbE{1cTOKyB&JQg zCpLcTj0Y<#ADpo*F7}>@dk-J3yKTI~F@EC0g?#p~nKMR>oHdK)Jo$CxU=8<`H_bkq z9G7(YzVfEZ8-cNgG^S%FBIo&s&U~|_ZmWn8zh2f(X+J#sEJ9}Q-U}gx+Q2;EN5R(v zP2UkI)0!0P(}sscoeJ@9cnhPMuCf_^bdBR^*<>vf-cI-5|5{~9$x|$R+}&sb=M(O- z9ONJ3+&{8J(tZ8!kdI&^fgkWDfIx8oX4l_|_FZZ$|b;8Y$6IIF3!2LgmDx=Ny=lx`g;%riK8U7xt?DrUFi z^u;ixqAK`&FbwnM!T73%iXAks0K3AP6(1*Zh32O|KOod5wy zUU2#L>zw($GH+Z9=sqaB9Mor}LFGZmf~taW+Q2S>z|)G1AO~fDE2Re#G=ilfBgBEg zkrGUN7g8Q_ETk%gPAL%F4g%ROK_(iLxKxLlxMa5}^-2yRwz!hQ@N#e%UQVa0YPzbT zqMFhQq*JN^Bp84doNj|rpcn4?zBKC-kF$pGy71On(L8MNDQ&KBrZoZ+LehG^HpBw^ z8@?k$vrSpb7S{iT`p7o=s-&BZ2HkAnj%h}58e2ZOeMwTtPg?y z(wA5Wf!-7&`ylI=G(+`+W(NFcn$cmRF_+&c^X&h>k9qymfNr|P=~^A9_1OkaE$1!O z7MhC|8geS=h=Hq$u9B!IrCW!2>_8tM-p@)nrMgt5xV4T^+j%&PxXNwxAr+-?6>&LG zRFb8n-cMrG&+eDxm*SW1hv{c0%YPLeje|FUoP+h}z+;moJ|&!NY`qN|hRn8=9x%HT}%1SfIN)_R0MTXU3rI|zz98^$! z6=db1nS`b=lMG`I%_M5uL2VNN=KRH2T8dSg|925yk-Km^bRYjE2LLXm|CF@`->=li z1w1lA>8H3(wW8(_U$3&N)%jM{tuR7%+__4rxQe1eX%#|A*$&{v)S%>6sjWu0%50V2 zYGo_ch?%R`eZ^fj@ys}AY+a>x)N!7QQ^?%ts*1psor-EI98?^@52!UFHDYu`W<-9( z$_QDjK5xnAOARyXB|e#exIC^>cQvv?S$Knt(l+>lAWT zx*V;k0xC+WxJpGnen@Q)(mJAba_iLA7}|Wof`nIML3V^NgO?1r@e*}K=XcU~)r#1Z zVyQ7^pTLVe0qa`h^Np(;(_Esc5O#_RQAJltRFoQlBP5;c{;w2s)2O4E?SjnKA6O)Q zTTblvykx($G$&y>cgN|k)Wh_{bW%mDd^NoQ5dghJA@L#Mqj;lw-H3O%3-E;_cBc87 ztJM6;q+`8LhzTgaL2kqRme51Gfx~RZVHm81jh;oG#;Fn{4T3rSU43_$y|E5Up@9`cA99lnKsDae$V%B&>Or zl=ZYeNb-*$dl2P4O%I~w8^5`#-3uYDk!FA5(Z&XOeu`udnd(B$D%@_BBH!2+ZuHs${BSk%4d$nNxVx~*#y=TR69a(T}6CLR|o=Xx=tZU zrYpn_uPn(UkTVm_QBg$&&Bh9vff(kX2z#EIjXO*bbd}>V++!J$6x*~$6sH!$1naDqmMDx z>oV7C8}QadX`%E0tq|!+K}-@M3L<}x&{pLp&8tMIAxPS5(&t`nw19_<4j<7IVkQ#q zbhv2l>Tr#ls`t~B;H2a!1vsdn(q4PKK*30Rz=(!`ygSnNR#9KNf@$L3QB@r*u)6{gH4; z+S0$7069yiEu#JqigqfeKu8qP7Eywn48EjXaWU#@l%y>$LMGb6M4^UgzQOko{(d@a zIO{))P1eeEyjiA5xdFkR2oEJvYLLRZoYK`K2$QI6AP;-12Ou*{lxz1|+0RM!EzGrB zp8QL(rQ1k)Cou-H3_dpn8XfmKpKSnGfRF;-B!v_M zC%0&$*=v%P@V=t5iPv;Ki|~6a*DVvNY(kArwN|Qy3P?e^C`xz$_CKISk?*WUa<1lV3p7}3iVjH5ac(^9!5!U)58c8C1HLL_2f2! zmNmJ+IdCi2s=aX7haWHMTupoxP+1jn zKBPJX0*ChwPv;|Av;`i(fERU3ye>2Q0eO}9i!QH@Q=TwngPU>~_Zl~qVmphKax4m# zghM|s#ZkCRxdl&aVdd6V2UQHXGJ9hfTl2z^I<uTpH?g>a7y9z6fq{r^QvR1e!7*6FTlh2 z%$yP!CrhHl|D6OM@E;5OL-sC@C)~C@-?q9fa9hTdy=vhG#x>j8#nVJ-cM}Hi(^R|)n(;p%x__D*a^KCoy~`cPlW8QA2Iul z`o}9TBN}yc$hagDlc;XU%dQAq>tmzCG|c_YZLF0tSL$U*=|cJzT?ZqzF;WLpO^a(f zEv`vaRMBlP3inw1t%5Gt7#FeJQXpZ2!drYOX>hSlgS~YcB%_0!ic%^ZDD-;d`*Izj z_rcE)Lq=ao;1}*HrJ~v>XweHO4>%T36+p`yJ#|oVH2~m+1bE~hy-w00$T~6iqK&yn z@_tpr^9`#T(%d7H2*FfYjigca4dvW39C_0l(%hpLZh%+cUz|nVw7p&$`Ic!`9Az~MK-qXK^;OpNS*OW7Akb*P$ zmInCcRu*bpGbNCXF|N4+GBB=%(v{6Ot}RL{R&HEdl|;m<*6UI6{2SxirlfLVTsJ^0 zzBJ=HKxx9$jq5-qj?Xf#gOq7}y>Z=88PESY$dOkRF*~a$D`J)-|Bk}koVi62gB^~X z1=$gulRI@D>zL^%a*WN+S-c>tP=DTAe->dp?2XsD_&&NVyKqsiBQK&;$4<$~ow|1F zLsc2?bTB?MzQ|n^krh!?m^C|lVOHV%2*(_w@s4_1df9Q7V`19d!rVngxmkG;_%ge& zXptjtMDDEYyhYiwBNpe)&Mu57nwuTbFF$J*{usX`MwpOv?wCBcs3^a8QqqzoOFCxB zw>mlsbCMS5bu3C6F*I%9sBr^3;7tse0|$bNKmxOIG_(l+MPQmap!&T-DMaX_9565X zbugYeaJN9o#$9J68G*Pu!>!K&M_vcsaNs%{zc0ocS@_cX{oX$BMcnXaZ=<#@|Msoh zPD`l#K6k#q5Y`sLJTezwQ@uqfvm~r~n*@Imo)i2d@Y^i3m52Lmv>E}t<;m6y zB`kCCGy+0QK5CeS8tKmWn?yXh5htC2lVmwwMfkEej5JBg68XQ5sK--RN5D{su}Z>N zdBd>?Pevf5RvH{0Mk(V^cEH$Bov^LSfA#YKG3w-V(5dQ`Q68r#Arq2!Nd} z2z((JQg$PFtA;{569zsM4v+rk;8QKZ6AR9$r_#CC+Ohi9u-qK(d7zm;s3_r%9uq+Knheo0^ z>B!7E2Ba_!9B={R&?pAgvKV#k8tlX=tgG~Fm@)J1Zqsni}ugdSrgUD)fR(S=o_)HAiR$%Hi z4BV@TwSQiDU3o)!6P$7mA~;`A-a;On9ObIAO?h8=S9uRZc18I?Sr3k!3&LB7VaZbt zV2}zhXhigjK{&-2$nU_XmttZrQ|?rjE6*qoC?)V#U8&rqe6Re7Jc%mSbwAdC`Lh6} z4k6JZsC^;pA|8mdHA=jx32KD<3d;g217(D?@M))`RtAy;yJ7huy;ZvRhe-@}+W# zrLumkKav;^U<278HW;BVhq7U8I2*x6GP24aXX$J-8-tzaI5r;ps@tG9nWX%s)GA*o z|HNKl3Y*HNA@A4>mccSv7MsatvDqw}&0#rgF3V-}*nGBtEo6DhbIif=Sph3lzD9<_ zMam)$DF|4_nRF zu(fO*ThBJIjcgO!Od;>tR<@08XFJ$Vwu|j%_p&`~FWZN}<@d4u$P`%44zLHJIS7BFR&_h zioK|mv460a*lBi#y^JUiud=i39D9wu&fZ{evh(Z$dyBoz-eK>u_t^XF1NI^Nh<(gH zVV|<9KEt6^8!PwZ#*3;UJ*#(rmi zuxsp3cAfpjYFQoAkj6yeaMa|2TR0M?a2xmI4Y)rK;DJ1dH{`)Qgg4@iaoVp5593Xd zjiMQE&Rg)7ycKWF+i*LN;E_CvNAnmS%j0-FZ_C^91m2z}@(#QsPeN?gPP{Yk!n^Wr zygTo~d-7hqH}Au5;eGk7JcXz7e!M?V;{*6WK8O$IL-0U-jDD@{4hVlALWnn zqx^CH1V6@|{5W^bidXWd`7``keu6*8Px9ya3%rV-;xFR(#!LJ(Kf_<ord z?0tpulyU~AR{o)^6;qI%;$<;aOoQF6N=#QyiWwq9`9oxiEHP8e60=3Nn4@eGIbyEJ z74yV=$hiBU4XS}obUSiBA5u!O``e{FD;6lH5Z4(QEpT$IKop8aqDU+j#bSxLUECp- zie+NCxKpeUC1RzxORN%ii+jXsu|}*F>%@9Q6WJ&>iOph*D8)&%ZDPCFA$E#gVz;=Ap#KE%|yPwW@>i*lUndO$oV9ufz|!{QNfNE{YN#G~Rdaa24mo)E``QydpA@ua8_ zPl-zLw0K55D^7^##7XhIctKQ&Q{qMO5Al*XEzXFS#Vg`faaNoYuZh>i8{$oIUR)4w ziMPc&;$88ccwc-VJ`^8`kHshAQ}LPjTvUsT;tTPmxFo(3{}f+~Z^UKst@sX6lfM@~ zh#y4_&ei=SeipxoU&U|Yckzd~CjJ!H#b2UU)Co=0TNDdJEIeVcSgaP+Vzc;J8d&@- z0hT~Zkfos|*b)M5LSxIQ2_r_>7U$(AC-)nmF3g%$=*VlBpIw;im<@ThD7!FwwymH3 z*p{XLRr}2>%r4GWv*aIJKSz!uFMGZ%OaB{?HY>Mq*5ZY87G&QZFw1i-+vt?s&-mM4 z9WW~kZK<>MKLgNkRuS&#k8PmQBIIxaNFAuRm@WVK51j2N%9=&s`DeQ?Z37KBvh}~} zK)vE@`6pno2asRxwF&}S+f=wWvdJ1pTH5`?=A4UQAg-lS|I;eMgR)S0u<^f{rf!q z`%zw>1m=0&sH61n^K>ldW#u~-6%{)2=Vpt6c{w6GFUOW{;K55R#rofXi5>_8mUvxH_PV~qbFEI%`?^&A@t@+RA^)ZBOX~thUd|$G`dmk0 zp4B1C39?*FrB3&QlKuM;ta>$B?n_(0f%1_pD_i~zNME!dYtdZ&+Tpnl9Os3=z(rm+ zvi{Cpdgy=qr|EwOb!qVbw0Gv=Q59+1KUKYuy%UyzAP5+61=Ar5L39ixQ53}u89>KD zL1AQ*Ra|gi#u0LWY23BWMQIbbyp=AG*5w{FZpIkT*<+|BJcZ*X&KT3i zXmgL^gbQt+OUEO*l{(LPW2R0WLt&hB)z~re{F(BCnevYlC=yz~yl{f+;_*{FmrS^J z(iqpJV`jE7adBNZeu8T-xN!P}Bz2#rc=*f(P5TLBnv|&jDFWt(seZ;I-V)Y+)3)TP0{il5zQoXPbaU;NxhSxf2>6( z8ijrnW|=TohuN7DwETccm=+83xvyA>Mqd&{&?`P8A&*<-G z^!GFR`x*WHjQ)N`zo|8{`x*WHjQ)N`e?OzYpV8mX=CZO$vyJ|2qd(i|&o=tAjs9$-KilZfG5T|i{v4w}$LP;7`g4r_9HXDN zz!fjc&N2FPjQ$*>Kga0LG5T|i{v4w}$LP;B`g4u`T%$kN=+8C!Sy4jk%QgCQjs9Gt zKiBBbHTrXn{#>I!*XYkR`g4u`JflC)=+86y`CzivmuK|n8U1-if1c5wXY}V8{dq=z zp3$FY^yeAjsAS2Ki}xjH~RC9{sN=F z!00b9`U{Ny0;9jc=r1t(3yl5(qrbrDFEIKGjQ#?nzrg4(F!~FO{y|3nAftbf(Lc!O zA7u0oGWrJ@{ez7DK}P=|qkoXmKgj4eY$AJ*(Lc!OA7u0oHu?t}{ezAE!AAdJqkpi` zKiKFWZ1fK{`Ue~RgN^>dM*m=w{=r87V55Jq(O+ovn|3L?(C9BT`U{QzLZiRX=r1(- z3yuClqrcGTFEsiKjs8NTztHF}H2RB-{vwn9BBQ^^=r1z*i;Vsvqrb@LFEaXzjQ%2{ zzsTq>GWv^*{vxBl$mlON`iqVJVxzy<=r1<c5PNt(jC)3fNW7_?kOhAU8bc0VW6 z(Vt`5{hUlke@>>+Z`%DF)9&Y(c0b2y_x(jq{0Oyu{6$W?MOf?|q3N-AwiArd6xlml z2k|4Cs8amwCP~$!{vxNm6Po)u<(++PZ$h13LY-bhonAtnUP5heLY-bhZEr$tZ$h13 zLTztConAtnUVo8O-U*FPI+hF=y%FH`$oT0-q|<$o$}7U z(eIRZf00w(3AMiw8vRarXW!^|$~*f;zf<1XH~O9O&c4y_ly~-xey6;%Z}dCm-CyLC zcS57zDevqX`#a^GePe&8yt8lY@054;js2bS&c3m~Q{LG(_IJv=zsM=?gvS0(d1v3G z-zo3xoAf*7oqdyjr@XUo((jaa_D%Yo^3J|Vzf<1XH|clEyT7Q|?;Ytl?i?LB-szNf z&Km7bX=mSPcS<|^j`m`QO=V>|rG!wYicnjXP^XGeTa{4Xmrz@kP~VqOTa{4Xmrz@k zP^XGV!8ytLi7mZW#=5SWn0)V=8yn9!+Bo&hdwkN2@r>m-^7O=OCd_J*lcp1~$xSDY=x7%Ya*RW$jYFu7Q(WX! ziN(cEl}T8bWQM2uPM>u3)cCPurcW3%<%S7k;`Ocjl9;&36DE(-!t@C@I9FXWW#%+3 zCFtmBF>c1}DULwooy%?@eDonV9$T;>GBo#0X@xWoxAc7ls^5U=ky zaq`Sb-eJ!13v>`i7k>J5H8OL)b9kr|oaY4RI>8VpIL8Ujc7kFjC~|^ACm8GmgLIG< zW7=t|3q3AHkL+lNRznot0)1V(mcf|jag3N_&6l@rxlWC3s5``5);#dxC~3Y^vew!3 z1LtJ(wTV|VL1H3P24+mSI<-kw*G?RF&5Wej11ZdwxRxPZ5IEao1=V(u~Qh8R{1oVNl*oOhmy_|7>=WOh#zd75I!gw{- z?;Lf;`kmjzj`W+eEx%#lR6mb#PB;VkT5j8F7~eVVjNWTGEq3hQoNc*lqBCNzkEdR8 zgf}H$(y9<$((<#k*dcu9rq0m4BRj+OT23;9_2xv2wG;F>y*})tf}F&oldC39cP<;% zqRH1Xux`$^IB3eqR^FZ(Gg7awO^q4S*9Vf!n7`g(qK;rrP8?tGw3&e;*iT>{O`#U@jLFRvRnZL*c({O6oHFStU@1(H@m7V`mJebq0-Jb%C+ z@LrZVu-l{F7hh zQTLNSJH^{aP3o9;YNoR9X)8~CTkZQxPOa=CGY9%*A5yO|pzplCKb*D_lx24BGuGLN z19}|`spFZ|&VLmPWh)Jp6YAca*A_-w-&fJ!1n$bFeyx5{o!MJ&O~3xF;nDIt_82j0 z%HN}g(n*ENYlGFw_gl8CIDa^6MwZNq%Sy@0$jZ$+Cus2{DhkacWLn>>M{W z!|llVZF#NcwiPm?P0ePzK+j(r-aK#ZPt1O}Q_oks$GVr7lF z9<$XRWmd!E%vO7nuM$7U?6wz}@le8ihkr6-;#KCWsaX_iM#U0qg|*UJ#cYaCtkuk` z_>_5UYUbK!%v#%IZPByTDy(hHp!(9ZOV8c1m9=J{A^E>_b_tRv=OnORsZbFi9bV5#|6&g`pyH}@*QjH__W zY%4X>%9&@SW?88@R%&ilf}T&+HfGLLpXQlR1L=o4lat@*z&v*_S|oK=)?lzBpG9*{E& zNX`3cnN@R>o>6m~o=Nj}-puWQ_qS(mXD{YB0TdwJ10GI%71$SHNvO6=s zdxDY3qroRuFIfuKSiM|btaMjba2)8teab9fW5h}WT|tIjYUQD&(Ei#gw)gYpp#5rf zcI#YlF}M^Aw*!2MXP-6F4q2CjJNV6=;4W}CxCh(|p5q?RgBQSypai@GUf~}91pflB zg4e*i;63m@SPYhc576-;_y{ZqE6}wHe9XN+;XbPgO9?+ETtm2y->e7aU?bQJz5v_6 zm*6X~6I6j+U=P@9?-xFh2HJrRAj4`edV^E!eWDLI4fsJnkOT7VkSOH3V&rq|QZdB- zT3k&y5ljKIz&)J5pYyD6BOc)TC%{w4PlIQ`vz&Volpw!E_&WL)gAe)b2Et12NgTyK zZ~#R3eU$Jg@Uy*NS|Gs=$+mW>JPx@B^6{V-@=2f%I1djXzvN|L1o9}(UrBfqzq#4| zTHZo9m+%hG-vx-XoCh8SkAwMK|1?+#$R|lY$=3mSBUkX-mHc)cVHx3i!p{iH2{#aK zB-})}nQ#l?R>IE-zaXq2+(x*a@JqrSgkKSoX1SB_Yr-nRYQo*83jhoQ80WF)*vI#Al(6Wh{=zZ)u zt3Ox(o(9i=h2R^zPMi!*1${v#$O75mUAxYe418R7F70?KEqN-l+uJkqye)M|h&m)h z9TK7r2~mH9m{H!2Iv_+H5TXtUQ3r&m145MF5al;S`3+HiLzLeT|-w@?DM446PF~qwxsg%1AWiCWH3sKHOl%WviN0prrWhX@02~l=bISElt zLX?vbWh6uy2~iG0l!FlEAVe8ZJ|Dv8L->3MpAX@SA$&1}FNW~N5WX0~7en}B2wx20 zZz23GgujLGwU8^@N_FLcJkTHHg90!J`<#Jg!dNDZWx`k{jAg=DC5%B7EE2{dVJs5HB4I2N#v)-X62>B7 zEE2{dVJs5HB4I2N#v)-X66Wm(pM95=2D;jJxpKh(a3=Tz$CUqt@xL(s7smg>_+J?R z3*&!b{4b3Eh4H^I{ujpo!uVep{|n=PVf;_sf0X^1YnJ_<>jt~RHOF4;x)IO3$^O7K z*KXh)j3M;)M)1DHDB$MWz2Y`|y?D;9;e42uwYPoHIvHevZ17j`D0mD!4xRu{g85)A zCL2y?jy?WgE9$p0~vt0$P)qa zk*9)7z;N&|cmxn9xfmP<--7SKkKkuu+Xr0&xPS+=0r4Oa98dgCC#3;W8X%tn*z;8VMXnsqBR>sE0N^3`Ah@3NQ{oCy=)VN#4WA<)Z z?i%qi`A8GeS+Ph$wyQmi{sTV7$7b~e3E2$SNt#`QYU9Nu*ybl(GCEx>o z_aXQQEC(z2{VK4I->e7aU?bQJz5v_6m*6X~6I6j+U=P@9R|+ql8wV0VBJkN2u*C}4 zVg+?T~hD{grr;{SvNwiLi=$ z5NA|QcL!)?T6c3H!p;0_Eiibw=&?p`n#Y3ZbVH7Wn;Dr&qFoG9G z@WKdQ7{LoG@xmxx7!eoQJMhFPUKqg(qj+H@o)@Nc`tZC;JZ>Kz7scbEcw8kO7s2C# zcv=K6i{N2VJSd6>RpLQWyd{daMDdg;-cgBXRN@(xct#Y@h~gPhJRyoFMDc`5az9G$ zN6GytIUXgqE6MFja=Vfoj*`PsayUv3N6FnNxf>;SqvURs+>MgEQF1p*?ncSMC^;A< z2czU(l-!Gudl7OkLheP#y$HD%A@?HWUM0C#N$ypWdzG$idxt9rJ-Jp-u9cE&rC7cm%hzN1dMsa$h)NC5f-n<+ND^#PPc+jAkWA03+?4txt>~a2Uf1f%Jo>c6l<1Z%~GsciseeNR4JA! z#ZslDw4RjKlhS%pT2D&rNohSPttX|Wq_mWjmXgv^Qo4wgE+VCiNa-R{x`>o6BBhIX zH?-Ie;=4h7H;C^B@!cT)8pL0N_-hb<4dSms{4$7N2Jy=vei_6sgZO0-zYOA+LHsg^ zUk35ZAbuIdFN64H5WfuKdqI3Ih`$B3pFK_Z4B$F^DTp5h@uMJq6vU5$_)ZYt3F13J zd?$$S1o4|7eiOuRg7{4kUkTzXL3|~MuLSXxAifgBS9sS8>;qv?2e?1J62w=6_(~98 z3DO=dWUTQ<`YK8ERg$nnOCMzj`>LOEG2;!YuQHM=F9%2Kue{4O?}7KhVz30P;M!H- z_x5Fcl)*I64yb-jzLkg#Ro^BFJ34(E)~clSI3S)Ne2VMl6E^jC7IIw)$5g*(AED~| zL^ywB|A*05YV&=v2jTJHX#Js49FOf2&EtC2FM6C1o$_gbCCQKfs-Hy7ypNiBA2stn z`4ecQ?`;7IV*5}D?5lp%u~wq18|V&tf@~{^epM3vswDbVN%X6d=vO7tuS#;wvXWhM zz)e<)>tss=*3q?g~;n5S$6l0=q%I-9R2TkcSQAVFP*CKpr;m_WVfukp9)>gjdk> zSwXnUK1A(&h`Su*E(f{GL2Bniw1J28-6DkQjtTZ5YT-lF!iV(TM-j$qn9u&xU?D&o zweKNn-$T^Chp2tgOIuP#TT;g8%@#&)KBo_INcTZT(kmHF%YQkc>UXRlTm=`*p#RVt zsJ=%&`>OwOkzJ=ojP|UI_N=ojAuuA z_Hy!DSygeW2o{ZC(dAflIo6Dj#}TX+!D`E~+H$P591E?(I#pOlStf#I4q%lC7KvaH z#!&6$SVE1~EvF?`DPJzH#gFGBKMfWFm5OC{HTfSQ))DeQLTn@Svh&E-d|I5-@x_6J zqu~wD(%RAEB~}6QIY=G{$=@LT$sqm72J$yZ3cSi4Zog z#^%-7yb7CFiNPE@hY^XPgjW-eC!E0XiO5sHboOTv-bi>W$L|KO^ZPg1e~;sfkv}9{ z$!Pr=LgK=xMu@zsHf66`R9o%%N>8ddXje-{Mj7#7#Ga5*X7a3>Jgb%&$kEa7;;zTdF!%Wu zd=GvEYNXYs^%lSdJfIDT2Z^AIU4{Qt;XhUQPZc9IAwE~rnUa!6DWQHgwPlo?kCJ=! zcxBZVREIOQgcw(hHKd0!2U+|RgJhEFQ#tB>W6eq zcOLsAz)1QOqrnv%zmk1bqfMnutJ>@-M$;C6XMn1?-oQ$4fp<8+R9Os;(S`m;S8yEY zL7yy+F~$_@zQ(U;owtj}Y`%|SuN5o#dStadT>guZ_OX-@pQ#-J)DtO`iU6g;N2%~p zDtwd*AEm-asqm5h0G{u|^L==}FQ)cTEkpn>_Tj-kY!bkGeR!`A&-G!SfViFSO5IJU zYLxeob*%z__>l7}@y?Gqwg%`LhU1%&w=yoOYM3vvS+&&`5B5>h1o7e!UhKnzeb`a8 z906HirI^|#XlfhPQUv4`9CvD(y?CptZT8}=)HocU3a;lKvp6=JV>cn+0`BGbQ`8{~ zz%$@k&M)HpOB{cLd%gwUL3V1OAl{mSxBBo_AKvQ2TYY$|4{!D1tv^YZC(qu4$L%F2YOr_>R^Efh?ZM+}u(BHetHGi*c-&qr zT7yOR;BkAg=pH<-mi*m~*X6d-1ltq`C%g+bekzO6+TheGRd%A@(&^Ph!8D*sECYCf2)& zrHbKhVpu~AcbgdQB8D}@u!b1!HZiQhD{F}5eqy{QHZh}nLgC+G1WW`zw85}W7!-LrHAoe>*?DiA0{lrAI zvOJ*#BPnI0!IdzFN+%K0=!U&^;5k?3jw4_l+03(dfMHronFgh1ubS}au zTZ9p{2qR(<(p5(*85K3idqDt%KrPr0!k~_8>ba%?`4Bh^z5_o1o3@?%GXfTo@gSM< zPj8>mt_ZDcR5GSQD;r_dE5fK(gw{1mYZ_(5Dl5bOYT%Pmm2u%>j9!Kgb7g2KZBh6;D}jkA?%3^8?)R0Oj@oW%dAN^Z@1X0Czk< zf5=1J&`-S7{SI@#!`$yM_dCq}4s*Z5-0v{ok}4*TV#mfVw%5{UiXL@L>|M^i2i^yZ z!4mL$$HRQowrQXpP-A0i{EIOsJ?8Zk$C}2tN|4o<);>Ztu65*?)^YY)`bJTC0-kx~ zcvkFK);z9L<5`ar{+Hue^o7^bKUz!wXf6Gtwe*kHx-1|;>=;)9`)ZtPE~RS$J=0`z zBAHnlQLJ2tmFpPAspI)pvUM(@GkQ_iJbLjQ*F6tj055_P@Dg~1YyS!U1zrWOf&VnB z@d>{v1#7@Mu3Znx0o>Hu488!{z?a}FuoF~)U0@H`OKEF8!ck{NIO@a@a^NDKhuy<9 ze*u`oM~IQ*3r9vAqh61&V#nCR_xT0azrn0gB18>O8ds_Pk45Ak{RlcD7U?{C!lP_FFyF3E$8}Q$wNwZOFofDeB;j|KKPCT{~kL|=`JMq|# ze~q$N@m#r-QS^7kPHKWWdnp>sq6=lwME`ee}=J{27|p)6p;@wT}o|DXFMDZP-&fUVe+s&}SH^g>$Gf!>B*E|8Jwr7Yv_HD%RZSgJFe2@I2Jx389UD>mJ>-&fL_FPq-h>$dQHA> z-z1m9YnRy%t6rRo_S$s=PXlfOH`^bQ)}@x0SneZ+Apz0eGD?IuEkkoHIkX;cT7@_5AeYv-&R_&_Hs$^X z>b{%6TzfsUh2Trv>9Br+vVgm)rzda=ojY;ptrBynZ*L*@ALHyw_P68vOBw5%jTKm1 znNevEt!Aq023pTKg!E;(_kP|0;Ryu)VG;U@Up|#^W7j(3a~Qj-vf5y&BYQbg&yoEc zsntjJp(|{zsk6LX^DftX!4WmPDa>_hb`v?H^-6O`=gJlAZRg50=E{{^(_qOq7gG0G z2^sCTlM7vW$7P3opS{6m_Mu&3zsOrGzxl5*@S89Fj~Cj^bCat_MeVSH6O%n*P_zSvimj0#KCT`)jB5n&kmAf&o}L<&>m(p7mY9` z7aJ$zS37OK%+J`BWxpJIeT!^AYQJW`#P*i`F73M7tVUa%x7XV%>^BJK+BY}WYs>lU zsQr$;+WEEpp1p-+ukN59O)rfaDGe&=74)&JekRhnAgoji85;iby@z~r3XXJuRSNACWcKUEg$ zbyEypnRN8D|wVZZK0T4X?=-P|Fu5Gedio`r1d^?3Hj6Yzd2z%U9c*idVkGF zneNKlIlc8)+SU7Ot-sLT`rGX4?X_awUpue)3+(C*Hs`zRzxK}B0=~`r3}0Ap{qEW; z&2O*0^NaV_KH=Rp_2$|--uGE=zPi5gKfJ*fjCqIc8!PrLHgC(f)c@_MP|p@`ZBsee&D&+idsoHrvCz$MzIo z8h74Ydn4u>;!E`R!6<-$Ghp<+(*8VroO%He0f{FlXgw3x6*FrOWMEvjkJ~Ki`VLnv@*VPy@79BZ{hpa z6@1%z2j8{+`Zs;k`q$n(OXl0vzx+yd>#tC&?@#j<8a<%3__KO9TDQh{b{cY9Rwc0T z@vg|-c!p)+?Y(&Cxi^~&uRj4^c_N!fuTfy>RSLY6fn?>0!MgEk{qLi;eUd!g9w6Ej-Wo#}={d(lj z*j%i+P>#HT&BYoF8<97$xmkZO?2){aQ$%8sI=rPhz=gnW!R2D!87jNC=A0u}2?9FLqKG8otH zC3+$E7QK;A5GNp?C{9E^Nx)rMS>j~+=BJ2LkWUq-BKHw}ko$_h$ft?ZkTXRlvS0X- zvqTnhKhY04TVx~Wh#cfxkxTzJPvjx@7yTKH%4f8_6YEk8Kt5fZ&Y12%G0^JF8Wof& z)~PrX`46mCkxCtX7IFd4mMv=QA&h&RE5;&^6XO_@xkg-zmB!QVxmkB&0(bihPo6E- zo|r_@6pl<4Q@Q?n!T7M4CZ_SL>8wZL=KbXv$TP)EMha%}wAxZ@Q*dOC zpcSU}zmaQh5^A-xo5jsm0;^T173JoNxmf8|-gEV_a>Z>Nxm`cuzC+xJe3!V3JKW71 zus*eR1xM}^_mQW66@N#5fF}x_Si|BWcG zMN6}Qk)5Z-i^wISgyS!V*Lvb?U;Hp|B3j7 zBdf(~t}hj($e)T&x!W4Cjw5BF3@fb{>pA|J_zWwRi*gn(;LSg*v{7tC*Cw%vvzzsE z{Vie(zuGD&*Sx*`Ir10c3*-t>L2S2)ZOGdhb32yxG`>Qv6qV#VYib}@i7Km`s20`8 zyTmS@6z&$gtz%eagAz?^x)1y87nEq;`VM2a1L6RqRE)fHB*L?qPOQ2S<#@fQ=T{Aa zvdkOd->|Okw}P@Pz7yXee=ol08rI_A2<|T*uu8D@y<9USG_lG9mlF1@yH20 z-RZ>29F$YuBu}x9Wpxf8XPIHck>e!qII|i@cShfOFw?aYt8(;2KAst`omibCpKAul z0ajbq-Z>v3?TNETUftjbZ0e6~Cr`5Z|Z z;Vtzc$mdF09C@BR4|%8@ihRC2-}1@}B&`hZun)If@-lgu)ehz`g6Bkkl(aZ-h>?um zj^gQ4Csy$ojeNPhoa0wWHH+d;@=s{LQjX)uHS!w9+^&^>LB392$DJqY85NV{B(9k( zr*nLUq-3$O$86*qBxOp@k(4Rkl)n-ACT3e$tn_iSmBwlxlqq=1Tx3@LK)zkx&M4>| z@($h-zEe`Bc%%L<=6t0wF!AMvq&s>*cRli%qFp5 zWS=8{!K@MsZdQT3joBp@ENwgTm&`J;;A=aOzmk+7m>VUCRY~YMz~R0|u98*A)v_9S zm)wQ5cgx*ab&uSGTqA3c_sYG<0U1CJ${;fDn=ADOo;kq^iN$UGrL zj>rfy??@om%X%!+AREwlP##1+Bo84UmWRo&Z{#=R(YNwjgfm@MtC=CA3RzgqCuY_7>+vtY8h zutvpY<20A;sJU#s=CYkMmraJr4kUJp%cjI|S(oOrmhKn2;jcru+qrCRIP5TF#a}&| zzj`%)^=SU;*8J6izg`A68o_44WdBH76_-_SyN=?B;vrTjm~SRwxJ?{49gh15#}%VZhtWQTJfAIH^V*J@*Ctqtnt83Onb*EXoLd;JM>AS4 zjCL7!_yAs;s(EdiwUW)!yf#hqTB&)hOY>T(d96$HTB&)hOY_=v&1>D7*QRS;>(;zB zUGrME=C$dX*Sa;YwKT7F>#wy~n#;O1m$fvPb!#qbX)f#5T-MTD)~&g$1(V%LTE1pW zx2o9ORyA8XD`xFN-p!V7?O}7XN>>f?UN$$J_b};FZ1q^{TezlLjn+%MuDGV9xu!>R zO-pl4PYl;g*Id)9xn{cNnqJK{(>2%h!Zq8|)^-pbX#3M)mKMzNSlZOCqASd!o9Kpo z9P5^~5#2?1J8=*L8oaiNb@ms|~+A=A9{;cXrXdGez^x zE}D0yXx`aHt&>LF28+R@v``e1(jrmBkz!Fy9L^SJBcB5|m71Hn)GBHm87hWy{rTd2 zdP*iZAP2&2PuTVlB;L`FaX0HbJeR#*v9|S*h1i zvowp9n#Ee0#inQ$YiSmnuD-&<^@_hr_$#ffX0GWl*SW}wrzXVk)MRl74As&MH35ct z59zwMnWuW-sek3{{o;Po_&4!4&i=ibxu(T1S5FLcO^ac!UbPY%cVI0xe!GyTSr#j@ zJ%YiTZfEL`?I`1JcQT1zw9 zI2i3xWW{9@HJ7#EvL9lBk6^BrX0FLFSK3{8>KcB_`fbRHt){D0+>jMdP1ig%PV>~n z7@nHUw}rNFjpC_o;i)H}z<4>Q$@1 zAuCquj$x%~nw7dWEA0#`ZQz=N;vl?}wc(JzY38OL%}p)1=?@(Lv6-Q|V;HIjhRT=X zSUpZyZCF9hO$CgromhjIg%ukXjzkG8gg6NmYMYJWLM;F zu-J6XV!fKh#%mUvrde#fX0d6o*bJ`eC3~T_x9p94f;@rWo+wX5K1rU$@slO(7wgZR z!tqn(smOe!jN^SJtraWKGmS(-ltY$aK>a13@L4aOG!7%Obgmv?#`GX~yh<{S+g{DK(>2@n!nR%TY!;b=8GBr;U(Gs& zUgS2eHpp?VIOKR3dAergUKn{IauU4Ut$BGz&C63YFYgF1hZnP^A@vXI8uES$Ya6yh zZtrT3+`-iWIo*|x+|kt$xs$6C@-ePskUPWaQ#Geg(40O^bNU3$>C-f)Ptcq`O>_DL z&FRxLr%#8|pT-?BU0GHKRzvKE%vdy>Ua@@M?u6wF&GM6CSbh?#BT`f8F=}B^;e!PD z_T*OI?(7Z&a9McY@Mn;YYeY3d54qn&R!8`PC~Z}MRS$o;cHzUUcK86R9{!Eh5C6(4i1)G@;@y19 z?M~K5yp5F&=kj&8n^`yUM%GWffprvT@#VMQ^PAZ94}ZD(;rmBl|IqDfwQk~X|6Lna zPE>0rs?`(K`iW`<#ciyhsMb*2!HSIUv67-%OHr++sMb?dD=Mlr6{}fQaTlv9s&y6B z%8Gkk*Rcil`ijm9i)xKUwaTJeXYl|lEvmH^)oP1T)>~97E~+&b)vAk!Sa(sayr|Y* zRI4wl^%vC&jA{)=wF;wJhf%G>*vQ(Di(R%}k&#B9jRjp<(J{bkj0vpC81If_YvcB^ zdD!@4{YXaR7!7ZypL1l;J4>(%=`CgGp3#|%`ajA30{T6d(&u@J-qkCN)c=_t%?f%@ ztLTf&r1!DQx{aPdkY3Y1tASs9!x;5HtRIE6US!-k!Fr7`<#yIPu=lg9rRrOcT;1YN z%dN`a%ZQHhOW7_7lZQHhOe*IqjyXz)rC#!1h!pg6cRN^Wx zCI$ck002Nb2LR-s88|2FXZ(LQaS_oUF5b%zIpc?D&?rxN*03f9q000&R06>d74>-_}SEgtBu|fQC{QC!bsR4DRhSvIa004pr0012a z03eG2xvJwEx;PO60JyL}9F_k-T?&zHVrOa%0AMZr#O3)xhwF=8g{i)y-A^tTKb-%# zumDH^im8>m2>?Lu2LL>h0)S4f$lG8Z%#5tv006k3I6y!4V3?{NdLCxR`bIzUPtE|g z|L~zvQ)Tv}{LxMP$V5LNg>HkcHnVp6u?02*0AL^i091}@huBmrTf-k7uHH}1`2WGr z^}F3#-|avDH$QfS{{eyz1jF^9aED3IEduZjk8yn-^{v%-(Q5 z7oiv+9e+e90PufW0Kjd{P|rwDZ~Aq(zo+N)Rr)O#qXY;<0TiqD4hUeI0_yo6>Bl!1 zJRlZ;{dtGp(2*@D9AVOloAmTCN%#jpO2?l?Ga>4*gL1oB# zG9cjIyf{Lw_`H-N!ScNT7!@t!MzeD!Jgv&X_y|a4T2Pzm=i^NoH#sS0$D<9`RNvPx zTTa~$r32!pskXJdFM)Qk7)*6d{NRh^IWA>3EB}r36T^2{auVh!KUr#K8oR5 z9g;lX88wP`)xHR~wqp*jG*Cyg(@yZkbqoG!1+~_LT6Wghw|k>5t9jj=ocwL$C)r#yBOS&Rt}S_k9hx8$SY?Meh$Vu2lwn@ zo4=+NV!YL$esyTrwYK1m@3`?K@d&S1trZDn0}k!KX6n~4KT380byRrVZuqq%+Q*KW-7J8cqE7{}<-u3d3hcV}AWb>DoHA7UP34s|TxsA5CZ!zqWA)no9UT=U9`PtAvZJ=#Xys*z+r zO+AY5qbEj9F(HzW25`oIo*eTBHA3F!bt4&jxi+&5liu^#Fwojlco+7$ay~zw>@*EH zwE~Bc0}-{;BV#b;#_o6O-f{&mXF|$85G)*eKARj__dVpt7Bl*OW6Nfj#L52Uu$;-@ znc$83b!FNzxf#1OVdy#r9cAxYn0DK~W~A4o9EKEsd2%c_dHE@SRPxM7wg!?JCETtXP4UTw zdHS9H#2JLkpKD(m@Tkve-2vjtfZsg2F0udq+=c zKa;|zZe?Qs_55PZRinjh%d-15-?C)b!JhPJ!oMa3b9CeKksYh^wW+=A==G1Y;3&wu zMEz)w&X>)d@zVZR#>*$?5N;9!xReb0+dfVfccka`P^bLC2W}`On{A(QcDCN}yz{wE zOrC8c+OS88vzjHEckl?Q7z%Hg{(wLYFts|yvZwCtCVq>~mPj?$#Kvkyoj2$2be#i{ z$^>_>uhPlG!HMfsZqwVwe_;3N!p$>m^Bsx3pgHR**QkOx9`c4=|M2f0t#C5eC&cq# z;S{HMKEPffp*v&M*&}NG+?f^OXP>(N);JFkPBrytjCQmJTe=~M%30q4?^jVUCbsyy zrKQO_kwAyj>;dg1okOrzgR)jmpJy@mnj3G10^#qjJ~wI-C;Mnky=h5RiignbcS`9f zCzj&h9_dASMe)2LsZXPH5S)Kfi+Ycqah@?V<0A#rKz~(dj8s9(l}%ZoF6jJrW%ct^ zz5#1mmb+UX5P!^|#xMVe-E&5}s1hycoN`qHlr`TAbQT4DN3?h7;f;o1Q4vzR7Ez0x zVE7&6teaJ%SiHrud>7?3-IfAVYoWv&DwfWsG%4YEdB|5j;!Ao>PC()-;i*48tFM-5?6)(xTZkF^`$K#P_fxqPK}Qewb_3PB zPzKz$bjy1v(v9#d9twfPRd7TXZ$d2Exl752n)KL0m&n9E1dJ=1MV?A#aFM-3(&lkS z76CR7i#jIGH_4K4)eMPP@0J11`mrYae#a`hIVzZTe=T=l#Eb|N3Yg?bl1kN$Q&&sz96i{vW7Q+^j*0?*cMa{hdK=u~RY`Ey(q z`RRX&#(LExo}|8AQdgD1b#a)6V(_V%z}N7W`DN=Va74Baq2zncoligPc(UH?yVUjO z@w6OeyQtAdeo4^(fm+R~9eVj^#dg8`WJiVtFC7Zx^cy>L;ah*Jp3PXd@M%Uz_#MO( z-~N?8D*x@H=q>3pjrgP5$Li0pN2cx>#{^M+HA1>~#1pcGYo_OZ`e*c|;L7sKRv@o) z;p?iy&DFP$kA9ck7kpQuPOo${uiCnKuJqPKgU*UNKG}0>{Z5rwZs_NAFb5z1(Ay!5 zeSe2LzHR0BY%@aCs;;5nC;NqdBOMkB?(duQV`K29qoo}PbLrfe*TkXVNAKvxcf0f_ zDE`;&DJqMdDz~gGX&o<}%XtqKSMtrrZ{kL4I31GcliHRiERl%#>D92%`@ zZ!5#pThs6F!Y^cp%AAmG3LwU$!8oW9n6+y`~wAVoBO!GV+ks7rk`Lv>%>?K zKXdLaXd(5tV`IsxdzYr>)n9a}F`skY*1T0TQuYa9Ni}YE6VrhZ?$IT*mj#`sJW?6TZLTBXrX(~CzlbD6dC_WZ zxxW{Wz)y=kKf9r%2TH9{;IkQTXJ)RG0Ryf(Q03-C7ZRHWk4mybh{sNUx;#2DJW!~t za&{%cHqd{U2oshWkDLCttfMJh>WQCM|D>!~KcEm6qxMpF>~dOnEWEhUGZ+B_V<^FhIkt=jWH*MfcEYVVj?f9-51J_3L zypivzQw=INgR|=1`V7y$izqa>w|G`Kzv^kyrAubk&aj471t^Ga>TIfuHWz*C=3oDQ z`MCJ>V`-L!ynnyR;)L=ql~e{OHRS&~2ybJ^vG&XwDP4ATE6YmbU<5LPOgViLlVOgK z&D9}eIL-{gcIx~yGVo>aaO(OFRJ4bc=C+od>glAqh%{vSG!YGKfLu_TH|$*lw^o3e zTROg0eo|jW38`5Y@lx(`TE3)&mi(+N;tt&fEU0iG3lIeki$E3x6@^iRVON8soW6l3 zZf*T!b4-bCy5OJG9QG%V=I|Lg8MeEnXAaH#0&<*<O{9I=f%A}-r2&AaIDA^e{4s4tS!B~NpOqR&?U1rkC-L zB1XKCTlrFNLCs3Ehb?}Y_SAfV)4Nj}(btg;bo;9#Z=S9OS&t4ze}XGdLn|Q&&rOXR zWfC09;*#%v)stHnk$E(^%(Oocd25H7rOVB?wn;3TCHqu4L#0wiQMS>Xp(KlX7JiOo zcp2*MM1DYRy&D*LS9iaJR#Ln!e>fR+&d`5pEd3kM!1y9PZ;xjsu@qZ+9Kogl6Iz%`Vg3;CV2d(39aalTDCbP9?bR_uS^jny$9@^oy^L zw(aupqw}Y>FT3Ac8^wkldtbCu;f5J|$eW_?a~96|Q0ws~42vIl8^)&em9g5{P&*V$ z7XE@&TF6Z?P zmw)}2PVE~uYSR7YLF@ZZZQeHB+&gC*g4mLU8?IMz?^}2-k95+7=25sLvPA;WMd_%m zIn}8+Cu4t`vVNIL;+WIO9;lCsn@*(&vWSC^Bf3Y7nO8@}#WO`5Lp))T zYyvn%oiNhOTkyjg02@&|L^lov2tovebg`!}RK3`h2tpqNcJhQi&`Y~Nzip3s&<`NG zesJo(@b)AUfk1iK3+lFpO4z$OTD>-vp{|wDSg=oiT$TMAr-U!?u;G?K*G`TBy+b{U zQ1{{Ybzk5H{{B-WbSyK01CxNP1tNAE;~9p5dAJ8k#*LIf0`G9Q7{TcQpJnv(OhkGn zNS#59z-_}%t%31gG<9*=7pWVFN)m)Gk{6Vv-6JpBlQ8Fl{u`dFpvT#;?A}XtalQ?> z4S(8TXw00E=N-q9)0!O}?Rk`2KEKYCeMC>3pp1LFz#-xoCNo^(#-9A4X_6`Me4iDV zYF1Fs!EGEH!ae=|;O+{D(wfGh>olM%Qm>%{2U-DXFFy3TDnWV@7sgUl`#K`?igp+e z?AVq*jsiuqVQYr$Hg9m*a0Ela>og2va6yE*k-XEeSFxFYStg*~Ff0@xvimoE1Xxyx zcNiy#9Zsfh9k_x&l9Y0h$u# zAFlgw0er?nGA(N9f*i6V18H{GlHjxgS+F|Mx%U}@wnTE_P}8ui84-`cVfkW?d&i;A zL)f%Jm0?iNIz}_^Vfwx)1JiEnkUE6YhJE+D2*~dNDnmc#3Xpw#K2a^ml`-33Uxb#E z+(y|*Ji>;a$XUOV;AD{8iUeP9&_EJ{Rp8!W8G-C{5Kq+VzSls{b4lcCBq%)5{}q+nntDCUGnUQ+uA8X?b1Tk%an`RDhe6~wLKXF$?S|59M(7q9j8c#&9} zgAyzx3XWM+%@lu)c_~K1^}37h3VSrW|4qS63;lb8&r5K=j!4hIfG0^0im{q5L(j%Q zD@hO3&3e5s9#w1l#vKSx*jMr3u+HDv2gz5VhOJNEl#S%2R>Rb{b+)+Uac^*`2kE8F zjeUo-2L~Sdd0{j{H82Gp+S!S;5#?+qwu|Bcv((SGZ2@|DVjZH#XQoDSBDot6ZF^9N zcpcT7r8L1dh->(gzz6!}f8H(Vh4}$<&Vh7JvZGiT>cM9+A~%2^av?ARh#zi(wi>7g#%9l{&HPU+>>kKYG^+F5f$A-a98 zl1UViv$$h=V-TErD&wgJ#|!9$k-Lw`S#t2?A7lrss^u(97{?r!ixig}!lcKM^$JUSxj8?i2Ky$DR0SWaWv18jI6j&E_VV#9FU z-GGI)@bP#0UqP6MQ!!z!-Lu#~+}#Kk7KI7EkTVazl!SL^yRv&{vaf9zOro!?8KwX} z2}n*C6gaTa9utTJT}?tIK5a;E{nHF~;AFZs3@qon-h3x;YmYN&x(3JLMtyobBpOBx zIq_CM4y2fj8FJFCj1jMrtqd8CB#=FGFD$mCqHT-`v*z#C6K`GoS`rBj+888;I1$S&0TW*AGr5 z5tRkCfzI`&`V-7bHKNe_B?0{%0hxBFFVZ3?q4)2R%?Cy&$aOrFKgO0pn4Pj3eC1yJ zxQDBuP~~oEXWh{pbIS1B#<4QL>0*Lx#3ej|t+p1KlXT^DaUjgaAA;nLe(N2WZ3P{_ zT*xJI~x6eUKD z@0}_xTuwc`ZM&=|^+PPp*Cwe&M|kNLcC^P5uo_ zQU{BVNV1g(7t}&<%zTR&Q`?w7DF%PX=B0;dx!*jycsGGPGkz@~@>Qm4M>W!*?7Nb{Q+k4(}BF|vwb zX;K1vz##Xhq*VlKV82iVp)TdGo<&q`VxgzpGKSnSX(UKCB|<+Dk)3-61iHE@9holkq6jmReK0W012La| zP`!SXK;$4W%m=X!U*rP<=}sxCh!F4pe3>tY0v>_`o`^*B5Goi5#BYKF?ufSpA}ixS zXvcw&-e7rcUW7mZWn9$+0DuaR4e$d*0Nelz03(1LKobxO(EF*^u>kV`Iso;67{I_! z1qt;_4}c1s2_OU^0>FTB0Z>7s0f=C=090^H02)v+013PY01v+UQ%(BcO&{=odlH}( zhzqD1SO9nd_#6ZcgdfBKBn{*r$P~y8Cl( zhzW>uNGZr`C|0Oss558=Xb0#r7<3qY7%!L_SWs9>SQprOI7m1ZxHfnU_(1q-_!|U5 z1ZRXXgf~QHM0G@4#AL({#AU>1BzvS8WK!fnvjlr~fVDko|P>L%(7nh{zJ+84SZ z`XB}fhAl=PCKM(oW+>(q7Alr3Rt#1V)*&`6wmxz(IL?{F&42W@eT<-Ne0O^sU8_2Ssd9u zxhi=R1r0?cMKQ$_r68p*<;*XdUv*S6RNhnv)H2lnXfSE4XohGWX*FrXXe(*kXpiW? z>GDuTn>8a@@=#A-Z==164=&u-{8RQr=8T=V)7-<+a7_%8Cn4p+^m{yntng6lS zvFNibunMu}vYxS7vZb@#vm3HEaUgP7aSU)ma!PSFav^cKaouo>aJTbd@Feg;^ZM}4 z^C9w?^Y!sF@|W^o3UCPc3ET-%3R(+R2tEkO3e^dH344nmh**kjh^mNsiq46NiS>%T zi7Sa`i0?`8OV~(cNRmrxOJ+;1OA$)BNv%thOQ*{a%6Q2<%DT#4$^DTVln0VGk{?u{ zQ>a&zQ_N62RZ>yvSLReMQ(;x9rbs?FNW zNzH@Jcg(LXKr9d}a4gI%CM{JhhppJGGORwVEv=Vq^lbKR1#A;-kL)7)xtmC%hyA!4pwG+Qnh%=&d zwF|$Cv@5l1tQ(wLr8}Z~r2C_#t+_)#?RQ#!7t0N+i%>T#XmFvH6SqHDX>4VKiDOBFN7&XC!{nKJk&e1It(q$ zJ*+33FFYZ9AObl;I>IwzAQCrHCNd(jDGE2rIcg!AAlfmyGWs)yD8?uzBc>_lDfV}4 zOdN2WY1~lUO+0ygOngrQe1brNU&3)Be`0_;d3r+zTn1K#X~uGs7bM8@|R9Te^ri)pNJxa(*!b>hoc}oLJ2g<<9g2Z%o;o!VjBK7R5mm=bTmvhtTgO2N;IZ64m6Q9 zxizget2F2Q1N~?6Z>&YQMY`pvmAN&y^}5ZhZK<8&r_;A5x4(C2c4T*gbYgchc1m>W zcDi-OcV>5%b@p^FcV2Ztbm4cgcFA-ZcX@Rsc9nPacCB>Xc0+a(bhCBKcbjy3cPDk1 zclUI!cHeb>^+5L!^>Fma^_cc}_ayd|_w@Iy_T2PB^y2k0_saAd_ImWj^_KPa^se+? z_ks1{_A&RR_S5%^_5bO2>W}Ep?{Dd!?mz7R7@!>x8PFWC9|#-B9cUgT94sE}9Go9K z8v+br4ABjV4rvdW4fzhG43!Rb4=oK{4ucNk3^NV$4oeK{4qFbp4#x}^4c85K4lfL! z4?mB9j9`w)j%bV+k9dtFj^vJ1jP#AHj9iX_j$)58j!KN`k9v&8kCu)$j`oZ$k6w;} zj^T_kjY*8DjOmS8jk%4*junm7jdhNVjxCN|j02Bjjnj{djcboPjz^3aj(3bNj$cj4 zOf*c4P3%s*Ou|o6O!7^tPFhU{PG(HjP7Y6QO+HS+PSH=PO<7F&Po+&&PYq0MPCZQn zPs2}>P4i4EO&2!8P&uh%v&3nx!%;(HE%y-W(&F{^> zE+8&YEC?*9Ef_AiFT^brFVruLEG#UXEj%s4E)p+tE-EcrE{-g2FFr28Es-v9FDWi* zFPSYlE%_})Eu}5}UFumHS(;f|S=w1TS-M$zSq3aaE+Z~uE)ydket@Evmt^ZkfT#s1K zUvF8TUO(9Y+Q8hP-(cV1-;mxg*s$2}-$>i|yHUF_ys@?MxCy(7x{15Vx+%A*xoNWL zu<5fIv6-@&vst`Zy*aqKv3aohzJcwl}IaFB7(bTEBzbntlyb%=IIbVz$Ba;SCabQpD5bl7>gba-_HaYS&$ zb)<4+c@%JzepGuje6)4+cnoulaZGYdf6RTXbZma?cbs}$eLQ%)aeRLQeL{FbbHZ^V za-wizdg61Ed{S}Jb24$Va&mBTbMkQtd5U^UcuIL1c6xF~eP($!eNK1oc0O`Jbm4a4 zcM)}wa*=aUd{KSTe9?6=bTM_Yba8nJdWmz%bSZslbm@JWa#?dZa=Cl?c7<|9b0vDE zb7gVmauskDbCq#barN)2|7!Z`=<4Mf^cwLR_nPvWL{>J+z{3iJ(|EB7u^=9y9_Ga_u@aFR7@#gau>=y18 z?H2Er?3VVH^_KTm^j7xP9+HB>2~Y(@ebw=4EP->f!f;!Gq0%$3w_N!b8qO z`9t%6_kt=rAq14wa2UL%TAxiAn8SDUM8cd!ja9Ww&#OJpBRylOEH;;-TOgo01RANT zEm}mW&CoV*Dyy{4E2}gwYkvphb~#ST3fc5@T|a+suP>9bleSK~PcAh~d4CmApm~nn-MN#!NnF3wQ{c=Qy}ovoE3>nx;Eb6QEeO$}iuEg0XM7qu5rcR4 zw9XtO?J8~S7j%V}(hCq49@uhZSM@+F{DR=Hb=Z~l8&`s4 ztHI_Ku2J(^ln#OxAuLtK$Y_dN+E*=f>fF>qihD?t|;N-CSYi`;bWU}A2cd3({}RE5nfE9t{2YA#{bI}5kZ);^f~UD7Z3VfyHo(Ap2#S(evTdT zO8_AvP(e?qUPz-(3{AXa^|B1zgi|CGoIBcDN2P{lmy>K3c}2i_k%nP~%+sWlj*+UX zXLmh$h0SRZrnN~UmNl9oC$l%2WtFlT0UC-1eUHR%OZdnzwz?uQadA;ZmY&iy#HUom zXMP1xD0DOIcuw2i<_S(mSK6!9V&m8=%eKN;rhEf&a=PN{#H zChoe!kBJGgu_s}07t2kblbNZ()Z@#Iy1$1V+3C`#cp4Q;-Y~ zWll3NG$2)hdo@`1Gof%H%{^gtLH&4`pEwP6g=pmDy%6ssUrs3AZJe2K)=wn&*0jAb z&3^9>Cb80$(Oh+S-}Q#^sJ`3)n$Bu3Ga6opn#|xgJ1wDK-8n;Zpc36ZyBuWM)nczvE`jlUw=biHPN zFatGA+2R3++&Bn~Htp>_D{L`z!A|2JJu$kBcMKPgA6Bhpr1`!bs?Q3XZ#co_8Ns#* z{e@I3Tfm1&<*=;~h>(_o30k2L%tTtt}ou z)E7_{(RM#lt<><#k{brTj86kHc8@bj{R~2o1ow2}=i%xU1~_t)lD}EDfDk;|NL8O9 z7;#0vY=F+FJ^Bi`uP)Bg@0$Anf`uUr`N@&VoY6n$*-Y?H1G?ThYY^YF7$G|p-joNI zy%u~C{D6+|2{L}MChS$a;LL-av;*c4i%Cu5=f-$SJo5ecRyR_asY9>lT}n57f(=RE z3Z^cY!XDZ@V6+oki$9_4e(N=2JCK>MO~f^fW{ ziun?*PDS}H4i7}hTPW#0%Yo1@) zyLsEk4<~f%yy!F=jb?%2qkBVdpbEZ7zWrr)Ltmiz4&N`<7TaIm?%(-&h^bda0UbnM z(ichK$VR|GVw9Ev0DmTM+sVC+7hHSb`R9C-DnvZ|aGQfYG6}Wx?hdnI^SgEXpgQ8w zHrYH7%8H=u?rdX+W!_-o62@6Aa~2JYfBa^pUC7bo(N6s{W+zFABBv_Gz+im}eDy70 zUd+|&dr*0?sDZXKX&sYjX{@J`-&rHM=^XU0r0;t^Yu~AQ}Dy zOsD!CoCndzX@kx+f#{O&`>E0Z800oU^*YRoYTkf2wvMPv+;vUnfMkCM;p99ZO)$YM ztWcpPh`VY?y09ixijdF_{K6`GIuI`BVxiC|8H7binUJPSuO}Y%`IwtOB`KMp26CgM z8y)Wz&r0kQV9Cd4A%_z5E2WK*>SDzGik*YPw@z~*#WM(e$ ziSxz?@WBdp9h^OE=Zm^5eq64&r6J#vkM3W{RF|+CP1MThB-GpNcL%&+bZbMY@+JhG zG?#&P@Kl`#TX2p1*AnJb4s!$WTd7FyAS6eEFoy8ADGTCLc&!LHhn)qyG8KK3p#0_b z0&cR~+o>-5y{`GQxtd%?Vx#%j!jbc=tdlc)&J1RErz^pFjSstHigo{4<%tDq>isA- z6_iE~KuC~6L2AnQw;&|Y*l!@*3WhN=@`{8g;wTfa8Yh3)f#GG?_(0_#V8(o)}XR04r?R1SEt_r1b zQlxtv0XY0akNE@W&KGs@A9=H{=TR4wMH&lY5%4g(G%!(#moykg`6@@YP!8(IHav#R z7WI8bkdC#m%)J{?urV3>u%>YuMUMuMXF2ki96o}QyU$OY`w&r{Il0eTVe)#`J%>~^Qk{TEZ4w`IJst?jFOQ!78dm@TvAamtkt=r)l+S`ffD)V}X(pFK(JTaq zJTfC@?F-+Cb(-ZsGbYAZjywfrEatFm}oFt_}jw>sHA)soxt zb_)A}_r(hS+@l;E{gLRp-`>o5b28J`^h!oX=x;W}_)#K)f2IRcN~(E9U<2F~rA>+_ zvWW9~03o95N|M_cH~ldn>j#~83p6FqrXLSIB&)Mtqi@4F*P{ zC@)qjv>!>2^owoV2Ut!Qt|U9pD+OB3j=dFFNL9*#zK?yNn6Nt+%*gACj*>K3{u1uW zvMQ<%W8T&PbC*1XZP>5xoC!=NH!k{8p^MS1m^6E8oP;U7&}F(q&* z1LV}VIbnrPm-{v!K7*4e+=rVUSGDFS^XzN8s%3ed4QKssMiTPatA@je*GlhpF;}U< zVQKHn_!p8vRifY%e-k~H+Qr05bTogB!H>T}v)wrneJ8ePV9EU6MRP`r;x<-lW)&r) zE0}nHlEal1GDRVT`rZDjoVa-y8^{6X z&YeWE@3~6#Tx2VA4212cj^Dn7XBnl}XmqQdb3L3yN>=d-A0%(3(LAyO2OC~wn*U8p znYC_seh=?P)5W-jDtF)Bw!)Zpc)>ti)4t8uC{M=@{|;{Ax4IkTdU=!o7>}{}36>QLm zY%ky-ppWHH~ zd!1MHYhr^qLTXiITWkYmSPleYJWl5gVFa<9TgH2+4Aw8yqlJ?Rr_(6 zr$!#S-Yo!}(ESDT>E*}BW-$_1tLzDB+F13szueZfc(^Jlp7vmdccYXb8fxmLE?F8M zYxSHzkFlytD0LPh3X&AMfq(oT=5$3$`ySjzkz`okcDS!$^1b60;R7lj?0v7P(&6aV5(ibH1r6Y zlN9ai^0lj}g||+w-DC)f>7iP$xOsPrPMjb*${tFp(G~zM> z1lk!FNOd$${0S#RQ8b>=c9;HX-|S%8Obeb35p_v0_$hr*4VOnLT!6|C;VW2tgEKG= z*Empu137$f{B9nyTe7?GWa6(^jl&JqdWKTH-SSnn8;9c!U>X@}E)gRRmyrmm(w+b|;K{)c_KJzqsz~fns`-&BCfgyxBpcwd za+(OY-~_jenQ%`h)a$WO1RY`LIi8izgil8^jXFn1s;=<0)ovuK=W6nt3RC$fLHXqg z^%i6$_%jKobvN`-Y#Lx`Rt$(yRDWh!(FfK^A*8CyV{k(e#Q6s#hi;~@BAWo7PUADF zxwv%Gu8?|vWq`P7-qrU;=-c|}^wGh!`adsaXk2G|M4vBGER;H@kBSA_Q8UHyfCb)X z3Y|1Ae&eGRo%v9?Z7#O+VJK6RNnQ5+GYq3Y&Z9AZ8Ms$9rvkLK1X75Z;h?iy$j(^7 zmU$v9Z-v1&+c5&@vJEVM^)AufRdCHHpgw?OG#e2sqOUrf;kiaBb}0gim|)ezXj1p6 zG<`4z$o`S&?unm_Y)$HV)2>AH)9t!qgU*6n>DY_Bb#^R&#p!1#GTH`hZYrFVaT@eYlLxSEC|(Lz76o#E zQ9W)BfLnnNo-M6XrSgT!0p*AmZr%fJIa&{rZ^2mVCqMFJs6B!mYR3~~&2SmQt~0KC zZf2y#y5)NROz0Ey3Ef-H-a@W`N0>l4v6BY6Qu^W!Qy$sQ-*?3#%1_{;`>!4PLNUDWQcwOv%o`P4#e$67T<23ZO^LPe=rwV-qX~*Q;zeAHi2Q zM6c}1KnVOhJ*`-3`aH=)oa9!zjgIqeK*(Wj zR(};8=U1)RTFXz?Z&h98TrtK~r%UZ31~Bs@LWV@NCuvf(zQ&2WV+@zM9!3R5ULRNLJXjCg ztimi2UgCHeFUo+`66glh7_{GP7X4{Cs+Kky{uXw*;9RX6%d09aL%t~BLZ5=Ut93P! zDJqcuYtIehodhCri*qVY^0a0Kv8M4Ls832M9t~clc!@%u{qX@$m*HkO>Cdn7u0kzF zvtH}7m9%Bg4K54=+Iw1qVta*GcjJ}wI>Q-p=mR>n4VCgKh}i289Kix&TS2I=p`R?O zWlY|+p@YIf5Mul!Qdjw%N?OPlq25UzV8~oVMv6u^U~$Uy#>?+vWHm+ixS|~DJ1!|( z>wH#E!H6c>5xmq&d4`vk23fd8iGW_*&%fj?pC3yy^DSCyMe2r6TaKCY3pg7c>*tYS zB3gh7jS{xV#(iD@;a;34s4~k{IO}Nx6~eqs9w&-vBTv$yr-3XqX0bwun7Bxu%fH+E zQ`aMHcMJCWZ5sSEOsw26+bHS9e5!I05ZF&kiey&eGunMb?Ad@`f7-iV$p<_O6ks3^)ZRcw z6f#(_1=ItWbYLBxN9DojjV^u`77S=p%(@VE7$&)v%HCJSL>c z9Sw+uOSy504%fqr!>k%t4<{1s{|sqZKY8WPuNh)S(}-22fh}l4W+~K9Gn?Q&QCEo_SV-%$ z!9Yb?uBhy7FpHAQ*}8(l?0&V~?RE_>Ets zSZ5Yh2Xqs)oCTsYpy~9{YE^rb)K|fxjY6Fs)r#Wi0NyM2Y)|0!2>#(ol~V&4{3P%1 zeKCAD0KOChc3?MwX&LSm8jJOepUiuQ>qR!Gk=K7SiWq4>MZqdbMspR!mo~-#chI-f zQ6a@ZONXm5&~WwVRrKG*uc{H4Bt}U_W`y^Mc9^q7U5p=auqKq@d#-hySWev06P+4K z??>)*%*A~n4Yg%3KHYlyycP0(Zu z9V}bp9XxRmoD0YESvCRdiDzAALeXK+|jkm?geQ``w#wp zru`q`=9H!QCVt0%`@>p$(V8pF`oR6UmyVT;@vuJrU5_wQH+aS!Wp>E_V1&fdfMgjX zR#e(;v%Nkp}`qxK;}Vkw4U6H2LG_dwH}Y_3mcOeJoOa)TZ44Q8(L zqufKSw?pLKG_Ip|i|fcX-C2k!a+REgxxTEDP9w*UdkC|V#ui#gi!Q5r6ysKPl~;OH z;a=_UvlQ2iO&(1j2|%z2Dk0G(hxovx1mI9pqm85LC9RN2=$e z9wH|%fl`XwwR)AW$X}?B6ExLPK-3TAe(qCIhTo^}}2Nsr(C-XBmVuLx#qVC}k2#<*JRo z{PljAbLNK@Ikr)=&Ynbh_U5nCIepP70!=89q`3r|awA4E(hDjRF%o1EBlrjO`3}!m zhNpa2#5FEDB}wWU00>veOCQi*6qvnH&hN|UT*d+AyJx_gi5@|E^73}T!6HT!6umx@ zZ&R3qPbTBHB_J7}I{0Jp+7j-gqElQ{@dds?@l~!mf$amb_HzU_Z)eqn3@8>O3i|gL zkr(rh71EPuEJ#lkJIB#j5d7!&>o^^bx%%$iH8=*RUq$=i68o?AJ8&%?h0MrApb5Zj zIU9k-pV*0j^<S;GXL3-&-vPP*Lo7nd_!Q7$BcshpTvwBpsB^%P&a!v7nPEd z$OW#O$Kow`HA+`B1QkF%Q6Ct@R_|-2#f`4oG%;8Sqt1k;WPS6)4`|;v5tlPFxl4F;y~l@7|F!DR!f)?KPWS}>eC}bd-j6Tg z-DsmUPsI@mub#j=-T|-RfY;kvaTN$AJilFp9fd-FS#&a0-uUnmQw(wrcDJFpR)P0Xn;Xh8%wKTJS3WT zA*)m~ht)<@G%J~)4logliRND(TGVRx&NkKCcint&$!AM#O)7uZk5i}Lh+b25R9}>F zsmW$9G_fDi$xCo59Ll$2o<*daXF=_JN8rxM*z(pKq+lq~N9xUbYQa;FV%H8=XAas^ z^j!GN=}$l~qQskfD?|{v)l~#xX4krzbsFRuZdMk`f+SunNMc|@+`#%^44SNpWkMwi zsX+u0n$k%PB<}H&HiOrw_9;%S%=zZbxvZSzJcSf4*)VTvuP@IA{rWTvR=REe0agxu z@RR9>WM|L>f zOi~p}oNo(e1qbCX5}FLkP-Q4B)r*a`5WU68bhDl?X}+ovx&w>ew5wJRskUXP|2}i% z?$KFeN6b~j#_03g>-(gosps`q-ARM|=@&m_jheB3CN54RbTFdivCxPAgIK`TK~oXc zs43|vo5kJ3q+6pYq+T$R2M#rwEQ_ZyvnVZuRia`ovCOcEH7RNJnMnx^0Ri<`u{Ep2 z;yY}*T(Bu&?vml-lIA9*A3w2a?fjI_hpw1k+<(G}2Pfj=PmYT}F=5>NxrqyxZ9I4B ztCYm#DN|Dyt^ex$iA^gL(e&v*Oq+gX`m`%kr~KfI%2y@QAOOURfO)Ou1m{a#L2t-% z#L!z3RgQ8%0m;e%)ozz$iPk_4A}@`u76tkrj6@Y-)Q@--6!2mA zDL$N!kHJRdpAxUS&IO_rd!3ovX5b^R*^F&7Q6aUHlZZrX$0VAP_AfYOnlsrY3XrQo z7?0Qp)M`x1&CMlRz*PJzcLu#C-|mgI{8U1(QQ%WBUoIM*rH1#sjQia{#1a9 z^&JIhvKqUW;RiH!MArOh$C)fVQ^(9|`s!%1V%^@Y99ze67fT^)dXoDPN=G&@!V(c3 z>ncI7ji@k{a)*4Wff>M8LE#Y=h4k9QD21Pz+q@Mnel+fEizT_)8xyxLzkDDs?m)Aa z(EIK$kk8q%WclU~7sBA3@eS|f+ z_Zrct&e#oOb9<7vx1V`%apr~z1Dkhj+OgGuIlC)V)DLOiqGPkpTEmd$J;%_!7{dRK zUI-_FiukNmXvL^|R|id;Dm4;IFsDxnW`sLm3~`iF?v zvw@e!i@f2-x*xN&NbVYyUWyf2_Rbcg$qI36RI5$+nU@ztQ(IZ?3plFB!wot zMwTpLPt+PPYO?&?)W6o-=t!1Sk~M0&ql_9ej$}y;O_opuStN964JIj5LP;8p^ig~^ zd-B}OJ)>td@348#q6O=N@YWhVD~;>Y3+0DJbe}P7?3Ad5F_AvQ=B`MbB*C-sM<_B)p`>ed`xiWN9a2WGz4FZF^w8aG(qV*hDkW`XfCg|#MQQ|mv=)} zbZc`AVRpVP#43hKm2zQ(KEpI&gg&D~!WJ0u~`dk zRx9loZHVNay*s(Z8ffuvDK!eLrh+OSYOa}#=7=augvAmmHT#%*dlKFRLYf(yp&=~| zKWC%~^Oixwx}CG9LG3C(PBX!_u~pCZgBPP49@KZ5Qs+(>wr4jCrPTR1-ph5GH*L!8&WN`TnON53)_eU2oxbNFfE0wS;Pd8*PU~^aO>|pbkFD@2wE0+NdWu%{$noUp1tKJBa)zP|0dv=m9G;Xkd_;0dOq(__ zv2EM(dBZnu7%?(AIiO|z25mcxZbR-ofOr*u^M8>$`-4_eZ=SmkuGW;>t4Dos_mUF9 zk6Mh`-aqm99!4+u3Xc#oKdEJJe)gQlR*5|`Vby!6pY=l;#^#sBQuv83j zi_pj*WQ||})cOeYlN!Mej0Lm63c$sQjRA~5;17a#v%W$70KiD;5l%)5e*?mb~f_X5f2D2o}YyS8c7xJCW8XRqNxABjXWS_jLXys^rXgBdh3-SjL+y zEt@U|#Zgm|D-0wQOPfTgzyI+){A#TN;G3+63-{+<5WiIiI*GoXH8?@;?t74XIK|)* z4w7|vc`JRTP1ObjI6^8^K+|9*>;i{PJl!ZaQysS}sZ$Q$z`pRSjj3En(WwawTjLr6 zgXt5poF=Tsu7-$MO+I*k>7fXLN-8td5-~(gnouoD==wAM2YUSseUS=Z{jua-NBX-- zXcU~vwI)8gN#q>$jl|PZQOK`Xyxq%TNU&DXB&k&t-Jrdq*2azL_b1|Za2KGN@@Aso zuaVkuEp(ZPhGlWWHV391cSXkL-UB(J!haOD^hD23dJs^Hm zl(lAcbppNbG_(P}WR(?7Md%iBD%;>0AaC$QWg9$+CQ?R+N5YqB*Wn-?Ve4M?XMaH? z%`_x(7M67iBCF%12r)-3EV;lFy()5&rIV%MP%3unLidS86|)vzHkj%(E< z)-fvilOVeXtNzwGJ8ESWf9001i&}})wbp;>N)Ww)vy;K28o*s+=^PQk&`^#x&=7^C zXa8U*r|eO@%-??D;sb6R_pQC10kyXu3_$ts_Q5m3Z~)#U*i!KaDfZvs6m*C1PA_nY zyTcD68uUXp7eFl~U({C7OU+`TJjcc#Ko*gt6fYEtO5V${X*ANKhcFgG6C{)Zd%-sN z;AGeuww{a+!Zwrfe!QPtb%Y(J<1F@oZPQ^VypKxcNhMzim4)ZP1VX?EV7SOvuOV5p zbVdbF$8eO>dgj7rkcP!b&FqOfcokWlN@aOfXjS@4?k&pBGH8p^92?>2oiW8mDg*R_ z!9+72NGU{FU_fa>^zL~BmajZQD|WB08MbWGB2-*+Ac`8g{lI08Gk$2l)n}@!I=b_Q zCwXvq7h1bJb6d$Fd~?vNWnAJ|{Oq;wfqBI%n$QAX1hy07HjYq_FR>R02S^!gb*U_o z)pxog0uXphwPB)0dZn?-*a2!ht3E^PN!~5BX7pM|)h_H0O-Z*W<2MiSi`-mjT%M7U zDA@3=5y!qf_5`0MFF�O_?%11=4J9$#Z_BLPvbSQDP{IytoOD5Rc|hx!Up4Q-Lb_ z33^8xsC&!)T^Lt z-%tbH`Kyl|xYx{0m%^*!01&%)<}w{Pg+o5lavL zd1!*IUgNzZzW>EuO}TgNnyJ<%>BZ_+>Gd9cv2-NYal%?H3Q90!cklakO4{CTqo#k} zNxx!$mo6Q8;F4b_*p7Y{oH#YPP0VlT^Dgb;xTxJrg6AhuzxYeqBd@3lDuWutc2?G` zC58NL)f{+dCTWOgn#4a)>FD3ovRCdUI5aLMBPXcSO4)8_W3efMMF0s!nPN?xCBhNj zq144iz5U{P!ou5A#}&-^YHFQjH(Te;|F-_iec!bnjzX9GXVsR>*)!J(M*Id3i%Yk! zoO3TB>DRgAk1ty@XkMSXn_`yC8C?9=hYedF&0Koo!9gnHT7o@%Ek2jL@+ESvi>Q>U z^_9#sQPN1A=O7PCbv`a@Na1c5XqwTgqdpY0ivq2@5xdLD!g zn8ntpQ88v?K8Wc?qdn93DE=U;UyA@kM4ovFR0daMlGt2cy@9jl!M!q53^ntTI;LS_ zUKS=611tJFhC_rDIx7*F=+(0AVG>y{31Njp2FFDAnSOu8=Y3nx787I{Q>@{0$eJ9aa_e0edT?Swp74#V(W7-nC7jOa~TLfMUY zjq=*6p!d{P<>pG6?e)YiXv{L(Bg$d7|6V^vC5M7+oK@VUfN|MJ6$RA6vXa+g33-ss z=kS6Gr@uqVGg7JwX$M;k7^x9X&x=XcfqTTaugB4Sl@}~ zzd499HxRJR%@&QFxvvwU`}KPZ&lkVidQg|?m6|xqn@eq1 zx}!=jW_s3TPqw;Nckh9kscsDlqCxs>kn~x}r*g}r*=o7;xnx}iIIT+)Gu_LU8iqUU z%mGtxEnjrDVbc@i3ZB~QDYqsZp3-K~-wQ7`Zge`~Hhzj&VRHTJ;qsyZq#N#+m?^InyN*9%kSNJ#JJr1PEmiU=3me;3JnH*MGz9o z?1{pEng1mUQXE6DdWJH9oYDl3^twQ&JcLHmhEgT5Tw@~1HO(tnh>sddD+qG%L!8gO zdUa>pl7`lR^j~0YICvv|nz{3?e{sPT198inf1!j3R%#Hm!nY@0h_kw$#77ULL*Z7~ z%|}F%l{~_2(P4tGDqx~$2o7=Ki{+(4+$CALPLQ*3hz^qUs3-7}*AV#?(j2u><_|J8 zD$NGl#{HlD?wB_#IXy4|Kx&}miyqiDI?JmNZ-|CWlhyRD? zS4_z~Y)tYxK8!)4b;Q{V%DoaD-idU8$f)SQB1OK zYMKs?)Cd74rF&1cmVd)S2>A6{NFxZpZ|EPFiQf)@M+&}UjnzlbOOb;euu;L_?_twD z8UT(%^0=aR)cm?6GcHF!3@6S;V2 z05Qg4WRW`i=B*sf{+l-)J*|q$3Pki#JJH8YAL$6NI#~y>=Y%m4`UW|afQoI7yhqtc zK{gPft3YLXT_+6KlywZgy3*RM-}OiDMM>XZ_OX9?8W#uf^0rs0rc&_dSAsw=Kvc4x zFYumX&!F-q5V+z1Mis-oktP{Lg>)gWX_tn2NyfBWnWeE2iWdBnGHiTlvE`?qR_0e` zC-KFH+^a6Vj#_0*M?7+5cci9J|y8~V+-KCSRqbWyoEF?V|FrO%<*rM$b$rj^4V6ss=j8fq%p)h{dQP`jmB(65G$3?XL`05_4JLX+R;6>|h1r83hu9 zu>zGFG*8DnY6FdC;;KgLBRR#o?b_u7HLM4Oe~A7OO2}`Al;*p${b4X9 zzYTac=75l|ica8)jWlv*E;by!yoOxKN0OJ4vUVsfLlPh^Yg3cf zOli@feM<@U7jU?6jKCf!BDEL$U3poFTPevhN99NlS7#2G%4Z{sq9aff8mTUF#sEje zn9ls>9B39BD`A}UCJle+oRxyCN>6Y!el)6le+bq3A1~A zF=@}VY2B@#HXGQy1%?HqIRX0lL%FGDN7%p!Am6#TJdKg;Sz(G@rG2AqZq;p%WrI3Z4& z#M4AwN8Lo-QQcq76Y^G*t@UH2XSAiy$G z`?JM>{w-U?^=)n@msRUU0a%>L-^8t0*0u_eT(*B{QO2z{VSJCZC`0>L{$`2B`AsC} zzcQ&_T*sN}Eh#Bp!rv%qPxe;{wiRn=uamtme*>>kOay+QHm!9N{Q+4YqhdlxL|Ryt zjg@>HL97U+LTz8*kPwy_O2x5`;m`Joux*PzZIx@+w{Hje8|#EB?JXmRb!*tsyCp!y z7XDF*Qh333GuCsp((bXXJK(PfR#+8WoKy-(_m(Fgc%e<*SE-wuX`;9DXOHYgfPQ4A-QF)WB2o51ft zC6R>Y-}X)%r)VtYb>jKoxp|62R=I1Wc_qRZY}*{wKW+r-t#Pm2l_pwACB}4zII~cu zat+=;JY*rxb0q3wrDsJVeiJS)VIwlsk#y)pg<1SJ`#q8heDLF3w`o#4^(iU z;bC;c(<;_97&}1}pHJEVm&-s#QpuB6Rr>&66di&ixS|+vS>Z zvjd+j@OI7-a?ZFRlAU0cV>$i0|1vm8ZfgNHMM#?2O4tFd$3rh6-5#Vb;1?B5rf8)& zCA7eYI%-(GLFaNxC(7$aphU}hRnp!AAJC|r6}pB+ zxRZcT=&=+c>nJi=qXmp6PZ0fyKjHj~A-s=+xl8t{@DRFWFGyQ~+Mt#z)9pV{{I(diY{BC3VyG8uIeLS@OzUD>i9$bz+?BE%mQ}gHc??1;E|HGfBIPOhWN-3!V zAiB@du~9~x$XJs_V#;K819+Ct4PX*BK;9wG;-SQ~p?-maHI7Cw-zI>pD3S}?GMx@ zU^5|=k;YJTfAM8EO&jr}?712E;?Oj}W)nZ-C-d!zl|uU|E~ZB}sh$jUsn0CEu!^lvlc zD4n?vg7(r=KSeaMCmI8ECpo?6{9>&$=;cU_XjpfrTTX;~f!gc+O?BENMU1+f_vpci z^P{x(3#%7?-MQP2gtdHw;)hFxMPb{v!HTc^p$azKyv&}v?|3dea`+)Vs|L^J+mYQP z_B9wS0;v~*#+>}EWfhOB8?_o><1ngOWeH?Ocr})w_W_QoJ&#zYd|~c0QCUhWDkcUx zdanaqquZm&3lx|CY+%pn^WI+EKP7is0UVY%YIHKJxw3D<`lVx%yG{90IB{!lpVZp5 zj?caLvLB8XvPK^sg{Kc)xO`Oc@uYt>!+_V7wLXjG%kixM+-&P?3O|DCugHshmKjYhA-f1R+b`)dKT{OP+5 zs?36AseO>`{JB$!w*oIxTn=J$VA_FjFka+XG|Vl&=h@{X>jCm&u7ejvh%Jn$zc6A& z93>C3w6DLJotzSA43nZAo`VOaLM+GF^4K!HyOEJbvjSF0niRhwr{vUyHy3*jd~z=L zZO)2O;}*U;aqlUt({AABoi^lTCFM4&I<57Z?cXeKF{DqMj5P|nwlR1Pcbv%KV9-uf zu{dlQhLDv7!9vj(!U`^s5jfy=OA3mWfYIUTLsk@FG7-8b!q-A;v#YXWfON6MBI1tY zEsKYK()piGEz#&t23jNWg_vP|R?mW!?ehfN6x?m|;|0A31h%TsvwibDFVYzhbz{v|mTlr3jGkUZye#vr{bONo8o#GKdxMHoyv3Rhfqllw50snHe zhv+BuZTMNmety*IBoEmu{5JWa`0S&81>{Mz`oVayfd0`+|M=3cguF{rOYXUJKe<5S zJUh;0Cxi&0&f|t?TqqDCMW`A>JB@%B&@z9cbWDGImWS`GPS2+hVv@z?M( z7R4cl)^CYOzt*^kPl_H!a3Pdh!%JTB9}#~q2y_-T&IqWr>~sufI5@iV-Ko=A{l#_z zcutNY+YO04mVz1)7LHE5i-<7OsF^TuN+{fIsAY~&RIT2weWS`h;|G`E;{K-ST2@$H zc+s(6(e6kKm+BMVy(8*W{5LN=`>-}z?n7W6f+ur32}RTby+p3ImBDP1V6H*HtU)=< zeS(0hb`8hSZ}+rj73tk7@_}FBYL#o+0O7V!Dhi}_eiPF<7CI=tHt#&`fQH(+@$&~P z%Yf|`Bp*1v68g^w=`g(2sQPt3`+4W&rdyLI&4cLCs&Rs<>acFNQqjh*#-%k4H`E=` zB(q`HCLcGl)Q)U6V%^wP=WAC_?Y}9 zm5qm!S||MqT}}RGcPf!;3_|(%jWJCnYQbZ3cJi&b&Gzw4nlhR}3yb@4o7WLNwF>v= zgB`O#dWkw|7KpBN?#=s?xURA(HH%NkMvs9q0au;L++~-qGXZ zbK@`0@3MPg@~Q=2tmNC{pK-I_@h>y%Z@5S4&u15(NjiS~;=SwayrUs_F?XLp9R}Kp zfYtiCN>^k6JIB9BVGRnFdznT>kICZDt=CHnhWk&hw_|chZcb4A7 zuP5DDikcK}%2>Q))8-|MHgTKR;FsE^&k~`v#5eWNL}$_Zw^m zL|fSm2u7!#f{V6nyThrLmt;7JmW4cA5mF0l(Yk?`ji^z#`e!3&egW||E|J@6AF&{4 zZdB50ltlBcD+nB~S-(U>(eHiz60%Yjr?cTP!cnWCD2d=A1GE~zZVy|ZowG}rbUYrH z+&p#$@eS-#alyL-PhjXD_*eWE=ij@AQm9AJ1BVHp5f}mq)%7K&NmWNqk7mg#Sj&#a zknLq@vb>OH!QHKWA68Z*i;DNo)`->UtvU}O8|a0XV#F- zUi-H%j-PvfF20M4a&mT^5Vp;2rZvIHq8(7#W5LqDzkVEqE{vGD?9JN0@HHcjL_-7a zZrypkGn=r2s|la5H4)?1k&p7VzGo^?xsyp;3(V8hIy_CT z((dEJv}2R-L;O0Y1Q+F^?OTXqYhU59_zSG~oS@&13yruwJR1aKpdS8={f<2fm055L|HYvD^cF(1zBIYd+%qY! zM{QM9^?r>}Jz7Oo^|iF9imx5T*Daq|e5*#a>^Z7Br+`I+dR9zPb+AvipF$s_g&kDM zmAb}Jo^L~_tRj;;5yZn$N%gDjOj1yGI-zWImrJc{WkOL@Y1!@&_Rtj4a)1Ep1j*`I zgT1s;ISke70Y-_|D5*uo60Hs+ETIaCC}W*Osi>IPXD*j5nzr9mZ;TxQ~|ycz{M)Hd6y+b9fEU+OZ-W6A0f)3ZO^9OGKFnQIQ<;k_}z3E762&TKvwpb)`4o~g> z?kE&7fO7=PvX2H71Q2hcAb=kI5I|gt68g$YANmE*2^Zu+UIZ$0OQ|Ol{Jv9Elyp{t z;~QJC3!^i!{qdf3{KwNYBps(hXtOQ=s*l)i zg@VbVT8dDqOJ~o^qBgRiRH=g}Wy>K;qkGBcTj=CXAnsv&9aVag(V-0upp)~J^xzSM z6iRb+Y$Ft_ht9qb{skOy7b-BmYrld)kbkc|D;rmf8yw|bg_{ifE!~o~Sg_g8bHATI z^%pPb>_>?byS)gdA?2v2f1zXcTK2s3`Lj2&^Y@6@SG8j^y(@wRB9tsuSQ?R&)q2Q| zbZ}YKviKE1{*Ge_d3JCyYmS$7yHL{A%fnX&kJL@18v>*fN@qjNcyuWbj(h+iF8RrR z#a=HzpIZ+5Ezd|@%+*Je?djZu?~eY;qmA~#1Ow3i_ws2ImvU6IH3C5RfknFe$)qaETX$~H!^8REgz-97 zyLkuKf|pVgs@oe$d}qV!_!2g|ytS)KT1Is;abB)?^eC96SwAhqDuu&qUicRa55k!5)JvwpnDNlA)W51I+d-`%lz4h>VK{{Q* z2;xMY1hGz|8hd>%3Wy7QcdiGsY5ma{JY)-{$8XSekYSAJ6_~bu$0K#6`=7 zPdqs6*6|_R>vS(U@$;}F^CqlYJp}?Go%<3va?>SjwtieW%HjPd{c#we zeixt1^Krylmfl*RUaQ`w-mj*`FOW{0q$9|*eB-=4dt`n-&5t^coniS&D}m%SfkX>B zh`ifGR2e|BM68Q_fqWCxp2JY7$Z%Ie{OdgXYj>4HVJWL**lC_6&-n8UsP?yaIx8Y*pMnN77c z<(`OQUsenoC`XqYanf^50yQk91|tKcc_K=)(Hu=v@fsbSe;>(7{cDWVq&NaMC3qXu zq@?0kTg|zZGV#ll6sXOtlza8?t(!-Kaw{FZcI~)O1*YP^w{6FNrl1oiQlSrQ4}DTE z;SEnNUV6+8D_-~P+?l6<&9U1oq%iIA@&BMb%2gPOQiT!8k=@@%6~;Q<*G1PH3gZt9 zU_WxNWI}aknC;N={b!!Y0?)2Pg#4vb|NN~U2d>f4s?OR&_8)Pxvxfa**D6xW(lhnqGDRY_E=!Y|o#S1`$dx?F65)E}<#Bz>*dq2OQhm`^ z4hu>;QOj34QOmb#wHbY>m2VAw@yXfI`SYhvGnp&DD~89 zq?I77g`b$oQMAxfX^sKxST4srCJXFZX?MogXOaClYFLn)oEeyJf)#$TLGKmIv3Rl)Vc2{ht0CG;G}a7;>5T{Ml7!@r7+gPw2jUTk>3Sll6augRNqy)L{@xP4;rI zQ2u#s?&4DP_wsf0H23qTc{B2m-NC<~KZ?&@;lIhB=FR+R-i-dyN*~Cpc-iDl{r}jo z;Ar`aDfbXK#ZB6*XAp;oiO|Krcr-n(Tx)DlN>gs+LW;p}{cnMwo*83fu6N zi?B2P8EXH61;xK@OM*f8<;HC&)_xX^9t*1!K6%%Xdpkb^qDE`zTq#1?)f8G{Syuyt z#Y$3?uM%xMaPwe8JnQX%PUY}ZO+d%`X?0TD6m#BXu?LmMc{Y$Xumal( zr6-rjYAs3+*o8nkU^n}yslbHdvNxIbnFxiJm@dsnT61or~;a zeNQ`{XGNjZa_YlcPNm768rE1R^ATfXWAxNHlsc02%tu7?nvC|>qMRi;cHbNbt?&>0 zjkh+X!%|oQ+KS_F4K~H|NAw0`{2f`lk!V7mKx+i6${EWpYhsawN&j#B!=uzcETIoh zPci=gho{Iro0~HiUw#Vb;Vt)|X;#jcFz_DU4Cg(CS8;Xv57j|lxCzXo|LlL;FS8lb zCBJcd_;w(IMi<>?oXMIYS-}eh-Ak^F!o7@=kC<%@ZyZiY_h@(lecBYhFPw+_waMYNd%xY-A%0-{J{>j+Ksv{RhitNT^Zz!Q>^&Z% z60s@cO2?7hF3*r_m6L;gb8`3wMW;Ap@iV?b@l)p=r9Sm3{}1}qS#P>npdh-9T*k}V z*2gM{uK(|C>vtCB=1zs9@8Pbn@R?iN`WyQt3U5sUFURJf6HnG{4!R6cGEcTNXeak% zJxhHZo-A`@V`7LS%jM#g0lJi}ZK8X(_ck!ZZN{VUufGdl@&AXl?|^IS>fgWT+?#|U zkN^Q>hX8S-vaF--UH2Y1P{he{;zDr`)G8II;@*pJoxzEFwW76E>+G=FYPW42$Gap_~SOcW_Nfs#&IFf>Iq~G4q!MDGk)l(wxlQATDBl^UI z){{ti`CxwAT7347M8gzglpN=eHOKngTv64ap^OO=N>75?@8LXSW`e4h_K9F@1lxu2 zWRXyTjm}}LS!N6-C`Z`ZQp-eW6r{wG{6P~~BPtO~A}W(uN8UQxr-iBAkYl%Q9v$A+ z)T+;so5DxSXEcwh+j{1b@(J0~8%Nb@Hhn&H1|A?T2;4xm_2?>k@GJTu6!ihSf`I>D z9@oF|F8^I~Mm%!DlhxuLOQ8 zJ{@a-miTWa3d?`_=ildFaCYQY=qxoM-*d;?2bHamCPC7qg7FSMO=aP~_!a#B zfBF?9h0@lq5Deae>c_r%P=eynY5d%4bVlk(EM%6!6Pvf3=eMBcXw0~TffJ#mH!HGm zdtE5|a;m75yb4lnwX!nC^?ntL@hVi}y}McLbr05FSKHa^a_gf36T|9j>3~V7SyJ-u zj?@Quf%bqLLqcQoD@!jR=>>15y&ygXmE==URgOB-`v2XhU}>YqLHq1lR@o}RjjVXd zKM}feA>0BPPr<>Sw2C?>HbxZWq?S@F4n+ku430k)zDaw z>%NvhGP`fWo+NbR?~wd=OP=f;wd~mD{ME%|>?>X>>*HQ}<9==u-6Y%yw@QB$!#lx9 zJZnZM8y(enOS5w5G2<;fWQr!1?NJ;O+`$K3R1W{jEl3lL?gU1peE1Enm6|rrrfA z^zGBe1Pnm)HNr-x`OcxQA6+bdL^#Bv@JhTyYu0_Z5u&$*h3NgB{qMN!%Tx0EdNQme zqKdcFHF#Ck*z}YcJT9KMx(F_npdTwP1NG?CM^w2Ov3#0~OCvXUf4C#w`-vE7VYqIk}#nq(WJ|u8OeBe{zG@?MrL>ZMM4C0QLlKCr`xTqmPq+WC}6$UONj;iok^tsI^GsSC(O<6R2oO&d65*9cGpaKRh@ zSx8uFiwpBN?I)*|0b9}w@oM$KqcBT!miDeQDeC?g3(0I{A3{9_P&RY~ipE)~gJ zcC8IFq-C>aqU#I+>&lfT5F?yIZx|X@;Z)w@L-vQnGV zOUmRQCbZv#c1mj8yNhT&7%5qg_&l4eFmj;;DMc6NIAX^jbTL_Kj-BBuPOxWA3@o#t zl}Lb6kv0%7)+frz-<+GUw?T}Ue)0||%}C71zBF^p*y#%6yGIuv^cygs-~Dq!^9{kT8DxED$r{3B)r8GJ~la*FAN)gi3Z(q7nZYkzAm z47M@J%09$v6#K6pxHw?w=R3~;6ByJhF|{OV@PH&dwPu6yVs7p^BYa@ikD5F!8QwD+ zlBZ1`1s@V#+y{6)mn(fZ4Yn&MiQW>vrFUhf4V{82K5LD;lk8q+7Or%c>enP@sG;gD zWOL1&?2lHeT&syll7SPgTNJLvinZVI+qaLRTBlE!fR^~B=a_V=WgFpDbmS&4G|mHU z(Q)%!)OPB~;j@T7c(meYTou)dph{p!1@%=Z z*e$7MWp5CR0~bU~mo=ocmAJ>^-jgU8EhiFE*A$p`NwEef_x%8>`;mOXLpPK#*!=B9 zaqI5DGnRzHOQofJi&7A|p@Mt9Zv%SwZJz(n==mB^N+WZ84;XFUz1sq15@!@PayKf@(87%6P9|I?PL~qF3v|l>7m5)$;iXm77+m_$c z2);Yl?_cWt-=Fj*x>3qyY{1z&v)!GbjsKdbfCE6s^Go)e*pPn#y6uI+1@lI*<`Ou9 zI*|uWG8hOu;&u@xum~!t)l9qm|A%%#8CHog!*RPj9JkA$f+L6ZRkaOxdzi{K8q1z%}_Pyi5_E+ z^%<;zN7Ekbgq8uXUh<`2=BEp^rEZHiWD95bmw(nm(*)7HQ4Rdf$N5^f@1krlZB;hZ zoAcllpBXu5CYXKqHe6_)4xSUObS<7qQkxlob@0hzprnHbk|B2Bq^&F~v*#PP+RuUB zG|xYfYNde$9*L1-z7(;R$p|Fagz>mXglJPw(%~z+s|C?sy0ya9Tj(49G1Y_NxPZ{4%&VhWC$kMNfNm%eA8`Xvrf?8Vv(CNG8TUna?xB`WIhb~EjCs7mXr2k@ zo2Of+Kf+u9C;O7==WF4KhXhku)dbJGj*H;(#b7Dl0tbz(#(se)r zX#Z%`6zfM};E~;0fpgXr(ZzyCr8{cJ?@=w}YH|&+mQ*V`hP1pEiQ;p(L&kbhRW&9m z>PV+qvQM#w!qWjvL^TQ%Vf17GAw-XQAi-FVger`+u{~cqq&7?tYf1IJ4a=mkr!H0} z<;zMe6ndrB+t*hmIbI0O8BLoF5hTGmyg z8LgY6=LL&_*F9<2c<0u=V8Nbc9jAu3D#|UAhAn>Aa6D|Ve!UJ`_J`VSO>TBoI})&}Pn2Xc-;k|mxn^gm56N}%8A{4|NF@(ZEp0Pm zeX8I|*dtK^qKQXBo@9LacnWW;Vo;fn94QlcZ{hPJN3J@RzjXQn?yiDE1>Mlkf4l~6 z@6rJG>Lq$jnGs$JF|_KM;2A9y1u0KPphbE@Wu6S9i(AhY|7x_`{#fJozu`|-ihq$m zQLg=oa_vu)Yyalt{tf@f_`bbo)|+*Z_*4aIwR&b_6k&y(U)#8$Ugns7( z%^Tge0k|1Gn6nTOZp(TYtUte-wqoWp%?FG8DmIRj9| zpz&Kf43yR6l13*Mh$0@~=K88|^9VQ>Y^~D+r|5;r^+1ajA!z0vq$&ebvgh*6^QM8l zO?$t~lq{cmxFxPa7rX{>OKh^etL|0%YGM&6++}VV7rT~tSrJ%hTflwa>V;kQwbyIi zfxYjFLBBjs zc!XYtj2amRT)&l2g_qzpei-*Gf*UBK!;tE@z%mDDB-Z!~Pm?$#>IA#cvN!Etke%DZ zOXj|&IhZmZHlTEuw2KsJB{q7{ZIh|w-oqoNL-%025mP25nG!S7N0^}D7N`}LmKuug zK2+aDcZ0@_4*`Y;C^O`rY zitE}iI!39DF=fV>sN$wJHyf#qZOU+qj2)vSSOeC>6%!Y&4O42X__^@$>ZO%1M74PE zBoI+Ru+C_K%KhW_?j27PV`7YHrn|!3lOxiJE37no;)t}=k)vyO&psC8mp&&erACL- zV^ND%eBq!bilX1XGGDy?Tc7^@`#k>)cDnuhhQcN0^UK#QnF;ox-qV+@Uk)2D-U!ZS zg>|o%<`JGUUehxGt?J%%%&3NwL-DB3u6Uu?qxhYx%{3=noT78bPO^8rDdFHWc5sBp zWwocg=%`ntqwZYI!Wrew%0s63)~lL~Mej{dQ~U+-Wybg@W8E@i-KgR^He*~@ZHz86 zMn@GlvAG$qHnuJ^wvNK>GIp>Xd&fghN!$OMp>MV8%$Z$fL!;IwZY>qg?CO~?xL0DT z38W40k&w`1Pn~YF&(!zJn3I)Sv(wQDsAWrj!=NTYoBLD;O8IA~aUKY#H| z^k~MCX~{2sNuIoT7SPRH3@&Ab_H<1puWC^H(Oj5W%Lo*1UA{A~@Qi5nxL{tG8< zM6AwNN4C6UXKi^az79Z#cm2E5_W8JRvt|+LMLoCpxCqAf(jrkQ*-Oew&LSrG&Nyu; zv_O?;4YmS>C{gL;Cc{&+-diFVXg>-2LS$5NsLc>WQp-sn^&dUFKpueiczVm%@O5}} zaQDA?e1Yq@adYO7GjcMTFPuiRQ143abJiK|+XBP@*qWNHaAn051su+ZBM6aK0*oVq*zq*Rv z2_&+QvT0=heQosrZ`H@lLSe|I0+3;=iF#MeusBh<@Hp z(8D9UzCn-MfQZk~qjo@lV*4`?(E&XHr}oX*gHD4LduQwg6ZX#93p%6Gd#CT=KzXvT zqr#vl=TroTmy0Uql?;HrAzo+j)tcRQ02lzaEA+F#kK@5z{JC_6Z^cNZ7PqfHZ6QUT zF6LOWUHk)33(gg(aM?$~@{|lP-z}GnP+kNidSP;rFhwyqA|T zf(Zh0ydhd^{=G{Ra9H8fa?=k7k z7DbLtTaRP0vkjbHTbgX#R$cs&E90N(MI9Br)WrjB?&D25j2;Zb)Wyj*_pu7lNL}3A zmC4bKt6V>TL8kMvzN+#o`%gLg3g#Qgugp#pPfbdTu3s-2Jerg+baHxZy*kkyCMOJ? zlomTU8eN-2pVg}yZSH1yqq)l@`5Ag-d1LHk>9cjCg+F_b9^JcMd~AL6qW9?JJ`G~< zGv_|ZqkA`qiLYmVLw-x1q3@;l#n)5#TR&m*zCOv)XE{7ib8PCEdUF^sH)Xxw0SzD9a z@*+P>liTWiQ+Ko<3>UVzgPv#;(o~z7*uDw5fCK7+HkZp+XbRe1hTlWbt}Xhq{5yz_ zw+FQeI&?8wr#Pspj!%sT9EW?i88iT`fQnNKSrsRVEMS~%ZV&1=AfH-~)(MBPZ4}A< zCVh(AT=9~8il1xuDSykStg*Rt8k?KyAU4Oa88OwX?}3&QVKp{F=lVZ}=SYP4KZoZO ze&$LS-(5L%?RyhhjA2b;9(WglmXp9N(18!@nB3Tto{;sCC{F)Y|1WBJ!1REXcOq4*fu4F0COme ze_Sg`Tbf)D4+2^a$}WWF3qhHqNV}J#VS*l?MP7JKPZa|tbf~~e_EjdIg;5?HgQ`JV zLo7P0RTNH@{;J*>qIO zz=lxsOWv$eGaAh@|D*VN+HxDNK*Pl3^jazS zA1&y4bE`A(vPt2mBmmQ(JINu%Yr2(U3O>!Etm(@COHqv`ns0@iOTcTBlyME3()xGw zSeQw%42Fm#q=ptu8@&bHT?B!k>0jT& zk5_@~pC6`J?h z@JLukx-aM}5S4!g!d&|P-=+KfFv68Ut5gYYfj2jTdk++`!?3H>?C>ZfrH_`v#smgk z7f2kB3M)sWGt>iG120v9&`J>D7D@vre@9!o=Z-Ed9i7_+v{o3+UCj`#c=gJhfuCmq zu7ZPeWv0a}iuX9vfsw#uU^1wWR=19%pSnkh8!Z^8k|h%4JjnPjKL% zbFBO`2whG}C>7vJ<+Y^zmWd~`RE=Ua;8Yn~*2U^9#agS3r6>ZfUkl2AHQ$DPU&0l5 zxc&0YvthQmxmhD4<;a@qf>!o*=qNyU&LA}6DT0q2aF0fV*;Z?sI6)1Mo-DBAei#bl-4O{4LcqQ+K zxpX(+vr#plGGz{P5J7iHo5?OVN|Yf+0YFGgnD891cdbgSgL1J97y}>i&CK)8n8Qj- z`43@6{@dq-pHz}pcoxRcT-!ni5%8+yw^drDRLc!Z1tj#C|Q&9TE7b-brOK^WJBFmj}Cf#R7|lwJTfI#2EL{J z=^@cH&=W*SDvbPa>pf*0H~EZa2*<5Oi?&Cf2z)K6q)uvkDtHf;%+bp(P|s;qc83W) zQ2yTZ8ieuQHw)^|oN;2)HmM*AF2Dy$>-moaLQin{q%t9blReNG>%j!dr9Me9OE+WoCcBfTrxpQ#EJ`sJtaq_MCU`p=G)9o5% z&L4ep%8?&ZM~%)j&zd$ladhU0;nM>#h>32@d!?+cp8=vzw$RlWrixg&%m1EmMw+y62=Rkd=v^qULQX>OVVtt(q zqHi1_fCy8ng!SU`DJz$MlXYQT$AsNW>eVUTzjC=ar`vGkv2hgNaauc2?SodI0MDI` zKLhR?_OEVK`kU((pc!)J#hcF)zbn*&-Cs?bSTZ?#L(X(8b3ec`_cfKpO=X#Thsxrb z_`Z_L;=$5=_>{`x7_?crhUPORaCqlewOJW)Y}M851cJoYj*o7hAgB=Ew5@U}VdYW+ zY)S!Zsel4|(GoDV6wF0g@bl7q&wcN{QuyTokoRtZ4dzV@bg zBm0ef%C(~-n~XEECa#Q(xCGC2x zH6Dj1MbX;cZA-vnFXu%I+^!!6t2c8{~h=(1}1*Ni;pwoPb7$!`% zI<1U}t^^W}KjeQz-=c#BJMz2tTVY;Hh-=HUA6-AVBdWzM^AmXL;NA^qeLxRTbCB1C zEdytH9|9p;&{lM6e8Pi&dabM*%MaAudy34&^YWEIi|FoAJH^R#f5GM3w(O`@;#Ave1!GDR3Cb=dbqNbGzoGct|U<6ps( z575hLQ`aPU&%d1Z#ZP9vaB%5?)bz#ZURu5<40c-V4RmjV4lG<#Kl@4w`U#o4Y`Uxk`zz7no02rKMRQ7f-=_o%9Rr$d4%88D7O8#>p_h2ct%T|3#XjiPTde(jpI>_A>McN-?hz8I zQ_FdV=q9&V*4mh8KC?M1A@{NT#g>2{BkKf{)Q*9|XX36L8%@C`{~+vDS~fRR2v zvQ16NYb=NYFzejsBlo4%f4zUZSW+?wEPVn;hJ1S{;lfO>)gSz@bTzc#3lP~Dh1Mx{ zQJMLW$VN^rOsY7E@7F==groE{`a`mu}=jS>TE+RB&Q*2r`KJ=*H>>nyQ5$ zwmh*!TLc;K`kB4!n-UWGmL1G7rFgni;A)wMK6x#^+tA46h$Kw^8qBJ!Me(nIdJOnOHLhxXN-?W^Z|`|9g!?JPDz zOndX2#&~F&dbjF;O%Vx%K;p<%DZuE#&_HbxYAvo)9Ivz%@tRmf*97q$AF8w#@tT-J z@8kC?-_Z9rknSrk(EEk>zKXv8Px*Vkz-x$Q9v?0<-Vm&7zkkCMW|??3?=3B}qrJu> zB9o2l?MTRhg?xODg>9TAAqP5%eOz(g$~SJuL;m)nm4BQYjrHI^j9G8wD$1yXvV4W1{(WZ{F%Q}}TJjl1_F`t!-c z`%})WpRr`?jtw~q&keIsu=}%%=bn!_m7VeF>S={5@^BBvpvgiFJX`);g6JwErMpHk zcJ}|?Xg{85wEz1XO|mKZYUag!5y%noO1e->Ru8P=C__TKmH#5Q}F~$K%19u-nf*X2%Ej_ z{>QaTF9dTf*l6vX?2SOeEK?>^tu}-kEUKj4rK;RrO#Zd?6jeEKvO;U80J)TjYH8=G z>_Y6ch2il;-jLeOI776r54Otn5v0ku#jyQT^bY{vfw86iQ!{v>MTt)oFFZYmenp#B zY{*~m>dM8RdEA8;0Ir^~WoMhblylDuVWT{>QIL4?o+(q5BzLnmw@~!2Q8#_I@Sb-c3qMu2rUl=)`T$g-jYAMj=z8Adw8km=0&+5FW%Wp0i6j+ z-aOdlUCW`2y&SDq)fMdjVQ z4T7JWj^FKne2y92aROahOj||ussN;-qwZD05d4o#cF3#|^-^#j7Q zV~duk?tTW(Oi!6L8NE{izw-}H91*_k57#Xz*s*ZV2cP}Mr_F0$xEA#5)F)vrzcatE zQ;bM@*Aw00|56lTO@5ddN;P>a3l%eo{`iGIoy4&JeiHG{@FX|y20R#GnLD-Z+|l$d zLtMO`bTd+4w0qk+bQS#$bkAQseI)E2-eqhL_i;`6)l*?+9+W(YP|^>%Vpi@4QwLVr51o^PemF6v|9kp@X9G_P>4vW~ z8EilFXTkj+|3W_k!^81?Pn`sxCUzOq+bua7ehrT0!Oh}YKDpQY%^hQ}ev~`>>W3XB z&C)Fxa)`zrDqg74@NUv`Ng`*%>cSNI(gZV4`#NfO_VBh-(nFauP^|7ADwj;z0!HiP zOe#r&D4|Lf78xrTkUzs)Fmyn->^uQBFTv7-|M6VCgGZ}kO26ATY|>{Z&fFqm<0bmq z6P6spy=z|aLfM$snj~3QS`}}cg_(wRm{(KV#~^Gy2*Hf%CHe$cv-Zwf!(Z7sA|^;h zWTb&_fR5Xg@fQv3HhuqBmuJysFhL`7^9RS|h!p(3`4 zir6OPSrqw5swztb+2B=m#wHUztIM%BD<+!8?l8e4!na0BlL@>v4em02CSD#QIYWLp zzVo1y42o9^d}Y>+oD2`|-FLHBapq6xcj4%9JPK2=_Dw3S!?=#3Rz@?aB37;5C>B+T zC_Fy4RH$;8O+gAYG&F&bX4{kWK_8nYyF+N&hF*UHbAikD2aB34+_LXZqA@*ZEzif6 zM0x=@D?d?erKn5PFM&Ksdku0s3vqSIbPp z>Wo-AZ{3b;*nPnCjJ16Wc7ulh1n0e3-fC6j2M0s;-p8%fS3Fa+rwlONM1>7s4`ba} zgFMgypd85^u#F|VLz$zL_;_{FTJW^l8~~vRVGar${L#W(r&c8awRxgH?K$d%&6f@3 z9foDVGLS+y1yPoco*?p}UBxr%vmmYXv2UgS|EZN)Sf!PW!T|Q6Px)o&lObKwr(z9P ztQ7!+=cYXeo%n5Q*P0KHm;?)#D!m zXTc3{w&Y#vtk_rSU4p%Zw$!ewgYBy0mEI+6Z}p~jRjQB%uPDCa6r3AAnTh#H<&qS& zB_lwSoAE?d$3~|gA>tx6WFT7WgI9Pg_;}L!#{DPzKsR`VQ*s*4(d(^nnUKSWaqU3SJ?^8=T9A7m!)1yq(!KfIs8KCQE8WmIeltfZ zHB`ikR6xGA96ljsOk zhx+AX;(+_u1pe4?rB{cnHH#;Wx{SZ4zTgAeE4eD)LuGv^1vnEV1CuCDG^1asEEto( z9|gk&pAOlpR%MU8guf>oJq1m;!}xnbtlvY5XcbIk#^zhRl{sSu@um^zX~(S9Q${Ay z?2T@?HOaI!)o9R{P7TQeCUb#xGoTa_#&#JBmE4+DSshxO9lnT+=V+k;JdVdA63lnP zGY{s2)^zNf3O;Zl{1IM{ceJlN^0Q zI2vDq(!i<`kV`_*{N@5M1uZ3G+7AsAVrZ;ywu8h<<_}Uu)!!~t_5HA+Oq9)?Rau=W za+J?QEpDPlHCy(P>_5$Tqu4jz<|G9)3D7y6}5NQmf{lG>lFh}??5_$clsmJyx; z@g8~t6DQvnKDXXCNcYL_`TjJj*Aqfe2Y!iXu)4@sbCdsmv9rRS#au=*?im*s*QgP` zz;Sh(HLF{l)g;tgSYFP-bkX zHnu1uhDUpW(Z9M1Y?3(E11blehQMP1GZnx9e0jNENKPJLUIFG6AHQ>6ewS`}^LFjb zF6j1AUiKcd+s=9OcW$4by$6gL4KIy8*uPVUzWqA39{{fP??|3?==ZKw|4!}u_3hN5 zKS-LlJ2P|Fvi9?KPn))L89!s*o;`~@%-yqdS$SY9A){4!e7B?#eL8g;Iih!`Zb_qh z;%6g!!JoP&CHCpqbyQL>GS}m|0vO64#`C4-u=o_AN+D$r5K0_9hy~Fg7{DBK4;XS_ zBwn}ky}$zexdB{0bhmttixPPiCuK6?r2(`A&HEWJpnEF-M2J6(W_Y0)U(3%qaXHB+}gUwkZAvqdoBul*} z^%2*ktc=>IBOcliZIqTzDE5T5tJWAqX+v$0IY?PzIHf#^q>|LvTcuO!h=U_O)}W7# zrVpk{!57ObUmdSS#r%ixA$a$?OO1w*-?Ky5QmFjv@~KCsvr@-oE5Ts2TL8VlS8YBW zR9NUdZX3(bh&N0i9Se^lAQgUc?FmT;_G0Oi^fYTjE!(G(u#hz&H5>1A zEhDhVsxmRsml)=v!P#HNMAz!I_@U7Qos7^%A+AVbF3=hDis)EfM6?0K>J|MS<9}yS zDM~zZ5C1y@dVrOu%ZGy|!@q{!*U@eC(bTE%$!LCGer`VU1JB6=KZSz1917)Sxw*Od zN6MdVBxm=|ikC_rj~(Hf-686w%09gspEM41UOI#hE8Cb1R%&v0f}iSEY&ry#ig0YpIU`9ox;Ez0&*H zr7I?odG%-Sl_gi-C7xNfY|;E{{9g0$mMyET^XwQ1rFPIFXE9cKA&^s5`~b>Mrf9Ed9xq}Q ze(>^t((dQ+Z@lo_#N&lb9tJ%hulMzhAQupAFsS&QKlLw7TC}U?&EH2I>-)6-vE-N6 zYi`X>Iy30^z6Vi)dT=0Y^j9z*_`)O*3j@%ZhQQB{zYQLs@cgs+C>VT8 z9{4G_10IxLJxl(f^)AX=x0I@D@Vsh&F|E1nhTe3Uf}kc7y07vV$m@yWAck-6*H^OPZJD7IDu@rj`4mWf&$FDbKgts+kEO!u0e zJrSysvsWu4Qow^=v3Lu?XF*6vNK^cubOUY_IO*{9>s za?nOFPk^5^H}3%h_L<+oPQ5pvU8G8hub($0@74UYyoPo1{su>5hU5(ZPy3RUQwy8N zB+JpC8{Ide#3MJ&WQC6`nmNZx9ce&sT$E zW`S{oH=J^!ERvxWzX<-cI(rpYm4VcX;q0ZMilNyid{B>FK@Tv~|b@$>05CkTKT_G};>{p&*_sA?>?i0&OC>E0o<{v|{$XS-VT za0Bj;fmtyQnK>CmK5J-{vM$J}ZE8pguy`gH%bRCHr2&;MMO{QFt$qlNusYeTi-0T> zX%)m1~Do? zbo`^`G0O+0ty+~f5V@`ylnb&IIy40=K~rIMlnz#!pMlG$5xCp~w>=+gXKRG66xl0D zgc7nBti<$k=%5t+U7&>NRqWxy3aj^|9Np%w>@wp)Z2h`DWUl69! z=roan&(Y%_zgo2F_520j&F9VB)KAavL#y(p!@!9{G714$vl8$dm;JfwLv$=TNH~_%DHJ}&PAS+nNgX5JI7RB zllYV!@1l<{LGmF9jnPt~qa60*Y-kr_4Uv(sX~K@i?qhZgo4ZckU{W4XfskpBR(*|L z1Md6f8#gXpu~7)z#G@{4mfy>4lBcbYx}ubZC(u{hf&Opz2SA;Fe3N?5jW_q3c?=v& zWAU|xr+D9}uza!5%3C*%#3XNDkFBs2nLRa`<4i)+FBLz(^-?Y%`bJyyr?8jq!gvXV z!`AW6Gv7m^baoc0ifkr;kK0%PNSqGvgAVUJJ{0PDSsur4sWf> zH@6}cj&K?Of+v2wKpRupuL_1diRip2KgqX-%V;d8IX;r}aZ8=JW+E@gPUOt*e@*&R zsqI*uB?R4A9jp)bo-}`(^Op%U0f9p9+wO1@A$#N!D_*Fs;oTj`)!~|Q>7uIHhjJ!g zIIZQ0u|@8yqK45NbE0)tj}ldsg+uhQl5vExN#!+dUe+g$Wa9^A6r`{c21zbDYe)*q zNcElM7mkmQC5um~jgXi+RN7!j)|=|u?8i$!{-t}5m#daMnlt;)6$40xr*Q4d7NEJy>i) zrGL5=KRB_~P;11Q;SWqs2Ogi?6;f;Xg<+45aiGG8I>Qx8EtY}JMQD?c&Y;E9$?(Q= z>%;~@n5sgBH9)YeCYs4Iec2tfyO7yt!#_zlgXayQ(nCWeK`~TS-u11#JF5P? zRy{lAx9YlZRPutZtv0vm)@ojTP(K^r{G?6y1)~7Do8PG?zRNF&ZVdHZL*|^C5Yj6I zwrTn_x(U>G(akwIA*8Dwzb3mSpIgU&Equv&5$qK&dk}J>VX4X_!edgZq-Gt*9^?om zTM!F3yio{ekry#qv9-#7ZT@-1(D4U=>nCU!Km|jmo#GRFXwh1&Yy^Y z6w7Cs!~&bo;x$nlZ{Y`6PAE8Mu94^@`DvUgS+A>l_^C$8NhF9IFMGTI&^rs@#Bz{} z(sIyv@D=(I1Oh*W(QGi+gm<8a`FHal(4DmQFt-z|6aFF*F)o4=DN0j>5RTiD0yAMW zw&qB@x{iaETces#E&HJ5sHK-);^}&qlLH#%{%^fCW4gP4*K^pbN()4egwDA(TO5%k+5u5sfn;4B|In5)VhnY$)zFg zbW%@rb?@FAC)4(Z%u1g+=HWxwv806GyK?a1tIgIo95-&r%JM#xWd!$>{}K1dha2L6 zf|-dcTl{HkLp|A3&@L~}RmPsjYlcWI$=6StOyspfqvz|-{OIztXQsV-!I|PDP}`&! z;eBfyZXIsyl>Nt=y{$pUorFFc;#Lx$^F|w!pP}6dwKW0Wk3VmDQ47DQWqDB(zo=0=H2q6X=Sj?E^I zq&?9|_`_AY|NTN!n^aG}{KzoU3TAKa91f8bRn+_Dmc1ggNpcf)Yc)ApbGpblCpd9#(hl^X6N z?laM+OINF|&>r`qeW)YO%+B~lXUmHg_(cnco3svoQHQ+f%t{kydz=WO2DE31MS@yT z^PmNzm5Gh(v>f#vtpcONAvc>Ej3@h`x1RpuyAu=}FM=lczr=Z+; zZADrt-=me?u1>`R+@;l&`6o_{O6)&4BqF$EZemi#SfJh4>$xfWa=J;eEMrVoI(oLf z+c!nS`qsI+&UA$g|Ll!;^mpXJ?3H~oCiidGWK7!3k3LH2-@bL55Bp~J`?zTE_F)MV z`n2!dt7-2^-4`4SPU$&w`=xVTI4lzfp$ye8iUXV*=Z|+-JlBkC&2{9uaecXgSY9UL z6L>7P&ZltGx!GJcw~$-PtpFEA^~zN;CksczqXG0xcB(j$S*_Yj=9>N3VnE zbvV6_px0!2oj|W?^g5MZXV7aFz0RlC#q_!ypGVCk?Y|vf1MP@!V0K5owm5wTzGP3u zm#oJ4;?k_0gvc*vfJliSF0$eycBg4F#_mzYsVW;AynCvwuLr9b2VI29wmz9ed}|Wq zL}R@&W4);27@OZVQx`XNv3+SAS4KLCdy9vrsoFTc%s9HtII_&xybLckW6LsQJGF6G znQ?HLv45Gdb6IgGn~x7HGY%;;CgLSrX6&docBSREJ($K6PqBG9l@8W)wQ)h2aRwc- z*=pmGGGi7QIAgZjm{VqP2^!=r?xmr5ITUhV4_N=8RMtoe#^_5;G!}k3f&`}l8l6_J zjff@4a6pR{_!xs1F$CoYuzBu9ejBOR1BF|Icg4^JvwO)Y<(gzqj$rY zGPJT&%NCtFwQA9kFBv?hXa5Naqie>!IiG%BQR7nT>j@zCyy7K@OD!KfJ2~+h@G%bp zTJvCRKDksrKant{anpqI-_z+oRah$h2W}^3P8%|L=*($D&_Ni{u}kkzw{~^cfevlE zc5RzRE}$D)*fpU?uR(Ej%CCSXSJTt4q6^9p5HxA`?n&so-Q`Di_v$I|ohH$LZyHJ8 z&!6vJGZ=kQKKpIC_RVbR2i8Ofo4-`uahgbN-cT+a@3fu=H5#>0`=Fo+#8(%MuTYy9 z??Kd|Ob9!4Q6$wgFqp4R{JxTMs8h@CJ~vJ#7ZO8)p;S{}zkxHah>44jlle7O(UNo1 zTcuQLef3%zz$FjCk3U`Bvb>Gp5gguW@Xk+GZGzWeIj{ptBMe?p{6=%aOjKlTCdtwE_L? z)W2e_O^6YeiQZaw>cDfSNZBMaj>RQ)rP*+?K<*GBR1L-b@qjwG*Ss6lnb4wX=k|p= zfzzksdKNESoQYwp$MD+q7cqfqjLlGlveIJ&fDb zr{XRDsZfY5zEG~WjiwZ69~y#c3jn0L3QDdwtC6$8Un&FS<4Vmb@SY9lE4{?tKJanU z-UHX4mRx*-uA|#E^&t07w|T+y$BfRJ30|h$F&_FJecK$BqBDwo6`0noMXUK6R*s*r z4DX6z6~FQOaoe?=4%7=)hUu<^;!~sxUJit zxLYFFlx&G#ghV~?zM%(ls1F}wEhUVzKF3d2jp&m&@j06RV|rqrVPAp7uh-8TKW#ps%?dKU)ZY_ke#@K-Oml z9?#>#8a$q%T$0SKNIX|Qwl;8}UE%}rc-m6PI=OQ)#+$;4>{N!?&fOlDlH{(d;wqCn zV`J5vjwi%MWc*?xc`o?!6Ze?4T@PG&eCq5^pap1J)_q>+l3TN92y52!$BI8_e&>Mk z(YxE7L37Z_e78%B8cVk=xVsRK*BsoN3wXSOxN)MtP4y8SqCk7VH^7dU3b;w-wM;Nq zq4Jl>lQm^DR>G8(Q3JrsizG8tcF15=-bfkywzhDW`BlV-iO23dKEL-TH_?4gVp`_% ziDO#TgsowxE$DImTZhD3#d(AJW~YzMsuh4|r9Phb?{Pl}19*4Q-9s(OJ)^TNcXps% zj8_CwYB`9qqpOz!9ip4FU`;e5_K1NHC}~uDY*A5(`4|sdoimq$1^%Eg54{D-iM+R2 z4a%eNsCLDpx)JZWNN%MVYQvF8mqVaEvk`EwF2`L?6F9aaa2mk$Lyy6)045v?0a4_K zjM3)K8p!U{(FRz3+BJKP@@9w%drrLFb4~*%i;kRor(! zd~P}0)T>Y#8EAiQ*+vxcxy7qF8K~8nA%ZkkD-(Sx(FtV74(?0KMY$g-9_$E1zh{&~qKJq~O}KT2La4i*Zlu%u}Deo0}2$D*(t zW43s|yh3V{UZcQA87wS8hrtVfzG%e8?L=0L!0TWy9t$@-8u%=uqfzB73v_grvACl? zc04^E$dGXWqj32@8uhBn1@#@GMpg`zX z56}@E{ATAa&5X zlVQF&ou8JMH#9NPKfJH-Z(5MXcG@<@w zuoG-;c0psn7WjgEel0pb8Icp0@4mJKi z8rA?I571;#@Bn>@?mhr((Zu`kYjDtf%6u3cM{Qwe*oszubDZLL+#*kInCR~1ZCzt@ zssnA^Pl2|czCcImCzXWFG+P@Hs$D#WzB+)) z0YIQ)bfQ*y7NizCi0&s6y@V^BXN7Z@d);^ogt>7%nVtRgn+yU2%Ate zr4jP4?hjgAMDhDk{3Q@RWH3MO-9+j8Csq6=xZtN6u9+y<;A=5wCNmz^N)I=?!c#jM z3&G{>&0Bx-M^`SGw^GO{e|6;k7e{#S@>iL2vu5zs$ltDk*Si`2ZHkO+bx+!_cjAI% z{rQz;F1#6~o6to5Oa4`PHL48&t~K7_5AhCn_^Pw{s@;vH?Pk`U-v!t=jrorOgWk93uk~v#=d`Ex`BQz`E>d0 zY*4Fv|4y|N53Uq1uTLB|pnJ>y-IEp%TC@AwmQfjlh`d@#IZ$)(PW9nN$f#8$#;dT6 z$^|;YgtcPGc?eL(Xyce_WD7a1wkqZ{wWLULn+4_t4n#kiz@9Iky#S#X&ENk$dC9`r zzY#CJkW;ef`vEA}1!8k`WD3CrsfZK$QO#V(brYSW92cibUPk8Bv7+wqPHG2u;7(Nv z3zaHg70C`Dl=UP~$VqtMRPiE>75b!&x;qoSiEH;gdYbio?N2~^bl>{ieZqnK^?P9W zjz8ONO1|M=-E^c?ulT)cQH`i5|_3OSc{?Kzb{cI2?B z1ZxFb48lNqY6Xx}OTv)nD>G}}dunOe=CHINYL1Shnj_RDD#i&S3`8%VKSj@g@6#WF z7d!xGK$yR}Z{6A=W8V7RFdV%@H$g+7`Vc@6gUTut7jJ!aq1CxNUyzDFGJ5^#3D(xZ z(anevCQM=tOhE+^?V?J-$)~s_7f0xS%)HfPf(gg?@#VQ#o~+>~aME8?OvQiE9m{h- zbxa5Hi|&iS|C+Q`1axo6J+%a&!4-^sy^yWJXgD6cT(#AsqzYK-CJgNXRjNxeBZ^ zzcCZ{0#_SL*Dkmf9$cKLu&*StKZ&X`h!b^J!>G1!_3_)qXYZG!XADlkV|bzP!qII* zMol1ipCl2Y2mV_;69=_lKoZ&>=uuK4ooJRd=xXr`FsBN$Qyf+>iq0H4zh~le!%y7m zjE!z+2kmEt77+TI%-isy9BcxAAa^`cX2|0fU>#G4#k)0#OB7vfEI5a|R1Bhtk|aml zEyzW7#M&vFzAWduKhLB}5ou_kyO9>mQf@2sjq`*Tx;D zO-Fj*oqcm{uU?>5`9Poqh7*VHeSWF;sXLv1StYO7b#xcE{@!g4 zi9!lH`OfCoCSGIS1)ad3$W6#8K>5;%?ZrP-Oyp`?a=4ij+ma3_!Z6E;U5yf@sp+}x z^U;OK zXBSr<sa-+beBHkTacfLg@A;&l;f!TzU3MuGM^uZPN8KCj&cCU00(rRL3>W_)@x zt}EiI50MJkeB=VQ_;^~o7HOlZ`1%57^0pcE-YQPHYBYDz30NwC zq~L_Ynz4wr18dnXiCH+&$yLw@CQtM90rBS0I($G9Gf3qHo*}6ep5ScWG@nPezeK|aEesDR|0vvnX4V;V#gigTUN>s=|hvcH*sb@Upx z7IM(T!9&dTCI2DS26(Kshj7CkI5KQVSKO&AgHe8mhQTxfcS(P+`~~i8th5RX3m#>~ zzbFfQ9~1(xjdNck6~fw6HKi7Fes0f%G8%4!vq6oqI#kgTlxm++8*D;Loj z|LQ^xwxz}n9zwF*KE#*KbbeI$WEdq1v|?M%AQURSQV!1t76HsfMz9l4tFY)3*g&)s zJC)c(A?ZZqXXo-idAHW)sc=ba@+=?B$Ojz@EGJeQY6rCtfs-@KBm1xYuaf(yv*bRu zDKVQ&e2Kh1X+9x;nQ9MhMWvg&^=~kGgXK(O7RP^)2MJTr5xBK{D(HcV_N5PR*1!yQ)vsh14QajU^3%2B@I5q`5B#*rZsSy;NCA+{miueGXS=XfpyKDof zJPf4e9<(rm$Z!fBh(&~2p;0OoSmV~j#qsJNfExY$o#`j^Cs02#At%uM)9rlRj{N)` zf{)wVYoC?7rKGr-uU;>An_@nU?rLC$^VJV956~H1Lo4dS+m!ndw|6#{7&>lV-F>8YVLnB>rjsN@467%wDlO5pB^(9mktB&iM_Uz~NIaQ(iVEc9W~ zK@jllIS3RFqh^I6k3Wk%c&7BI?)u}$V2d8&u8hx;0x`|MM5A#X$feB)LACN9RPiIs`o@Ig!=3OO?Un$$qG=3p*R?=!l z>hX^k>U)>pe1d+T@ht!PKVBx!oY@6il;AXKDQy0DQI0prJpMT_0Dj1}H;cbGo;~SY zQNDOKbsq6m7&uP(j%o#=+;mZp;xIyGbqmeis$!)wrKz55Dvv9Jpe1^H(qZwAVoKh4 zdrD4k!ri9h-Jwb!A0HRzlQNqz#AGxZ||aLYv?S>!a0 z&%vr>T!>5=Zlw#6Lfp>88Wf&e!UH2nn72X{2`1PPRCuvN(PSp7d`U?ze2ph-kpn;e*n7$xo-KN2T3hQDr0Tm_9O9 z-<43*j(47{2->rES@)S#VJz*jWvGzsu{E1+KN3o2WfiV1k$2eDQnV6`Ttqh*IYrSr zp*6Mpx?AyBVATJ`0<;6Iv7pq*HeYKr*Mzc6u)PVb14-Cqb>;uEcXGU{;SF_$Tl; zav=}c12#oGFq4P*GxH7-2demuzm3m|8u+XTrxkS$bW>}>t_vFhR?<>f(I8dC8lnz` z7@`dLkT`9?-Fa;I6+dUVYt-R{&O!|Iagp%c?CMRc1ST!<;mY(rlGYT*J1w1+GPmUC z6JPw2k~}3HeK}}%vrLm>UgqM}sG@NFuYC933H`gRIJ|3Z-<+D^tN&kj?;T%7u?3Fr z?Cve;?It&kgd~svf&oGZy(k?ap^9Jt1?fUSKtKcpqz8}|YC>pI0wh;N6I4)&peP7F zR0ILR1}N|zHpt!kn>jN(yL<1(r|*I}!+BsX+ao(! z6)%mT6HkN9YO^J$WjV0`f}eh^haCS>2G-2kotopYKHZ>mb!FHEvHleCUzP1UzZQV( zD=iJ0OGUu-OXPdN^*gxy{w~+&j9&0gA%rDZC;`NHeY?Hk+beT0udi53xDjLaNN9;~ zQ&(UHIvT8IzAi{USN3M|sL7 zeBOx-RL%DZcHUXo$bDAfzn^@*X_Vl+%TVXQa^k_UaM@SB4j9Hv0Y z=5?L)E>;4aCrJdNxcDI3iQrI9BnTyk$_~(L%#XSpQ(jd?2PAaGx0yJ&&Ae>5%@~~6 z;_yQp=>Ou#4l$fkei3n8$G+K*FiXEYQlPRvDOL&p9&gAE6k)I;xI*A_s7ynyEO-g% zB_;);2A!l@4cSaccI3~`-(pkRqW3IY*UrcfFOT^B^bHhdney%GGnjg&&KY;8eC__D z6K5YfuUxr5Y3rZ!KRra|-gDO)$!wVUE}7aebvGHq);7JudDRrLQ|Ug4sNsV0g2eHz z%|T?;TijpMNKOm#&m=*(Ye}91f z_H-eZ2eQf|8?OZOCHB6T1VNG;pCgimH-P~oL!AF@`L%1}L-%{%Qh}`i{kcxrEI@6# z5^FMOCrVfxnF*yBlt2dE3-{;qaWdg@jnh9GXvj&njFS+LGtViqU*ip_`URVls-F#t zJR5k>g*a_23pwNl0P!frM0k~lpwxA*Pg9PW2(V&*rG*lOdYj3xM54lHa(6rzp~7qz zCImGzr_Ww7D98+fE_~2Iet)@f^u><_dywy-jU%LGtJK-iH>kXbe*5%OG7OSS8=otYU>Tq35_FdF zst@NXiXV$s7=fLPz)nVB&$El{*ZBXT4zgG8>|Sy0;IpGnSRBn;p!TRvERs;I!lNgXe*DhvLhaLTAzAUj)&bi#udPJqdt?sf8ULoArCBg zt^jJ!lL7?hc&=acU?D(r&da2G&)}igVCT+>-adLt7X({Sb<~4iTmB8wfz7f%Ro}ViKG6fD$w)F zrkAD!-2FKqS!}@W&~;7jCBEK#J}I^jAeMed;t@t+ z`4`_ZK>pQ7jhoK)U)Gg#8tcl%8dI;R0xi^)gH=dt+&F^By(A2!tJq1mYH{Z1=tr$7ApL~-2a63{dKEPalt zC0@vL#p-H$7;cbN)RI%xES3O~ri^rj(SI5B(cWq0;w`Z}2NNyM=A}#`CFR67-0w(D zL}gdmXO&+(wWr0ja?8RO7OYq_Zx-H%la&pj#}~i;UcE>A7d|y~#Hc}|whKC&IFVZ8 zgvmM|xnS@ii2N&0IfIcQ#-CbQV#s+HL(aRHycm)F8gE!Re{V~X!AOqC3PnXl5YkIc z_424w`zH=D)VbE-v!h?dw^m#J_W(^oaE0(ULdb(Rq)g2`*PPUCkYGCN^JAX7QX$wnx3D_4f|d%&XICag+8N&o z!F=aHXj1hgqVJUr+fy>;6%7D}6r{%3hm+|HPY-V$o*ho6GaOH6h-}EEq}u`{zjQn# z9Z3Kuo$w?UQJu!3L)AJe)g_u>G+h}{9f{A5h?_j_{I8A;1qB8a08J$)&0b-Z$S>hmP0AF)#H1y2#0p>5CK$Svk zZJ577)aC&}37M;Z3?Eqerp}pEBz7)&80Lp0v*SFM zKr0#=QuFy-C!+#^=|%ZmC!^px83n`=fC(fdATc04pml(pd*E=unE>P6g>0e#HQ!@` zmm_FOrk3xK8hj#?nEP-_lDJJ#Dvsd)(3#^mufL~UCYj_>-c%TL{#^6b!Qcz?9={3@=Ostc*YM3eAU9s(uA1gjU9gR_L?!e&9rgfSn11sd(7&$8>PmdXm0{he^9v=rpmyGy6m9h!FCv~~KzjU66ay?epj9fjGC zcj&yaANsgu{d&zZYCrqZ)Dc+&VrnlN_416-^;)#Z7>}h7lHpoBBt=5pSr?swDEco# z%|w$>GkX98o9H9Xh|5_TT#;>J&gjvbl!aC_wOE;ZB@8_>d)KaEq7_TAN%4dW4ZySf zI_^cBFjVIn7i|*0C;RDqi-Hgf--{9T;d?QL@VyApaH)?|!}n~4@I4;Am)8(|qil_8 z+hx|W&GV+dZr$MjO50A|yL4`j=AadGcUN0Db^2>Fo*UA&U8`=7;Q8x|d%j0X5F+p{ z=%Ev6qJ0d#_@=GvrIw}AAsP;kIMEn6DckgMlZ_f@N!)$EQL0!gOu6suG-2}mqPdG- z|K^h!8QsEqwQkwHqm(d5{JPs~FHT&)qafq#4U00iZuR8eeX^%NfoHoJUi0k``J7=A z`ONRNSQwE-eQ>F)4=xqAD_eJjIJyDo?!EW-LAsid7QVm=XKjQtjkG>cEv7|}e`+8G&Yv1K-FoYqhav_`+Re{ORA z)>js8l#~~;*35lrV4dt1&7bIk+O%CXW9sJZt6C~U9cbpWg&kY;%IW=h+wNrlEfW_@ z0g!huoLn4Dvh4-9=Ze!I+nyv8%5B84)(QAuA$Z45^eTA|byV8;wYFv32HD2h!;LgXr1u(7ag7%*tz4=1KX!GY)~V$ zVI$_ob-T!{CMaFxFuA)>TgVdH39D#tQgH`TWA)c$QcozAr57m^bOM1rDwTy~2irjl z9h`n(dGO|7e0XN*?-W^(S)sZ;m07Us8!uPQ^|_Hk%N{f8cca+lDh-pGGlN#Tr{qYs zSQbkn>`X#d7AFs78MNv(m_+5Uf@Wyk(J9%T8%=xbqBgWjBxMbw;MT^cYl3wpUGUnMG10(CS$q~`&Wxb0BZn$HPBjbF;cUHQ|XaZAEc=ua~Cv3x9ITl>Sh!_?Fxc&uS>Xw++#qZ?Ss*9BZc1 z)6!*&exSzzZwK#02!3Ao&zfRVvY1JfT-778GNgzUsLm6S2^JS=_88^gM{az34Ec>o zE*&+#)IDj%{PUgSSB##w`kwLt#oZ4fg@+Z-&+c#CH_-k4N74Km?|pn7kE0ArTh}f7 z;TAo_6-{r^(L^E@e9O@o?Ax64IBD3G(-_(2=M-3xnrf!eSENWSUUgQV7DTDgq$D)q zeKGj%!=Jygh;2_amzK;_3Q^N7o0Kz3xj50i#Ipa~>F!ryfqI55Qef)(F2Gpvu}U#^u_^f&wm#FVllN7f+s9rx#A zpIhQm_XJC+dxkjM-O3$~`?mtmv%@Oj{`EGNaq}(NY2H5@HJRAF;|Faft_-JVRaDGC z&A(RWp?zPYUzGr>P`MP9C=u>A*j&jE^i|Ici)_dOZCG*DBH|KY#a$Nq%THi|uKF%a zIC3OV9CFV+T736s@lAJEJQ-8P`R?ZKNP*6Vbk7>?6-D(AWD`@Fbg>{ z@n>3eS9t_^ZjewHYjou#v{wmom#dcDM6m2SgibDzTG&Jq=U@^=!4=x*uWPx(^?)!l zAxR2T?@5c$$Sn_-NXjYY&%$jLC*FNa&VTi{qHdMS1?hg}*0V?29Qj1&n;I{4cS$-u zkhx(q0J2FLT~ob$Fp0ti{IE?uO(`2S^D})N6&0Acn11~3sCUndn}bi3MW6#AHVwix zM*qchxts#y4X(q)SeEEaC&scX&O7**-rd(_4{@?fOsFA;n(-pWZ(r22lDSl-)MVF{ zMQF`u-wf(EWa7nB%J0bf!n9k;A2-KL|L$iwf9r-GGm@fLKUcU9iQ&qt&-OW%->273 z3#NkzOb2=3_wO%s{BPmBT+H;N;kdyHKcCO9t+%a3(u|DrPOX;8q69#3qY@K=WgdkRK zliyKJTUX+J6)mjiNpW2s@*|I=$EBSO&^l|$)pFxvkt|p;&~%t&$n4=DnaF76jW#i@ zo!QPo&T-C}&SlOb=YHp5=NTsc*O z4GVzE>A@W`$0s{d(t8i?kp4>Dl=}I54osOllxg$ z;~S4Zkn1z z!E+J~$zfB{Y?!DpVXat;l8^7&eL_k;c`D!Xqw;4_5jvo_1<^B5J|lIo&i3w)jIqeL zAp!puXoIxIDioAC7-CJdrd#p-NR+HhU28u}oL6iZ-iG1rY;6vbQW@#~QZ8Y&&>KsN zlp%FEzI*pEl)P41w&di8@|nUyWbK1QGCw2b8`5p-8Qh;p;RT>mn3{tjmPAXs1-B?e zk_5GPykjnrI?&k8PA47kp=-#fhu;P#2B!zN4$cl96l^6~mtA%nF+aN;!RoOHy>zCL zyeKJIly}&q4!e&Z--SZoc@MR1o^P2ouS*Lg-@u23b^07RHtF%F`*m*qn5_lte+TR5 zxc{-jeCWS!-rD%liEC|@$v~{Sfw)8~qE|^)W2Cizw!g^oLgRi1B?hGjwGPS-8WdzD zMLCGWZfH7a=469n+o^kWsL3<&m}+KZ0reV*mkq4moTG!=HXd86TH|hm+tit!n%GFb zQCN8YyH*1`K3XlJ^|Kx7#jEjmmSdRjWw@lO;+?7taY7k1#7R6|PD1b=vm8_ELy*(| zJKTxRM^)S@l(4TD%)flN6WP8x?lgGawqXY51iiZ|eq@ty@8U_duK%TXG@&EqFCiL# z85B7#68Fw=))nG_%TQb}D|>D1qmdfLkBaBaEnd;3bNeSwp)QYYwk==PqaCu84xI2p zZf2{Njl-tP(bbyw?EYB8=C)QIkB}qgi<>NOOE&Z&9?n{|+9WRo6MB~Bvu-S|6%SeV zvZ|D8&8t#kxB(d7>j0MoaAtK8`eK+pmV+23S&xgSwRSLE&2XFB0auD1m!XzJHpW#% z`Y+Z1m>920OPH~T(b!pnv9tJ^xEi2q>RaXleGIFuIm2@c%m2r*Jks42sPlz0Eecc` z2ox4*bUQEx>JVN8wgIbUCrf;^^7Sue%C#+M6N+>FjM8J? zk3PKV$jz}QUoI|S4eUq{$=zkuW6NaBa_+4Y&JGBVvM&W zJg!_XJ)~UNDQ!UUZ{9;m$wv|@Hoke=A5A&`>V!9me`Uyf&rHB0JXh~))cxRh7gsM) zF8#YhiSpZ$X7y2r4P?iWyIC0AHzG;i3?7pac~Cn)=!a^=8j%N8Uo zTc&Kx+^i@oP;-v}{g{|6;j&izbi#^KKZPFH$T(S=(ZGq8zI9?si=SoTcqf`GASb;j6Xm%Rqymv?` z{S<9QXxVbl#tc3pBy7gRIt6(OGyZYfF)iQNsd8nx=$|O9aU&}E>SGc+rUTU1yYRFouFubhwEFZ)X`51Y2Se9E~Qhpru0 z=8040pi?jO&g?yA>7=~FW8Pj{c0eJ%03pg&=^H%yXrl8ENH_Qa7<|0svzpDH+yX<5 z#(v!hT+vPoH}*$@v0q@7FH}SS4fjN8f-=kXt#aD)(YZ$3%MN@|exwCh`Nu^6_Qs#e z#o>$leYAbg_Thx)S}6zR%`Btf6DFZQruQX-V$&L`O30AEF368wnrgCaf|)Fv;Md2G zSGcQ*7d~{i5dGuV6ew?@&db0Asb^f zE5H+u%ndnG=pdOu-yb7=S43)uG5%|z`}e}EL?kU$qGxO zo{QG!-9wb6)IS9c5cd;pzWcT~=Hb1Yx7X}14dsq0q3aaaT4iC7O&ab8PUB=AW-Gho z)^aiC9yNvT0;#HLFqu1yu0s|_AoCfLEaYE?!ywQrJ*EW<1bAgdszeeZBH@g~`yxW0 zj2B%gyA=82TjxBJ&dt4rEaD2~Kl_U&r%t;%vM9ND#mu!^58wZ4ByxPa@%9YmlJeVw zOG?GQ7E2qV%BOp-I)41LWM9xbp?$+{e=KdLAfGq5k-bRDiGw+fMpx-wE_Pd}sCCmi`2XBYjW=-vwj3DmA_Ki#J~!@n*(LL!Rxk5T&(Jesx>LU(a3W^Q>|(Wb3?= z(@-~P3SQ-fc*h3d`ELFfsX&Nu7V=lAPeX<3f|N;qMi?^jWyuSbAC+X~dxT=pH~9Y* zu1y2qMw zRx!M&a`Ea{tb+UKV&%Nzu^qUuTdBL}OIi`>wsc4Cj!&GfEcz>^6dzWq(Q-4DZSIw#nzN5Ia8ZN5SuykjwS5TAt zw$iVP(XCBi;8FL->(-80mzxN_>!f=BcvHN|N(hn6md+M}iLw1>U0;3~#m@L{#j@+K zh~@k9m+mXeU%X#T+vr)MoPHR*sdCAJKiB)0eslHM{;S_Wm3w8d+z|Q{C*-+e=$?(y zGAkH1tf3ewY*>f4%dwqv`u;ne3E=J(Ub#sy;@RPo`1^4&{z^zFB0>29&+uc*&9?8#N-=EN6+DJq%z^%c$KZf^uy(q)by2nkD=NP@$I!rMd;%VhIfG9?ZyihM zU!>r{l51KT5LI|2%~O-*v?AuyFOL6Cxg3C|U!L`^AKf+VAFSIvrRf~ymlxKCiPaZ6 zkn?)?4Zki@l)Do*o$Nnzg7nemH8FG6gY>TS#W$nwcqMA$9iEa({7y+h!+*HLo%q2? z*TTtmc$hwjh`x0i42ooRQcPEey6|VG=toZY5y@kyCR}#dY^X85``MhB*{3zk zLN;;@kQ`2Dmg+S1=9#LShXf^`M5^P^@*FV?l||%_;p=TM(5_eJLgJ5vkpz`x9HZW zeFuC33oN5+knoI4&_$e@<`{4V$^L4@sc1;&=;dXFz+>2UmfbG=&e9BE7PzU|GPCfx zR#WVz{6=!ZE?QKM{KeP$C<6*avF^)t#bBjwA577HEW3FKzPm1PSs=eT$wFwFC)hL* zt}Db}_RSXU)mK*-1qw?yhE^Gaw8QBmu|BgtqBuSP9N@lQ_>P`(%hHX6| zu90fHZv>*VmCaGR2r*KbwHnn^&dd30lmkDA4XMY3^cKslgLf3w<3?&(`wS5`+*Lz_ zP&86OD1`nC56aJYVfKo3ilh!;DJhXD5n;^NYf<^}W4CTzI8a`GaMs)fFUt8J%g1-@ zdhfPWN9jN2S(2ZbM4x;p_m>ai-X#cW!YG#&;xmZ4DGq`pYMeFE`f-bXbQpLV$G|V5 z?9eOJljt9lsdK5-JFX%sERqDBVCga|l?I+*CW0JJluGO6rXgydyD(R|{p0$HU02Us zhHv=AFSTD?dAub$l|5n2esM`7rFoZ88+S>S>l9Bb5{A+-@4fZNuQj>vcOUK^TQpMK z-TcCFso+`n(~U^ZMyT!~zkyeT)Uwal)dX^wxyu`Zpv}D+BB&#M1YWBMqc@@}lKv^u zkTHYkM(j}2)gOKaLrhfMo0K-=E~`9ZND%C0OU z`L3kwg4gkX%C_S)vqe|PARHkKaEXw2!DLK^a7my)hfnynS5<~UC=U?qA4s4*wPAQx zW+O2T|LemeN6?1%P>mu~qFEL4pCgMNGSZz z+&@TARO0`y#)3TGk_rb_qSF{75WS|4IBifIa2}lQ#6t-oKO#e&jP~_IKxbWIsG7b% z&``F$G@5RK#u?Q~mU8NG#WzESIPl?1$I+8gIT|^x|AN%=lPAj`%IB2t3Y3@Knd0e5 zd4s!Gy5(~P1qHNLhFkzE(cR0^Ylwjf@fXcb42W^UCz>%SDh+JsSrs7aHbdI|!{G}T zlzQ?orS1<>R^=%vs{pktEL7gXb9mo#Tg6_kxOL$V%j|c;YK+Yb>T>iBmu}p&hD^8e=)y;5S+pXul7d zIB)1l=&%N@?uoLXDxeF6Qzp1Wta|8V4!vDCj+*)44wiM$)`uK=l<+6U?exMOCf^4e zhBngI_!nDI4r=T3MX>cg5UlpaD*AhVGz)F7&i9!EL8~ z_xuY(4}`u`=uw_Lt?wM#ANO7Lw7{da*nx5yGRk?VQI0n6jB+M>Zd?3pO)zu@qxhbv zi3+V6xyzF5=FpSSH52IMDxeF6TV~K!J#-BYy19LDYRf=0m9lIqddPvJY%s1MG3$i&1zE1$9n1bbWNcv?-et+LHnN zi><=1LV(W~b@41VHheLNenB`Ge)%(g|FqIhx-ECd?>jOM)*3h%=uu#-o!LAd*Jegl zqLd}Fnem36gnFAmS2u;m^El817U^JNZaTBMS*pzqhpvg|=26DKPGGp<7LN!v6O6rG zzQ@2}2)u>$WDVvpSvuHBaUKKjBCu8p>p6pA>vCAayHY*AnC-ORolh8mD=mb+} zygDOHVDL<8(`-iuMBrk>%{CD18&M(VN|S%BC667=LLHp&mReuMgy zd=bw2?F~H%_0^zNHEdagDKsACU|-DYYy&Lx{3+J+vb-_7*Fb5ehf62K}u|P86dgFeCK;yepypj#ENKyF4!R}5F zVwd2Zm)R%62JW`R&TW$nvNJeqxSWnC7HAcrw`oQ>RC^oIzVXuVjj}-5gMWy3#d@jD z#&@sZD5yjKr-tvE?=D<;Lae(L-TA{(`XHy?fWDn#r`8?Oclj9ff-=`qS~*JGMaJ>G zk}choyJMLoON|@kWA#y8CE$ky^`SO?s7-F-3G6=L5@iUn4RFe|L>JM->f=Ac1K^5P zJG88ZWKeiLYRs~oVKA4arqQ9+$jHbv_+B}~9L`9u`A8$K3Mtizg0e=4?Ugq+e}d3Y z2PTdmGOyx=J#I^<9+|7?MW&l!(KRno>cb&=)=hQoyg8_VnMtOJEtRq&d_#_YDVNI zi8t;-;j9^Ms~K**=UbX!MtaOK9P<{m*95aFkpX7Q2fWu?P^?L>YasJp7YW~?em=O9 zs_1o5PvnC+8EMk~36QUAG0cVNaUWSJj$s~z<;X{@qL3k9ePAo3#{zjd9#e?O3&I4Dufbqyx4SIJxaBUih9Snu%L zN1m_(buoB|==ljf>-TcGAn$3r!N-H_u*6GT(#Q9jSdO_^IE+W?jXA`C`AaTE6blPA zPQ`I28F0%S_ZBqXm`&AIPNW|xryvkldKSKbC;4WcfedQPMBuG1Ho~_5K8J} zAdICUd9jADapIvN8mo`^>lj9qx80DqSb6hBHE8;(d!cx_v$p3qxO1hI?t0>jVzIk& z6W`*CMp{Y>mAZr@<|-q==2jE)#2JESdNJ6~)q%kM0csaPz6iT6rn*izRJ^T|e&BGO zGj+sVgHb9x6jQkdTa&`Z8j|7>?`>O#*SJzuuYvF|wTuL{&ZVYG-*tQeX(N61qVnrY zmtQ%5)14x}vFO zZxBpw=S9LUZ3lAN3A36@!bLA2AIeep_B6~jE&tQCLBqO=i0TFvDKz%AjXydx@JR(-<_x9m8>NLEBAwohIvg4ST68 zgKjAJ_FKI-O>_SyUjiBX5y(zlfi5ZqeC#V#EMg<{h|tfchjlLLbp~X`>auygr|ot% z?3e3PKuWi@#n4YM=xV5~;3t6FD8=Y`3vY^Pwnw?%V!NjW>foajvC%PmHeu+&mYe*h zu-%gkHM@*swy}G~X$(CEI4Z@R=V_&JR8=QZYGFNbVd$QgJsfwQr-ooPK*#E!Z)51k zfu~a3#h%d`Pvy964Eh{~u5I~(<1Y5}5Ck9G3|fd*`k^V7Qi_{+vVHG|aXeJA(Fj<< zZuIRbwjyXQ@L$@GEkeABmMDPH%v<;r`xA3iirFSSD%JzWX znV2GH+cGisN9hWp=_pghu6hZUIhYRWfYMcL3e>)l-TE>-U;5lC!dYK-Dg7)K7-c%6 z$W_Xp(3kddAne9$_C8Gc9=|Up88U4R@ca5qdzOkC_-H!qOg37HXS|VZ4TjEP(9vj( zfl{h#_f^~%KRF)yQlGUsM%hj5?1~@i1AWP%@9`?^W}GYDQl|C=!~aYEK=n#gH8X%2 z&xE)a58iPfXFb?#6$Ca0{Jx3%Am7W4x&Chw z`c=~vsnJnfhYfofW}+v99$><49NK(Z?9i8nY(CGzye(1uq${97>B-(_sPk#)OA&J5 zyOj4y5Mnj!3qA>^A)lT^F&^*^z{+aB@d^&MM3R+qrn|Cyk z)#=N2-a(C0;1nbHLm8#)#5?a4P)cJ)5kr6?dMSQl0Z>X`w)1|6_uhRe!nBg*)0b+D zQikBZe8T&JDdht4=}9;{A#?D&OaLu(78_;0riJD-SliC;1JWVD{3L_!p^Z|_<5E`J z&m4E5P+*4JYK9xjBLhq@tG!mb$rIpI$YMIlB7u5rx0epV{5{Fu=X(Ai@NSPD9?$nA zWix?y|E7nBompVg^CF=H)2?^VAE~0}MR~}l=c?AX0q#iwtb7yJ;xOompW7q$wY0(S z`_cEpad_VVk5mVbN3Zf!Q*J<#=RN)T12dgJgN)y)eViTSc#Cq=Mxh>wdP89$P z@aff-MMAjX3W+65g8ayiWt@U)@sqh;e!Fl)vz&09f0V4(h~4Jev+YmIK4+o>={5e> zIp#d!15I0{VlIuiq|^BU52Bd!267&xYT8P}FX^os!5nk3a7WWtaeHu-0rQt!i&rcx z)_4%d?J(eejpN>mx@tB;Zl{Q{YFas}Q5?YWZxw#fbn;wF=#VuYMBB*ZZR|kpG+T(? z&O+mPX&Z7N@VTcLpS!B@IlYdv)X5@%mnbjEyRmdsUFf4LtC(PRGlPurOCs-i;Q`*`QvrvZL-OH^le$6>r^ZDXmOe z^=I>|)GAIQ!ez-|45l=H9d2E} zi|~HT^1-djYsP-#Q=tv=!OT|2^KZ<;pM)FcD|C$FDHDB?YESL%xow?pMHqS>gPtaE z+$zzRweeGJ!CNiWY_l-*95#PHp;-p~Ai-VNuG(OxG26~U2AySM31TO_=RKMWN=y~& z)BOFObk7ugOLiqjW3m29^qpvN{DH*i^k^)%<5v@0+2sA5Xb*WYD4L!uRbXi>9Ju53 zI58lWSjW2(o%r)BIYidO`g7Rrqmq5_ z28%ja%XQuhVh2tzNU;PuT+}>SDE6uR3t|VZ?em4+lZAdUoqj>>z=A*MOuCRfTljqg zCW%b+xM>9_X&;QW7MsVN+RUg)QTWVwLlgQ+FzgG~9}{Rik8OQ1hsruwm>UW^YJ7sh zi-o{O;F*bMR$xqZXb{1Tu2U=Us|f}T0)e-%ek{cjb-E6AQbdA*FB4cR(+3a-(;6I> z=mQc2U(9x<+j#>+w;;V{(4#!vwH4*i0itFFCi&O;5qd%2Fga|sknB6(jA9_OJoM%= zTb*CD-lz`M{N~^dJqf*R0-aC=bfGZc1iHGchxX^t+c7^%_JK~+_Z#NrGNbgjw0Yss zDWYZzo`}Ejhu(a_E#3(RIUFc}_1znqSiCv3>gcTMc)XyA#oHIND)|B|^!y8M#pXTd z&@rNRH-#!Ffc-qTXeAiV=6K!NOnJb^oL}UPNj2P)<8_u@3i})1{lxy7=);M?Z;WJg zQ?enWo6i1fa83W;?XQBF{Z;s{_Sd!OOP&3-bOg-^HwC@+AxQ+sMX6O|kUz-{=T1Uy zfzeKV;2I6se2&!SQ;lQiHa{aYUfUOZVUu(;T;Fn)W8Q*tOfaX2W|)b*ut1xA4Y$VY z#!9m+V((tD?lcWl&^6qOFU&H15#2ySp^*(zv^OFJ?ZevUbXTK5@XWyva3Hp%6 zG~(up-J7&epCi=ch8-SdMYo)+M(1~a!!?=p$Z;oL%-f7z)+`s`tBV2+2dcW5A*e)IL*n0gBM<5U;jNjt z-w0aH>~5eT``FhR$j;_CYBzYpGbxtFN_$)FMIDmyl5fx-&AD10vb9QqQdc*ppHXcpE@WvuIP$A{|ajrp(tGv zz`Q0s%5Dh7(0~J@tS%A;d3BD|V{XVdaMN~F^9#qI*NDD_C7!}6UBp;mb_}Zpsjzt@ z*>28srBa`ny93MOvda;9^lZ&UL`>zC*1086<|0Iwot7hWth=&Fjoz+qVf- zl;P~jS=0P=)`X~?N_k;|hsb%Q%dkAu+vA3(n;_&pdO}Qe;EGq|Ax6fFIr)b@#-#-i z6A^b_vOxaB8AR2mpZzVX;vSWt`(*phx_~9#gyUw;8^@|qHUGImaZ266A|0S_)gzfB zve#aOAw`kF_({Eo8>19k@{#*S-P?S=$UU+DHvTDFS*C9-q~OUFef)Z|p3r#vv7m0& zLk7u0Uwc4Ub=QmSX3g-lC7Bhq8+A*5V|9B#DD0^br$>EWc7%q|fzQP#DwjHsqOzgd z=QFMD`miGhf{6cy4-CBJkNqP`z&0ZHmVxSHfQUl8v_$vuhvqzStXu`JD^g2EA6|Cv zH3>G(oIFxvtID=qjA(0yr0I$nw+gG;R&-IhOCg=|``d@tjBOx+a~}e97qAGN@XbIf z7)T$c{G{XliDn0c>#8-lM%;Oan(=Y0bs-t{Lm%!1sEjykmmL;2lKK`9o5PlqpS*L^ z7Z)T)#c1+l^*Ph{U4qOsL)I7u9jSo<4g8NfuHP_mDEXH6{95~*J6>!qU}q4!dcqtP zUo#KVBw4b`E{FnpIp?arU2lkP6TVz;pyp)m9x3d!LrzWrBKKfshaBIWt4YiGt_zxR zK6bw@VTCMr%lGpH_OW#f+#cp>fqiH;4CkIS2bzYB%Mj&Q3*m+R0Oy2Z+c#I(ZPwxS z$&6^|=j@_Zq7rDyA`d{lyj3^!^#)IIas;GPFk&8Fl6iY5`h@(}#Kj*VmK!QEAB zV(R*h0i*3fbffy@)MHhs?cmxjXHFu6MV*$ogQ0yAX+=Gvh-yx2ssD z@6BpwycI^cT-GD9w2S>~CMe%NjsU5|RUUW%@De$ajip8fknN>)91 zve{5^ra-_VZvvZ0zs54JJp|`XmdVH82c6G6v;$(4e(yl7T%krtWE5QTdwag3p%vX= zWGU`l>R>_@;-ER>szY2!V6D>tRr8!)5vepq{Uw=xS;miArHU0G(3)y@EvM{VXJr^{6J( z*D!%m|BdKLnL=-I-hW4FMUx@fInsq)-nvrZ-OnILU*y4u6e}Hl0r9RXwjXecN5QJQ z@K)`fFgGgWca`MN9(u$wuM+gO30|#hM2LsjwB&xc{e6nI<~M6W%?XaM8CX96IU@&W z`wrpSvcx=mIbGNo-oLaNs|}iw&n@&Q8k;a+>XRX}lRhWchtD(U{)3VSNvh$Itk2nA zcuLzP^Pn2;y*I9vW|GWawUW5<{FOd2HnzKpFY9TsA_#c?dNCn>Xs;n?F8#TY{X+>C z6&2o3TL@L%$D8b6R)Vhvf{R;{#Kg4tYgL1#ZOVsK6FRp{QH;S@?-ZZ5KtD?)r+VYp z@(E&tt(+nO*QZRBx{6H$iTAxS${E9AT2DBpUq@$aYfkXSZ6mIV&NKA6AHmop<~{o< zle_qKf7R*J-$Hk7{cI_h*z0>MnB%q{mt8IDBSsXM&cZk^rFMzY>hoCUi*SE>zp&VTp+K9T_R;w6@@?+oYp(zNlpOWd}AZDeB1;N)A zrYD(G7Y3NuW6SKgpw>Rd7WPx;`bOQIxE^~TX4Hn@UcJohvQaO0O|_fx?%>(BIv;~T zMHh?7pkD7g9r~$G+;TZ&Dr|GZ8F$*eqX4#zK(r$^e!3fk>liy%9c~QXCVYq1*c#Cv zoMSAS;Xgubbr1T4+u4v-_rjY@7e4*toI$ICTs|hP-uv>s&}0^vqIoSKaY7smhIG%q z!s(S4ozoi8t#?A5Ji2-P%6tC4m*W(^eU%@(J#y6x{#2Sw_|m5F)^bB6ZF)h= zM0u65)xCQ?lJ0P-XHt4ev{pXxPG*c9`+M*g)en1L!`YxFmFUt0mHh7Y7q7ow{hw5x zwKaM#PqmtuzdRs5Jbto1B>LZUf$f1Rz;M|f!hW_I`!Y3=Z@gfXO!`)}9>oth5M9TV z`(f^VN=*-UuajMyPrz<$QG^-_*v-6(2iWHoKVU;i<8jF26~<{N3byB3vu~K4YV!Le zIlf?rgnHV&KKaGt6}~{mA4sh3p7`dasNEOs(0#XENNrxZ_07pGM%8HLz1L$?WU{cA zf{)$BZ208{k1R^2=$jm7LQfJfkql~+Lk+Dp!WE}Fn)wSb0<92IoHaYl94ivt{JfJD zXYv@%Upb;T{Jc)J<6`T}Rzbv>YHxfq2LKs=oZKEXm{cC4Z)-qz-+*L7xGjsb_Vao(H@t~)EP9(k(mDGWr^tqRRNRaHD-^T^ z+oZ7D32QT5wSOj=|CUj!3SCe=YL)-+mh~&qN*U&1tTO*4US;EJ@~%;e13G_2jCf}> zv=z`RN?*W8w_J|8GQZ4WBg9srzg&|@N656hfbDG zv3wGHd~bZROcoYI2W_qJ6YMo5L%uj9qxN@H+ZXSqM3YiHlYsT;(@CWduk%Ov3JuQEw;Lfnev{f3BvnG$K1~zExXbrH`!?wI>DfHizCN*v zlwz42%h%}E*`FE_bF$juv(fpi*KBJd^BY$_T9SkG3w)Ka+n+hDvk0-o8%-f)jUDS? z|JdJHD#%I@M9Im9Byt?9#xwy`=V+l^JpiS~K8#H3$_5*~cSnHI3 zPBB`(o#KbtFKMeE-r!vnUu`FpK%WNmF$AERDRM@Cp_8LR(ceHK-_Hu=g2)N-tImGC zj3{6uQP+$?DQ~g?G?lhcfvWw9*MVF{%E}{BY7J0BM2RxD%Pe;7AwBHSY0NV=tM-DK zVR1=V3$rPuWskRde?BXi?TE1d9dCuO1{_9*vYEWf|%J?pa;C%*BM0X zT+9S8ZdLb~ei+QJnupN%+@y%us`$h2wQlo}o^8lnihUk)?w9c~ByT{=?5`(a34IZ^ zR@r|8#S9>#WU+dC6B74aY)c>K8Qc4yIM$KdRsj(pME^5p(?m(}BhT zt7@L6>pAwTnlNaKG@WPF@QSN)#ww`}U(KcVvw<+Id5ZGA) z3e3a@63TqHIt%KI2L>A9JChL~pSM>BL)kllbq0b)>B;}p%q+8~O7vXB>o1xOQKmreeZ}`&cI8yRA7vn6(51pA{Z`#b z`IeT9h~ODsf^pCTe)G@w{)lTw*o>tQdFlG+2-mKrK7w^ypx^PTUJ|$V=)Inx}}ax70}W zEmRW5QZ9poBNaasS?Vxvmx@UFsNN_|Gi_3V=p^ri%vv4AwB7l2~kb)+hW{tJ;gkR`a$Ot7l+OYE_Qg z^~q!OZ4zH_)@>P{HI_%ru@jbtlsvldy?4w})1)#@Fuda*#X|PJxZn-)m#{jrr+(tN zQf{tpy1qD>j0HAiUYUj+3GBpYUIao2>Ub$7r=lM%U#dTyEB>I!jIME#e5Mu4S z0)B^+@wtBDK`9v36RFN0^qX9+ZzXg`=vh1mALBkA7geb#zg6$`ql@k?{ix3T(y+&W zBON!gKnnfc+WxeERdD(UqV)epw(o9fh}d2qbWTG5v7Ldre^7?po-P?^<7JWFo60FL z5hM3@HIzQ?w*_cb$T;yufQ%r&+%l31c=FB{k+n-hgAML*VC=|9(!04B`dkR09xwj= zN5rufHP|YTRvNWK**~UQ_(E#Tk?0I>duj$JAz7q9&uYR4gdB7{$&jQgl!1t!nbJHiJ+oB0UvLr7xY|NmeG#16s z$) zG}RUTN0+cZW8Y>w+->mI+5(YhG`QTWKFzxeNun75{z?wI8%XHeV z?=~5eznaa~(j;2Zr9dsv7oqfEOxkLQ#aETf(3#2shpio3iqe5+4e06SpELNT6gRKv zSlaSZVJfqV&_C`*oAqJ(Kh8SW`V%xKltsZ=M4)WY+; zf_)IUxEXQa%tx$P{I`afb49fbgq_) z=t5w>?QT3{!@w~>?iymJBzMZ=K=Ki=u%kT%=MJm5%lbinTS#$+VtgbZk~5^iM&r-% z!UBlS*TUPVq#9J1U;B%v=i)m+8!usD>km1xUhxRCZ_z$v??K*B)to=`RCRiR?tPUq z6TtYPd03cBRrb;jSy!sEN>B*KrXf>Dr$bQI0`Aotre@Q3O$pM2>7|c!9dv#1z|iMr zbOkVddS`PFfAy4Kl`HZTo+@J4d5|BfaA58QA<2;p#J8 zfx3j5`x{;QDnbXrl!ArSQ4UIHQrHWfOItBfNa=T(&Dbyh^zJMI&B6IXXH#M3lcOA% z^Ot1|)~ookX+#?KDJJj=BkCHzOFs&r07`F&{P+dOmw0O3Mk>%BiM7q zQ$3slvH*W)SEwL2PQE;e&bH+e_BKi(ICq2Wpso0>vV#c-pPK)b*ny!$Q%m|$kOE-- zWe?SjI+40X=(XtnQH$#H!MJhNng?i1{)gq$*WLC(>Onrc)4fPmVD_tg2=!KXe{-m{ z^WS;UEQGP0uTs*!*DSey#m+7{2<<=~8ootb0MFGQMvzrX6@rxXXg-IM6J~X#6fiLA zzBYF=3TODvEHi6}n!vpBr6x_JK_m4WcSiuND>N!04>-ujRo{FuL-kD~u$2EIK7OG0%?z<7 z*h}?Y)iwfisno-d+K+1Z(6P2xcD(iw3)Iao#4eHe|z(q{y9Fi_TU36!27eJm#Q=dTGes;bFeLs3;{jdyP7o4O8 zyRH>kSd$xu#ZBK&u0JD{Fcj!v$pm~FddC_>ZGsH6uE7cW)zp71utj96+MbT3p+N|> zfQY^qhrNnhRuazog|+B~YU#d#G zS-|@o4hbg4B^7<(oU+BR?Eo@7t$Xp!(P4{_WCP zUHajM8ZGw-s7u}Kde4jPFLmZQdtIY3z*EkV)uHm13B0iG3HaIouPM!#qoDQjz98(p z(6DKlct89Qi&qdK(ZI#NDw}@SWb|$%K8vKT=$*EnY|^fSAN7>VQ-VXHN2C-)eCQzm;lLO` z7BDg@ZLW4-!8<)My6ooNRk>TusP|%caRMM6AGkBG^7>kcJvrl+SI#T=iz?`E3Ph5_ zd%CS31DBu0<6ta+;Ndde(OLFuKHz;_ROq>ke2JzHbXW8V;Y-?8KA&MBW@+su@g<{_ z8*s$i?TB55{Rwcg*9^V)ZWcl~TQv%q)0raMHOEF7gy<9LTf_o6NMekm;0^jUtZGEO zu1_>~F0@PblCzIWf{!fI-SOl`_pnrw&hWrI1=g-@2kL$WOuY6zxC&sM0~XF&xZ8)j zQn&}(UgxM{?f9Cn&;B}eOR>G?U8le|zI|1JvX8ed!@0v8<8Y6(`N1X~U^=sd+Ru?B z^c-_b=D^P-2=a*>n5{Vr9W)qUt2z5gRQeVVJ*4==~ zH&$L=H4whWtv-=w=Qin<**sMzM7b`uE|r^Q+O9}SciXlAq%9mfk?q1AOwwG$s~wac zY&%w9<&MwFlVMvB*3%GLwP)lKsk@@)NKs2k0PXNa4lK{W#B^~Q@`TSV)U z!T|lLAKuo0%319W2a;7R;?>@di{u@ot>vERg;O<&NG7x(yznXO1Zs>L8ny>%fa{%&*Q!9DVuTx_R4$VUSn6E6wVc{uw?`lM$Tvx)@X5QZAb^p z$jX5kfX=WV{0Zue-bfE41A3E)9o@ukj z`fd?Z+HQwk<#e9;F$-@;?n~te6m+$=5b#QitiX0>RKCc44qweN_WV zg~`qC32As4r_?H!0XL!IiF0oC;baLc4c3`LBei4YLt3?|nI?~2lo&_X<^C}>U!ZV^ zm292-R=`Ly^Wn{}2-Ez|5`~@9e%o_;Yu??&)GS#IS#r~%@Z^Nu(C2iIqvzC&j@ zd$OS^aI2;LyxINk;GzA{ta=GuOWPy-xw~G=``_(mlY9q$^Zh06HcRcbrYg0otpn4Q z>?)omZ+fIrjsY?~ou*TMJ~}SiuRIC@yXR(>i_;7#c=khtBv%*TvRGWLPJWTQ30UVG@#Y|A|3RHB+JM(-3pQ zr$>CoqsckeA-AO4FnkX(^6-svG-IJjd1kc263TomgY*nTvv$n$$C7sUfJgTTvI)Hv ztYCbz?9y*FN8R3QPE9}C)ssOePNPWe`YGGCiB8AZ_2jK9`K3*PVE)Vgfy*IMf!`xO zUPM5S#}UvbNnF|7PIB-gGBs*j;>zn&755>NYui zrpn!m^p0q350@E3xHGQVwyN1%ev1(tXK#;6QR-4!nR2SE%RG?ZSss69iG@GFTbfYV zpp)%Xu0A(7)IJhjn|=j3qj2?9jy-|pFQ%5Wo!ao~j=iGI%7mT%(`5Y#@(0|qALQ%1 zo63T9|0&i11n{Vy6T^P{o)=2ss4w}w-=`l^YzUHI8Al>p&dk9Lzq=r)Y}5r$95jsC zbCEZwumuKe9LX>?p>A{z6fFCa;$(JH6J1FK=vILS19$qg`O2q1eRoySxL6LX{_I>h zk&i%)Z*i*7p*ehmXXw`I_`HpE15j`Jxd1PE6EEF9cDDdBZp=EQOTQ)Z2VW14y~Jf+ zuIzeWfe8mO;jjBqP4_IDJqb&B)lG3dPAJVj=dA~)({o}S(k;IV7fJUexusvE{J6EC zMwy+e@F_)n6s%H4mQcJFte%iU6V5qUOt$9A=E zdE4i=u4tdq->JD*cCl|!ZfVsnXkXdhb9iWX<+V<&?_AuwdSK`cu3xBnEb48@csA>G zw=S5@RZZs#oNzM6zGiKsirrNsYx3}{x!7FFy%NAewcY*!vGrvP~pdWQ@T=ySPbE5g% zG^vquURQ}NnUQyatNQ>fe9n{L&buovF?k%8x~smPXSXb#mjxeRTLb-l&)+!!!D}$j zF1oAY4O@>=Ra^q9?%Z7kLAD?{&yg8m$rMcA z$tO=~+vh!Kb~b?1Uwtc?2d+iWc@B&7ZM;l-4>aY>+TN1t?T^6Mle=iSQQgF~xA?Kl zYunk6IB*3gEWulU4j-u+mhX1XB679$=X9^yqR^`i90KoH=; z7Pi}A_{R0~m}hfqC$@yKdq7m&Ne;~zM{Z<`xVrw8v(8=6smVlTPJWJSDPn5-E|#3- zsi%ja$2YENr1uC7FLYFMFf88*G=9ejhk{$QSf;pCXL?CSd~|V6TfE^R^=u_3 zSdO+h=G03hwjVnf-+#+gUnE3GoRdZIDJ;sZPpGP1S$V+Bt{j~-5<#~-mb(~zYKBue zTtT@n^-$!gm7|uqK#`u;QdWJNTOpe~=4=&4lX|3@T##1M-(a7Z;62ok!?+KB7-Fa%EI1j)P}n%qHoyE+69B< zG^=t|6)DoYsyY?nngGek#++nE_TPy<8G_Hh-IE#g(HdC}zVaI-EWhhLpvz32mIkM} zG_ed;8~=p&NtjlrfADw_NiGjNn@~0PY3|W7JzIaU|H;WO{V9BK4E+#PfrWC3vzR%` zp^7*g(xG^8#(9rdA=Fz8Q2uex#xIwBIKuAILA1P(KG@8CYE!Vv=R#a>Q;u7bdU9|I z*R5Quq<*U0EgwzRV5_){vMHb*ky%>of*R}cq$=+eSfkJdOXL&_1`F*Z zT=RMrOQmY@^MZGUQOQD5g;nF2jk1?)I<<-;8oN?5Q*wziIbvo7^FxW=qEYj+YhqGh zv}+;_$d3z(Y$O(8iMmlc7G!@&oy2Heb3;dh`c{UDOcRg9VtCRmC1A-pd=98e-_N?3 zJ-j}11J>8%1hLE6p(rS~Ag_L|I*o=&<+>=> zPWjadk$pqks16uyP*F{W&*{}kXSP4>z|gokaJv4~pENOpdryAwO;_jXz^XadB)M`1 zGTJ21<#iL3H&A!3myPG2Bf^o%WXo_T-5w?Ng7kv#*l3TInIF9!O($<8E^|BZ&@iK2tbk>5UhX*fMXzf zbu&`;f&o@&&iUc3XZ|cT{xbhsP#(%lrO^x+gYN(~iBdU7)Pv=KI;m6{sc5ozvJiig6|T>6 z8^HmS3pxur6wKW&G-#q92IL4ai*q?JHvq3sZW|MXbBfWnxSik)?hWb@0naj9YSqAqy+uvTFB(V?FAH$(GRDL=rNoY zgwOtsNjt?&8yKPnP@)E5RVf~3hHUqgOSu-)rzFIGsiQRdWDEZcUOxHP6gv;ret@t6 z(``Lt38oDSB1KSk@%3zG7IKB3-t`6O|7#Cq?#61^p9!NKouXLFvl^ zP={JYZ|If0W&V?`f2L}|AByq8i#e@MC=W8=h2dR~HtJM5XZxKkUO!L8ak_4To*7}p zs$@g)drGuEor(i($gE&R7QHjv2utale$X|9=8$jD85jDqlLkkxbMI zDrw7LI6d>54}u@j0AS>Lg!#=u_EjwriUkyRfN1Dig85Ae!4Lgk)>{!l5cST(as;)1 z1eN^1#dA1f;EV8og*2(ACiXcb9eeADr)JSdt>=v;w07%74ei1l5QV_fzWJ6=7)_br zDsrAhR70x>{AST;tpf4tEi3C^-)x{&&zIM<3WVsD@=~Z2BbTd&te1A#t#87c-3PS} zIVJ8q@UdZT`*QpB`^c_AHGZqs6mnJzt2;n&!QF#&_i=Bx-dj<%f#^UmK<)M2Z9`s@ zU?z?j=+Gq0Vtl*sziDbs8zg3KzD_uGvAlM+VE>D=tW=n52fx{{yEo;tFz|DzC-Ra-+E0%(GP^5D#p7<+v# z%;)uOhH$VE+7v=3Wd5l$8m#u_Uic8!)IHj%OPpIzFnk%AMS*JI4*G`VfF*ad!yiR& z@F6mtlCHk9c$C5;R3a|G7K^+$p2txD|fg@ zPrimZK=f~;YWp}{N$-MK4xvpak;l`Bl9&aljC~bDp&2OGAYF(*j$IxB+iR^{j|!*r zWxaCkNq6p=yVK&`S*YE6^%D_M!rh_os7KusH(LiCS)OToDC0Db#tUBu-;QQs67#rG z9JVLJdCa2KXwkpl>upH&dhi+bV^SG8C7dp)VvwOAx7i$^xZtzEr@?>plW%b1>mZ4P zw28f~OMYnq5!EF~bn|`q=26I|1J}1%7!E~&GD%LzT6ezA|%uwoC%SsDD^?2 z=Xu0V>6#2LNoYRf2Zp-<%r9Z*`rp9*3pxHfj@X33JHpss4i=j*>>mhTWTvA87gzst z3=t*YcU;WGgH%Y$!~x2SR>uNE`vp*Vv^oaRGt@c;;iyfKe-juQ8WS_(OU@Qwaos-pyT z4rKZQDibBlKk()1$U#*CnaE*O0_(^?Wl;ZjprJAmgQB6<;Utq4CYb#Ejh#%=lquRN^>5G)HcPZ!|7|NUp~ylJf#(j;QmOMyi*MUN^oVa;{~PSYx6L5_3kDEK;@kfj znh<(o+o}-qV%rK3m!jM95L=?#a{oe&=(aS(e}Yi(O)S#~ie~1IRvw z&}dtH%5c$R9-20cz#NTZgv&a}W)^N~mEEL{*H3ZynK?GnI=9DSHg5u~7-vvqK3z<5 z$*L{wQGWvhPV}I)FIwWUld$r@BqS7{<_lD7~nkES35 z9XX`;E6AKwQQK);h%8GLn&H`ImfOE0BY*`73s4!P_z`juAwXjJ!}k}@=^-DzeKjy0 zAVs0 zn|6m?3C17i?MVsYeRMq0n!j)xkJ&gQYj!o}Wjj(l?^b_hRR3ZOQ6#5m_2{Re0;}w(rxlWZbN=*yb%GGj7^PBp~heYEV>3fFQ{cU z&ut|s1H?6vXv!(M^`KA5H@&6WV^@>yA+Kd;OE(Z6+xQ$Z#zWMjqIc6Sk)iyJK|KmS zvb+#A#+onM8$)@m+ZsbVt=cO8PZ0Oq^Elhc=2Y4`Kg@Bd3At>k@t}2ItPSeZ4cXxIKR&I1r@vt3IEH!SRwFVC`rw<$H7-6>cd_$T9c{LEw4<=m9Bhu{ z)*GxpFd!dMk5{eA*8@xQ>F`*=9Itl8V0QS2xGiCyEh1`~&Tv-iG7A@#mpV~mSS2cr zllJzD$iGyA7By*Pwwm4mZ>m0SGj7MgNbh*p*tr5cvH&W++%>&Y5gF6~B~p1)+C0|D z#?uWjHTv3zT=}D5GmDeNqTWH$Sct@*Y{CaZxn$Fj(GFQ(XmNHfqD`G!v z&uy5OreuHp#jX<|mlEs{?Aiwyl%C4mn@x z(X}C7C{Ks$4hec;Cl8bkldXef-N*y=RQQp9r~xdA4m4o76+0@}5lervVdjG4DWcd6 zpHKquP}=?pC2&p>2P0(E(4F8btb{0^VCER69+crFAez+hQtLLEaYxwA#(>79A%0<$ zVem~PlPgLQ604okFkRri;V|_dY%!CBd(t3Y+>;n^aACsHR^HiBq^5e^kI9d(hBQ;Q zwP0SBu;#eOZhBQ|PyCD7SOUu_^~4tO;+&M#%IDmrqBx7Hb<^LR23k|j7y{u4fI7br zqhcTP8~@t+4&6P8G(b8`38}Oz&`ZMqY^>Z8 z3(|jM&=|c-f|~=14~h`l56ZY7%>e%>7n;!@3$(#=pDt?F_3Fp;3=~m7JANiIX5f$k zJr(3xzjz(iIk-L=aP9(0+!dO%Gbny@dem;2(!o2+zfPH6LQuF$XaWMT>RczF2;1Wqwx7kihX(Jf-*$H( z;ljy+bLwZh>_*ptssT|Ctn8O`AZR1}XCJ^VY7MEdWuWYW$tvs)0$C}>*pKC+dz`(o zA1sC*N@hnm2R{Juz?k#L^?SK{yg$E`ru~_r{M=A5%jtSJlc7y9p6?3q0CK^nmp|zi zjxXRU*WNVA9^9?YuT*fiB`01w?}iLlq2M3LyMfS>&)XC&%$2kFv^^)8e*JLyI;)h# zp7bPnM8wMsxIpL#{5u(Z2?Y#))W;+6Nki~P7*XP^NJ8PlR0ix#YeEwjAEI^Pg)#|on6(VI5TgJQ0hbSKK!WCl2t0IrtQ zcb^19w)UTtw>8sww8v(&+qURiW_{}j?wO$WtlPFwT~q$8IM*ED|6PbpAjtBpM7?pm zO0%7RwfX0osqpW>vl10uDU)>Pwk{+ox{--%efe*6M7`;(Wt#)T}gyt z{sC^(;JEMmWMw5)#4)%`vp$?1Xw)MAxQmFSQV2S6(KR^?u`otAKsTqJY!)zGhcS^|&ZSt*i6N$jRm=y^zUfzIb%k8%dRYjJ@}XFi1Cfb4Lt`7eCRUCt&0K%Eg;OvoWg-)! zhsK6?MUNojxrLW7D9?T;Y7UKM?V89rHk5E_s_4A1y_%Kh(EUS%)ThVQpBKvf{P&G{ zF9Y5aKNZY=DscQ$6h9UIsn2Tr^wY85|0ji>j)k5U(+f~Xma6Z?RvcKnvj$fkkT4-I z`3>q-);C+VfAZRcsq{umo%?|w_r61w>N+uTldXtk|*i{=zgm1Ttd1Puh3bPlfM!Y(>N&3aJ>xGyFF)3KHqf= zWnVZn_KnaUZ;n4*t3B%rJkGm+RXtwas^wD&&_D!)0^(Zfs<7#(aKmVL>VbD%yZzc)@B` zNf=4xZsGxES5a$c-&c@axn*G3dN|<>5J7=k$1*W~2Xv(VrVw>eLVKLl0Slbe(A|P? zX@pGeSjXTm0fqg{+guJ{T(DVSP=S2rs-RUg{;H656(DLDeHCCDsvwncZ+)!{|0>4q zb%Djd@3H*d*x>)Fc95H7AC&ttO}*)1;zuFI)=x{B^hf#)XYt$VlRlsG%2brNlKEp$ znEZA=8jB7?5?ecr&UtSpQeWC#j zhbO~Vp!p}(wwnR^h`3A(Fr&z$Hs}+~-k-CduMUI`OhyPr1IfLm6&F27 zK^Rs8n!|sFOzx9_4)R{5_7T7sh%E_5YY8QXja(FT`3Ucfeqf*oA`fov-}rTYi;oHY z4PgVs4(y&l&d2aW{8{0eqk*&AR;I1h_9L^!s-P*?Hm-8J*$NNPL9Wxn6zC)P<9itQ z@x^)or(ML4E=L(tNWtsjXpIe2!F41eZcIMV90-Mg()!Bk?=UUSa@OLPq_-goV|Fbp z%IZuaDvOLK%NP5wh3CaJ)t+m&jp3ea6{TOUqLf}xrR<+B6*Rgx^NL#Czw#WreMx|k zbK9r!0=s!sAhr}Q=-=gr8}v^VYOfr*(9S|NfnW6F;pal71Q@;YrSL(~5(Xtl_m2-7 zm>SnLFl(%0SJ@z_aX?Mr20=zMUr8$55xNsimNI59@N`Pp=3Pw^E>e(HfqRXGevQ$* zxnbhW6uZXy#yKH4@r%DZc8*j*t_yLOwX&NLwHE-iAgjrfa|i55uFAl@F6^|{<*YH9 zS~8btENnTe$t|k`zubSpbzUpvc-Z&iCYP45SyQwim`Xp$sED66!5Mp9KTZ>gGV+wB z@xpW0R0OlJ^(W6L&Ee#STftD%BkcS7Bz}Fu#)tDO4(XRVV>|%jmki3w%)On-X>OT~ zz0sEhqiUY|hNOe_n+4%jQkMW5Kr)kQ@~7T#52+*9UG!#661{5mIa1AwXtu?~!q|$t zz^i$XVH4|yol@(H$0?_d7p2eL24han_X4k`#)Q{LNj$Sg8Lp3VFKAb0{*I(d`)2Y< zQRB&ExD(BYEHcsys`h^QI3)mGTo@i<{0Q#hIG0xzpDm*>bgvNf%otcEu?%iO!{lS! z0V2lnE|})LBK;5|V3ZOuGk#Bc-y%TZka%K9d2`mEF5CU3Hl9+q>LOUSI*yva`dH{w zeuU&B#3nob;+Kg`X=<-nPh>n}bWTojC@0z9JrNg~ANY~nkdf_>9_u9b@SeUbJe%LS z=TdNDKQl*uy_Uaj?lEach-U8dNPhxj3TLkeS~Lh7LnNDF$}ve6wbCb^7p{0y#zeF< zCd=rAUngvm5Kc(RHl{3U&6--7)+QGHSUR*Xti&DINi`4zU-CB3u7x;PE?7cR%myO4 zE!c*VF)rUlRxtB}R7W3aNSVM^KZ0#4v3preDh=5#joH+gaZ^d>Av826(N2q#iBx8P zqS7xqxuGI16a;MQG|RIoU+%Og>*N|_sQ}=o4|Ak1rP|ULzS&Sbq;RC{hMfABw#~oT zbb|6vmY7$bBZ!}~US6k-f5`VMaCI3v-x;=*LCCw+fzAUxa z6|bY#U+z;VN0rHYSs366_2_pN0Yw(%r7+~lJ1WE+^(4ug_(7MdgxH941KPxsh2ocj z;)iGnIDn^JQ#r4J>D`i@8D;Q&%dqcAA3FiO= zjQ9nP;Cuy&6xyc+eH`ZXa!2``a&{5KS(MHgPTL)xn|+}w_w04;wzpC@#_sLPvJ!_K zQ1}EibFjw+syW(w?ztCt$;;fUe1)B=h3OFL?U>mwZUC|Aa>kD1QCN|ZEsQ!pTheaU z0$Pn8DMRD++AZ_zZd7SeV(oStnZw)p4W%weyaU( zXUrk0(0eDrm|=zC3jQv?NZWsDrk=b`?Y;Cm(mOB0Uv?+BiIKa~=CjaqDPP=fEOm|k zw89V~L!jK<`uXcfZ5Q^v;r!bLMdl*f>;KcyeMhtT{SN@|rvt4TUA8Dn%_^-Kqo}

|eHN*Xs;HphBsBGM08XgV7B=D(rKnX| zI;9Iho_vRv<-uO|<6ZUZfoJg%mb}q5JZq=*CF_IM2V4&}w$Y zDdxOnb}m3!b9R=@JiS+(BcaI;5>Dw7oj;*!fT;QZy@~azsQh$kMeCJrD#nzsVQsnJ zfh1Clu)XZcmGlskvEiv{occWhQpV&~(%sI9HxWCtM0Mk0a5Ib<+z$vgZ*MoT<9;Y!1z?{tpc=w7Qz69<>9|;%xE(~z<1L}Bp_#iC^T0?%x z�bcr4`MXIF<)neKD~?hFaNb{wQTF}^)_g0yp|MDC9>RNdo6U3>>aVJ z-)hg;^TnAIvMGEu<;aamb{GuQ=K7v1F*s=+P_>jJlm9(e%JDCgv1QX10nxdial!rtsmAq=&JHK!la-a(MIg?n}O6?^tJyS-4vjIq&&<-F8|Xf5fve{-_0u zeEkaHcwxb_nW@{5q0yJ^-6o!oMau>}25Ys_sLD%qZByj*g;ojS7woi-5stKZWnc1J z;LHYdF`j`@LR-f;c0w2pmh7}zFv!T==%cSkW$J5o>aelw1zCjh%m9;68-k6CA-#ox zQO4s3mls8j8eO~Q#;df?pZcNI~r?Wrwbi% zE^+eM^q#C}-`uG)5voW|OF@sQS~G^kvN=n68h5-2Fzj|cdUSZQ35X5e1i*Y}E^Lo$ zy!;=+xQ1ciCLkzi6F>@K@MmB&Au;Mm6aQ!!u)UH7@q4;q~p%GnuziQ0Ad7Lpzn~Yi7eAdno~p zy6?5GbB5hE8J!qqoNsDUc(*N~nz+rPnmg<&xo~y$i$`7Xf2%S3r>uV+p3}IEK^}Bu zE{%VSZme1RVifkKs`b~=rQBS(mv7}-KH1NhdHd{MQ67cP$u$H-YA7Z&ca=~Kczj8OP zl~X+qf?TLd)WU*XonDo1WwtF%}R) zxG|7mGqqrbUfMc2PLm-R+>Bh--)S?N`MH<9Cu#5NjPUi$;k(;`-;kQY!BD1h1h-IC zxzRp&<{>Oo5DP*qc?Ik$+I}v4A@ys|^VIyq0Z|R8D$0Uvb3;Y_j9PyY2CW1EtJ6hG<@|2T9PRUMca8}eM9L?5Q z4gL|Ohodzz9!yYTINB|jn~|@0I~;ao39ZtoTR2dtbVcpHot5i0vaIu$qi)Av>9Vu9 zqswHAy*y;c@T@y!J*>Y8ZPFCzqA(5b_a=zd=VlBYdZPGhst-1fPw~_@n2uSOytC3H zF@>FjLo50KHJ&mtJAv!^QRPXn1p;fQCgEdfbX6I!Hfsmv*>+IrlMC|MM0q+AY^T*~ zr^ex9P3S7XYtXhVq%Cg9#zJlFtgY)`iZt3%sDRm0OJ7Kr_7wF>+~tea zc=?)5NwVgxqRMt2{qdlzc#eqdN;+=i_dWA4AGr$K?W7?r0dbt@Vd0D437fv~1p@#RuVR z$WJz4aQV&*?(H!6o$f)KD1$CtFX9HYv^lS)T$IWj%H)H_Jt)mTv+NPkFu^Rg)|0(! zGK&eXXzCitcklgSg)Qo^Ig&&=VhQ)gKf)KUcRY63C=IP>5OXk$`5J2a{P8isUVqoi~l5^7C!3$-HpgxV0n6icEP z#hU0ru_F3WY_z5X%p#(BAJKRMuad#T-*L$g`mD5O1uSS61J9Fh49DRt6z*DSP3D-= zZU$Z<+YDFWn6qBv0?qD`)l&^3Qh4vk4n2Fo!+T(+Nj`7$C?b|uhxRa#k32fOj>Fvd zu+$pOF`~%?a*^wYCvg~gf~D3(jtNaY5I{Z{KEcIg72;wtpRa9P54`NqhI2BGXyG-d zDFpJ82ZvX1wf8}mLeKRryRc41G%4M83ZU$&3RiGVp(Zw=Bof)0u4aEe|KH2lam@8& z0Uv#ntkyyN`wv7Vs7+TNUYF()C`YCaMd12{@8k+BT41Nuy#eVvk>bK1Oc&+XApqs% zz?^WMsgsk7P&0*872u?)KFH=Oycyn$dgD}^1zI;Mlq})+mj|19bxBqgd)j>Br?Sg& zz=8hkvwM;RkKvkCBx1!?ne&$gKKr<5WeViGx$mh?53LTUx+ew63uPw1eC_m3sb6nx zTcn<4oh!RHAkF?o`t4rp`n1qbl0}_EGO41cjhQ8H?ICu?W%h1%BU7IB4hpCEUV6uC z$x`zj5!J{Yk%&|Ld$m^9zJBMH5BT?)(K_7}cfVi`T-%L|cKTN%YZGMyNLJNxRK#Ka z0pCKcI5z!i8SA9+)N3fuPOa_IRDmbmxUfQN*ge{~ga5WGJ>(nKS{^Sc{$0&!+7QhOf47H!q#})_9)@8Yn9$&}#|8`4zcI)>FXl2+xT&asIJH z433&#gI8qsDq0aHKjY~rBdd*_?OR%C9VfmZ&kB;jmoW8wgW@~T3_7)oB;;=fT4jrv3480kx~pTJuXE5f z&fGEml7>9upG+jw^B*Oj{_p^_(lzPplQD2C2fgv^6VU;suLP&}QFi=O+?3`}JtV2d zMjt#D-(GPcd#X!tzHG9q@g;uhTjTPEcu6(k-17b7o!}ViX5ilk%+&@!R^RR)#J;{TJgj$NbBX!rg}cnpmg9IwilfSJ)(zmAP<{s@q%WWEpbuIiz%L@uHn|t zFJh-KpJyBXyh}?y44cZqXff?;sQUp9vI9x&FMT;GXyW$?1m!4)n9wHzdH+#U+H)&bI;BG3??|HG9bAL>B{eM?&=E*3D#`e>*Skl?n^SZgAtq3S#7^UnN z7blS;^z(iIRLRswdvD#s&D}D5VhBAWp;-(j0&uZ8ls~P3H;bdbJSxh%A760&rjgZ6 zGqEx2_!kuqopmy--L4=fnzTh|;Rf|wQv6C)8HPTiS!Lo_k~rBx3|ruCHcIN$tH0UE z=UZ{kcTMXywe$NwbDU(^!&=lwx-@Y&io{-bc=kHjDRitlh%Y^Fwu3uyBW>>$h;O38 z0JHP3)5N_mXuwX-Aj>x(yLmU>7gA!EW$_8;3Fkz9h* zq@~yO#SylukKGiLEbVi_PsZm}5Q?qU0}f6#&6>R{iOqD5P*v(JUj_409>U-jR33qT zA>e-Wn?6W!@4TwGo_SS1^T^31Z@D+dj7ypKdEL8y!&EErV#bPt*JSU>sMvb|J3n`m zOr-(tqg84#*W>NDq$Kmi9nKkGs3mD_4Kh-0{40ISS^+4oATC;FF_iXY>}2WPwd04m zs~xbksAYk(*PuOPmmh<0Ubz*quOBK~t{JuD9qr1UJ|M0-qf()}7O33jJ-gZNZ1@eo zWj0ja#GZpoPZeB$sZf%Z&ZG^UNH=EP6cg!UDZk%wn8z5|7*Gtge@Ge#Ew1%n)JED7<>zk}JdH zmeFVa(#j{P8`ip>#?6JbXRINgNnMFyWr@)Z zh!k{C18bUP!U~Z@F1tWveM*oGsnq32h#ZF@^ST6MR|D{FZb^O6r<(l~b(v&C<^Gf% ztZt~W9Q=ubm`Ug$7_jWmIKc1o-4zI2KMz4zhQqZfhOX;(X)Aj0e$nKafaY#wP!*oz zULS4Eu3ga==|~uFXY(zdX8a$O^{tv-ZEDZQvp0`!2ei*%cDS4SwpRju^QVdIEpK;H zsAGa526!vz&`R6V&O6|`IebwSbD)Fw+u?vtG zH;LEx%DvVc+LCI@`M;{$7Q{a>0#!(*Jyy21t<)c@U>YlNc#`c~lwH9-R_eHBw_)mB zAxAFfURUHZ)rF{-mCCJ|Wa+z(1W~d&3;iHW$TG!-^zo6f8$M;S4Tz?Z5K3Ig zAM+`__Fx3{{ox;%DFbTj70?o&(?`EWHK%0aJQMzljS9jskU#Qc-#+uHeBQ4IFm|~D z4oZ;_Wl0b9?jN35Z5VIuye;a(#2yn9nB~I@o)6%Q`io|$_f|0e(LFZzXI!h#09^B7 zGTql@dahLKu-k!U$HAgXVCg0>bI5b$$R93SecGq-qADMjRO06R`8;0P8QwP6xntTb zrXwQe@Zyf$y-zA}85bp`;{p(Asb0%!t=dwCV!XF6xTTd1b$9w}{VTfL4=V8(r!MS4 zT?R)h8~hfr$#YnU{6M8^--3D)+PQd=bFU(DcGdHjOT+$K>0Uk1Ym?whuv4vxh^{D` z6FPLp^(mRZv6Ci+soFs)&PUrG$af_LYpCC-A4toOb%XZ$`%mU!W;}gzLb|OENw_gAHCvWRJ9hJ6dD^@+7t9H2`fKPx)k)r z94kplj4am*>NrV7|8WgUN3ZMmUF8bd@@I(&xDFy@Ic58;wmIb!89B2<5Ih%V5uWgi z2le(ljGOpeV78C>m{Vv0oX~go_-6j|^Wq}>srPyF!B@%_S;ONX$5&jJ9EW~-5A}wJ z$Gm@% zdP`c;QY0iLOG_G@q%w?nTb*iBq*pv!?P@ait*xX6+xPPlQjb=2PYgBF_x9t$rSkhP zW=c%%=Z4F%x_y#K7pr@c-XCBuEbWFky{)=mT%F!n=b|*=t}4>E+ydra6>+W(o9&pV zw7+)w!tEQO8yj+UrJ@tE_Rnl zM*l>ZKN13cg(f0RC~0+LPm^j#eaoM9Sj}+;{k#CMC(S1CGl(i9Z@8UUMwXhF-E0Cc9E$jU5!1%87x^C9~b}P!HW25a83ek=RBj=vqYD zrbkWnfD!CR6o1Co01-+>&it%hCQ?0@pBQ!w{j#D}NY|C-jVD`kM6! zzHDiXaDvt^B+28|6Fzm`9j6*9Ss&{Cae2_7|KYH*Q1M}UHk(g%VVu5AzJDs4U#)!h zi>D`CTa2$__2JLCz_)={BeEds+mFFP>4Vm)0uSg*t6DS7ZOy0O<^KxV0`Y6=TEmz- z+a_Hj{^DQhmbxZNHM$92mHvXhPIJ<+Yt38+S(n66d+&F-(}C9WGgrqP1A9%gZ-%#4@_l$De?=ATS=6_fDxED|ImR42a^=>`Jm&|e zC+=x~lGz_}!EXhg&nY&2Kot3u<7tXb?7s=dP6m`W$e&2009k!d#Q0@&XjtfXx4tRX z0FNwtA;nGi9(0|3s7wlQA`62(s29D3#(a4q)l&8J6=-tj4LJOTm5|>W)c$HS&jBg2F`dv>|jgb=|a(nzBoUqCguq)`P6wX3N4UQ^+bY6#5!=_!YM8YrxHl&vszq0y3L zH+7I!pI45`bEIrYmUp=z8tA+Q<+&N;$|Au(n{Dn1Me?Eh{UcTSKYUk-&bwV6FS}f; z*8t_tAzwg4tQg`?9a6Zwjm1sr#zAlAWq6d9dt}+Gx#H;qtB2FDq*W7z((n1-A^+sR zi^ez|v}V&NUDLatFXXL^@fG^zt{KGB$PXrWRyUo!+OspF2*r34(YIT$_Jz`$BjkrO zLn3XdWmUYf+UNhdWhGfKa*GdP)!RvbGIGrAFkpR=Z~orH$D$AQLF(^f_E_44FU)MS z#ztL17I>ifPCC4eBMA<%oQ2G_fVH^1LqMYBrR0m%h+s3%kB2W4(_6Taf7pFqY3=CR z+!4K0VW@ipxpDEKfd{qiMpe114tG%DE0T_!)Q$^ORH8_ti2t=qWmFGah%VkT$iD~w zs@JpVrDQxlb8*B;J{8G5pz9rX$oIYoH6@v<o|;_hv2n7_N_*(7)ktF4VG|q z<9)UeXj!HQuWb5b0B3LZv-MZg;q5^=8Au>4P9|^GaQ>B zZIaMWC+K860HjC^KsF!};BpQS0?=?WZ~~Y>N$sgWiJ&Epel~+@{7Mizp#X$xPWq{X zNq(T@#=za`HH}v8Cjr)KS|7-NTd&JaO4yUW%4)XnOn(0(eN-94>3T#uiGBbI0*do! zF0GeW0x7|Y?Zh}T_8Mw1rK)OCr7j5~VY??k`$H6P7@W96@&u=kqOO3ih*MZZwJ5GE zPhN~AY&8{qgh$RA?v;P8_><+43lOv^z|nRqTW!zz^vqQ7nV_i;boIR}MTMyLWOHmk zD>D@f7OB4#vn%F4=6HI=bW#nE_QT(hk|$^s0;GrCQhUl%Z1gqq6bzw7&byat$(T-B zX<7B!!F9IZ*Y1gdZZx<+h&Dxkh8Ze6>=o3k1r`ws(aqeYf_6}XEI_(Sd|5D6er+aD zmGX8({!k|%$QB33>*WF0InPK?qLeY+`-^rvw5lVCtK989D1Mte3~$~hyWvOr$#x*C zi@amC)X1fO=7#Sy%?^gjbql6L77f6VOdFsC2V`bg;GDxfo>fJ-D|g?z+a}E`APLDK!=$o_N)TfLbcdVC@sG>b-tc?U8A>C6a+P{tg z{xaLT2hp;osdSI!g9`P6hB{^dvn-@AB{R`Bj3BCu@NDS+{F>6sYk%gl$E>bM2p}B_ zj+f3$FgZq(;TcNNHbP6zOI+a>wy-vNZ9B}1uQ)V|gs4yuDgm+4Q$#-W1}7IQ5>OC) zpt%#!N{j?ZwDm6pLJY$8Z*Nl!h={c+Rm>X)fzqsFL^oKkKKUz>GKhtUR167(0#Xc~ znDQeXrF=ZS-lo0xoP}<)JMV1~%FC}xR4w$z_uAAbdjnWj$>^5E

WJ04o~g9!k> z@fqA2lM9Ah`G$B6US$$eCi)L1WH0dS*=ZFEbz+)fn9O;vMC51?RAYFte(Zj~*M)np za6Z?uR8?RuTcp)ud(cW2-~mDsFxYd>KtNA}1ls*Y@DRAT13reniRyb-%DQ&S+%eTm zRbSP5kTW1?qQ>Q8)CiUbtAE%Hupyp(tiCMlYBkAA0Dv@{TYO}E z>3dx9U$2fJT_QkjXFDlUr*{)Kl?4ioMYJFYKKIeB8!kfhW8OBQxPIYBBGtg zxWMo4u;DK&j`Jr_6jL4rwEz?q93(3&emqA089ETb_bl_JA|+L7U_byQ_VUl~r_*35 zIB{k2@*%|0h+4*oXlxeQC|sF!#*b4(J5#uU4Mji`WJ3#mBQ!zT7W;erfXao_DIMsxh-4&>5@J{$^h`4wC%TY-rMF?Vm&QO`kfJidOU7mCf1Jl_Ob3Kx3>ohiU1W%ksGY! z&4@wOX8B#UYs2W)E#7BnYUnRltJ$S3B-JSy8=n^+LRFzmUlkjC@rI66clra{F5OGb zA)p>}1nFi642lG$;Zk|2;-Z<7)Xhs5au8b*C=B}b$^YlsM^b8YkZeI#7Vy+tvo1_c zPFa07I>;9IkbO(sQyd^zbA=J-f;EZ|2Zwu2u z8K76BcN`zt&zXZ4C0luAW;bJFVEPJZO4lC+tvDDwF;Rk7ljxm@bZZ?@fKXvljxfqu zs>0mq=0p9pmP2 z?%8kUvRh3q?B6zvOQ0N3AMM6evwJG*tRqgmVHOQ64l&G3=Idub30O@E1xvBgwJ;Ws zL7ux*=j9i~We7<=0=Nod5Xj>)UVwGTKV;<7KWTi!m)V1&<{wf;{y|=2MH~ zku@9lFE>v+H`F$4HBH_9z%(A-XG-KP{YvMcEnq_u0E2|_qfA+pWZ+`iG!TUQjNiHm zfzR;YYZ00J@a8tG{%5Y}Qm4ht1^y+gmVo6sNFtv-n|U=Bh zK->bLG}bXyGDXfQb-%x*S|zt?h*xA1G@AOnY+6=9SLmDTE@V&zVN`tez5$5<3QNF| zHWUuoimzC8zkUHm-$Y&z|I|2_vx;%l>{1uw3hX{~V78=U1E{U*@lY_EFm^HCd(0~< zw!+sWuJ+|5Ew$)+ch&5OmL9ks2#t0z@BbZ@SCgxL`pTAr-kG`pOP1BkX ziDdjJ^Dv8Lz@*L~nvo2Gc$gu$kPEB}wM^&~V`(y=z=8t_a0(1owJ!PL zH@zIw>s$kupYoZFZhmN0KjAx+j)vsA(>)c*Gg}h$vlMrJk8_0LUmP zCl20~k#U`0av(4%KvfO$+R7!~Qwu=b7Sp=Rras5D|Hl;sPXOpn0R;5U9s;g^h&UPm z@3SFj%%^+*9-rTRksLPnY9f%_?_r-ZhsvFA42b?KH;}!L#GY~r_|;W(KT;jG){J}&TKF#g-PIN$v_1x^I9M==6x6wkv1KMcYj?=HjZ&jV*4u*;n+p?baq z$o`MmHVm3Qg!B{LNy;y8W)$FKJ3t_azxRuMxU#A1 z`wsyKF$EZMiAXbzSacD;3@{L}BM6e91(Q|{8`rRL8lO|W9ba6wc zSAiyldPS>e!McSz>)O_jBX>6K^7_ZUcbA{9ua|g1t7wHYHwj$a4{!R2K^1L5(Ab^8 z4=?~Q#J6Ai{2bu#-nE~tukDR*ZsXhUHBkNQ!aW)t42O+~m@7J?eCv1h-b^tB>sxO4 z*gdv_N6Y}J=4ypSGgRLAW?#U#UBpSaPyJ0$Ed>_8EyZ_zXWFHqJo>vs{g)?;#;4C$ zS=&(HU%@E{CcZMClJCIqgWU5#k0r-J$GL~$hsmGepUGZzLcNJQ@UMf9i0B)SIhyin zt10n%#5c`f?zf=(CYaT*H^DjKJ||^*dEzkxmr~XTLRYAo((*8HOgpo^ji-nwyM4`# z-)j(_*tr}{gnY1k`HmJnUeZyF{dpt{YG zfOIVuk17%ZLG{w@BHB0E7dXB(nS6e-$wTA{%0zT6gp#e)SW~Ag)vzNbd%zr=&*dsx-X!B*EZ#Ic0bcSzmXY&e5s8CF$Xl;) zn#XwRda&O59U|mgSPslXK?9oyu?#oKGQuRn3Mg_o03&V^iq8}xcijnR{Kp%(9<1Yl zK7Z5`q?7Z9VW||(;Pe*`@%H9V3uq;I9K@mMyUBC#;QP-XIYE?tQ^&~GK>)7;c@f3| z-=JraC3&Fy>rCLz1r)#ufgx@nOuz^^$8Ifq6Ljc#NZHxqZ`8{6T_L~J7opt(K~NR- zh^W*Ho%o&GmJ~-w)Vx2vZdjifCt_HrO72HXSXY`qYnm?%oAr1&(Sm1|l%tx} zKEE2G+@ZBe+hq%SrDED_QFZgiwwm_jwwiEoTT6JvE6%;dBYyR{`{Qv{6ysv4Z%udW z(-H#ovZDsIO~3Vb+jmRw?Df}tCJuq12iNg-DAnfVibH)sS&b`opSD45o(aEs6;#`u)@dyXlyfh_m|i5188k z37n(O8!BC=z0j;7Dy$4E-l=a82BD2bci4L0sC8jEHri~Bu4E%Q5>3V{ch|f23_?GD z9KU)_TFEigLn5m_-pcOnooMj)Hyv5G!Cr9M%0a94zyWVDIT?Wu2@|dhs&9!Y3n@z# zkRPY4-o$lWF+nwN7bSH<@^iq{4IX%PfdyGUoD;7bi zx_KU%QuVDuJ!r&gdA?k+rXc*#6HhrMU1y>mYuKST^*Ab?cT9cPG5!RF`mQvxEcGHy z>#Ex8n6A>9df{VPEEhyZyQ$!Ou~?(tH^9ap_p_hR?LDmt;MWwOp!4K$he#k|LLsI* za#6WlzLYN+h3f@}`saR@&CLC#?YN_-NAhGMe>>gT-M*UHLL{!qY``z(K*xp?kwDT-z8c0W=Pl$r9 zlMgS=k7S#nTlFQ^0)qT`~7zvJ`}BiC7Mptk%`KQ#r{7vkB~F^&a$|9mCKSJ@OtE z^}pS0Ww<<)h|%U%EDD`rkb+oRqQwV!MFJASEYvkz)r1}&EALtO3N7j4n!2$jK$%z> zA)Sa%>72MbXL_vB9cZU&4hc9UVl~UM;#DqsF{rjBS?9f9W}ai-b2=Q2$|E>HX<-IZ zVmH<%>F;-daF-vBR16OjDYc#(t2kB_mSX4C6NMyZJeZm*K}6Q8c8Ba}b2?F&de+Ki zuUz@>_OPMkbUI(I-|&hDcm-@7l}yfT_F5B$ zAPhzj`p+kq5MGAGZHnSlk+qsGbq{>hew0X0=q5*-u`f|?THD4mI$H6@m`q>&V~Q;X znO%>twxgC%mKm>!WDW}3`k?`;<>K^OkYQRnE)0N>NCflD=+A5*DYe6m*M5OGUe$wa zjVJ%pUuJ_j-=CKUBwpp3RZBK3VzcV%jmER_4anN<9LG#{{W>MSqx)16O~W8rKD7e1 zoljv`b9ijC1Uw!P2t>k34s>oOG#bqar#)bJ-Up2oJIj^N0`WXRub0QRw6wn&mMv;c z3mA;XrZcI$;dtNjlTf<6GT;u^Vj@O4KvA{>xso~4T*E+$EqLE0~wHOUj zDP@guNtMgdJy-08A|!_-lH6jkK%`X5iM~vH^LRj<{RZ|m97-~g?h+<^J+Ajxwq7Jx zq?0}RBt;q_m6gebC)|mVEcJWl#Sz7(UhOLaS-Ef`WwAHHcA=rU-=1~QAHz>x`)HWN zN0h`?M0gp_rKY7>x1g{kC5sJn)Cu|}_VALVQ&oa-f-<&ra*j@!c3*$#p8uzwh2p>Y zBwr%sx(-Vs?zGlaKUCan+q>gNVn;IgIQ7c>AQZ{@{@A^g=?E7<%Z`2 z3J%was`z=>I^F0xt9&5w%X&Q#=1Uw+D`k0Y=BO#Y#*JJoDB*5bH8#`IOs6pmQJ~H; z$@&ij75}y13mp}aHd0*Q=1_HjwgWkXkX<0z6ink29+k;Riy`5L%WmhGsNpI0c!-3* zcX~`ir8v{EmyD-IExgFQbjiB)V0ulVrKG>5#!pGKpp?$7#bVvhk=W$TH-bnIDTRsB zh%70uK%w2+NfBbHZWG!p5+s*>jgVu$T6pZeSvjyE&lL8p7?k*rx#?75ypBeu&F^e! z!D-d5J#187aVJJ1%g80`s`hH{`fxe)tjkVDt zB+{FcwzV&@#wlYqDDI!>A!ePN*7VGYFRGnO60=@Rjmemm%xyh69FA)Llmg{A4Uh`f zs)T>ncI5J~ILmtRD9VIEM93&gCS`tQ*&0g6wS`Ci{{RqAhPT1|x|q)1asZg1x8HBy zD0no0c{B(LfIm{-ntS{h9+s$ZB?rJV1W|y-kSJ=X94%opYhkhd=ELFx_%XwEgiwKk zv6>wM91b4TfZ-K|bGE~-jVM7&qtqwp0Iu9CL9k6wy80FOD~{41{_W5SU$;TI(`+-dI*({=JT4CkdA-c0(5PmVIYGgI3vyt5Ko z=dJjE7dd7eg4DyUYOUs*S4SUZNv=WcbLA;WRAh=ZMK|fzu10sijS`j6RxAi;-KK45 zPCzdIV9Zvv6P>O~dZsb{;W06hWm#iPGQncr@unAW!;rT+L7tMATBh)#uZ(JMwp>=w zE|2AXHbP*`$r$mr98=Yzq&p_r&W>Hndi}s`_*njz9t?Fyo_Sxftrsd8S9DgVktx`?mP@v{EJF$Cmy)Bi#mheF->!vloy1C(|(wUOW zN2wvUEtca=BWvb4OJt+@g-XUd)tZ*G<AXvVvX^b4;+~s6TSU@U-vEDxkIf9 zim)rw3hBZV8rk*oy0x8$oV0?5)u{@7tzOdDSr&gpN$8i-6^I+DX>1a`_Ygy!FxTw( z59!a^5!mmFV)j@{%@0^EZm|wySK>Ms^!4us0vh8fmZYx5QW9dd^OjF``#qGy%rn$u zUnUC!yF>gKgrty*h@;4klx(`&zqK4<7MoSpk@WmAUrX`kQhjx^QOZ&o3n|UPe00rT zq&jkWoXxO-Ht6Q51Mkr4yrE(7Xcd5{5XX^Z+JwH*Y(_e|)RXoh(UHR+b!>IqhzL)j zWWivEGu9boJ}!bkx{Q^ z@lL6dS;?_0SG^6x^8vfsxc#xs2~o?1Es%(e68E)qIN)B8j4V$5!<3jpd0nY2ebI|C zJDqbfNwoo?{c`%f?TKMQWmdg3%I0f2s2natB$wE1d`zKGC{$BjVZGsWd_9nc3e1ju|TyR?5PBQJw8EBmGus^z#&iqv# z9N!YCR6$YOF@;ayx=pm5&V77TRaT17fL)474fH9JFz<(a^I z3v$do7b;}-bt(lND@H`3lx*%c5{_G%L>(hG*)=(bB1Jrm%q}TaX}TPRkhvlSWPV;F z*K;uKJhd?>_oA^UZmi(XfCC7lez@A1y);byXN3+~ zZ^4tH$N7+^`P7;qc$s)M@yT1tT)YM8`%(s*=8!d~V< zZoUC-{cg(M_h~Jw)#~~L=bY7=zC#KVlxt>8@VE6$O6i3gK99;Ux^L!CKGjxKe4aj= z!7!R}6rFJt!#J9eZx+NKcg{53h_6a5Y$4Gl5X-NK;>*Hg21I4e=wsrGnUbLm;}Bxh@Cenko>eUo`k+o^# z>*5Ed9Rrd8VCWA5qrZgZJwbei99yq4;0qjpn=qhmuO=?=la}#k)b|0f3&A{jyOYLu*9Z{w{wq=rYs19)WUdn%+b$PQ6au ziO1uH93NhNn38KA)FbOkxndd^i^W1{p>mpS&j+mUCgoTkMis<%PIM7#KKo7P(qxFP zvmd}ff@v!>9?%rTHsm`pEx0ZqK)iolvW9qCJcLL@0s(4REuvXZQyri~Deoq?5o(E!T0LQva1#sgm-^(93sCL_$W7BTXFzElLrb&1@a z^9hZF?c@K&Pb;KnwG?gew`6WMA^@2hy=5dcUo8Esg#Ql@ecYdj+Ov9#lDU;ljGHu{ zO0rd0GIPVagrf&DY*#cgFI#b!o)sH)zhv2p6%Ed}THprqFDCU@Gaimii}(62Z;<%` zhVs8`bKfixfxmDkT@?RL2*?)9UHBId7{xfsn_i@TWN&<&^Xfj}l$HXDcavMiy((h= z4F1Q&KaU8)xXX%Y%8gF5Ui&bv*`` zj&t~x(zw=819HUi?zy$Fw@q|kbc$wk6_&x!b920TmJ4Az*ey$)N~76mvYY53%{G(8 zZnxWA(%$2QH+jCQHGzBl`PLY-2{7UXIb>iP(4hZS4R4AXC;Z{vRIpn)x{g`utg&pd z>t+>7+-^8gJ3xwsqjc*C15;ul5@igAKJPW<|9!87-_neZR!1Sd4`M^aQQI#B!Y-?s zVz=WjoCLh+>FUqM>b8e&>z!ccy1Be43u|FPL0nX^3z~#HHr`N`J!BHDYU9)fW+y1z z?7X25Yv{n4_AAZg5*NeOa0Pl^YMw_xng~kEww+6bKdXzQso&@jo+oBuS#O!1ml^Rl z)8m@vX|{5f^T{U^*2$HWYpSxQ-e@kt1xM#>#!#^68FitYI!^x7#NZs8)1w z%YtUf!Qs3*beKguRCuP&Nu7K1iwEt*;Z4ThFl|a7p+xc-8O zLqA&`wY^3;+1lY^Te)f*UNyDORi$Y&owf$n{6#rR>iROT6j-zjaj&KNsKhNV{|a;x zwFEgX%xd2@r%V!aH91SYK$~2;s>OaARo1nIexXX!0c){uYJqF=Exgrr^toXPI*L<< z$OD+`br5dbwULR(#z|yr3G<5{m{#}ePLIOMiih?#0``qr@I&G4}RHRwgKl5Cg# z#s9iq*xk})lJ$hD)mlN6Ix|1F@R`bM6$)=QroHe!!>9(3TH`hxdS-p2-!CWZHV`%r>YfGHj>(GP#9V6L= z<#m-hqCrqkSX6SYF{1_cJU2&$6RO$8&GW4DP0!%f@#t{0CHK|HD`-W>Buyb9@{4@u zArE3MCj4RBuXo&)n`!bygCdP5`BwkQmjO+s9KiPv==SptLnmv|-eZvAP-vOY56QBm zQ*=u;Z)u53x{Qa0qFTN<8u)B<%WIZ;?ceE;a<#A6QL60THc8Ufl#O}wjd}wVyNq=d z_q#2SCO}&Ko@ar!MOypeqkB6<=HoC(1OIRS7OMu)n^)XNtfm={YGNvt+osb@w@y)N z{j;-6JC~opDgTn-^K&L6Zbmn@jfij0yA}4IT~EZ5&7BC_i(tnatC$vh!ZD=VqnXyl z?RJOBftj^}n9M9|)vL*E{?^<&@Txe^OG4fCsfgwtJA`)XOW&^571rn-!tRY~XZ1c& zrN*3zOTWP)lcrA*c(RXe_eFx8bkmrdOfPI`*|ue#J|8Vww&XG^RUh2yHI^-f_Xzkj zZO!CzQ{%ChhEuc6{ww_i(ko}}DJwHv!mIGOIkeW-&C41?92ZmGst&woznyF->8e7< zeBt&v(zSK!bM)%#H+piZ#2pJ%ZPk0CZ7~C@riIF8Bt!ZZ8Ejzy^=ka47&$HX;;MA% zssfjqR}=$u$w5>cWnFtuCAj?7j*oXYKmzLvhK25=;kVussYA&JoQUU9jn02?I) zi??Z{k6tDbJn^}q)}FP{!E@Q?81+lLM$tw;W~kVWF*)N7`5kYY%OQU3xQ&;YOWqmP zMd~5gPUeyKFwqyD&8f9L-D~8|X|K+b(rTfdn~}#lZ`Mw#mcoijry8T+E4-;H7hQe! zDz25EI^!fkM+kL9n|{FJNNk=ud&OS%ySttdDK;plS0BVBy104nwq8tc`^ZnJ&pEX= zl~51QV_EpC23iMi`HzVg_V5d_*O$D@DJCNL9?fnMPDh9jM+6(C*K z7VkXuhy2G@G@M|{T;riR?)v5Poo1=o4DL?1ol51{enFPeW{HYW(@>~YOLbcQ-Nsog z7prEu?)c0pqxV#qt+zuamC9r>dilXA{bj#DAjT@>F2{zD1d$vN#F7Bxf?`kzPC)8b z30U4Q1%0E&sHYT~vgqkpQ>g zUXsH1KpBBfG(ic;uac;kY<5{bIw!cnbeaW1$SkQTJ`nsJu#O_EE%K2WP2XVzafHe^ zQR5IzMufPP!Oaih^?=m7&LBo>WV@0K)rvD1(s(oy7$gWZscV4fh-0)MM%?T+Nk4C1 z`uwZH49xeCK^Evma*(aULCkY8AwwqidcEW@nL$2-+(R2=RgC&%A?f_oaH*bf8%!zJ##-bN(9e$_wTw7w{G5revrQCjA9y zuo0`&?~WAP418z6E+6%;8i0i;IZW$y_(D~@2Icr9f(~b~sz96NzU96iElyRC=`+GA zfNRWr9i}tw{wmbmW`7;-tYW@C_}3+1->%rcpVT>dJ)uH?1@X~=qqFfF8>Dv@SQBRa zOyCZVv$ntQ6od`v7u)_i8P8Ur#nyfsuwj>d>}4M~(=W8^54_0_{*{ands8h_!T}#- zJRKMk6A)@(a%6HWb&!$c;S}4feHb_AAoA{=+@bXqyaUQI*hhMJJPz; zV9KBxRxM0xqy0&JN?4VD4UrD1b;?1dK^2rbthP%t7RU;YWQ}>5tFsb$X9af8a+L4I z7y+zNdgy{wk$IVe^CC&71y&DB)Xy@OfsKF_bTzK|b$|;%4RO6(z6;nYXmf3UXTU11 z2K+o2OZf}DP{UaLfI>ip6vT{E=YH4YJ9T?3_z_HC+48RgmxEOn}eng^wgRv#K z!6xXUZT)pXEpR_vpeqL59?{?5eJ;o=mU<@xE_h>f!z-rlRR43ZbX%Y<(6$uV8}?%7 z!%c$<`}#5Wb$?m;`+CT%+#@sUF`J=PSN|T1*zeZ%(;(eg8BVqlr^r2&Im)q820J3K z2DOaDf~^h~N9FwIZ|MOlre_@rAfXq(GL=H2hlCs!ArHG=53YJDuG0`bD%$f~zTyg5=>?j^5J(P~(Pmth6rfbCv zA3^kTW`VMR3{{!$8|5ga@FJf zdZ3Ye@T30o3*&F}ha(T~e|dTst^9GOVo*s5@EDF^7D#cB%oWRdjoV*{}Bb-6=K+J zN2lm~Aqp7tDa;2WQ~kjs?hbTFEu|+Mzo@Q5?56-?^h%IR;)k3o8Ggbr<|+sxcbxF8 z{h6?3>L>^isc>V1yl9TW8+ww%2gmINoQLvN7{lQvFA-92aLc)bT+(8ism9j~HaJ(( zeQjb(+F$|Wd}Xc~`YW=JOPEz2oY=tR3!cARw&A0Y`PR&u02J1g`N?1zz@k2@ns2)@ z_uei<`b&~dx69_z2dwWmc06DDI|f`{qNKZKt^%mXQhG!*v94D5iECJjk6W}E`Yr>G z;FG~v`pCa@Zr^Ge0w27nqzYbq|8m|vese_Z&xHj;{rnz{V-E&|eN1)Xv%W%r;kQtM zTxKbIq5rtb*=-SXeo_}LA3UG8<=@vZf=_u7_c?VGia+|-VF$=@c;3As!bi z|1}cRKu`;|@xs92a5xwZLdORT42IN&L5R-Bkc&r|smGxYPlTZX22m-cVX%jg*l^6x zH#9gI9GDW0uLDpdOe8WvQDJe0k*VID=V*6-0|^!xCMk}b7^kGDDF1URl}xExD^xOw++ro6zK_4^FM1s{O=uk#^w+ovzqsN6b=PT6yXXxH|?)*HXB z9Z550@aRy}PuyhU^7LrC9`Rmiska$FP`~P94cQyn>xO+Cxuzo}9GL7Q#QL6&TEccl z5yZJ(b9o|AuO8#Zy-Lq(Pkl{dK3KYsT2*Y<6kN`m4O40gHCj!!L#4D^z8e$oumX>9 z-x)YRc@oVtwJUOE(rbD;mY38l&=Ew0B}&}GMo#TKy#f?S(#1?2LKR9@&0IYL=1khw zaA{#_@Gt>``w%2hF$0HpAVd*56{{C9W>q`q=hv6;nk%x}?uAMq^ z^2Y8b7qhz}w~<)l%4%vktg6?t>OstE-pJ~k;qFj2WNW8h|ma3REpuleOIb zjImHX^L&zMIz&1yB^aUPPCzJ29-NhB8J0AyXGR8h&>|YvBv^6?cM>q`fOdciMs>wv zvMmET#5t)T7%-hUu_TuoF#Gvob7O-h!4~axPL*I1K0h&IpBisd6!dH{m}sk>Z!6rP zdCzw!a?jyMOgnux-cNN|jhr>B{9g1V>%Dq2;pKppvz!b`E+tx_4dberCY;pfF=bA5 z)1ffi{`jP1AX1u;+vS9^0!WV4FJ5IqltI6V!+rpJJoak37vvkF0h93w*(rFz&$AJE zL66ZcisH=EbS0Y)yM<03Ms55GZ>1n(sHF9+X#Xi`%dGTIBjgi{3k&9=TiczcTY03V zaF|R6ksKpV#xAt>7Oim_F&CG<@L~2EiN!b5Yh-;z)$eg$@gIS=S0~<55_B1VUx=7v zL^OUG^W*;K04OyKlCIneMe2xY>?lN%~B8EZu~3yA9|E;>EW0 zj>*O6Jsb3TD(NO_8iq`oBR9S3DYm??mncw&p=^mKXIOsC5yyyBI4yM`8zIluo)%>U zM4a%=f{F%L!EZXSRGADdsr{Sok%ES z&`oeD&UbzVo%F88AMO;kUEzmM{<09OwnVY^8ymjw<;YO-i{uo&dS8#=jWZ}CpxvX<9K6^s(hJf^R zI)Y?wxEDU#?0%Ftzk~bb52>2_K#Rj36bg}Lp~a>%QrYg9Tkv2{nE*)wg$oFi7myH< zNu;}+Z@AQZb;YmxZn1*RzGjY!r&7}qKGDC8y1NH-(-smE6;UA2PY^;e!T2vGUb6Qe znG}|c0_bl)n3$lhCgjG`pfAa{#&TU=$m|@|mhGMh2z#txWPjYrkOXR+3c|)J*NIXv zH{C69R}7S49~39S>XoZ6F~nHD5Z%+}-e=ZB&PRCNE&c)Au73)bs- zzdITG#W4rc4J~>3{C=jF<*J84n2#O;$S=msH#&62=K>gyRsoeb=JdQiwSGUM_~{Ls z$3gtee&0>*x{V6}j0WJ-x#MS8VTQT`^9J>wmt+z_ke9nZU#Z|97;x7n!nooG@I{A2 zE8kA!1!^{VjPSNJUo{=*EYcwCA|W9q?HCt7a~4OGS`t19uZCSf2q@I#ky=?8cI>vs zXVpvjbVu*)lR^jo9P2ZBW`T)EAVdaJZeWVh^QcoOxdoHmf;6oY;A&Op*ku{aOX;(g z5-YXb>POy_^yWtlTr?ZZCbePza%F9K$A_3B3U| zT2+2EuTyWIY^me!c>{R77e8-suZO=(;60IlO#1eAkIb!;Ut@ln=IN>uiE)$puLg(rW;SDOgM#=j!A?KMT1Qf>wYFP*CA3pp0 zi2tVl$w!Xg{XBYkqbjeRDcaQa{%7GUjS1a*;j~U#y|Or7X#|z=TY?C3SOS_#CTVc; z>GF zBK*%q`A>SUPx$n~w6bsO8`_?h%^VNWz4fQCot{|v_d@#5%DVTQzAf7;zi?Z>-&hbo z$1XloK7MVs(4X(^t3L?WH{^f#lQ0^xs&L%lT5g2PtNRa&+L)^ znE6VrOlc}N=}lc?FK++&T(#M&+v-^5{O%W~|JAzL8~E-Kj^n{Yo{Vmc@d5qh=<&gryWVY`*yhZ zpw`M|xj5lWvq8?(ajY!CSVG=t?jl-}XldzX!;hXOmT3{OQ1AC{W+?S)w?`+Jbm1se zQMg0j_o#b46imym^Y%bQp{(Z%iU>$5R^#O>u2hhSJ-|aO9#N?&&4PzSEvII~b-j5} zX5mc3+-6sqk@4OK$J$Qgo8evE+RW?IL0NevVv9C@AMxw*Gj*H_#9CXvLSn=&oSb?i zl#Tyg^i{Rx&l1F_La=EccN77cWb`k=r2##XBdRAhy9e-|%?lm>tCf5JKWzLH0x2jp z{uxsV32*}ml3(xzP?8{iUM8{FM5%b23|A^7n#R;SD7oB9HlsvTn#x8j6@xipG&x0f z)tbj(Y69;M9UkYv7~u>D)`xo_wMVLK*=RaZM6!FPqA{p78GR6W$Ay=WP3Hk|I z&4ejkuR;;*DTX4J80d7U?2lLj;q#=vX5#2U=ztInvJH~%QZO8lNhHe2B^OXgr97R0 zO)XO^l-DGJQdu{fSr-cIk^q5cU@$ighc%#)$y_s-Rz{;U_NFte{tOJ@iN~UGv>;PV zy^|6;4!3tpgdxibD z2Wz@E*-chz+ZI5@wFd$rktFO+kSR&=U{HjG(T0hKzqs>GMGf$fFYYaTCLn5puJl}~ zhbQ3P;tO0uOozR_0qh7E@J*nX=JU(9#-m0mqojb!zN&{StgO^O%fjl{{4R_6tmtDE z_L#&qa-aHjMg7p#b{f@R*a?TW-yWdfxq>iQA{kYdwed`^2Q*!_`CY#Y_xB3t#?BKR zPy^;pfXCYlQ4p-Z8I92)0*dQoWDrnX%FI;n!A>TJq@KGl{8S>mwEc9!e1`ps-K|x- zz7T8zHX-^ts}dFdBvHu*!$2xhW0NH&5I>~dP?gt{j3mcb7DnQgj9> z;PTJda(PBqlzJKkfacZ`yT|dxa$RH`$$9n88XSVna#3694*n&z?YK_qx)GgS!x6oB zc90vDo=DPlwL?)`-%`aHdaQoH_>SZI80(trh(`A|qDKR8*O?>*1xTis?F8yL5lhwg z4Vk1Ul8~nLVVoBj3B?L!rmUcKj|rTN>=V6_Re^hZoC8%w`;FqUE2Qdor!4RN+jo4| z$IogHqbZU&F8cvuFh_ZKKZ44-S`K1QrYAj8{;vuN}?3W0j4n0GWdu3*cypaZ}vw1;XUa--;O9m|86 zl4WBkLh3q%_|4Oe91)=gSR(>``v}vDNUYey8F7QWeo-Jn0-Qz+@{>Uxdq;@v(Vo)^ zhK5EqnZ(HUkWR4xe6fq(@`%ps-6Q-iet!JY%T470z?fzp&4NsTov{!lDjIP*sx^jN zK^uh?s!GFSr&o!@0ZiHs;ROTidGs*QZ5>?IfAlh3m6}JvnV9$QLCIq}Udc-mO<2BH zu;Ns>)D>0YIB;$%aSoz6^Nh&x0oyJpme}ajbqu+gP*7m`m?l_N5n{%IY}jq$A+)CLBC(;Si2Y?mYNmc` zEdU`ReY;PD^y{WW@L^b1y-yypDd zps!-vjL-L33zx*>Me8^jsfA8KpT+IlPVTOaRY1fa zYNy}*L!Z4u@W3Je_yI7(2$ zJA=~??xBwI%Uw4Y0NZ)LNM!-82y{Qxa3=7)=nBhxH=P}-W5jtt9q)ao<4BhykYc@q z>_U-P>suEGss(rq+`qni!oY9n5iba?{9zi9!JwPm)mK5v*nDz}5z)PUm~&ve>c!(Z z%>J3j#%WpkuHDX7p4-&~35jPVz!1P706+wphJhw<018!3M=R|ro#R_BtU|m$DHL%e zQ=JPh-HQ%0M_lG5R8j*g@_CB{iK>N2$PBt&l-F4HxkEa8Jz}WC#7#7pyz_QV^$SOv z<|VSWX(G4u8OQNu-W)@4@a;qBK8lWXvnSS*oMn45{Fm(A`>m$akJVtXu}>+kZ#`sC znL%TlQji1Haq?acu{|Zsw(D9pxUa;@V^!YX+jeuG?@#T~_pHQF%8$_|NtOmjci9Mi zuKpICi>UeB*_pg;Lv?Q5Phwpd&hVCc4V}FCKsiR$J5~=c;N?P}{&TOtPS8%Tj^K3y z>o9M^tbh2dP+e2zU~Y#ny%JN9dNECnnH~*SAsk=$+xUh6r^8F)q?@WZ|ExE)Py3<*Aigu{78g`fd@2hJN5DX} zpIqSShyg>Vg}pT|kHierb5F&8EA&Klgv>>_>6sjigT{H2HE>X>7Q%39HPhy9J)OO> zck6C7@4dV}N>OK^TDF!vq1Ht$m?am-pR6$O%hWR9|50&Rux_>4vF6H{kCs0L`yT)^ zK+M0lF{238EaqZ7k!QewjuJ6TqwP*(V;nNP70{NGHVn1;xa6o=1DHdZ*zwj#1L6%7 z#Pn$+`HeneH6771jz4x4m0fubLv>8sewD^W_uBsYc zZ?qWkFZp>B-Z<0RiM}s8)I0h5No`+h+lLu8{b9|tu6DtbLBR@vv z^MOstB6$^J4jBx(F&h$=drKQX#dYAVYhm~^(jMq2T|%Q{yy5*l%z-!pHRGJRcb*6* z@O4Kk8wOIw4+Bb2J++pE0gwDK3KuH;lKDJ=n6v_CZfTP>;qJ3&XaheYK+AgOX+d1C zXNQ};E?Co-f;sMCDxNg(4~!{RaKKQ*EAEh)UJr?7yo6Rgc~GWfLJnG-ZjHkdbLZD^ zK>@c|;F|pzmT~h^75c4~vhD z4RSWL(}raM(m8^fx$IvVNc%Be4S5?78*gPCB+y6-;U#x%>d~JIgi^-hdQ}MMzs^x$ z;_avX7!#pTjf;aMWF-+J9@4B)R8_aq9(SkC&8{g8GdaMT;7N#F=wd%Q;xu*b#9nW^l58S_A$6s3=|})@g?wLj;)GJZw>wn zh7o8?U`3=SE=gkCm#Cfe_iPqB;OKE|IJglmsN&2x;nKk?L#uD|AUQ8D>1s*&6|ZtG z0tzcWOQA!_c!w*M3?>SNDn*qsvT#o*=SwQ($J%>g#VMl>kX} zKKy}9`+UPX!JXy-AtzAtwEiPSs{*2@(0RUQ9h^byfZJUnefC%e6dLe7=!k?Bjd+?K zTZi}g<_!MMb$XNtcyF`t*&ex!&o3#yTBgsoRw~Lj_|C8m5sgk{M@UBVd92I;X$c9o zVkc}z11R)g(mOPoe=2=`5nGe8me=#`!FkrlylZCI`M0UuW@qx5l}OGwR2IGR71RJB`=~+{V~@ z>pMswp^M;;7gHpSv|U4@|foOC#b)P+R0t z2Z8!J-~1cqriMg6LH=Xo&=T_073qP3S+=CM4x)xU_a6hJF_OW#s#e{WIIuTu?wnCz zP?j{>@A`@l1{@72WT_!ZBW+pUStMoXl{r1o@6biv+ohoW&3@w`6$!b@*>~ZD5x9tw zOb&dzb{~Hn-(cfEK~VkFCVcX-e+6*0wEERunVK`$1y+IAdq}<*!`%NXD2*3bCu0Aik+qMH~?F_-c$V-veG zoQ7Vt*P8y6e{0;j4diKNsthVUCwtTJgn)j02MNT}q*6z-Y~e04bAF*0=R|=}B4pBc zcujbtENYZ8w?&tYEIP`F#M2^Do*a852Z4HARy3M94+#10;cs&P%EL(5^$RBDgKU>} zK<}*q$O$OYH?woWPcL+=1S=6^pXpTsDJl}&WdM`9lg;9@{!W*$0}4a+nN6$F51^Nv zolcCL^hRA{{%=^l(#Yk%UaNrYsKK((5acaF8c(Rt$e;q5R~Q&lxfy}dPWBR?iv-8` z+{noDWlsQu+HwXfnXog|=t33;$SZ!C(t#(=xIg6e7)yF0#z_NFFW_3hwAr)C#%t?0 zVb9sdM}r8GVoM`-DW)x)d`MXXnB9Kt5BNKXn4(n;uPgT3x2?Uel&fYz0BLN z+u-&VsYb*55~PE|rf$3y04G7oIg5OMtIK7WiSY%k+^9XR% zPa+~)2Ik@0IxL2TLSe>YRGjQwxYhR0w#JPo@e=^7CY-T2h9ymrCGRG9gkT)w4DE3* zH|(tXkv6J>g|kK^^9xRV-TjdZnn+K+bO8oX_<~cOkU^lcuKuxoFUY4&O+^c?@@Zvz zrJ-BB;E=vJQ~jU;DNpEA<@m4aO>bdbmQ%4&R%dC2bt6w$;d?YXk%ANNbSX5FKvdr> zX=v=Pmcc=oUttPyDP3=fC}3upA8MVmceOHu$oEq=+D5&R-eAbV1=Ak+@PzKNZNBM4 z1u*@<@FZuzkVz00;4<21J{LuuIlt5Vh1ld-ZhfP>ORx-Q=V-dxnEnD07o)$egfyDV zZiNev{0c;Cs4)VpT?Q5?`1HGX`f2bJ8)k4iS-UyOB^d+l3)sO^WQ;Du+R*mzk4D1} zRYKcxHpX;4J)}`1pB!ty`UevTG}keA@uP7P)vYl{0;iD<hz5lFvUSFQTzOD=Ltmu+ zjUXjEF1Ke!e?9r`|7Ql)Gumm1J83=q`H5UofX8ASB)|?E#+XWQe`Ncv;x4(Lddzj) zpvKm42|}^78S3fSqq#voo{1#tFSo}r^g`cfZ%JOlQ2fshwSHxInfKQu{{lcZOTP0i zM660N(fDV2rma5&nSq0opWOt@fWoUty3PK(-&TdXNFjFLNkfFP+{wLmNkTqDREVk{L-IQ2 zCi361tWGRvFkX?J%d3-;-re#GD#?H1(GmB-&C`;fB%^rJTA_eKsZkAYkTYBQYFDvv$J{nF0SHNY%~u(D zQoz@Ez)>j4xfFO3Kamv#k0@#Ph{8RpKYXfJ@=IRmZP$`OZC$$x9q77?Z~5Zun57?|n!{@JOI_w| z0~PRZ&J+*g3$K#@YeqqOJ1+Vv!Gjgos9HC(3G>_-)lTQCU(@%P&rB9OVRH%J68oM! zBtM=|hQVgC*f~Fry^7kGZxAc0C_pNG3K@K(;i+1IbxNj1b%zITm_MJ%qR%sbMi>V) z;(iRR*7MmBx%2E0E$SoLb`UAHG~!`IsP8PB3lzf=(Cbm*nlzMn?6rH=vGiS3%U3cr zx?o_)7|An;=FT~bGdQeU8;T;X)h6EH?eE(bYHD@f5(=k>(pl^s{zB>~Q+a1;(Qs*1 zKy=#Dmn7l)S@S&kdl_zXF}?%Kai<>5Rc)|or*DlDcK&PirqRtiJ#RF}N@()^QyMR| z`-vg0OmV%oIliOWvyHa^wwC=p85zC-=S>g>6l7z>zOzclc|u;r$bw`jh)Xbr3otVT zJRo1ADvD=7Pvw7ds}X?AVx>Fp_qXKD4`|7GayRKucrb%^hyCODqyF+_y~5PQhx*AE z{~S}w8_9(;t>z~TzeB$0ay3-GL&LWx`gB6GQ+M)do+sPqRxr858o0E<B9kEW@QSnoPGc$z7;F4j*_pygW>PMs<$sht97!^678o@w+B8tKL21$vf{k zflcw&DW1rC&dhP~-eY@q^m$WvP=4-#o=O}*M<~FgP+D$U^G&W*+luT>IVh}=b#kDG z2Bf*zBuifqR5H!PXS&pCj>p~#cH!P~HcePgh4C;S>z2^Ail#jpp$!eDB8xmqX)zbO zI3VZ|+W^f>h=rL%JQePqducrgeez6`Ff~HRxTogIPr#y*IZ{lKYcC^jj`$QwthS7& zaHyXIV<4`2GEPJ~HM;CYU+w=hCa%eA9`!jmePownqsgmpE^1WLWDUcb7Kr1FgAKzl zT-*)7{A?r^!`z-wi1T6!V_IR}=F?fMLwwybvXTj0O=la_ON>AomJQ7X)C_#W-ud23RWY#6MaU7Ge+o^4y+|H*d+z=DhwBJ4A+EL zCltJ66yYG@GyDVC@q#%AR2|V&_uayRZ%D}H7z<2|y9^33rEP)@&N~(NC{vG1HXV=Y z^i>aQ^EK(PGHewWMb~*WX!GUjEf%&ypEXC!vzf;j6{OIWTRSRjTl!elBK4bg3u`c+ zQ3-oEjg26{v>w|J23XY*Ypc|g>6HFYmeaEX-Z{K#@xBD@sUnG_#d2r?kb5iuqLr-#jP`_hD`Sub%~2q_}lECyQ7>nxI2V)EmNL+>BM(FI-wN z1?@h3@|Pp4?<>Ec1!gQ4u%m3@&T)=uHSx$#UdsdKWIy;1S?Hx@6d1fh7=T%i7V#^5 zLdMyUFVzoKC`;Fj@hRI9Nw}g3g8<7ClbI-E!v_lDT!<9%+D?BEM{i8|AiZ9&qidp% zAGb{2L+>&-KR)S--)*(nF?gePM58ichgVNIXl%8RibB3Z=cAt*iUmzLX z(tF_@60<|b+B!m&dd4$@kAi*L|8hxJ z`SLQKlg}4cjdw*XqkpNwB+-QziaXKQQ2S5jc1cY1Xn!xljq*Ml%jM)DG8Nx4j>g<~ zgY5sC{Jc#xqz_}d7~Us)S4Fb1XAXD(sp1Mkvo+8#ov=-F5W*Wp_{W>YqSu}j_7D$- zzeO7?dhqie6yHm zN%L>n*8QPnFa$beprU(77{);Hf5W#IWGp=ohM`Ee>avB#Ci-NBhre2Bb}A2ds5U%& z4a?x@53B+HFO4x31P%N@C4m)H;a7-zq@GB|T&6(fJ`yf~7f~L}y=wI7KfpIMAminQ9CnrLBZDlz zN$#h;?HW`X*26T|N7j;Zp!j)cNPgb!&FPwgPld&oVxPxF?8JEI+FjLPS{WU#kjo~wZ>1j4b5 zam$_iPlP8{FOw8wuO}ujJP$w^^xSk0)9DzK*_`gvpn^1AoezRITkuo#q6zi?2ZYex zWp#OfJG>)7eEUffA!+S5#^)qnVS#Tv5|(*|YzVbT0gA;HQC-FB_ZGWNfbKoQbsXcD zFY_&vg8TY(Hcuh4@a??z0_91_u%76su-q+UNd@yyG$M@K7;%&gl30oPti_|W7)+_> zz8jpiDIlENd*4b1@_yjQT@ywMvkK0mF|sdWb1JCpTmzsyi=N%1 zP47%$*=iSf3LIIQ)DDJ+Fl#2)=BSy5!6VMWQz_HvK;2`>4ZsUubD`Rfr@KMJlgoRR z?Phz5S~=XAIp4qBp+F8z9=~gFLF+W;|D8CG^@l&pa-5d<)s{*@&Z>S2mOK2J=j?yMY^K1pCscRP)((DbyG15oZNpyx zVu9~rwWK`8WL1NI4u5#g8JPIwKh1R0K;3RPO_%w4V!nY}--BCYxAXu-(`RB$T2BBr zIrzLXA_@r`*IuWtOSj4Yh-&2P=L;6hfAQV<_;FOlzeq)=4;^W*m*r(n&F^?D9UnfW zXKy4mjywU?No-*GjQ|Uvt$`cZ6^179F`6}mBTmkPeCyFyoC8Ch*QU6N8qkZ=4WJi0 zShEN8mAH<+4EPf~Q`5XU+tsWoHB@Z?{tZ89mC%~8Wud6Kkcn{p1%7=}#>X_}M+D-_ z->^|_B;WHHJDO+gs$qEeyZIG{avzvIsW`Y}gCl>kGNNy2C){2^#l(~I&2S6r%hz70 zb?wZzD~_G&<-+RUW+6f#)LOzs!#m@ET47?2_7Asc{62`=pk_y0_W*sixc2~-BM)S{ zK{~6E5wOom!mpS~TBJTx3RhVMtPUgD+1hcn%!S&qK0bCuwUb04MZ6_9ur{}Ra>_c~ zOfVkiz$E-cL$zxCg`M<~g=SUPNX9d0L{c43RYK30VZvoNsz1B{Ex?5~?la#u- z>q~Irf)<_q>_+CUEF0p5?uOGxHU8wS0;g8To{+BXok^^9tWRUz<7KK)N5Y^EIZuFi z)-0Cp<^-jGOxEk2Cuu&-a1$(Z#e|{=Iv6k#y0%=>S1mPq(!;!BSTlzM;j~KU`5s<9oRFwp93_W8N5eNNt;VJ1+sp9GnulsSzqxCeA0gKprB{yB z@8B&S%z1gxAv^us$2&V+l1$;#Lfifphdyo;I4K1B62C($hbohvcjJ>6e8AumDhjIu zYZQCRhswP%43sbJ+!6$HXHBSrofTi^TyRPE_;az8n$YJgJY%k2)k`oJLV2BmSzvCr zKj#cV$opKYPxy@dgwsTiBGKYB+W}|krP;rv0Klnj0734DJ3R$h;soRLH9sE-eno`? ztx`Y=-0$&FIWWi7%Y!u!6N@WJ#IwANYs1h3egaqZf#-t|NZ|{ zKPGJb5#Sv?m&f4N!mYf}V&*)@Y?$uZ02=1^+BT>w2nUIXx}OSR5p!@fX%qkB9ATeY zVEu_e!riAKg}df4`T=F#KI>zg$ALUuhJ?jJAT2;vZ&Z5jgE`k_y)Oa@UmnF92FeD5 z*1v!XGBXccM@?IR7ZjaNfuI0g;P*N)pzu{P+%ExRpt|Ni2fo z9rTJ9SC1QKjQejul?;hQSyvcE2X8HJ$#G)d72}b5hkqxOWgFS$f8o-FTK|sY^oa2j z?B^*+ttqd}&#r%bzo80O{tjNd^6A6cIoP#!p6}xqvNB`m!L?H#Q#R966J}wrt}ijB z15+vl2PIJ|jKuF3uW0keEEO#|0j&g51~dZuK0NkeuHl8?sl>7s6ERkFTO8Pz=nr^P zq^9_pYX5BaO}=01wFz5s3n>ZE)kkmtznlTAl`;bQQllEt>G9FS$+=)#_-V$sqxexX zhFQPY$=iEPC--*;MjzaIcgbjer}|DvyL)Q$(0lgHt*^)kYrkKhvtA&gD@s$FTVIe% zp(lhwV-Gm0zFHy6y@3C}qACCQq3)MQ=C%%)zfZ%p{u<=opEt9Z&axTz^CUnoQ&&PG zJKM0h?Dl&Z1bDy|!&{12F=4`@%8h*c5Rb1T{)6#&}(lIaMN%Xaw8} zQIQFpd^yq)7?T=vTIfxlU)u(vNhslF|J}P+2AhHp9y0z;^9^lAs zRXZvEM(Wp3u*-h&?PJ+0T(tUkqA-zdmRN0B0j~Wy|L>Gf1EP&ZRoN0v26jUz=$0?1 zr~z+zP14QuL}?$$t0ok*xBiWTc5?5X&^&nk28IwpW1 zCs78!`s<)JdyE9uuJlG^8BPTpjW&uFI6go6PHLX1CL_lhTxGZ&c6wC8)+m5JbGcB7C%at?5B;`&sNx11RXq{7vxFK5rk|{X<(0hvE=9M z?Y9&c>-hto%Z4$wr*a|d21hx)hHF0eDmdXblcRmGs-~WMK1=IyH)uX3+|l}67$!Abhvm?1oR0$aF7xsm{p3PQ?ns=HrQq;n&ij*D z6?qX&MOk>@1dGu8?dIkrp+;zP6}J-*GZxB9D8~^qDG|kmhA<)LoiO{eJ}bz%w>Y>W zVsks3kSE zlogG%f8v;i8QB4Pm23-r`s&M3iJnt6Lhv8Cf_XnqewOOvliy~E9HrL_^(%^aJ4!*S zfD0lBI`h#fi0*0F)3ND=wQZ*>yi?C!tc_1^c{n}_UtX4W=$2+m`|pjbN>@qRqYBwd z+i`-F@93M}SKjpi>M1}zll!pzl0QLmdNpV_7*H+D$ zh3L~ys!v{v!DH~4{qPf1KXGF4~8H4!amQj*nJSdsLU`E{PFA@bHXQ^v$6_c2PS==*0jyj@OHKv zITNXECJS>GmCcEH6V4hshu+`=kLuaTL38~M-k-6Z0KCQmUM(hLTE8rD)YfzGGn3pp z@<*BS9mJ8_)&YNif1#(_yH*tf*uf&b(z|J}^P|d-HTE_9R1)2EbkB@XlY*aiHU@o) zl=39igEkyc`827frzRPPPqUI% zZ+7n}L0{Xj&y(x#jeWMruS&*GCkdNh4KoZpfW?hL<3J$4xR}&r6M!;@0Cr%qCYVsr zkkolEaTTdTEK0L)Mzvj)&``pBS2fVez+V%RI_Di1|J-F!w&@@sq|zY#9D5CxwNLAt z4_XScyt^X^A!#VK;Ad^4ukO{V-C4HLuq{L8q0vA$MHR0p?4ZjeW8mZ4R-GXc2o(al zj6x)b4-bR+4U4iM1&&Ajx1O4{CZP21$jgv_Hq&!g1(g1nI4_qiWuQw}hZ-wZGg8Z! z^tGP~e&0XO8t{#fS3UfUImsg!gn(?&`c(Wuu!1Rvc z5LW?+5s0lgc)kDKr9W#N>!jJl()-;)4?2sJ$a7w&m3o{~tJV+z=`_PCAD=0|++`5y zBYj(jb55d}qm|f(&9?gX?Jf+%xW^n zhjtoeha^_z=SGgxWnMxXSdpGt1a`+d{x-t=5eudl$4b7&==So9jp#_ugx~}cxWq%1+~OTYq%yk8v2VbC4PE}5}TMDo0OK}GCVrzQ=E&7P0q!V zgKzg!LiG6f6dciOYOLRhl9?5sjDm%SD<1ZRzU&M0eGqP+gZ&}C^4r1w54B}49aF*0 zdru)E^=9-cp&45`H!4$SZbTmNo?7(F<#l3+4l}+n#0X5U6Xyky1(n>4hDx_cU5A_IQ(reAZhYfFrY-9A~+A*WbanCZNc<{PfHse`e+> zOrw@3X5K(XPpFZqdgO$3#n>U)nOSj|dTqB{;~fy5ok?ug$hEYTE}M!6>6%; zvO;ClA|#C>@4qn0c!b=EG1_4~+8bzkfV?+2aBH&V!Jyk_gJm|MCb%}7S3DcM>>1k> zk%^9rDLTTdj!jJ@W+tiIxnPURLkdo;XZqp*#MBt;;-vjx24@3RQ{vHw2Q*Ub)F84V zDzbtkTT@MvLEgLv^&FU?@7WJl#6?zAr^W{hnjx zlvsQ$xm;LyA41TDFXlfGhq!ohGNWE6+hk=YjQY>!aSldF`9dKceIYyRzOCLl4+%?- zJpcaYHDq)U*?ualvZWw|e=3s%cGjQDa$ksOPAH8Ojh(-n1j&LY#rO?_#0=yhu*s;1 zl|QPA3I$A^9S+>pz{@aD<(!JAja7N3@W(hTJ@=A0^WJd&9hm3(x4;WnlF#NYN+g@` z#XA2^QOPEPc&^>JZx_4JBtItN+)oClbfV5r`Q%3*T#d0;*?|wx9L73&^9wqdWw*u| zEY&VnX)%IrE6>AI6&y5+F30E6BtTmoTU&wKbAa1PElquu$!#wzQ7Rz^NPsx7SZlz~w_O!Wa|5EjZxvrsJqD398zzGM6H3WDB7XhJUB#Tz=Ff;$3=4`pV(>FROC^GNAl$cx}kqbdJV7+`>g z7VD*5hP-aGlXR953s>3kNb8k2IdeHFt&AW0=sYiCNmmrjTXB8171hh}=9SPj27n+# zopMJr3vnS8lax`$ty7-UnJ%Ed@~svTM{CVxRsHylxN7?h>L%` zdg&_VvsztRXN)1sDxTMgC(V%DP3)f9N22VpYh<~oAx(0*9L`Ct$znhYJC{i z`FEO=0>{H%Z>D8=Q-a{V5uA5=iCSaf|81mXyApg6`UuwEIHvt_udR3fl?}tR@+GI{ z*85WY1=ozWvSr9ALouIDEk`zV*|)CudJ@jJwx>I%*&UsuT+psSSmQYdAVTLg-2(oH zj5GD`OuBIbteiC}3s~*sSaNGR)@v{Q*Lv5yEZ0#C$?kEFi8}Do zy=`S4Io6?cksQ#ScsjDqVwRQ2Z6~sNcojR0lB~<&`FP2=jd3sn>}W+5MAEo-gm@>V z`MJTlNAB*z1G1#f)wKwuN<2&qI5*bRHU*CI(8}5hs%9hUoK8#c_ayJ?stcy|=NKpl z*%`oeMc9ApFE*VIu&7>>Ch*r#9I=4BDgJz>kb^DO47A+joFkc@M?Gs<+u-E2+1?$T zZQw-6f6FPEsl$QltaQ$8f8Y1t|6K{3WUnmgPwEU7A*!0=50l4zZm?3AJHAP)92fts zab7Kak)B$(FxgtPn3hbP*Ll9+fGs|n%I6x{j3pM;0TrLSim#j7JEFs4uC5iSv?C>N zJj_(Tqm{*U%%FA2x zH3WHcS9P_scw~#}tm+V8SzQP9y1BhW?xW--_^q(9Koi}Ryb-wOFdD#n0W&#T2dito zF1j zcPVg!y}W2Bg%Ku#SGFYzyc)B|l?bQsHudsyjb#7CO~h7WDv3O=Sc6sFk6QLs7IFW_ z9`cVM16hXqeBz5xS}xB_UP%AVY&0SZje?!9o_|1BpC2y1K{XF5R7K=+^>SF*T38v9 z5Rn0iiqr)&GoVq?+L^)H5nob1937d!6QUnND&+F=3mb@Gr=nF}uX=_xJPo>Jo3ecT zG({=g$|I!B%1=p4@R2@yRW~d>;PL+frVEvx;dhoU;I2phdeec9gfVEaEE*Y+!=U6t z{nBo}dDwr?PXehbksuy9Zc0hA)0g=wb*g^}AXr=IOQK1E*;Z~?qB9`{g~>SxWQBWe zZ&xaDZT-VPJ>>d+W$556vS4>~L9;FZEA#LaN$GSvkgTb|L%* z=+Ki+#wrChx@9`RGSk>af9jGtEDte&NQj-!)ZnOW5VQSo%w?m%$!_i&b#WN)$jI>1 z)2YYCQkj%hq}Rx*(WjJxM=Hsc2&Lw4qhArKd>9JG3~LM60tmt+15BPGnUYCn>9pvo}-~zE8jaEonbVl+2(1z9@lT=&k<+*SzpWAMs;=Ve9=>n5kE7 zt(`U00Jmv^Z;YU_TUwYS&;GEuIqI#%JX9c3yHLfuB~Tdk@?$QAPsnnABO-7b_EC%} z2u$TIV8m!Ft4(UEI8g%jKItv%(7EU5Yrij~li3o*AIWQOP9@P(KI<9sf5)gre+tkN zu%@`8;AjEoQ}VX;jpryyF#Rs*xk$?1tvp4V`}8#PmH5Fi`YrYTG4~>Y3>EzgIlalX z_e|Xu*D8`QFQXM7_p^4E>z*+BAB2^M>U!fQeymNj1XJH;0Ej}*vTKv>&h^esNgm=p zG~k|cDeH!HBe5{{SsTsM3`ejmt zI8;PF8ybAd99?p3_9ujG8YFtrXlhE~$Y4sva)elO z$+(?l#GM{HjeN)}*HrMYeQ^9cIgc@}{lJe=hS0w$9cBDz%!F=sI*MeCkC77x{g}=7 z2!HiBdI)7PwaDpt;^Pc@uJa!-Q>Ux~G*HiDNhgkhf39p128}@#a6?H0v2i(?QGLgC zss`?W>QUUu!NbGdwf(@@Y3N?FM@7xk+WS7Jl?Mq5h`j=MsfSgB93@Nwm^{8Z}k=V+gt!!Tf z$=vq+B8mf2Kkgmc02lBY9=30|?UjGe$FOVfv+Ik}xnAZsZozlDzhn1h zrP+ihpmwK)qkU^Mwt3o%I2{}{Y8%y9CEB~)$o6%p_^qH1qVVGvxrB$Hk$-#`HRKz{ zSFo=16;-U^kvlZ8MV$TfnBPlxPuX(W`3_~^Z194IP`*FT{y9~=FKJ(dWAakx7mH7) z0?&q&T%Wvzlup`tV$c(?YGz#qKG^;=JoasO)BpmpS?T!^s@fbv*`gHBv8AFm2ClH7 zztQHofsiP-f!diW>1r{Mhw1l|gII0;I(9}_PykQ#!wsFh>4!eqjOtN8nRMbV9m>^vW}nSIfBDdPQMgC5A#l*j768P#%x|b zbd$}3lN{GLfK=aE_k7yEzfq>$!6DMcgag5ii}0tPKx_d%8v}L}V~cUA=gY9(Bnm0+ zY}A&HxB9k`OjYhOdU8y$>M}AOn&1Q9qsSzbf2tjADI3@uE$A=dx(}m?SX{6&|*WK*?4E8^3901?1!!H1qFWm2)ZD4*pOdfY1*zs!h%q%8uA6~TS6?}&9q^9yIfc)7M*s+K+QnWU zJoxAw-xbdcXdz^f895<Qx2>zQVn@Uud9{)xkp-L%H9gYF)r|=+J(CbAAKey zd;8x}8#1b0DglM`(&!=#(GvgI+)bHXr})sz;_{2zR~n?GX#oE-9QRBap7#*01oZ1? z^dB!5z~hdfaYtU-6DJ9>air^{rBD|Y`qV>mUQ>4wHi1%&|8^@me!;5bzxyI1L(FJZScmICwMqx zLyz2A081c({sc$*8NNL@0PbwT&H$FY`Hu_yXq~+@$#jq*>Sx`JwDX-Zzg%0!`ENF2 zzx#;9?6XWT=I=^0Rb>~|4)cP$8WfFBlSl@xtU#=mC9*9Fdq?M<%~T!989}SSXceEO zez`8>dQCB}KFiq0F{e2Orz1<5_N3>qiLA?9s{MD-ypk)Xq45*-~~ z>dHdg0<;i!VSXp>qLt02NKf=8#EcT#*tF)3yRegUe&5bkN#rnfPMK@y4^0i-v&DF$ zf-sn^V*H%)yNxQE=SZjwa5~GzS(nu#;i)sQ2LP1BRRgO+gMf5)%PnN*m z9YQ_sZdP-=uk;~AD>f0up!z!K1x0YXC2YtN-9no?9o+wMd^h=Za679176l=XzCy-` znEU%fs4s

HFSy28uDi*AJzGChAuz1Lc&E1gCjSLo`Q2in4<>|Fl}02xan*r*DR9KI3QVMl|hhYgJ9}}0j5p#gss9)-1SHZ^})Z&#s#%Qtj-vM}}t6WGSNfj)ho#plhHWZ|z zM=@@_>h$nzZd;0y4Ri=uSQUBA{00c$oUB03Qe$UEo~%4P+|LQ*j8Kc*lmacJB-ntLt| zn|qh?<@J!r<{&2+TFKA_%noIwf~yrO~N67xJ8<1(HHB77YxejtvDpPwtI zF#%PCi9I4jmTQ9FqvP<4jIL4cJ%&mYqjHC-)}GLJt8!Q^ymx2ev#OzL)$slWUteM< zbGFH`FfofqFv<;XuJn0T-H#;35LfQYZ!9bWy^<{XaCwWpqBbSMZ&yCDqRCBI)*R`} zAU#4Y(MJaA1|Q~G_fD4g^aAx`&>G-GQsJ4>65dCQB^SpMav@s<;CyCxnw<#7I$cN2@$pd12XgUY8idwfbFB+LBj_>oC*puosQ6)ydgnD6-vyZy5BG_MkhKw zbRrhCJZwUm7wl+?ZOQ9MZo9Kq4+{nJeC;Aqy~z&?$)y)sjNgzG_fIiUjNy>$&8J2W z6fAM@{VeQ76e|Si`nQ${Hs}bpo(-f>V#CZc5|~l27awN#kHsf8+BOIrd#fK}XobHs zGChruTJMowpWyDF0jFvi4Pdu_O@>-=1Jv;_wLP#3h-sicv2N8@tM7yW7w!3Dm`afe zj~e5fNU){VV8PoAT1X~j&4bH0Vz5c|;IcliY@2~%tWQg=9miL8Jt&O^=GNcvz`%Lh z8SjzkCS}6eb;OHCmzom)(ArZeHF5o%+ncHxFo|2O_D@C;WwGt$4&~EvR6w->pgan- z)@CCTk~EJrmEsf!qF4VeT-uoc8{H^eG4KlU1YI z7K(l@#pet7(*2JFy^(rm3fWhH`JBAT{w0C4UCz$r*dtXexM8(kg3OU}HaT|6;<%q$ zJPv#?d%9iL*W_c8UOc%bu(*1%<+z8*^ODr!iBBU?4_^r7YU#ck%vXNBv48Ng?&+E&q zny}im09NsE1}epS%#pVheHL3Q+h&sF>?b=Gqu{L-Nl(ITZ{8EQZuo#PA%aooXp-te zm7YIzzGt~tmesRV@!T47;nuJb^DJ`;&QNCcELRZB$W0Nx6-CVi!}IshXTZ5w#mJ4A zNBUH{1nw;iMxVn}d2QVLN9<~G3Go#NA&#$_h}~|6rlZ37V^7ADwDkX%6W^tA;06mMH&;`O#^G}Z z?fq;dc;)TMNRzKoa#nFkp7`vqh1B$>-OY-6r_OYz`hukv=?d&}EKG8{;D$`KZn^J5 zi`M)mTBb_3+<$T0Q+83m(s!}r*328cLX|<8*8=jQntbF80Q?jHMAN_`L9Fbkk5(l0 zui=yV2XA>_XucK%RF4u1TsO^b+D4u(T@7!_Kn3KaAC@_Ev`tS`0@_N#4_{2!xA5oP z4B+L-!UHc|P`I=vY@y^)Xeus29t8;xRk&pEhh-p_LfeY$C~{!9DtoW_K|efVYMh2}01(%gRkHsqZlO_an5k|Zbe&M!=}(>Re9=nDg*T+ zx#FV!FTK-^$FE-!;5^`+19Nk-ddGlK%IsuIp-yl~P-C7^_m5xxSrq=l-fp)tG0;9D zC)&GYAhf%ooZ$P6fvUAe1sJm$I{)seXw#RN1J_Kvp6*yzfF9h*sBy@gM%@EGyYjv8 zxNUyDm&!hVIMs8rvXovYT=gp7<#lJqv(?usf4`@A+c;VCT*`DRgy0_njTkWASLmM& zA@4famECVFGTP*6Ourfg?#kH2L>-?)P4x2?P>jgSxmQ^gyQvo#Osb&uX3b7kM#GOu z`&ZGVyY`GsdhNZL2aA_hzapUm$4T@4hPGuw%THR;^(71{2BZ1$J!!%>4oVM zBSqg1XPt~otmj!D1DkbCw=HJsj)~z!%x&}pTp6Y<0D{bX+O9hGLmHKzVNNXW&Y{cA z2B~L6q>QmaMFT>m{l$dGn96+6Wwg|vNgT}WX@*!!`E>1DM^mX;c;}yKRXOA z?P>}O=F;g!bKt*9j%&^(<>fg>fMVl^hrE2;;LOq4(H`cVZ z+?dmgode2*^BlEPdMuPi@c>lnw-$Ndy&3G|dApgk>>6|Axa?fI*Fa6qTVJou?oKH;>$%hTH-u6^0eiygeyjP8dHe+Y z9vpf1(Qa9f4Q^_JBY~B`#0hvid|m4UhRB16byzk0&(6{o9S%NYt6bVR&IALT~%q~S0{vm7Jdyt8;(y@C=oEc8NLW#(z@3u zVisY9mBQb@=IbbfUu@-AFKrj5aSUNZ!5V@3JV`E6>1xu0#Fj+eshS0F=HFerNA-d7 zcCe2CYk&=^PBIi5g&qS)z~r#E);x`{wKl*J(V8Sohi)(kgj);6AwaBVwcKK1r9R0+S>&aq}v&>iw#4!vLu zAGj5t(e>Avj7ZuZ_|FkaA{t7awiTAy^9~%-p`a}nW@c_VEBTpvIbsUjru5Un%aIBf zdrSa$`{=s*BcI&)CuU(LdGN#)>ud5TK`aK3aj|P7r|lc08;qwVW{A7ONm{d7 zNGlS=jK40a2xg#9#3N56pau8>S|+;klL>Z!odU&PMPF(*NdD4l$uLAqE?eT^;u}~y z+B-xXy(nW5mHWg5rtAN;%VBy|k+blo;>c0NsuNhOmaR{#3e1zuhb)!L8-xvv4fS2` zjklC{%y&zKB}`XvHl`^&i*4iDex$B#?=muP9CNM-AFR1@0e-B|^^(oAYHvO}za*fK z@n^j&Wg%PNbPj?eY7l@RhwgpsLAGSEue0wNZFw`((=zacBy>FZb{Q(*(awVvmg7n? zq2d&4ny}}z)o!`}`oUJa^ZrM|_$gKiA!H4*Vq%|2yz(Hc?ue^Hi(sxN24yRA&d)$9@}05S=o#4xBeNIzB1 zRRO9lK#kxQt*-{;s@X}#z;888mj-ftK!w2`rGFh4M;vL4xR}})d6CQVxYWKdNeW5z z^p#H2M-d&-RW+$G>9lJo=A}XWpf%Yr4)_Xp;?;b9!1u{Y^x|K;9|r2Ks^nSs-N4;1 zEL>)Le#@LN_VBuTsnADFQ(M*D^JIcx!(r3P$Ll<=1YH4@e@6hr7wwB6VWY^4U56Ze z7szBc@L4z;oX)z+Sz2!@I!^lCyAg5Xd$vcL;IFHVfD^MPopLw8xA?gpW?$TwzmZ|{ zKXDZr2G_}KJ<{XQXr>H>8~9=n8h{;V_gt49fvo-&asX{0rzlgYQ{<_oV>^PM#^%}I z>;X!P2|9o@OwGxNo+D)fwzA-QDewNQ@bZcBR0AEkD!gns+ou&}n3Dm{;ouNxG#i|f zot=2BJz7TS@9!4Z#)NyP-+!=^kQ)7{zW%^U=0IYIp(am}HQ`(3&Kz=Y_x;%ZVIKEo z_(@zub|BB}xl0&$#HG`vRlNY}y2@abSdF$rBnrf!7PB#}h53180f5F~P=$m%s*q(5 z<-DUP>@76`2=bVso?L#lOyjj|da7!AO6p@5SyyIOrmqX>JGwCrULxo=0u{?oJg3<{%2po%h?mPz@sqH#mw z(YPBGjeQIOh}BU5u?hj~vFfKTH)=z#BodsvY~Qw>&OS!CrhntgjmC7{eqHwn3Grr3 zm+Wgg`XB(xzpfE+k-s1YXP0NFwZB#C&4Sqd-Yc-nuWf?ba9{S zFLH&!#K5ShE5=3Wi!!4=;j`uGmC2DV-$iw)f`}-23129pewMXXZM2SJB&r}B!a+H2 z&3O2UW6+L=`59ojrmev#I2o`Uf~Rbo~73K(9XluYR zVXi)TB3R^6!{ynB^q3R7Z`)c?#bWY3*Vt8L_3_n5A)38sj=wh(afQKet_f^G8JfCM zd|YQ%r=^0UViJoAvXVSq{fj*+a-6Q)0Q1(K9kv9I5HDQiU0MM&JlJ<lPA@q-AVtlL+v`|b7nnbiP(yQ4nW%i_Hx)dIIGtv4$J<2`&9P`b#4C>|ci zFz0EyrE*lw1Ujgu1MOAbv%`KO@)F4jQEq?6-as1=+!RM#Xf899AEa~_6uNOhzl-8HM(C`(bz@o-mHDx$#c3~Q*9TUns zdo4PaMouE7hZp7CeLPw zyZePsLOj`xukG}dRJ2+om_NSHY_teq1Sop!``_4h2 zD8H}s5{s%u#3C(ADyimru+d5ug({)vVx^3mK1@!sg@SB?LZ58FO9nA2F_JBhBsB!v zXyY|r#ooAket4mdzP{Go`~FwoZOt^JWtqkZA~eeiA-1wOLRJ`14Yai^Z3iy zM<~}8rkfkrr~9kl(|HVyyrgIXQ&w8*Cv1yS3cx|F9x=J2_4s=Bb#^$+U%^kf@5XN8 zABrh$C`?mhpNALGWK1myWy*Nn)YQ3DM>1hIKlXp5Ii3FwVs*W5#6c!Hd$CN*D7r1| z*EMPvUqy1JkXyBJNR1 z$7UhWhpiRDpxbO+{KTwWitNoj29IOVwZ}2&AtkM8G|%eK<>{Hj9$1TT8&6qgOk#Xy zRK;Np&Dn#r1Ly!voWH27bjGx_AOJxKzGc^x^|hg=|3?c6vTt`UlQ%rXg3Aj|VJJyw>;^CGFAn-R z|5=~kob*2^43}CBKE3%|{1WGl$|$q9skj|sWsX+FPW3biQ#}c9x4c#Rf2ms@``kh~mW~n%vm*re_*}7bbH`0fD^m?zNZ_#|@Z>%Io(+7r}p}Y&+G{ z1-QET0iC}31w5%@X2|g2n&PadrwI)y&U$&R={rrM#R9s-%)9o`?KwiiVz0_l#Ab_y z1ajKZwiyP)ey{^NJ*U$~hTi2?8pB$~QII8K zT72$0nj!hn^!4di2o1r>aL59JHE83$F~fhBJ`Mgp#m;@=>sxzY#hcp|7Y|>RP7GOe zw=Wd6nj(HWmOX8+y0Xu?U4a%PKIB{Lw)*ai8?7$o{|LKMEIhzUY5J&jy`>fW``9f= zXq|;=|5ZZ}b^qW#Xfb-lTMyuG4{)PJtXBbjAT4wPUXBFgr}-i)voLaGk@2$7eow|-!70HGOL z(gegr2{AR>bk+1q_Jct`#Dsp7g~)3j{-2Zyq2Et=ydm#zd3gS`kMsXt;CTjpzjZ2A zz<-c)8mnSEKrF@JITd)W8Lai!3}I!DSd*^V*Ufu}L}eM$i^$#MYJX40%IZfrv#iS$+>?xd}Dlb zM7{bh(Ug(&<=H=le;I!toqheKgL2cO?{Y82o94AVt&-L}z^rF}Z0?->RF1nZX?H%U z_LFr#8T;Eb|D@vVM99NYh>Z|uQ`VegL)-$`vIwNlY%!<=G=zo%1M#X`D(Bpx`!~UJ ze;pJ4Y>c9I?(MqivOCbwK`~zyk7bE?JsT8Gi?gyaA@l5uSz%sYlnVwunirSvP%y-t zspQ6*p0dn+VxeRh`H#!%!Ua9O^nqHz52Y5yM)1M7`32OQb+M$S%KJhNO_6mgK?YHx6@l z>9yXiYY4Trb*J@VExbg`%tMg64DTj1mBGH&L+EBZU))QGY7aPG3kfm4&5Umg$gu5S zFA4r@D+xRGw-d>TWZ*F0k+mi)ab$1kUj-WazR3H9gKK&G-PNE?eGZ2z%0^r#R~m-E zX*9HP>EGwDSC^V!!zCh)|H4Z8^YU-S-!1&s&jU?|{?zPdG%4UVai`p(Jn2>E?r4ox zuJjsZr@}(e*(;vobh}KSW46`fv)EV%A!(NOBxcfdTjZgJL$_~?!+V4y|M@3euO-oz zM&YGWRLb=dk!yOvuJC=S9)NtOt9MxT-PHEbWzm-nfZmDkC*dva2lACyp#)oj z|H?l5Gu&4PDu~up4d)PBZqkQ$F_}O3IpJ|;E6koY<3=fy6Q^_9+AeT83U)QK5G6zj zYHg*bziRaRDG~5<3Ne2FLrPvX08t<#nQeJl20TQqlN%Q}G02?80YnkG-51qV+l9m& zK#5nup!;ki|Gob7^50!A9#x&|3N0Li*oY|(%H|vwA+5!&F{ada9-Mmz7xT(HI4`Af zU8w2dd>EWl)yq+x#(A-_<5^=lF0=JZ$fNk-!7y^HAhh4BKXmx$*um(OZIYBQ=Al~|!0Q+xbi`|<_}Q0T z=QGcHnPEF1)y}p8(}AuQJh8i#RLoXrB`C-V*~c!6Kc<0=Y8S(kaA} z8vgBu?2%hOI;EWT1S^LHEq7#1W=d$~cy?0gY^0@Q0T(k?8-|3YqH>UkMMvK{sd&L7 zpvba;u|m_B9jqE7CZv~@;#Hony&7kW%uz88IVNX;%S%hSgRacV&YfmFT`zmuGZ5zy z)2gG<#J8g2-N!?0$3uh}2>L(IE^By(pen5)sChv3PC}~Yt%O*$+X>q2gtpx)+m|l9 z^?m#FTjZgpSvp74o*Gp)RT!IEK!f#akTQ_A)rNSx@=@!ctYkbIlbm!L4*?@kl*o(e z5&aQ%ZX*6SR@(e)7j8Px;ZP<80izdX!C90%sGpC5{1<=8P=oC`Fivq)I9SxLfR-XU zq3sL6pgH_Ca{%9kDV^!H3c zLy*9Btz_rHQrJ>@NLyw!W8_*fDZCy~g0Xx%8Zvzb=Rh3pPwehlmc^$JZes_LhYWxn ztY6h8F0F)qtTq0`!tZj+F84OcJj|p$On>LjCu5V}*tRPHc3wt0*i!Rl?(5OB+s0{V zx2azV>4&hFcV1tX;oy38;6-B$Ofj{Xo#SnW^xkLLDA0NF24xce?iqcz6^)x-D=xT4 ztt#+lIw|!|V@tKe04IC6RX`|%u>FA}W5+W*4?n-n_Q^w);biS4azpZbr|P`%!CrA1EGla5u~&Hb`l zhwd&ncARc1ziBpoekK2o+m)6*nK{`drX&VRC$)T#=h_3A%fU7?>52ZAuNB_J4)e zC3n5ARo6rH2BWa*tuzyE+?^&(&3a8BsfXVm{(Ih?C7?|t-lZ(K;s zZ*A(;(ol)M*#K&sYT|RFrcQ=2bG_FMlmr3ts_bO>{$HQ!)77C3D)VWr;JPcVA`@Eo zXE?&&##|wFFnZ>7p6#=HPWMmlzs1H40agxT_SJD}>E3C2 za2Nc-Fuf}+x%XwAUqWlF<3nQiBrS{9lI*TZ@G;9x^Orw?@M0(irM)0joH(yoXEPDh zm~5-087>>8!C^#v1{aEYOVl7keZK}eUrS_0Mt{efyACi2&i4Rv$gvrXc+6i#|$a(`{~Gp4{Y)v*RQc0{lm5Og+WOH z=+LMyeqW$G@yXQ>6!qsu_xDy~i-+$z_a6dt@9Xi`m3T?3x~aYIPYDPh1q6^ttfdddlS!I!xp)qVFT<}9ckGv$fvJ@BiA()4gCWQ*A)O>yN1>KQ}fpvyRmdJz20o% zgBhtdleQ53C~zeD|Cj06YsXZ6AI*yVcRM{d>t%Ax4=}x*%UHLD&aB<&ucvRI)9co* z>iQn1c>Oz+7VE{5cp+b9z?o6jClRjqZ71jz%UL%`W>l{GKK6h0$A*r6??hgC5#$5= z&`-79HTLrbDx=J@M-b4=r!~&Y7xY3-g!?6MXE^-jYHG~qUUm{4>w6~O8y<7$xSn#fVl%3A zaC*kd*5G@OkmH8*k9L4(C*~o9WcxQdsrp241TF~`3xj5yhGh;JpW(_YHS7n?QqM-V zoaKY&xGe05x}#&f(I@(rxzFVnpBp^w*l`+n{K)O+>ZV`o2}Pywr|BIV=!5U{msP&+ zT4??V9qBz&)*2J>&Ja&r9N0-d^dsvVdREo2599&FQ_po3LXHjQ9BWcawIo?tYA4W+d() z#r!kjYb+}IOI~Lly8m-t6nXusUqsO5=IJNGLC>G5@M!dhfcoo!I|jG={heEM`hnN% zdZ}*4_!M?i@-F<%f?oJr(GbKYncQi#QLfXi`L1UnpT6l~sn{DgC5kxU9^VpTM&U%=Jq99nk`~lOOQ;?bXq+xJ3P7{e*E&h=aO zZ(j+gBAe-_ufa%vO4Il8QzOigPajW2BwY*kEkkd@gR2M$X8efb`{@qbpL#p;C^6??{{`|wrN4tc8zhyJ?HvP34Zwg{;LX%ykBc z2%3+I_Mwpbi)kONs}n3`loumgYEs^QMP!pnmvxs(U3Yp=Y$FE!6PgMU>gF!LVEb`5x~KRGV{?g^Jqh` z|07)lu!x#{a-MVWWAQ={aR{*t0G0w&zD6t-y%;uC;VC_PJtkHaz#j@Cf-=7l7RUf} zF!MhfKv+-;U?Ii;79mH!f|0u-=OLbcK_n_0ZNhD1 zdiM)=slrM=U{s!91E{H=doLbLh0D`?t0(IJ{S&1mje8U3xYemA+6In4KC+uWe*tVi z%3m+u2+mHWx8KIB1Iieg0`k}mda*Key0HcT&QV1`i&XzlaR*c!LIji-NJ1lWSP&kke4QxtNE+RR59?xx5K(*o^Atq*?Eui;4RP?ZpPsO7 zK*F_V{QnJ>Lr9>=J>O!)k%Tq7IkL#Q}==!PbowuE@*WD%i1{aJ%{W9k*x_@(MBK2(eWhP zxx3(Jkz@>}^u}SP!tww*tklSOb~8jxvbc*}p}5IUY`qmCV~{UrtamIZr6qyH$1)on zYll`GEXI?*bW9x@CjfpN?){4YB)iwS_dxnvrVu0(7DXA(@&K^wp|z<>Qs6hzZKhlw>cD56KZ7AGml9H0qCf7>~Lp2c}5e zR85+|zSWwPj=oZ@9chR&8c%@dQu>F3_ewS7jK{?(%}p$`%i-iWS>JMrsvdhw8Li@y zO`+;Y+|ni&^(e$|oYf_1&1d-u(cl*&*`lkVlr+E}U5$UEhT#>uW}k{CSxhOE++gJ7 zP zGTjF_7}iCL?8zKy;(XiNCz-gplrz+(lRSo~K8B->jQTORiibX~i#Dv22PBF1Ca!Ek z{Km5^VjR!POd76XFa^5(F*S*2(24`Ly#5#ulb5`D0Z02n>Z5`0s})b)ttem_Oz9to zL=Tomy>;+nXFH^*{JOM_6p0ILI1ulSw4_M7H`Vk9MQIOrSu1`wT}ML-ySM9?;g0I| z9fchuz`@@O477?dqy#NrU>UM;SlYNA9kSm0{T4X zCrosv^FCeMyT$kW1&5J^%!vi}adyT0A-GXyK_pL2+KPzZp7h7u!hGsKoH4@5bQ#Mz z-lnNmXI-YE>ulql3yM4S6>k;2vlGp(CQ_OX!e$inyq8WD1b?H9SR^l=q$n=4oMeO! zq-Z2E^GG9dX1mF73K*neapN8@?t;bz;C*^_?9NcVIyVhP;Q)5l03;1|pFV|Og={J? zY)Q_`U?=Kz5AR)h>6aOFrFWMXUIh@Ib*x9PZs8pt!!gqbb&z;m0Y-nQ8D3Hu_dBiFQ1s0geC(qRwvZ}^n}H8OQiTc=Axg9uu}({g z(U|~4Fl}{(tS}-&avRa9JV^)X$B;YJfs%FYpMQ~ zT_P@oU@DYlpX4Qd$K{KQXOEOnXw|x}u?wqeupqp!LF7a+@xs4SDl(y)OO0eIFRbXG zi9uzA+cuT`oLvt*! zQgu!T`j!YQWL`UN%R5}d*moZObx9`?r(iqZ+)&Kt6ah5v(6Z2oNMqUh%&k9b%k9zu5actVUBisLt*QSUPgU()S$u*!~aK(nxkgI91D3Kn)gsr zJSjaX>378&6GpBq#v}6qH_`ZHSK@>rAH6#B=yAd@87zkoU7MAn4@SHJr0EPJJpSpO z@&njkc&|yiB5(Yv>Q(F?iL9r@u^6PrWw_3(=Mw3k3u}-lmtsv8Vjev92)6j`5KS6V z*u-*f?ccW>wP;CypmpYf8?|XoV4!{0S6e#wC$MWeXWlhTAwAL_HVc>l9UEL)Ct!dyFUv$FEtu?T5VmwbK^8A)v|3}O|eHIvN?L)Vhh7_)!t+wCaVblBupAh#LSu^fjZ`U5*yXjn&T zPXDTGhZRe!T9w_+3#8Q!7ChYJMg|;vP11MYh*L4Qq8&F3oWNPRD00^XxaS`DnSH`q zy-}@iax2xc0fPviZrQ_ zOJvFs4Mc@f=xS;JX~*+%@qof8vJj4Mu5R2nV;~pLBY7bO4*+Wh+Kq?@P z&MOfg22`n$jL=2Yc-Y%AkrOUH5`i?JOk4|tHEPbH&7x%T33jxE)qvcW_=d*K5RI6V z6X=vP6w4x=>au#qLDXk7b1;AdutQyw>*NV8#|@fF-orC6fR1YOcfpWJ1HkaQDLC)3 zcbr;!8#f%E-l;ClP21vKnzfzpq#0k&SeSZa0Aw3b_cY(J!IH0aDn+`3J?6}sHfh4R zF++NB(S3^yvvB-hXuipE3ooc4{G^99c46)u3uoSCI&ohD3V@fGTqDAM2A6Aa$#C@A zByB{PpFRicaSY4KRX|_XJ1acntgUi6*=sT~kt}~fwv{Am)5))y!x?F z)rgMEuU5T+GMTZ_DTZ4KC`PrIKR^c9(RNlBI9Fngn8wIY&Z(6(G(&;gmane9)M z#g@aX{mKSRBOWT?lP3Qz-b(6PJNhzv7dcj26UJ?TNOoK1a4e%g^L&DRI1 zuG|y%0NDB+QS|9s@Avn`&x_&G-hKVU#@Q1e_e%=|Y^_V1`JY;q#-s1yi)R4OMbWSf zIKPXd68=90Iiv^7|A)(JfPM-Zvt@_Fj)NX@+iA@6>1ZuaQV!Qv-Bvo0QVuD+X;zan zSRJSP{wB9s=i2*)$Rrbc516_q`3ICIf0=A+BDp&nUlKJ{_Am0g_h84T$V}s!UzJSP}g{3lG_e=fAH^lOxQ4U zC>wbX2#ap=tp!J$N)=^@TrEy8FM$R0Pk47+%0DLQaU^b-T0Bk*SiA>&Nb-&FL)XZ) z16Tndz8VTThb%V$o>bf9iDx|@P7kwC!yd2n9JU+4f!X9vfX*ci7!oa-j3$8`+#8!^ zBgud|nN&PYRqdrV%4xLkX8=2_1csCkavDEL@=Ztn*_k+r;c?ue1~hcfE9TT5k6E; zC%bMo4!1`dNlYYtPu(&H{>WF1uIW<+kpG=bRr+^-Mdzd){0o2jNY+pPNbc z!Rv6&Yqo)6ItE-dwSSUKii~v>soR3lUA>0}M!P2eWw3N>jm%}j0>C|h5bVl4vT?Qk zlvX@O&~qDjc(QO`Zx)g{o!^kqA;;MeHDC?l=)hAtG9CD*4SP5Ers`=i+PCvsN%BLE zVq0<~-6IZ)dtDiAnLptneHqv2E!`_|H zij&>5rkX8JYtNDle#{}RX=HBF&SzlKK>=vj*hZrcwcYArOVWBmb-c~ueBN2e5Pra$ zXF>fF$wWs3DFAJ?Yak1dy$y^6*+a_Z+5xVB2#-8>K>ZTJZF^6f^=seQn=L?h>n7Nn zy0;qy8o&M$>XCRlJZcTR`38hYq&z9otR5nc8xz4z7&8p#EXb`!xA7g;Dn%BFfLd@{ z+YRJwsZ>6OQfX04-69Z&FOeQ1rB1jv20-_Qr&4WKcD*@EC@|E9kKFpo+<8*s-CUy- zo%wWgO8TY{;YqQ(=%1>|_}^C49nW1fMJIoy6g1qapG1XL2HFSDIw>}csMW_F?SIZj z3JC!DzuYdHwIOrKl0k=Yixi^cq_7o-CKVECq;kL{2zMW$LpvoAPfD_j!6vkpNKjFX zgm#gso|5q=9d@IU(Jvqzqv`#6+ zNKS>STg!|IL(4>S5J>Y4lOAhqeSpH6kr%#OZy`>WB4%j=lUrZ(Yw}y@)!roY-X;{V z0M{h^$dVqFafKyxcv5qIOGcGq2UDvs3Vh^F1{iH-z9*Rx^sXKo;1$D~4*nUnUYiHQ zFB?7I@RA*yCPCWtQoAjb3_uu$P83$dUcJLNYk5(CS{XW?-*)_yg}zlLCpx94Nf5rW ze2v5~6s)jNQZwn1Ox)IV2#P8~v;KuRCG5N+rSq>!wopf6VQ8Cutwyv2s8%F1+Mm>_ zbdi}~W|qKNCLrLZJUdEG6;>F1J)wh4TH8@9BUZIkk0&*{113@c8ChnTs++zn9*=Bn zIc=CL4D#?p5nKD{Bk}av6v5e=5arO`twAVaoA35c5|f<0V7OJuaO-#js|f-n(ROnK zV0!XWg=Ri9E@{?~tJKV)RhK&kk5Slj!|9Jw zWRAnhi{#yhb3TO~VI78|(+D=y9^I{w^vz`GcpV8`p{sX(xC~~i&d$nanyD3o%1m*S ztY^_|C9tl9Hq05OmcpS9XLB!tiwiUOr7m_s+`XDl*|dsb?D`6l^draNDuqm~85Es+ zlKY;K#qCIMw(uzX)rANErb3Sow{yE{ZdOjC^;Mq-sMT3W5uhmvjk1go z-itTxmgG9Qa&@?JxW$x0!^PINR3>ZO{ua6CEO&ae5<7A=dDGhM8oU8g2GO;OyN(g> z43?|d$yS&pWXAZ@ZX2)OzkQdudAP*@D-@I3w$QsaNp7j$c&m-#BgJ;FJ)-YUTeXs_ zupp4U>E(8lo(2HVFzpHDd!vaK&Fk^;+(|OA;}iQvH#P&s-*Iu|N_NCmgDvLRuHT#P zsBEbmf2+OD?Ql;ZrefNql>o*Bk~ghgoK|lGfK%JEy7Hr|G*Uuhun);@EX`>;CPb&oqq zhmvK4kxCm=FiAw{!szr90~eF&k+g?GemZe&WvMoW9h4x$9Ovx}lP6o94LL%Gam%n-U3Kgn7dVHF89Jxy5WEkZx6{q#yah0>)Hn+m1 zIP41SF`u&t3JxPt3l^!OPr9oS$&$9WBUffPa;N!n!cZ}_4mrTs^#tt?)a4X$B=8u; ztW!z~yB`w(5=g_{ur`&D0#_8{+I52hIG#)$LqpGo<%GnoJSoH8lB}!P`#}O~qo2Zz zB(utqq8y4vWiM4Lu`E0iS*AZ~WT%Q2^nlSV$xV#*clEYRzB;&Ok|y zu1D50WXREhz4VeTEoFoj3cf6{-ZO7hJ;t;5MgTa$EuNa`(1fO${LFf~GEEC69kLA^ zg!imRRyYn3hvlq;!)-PZ*$4TC&fi#L=7S*ofLYT7fIAL%)Ein>fET|6Or_xQ*MAoP z6q!qDY8GPaJwk;2W5O+wymUE7GDB`ml+~RmR-O|Y2R)NqLuOW8y$fjBudbj z{yr`aD2JL!@w?tM25_MB3E{`5gvyXVF<@_iQw^vH5QUH~u=Tt~GM7)Gw>5Gg5%~<- zOAdT_Y;zQ_29|^?!hR|!32|D2rQN&PO0DCPA0TZT@+29radUbpO+B9Bi@#39@1JLF|9aJ+_0l+p{dsWSS~PxKo8Bxvv$yc zfH2LH{|LrQ5h;3G5P+y|8V{#sY)pe49X!mzL>cAC=&*o#Z0Us|sm$+e?vz69u3k!R zk;)`7Y09y`cp`I|<|)LF)z{>HyxeJxQ+Jmo0Km4&7=YRTup)j{L7tT^%ik-QhrRzv zol*FuUq1Q~5)6!osI$fM;~zw`h;5k2B!Kom*aSsYGqCrBkKiZxBN+HdO;eunssG!f zu=CnVt<%=+>fUqTx!*dA1+|vZKM&v_jw=Tch=A==SR^JCU!ghsda)IkT@x1#eqVur zTqn+qx-&CVy6tV+yL4=a+b7I{6N7k7%7OCV4E zfrRu*v7sP#vI_QKBfAv3gv1Et$)~FXu6CZBk+sDLoNF*99CfPHK6V0o;xiq;Z|6?8f%Du)n&olO&55RsmB6=Xy zOB3Wp)w>#x(=y0kXMJ-h_>-igcT%VXDx=RTi#5Wk)f3?C7g+hdOboC#_CokSdV}t7871Z#Du0mFsMnI&CLXj zu}d5T#6o^cIX|q*(vhW0OgFKdKmwmA2}Tbjol*ab=*V2Uc?{C17AmpW1SJAq@LeV& zU~pJfVVGGj+7jP;F3vQrJi_r8 z7;TzfC%TC~f7{M5VP84Q^iVYMwPilB{xJb{2s0mf!Ev;t&0dx!TdB1uK%9AQXEM=r zTSmN~*qC`5s;*262AZB{CDi$m!;eq1B^o58H5C_9&G0;-b-%UBv9&rgi<7p7Np!Wa z6Dk?zwuUHPEb<_yDf%F1ZK?TB)rK(-hD%?7;4kk6BYL#P#@7ECC48`xcyYjpDNO zYSdnUc!%r&WT;Vj(M67>UL>puE|LrRP>6M+fd`@S(a3zFb$35+*f#;@FkNXEE3<>n z@ay{}5|Sg_pBEe>#hQ}Ie~OxU>3eQ)sLq+a>~apX>+hY353?Bkz1t9%8YgjKq0AWd zWY*1N%m_-AV<-6T#4~X1;Gxls0!IJ=9GX%{A3g}^^K1&HG!rADL_od;rhGiZb%k8x zSP-M!kN~MbGke~9Wa44`a~R0q{R1~I{_dFPDc{D(LJ{#EysXq7bUS}g4u9ox zJA%XTE%cmembJ@-6RKUT9@$JsJ*a$)lds5&)?){0pE%D3--#HAkVR>PdiO$2??#4y zieuvjco70M5J^9+-)&WVxv?UyAwpWe8utF;z}sm-^gVZZ3nVrk_g_xe+;Zx;d-($^ zk2B*;jAZ?1Vdn%X+b78G3_MlIk0o`Y=HdwDL(qalh;C1ZuqcFJ z#wNiAhGm!jDqIvl_IQIxg#Gr2%l%;ldDlbpdAHTYu-;+Ev44e$deJd}wD;Wn7&|=J zt3>gQpAhZRJqS)nqFo}Xz|%X?8=KRw1wq0Cy0lO0BqrsrSmI?ug>;g_kSCK^uv{nj zd2llWm&Chic`y15EcAo+H<)V`Mfm9pK|MDq4?PRO6#IZeD_urgl}rYVwGH+XD&ql> zQ{%pXF@;Kd!kCoF*iT6pP`;YV8l^rOH|vlxjTK1AnoGz z#|aXdQLo(~yw(TV7+cz%v)rAAUVWlHoueVqtM&n1b|XO1i9^m_S=tZ_9K(^$3-#!h ze`@>)w_$wz7@aZG7;l}3%ChZ$DH)kN`?a%5z zP$A8uGo)-c`Ji$BaW~555DgG_`xYkEb*+5mOw>Qs`2{XwDVbX{5;v)%lBv8k5kvTm z9ikIH9V6;0!y@&gVo9~ph%4E#_qlXcP|XIt9+@}>R)qaUocP26x$xO1J$=^N;l-A4 zBpRGwl_o7bMrFGhbe4qDm|L<=uO$K7J0!&CEJi((nb)iz3Qq!6i@*@xY= zUaTe8U*xl(b{hHSN++ahKI9irgX<}mpCMXWe6a!GLrpF+89eGa10v+y{rFBHHuEv7z(pN5=Je6t7ZIoV@u@@qGue2zk z_PDzB3(6z_kOQWdquJ;|Q7>rb;K*SsRJ{$d7D3C_yh_B<16$gT&>b_3OVeN~_X(5# zNq}^(>LC;z#sX0sRcAXz>HdJs3(AVH&=Mi_Kp`BbPEK!figkpYa$T11^2_N5?Ny1tC3`{)(ieSu|Bv!O7Se`MZoJQXeA$mzDm8}U+5hELKGuS34 z1cGT;Y||QuyxNd@0wSdMd<%jY0S@Px$`z|c|;soiwqIsxIaka2{P=deYWpEDpW$P#tmG1 zmt?l50$?ddoFTZRXwlwSX4E8eJ+g(sy`G>Kgtm(t_d0)PzI)eo*qn)g;u$Nv^Ca>t z#8d0)^)yQz3mgvTsA(0UQtg;1x1t+&=daPPZdRl`AKmam#5lKV7{$ML9LE zyKz#S?W4FGN6LD4`Nb}^Z#0G6qFM^fAZvXD#!cz~ce zst-2x>&Jqlk6?;n&LNlEV9d$oED-WUoHVU}|C)H-Yh0Y23n%`tn6hoZa441@j0`T_ z=3XFU%Bjjp?cr8cpotp|A~DT}nyun=17cYq#3A-X0$F?Xf%Fo{ zqr7g~QoyhN#Rfshv`Ze`Rkl>)`u^+DX6N_hgQJpMSLL)LFbTePb`~WzCK~chdcSm# zN3RCldO=3$a)7Z(v6qD)g9^Y5DX2hDZ6$1t7(u!*0O$(B0sz<|6s`-=03a8px37Nn z7RqX(GtRIya0bC!@a1WV3dCT}elibV#r;$RZ9iT&I`Tm3W3%nt|I(!Nh&Oq3OAR=< zb%D-2xZngg?!;M9NUw&F(=^$(mm^4ja_esbNGL^qg1jo|RsH!I&#r^oyjRp*b+Dfn!)%cG%2U0{>;r=wYnoO*Ok(u|3%^k7nF;l|G!V z52C$G&IVK{7ND`n1pJZNo#ivoA>N2GsiIG*de=)erwI4z;HkGpFU7f_ha~!Y2b!7t zK>70sb1h00|B!06fB=N$Zm)G!1ia62wiNUtfa3F_7>${oD3N6(gy_Z^fPpRR>xzi> z0Q)U}d$i=XC+Ok=F(7JADl3U%s$cLTqz+#T&H}OBO9i5^$KySF7#A%uk6Y| zq`$cPWEZoFivX@&P*F-{Q85)T3n@L@sUW9tbsS7*_Bx+dB6h8K<0Nd8%@6#yh&e;d zAy#p`JI`L@*||QMaFvqCWa|8ZD11X)pU-TlT9p-KMrN10ZmbPNBWcgQHSc!pLL1v#&6?qA}bVcbs+^bgM=$+ zK@cDakTP~rK+Q-aFD%L`K+SO6!@Ql#OkALBwBi*D4eWJ)jaYg_n^MeFs@O=8r83Y~ zP1|y`O3@x-_UYswL&xV4D>hRN6d~mWo#`o14v+?a|3Wn>k=^j~fH|bYz&^NTZP!36 zgRyF-%UTu?29bXi3*dYh2u+^_SF8;Mms%D~qa4&8Q}!7+$MFq<^`zTAa!?3D%7%n& z5S1c_J*=Y6$)-8G?*S8FcU)VdPh^T%vAO?M4k<3={b#eEi=6+Ur=BZc)-d&rB&5zM z>KVnzmy2b978I^J`OO42k~5O7xjN;8m;T^i^V!q;+Q0Xo_h=D$TJS@C`C^_V8XC%g zP!ynNh}Q%$#O^ zyv;k?=@ragB36L9qtzNvZ`5=4AInpHtWmtw!S`Bn?(20Mk2PL`7>KO*Zo{x&>nc;O z)219?eMUwv6QY-fs}PA*NMtnnA<|S##YZ|u7rY3yek4SE-CRaXlu;SbBUJ5Ni*|p( z`J!H1h|_K08G8`wj<8Z z>&qX29v}QTP3oo&0C*S#NKMY7%LaN$kW;=r+9XQW(%JkgSjPj9)2{dX&Jf>)AP3jVj!v! zEvY)66oE+|(>ME9jLD^otJ@^i7oecCFj9&xLk}Xuhdm};%@%`rh4;8=De*Z zWLb^#M2*KW88Mj>^MetR1{x7_*$N zPeUkb=6<-!$oW^~uTASJWyjrEn0mY%Ubh^f(sTq#yn+f<77zEW07k4iEC_j1XXNJ4#jSW={pSv!7MWUIPzi+q<{ zuj>*a{32t*&O6X{m!1a>$6cM=dX+D(cXw)~A6Mq~aA= z`EaK6+HSooP9SlyAiN*13)Z@WvxT${S9j{<8N{PR2(??v433CTu$$ScdYj)ob_7$| zC2tGY^QbG6vn?eMskU3BS0sBS!(c#aw zp5Mcejr?KHU>*vGr<$JASg)Rs(bmx{8g4P&y9OS%oo&Q|#Suh%&8L<``!43<=Mhrf zFGBBLc)Q^j^QI$D{@AfZJIo-o86Sd!Ye3JCoM~4O*I1AJ+u^ctx*}iW*#Y zBwI7=6n2dJr(NVD6+0NZAl=)_b5X0$4hH1L2hW!16m~uDQ2Ua;!oB*4tk9L5ijPKA z;6s9W#AuOheiLU4P$Uk$$v@ESTT!m3{t7bwt~y#c zc_9?92x56#3%bSJrLoxpf3{Sc@_a4wPLK1BWttw3M=pBfh@H27lxtJKbL@9z+hPJquUFlNH@IrOR zF6yF~#CqJzY?*TM@?BE8Iv@KW0hcGjM5>{XE)wJ>MTm{X+t&`C241$aMl7v&+4X*1 zm7W0sVdYU_^>7x4$^@)VCPq%Fvr$U~gB0Nu?0Dmlhrc-W3ML&?AEQp`*M6kUtFhVi z>&}Qmh?!3^P~{g1rmpU+Q&oV{>kUAnR;Ko2+B7aiL+lBCi_?ih;z+`nJOjlPfqP>U z#p-vYMa^4?u~;K0bP&i<_0iYHcAr3@Q--6K@!^-VIn1RQ4KaBbtZAep*pEKWeVIKP zU!5q#jy^C^jMjS*KqB?LAq;P zyzvOfitMTVL?L*D_txF~UdXt;r}+3Ke+D8xJkpJR#u>tovzxPJPknzx5#Jh;P*)NE z@W^pEuw@WPbSFuYC-NH_1sx*f z&c{BL@7}_B6d~P&#Kn`esMt(u?e`fcE7efD)SRK{y)ajlbWkL?Vd6doVjuW|>2qko zEzTh5P`T)|J61LOw^H4X@D|&$bt|LZ$~;sHk*q)f6^@WbM=-VmAx$t{21 z@Mk_rsN=%X&lXV(mY%HcH#k55M8IT0r-U?VA37BudfeguJs#hZ3!1gfDguSn5h!$| z2t^Q~2sRL|nJOmWOlJsk$FRjuKbTKTvB~M9u?>5%T*zcFq z=^c_?lo{B&f{hVr>tzB*IsyM{py zb}(WravK~Dq-!{Fiv|I4cyNY@!#5Mf#lnNnC)|hse5iCNJhnvWS{1?w70SHu?@Uzp zuJ<`ivtd#J22_x1t+JiyFHu~6M`T`efG}9U#|#cdOmhrv+qv8}Zn=1=%j&$Kxl5#Z zq2U-H@_~&>sk%ov5y?(Y38Qh&c*_lJ~;qf6vIZ2Dy z`YC5BR>uAsI59GuCeI`7cc2$-)-MN+7Nan)LjEYV4n%#tQp;Vylpcb04ih zF0owG;xhZQ+U+kGh+l_@hk-UkLzL8jo58SW^?5PSgJ_6`XrT05e5y(t(S0bUu1Wgs zbQWhsF}Bz;TAnIm^eE;4CFX9FD`7Xvl{orHM0q5ld_$ny?MrRVCfJD9%q!f%VKqeo z0P&{sL*?w%i*cC5-OQ)Hg$WwBl&h@Bv_{h6`eqH34_-2F94LW`b{vKa2dknU`MB0v zYI}Qh%Xe~q-k6prF53G3sfWvSRVNQ64dJRMQJ4f0yHfY)-v+S>H zBWOewSk<87h4ChmN|u!QBWTIwZn`E`z(lpjvCj>Tr(UuCcAC5w6Y{tNrm)*jt3T0;! zC_&84#)m4lC~~mfQ!{LA4XnKl!~iX`Q3wnJ^~w+-#|y(CzlrO{2v_fSx$oiolY{MZ z^61XZ0lAPfyY7BN5_DL5R~&l^*B7|1T`qwX&M#yJ*q&amG+2RcCm)~v9^s?4gja%L z4F|Y}Z;rpdjO~~AaXoAL`?mgMHqlqKV4>watFz!%vr1XMJ%V6G!)0uJtjW_r#ibG6$%m6< z=+#>$hbj56c?p-`8r#H&5zE^=$OUVg57G(DFnFQPvOTIf2K2+B*OW_bhWn_ds-JMu zX+|HF+=<3kfr>4!`hJPEF4f0sR^y@bE5J}3GkS-*UCvhB(>_fuy8wLbpXo)|R$P{O zPIzXBl$i`0pLjRzVkv?12;}w==pHc@cAoh%(7)!mYWxt0haGlYOrJ*Q>FIy}^;BOD zKOY%U|Eo0Hsp|h3^KSFIl(5@q_HN2tTx<%Sp0D-pBFX)A;s?h&79aYcjM_$uXr#?r z6Cj2sD~&r947X8J(>mo$HE1?y3Kw)G6a_P>wOC_q%b{7!M6LltxVwA+l#t{z3U8-` zbdpkCY3w9T6?Kxf+L619T1Rb-wDf5@v?LsIchDsS#-5Ew2I++|avR&IeW@R+wjEJYM|`pQ zjwW9TA9>qOERT=+uwE$-O>^Uui|Qq-UPI3px-BOo_|AP`DvpPBZ#kK}BwgOwjV+)H>e|-M{;{crrL~OY3P%>@5nm-8kAPp#y8YqkAUrina@!sq~LFOHtl0+pY!3be` zO}q7hikvPy_uPav6qVCmQ_)hzWTQ^8Nz35KvPp5r*`bse6NzCn+k};*m()mU9>enm0 zXr3MYfd2OFl`p88&Cv{=jnSMN6?4bpWzZaaoGx@)av4qU+kFx4mv@$kV>DB{mFU`a z`V-lRgDi=iIysO~_R|-C%aq3f!fB z4QMfdfo~(ihN_KgRgm|aq$JhpM<84y$1AR4SV*=5cJf4k!hO#GfM@hbgH;auUDed+=?#b5!Afn02HJ@vsW1a~&hs*>2->LT?Elw$J z*;;7zol%K`<4pn!3s*cDnU_2gvcc(eYvT3Bw;r3h3*t{SImhaS$v2slXTbJF3wvYB>ZCYJ?2|lsl&#B+_6iy z8Y2qkEt0?EZ;S94ik3B|L}TS0JZ`hGZ5QVm7rU8*+7Tc@CVIx`?9f&crrCOYIOM1l zmDd^Ny;FL>pdB-alhPA;y`-KJhL3^JW&8*{yfu8B5im5#qDS2f8E)C!kW6GM_L*J# z1#TZPBgdDdMi)iC_GY8*RaGp3!}#GuZdpk?=ztR2fOKg~lMI)^1#JCy_oTY&3#aGl zabd>@RU`hZ9rwof6(_jM-UbD3I^1J~;ojakThtmqkM7l7ik8a;bw;M<9x2+5y)aP( zgA=#Dcv9(MBtkBKga}Pg9bTe`>6yofuIej*C}-tRwY`_htv$`s`gxyYT9jS7MtrHv z8(NDAC#b+PGK#=j|oK?&pL*VnV-t3z!rGh4Z`d#w0!^DWb`A=~h?16*=1 zxDc#~LJ>y7MquBm<9#i9RVpszFvOufy7fg3{e(I}TajMc?r9F`n{XgA%RhH(;c@`- z<~{utGFQsnbVKB-5^==Y83n;(hJCEqjDU0qMBeD+RAS_Z5u>$R+A;!uDlB)q zVR^mHzgoasJA#>0&4}%M`T-N&TSj6l6>kso%1jfx?Y2H-x@29VzE8^4 zX37OqhOg9b*xf631H;|MB(wAi`@y{pr8MHZB83U4dU(Kz98eQK-B zf3fIw)-S4b#fb`q3I_{Z3Y^R$`E{H2EubQ7i^yF&7aL4+pYEcxmzs4n=@Nj@QD1>i zdLej)QF?qOSeS>KY`=22FU zT}p242e(PfvR>J_U&^hVrz9KzL zfpy5kRR8!wH+1UL5$0Qc-#vz#GJTkvn!s060iI7Tp4W{a+}y0G{6mm7-$4Zh&BoT0 zUyL3Iio?Y=h<$w@low&R*IGI)Fg@(aZezAFa8FrS)Gu%T!F|yX1agw$$>9N4W-T2F z+^wtnk7$3~Ux<|=U3nJTOk<3^*NSDQRt>2@2XfQd&5lWZjyb!Ls-+Iq0A!tBon%Cf zD7w$HZ`Ztw`CYzfl1N_br#tY^v?Oi|@vm4cgxJpxdgFl9=&u{-NXIZCOaH8tutkeu zLY{1EqlglV#)Ml5s5?3df?_zAY^Ut;?WZbvyo9B4#EbZ<=Kk*WU+PYW5YXtMOzGsD zZ|!OtvjEulS=|re|p2kHHFH2J!W&X;Q8U)Y~eb>*GT1(c`+o;pXJ@_yvoY! z^NY=-pac5MIqCo*DL{l!S9BGoo|ZvXZW1taIuIn#3I|xp$%8arioy>zv+wa5o5x77TSLt3F?7?(XLX);Pi^!(CDVkwH8FiyK9jy~xk=`p71;f{k~I(jAl3sOcOvA-c}O+q zUipi*=1sO{R&~xBBdazKf|)=+XPW6kPx-K7xx|_*&Tz4V)}UJ%6&|4( zc`>H}o|CDw|3<_8+#WXW0qC{~2zw04PJ3sh#Vba6YJ&|vTC~5$b}sxHW#tCE^gXwsO zX_qOzDQ^O*m>ZTgbi?xa6?Ot*mz=8pgiET#?L3KRhk3v?cT3|qm{yfKs6h;N+i)XA zYL79jWB9Ju-ER)^23nPNvNa^++7_E2AIdjd3;6FNGNyTk(y-b!+@_XmPAkgcIDB)< z1^E6;ErV?9IG6FQRJIhL4r_H5GIJ>((2JY{T?H{CtN8W4;G7IUowa3FP-F_b&9c)X z{d56x4!m5xpw_xZT-(}Cc8zH_0pSEeqS1~eL(9V3%s^RwdSOZ6G$bh+{X}jE#?c85 ziIoTMJ}+P~1QP|9+mI=3Yc4ofW=Hit6S(O0~efM0Ysb0(w z!lB!nbMS6H?v*}k4ZZlP5EJ`Wcta}7=8pWJ`Pq<)*{x=Zy{(gNv1UMZWR>rvb*j^C zL_a73T~e-P*>umd!mtVBGzY|0r?4YX(BDdC&W?(I!>aoPybd@u$)TVxsBQ;I+y#z&2H!dBNk!cPF*MA}L&{8EHW+HHo{So`U7we{Ec4c^N;y$isp)>)3jiR=JMPseb z3iCdBg+E0(>*ixTovjh(_jtCNefjk4;W+)AaAHKi$-MhS!uQ!`KY50qX!B<}t`lZ0 z1L5nJhf7p*K)RzbtS1Y=?n!>2|H+m?^H)4HRFpr z)+eWC{2xwaE~oi`ucMoVpP1L$WxLsF5bAXk$hEcZ6IiP=oN>sq66@3R)i|6k6gVi{ zsNYwecz(LLw8yQ){AuB~#3dnQat0OS4~dAeMi4RHZo~lQunZe|0xlGaBg#qU!%um; zG{;dkn66UHV+p|z-_6A;YWJWId$%4a#`ygZRKAg4dAlda8M zomOXq$?{NqkXd#rh`Yl0{IVyfa4S40CD%PXo-zYF_KzUWVvI(ULpsuOw%DzJ%t2Z9;S!eYMmFjc52}G9Fh$mFh!^KHl zF{%u8DcDh3GvttHaodNG zDod5+%-apo;2UP;!26+@MD-o%wE2ixZRS@HEx($=s2r9{`Z#?csM>?biQ&ujzsM4q zC6KE?4gs(8{($sK&Mvq`fCnqN4MU!Tbn@($v~#cZ97f3(%!#qdQ$aMsXp52z2>D5*F2x#i?sSU#$6>9wt1P?uKtNBOyskV5 z3pp+=A2_%s1|RcA4w1@4*nX!220nX{{qw*7E_N|M$FjP|FMt^o?~IVZ$ZpIZqVq1; zWc6~Pbv`9gH>$p`ty*wjxJn@Thm?(tWKz$YOD*)N1a*zBxM9Fe-_I&Hu}{GZNu(U| z(f@yP>E8LAX2PlZxSyar{X4ZEo&V*K?tm;`jUOc~(8~K69-1s5;sRF60x4H2%`k`6 zs=Cp^<-F!0r;WaXHj%xV!?XacGp#%`$Eqtk!l#7kji2XC3$}{^rHxJGX`H!NE&siW zI_yih{7nhwYSJ{pC8B@;0~iy)671iQZ!RP{F{d*7Z9Y~Yv8-6DN(pa^xOEG7uT3w* ztM9Yk!6BiY?twWj*N)rVAOD4>KXvBgWfdlR|i&91Tud-U?1(#^aCak+t3P4LV zZ3~)`Tb0cf9idN3C_^zDj9qNaDs$ZC;~0S67G=XqSHN}7OE;x6TF&HNRoIqn5b>>6 zEiz(-6Yf$)gA%Vh^0xf7@C_8ZE>ALc_?Rl$U}*5E!Qr0#a<%JEQ+Gyowwbg>Qe ze4;Q|2?7Rn9xe2?D(Wh5guc?QeI$F&4YQ`N7JlN_rqA4Sf%{M3$3(~Ux?oPW*Vw<7%I$V)YgmwTR` zKQJYtk2}spx)c74=ZlphTti3btArNaoLW;H7f_bB9-B@P*S&VbTQT0DUVK|GR7PB( z;ECW@p952WGWLMvImhDV#}{Q%MJ@JTL*)_f4jgXL?Yz+GYc1$!=AsLKs+jhDdHJz; zib&UW^?8!m<)%zZ(6USx#FW8YN#MPlwQmjF%5t5jvW@mykuqlDPsw%68EWS&7Olu= zjZw6nddNh^nz{3|A<}EAX!M9(HYA?g7T{IE-`|}0CmT_GJ^If$w+~bDG2E&i*Yo2N z6qT6;oT}T>6F+q4oe^ES*GDx2>M3N8vx0eM`EM&Fv*nmG&yumZ(G;5i7g@ci9jpPi z>EXmr-y0y1ihuPPIsN^C*^b_cx6TOAxh-ki6>~fX-f_AtQKY1|z5kdOO(SC=s44ub zagxd+nFG`>D`|84SP+i&bY? z#OQDbi$)g=h&D`MfdMmwwSw&Gz;9#2#)z7gVU2_Hx~Op`KF@N(V=>$7hB`yFh>MxU z80Ux%z^aB(rAyhW57>(JrOow?S=fl6%^R$Nt=-C2O%$y6NZcmpY$W2IOz_?_QQ(P) zl+{p&O<<;p)4M_tkbsTYFZuWu_F*FMVx8eDk^NM~SoR`D`fV=aoVtW!<5S^5R#iPGoC;ge8`i<^(abFF zbL#bNHEaQEV~JW*I2~{SwWt~fBm@pq;)o@hdX`9OCNH ztQ1dF8^#%A32N(N7rt86Hjhxso#uiYwak3j@ub3w)ET7-vT2G+SE*>ZWoR3a*FOIo zISe>rYEe`}`8~IqGgPN63z}3uU3fweq)o)=u@=}4T7g&#MGZs>Y`B6dhtVGLjnxPi zG0(GX`Gi;~)qI3i7MXEuA^Cf(X0fzpiD!GUO=m|?&}&Pz1djMwh#w&CxB!Pt%}Nj4 zA`wSeo)40y5{r!#sRoWLxWs`v=mV8yW+NH-MB?H9S%gmNo#Q{1K>$AS{W@No6zV?( zd@le1Pv12K0KUG@=U2DeyQsH=SZN8W$!AZ>d4D(XVcpr2dEr>2yJWL@Udb}}Oba0MUdix{ zl8{Y4i=s?^lSv!LQ|dk~jLyE#8An6ht$In?x?ma4HuHavij?t-Uf&_*p};lbnLLle z!qr>E-f}8cQs=K|Z}OX68M7;OqWx=%jJyXK5nIl0p|h(zCBnnR?JB~m>A2TS$Oz~S zyG}D6jd4SUxAtmV7PNGC%yHZlo{~Iq2(9^q&b}80$j}67WE5_aTvI%_ROhcAzw<|S zlX(qv^WG6?F3)C5c3;B4vp%_EaQZC-EhW`b<1Xs#Nts%==8Vc|Rxy8g&trE0ng0X6 zT>)e!0ls+yGNk~%X(7zG;So$4QCkd9SQ?RrIM*90`@qe%C^Cn6JJ>bVshSBfQGi{t zg`vC&d^P2-qH(5pV5acFYsfz&LdCIP(3!a-@v#fxoK9LvYYDgJ^I5!bscxxr@7I!b z|99H}|2{dCpFD*d$DqZ?J%Yo_hRWBJfER=N!Y^zk#p2Lz&*{=77aHd2O-8;<#ubvf zD=rp+BX#uXo^+#Pdg;l}Tv>S{!#Uwglub50rO4DwrbXnsZd9_&FPpOHWIJblubDn_ zZbM`)#RI<+UJd(v7}*^Go9w(JMbBTQ-6k7xV(0b~srTC=y_{cuC}%D5{!Oo}8~q{O z87H;Cx)sH%hY@#oT5q=)e%NsRP8(KU$E?VypL3@3EH|=?qWlr1oOD6#T?O;oHmtH~ z8VK;OP(bFnL?P_kS(L~ACva~$EFPEq6k>!QVFjEtRk99plkI^kRzzUaEheyjxSFBJ zcA4eE5u;>m2D8R9D6Jn|GIFQPx7mY7$;CbJpr6T|C8?NN9#iVdsoK*-TIH!Y=j!8D zcXyAyw-+_A`i5=MZn1 zBQoxCTMUog#@_ohDyx!KoaMl*%L3gXhWEhxrMmAoHDlW7orIY zLvS9-7skH<-V4xM!0ZBi4d^F80DJ-f0KTQzOT!w;T}>NPih1nfdorc-j5wdK!_48& zisY%|?*$fSahpbo>8I~wk53fmTg7agUFQ5ADWN;-;^Qkk!hUvZNo4Q)|9R$JKk!;v zYmMU5WnPk$HWaazylO(Ei^?;J|DYT$h!GXFb5H2HFR*tCYu$O6!c z(J^>w#3Xv#XVkT~+!uTRKyXu^M@`=d zHRX6%`OysqmNu3TljX-ks7Ttw&M$L_@>+OStga-NOC`_Y^tMn>C@E1BZ%MR+hfiyZ zudk{LgQhvvf{jx`&QJYkSFnbE#>ACU6%~_%d0q(qPh1mqUG6dPd*pYe^&H=d#(V$j zdi_ayoA1>obsZ!&khGoW^L-?-3d%1d3TUW>AGLZ{k}M|_QMl4p>rQ{2ByJ6!q+sJO zba$QMZ1!0+PUfhf=w=Hd-jYw{YbV5I5x3;%zBO5ON=b$@MdK^ zaue00b1F!Pha$*_M8JF=h~T76ii5&in{6V;}vb@O&I5{53%+^ zs+R@mJvq)TjjxdC^XDEAO_!RuMogF+G~MAN`1~&foAqh2dDpZ3_9DL1zzmlZ zz)WS-;fUud>uVlQGh&_Ml;}Gp@#GP($j>05++4s*GhpvqE_ig$TSm!8U^%c^TfM-& zv@vm>;h{EX`4?mLWZk32;>g0D$q))>$zVdi7*r&35wPGb={utAIyw2R#|q173Vik$2hloh8~qizt=! zyaBwl>4Tl`+cV1Q2q|0(M&fL%S^8#saI7nOK2NhfblE;`YUi>|s0tjK9# zWALf8Nf+bKCt%jTO!((!@E}dNYuv%E7aPj0z?NIFF{0{`P`+#oqU1 zhz3MR#%A@?jRjJR?pm&UW_QK~#CHaWcW2wI4M+A+K%8e`XZ!0a=)c4$f;9;lkeCyh zprdst5m3mChD?!$tjGW>QNY;UfSkfSFrHr$d{=%k$(CucHAmk1ee8v*n6qcSG|&7( z&qO5PZhR%XO=46GzQCPAyAT=p0}cm!gO|YE;A-duduJnRCwGDG{H7NP+^Q z;BDW>s=9m)b>>Q)3X{FtU@VLSb@ZdjAJZQJ+5*)O{CoiI;PJq7T`O+P4fgjV3+W{eaRyJD}5Q zr0(@5w;y*MeMWb|8+YW&x3D%SuICG{wMp#UT|kcCksIGq>f4VwBT=eyf2JbSi6AGQ zxdO`7V-Mh6Utf?(?WCjiy?8T0zZ?IpmVYbd8ZTid;CsHO>17Ct;C|NG{E+AImKf83 z;rQGm7v+6WZR(?CAPn`fv7V2rYF0T}N}M$JhOBuz2KE-ahb)FyRFzrk=b~>C)wo@f zeO3Ha|I4|N(fQ>+4Iys)s`ggq&Pp~9m8k!TlI&j*M_%HNd76CGa~ANg*AO@Y(J7)m z=2?v2*pSH9r$H1;O+fD856=kl83k8x=H~#|T(u5Aw;x4qNxuiDIT!_PIdccI|Dru- z@qpTj>q1(_GhW11^h6H$FZif)kIPQ%mKep`PNl{iO2#fKoK??5W-L2st=$8{dU23kKMrh9D>s}glf z7O(K1j&li#VPc9^@?qOjgM>-99jH}U4ACOtQHyH$Ac9bw2udl-Cs0WQ+)TnMKFLXp zLa{?j-{XT66;ca!#|VO= zNj0VBjVs#vKnh(1j&xe+Duk^_%6vW5Q?B{vCoDl4T{2CXmNRtU7b{y^7@62Q^{|NQ z2yFj9*g>`X{(U}5g^;Ol^w}aI@M22akKt-cl0J))axQ}Zeek5XOZ$6U8AF6?1%H~u z!9mn~`Z-)GN-tuX!;6=5n-p{Sa*BnDWsabGRjT8eBh>O7was%xd6^o1?HsX&Zlhsa zmDHVYPnjeAh^==cb7b~xQX6uPJXs}RRn1YP$A)a$C1rmDqsstU$$=GQ>c8Rc){>!_ zR$lb^eJ+A1KB&6rkh_vg%YDw#h{%KLi-tL$TttJ_6TShtbt1x;^0^Plb>(QpkYTQ% NrRb!U-}C`m2>`4kf5`v< literal 0 HcmV?d00001 diff --git a/components/application-mgt/org.wso2.carbon.device.application.mgt.publisher.ui/src/main/resources/publisher/public/index.html b/components/application-mgt/org.wso2.carbon.device.application.mgt.publisher.ui/src/main/resources/publisher/public/index.html index 3d41cf4be5..830f6ae31f 100644 --- a/components/application-mgt/org.wso2.carbon.device.application.mgt.publisher.ui/src/main/resources/publisher/public/index.html +++ b/components/application-mgt/org.wso2.carbon.device.application.mgt.publisher.ui/src/main/resources/publisher/public/index.html @@ -23,6 +23,7 @@ + d4I_#( zr!YKI452sL{G2tp$dC{vb?d%Np_+zyvR31DGLbh~<@#`;Ev)L_acQhg%OK8W7(dls zu2l;I323YwuYtOV=*0*l6q~Y~90&8(oPO>qjvDdg>Exblt^2^Rg;j}a{Gw+x6&)zU zZ*sB7*f2rN$^p5XDdgHTZ(WNx3@eVRn8EJ#+9G~6qQ>nE&R)pNllsaFJdy(`6;E)T zqA%*i`Dg7qX+_Qj$jlVC8@}?JSs94`lPL3lrO}Sj%3H-$-k2_^;;F>ymZ5^ zTzUrpxg-lVWgb|t85sfqE?@$;Gp6^~V!nPY2>E*dBKE%##U?(>4}X7P8#OLkL9Xzj zFXaMEoqer)i^vOaYy%e3q`>f7VQO9bX&Sv?eQ5N+>gS8~KS_Kgi9Lu{eGV!z&X?K3zv(KV8a`-gkR!Y|MM(+5Vvp z@E|W*8|%KIAnDcB9O`Wlki81u+LRvByNR0J*$~hbPuSsmbwo%6wTqIIn@#DTRSy5P zh(c$FEl@O*$mBjJ7sMSCIan@IJ|#cj+5EkC>xLBE0{krgdu=dPJid8F+?i>xZ%DS$ zc$lBRdN9`3-LgK{vJC%xuq_%85@HG%;g(mf==0rpEhQj$uY9(#_7^kWA5!~eLmNKJ z`;U0Mx>EZLOFI=%6VvHac2w+;ylwwrV8hwdh))> ztQe=aHIJ)mOCqHdae@95XYY53jlLF)6gF3!+nq9ykm1=)osWMhs`0stLS%?X9(2T` z{b>^jn8}+7CTk+DT*j?PC46;!>3gK+*&!>8U$4ptl=GCz&<4;UaT$pw=)PaQs^x^6 zcECAPLbXQ&)a_wJ=0W)7l0lNNv~M;yw|hZ!beWcnXR(sN79&(Qa0MD0(%?a~XuhP> z!*X5q=x~QeWk-aB_Qc^lDRX4&TaPP2n#fJ`J5Pygsa&S7qH;Ycg8C)lS)<(IYq%1V z>2l0wZt&q1PV?R8=S%WbO%D^iY{o{OrSmu{3?1y$D|5Fm) ziAemg8rPxZm!R}QEAbqk20><0H5Cc{U5!BU`c99G1uQTv$MdJ?tMkU^xCG*_qMelr z9O^$_ot%u>+-#?I*~#bA_B^c2df`v*EtGI3v;VE2{v_`6$Gt~rc0;UlP2SCeeNVkI zmrBaULHWSp(&5r?D9O_kI%4d&mZI!Dhv$w6IT73{duasJeyR$mIV4D+mpo literal 0 HcmV?d00001 diff --git a/components/application-mgt/org.wso2.carbon.device.application.mgt.publisher.ui/src/main/resources/publisher/src/components/AppPublisherBase/BaseLayout.jsx b/components/application-mgt/org.wso2.carbon.device.application.mgt.publisher.ui/src/main/resources/publisher/src/components/AppPublisherBase/BaseLayout.jsx index 74c39ba66c..73cc87bd9d 100644 --- a/components/application-mgt/org.wso2.carbon.device.application.mgt.publisher.ui/src/main/resources/publisher/src/components/AppPublisherBase/BaseLayout.jsx +++ b/components/application-mgt/org.wso2.carbon.device.application.mgt.publisher.ui/src/main/resources/publisher/src/components/AppPublisherBase/BaseLayout.jsx @@ -19,6 +19,7 @@ import PropTypes from 'prop-types'; import React, {Component} from 'react'; import {withRouter} from 'react-router-dom'; +import Axios from 'axios'; import AuthHandler from "../../api/authHandler"; import {Button, Col, Container, Input, Row,} from 'reactstrap'; import ApplicationCreate from '../Application/Create/ApplicationCreate'; @@ -42,9 +43,20 @@ class BaseLayout extends Component { notifications: 0, user: 'Admin', openModal: false, - currentPage: "Applications" + currentPage: "Applications", + logo: {} }; + } + componentWillMount() { + Axios.get("/images/logo.png", {responseType: 'arraybuffer'}).then( + response => { + let image = "data:image/jpeg;base64," + new Buffer(response.data, 'binary').toString('base64'); + this.setState({logo: image}); + } + ).catch(err => { + console.log(err); + }); } handleApplicationClick() { @@ -84,25 +96,26 @@ class BaseLayout extends Component {

-
From 7f05b1820c48280cf146d3b53ead58a14fd6c89b Mon Sep 17 00:00:00 2001 From: Menaka Jayawardena Date: Thu, 5 Oct 2017 03:44:59 +0530 Subject: [PATCH 16/32] Modified application view with better styling. --- .../Application/View/ApplicationView.jsx | 37 +++++++++++-------- 1 file changed, 21 insertions(+), 16 deletions(-) diff --git a/components/application-mgt/org.wso2.carbon.device.application.mgt.publisher.ui/src/main/resources/publisher/src/components/Application/View/ApplicationView.jsx b/components/application-mgt/org.wso2.carbon.device.application.mgt.publisher.ui/src/main/resources/publisher/src/components/Application/View/ApplicationView.jsx index d421901f2d..d93a90ee2c 100644 --- a/components/application-mgt/org.wso2.carbon.device.application.mgt.publisher.ui/src/main/resources/publisher/src/components/Application/View/ApplicationView.jsx +++ b/components/application-mgt/org.wso2.carbon.device.application.mgt.publisher.ui/src/main/resources/publisher/src/components/Application/View/ApplicationView.jsx @@ -58,14 +58,19 @@ class ApplicationView extends Component { - {app.name} +

{app.name}

- Last updated on {app.modifiedAt} + Last updated on {app.modifiedAt} @@ -73,7 +78,7 @@ class ApplicationView extends Component {
- 2k Installs + 2k Installs @@ -84,7 +89,7 @@ class ApplicationView extends Component { -

View in Store

+

View in Store

@@ -92,42 +97,42 @@ class ApplicationView extends Component {
- +

: - +

-

{app.description}

+

{app.description}

- +

: - +

-

[list of tags...]

+

[list of tags...]

- +

: - +

-

Production

+

Production

- +

: - +

-

v1.0

+

v1.0

From ed2af13836a314cc157b84bb3e6452d5ead69c34 Mon Sep 17 00:00:00 2001 From: Menaka Jayawardena Date: Thu, 5 Oct 2017 03:45:31 +0530 Subject: [PATCH 17/32] Added custom application listing table. --- .../Application/ApplicationListing.jsx | 104 ++++++++---------- 1 file changed, 43 insertions(+), 61 deletions(-) diff --git a/components/application-mgt/org.wso2.carbon.device.application.mgt.publisher.ui/src/main/resources/publisher/src/components/Application/ApplicationListing.jsx b/components/application-mgt/org.wso2.carbon.device.application.mgt.publisher.ui/src/main/resources/publisher/src/components/Application/ApplicationListing.jsx index 3d05b1b889..c89ad7b10b 100644 --- a/components/application-mgt/org.wso2.carbon.device.application.mgt.publisher.ui/src/main/resources/publisher/src/components/Application/ApplicationListing.jsx +++ b/components/application-mgt/org.wso2.carbon.device.application.mgt.publisher.ui/src/main/resources/publisher/src/components/Application/ApplicationListing.jsx @@ -18,7 +18,7 @@ import React, {Component} from 'react'; import {withRouter} from 'react-router-dom'; -import {Button, Col, Row, Table} from 'reactstrap'; +import {Button, Col, Row} from 'reactstrap'; import Drawer from '../UIComponents/Drawer/Drawer'; import ApplicationView from './View/ApplicationView'; import {FormattedMessage} from 'react-intl'; @@ -96,6 +96,7 @@ class ApplicationListing extends Component { data_id: "applicationName", data_type: "string", sortable: true, + locale: "Application.name", label: "Application Name", sort: this.sortData }, @@ -103,18 +104,21 @@ class ApplicationListing extends Component { data_id: "platform", data_type: "image_array", sortable: false, + locale: "Platform", label: "Platform" }, { data_id: "category", data_type: "string", sortable: false, + locale: "Category", label: "Category" }, { data_id: "status", data_type: "string", sortable: false, + locale: "Status", label: "Status" }, { @@ -125,14 +129,12 @@ class ApplicationListing extends Component { } ]; - componentWillMount() { let getApps = ApplicationMgtApi.getApplications(); getApps.then(response => { - console.log(response.data.applications); + console.log(response); this.setState({searchedApplications: response.data.applications}); - // console.log(this.setState({data: response.data}), console.log(this.state)); }).catch(err => { AuthHandler.unauthorizedErrorHandler(err); }); @@ -214,66 +216,46 @@ class ApplicationListing extends Component { } render() { + //TODO: Move this to a data table component. return ( -
- -
-
- -
- - - -
-
{ @@ -228,25 +245,24 @@ class ApplicationListing extends Component {
+
{/* TODO: Move this styles to css. */} {application.applicationName}{application.category}{application.platform}{application.status}{application.name}{application.category.name}{application.platform.name}{application.currentLifecycle.lifecycleState.name} -
- - - - {/* TODO: Remove console.log and add sort method. */} - - - - - - - - - {this.state.searchedApplications.map( - (application) => { - return ( - this.onRowClick(application.uuid)}> - - - - - - - - ) - } - )} - -
{ - console.log("sort") - }}> - -
- {/* TODO: Move this styles to css. */} - - {application.name}{application.category.name}{application.platform.name}{application.currentLifecycle.lifecycleState.name} - -
- + + {this.headers.map(header => { + if (header.data_id === "applicationName") { + return ( + ) + } else if (header.data_id === "image") { + return ({header.label}) + } + return () + })} +
+ {this.state.searchedApplications.map(application => { + return ( + { + this.onRowClick(application.uuid) + }}> + + + + {application.name} + {application.platform.name} + {application.category.name} + {application.currentLifecycle.lifecycleState.name} + + + + + + ) + })} From 8b310786b921272d7276738cdf7ebb622a41caf2 Mon Sep 17 00:00:00 2001 From: Menaka Jayawardena Date: Thu, 5 Oct 2017 05:03:50 +0530 Subject: [PATCH 18/32] Fixed axios not defined issue. --- .../src/main/resources/publisher/src/index.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/components/application-mgt/org.wso2.carbon.device.application.mgt.publisher.ui/src/main/resources/publisher/src/index.js b/components/application-mgt/org.wso2.carbon.device.application.mgt.publisher.ui/src/main/resources/publisher/src/index.js index 7f7380c62b..95b8c1eb60 100644 --- a/components/application-mgt/org.wso2.carbon.device.application.mgt.publisher.ui/src/main/resources/publisher/src/index.js +++ b/components/application-mgt/org.wso2.carbon.device.application.mgt.publisher.ui/src/main/resources/publisher/src/index.js @@ -45,7 +45,7 @@ function loadPublisher() { registerServiceWorker(); }).catch(error => { addLocaleData(require('react-intl/locale-data/en')); - let defaultLocale = axios.create({ + let defaultLocale = Axios.create({ baseURL: Configuration.hostConstants.baseURL + "/" + Configuration.hostConstants.appContext + "/locales" + Constants.defaultLocale + ".json" }).get(); From da51c4b270749d1cd97f12de2df620709c105be5 Mon Sep 17 00:00:00 2001 From: Menaka Jayawardena Date: Thu, 5 Oct 2017 17:49:04 +0530 Subject: [PATCH 19/32] Fixed table rendering issue. --- .../src/components/Application/ApplicationListing.jsx | 4 ++-- .../Application/Edit/GenenralInfo/GeneralInfo.jsx | 7 +------ 2 files changed, 3 insertions(+), 8 deletions(-) diff --git a/components/application-mgt/org.wso2.carbon.device.application.mgt.publisher.ui/src/main/resources/publisher/src/components/Application/ApplicationListing.jsx b/components/application-mgt/org.wso2.carbon.device.application.mgt.publisher.ui/src/main/resources/publisher/src/components/Application/ApplicationListing.jsx index c89ad7b10b..a3e5d3571c 100644 --- a/components/application-mgt/org.wso2.carbon.device.application.mgt.publisher.ui/src/main/resources/publisher/src/components/Application/ApplicationListing.jsx +++ b/components/application-mgt/org.wso2.carbon.device.application.mgt.publisher.ui/src/main/resources/publisher/src/components/Application/ApplicationListing.jsx @@ -223,11 +223,11 @@ class ApplicationListing extends Component { {this.headers.map(header => { if (header.data_id === "applicationName") { return ( - ) + {header.label}) } else if (header.data_id === "image") { return ({header.label}) } - return () + return ({header.label}) })}
diff --git a/components/application-mgt/org.wso2.carbon.device.application.mgt.publisher.ui/src/main/resources/publisher/src/components/Application/Edit/GenenralInfo/GeneralInfo.jsx b/components/application-mgt/org.wso2.carbon.device.application.mgt.publisher.ui/src/main/resources/publisher/src/components/Application/Edit/GenenralInfo/GeneralInfo.jsx index 3a1188a6f9..8e252a01d8 100644 --- a/components/application-mgt/org.wso2.carbon.device.application.mgt.publisher.ui/src/main/resources/publisher/src/components/Application/Edit/GenenralInfo/GeneralInfo.jsx +++ b/components/application-mgt/org.wso2.carbon.device.application.mgt.publisher.ui/src/main/resources/publisher/src/components/Application/Edit/GenenralInfo/GeneralInfo.jsx @@ -44,12 +44,7 @@ class GeneralInfo extends Component { - + - - - + + +
); diff --git a/components/application-mgt/org.wso2.carbon.device.application.mgt.publisher.ui/src/main/resources/publisher/src/components/Application/Create/CreateSteps/Step3.jsx b/components/application-mgt/org.wso2.carbon.device.application.mgt.publisher.ui/src/main/resources/publisher/src/components/Application/Create/CreateSteps/Step3.jsx index 76384d2214..76cce9508b 100644 --- a/components/application-mgt/org.wso2.carbon.device.application.mgt.publisher.ui/src/main/resources/publisher/src/components/Application/Create/CreateSteps/Step3.jsx +++ b/components/application-mgt/org.wso2.carbon.device.application.mgt.publisher.ui/src/main/resources/publisher/src/components/Application/Create/CreateSteps/Step3.jsx @@ -225,9 +225,9 @@ class Step3 extends Component {
- - - + + + ); diff --git a/components/application-mgt/org.wso2.carbon.device.application.mgt.publisher.ui/src/main/resources/publisher/src/components/Application/Create/CreateSteps/Step4.jsx b/components/application-mgt/org.wso2.carbon.device.application.mgt.publisher.ui/src/main/resources/publisher/src/components/Application/Create/CreateSteps/Step4.jsx index 318a7116b0..9672c98986 100644 --- a/components/application-mgt/org.wso2.carbon.device.application.mgt.publisher.ui/src/main/resources/publisher/src/components/Application/Create/CreateSteps/Step4.jsx +++ b/components/application-mgt/org.wso2.carbon.device.application.mgt.publisher.ui/src/main/resources/publisher/src/components/Application/Create/CreateSteps/Step4.jsx @@ -147,9 +147,9 @@ class Step4 extends Component { - - - + + + ); diff --git a/components/application-mgt/org.wso2.carbon.device.application.mgt.publisher.ui/src/main/resources/publisher/src/components/Application/Edit/GenenralInfo/GeneralInfo.jsx b/components/application-mgt/org.wso2.carbon.device.application.mgt.publisher.ui/src/main/resources/publisher/src/components/Application/Edit/GenenralInfo/GeneralInfo.jsx index 8e252a01d8..521f91ef1b 100644 --- a/components/application-mgt/org.wso2.carbon.device.application.mgt.publisher.ui/src/main/resources/publisher/src/components/Application/Edit/GenenralInfo/GeneralInfo.jsx +++ b/components/application-mgt/org.wso2.carbon.device.application.mgt.publisher.ui/src/main/resources/publisher/src/components/Application/Edit/GenenralInfo/GeneralInfo.jsx @@ -17,16 +17,24 @@ */ import React, {Component} from 'react'; -import {Badge, Button, FormGroup, Input, Label, Row} from 'reactstrap'; +import {Button, FormGroup, Input, Label, Row} from 'reactstrap'; import Dropzone from 'react-dropzone'; import {FormattedMessage} from 'react-intl'; +import Chip from "../../../UIComponents/Chip/Chip"; class GeneralInfo extends Component { constructor() { super(); + this.onTextFieldChange = this.onTextFieldChange.bind(this); + this.addTags = this.addTags.bind(this); + this.handleRequestDelete = this.handleRequestDelete.bind(this); + this.handleTagChange = this.handleTagChange.bind(this); this.state = { defValue: "", + title: "", + description: "", + shortDescription: "", tags: [], screenshots: [], icon: [], @@ -34,6 +42,62 @@ class GeneralInfo extends Component { } } + /** + * Set text field values to state. + * */ + onTextFieldChange(event) { + let field = event.target.name; + console.log(event.target.value); + switch (field) { + case "appName": { + this.setState({name: event.target.value}); + break; + } + case "appDescription": { + this.setState({description: event.target.value}); + break; + } + case "appShortDescription": { + this.setState({shortDescription: event.target.value}); + } + } + }; + + /** + * Create a tag on Enter key press and set it to the state. + * Clears the tags text field. + * Chip gets two parameters: Key and value. + * */ + addTags(event) { + let tags = this.state.tags; + if (event.charCode === 13) { + event.preventDefault(); + tags.push({key: Math.floor(Math.random() * 1000), value: event.target.value}); + this.setState({tags, defValue: ""}, console.log(tags)); + } + } + + /** + * Set the value for tag. + * */ + handleTagChange(event) { + let defaultValue = this.state.defValue; + defaultValue = event.target.value; + this.setState({defValue: defaultValue}) + } + + /** + * Handles Chip delete function. + * Removes the tag from state.tags + * */ + handleRequestDelete(key) { + let chipData = this.state.tags; + const chipToDelete = chipData.map((chip) => chip.key).indexOf(key); + chipData.splice(chipToDelete, 1); + this.setState({tags: chipData}); + }; + + //TODO: Remove Console logs. render() { return ( @@ -44,13 +108,31 @@ class GeneralInfo extends Component { - + + + + + - + - - + + diff --git a/components/application-mgt/org.wso2.carbon.device.application.mgt.publisher.ui/src/main/resources/publisher/src/components/Platform/PlatformListing.jsx b/components/application-mgt/org.wso2.carbon.device.application.mgt.publisher.ui/src/main/resources/publisher/src/components/Platform/PlatformListing.jsx index 147677a3c1..94f4c10619 100644 --- a/components/application-mgt/org.wso2.carbon.device.application.mgt.publisher.ui/src/main/resources/publisher/src/components/Platform/PlatformListing.jsx +++ b/components/application-mgt/org.wso2.carbon.device.application.mgt.publisher.ui/src/main/resources/publisher/src/components/Platform/PlatformListing.jsx @@ -54,7 +54,7 @@ class PlatformListing extends Component {
-
From 75427e1021bbd7131f650bc1b5b533b7234eb623 Mon Sep 17 00:00:00 2001 From: Menaka Jayawardena Date: Fri, 6 Oct 2017 02:56:40 +0530 Subject: [PATCH 23/32] Added user name to the header. --- .../AppPublisherBase/BaseLayout.jsx | 59 +++++++++++-------- 1 file changed, 36 insertions(+), 23 deletions(-) diff --git a/components/application-mgt/org.wso2.carbon.device.application.mgt.publisher.ui/src/main/resources/publisher/src/components/AppPublisherBase/BaseLayout.jsx b/components/application-mgt/org.wso2.carbon.device.application.mgt.publisher.ui/src/main/resources/publisher/src/components/AppPublisherBase/BaseLayout.jsx index e0c8b905f1..eb64ab434a 100644 --- a/components/application-mgt/org.wso2.carbon.device.application.mgt.publisher.ui/src/main/resources/publisher/src/components/AppPublisherBase/BaseLayout.jsx +++ b/components/application-mgt/org.wso2.carbon.device.application.mgt.publisher.ui/src/main/resources/publisher/src/components/AppPublisherBase/BaseLayout.jsx @@ -19,7 +19,6 @@ import PropTypes from 'prop-types'; import React, {Component} from 'react'; import {withRouter} from 'react-router-dom'; -import Axios from 'axios'; import AuthHandler from "../../api/authHandler"; import {Button, Col, Container, Input, Row,} from 'reactstrap'; import ApplicationCreate from '../Application/Create/ApplicationCreate'; @@ -50,7 +49,7 @@ class BaseLayout extends Component { } componentWillMount() { - + this.setState({user: this.props.user}); } handleApplicationClick() { @@ -86,29 +85,43 @@ class BaseLayout extends Component { } render() { + const userName = this.state.user._userName[0]; return (
-
- -
- - + +
); diff --git a/components/application-mgt/org.wso2.carbon.device.application.mgt.publisher.ui/src/main/resources/publisher/src/components/Application/Create/CreateSteps/Step2.jsx b/components/application-mgt/org.wso2.carbon.device.application.mgt.publisher.ui/src/main/resources/publisher/src/components/Application/Create/CreateSteps/Step2.jsx index f25c0a17c8..f40ca3c630 100644 --- a/components/application-mgt/org.wso2.carbon.device.application.mgt.publisher.ui/src/main/resources/publisher/src/components/Application/Create/CreateSteps/Step2.jsx +++ b/components/application-mgt/org.wso2.carbon.device.application.mgt.publisher.ui/src/main/resources/publisher/src/components/Application/Create/CreateSteps/Step2.jsx @@ -173,9 +173,15 @@ class Step2 extends Component { {this.state.errors.platform} - - - + + +
); diff --git a/components/application-mgt/org.wso2.carbon.device.application.mgt.publisher.ui/src/main/resources/publisher/src/components/Application/Create/CreateSteps/Step3.jsx b/components/application-mgt/org.wso2.carbon.device.application.mgt.publisher.ui/src/main/resources/publisher/src/components/Application/Create/CreateSteps/Step3.jsx index 76cce9508b..27c9b6fb1e 100644 --- a/components/application-mgt/org.wso2.carbon.device.application.mgt.publisher.ui/src/main/resources/publisher/src/components/Application/Create/CreateSteps/Step3.jsx +++ b/components/application-mgt/org.wso2.carbon.device.application.mgt.publisher.ui/src/main/resources/publisher/src/components/Application/Create/CreateSteps/Step3.jsx @@ -225,9 +225,15 @@ class Step3 extends Component { - - - + + + ); diff --git a/components/application-mgt/org.wso2.carbon.device.application.mgt.publisher.ui/src/main/resources/publisher/src/components/Application/Create/CreateSteps/Step4.jsx b/components/application-mgt/org.wso2.carbon.device.application.mgt.publisher.ui/src/main/resources/publisher/src/components/Application/Create/CreateSteps/Step4.jsx index 9672c98986..9cb1b3432c 100644 --- a/components/application-mgt/org.wso2.carbon.device.application.mgt.publisher.ui/src/main/resources/publisher/src/components/Application/Create/CreateSteps/Step4.jsx +++ b/components/application-mgt/org.wso2.carbon.device.application.mgt.publisher.ui/src/main/resources/publisher/src/components/Application/Create/CreateSteps/Step4.jsx @@ -20,6 +20,7 @@ import PropTypes from 'prop-types'; import React, {Component} from 'react'; import {Button, Collapse, FormGroup, FormText, Input, Label, ModalFooter} from 'reactstrap'; import Switch from '../../../UIComponents/Switch/Switch' +import {FormattedMessage} from 'react-intl'; /** * The Third step of application create wizard. {Application Release Step} @@ -96,7 +97,7 @@ class Step4 extends Component {
@@ -111,7 +112,7 @@ class Step4 extends Component {
- Info: + Enabling this will create a release for the current Application. To upload the Application, please visit to the Release management section of Application Edit View. @@ -120,7 +121,9 @@ class Step4 extends Component { {/*If toggle is true, the release form will be shown.*/} - + - +
- - - + + + ); diff --git a/components/application-mgt/org.wso2.carbon.device.application.mgt.publisher.ui/src/main/resources/publisher/src/components/Application/Edit/PackageManager.jsx b/components/application-mgt/org.wso2.carbon.device.application.mgt.publisher.ui/src/main/resources/publisher/src/components/Application/Edit/PackageManager.jsx index a08431332e..6da80be3c9 100644 --- a/components/application-mgt/org.wso2.carbon.device.application.mgt.publisher.ui/src/main/resources/publisher/src/components/Application/Edit/PackageManager.jsx +++ b/components/application-mgt/org.wso2.carbon.device.application.mgt.publisher.ui/src/main/resources/publisher/src/components/Application/Edit/PackageManager.jsx @@ -16,7 +16,6 @@ * under the License. */ -import PropTypes from 'prop-types'; import React, {Component} from 'react'; class PackageManager extends Component { @@ -26,7 +25,7 @@ class PackageManager extends Component { } render() { - return( + return (
diff --git a/components/application-mgt/org.wso2.carbon.device.application.mgt.publisher.ui/src/main/resources/publisher/src/components/Application/Release/Create/CreateRelease.jsx b/components/application-mgt/org.wso2.carbon.device.application.mgt.publisher.ui/src/main/resources/publisher/src/components/Application/Release/Create/CreateRelease.jsx index 57fc546609..b1d203f0ee 100644 --- a/components/application-mgt/org.wso2.carbon.device.application.mgt.publisher.ui/src/main/resources/publisher/src/components/Application/Release/Create/CreateRelease.jsx +++ b/components/application-mgt/org.wso2.carbon.device.application.mgt.publisher.ui/src/main/resources/publisher/src/components/Application/Release/Create/CreateRelease.jsx @@ -92,7 +92,9 @@ class CreateRelease extends Component {

- +
diff --git a/components/application-mgt/org.wso2.carbon.device.application.mgt.publisher.ui/src/main/resources/publisher/src/components/Application/Release/Create/UploadPackage.jsx b/components/application-mgt/org.wso2.carbon.device.application.mgt.publisher.ui/src/main/resources/publisher/src/components/Application/Release/Create/UploadPackage.jsx index e41bf5a634..8ffe7bdfdb 100644 --- a/components/application-mgt/org.wso2.carbon.device.application.mgt.publisher.ui/src/main/resources/publisher/src/components/Application/Release/Create/UploadPackage.jsx +++ b/components/application-mgt/org.wso2.carbon.device.application.mgt.publisher.ui/src/main/resources/publisher/src/components/Application/Release/Create/UploadPackage.jsx @@ -41,7 +41,8 @@ class UploadPackage extends Component { {"<-"} - {selectedChannel} + {selectedChannel} diff --git a/components/application-mgt/org.wso2.carbon.device.application.mgt.publisher.ui/src/main/resources/publisher/src/components/Application/View/ApplicationView.jsx b/components/application-mgt/org.wso2.carbon.device.application.mgt.publisher.ui/src/main/resources/publisher/src/components/Application/View/ApplicationView.jsx index d93a90ee2c..a2817d4cd3 100644 --- a/components/application-mgt/org.wso2.carbon.device.application.mgt.publisher.ui/src/main/resources/publisher/src/components/Application/View/ApplicationView.jsx +++ b/components/application-mgt/org.wso2.carbon.device.application.mgt.publisher.ui/src/main/resources/publisher/src/components/Application/View/ApplicationView.jsx @@ -70,7 +70,9 @@ class ApplicationView extends Component {

{app.name}

- Last updated on {app.modifiedAt} + + {app.modifiedAt} @@ -78,7 +80,9 @@ class ApplicationView extends Component {
- 2k Installs + + 2k + @@ -89,7 +93,11 @@ class ApplicationView extends Component { -

View in Store

+

+ + + +

diff --git a/components/application-mgt/org.wso2.carbon.device.application.mgt.publisher.ui/src/main/resources/publisher/src/components/Platform/Platform.jsx b/components/application-mgt/org.wso2.carbon.device.application.mgt.publisher.ui/src/main/resources/publisher/src/components/Platform/Platform.jsx index fc1ada106f..44479434ae 100644 --- a/components/application-mgt/org.wso2.carbon.device.application.mgt.publisher.ui/src/main/resources/publisher/src/components/Platform/Platform.jsx +++ b/components/application-mgt/org.wso2.carbon.device.application.mgt.publisher.ui/src/main/resources/publisher/src/components/Platform/Platform.jsx @@ -18,6 +18,7 @@ import React, {Component} from 'react'; import {Button, Col, Collapse, Row} from "reactstrap"; +import {FormattedMessage} from "react-intl"; /** * Platform component. @@ -57,8 +58,13 @@ class Platform extends Component {
- - + + @@ -71,23 +77,36 @@ class Platform extends Component {
-

Description

+

+ +

{platform.description}

-

File Based

+

+ +

-

{platform.fileBased ? "Yes" : "No"}

+

{platform.fileBased ? + + : }

-

Tags

+

+ +

- {platform.tags.length > 0 ? platform.tags : "No Platform Tags"} + {platform.tags.length > 0 ? + platform.tags : + + }

diff --git a/components/application-mgt/org.wso2.carbon.device.application.mgt.publisher.ui/src/main/resources/publisher/src/components/Platform/PlatformCreate.jsx b/components/application-mgt/org.wso2.carbon.device.application.mgt.publisher.ui/src/main/resources/publisher/src/components/Platform/PlatformCreate.jsx index 28460613f3..984cb05d66 100644 --- a/components/application-mgt/org.wso2.carbon.device.application.mgt.publisher.ui/src/main/resources/publisher/src/components/Platform/PlatformCreate.jsx +++ b/components/application-mgt/org.wso2.carbon.device.application.mgt.publisher.ui/src/main/resources/publisher/src/components/Platform/PlatformCreate.jsx @@ -16,7 +16,8 @@ * under the License. */ import React, {Component} from 'react'; -import {Button, FormGroup, Label, Modal, ModalBody, ModalFooter, ModalHeader, Input} from "reactstrap"; +import {Button, FormGroup, Input, Label, Modal, ModalBody, ModalFooter, ModalHeader} from "reactstrap"; +import {FormattedMessage} from "react-intl"; /** * Platform view component. @@ -48,20 +49,30 @@ class PlatformCreate extends Component { return (
- Create Platform + + + - + - + - - + +
From 87aaeca85f25d3aed406d85cd6b77efbbdcbe99b Mon Sep 17 00:00:00 2001 From: Menaka Jayawardena Date: Fri, 6 Oct 2017 12:44:18 +0530 Subject: [PATCH 31/32] Restored absolute path in index.html. --- .../src/main/resources/publisher/public/index.html | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/components/application-mgt/org.wso2.carbon.device.application.mgt.publisher.ui/src/main/resources/publisher/public/index.html b/components/application-mgt/org.wso2.carbon.device.application.mgt.publisher.ui/src/main/resources/publisher/public/index.html index 830f6ae31f..800a6d80cc 100644 --- a/components/application-mgt/org.wso2.carbon.device.application.mgt.publisher.ui/src/main/resources/publisher/public/index.html +++ b/components/application-mgt/org.wso2.carbon.device.application.mgt.publisher.ui/src/main/resources/publisher/public/index.html @@ -21,15 +21,15 @@ - - + + - - + +