From 5e1346731561fd0612cf76ec7fe4e34cf32ebb00 Mon Sep 17 00:00:00 2001 From: Igor Sychev Date: Fri, 13 Oct 2017 17:55:54 +0100 Subject: [PATCH 01/30] no more dynamics as a return types from controllers --- .../Application/Queries/IOrderQueries.cs | 6 +-- .../Application/Queries/OrderQueries.cs | 52 +++++++++---------- .../Application/Queries/OrderViewModel.cs | 41 +++++++++++++++ .../Controllers/OrdersController.cs | 4 +- 4 files changed, 73 insertions(+), 30 deletions(-) create mode 100644 src/Services/Ordering/Ordering.API/Application/Queries/OrderViewModel.cs diff --git a/src/Services/Ordering/Ordering.API/Application/Queries/IOrderQueries.cs b/src/Services/Ordering/Ordering.API/Application/Queries/IOrderQueries.cs index 253b01e9c..10aaf3415 100644 --- a/src/Services/Ordering/Ordering.API/Application/Queries/IOrderQueries.cs +++ b/src/Services/Ordering/Ordering.API/Application/Queries/IOrderQueries.cs @@ -5,10 +5,10 @@ public interface IOrderQueries { - Task GetOrderAsync(int id); + Task GetOrderAsync(int id); - Task> GetOrdersAsync(); + Task> GetOrdersAsync(); - Task> GetCardTypesAsync(); + Task> GetCardTypesAsync(); } } diff --git a/src/Services/Ordering/Ordering.API/Application/Queries/OrderQueries.cs b/src/Services/Ordering/Ordering.API/Application/Queries/OrderQueries.cs index a57c61334..59cc8a823 100644 --- a/src/Services/Ordering/Ordering.API/Application/Queries/OrderQueries.cs +++ b/src/Services/Ordering/Ordering.API/Application/Queries/OrderQueries.cs @@ -1,11 +1,9 @@ namespace Microsoft.eShopOnContainers.Services.Ordering.API.Application.Queries { using Dapper; - using Microsoft.Extensions.Configuration; using System.Data.SqlClient; using System.Threading.Tasks; using System; - using System.Dynamic; using System.Collections.Generic; public class OrderQueries @@ -19,7 +17,7 @@ } - public async Task GetOrderAsync(int id) + public async Task GetOrderAsync(int id) { using (var connection = new SqlConnection(_connectionString)) { @@ -44,13 +42,13 @@ } } - public async Task> GetOrdersAsync() + public async Task> GetOrdersAsync() { using (var connection = new SqlConnection(_connectionString)) { connection.Open(); - return await connection.QueryAsync(@"SELECT o.[Id] as ordernumber,o.[OrderDate] as [date],os.[Name] as [status],SUM(oi.units*oi.unitprice) as total + return await connection.QueryAsync(@"SELECT o.[Id] as ordernumber,o.[OrderDate] as [date],os.[Name] as [status],SUM(oi.units*oi.unitprice) as total FROM [ordering].[Orders] o LEFT JOIN[ordering].[orderitems] oi ON o.Id = oi.orderid LEFT JOIN[ordering].[orderstatus] os on o.OrderStatusId = os.Id @@ -59,39 +57,41 @@ } } - public async Task> GetCardTypesAsync() + public async Task> GetCardTypesAsync() { using (var connection = new SqlConnection(_connectionString)) { connection.Open(); - return await connection.QueryAsync("SELECT * FROM ordering.cardtypes"); + return await connection.QueryAsync("SELECT * FROM ordering.cardtypes"); } } - private dynamic MapOrderItems(dynamic result) + private Order MapOrderItems(dynamic result) { - dynamic order = new ExpandoObject(); - - order.ordernumber = result[0].ordernumber; - order.date = result[0].date; - order.status = result[0].status; - order.description = result[0].description; - order.street = result[0].street; - order.city = result[0].city; - order.zipcode = result[0].zipcode; - order.country = result[0].country; - - order.orderitems = new List(); - order.total = 0; + var order = new Order + { + ordernumber = result[0].ordernumber, + date = result[0].date, + status = result[0].status, + description = result[0].description, + street = result[0].street, + city = result[0].city, + zipcode = result[0].zipcode, + country = result[0].country, + orderitems = new List(), + total = 0 + }; foreach (dynamic item in result) { - dynamic orderitem = new ExpandoObject(); - orderitem.productname = item.productname; - orderitem.units = item.units; - orderitem.unitprice = item.unitprice; - orderitem.pictureurl = item.pictureurl; + var orderitem = new Orderitem + { + productname = item.productname, + units = item.units, + unitprice = (double)item.unitprice, + pictureurl = item.pictureurl + }; order.total += item.units * item.unitprice; order.orderitems.Add(orderitem); diff --git a/src/Services/Ordering/Ordering.API/Application/Queries/OrderViewModel.cs b/src/Services/Ordering/Ordering.API/Application/Queries/OrderViewModel.cs new file mode 100644 index 000000000..a4f5eb0a9 --- /dev/null +++ b/src/Services/Ordering/Ordering.API/Application/Queries/OrderViewModel.cs @@ -0,0 +1,41 @@ +using System; +using System.Collections.Generic; + +namespace Microsoft.eShopOnContainers.Services.Ordering.API.Application.Queries +{ + public class Orderitem + { + public string productname { get; set; } + public int units { get; set; } + public double unitprice { get; set; } + public string pictureurl { get; set; } + } + + public class Order + { + public int ordernumber { get; set; } + public DateTime date { get; set; } + public string status { get; set; } + public string description { get; set; } + public string street { get; set; } + public string city { get; set; } + public string zipcode { get; set; } + public string country { get; set; } + public List orderitems { get; set; } + public decimal total { get; set; } + } + + public class OrderSummary + { + public int ordernumber { get; set; } + public DateTime date { get; set; } + public string status { get; set; } + public double total { get; set; } + } + + public class CardType + { + public int Id { get; set; } + public string Name { get; set; } + } +} diff --git a/src/Services/Ordering/Ordering.API/Controllers/OrdersController.cs b/src/Services/Ordering/Ordering.API/Controllers/OrdersController.cs index c43e65d63..bc1fef585 100644 --- a/src/Services/Ordering/Ordering.API/Controllers/OrdersController.cs +++ b/src/Services/Ordering/Ordering.API/Controllers/OrdersController.cs @@ -64,7 +64,7 @@ namespace Microsoft.eShopOnContainers.Services.Ordering.API.Controllers [Route("{orderId:int}")] [HttpGet] - [ProducesResponseType((int)HttpStatusCode.OK)] + [ProducesResponseType(typeof(Order),(int)HttpStatusCode.OK)] [ProducesResponseType((int)HttpStatusCode.NotFound)] public async Task GetOrder(int orderId) { @@ -83,6 +83,7 @@ namespace Microsoft.eShopOnContainers.Services.Ordering.API.Controllers [Route("")] [HttpGet] + [ProducesResponseType(typeof(IEnumerable), (int)HttpStatusCode.OK)] public async Task GetOrders() { var orderTask = _orderQueries.GetOrdersAsync(); @@ -94,6 +95,7 @@ namespace Microsoft.eShopOnContainers.Services.Ordering.API.Controllers [Route("cardtypes")] [HttpGet] + [ProducesResponseType(typeof(IEnumerable), (int)HttpStatusCode.OK)] public async Task GetCardTypes() { var cardTypes = await _orderQueries From a5abf7dc0bbebb4bd766b8b5f9f2b52c2caf6db4 Mon Sep 17 00:00:00 2001 From: Dylan Munyard Date: Sun, 29 Oct 2017 22:39:36 +1000 Subject: [PATCH 02/30] Using Rider 2017.2 as the IDE detects and unclosed tag and the unnecessary Razor syntax. --- src/Web/WebMVC/Views/Order/Index.cshtml | 2 +- src/Web/WebMVC/Views/Shared/_Layout.cshtml | 1 + 2 files changed, 2 insertions(+), 1 deletion(-) diff --git a/src/Web/WebMVC/Views/Order/Index.cshtml b/src/Web/WebMVC/Views/Order/Index.cshtml index 312e81162..dcb1f2a08 100644 --- a/src/Web/WebMVC/Views/Order/Index.cshtml +++ b/src/Web/WebMVC/Views/Order/Index.cshtml @@ -22,7 +22,7 @@ @if (Model != null && Model.Any()) { - @foreach (var item in Model) + foreach (var item in Model) {
@Html.DisplayFor(modelItem => item.OrderNumber)
diff --git a/src/Web/WebMVC/Views/Shared/_Layout.cshtml b/src/Web/WebMVC/Views/Shared/_Layout.cshtml index 704d37742..ee01b5b65 100644 --- a/src/Web/WebMVC/Views/Shared/_Layout.cshtml +++ b/src/Web/WebMVC/Views/Shared/_Layout.cshtml @@ -39,6 +39,7 @@
+ @await Html.PartialAsync("_LoginPartial") From 95ec2c780a2faf81c3eb45799cf0fd559f628921 Mon Sep 17 00:00:00 2001 From: Cesar De la Torre Date: Mon, 30 Oct 2017 15:06:37 -0700 Subject: [PATCH 03/30] Minor refactoring/order for the IEventBus interface --- .../EventBus/EventBus/Abstractions/IEventBus.cs | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/src/BuildingBlocks/EventBus/EventBus/Abstractions/IEventBus.cs b/src/BuildingBlocks/EventBus/EventBus/Abstractions/IEventBus.cs index 21436d3cd..dde05e1e3 100644 --- a/src/BuildingBlocks/EventBus/EventBus/Abstractions/IEventBus.cs +++ b/src/BuildingBlocks/EventBus/EventBus/Abstractions/IEventBus.cs @@ -5,9 +5,12 @@ namespace Microsoft.eShopOnContainers.BuildingBlocks.EventBus.Abstractions { public interface IEventBus { + void Publish(IntegrationEvent @event); + void Subscribe() where T : IntegrationEvent where TH : IIntegrationEventHandler; + void SubscribeDynamic(string eventName) where TH : IDynamicIntegrationEventHandler; @@ -17,7 +20,5 @@ namespace Microsoft.eShopOnContainers.BuildingBlocks.EventBus.Abstractions void Unsubscribe() where TH : IIntegrationEventHandler where T : IntegrationEvent; - - void Publish(IntegrationEvent @event); } } From c706c1dedc67d6f57126d383ede57e87dcaeba28 Mon Sep 17 00:00:00 2001 From: Cesar De la Torre Date: Mon, 30 Oct 2017 15:26:25 -0700 Subject: [PATCH 04/30] CommandBusRabbitMQ.cs commented code eliminated as we're just using an Event Bus. --- .../EventBusRabbitMQ/CommandBusRabbitMQ.cs | 145 ------------------ 1 file changed, 145 deletions(-) delete mode 100644 src/BuildingBlocks/EventBus/EventBusRabbitMQ/CommandBusRabbitMQ.cs diff --git a/src/BuildingBlocks/EventBus/EventBusRabbitMQ/CommandBusRabbitMQ.cs b/src/BuildingBlocks/EventBus/EventBusRabbitMQ/CommandBusRabbitMQ.cs deleted file mode 100644 index 27e67d9ca..000000000 --- a/src/BuildingBlocks/EventBus/EventBusRabbitMQ/CommandBusRabbitMQ.cs +++ /dev/null @@ -1,145 +0,0 @@ -//using Microsoft.eShopOnContainers.BuildingBlocks.CommandBus; -using Microsoft.Extensions.Logging; -using Newtonsoft.Json; -using Polly; -using Polly.Retry; -using RabbitMQ.Client; -using RabbitMQ.Client.Events; -using RabbitMQ.Client.Exceptions; -using System; -using System.Collections.Generic; -using System.Net.Sockets; -using System.Text; -using System.Threading.Tasks; - -/* -namespace Microsoft.eShopOnContainers.BuildingBlocks.EventBusRabbitMQ -{ - public class CommandBusRabbitMQ : ICommandBus, IDisposable - { - const string BROKER_NAME = "eshop_command_bus"; - - private readonly IRabbitMQPersistentConnection _persistentConnection; - private readonly ILogger _logger; - - private IModel _consumerChannel; - private string _queueName; - - private readonly Dictionary _handlers; - private readonly Dictionary _typeMappings; - - public CommandBusRabbitMQ(IRabbitMQPersistentConnection persistentConnection, - ILogger logger) - { - _logger = logger; - _persistentConnection = persistentConnection; - _handlers = new Dictionary(); - _typeMappings = new Dictionary(); - } - - public void Send(string name, T data) - { - Send(new IntegrationCommand(name, data)); - } - - public void Handle(string name, IIntegrationCommandHandler handler) - { - _handlers.Add(name, handler); - _typeMappings.Add(name, typeof(TC)); - } - - public void Handle(string name, IIntegrationCommandHandler handler) - { - _handlers.Add(name, handler); - } - public void Handle(TI handler) where TI : IIntegrationCommandHandler - { - var name = typeof(TI).Name; - _handlers.Add(name, handler); - _typeMappings.Add(name, typeof(TC)); - } - - private void Send(IntegrationCommand command) - { - if (!_persistentConnection.IsConnected) - { - _persistentConnection.TryConnect(); - } - - var policy = RetryPolicy.Handle() - .Or() - .WaitAndRetry(5, retryAttempt => TimeSpan.FromSeconds(Math.Pow(2, retryAttempt)), (ex, time) => - { - _logger.LogWarning(ex.ToString()); - }); - - using (var channel = _persistentConnection.CreateModel()) - { - var commandName = command.Name; - channel.ExchangeDeclare(exchange: BROKER_NAME, type: "direct"); - var message = JsonConvert.SerializeObject(command); - var body = Encoding.UTF8.GetBytes(message); - policy.Execute(() => - { - channel.BasicPublish(exchange: BROKER_NAME, - routingKey: commandName, - basicProperties: null, - body: body); - }); - } - } - - private IModel CreateConsumerChannel() - { - if (!_persistentConnection.IsConnected) - { - _persistentConnection.TryConnect(); - } - - var channel = _persistentConnection.CreateModel(); - - channel.ExchangeDeclare(exchange: BROKER_NAME, type: "direct"); - _queueName = channel.QueueDeclare().QueueName; - var consumer = new EventingBasicConsumer(channel); - consumer.Received += async (model, ea) => - { - var commandName = ea.RoutingKey; - var message = Encoding.UTF8.GetString(ea.Body); - await InvokeHandler(commandName, message); - }; - - channel.BasicConsume(queue: _queueName, - noAck: true, - consumer: consumer); - - channel.CallbackException += (sender, ea) => - { - _consumerChannel.Dispose(); - _consumerChannel = CreateConsumerChannel(); - }; - - return channel; - } - - private Task InvokeHandler(string commandName, string message) - { - if (_handlers.ContainsKey(commandName)) - { - - } - - } - - public void Dispose() - { - if (_consumerChannel != null) - { - _consumerChannel.Dispose(); - } - } - - - - } -} -*/ \ No newline at end of file From 48af69ce180e4437f8dd283424c401021fbb6a37 Mon Sep 17 00:00:00 2001 From: Cesar De la Torre Date: Mon, 30 Oct 2017 18:12:28 -0700 Subject: [PATCH 05/30] Minor updates in comments, so it is clearer. --- .../Catalog/Catalog.API/Controllers/CatalogController.cs | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/Services/Catalog/Catalog.API/Controllers/CatalogController.cs b/src/Services/Catalog/Catalog.API/Controllers/CatalogController.cs index 1830fd90a..1b53171d0 100644 --- a/src/Services/Catalog/Catalog.API/Controllers/CatalogController.cs +++ b/src/Services/Catalog/Catalog.API/Controllers/CatalogController.cs @@ -180,7 +180,7 @@ namespace Microsoft.eShopOnContainers.Services.Catalog.API.Controllers catalogItem = productToUpdate; _catalogContext.CatalogItems.Update(catalogItem); - if (raiseProductPriceChangedEvent) // Save and publish integration event if price has changed + if (raiseProductPriceChangedEvent) // Save product's data and publish integration event through the Event Bus if price has changed { //Create Integration Event to be published through the Event Bus var priceChangedEvent = new ProductPriceChangedIntegrationEvent(catalogItem.Id, productToUpdate.Price, oldPrice); @@ -191,7 +191,7 @@ namespace Microsoft.eShopOnContainers.Services.Catalog.API.Controllers // Publish through the Event Bus and mark the saved event as published await _catalogIntegrationEventService.PublishThroughEventBusAsync(priceChangedEvent); } - else // Save updated product + else // Just save the updated product because the Product's Price hasn't changed. { await _catalogContext.SaveChangesAsync(); } From 95ad3e1b2c98527522f1c5d825ec59dddca28651 Mon Sep 17 00:00:00 2001 From: Cesar De la Torre Date: Tue, 31 Oct 2017 17:45:23 -0700 Subject: [PATCH 06/30] Fixed bug in docker-compose.prod.yml so it used the ESHOP_PROD_EXTERNAL_DNS_NAME_OR_IP env-var from .env file --- .env | 2 +- docker-compose.prod.yml | 28 ++++++++++++++-------------- 2 files changed, 15 insertions(+), 15 deletions(-) diff --git a/.env b/.env index c8fcdfcf2..28a94504c 100644 --- a/.env +++ b/.env @@ -5,7 +5,7 @@ # The IP below should be swapped to your real IP or DNS name, like 192.168.88.248, etc. if testing from remote browsers or mobile devices ESHOP_EXTERNAL_DNS_NAME_OR_IP=localhost -ESHOP_PROD_EXTERNAL_DNS_NAME_OR_IP=10.121.122.92 +ESHOP_PROD_EXTERNAL_DNS_NAME_OR_IP=10.121.122.162 #ESHOP_AZURE_REDIS_BASKET_DB= #ESHOP_AZURE_STORAGE_CATALOG_URL= diff --git a/docker-compose.prod.yml b/docker-compose.prod.yml index 5a15ab408..1345b1b77 100644 --- a/docker-compose.prod.yml +++ b/docker-compose.prod.yml @@ -8,7 +8,7 @@ version: '3' # # IMPORTANT: Note that this compose file uses ESHOP_PROD_EXTERNAL_DNS_NAME_OR_IP instead of ESHOP_EXTERNAL_DNS_NAME_OR_IP -# Set ASPNETCORE_ENVIRONMENT=Development, instead Production, if you want to show up errors while testing. +# Set ASPNETCORE_ENVIRONMENT= Development or Production, depending if you want to show up errors while testing. # # You need to start it with the following CLI command: # docker-compose -f docker-compose.yml -f docker-compose.prod.yml up -d @@ -17,7 +17,7 @@ services: basket.api: environment: - - ASPNETCORE_ENVIRONMENT=Production + - ASPNETCORE_ENVIRONMENT=Development - ASPNETCORE_URLS=http://0.0.0.0:80 - ConnectionString=${ESHOP_AZURE_REDIS_BASKET_DB:-basket.data} - identityUrl=http://identity.api #Local: You need to open your local dev-machine firewall at range 5100-5110. @@ -35,7 +35,7 @@ services: catalog.api: environment: - - ASPNETCORE_ENVIRONMENT=Production + - ASPNETCORE_ENVIRONMENT=Development - ASPNETCORE_URLS=http://0.0.0.0:80 - ConnectionString=${ESHOP_AZURE_CATALOG_DB:-Server=sql.data;Database=Microsoft.eShopOnContainers.Services.CatalogDb;User Id=sa;Password=Pass@word} - PicBaseUrl=${ESHOP_AZURE_STORAGE_CATALOG_URL:-http://localhost:5101/api/v1/catalog/items/[0]/pic/} #Local: You need to open your local dev-machine firewall at range 5100-5110. @@ -54,7 +54,7 @@ services: identity.api: environment: - - ASPNETCORE_ENVIRONMENT=Production + - ASPNETCORE_ENVIRONMENT=Development - ASPNETCORE_URLS=http://0.0.0.0:80 - SpaClient=http://${ESHOP_PROD_EXTERNAL_DNS_NAME_OR_IP}:5104 - XamarinCallback=http://${ESHOP_PROD_EXTERNAL_DNS_NAME_OR_IP}:5105/xamarincallback #localhost do not work for UWP login, so we have to use "external" IP always @@ -72,7 +72,7 @@ services: ordering.api: environment: - - ASPNETCORE_ENVIRONMENT=Production + - ASPNETCORE_ENVIRONMENT=Development - ASPNETCORE_URLS=http://0.0.0.0:80 - ConnectionString=${ESHOP_AZURE_ORDERING_DB:-Server=sql.data;Database=Microsoft.eShopOnContainers.Services.OrderingDb;User Id=sa;Password=Pass@word} - identityUrl=http://identity.api #Local: You need to open your local dev-machine firewall at range 5100-5110. @@ -92,7 +92,7 @@ services: marketing.api: environment: - - ASPNETCORE_ENVIRONMENT=Production + - ASPNETCORE_ENVIRONMENT=Development - ASPNETCORE_URLS=http://0.0.0.0:80 - ConnectionString=${ESHOP_AZURE_MARKETING_DB:-Server=sql.data;Database=Microsoft.eShopOnContainers.Services.MarketingDb;User Id=sa;Password=Pass@word} - MongoConnectionString=${ESHOP_AZURE_COSMOSDB:-mongodb://nosql.data} @@ -116,7 +116,7 @@ services: webspa: environment: - - ASPNETCORE_ENVIRONMENT=Production + - ASPNETCORE_ENVIRONMENT=Development - ASPNETCORE_URLS=http://0.0.0.0:80 - CatalogUrl=http://${ESHOP_PROD_EXTERNAL_DNS_NAME_OR_IP}:5101 - OrderingUrl=http://${ESHOP_PROD_EXTERNAL_DNS_NAME_OR_IP}:5102 @@ -138,17 +138,17 @@ services: webmvc: environment: - - ASPNETCORE_ENVIRONMENT=Production + - ASPNETCORE_ENVIRONMENT=Development - ASPNETCORE_URLS=http://0.0.0.0:80 - CatalogUrl=http://catalog.api - OrderingUrl=http://ordering.api - BasketUrl=http://basket.api - LocationsUrl=http://locations.api - - IdentityUrl=http://10.0.75.1:5105 - - MarketingUrl=http://marketing.api #Local: Use 10.0.75.1 in a "Docker for Windows" environment, if using "localhost" from browser. #Remote: Use ${ESHOP_PROD_EXTERNAL_DNS_NAME_OR_IP} if using external IP or DNS name from browser. + - IdentityUrl=http://ESHOP_PROD_EXTERNAL_DNS_NAME_OR_IP:5105 #Local: Use 10.0.75.1 in a "Docker for Windows" environment, if using "localhost" from browser. #Remote: Use ${ESHOP_PROD_EXTERNAL_DNS_NAME_OR_IP} if using external IP or DNS name from browser. + - MarketingUrl=http://marketing.api - CatalogUrlHC=http://catalog.api/hc - OrderingUrlHC=http://ordering.api/hc - - IdentityUrlHC=http://identity.api/hc #Local: Use ${ESHOP_PROD_EXTERNAL_DNS_NAME_OR_IP}, if using external IP or DNS name from browser. + - IdentityUrlHC=http://ESHOP_PROD_EXTERNAL_DNS_NAME_OR_IP/hc #Local: Use ${ESHOP_PROD_EXTERNAL_DNS_NAME_OR_IP}, if using external IP or DNS name from browser. - BasketUrlHC=http://basket.api/hc - MarketingUrlHC=http://marketing.api/hc - PaymentUrlHC=http://payment.api/hc @@ -161,7 +161,7 @@ services: webstatus: environment: - - ASPNETCORE_ENVIRONMENT=Production + - ASPNETCORE_ENVIRONMENT=Development - ASPNETCORE_URLS=http://0.0.0.0:80 - CatalogUrl=http://catalog.api/hc - OrderingUrl=http://ordering.api/hc @@ -179,7 +179,7 @@ services: payment.api: environment: - - ASPNETCORE_ENVIRONMENT=Production + - ASPNETCORE_ENVIRONMENT=Development - ASPNETCORE_URLS=http://0.0.0.0:80 - EventBusConnection=${ESHOP_AZURE_SERVICE_BUS:-rabbitmq} - EventBusUserName=${ESHOP_SERVICE_BUS_USERNAME} @@ -192,7 +192,7 @@ services: locations.api: environment: - - ASPNETCORE_ENVIRONMENT=Production + - ASPNETCORE_ENVIRONMENT=Development - ASPNETCORE_URLS=http://0.0.0.0:80 - ConnectionString=${ESHOP_AZURE_COSMOSDB:-mongodb://nosql.data} - Database=LocationsDb From 2137a208ddd2c67b24caf1fa9a255e800406aca1 Mon Sep 17 00:00:00 2001 From: Cesar De la Torre Date: Tue, 31 Oct 2017 18:21:10 -0700 Subject: [PATCH 07/30] Fixed bug in IdentityUrl for webmvc when using ${ESHOP_PROD_EXTERNAL_DNS_NAME_OR_IP} --- docker-compose.prod.yml | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/docker-compose.prod.yml b/docker-compose.prod.yml index 1345b1b77..7ba049015 100644 --- a/docker-compose.prod.yml +++ b/docker-compose.prod.yml @@ -126,7 +126,7 @@ services: - LocationsUrl=http://${ESHOP_PROD_EXTERNAL_DNS_NAME_OR_IP}:5109 - CatalogUrlHC=http://catalog.api/hc - OrderingUrlHC=http://ordering.api/hc - - IdentityUrlHC=http://identity.api/hc #Local: Use ${ESHOP_PROD_EXTERNAL_DNS_NAME_OR_IP}, if using external IP or DNS name from browser. + - IdentityUrlHC=http://identity.api/hc - BasketUrlHC=http://basket.api/hc - MarketingUrlHC=http://marketing.api/hc - PaymentUrlHC=http://payment.api/hc @@ -144,11 +144,11 @@ services: - OrderingUrl=http://ordering.api - BasketUrl=http://basket.api - LocationsUrl=http://locations.api - - IdentityUrl=http://ESHOP_PROD_EXTERNAL_DNS_NAME_OR_IP:5105 #Local: Use 10.0.75.1 in a "Docker for Windows" environment, if using "localhost" from browser. #Remote: Use ${ESHOP_PROD_EXTERNAL_DNS_NAME_OR_IP} if using external IP or DNS name from browser. + - IdentityUrl=http://${ESHOP_PROD_EXTERNAL_DNS_NAME_OR_IP}:5105 #Local: Use 10.0.75.1 in a "Docker for Windows" environment, if using "localhost" from browser. #Remote: Use ${ESHOP_PROD_EXTERNAL_DNS_NAME_OR_IP} if using external IP or DNS name from browser. - MarketingUrl=http://marketing.api - CatalogUrlHC=http://catalog.api/hc - OrderingUrlHC=http://ordering.api/hc - - IdentityUrlHC=http://ESHOP_PROD_EXTERNAL_DNS_NAME_OR_IP/hc #Local: Use ${ESHOP_PROD_EXTERNAL_DNS_NAME_OR_IP}, if using external IP or DNS name from browser. + - IdentityUrlHC=http://identity.api/hc - BasketUrlHC=http://basket.api/hc - MarketingUrlHC=http://marketing.api/hc - PaymentUrlHC=http://payment.api/hc From 3218c1b54c87c2bf061248e5c2871bc9cbeb7c56 Mon Sep 17 00:00:00 2001 From: Cesar De la Torre Date: Tue, 31 Oct 2017 21:55:04 -0700 Subject: [PATCH 08/30] Fixed bug in Xamarin code when mapping from Order to Basket, method MapOrderToBasket(), in order to submit to the Basket microservice. --- .../eShopOnContainers.Core/Services/Order/OrderService.cs | 1 + .../eShopOnContainers.Core/ViewModels/CheckoutViewModel.cs | 2 +- 2 files changed, 2 insertions(+), 1 deletion(-) diff --git a/src/Mobile/eShopOnContainers/eShopOnContainers.Core/Services/Order/OrderService.cs b/src/Mobile/eShopOnContainers/eShopOnContainers.Core/Services/Order/OrderService.cs index 85f8c85a6..fc6a03a7e 100644 --- a/src/Mobile/eShopOnContainers/eShopOnContainers.Core/Services/Order/OrderService.cs +++ b/src/Mobile/eShopOnContainers/eShopOnContainers.Core/Services/Order/OrderService.cs @@ -68,6 +68,7 @@ namespace eShopOnContainers.Core.Services.Order CardSecurityNumber = order.CardSecurityNumber, CardTypeId = order.CardTypeId, City = order.ShippingCity, + State = order.ShippingState, Country = order.ShippingCountry, ZipCode = order.ShippingZipCode, Street = order.ShippingStreet diff --git a/src/Mobile/eShopOnContainers/eShopOnContainers.Core/ViewModels/CheckoutViewModel.cs b/src/Mobile/eShopOnContainers/eShopOnContainers.Core/ViewModels/CheckoutViewModel.cs index 700fd8b53..0113202bf 100644 --- a/src/Mobile/eShopOnContainers/eShopOnContainers.Core/ViewModels/CheckoutViewModel.cs +++ b/src/Mobile/eShopOnContainers/eShopOnContainers.Core/ViewModels/CheckoutViewModel.cs @@ -165,7 +165,7 @@ namespace eShopOnContainers.Core.ViewModels await NavigationService.RemoveLastFromBackStackAsync(); // Show Dialog - await DialogService.ShowAlertAsync("Order sent successfully!", string.Format("Order {0}", Order.OrderNumber), "Ok"); + await DialogService.ShowAlertAsync("Order sent successfully!", "Checkout", "Ok"); await NavigationService.RemoveLastFromBackStackAsync(); } catch From 8b264e0767c597a096dc7f948cc8d75895449783 Mon Sep 17 00:00:00 2001 From: Unai Zorrilla Castro Date: Thu, 2 Nov 2017 15:03:32 +0100 Subject: [PATCH 09/30] Review MigrateDbContext to add retry for network-related exception when sql server container is created --- .../WebHost.Customization.csproj | 1 + .../WebHostExtensions.cs | 23 +++++++++++++++++-- 2 files changed, 22 insertions(+), 2 deletions(-) diff --git a/src/BuildingBlocks/WebHostCustomization/WebHost.Customization/WebHost.Customization.csproj b/src/BuildingBlocks/WebHostCustomization/WebHost.Customization/WebHost.Customization.csproj index d9ddd56e9..db3926d0d 100644 --- a/src/BuildingBlocks/WebHostCustomization/WebHost.Customization/WebHost.Customization.csproj +++ b/src/BuildingBlocks/WebHostCustomization/WebHost.Customization/WebHost.Customization.csproj @@ -6,6 +6,7 @@ + diff --git a/src/BuildingBlocks/WebHostCustomization/WebHost.Customization/WebHostExtensions.cs b/src/BuildingBlocks/WebHostCustomization/WebHost.Customization/WebHostExtensions.cs index ecaceeab0..858506e46 100644 --- a/src/BuildingBlocks/WebHostCustomization/WebHost.Customization/WebHostExtensions.cs +++ b/src/BuildingBlocks/WebHostCustomization/WebHost.Customization/WebHostExtensions.cs @@ -1,7 +1,10 @@ using Microsoft.EntityFrameworkCore; using Microsoft.Extensions.DependencyInjection; using Microsoft.Extensions.Logging; +using Polly; +using Polly.Retry; using System; +using System.Data.SqlClient; namespace Microsoft.AspNetCore.Hosting { @@ -21,10 +24,26 @@ namespace Microsoft.AspNetCore.Hosting { logger.LogInformation($"Migrating database associated with context {typeof(TContext).Name}"); - context.Database + var retry = Policy.Handle() + .WaitAndRetry(new TimeSpan[] + { + TimeSpan.FromSeconds(5), + TimeSpan.FromSeconds(10), + TimeSpan.FromSeconds(15), + }); + + retry.Execute(() => + { + //if the sql server container is not created on run docker compose this + //migration can't fail for network related exception. The retry options for DbContext only + //apply to transient exceptions. + + context.Database .Migrate(); - seeder(context,services); + seeder(context, services); + }); + logger.LogInformation($"Migrated database associated with context {typeof(TContext).Name}"); } From 7afe822e1658e4dc393df338700772a9a40caa8d Mon Sep 17 00:00:00 2001 From: Bradley Grainger Date: Fri, 3 Nov 2017 12:14:44 -0700 Subject: [PATCH 10/30] Fix incorrect return type. The interface's methods were changed in 5e1346731561fd0612cf76ec7fe4e34cf32ebb00. --- .../UnitTest/Ordering/Application/OrdersWebApiTest.cs | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/test/Services/UnitTest/Ordering/Application/OrdersWebApiTest.cs b/test/Services/UnitTest/Ordering/Application/OrdersWebApiTest.cs index d1c981334..b6f047960 100644 --- a/test/Services/UnitTest/Ordering/Application/OrdersWebApiTest.cs +++ b/test/Services/UnitTest/Ordering/Application/OrdersWebApiTest.cs @@ -93,7 +93,7 @@ namespace UnitTest.Ordering.Application public async Task Get_orders_success() { //Arrange - var fakeDynamicResult = Enumerable.Empty(); + var fakeDynamicResult = Enumerable.Empty(); _orderQueriesMock.Setup(x => x.GetOrdersAsync()) .Returns(Task.FromResult(fakeDynamicResult)); @@ -110,7 +110,7 @@ namespace UnitTest.Ordering.Application { //Arrange var fakeOrderId = 123; - var fakeDynamicResult = new Object(); + var fakeDynamicResult = new Order(); _orderQueriesMock.Setup(x => x.GetOrderAsync(It.IsAny())) .Returns(Task.FromResult(fakeDynamicResult)); @@ -126,7 +126,7 @@ namespace UnitTest.Ordering.Application public async Task Get_cardTypes_success() { //Arrange - var fakeDynamicResult = Enumerable.Empty(); + var fakeDynamicResult = Enumerable.Empty(); _orderQueriesMock.Setup(x => x.GetCardTypesAsync()) .Returns(Task.FromResult(fakeDynamicResult)); From f42c32c63b3a986c22541edc64666840001a30aa Mon Sep 17 00:00:00 2001 From: Bradley Grainger Date: Fri, 3 Nov 2017 12:14:59 -0700 Subject: [PATCH 11/30] Fix xUnit warnings. --- .../Services/Basket/RedisBasketRepositoryTests.cs | 2 +- .../IntegrationTests/Services/Catalog/CatalogScenarios.cs | 4 ++-- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/test/Services/IntegrationTests/Services/Basket/RedisBasketRepositoryTests.cs b/test/Services/IntegrationTests/Services/Basket/RedisBasketRepositoryTests.cs index 5dd46c5f0..9eefde0d5 100644 --- a/test/Services/IntegrationTests/Services/Basket/RedisBasketRepositoryTests.cs +++ b/test/Services/IntegrationTests/Services/Basket/RedisBasketRepositoryTests.cs @@ -31,7 +31,7 @@ }); Assert.NotNull(basket); - Assert.Equal(1, basket.Items.Count); + Assert.Single(basket.Items); } [Fact] diff --git a/test/Services/IntegrationTests/Services/Catalog/CatalogScenarios.cs b/test/Services/IntegrationTests/Services/Catalog/CatalogScenarios.cs index 493665cde..6414a57ea 100644 --- a/test/Services/IntegrationTests/Services/Catalog/CatalogScenarios.cs +++ b/test/Services/IntegrationTests/Services/Catalog/CatalogScenarios.cs @@ -41,7 +41,7 @@ namespace IntegrationTests.Services.Catalog var response = await server.CreateClient() .GetAsync(Get.ItemById(int.MinValue)); - Assert.Equal(response.StatusCode, HttpStatusCode.BadRequest); + Assert.Equal(HttpStatusCode.BadRequest, response.StatusCode); } } @@ -53,7 +53,7 @@ namespace IntegrationTests.Services.Catalog var response = await server.CreateClient() .GetAsync(Get.ItemById(int.MaxValue)); - Assert.Equal(response.StatusCode, HttpStatusCode.NotFound); + Assert.Equal( HttpStatusCode.NotFound, response.StatusCode); } } From c75fba052bd48627f8ea7b5128b193a7d9250878 Mon Sep 17 00:00:00 2001 From: Bradley Grainger Date: Fri, 3 Nov 2017 12:15:14 -0700 Subject: [PATCH 12/30] Fix unused variable compiler warning. --- test/Services/UnitTest/Ordering/Domain/OrderAggregateTest.cs | 3 --- 1 file changed, 3 deletions(-) diff --git a/test/Services/UnitTest/Ordering/Domain/OrderAggregateTest.cs b/test/Services/UnitTest/Ordering/Domain/OrderAggregateTest.cs index eaa0d0cb6..e2072e352 100644 --- a/test/Services/UnitTest/Ordering/Domain/OrderAggregateTest.cs +++ b/test/Services/UnitTest/Ordering/Domain/OrderAggregateTest.cs @@ -111,7 +111,6 @@ public class OrderAggregateTest public void Add_new_Order_raises_new_event() { //Arrange - var userId = new Guid(); var street = "fakeStreet"; var city = "FakeCity"; var state = "fakeState"; @@ -135,7 +134,6 @@ public class OrderAggregateTest public void Add_event_Order_explicitly_raises_new_event() { //Arrange - var userId = new Guid(); var street = "fakeStreet"; var city = "FakeCity"; var state = "fakeState"; @@ -159,7 +157,6 @@ public class OrderAggregateTest public void Remove_event_Order_explicitly() { //Arrange - var userId = new Guid(); var street = "fakeStreet"; var city = "FakeCity"; var state = "fakeState"; From 1b5186534917b4faef070fc3582a62eb1614f24b Mon Sep 17 00:00:00 2001 From: Cesar De la Torre Date: Tue, 7 Nov 2017 10:35:08 -0800 Subject: [PATCH 13/30] Minor refactoring at Seedwork --- src/Services/Ordering/Ordering.Domain/SeedWork/Entity.cs | 9 ++------- 1 file changed, 2 insertions(+), 7 deletions(-) diff --git a/src/Services/Ordering/Ordering.Domain/SeedWork/Entity.cs b/src/Services/Ordering/Ordering.Domain/SeedWork/Entity.cs index 823019d13..9b68af850 100644 --- a/src/Services/Ordering/Ordering.Domain/SeedWork/Entity.cs +++ b/src/Services/Ordering/Ordering.Domain/SeedWork/Entity.cs @@ -6,12 +6,8 @@ public abstract class Entity { - int? _requestedHashCode; - int _Id; - - private List _domainEvents; - + int _Id; public virtual int Id { get @@ -24,13 +20,13 @@ } } + private List _domainEvents; public List DomainEvents => _domainEvents; public void AddDomainEvent(INotification eventItem) { _domainEvents = _domainEvents ?? new List(); _domainEvents.Add(eventItem); } - public void RemoveDomainEvent(INotification eventItem) { if (_domainEvents is null) return; @@ -74,7 +70,6 @@ return base.GetHashCode(); } - public static bool operator ==(Entity left, Entity right) { if (Object.Equals(left, null)) From 0ca2faaaab84c7a6c2db773abc11257e63cdf32e Mon Sep 17 00:00:00 2001 From: Cesar De la Torre Date: Tue, 7 Nov 2017 10:49:18 -0800 Subject: [PATCH 14/30] Removing unneeded blank lines on the ValueObject class --- src/Services/Ordering/Ordering.Domain/SeedWork/ValueObject.cs | 4 ---- 1 file changed, 4 deletions(-) diff --git a/src/Services/Ordering/Ordering.Domain/SeedWork/ValueObject.cs b/src/Services/Ordering/Ordering.Domain/SeedWork/ValueObject.cs index 40e587683..40fb117e1 100644 --- a/src/Services/Ordering/Ordering.Domain/SeedWork/ValueObject.cs +++ b/src/Services/Ordering/Ordering.Domain/SeedWork/ValueObject.cs @@ -14,16 +14,13 @@ namespace Microsoft.eShopOnContainers.Services.Ordering.Domain.SeedWork return ReferenceEquals(left, null) || left.Equals(right); } - protected static bool NotEqualOperator(ValueObject left, ValueObject right) { return !(EqualOperator(left, right)); } - protected abstract IEnumerable GetAtomicValues(); - public override bool Equals(object obj) { if (obj == null || obj.GetType() != GetType()) @@ -47,7 +44,6 @@ namespace Microsoft.eShopOnContainers.Services.Ordering.Domain.SeedWork return !thisValues.MoveNext() && !otherValues.MoveNext(); } - public override int GetHashCode() { return GetAtomicValues() From 18af108cd6455ab4f5b9b5595a60e519be1774d7 Mon Sep 17 00:00:00 2001 From: Cesar De la Torre Date: Tue, 7 Nov 2017 10:51:35 -0800 Subject: [PATCH 15/30] Cleaning up the Address ValueObject class --- .../AggregatesModel/OrderAggregate/Address.cs | 7 +------ 1 file changed, 1 insertion(+), 6 deletions(-) diff --git a/src/Services/Ordering/Ordering.Domain/AggregatesModel/OrderAggregate/Address.cs b/src/Services/Ordering/Ordering.Domain/AggregatesModel/OrderAggregate/Address.cs index 5579cf45e..c64874a02 100644 --- a/src/Services/Ordering/Ordering.Domain/AggregatesModel/OrderAggregate/Address.cs +++ b/src/Services/Ordering/Ordering.Domain/AggregatesModel/OrderAggregate/Address.cs @@ -4,17 +4,12 @@ using System.Collections.Generic; namespace Microsoft.eShopOnContainers.Services.Ordering.Domain.AggregatesModel.OrderAggregate { - public class Address - :ValueObject + public class Address : ValueObject { public String Street { get; private set; } - public String City { get; private set; } - public String State { get; private set; } - public String Country { get; private set; } - public String ZipCode { get; private set; } private Address() { } From 16ee5631123b4ae7eb82bf4554544682f219403e Mon Sep 17 00:00:00 2001 From: Cesar De la Torre Date: Tue, 7 Nov 2017 10:56:46 -0800 Subject: [PATCH 16/30] Cleaning up the Address ValueObject --- .../Ordering.Domain/AggregatesModel/OrderAggregate/Address.cs | 1 + 1 file changed, 1 insertion(+) diff --git a/src/Services/Ordering/Ordering.Domain/AggregatesModel/OrderAggregate/Address.cs b/src/Services/Ordering/Ordering.Domain/AggregatesModel/OrderAggregate/Address.cs index c64874a02..9576940df 100644 --- a/src/Services/Ordering/Ordering.Domain/AggregatesModel/OrderAggregate/Address.cs +++ b/src/Services/Ordering/Ordering.Domain/AggregatesModel/OrderAggregate/Address.cs @@ -25,6 +25,7 @@ namespace Microsoft.eShopOnContainers.Services.Ordering.Domain.AggregatesModel.O protected override IEnumerable GetAtomicValues() { + // Using a yield return statement to return each element one at a time yield return Street; yield return City; yield return State; From 625f53213bc48b6ba75f3e56c13f9d45e8c3fd46 Mon Sep 17 00:00:00 2001 From: Cesar De la Torre Date: Tue, 7 Nov 2017 12:45:05 -0800 Subject: [PATCH 17/30] Added a comment about Addess as Value Object and EF Core 2.0 onwed entity --- .../Ordering.Domain/AggregatesModel/OrderAggregate/Order.cs | 1 + 1 file changed, 1 insertion(+) diff --git a/src/Services/Ordering/Ordering.Domain/AggregatesModel/OrderAggregate/Order.cs b/src/Services/Ordering/Ordering.Domain/AggregatesModel/OrderAggregate/Order.cs index ae2194948..9b5216392 100644 --- a/src/Services/Ordering/Ordering.Domain/AggregatesModel/OrderAggregate/Order.cs +++ b/src/Services/Ordering/Ordering.Domain/AggregatesModel/OrderAggregate/Order.cs @@ -15,6 +15,7 @@ namespace Microsoft.eShopOnContainers.Services.Ordering.Domain.AggregatesModel.O // aligned with DDD Aggregates and Domain Entities (Instead of properties and property collections) private DateTime _orderDate; + // Address is a Value Object pattern example persisted as EF Core 2.0 owned entity public Address Address { get; private set; } private int? _buyerId; From a88fbf339fac8fd6a125fa1b460b3ca19ece5619 Mon Sep 17 00:00:00 2001 From: Cesar De la Torre Date: Tue, 7 Nov 2017 16:15:03 -0800 Subject: [PATCH 18/30] Minor clean-up in Ordering Context --- .../OrderEntityTypeConfiguration.cs | 6 +++--- .../Ordering.Infrastructure/OrderingContext.cs | 11 +---------- 2 files changed, 4 insertions(+), 13 deletions(-) diff --git a/src/Services/Ordering/Ordering.Infrastructure/EntityConfigurations/OrderEntityTypeConfiguration.cs b/src/Services/Ordering/Ordering.Infrastructure/EntityConfigurations/OrderEntityTypeConfiguration.cs index 19684d5e3..d4eb1fb9a 100644 --- a/src/Services/Ordering/Ordering.Infrastructure/EntityConfigurations/OrderEntityTypeConfiguration.cs +++ b/src/Services/Ordering/Ordering.Infrastructure/EntityConfigurations/OrderEntityTypeConfiguration.cs @@ -7,8 +7,7 @@ using System; namespace Ordering.Infrastructure.EntityConfigurations { - class OrderEntityTypeConfiguration - : IEntityTypeConfiguration + class OrderEntityTypeConfiguration : IEntityTypeConfiguration { public void Configure(EntityTypeBuilder orderConfiguration) { @@ -21,6 +20,7 @@ namespace Ordering.Infrastructure.EntityConfigurations orderConfiguration.Property(o => o.Id) .ForSqlServerUseSequenceHiLo("orderseq", OrderingContext.DEFAULT_SCHEMA); + //Address value object persisted as owned entity type supported since EF Core 2.0 orderConfiguration.OwnsOne(o => o.Address); orderConfiguration.Property("OrderDate").IsRequired(); @@ -32,7 +32,7 @@ namespace Ordering.Infrastructure.EntityConfigurations var navigation = orderConfiguration.Metadata.FindNavigation(nameof(Order.OrderItems)); // DDD Patterns comment: - //Set as Field (New since EF 1.1) to access the OrderItem collection property through its field + //Set as field (New since EF 1.1) to access the OrderItem collection property through its field navigation.SetPropertyAccessMode(PropertyAccessMode.Field); orderConfiguration.HasOne() diff --git a/src/Services/Ordering/Ordering.Infrastructure/OrderingContext.cs b/src/Services/Ordering/Ordering.Infrastructure/OrderingContext.cs index b91f441ba..1855b268a 100644 --- a/src/Services/Ordering/Ordering.Infrastructure/OrderingContext.cs +++ b/src/Services/Ordering/Ordering.Infrastructure/OrderingContext.cs @@ -12,22 +12,14 @@ using System.Threading.Tasks; namespace Microsoft.eShopOnContainers.Services.Ordering.Infrastructure { - public class OrderingContext - : DbContext,IUnitOfWork - + public class OrderingContext : DbContext,IUnitOfWork { public const string DEFAULT_SCHEMA = "ordering"; - public DbSet Orders { get; set; } - public DbSet OrderItems { get; set; } - public DbSet Payments { get; set; } - public DbSet Buyers { get; set; } - public DbSet CardTypes { get; set; } - public DbSet OrderStatus { get; set; } private readonly IMediator _mediator; @@ -63,7 +55,6 @@ namespace Microsoft.eShopOnContainers.Services.Ordering.Infrastructure // You will need to handle eventual consistency and compensatory actions in case of failures in any of the Handlers. await _mediator.DispatchDomainEventsAsync(this); - // After executing this line all the changes (from the Command Handler and Domain Event Handlers) // performed throught the DbContext will be commited var result = await base.SaveChangesAsync(); From d2f7d6a5d6d9cc90caf9f7c6503bec459115c7af Mon Sep 17 00:00:00 2001 From: Cesar De la Torre Date: Tue, 7 Nov 2017 16:53:41 -0800 Subject: [PATCH 19/30] Minor clean-up on Entity, Domain Events. --- .../AggregatesModel/OrderAggregate/Order.cs | 8 ++++---- .../Ordering.Domain/Events/OrderStartedDomainEvent.cs | 9 ++++----- src/Services/Ordering/Ordering.Domain/SeedWork/Entity.cs | 3 ++- .../Ordering/Ordering.Infrastructure/OrderingContext.cs | 2 +- 4 files changed, 11 insertions(+), 11 deletions(-) diff --git a/src/Services/Ordering/Ordering.Domain/AggregatesModel/OrderAggregate/Order.cs b/src/Services/Ordering/Ordering.Domain/AggregatesModel/OrderAggregate/Order.cs index 9b5216392..661965c5c 100644 --- a/src/Services/Ordering/Ordering.Domain/AggregatesModel/OrderAggregate/Order.cs +++ b/src/Services/Ordering/Ordering.Domain/AggregatesModel/OrderAggregate/Order.cs @@ -178,16 +178,16 @@ namespace Microsoft.eShopOnContainers.Services.Ordering.Domain.AggregatesModel.O private void AddOrderStartedDomainEvent(string userId, int cardTypeId, string cardNumber, string cardSecurityNumber, string cardHolderName, DateTime cardExpiration) { - var orderStartedDomainEvent = new OrderStartedDomainEvent( - this, userId, cardTypeId, cardNumber, cardSecurityNumber, - cardHolderName, cardExpiration); + var orderStartedDomainEvent = new OrderStartedDomainEvent(this, userId, cardTypeId, + cardNumber, cardSecurityNumber, + cardHolderName, cardExpiration); this.AddDomainEvent(orderStartedDomainEvent); } private void StatusChangeException(OrderStatus orderStatusToChange) { - throw new OrderingDomainException($"Not possible to change order status from {OrderStatus.Name} to {orderStatusToChange.Name}."); + throw new OrderingDomainException($"Is not possible to change the order status from {OrderStatus.Name} to {orderStatusToChange.Name}."); } public decimal GetTotal() diff --git a/src/Services/Ordering/Ordering.Domain/Events/OrderStartedDomainEvent.cs b/src/Services/Ordering/Ordering.Domain/Events/OrderStartedDomainEvent.cs index 38de4601a..a457067f6 100644 --- a/src/Services/Ordering/Ordering.Domain/Events/OrderStartedDomainEvent.cs +++ b/src/Services/Ordering/Ordering.Domain/Events/OrderStartedDomainEvent.cs @@ -9,8 +9,7 @@ namespace Ordering.Domain.Events /// /// Event used when an order is created /// - public class OrderStartedDomainEvent - : INotification + public class OrderStartedDomainEvent : INotification { public string UserId { get; private set; } public int CardTypeId { get; private set; } @@ -21,9 +20,9 @@ namespace Ordering.Domain.Events public Order Order { get; private set; } public OrderStartedDomainEvent(Order order, string userId, - int cardTypeId, string cardNumber, - string cardSecurityNumber, string cardHolderName, - DateTime cardExpiration) + int cardTypeId, string cardNumber, + string cardSecurityNumber, string cardHolderName, + DateTime cardExpiration) { Order = order; UserId = userId; diff --git a/src/Services/Ordering/Ordering.Domain/SeedWork/Entity.cs b/src/Services/Ordering/Ordering.Domain/SeedWork/Entity.cs index 9b68af850..11b940218 100644 --- a/src/Services/Ordering/Ordering.Domain/SeedWork/Entity.cs +++ b/src/Services/Ordering/Ordering.Domain/SeedWork/Entity.cs @@ -21,7 +21,8 @@ } private List _domainEvents; - public List DomainEvents => _domainEvents; + public List DomainEvents => _domainEvents; + public void AddDomainEvent(INotification eventItem) { _domainEvents = _domainEvents ?? new List(); diff --git a/src/Services/Ordering/Ordering.Infrastructure/OrderingContext.cs b/src/Services/Ordering/Ordering.Infrastructure/OrderingContext.cs index 1855b268a..a2cfb96a5 100644 --- a/src/Services/Ordering/Ordering.Infrastructure/OrderingContext.cs +++ b/src/Services/Ordering/Ordering.Infrastructure/OrderingContext.cs @@ -12,7 +12,7 @@ using System.Threading.Tasks; namespace Microsoft.eShopOnContainers.Services.Ordering.Infrastructure { - public class OrderingContext : DbContext,IUnitOfWork + public class OrderingContext : DbContext, IUnitOfWork { public const string DEFAULT_SCHEMA = "ordering"; public DbSet Orders { get; set; } From ee61c8f44d24aaa89427e67b5c0934077db6db82 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Ram=C3=B3n=20Tom=C3=A1s?= Date: Wed, 8 Nov 2017 16:28:12 +0100 Subject: [PATCH 20/30] Created Readme.md for setting load test scenarios --- img/loadtests/k8ssettings.PNG | Bin 0 -> 67522 bytes img/loadtests/loadtestproj_dir.PNG | Bin 0 -> 9246 bytes img/loadtests/runloadtest.PNG | Bin 0 -> 10315 bytes img/loadtests/sfmanifestsettings.PNG | Bin 0 -> 68026 bytes .../Catalog/Catalog.API/appsettings.json | 2 +- .../Identity/Identity.API/appsettings.json | 2 +- .../Location/Locations.API/appsettings.json | 2 +- .../Marketing/Marketing.API/appsettings.json | 2 +- .../Ordering/Ordering.API/settings.json | 2 +- test/Services/LoadTest/LoadTest.csproj | 6 +- .../LoadTest/WebMVC/CreateNewOrder.webtest | 2 +- test/Services/LoadTest/readme.md | 84 ++++++++++++++++++ 12 files changed, 93 insertions(+), 9 deletions(-) create mode 100644 img/loadtests/k8ssettings.PNG create mode 100644 img/loadtests/loadtestproj_dir.PNG create mode 100644 img/loadtests/runloadtest.PNG create mode 100644 img/loadtests/sfmanifestsettings.PNG create mode 100644 test/Services/LoadTest/readme.md diff --git a/img/loadtests/k8ssettings.PNG b/img/loadtests/k8ssettings.PNG new file mode 100644 index 0000000000000000000000000000000000000000..6bd6cb058f156dbe3253f4146f4b1cb44a77fec3 GIT binary patch literal 67522 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

ZRs*pBASEDrYvpi&{h#bj;}6H zS#`=6&eKKwxzD79-0KSAB1?}WdYbvF_VY}SLSxf_rwt2I;RISptC?A*=P4>`p5rAg zqo85Hmv#4YDbq-UVVPdtx6jQt#Kn^7uUc3tI;a6P3$15i_kY&cK~a$KB6la0{~Vk< zSm(uRdi}X{I=UZ2&j8PV?xSy>3(s|dw&1KOg4LBiEKG|(bY>W?Mr(tAy0^+KT+?b; zs+ZpITqXkVKk%h7hY6q(l2xFO*hF$p=j01mnc)+1yyLm+Oa%xVCXoqQm}%RIFNaIc zt(8tkJ)R&$CW0XcI5g;uaAXIX)<&;PwY@!c{gH!8ApMp;viHG3^L!=;HAUisN*BCXIKyPkBHCEAs z@e~0sCEnXggo&zS#%cEL$4%+u&>y*h2G}8&xK&g9X$)S4;~TO?PRex}%KUrK$RrigGv%N-IF%8I{zP8veC`d6R;+9kelh|`cM#oVpX%6fcw2xgmg#+?fL zl!3iA^*gI(UW7k)x#g}6TCB+yXj`SP?3`=g%MIrNOZ^;Ph(?w=M|U%P0}FRd0s4F$ zr(_nFr{ZY7SE5F(MEGGLc10%KP%d7F@l_}+N_KcPdgL)2kdBSYAVT^uk6$k!E! zDk^VWnP)GtQ8We$UrpGqn+d+GW+B8g&dX`~a1Q%Q*eJzD;gba^xO*z({Ik~+kAhB< zw<_OYCqg(qlo{1>!g=Um=trpekc(log#DpxH0q$1* zEM>IrLOnfQDZkXwVMQ?RgG*st){hE>IkR61+_EpjlAnKD49JEP(=%|2fLZCuN4_y< zbqxds>Jo4~6W6Z}9jPelE|8v#lA0~9`dEewXxcdpe;Ao@q5*<-RIyHbLW-`OeIb8m z@^2l;k{V)5K3>D?>iVW>*96IE9`Li8(^^;T73nIjvV&sJ8@Q9y^6D+TTew@(!tkXs z(6DJRh)%hPn?3Nh9IM8M7$dk1AUNu-%dqhu!ed-0s}5V5ma=yDaYD67XEAvS8cCHJ z+RI_wTAd}v%5@bhPTk#0Q|aY(6lyxN`u1jGnP_;YCTk&# zt_t7fIP#|PKNA$N+_&OC!7D5Z;!{WWpO{VKqV@j9>_S9ey)G(kSAYHA)svxi7qSrZ zsRm`f>wvY3x7tfGwTsZ%$N$vco6hej&>1)S)w}Gp;^d|NjSh0FxZ}kOOBF2tzACmx z#e!nh^(B;-eFyr07~|P=y6=1X@chqwBk|{Xm2dV<1M;l=XGuBru`_)t-jd!dV=IR) zc0OFmHi{TI@iY$r{5HdHrsb|*#c~D1MyUi79deJwotD3IiA~iDnhThK8r->%B?kivzBMf`+Jbss^vQ5c zZ>?mVj#$+8;C+a0)FO8@AZGsq4Zh8k{jTUaC@oA*sHh+X;xu*Yf`+uo01X1mHjYQH z|G04fw3`IiqZ=dJ9R`mlaQjZ@XU5`e{V#a9L2pd-ari+lg%#sU4eQm@1w|q`DRVa} zZ#;6Ne=~C^fWC*nx^0tz1uy_k08C=fMfC}(QsA?iMQi4i#@ROK# zLXNJqPZ%tOz>+PX)!jjdy^_ZG%#%7!ZKYMz(#e$XwdJfY2wM3qBc*H0d)9;+@lDsp(p#2o^^M*dVceJspb;C} z+xCn0+H9Xj#p7i^d~KKTTs!eVGbRyosy+ATDK`8YjXDdKI+0#q%NrA1H5-Wzqg`cA z$0W9~C!He_lAB4btdO_|AKTi#c&-J1Q{1ckHZmYDw5GRnD8~_TaMy80JB3)<@@Hc& zY5sBUoSs|JeEr7yGiHPvlN2nup48>uEi1a_bA^+)v?2(|nANwwTc+}sbw-&-MG|d7 zMwkZXL3W65wYu^&>^0JLv2n|J8a&bQfWE>oG2_}ix%WuNST;rO*0&qR9ZdsKt);cz z%)fd2TvRa=ogQq@O!}18&D*o|krgbdFISyy>I)U{cN}I<$A>%i!Pz$j#!iGP`fe=J z{q*q-*iSh8#)!f+zU}f(2{6Qaouv5t0Oij8az^w=l^8E7%0>~j7ZTCU@UjRs&O7Qo zJ7hn7m~1~oOwazKZ^5tr)I^|No~-oD_vg@_Z?WQ#@2QISUcu3p570jrv1i;)b)(hl z@ud~zSJJr!bOdgrjLd{Ll+G{7=bJ_EV2#yj5#9sr|Bu}Bx%9n>ZPAR_5WWW?!Hi#a zA5Jo!z28mLcdZxMnVMo(GD5Vh$#^H1xPixzo;En=qb}>-WktvRONxk=My7?=MY%LK zj?N)v{B!S|YCbVz+|0ux@XfRJ1Cu?ml*{JMJ`V0b(pFcPf?`kc^=_C&dKs)kSb>Kn zDkf#VuDNkEBrmwz0HzObAEj*tnqLoi3eQ;aE42RZ?WGn53dBGcFPo&&`HOfp%o-o} zky5N10m0t)H-ab{55V7hSyc~k;VzKoq7^f|WEe|S7Ya)H$cOynLsnw`hdFTtf> zhz~e?yp1E@DtvH6e!s`JYUh*}u|q{6=eFO}q~RxXt_#{^Q_c&%5op0!B6YA2Bvg|T zJAFX}!xl%v*_P@`9;Wk}9+n&V>NELLG5aZN#fW2iK5ti6lp0Imjj^PyIzwWbciw4> z$@pDmc;0)QowSMbjUWeLw{tZwyI($u)E>{(B5jeNRdPzeiy9SO-%r5n_4S=@Jj3X% z{IM~K+0~xU3=c3E9dzi$9KgqN3*9FZPQ7;)jP)e2Z+J~m}$56374s~yy>O$ z7N={9yGP9yv($)hksXHDcb1jle1o*bCk=Z~X6{rS`}g6G+2pn;+GK9+-YxB(x3)>H zoUH5zkF!g4di$mx)7BgQ&V@RFCr<5*E!w@AJ-QX>j`iwT<})cv@5=H5L~gWWS*65= zro&ldvTeDy#7i@T%*$ZjOS{*mFexqBx6gU_F}SBE#eAYn#`_s*D?W_$cE4gtq-JPM5`sU1LXu(z=^-jJ=uFTO&X_QtaY zm%*oYF4M^4nc8ZMN9mDq!=BSnvKG`oGG^3$KW#m9b?a>NPUTku%+o%>6_xX&+y~&; zci@+AEoeDiH}r)F=^-b#HEvsWyZpH<(6p`qR{i~KhD%DiYMUBmLX~@*l|MxwEN&-&Q=Oz&Tz!3q zH*=bkoRko+k|D2}`>ze)AVW?z${?ruQ6+)f3{R5}Cp52lFe`rRsA#um%m z!*RvyI8%=-=lj!|N^&vVs>_1ZTYrM6?wk6LFX+$y;p}yUL|?ma#PBrE8NxYbMg|Lv zGARw2&^9?T*)-xiI@ti}&HJsb`+14Quz9TW{(_uE%!pEHI#@Y?!e5QDZ70i3oYj)~ z&m4Z6eCXp)AlO^29!ChDxg|9J{*SlVahIp}(swQhQ%&Du+qrx#yD4iYR+@EBh_N|K~nU3_8-D1U7*@<3nmva~$ z+6ms=5fGjl&i`mbGv=%jA!oZG=)LAGZCR#f*Vff=f5RMigUe$AA)0pY+tDx2IgVM6 zK&x?qlCM~tr8gZ!{XZ=x;?*|3iC{9sHX11CgL#}=AoM6na?=hLfdvu_|@!KjmTriu-C1^t` z?C#e4o=QH=-6Q`aUe;>_sxz3@pb6NuQ^J)A0nr$({R+BWGGul18hu4L`TgUiUQB;f z_1Wl@08enObHB@^Uww-Bp9k1#)T6^NtzKuB=3~c?t_dHMfTAJw?PsoBYxaBMz4hkg z6OukPNvpejuKM<5n}$h#K^~;me!ZQdUqQ;|jJE|!gEl;7cu4&9U&Tf(Lj5yJ=Dr9% zT!Owjc%iEQ%lZ4Q^`hBbli#8lH6DdbLU>H%F^-s7)InPXZ7J{(O}8uWe2zMAUCeAtV=U#@j_4`^w36N#cM z$a3DDnvK!bmtHTm>%-vN==7tEdVPGKWgrK=*Sd7(MtPp8VDmhbQR47yzvTvIV=UF& zE}OuuA z3@j8kZD`OCwO5LC_c=?yrK4z<uI%q`6Nr%f^sm7x@LMro4JCxgSOkc?aV?QH3yy0ZKB z&~(n@L#a%vC!;;lDB@X}Ji^SV>N{&}k#{qfrh;^x1D9JAI>lPY`BF({snZ$Z?UT}z z9MeUd{O&V(FC1QTb>AV?eG^6Nu&@0JaHW&^6mrSxTmSqKcNk6_YO=o0URTVUUgmsaQBDWR)2z=h7ah{ayb1rdBcr}wG?tstLlI=5RCi!PS;e%WP zJ$cnxPtYNxyWak{r)6Id*BN8I3E5c0&fRss!8NwxS*(ZHBSttMoxBrW1{QB9O{wXo zf~JI0$cRVTSyWDYa|1&`Cg<{ z)bFQ{g%3r>A{0g;KlNNUAk&&2>JDCSfQ=Pz ztJF(HoDJ6;d}OT8i#mdWNM^TK6Ib;{QS}!!33IcgZo1h{?1K2Hwt0_G5Fx}s z`^_&R$Y>%=*@h4^l5kNlrrcQF*4U9@1`EBq_A-o&tsqgWPB0HDF&dOC1%19MKh4Qg z(sdNYr+r+Bw%n}lRcPZjT%MIXH$C72x+qj1hbejxxGq`j`jtIdCm|XpT}ZsgBf+{L zz4*h?`)xDd%IXjKCHM^f1L`@%JoosnLP}5*r!0fzI`LTU6M2?V;@AXp^LwlUY99K| zAzCx@C)96twXuhQ2T$MlO4D-a#Ya~QG;(S--RhAU#h$ZQAp>o<4UfEH)7`_b%0eJ4 z=AG(z&@}TNs)7c7Xw`i)!U3B7-43hkyP8Pv?hoIFtK$O&k1%ekWETA3wpQaBt0-^D8xX&yYdJrj;4rLb0c)tx~a|G zKN*ufBA*Se&F6;5qWQ<>zLGgiEpIstAJMARC?yQ&H*-KJz|A-fJX{-|>A zZDYfz>sQ#i_f~p$rInZUlebDF6Pca!Zf-gpv`e|w9=;J}Y<&o2p%~6K#kRz%&v{^) z$K<O+KE~g~{m;6EDjIP45=PS0pioks6Hhj+EP+D5>jIQp6+*u_pNHvSEKW zD07|qPHB1g)zo|*S=~$~BA{P?7e`gGoPnaU?4@u`-h%u6a@0h98J=iec!!WEfO0z7 zDeP$n7_IIoYhvzISqqu&>_m2(bii~d#O0>Tre8_nR<)Ey%lAqM|bOKK;?%Q<%ML*DD~!E6}4uc<6!?|D3y&*NT zY1~S^A_ec=p13)e44ll2=~T6Yo6CgBg2B?BU@Q>??zLPje@v>f-kmkj(ZMUCUzu3)jk*i=8FWtrDsE1pgZ zzI4jhOTqSy&b8QeQfdr;g5Y+Y_1A_g`kqYY`*W7h2$T7^J`sh(+atNsg%w(hWv#n# zYfyhk_tr&^E8k0>SxMjPw(0bO;N!mW7Hfriz7`^{NIAnW7D>@?`Jb)*g$q|N{>za1 z7Pw&k*_Hl(e6k*AJvOzBT0SV|zd-#bcXKTo>ovQ&%&<}k-&b-M%_!nzSi6~3xV%(& zyj1we*WL8c!KJz{{Qy>@-Oo9mqao?@tsD4<$$q zn@LS7x5Q4{z-Z6j)${)~JZbU)aW9gvJoxE$cj-yl1}wnAGcB%GWZLOs+nAw0&L&@u z{YY}BeUP7>6fT|O&!WH?m@O~=4&3})e1I@Gqk1W_H;gAO_C<3od2%`K;`-yYo18fN}U`3#nR2lLZt_}gK7`) zeaK&7HOMIyo+7*it`d{Hdu^|EI2@ikXJlq)fpB)d`!^1H%U>FYcX;?LFS8;2cHkH5 zwo;c$Hi4B<@As3%h={E=)DYzDqj-A8gYa?t=eF!i3A2`InkBM4Mp{5twtb$cJdqeB z9Dowb=j*mvtCzUPSv>_q?K1ps!3aQrr+G8%oidtd?ck=V%B@sk4yT@j9tC(GG`SsJ zELy;M1fN)#`filF=1hvbh_c|p{;pGA%Y&x{cu&#?tqVjnoI3rdh&)1q4J$7ddhMFY z)T!AnZf|Eq9W4WYWl*+_J|*sVLpGK_e1skrh(Hi@2@7P0@4s-ARROvri3( zF3oVAr>08L0}^dnpF^F4n6p_$m~&`w_l0m`2B<@Qr@yJ?AP^K^ zNq1P2-c4K-%`pwD70l9K^9Fe+ic8NkG!x&7<{pcHykI*#j|!9S-P-chzFT|@APwg6 z(|Jbx@^xu>!ZVyO`>=psn}o#V2E?NTUV^XMJRk1JOv;{8zZ8P#x9kygZkwuluVWM*R?y!)M$VDqLZz^88-gC zj))MfY!FP)SFeh`NsZ0jun;PVF;ztVVZk45tU-Tg# zQ`V=#{VAd^0tA7HkALWwC&ELmNngHqXuvzRA!l4kLah>E{TBZcNb8<{O?155#phnM zcC2i@!x^-}BkSDbxF>hDTNM7Db3uu!cUS!i_0$W)6UgZGvzL~lpUEEQ?qBC9=siUk z^7$r*emV65xf|LMyK?5*m7D!b<_7zYq`%gF+J}J{uA{PQyWyXRT%xC69wdcsUP(`u zb7_5z2Hw={w5Ua2hsTS`kO3!&LF}j61fDI2(LT3)GTg(LC1}C3cT~?{Cbymw?ud8d zsUE#h7QByifks{!0V-?UJgwe~Hkv!{E%02SJwHAZZ3jxb7YB6?KJpbr6V!DpDSIKi z3jeHKbhOo|wMJa^6dq^53dmtogxE%h9j?$eJ?VMoTqFcZsz4g4R{l;{hDUaAvGg(9 zOp5h6B}%}-`ii5F@}9L{w?+FX>Jw^9?;*ynS14L;;j_yZfYJha+kkTqQVl|G?%>(^ zy~~(R^7lO%0qM$EQdPjo%2dFsc5Rm% z+CWJ^7_&_|0dk8O3sg1`O9d8U-EYkDbju&#vvwAmy>MrG4u=E5ze|vPT)N`mtV@+U z-PjPj55RM2)@g}KD)3kFhYKc--snjtLhU=}ra%Hbpz!HUZcXAllhK+-KV%jv>-g?X zs0_TRBnjvkj@kQ*{jSxG*Rs8VQ||A08zgENrf#Zvlep=#D^PfANiFZRg}gIstm0iw zytjH%X}92!*lu z6%0}6xy{7HT4^tJFp<^XDHM4t&6@VL(&l2=GMoY78&w$GendRLR%5}LuZyD7#Jwci zvX;05FEMKuMpR+u=`hU!_UuP_!Cmce!Bl<>f+hawy`LC)^0M^{_$%{xQ{%?5V5tll z!ad5Q(EI5+u9?z|4~SCYYa1PXd#gatCD@}02 z+4+f$05}D%rtLyi_2`ghH{OkhO7!hn^Eex5wOJ#?8ESe;wHgN**RO~MO!Pl!nRNu#Rn#Av@)om&!j@@F{} z*^vuLC1?z{6N2H-_aZYXk>np^$3eUF)&r9tW{Yjtw&ZOtnk6nD7*$*Ph_&*~@48X% zPUY_V;m}=-V`~hlCcpqVY|Ot#5)}8VX!A>J`(y}|R71InfEHXWC|oq3wL0jeSG0^Z zJxsSweB#cBsS~M}5Ir;(;ccjc3a)O=eQ%XmJA#%X)ZG?LPD}R+8+s87NDCs?mPvy? zE7678)l=k5YJ#>*&@a33sN{*Ql%V;E&&NK2M2yac%&*|yx8EOQS^-_cR`5yYrHWKQdPrGJr{+TF`PYA~BD8)YcyVG_N4qW6INf zx{CZ|Jt8`=UJemE6}zTmt&tjjpH*6Rqpr71?v2(SoOgWwtK~JrI(z*pwVzIH~*x%}DPAve)!^rwP#6i8(G%z_l^@wo9r zt{tqXeHiJ=CSZ-!ZS5{FuHK|q9Mg0aJn*?49P7$i|8cH-v|uO`NNCY|JqeD}m6LJb zC$G9m`RVS80=@PAGqnCKV2Te>nBzCS86*JQakg99fRx6G{y++d6jpm+a|CO$EEaw+ zB8h<&Oi1xN3dUJx(8$$l(XVUN!vm1D&EFJ1USJTp`4Yl}5rp*b%fLjA z1_R=6)Qgu4Y83Rd(zEJJA%n#|?ctW3t1bn!G|9Wm_6JtF-cIlIf1HB=n=rbbZ$oXX z`XuCCn>I)fx_WJ`=Pgtg>eR$bQfVi2oF3>z3?JBpZC*ZXw1{}EdsO_4>zQQoiurG) zeq5B+<~1p=YF*y?r_ zJ;o*$G+g4!mG5Ttu^Z)n7z7pOZ7tA-CkwJqcRN@!1r6 z&p-B4zT2_YvbBp`Ft|L*Wq6Bta9CC8^ zPl(kcVSoZzc80)FwgGHZ$TQbdM2&J^(Cs6vuX96 zEz8e8&TXZ6Lan}}g4%k66-5&M=C)DJgs61;rX|rpPJg21@6nX*xR~AH>_OXvj;G`z zY&LkDX)1E}8#7S`;Kb;sH{6bRAs13%ZAJZuZ>axSyiF|;WQOU|M z2(O23mWDjenJvKdH~&;+s(`g8ycF7cIm9X&b|=fjn1T~FZ39U=__nD{Wjn=jxK&`5 zv6s5Tm39~g`H&jx74N}kcndv{x%isrivI9{WGCfY&pHGxbYER{LFGhCu}_>pznZ7=0IsqKBEZ(qa)U0-iNB~x@5K6&R)#}St_YdLG%Bh zF8hm;OjQUWS?05sqej~~AKir+v!v>5YI6Fta&RAHKF|u-*R8ZlluaO|)xO-|)#bap zKsE=^Z@s05epSgBZ<82n+9ir<=ye?}OzO{;%-D~$k3@A{K5#-u(1vKxDO@s9!Zey@`uyV=lBTPbX~HChj=M`Zt$#>-Us6P|P; z%DaC`%;JKfAX{Y*d?`_9yf`vE_bF$`@bGQ$3M_s=sc4P81gvLyS51kIr@x9t9o;r;?#r%N;$_d9 ztmsK99(t345A`)p5Qy4Q?{KGjEu5Aln+)qKib9i8UR)i#vKLFjQNOhqwj66NM^9OB z%VRN&Os!3moJ`0te$TW3+FdK6SSNQfKyy^mU7K8MJKRlDBW$Kw-YRONAyY#$OHtnb z>B%05X1I#NW3G_*UTiCqfM;>RmcsBf7~WqeKwht?WWoNvel7OvGdV&^H)`TJl1xb; ze6i7T3+Fd;EIEJ!IRxM#kh_hGjH&%e9@JMRKgtn)`6?fwH!T^L$D8MKbHl_YephcEX6)QnP z5B5LunwE9abnC`NO<&|R(Y;k5v3pU-txoGxXlIGm=*^`#N5)g8U1q zFDE_gPaUrFL7zGZYzditD%j~M;wYIk(y%LIP7Bsc3dIEXx$Xoh7PvH?B& z>8J<3ob<7p^mu2Jx-erp+f)s)U{W7SIw(M^15H`jH7G&}XG86>!83*r(K%+y@qJJ>l}fF(zDo%pVvN=uyxkl z64#19T~3xK;%0n0t^L+?r6Pg!<4%;@dfuKTba2&SOezq@TF6k@Sd*LRzJw_#nPON^?z}d#Q1uH3#FGRJrCe+`%Pddid zTeTj_vgfwuFa`x87#%)-$*&mt4eiKg0cc*w)Mc~ozZ<&0eDCuQJgge(S zRJE-&>j-O-!4`<4HPl*dC*~g-Jh7kd2=3AdQWIQPVVMr99TGKD7Wp$+z*(~SwNs;< z3Dwnn%f88w70*{t(ER<)42u})z{W1G_rD&-ul~OM>{)W#+uOxMn@_ITWK=8@WUP#HRgwb z+H%!rdKdn@3S#Q4|*C(G%2u-5lv6`D$z!KcrgdYSCQ_)UPLiXYE`u*y1???>gx%*yr+#~qyp0Rb43{th` zM)M{aKWD1A&^bK#LdZO1fIjrcR{4;t$Hs|%Ad8ZmZ0b>sG=ad`NOndI){$pw37>5I zHR-U(i5oFQC9AH?_q5yd7?0u*wcqFa(fn=n;|j*A>}H@3DE7Vl2^3S%P!Xh+a;04o zApyTzR+Pp6EiwYlrXlB8yydXr7X}tVCz6TECtw#d;i9(OkJ;;fF#l(5JBC2hF#4`J zijY)nT|nS~#-QR25reFHe65%t@A{6qRcgO+5>?RquFfAqVeUkon^!CuX-8C?Tv_WX zoYU13za{>r=Kgksr%+b*1TyP>;Yvlf@DqF8U7^QOjTpIgW9Q;=2bos_HBD3r#@1>~MUHJ@6x{d*ZV^ zCyg!Y=r{g^f!`1xuN(_!ZN3j6&33{%`&EC&@nwhaR)2bwhj2hwwMYyfK|`Sm zb6dhQvL`!Qf@b-?es(1y$9t=Mt07ZqN1uPxB)&f~?JS6>$D>wzO31N=MftCfV|}+h zPYV%?XX>#TXNSp$3ragvzX>oRPhie$XR_}y>AQhoYWZdM#g4n)Iw_si%r}<};cpp} zs_2J;D^3XO;}3$XT-P^NBTO|fUZ|&uyx(KrJ88OkD>OCK)3W1FcAx?d^AYXAw z8-_A$xIU)-=R;^cv&Vg`UY*iz-RPAmh*|$04jO@K+_)@Nt`n6_qo?rv=N_)AVT!3= zmD{qDv=y@-;Hey`@+4lOw~+EAXAFrLggR+_el~mY2;4u)4?NHqSU3?7w8V^!KA`*82(|G$rJoB z^|%y7NpPD=$a(1HIom_%U7Z6;(toe#u=iTp0VpSiPFw0xlM~A(jSmMRW89F+}Gg9W(?)z5(qj>NC-jvy9hz<$5pyF+^{AR{eZ$ z2^eH=L2mlqmcz*o`;NNyhd&e5atx*N2P4#uR@F(DcnblM$y#ANZuJG}D`$dMC5^R9H%VZnuEym!qIHv!$Iy(u}>+WawnE4+sjtfWEtO9BfxN zBf7C0o)fJGajXr8vRKE9oJ5`O9<7(2;TAw_EElm0%7Uu_c={)?81uw`_9+Je#h5oq zOqMtt&j9^BgejiEUC_X@Zvs*Pr@1r9#bFGNUCP*9vN-ogb91Hl)@G45L9@#Mr}tsN zi->=Pe06tlpyt5%_)HY0VmK%N?)7?-oa$myfB%4j5^u@h_~JU)@`}am|FQ+zq3|37 zNG%=ovKbU;y1j*a%=vpSLQp{7Cg*kl}sX~=DJ@9f({B8*8HLSs)_ou zaKN{F!~?WDKmhzod>Jkod?SvA^)G zk5Sj8nGiJ5TfZKZYGfDx9K!FvyRlJr7A zeJL|~*nysoDT()8s=6}{)kAc-yNeB4`Yo)C5^d>X??=R47bx~tj$CZjt`~MLyBuG5 z4reIcx5*SUeZc+&Fv~+KoPz*bXHSNvD?xoOEw~R!$ef?#vHel~ct+HzJC5(!z_>WT zglN9dTP-&9nNk}~^`_BnYV{Sd)~OjRvZ`Gf7#e&^fXd$ogwr~cGIPt&oN7a6w9r<0 z6=2UPN|nsA+#GZOEo%QCupX2)A(ip;9h!a@TFa-E$a;rSa5NH^mG1t665M7~aavGk z7v?#?aEe^Ooerrk8G+{)Ufi#BVIvrDZE^1{2qDgOBmdV>vyuAmilP6J^!A@1J?B5? zJSdOVdM1P7t$(||ywg+YeHI1^M`o87(1nedmjg*Wy+o2qg6`^&Z_!H?ryNI41I|5a zpd>7F2pUHiU;tL<+phId)t6>&1Y4-AoD9G>Y!5!joytrzrDvW1B%py zZ?^8(`Og^aVio;}wZUF1vodeyLuFyR*mYk846${F7OCmsUw+U(2h``&E@i*{{Tq^r z!?&{C=PpO7=^X@yvgfEBz3l8XWn#q-Kt!+1H1n(6Ln@vedczV=z4qT~e*G&9y-@eN z(t6W>(6)v>eQ{%Rh3`9YcW9biOIK@l<4j$nB)s+-WU*6 zNk*%_@7GOVALC2;9CV5h{U<8-u3pwY)iW?IAKGwdTImp}b0*$!RxgKRvig2`@C|`X z+_pLe%~~LsrlDb~ld;`XG2p%&({*Sx=1Pa<7{V~Fh77+8yyxuck`RniSC92DYYjyn z4Zq_(+dPlxw~huWR5LlFn^uSKuCk3_KdHc1ZlcpH1y5c=>R6nSOe3mj9Zzx4$bz=< zD){K@uwD7}`$gMNE@HcQJ=^biDpJbA%U7%GmQvI*SM(`X$-kW_<@N#9&2ZPhh3Mu0 zy|`Ihp~zMvO9)wrChKoos#Ss7)U-?&W)>HTE=`VP?7VWuqbMH(U?-5{FF}e0H4}Z$o8(|y8=ba=X zm6HPd`6QXyu~$^Z4ZVZ=h8V{d{om0+bUJOv-*A?ilg~bawme5e3KX%Tn@37DbeaLC zAGd_!>R(sTS-R5`d}M@8y^l(yUC&bYWq-N86d3g^D{=~o#k!u*SaL_%!pT{sOMsa_ zVo9-9OcpCIvmX7#Bp1pM5^gF^u1%b~GUOXMUp?AjNn0Osv~A*lR3tS6N_MqhvF@Y>`;znH((*HY4EasCjUarftoCma0SM!wdH(*!~y(V(W1? zi7#TwEWAS}6ab3akhdO~df2@~{X*-@LKWpz)~O9<2eadINQtrot_ExP0#v|uMeNnq zYkMgMaF8kdMIB9#_5~dkB`xs}-K&4gV!F_02LYjv0(xU-W@F5jCMt160S&m@=?=%E zzeEHwgIyD@#^0M?H3CD&FVm6}v{{D7@Sh+3h764ZX)Tz4xydl$d+trLiyP1G2AWm&3E<=g*cL=GX%L z{Ml(69?FO16V2XTJbuo~BK^QxUfd1A40V7hz!SPul8Ld=pWgkGDy!WP|NOI%(I>haxjs`>iPA;r2OvDM4hbg{(c!x%01)@%kp* zrKx44x4!;Go#Pa69dXhvTeR6`fL@o-@|2J~JpeS4Nhlc1SKuVLLN6khIG?R&8K0AI z%z}`}jg@#C6POd2nEa>CsC*B9@^)dTS}PvGPbVxiyO zZYFzkQ>z3>Zy1XX^B9eWO_BTYYkO<0;U+TMcF` zH|R>XLEN`zGKQ{n`9jHdM~zDjS1~c~)b%c6h%bWmB0VZ^?CDkM_3?^kT1p3%nL7r&fd$0N|Y^Q60@ z;R)a=QAB7LHpZer-2qYE{EK1lk>v|{j^vDW9|RQPEr!@b>r(3O8MTh^3X(_qJ)4fo zYD1EOg&7PLnX`#oPdoe>mWE)Y3jL-yqgiu{ zU6T2oJ)r8jL8h-EYFT|}u27fFXe6`NMU3$ZJ{_3BPAv3zsckE_;7}&=NSfbki!XzWnzL*d3yPFZvVIL3*O=oet{QyJ~d5=8s#f zM-JiWNrN-?%=r<8R?g#pIHJZ}J7@N2YS0t(qTNyneD3pa3X6`U1BnEW``T!@3CWSI z0l>YqQ-q8zu2B`O(7tS7$2jBFtYKA#45`aSF7Z(w!)&WseB7X2CSpPmv%}zCh0r}( z7HjrRRI-NP)9l0u)r9-54e*|}lDd*FE=r&8BqbKF9D=&Jvbr@{Cu9ik3p!SzUYC}S@3xH->mJBWV<)V^X z(WRsibZ#g?u1fBd{N)qF$3c~YHMsSP4JdyG)tByf#nq;jhFRv^x&F6zj&Gp|1GR|pDiY18L<5JcB^#L^+%WW%1RQH96y zugKO>7~F`xu>+vO!(SUZurf0Cx4P zpI^zgby(OlAAg&dtM;Z$p`X)j{d-@>iRMU+=uIJb#n*^Jk(kB9pOtUu(b6@!AgavJ z_kDVXmS5NXPOJV7&Fam^S*`qkD^~Z1&&SxyiZ@T9@^53Y_re77soouR;W3poZIVF@ za7_zeB9MyeBzKdaf{=oJ0aHfy;ST;jA(fCh5VSzWdQs~!N!vkH1_a)0J?M>V37BMYvWbU z+scB2ZE@t6^DT`t0JINdwW05Nx-`g-om@WuhWrm(8a){Ogq`IJMQ(R#!p^LSWDQ@C zcX{wOGitZ5i@J4r+g8kMAY9BVs@{Con}Xv|ga}LX>T9-|&+7w$ z-r!SKv+~2^kl#uq0GRPcp?Qo)OG)q49)YpzSVaP4XylJ^I(Lo=v7tZ`=jZVG(bL8>BQ6lntH@a*JIBN(o9?_fGQt}Kry)W}grR=l$gC-8 zY{POhudjthlBABry-Qna6}LHxshvaZaCI}r>;7i1cpwzjU7*m6cR1I|q4oP&$t|Y! zD542A_MYWzi+L;PStnxv3)63i4cfQJxp;?EDR^=ZkPOD7jT)7T zq-A8O^3BC|K#zN+IQXx`4Bg5HSo!wP`~3qC^A+!Ht?Mr>O;0V;mQtgzteb9&yf76V zi~GB5|CuVSXE4RS=>r#nd~9!FI5GPSJR^%dXCdNDL+h#SL)Fw$&xKOuB6yW*b24Kk z+yi{tFR)&bnY(ctB8CMGOy1#i2`e6q{f3?t`3|8tPS5ifxVr*CrLn9oF{Kb8PUlAh>ahZw3Bx~BzHU+@~v zR^U})UE(IOq5?iOBE+sia$thtam8;5(CO7Q|qf_JT{=MP_CmhzFw@J)jkwx#I8&^s54 zewn(^S`CCODiLFgpfAR$*mLYdia?2qlnoFSKMj;w9slKU=6Q$2pPONQaO)ub57+Q7 zBOiim_3^dh&cA>!jwVaCm+&j7QSPS812H?wstTDrh5|8i5AQox+eM4Dw8Vt#gfVms z``QLLczh!zeG*c^kXnbi2N9@agck16M&}D3o>s9l2Y(?;00(t706~Wx9*EY6RSyc8;GLnvLD_JrIWI&CoWd+86!V zgs;GaD2-xB>1!BczZhne_;DlG4)3m};fBH*6GZ#_@*hGizWt{9n5>%)k&KL z|Eodq7xcdx6ea%|6b~zaO+>4zQmYMi$A8@|KhtDX&~$F~;4P{PzbqKE7pgfQR3~sl zv^Ww?UJr}Mm_q>_cS4fc9Ab8P7|zhY5sBtqEd7Vp9Z7?@l%C3B)9d%>?KefFTiIo$ zbdLR1Zb-8Dowc}7V3JdZL%UY5--S5UWts?@J}r%|ePXiw)ym#biFTF67H&>TjC(zQ zc!M`1n$qg)2_Q!|>Az-woL!{~8hbK7x%fJuCtFEYee?u?2{U=zzkR*wRSm!}w}Q6I zpIGB|6=vs6mwO|7c#fc<>Gx#;z4~RSc(BJ~ebM`fOEqO?(5yoo#%V z_%c_jEBe^fm{vz5oD-#Gv5g&N`YSVYof@{XSUu^$cYOM3V4Fe2)c>tXhwztFo#}fG zEa=uMsANbVwH34$E;BVBehLj(urm88xqid@Cye~jE2n`m4@0>{m{d(_*;-uSgPG=d zUX&%61A)=YYNG%6LY+BBt2|v@Je4uA5mm`ySh?W$(bhZQ?{$HV>YpJG7ZlTe&HN#{*1@=buWCy+HURdb@I|eUp>&0 z)ROfgfwU{S%XmmEN;Tu{)U++7u7Aa;TDYUYAsAVA94&cre9Ia6*)u#F_Mc;m z43-jIQ$zisDLGZ5)dsE?1$1iD{pe4~%vNwIxCHUqD_}m!3S4pt1@~M(_|w2nh*!G_ zw5-`HVBC%8K)sBEruVY08?{i6+71&;G+4Hh^{(b)_jARoTHCHC_ zJzNM#ULHQ0L%rF)?zJ?=4P+$*RA$rjrYa!K|PSVsos~foc&Ce$5M&KO0_qP;r~1J>kV8H z)vM4vLn=lAeM=B{8(A5$ecnh>{iq$6xeK;I-AM`F9Q^De^{Tdok*E1uon?$5sB&ua zyB;bWpfU5Z^2>3DshW+Vq$+?U@~QoXsbXJR0XZs67faLhU2Eu#H&I1rXALN}s6^X$ z!}vur+b192L}wn*h^L%6!Uw^1D+W7_=|D0| z4OtYt=N7%Fz2skBj;8V_x}l2qqe3r*r3I3WosT>n#gr&OtM*3z~}L_I%4adPec zx73{%>OaOTBPK<^^lpKk^zOv^*Uk!FQkpAiT_zu|29naJmu_mdJKNR;1OyCOQ(+M2 z^!@3hD>JDkaTGkQ9U%iliJ}&V#B) z%>sQS7kZs#Xq{sJ>9k0egKrmIuxVNyo4BWI&PK zZmXbhCp}b?7VS#{Db8r2e|uLT-+X%9#i!+veyfW|;>dh5Ju)q)j*F+-LSblxBn{GctW@Z5aiYr$qLp z=}4`=H3I43|GYm%C~iZ#Y2gr4svhv5BMgXw zTu3hjf`+Om(X`O9NYq@2-(^xEsfRbo9Rb8WI95j-Ed$A7&VmHaIHX%8#zomIZnP$X z6$Y5_6wIU|q-(xB3nfktR}S=T}1*b;h8Pzdlmgh~_+!wqbA)ORU$- zm%AU9t)M@0-g=QRt2hQ|*A|k=>hO*;NBv*PKSq9J@UW+Y=3tyE{L1O#cX0bhq?j>$ z=?abxD5>Cf_#uaBCW#Ae5G=%8ifJa5GE*M|y;#u#TF9A4Hu6=v`4OGBAs9^?Y6fT| z@fkQ%{bLw1QbIh+eoWAwmte?PGi4kJdpVR2%010rl$BBxvQ85pLK$-LA3pn$2gWdh z8)`MbCqMK0?!QIWs9xELlpkb6<(*%Ce-d42k!W+EA&`Kp*2t?Ve8)kLjoP@DK#wwx zNUeWyV8nD?U`Tw2Kz;N&~ zF7e}`R%tb-v<(_DSPMHrFOXxma;+2kbn$)rAP;*o|LPKeMc~{rCC}a>^KmtCtEGmp z+e;dz&U#(`B5~`fK9%vOPQ{_S(JPD^0w<|I6?UD2I1gEMU=W)SxUpPL;x4#Hq=5fq^Hp{m$v>{D)e(3FA1R*Z9 z*B)uwqe|VQ!ChnX&dvJ+g8MmtPrqpi(A1SVN3A5iG?}%sD6bW`hIgwG1D5@iGPl^K}a}|2IEX&7kT5MwQESP7?Zi*E>3x|`myS;U7yCH3n zG_N)UNhR?L4m$Tf%)Z1YA<1|~ESu%dCNtOngG+=angMDAk@LC#+i=^;BcPkp72mR+~;oawN`hr`hfk7 zg!5+u6pM&8Fk$66OJ%@v zL3uIY#@F8k!n8ckG*Pzm?9bq6TsOy?S!d;m!XRdYDJG;B?FH$l&odfX7b6U|?j|F5 zz8F|N9-lA(aVLXtLT7p+T1Yl8<+c)NsSD#;nvI-%QRIJlsdQixD9x3V8L#5L%=j0z zXg<7$F0SE`&7x`M{NlTR`%(8`UQ-%8abEn4l)L1@J4X#^O3a(B%!book2Ck=(}7h& zB0B!($(e$SlgFHgwWpN%73Bl<(u=Xy=|{utQ9He*TT(NIIS5=MT{eAW`*fTv&3s%n7$q+?c(D)$D+=B7(`4=ZISl>OcJ)}8FM=~=%=aOHyrEf!0*8W6`p*q?ux#ez$uQs(0p3fQ8@vdZ>SIfP6 z&wn!i8()hIaUJ!hH7Y23Di&G13ET~ChI`>5>$4uRnt{2sb8tr{y~Pavl6_rTd%#g= zMzoqdNQ;Vbxx|vn(Ik#py1TmlD*H=l;h)OYbn>yXAX{RH{=;=5m7IN=gOi*|61LXT zpRUxnX38(+^$|Wl@77gh4$O53<_zlv{i-?Cr@P5CS0M+=G(06WWDFnR7=J8wNmFS8 z_pHMe;EKqjbo{X#q5y;Uaq^#4TA18+Xws{!cCE+#3TL6h>N6gBUn>8-im4dLbt3%r zvZn``p_qubSi&}^$E@7o^{Q>L)wk~mIeVDr`p>L1d|;ABMM^@gcX$3E>t8{kfUCn< zuB^B#n+O|t+kv(U#%orQ1+tL0&D+#NTzBO=f4vxH6we@D^CLRV4{~YbnOHqTCeULr z0XLWV-dy0C%I9tRn#~AGB=L{-z`y_rB%sd&N}p}*GnR58@mebhyFW>%tEDM_mA>WK za*e|vpMW{y{vY2)rjH-Y=Hiknl|rjBrquCHN0~S%VI{I^r5M2m?ST%M0-cY~k&SGs zdM^1MF$B;yTFwI5-MHfZ4|DGw)KuTD`>P1(gNTUq5&@MC(tA)*K)N8kiAe7tEhL~) zl@gKOrFW2CL+>p}?;S#i5FnwSh0pW8d+*Z->4N@kT%lo*!wYfT-CLXpghsvQ8#Zksw`y8)gcTjUxoI!T{!?jrs)gM zD!Kd%#h^rT>8%fB)L9gutj?(?%ohSfh04yHS0|nxsDh`dvT?u`>c|vR%|$h`S`Mna zOALiW7nz3~DpVJxMzUMA}HI>@3j>~H-OqBAd8q?w)w1M;~*2am)^y?8ytxHHLG0fpUD9( zt9t5}F03R|*D?P=8aldr?0~pay?<92T7Iqbv;g|BgXeH z{7}M`d~-DvOH=1vCu)vtipx|xj7lcf6RO`{m;O&9TjPH-vfZszda1Fy$}30$3~f|f znBiX)N*cg$Dfvo)^ucQC#(NZtM^Wti`G3qnSth0J{)pmUf!r<1&Fe!A%CGODQxIf* z@)F~gy}ulQG7%!=#P{+L9ie46g7=}6j9Rl^Eh3P-fY5|G{*bfmg|_0B7jK4=`%4gZ zK&mf^#B(F&39F*Ij^S$#WY)CTuM_(w(aZ=#{ZzL~H4 z7Aa^k2jC@!%h)32V^pu+3cVga1T$?80}B{|pYuaz020bwIIsa61qt%DLNi{Dt-Fx- zxfSFnDXtG(KP)i@DSV)OIO%Zt%v8rMR165N5S(7u&}fykq>}(BlHE@ZLf?r=#inMu z#jpoaS%Yng!jjj>%6FR4(6@CNLWR2_Pjtf39FGmx{7`^P{{~ueD*Z?wB&os|)$~*O)d57Wxq=B9JOrI^X+B!lj9$Vv(Ad=^4Mi1vJ@D zZ0bM{?-$Ac?frS2yzSQ4Tx?x$0oJzA#sPB^BESl}iRA0wR2m5IDtHu)hz}SZ*#0IN zuRsc-n{@(~j<*aFH9IEe$AWqub5CR5$Z#wks}9-QBthyx#vVao4Hwgs9ES$5>Rad{hAa=t)|YtXd>jg}VoDPFr|xT9sFWp!rE&{&YrU zG&I~&tCTHHkRlnVz0nqzDUP9uPHa`Y{t(r!y!oT(78-RPxVf0g1t>_hb`Y^~%}--1 zfPOTd(}Pe>E$?fuh64RoOosn#o927EfD{y+Btr8v6a z!yL6%BNO&N&!<)>?gNwGsMksFizS1CS#~WYUK%gCvP1kiI+XnW3gXxnn= zY-^3@bG#8_gF66&5Rgv(Q@?*^I)8p50esKb>cK!elTB#Iw9?WN1gNj-^0#-|8Vfd2 z>BA3%=Y_Kj3;jTFM>7GKsRq?k)k-o7YVpkaYT?!Hj{{rmLr|C)STO6_+! z`JQ{n&}^4Q6Uwyr~!}YD!?U|d;%2rQA{|v?LXZQgOoluy7D1k zr-79x{s8BdIcBaZtEOz_)7jXPs1$nf)fTvF|JaW=pD_SM|D5Wje}(V6#L=GX4fo!V z8?oixPT=8M9vuE<=2>&Lm=@A~41KhXS&)i$)_aR!b%fpxx3of;Ktj$CFvykhnB5wx zKKvg@ozkU(uD)|)3Wk<~gA0vsG9$asC*`l=z+OE#v(JOSrE7_hbUckf;En}xvG4YU zf%sBJmfdSQ@INv3KH0WXzEQ9y*)G!c;JKrA5)~QsYJlZ-Pa_3>&5kneBSP7n`NsR2 zFouv&?GA~<2)(ygVO0{BMB-tsUdcsi^=KM_=D!Jl^tDE-0Hp`8tbh+c{Kc00pb;0~ zjkM}jm_NyIGgGTT8S}rI&(UGLxyB|Vhc7Lb1l!u3ofKOY65jLMKqqBtn8Df~02<#r z=9&AH&5_Hp%02&v$zmvs!ly8#XB9@14`m!`bE9v8?83v{B-@M}5U8kf$LWXaecIQ` zbl17ijOXZ{Akz_7m1MbD4p8=VKGuKiCuP{mL3{wqM*|6FeI9ZxzDzH32*g~r^AOBR;jLNo1i zEmam@J4%ul;(qycD6?<;b&cEnPf1omow&%ZM!)#`HX@I!GJxCnL7TuxlwPP6v<&oz zef^qoT{jTD`$JxEWNXc_JPaTblSbD}&fc9VL@M}{skOOO4*nOjk~J>VUx}9??W4=d zCz?!bc4kT-AQuK#o*61KPm_YqraW3~X?Kn;ZPG^_yb3#ig_hoHBmj%b-?X z`eXsRmMWM&QJj<7GB^D~v*5p{dDGGC#;)1omXxk68&{nl^@ai8< zyu0!o*M`2PSbIKHqXbab*Y&AyG%^~YjgP{V)zwk$InLEM&B$H4XgT%M_i^&2QMM_g zm)fu=u=gW+`|EM;%^g%OA5unFETbO}+K^0&#y}-9T4l@1;jSR;?@+3NVzbFZ+PS;4 zY_d#%@-AY3F4_Ewc3r$B0YntB9m>~&QGE%QNgfQ7oKYZ6JGc=` ztAFO>r}A+J4;YXKkCJhnR(0%XMr(QKjaMl{Vjg1d#5PfO_JD{nHUjE4hZ zTF|uvyCm*Ed_YwXYQrecrAP<#avnOL6jc=N1ddV8yLg4PS^_diT zr*lsQWl|@KPlV?aRH&F$j$Vd zNdA+9x`_h4Pq;Ojch}1&Wy3ezGI6RdS17{KKN}klC<5V~VuI%6p!XJ5CY1n#spU#j z&6r*MM^f!f`VUF9#~;QSX7I_PB{5_&UtAWSdL2jr@{N;Z=Q8cQUYZ90L{{5ATemVX z;cQkcR<_@S27xNuim^_WgRgvh^hjBttbXZa*5ZdCb%WZXpW#m!1Td61TzZD9%pj2; z<2IEvy$zQz9Gl!fPAauJy9)KExlIsXTd{~y^|GzRvi&1y;I*ZaNtvX9$b8fWr!^2d zS@8f$UPG)+-|`#|Jc_0bX|*tR`a+Bu`bKhWWWV6qN>CFw+4>(XUK#Q#Vt74EzcNPs zZnpAY4ek(OsVn?q(+Z?jmY3M&z?nWXBG3sF_p?B+&5B0n$_(u+D;eE#xd|MQ#+4iB z1vCMbh<|1|Ejeu+pWl;mT$q)aV%o)nznR54Wz+vjzHM343Pf{HbxopOC)n+o6PpD` zTO>jB-IxWHO?Rm~(t78b@BQG8`{6T)VERTw@1HS9l_c`F)7tWA3kYnGc1cioozXLo=8SaRN~=|F zUkiVSZh91z(^TmbgPjxsnlQgSRD?c=1ahWYN6K1cW&G39wdVIhilUc>@2@w%Xu2?K z2a22ADmnb@Yt-N5Ocr-19+`IN%`rPRbJ>voXu&w@Z5x_q3f6(-p;ZgA7`%hRF8v~4 zT?-&ei4}m;x9^%TN?zS8fHY1A5^(*5E&zfz_b2BI<0$7w?y{B)n4ln@s~}R z-1_#z3W98wt7DAqxDprV^#~W2%pV_zK}@v@#5`$&y=$jm0J|DrvNafD&zoXOWzq`k z)ot;&yw?A;1kRD&14(gVv)}JG^3UX1|2}UtHU>g&P43_XR!-xM2f$12N&cOW1OEBH zRfmE913vz@q(jGv>>?LJ==1X%Y}KC65bI<$7sRmBXE1}Ai|)$f$V2F!w*kGr*gpP8 zPw}ZOqZi2V;G!sRu`oi~YMsMLxxj<%rn%hK~FQd-F)dG`9YEIy0e zf!fU5PSmnXU*~Z>jU~h<$KC*@R;YtuKNIbUu-1$CkR~d6WZhnzwR)qqW2Ebf|6>^4 zb073r$9>KY`l9;e2 zgLolC+~CE&vf4?v+wBnyjfof=$C~SsiqMyqFjsbg1`JIt@Iypu2wQr3bz5NoW|*?7 zLZf5TvYi(9Uv@Fwf~aHM2cY7tYP)`Oua+EirK?|2RoY@5qg^k3;gQjvq19W)6ne_l zcx7s|AN7U0Ez}05-fwGwxLSQe#feZ2QuR{OV)8^w%>Fpjzc?its=+~55ZS` zVc>M`XaGB#Of}ZIAw5a`G)eLv=m|C(vJ&&7_mF@dctDt+W0?!a-E;iN=psrCK#wWwUUNih~?w(JXpzZ%tE`4NEp_zq z6Ku&W(|SN(8*0-j3PW08t7Y_gjy`+X$e)K)IzM1Ej}K0~dbZ6DbZCj=zJn1oSt@Cx zJ`qJZ1{bi8jQ)*dER&>8Dh7k+;nw+ez0MK>XWysdQ(v1}Pz+_C83KD+VZA2&Y%8b! ze%KpCB{3A%F6Er<0oJgN#K@k8-3CD!Sr#1hU=OI$Y>;A$7GKqGU#Zsi+ z?P}L{G`d-Gk-6I+3or-is?hg^%1}_tv;J?Vk&X=kjZM6(bE;`%N$Zi{54wsyz9H8k zUA)3SqCWGyM6LUGlo~IGpLH$}K0u0%cjWYDyX~&tcHzq8zbS2pPGO6G+8lwyJ^RYr zKbNaD)rqIV;N)C?fkGafqP$b3Wc&6U43$f0yl1mRN;us!g@KY0OOvP1;r`xf%o$r9 z>o9A!4voRlFLSD#X@?$nX$w9!_eWKFDpFPIc}m!`NxA^FoNmbD>#2)>Hb*Bxy#iLi zBK5e)T9|OUX6;Sq0S=XcT1%m~`6W`4_L+?2lv}a5IcoP6_VRu2c_uO=2bYn}cS&q!*C|5hqnMLjSG0C*{4Gsk{M&UUMQ?U?f9t|!+r`T}nMm-ox=#hB<##9E z(Q7miT5>#=5v9%Fh|x#+5T8}8bG;9?78yfO&vMsGLAUve+AQ*;D$G_23R@-9VD(S7 zF~(^p{4L)*Q5Rj$fi-&MB4dxB=7#gMV(HRo`SND?fa?S{X=&!^uB7Fd`ebfpsD_1) zxA5ckqBEqejV-WAkcXUjn#2Ws-Z1qScrQc?*cMtD7MIwa#uCzI&`XwCXBoiO=vyLH z%Z85eO+sCHxmKx=Si_U3uu9W$$(jse@Ca(D-DS;#;AUiU2rFU||N zIG6Ul*a13|{ybrIw%h;XWc2;rLM(CZ>iMd80m4*>eXsV5Yvk>e!c^-Kfy( z^+J4`VSV3S8FEudIM~D+?{#Mx^sXZbvG|oPSTOp8 zhl$M=#$$?}bqJl5^UAdBp?wi59;0iWM*Nwo56rMozbe#M^8B8=fvG5H1$yZ)LuVfb zAMoT)b}g91B0w`^r)eYXMxvno)3xIIs0@9~^<9sFDG%Qnsg&07><`k8RfE};iYz5N zOLQg~VjcRF;^*JbTnqj7T-QBS+S6rfkS1!Tuq-jGRsQnDUo|8wAm>YGh`2rP)?s<7 z_Y^F(zwd>)|EJQNr4o1)5R{W2q)?Bp*_E|02pL-Nu>PpM2QyNz%xVzXeY+QPAKLE} z(Pw#-c-oRHY@`(`EO!!7Bz;Ov7Se;>Dd(OgIz4ge>4l#TX34*u!q&g$CDOpo{z8^d znb**7_(j)fezS~%N28w?`spK;0yxL2Yj%QB@Bn=n1;pMz+_|@lSJPi=cg8%5OTty{ z4fZ%H&)^H+0e^>Ccq2+76qO38pK`rJr0Zfg0<+8lPCZ8KEt(&wZD_FjjaY0*%Nv_q z^FD=REyYgMzrlfhtOqTUz+wtXwlPG7y85v+A+=0t$k@-T$cv^--8*GkHGhGB5-*`V zPf3ByOJBeNpI`<_j+pT!I2pHQ;<(^DV*8sXl+wSAf)*E&2(%BX7?=qu)M;fM)R9 zQ|8tuLB*Ra3bo4K;F2;y-`=B@A?_f~!@C=$z-pNxvrn;KZrx)InLv-3Y{JNMir+O- zz1Bu4rry$lmG3-+g4!6dGh@Gb#AVu;A1jc!)nZ zPOv2cy*3f+Rp3^pkc(Xiiy5N&f<*G*RXrM!Umo%-zC+(qg+e>-KKItRJ;H}`l6oD8F2 z^GlRf3`a!LE)Bn)Z`2uJN7a=Qb>F3-gVjUrh0AqkCDBn8dg_Z*htn9a(U#?x$XU%7s>GipJ7jU^fK2FGlXELBb{+Xtj}2o9g)#_OZx*)x;g6Avt_?$vazUy z6`SbqD`39cfF?N|KZ{!2dSryxe*SLGenUUcdSK3LiQ(7&g}tc0N-cZFC2kHra5;Qn z??GZxkAk>_={u+#4ph1HpaNh+VgFmMZSSCu)*S%N- z7TlknDd8F2Ik`$H&DFjedTx4N!YzICll$`Aa{k zWLT1Mu&;A4QC0EyZ7*?%XWPNsjf{7*8y+SR^joB+@1ym9(fBj5Ape&`>Ff?~jX@G& zvHgH`^@y_gk-!aFj4=aFwU|{!^`tt1nc23&r1VGILnKv#4>A7O8rq+*Leht`T{dZ3 z>|8J`qkupZDXU$(pYNucjDM8oao6tfm!nlfU#SELX}@avpz8e5cJi;xtIJyis;pH7>+8a+cxZ`XP^e=m_l{bu?J;_K-CVl2!I@Wt$l!#|a zieO5l13*m$@Ws)WQ-l;L|1!=)s5Nz%WtHS6RhS*m>TjgIzO8QCl^?Aa{p;d>b5cCP zbJ!|o2iG-Wt~lz+Pbk`vKxbk)9+Qe$z-f_0MlWRW9x8Wc8B`YqaJqELq3HSTv1d^W z#}1jDuXQg))lhx%_A9o9$L<0GFM4dX09d0j?J`04HRV5{uLW`5RnEF2nqi=|re7*I zi}!IyZ#mI*2H$Jkvd}WNq8@s?c-^cL55+#|3m0<3bOtf0nbl0Yu^{z9Z-={RM#C&J zU>P*ePt_kcu(Gm|RhnY&1REl#Yr~R)-|b1)l*5TH&1$&poh9rq`eWTHu7f*O17BJ? zMG$gv&%s3Y-Yw9n%X5@AnXXtFJvnK5UteGy*3?B^m%A=0we`WFB&1U{tu26xF4@Rs zF#BASYk7Pt1~vY$v5 zC(4-mzgpo+SEPM2R&mQ>7wWbi6uddNq4%{XzvuwreInB-dRJ%eo-2b>d5=UzNkRw? zH67rZu)?T{%~5(5lWQa-y{L%2$-IJ-04=!hrUg6Oi~`Iaz8y(KUIN59Z`OCJJt4%9 z_GieT1G7P7xZ|vCzT@~30PS*GF6i{~&c@V>J>%$q@N<5X3zy&*z5R`cKjgVgvRPUT zjWw-hM*@wz?%VSMSA6$T#D`s;_${Q8Pa`<|;;@Ls3Ap3{K+){3Q;2AFd-q=PO#N7X z9~rK$CMi&2DzfA7o^}8*QwjFPby!MXe0%3Sb|<&2-Z@=jvi@|I9JF#^_1^a)tL74= z!ul`w^g5?MkhWcqW|MMcx1C9)pdbZY^?mO|s!JA|m$mBg05Lt=%{Ko1?OmVAm$aLp z>|UwF_61;3DlGHp;JQYRAgx{8yVQ@5i}PEI3rRs!u2t&k{)*KW1>PAA4E0Q2-Al0G)`9)tlHR3gu)z6olfh`4`-!Eq+a(zqEZ^}`x-cPJKrLf1s$=O9r!=TEbPHPm%ytByg>th%W|!gFz^Kg$W7 zjNC(?k3Jc~IfR|~A=B>m^B1}5bR-@@*Q!rS2%6&L=O?z=lQCfkgX2;0U&s#%+J(`I zjC=VZa_fFS7W<=J#E;#@>eebVn*2XC?D`-Bgzf}`F{BU%r?Q?PLF^Q-18#QN#FV=( zVzW0IRoqfX`PSP^@KL%_6BeGD8+o*HF^^eI)O=!kg$MOE1Kj|2)gE6$su?*Pq^~Fd0#Z; zlFscJXshhesWg4<74y8%;*ktdw_e0H1T!bRU@9BwPMhLZDL>+}npxUOg)Cu4NsmH~ z+hh|1uhnao6eXL;fB0Nk7gmXkrm#Eu=5xHqXEo$#^&4U5eq&_JNxcoX)y^Yr>9e2wx|@P*V?~tuLPo6zEKRON zw>(FUml0%0EZQ46)-`uNLtZoVTlUg)L+E_n=rY(EEHQfx?@wSdXI<5Z^>4||=j0#B z%~@|ERfs*>ATi${?SU6F_{7)BkhWHB;%_fn%h&fCJoWC%@m^Lr0>oZG%3=+U^G~W8 zYX6YMX;(SC-v3un)&(56HNoCzYH7QmS79$2>Si;)S^M9zk^@SWrVQ7eJqe#imj;r+ z$ZGACR<<`j)qI{Y;dASMYTvqdT{>-b)U2+WtUuXJb6ClKRs0!8`_DAD_U|GHyzXyV zoRR|`gZv(283`b|BW0-)@g6RQgJ9Pj`rx-o5HW3ChR*tcV*?5WyM`)~O$*yn@mCgy zjI{UoV(_KP_(A(k+fEErDL(m^y2X1V;xxjpnZ^lVOft!<`fV}P@w;iD4Q;eG=nWXf ztXJE-nOKXIP_GB9@$s>sNR3&mi*lX<`^w~ZAFGZ1pA}*lKPbwIw;`xUxlNymnS#?) zt}O0M*KC6dsJJOUO?i^_h(g7wY?uaA+caJr%A47=1E=(N zP0SyymjXEX&g#2-NH-Y+d3KLr{!A$kSBkQBW0rn84oqi!7i2EpBqeTgxTSem5;SYw z)b4rd8wraJ5k$Ia^%g%hk>E!sBj-0cwV}8U=4yY>IuysdZ(*JdA1XKkZIFF?U^2d} znpjhSM=ZSC>#0uae)+*VTzqvI;<~~Ej&Zu^dq1l$Oa|d%#fgDT-z1anN+r`|ai<_( zc~u0WTEa*7ygp2iNtg*x^Ss*7JFXUZb&0(^Nw_GAy!?F8Fl2CWFt-SFpivTov{mU< zoAs~F)hHRT_lj^E(G^qNBdizgfBdmtP`-P7;2oa)Y&t=k&+awrpm#!$X<;j%AF0Rq zNSS@UgK=1u;2Jc3Z5=-8Z08qg!Gp5Q+FK9@NpV&0$-XwWFGIG%Z0f8a&)Paj&! zY#DAY_{%QIrrwS4!+twk>VK1?qz^QA_Cua}LaYp6EM1z7JJGY4e??;%+%r90@c#iw zeFJp^0I6F*zrSv6xsIJ@Z2boyYAbc`s_Z7(9h}O>Df#I5(}z*P7doH*_{4y~`9IzI zt#WXJqR$ln)rvNA-YnAj1#6u^yrwno7m)@ScShBW?w$l^0>E%>kffNLBI$r8ePVSqxwo^%n zZ-{gD^Vvj>zl^%?Mq4dQHo)5SsrrXQ#PR_dz}FNa(KC8f?Y}Iy^H_q4LG#S5o!X>d zN24@1FE1|nix&v|IrrFeG=BqKz>DJCh&M=$8>lk>x~KS%QiRNl`&4^T;$HyE=~t`y&+- z;w`oW;y3(GOdlTF6?h6WqVKtkJ%i=;*#G|IE;CxOp1Vz*lbpuE<7zqXPP$yg1-pd&*X_Io0;_=Iy~C1ZRc;2fURdZ4}uL+YSwLO)EtkpJr^s; zv!c2CZA!oMtrN$dCDT#d0|nb<`F0ii?w;I?k*W)`ViAHF$?=ft+w!bQ&0S>LUtWw| z)O$?~%Nl95Tc)6CY$c+3EWxQo@LG%J5Ory6d&hc@HO8;cFTTua;`Y#@$+-*&_OZTM zbPScDvA9IQHCNMRDt98=9kej25^1}?A|~P7&+k1Q$A`ju@L?-G8<)_75R?&z+L`Bu zB=rSim#^C%=s)$)|JmipJ(h#rBrI!jY0>h!3S;f%T|l3_(t>J1F`BX{uC22l?DKBMuXPsqhq{&3KyL{%4)FGgqqB`ah(-W9z$(#&L? zt@;#5?}epf3SMm-dU(EXl|3b-V2Bs9Co^nLY3-1n^l*v(W@}TWWt2%QG%n1i>`sYD zwn@7^5@0i+Qo`zhpk@M(|MGSTkBWa}ix>1o=R|Dc=g>DmK;EnJxyUX|^{?QB>BMFp z3WZntkUp!xIo!fR199_C$>x@el?nGB8nFxscvw#chO=+<&n!cVv*j&$2iZFU4x0ZQ zpoGT{!Q2Ik8K|ep*~|4)ybs?^z6J3)_!kMH_dAIk5DRDqjDS0T)qt27T!PUe$^)-cGiA(0HHi zB*92RPIs!&&7tkp>l26WZzM*#4ezoUrr6QY4_O#Z{XB-QQ+5dyCirC_Jok}?Iarm4 zh%MGED$yvbhLxw&EAZ(Vxr-$`IO!-;lFbH9s*N$GJ!T~E&W;iJiBp}W<|tqR=R2?v z|A{qS^WuF7{xCUg<vd4P6?H2RUe8$1+WlHk`m*uXMEmKL_id_vOC zdqVew=Z&eS%l3)B!42gbScgcurXrH&oU?KweRrd&(7c#2X`#tdfptX#OdAh5NdB6{ z&QDEIZeAQ0+|M&q^a&bWJf|=OTT1?W7Xg>?34r~$RfGgQE9#L8wpA;vdKL1To`DU# zF{j2uyKbcJSQCab-FVS?v-Dc6`dmKfBI=1yE<(%v@=%X)5VK>Tq zcC<{+&%7IShq)O-_q;69CM^q%RH1ZEO&+3X#`eof76^@obZ+c7742YLYllF=rR(#^ ziGktgAS1~G3RnV-&0>UJblRA!`_Ct%JAv?IitUND+NCX-$aKthiNY8|IhO8svx9@k zpIF|ty`bwrK8|S!Av8Uc{lRK@U_+>!mBT1 z#R#S|qxXaz@ZFy6e#$Wt`CiI3B+Z!f<+7K@v&{y-0NEcKKatZ};_B;rdrsM4fw3jd z!xhUS?DL`ywx6{q0+`2n=fU;^^7!VZM5^(>&Kl`9V)ujghp-d8(<)M_$OtY+ZQ3uu zqJF0^FZhj_675ineZ`u5rtl-f#|ez+FvHY5;GL?IoRl!T@;>8rblCawYSxLfZM+!E zj-HE@A^P{Z9tkYL)55D&rHka4Z9$HKj_@8xC6i$wIzDIMmrr==qBDxd6N)Hra7tyE zFFpk47kfTqj8+s>N2ALuG0Z1?&LJ`{79*Di#+F*~v#Up)4L;5!D0IU`E4`Ub+Qjn~ znH@vGg%ar@7rOFMzATn2w*w}&C776!BRe?3GAFV+HnC2WI|C3EC5t)-?g0=xg4CKw zI0rZ7H7M&me!9d-GbnZ9hIxCWV-S~IN}}k!=Ug%HoXi-_zMu${PTFrUpPVcca0x&h z?_R-#66eghz#D7F2lTodl9$%s;8sFW&Ux_>^~0SVA@YIC-=+u!LgCU-IzkUC4@@E- zKYnh`U817zCBT92IG-q0p5aX5JDz&d&-;x8!+dcp^G&y<+1t@80_Uzd-oTnocPYKi zDmn|{C*)n+oU~XXAKNSvqEW@};K!|j(%!2)G`tyLH}*9M-c#1pJ}`z7wiHc4N^(rE zECI(QPrqO0Ad6v6cDBFDe1-QL+^*jfMQ+rSNd$#{COA2EU*SgN4U8vNxkT3^PFN7u zwLe>ReFD)rh0J-I#dFv!;xjw{hgf=|&@QvXX69H6RqR54?~2diZ{DEew5ChFIK^}e zW3#wjK`)_^b%47`5kLmg<@^{jo*4Vz3^X3$-XllB!^q!}l(jq2tt4lRl~Jnox^=xQ!FIUz7`67+RoCN%XMG)1p}JHb?!Q z(PhVFdc)<#i%ZymH~2>quO`s@f8XC8BE1KIg`Q2H7Qn%!pR;CN6%8`&?ppWFEH8cf zJRsUF6(?-j#8$M!hj5!?ko*a+9AvlEpSANMeWdO>t2qDMb;fQC7+x@tvep>UHJ>Gj zN+_5|ME%9hT9DP+EUxO10`sImf7CcvLO8@vBOvU8)^N6HckuLw@K4IMi9402BgAp& zL^oCz@D-4V`!dRTvjUUe195)5pqzMSf6Sg!NyXZK{8ajJy+QBwU|iSh3*NvpQt|0S zIU&O|tV%*9jHIQ*A{Np^W#BdxRnMkqxRVO6cYO4A&lPPi!`_aMhF7at2Wh(eb4AG`E*}>+ zD|QsE;E};YMU~u`Lzfe1cda)a&ztt-+02xXj#zc>u~SUCpnrw|^nAy0X2xNtuw@Rk zlFatvL+t}LT{hHj0qpdR=%UjDQW(re3duc?4l9WLhHs7E5O3N+n%1Tpw=;9Xa>?L? zvo10)M&@loLEd_uzthD+cle*5K+~qr$q(aua9)(L^1JjaIJh={+YALR%O}eQOY{!4FbfTgL_SD$Lrkc(t?{lLQ%Uzk;0zC zo-8V;l`1i0M-;B=k<5iqd6}MJq#&Sr$LrrYESKyq@Jc;_T#%Z+8K6`HJ$}*LN=Umi zp_4;7=HU?jD$x9Z!)NY4jiu#lG=?*&QCqeKZlFPKQg+kH71fk0!_YE1kc5Ihw6bfM zOFR*~$WM45WH!*#;&@!CYjw*X)3VglZNOfkV?S+(Q9|jHc+A&%$%*G5P^#?@gyZ`A z`bb3YdfFq5>xGX$xn9)R*!_Bd2p4`_N%OXvn9b{5eTmm2W=!bP4K9gQS~oQm{T-Ex z6ee!NEa9I^MFui(a$Jg|M2J*T>W)z3@ix#2wof` zM!x}Z7%$+(&RWX3_+oV|5Qi?T9_qMg3|_i-Yr^SL4P*)ypt(F*rA_SRj#k*;y02!lhUY1ldf0o-uTep<+1!^8 zli->{?1@6vrs5`yJ34HzW|s*zef8}f&9R=^)i>Kt8)qTOuQwCpTAkVdUp}*Zw zyVh5F4rH3d7Ph?zjzA?0&Gm~oZ>H>sQm3tA^Wut<4JshY;$x8H)?mL*$5uJ-?LGTM zb!=F?rpR3Be*9@aIR~Xh>~1s<@bJfmq0>Ze2SCqhUP#>KZ2%}m%D-z)5G0u)GG0>( z-W>7e!~<-Xo4oayjn8bCHzdR6*p!)(es&%@)lcP-!}gy%JapE}L%XK(kk8w7hMl#e z_4XAL(MhlS`FlJVHV#IKw1H6jjpktU=XWfapT30NseSKLJal05>*?{ca%JszlN#Fs zK@>~Re@|-;C5j~w`tuD}=2UAmAUK3=^YU@-CL?)PU&Xi z@#E=pk>)1RHT(GX1~Q7Z`t0PO`YU=-lqSzKg{NU0o?2qMUye9bdXE?bkw-{6Fl5Se z##CC<)HC8_rX6njoft0$)b0`|VLy$%Pn+<~uuKHq-L!qeEp_I0!(RT0ozhTcY|n`Z zpS?$5C*0-QrtxEf{(k)^?=1yTI=?sCr`Jx4I!#kjM4lo0_uDwPx9-F6>SR8tXJNil zPhAX$G`+QoufOFsbdQY$0{0b>Y|Mo`3an$Jx9++~cDEAeRk~j{f)A3NCQOrYn206u zz1RW|n9NpV6F}t;H!kE{iksM1Mh0s;Ob+TB{qJ3lca7f}WG?pYs&eB9BBViZ835R1Y9ba}?+S@GOo zZu=a@eYhX$EWyGeN^1>Pk(-;p{r6D=`_yE+6iqlsV6 zn*}FIcdU20N{eg`)hyzQ7OrP0N756am*h4W4?ms`yM-u0WNm!Q)X8SeJ6A#$nLl`eQag)>a!)zebM|L;)+a;`L0JiAQ1KzNnx8(MQicwY2W3>a(hA?i+#C2t%LQza(|x(_9P=H?xe2SYaCQA;9(MMFSgs1#qeX_fq4GnSHSE% z#r`LA>6eI^aKhwGF|$Xua0y^n8cZ zF7dJ3$KwT;cA|c93vb14ENel$HFUMSXYYad5P>0fmvL|*s|4(wLv8c|20WdWmym3d zZp3+05_FwipoZkpKhMT9eeB|wLM3$D)V#-SWjz@$fW7Wwr8H~Wk8kLszmaHEkb3r4 zr#06*%FiwmvK<@$rKYfpd;Wyoh(X!NW~{i5k+`3<{A;fs1JkH<_OkH@=g%@?&IhJ# zo>TXrI2P~PCX$FjQ0@R|m1=Q63LIIz5FScOz0a(()A5>`uBgLu0%k&Y@igSg*=On~ zEqBT8Xr01YA!A2&J1u;ISNBHdRse=kKsAF#cgx;)@M>KSWr}0VhONZS`W(l4XG>l4 z7K;vp=w&0qw01LxGyV-(rEa2X%C|Hqt}Mo~dZ%6bgV|u)Xr;Z`JDwa=PRiXp;&<84 z9ZBx*9|;nyi(`*f2U(7&Lantd6D42t z-i3KbRL?C0x8p{%Y)YVndP@J z->T;HgFZ05<_~u}t|oJxi%M%VHROVqw zV}rs=-R^RXp?t)0!N$A3YhN1~SSoNa*2k|ZCzYlrgcxohxS4q?URN(t2tILfPse3@ zDrU)9sqc z^)dw>iMa-xMOy1T%L$^Y!!ptDs3u8EtnXTV*$aa_x};*lgX?3^n--CNR%g|@VN^PH3z`bDvI`7867 zoqn3fB30v1*k=9M4%AqqAL$Ypq!C z;lQCsI-qz<$F;amlHSa)n0h-f-{UdqM5IlUQXx~u zv6*UAL3yUxh$XZLU8;SQySgOyGWXBP8(&K#{q8L3TOCbD9V@ z1oUpTQTJQ^Q96O?iGozTi)rkyzusoq=5|q<&V+>SQm>!TGWFYO(e!A;AAlga;nDr` zf#2oO#z6gGSs_;X_RZb1y-DuFeomdu=U=vU)fQVVqwh;=LP9LH9`1f_Q?lAv7e4;W z!wS;G)aTo?W4!Hi`KwuwkQB7h{{8uGWA4RLl{Yp>t+M*?S<%Zsj3R0Mj>iC_Xa_I- zM_msS2{n&OZ1^eK-!*>2VM4TJ%cd!H&A>a#`$K~3I^nnY(UkY3i%8EEzRKSl{B!-( zd@IXQXAcRz9&HYm6$Z~go4C@QN;&#AEl=Dx325(TkX&JkI?$Jmew95z>L>4x&gIyB zcw)e+uGJ92qJXA8@l1oqOK(ZnN^jKxw%ksbeO83D0X&xm!nZQ4q%x!Jy;#msIBRt# zzHP>=6nCdrYHVfX8jQzyx*t~fO-G|D9qQxt+YBLUJLI60&_!> zX}bbONFkg~Ue4iRdlm3VSdtrI zkFnds1}B#nyB!CYJd|sf=k{p_b;sTvl>Oe^2W}EI9h_+mH9s?z50%GX{8a1CKfaa~ z9s|lP^()mI{`jiUz(MTI5LK{nr>L7jCevFH;u{H%-v_f?Yb05Cnba~;UZ(%(xDp>f)Qk}v)*tV9J#w%RghJF! z|GW@8k`Tw1tuQ2RF3Z~1G7e&O&;*te=HEKWC$;>$$%gFu|4>&HagKl@hGaX(tfZ@w zPFcDr6~?@YNUoNBuU(TRX(bHr+|Av6Cvpcdk-nPb1I0fh{O+YNW1Y-Oem@GbQU1D< z3wT^Tcn*H*UL)d){_X7Jx_Yt(pZECl0uHPX!BmgIQDbZ=p;N4X-e$PV%c9#QUG#qx zMac%jvv>|24<8DGXVMmqA7k1ur9E!~;d0AFiO9bjny!V?1d_D#fPJTi_gBSD_q{ik zmSI+q8YSs=pYMs@o9$dmdap*v^aM^;@kVlszU&T;oUzc%f5hYGVH51R@v};Ho4UhY zS?&G%@DgjW-4xR)@sy#;51QHGo6HL>J+vQr*^GH|T82B2+=51fhrnVv<7ro}^*Uvb zhTazL(D|dwn+@yzyJhNk&M7aCWxTylh0hg6a@2aq>`%kXp0>PrQD0K+5U$DX=_qqz zKY;R+727&AfXt~c`CFoYFJ%~bJfo#%(GP+j(!vgYzm^)4C3{kEH(KDuv-IquFXF~R zs|pKD@_*?7H`?Qia7_qgEyx#nSoPv@Y>nbBiXrYJ+yXTs4PBwU`gJy5LpMc`fe>Vn z4UP9UKDs59hvM7Wm4UB(qt0kN6X=xCv4K2ED#8WL_mVcJw^lk#$= zp}ks}$zZv0H5B4Ntl%#=*b=mDlkZ+PFUm zhl6mm0pFDT;B)AozdOK{dD^{pq*PnNrg|Ee%*{KPw<;3KsY>bN6(1Kd_9BoB zbRJ=N2LiSURfV#)=BX)qZZ=~Nqr)*TpCi-OP;hnYx=%}Pp zH1`x!fG1*4&%Dzn7V^prxDPpot0^9U0`wgW+gY{VF90fOPGRZ?rdLG#Lm5dV6lC;t zh8h|Qz=X_I{P6v|xKZ!gpP8nD0xkoxItMdLx2OYdp;IW5RElG6rvry0hx^2)yD&G( zg^?s;?4N?VXL#tQmq8?@w2`s*AJ27L#1j8?O{U=R7KC@PO;$sLXJiF2Q~1EnfSnZd zI+yzRLk7u~>&kN12Vhe^LU-J5u!16IEWM|nGA9W?BD&IBm@C$GM3h1w>IHOweIxKte!9KuStckQ@c1yQKxByK4qiTDm)w?o=8ShVGVB1`rr>$f55BzxQ{4 z@B6v$&G~CM!<;>5pMCav)>_Yc*443ptplnXdmv3@X=8}@{-4y++iPe$rrpZiK_vBF zZ;zsrDb?2M-v≪G;_kFf6S9GW&En7#3DC(CzyB_Wge}J?|mnr?;HQnufp2&RXzAdcN6>{qgJ8_MT?}{%5<(0lR>rPUC1q=M)6@HoprG zJL$e@JpOty;nUyE^T|9b^tDF@aemdh8GfOb67};)9z=VVQ`ejI`?^zE#V4oA+xW4j zXmooKGaa?SzRiO4{l7nsCj}VL01T7D@gyl%h}F>62~i3`h{MoA-XeZg1pava#r$K-x7@zt12 zkl8tRrfi^IlD3@V@_XZbg!!X<$Rn6A9fud5|V2CfJQ<~CsWwRsXZ3B7D~Wf#eMPGm;yhgreYZ}pGocYE%X)LojSQk-418sDSKQs4J2SI~+d zFu5tlbeI*Tggkz^>3V3f-j~o(LGCw#bV}LUdvd!w=U|@+j(3lFCxYo^7-dXxhzSS- zVQy<>X%9Nec!!Z6Vh-YJlt^Hoc!EJ}kJmb5@`M||&abM^!__GWm^qR9r@*_R^OWu4 zKCFmeaR|ZinlF{^2NPbGS>L6`C;2mNh(kz|g`DU9YCF+Hrt9Z!L_4)e3<*(*nn`DE zm*xG)0Subg+qoa(uNK!4H@CbI?G;*vl_y$kTwCY(d3TO5e3rdHwk19}IU7{e)>^0R zNDS63g)Mg%VMiTsO}g%d@A$b~auvk!5aO>)eNu?gPmlaUX2$NegoliN7$s1#NFo04 zM8M+u$3*+Z`&Exw9Z{+rl*l^E=>yHB$HWk4ivD<;jJCt{0gW$xNN%p2l=;6w&rwQG zwBxTD!!-xM~o-30ph7wz-+Ur<>?8^o{oI5~~5x<78=>I+Zk6-5|w{ zwBkTmU^{~nY|F0wZTv%i-R3daYc`3vJcTR^j;^3E8@%~S+e6{Jx8~i0eFaoA6@9YP zNX)aiQ}pFyd*>!X{034acz0wsHt|yi*%K|XTA(IwIQ|>=dV=*kN_1B>zKo^6oCR@M_+<^t}h7HAyhry7U zN@zu}eaka!4vdc{Z|psX*N?8b331Lh3h3NvIJ+p923Q<{qil|4ajnYXiK!#^(BT*f zN~x_-CIjgpWJmZaTRVoLYj%W5RB8Ji;hbC*u$EzuMtf~NNdm*-nRRKH^ykU{JYD}p z0#OB#3;+)WC-H`s$j`3`3qm4YCdv&b!MdSHdy6-gblk|V5-$1EN~+(%tJ^*0?a!xo znW0KLyKaj#@SYVjb$jcVsRUtoBX%|3(8k29{`s#*+DoQ^OP9;!HxD3mm@_QM9^>rz z)kTB>B1p4;r#BTE%k|byMsLAmCmYjjl__Ud^$R|&! zUQ3IX)cfuglD#Q?e4lyQnjTY^!xRW<0U`?pIeqsj^2-Ii$uH z5|jN^qQQ76YYi5GY9%jLfOYUi*4BG1F{nQYaJB6o9`1BEiOp@3(<|1IJ0eFb#=QB$ z&hC->E+k0CX&Z>C1%^kKuRDuXO78`_c)9{cL3_^^w$>>WZyYv+j(^3gN~YbdI?o%A^VEMNQ1M00jm_Oqm2Aii2DsW zk6q|ROGEHFS$GA*#d&_hf@CCt+zEvFu1|5ayUM1PZT(CbIS;yfn9LHA5$tv6n9la> zjs74y=0>~y$8$28Z4}iEUQiA$W&g!luyQB^2x!^{NHXetLw@wVI9fk@0@0Jvv>RGl zM&UvG^@(O*IE3b>JfVXQS!SBZx^6yTDFWQ1p`9huj?CVk)C>w1RykN^c7we?kF{X| zNuQOeJ8Cgy(H=(o<%~+FY?9vVfDZZv#pb4`v%CFmhiOUG><`p__!-BUL+II=bLg3o zUJ%`vWX#<;+SEvoo={g&-L#AYK|l%=c^KlVgov7>k`H!pm&*`%Oy%-<5N`^iKYzLC zflrC1QF#dU8^_qxL9OTJZ&S|5xqdpAcS$tl&gbVXw#WmZ$${Ptek3dbB_o)y1Ds=(ActKaJF@c!iXZ& zA#|0-$)O%s5t)%9s=!Z)*soz>h4NipqJpg(h`0sJk7>^78~J_;yM7?T~0^P@GB2-PKv4k8`VBm4>v{Li>Z% z^Ja)#oT+mZVbL=WSj1qtz8f$qL~5)m@4w$71bJ-)GUJSD&wjFxkfR=Ck_-?o8fX%I zrzdX50=QScApEysJgbDleVyl=dy=vR2C(%=cN_t3^;Qd|Kum7>EH{@n#H_BQ_@y@{ zmtQ=M&901-tg-s^txt%_#S*@Fp8ah>8|oolEq#LT#p6mzjGvr4(^J?U}w(32CTBRrj4u(A!4UUleZ^P?8Y_MIDJ+i!z)dW*J51gW8 zx|hdnDL!B@MmL`=csS<{0F zBwU0+vV~hN&)mm%7t$O?3Q;=S=0mi5b_Azg>F+*kZLer%g*V)|v>@-(K)2-|jL^vF z4x8aE6ls=L6hj{X6q`c|X#VzNxr7P&{HJEbhciTT3W8;#88%RbB0f1KCu8rUF-Of9 z=y^`4hgk~epJa$M?&u|B>bYezr@VT7xyq5eN}BGMeWM4dDP9(%zEhlKk{ZhU1LX*( z$#6G1ixv*0J<@ak2CyQ%Agv@3!($Tt5tdG_;RjPOzvlo`T1#f;%^s0vehS}jA|5d z!bx#2#t$2k4n&SPjlTXB-oK57rl|%T>^**30q(p(uAwO=t~&9W9BCD{_CSHJrJpx% z1vo|=eFCmp=YlGigly2SJR1WA2xDw+P>a?irK~Hiks!oNsUn(7XDcR!<(^|T5k$Lc z)GEbmkIJcZV7UWTo7N9QJ|P7=!?f5}+We1;RGP5Tt$2NJj9chN4RGetJS6yiEgVzA zq5`oOuh`yrZAbt}*ccN1(kf3;~piU+Fq=3T#CjYQ;^$@EO9>_g9R^4O_uo#Lqjjy;y|7eHXBQs3A{l>VL zzrc%6ui^8gf~}elXr#KL@|4MRKsmx@ubb*9krQcE9`8C8go+JnJy6$_eP|QQu>Osn zZ+WLnR`c5t>qJTG$9+%jbl-NNr}j~#(@?&Wte5^ zk|9pHasLF+QdakPO@gTNx^>*u0}nDBqJ8m#o*ZcRRI<$b+6izsduHqCel(LJTOe%Wu?17 z$q&0HkuNU_;&r}`G-lWwsv6IDZs;%S4y_$=EE#YBCJvA;052W>&`GmHb5(q(vJcrq z2zlmJ7EiTM!WRbn-{15J3D}>i+L5LXb^^S#w=j%N)StVioyA**6>;tbtcL+Wa z7*+ch;+c(z9f>tna5onob|ln_egY@#Xg*MMA9K~$JN>M1^~XpapJaDfj%hm)gqE~X zaF8~aW>lt?5jlY#7d^0eOOce0I(eNex}^6bI` zQb9R^{(#LhKo(_>Uy&@yS)LEU9@n}H2yl&6g)_w}hgsCI_PHtLDz!Mfb^@Y!tUOfc zi27-x(N%VZmZ@?E?zc^@!5w@`SFMu+@H8`tY;(pfuIo)x|H@+on^e_ohz*ip4^AgZ()XOSF; z#64_M-hAD3Q(g&`H{#VKwy3cHQF&P*I>80+^@|17J$(0xHs1}NZboP=xa*kT4)IV3 z)rDPeZxRc?^WB6ap%9y}hldAY%hjVo72nOYh{h`iHs>4^he zkf!t9T$Md>BmPTq%YgR-31)+GrkT3B#c}SiWT#Hw;XMQL>u1XgTS%PRHynQO$i6Ce zMe#GEhqIj-h<0V=FqBX&PeZS;eiQ|9mYo-qkpLv{WFujxP>`i(sPA3k`MB_c!^TI- zv5OK6vh3wk4E_-X12pjnb0Vu5yGkd#pc=X{F$X5-`~4e8Z(p(b6Bi1DmcnEq4nHjh zuQb%Q*7NTMZ-F~pZ0z2^(`Lb0INRk1TNeONz>;9er(f5?GZ6^mgcpn8`M7O;G^B3A zo!g)J!1Ka&S8E7t zcHXM)T#!8vl2}|_*sJLrrpeZsLmGml_JY@X*&w{F9i_R6-V0|IffXWrN2V6^1ltW; zsOS9@N_;y#YSUYT&D4t(2IkfwZ)B_#9qO2a!n}U@W43(#1H$xIqQ;KhHOG<&RHhm? z79lT4eGG{ppbG(*?2GEFtJsa4Lzp+E{ca!MGe6@(2qEjlGGv785yCeoSBJO^ZgcpO z`-b`hL3Wg$QXTo2i{tFqVb*}`%_PUGcn|Ju+GYna)1~g%H(Z^(yBm0)p~tqscx3RyhNqQ0RyfvlqnjN!i5#b#8iVDCK|mG;w0^3g+WRc2!J2_w!<;ij7Q49_1amlk_-57<;>1j$N>c&Wojb znFCbvR(1=M_s}gD+bM&aSG{UHyC|$bIOuxPh*hY@#*J|vjhxHXeK{_yoE;*FO=n7I zW8lHI_)uIdrTcBEMQh4d1y1VM|NRB#=qbY{s&8*-#XwGzR5bzj3h8+9Th~8k5vWLp zhLP@D4t8DabhuKuL1bgbEU6>iE;bLoVicAN(G*Plg)@zI@afA6CQR#l%o7{5|1F0x z-X=R8gNG9%O+f6E+9@=i`E@WyBe~v(sxE38>gy2w=8lYoBD?Tg_$yCZWIdp>?mK7j zB}br?J(}N+VENJ=c_MY(y_;9BTAbMr+uIK!FgsZ0JjhFQZe4<5ufq5C`AmFdZQ*^2 zdm7~VURP}n;c&`?Dp$X1g6y3Q_v`0Q5zwC*EbGn`Vb#veBK)=?ItYG6=U`5w>q0m6 z(ai#oG2XoKO*acc`J5#ZyZ)#79JIyKKgsv|e1pP%me~^h>w4af)Z%fk)wcD(JSwcy zY0;m969j7~>2})o*fp9e23OnEEf^8Gj?P2dbgQ%@0%wl#Sb?Mv1H|IHMwm&$K13L% zlJ)h~GP&cJ(K6_+NH-Zy)?(FB_#toO@D;oOX4w_F!fMp&Z-FJYs{ufV-!2|qFbZ$v zOIW{)&o!aDa6Au7X$q*-<2 zSs_ym;w`MTyKb4vGxDo7{wvN*h@u zD9zb<5A-{P_}ZJhrGGA<0*}%|=skm1$2s*2vzCfcZrxPO(0un5WN?GXAfFDLFo2`( zdJX^0o8RnIYrP{(-n9mV4XjA3%|^5pb9dA`Vt2oH$iC9)#W0v5dytsnPxSc5qTUX!1;9visL1(R!ZszF`vLKfez=sj~YYzd`_|A4^xOICn;w zCec4u&VtWY7Wk>yDuld`fLX5t`uFNCHkPleSTtcz=nY4@_{CsMbibr>%8*Gq<&LvI zbcU^!6OW~v-&N&RTFO!>sa0bFs9VaAbk?l6?T?_lRs6=+UipCQ#2kVU>q`>zx~Wn8 ze1~7ZD@vo8^^M3*FX7VrsH-3Xp^|&!%$!B*8CRZrILfGY2sx#^)#?tu3osK1U~W0+ zLr0cmWhXO!EsZy%q}&Nky}BgZfAcO^)@2YE3$R`;{u#XfW98o8WB&<4U5*Q|&wnTf z4AV=!s-tl#*TSJzSRw~`-{J|Jsqe=~XIISU@Ut+?t-}Z+K$nSH3TWGki2Q=w(Ku2w zoj;#4H8hHCoRzwPOqSanA8%i|e|}#0-O3e2JFX)yM#ljf;xrAf)%Dhf!Vj%QjGb5R z!J^qQR)K=3d3XBh5*Nsgb|3(6ca-AJcqHo@sU)9umecuGko_o+y-D(aK&!lF&t%NN zd@dcOOR?}BP<-6Crns5%QlzCz`E2U(nR}WlT2Wd)8!?au+-LYKAy)FN0o}Z>-e!%E zp6<&beY_VdI#V}TPH!YqHA(8}B~|v@3`9l8eapX0IC39Czi=qWt<)xwUP3eURWyzE zNT%jxo@-vWuUsoj4JkC@F8}jiLo;!Xph7_k&k7;tJ>R`YDKM+;bMt;LouBX#348tc)q_k-csjo~;QR!iL%DbK?*l;#FXqUTG z;t@};&g1gm66Nm`2(RoUwh9aTR~ff~0$Com%<6j7qap!M)0+W!+9m##%GF}mP6{nd zQD6F5m0(78M>Zw)j$!BO!V7jdU-|UGefUlT^a4H)@|>sm{bXV_8L((sfsQU#nZC#W zHuu%4HgRPSNnXi5tkX^M!?M7+i%Z7W=}vmK6WCQpr)d+p36bdy$AV!K znSVoak^2PEi=O6<_lVj+@;z1w5De+(b5Yz`MRrOk_`I{0F3FDvlu9;LAp+UkQ_t&b zjgIK$Ku^6ire3R9&nOs@&pBfv6RCTQCgUYurZKXa& z#$$OR^|S@7xHVx5XAk1{Huip&Pw5VLHJ-};Iy>dy-Ywekf44oxQ*^Fo=z};zwD;(- zQiF1(QE?Bo%IdtVm>P{EPTkeEaU+5BJ?^uYtp?t{-F0G&MTF#Hmepq9R=hX7ifkd* zPw|dLQ@ld751^>=1#}GPo=bu>CfrZqF^At&dZ=DMHb3RF2O5k`QzOmTC!4-;Z3W0B z*dO9WH4WPl=@agJl8nLLx?s$ksq~=jrtP1W%F=c9MmCv=LVXq?A;LS@D)%%00eimW z?UPJ*0>ZAx^_tbS^-Q6T=#3D2a?8$YVU~x#w!&;1VE+@4mwkI>GumigEBMUZdMDg! zP1jvoJx5Q8R{zLyl3QkHq*=_KA#Le=!Za4jTu!LFnJJhE#S;k$dXa@)?rq4#@3ccX zVildZXg^9mKYzW-yFFxyZ2;W>J=j*wg+@VpGf-<1z z%56aF9wx}~o*n0?%;qikPqF*u0e2I!kwy<@2OL9Y`vn!|q>=;F4QZr_AD7_mil5^j zZA)eA&15dVO1sz)+pi$RzdsqaAb!5jD}VRN(_uN7U+llZ!C<~tB0wg~6uf>VqwI|S zYmmOxpT2Rqiie4fHbXaA9eL_o64G!5X$xsSvy||JAz1Vu-6=nxrn2PWR}MFxJoUjMuF3 z(C2V_0G`B*u(u;!ibpwp0H>psR?_WLvMpg^e$(Qc$uht<%+bA~((oeB_js1LLeBLq zRZMc!xyyva0Vqq=WxamHYCWkc;R>7+55e0pdscZEa#iK?T`raR(R{5eBM1v2QlzBw zF7;4cg2nSM&B2)J!B^eSh)g~~LthN{EL47NeD`VWnN{VPk7#=V|8C<;(e4}1zDgn5 zcUT3x7nXMl#4Ded7b$} z3TpV^;Ab4_1esy`9FZC}93QDn56cb?)bdZ1y} z@YQbZ)~84_%a4X@q|2!M1tSk=&o0NEm-%4DedVXMl1u|lCyribTFZH|=5s1ul|l8+ z-QNKH2sHaY}KTufPd$Lw%0|(gBe6(SxJS>J2*^>RW zEMZK;c1^}@RlKoCAicjTakLgcaL2N3A0~mhXH~j9V8Io++o$0`ixg>23oBm^=c1#U z{VA^Z`w(2WEr@)?S7Ahac~_HvRkNG$Fas$C8@n(*@t%7mZDe}E&49GAiZ~!d3T+V@ zKX;F=kGP}sndX6UwON0=RvO`I%J8Y7ylMe8aY+EX^ft>n$8gTJT1_N$XLQPjO1e%w zu10?JIRv`&%x|-xYMj@E+Uu=OD?p}9f|Qo;ZIq)bis@fTzMR@qgA;ARfO_)p>YNw{p!e3)sQwBzIE*N=;J?*#}CS0L`7xzJ8>%a@DDyvOvG?&-!Ct@mraRpJFm3 zUtC}iTNq#hn$O&zbk;Gf>J?UL_^-e$=I0CuxD^H|>|loVuf7g$-Uj55ndF|a!dBP#{dnW^d-R@~|OYjdHP z@N+GvbLWtg79YmFy+kjIZ)V&ULGSQ=ZjGOMh!(+r^Hq`M0bS`y4@bf1<$HECW*kKd z1jl%GFc5d4~0Rimdxl#%}@T^I4sK=T*nAlw;at__?+X4|TG2Ww*bAg@sf-wB%5@ z;6;ZL1`zm?54h(*O#Cyali18TZ4&4JH;_Z;c^#Q#ZRayJF!MOslCOnS)=n;w^F^XY zl$%PHs!3n%AM8v}?6R^;&$1~YqDlEqm(SbiyQ)?lB#&9okTa$;Q@(Fd^=T!qrD;M4 zJT&R4k?%pA5mwtCa20HwE9_CDsbpwmCBMA7OuYB6W4m~0!F!ZIR+@E%UGYxnNuR$w z>KNKZqbZF-%mU`=b|0-=2B-b|0Jjo_$+FR1RubNW2=?os7L^ ztej3o^LmWVCa}K0zkMxbvfI2;1u-c0r_qMJ4x4*}R+O9oK>EajkBW*ADN{s5J=piL za7yB+3$g;q;@EHz5HtHR*^r-~@3%2i+xbN-=lrNTY-3bo?m~xUENH;!Xslh!4COq0 z!J2EwL*QWY!gZ<;JBmw<`X>6!%FSKuM>zDzJK$5S-|;|Z3V`$vO_S@LGP3#9neGY2 zm6-i|u(GqtzhuStQGoJ(qWx%7If`pt5~_eXKH(ds7eQ{|osVP^t*xk--1$pgNWT5Q z&ktUV`M(N-V(dmr6kO2!_&xWUTfDe9=NDj$nqF5tl2bM2_G?UT9F{vlPW62+v3#=g zL#WSMPPokr*cX*I)83bSdGYvPfoKAAcVHkUN=se;g_rNW1gb6DbfeOP;ut4L% ziwwj;HN4@ooqTdO^r+T8Dwg=92{%HWx7Ng8YbpA!+q6)TGtcF9GUFgy7*t>ZR~n_+ z5=c<6j0V~ZGW_6~f%7Sqj?Q$3e!B&-QG??^)pFHhNQt4nNcd(VjRvU@F{&69#vtMz3SZ8=?nn2C< zUMgle>nO(~xqtmtasYJRf{Tg@0!WoA)0tv~xBF_&k6tc&ot?gbA8vZj{tb&`q31FR zF>kMdkmv=!9mD-~tIXs{6`-_3sOb>5{-f z=fLBj1ZkxbvHbhdd5T)ma;vs0*9afL-Buh(@ru*8wwe5itE}Gz`7NmjckBdgRPdUc zC=Nw%8TfQJzWJH)xjC7a`yVwJAJ9#emLUq~ys`$GEB{J7n2u zM;_$4dB*v{+#tRfT#n&Tb*28?GyL=+d#~}ODzo=HTOLs4QE*vzm!*QWXJFs)_T^Yu zi|;X|ytx=#vy8-40?XtLMUOD2vknB%sxjVwd=E0|{o5` zx+a{Px@~8We^76K8dQ$F9<>_f2DPfyP-5&n$<~#{+U_HYeuqoqAQq5lE9I@kyhW+! zIsmPok>(vi6jdd@xkx5vpv~6#5A^((L|~chqE4O+OhvI5L5klrk*>nm6JMOEBT0Y9 zFO@x}FeH2@gJTx8vv% zr1a}_e8IL2_;L(7&W#d#<)wAP=+DlXT^{@|n5WAh-%~Yfpp31EietH_`AaFTLONE4 ztJ~|bj!Q(nJR7Ujw9fag-2`t&VVQ>B!_SMdQU#)DzF&025aE8Y-~13o_@8vLR05eG zrpkWGf5H{QATaW_=@H1N-*`ltc)6FY5r92(Ut}*0h+Ab$uSv5$zpM=U$p~m0OG2_u z<=N6V0<=!3{WX`G58o~QicMp<{0FSAe;DQeA58MU>*A8W@%QcjbC&9V5@PWI0)DEy aO<34nflEy1{^J)TNQ%n6E*5_K@xK8m48pYl literal 0 HcmV?d00001 diff --git a/img/loadtests/loadtestproj_dir.PNG b/img/loadtests/loadtestproj_dir.PNG new file mode 100644 index 0000000000000000000000000000000000000000..d880e9ecc5dd323aa586183764ced6a435faa4ef GIT binary patch literal 9246 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 Sm=k=a2T)hmMwBVpJorDnqdO)5 literal 0 HcmV?d00001 diff --git a/img/loadtests/runloadtest.PNG b/img/loadtests/runloadtest.PNG new file mode 100644 index 0000000000000000000000000000000000000000..8c2cbdec201b1ead0293dde8169b8610fe954569 GIT binary patch literal 10315 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 literal 0 HcmV?d00001 diff --git a/img/loadtests/sfmanifestsettings.PNG b/img/loadtests/sfmanifestsettings.PNG new file mode 100644 index 0000000000000000000000000000000000000000..b360fef63b56b8e734c86741846ca1f5fa120bfe GIT binary patch literal 68026 zcmb5V1yq}D*DmL5R5}?IBxJ&U;DDDzUkU)YIXmKaF z2Ms#m{m=QvhqBUy>HpqwfDa6h_`Q)iSTLh|M}-1B2^Uyoqzth55zv7 z;o@Mgv?2-durK%Abd+EHQ!zxpiGB0X_NC^_fBvb45L{V2!oJ6IQ89A+=btBCch7rp z=kM14{Bv8Rs_;_J%WUWRGL_<8%0^VKJW7e#nN-m`xfB<-@AZ5oikZt8_fg=BKpE1w z^5cm7`}q3xFDM#pri?#YOodOUKt_vyHoU3NF)6vof|gw7ID0JUF8H>PJpw-r`>^bX?DL!2H4jR`x5ysBUlr z&YW)nGMBFyKnypJz0MYHh;DYBZ<$*HM%Qnhr-!7FO0b5ho7)-rTM~{F<%P=!v_W#m z)x`8(x3_`LH|MuOG0rGBQ{$4H2HDj7#0!|ShBzW>7YH|GkuwxyR0A^lxJFH*ypa7qDfY&b(31gN+!T;X+c-sy%;cMTqPKD zWqQ0{BQ~|0^CHyywL>d@NW+d>Q4Q}e7+XXU@9Q_B2<|>ZV-8OkH+Fp?-j*0bbv9Ci z(;XCoxmg~iJuV8q%~dzh(--wP&|`h`_Z_M98+A;erw@qosuq8k$v&mzeu*u%&> zzbEV0r~+_2(ywT1)2?;_fkwW4-1>$__QawS{z0D_UdQ`cwB(C<>tul}=`5UIlE-ESnYZYa`heFt+tQ2O8Ay4#TXA_*Hx zcOS;OZJs6!!vBLz6S7*AUckiO-Q|kZVdnw<`#~-ug;n)K6~-&loE!96m6IjuTqPl& z>gc`g`Ex3-W!RXY*of6P>=viCqrs>pT$&%(I(MGy%7@0+hANH`lB<5=Enk=+nwxvP zINxklVE2RFC;)HV?A&BS;!N7G&FZztV0|G8TGVaj<;Faeuy=SC_i<}uSIuE@1zR&o z3$O#HQW`XZV#ymVdb} zi^c)>!j}f&iwy}4oMXhDyd5HT@f}S~#7^~_woc&i*mu4@PBQLnvf?}5X>5*F4$}UQ z57XWpBe0v=fM(}`2zs3KUlG<{>Us%dc5Q7@6!q>0rhCZ%29Dr zrP3Gl$?x77i^8}{>tjEcQ$&f&%}esCEfjK92)^07H?b7e2zwUljRzGP7>+lLErq)ZD{F+K#*vx{a8{XbJgkTUxY!;@wy9&K%TVz z9MGBZCvP=moUa zB^|^|Lv)tie&3+Oi!K%rk52w|4kG^bHRgE%NJV0+`&#Dek8rJ@6M)`}b+=>=`*R&Z ztv!P`u}n9Oe8YCkI*K!;ZNT&umb3WqDeM*os(yM1y&X!e!oZ8$#(+2ClNj^XnX`Ca z-T}I<{)rE19$K6ZCZ7_g{BMbuSV`(zZo`;5Ga++piuGw_Ol=QmI3`aAeIL#@?Z_GA zub@Cp7g4t6+^5YeY^FC+QC0i;iK(l+cIv}1L7UAan~x)nO5*I)W`5o;=2F}KhGrLB zK6zH2p$8`E@VGXUFkdB*FZeQOlsm8Rwn^s@=6LL!^m7W5@FmaMRZ5^Fr7xA!gi9uu zMv_ISbvd}~dh_-{PHjSnH@N!ZL4pWneL-MS42NZ7#l$1+7-6j4Hb-#ttvR_*4 zBik)ve_~FS_%fGPFt>Y7RU zrJ0`-$AZcCi|3n`ea=Rm7d|ICW~u_B=Wq8@5HB^8hKM zKX@?oX^Hw=j%6BserBs``LJxINL_Ghp3t!SL+;!>6()ZpC7B1~oWMZGZ6N_;4;kb| z;_Fh+q0d_VbY>-p#%Er`C<-YYSL*6@TEPs6(J>M0Y&1pGGuPk<)OKV%t;RMAmlYJy zr=Z57_@tkWH}2=wDpC=<8d)&QH6QczF_w`mK=s%TqK;(`a|2+Q(~JNqfNnRRD=i$H z{8Bgmm?2uZIr@u-E{bm!%WOt9zJu|8M1Vu$%(I&m2-Cpv|MVj<_OFb$P94yRF7f+3fc3FgoPhfy^Jb*l|Nw zcYy}R=u$SIibnY>%&RLqWmZS0X(0gc0SRWgRB@jwhGn$J9_rQEK48Kx9Ld&5g-nf* z=|3?gRE?k8yAF&m7K~AGt>Yg6wu32m{BnPlcDHo8B1-MUjnTP=~>^j$x|mn|MG9uk&?WxMdHD zKxhOYT~D!7Mv;f&A#o_506g2^Y0NK3(SNtqd;k%$kE6;J(RjOxiS|>Mf>=U{@5|< zLCK3kmbi>5F{C77SQspl#8T8dJXExM_TQoJUyLmJiiOnw!p*12l^j;bYmjd%s4|z= ziToLF5+q%Y3Oa&{d>O;{3~=Q8^WjTBhv&nX=H&%ifY`5>#-_wqT2HxtkOt+Pgbbh4 zij}*5O3?6Uq|CZ}f9g>2l|1ey4lp*q0BiH58d={?>3E_(d`(*n*m<4Kj!v%I4NB)6 zJa<3N%VA5$6_-2q9^X@Av%kI1h(Vi3obJf3xz*6^1>7<%&i4?>h;vi~XU|=l&(%d# zeXS@ANn5)EPK^2VMh@#-AF7?J{JT_ znEg3iaE49(R38g4fC@TK*Wu-OEl0fa+@H@zvNF|t?9O*y9{unZx|VZJPg$6+@Tzv5 zbYS!5!>@}kut}y@#;IVxtH&GON5e~$ElWUF%+~b%C=LY_FIl|e!MRCpCmlqif3-67 zYaAe{c!E*#A>e)FekCQ}dJTod*ihM@VQ3!}G&6pF0v;609^31tgq!zEz3S&7<%ms6 zuQ4Tma(MCS6d&9;SC_txd)EJnoej8uBU$dhv~Pa)x^`458_eDa{Nk6}!r38@LDSG? zrUR~6>9?;lSZuVQSIj%$TN8=vLuYf$px0~)Y-{3164^ykFPsIA328p_grz91&4qbm zTCxeMMQ^Q&TOuH+0& z!e8VSkj+He1%ZZaHk8!Ju-VL$bL{0lvRa=fcpR9j_u0|tAz9!GGhPWp zRPmX$yBdCGs!}*1A|?ygJxs6td^31}LIL{W(!Q7w@JZ3p6O*lyex;O=RnCm*OYH}a z+azdFs%Id|WnUFz<2VBAG10<_RP;h41JnwDN`8UKkn-RGpZqnDbdg6+1S^{4ZGX9y zgFj6nVl`B1c!hC6Q$SKwEg~cIn|^AjM54l0qYyPCtSJDR_*W7<6l(G0>PERq0Jd>C zO35jK*h1Iq>Us+gBvt?4eci95@qh$Q%+PCA9X>+=!201BQl`3vHy#3Rwu8SNs0n`> z(f1CptgxwS?I5D25H*W3dmSZjFClDeL8#pDt|2aP%Kew-e#Jrj}sDdmxbklPy`d+^?wg};m`^UejfLW z<~Q8orpzF82(_dSxzpYdff^qzM+kSSSd9P=hpG;=X7lZU{L^^Av`w)&XgW^NxgJB! z4J6;(x~4tF!z_E4B~@6Wki%qUm6U~jeSN9%qyZnX^hMjBSs%T?roiGSA-a)F62a3G z99<$1HJ!Ek^EEVbx*Ud$18`IGtXBtsJ=ysyr(X8 z)rH*rF|Gz5)@7OMQj7;#CyXLQ1VEJQIpqqI6XQ*Hc>!S$k z?mgd?fl`f7lxMnfB;gvTMJrFwz$%{NlQ9HZs_F^J;49%xo)2y^#%tX_62MEgm4h#3 z!x3rNB1%Mx$Izo%b@%XBd%a9A_b+t1OS;QfB}B)t=Jj{ zEi+JsdMQe?6-)IAZ9=oa*|NT3E${ye#7O=dhym`9PCE%F9~(07fNk`}9U!W0Xj3ka zP~Kh8A?9ZWUdh3CXn-Cv4$0aWTKWU^D$M(6jQ}|=QR{E3ysE{pjJdh05-T2!_qB8_ zXYRlBObim-VOj^JX9f#F&*{R}(Y-2C0n28K*JA~O4UwJzc~`uf(KYY=0VQguqq@O% z;wSEoUqg1?mY@&bSAp`pzc$_dvot>q1~x$$GuI;0&ivP(Ob=fF<3B!!dOp#5hhtl{ z21HYw)ABA-6petvu^mYtO1ULDWeAbQHE;{`P@1Z~L~EatVN)mg=|s-guuRg78+Ls&zO)n{J^^BJ9bEI;)h+tWz06 z)c{kM1t7YIr5li6tgIZ)rLO^fikS>|0b*aH{aqQ7{TWKJ`{R$Yx)Ssv5Rr;qp7~r8 zq{;t}+vndcMH~Jg%glX>QZfUhnp^fdv zI6vBBzNN25IU&~lAKL@2_}wR0^f$9UvMpgmoGxwu=vy~SRBm2*&7ZQy5$>^`K^imt zi)V(fix1ieho#;4t`GBf-Tea;XQ*VW#(9Gx{2p6FYuZ$RvFiL-Clbx49w=KZ^rruY z?%b1Tab_K$H}cI^v$EsH&^BypeREuRE_h*-3@CE$He>peOO27jY1P+qG{*3dm9ub{ zrRb+r+7xZf+EHTghdHGlGgb$N-}=w1B-&Myagh@FR^*lE71l>M8W{~+F2o{MhF(7gj_`gtPkxak&H{W6Ja6UuiOu<@*3D$~G`lqr z6IFKG-`plXre&n`P@&SLcYtT7m0oTIf&qEYZE~Am_U+;-lk_^?{+oH^6s$R8&%)F;mz)b>{2g=D$IfH#J@F_lLi@?( zL|rjn>3=fGf9t;QfGSl?DhVkSiRarrSg5B?1!RiN zDP79fuTm)VCs>S`&&@k+Y;N{%$Tbk?Yw^p8W0n!(6$cz-txdXeZNHRRRNYt50<(Mf zbLU*}ox;<^eOBHkxStlTF1ijPDYw^ktQw@HKD>@G$ z@(rNCa;@li)s+c#*wbbj1bQPhvmV}2jr6CiH!98>773kvqWgGZcC(k)2~~ZXqRqyz zaO#fVQs5DfcyJHGJbfkA&F#Vm*Ez|8{2L=Cfoivg?pxt^88&?!r!KlT zP3_aCE$(ZfsJZTP6_<7=jakDGae1JG(2vE1wy3z3+{$4TF@!`%q@ub`ai;bHe>$sm zDT>b9At0sl8!XUlS9I%9;Z&3A*O=gXVvDMB@8ZX>jjVdskkPqO7ADC1|t#Q9zwLkbe782&8 zi=zVd3gEIhQHFLuYGzt3+p!_lac2g!MzEw2I}2tt-kFZcWb1N7AgOK^=Gv?rQFP|) zc!~d7O@Osp!tBv?X>oMbphbtVDii^SD+YYXq_Erf!Wq#mFQLRlW{2s8MnAP|XZfUe z?8i;Z#HLStnq7cIr-iI=BV({O*5`eQP985TqMT*LmQdL0hIlhQMYcO|)Sv^WMO7E| z^48k}AK5>@jO{ZxE)Jqv={wG8dlqJQzLsE;N!Hvioa}@ju3_a=h^c{Ph7ANcrifdG zUM}|r&ulKZY}y!DAUJ0z=Qk7=j!x3imMgE}?8dfWzAm~}NilD`zJ>A!Mo+EiTA4G2 zufP~TrwkLPm4@azMaNz{xFzO?2+mUVld-Ww!Xa(ieRDd}ZTp?3G0(~vOhfQB2-VEf zNVS`|UMp!+>}Mel%0+Cwu!Luzx9e8Ey(fUCDj@2AsL3vHQ48c;#Q~RR(p%SJI3$oIMu9hO|wAwQz3m~LbFdQb1kE-yfx?| zAu-bae`5#&0BtqrZTylsre>1{k~R!l?KopH>7I^HE@`fxMAp=R^PQ{R-mV!KhovM| zLa|hoki+nq<)vlPoN1&JZlsO^yAjQYLh9briAev)NlJNG-bQ5oW}VmqY$-R6OI36mII=R^5>*5Rw0XuigCLaT{B@x72EepUL!&>c3jG|InpXTC(o(?l5r2 zUa_9oO*5g{Wnsi=vgX6Xf%bhacW0xAtO*Yj`iHv$6DwgS@wo#lQC`mA4Y#z$&7oQ7 z5)v5JBkzUNdwis|t2}p0!Z%mT-zaP6i))k9bbrAya3zlI^NY)Z`Yx7VZJkJwa;e<8A!E%x7!<@v3?k!U#+NHbf1&Q4JjO_@-6B=~8(YU9Qj z%e3P1Q$gYc_5BlOhT@KfV+ez(m|7J?g(#oE#1BWMhuPFihgnD#rDe<0boV#q2j~3t za0YlvNPl0-U=ZfHYb4UZE7l9s6_AT99Q!*Bmq$MM*dMh8G_ZaaKI6T7UK*P}R65$BWFuSLoMPgrnFDW8ZO28CFEtU{>sc z2j!L4ntIr|_^5;|ZHKr8IHiYA+u|GKe;)Of2~IKY=UZv(14!w#1d!Q5`OYk`u(xyi zj8ugz;h;m;MXSZX%tN-^!2T@F-}R1o(XsRo6gPSKC3hvD>(qpF`U_OpW#K?oT+Js5Xh1s2e^?WYFhPX#=&ts4V8b7FwQtif+lLTgl#P_8o zw^k6sugBPHJdujyJqR2 zd+io&aJ6`U;Fpjw2tHJ7lu@kg8V~=j5$NTB5|e`za#@-jOxE!SuqUGo%->`@-ZuHN zf`AVfC!1r~EBAOuWg1AyB>M~{`}&N@;4TaF!hLC~fLy`-=C>{PSF z|Fa^ay9A@Y1DMW{{7GLLtNRLe_$b~BCuLr@k{(~SvOF%}q*>y4YRyM%G3Z-nT2nPf z{QGidYioMzY3TiT9D2;v=s0ltZ1Hh%^Ey7Czl@{wJo(}6ELGb`?m4ba(JrHh{2NEd zT2LX#W2O|q`#^CNwZ%W&m9MS(3wF~_=dEGRMRZ!C0d4At_lXH^IxfD!mH-hRP}{4tfFG z3D$m+d`Euku%ywYM>!(?2%BvaLcu`v|vGyW;60OyqPeV}%$ zt8_}(Smf-Q2DF>H$67gs?3G^?T35;@1f9GeL=Ol14orGk=_^W86v^93VwSo4s!dXh zZ!4~m`TwSm9$ZQ`Th8B5NQYtNLQ8CaaZbLqg}~n^Vt2pV9$DpYW@|HE`OfUDRXICWTcV*KK({Cb$Y+^TPA8HRi{%}*C0v@yfs9N=kjHf!7BO2HENK>MwL@t(kOB9B2%R~KMaVVi$u~W zjgCB+qWw>QIt&`LFNfS^;L*ntFF%nU>s5nCj0I{ZvzI~+6wx4rhqpxg!V_Rp6<>O+ zT;dmt=6t>>|B(hxp#KB0C%@~g8gi-Vqv(hiPY5@LbfoUrvkNHkaE@mU1W9P zZv2I}L(w0XIn!7NDu~4rgxSTUkWnfpzg_S1vyke;LNTg7gR3jPM1Y*L2BUE_Focaq zEnqZZEY=T8BeXwu&Ca4n;)FMF=*Y@Rx#@U<0~M`8U|%{U+Cxd-4!i1;7s+AQBPdR2 zE407rs#)tY9$@}g{gy<(4j>1Ov6Y~il{+}bR zra}T==sWrA{ex~K0Oim9oeNRVp6Q|F>yzm(o(vt)L5n(!LCmlE8^fzjj+x8U zcG>y`nr;z|E?dYXNJk(@^VEUKU!n|L`kCh3a@QB)-Zie+WwF<;{LOcpg*tXvF5^mO zKpvx}x0qnfBD-g?CyRm0nuZN4Y{`x61IQTLF14(gNkK?v2k^mfd>AbJikep>iSZ(u2 zH*jP-y8X_j9{iNURtxyGjO8X#;QC!GMmm{L%!&VI>niDb?+by&QtS#|SG2ph!|~I= zM8hX}D#$*n2!rfO@&s&QPNgUn)QHaoJY$$6*e)gtYCdBK+2fBge>h)$IHeuG?vO6i zGd!I@TuFHLmtaA{YPgaop~gOjrT|cBG!u<0B?McMY@CtPBZvG<=13GsX7J_PT*}j@ zb#*ZK#OSkFIvBK^7)d5;z=!r>{xOW-a%--incE$68#BytNl&>WZYkz-#GdB%aG}+X z$(T-ZPq<^&OiA15Cm~`Ye|JI!sxh@7oEaCNzUA3?KJT44cy`%Q+}KEZ|mG>}H;^Wu>0?j5S{*x|yU%Yq)&v>^qLr zl1`}%;8AQp2&F~f>^9Cg!ArhB9+8N|m%U>HBX_&(73mDqoJ~=2Mp&nh6%PxR5nQj& zHASk>D#l7^#X*pK3Fa6L6xllesXz-rG~mj!e=W8$#Jdvt?2u;yNI_R|?hqv9K0L8~xc zEv3N(RY=PP@PgFFLnF%J^R6dW5Rt|{^UZ$D!9ZUaC&gh~{~n#W@oQ)?LvXb$+#Izh zzEijIh}!$I>ch0!U6pR*uN<4GQqzXVi{p>a$kU!z9fSn1;Tc1N#-^gQj^|>P(p>0v zZyzcOT%QdbRW-7yQTnz&4P2GI+L=@O;csCkYOPRyRsRz02RWBaufb;oH_^4UKJuL~ z@UQmt=@b=bk&o21M@2cELav4swGTphtvhEmR?rlQJWBYXc4Sb#nOSPp2E(B}RH}Gu zP4sVB{N1^=wV^<&L>#=6A~xbEw)t{>eUf{qYV*#xcusJFEaJi5iV$Zyg?F?HHbqv- zer4@19x5a1b z0C)fifZ$%7kQcbzq_MUQb2(PvCzk#>ILVHp>pX}*IAi0-P4mIm%0?!jX;yY|Ug;Xy z(0JB>Y1cm&pLLiM(AFsU)eM!Ws%ShQCqpA)O6kV1*X82q&y3)qlEM0pXrs4x*9C|% zT|gM;@TqQ{Bl?l)L0%@h`VR+upbqng#>}f6h?JUdS>qK$%f#@qj20DLR3k~S^4%e?DpEgD_S3GcvjhlzClp*HS_bra5 zk%ez0DvI^1l|<~fau-;6ZBx4qZ$*hX{YBSDMm=)8DC_ zpF4uP-@JbxNVDA&ldZ6d;UI5zw_--(<;fMIb$QBP8ad5gyFFJ2V28_5Ka@mF+~#jRS*aq_ zG^Z)J2NhM!ttI(#S)>RZLh>^WOyN+8V|MA`9%e*9sa|j#gQYGZHLJz6+@vXp$$ztC^ zKhUZtF(lrf&S_w#?BpgTY*EE#OHK=x#TAsf=d-PyLsJ3F?JtXO<&$b&>QA|LqMyzG>ticruNd73B1!tzVI1T1}RrK=~; z5Ve>ZBZT20wMoz2DlBc6F7WF|#sc+m8CdBw3y!p+Id%Df#km&2HKtIP0n_8SUOwT! zGzE+pOD}wFe>2YwuGJMskr2C(hza|5NdUD}NX4PMHQ$!LQbKftJ#kS!TfAeu44=X5aMs48*iT&R zppqe2HFp9)fD@TWYSO{R{PO80h>=!nUSLZ+p?h zu$(Z@JpP}2!9~CuUX@=jbi_2vxzuj&x`jc}+Tt3atHXZN5b(V+vkOSoMaZOFkdM$PRvDY|FhQ-s*CUJv60*US{_B-4`7?%SJdEx=r;)g1iY zVfOF4+Mi?8oM4*$jRElhOD@@fR(tLDc@=z#m|%ls?>6r2!R9pmeN^p+z6+k`ZzyW2 zKdmA*JaJa}8rt;}PDOt=+Y-%YHE`R>-#Z#AUKTDr>1H=N=HZjZ*t)Dt_BQ(cS>EsJ zl0JEFiR}y_7K>L=ysB%R;RWj!D88c{xS9x78u}%X0>79+)rCbjUW9?C!D@={OPxF^hSrU#VJcOjJa;+`v2ZoGmK~br6tWAz%b$DW zS9_nzKA>-deIabGLQ_!sL+jm45#kuDK{ftt+Y0{MY9&mnEY&T6836r~ADo>jLZ>I( zVb!ws8$|=v*SP9wBz*F;-QNnSF_G$c_#-;JqIoih{@lRgoZ+QYkhqNSWpS=Q0RX7PNfc0PNdvP`S!_0_T_M$@cel2U4H z<;7{^D%^TAR5rCnYz;-wb0B$TI!jfo0dv`%$(-DcgFa26SCgJl>`W8ajNzaCW)TVWdk<(bwZB>x2xjX zUO+$ar^Q5ujHN4{>;9P7%(yF9f_{%lq2DS0A$ZvwDQg+HS*fhawrf9E$q)qB_?`bL zmJ&q5RPAh;Q4$D_-^d~=#&tXCdvx_u_EonR&!0u*9Q@U&amVJ9_jQ8}{ePJYoH_g& zhVgUHSno~mZT+i{!wL<)rkJ=a7~rhD)~CCtni&2m-O>L}F^821Ah5g82P=vxm`Rop z&`E|MO8=F@sqOxMsR`~zUHh&bszaeFjN>HR{!faGh}iY#1*%ENjGwf7n;=E+wiSEQ zJvLRRFH?X8yw6|&6f2lpHU2I9pCpiv${e-(x7|=06-wt6?&M6_JJe3~WaquX1tQ&yOcsFBM|pjUg^=jlypi~gIN_{s*^+HWfZdQCUde!R$I?ggi$)*I3u z{V&$z(m8`O`?KB>Ur3!$_RIsjLEz*7=g?kE5jMnO8#T!q(zsT+e%LfdoT}wcxHr@I z^9KR2fU(Ayn9DfZgc9~}1memCyd3Z3e*o6bovr;v#?5L_yVMZ!z{EK~_s@U*lMNiV zS0wFY2h-qC;o_`4J8VA&+jp0(3k9>Eb#B-$1dfyqmW71w`#k7%dT;#qQ58ug)sL`< zGREM&*Cysm4?Bqa3;!N0)+bf^HU9c|nJTOGmyOPOupwlGt=W07%D2v_24du+zBW^fE zhM)>uUDV8VhW;hx&2?(vdMY{_jzC4t@Qek=^W?*(YpZ^mO_@D>BqVMEU9!rR%4rhX zg-}FcEPPTq%Tx2jbZIy=y}BSVAR3)GE-5R>doBUfz4HXOg7FsiBr15|7MHwOwHpNS zts(t8{f+b~{KXq+;Nd{SdMx`gQ|5th*Nn=K@BXQB4$uAG6#0RrhML123uUn(-3*&l z2Bv;IqOJO9Rx=kJU#VKAiL!r2`PV?*iwuvQ!&8^P5pm4R*LXhry?*cM z7$q-&9bUXM+XapiB#l5Hd&$W&5v0rMYl-^db%^7xcDafE42TU64|QCtcUn=uz@qT) zZ;Dj2bTpT5D5$P%-XAI6$I@fP4$o+Zedh}kXw7x}W)pR?lY3i-gVfV_ap&gu4ew6* zGe7+h6y?O5*+TSw+8=P*p_W{>D}IHcWps9?(d$UN$@fvHs~9!x{Z%Sp3Sk4?o8c)j z*QV4^=&h%@)abaXJ^8EK*iBFTJQQ?iZ2@>#D}*~+Ad<7cpDM-{nv?IQij|EZ#AC+Q z5%Tx1+O_fG_rZ=#g19d ztSsxuz-9VLuzcJp5w=@~GlnD1LD(Q|pUS0snn)Qx<5xeP-A^|WznmTR2wsd;yo@;o zn8J?wO$_({vNjku7sr$ZI&P1f!{f7bF+RTCO02b-Sk~D7&9sM6sM8dA zCrqo)|1g)R!^GvY#6*xBtc^Y3hWv&-_J&6`+F{K)LjmH7|&V{_7U^qPECYGjsHb${ogxw_x;IV@edm=D?260GJX7R$;iLVxcXb; zwBzKgNVmNOsD7*~(hE3fov#dLQBfsAU?m}MPa9HNxQQn>ylN5IlxIt*Y zWvaVa5HzNr9y`u%*1xzuelcX2Y3G~08!f9J_vKNgy(Au=`p!ip%F0NVa==a-o~?1+CLI#C3mInYMdcW9IVk>U(4Rwd<1; zss~dkO2@SuR}*lnW56}0oo0)Tm9lfZfEf0JJIIR9zcgZLQ$16B|Hp(mj1ircaG9rYPO;^MHD*Pv?IyBdCAkGh}KvVu`q5h%AQqWE4 zxAxFy49<U8%@PQ0&hdA@R zWbdRamz-G7HDL!`as{!9n!yXT)b?&h(y)#jOuosuEqAI0Hvi(#CaN2>uxtW4PZq6(E>f4TboA4@xrn+HIlQExa}vc z<+{@3u(1$GKWD8=Xhm$y+q`5Rb_DcqjI7WCImVt;6KVjD-ve5nWH#W^)cR59Has3? z?-=Zqq{TqPCi3|B{U7H~lz>ehCs=n|PEPwh+{>Ps^tsGT!G>NKXaXDqy%mgphuI=K z?jfNXIAB?VCfxviHKuyxPTAM#@PQ(*j*avC%M&ZWx=)TnPB|5F6`bUx7kmQb)ndXH z^B=-vYaV}XTmjPl`7yd8qVRMz60h-B<0g;Fe)yq&z10Rs!XA?7{LG_ znmdy{=n?P8-BKY^9aFi}VaR0C5?T;*B=Qh0vCWzDm|~T;yz8&-_*(wHCQbFeREn-U zLo7ogUv5)qoXn$zn8}mxDmO4UN^YqR-gq|g&IHHzzvt#0z04(N&5^3b&R?$E+I{6` zWqtMJcGcNhK{-ovAW;J4rn;dKOo8RrRyR*{}DVGoqnpZ)vx|;>O`gZwdMM1{g-inJ5<>rmJ*%8Hf#lc z^%-^LU-IUmLB9YAZE0aZDNIoz!8@XWzZo?OO_?nGhfxn2g2uEn)tu;?#SFNCYs)C$ zTZDk2aHTpOL`n#|B$TYE%bU4cC;MG{cXbjZ_^Sg-)9LiXy%@xrWzIt-8T^ zW*Cn-6;2_I6bzX=3+d4%;x#Xzu%m+S?SJ1!fxY3q75(vWX-_#Cnuuujab!H@jFxxS z<*3$=+DNyTvGuciOqo~JQ75`ED}B57WTd?E9UW-${5F9!D_v8Lz*S1c&nOAE;51|` zLuy>r;F{ZwuP#5j)$CZd(p}>%V*h;pVcIqL#+PThO@4Orr;k3N7#@6n@~N9s-z@qH(|yf%`6OJ(|4J#%a=5nU2oHHMW8=Iv@7fzO z`gLdG_wbcO>!|@u`pKzH)Qlzi-T3f<^s^!nrK#q4X|d&Vs->8T72U-K(mX4e+gpF< zS1v0ww9>H0yS>0|ZhVc$&q8jSaJNZVI4X&j z>O*_$8ZVA2_0K0_gI>19rDS>T5bywBKkz1t*fk&reIQMwNQzX`=2zU*(t{?wjJQ+g zDxQpyRp4>)!PqyI(Dq+0>>zJE<>y@($rl zA=_Irof$^Z(7EgN--o07d;t$?_0#1z`f;25C)QooQ~ox~C{iD~fb;?tL$+>4lz+?l znL~dS1AtBbPd>b#Fu_RC&jE>=PlW+Dgiaq96$Li0@N=%Q$HqY38%qrzT5imZuvM|! z9hT^g*SAi7Yx_%*BW7LVzlB-?-~)e-9#6KoO8C9eZzCWEVyJCqY^_8Cxfxo&wYm|_ z$`n2D^!N7f z9a+{-myw1_Xb+q{8aqURXM`N>N8VcF=?PC*^_=~;c0Yc1#+mFGHxe#Eh)f6XWfmXI zt-vQQo~?h*Wgl>L)C|aXyM|US;+e!cu(}~@Z~rM-xQ)s{*?aQ!*QnNL5i3fGy#=-Rh`qJ8R;>~{YL$plv{sC&RU<~snAf4d-+5l=c|Gpy zzR$<~hkuA9$M}4X_jtXYZ+qi^umODzrQV|a6|Qs6(m4$~%u+2F4EhDGH~Q#T_a)qW zpGCzn_xTI@VkL)%@fQ62Q*PJSvtRl#W+-AdTkYD>MnULnBSjbYki4+0G$aRDuf15w z+muH3y8!Kj#4ldHcPG_}58c+Azt_WA)xY}o`Z3UfCch_G&`iD~*3^J&%ddl(f8sz1 zhPAYXIS2H1Y1&6)x|hfoSGr)OB+j85hVDQ&XV+p5uOa8S%cw7k-u=d}0$CZroRRek zdi-MnOG}>4_bNNS;MKogw0b4xXC>byJy;ZQfo8uiO3og>z_{fhYcd-4j}JsW2&t%f zi*X%?<;c-rvyQtpeB;~Z2WvIv-*xBeL#td!z0yJ=-6`y9!;FTIdy+fm9z{?3-})c9 zmwvWiNPJ2R7Pm<(Uzh%_{S>2R!t814z9(UDyyQ@N^+WhmIP&meDW=))kO5uUq7v`@ zYuf!xmR|4zY@DuZ{+*duw?WkD^74}E2j z<)Y2uhJYA4p&Z9)X3?=k0phtc?16orNDqSkwn|HcXl!REamvP0HC5aTj8q;xovxO8 zoASwTG=!?K9j}M$6_t1pQ zcwarieP%K91a*~`&`cTWoNQPQ;F?Z~G9t%QPTl;%Tb&XPZH~9Fpi}vz`xQ`sau4l( zJ**BCZ{56P{}f-=F7&a;bs@6DX5(=k^d5UQTY|{1y_YdaxOJ%z4HToL?{T+3e~Sam z34?m-yP0W=q$!#8bopN0y*iwa{WB+&!a;o&y^J_hd7<4<%rA@x$6uto8Ky@b_pe;t1pQ;PYkSMruRFX`5y^Fdu_)(X5T zkl!T=Qcff5@|CU2buUya_>)0kM$8yW=*n;myGZ#$5u5en7q(qh2LD+5u@j+f^D4O| zIUPK-A3|e{?1xRW3R~F2+!~iNsK8*@H50FNw;bAT{dvCCGuLJM<_uNCiADTy(?CH$ z?V@0>`QC?AM6-83E+JxNMSIRfC`p8Y>!1v&lBZi0zVk-PzFYl2e zu2U~UQEI`FM_hPybDi5vkx)$hyruq^CH>82N7O7EVEe}g>`2ugs{N4`iImZVW7FTx zuZAVDemS|0rRkaUhD^eVI`!74?V?{qRxiL2ul-9+FPAo|qHL&0s+1?u$9(CwM4?f^G{e9KwKFsuTXi&%kD;tco<4U!=_7aYQo% zeRCs0Ti34Sg*D|f2wOmMYLu>g8WQy)ze`Wis`piKQ{sHj^@Yg%c4&eK8F^69 zaF46@&mK_uaQxuMxQTf_W>Pxy^<-Po8nQ0-JE%ykUUOp4XcFjGS;e{>sjbHRwBBWR zr7NxJ=OyE%H+E}5*OE13)|HgMe$FQH!BY#^JQX9|nW5c18x2zwqxsM!qc#|LzacR~K1&}j&K|es(xAK%hVVt5? z6eyP^n>I6s7VY|F)eLq6j+jKQL!eQ_1*0ES!$~=fCz}RE;}?4bQROwhC+hLlKbc5Q zRJQ=(xq`H;GiUITG0BFE%f%ER(|miZOq+6k%IUn*wbHup@m8adCjoM~ zXlG9vdCRSZ5f%Leb33B0a|Np)WUPro&hD*$VfmVE%igsTP@Mnkhw%}9qE(-217{3>UuUg>tOt2wGfW8EFid_&eR6E>_% z2^|hBAnu~{&vpl29u#D`8OCL6wp6dSSY&%Wt#5NRn{}h6YJUi`qw?iQSHrBCbKavT zG-U0i{Q=3o{ayKVt2o^8_h<}FXS|NKzir&RO_}VEVC~;Kb@!)YV;p~|BzF-}KilD* zg;Tr>WJTYrb`+Vv5XK+C>zKf18kS8mLo$q{Pqzi+c*yhY>bE+?^k=ue2?Pi8O)@hF zrXpD%^e?9>o9=$gUb%fy|GVZiOMHe5wT@|1KaL<8`GXG&iXhjh^wbHe_Zm7GpD2CL z%xWe@`&PMAk^ea)5%MX?cgZnb4!R!gUq!N@4bSFf2h z30Nz-w&BQNL<|%c#7^4-!sT*#SDl67K=>}5ni?~9d3Ersa1$yV+K)6NN`+mhj08Xw z54BY=9l5?d!lcek#kl$3o*_kw+b6rBZWB+eNYCA{6OkU;#Yij&ZPVEv+s>VA z!Jje_z3X>b)V+xeXDeNm1=edMh!8=F<4u@n24s@4AOAXpKgagyu?YXJVW7K=fUi$Z z-pqh{8z7yW0)IQUk%7n}XsHwLB@2TcauO~}jEi_G59L?H2|-sRXsN31f2QU+l3;_G zX4Ly8tJCoryeaMDcQ8GYSHE1!h!$j?)cmFkbTF=p^TK@I`yjYnlnU>r<(4Q&leZ87}o-!B7*Y(Dw?L|VmWx%}@mDpb$usM?SeLKBHS!^iji`iLBC&sl|m?aa{r z@Js?7?MZU-hdEn2Xxq9IjuqqqvUrZ zp~a5_qDVy&p(;a4L!Dk)%OW;BL4~fyJw3fx&zQikXXDm@mD1RSpy95J6SME;(9#WUUO`e$qTI?`@IoC-s2B`%_Rn zZNGUG3}S14Wq0&0Y|{;=bTgm_UO%$OC;nvWW-fF;Dn%|5>l$`OV}Ki_$0YZB(RDw; zrsSs=kD9PXIng4{DT*|m?}-IJf}>spYfJpglg*>}A8W|}h6?Gi_nz%HGy*dBL_`k(V^~n#SksMh1Iy*en z%G<P2|toAMcHiio*jWjW_w0BVyASztw0G<K!(=KbTfp{A;(2OsFOxRN?-P zB*JrcIRNI*^wOW~?Vl;3pT(YI;`eI4k2f>W-S~BrCr#wSVkYeRs_|=uA5NDZi1&>P zEv?TEoyY8^0@<1i>Q;%cuO zdlVivmOfpd{o~g&e=yuBC+7{_7(h zCt7$ZDC)O)S@>DVehTmT?lA$_N((3TtZg6NVaLUFsiF;%IqcV+q^kTj8YOUgHhxX! zU@&BMOB4PJoo6{&WgbYNrMg>=$c30@c-(WynPjmmUyKdSm2$}*Lp!EFlB19x#pop;Zhp|vEgxGv$>dfK*rF&Y|MAQ^bU_eLFTKe9GDhR*TFK$H9T9?n><7g@JJ zXcq`Ps$g8fK(6%cmWxl=JX!uzbXF~Pt`+a$t*g{Zy8S#kbe}d_VgYr+Uo3i0)PUJH zW>;9Du+>dMxObEx#@rx7LNo9Eb^U!Y{l|q{u6#XO@2`MiZWF>&XIb%)CR8UpFoKQb z2g%g8iE+qa9n{=nTl2Ms4@E_xW3}tawln!ZDJ}7hjp(*Evd)t^#;U|1Ti7hrC(6$e z1oCbe9J{W#R(?QV@73|fdCp-0u3h>oBsmFwMEz-Wvd+R_k&|xv`()pA5=VIS%Nw3~ zN_B`D1-AL<%x}M~`K~-YgEu&loVq^WjhMK{4C;s!y867c8{NsyKFN91X+61DaY}Uj zoEWT4mZExGo8AofoD&gmfuRPi~)-mdl!Ew3{y$2;f5r$dFhK0HfeNqPxDfI z-8a#90iAhCbjG``xU3k7(fzYShQT*80)$aB9|7Zigy*u< zma3=3ui{clxc0jIrLvv88K9mPet#x6FE{1q3_5@Jxz^hPvK)#%GG9uB6=B;6iAyRT zlV1?eF{%^%`+5<|`?N;ez(Hs_WA%8AjvtYE<#+IWsW2|v&wU7UjR1+Dw;pt;iqGpc>UY3e2!aONSM9e$6P*)6MstFka}3#ovy}TV~vcMMXAy4(}Pt z+9Z@$iGi5JCyd!($jSVB-58-Xhp^N8UY4c{SLKjvxkg-d5W>I+G$iI`45IEaPuN)68Z>w@{`P6tzC4Mc4p-3hu zgX?EXOF6svUYkFpCAbJ8WiG=d-rgX7dc{pVG98_UZnKdxMY8 z-q%>!2J)8E-STivUoRTVlzWUS@#_B4vX~pP(vKw@a#R2dRP+&Z2ov9g>9=n_o0~DT zLiPDEDqR@=BEKz)RNkSu`##5`6&7#LVqb&jKlwc4a@kma$3w7r|HWI}McvVr(0Fhq z`ow#nJQj1p#;&s0+6n0uZuF`FHGK4Nu&N?59CX4aq&B1}S3}dJum_~g=D<*s?JR=O znfJAS)%1B|TY$J(dAJ)S!^q=}&>CC~b~qY*W1_CPORTXT<^-^NT;$`;-tG@zpS!sx zzj(MxIo(zK>FHng3S-M;xHLrW8DT|EYB&UNd;4no>L>NO#Ghm~!_I0wpvcjqH)8X| z7xD<=&nx@AceRs{9A5<6bdLh3c-i;=gvt!v|2k3~cY$QiGX|ldh zS}z+o7Ahb-q6heh$Aa{MROQP|LLaY^Ue!CnT_gjY=V6*4R zZOU{T6x+QsQn&(8Kxi9!$hXiBU-h`(hpZOTI9TI9v9ysuOv2_x=VN!mY`>ItB`&43 z;_LgMambSuHT{!7`(J;C_X|h>jV~|u>%Qy(o$OTNbIS?Ko|R!1?Qh@x{x4oGzweLaoU@0v7?U2!lL8w( zhBTy+AD8X=F>^1=My%&gz!_4C(?Bcdmp!hGcp6{{r;s%_x+m-mxWW=+rm}567`m^m z>t4{IDR>K%y?b5qJO<3Eu_;vLeHBk8Z^-e)pNr%*K5D7UnI@nhy$NI>m3Z1hWk8f7 z@nVmR?>SpbiefitM31IMbQfv20z%wcg}nX3uhvGad316n&#t!x@Yz1f#=ZZ5MA;%b zcyMQFcHZ1Ld9%f5roT^Ltk|u;lb)LTK0KT-I8{I5&GqKG>I?oA0Cn`MMD4>1hP3!L zPB4r!_I8=4W@~|_FS*hx@(L=`D^Vwgh895Hsujw&5<3A(prUE^ZLoVMN{lD)-=N!` zGco4%Nn|(6*?Qn+Gik25A)@#dCP*2ju$vvC(^6;13*)v*DY2z~=)FPG*(8EqYUoW| zPt{Q3jd*_ZGZpDh&MNBvRHeHWirbyRC&HqhU(9?jd4Kd+=G8Q$bARn9k5_7! z+ujI5I#&1oH|}k;jeHzkrn^-kBw3GA=R>Bblj zl(b-53P8ZS8kOp+Bh~UN9g1O#oLNnQfT$8)+$rHFvV&m-o-#qplFuD)ObCKajpz9i ztN5QeW<)w%O!~UH;d8Z1FcSy#dJNrQ^d#P7NP@VYW)`Y^?BY?w!Y32*FU*<$5Ox%l zBlJ^?lrgDnWUG{(}RH=+UU_|RE(Z#txKypRbsnGWIO z5V_NNFdU;1pI?y{7LS8$cUSd5d!Xsc*-cg3+T1+qH1*UM7i$<+6H&FwC#KmB=OBpx zM?#=_bq{O+if^}8QhifMQ&2HTli$a(xJ;?+F@1dZRwPgRm>IG#9?2?PNxnd_Rm2os z4X_uRkT+id?kc)Y$lbmGZ_qOEq$iF>y1gAdf|}o678y>myQxpbJ^B}Z`|5AT%NJ!g z`xuf|$gn_xYH`aS&@HVhzKzqYmxlzR69G;2Y0xF*RU#C0ezL(Bff)&2U zwW%MgDYn|ZK5=9UT2#j4Bk6wn5r^kC!=i#{6FF8tT>-zc^P#n;EMhjOBQIj=yy$aR zluwQSWmDE3+~(V{4<>9k2l?UpmItd|VCVJ+fPZKXZu6l6>I7nkP*2|D$9D$L5xLJP z`xr7^RN@cc+G#o6)KAs@n;^EI%Q+eC>R20$N|+d^^8V-sLwEls zkvE?H+aN&uH@Up)|NlWiTNWLi@?m&ve9SQUV#)mSd1?;l9{ig*Ci&IodH49NkzhZE zN?Y92%kbpGn%%HlzL(tX2w{auH!{vd_Db(#dx zJA0z|C1OI#3oG`h!I?vy;oal&Ln$z@0y@pU0JB|s7Ng7g+4pwC-&_J6dj$|M<^2jV z%4u6;DybMN8Y-7^cmygD8RVrF5cQM^m2^M8yf`8CNz08pHqt811r|m$JUQ+;0K{jFeb)YT ztCl(vb;y>$$OBD<&_R0^SUp9Cf~f>x*`+2|h{4OsV?poJsw(;YR1+r>6Urwh_*<{* zyN`0F>QtOVh_zp(0sROSG3m7RGYwktH~-azBMxNf7WaCa_y2JjFHy9I-IpDAyOTCx z@{;LLAx$v~oWSKJtLo+O;3DPIWzJgocHroI)BZ@=`nUp}=6 zI_MwVhl=HK7_WdL4}U+royl})?0jgE?1-+;uw=4@@7mJl)zKi&KwOW*9wSxOpwQD=Jl zIG|R0>HTxb(L?VHcJPOj`rwMSUv+;gEQZ&pSumG$nOdk6#RqpkkmhkRt9*xXFSqVh zyvp9?V2C0|4 zHt+3|$3iyQpt~(vlc%Q*TWOKi%Wu}yU^r;g^9)=Zp?I;bhIh9+MXH=pz|O^xe5EOw zNPE=36I|u1+cx>&&8YM(e%=$$^-*H;=OlfUM+@JNPSEFvveZNk6^}H+mwcFMj4qE?e1yz1pI9-|W1HXuwZn`SE$mwvy*{Z1!7BtK|M73HzF7^f1Km36g)~D*MA$c_ys#&)oaS1$eB=hStKkSRR>(hPA zO(F9j*<0APXWw0;=W&tDm;H=@y`VZ8SLJ8)O^`lGkge(-C;tXo{$851xJlDiDuPse zX(R9C;V~^!Ocq0eq?4=jL@=c$7J3!#M}o|}WqSw>c)H-olv_@!(=`Dhdc4y)AeN zC?Y;RsQ~b@$ST%x&=pPFEqJaAu}z-K(Ul0-nEs_E56{S;7(p3b4rqdQ2(lk@pg@cp zY7Ew*3*nQ+pDuK=Pm83q2zEg*ppym@u6|8k!Qo ztew3%DRi0`A{ssBl$wT{GfG}t@a*XtWg5_z-Cm&c_dK}QcbKqekj-aWUncGQy4_r# z;GTrq?RMmr6pxtbg)dIfc>pRI5@RzGgY?M^k=2<9 zd(z{l^H}&+m4FD-9-MWtZz#fCYpzm(JGSnY(8AI%Q}BN3+lkw1fxDi5mxqPjM;}Wt zJ0Z8bhJ8lcw&taNo}b|IYv0EAr7Uw|WpzhsEIwiNfFv_Xk|o5a^+jF^XHvOQ>nTc9 zybZH{&PMcKUze}ga+6F}VdTf#p}|Tl`d1Tpqs%>i(;-s0z&oLPJ&@{wO#1N*E5 zy(E{Bch8Z*W%TP9=e2L`%bU)1Q$MMzA4;`+w55DLvQgy>{Fgz!X-3;XF0*GZ&y=$- z-h76~({3L3Q4^!M(L}o_noTz$xPP_2pN$1I47sISf)WGSPQR@Ch#Yv&h z;Z547JILh0PpUx(fr;tSZ5}Dvw$%_R#RCccQ9_qFUFMs#vBg;F_T5n@AG;6Tqvj4w ze(2%2(dhEBg!oo^pjg&MU2EmN9(f0eVxLXn-j|RZL@-F&2QW}-24qmy$RFu$kEZcM z6xSkQ#|58q`}QIYB7MYr86qNfC(hkl))~ zzPI+34qxdiYUA5{B}r|LuG&4S1XR$H$y%lhp#)lzxT}djYac`&zC6e^Roh; zvGiLJ8ZF#()`E-#kEYC)yz8yPr;fR+qMs#qBCvM9Un)oP@HO`nG7^15D^AfNJ)l$5 zNcc0A1^aK!2`2rmj83~c5-(Nt$3}7qJ`y?V-kI~?hJuzf^~>-%vKaNXu}~9H`VX#oBH_+Ne`LBp4zuY*BD5+;1vYX@i83E|SE9;Aq>!T$zbm zwFL{m4r4eV2cS_lA=m*2_vz3}JLiW-^5k7*$&qzd&X2yqJ64470Ti^FX_w7)$P8p) z>R;wwIoZ*~s5spEA-9esKV+7k3BZKx;+!jr`|5q)?Ec1XX6U( zEqn5x%bIsL)bk5w9LXI;4Nlgo0NjHVNDhYa$2!%=C`j}tQ)p@_wk*-9~= z7{6;(J9W(5C-M+m_eaxVQsNPq+Nvm#;?gC%Ua04U06zx+;{F0bdu4&>)rds_v*|A z&!{S?T*G=;%*~}Dsh4{aQq0iv4$DwyY`l<7W5)}yVv9yI94)JJ_WMXT8Ir#_8Z!zg z7NoS>Th{!VDK>Fr(@X|lK)P6|q@0R`4$*U~#ezt}gCmVMYR@EG2Xa~0nC5^4qE$FGSC%|@p!>lU#vj?^y#6_ourZf-Pik{_Qq3&-Y9-< zxs1y>lTdG{w3qEWZ_Ortc(RR6@%jGtbSh@?!l&^|`k#<(Cxy>4euZ;ocR%tyuG{zA zU!NL8eg>HARH@r-8zzL{7LH_h*Y{3tF3LA+wCN%RW8tln2J1cdSt5?Db?JEG`?K zr5z^m<(pG6G>%>?Ncn)Lpdfbu&Z9}xA91WI`wBe2n=FM&7|f}N>}_#g{uqYr z9O__G855%uF_6VRzi-GdYn-j#AVx!xz@0MT4|hI&&#a<7&xents#s^LFq1<9HO=!% zaB@6^de;epFT48RvXe%j-Abchzim1OYEsVtOKOwI=jAk}Jhj1u8;YSJ@9sM`TL1K)NHUI z#pW2W$3LOKArIU#!bRX{E+pp|H ziJeF7otssq3r3({Zgf11FMl_{f$>Fc19cEJ$b{|}WWlZnf%Z9fE!Z?j3(d+XdQy{j zp0oUuE=v3v``!?{G-n|&X@!eyXH06ZDR$AG z_m6m&Bas{koXJsZw1Z^K__1to!8GaErp~AHhZV-(WM?YHw4hkDp2U;t{rio>@PR** zEU<@U6awpo;nFCg@j8OCbU=DmhM|Sxo0K!qr^gTMElkXm%v}}!0nj=W+j^t3HosP> zOz)`}&3yfRZDTcs(MRAtQb1)6O_)mk4>BgP6L+0aK~^M~r1PsAlhOF}JGC zFd%yQfQ(*yryZMKH02#nxA-aG13OG*=qe8F-adFOxi$Y+Ax#em+QE#u?CiTE`9~RU zH8E>nRZLGdlvDRdP7uZ(pUl2GJ2H3XjXsHq26IbeM+0Nqs^?nX@wEGp$Z>5_g_#4U z{ip$}874`H*6YX2z5(-+Dh;M?6P5qm*KCf;TbS4mQ96wsA{q8no8FY^It6JsZD zZWs-fx0G~Fj@m#{f^4AmQMskI@SS|obt&9Jq{5JvZz1y$0)5giKyiL_r_>JHm3$7{ zebz0($Y8iBvrhk#&_=gXg~*iqQZ~hp8w0Hkf`gEghSEahJX{ugW4)2*S^H2& z#SMm5xh=;wFs{ST**LAgd-Q^p+L+SWs>=@C`kbm zk!!3hKny-}A4ZB0;knPpNys79L~d~DC>E4_Mm6cX!9dk{h#29NCB9^X=}xwJ(F4`- zo?q`D&hw#v$s`F&2p9-7EaJ32A>q#xpJ`6i0Chg<c zUK|%YdXbOwf^dF54KU;FutGsaB|acgP4E5_sHb{8TEMN5<|Dt~(+uq}xh;wUEUg^fD?Nsbjbi7JVraDUn5Bo1}8}h^l3kM!M1`zHLMX9$4zx z-VPF@(+$#mY4$kXj6b3LzGfIum`iMx|Brt8wsN@mTA*i!*t%pCJQ>39Og z5m1EH|3{gf4PVf0;>&ZB|6V2+b!oukw&Te{RZlGdP56u|+lwQi`t3v}+3P(9jy^yL z%U>^OkZlW0VKSggc3z?N>(kQ>z1>jJ7sj8^bF+}%QMJnXNFaFsgcRp$#s4*Eh4IaVtF^J}T?!`|WfpctW8E5@H-HkU&iB`AZ`gE#Xw|1i8I zK8$;0Dk^>%Y^a#nRxN+?P7?VbPrXkC6)-GBuAo@YZ#F1;;0=vn?NxPP#kBwg?iJ1` zJ65R9JNalf(p_F4)_52p)DTSb>;h0^+_~~U9xHM+%3?<&b!%+yy_`WtmOX$NkuS?U8 zWP2pb*S^}3Gu#){zOny;x4Y6lEh@_Qwx!g*D=$nf@93zfqO-j1w~|IHz3+p6dZxn< zkF39~Isc7v;ZFcvsA{~hkS!j%-T!TqY#(t-y{`Q|WTlabt9>}|Zxc;g^5byQ*+;j|i@EWVH07RuTV z56iT!ow8f~CAFPBQ2QAeJcz~?Gb#2aj}Z)$Tl(1WVs3(y-cPOomlC=x`I!~ABd8?$ zvzw}FOMY!ChTRySY>~^V5^vz3IVz?v@+}60Rh3!^ex67Mf_jz3r^eOg|85@?h;ng! zd}_!;gbzK!hC}1y88r(z=S0s5}3=U!VFFSZT&XB{9ek~kHK9KWch&p{Hg zX=yOsczoU#%;nx4b^?4_hBxz=3BlSF#G{WNl17nz(?K?v^?>DeqnQMQ{U>@tOe({+ z(st4ydnGNo$?7}<5R|9`!~_eb=>@tG9?iN_L@1(PDbLIkkm!q;b?Uq?1g2s>H(RM) zE{(&M=x{PPU$Y&0crJfbmHlo=gtLgwdN6&nt&?u%nZDdkxrsjPq_BpQv!tz&P+5QX zEOfv1(0bGp|F;oGYdvAzb>8q2N2W?RdkHIX|aJ=3kU zs4pt~ooo9@Cpho#)h(d4QYDG3HqJko+b%&Oo^?`;`uFwcntkSksff@mPJ91z3tD)W zAw6PpWg~?M9**zM^q{q)w?-euzhHy0#a@P9&wF7>_}Q5DBAB?;L2%XI3VdT&&42rm zj->+Tt?iefE4DL-)~@A8=OQpboIDKZL?B>;aWTU)4zzYUUA9|h^@IXuLOv}50NyEL zLF=zKH_7N_2v<^1-hV2u@QreT&PNv9T-GEF{abx*Rd!{+x?&mx`C?RhR%L^kXn6eE zt5upzzhaRut&W^IN?mCL0)s8leM{*9EqH?L@LQadoR^EMeH#U%hCh3aKpNdhJ+*1X z@rN+?sY07`mSo~cq4hl9YvqC1gorlT zG`b7GB~-({)9K|GQLO_sX&-^0iBrq8{!R-*aK&{_zUh6AFvZd8+b=-w9Pux`yw${& z{Yy~5>57D_DgU@%(+yBYZJHM>~I^KV4mA}fi*t5{z>9MVghA9=i_-|M|hGT&J7W}hZ zBamlwd0$cc?lT=MsO1q}%7iw@#jg>sq}kF%_?;E&`hATUyx}Hw+jCdT&s4C^z3uK| zaETD6lSKeEX}VxzYO`~Rg&VoLY%uzQE*dEiRR0pNC3;66OgJxZk-0Xz=Dy}Uj*w7;J7&f^XYUyLuWmlo2M89YrB75cr%?wv9hw#-!WuKBUme57$M zQJ329fD z#LR^4_6grn(9X#R*(98oe`Ip_^-vZSXV0EZVpummKYOQq->25%D2gV%0p1Y^7`aUz zuUhyonE2|}UXu~;Kv>`an5Jw9??t7Abs;f+dzUq5bH2EXoLTbD&c74c&uwz5EO z2Sw}_E-Fsq8HkiBs8G&u>-;usA1Gcn>qzI5pV7$87xe_d^A?Fc^Zc2mDSSNFdC(=m zI81Jib;a%BwsyO8stq!o57P1+;B&nTU7KBsnc`6V>Z6>tDv!*QE%&)F6VJ+xCnF)Y zw#Qoo7*HML(bXNM&klx%JsoiTEU@Ja$pQNfu+ciUO5VE`i9~tOHmMe)h@GHW{RjSq z!~?b%@oeQ6;Kr>Vn;>zcuftB|XEE4ebl22@P?bN(dh$)-ozEuuh+Fo^s=l$9O^DwL z*R&KttTfav!sU{qj=&2vfh*j~OQ+Rm@f+L@W6-$%l)01p!{6S5||r4<}jfJM9Na)O>+j{PgOf6 z)Znz4nj%>W*_u^Z<6Dt65`S1~3(_5L3A-L%q{mOsEKx6_T%BGoRGSaF-&cRV)7YZ?i!jIx=fk=9AlL(T!sGha{<>Rb@b0Y^1{2#4}iUIW@ST@ zv-};CQsak4d<6pg$9AUFyP=9O<-HNG{9EpBpdH&z$|qB-@4nvSsqPLLSWxfMX1QKN zMWJ;&qYBkv%MZe{o4DT@pPI(DTb4QL>rFfCWM=zB@XV73@Np07*{wLZQ=?(pGrnGKepo6$Y`MBpPNPfK;}nN(xRHPDgmYZi{uH8}zMvf1bh;JYr= zs`eKn1CA>*G)-mYRc`OnOnFo>B9c?K=k1LRq+KWZaqo%TuM$Q`O?)X9*uAbs16}RV zd-ffZCJU*~z_FT%6DI2v`*Y%|ws{oCjM=4fK9+!Hx2-4FUmLarG);S4J;C*dd&R=@ zqbnWzR>+7ioMi@C9t+7biV3fbI z*}R+RI=ClL_|1Q>obJ+ z24aF4&H?~wBegm>c+LpHg6l7e8`C#$mO2T}DTs1Pr(Z;-U##6##~z}5uC47td$@N8 zM$FL}vM)X|EZt_tI{?!=!K0z?2jpFnA{_W7bci{G&}y>3@Zy}>+1D@;t$k1$qKGfNEq-Z`Pc z^F8;qcO_*J`Bdllq=JW}CSUME$oGbO+RQT#@^1u*U&XX4vvwe6tH~jk1viRHXMSqC z%+0#hix}aZ%)g5NiO=Bh<+Q#|bU2C-BJA1kC~_hss_$pmCzqX6-C)mrH6Oe%PCtyc zcEHQneVMe|gLidCgyEOyGQAP)*i%H2CFq!q@e#r#8dUrviYQ(Qv zGu29)4TQ%#3WD!tsMiG$#`iDOj(W&=E)|Y0ZhG77nP=y2JSmHzk?A*m4X^}n{7Q#x z+jKR)Y)VYdwFajB&;TJ~M6MyDTs@G(S_6J(peD{>_@ijgDhY_s|6-~C#+v8TY5(=a z1bDK4pTYlqyk=mk#ZH3IenE@B!6z3}#~2c%{WpuxWx}wl?Rl8+4G4yl02tTirDJ{w za%_cQ$AVeamYP$;Z2vFb-ZQGnwc*xvsi=U8bQA&Uod7BzReF`GbO;@3(tCgh|u zb$BIs9+)2Z%lpS6+0nhZCTq`UPIWB#@m+K7<;=jTioWRa5mNQ~L#4!rrErV`4PvU# zWiV#IT9fv7j*TMAU0LvY#Udt5!j!8C_?1;W{}i*HW8Y)e7LT-N{MPQqG(Kd&rm4)x zZnh(L+eto#!#?0F9skQ%I^FQpodY}UdBOy$xx7U4HT#W_6qY7Q5V)52ffhw^#NB%o zELE(So>>zT#B^ch?#7Ku2>OS_ZQvDtxc*9PR|!V8CD56I1c-89R~`OsG2vf6bxpbQ z%LNAGMpHD*uyL13+&cdBREVA`()Ik@s4Na-d9bpxGV7$E%@qk z^1#X!?%- zn{U8txb=LP8!R&Hb6z!foR{&DC-BNr=_$|_1U7qJqBk<3AUI=7rdwi6FzrFnh;|5* zne*i{&oyNP079C)uV*7i#1a2Mkb*Yxg;-l3T5(elr_9>9_jI@Wyuu`@aj3451i9AG zvs&d;j|tZ*XNrUd@MXFsuW0?$P&eWndy7SiRt1XF*Gp;N;&dvT|Cvg?TP0v=UGO3( zOD0i3)!gWWvC-eF)#>-&)?qvuol?6SEWqyX4*JpS9lMNYKsJk(2Ev#Jrhb;_ESJLI z1Ml&)oc}(J6YRSe1P}3 z_^>T|2&2NcxXv4c?23QdwdJb65A86BRdkO7gyoU0!czq}Te%Pv<~17c2b`k7;X1)I zFI228bK9C)S|lyhAt4>$cW`CJul~i(h z)|WNZ;JzLyg;tCbP5H%^lH}82w(ZYu@)xc+xA6or=9g(^ zamkPEYbaT`H84Qqui44y%M}!u_H|E9dGqYM_B7FF4+|pq?wEVEYYt(5@_`R)foi5T zls7Odlz@6N^KE*2z&~)H6lYBUsoLK-2cuhkmh#C4@bWxXG{*hM&D^S5fM^c89bCj%A46(9~U)5Vq} zuil{u-bpqlYxU?(MlBF7JOuQ>!?|a>!T8JTt6bO!!Zkxldzs%y{p8%fe|V^Da{qx5 z`&~x;A4>lBPyTQDr#>tVIpOl40HTK3^#IN|t!=&z^te>GGIqxC_m`wL$tzayT3hVD zzT%*}oP7-CIP=mWz$>=0AQ|#Cm3+DdGsn&%^Xy6qRviwTUc+~u!asguX(BF?SRG^{ zw0fd!Q+CFdl0R9D#y|}BVp9e`3q8Klx_n`Y*yZ0m(8Ky*$|aPmN$Oj#c(eT0>C)}D zn=Xc=I!BAAP-FKglm!WOC8qEBPt|p?;J<6*);{#~Ee4NNn7*$$iKFtR>N;$Y3@O!v zJ*vnG^H*d~;E}xV9AMKx3hSuyC<8F~S$LL<^I3t$(bTq;Irf9uDq3b=H4{Xf`+;)( z@S>vA9kj^{e^8A2AoeKZ%tXrAuMBzIQ_ousi^vn7D=OoCrk=LE10~<|nxfLXg)Q!4 zQ0

(aPiuD#)>3aU5`S`nC%J?%93B3Q2vxsPnX-rdjfBJ0$QeOZaG{`J@CscN-sF zvwqf-em1?o+->CS2Xj!}yP_07T&Ax4jEXPt4MHo5V64yPap;_-_xmJs+^w^zPT_kY zwB|NQ!Rdv72SVSwUE#OC!$J5up=}|i>gA$VT_R*-p zep!$QgD6Q_ndXvLD<|0Z5WeHCJDIq0fL*0th9CFF=6GjoI6r2&F1CDLyx+At*ftXj zS;uKCWA-xLd}ZEV!A!&VGUozQ9}n#p7VhdT_26SZ^GcUgGF72YkuEd!FJ^otQ*KjH zIc9wSyxta^6JvIeQa!Et=WVpSkjeN$yl&x)FLArkyjT1MG_ zmC|RGPN%&re0!~RzxZOaZnswma^~0IujIBf9g}@86T2VYQWXDTCKKDW?4+s!getB? zAD>MG1>b9Ee#W7zkrhPNn~ai8wBnt^tT8OT-_-%Gx0vuJSk8B`VMw@buiZ+a!4 z84JO5KC9sF*JA-!Ys>{Ufh|zm`^yUz@yiE2Nk3AHtbrSS>mP@+Qpol_oj@GWXj7R@ zyVoA7xPW_vwdm%Vug7&t72&UFcV;C*2C_~Mgb$vrlakgk6+r5S+d%%7H+H)+AVuv3J^egc*OXZTTAktREC&-A0}C}74!28J}{_rl-wCw zDS{Kk1X0NqplEu}41TWt3f$v;Y+JUEd0M>04k|$E9QqgHA7ov1_Zw$G+Tu3(3^K}; z;biFvm$^++7qUqwJ^a@(pdXlSaXjvJ<;BWXbSRhdvJ(klSx< zJ#zI_z4V1h@#5p)!}e)z_wVlBCdd<%x`kWcBi8)kws z#c3v*@2-2P7mU=zx2@$xzW>pU8jO!J2_qTV4UM#;j~ZwTxUZh=zqp4_*iy1#2$|w* zzYlAT^CJW4PQG+?toq715L#UTTR3{5U1Qaa-VK%SFV~ z#)`Q8vBHOfn4W^ai;$ZAJ3Jk|hi%vrqTv%{SYvhjfc$8@mcz5enW$ z{O&7~S1qFfH|s%}$te%Xl5+jOL(FbQu&h587eVZ_+$fB)A|e<@q(XC#lKHaWE$c)0 z3^lD;{Q%qXXX^~1$|5#0mmE%93Nw;11G#FR1(<-~;A079C%b?}RisywMdm9*MD>DH)(m@X-Q>F`{>N%m8pqn!R0<3&qQ(l`{-#Yf>TkdxLx{Z#Qf$S?`ce2Gzi=S1-Zv4vE5dJqkb|Irlz}jIJDf2j|_N@pjP?B z5zdj&szNcK$0bfD7~G>TEnUJmqkI($tr*lz&@5;@=H$_+Iuo(?x|C**sMz5zzko0d zWcnU28rm4>7XmI5GU;fwt~0g&0C7L+FBP zD>n2>72r0={xt8SsQznCASmcuO(&S+rN}4hxjBbKm|06%u?_Ac-9E8)JcM!jR?Or7 z&2by{ujBS}C7gNJLn!FF~q69UEj+0t1#Mn>yoQ9^Nb-9f_QFgU_h`kG+y6Y4m1i+eJ5vN=FYGb zP;y!P)uU9kp0i;X({Ja0gxSkUUtg~rHAPw2X+Cua;c-sfA_yh2wqD2SEv4vfrGY3i zHG(%0Jmsfv7|ZXqSPY~FOOM;0Z?^(Fa}=pL1sAO-)ZorO5N7iwUgdu4ZY~ww>l;Gd zBc~5{F=EB#9ot>NTG0c4_fyMQV1P8%aa6Pdlz(O;IYX!n$c{{XaIGCw6T=qZ@at*N z+`FTGXXqa76bbdt;6&Cb|HFFyhZ8>r&|zu@ z56@?-T!!@`AAn&G*JsY`$~j%?H5V4!!#nKm)b0Floj15g81oT*r}5pMcP zyp30&%3Y7ue(Kcs+pTjyql_ZJ#PT}+Vs<8^3;h?0%m*NbLP$R(w~WS@tP`6NQSqi~ zO*Iu-*P#&n)-blg=&$3!q)2Gp;!|dAU>eFjyXGSm z-S@QTQ<8YdCPHJp?70nZzpiaC%(=URPD?)hCM`mz`45Wpjn72*5B-9E1 zmI?gYlnX$V9ST$hmQlqlMI2WD>cMN-qnbGL4Ot93gl<}MamQ05j7r>)I@LV~cC_7+ z4VT;tLhR}QC-SIg)>sSvw%zC$Ow}e!c8;-J*VVUL6-9n;_i|)Bl=rX9? zz_0#zI%n_x4pD}qNv>j~HruE+mOrnb zv%`d+uH_cOc@kgVN=$AuZXwZDCV5?_(HFm)rb)}BQF^ktJl%jjNZQtDJ5t9AIzptF z;VfcmVwx-n7JZDF@Q%sU{Ulw9JM;ci(k&ZLB_t#u2X?1snt=_Ldns~g`LRt~{DCIV z4TjZ(wsn4V!W%!R$G`O6VVB|sq(f(^W_M5es{xV;AN9HTYH$kwqvet7-Ok%Z&1bJ9 z4*OnHV8cu!7JwspT^HR6{ofTtFcZ5Vv{YA(6u!j!I~$2{Sh3{!-L+WW?+pj%K@BAI z7wpsZxU;t(FU>lm=zg?a@uf?e6YOj(ka*ARe-Hf*GQT`2S|4Kuz}@`&av(LDl?Ewg zs*axwko!;5&PcBBaVw*r42fX=ntSZ)vXhRl`1Y&Kf9OVa$>rkg_P2?zv*rV94gsxk z3C-xG^iOrZ*@N*Wcg1fN-EYs%3;fjvLDch22c0;+1y|o|#xCBgQ3S4neoq6C@PyN< zd`IdQHlZBek;K$#z=}_VKP1)xjyheyt={7TBywAf=C|$}Cr$v$t%sFpjb?_oN*1bH(RD4lL*#o`cO>)zNiwVT?)EH>h-fZFFY4`Y1@jWKe?v{Qh~oqk zCy3|64O>~$jN>qpc| zDT}N1IYN0;$zGKlOgxbEUBGlmJg0AHxul-5EEuYrL56GGl&Ykj)Of0K4aNdS{AyS_ zSZ@!-} zzN9~#JAX$qpx4APMMO9WS8tXa+|5Xy(c3i3Oq=zX?)9}D?1^CgfY0Cwq)dJDApZ<) zCZ?4*)ELurLR991dcAolyxJ_#E6$T4f6+bl7w^0mjTcYOHS)A~Azk?W_XZu_({~Kn z=bjE;c6f}FO;2L3@qm1b9l1wq$Kw$F_i0#JqD>oP1%>7pO}T%U4i8pm{e{29kb0>R z{Sk1V_13Lm@EN%1e4JKZYw{Aer$VxvmDcTbDj#z^ZNTupG+6pR-Wryoh)yA zs?p_iwbnYN+iI=*k~h_mGF?rGReaL#6aRgU>bF0kpjN-{Zp5Cty->cPn5`WQ?>^hC zlX04Y*RMW2n=$)j>?ob_|00T@VlpV&!+82&weGs5O2RN&4mLuiNwj8l)PD z#b$l%S8_5bEZ$wc4Oih}Il*uBfq0=k8|yQR9L zp8(mF%#n9U9g77k7(Z@=@lqC0c6h}dd{*L__NTXTt>s9dOfID)AT7|WWYHc_YbL4j zU;){g$d8J3%N>L+X^IUn+jy>a)ZdvAB;}m~#}#A<)FU-rMn1X~9;9G&2J{3iZ#duMllv$?~*B~eiW*XGey7qR4OL%TOPrb88w`1yih!TEgL z=Bu1S1+}h2Jn^UG(|zR_<@dfpxyTQ}F9rKn4RQG%+A%wlIhO~5-w^*K|r{t%#3##l!A0nz^Uze|A5f9-fqqT&K zN2hWhZ6Ch^d&+t@Ed8L;*I&LKAvhi#%))Z3A;}T)LB|Su!cPS4ypsWaMiqa2l@=4@ zgO;}zfC}Egb-HzZ(Hq5nItCUM18|)sh?7@hvFH6~+!|uK+~A5UV+~_;rT9m(x;&~q zSeQ}Vm5C7MZPDW(f}>u*iCsMn`jE{)N51YZ2lqOs6u+pE%9kQKIO-(6x_g_UYnxof zgv%I9u$O+nSZF=&VT$QG7Qb%bO$`Zht>Sr-@nlJiSovls&rcehVDJ)?6h#wh-g~W2 zDeGC9N;0m9`lN)$<^l@ngTi3p-IuP%_o3E0K@2#ZbX`U_Jq>#HNQJ!Ay|#p?FAu&P zi?aZXBLCKTHQvcZ4aD(1yz=+XT|{?bWx2zjwUu{Z?$KnlyjDe08^8T~iAIt6=?TKF zu@H%$C}L*ff92#*c~9g8AHX4oMMpRPDrD&gvw*9p)m06?ja2V^1eZy0qtW)O{b2FrYo3gu#<;Bf})7degppJAIuk zRL)NF>fxS0(QM5|id43M$RmZ#ak%--#5^O<euV-ZZuIJWE0f?$q$*%Ij3+-KdZ4~eAbj!>#XZfpT>@PD z_u+$q-{(&KU(AXeMg~Sosm6W=zvZUOV_#80ZlfKNRc`jLFK}r5n|lDHz<_!=H>d4J zsn0BFzCQS4Kzb?@m=aaWVV@e)waNW3R;lCxj)?j_IkZ0}GAh7^YJ@r>nSw;^NOxaA zrjMzDZdO`PZ=8y$o*|5je07=Z>hjJESM#!wOH%~IG;MHT{Tv3cGVdOd|@d0NfX&A z&LPe>K#^Y|J{^A?4|f!|I}B)ogjvd2FL~@v&*BkgKeyj2{UjD}Xvf+*bQq?r8M;Wh zJqJJrk$N$?qPr18{}FfGRi^L1rlSm)CTrfGLNiH%5|UC4QPDTM)OVL{|K*yz>kc@y zs~lBZlt}{0`sY?V)r3}cTru@zwIsmQHWBG5b zQ)9M}lRY#>gsE?3TL9`g^b)h$%At{#pG@tE`4i>wW*JFb?l+t zTXnGIWp2Jl@|{-sIySSF1N~_xw7sKz*O6=%RShjphV)>{KshoBaXnJO zYFJN8j@{V1$H$3n`H0f<*^C`Mjq7-_^NeBt@b+t)tlMnU18tW=U^VA zdQ(ozl(UD-%0*otF2u~5+F(9-7dn~>T-1)k^MBAFcadHK)XVlY?SVsM_soCCJnshX z>Nl>H%E1qM@?g{?khuSQ2;a~@j_t{U}yJ58G>r= zihA0s*$qWJ_|4PwooGLAH;jN>U_fJcw*aF<`!**g;t<3DfC8B{WTqv_N9(vIAqc^0 zq3H-}jrmb8Zqszh7+v#!>70_>T?Stm*=Y-G4&0d^$*q4 zxH~rSBt~r#)$@yb+`skENKTZLV=dJN?)Cb4c#zQ3wI+lA&_jz=fF2q-t|oaK`$rFv zsA0g&KLI_|rL#(0c}OXJn%&F4`x45MWHu2pU+HZkre=tF;<0aXd$*qVycM>S7I<;6 z*Krwqv-G9KknC$b_Oo^ZyErg6a*mFm}`;`U`t4Q3otFvZD zc;_Cmr`>*iXF%WM7g?)!v+GoDz`Ta5mT-`f4uvY*C6x3C;z_Bl+Y!-CyRVH|{Ar zDhE_~O-1?kZ!zSq5A2)kV3YBu+`+eqASWAJCMK2E%Qw?o{q)$t89ta0j=MKm^lwZH z?Oi!^gxJ(v5RfE0QH)RShUK3OhnbI0b}U%7m|=eY@?t?i^l@8P_vYCf8l5%aL-a(Vve;foMzx>_1%r+GMAMdYyFNptW47*9>734Gms=;gvJKYeGA2>C zfbH|wD~kE7<=b}9sVsbJFCYQh>}Z+_v+8D=b~~0#cNpZpPOw!X6+}`r<1wy&q31J3 zG!YuoPN`8kqSz&a6V!T2t;`Iq0X~o7WD=6jg$I<3tEB*9duOw8#*rQ8N2q>@Vje#M zH{VI7j%?g2N>lSd6e&6;%PhRCc~;-bPofa+wyGb9v!@>VjPATJ7Mf&6PoG_24I2YL zGPxt0?$hTmX%<=do;Qzq%|tv#OsTThG!q^9tf1LilLMW7b7Ha(XKk*5D{n+_vI}~+ z=^v8Lca1ZvOwzy-gihE|A&QhY~e)l4AS;sKzDuIZozpu zGP>Bz_2cbguGsYD(r~rRgEz7o1-`wpZTVPghm~4WX)8qA-~)VyiVD}Andmwx)zuE7 z!S6eil99f2B<&x<#|#j;o3eWGL$cazSmgmG@Tp4jfkYIhcBZY9qdl;U1KqRlK4dC< zJZXL9sVvo7TMMMLZM6Y!p3S?;AJ4@s>4COeCej$}4eg zS44}z=0d<}$11mrQ8Pnf1^%aQ+IMv)wq1u@o$MgaJ}=n&Os5P1CHRKITPFGCd%~)U zqnzA#2}T7u!5;2Zb_Y)tL)AoGb@(D6u14=P1{16YpJl~`6@KieE+#Bw>{cS2iuaYQ z9@Ae)RU@-A{H}CA_MuAb?#i$~s8f+ep~#q?J0skRmqymzF{b-qy0O|(f{BE@{)K~v zpEzf`)6*&03yQwS4dXt?A4Okf;Htd(CK-a5!$j6>TDFTfqe-h<)1MatedZRkA;iMl z0%CwUF<&1IRJLxz$sdQ>zkQDD><2ET6wUWPJZ$1ng5C|?mrC9gmww4fh^9v9?R*N? zraGwMX<73Y`ySOQH5!%hpFyGjFm28kdh!AVs}75RG2jfBJP5*D<(DmY(eaD7-h529 zP|(VK=)RX+lW00oax%#Hs)zJu!B})%*Rer%@F9on!s)6Pd93R`NN%Gol7r`cLjMV8 zUa|{?@&J^2rn*(b7mZP}2RiV`A-ku9Nu;G@IHG*(#70QuiFA}(6>s|%2uG$9Uwey( zk|*0O*`X!EOtjh$CsRVc`ryj@HTo-KtHIIwjso9ECis!Gps@P+&by)HDV4tpQ>+Je zAHFM3XhPu8DMR3~9lwkO0Vomq!EscD2v2KCEFB`vm>=K|n;-4W&P224hVr zv1W!`jG4(NSs8fxZ>eJPlllJ-sgh~rk0NGeto|mMOu#~(DvByq(zU?&-~m_YY<9?w zlxrN$k|``p6%>jw~GA=zc@F;l_Td?(v z<*j;W6pEYT@sw>leNtb9ITTWUuaAvMyvb7MiM$dN!kE5)FQz_MyzSvnt!RjRoNM6) zha+Il1fuL|FmDMCtJ@)tHN-~_h5xmsH7s4G_y1nAfO)EhvDDE#zmr~S^I&UFohxQ2 zsA-LdyVNYpcQ&;lg>jWwYD5(Od}p@~9hQhW1a~Et=(pqESQYkDulaUY+#}xpO36%n zIm=^Hob|EBp;Gg%3}cA`T$A7DvH)hVC0C1b5?fov+|5cwZ|CbSIRCFj`gq5pAtIgLt%*qv?fK-BL$RWQVO+R(v(-ofWb<3kcwU}2; z2J~X|rx^%_Oi00f&J@tlNpI=FDYMjj;jlX&e={5{GhoFVjaGO|bjmviAXdEDZI0xN z>QkoCtd2>>AuX(5%W@A=3tC$rIP`Ts2eSe@eu2g>_g;k{diJQeb*;63y;?RnN`~ZrW(T)&pg|Wy%9W$)1Z?C!vT%9Tz}-h;45j!)!->T7;&V}MOZfR#YtywmqI%BTcK;b;?cmiTOmwKQ9F zvLd`wyp^V%-e*gIO|NwcjxQvs>7Tmk%m|-%rvA|a_%xs3AIpJ8RI6NeEnm}bnmz#cA+VsCKcmFEZWx?gQ@B8Mu;F*`Kg8aB&Z4loSrbVyuBQ zi>B6Drv9;#>mQ!YT^XhN>h>|69hkhO9c5v=7LH5tpXrAGZ5;4VrRdKx1BsuIZkXcZ zyKgom;(j&Rs8|m%lc7gy>?zi8hI@zP0OXdOB=8;`iImnRO zSf>9@m?>9ob-V+rhjeV^eh->YDnh(QZI6;Yuih7u1+vJ1QT?rpRZHeyPv=U(P2rg~ zNL6%b_iO}ABX5d01(gOmPaT<3Nu)JfPL*|8T4?$KcOiZ(>H->~(=%4DJ`32mEQOiZ zJ)S~od_IC*Ud!A)inL(49YoB&dsOYGz8_PxNs?INU?vQo_S<@`U(-U1^-z0`JiKN4 zgkO2=FJKDi#hj3{&pU>wzF#JpcoWFMEuX&La|!N@L*~Y(4?acSZdZ0r)u5_pOfA+O zID7F9$zFNZJ?L`bc?r*xJQh|~^xOG<55PqBoz{_69hLmc#L~O|0|-4<3)o&s%0bEggr;h?K5cZi6$3NG#XeC@X|!(}sYej>m(8$Ti|c2d{H2do*n}rP9#bob;XJAH5#wpq)ux~m-!-iUmHSv*A_?-HF{M?}- zcFYda*;4X9B5)|Fi}^b8?eso7*PK@j@F&Q{lO`aC?g=|Vw0#rZP%X4*T5*XEyi(H-9YzW7Ca#FyXt!)Y%7Sa;10SZ7d(J|#rs>=duUruF8?XIGQv zdbWeSvRZE1YFx4)ZL|02eVGD?6f=zJ&?P55z8u=DIl&q_snb|NTqoKzgj&5f-&hG) zk=@-k+pn15Z|W4ufB9)kA`RfDZ(R+95`hs(bnBp_QDCY^?dOpEm=elyMj3t05q{oY zjV?H#Tt+#F^GweXW>UupBbDKScgM5UuD1HzXB9->stjkZJZyB<ohX^w_C~@Zxj(Fp)QBD@%;%>x!o`Kq)=Xk5s+u)Rt@gYO1})7(ml+} zF%FNon_>4dgI)m2S!Sg0gTu+AY(CxmV_3`g^({eCW&c+DbgyGP3LR#d8XKDe5*A{L z*VA1UN?Yx?98tdd5k;pHq$V%1K-1_xaJ*{L=oC(?GiSSn?TcbgHf{OnJF69}Rq5Kt z5VC#nvJME>_vM5_XST!r%zs{=iZp!t+l`s6zu6lRqIc<+dkjag_`kZ8?pJc4K?Z&2zDGOBN)x@+mj9cEJ1k?22XDtEQ|7E??^s|xxnJ3XKA5eYR z7nyE%$DX)}N1Y+;xaA+!TZa{&{ZU#D>k5V}8N5 z#gebWBDPTKmvwiyTkmi>Jap`Jo)5^vfTEP6nrhI}lo2&hSRzkW27DGSbMJoSpsC+2 zAG{P}=5B*kJxYAe@QtL5|1f#w0?MhVHWjcco6dKZk_JnI;6#swUABtX$94&o>4?*m zZLQv&1Ea>8^jFCtnd@CXS{io{)C-@rHwB;-&fT$P_5FH@j|(&ToQtbhhpC;{f-JUv ziSxml?0V&bi!PZ)i}~&Qgsu3%3h%5QR_B;!R)O6f)$^d=P&|y1hpQP1Q-$Sa6s?p< zx;xIDuHTHCHT?t$Tj7p>wR~!ksl&M(P!Y&8SQkC(*i+Ov+~fOpsC+s@(p)szI2-#t zC&=ymTpa7OSKarq@2P}BGJC?a7hcP_&}W4JEuOH0i8TMY*;*L#8LRL4XmimMqgQbL z>Pm|~t?3qX1wJBemK)1>5^GV72bwCu=kjPu|MlEtf^(k13fz2L4b#3xEfdT32&P;K z{3?R|P=k%Ks1`b{e}~taB9vDD zZOYusg@nP{pl&QvO4j<)T>cG~K?v&L#BeD0_;=H<`H)!wP#WU}6WC%4I{9}br(#om z^qnH+(lk)AsMdYbv{w5&&LY~6w~|1vAu#FtLi!%wqaV7$gV+7JmMHEP)8&3Y zj1W06W`+Lsg7kQ`5X7M|liq)rfB0b6122!%!8wTH1b?l{Mc2pn^`}J!kJ^f{`p%!8 zKY5+^528V}LI7xY96WtRn0F0G3%R(%l;Od<)!83c9lTmWN)qTWGg^MP(CU=BFe^l1 znl&{hiLeh^%v@95bEye;%lnuFY6njMG0$_uz$GUdKgxlVsoV*pAy9EXcdr%@VuHpt zaXg($_27ZL_#zDtuC~y8#AqIdri`l*(I7$^Cl;&0X*kUbgWoih3rwhagfMMtd^vMQhZ&Nd*bFu``Z}1`@6K@4BU zbEC*uuZ-v5WskgqJV+$QJW(6C;>$gD#&i<12VJ+7qo1**1R(PgS7Wh>q@})#xXEf0JxCT-0iQEh~VqyZ!KM^kkZe8%FDb&E67SlxRMf z>_k}n+GL^itre7U^xX>~L8pk#q)%9$MA&B@@;6U+Iqco_+lO>wA&kl2I*s#!CRXGk}h0re9w)*b$%nd4t-y4=g>|bP7*dCC;c8Jgu_?Qh#K) zPFg9xCnrT6C=2gs%2Gkj!=i&SpY+|j0lfmL`T%QmSVHYh-)g@q4Y#v+^wIG`@p1l5 zzLqaJI7PpLhg7U9<=M`5hKfYXb^(PiYy5t_RzW-YIlwRk>&P zcq#+(P=MTbtQvJzWe9vrnE(8MJ!;~cUZll57yXx^fa?F+kJ_JfB8x@?QUe@Oi>U3;F;`bm?xJUV5+SVXm=L&}#8sX*Y2cwSGfddkHST=;2f-kM((f1alcuKCj z2i|ZnJv%uJ7*^q~Z@T$^3_ki@kNO9)a9bj0E9>e&qvz$nycfNXBz{HHu!Ru`t2Y3C z)9^nkpCQg2m=SRBVe!Jj;;PSpqiruq2m4(34_RgKDcwJ#LN88gF@AQ>aZwVSrjk99 zNCnG@hQJ9XFq-gW!OJgU%X#Mz5Hmxvy6s`($3I@{sE_{JmH5ZdF>NFMEoQK_ylcz( zddpMom!7?NsG7r{*qucVRNjF00lcZzpp9fNq& z^@hp;ec+7pVb%xH6}zv|w~32L0h_hjh)07OwTjDJK8X^$+goMZ<_>_u)zRGxRmUgp z9w0EX&@YftA+Vfs786iGqCn`?ON{}t28~hNXhQoRM&&v%g8$e$8u021j=TGKVF$#^ zK|Rvg1P~jfO>;))aIi5I-IFk68rMIS+hUIG|D8+~#WE~ydM_X@&G;=aiqjJYI42^+ zPITqfz{|lYt?4E=mGJ?+jI8d0GHu{>@aU{^OJdb_&ffxdO`xwA2bfJ1Ymd$DGXx+% zdER1s$ZJnepWh+)qeQ+9(UrL9Z};k5P$)`h^8Yvcrt>Bg7-7*=64`Rce2rGq@}uQVBu)La zzWAP6!(<4X!C@#F99p^ILT8F&{VhaLy>i2vi30#V;Ae);AqTZ~IV9t(!p3e`-wb(@ ziXD$u3A4nVJru!UVLOsK?1e$=@*ZT%mcsqV$pUg`Q9(ea?u?X;cE*bKc2Ydi{F}KkIPU;#7v% zLhinQUsJo#C~NY40sPBF&)EjXw(pG`ce+O7&oQI(=`VtVVf@ka{iTt9IOJ}fLcbnO z;qqD6?)g@YK0W!XqXvNrao<o27{mli{M*mTqKeAaIc&bO61+9n&zQ!QR&!kxX8iCp74~=Jsml(&tCL z(v>}HmLJbYw`ZG|OY+_JP*9>Mqp|Twqj^JziGRouZbMz)fb5lJq#0u#ZNr1ld9=NaprAwHA7NhTi6VDifdeG~g?Hl``!U=P|2yURFN0gy}p7sI@u7N~)$jNb4S zuuVc#HizTisnLmDfM0)jr*I%CI5?=K6|4H@2|+7wy-8{~JAZTt_jnz^f%LU0z8bk8 zu$zUZk&QMe`OkZC=Tn3UYDeHJovP_m^8j09^pFWbc73Rm`ez3Iac!oxYCUm@I-D%A z6qvaO#@>V6Z@$mFLupz@S2TjAh*5kV`p1jNV0kHLl29rGKUdPY8l>*Tq(j;iESRiM znO2BZl{An$?>9+*mH7mLdh};4h~ugGiiu!fb5*uwz}RC1yviVv|EE znSnW?B8CTC5Wr(p%@c|rbh?iR^~u%05I3#9SQbIAR|_%AufH6H7bSt1Obl)UHk z33l)QXX;8g=&#apB`u0=)f$p0qBCk0zJ{f+}l^<5gv)C4U~ zr5(mYd%*z~jA9<|PQbBPYo|K+XF#+l`U*WShz9RS0^XN&CJp?9N-k$AD9GsU;~dR_ zIgu8j@V-(dIB>+7v?T|B~Kh;Y9=O_RT?0SwNxA@a#LAP>u+#dd@I7#|%|FZ&@m zlV94}TJQzXg9JgGpHxm?!G74&V!qCYP{sP0pUy~Q>4F49)L`9UL_!*9%x2tF%A}rT ze2Niloccm2Pz?VHUZzjCb0M}tI?6%87NkyeLffs&zn!IJH?V>QRM8 zKoEBQJPZpzcVDN??aeQRJcD$R6w`GHDGj_kuY%~eONE_^*~e$at?aUW0x^1&Cv{S6 z+Nv2_gj&2whP{oEMd|yj@bpS!$xpO`9A~WiJ`f^flIcRG;s0hRZ%C+Lw@Ydd+_C)m zhmPmg?!{w#1b|Disy%ru4Xy^SvneA5IXlRotBoLm)yjX{3Cm$gP)Qsz=8o3v@vrw% zDoelz?O{E)Bkj~HsV7Un<5HVS4X5osS=Pw6Vy1J~U!;Ztk7AR>M^G~2J&hpTN#(_# zUI=3`{i@8lp@6VYkSI?Qbs|sA{snb>Cn2Na+J}8~)t%&lw3J&J>~kObIcxRl=i)SJ z7f4w9_B9MVB07ZJ{X(hh`+7gjs;w|lwIf~KF5(&t;@CTZMft(BVavX&3u=uH`Aoht z*-7TX3W6FMNhUp@m$B&`NRa6Sd_+gSYs4i)251u_mQ1^s<)_!sPw8bGU3$*t~NmdR=l?Soiz@fSPobjslbJg<5_8 z=OBHOqli!qRR&l7*SUQv5q)+XDm7j4#XlHGpD_US2MIS6W{)->pW>j%90$Jlm0(&eI2YXz7 z^&RW!+3CF{LI}j3+(-;4Ni^u9VE>Q}N`d`J10cUz9Hw|rC4P3bkk{?huJ7|<+5}iZ+rWfwB&j%26B%NAf}zk4<0|E zlI=diJi+ocOMYN-tLd=+nVv9&)t&bXzE$dj=E1bX_`z2jD;KV zkG3qI?9V=WErp#{x#v3hAQTI(ceuN~h}l9yMETP}ln=d9MDIwNiN!HOHw{i=-O=A} zcMi1&O_(hS);#a@V4Lwvu!EUwo98sJZZ2>{=}MW zuOs4V&epJQrR|MK<9TdYB2Cs{fNg;KLyA1YUiy2Lw;7#i%d1MD?I3!3dX$h)JHCA{ zmVNWhvXJ#F*fAn0iD$IY^t)33HnG{=!qKB=TEPJfolbV<0ZiW>OoLQRoA~alCB}Hr z&(?a)EN8a{*JwY+AdL5ovd;P@IN6_9mypbRd7oUDs}WTxudU`*JKRU}uH2l(m_Tu>Ez>n4u9zMHZWgq=p3OO#{5LwH@m+lwnvUUBwF7fNQFtL{=9qKl~f8Q{Z z{Kj9ltbXA%wm~zM7W9=6Dk!PHdF@uwtVs@ww~qU#cCkD!4Mg}5CX$+XQv7VUC`8k~ zpJe9umv^}`6%TSg$9mU#C@8k>qkndKU4Mg1Tp~*Jl1TK-_s^Tz=^MJw$3Ih+HT5V0 zBVG;}7cDiJ>ir!#EwcfC{0`veVNv7-$j;C?LxHaqL<*1&P6W_B&o@Dn9-(lMy1r>qTxCnwOz2{y5KXTJD289y)cf7iT!blu0?t4X2uNJI z2qe488t0sh^~zAu&p?4Kho~iOi!3CxB%{xS31}-+^>iUYq`L6YuRcq8l2rVBu+d^* z{f}Fyd%Na7FW()F>bqXfXmS5(HE~Zrhzaj3>D-bBG@Kr?M_Z)fUA9*}dU8wcM=0vz#lIfP2r7Tw29&F}ZAgw|NWuSv#^01|Rkl*56*A;jIQvjQ-K z6SHns8Ntb2!>8`1a%5R%T71>zys!4;c-I{DB9z;#wH63(ZW{j^*q%Qpc;CcoYgy+4 z6iu^P+zqKC5&)%h*MAO|uWyk?G2+>@MOSxl*IDINW zdZ!6xUUbF`e(|Y{dYRbjO|F0qBIawez_V{}2eLXX4E&b(e8U^XL*TSXZ&A1+`$+{b z6G|C~1|L|j&x&zznY#gAp}*eVBcPQdssF0Ht0IGow*sB=! z+n+0J|HiP%Clk3PJ%^uaqg5soI|tF~Hh*S01zpW@nm|V`#fa6*06_oNX2pdXE4X4f zWFfY%HIs<|7-&CQKN3QE78nWHmjVIZt@n^iS}R1G?=mzMUtQlDiBtRaWu`-?WRKNI zaQGM;UouRg+dcxW!;!X7i4I}37Ef|f-nj{4R?3{rJ^dgoV zMRtBaQRHwtc(U*!6U1h;9uR;fGZod;A^rUiU5@_PUT}9Z5qF3jD50-veciUs*Dlo0 z3Kq8TpX~MaETG7ujJ?zNy5fVm)Re&0A&utFDt%Nas@&8&eMjkNc=xRnVTN1(b8vMZ_>#IVrkQUP8>WO&D7uJh3@ieDI82IhiOap{k!rt)2lnsH@h7y9oF^ z14I-2S!CsP!Uij7fI7;Em~WbZZzuKa9}>K7q6@&-gFK+S0K``Kb#oGPG`;j6>1+S- zpfcSHF*e2YquGD?Z>vw;SM2v^CIWY`9{h`Unb|p5W~9!g!9scM#s3mvTd^b;`?s#m z%>J0{w45X^jbHgmV5uWp2Ow-?J(>#Q<^U)77di8Vh`4HP#>om3#D@SKvArRr%3mFnV=Y;#4 zC|lN>M-;zeETaAHf2utr4prEZ%?WTVlsR7d&~~_1vm+%BDXwY9)|Bk@51Qr3F(4w2 zn89m==A}68g!-59y}~TjS#Tza#1fJe-jD}@BLXboS3$cIxVr7+%_e!9H?{sS)4;Fd z3h-C(;Gb~gA-_K@L+Mn^WL4Zl&Xc;q>*9ZBzHMI@p&!csJ83va<=-T@9mT)&xvBC$ zmLc1_z*uqC*}FvF%v`{1O|^xS>jb%GSjyQ}>j)jr}$qI_^BKUl){pf(8Jmr_%)D*yMW+3snHYUI@1&b2{Sq#2>YF5aIC(sfq@+E}-vrt_z>}X~`!>p+(A| zp;G}!VY-~9Z-W|X!4aB(RZQq^VlE!-Uw`DT|Zf{_2KK!9W?t~ArtoNXspHj-0j`5J}$eZljx@SIf{#KAMrajp|CjR{h|a4 z=#(V}yS{UJv*WIBhM%>U7kQr}roL8vG5)ld6+C{T0WE-7h*i7mn6{=v#)Ygd*L^f= zdvIUWROH6G1ZiBkl+I`xr9y6MelD0jBTl!*uh;lgvelVbqtT zA04vU!D25}Ssj@@RpyKi&O_;^tbb|g4@~`Tv^)M$*?Q?~%*g@PsTmmA{}8mb5U+_giij2eBR?_lR>X^#;P z5l~qd9viKG{L?(I0W{(7zYynZ_gj<)w*A&+vJpJ1Jm_C8SGuM?f$yHe%RUvSE2>+z zQzAnve~Yn+E#nu?L2NYJIQNs(Sb6_D4z&TlT;(qt16gTp%;rBv`s6KazVC#HUAS4J zTWC8jk4kjjOw=vrf!-+gaA>E3_)K;)vL4iL<*jT{vzjl+IMpT?P)J#|+o zMjI>*x{Y{C*5yF<(Rj0C`!}MB44*Ud-NGi^o}9Er7(|Z2HR_nl%gb(_Db4tG(=_WY zf6#=VoP1=ktWf7N=*6Hs#_BmJ^#_gm^72>jZoI>{2wVz_9QCD!uKF$$PoQ$rWKxZy z-`T3s^Yh0_YLj){5L)G)Fu^(RKqb81IN>BQB#n8T!3|j;nih zyb)(wnP@~u;X{RLMD8X;o7i6%L?BYj?R!xE3!YX>iP1C+(!u}Tb zIO~;Ha&2M8+x;SL9zyB*6wcoDtK~u>MLnY`cI+Adg0WTGhA zkOh1*>*Fb!U>i)j9IzC3D@{*)_laj=fJOK0Hx~7;UFsG2f{_kS)lxv2mP?~|n*qOk z7Q+WYf;TS#E3`XNy$=WL%cq7a9e4>4pXiIgpNxf=Qyt3vx&TGP_X6RVA>(K8MFWfc6pDSjwVi%;}q@WVuqAMtbaT zmzjOy6wuVFzjIYU4W<;27rYlZ*Qz^wVhiM9^0S6lGw)R|#by3-`4&lhqw`nkz?iUM z^6bL?L^d}+^EHuSw^=bJRgXKixq~$6L92vZL$oIpubI?5w8?MsDTydb+vMv9)(_C& zq_g<-oqy7))($M_7jmK_52bS0b_r>jVyKfEJWwUUeWH1;Gk&8vtwP`j4@jqaW4~=e zb19i39MY*dnF>6SQP@!Y55U}=TJ#ZtsqfZ2h>dRIe?m%aOR!pf(y+eMx zkZE#rFiVhep_3PT{e8nvrQPoA-=bWKV!PO+?W8*&cfLvlbowvEGClm9blshw8Ehjd zEOQPmw4WBw(_!_#V-7cO*d*pMSbBZ7zS${KIyuY+)+4kCEF=3pbU9!e5)w zPqIN}(O7m0fm69O2bxY*6&+UOHqm7h)2AgF@Px9;*V|N5uRn2yes(SR~rGh3EH8!zuJl8nDcMr07J;$pFHzh(we4!KbhyqfPF{DhUbMs=1DK)k*pnbR8JGS3OI^Q z-T4OX+8HozXf}(6Zt|PG_%0v#wQVNmpd537%dyNP?tnY+^*g6bTSuG zCl?obrn~a<314Y@`j**cSNqRn)1Y77$3w%ifw20#U6InX(LA-OIp-bv0?|?VwvlrC zUx&lT3Aux-Ob<6BfI*mQX#FNLnJoK z5E5n0bzn)dvA{pmd&@Sd)aQ=Z18@vw-_Fos(SUJt5&GNuY%xT(`And`j2eqz6eYu* zT{p?Q-XnJ`Miq3_G7kOD!%CIMYU783vW%7l`|GW-Yz zQJ@-9YuV#hlTfGk>jvk>p^P)XL(j4N;KM|kwikYGAYU-kT*_Od!Eaw5T{Ro?LSnlQ z3poWlHg4rN{Ia;#kIo0)h8S(3cYOV$#pHz8`sEvJw-WbYQ4DJqmkP-yG&&m`h~neqpDa>!}ZCsF5l;%^(oqVq`P}xsiu^z5iPBbQ^zyz zdFN(<!8xsJFtTT~G&e?#dgOTQ5d9Nk9+0sB8#VHf6oAT)RKcVP_%g zPcErk3IJ7NxG) zL1)OAn3?!0cX5|R@%Kn}6&c)N`o^a5nle5)N{w)TSvD_eK$iv7n+jf=`e3qpmujE| z}TG1Y?@t$kawTVX*4d-RAo^*J0$4p87@-IGLXwEk; z2S9z-v{92~lUAnt{GuII)9*EwDXvQ58nQWq%jYhi=hZQwAV12R{YNeIk)PH}m_KV@ zb5r*Z|A-wJrYREF*7Oiz2`ES3K_{39;QLH)zjpECoNaf=({uA+dkmzB;Wbh8qE$1Q zFp03}QK3hhZ-M;f!?vol5OuFvXUl08Nv?4rb$<*fDe3yM|G|y^H!qY{^+HB_&gH{! z{(m9AY^!02cAv2D)Fc|o>*6t))eE2FG(vCm_-jJBPR@Kzm{MtVVoV#_p2-^|pg-p{|lq-)oc3l65}VumioM4_Yy0KE!+` zZ&p9YZl(!%-hiDM!=2NS$jo4Jd6`#9qv4KA)%^Hk9g6UujTUzfu8VfN?s)NnyG`(> zb*j+>&zVZ#CZ@Nrj&s0)f-qXlKqK1*eFV(PTVLQ-7GDzZf>CX8D=6{#hcg}Otx8RE z4+rQ~;Ji!3y$@d6SB5NUo!^0afM?I`u8C997chf&nr^o!oCuqMI`^5+Z*ULZyuJ-C zAUbUFtXKA5m=uTaAZRkX@_g4Tc;ac?K1y6x!S`CVhK0toiM*gG==`6Mig~3qCI&K4 zwBys=^7HwKquA3uSv>5ET>^uLp;dB^3Rziu7mi~?@c*nm(~c#K;Q{SM0nuWroEO!n z^uj5>y+$be*%U9ge)XHjk}0RG%GFY_klyulS2Z|*0*+4G;~?XNJGy6`I1zC8$>-n> zd-w#J;Dw;DkgXA8r$K6_6xx;`oL@R@Y0SRn=@#Rlr1`hYg$B90`8e2cpDwueLkOHGeVT05_1hRST5U zUvDk`B5tC7tR=P;$K)z}F3A(JsBl6`UL-D&OEaCsrf5}_b`+hdpt<-$95l_jUG1$@ zj&l!~5ZB^oTh=P)SdBeYNhOrq%{QF$arXijrtP7)lQa;~uyyn66Zvf3@q5i_s4+|Z z(0#_wjUV&X9RjL8v)aZW z%x476+xH6rE0?ZKFt&BEeD|zgkrERt&(6CoV2OC6NGs_;;asW={&~N`$}QbMxi5~q;)zFCUA8Oimx$O=AGO+#*u30b zHT{Z~uFu268Lu5?zxJNksh&mK`a`erE1gA+%RUD6sVcupqTKvlr{89pdW0QL{Z9QL znkab1K+)}s$|rc}cq(PEn_aiWChJkoP(3^NK(-#Ml_HNW{B0kekfzu#V$GBp4Jq!Z zgAjSW+P#)1e+tK+SmnvJKHGZgzwpG?;F9!tp2}(bu3P;mu#L0Cs5fLg zOe-nX{1^Ulf5?dy5IJ4HsXDNiYhjdsK^pLLe(>JPs*4Zt$syYXZ|WV!c~CQ|85l?* zv;Yv1E7Auyv?kYwUsv!Q{t~zRJU=#=V5q-Qa+#1>6&v{U$~TO7UxI!pJ+?-a5ThP2 z6RBqXte9S(($=@j;a-vi?>11g_IGbu+@Fjj@beJsRYlCzgZ2Lw!65kmI3KPC%UnH; z!Zq~W2Cn=D^{2NqDCAXHr~Y&?Y>97LJ>x!?4XjJxcmW##`RPl~&yLk}spDOC$-n}h z3;d}ua9dn(irwnFdXH}@pthdi^bxUu?K1fmFPx|}iJ25@rLhglvmQ5ACfV-vgMT4p z;4$O8ZB#ILjT2gMp59zFZzf0>4Pjqu*|8@zM%@_-G)_RyVg}_tH(o*P9&}|IU~#v~ZO7B4l?WX}C^cs8Km{&Z#h4 z#`b9CI5G&DE&BGzmA@t!H#B1-upmAuZNcQw)^T*vfXX=@EhrD_z8~V>NIUO4mM?Ms z(KJ}8bpbUOH1y@-LHV`;Rr%9XF*G#;C?XVg;~Kp)mUr7-*SCgASs7dBSR3=qet6-VZt}jku9y8+aa3F zU@pdm=kVEBh%KAlO!=iX=i5ROM`okYW9U%R)8Vt0t+i0Gw*YfFn$5sxjeQnyQi3hd z;4b^i$neAYbc(CGw_r2&0IJ=JdRFk@#CLftKKGw)ET@*6llFgbyB|IOC5 zsh7B-&=3fipIFw@PX-s1k7rd3^~!Rl?Y?Ppa`YPGGF zMW3Ps-JyYfG8fvQ`=iyrPMD_T!8C7vE6}sa!8%qjlcfpdfe-GlFZQjhFvm}>*juOc z(H_RBz)SYipXd|CDz>+lbh+k{fplu4GBp|agUniPpT)<)b+poDVcQS zU#vSUp*)0c=%BeEXJGq_(7ki3lv=bTGYl~`7S%ue1Fn6;w=zKhdGZ=4Z|su@<`=m32uHpoAptdL@Tp$NaO-G9UF^ z>V(U58PGc?h2sKWK-3%qJd&4@vBnon=h_GICtvp+YOgsHBy5=+5kFrrBQo2B4UGb;iFrEe8B~GOpkoLR$REs%o|SX z7S*!2hNffNxcycadYSEI=2Sl4rlAm0sVeErV#s+#S^{akq?C5-!x>n6KVZQ(f5*zB ze$Id}(z;fmvECrZD^NT#1}ovuG=*Lw$zVsUhM9MSo6;eu|8r<~PXX^y*}L1{SFmxy zZ?KgmRS=>5YwT|n9D)sFnG5EXucgz)$Bf62rDnoTWWKl$6HzuPKzmb{tNC4fPa>VD z^x^8XK{!v-FXnQPjvmC_0-7QhEUQ+M`Ny?-i_fBFiOv>qX4$XSn|D|peH4fmM4U6C|+i!J$C z3+M?IuO@c06S|EXLVsaX`zHkc3)1ps1>YwZh<9(~16Nhj6s3U5Z)1MHK4aB}V&Com zzvBNQsEcU1xB>a*x4U+F74Ye|+1Xf??unIq4lh-ka7NV0pr6JXDp=T{##f4wiH86S z0hV*B5GZ_bYLN;O7LZ=;mT8WotiF8Nw{RXzkx-%)zDJiyY8D5KxcDjdoR84&t^AZ3>m&_GXuu3?AiZ!@%LqHI<(4^VrnZq*!rcMXN6a$^d-%qF9Z^)x#pg&6jSi0& zRSS<16$hHk75@B|Xhh7QbLCc5C}NhSL(MDUt8RI-`fhj$_x%i5K=^@*_>?-%Im$4p zPB3NuQcB&27elt*@ie{b@4sCI^kwr?mF>!^m}XZ(hUv>d)jMe)T(XB(=~qT~QekAm zT8uBVKfpwX7@84N)GDS9>I=QG6OzFk;3L6po@VIO1W(f^*^a*3vo$@6sj#iYsMfP@ zQK*2fTDGi;Lun*-LvUewlSATTS}!84ljRah1i*{(4c z?sZ#X`-I@+uGmlkyufFbZpB89NyZKKO3qpSt6;R>^5XQoU|KZ2orEs(w%AZVOnk@% z4o)TusTB_}YfUuzdFYcC4tqGXnMPW_TpraL_`xa!lZSWS{c%nX-$YzHy!A%|%&IU* z23oC6Dzb0h<9sg`qgO{rzcMq03E;Gjmg>8JTNPHG?8*kgtt!x-u#5gE$%0VVa+x{i zPxV%XgZ(GZFLo2{=~loixX6ow0O>+4X=oPxN}oVyG-{hvB=-^+HPsf?8roo$D3g2H z%-c|F=ht(;r8D0$;lScOcfllZZ)@x6kbSv!6MMEcIz09|`iti#vZL(M`UNOa1mmv5X+$9 z)o8Jw4jkKPlQ^O8>i3?qwi=vH=F)eHoce6hY6u6E}AlhhOH0){L zD&+tW*7a!xEZubSWs-sbH4@#xiw*0va(l;0r-)IIWD0Im{i{+F{>Z(o&4E2`H>J1K z91uEO>{kd`!g^+Et=ShJ#X1E@0XA0Ck&hVG>A`a|qa$k9^a7L= z<$(>8VtyHwBFg6pcg0gClNSd_IX&!ji#VuL2re*4Q)W@()e>SUcsxF;_@eG+Qf<1Gd|fcv~90b zXwR%NoZA4IxK~aPrms$F8l?oVc#5_p6D?Fl&!5xX45OxPYPZKwV0o4z`LR}ibl$&S zmjxHwI-LFJWQC4_^K?#CH%kKWq?oEaUd*R&X->JEUEp3h0a~wR@j?UWWPa>OGPxfy zrGBw%rc+~(0!n^2$?U)kwrnceA`Y0gqY?wzc@t3rWL|3AfL8!^^7UXlG%qt_MuB&k zkHx_B!qgwr!7K}`3%DU|E}>;O^Dw!PqQjhd&9gTU1?gREpcOxJl3r9IF~*>5z*u^$ zT+Kn`ieIaZF=4=7uTuI|vdupnxq*e;KM-*jrTMUuQrZBqKyvJ+(3?whoALmk<0YDx zqUJobujUkOVt|+f=C+nUXymB;<`j8Y${DJc9X?m~lCMNWa zddXu&S`E!yM3!ze6U{5f;hPug2#T$;AEYJP@YtyESsfG<$N-A1kJ$R zOXmh|Ftdp@K%4EI?w`x1EqPgmnsZwg$T*Ynw*c*gwko!tD^>#x&;&3A zIlWh^KZY3)BRP;1IRgjj^4gTP0Ld+-uQVX7?0-~RiWz|o&Z$=Cj1@%IGCC4q(73~| zXMAwVwqF=CKk-MtM@K1LH3Tdf4MtvjlZhnn|%?M|*S$ z5CA+qRXcgkC}1_03c}-vMNl;mcN+p^Ry<_fTNA_zZd|TTh(0V%H2g|DHjpK3JQPQ` z<1(!T^X9kw%q)w^NClCHr<@}LZ40Bdh|^u30y^u7I$8UT!QxT#Z>g~M+bvPH+zq&i zACS4!h9W!#TqK~gTBCe{x!5k!A@B1BXpV9cNs;J3N^2!P!7a;hnS@pGN=5jdBnS#K z{aa`y05q655ZPTUdP;_s^T97brT9+l^BQm1|8;nve#E1&$|V(KPOIS4L7L=J{R+2wrVGNSyilN zlY*lhg_{%h@buQQ&LyP$t}XO=r(p*k9#Nr&vVtL&_4jfn^PCvv!6_io(9{AF%_D%3 zq8^1%hovUppyJ3?&1%TbMEGj|K^yuhUD7T%19Hvi+4%%il(X>0vders$vOA6 zO`U|aJ*Urk{Q#kki*!?>zcF)SI@b(b7%mpL)rGWlLY@{ zv?0M@nx=~rAqr>AroM1bqP!Ba+4^!dOD@8VFtB|0U8?iki)sBFCxDjt#<%hb0stEB zVSpEEO#E}pEk!?cONQSA*qiiumS7q_&DFnQ&W)>nOuxUu3@@0NZXKz-&Nz`j%3;8i zaiJQ>6qN9lOhq+UUS<7$1}Ks_7|U-{CV3C|HbAI*HS4AH$*Ze-m2ejT)RG}{Fzq3m z!9vD7YX=!FUi3z}NLhfTgZiRT`iMT3PR~^uO=j2M-09}(5VRn=9>*JL2$vtMbIZ!tbhwa1XcB5gVxGEX z?ju;!h9(F;p$RfdpQwiwJUqS_>#)Z-7E;^#rbO5`rJR;?ca*!afy)_ogcwHsWcKvZ z=Xr7L;AUt4p?KNWL4IrTm90$DmD*aa;R;&;hKLuKS86ZV0oq4dSwEkhc7vJ+t5_D& z+!NKWo89xt$Wc^BpUUKvd^ZsOz$d%o{<@9??-+P0LB>k{!E z5!s_^G7|dy0;`vqoT@uykr$Opk;6Lr#4VQ)l1^GG&;2m@?pr1yCvdxsk?bWI9OqP= zAkr!5*LjlEqzev0sO;z&IA22O@AZ1QoRn7z{fJvu-+b#D!?uS;i zBgBBEO5~TS>tr@?w=GJRRB&gd+)xSd0Ak5E+l~0K)VRQsN{p@^vnjY+n8gW7T*fSf zw{2F*H}d2rO^j8qgiz>}wQ4Mce8A+!wSYoYkWyqyhwlBDSK2#gZKmmKc>qy4ad~iD z$3`ibmxxSkeHC1lKtE=VFwUHNAtrN_pF^HWN8!jL%z=Myr;RDU5I~5fgt0=C88_m3 z%PZ^GjJe}%qtKyM>d$f-aO7nX@eeq_Vsl8c7(EIL%nOr-*ZQqrBzPtu3Udvk+>i$C zAvJK;3JP(TUS5?y7`p%PdsppsU;ixA!)0&AtCJ~o9gKZvV)=zbBhbq^BP0=`p$~eL zdaXzkzLjvULRAD#cU|$~0sl6c&VZGWd4Qdj5vy-~n%TfjF09H2f&7r=HWe)EVrpfo zAkgCuP_&^3ug@eE16TMyS$_(6mMkoQubu(v+MG!|FKFEyXUYlEy)`jW0=dR~&k8mE zM#04QJr~#)H4dsD7kicpsw2^;z3zR!?I5EM{UFoGge`GdJSiW@+7_YDlNlWjrP9kK z3tj<+h1+(Gfzf}n`xN^ne|E6bRG=d85^<3hV4?FIl4*4`pckksqYtpgsf|fPpt> z^=B-`zohgZ%KATX*8`6bQ>|XBw~lrfKr2uFI5^e`@VUTQ0v2~Bulku(^zHEfC$3(= zwp-VKL%Vg@FiR&R>8_{RZJf;Xt40C9bc*T-8eW=D=-up{Sr9xv8y5A;zx>d;ni5oU z{?rDUn0II&Vr9gyn-Cmqoay+}bp_JsCx|8VMuz}7d*zkN&zmR(G_ zATD08BacNy`Q_Hu5)KQ_us=jb4Ug0cVTyKPlrV74)8mGz%kRs44OTOd#~ZFChbKmdBR9cnCb{?5D*#P^-{DjjFia+Dy%osepx>_`K_TbGNLV!19RS=&E5d|G@ZLlD2du=G{F7QWo~M#zubgK2PTZ$wCh zhyNifgeO(C$bX($fE}d%{gl~EKk$O?OQdS%D`v1~8ULY-Nyfbw($atJ{|zKg(JEr4|F<4c4w#rE_|rn+c{djyOF;D%GNT4(BdT5O3v=rd8``CiZ` zbYz&4Bd38?fUq(=Hv@IP6={Bd5sp#6$AF)~&+Aep_eAuMh{A8PGKGJfJa3Ooe04Ac zTx*<;ZW-7uM=O_*!?*6S^W3DDvyNO2$SJAeWQ|PW~W}?q}~s5Z%HS^%OTP)W){(xqM-WZ z>~|rOb^IojUZuON?cEZRh)QnjqRmvL5UcpQ`&93X9^9Fc&lxI7i|JmOzQ{1eq~FJO zZ;GB$PxPD|P9 Always - - PreserveNewest - PreserveNewest PreserveNewest + + PreserveNewest + diff --git a/test/Services/LoadTest/WebMVC/CreateNewOrder.webtest b/test/Services/LoadTest/WebMVC/CreateNewOrder.webtest index e43f84d56..7a59ee50b 100644 --- a/test/Services/LoadTest/WebMVC/CreateNewOrder.webtest +++ b/test/Services/LoadTest/WebMVC/CreateNewOrder.webtest @@ -164,7 +164,7 @@ - + diff --git a/test/Services/LoadTest/readme.md b/test/Services/LoadTest/readme.md new file mode 100644 index 000000000..3d1fbdfc0 --- /dev/null +++ b/test/Services/LoadTest/readme.md @@ -0,0 +1,84 @@ +# Load Testing settings + +This folder contains files needed to run load tests locally or on a Kubernetes / Service Fabric cluster. + +

+ +

+ +## Set a local environment + +Modify the **app.config** file and set the following service urls. + +``` + + + + + + + + + +``` + +Modify the **.env** file and set the following config property as shown bellow. + +``` +USE_LOADTEST=True +``` +## Set a Service Fabric environment + +Modify the **app.config** file and set the following service urls. + +``` + + + + + + + + + +``` + +Modify the **ServiceManifest.xml** files of the eShop SF Services and set the **UseLoadTest** environment variable to True. This setting enables the load tests to bypass authorization in api services. + +

+ +

+ +Deploy the SF services. **PLEASE** Read our [SF deployment guide for Linux](./../../../deploy/az/servicefabric/LinuxContainers/readme.md) And [SF deployment guide for Windows](./../../../deploy/az/servicefabric/WindowsContainers/readme.md) to know about how to deploy eshop on SF. + +## Set a Kubernetes environment + +Modify the **app.config** file and set the following service urls. + +``` + + + + + + + + + +``` + +Modify the **conf_local.yml** file in the K8s directory and set the **EnableLoadTest** environment variable to True. This setting enables the load tests to bypass authorization in api services. + +

+ +

+ +Deploy the kubernetes services. **PLEASE** Read our [k8s deployment guide](./../../../k8s/README.k8s.md) to know about how to deploy eshop on Kubernetes. + +## Run Load Tests + +Open the load test you want to perform ***.loadtest** files and click the Run Load test button. + +

+ +

\ No newline at end of file From 9183a457560e66892533965e737570a3172968a7 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Ram=C3=B3n=20Tom=C3=A1s?= Date: Wed, 8 Nov 2017 16:50:09 +0100 Subject: [PATCH 21/30] Update Load test readme --- test/Services/LoadTest/readme.md | 20 ++++++++++---------- 1 file changed, 10 insertions(+), 10 deletions(-) diff --git a/test/Services/LoadTest/readme.md b/test/Services/LoadTest/readme.md index 3d1fbdfc0..841954873 100644 --- a/test/Services/LoadTest/readme.md +++ b/test/Services/LoadTest/readme.md @@ -8,7 +8,7 @@ This folder contains files needed to run load tests locally or on a Kubernetes / ## Set a local environment -Modify the **app.config** file and set the following service urls. +Modify the **app.config** file in the LoadTest project directory and set the following service urls. ``` @@ -29,7 +29,7 @@ USE_LOADTEST=True ``` ## Set a Service Fabric environment -Modify the **app.config** file and set the following service urls. +Modify the **app.config** file in the LoadTest project directory and set the following service urls. ``` @@ -53,17 +53,17 @@ Deploy the SF services. **PLEASE** Read our [SF deployment guide for Linux](./.. ## Set a Kubernetes environment -Modify the **app.config** file and set the following service urls. +Modify the **app.config** file in the LoadTest project directory and set the following service urls. ``` - - - - - - - + + + + + + + ``` From b1e3bdefbe817934ce96598e66829b51888ba357 Mon Sep 17 00:00:00 2001 From: Cesar De la Torre Date: Wed, 8 Nov 2017 11:36:10 -0800 Subject: [PATCH 22/30] Cleaned-up the registration of DomainEventHandlers and FluentValidation Validators --- .../Infrastructure/AutofacModules/MediatorModule.cs | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/Services/Ordering/Ordering.API/Infrastructure/AutofacModules/MediatorModule.cs b/src/Services/Ordering/Ordering.API/Infrastructure/AutofacModules/MediatorModule.cs index b23f6812a..d54be0a45 100644 --- a/src/Services/Ordering/Ordering.API/Infrastructure/AutofacModules/MediatorModule.cs +++ b/src/Services/Ordering/Ordering.API/Infrastructure/AutofacModules/MediatorModule.cs @@ -23,11 +23,11 @@ namespace Microsoft.eShopOnContainers.Services.Ordering.API.Infrastructure.Autof builder.RegisterAssemblyTypes(typeof(CreateOrderCommand).GetTypeInfo().Assembly) .AsClosedTypesOf(typeof(IAsyncRequestHandler<,>)); - // Register all the event classes (they implement IAsyncNotificationHandler) in assembly holding the Commands + // Register the DomainEventHandler classes (they implement IAsyncNotificationHandler<>) in assembly holding the Domain Events builder.RegisterAssemblyTypes(typeof(ValidateOrAddBuyerAggregateWhenOrderStartedDomainEventHandler).GetTypeInfo().Assembly) .AsClosedTypesOf(typeof(IAsyncNotificationHandler<>)); - + // Register the Command's Validators (Validators based on FluentValidation library) builder .RegisterAssemblyTypes(typeof(CreateOrderCommandValidator).GetTypeInfo().Assembly) .Where(t => t.IsClosedTypeOf(typeof(IValidator<>))) From 1e5bea953c20d7520b7f7bf620bc5273deb2f1ea Mon Sep 17 00:00:00 2001 From: Cesar De la Torre Date: Wed, 8 Nov 2017 11:57:01 -0800 Subject: [PATCH 23/30] Cleaned-up Domain Event Handler --- ...idateOrAddBuyerAggregateWhenOrderStartedDomainEventHandler.cs | 1 - 1 file changed, 1 deletion(-) diff --git a/src/Services/Ordering/Ordering.API/Application/DomainEventHandlers/OrderStartedEvent/ValidateOrAddBuyerAggregateWhenOrderStartedDomainEventHandler.cs b/src/Services/Ordering/Ordering.API/Application/DomainEventHandlers/OrderStartedEvent/ValidateOrAddBuyerAggregateWhenOrderStartedDomainEventHandler.cs index 77714d1b0..7f5ee61a4 100644 --- a/src/Services/Ordering/Ordering.API/Application/DomainEventHandlers/OrderStartedEvent/ValidateOrAddBuyerAggregateWhenOrderStartedDomainEventHandler.cs +++ b/src/Services/Ordering/Ordering.API/Application/DomainEventHandlers/OrderStartedEvent/ValidateOrAddBuyerAggregateWhenOrderStartedDomainEventHandler.cs @@ -25,7 +25,6 @@ namespace Ordering.API.Application.DomainEventHandlers.OrderStartedEvent public async Task Handle(OrderStartedDomainEvent orderStartedEvent) { var cardTypeId = (orderStartedEvent.CardTypeId != 0) ? orderStartedEvent.CardTypeId : 1; - var buyer = await _buyerRepository.FindAsync(orderStartedEvent.UserId); bool buyerOriginallyExisted = (buyer == null) ? false : true; From 1545eb80bdb41e78fce3d0d50d94db8d31f1c2bf Mon Sep 17 00:00:00 2001 From: David Britch Date: Thu, 9 Nov 2017 11:21:03 +0000 Subject: [PATCH 24/30] Replaced deprecated OnPlatform API. Fixes #399 --- .../eShopOnContainers.Core/App.xaml | 229 +++++++++--------- .../Controls/AddBasketButton.xaml | 18 +- .../Views/CampaignDetailsView.xaml | 9 +- .../Views/CampaignView.xaml | 9 +- .../Views/CatalogView.xaml | 9 +- .../Views/CheckoutView.xaml | 9 +- .../Views/FiltersView.xaml | 18 +- .../Views/LoginView.xaml | 84 +++---- .../Views/MainView.xaml | 52 ++-- .../Views/OrderDetailView.xaml | 9 +- .../Views/SettingsView.xaml | 90 +++---- .../Views/Templates/BasketItemTemplate.xaml | 11 +- .../Views/Templates/CampaignTemplate.xaml | 20 +- .../Views/Templates/ProductTemplate.xaml | 20 +- 14 files changed, 277 insertions(+), 310 deletions(-) diff --git a/src/Mobile/eShopOnContainers/eShopOnContainers.Core/App.xaml b/src/Mobile/eShopOnContainers/eShopOnContainers.Core/App.xaml index 79b0ff307..481c5c100 100644 --- a/src/Mobile/eShopOnContainers/eShopOnContainers.Core/App.xaml +++ b/src/Mobile/eShopOnContainers/eShopOnContainers.Core/App.xaml @@ -34,148 +34,139 @@ Transparent Transparent - + + + - + + + + - + + + + - + + + + - + + + + - + + + + - + + + - + + + - + + + + + - + + + + + - + + + + + - + + + + - + + + + - + + + + - + + + + - + + + + - + + + + - + + + + - + + + + - + + + + - + + + + - + + + + diff --git a/src/Mobile/eShopOnContainers/eShopOnContainers.Core/Controls/AddBasketButton.xaml b/src/Mobile/eShopOnContainers/eShopOnContainers.Core/Controls/AddBasketButton.xaml index 034af4954..866cdbfb1 100644 --- a/src/Mobile/eShopOnContainers/eShopOnContainers.Core/Controls/AddBasketButton.xaml +++ b/src/Mobile/eShopOnContainers/eShopOnContainers.Core/Controls/AddBasketButton.xaml @@ -44,11 +44,10 @@ - + + + + - + + + + - + + + + diff --git a/src/Mobile/eShopOnContainers/eShopOnContainers.Core/Views/CampaignView.xaml b/src/Mobile/eShopOnContainers/eShopOnContainers.Core/Views/CampaignView.xaml index 7faf088a0..0ec8f0a6b 100644 --- a/src/Mobile/eShopOnContainers/eShopOnContainers.Core/Views/CampaignView.xaml +++ b/src/Mobile/eShopOnContainers/eShopOnContainers.Core/Views/CampaignView.xaml @@ -90,11 +90,10 @@ VerticalOptions="Center" HorizontalOptions="Center"> - + + + + diff --git a/src/Mobile/eShopOnContainers/eShopOnContainers.Core/Views/CatalogView.xaml b/src/Mobile/eShopOnContainers/eShopOnContainers.Core/Views/CatalogView.xaml index d7d68d1f5..6f834d7c0 100644 --- a/src/Mobile/eShopOnContainers/eShopOnContainers.Core/Views/CatalogView.xaml +++ b/src/Mobile/eShopOnContainers/eShopOnContainers.Core/Views/CatalogView.xaml @@ -114,11 +114,10 @@ VerticalOptions="Center" HorizontalOptions="Center"> - + + + + diff --git a/src/Mobile/eShopOnContainers/eShopOnContainers.Core/Views/CheckoutView.xaml b/src/Mobile/eShopOnContainers/eShopOnContainers.Core/Views/CheckoutView.xaml index 12fcaaabe..7b3b47077 100644 --- a/src/Mobile/eShopOnContainers/eShopOnContainers.Core/Views/CheckoutView.xaml +++ b/src/Mobile/eShopOnContainers/eShopOnContainers.Core/Views/CheckoutView.xaml @@ -231,11 +231,10 @@ VerticalOptions="Center" HorizontalOptions="Center"> - + + + + diff --git a/src/Mobile/eShopOnContainers/eShopOnContainers.Core/Views/FiltersView.xaml b/src/Mobile/eShopOnContainers/eShopOnContainers.Core/Views/FiltersView.xaml index 9a9d4f04a..b7ebe0c0a 100644 --- a/src/Mobile/eShopOnContainers/eShopOnContainers.Core/Views/FiltersView.xaml +++ b/src/Mobile/eShopOnContainers/eShopOnContainers.Core/Views/FiltersView.xaml @@ -76,11 +76,10 @@ SelectedItem="{Binding Brand, Mode=TwoWay}" Style="{StaticResource FilterPickerStyle}"> - + + + + @@ -91,11 +90,10 @@ SelectedItem="{Binding Type, Mode=TwoWay}" Style="{StaticResource FilterPickerStyle}"> - + + + +