From 468a169c9f4dde5a9e074749c7bc72979c748670 Mon Sep 17 00:00:00 2001 From: Miles Pong Date: Fri, 16 Jun 2017 13:55:22 +0800 Subject: [PATCH 01/78] Add route categories.show and tags.show and related logic --- .../Frontend/CategoryController.php | 35 ++++++++++++++ .../Controllers/Frontend/TagController.php | 35 ++++++++++++++ .../Contracts/CategoryRepository.php | 8 +--- app/Repositories/Contracts/PostRelated.php | 18 +++++++ app/Repositories/Contracts/TagRepository.php | 8 +--- .../Eloquent/CategoryRepositoryEloquent.php | 23 +-------- .../Eloquent/TagRepositoryEloquent.php | 23 +-------- app/Repositories/Eloquent/Traits/Postable.php | 47 +++++++++++++++++++ resources/views/categories/show.blade.php | 26 ++++++++++ resources/views/partials/navbar.blade.php | 4 +- resources/views/tags/show.blade.php | 26 ++++++++++ resources/views/widgets/category.blade.php | 2 +- resources/views/widgets/tag.blade.php | 2 +- routes/web.php | 3 ++ 14 files changed, 200 insertions(+), 60 deletions(-) create mode 100644 app/Http/Controllers/Frontend/CategoryController.php create mode 100644 app/Http/Controllers/Frontend/TagController.php create mode 100644 app/Repositories/Contracts/PostRelated.php create mode 100644 app/Repositories/Eloquent/Traits/Postable.php create mode 100644 resources/views/categories/show.blade.php create mode 100644 resources/views/tags/show.blade.php diff --git a/app/Http/Controllers/Frontend/CategoryController.php b/app/Http/Controllers/Frontend/CategoryController.php new file mode 100644 index 0000000..151be05 --- /dev/null +++ b/app/Http/Controllers/Frontend/CategoryController.php @@ -0,0 +1,35 @@ +cateRepo = $cateRepo; + } + + /** + * @param $id + * @return \Illuminate\Contracts\View\Factory|\Illuminate\View\View + */ + public function show($id) + { + list($category, $posts) = $this->cateRepo->getWithPosts($id); + + return view('categories.show', compact('posts', 'category')); + } +} diff --git a/app/Http/Controllers/Frontend/TagController.php b/app/Http/Controllers/Frontend/TagController.php new file mode 100644 index 0000000..31859c3 --- /dev/null +++ b/app/Http/Controllers/Frontend/TagController.php @@ -0,0 +1,35 @@ +tagRepo = $tagRepo; + } + + /** + * @param $id + * @return \Illuminate\Contracts\View\Factory|\Illuminate\View\View + */ + public function show($id) + { + list($tag, $posts) = $this->tagRepo->getWithPosts($id); + + return view('tags.show', compact('tag', 'posts')); + } +} diff --git a/app/Repositories/Contracts/CategoryRepository.php b/app/Repositories/Contracts/CategoryRepository.php index f97a91f..d97bee1 100644 --- a/app/Repositories/Contracts/CategoryRepository.php +++ b/app/Repositories/Contracts/CategoryRepository.php @@ -6,7 +6,7 @@ * Interface CategoryRepository * @package App\Repositories\Contracts */ -interface CategoryRepository extends RepositoryInterface +interface CategoryRepository extends RepositoryInterface, PostRelated { /** * @param array $attributes @@ -20,10 +20,4 @@ public function createCategory(array $attributes); * @return mixed */ public function updateCategory(array $attributes, $id); - - /** - * @param array $columns - * @return mixed - */ - public function allWithPostCount($columns = ['*']); } diff --git a/app/Repositories/Contracts/PostRelated.php b/app/Repositories/Contracts/PostRelated.php new file mode 100644 index 0000000..57cd451 --- /dev/null +++ b/app/Repositories/Contracts/PostRelated.php @@ -0,0 +1,18 @@ +update($attributes, $id); } - - /** - * @param array $columns - * @return mixed - */ - public function allWithPostCount($columns = ['*']) - { - return $this->withCount([ - 'posts' => function ($query) { - if (isAdmin()) { - $query->withoutGlobalScope(PublishedScope::class); - } - } - ]) - ->all() - ->reject(function ($category) { - return $category->posts_count == 0; - }); - } } diff --git a/app/Repositories/Eloquent/TagRepositoryEloquent.php b/app/Repositories/Eloquent/TagRepositoryEloquent.php index 2cea2a8..7fe7a8c 100644 --- a/app/Repositories/Eloquent/TagRepositoryEloquent.php +++ b/app/Repositories/Eloquent/TagRepositoryEloquent.php @@ -4,8 +4,8 @@ use App\Models\Tag; use App\Repositories\Contracts\TagRepository; +use App\Repositories\Eloquent\Traits\Postable; use App\Repositories\Eloquent\Traits\Slugable; -use App\Scopes\PublishedScope; /** * Class TagRepositoryEloquent @@ -13,7 +13,7 @@ */ class TagRepositoryEloquent extends Repository implements TagRepository { - use Slugable; + use Slugable, Postable; /** * @return string @@ -56,23 +56,4 @@ public function updateTag(array $attributes, $id) return $this->update($attributes, $id); } - - /** - * @param array $columns - * @return mixed - */ - public function allWithPostCount($columns = ['*']) - { - return $this->withCount([ - 'posts' => function ($query) { - if (isAdmin()) { - $query->withoutGlobalScope(PublishedScope::class); - } - } - ]) - ->all() - ->reject(function ($tag) { - return $tag->posts_count == 0; - }); - } } diff --git a/app/Repositories/Eloquent/Traits/Postable.php b/app/Repositories/Eloquent/Traits/Postable.php new file mode 100644 index 0000000..87bec5c --- /dev/null +++ b/app/Repositories/Eloquent/Traits/Postable.php @@ -0,0 +1,47 @@ +withCount([ + 'posts' => function ($query) { + if (isAdmin()) { + $query->withoutGlobalScope(PublishedScope::class); + } + } + ]) + ->all() + ->reject(function ($category) { + return $category->posts_count == 0; + }); + } + + /** + * @param $id + * @return array + */ + public function getWithPosts($id) + { + $model = $this->find($id); + + // Call relationship $category->posts() + $relation = call_user_func([$model, 'posts']); + + if (isAdmin()) { + $relation->withoutGlobalScope(PublishedScope::class); + } + + $posts = $relation->with(['tags', 'category', 'author'])->paginate(5); + + return [$model, $posts]; + } +} \ No newline at end of file diff --git a/resources/views/categories/show.blade.php b/resources/views/categories/show.blade.php new file mode 100644 index 0000000..637e505 --- /dev/null +++ b/resources/views/categories/show.blade.php @@ -0,0 +1,26 @@ +@extends('layouts.app') + +@section('content') + @component('components.header') +
+
+

{{ $category->name }}

+

{{ $category->description }}

+
+
+ @endcomponent + +
+
+
+ @include('posts._list') +
+
+ @include('partials.sidebar') +
+
+ {{ $posts->links('pagination::materialize') }} +
+
+
+@endsection \ No newline at end of file diff --git a/resources/views/partials/navbar.blade.php b/resources/views/partials/navbar.blade.php index d2f4e76..09dfde4 100644 --- a/resources/views/partials/navbar.blade.php +++ b/resources/views/partials/navbar.blade.php @@ -25,7 +25,7 @@
@@ -39,7 +39,7 @@ diff --git a/resources/views/tags/show.blade.php b/resources/views/tags/show.blade.php new file mode 100644 index 0000000..632d22d --- /dev/null +++ b/resources/views/tags/show.blade.php @@ -0,0 +1,26 @@ +@extends('layouts.app') + +@section('content') + @component('components.header') +
+
+

{{ $tag->name }}

+

{{ $tag->description }}

+
+
+ @endcomponent + +
+
+
+ @include('posts._list') +
+
+ @include('partials.sidebar') +
+
+ {{ $posts->links('pagination::materialize') }} +
+
+
+@endsection \ No newline at end of file diff --git a/resources/views/widgets/category.blade.php b/resources/views/widgets/category.blade.php index b5f1279..54332ac 100644 --- a/resources/views/widgets/category.blade.php +++ b/resources/views/widgets/category.blade.php @@ -1,7 +1,7 @@
Categories
@foreach($categories as $category) - + {{ $category->posts_count }} {{ $category->name }} diff --git a/resources/views/widgets/tag.blade.php b/resources/views/widgets/tag.blade.php index 06fdd9e..009d72e 100644 --- a/resources/views/widgets/tag.blade.php +++ b/resources/views/widgets/tag.blade.php @@ -2,7 +2,7 @@
Tags
@foreach($tags as $tag) - + {{ $tag->name }} {{ $tag->posts_count }} diff --git a/routes/web.php b/routes/web.php index 8e902ed..06d2604 100644 --- a/routes/web.php +++ b/routes/web.php @@ -31,4 +31,7 @@ Route::group(['namespace' => 'Frontend'], function () { Route::get('/', 'PostController@index')->name('home'); Route::resource('articles', 'PostController', ['only' => ['show']]); + + Route::resource('categories', 'CategoryController', ['only' => ['show']]); + Route::resource('tags', 'TagController', ['only' => ['show']]); }); From 50c95c41680ecfec236c298b56939d92ac61c18b Mon Sep 17 00:00:00 2001 From: Miles Pong Date: Fri, 16 Jun 2017 14:04:22 +0800 Subject: [PATCH 02/78] Add address bar color to adapt chrome --- resources/views/layouts/app.blade.php | 2 ++ 1 file changed, 2 insertions(+) diff --git a/resources/views/layouts/app.blade.php b/resources/views/layouts/app.blade.php index 5694693..acd0c81 100644 --- a/resources/views/layouts/app.blade.php +++ b/resources/views/layouts/app.blade.php @@ -9,6 +9,8 @@ + + @include('partials.favicon') {{ config('app.name', 'Laravel') }} From e69644eb2b4bef38d351e198edb6d3896a55238d Mon Sep 17 00:00:00 2001 From: Miles Pong Date: Fri, 16 Jun 2017 16:00:25 +0800 Subject: [PATCH 03/78] Add index to posts published_at column --- database/migrations/2017_05_29_154816_create_posts_table.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/database/migrations/2017_05_29_154816_create_posts_table.php b/database/migrations/2017_05_29_154816_create_posts_table.php index ae1d6ce..bf0455a 100644 --- a/database/migrations/2017_05_29_154816_create_posts_table.php +++ b/database/migrations/2017_05_29_154816_create_posts_table.php @@ -26,7 +26,7 @@ public function up() $table->string('feature_img')->nullable(); $table->longText('content'); $table->integer('view_count')->unsigned()->default(0); - $table->timestamp('published_at'); + $table->timestamp('published_at')->nullable()->index(); $table->boolean('is_draft')->default(false); $table->timestamps(); $table->softDeletes(); From b073a78434141af5fa3a4f0119213343cc55a409 Mon Sep 17 00:00:00 2001 From: Miles Pong Date: Sun, 18 Jun 2017 09:01:14 +0000 Subject: [PATCH 04/78] Add repository's model property access by public function --- app/Repositories/Contracts/RepositoryInterface.php | 5 +++++ app/Repositories/Eloquent/Repository.php | 8 ++++++++ 2 files changed, 13 insertions(+) diff --git a/app/Repositories/Contracts/RepositoryInterface.php b/app/Repositories/Contracts/RepositoryInterface.php index a9f0c47..206c817 100644 --- a/app/Repositories/Contracts/RepositoryInterface.php +++ b/app/Repositories/Contracts/RepositoryInterface.php @@ -117,4 +117,9 @@ public function restore($id); * @return mixed */ public function forceDelete($id); + + /** + * @return mixed + */ + public function getModel(); } \ No newline at end of file diff --git a/app/Repositories/Eloquent/Repository.php b/app/Repositories/Eloquent/Repository.php index d5115c6..b08a7e1 100644 --- a/app/Repositories/Eloquent/Repository.php +++ b/app/Repositories/Eloquent/Repository.php @@ -54,6 +54,14 @@ public function makeModel() */ abstract public function model(); + /** + * @return Builder|Model + */ + public function getModel() + { + return $this->model; + } + /** * The fake "booting" method of the model in calling scopes. */ From 00a65be195ab44a600667a64cdeff508917d5db0 Mon Sep 17 00:00:00 2001 From: Miles Pong Date: Sun, 18 Jun 2017 09:01:39 +0000 Subject: [PATCH 05/78] Add config blog.php --- config/blog.php | 9 +++++++++ 1 file changed, 9 insertions(+) create mode 100644 config/blog.php diff --git a/config/blog.php b/config/blog.php new file mode 100644 index 0000000..a033b4c --- /dev/null +++ b/config/blog.php @@ -0,0 +1,9 @@ + [ + 'timeout' => 3600, // 1h + 'key' => 'post_viewed', + 'cache_key' => 'post_', + ] +]; \ No newline at end of file From d13e5c50055963cdc74f15404e1e1e20b178d2c2 Mon Sep 17 00:00:00 2001 From: Miles Pong Date: Sun, 18 Jun 2017 09:20:53 +0000 Subject: [PATCH 06/78] Add PostView event&listener --- app/Events/PostViewEvent.php | 44 +++++++++++++++++++ .../Controllers/Frontend/PostController.php | 3 ++ app/Listeners/PostViewEventListener.php | 40 +++++++++++++++++ app/Providers/EventServiceProvider.php | 7 ++- 4 files changed, 92 insertions(+), 2 deletions(-) create mode 100644 app/Events/PostViewEvent.php create mode 100644 app/Listeners/PostViewEventListener.php diff --git a/app/Events/PostViewEvent.php b/app/Events/PostViewEvent.php new file mode 100644 index 0000000..5761509 --- /dev/null +++ b/app/Events/PostViewEvent.php @@ -0,0 +1,44 @@ +postId = $postId; + } + + /** + * Get the channels the event should broadcast on. + * + * @return Channel|array + */ + public function broadcastOn() + { + return new PrivateChannel('channel-name'); + } +} diff --git a/app/Http/Controllers/Frontend/PostController.php b/app/Http/Controllers/Frontend/PostController.php index eb3a611..1c57c0a 100644 --- a/app/Http/Controllers/Frontend/PostController.php +++ b/app/Http/Controllers/Frontend/PostController.php @@ -2,6 +2,7 @@ namespace App\Http\Controllers\Frontend; +use App\Events\PostViewEvent; use App\Repositories\Contracts\PostRepository; use Illuminate\Http\Request; use App\Http\Controllers\Controller; @@ -49,6 +50,8 @@ public function show($id) ->with(['category', 'tags', 'author']) ->find($id); + event(new PostViewEvent($id)); + return view('posts.show', compact('post')); } } diff --git a/app/Listeners/PostViewEventListener.php b/app/Listeners/PostViewEventListener.php new file mode 100644 index 0000000..d2e1d6d --- /dev/null +++ b/app/Listeners/PostViewEventListener.php @@ -0,0 +1,40 @@ +counter = $postViewCounter; + } + + /** + * Handle the event. + * + * @param PostViewEvent $event + * @return void + */ + public function handle(PostViewEvent $event) + { + $this->counter->run($event->postId); + } +} diff --git a/app/Providers/EventServiceProvider.php b/app/Providers/EventServiceProvider.php index fca6152..1f86371 100644 --- a/app/Providers/EventServiceProvider.php +++ b/app/Providers/EventServiceProvider.php @@ -13,8 +13,11 @@ class EventServiceProvider extends ServiceProvider * @var array */ protected $listen = [ - 'App\Events\Event' => [ - 'App\Listeners\EventListener', + // 'App\Events\Event' => [ + // 'App\Listeners\EventListener', + // ], + 'App\Events\PostViewEvent' => [ + 'App\Listeners\PostViewEventListener', ], ]; From b8ea335eeb566970022eec924702c9f1bf9e7345 Mon Sep 17 00:00:00 2001 From: Miles Pong Date: Sun, 18 Jun 2017 09:21:16 +0000 Subject: [PATCH 07/78] Add PostViewCounter --- app/Services/PostViewCounter.php | 175 +++++++++++++++++++++++++++++++ 1 file changed, 175 insertions(+) create mode 100644 app/Services/PostViewCounter.php diff --git a/app/Services/PostViewCounter.php b/app/Services/PostViewCounter.php new file mode 100644 index 0000000..a0dc13c --- /dev/null +++ b/app/Services/PostViewCounter.php @@ -0,0 +1,175 @@ +request = $request; + $this->setConfig(); + } + + /** + * Prepare property + */ + protected function setConfig() + { + // TODO what if config is hack? + $config = $this->getDefaultConfig(); + $this->timeout = $config['timeout']; + $this->key = $config['key']; + $this->cacheKey = $config['cache_key']; + } + + /** + * Get default config + * + * @return mixed + */ + protected function getDefaultConfig() + { + return config('blog.counter'); + } + + /** + * Reset timeout + * + * @param $timeout + */ + public function setTimeout($timeout) + { + $this->timeout = $timeout; + } + + /** + * Main + * + * @param $id + */ + public function run($id) + { + $this->id = $id; + + if (!$this->isPostViewed() || $this->isLastViewOutdated()) { + $this->saveVisitorLog(); + + $this->createSession(); + + $this->increaseCacheRecord(); + } + } + + /** + * Determinate if post is have been viewed + * + * @return bool + */ + protected function isPostViewed() + { + return $this->request->session()->has($this->getPostSessionKey()); + } + + /** + * Get post's session key + * + * @return string + */ + protected function getPostSessionKey() + { + return $this->key . '.' . $this->id; + } + + /** + * Determinate if post view record is outdated + * + * @return bool + */ + protected function isLastViewOutdated() + { + $lastView = $this->request->session()->get($this->getPostSessionKey()); + + return ($lastView + $this->timeout) < $this->currentTime(); + } + + /** + * Return a unix timestamp + * + * @return int + */ + private function currentTime() + { + return time(); + } + + /** + * + */ + protected function saveVisitorLog() + { + // TODO + } + + /** + * Create post viewed session + */ + protected function createSession() + { + $this->request->session()->put($this->getPostSessionKey(), $this->currentTime()); + } + + /** + * Save view record into cache + */ + protected function increaseCacheRecord() + { + $cacheKey = $this->getPostCacheKey(); + if (Cache::tags($this->key)->has($cacheKey)) { + Cache::tags($this->key)->increment($cacheKey); + } else { + Cache::tags($this->key)->forever($cacheKey, 1); + } + } + + /** + * Return post's cache key + * + * @return string + */ + protected function getPostCacheKey() + { + return $this->cacheKey . $this->id; + } +} From aecae044ef554e101cad43afd284495f4f1bc3ae Mon Sep 17 00:00:00 2001 From: Miles Pong Date: Sun, 18 Jun 2017 09:21:54 +0000 Subject: [PATCH 08/78] Add artisan SavePostViewCount --- app/Console/Commands/SavePostViewCount.php | 127 +++++++++++++++++++++ app/Console/Kernel.php | 3 +- 2 files changed, 129 insertions(+), 1 deletion(-) create mode 100644 app/Console/Commands/SavePostViewCount.php diff --git a/app/Console/Commands/SavePostViewCount.php b/app/Console/Commands/SavePostViewCount.php new file mode 100644 index 0000000..879bd19 --- /dev/null +++ b/app/Console/Commands/SavePostViewCount.php @@ -0,0 +1,127 @@ +postRepo = $postRepo; + + $this->cacheTag = config('blog.counter.key'); + $this->cacheKeyPrefix = config('blog.counter.cache_key'); + } + + /** + * Execute the console command. + * + * @return mixed + */ + public function handle() + { + $data = $this->savePostViewCount(); + + $this->flushCache(); + + $this->info('Post view_count save successfully!'); + $this->table(['Post ID', 'Increase Count'], $data); + } + + /** + * Retrieve all post view_count from cache and save into DB + * + * @return array + */ + protected function savePostViewCount() + { + $results = []; + + // Retrieve all post id + $this->postRepo + ->getModel() + ->select('id') + ->chunk(100, function ($posts) use (&$results) { + foreach ($posts as $post) { + if ($count = $this->getCacheCount($post->id)) { + $post->increment('view_count', $count); + array_push($results, [$post->id, $count]); + } + } + }); + + return $results; + } + + /** + * Get post view_count from cache + * + * @param $id + * @return mixed + */ + protected function getCacheCount($id) + { + return Cache::tags($this->cacheTag)->get($this->cacheKey($id)); + } + + /** + * Get cache key + * + * @param $id + * @return string + */ + protected function cacheKey($id) + { + return $this->cacheKeyPrefix . $id; + } + + /** + * Flush post view_count in cache by tag + */ + protected function flushCache() + { + Cache::tags($this->cacheTag)->flush(); + } +} diff --git a/app/Console/Kernel.php b/app/Console/Kernel.php index 622e774..e85a61b 100644 --- a/app/Console/Kernel.php +++ b/app/Console/Kernel.php @@ -2,6 +2,7 @@ namespace App\Console; +use App\Console\Commands\SavePostViewCount; use Illuminate\Console\Scheduling\Schedule; use Illuminate\Foundation\Console\Kernel as ConsoleKernel; @@ -13,7 +14,7 @@ class Kernel extends ConsoleKernel * @var array */ protected $commands = [ - // + SavePostViewCount::class ]; /** From f906c03ba0a49b98089c94846f5a2312560516af Mon Sep 17 00:00:00 2001 From: Miles Pong Date: Sun, 18 Jun 2017 09:48:04 +0000 Subject: [PATCH 09/78] Add crontab schedule of view_count:save --- app/Console/Commands/SavePostViewCount.php | 3 ++- app/Console/Kernel.php | 3 ++- 2 files changed, 4 insertions(+), 2 deletions(-) diff --git a/app/Console/Commands/SavePostViewCount.php b/app/Console/Commands/SavePostViewCount.php index 879bd19..f5a9511 100644 --- a/app/Console/Commands/SavePostViewCount.php +++ b/app/Console/Commands/SavePostViewCount.php @@ -4,6 +4,7 @@ use App\Models\Post; use App\Repositories\Contracts\PostRepository; +use Carbon\Carbon; use Illuminate\Console\Command; use Illuminate\Support\Facades\Cache; use Illuminate\Support\Facades\Redis; @@ -66,7 +67,7 @@ public function handle() $this->flushCache(); - $this->info('Post view_count save successfully!'); + $this->info("Post view_count save successfully at " . Carbon::now()->toDateTimeString()); $this->table(['Post ID', 'Increase Count'], $data); } diff --git a/app/Console/Kernel.php b/app/Console/Kernel.php index e85a61b..2b973bb 100644 --- a/app/Console/Kernel.php +++ b/app/Console/Kernel.php @@ -20,13 +20,14 @@ class Kernel extends ConsoleKernel /** * Define the application's command schedule. * - * @param \Illuminate\Console\Scheduling\Schedule $schedule + * @param \Illuminate\Console\Scheduling\Schedule $schedule * @return void */ protected function schedule(Schedule $schedule) { // $schedule->command('inspire') // ->hourly(); + $schedule->command('view_count:save')->hourly()->appendOutputTo(storage_path() . '/logs/cron.log'); } /** From 98a5dc1e5ac62375a27b493ba82d8cc81982192c Mon Sep 17 00:00:00 2001 From: Miles Pong Date: Sun, 18 Jun 2017 12:10:44 +0000 Subject: [PATCH 10/78] Add google analytics related --- .env.example | 2 ++ config/blog.php | 3 +++ resources/views/layouts/app.blade.php | 2 ++ resources/views/partials/google_analytics.blade.php | 12 ++++++++++++ 4 files changed, 19 insertions(+) create mode 100644 resources/views/partials/google_analytics.blade.php diff --git a/.env.example b/.env.example index 81a975a..884bb16 100644 --- a/.env.example +++ b/.env.example @@ -34,3 +34,5 @@ PUSHER_APP_SECRET= YOUDAO_APP_KEY= YOUDAO_APP_SECRET= + +GOOGLE_ANALYTICS_ID= \ No newline at end of file diff --git a/config/blog.php b/config/blog.php index a033b4c..f766597 100644 --- a/config/blog.php +++ b/config/blog.php @@ -5,5 +5,8 @@ 'timeout' => 3600, // 1h 'key' => 'post_viewed', 'cache_key' => 'post_', + ], + 'analytics' => [ + 'google_trace_id' => env('GOOGLE_ANALYTICS_ID'), ] ]; \ No newline at end of file diff --git a/resources/views/layouts/app.blade.php b/resources/views/layouts/app.blade.php index 5694693..6e8576f 100644 --- a/resources/views/layouts/app.blade.php +++ b/resources/views/layouts/app.blade.php @@ -51,5 +51,7 @@ @stack('js') + + @include('partials.google_analytics') diff --git a/resources/views/partials/google_analytics.blade.php b/resources/views/partials/google_analytics.blade.php new file mode 100644 index 0000000..b695df6 --- /dev/null +++ b/resources/views/partials/google_analytics.blade.php @@ -0,0 +1,12 @@ +@if(config('blog.analytics.google_trace_id')) + +@endif \ No newline at end of file From d1800387066b4276bef2ef753099d33ff77c3eeb Mon Sep 17 00:00:00 2001 From: Miles Pong Date: Sun, 18 Jun 2017 12:41:51 +0000 Subject: [PATCH 11/78] Composer require jenssegers/agent --- composer.json | 1 + composer.lock | 161 ++++++++++++++++++++++++++++++++++++++++++++++++- config/app.php | 2 + 3 files changed, 163 insertions(+), 1 deletion(-) diff --git a/composer.json b/composer.json index 38be99a..8291887 100644 --- a/composer.json +++ b/composer.json @@ -8,6 +8,7 @@ "php": ">=5.6.4", "erusev/parsedown": "^1.6", "jellybool/translug": "^2.0", + "jenssegers/agent": "^2.5", "laracasts/presenter": "^0.2.1", "laravel/framework": "5.4.*", "laravel/tinker": "~1.0", diff --git a/composer.lock b/composer.lock index 01c7880..82d1bd1 100644 --- a/composer.lock +++ b/composer.lock @@ -4,7 +4,7 @@ "Read more about it at https://getcomposer.org/doc/01-basic-usage.md#composer-lock-the-lock-file", "This file is @generated automatically" ], - "content-hash": "534ff426fdda758f65abb831aaa656d1", + "content-hash": "d256e969bbd67aeacd227f8ca867d755", "packages": [ { "name": "dnoegel/php-xdg-base-dir", @@ -413,6 +413,54 @@ ], "time": "2015-04-20T18:58:01+00:00" }, + { + "name": "jaybizzle/crawler-detect", + "version": "v1.2.45", + "source": { + "type": "git", + "url": "https://github.com/JayBizzle/Crawler-Detect.git", + "reference": "fa55dc49376dbc4b4786e49113faa8bdea8250a1" + }, + "dist": { + "type": "zip", + "url": "https://files.phpcomposer.com/files/JayBizzle/Crawler-Detect/fa55dc49376dbc4b4786e49113faa8bdea8250a1.zip", + "reference": "fa55dc49376dbc4b4786e49113faa8bdea8250a1", + "shasum": "" + }, + "require": { + "php": ">=5.3.0" + }, + "require-dev": { + "phpunit/phpunit": "4.*" + }, + "type": "library", + "autoload": { + "psr-4": { + "Jaybizzle\\CrawlerDetect\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Mark Beech", + "email": "m@rkbee.ch", + "role": "Developer" + } + ], + "description": "CrawlerDetect is a PHP class for detecting bots/crawlers/spiders via the user agent", + "homepage": "https://github.com/JayBizzle/Crawler-Detect/", + "keywords": [ + "crawler", + "crawler detect", + "crawler detector", + "crawlerdetect", + "php crawler detect" + ], + "time": "2017-06-07T20:58:57+00:00" + }, { "name": "jellybool/translug", "version": "2.0.1", @@ -461,6 +509,65 @@ ], "time": "2017-05-26T15:45:17+00:00" }, + { + "name": "jenssegers/agent", + "version": "v2.5.1", + "source": { + "type": "git", + "url": "https://github.com/jenssegers/agent.git", + "reference": "68bef4f773933d33f9b6c8d1f2ff002f97a65b0b" + }, + "dist": { + "type": "zip", + "url": "https://files.phpcomposer.com/files/jenssegers/agent/68bef4f773933d33f9b6c8d1f2ff002f97a65b0b.zip", + "reference": "68bef4f773933d33f9b6c8d1f2ff002f97a65b0b", + "shasum": "" + }, + "require": { + "illuminate/support": "^4.0|^5.0", + "jaybizzle/crawler-detect": "^1.2", + "mobiledetect/mobiledetectlib": "^2.7.6", + "php": ">=5.4.0" + }, + "require-dev": { + "phpunit/phpunit": "^4.0|^5.0|^6.0", + "satooshi/php-coveralls": "^1.0" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "3.0-dev" + } + }, + "autoload": { + "psr-4": { + "Jenssegers\\Agent\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Jens Segers", + "homepage": "https://jenssegers.com" + } + ], + "description": "Desktop/mobile user agent parser with support for Laravel, based on Mobiledetect", + "homepage": "https://github.com/jenssegers/agent", + "keywords": [ + "Agent", + "browser", + "desktop", + "laravel", + "mobile", + "platform", + "user agent", + "useragent" + ], + "time": "2017-03-12T09:58:22+00:00" + }, { "name": "laracasts/presenter", "version": "0.2.1", @@ -846,6 +953,58 @@ ], "time": "2017-03-16T00:45:59+00:00" }, + { + "name": "mobiledetect/mobiledetectlib", + "version": "2.8.25", + "source": { + "type": "git", + "url": "https://github.com/serbanghita/Mobile-Detect.git", + "reference": "f0896b5c7274d1450023b0b376240be902c3251c" + }, + "dist": { + "type": "zip", + "url": "https://files.phpcomposer.com/files/serbanghita/Mobile-Detect/f0896b5c7274d1450023b0b376240be902c3251c.zip", + "reference": "f0896b5c7274d1450023b0b376240be902c3251c", + "shasum": "" + }, + "require": { + "php": ">=5.0.0" + }, + "require-dev": { + "phpunit/phpunit": "*" + }, + "type": "library", + "autoload": { + "classmap": [ + "Mobile_Detect.php" + ], + "psr-0": { + "Detection": "namespaced/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Serban Ghita", + "email": "serbanghita@gmail.com", + "homepage": "http://mobiledetect.net", + "role": "Developer" + } + ], + "description": "Mobile_Detect is a lightweight PHP class for detecting mobile devices. It uses the User-Agent string combined with specific HTTP headers to detect the mobile environment.", + "homepage": "https://github.com/serbanghita/Mobile-Detect", + "keywords": [ + "detect mobile devices", + "mobile", + "mobile detect", + "mobile detector", + "php mobile detect" + ], + "time": "2017-03-29T13:59:30+00:00" + }, { "name": "monolog/monolog", "version": "1.22.1", diff --git a/config/app.php b/config/app.php index 41eb5bf..336cf14 100644 --- a/config/app.php +++ b/config/app.php @@ -183,6 +183,7 @@ Thomaswelton\LaravelGravatar\LaravelGravatarServiceProvider::class, App\Providers\RepositoryServiceProvider::class, JellyBool\Translug\TranslugServiceProvider::class, + Jenssegers\Agent\AgentServiceProvider::class, ], @@ -237,6 +238,7 @@ 'Entrust' => Zizaco\Entrust\EntrustFacade::class, 'Gravatar' => Thomaswelton\LaravelGravatar\Facades\Gravatar::class, 'Translug' => \JellyBool\Translug\TranslugFacade::class, + 'Agent' => Jenssegers\Agent\Facades\Agent::class, ], ]; From 83e6ee211cb8608e275f64e1bff7e67581c5aad2 Mon Sep 17 00:00:00 2001 From: Miles Pong Date: Mon, 19 Jun 2017 14:28:52 +0000 Subject: [PATCH 12/78] Add simple visitor log through middleware --- app/Http/Kernel.php | 2 + app/Http/Middleware/VisitorMiddleware.php | 37 ++++++++++ app/Models/Visitor.php | 13 ++++ app/Providers/RepositoryServiceProvider.php | 2 + .../Contracts/VisitorRepository.php | 15 ++++ .../Eloquent/VisitorRepositoryEloquent.php | 71 +++++++++++++++++++ ...017_06_18_194514_create_visitors_table.php | 38 ++++++++++ routes/web.php | 2 +- 8 files changed, 179 insertions(+), 1 deletion(-) create mode 100644 app/Http/Middleware/VisitorMiddleware.php create mode 100644 app/Models/Visitor.php create mode 100644 app/Repositories/Contracts/VisitorRepository.php create mode 100644 app/Repositories/Eloquent/VisitorRepositoryEloquent.php create mode 100644 database/migrations/2017_06_18_194514_create_visitors_table.php diff --git a/app/Http/Kernel.php b/app/Http/Kernel.php index 28f7a27..b917606 100644 --- a/app/Http/Kernel.php +++ b/app/Http/Kernel.php @@ -60,5 +60,7 @@ class Kernel extends HttpKernel 'role' => \Zizaco\Entrust\Middleware\EntrustRole::class, 'permission' => \Zizaco\Entrust\Middleware\EntrustPermission::class, 'ability' => \Zizaco\Entrust\Middleware\EntrustAbility::class, + + 'visitor' => \App\Http\Middleware\VisitorMiddleware::class, ]; } diff --git a/app/Http/Middleware/VisitorMiddleware.php b/app/Http/Middleware/VisitorMiddleware.php new file mode 100644 index 0000000..8baf851 --- /dev/null +++ b/app/Http/Middleware/VisitorMiddleware.php @@ -0,0 +1,37 @@ +visitorRepo = $visitorRepo; + } + + /** + * Handle an incoming request. + * + * @param \Illuminate\Http\Request $request + * @param \Closure $next + * @return mixed + */ + public function handle($request, Closure $next) + { + $this->visitorRepo->createLog(); + + return $next($request); + } +} diff --git a/app/Models/Visitor.php b/app/Models/Visitor.php new file mode 100644 index 0000000..9326a1c --- /dev/null +++ b/app/Models/Visitor.php @@ -0,0 +1,13 @@ +app->bind(\App\Repositories\Contracts\PostRepository::class, \App\Repositories\Eloquent\PostRepositoryEloquent::class); + $this->app->bind(\App\Repositories\Contracts\VisitorRepository::class, + \App\Repositories\Eloquent\VisitorRepositoryEloquent::class); } } diff --git a/app/Repositories/Contracts/VisitorRepository.php b/app/Repositories/Contracts/VisitorRepository.php new file mode 100644 index 0000000..b7f5a9f --- /dev/null +++ b/app/Repositories/Contracts/VisitorRepository.php @@ -0,0 +1,15 @@ +request = $request; + $this->agent = $agent; + } + + /** + * @return string + */ + public function model() + { + return Visitor::class; + } + + /** + * @return \Illuminate\Database\Eloquent\Model + */ + public function createLog() + { + return $this->create($this->getLogData()); + } + + /** + * @return array + */ + protected function getLogData() + { + return [ + 'ip' => $this->request->ip(), + 'uri' =>$this->request->path(), + 'is_robot' => $this->agent->isRobot(), + 'platform' => $this->agent->platform(), + 'device' => $this->agent->device(), + 'browser' => $this->agent->browser(), + 'user_agent' => $this->request->server('HTTP_USER_AGENT'), + ]; + } +} diff --git a/database/migrations/2017_06_18_194514_create_visitors_table.php b/database/migrations/2017_06_18_194514_create_visitors_table.php new file mode 100644 index 0000000..d4b30ec --- /dev/null +++ b/database/migrations/2017_06_18_194514_create_visitors_table.php @@ -0,0 +1,38 @@ +increments('id'); + $table->string('ip'); + $table->string('uri'); + $table->boolean('is_robot')->nullable(); + $table->string('platform')->nullable(); + $table->string('device')->nullable(); + $table->string('browser')->nullable(); + $table->string('user_agent')->nullable(); + $table->timestamps(); + }); + } + + /** + * Reverse the migrations. + * + * @return void + */ + public function down() + { + Schema::dropIfExists('visitors'); + } +} diff --git a/routes/web.php b/routes/web.php index 8e902ed..7488c59 100644 --- a/routes/web.php +++ b/routes/web.php @@ -30,5 +30,5 @@ Route::group(['namespace' => 'Frontend'], function () { Route::get('/', 'PostController@index')->name('home'); - Route::resource('articles', 'PostController', ['only' => ['show']]); + Route::resource('articles', 'PostController', ['only' => ['show'], 'middleware' => 'visitor']); }); From ac00b8fe0661280cdff3095322c2a776b1b50da7 Mon Sep 17 00:00:00 2001 From: Miles Pong Date: Mon, 19 Jun 2017 15:07:21 +0000 Subject: [PATCH 13/78] Update PostViewCounter by adding strict_mode switch --- app/Console/Commands/SavePostViewCount.php | 22 +++++----- app/Services/PostViewCounter.php | 50 ++++++++++++++-------- config/blog.php | 5 ++- 3 files changed, 44 insertions(+), 33 deletions(-) diff --git a/app/Console/Commands/SavePostViewCount.php b/app/Console/Commands/SavePostViewCount.php index f5a9511..af25cd7 100644 --- a/app/Console/Commands/SavePostViewCount.php +++ b/app/Console/Commands/SavePostViewCount.php @@ -25,11 +25,6 @@ class SavePostViewCount extends Command */ protected $description = 'Save posts view count into DB and flush cache'; - /** - * @var mixed - */ - protected $cacheTag; - /** * @var mixed */ @@ -52,7 +47,6 @@ public function __construct(PostRepository $postRepo) $this->postRepo = $postRepo; - $this->cacheTag = config('blog.counter.key'); $this->cacheKeyPrefix = config('blog.counter.cache_key'); } @@ -65,8 +59,6 @@ public function handle() { $data = $this->savePostViewCount(); - $this->flushCache(); - $this->info("Post view_count save successfully at " . Carbon::now()->toDateTimeString()); $this->table(['Post ID', 'Increase Count'], $data); } @@ -88,7 +80,10 @@ protected function savePostViewCount() foreach ($posts as $post) { if ($count = $this->getCacheCount($post->id)) { $post->increment('view_count', $count); + array_push($results, [$post->id, $count]); + + $this->flushCache($this->cacheKey($post->id)); } } }); @@ -104,7 +99,7 @@ protected function savePostViewCount() */ protected function getCacheCount($id) { - return Cache::tags($this->cacheTag)->get($this->cacheKey($id)); + return Cache::get($this->cacheKey($id)); } /** @@ -119,10 +114,13 @@ protected function cacheKey($id) } /** - * Flush post view_count in cache by tag + * Flush post view_count in cache by key + * + * @param $key + * @return bool */ - protected function flushCache() + protected function flushCache($key) { - Cache::tags($this->cacheTag)->flush(); + return Cache::forget($key); } } diff --git a/app/Services/PostViewCounter.php b/app/Services/PostViewCounter.php index a0dc13c..0018162 100644 --- a/app/Services/PostViewCounter.php +++ b/app/Services/PostViewCounter.php @@ -14,7 +14,7 @@ class PostViewCounter /** * @var */ - protected $timeout; // For session key and cache tag + protected $timeout; // For session /** * @var */ @@ -32,6 +32,11 @@ class PostViewCounter */ private $cacheKey; // Cache key + /** + * @var + */ + public $strict_mode; + /** * PostViewCounter constructor. * @param Request $request @@ -49,9 +54,11 @@ protected function setConfig() { // TODO what if config is hack? $config = $this->getDefaultConfig(); + $this->timeout = $config['timeout']; $this->key = $config['key']; $this->cacheKey = $config['cache_key']; + $this->strict_mode = $config['strict_mode']; } /** @@ -74,6 +81,22 @@ public function setTimeout($timeout) $this->timeout = $timeout; } + /** + * Determinate if enable strict mode + */ + public function enableStrictMode() + { + $this->strict_mode = true; + } + + /** + * Determinate if disable strict mode + */ + public function disableStrictMode() + { + $this->strict_mode = false; + } + /** * Main * @@ -83,11 +106,13 @@ public function run($id) { $this->id = $id; - if (!$this->isPostViewed() || $this->isLastViewOutdated()) { - $this->saveVisitorLog(); - - $this->createSession(); + if ($this->strict_mode) { + if (!$this->isPostViewed() || $this->isLastViewOutdated()) { + $this->createSession(); + $this->increaseCacheRecord(); + } + } else { $this->increaseCacheRecord(); } } @@ -134,14 +159,6 @@ private function currentTime() return time(); } - /** - * - */ - protected function saveVisitorLog() - { - // TODO - } - /** * Create post viewed session */ @@ -155,12 +172,7 @@ protected function createSession() */ protected function increaseCacheRecord() { - $cacheKey = $this->getPostCacheKey(); - if (Cache::tags($this->key)->has($cacheKey)) { - Cache::tags($this->key)->increment($cacheKey); - } else { - Cache::tags($this->key)->forever($cacheKey, 1); - } + Cache::increment($this->getPostCacheKey()); } /** diff --git a/config/blog.php b/config/blog.php index f766597..8b8fea0 100644 --- a/config/blog.php +++ b/config/blog.php @@ -4,9 +4,10 @@ 'counter' => [ 'timeout' => 3600, // 1h 'key' => 'post_viewed', - 'cache_key' => 'post_', + 'cache_key' => 'post_viewed_count:', + 'strict_mode' => true, ], 'analytics' => [ 'google_trace_id' => env('GOOGLE_ANALYTICS_ID'), ] -]; \ No newline at end of file +]; From 5ee834ae60bd431b1edd8715c0c8e68d77ab7df5 Mon Sep 17 00:00:00 2001 From: Miles Pong Date: Tue, 20 Jun 2017 11:49:43 +0000 Subject: [PATCH 14/78] Update default config --- config/blog.php | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/config/blog.php b/config/blog.php index 8b8fea0..c939e9a 100644 --- a/config/blog.php +++ b/config/blog.php @@ -2,10 +2,11 @@ return [ 'counter' => [ + 'strict_mode' => env('COUNT_STRICT_MODE', false), + 'cache_key' => 'post_viewed_count:', + // require strict_mode to be set 'timeout' => 3600, // 1h 'key' => 'post_viewed', - 'cache_key' => 'post_viewed_count:', - 'strict_mode' => true, ], 'analytics' => [ 'google_trace_id' => env('GOOGLE_ANALYTICS_ID'), From a609160b721e45a2312712812a654f0017445b30 Mon Sep 17 00:00:00 2001 From: Miles Pong Date: Tue, 20 Jun 2017 14:02:23 +0000 Subject: [PATCH 15/78] Refactor Repository to BaseRepository --- .../Eloquent/{Repository.php => BaseRepository.php} | 10 +++++----- .../Eloquent/CategoryRepositoryEloquent.php | 2 +- .../Eloquent/PermissionRepositoryEloquent.php | 2 +- app/Repositories/Eloquent/PostRepositoryEloquent.php | 2 +- app/Repositories/Eloquent/RoleRepositoryEloquent.php | 2 +- app/Repositories/Eloquent/TagRepositoryEloquent.php | 2 +- app/Repositories/Eloquent/UserRepositoryEloquent.php | 2 +- .../Eloquent/VisitorRepositoryEloquent.php | 2 +- 8 files changed, 12 insertions(+), 12 deletions(-) rename app/Repositories/Eloquent/{Repository.php => BaseRepository.php} (97%) diff --git a/app/Repositories/Eloquent/Repository.php b/app/Repositories/Eloquent/BaseRepository.php similarity index 97% rename from app/Repositories/Eloquent/Repository.php rename to app/Repositories/Eloquent/BaseRepository.php index b08a7e1..06c8234 100644 --- a/app/Repositories/Eloquent/Repository.php +++ b/app/Repositories/Eloquent/BaseRepository.php @@ -9,10 +9,10 @@ use Illuminate\Database\Eloquent\Model; /** - * Class Repository + * Class BaseRepository * @package App\Repositories\Eloquent */ -abstract class Repository implements RepositoryInterface +abstract class BaseRepository implements RepositoryInterface { /** * @var Container @@ -25,7 +25,7 @@ abstract class Repository implements RepositoryInterface protected $model; /** - * Repository constructor. + * BaseRepository constructor. * @param Container $app */ public function __construct(Container $app) @@ -245,7 +245,7 @@ public function trashed($only = false) } /** - * @return Repository + * @return BaseRepository */ public function onlyTrashed() { @@ -253,7 +253,7 @@ public function onlyTrashed() } /** - * @return Repository + * @return BaseRepository */ public function withTrashed() { diff --git a/app/Repositories/Eloquent/CategoryRepositoryEloquent.php b/app/Repositories/Eloquent/CategoryRepositoryEloquent.php index e635a1a..1408b9c 100644 --- a/app/Repositories/Eloquent/CategoryRepositoryEloquent.php +++ b/app/Repositories/Eloquent/CategoryRepositoryEloquent.php @@ -11,7 +11,7 @@ * Class CategoryRepositoryEloquent * @package App\Repositories\Eloquent */ -class CategoryRepositoryEloquent extends Repository implements CategoryRepository +class CategoryRepositoryEloquent extends BaseRepository implements CategoryRepository { use Slugable, Postable; diff --git a/app/Repositories/Eloquent/PermissionRepositoryEloquent.php b/app/Repositories/Eloquent/PermissionRepositoryEloquent.php index 9efee68..da14681 100644 --- a/app/Repositories/Eloquent/PermissionRepositoryEloquent.php +++ b/app/Repositories/Eloquent/PermissionRepositoryEloquent.php @@ -9,7 +9,7 @@ * Class PermissionRepositoryEloquent * @package App\Repositories\Eloquent */ -class PermissionRepositoryEloquent extends Repository implements PermissionRepository +class PermissionRepositoryEloquent extends BaseRepository implements PermissionRepository { /** * @return string diff --git a/app/Repositories/Eloquent/PostRepositoryEloquent.php b/app/Repositories/Eloquent/PostRepositoryEloquent.php index 7e8070a..5b93927 100644 --- a/app/Repositories/Eloquent/PostRepositoryEloquent.php +++ b/app/Repositories/Eloquent/PostRepositoryEloquent.php @@ -16,7 +16,7 @@ * Class PostRepositoryEloquent * @package App\Repositories\Eloquent */ -class PostRepositoryEloquent extends Repository implements PostRepository +class PostRepositoryEloquent extends BaseRepository implements PostRepository { use Slugable; diff --git a/app/Repositories/Eloquent/RoleRepositoryEloquent.php b/app/Repositories/Eloquent/RoleRepositoryEloquent.php index 861713f..b863cf1 100644 --- a/app/Repositories/Eloquent/RoleRepositoryEloquent.php +++ b/app/Repositories/Eloquent/RoleRepositoryEloquent.php @@ -10,7 +10,7 @@ * Class RoleRepositoryEloquent * @package App\Repositories\Eloquent */ -class RoleRepositoryEloquent extends Repository implements RoleRepository +class RoleRepositoryEloquent extends BaseRepository implements RoleRepository { /** * @return string diff --git a/app/Repositories/Eloquent/TagRepositoryEloquent.php b/app/Repositories/Eloquent/TagRepositoryEloquent.php index 7fe7a8c..dfbf42d 100644 --- a/app/Repositories/Eloquent/TagRepositoryEloquent.php +++ b/app/Repositories/Eloquent/TagRepositoryEloquent.php @@ -11,7 +11,7 @@ * Class TagRepositoryEloquent * @package App\Repositories\Eloquent */ -class TagRepositoryEloquent extends Repository implements TagRepository +class TagRepositoryEloquent extends BaseRepository implements TagRepository { use Slugable, Postable; diff --git a/app/Repositories/Eloquent/UserRepositoryEloquent.php b/app/Repositories/Eloquent/UserRepositoryEloquent.php index 116e82f..fbffce0 100644 --- a/app/Repositories/Eloquent/UserRepositoryEloquent.php +++ b/app/Repositories/Eloquent/UserRepositoryEloquent.php @@ -10,7 +10,7 @@ * Class UserRepositoryEloquent * @package App\Repositories\Eloquent */ -class UserRepositoryEloquent extends Repository implements UserRepository +class UserRepositoryEloquent extends BaseRepository implements UserRepository { /** * @return string diff --git a/app/Repositories/Eloquent/VisitorRepositoryEloquent.php b/app/Repositories/Eloquent/VisitorRepositoryEloquent.php index 427b610..74c5c96 100644 --- a/app/Repositories/Eloquent/VisitorRepositoryEloquent.php +++ b/app/Repositories/Eloquent/VisitorRepositoryEloquent.php @@ -12,7 +12,7 @@ * Class VisitorRepositoryEloquent * @package App\Repositories\Eloquent */ -class VisitorRepositoryEloquent extends Repository implements VisitorRepository +class VisitorRepositoryEloquent extends BaseRepository implements VisitorRepository { /** * @var Request From 4d6bc1ef892b05cf9a9d29e17b36c4e8e33edbe4 Mon Sep 17 00:00:00 2001 From: Miles Pong Date: Fri, 23 Jun 2017 14:58:58 +0000 Subject: [PATCH 16/78] Update split column content of posts --- app/Models/Content.php | 16 +++++++++ app/Models/Post.php | 8 +++++ database/factories/ModelFactory.php | 10 +++++- ...017_06_23_222953_create_contents_table.php | 32 +++++++++++++++++ ...3_224806_add_content_id_to_posts_table.php | 36 +++++++++++++++++++ 5 files changed, 101 insertions(+), 1 deletion(-) create mode 100644 app/Models/Content.php create mode 100644 database/migrations/2017_06_23_222953_create_contents_table.php create mode 100644 database/migrations/2017_06_23_224806_add_content_id_to_posts_table.php diff --git a/app/Models/Content.php b/app/Models/Content.php new file mode 100644 index 0000000..2774a8a --- /dev/null +++ b/app/Models/Content.php @@ -0,0 +1,16 @@ +hasOne(Post::class); + } +} diff --git a/app/Models/Post.php b/app/Models/Post.php index d93f097..1e0340a 100644 --- a/app/Models/Post.php +++ b/app/Models/Post.php @@ -86,6 +86,14 @@ public function tags() return $this->morphToMany(Tag::class, 'taggable'); } + /** + * @return \Illuminate\Database\Eloquent\Relations\BelongsTo + */ + public function content() + { + return $this->belongsTo(Content::class); + } + /** * @param $name * @return mixed diff --git a/database/factories/ModelFactory.php b/database/factories/ModelFactory.php index 391cf97..ca998da 100644 --- a/database/factories/ModelFactory.php +++ b/database/factories/ModelFactory.php @@ -65,6 +65,12 @@ ]; }); +$factory->define(\App\Models\Content::class, function (\Faker\Generator $faker) { + return [ + 'body' => markdownContent($faker) + ]; +}); + $factory->define(\App\Models\Post::class, function (\Faker\Generator $faker) { $title = $faker->unique()->sentence(mt_rand(3, 6)); @@ -76,7 +82,9 @@ 'slug' => str_slug($title), 'excerpt' => $faker->sentences(3, true), 'feature_img' => $faker->imageUrl(), - 'content' => markdownContent($faker), + 'content_id' => function () { + return factory(\App\Models\Content::class)->create()->id; + }, 'view_count' => mt_rand(0, 10000), 'is_draft' => $faker->boolean, 'published_at' => $faker->dateTimeThisYear('2018-12-31 23:59:59'), diff --git a/database/migrations/2017_06_23_222953_create_contents_table.php b/database/migrations/2017_06_23_222953_create_contents_table.php new file mode 100644 index 0000000..975319a --- /dev/null +++ b/database/migrations/2017_06_23_222953_create_contents_table.php @@ -0,0 +1,32 @@ +increments('id'); + $table->longText('body'); + $table->timestamps(); + }); + } + + /** + * Reverse the migrations. + * + * @return void + */ + public function down() + { + Schema::dropIfExists('contents'); + } +} diff --git a/database/migrations/2017_06_23_224806_add_content_id_to_posts_table.php b/database/migrations/2017_06_23_224806_add_content_id_to_posts_table.php new file mode 100644 index 0000000..ddf2d67 --- /dev/null +++ b/database/migrations/2017_06_23_224806_add_content_id_to_posts_table.php @@ -0,0 +1,36 @@ +dropColumn('content'); + $table->integer('content_id')->unsigned()->index()->after('feature_img'); + $table->foreign('content_id')->references('id')->on('contents'); + }); + } + + /** + * Reverse the migrations. + * + * @return void + */ + public function down() + { + Schema::table('posts', function (Blueprint $table) { + $table->dropForeign('posts_content_id_foreign'); + $table->dropColumn('content_id'); + $table->longText('content'); + }); + } +} From 185daadea5ead18f5621c1a916fd96c1f6b4ce47 Mon Sep 17 00:00:00 2001 From: Miles Pong Date: Sat, 24 Jun 2017 12:39:36 +0000 Subject: [PATCH 17/78] Update compatibility logic of split column content --- .../Controllers/Frontend/PostController.php | 2 +- app/Http/Requests/StoreUpdatePostRequest.php | 2 +- app/Models/Content.php | 5 ++++ app/Models/Post.php | 25 ++++++++++++++++--- app/Presenters/PostPresenter.php | 5 ---- .../Eloquent/PostRepositoryEloquent.php | 21 +++++++++++++++- resources/views/admin/posts/_form.blade.php | 2 +- resources/views/posts/show.blade.php | 2 +- 8 files changed, 50 insertions(+), 14 deletions(-) diff --git a/app/Http/Controllers/Frontend/PostController.php b/app/Http/Controllers/Frontend/PostController.php index 1c57c0a..9780b33 100644 --- a/app/Http/Controllers/Frontend/PostController.php +++ b/app/Http/Controllers/Frontend/PostController.php @@ -47,7 +47,7 @@ public function index() public function show($id) { $post = $this->postRepo - ->with(['category', 'tags', 'author']) + ->with(['category', 'tags', 'author', 'content']) ->find($id); event(new PostViewEvent($id)); diff --git a/app/Http/Requests/StoreUpdatePostRequest.php b/app/Http/Requests/StoreUpdatePostRequest.php index ec94d0b..bbd838e 100644 --- a/app/Http/Requests/StoreUpdatePostRequest.php +++ b/app/Http/Requests/StoreUpdatePostRequest.php @@ -28,7 +28,7 @@ public function rules() 'description' => 'max:100', 'category_id' => 'required|exists:categories,id', 'slug' => 'unique:posts', - 'content' => 'required', + 'body' => 'required', 'excerpt' => 'required', 'feature_img' => 'sometimes|required|url' ]; diff --git a/app/Models/Content.php b/app/Models/Content.php index 2774a8a..83ed778 100644 --- a/app/Models/Content.php +++ b/app/Models/Content.php @@ -6,6 +6,11 @@ class Content extends Model { + /** + * @var array + */ + protected $fillable = ['body']; + /** * @return \Illuminate\Database\Eloquent\Relations\HasOne */ diff --git a/app/Models/Post.php b/app/Models/Post.php index 1e0340a..3f2adc8 100644 --- a/app/Models/Post.php +++ b/app/Models/Post.php @@ -4,6 +4,7 @@ use App\Presenters\PostPresenter; use App\Scopes\PublishedScope; +use App\Services\MarkDownParser; use Illuminate\Database\Eloquent\Model; use Illuminate\Database\Eloquent\SoftDeletes; use Laracasts\Presenter\PresentableTrait; @@ -39,7 +40,7 @@ class Post extends Model 'title', 'slug', 'description', - 'content', + 'content_id', 'published_at', 'is_draft', 'excerpt', @@ -86,6 +87,23 @@ public function tags() return $this->morphToMany(Tag::class, 'taggable'); } + /** + * @param $name + * @return mixed + */ + public function getConst($name) + { + return constant("self::{$name}"); + } + + /** + * @return string + */ + public function getContentAttribute() + { + return app(MarkDownParser::class)->md2html($this->content()->getResults()->body); + } + /** * @return \Illuminate\Database\Eloquent\Relations\BelongsTo */ @@ -95,11 +113,10 @@ public function content() } /** - * @param $name * @return mixed */ - public function getConst($name) + public function getRawContentAttribute() { - return constant("self::{$name}"); + return $this->content()->getResults()->body; } } diff --git a/app/Presenters/PostPresenter.php b/app/Presenters/PostPresenter.php index b345c9b..4d30fe3 100644 --- a/app/Presenters/PostPresenter.php +++ b/app/Presenters/PostPresenter.php @@ -44,9 +44,4 @@ public function publishedTime() return null; } - - public function htmlContent() - { - return app(MarkDownParser::class)->md2html($this->content); - } } \ No newline at end of file diff --git a/app/Repositories/Eloquent/PostRepositoryEloquent.php b/app/Repositories/Eloquent/PostRepositoryEloquent.php index 5b93927..bae546c 100644 --- a/app/Repositories/Eloquent/PostRepositoryEloquent.php +++ b/app/Repositories/Eloquent/PostRepositoryEloquent.php @@ -2,6 +2,7 @@ namespace App\Repositories\Eloquent; +use App\Models\Content; use App\Models\Post; use App\Repositories\Contracts\PostRepository; use App\Repositories\Contracts\TagRepository; @@ -25,6 +26,11 @@ class PostRepositoryEloquent extends BaseRepository implements PostRepository */ protected $tagRepo; + /** + * @var mixed + */ + protected $contentModel; + /** * PostRepositoryEloquent constructor. * @param Container $app @@ -34,6 +40,7 @@ public function __construct(Container $app, TagRepository $tagRepo) { parent::__construct($app); $this->tagRepo = $tagRepo; + $this->contentModel = $this->app->make($this->contentModel()); } public function scopeBoot() @@ -55,6 +62,14 @@ public function model() return Post::class; } + /** + * @return string + */ + public function contentModel() + { + return Content::class; + } + /** * @param array $attributes * @return Model @@ -64,7 +79,9 @@ public function createPost(array $attributes) $attributes = $this->preHandleData($attributes); // TODO use transaction - $this->model = request()->user()->posts()->create($attributes); + $this->model = request()->user()->posts()->create(array_merge($attributes, [ + 'content_id' => $this->contentModel->create($attributes)->id, + ])); return $this->syncTags(data_get($attributes, 'tag', [])); } @@ -158,6 +175,8 @@ public function updatePost(array $attributes, $id) // TODO use transaction $this->model = $this->update($attributes, $id); + $this->model->content()->update($attributes); + return $this->syncTags(data_get($attributes, 'tag', [])); } } diff --git a/resources/views/admin/posts/_form.blade.php b/resources/views/admin/posts/_form.blade.php index f6d38b5..3e8501c 100644 --- a/resources/views/admin/posts/_form.blade.php +++ b/resources/views/admin/posts/_form.blade.php @@ -65,7 +65,7 @@
- +
diff --git a/resources/views/posts/show.blade.php b/resources/views/posts/show.blade.php index 67d44c1..9d95eb8 100644 --- a/resources/views/posts/show.blade.php +++ b/resources/views/posts/show.blade.php @@ -26,7 +26,7 @@ {{-- TODO when use api, content should be parse first, use transformer or parse markdown before store--}}
- {!! $post->present()->htmlContent !!} + {!! $post->content !!}
-
- @include('admin.posts._form') -
- +
+ @include('admin.posts._form') +
+ @stack('box-footer')
diff --git a/resources/views/admin/tags/_form.blade.php b/resources/views/admin/tags/_form.blade.php index 0bc04a3..e4baec7 100644 --- a/resources/views/admin/tags/_form.blade.php +++ b/resources/views/admin/tags/_form.blade.php @@ -3,7 +3,7 @@
- +
@@ -13,7 +13,7 @@
- +
diff --git a/routes/web.php b/routes/web.php index d653c0e..825ae7b 100644 --- a/routes/web.php +++ b/routes/web.php @@ -26,6 +26,8 @@ Route::post('posts/{id}/restore', 'PostController@restore')->name('posts.restore'); Route::post('posts/{id}/force-delete', 'PostController@forceDelete')->name('posts.force-delete'); Route::resource('posts', 'PostController'); + + Route::post('auto-slug', 'DashboardController@autoSlug')->name('auto-slug'); }); Route::group(['namespace' => 'Frontend'], function () { From 890c0822125ae973ba3b3fec272dd7f5731cfb1f Mon Sep 17 00:00:00 2001 From: Miles Pong Date: Sun, 2 Jul 2017 11:45:50 +0000 Subject: [PATCH 49/78] Fix Postable retrieve data bug --- app/Repositories/Eloquent/Traits/Postable.php | 10 +++++++++- 1 file changed, 9 insertions(+), 1 deletion(-) diff --git a/app/Repositories/Eloquent/Traits/Postable.php b/app/Repositories/Eloquent/Traits/Postable.php index ad82a1f..5c25524 100644 --- a/app/Repositories/Eloquent/Traits/Postable.php +++ b/app/Repositories/Eloquent/Traits/Postable.php @@ -54,7 +54,7 @@ public function getWithPosts($id) $postsPagination = $relation->paginate($this->getDefaultPerPage(), ['id']); $items = $postsPagination->getCollection()->map(function ($post) { - return $this->getPostRepo()->retrieve($post->id); + return $this->newPostRepo()->retrieve($post->id); }); return [$model, $postsPagination->setCollection($items)]; @@ -71,4 +71,12 @@ protected function getPostRepo() return $this->postRepo; } + + /** + * @return PostRepository|\Illuminate\Foundation\Application|mixed + */ + protected function newPostRepo() + { + return app(PostRepository::class); + } } \ No newline at end of file From b64ed954e57113ae5f58eb4bfe1e0bb2bce9db9d Mon Sep 17 00:00:00 2001 From: Miles Pong Date: Sun, 2 Jul 2017 12:54:15 +0000 Subject: [PATCH 50/78] Update sidenav --- public/images/office.jpg | Bin 0 -> 159054 bytes resources/assets/sass/app.scss | 1 + resources/assets/sass/modules/sidenav.css | 62 ++++++++++++++++++++++ resources/views/partials/navbar.blade.php | 30 +++++++---- 4 files changed, 84 insertions(+), 9 deletions(-) create mode 100644 public/images/office.jpg create mode 100644 resources/assets/sass/modules/sidenav.css diff --git a/public/images/office.jpg b/public/images/office.jpg new file mode 100644 index 0000000000000000000000000000000000000000..67e78fc16749c3d5a2864c91eceb200b7e21074e GIT binary patch literal 159054 zcma&NWmFtZ7d6_$5D0FAYj6+l8iEIRclY4ILju7ag1ZHGC%6W8cXxOA=6UbB-?~3< zb@g=5s+y{ro~d2u?0xEO{%svVmywW`06-uB06`DnZ3z$q;9y~4-@(GYdk2RA2R)JA z!@<2rLPkVHLPSJHNB&7q|1JFgd-K)-V7!Mp1@D7F7yt|g2#f)G>j8)W00sv9-*Erm1bqh!yn};(4=q(j z2Vg*8(7ShFBpB#dfC11zFkk={Nl19-H&F2p~i2LTh3G z!ob-_to_ad(RboNsQ7!c@x25x+GS>sNjicD)x9!V+JPk9$XYTku8wE==;W#&77AU- zRJGWj@I~-jQh<@g|8hDscMr?gf<9Q{8M)@c3on-UX`VD9|H>h}hHv?eD)hs-)Y(Yo zijT#@(HA~$b$<2usIR(B47=jKm4_#Fb%gA8E+t|%j z)9zE5Lf#|Y%Ru=FIhtHSZd1D=w-nUlQg;y_O5TZJB^@yu?&M(s?{CUXF zUNo1)aqg!!pBY(YH}syYZW~gH6DG0owjp;Xi!5USrolgyL6OEU+qI362auAb=E0WN zxO5@x*d&Jbz6kBy`7(3aFim^(9cpo>Qwq-OKk5}to19;)z&}})@UoCQ-T-S@Ie=L- z+7g_(xZkOj^lRFiGjE8GkdFU|$84)LE5(>NsxJU5>L*|X0TJEXh~UB10@@}wS;%;! zmSA>~0iLY)BY-(An03;h9nPNy&Y#`QpB)17HywxF^r!UN2amMt_{ur(TUBnvcFC>e z)(pn3;#>~Kd@o#+F3*z|oY?wHv&JY`_#n{q26V6F)Fk>OBQRWP!JYKB|D9sWEzGCv z$yD3-q8@nzei_6L_Y&_;#14)@nto1^qT{Kd-SHQ=B>K?_(=_}dK^>p39c4A)Y z%8q$(A()H1L5!^{`vPM3;mYA7MNx6YG0&ol*O*)DH0e*JEKDt}0amJ3hdEEk>-0Ow z&T+p5WipLjs(k|n@&4{-1oDjRB)IRM6!ZCu`crP~W|VH}c}?F}8KTucrk9&|qlg&4 z&v}H+$IcaKu)Y<3C9FT0O7*F*sX5i$i74xLX%Y(VmI*%+LP#Pg zba#UMAZ-bZ`JxJa7!eI-zOrsn#x0-R>aOor@@pd8ZS8T)-5OB#R)41UX5=LB69h9f z|D~9|wVzwy7uVU^2_`Wg8x2 z^slk$diQLC8@cA0T2tq$TgxkD3+=98e)alN;-O;$t9Vz<>xO71izWk)q&%_ksF^Y)N*pe9fSJVhO1%J-7YY z5v#X-^sdqBliqMRe@45a3I}C{4DgTiE(?`?$D%T9iFr_0Q!=2I?9mHX_zG81h$E%i zGz#$n^JM1C*h_=P-0e}YE^;EN*))m%L(@8;f!V`&GSSf4^y6=vB3_~hb`=&{7~afD ze;R13HU}bDBCxbz(Z!K8$`Iywqv(xa`!>Omy*8;;b6wkol5Ahw@f*F^P$|~*HInyX z*C8uOJ;6WH>HcCs>|=6urISBwZ~d!_uVo@wDx?LOuSU(Mdw0L6p~S~jG&c1~8%9dR zqA@%jKQ3;uh%abus-n?PBiOlR86!yW|i*+(H=Q z<~9(`k(cr62J)wgF3&*w;jB9~-yOE8O3KJB(0BRzcq_)Vd?~-Zea6~xhj^16$vQzV z&}16l;HI{xF1=4mb|*OJkb%6lhf~Tr=Mt#zeyDU${>0wm?}w!iKfy%O-g-2UI|=mh zI9}&`AH#)CA05SNTb)uT%+Crf+SkHg{2)o+dHfW$#WRG^`q~0VaM^86H$;%4)U!~^ zYEH|2N8jHo8%83IHNUXakx57i6L{y;=wR2a zTyOFuc~otMgJh}2-`N(44o>o;L@eOhp-a0I{@woO%`iBUq4Mqc8_z`_lH5plCnE*D z07cY-aIc9(;z#<$>=ob4H3A?gy5eUmBM;BIm1dFF5@wGU)#GO((dp0$>DW!H`lTho z(gv;!SLI!yJXE|R4M^!oeauFj-LJw7$wtOlcFfLeUh1~qko@e9>hiqOq5IS7*Ar`9 zo3GOqMt?aQjW$8JBy$8&%b_1{mrxkjmAMC<|2blRWY|}AV$QA&LqGph(Gu}VULu9* zhqN0Sa@_Q6OpomEq{jHbz{tij91ipC9xmr%-ZI)mFvcm-K{hKzdxlyN72{dXpD9;t z+c7OZ$%O`5WJ+JxaYusdZ8}!}L-z=9bwby^oGcx|K^#iHEbaTbUMZA_%8uF6FY{eI zsC81Yizvd@#sr`&Dl(dJM= zEgg}mVRW~m4TXt&RsD12Q0TEqj6iI8P-TWtQP~XpR6VYx@n5x2Hzdypv>Mu1>x-Q> zlGi=1FKYFD+kg0g1;9~gl3>lns8S|JX?bi9yuWiKUm-zLP=xijZFxCj>V;R5PaoNr zHW{O`YRKJ`p#P(R5BEX{Y~J7Rq9OhID6(Tt2{ciTT)1>6{r|p&1{LL5y46ZkYSGZU zNW*^=(~@dTZy0Lu4N>{^yIr% z{@-_vjSPg~I~|E<+7fc_66c=VU?abc(OqN47K1A``LIB1Xu6@Wl26eXMw5ng^h%Wjx|1E~DYpB&hRJs0OIx{g+A4+uzo_aTaO<<*ZQb(Q?m zmugkVxeH5#HnzjEs+Z!BiK4r>bU6fU{7&1EXTjX#ojxIlI@{ebl!Yzf=i>Nk$!0DL z4z`H>JZX3}!?k?!ID}mLc;t!Onkp}Fofo6+N`u{1m}2KNxOr%}qnIF+pjx|T^tSMs z4oT5`TA{6$I2QH&``#qilvh-e`OLyfJ7G8&4C<& z)*gVBP76kWfZqAfaRB_&pn|2g=;Qj;H{iN&xS`e7iXv+bIxrSXYDEPXTicV9;}he$ zU~)WFO6#5~#9Y91oTFIrW#e9vjXTH^MwA1@0V4OOSrb8OY0wF?`ru$Eh0PwtmXmX^ z&{4IVd}7h{??*XWEj$cEXKcadm_GAN7M=hBs1293ujU(elfHRZQdmDJ&qI_ebOJX` zb?IYePiMa}P;2wHWevA(QZzB6UNh|o9ZDxiJXOcxR*FSTqP{QIss8mKviMco7C%qr zdy$k-V_p)MRDVy&PFTzpN31|K$0SipmARm^fqDYHkW-7>z}V9iIwi(M7HY+I=z8a6 zQngO72W9xPdSm0w8xZy&X#o2MTz=esjG1O2N!V68@Ykqdt_|{3c>c8LaI4+5jbhk> zbnaSSF|}e=zQ41jw)Lt2CT35$9i!DP6M=yO$-SL)wRKwEXY#us16D@?T<8 z>%XythUVGB9S6FATY38Wkp=tHkra*fDayBqqFDAWu$f@Y7=8z3OYA>KT__HV8{@$c zs_lDsKV%^$IoaQj!>jZ-7r?XEZ<=7e|6MHLX&NzVQcpy9eZAYo&mim|p-_fUUMiZBn!2rU_0R~xm%$(G zX!zyJiZ!W}MSqy}#gS2iqst>d|5C2hj8mm%+>6rZ7$iG?u>`a#QGITtG3S3o+7y3Q zEWhFgO-)b5$E#IiI=e(>njbfoQVd)yvs?`Li5}>y`+nH=g)a*X)|?Bukqz(bKCf_j zh|>hYhKj+7CT3X{^Ibe2u*H<8%lpX$DMON1H~Q1xqx`IV_M9Qts`hv6RSdHf;Bzea z&`1P@o3X1b1Vrbj|L})~KoR=N4gquu0%B=lkU-J_B}*+IEl#|sYg@zFGAX=dJkf0g zqLo!goJ<|vqR5w8V6Kc;@MwmYGK(7fg2x}{5|Xe21=D!rCrZr((7LL)xmpz?x&Es(gYU4Q~_dzl#g_4=sv29XCEP9jQfqlyElf)y~b8n?){M)kw+6 zoovP!<&JaE+&+@yp9nel1E;Kb$9|a6lTn*@B*D1?9HLTWDm*Ah4aFVzwZ3a% zdE^~E&gg0V{cW;6+*hK|YDp?P8JBYJ8+&KlOj-gqj@|=D%js>x%`ag|`qF{mUuNf( zFAOc$3x}IuovIcx0_UzORM(;I0v-hP-T#AszYH*I_l~e22!@}NdS_>(X`BTWen%QK zt^z}g$c_(nShA1@cFwav*06){9H@ifbignRp%*aw-yts!y;um+!mwUI{+}t2m8lJ^ z^P609FZj-#K>jYd<2uWvkTd@NY*1a&q4Zhc+sdI;>MP-^EcvI)e#ffv(lK7ZquMdP2(%Soc7elsRg9UVX>4h6g7t@`$3v(5sYNY25mb*dhUX#czW_|-CzMYh|7~91Wjv=eJDCH7w z^Y?B_vlguq#H65L&xP#qThF~xFzzPqncJZx)RIxg*P@?d>x~;^MH$Cs(x&Njv-d^w77+4la@Sf|8|EC28RY&j?bO=*?iQ>) zRQ_yl-7)oLmaWcwj%G{rv+1rsJheZCXAumG=Om2PJl4@@7z_so=r`Vm2qvotCJG>L z31)*rdlmw`Hn8KRRh{dZxQ^^_(8|kF@iD5qf_2|9`5OU)S0b}r0jZQg*|bI`zKexv zk}CP>qSW#*s`JT53MHPpKlDuOIu!l9LnMbA9+8DBqt$k7e0Jshw4i_GnB?$36-DVEa)W=H=z@ToNi<2 z^r7xEF5dq>uYmiSyYPc4DJ7v_q%2C59zI7i$V8Uv7mh4QGGzRoC#W1@v|8 zvLNIYzt_dlzDDwaw=w?>2+8CQH*WX8_{lof=l{Wl15{IU0SH0-Z~n%$k1n62r#gg} zRmT!P9(8D>XL2*-H?4#b=RK0-!u2mau~9{s^fTW(!L|Mi)3I0l_@k;6)jyL?65BgM_0pA-?q>Rt_Ydxv&V1xerK2r67RZCvS z8J`!FvlAC^F7QX!vUX^)D-t0*(Wqa@_FJTJo&|e7Q-C_GVFrpCZc&OrO>K^sTvpOV z#Z;H${q5F)em!g0}no~YEh-fda z7>uoSaFDnQsS(RDCR0S{(2($&xc~LKJEkZLcQ0nsiZ$h6Hb4Fc?cmG7hoqArg)(KT zR324BmtE`Vu$VGd6tH}Jk2yz<|39Lq0}#*iz8DR>P^}_nPAH7iMb>+Bz&zkrtRq~S zl_qvxBPpsxL0@!Y%L8-bI0>TA%pV`Pd|2 zxaRjg)uxI-)Rn%zH!6u_MfU~0jo!!y5s&j*O%2X;7oCMAc^f)z(tafC?mLpYv|N+i zNq*r)*BA=fkgtVO_J8lCKeJ60IGc9Q9~pb>5SGJvB*0&(=vgNZOnojL5c=+8;y{^M zl|M3Zj6H)CeJ3o&`j2TlE}y0#%BalsGj2HQt}zMMr65kdp?Z_tH0zKv>Gd{|xa`!| zq=2G@DZgO1jIRCk87uxIrybL{?#IoN;7sPvgJUF??6dDHvIM@z>&1icLf9Ljqs%vKJA2=bU2p$V`cW&AX}0iN!lS6rTyUxykPGzJaT!n$ zGBm^DtQ^VA)JlX*RQ-Jeg8brEsw|nG_-joYH1I=J zU7LRFDZT8bLvk0=!e9I!93FV$SKWMX^|EU=`Fok>hw+svB3D28Jrih0Z|N}%-1x-` zC(QHPA>ZM(PO69By=dGl5J8pN3)Ss&pfO1kX7XcX_~7sicvaL~x2#3rC^<$tXBL$yw%#WJO?j66k;77+Lry1DN#- z0_l7f0+eecqJuAk2du{l-b$>XY5yL=|wNO50to-qmmsL9!Qy4x|=gT{Oa#(uYD+x z;1Dij#q&^vT^brUSd{1K6>zxcDHZ>JJkR5ZV7FB zJVo@J%8Q)!eiNI9UGO+F^i!>SS1b5iL^2#GyjSW4j4x(?6CzQQ97YSCZEGK{yD3XV z9Z&>qOn%;lCknl|AJ$^LzIV&uJNzbToDyOO*4VlVz<&tnjgsVIRgB2S|hGtvQ2qNE2P9lus)}}aY z34=5~{!}8&VC5=WJK*RjW@@fM|6}soW+ff1;|d!El3dzee}*wBy1CI7HLYr^EO1qq z3be|rTJt)ooN_L7?-m%P66cP&xh@@-+}1Y^)TY;sRqlOxYM#sOF@Bj}e25wDHh*bS zc`z7XTwTIZSD(u+CsHZ+hX28W#s_I>q!liCL%*H(iehLORbBVH5u;&TA_3`coT?SR zHo5etD3yE!*nBZA`=O>qWe3CjYR~+gL)_xhs|$?2zb%#Lj+aAckMe(zG?|RhJ6eib z71$4L1~MeMZErtBvZ!HEuJdB_D25uR?JHoZ|FW3w`1(5HgK=rzd?GWF0!J4>9^Lb= z+3SEc<><%UO|cnybA->df19oFYB5484?Nmz@%t7$NDn({1S>mh;G-hkyEmW>kTP%u z)40pWgD3-}UED+A2>w&>V_jHIXul5|Jt9+Dp;t6Pkg<}ZMu;Qm1ZXe7iDTSqx3hV@Et&Y)&Rs{QD~fg+ZZ765IYq^!}iI~wKzzUn53WU3wQCHsACdF#4(Fg zHi(GTKUoJMBkn7i5o$_OLRNt~I;PSgwX?)Z3Y6Cv7>N`yQ*c-^E0I zsoe)!q>i zXkUmz391e#LWIejY*Xu-kKHZngDtc|gt;Wo$nNa9e&_u1Xq8K^u<+GBQE>AzGI7H3 z7nmh$7jzWixWQ$7N<|&_ z*UcBM@;;A@gc;%ki$m)ODGCn{e~N5i{2jweL^ZSG^Ol9qa)$LqHq8YDbF+nL~u{=NQplQLl_H3BHm109xN$%YdO zWNJL*MU2@-o_{vGeD_vukt$Z2VvfIsa7i?XZH5Ms1mDX<@HRHq+wWctcku>;_id28 z*k#%x>}S98=JEoWrqG!s%S^gLyjImMTTT|MPoNQ8*RwJ$R$;l^UrU!r-OjmJg=*LL32 zmDmb&lKH`1B}}dmVvDb=>K2?)5?yY!Tx!Q-dOqfVc|6_zZ0Pn_-|mBQi`ETAP>b6(b1%6ZXmpS$6_*2(k;sy#v4^H2(;!cHYlK{u^SCBhBf z(mN=o7<0#QsF&}IJ;UYJ(&YK$rJ(CAiIaWazkAEyXpb?rnKXRra^ddOQQQ6n|HQD_Axgy=Wy-*56T(ix-7yGfclQ8 z6arSaba*zO6DMPyYJb@DRo=TJwT&+lLquu_Ns3mgAN;LELV5vnL0T{ytqIN*Xfzr- zzmcezHNmveq;NyZ*zungFt83)PvJBpN#!BHjz}(z=%~LW@8as5_Hn8?C{Qj65!JkM zI5F}S_lL9l_=Q|eJ@ak)lpOyajfi~Uimu(lX%`}WOmX6d37$TO;zITOOBQg)Es5v| zWl>Z1hJ*i5v1gmMLsM% zq52dTcFucgT+>k98o5j5`k~vBFzy?{QF!TQyyZ7m|McZr0b;Zo)y$7EOqvb;{mCbe z6Wkfhb0y< zVU_RLvsKsH*Fx=a&S^*@tq6v-ARdHrmWAj}L<^Sn!84T9PGonjqGmguuPIhQxVKXM zVG9H0ynz2fbOK-`XbHpjA5f3OnxeS^=9VyQP9o^iS?^zpz_eiYX((VT!a~JkPC%k* z1dxNkMk7YM5_PUiHv98LPC?m~47X7A#wIBJ!O`NK*jOvLKr@X(rz8+o5X^-8%zA6S zYJWLwZ%4?Uwu}4T54#s4+wb)^d*#-la?T6co26-~I=PP1L4oKm_H+3Am3*0`h?OJDur+V;MzwY+>3WTluP6fATu@m9f4QjWcikg=ovezVI;@{PVLK zJ7t|NQTxMY_W1)%d9V(z5KXv>FK~1t0E@9d4FrUIm`fRO#sP%5 zCH&w$W5#eArr=Dg?zNw=A<7siq_O5=L%v&DKc_{&4sZM?TU_d)8S%Xw%ZbI#4q%CBf5rc8w8Z1{L4 zF+(YT@|3KsB!W5~I-3j?DVo{mOq%7Zzq*d3yBS`5a?FO{(XSHv_7bN=8_Brm);=0^$`$%~C6!clg)ciVRXcHF%ct^q`BvrbeA~YM zl8a?X+>3|?J+C;!&0CIN#P(?4Euo$g(Cynxif}a?$_T>0P|vLwwnCO?s^Iu#S;|v*StlR~KXM`IEKeF<5u`)RN~>o2 z3IF|o*)+y%>yQ`w)RYq@3k^~8OfULEOe5tP%5emI5oB4EU9T=5W67C#mqqZoq%b&Q zV0V*7NvI}_O57`WPYY+0@F~ZqkA?V-7Z5aGvN#_KCvPKBmD&n ztt&;OxRV~ixY8g~?RU-5Q`8?{^VO*%8*0*Xe4ZJM#rA$=B7LhUlZgxCz1*y6uUur& z>%%AP?WT$J9Y#F9ss;k-2=Ok5xYjZa? zkM$GefnZk$ibtu@44yI4jycJLD;Ya?mMx0&!ud1SGB5Zv$paB|aR5p2omF2@5M22V z8)|YM+nR+Y>MPbj5P0nqMsoq2A}|i;t7i$-O!0hZp=eDDW-S9O5P`trNq@5Qn=BA~ z0$>O=`H(GPSjR52kfD_A)T}?d`-TWC&VTR}%9;=0KtCjc9}0v+wT~cJ`$_!Y{}K4+ zv@oOYa1iZe`jz%+x}HJ?TBhfFKFz;B=k9} z&i^HRqptiSOR+#{-H6Au68y@(NSB1Q+H4Uh0lfBFFn?q?)ZVx#4|>-UANgt#=k?2+ zzwC71hMP{-O;6l5h_kH}<1V&Qb85*s$Ux3xO7k(8-HSk{d|FGKnQ`mvHxWNEMsRa= zqNSvXPukcadHdnZ+Ki-%IB!6$+0NQyN*6rx+C zD&=<_h#r)~9TU4Gp9+0CTOSyP)LsrL_pPvLR*aJNy42QvHfzi%MC)(ADd5A}SFJBc zn9-*6NwQa}>&X2jlJ|zEShm)Uz!W6d_#BN1Pha|Hg6B@i@Z=hXWX=v29CqeQ-gXLF z#mkT+Dq-L~Jmy6n0g%qgp2Yzl@k_}j*Gpc@Sj-}m6fS!1-$1`2?_6L{|7IrCzPP+M zent_kZh0gx5x)2SN*i=4HSfP1@@qRl-+`fK+F6by%s$waz1$ybU|U1n(rLA@f2FVi z=Ouq}927vj+=2EOQjxQ+tyM;hy4ov|5<&+%D%%>#YOzQOv?U?95jFeW?W~0>kG-bV*#(`O!49{T_^kUVS&&j#0BG=iQ z5fLpyp&K4(ATmZ4sp>yM3*cp_0wHjghRVqZqwzr>%^F;5{RJrB`F%rY&+28xfbu8* zop^$lU=%>Y63iU|wXeZYK@=ei*tCRkg2u)|IdgP%e;OzxL&ILu6k$)t;Y@x4I4A!h zFl)Ibn1vP!$nWna!B9QAXj7sVsBa4Kr~_;qT4bwAr|Wtr#UuIu;ofjETS2nc#Kavg zqZUe*E^3bL#aE_G@0^H_LH}a%EuJQtKi=lq(kwX_pOf7mN$(hMqkD^xr zq-5#24J{J4u|h+#2I=Hyl+Ho)_uGgWoNOcX<3(E!iqma@JD|YesIX8dJk3V#cAX0mm z!%qnJCrGk0h#96*-}kj_A4K`6s=(y;TW;$1nx|i7P(DarsR)s?T$o39tnTJ)GUeA& zp}FkDdkF+LH-5cfi&=<5{N;2!KiB0A4bMtVPE|5vlsF^iGZ7OG3L|E-{`u zRb7)@WwG>Wl(X1YBRI<4Foe@s{Mi_FJKQn1}GUk_ytA{tc!o6 zdCxoRPZm?|hb2O)`20iq@1=z?Z{B3Z`pm`!=@Zqi7ar*=Px>&**=nWb0y{PYU7qLl zT2bqgdx!%G-ofqKnkDCCfb_7l!sfesC{4`&jQ!N|IGA@VjGsh!Is6Y=@ZDz9^DC1m z9a!a9Ptde?wkSqIati|!OeGt|d>XsN@kpjn!Q+wS?H1-$2h;Ac>_vw&|2~ml& zM$*Yz$l2n0c27Or2|K7ntty`;m)NQf%7zCt=z7Lqlu;zGQNe|o{l4yJ9hlLg(kgv# z!kN7seWCyP=?_)ZA7=LbA^vkcme2!a+_3FvOXnFmlaX(N`1zdm9ix;H+zv^;tUJx3 z9X{(kUI%r{xB;WLfi;P9PIr-EFk8L_N;3)A6}MK8}-6wlYb({YeTfA!I<9V2zY0+@h-{rFGt&D=%UyrpLJD zL$cJa$FgP%zI_>}@uz<6Tz4h(9P_*_ePCj%Nz=RrlLuWlqb0biN^=>@f~j z|L}SZ>?qt7fR%U@!Rq85iePtaI2}=uiSFC22F2t1l*O4qU6#JIk|eHg6C@SyI-RX= z1)ze3rJO7O7=NPMbgWItq1O;SgP4M=hy15~-juv>s2M((AxuyU#dxnR`H&jW6a)n; zEy4|q3V{{png|bI?gi2dNe+lO550MzI03| z*|w?F+_4=h{gbdPtRaIJlXp2UBv0iHxbV$MT+BuOeS9q#(~#2)L--xjP=IM5NkBe+4vEE)@buBy39&YYWW#A)rgOE`;P^LX?IAs5Ig7!MjP-P?P8 z$=f@@j4524Rlhkv@K3z}I6^85v4+}18Nb}S*NNz_QNZ&73!kGX5Fv{H2Ltv<1T2Eb zqX@gD4McwOr_lZ{h!IKx5ETKMoBptAR?K0 zR6Ocvk7E?aUXoid{HBxc<%<~Rk@>}XwNOy(8?eKhL_THCzZdxLDfe7=j^hnb3tgo7 zEG*}vHEKs1FTe1mM}(|atT0IMmK29`9;^*z%KZ&|kI;?Z;2=}fbSe6UkX z+wzTSuMsmlWrO*|MpaqNANwJPwB@SkOvdBh&b#edzZUW)jMe8fH}yHwML7?0)y77i zRi)$58y?Me9j^=rEI}(`?~A{ccEYSO_w+dlIV*Pln%_Hsvqdh=KG0 zqm>~K9ul0psjTYO`T*|utZvU7A(hvR1XL<#?59L=!FjgNg-lrc!>@5N!NxOpqsCNC zSW)QLMw36wyIFTngWBmN6IAy|Nf%RNBcCE!Y>S!NC)$Ojq(ofg!3Hur!#y%O#EN}6 zde!qqxjm@&r4SwSNL5?R5ydS&wIZb7*4lmYQiFSPCZBdqr7^#A1H^C~**#dGli}>X zLcX|1#Vt!lyY%H-(fB~lBpk6_1-0wzvU4X?0zs2w=iQFNKa&!J8FVIEIlh-{Y}L%A z!YS8woR%8}>FiowE1oMY4Y&4K0oT@jGHW50yIke7DdMLZgojS6ABA1r);CJDh?;7y zLv{)6D1&R=;xYsuiLPgx***qTz_7NdTnKJ<>$u(+OlyR;t4w=k3O(0!nVcB<03O%( z1UG(Ce)o$P0&CNAeXWu2(-~$3HaWB24`iX`3vcY&KBvczdbJFS5VMJUq#3*}_`#QT z`yCk!9-veRM>w-*;}zCFXg=I@Su41WXWM|t*= z5RZ9(;jL!Diw|Gr!7Z7|t{5x~rrFDtqZ=VgYRC8@`XV0r|d8?rWg zL^bwDJ!-eB{Sk_g>1=3f`05j+5=@3o?{|fj)T*4F+9G?vH0~bQ3i>LE1LY!>v`tb& z;@6W^Y;Q9bd&H@|*)X!^f(=|<#II~E26a-j_#GUCF25_g@o`tsk5N*M&mvM~{JSl* z8FQt#N5~4_R3qRKRCO+mPm{^un3&?s7+TC4u_FuJ_e|#CeHzv->eI3OM;Py7=Kcl{ zE*vF^y4trJx7#XvPb~W(hpF@HPwod0Ciq!XkH5M)4J2dsO_=X4BIVN`B~nQ2(&xV; zH=zy{S=HJxC*`T%Xy>FCl;rD6bDtqtOk4`F`AlzK>8Muyg=WAnGzoj$du7O{x2@-= zyRVH?N8hUY*pYH5XM-0Rc%?4~N5I&j#P2%A!dhEdi?(#V%@O1|B1Z{1Oc*R?Dv=3p(D15NWJIj@qA+7-qsQCU zaL;D_vH8Lk`yy-`iL50Mb@p5mC%dzKB8CmChrskwn)gx{nSyaCpN5H7uicjtNk-NW^sW+D1~?KNlbKdxTWgG%v#Lp@yvVXR14F zHs$wk9Tc~E@ZJdG*6^!5Yt$?WTb{a`?_#_CN;{3~{mQ3dPIo0P+cf;&3fWC?Q$pD( zf?r4gg#NebZWP9!#bgT_umcV1gvQ+i_HiPZxH3Qj1Q3$}MtE&R{&kapWq^zmsBG(Q zHya9=dgS8Aii-$MfN$~+>=Cpi&K!<)RG9=90p4<*H^AP8&Ixa;MWU*cyP6Jl!8TdN zcg*)_0+;luN=t~JR8CHKQlb32--VMOvU;BIe2hOQ=~2>WjYr9u_|q1p2JFaV3`XHA z2oA+6l&I#jG0QIXkaDM!^H~flN^M!R!~C1DF0L$$Zu9YmH&giyFd^7iT+m^!t2B_M zTC-$!izta8ON-bM`YBTQluWAhRn#`jJr%>8s+%3FS1Zi7Aji?6*eOL1@%;EVy1N}Z znJb{~R~tbh>P|?qg5HdVHov1ahNzuHRF%li5ztTHpFrRYDYr#`tRUwJ4f$+s z#t!cB7QtRGyoKsX>7msG*k37r!BnFoO9m;hj?eV!kjuxcEa@Q0^5nn*5L0i4mC(GH zt-&R-)9ze+m&@52UMds#=_B2|)h{!ib5^?770Uhb^~Uf(FPA?g_5$cU-;^ zk*a7|c-qlncI@K+y1b-W>6lAbb?2}Z?gei!w}+o==#!pk)8RL!N-+n!!1hSvZ;-tl ziBs^Q3?O8m8418+(*ICR7BvbQ6=-R9I#8k4Ns(X*F-@NTDUy7J(ereaMD6=)KZv{s zhn}?^L~&Kh>7b&WbGbyO8%dLHo%Pe`9a7- zZNeK#J9t^us*;=pZISx8za|N34UrBGK87=6B-x>nQn%F%K+Ui46cHcjCM%R`hgGys&otxG%q|{+6JDu~EfKUZ;b24&ZFTzW&KW7AIkNF_rm>P+Q?4g5W3A%!$|H&@w6;d1l8cd_C*cGs>XEmfn@c5%R9nx zT?yD2qC68tHueo+v%Z`k`}L(8Eo#1#tI|ZD*|1_Fg$@rpYU?dxjwH&Fc&X#LZV6ap zQJpS0c49-rk*qx3&4(~jco#a^iZ{ChisB&&@#&V|;0Bi}b@ME&x|^6;xFXt9UY;F= z9(R;w9n<)U1=v@6@uEpHwPRu!JW8jImx*1*E`3 zx<&~ddn(?~v(n773n*dPSE*kP_&oh@u*1Fv?bhMj+A-ed*DZSuYy|8IJLyQ0n=1#3 z$ktTv+Gw2S^HtvJtkUZX73B+s=h=VAP)IQlTOK>!6Y2iLeQU$thVQDKWfruFHzf6! zuXc>|knCmODv#lYLD%-){=;f`*e_4;oQ#SUjYd!NLzMud2u_n{7Vo`K%n!uv8fxuJ^Az2pip-d<1g%Lpa|gjq9Hs?RY2~ zFW^EX8nsm{o77i~WqN7syQ#nOQ)FLL?kJ&UAJLH~w4_?3AHcgQ5v^0;vOC;PpF zhVUB@n|7^+WA_?_vAQ60cvZ_pUOQJ^;^;B>NPUCX$H2Sy@6OM7D~w(f*?Y#FXbKv}k z(Z@KCj|j>YT@vo|bt@3P9l>pyKr|MTHXE61@-C_W1Ia)(zZFLGCk%BXlT%UbCobbr zS3CH@IxszIkt`AjVm>M;0AvXuDli`!XMv%O8hhC%jl^y-jw7G@*Ct6bq6rnz!)OKx z{0(NAY(%hRoM30!V!CzTY27eF(L zXaX2G*97sZLSV9~8@R_R8bE*vx=%ec>rq8mMFT0w(CLn~RG6$a2#J6+;4xIRR7esL zs2U$ynG}EwcW?$ly!aB*%gbR_$#$sp1L=wJ9{eD+&xN7C>g#Vg6$&S=mBk%oGb^6y*A2m- zet+pT3EqsRj%#lAN>Gn+vRRp<%Y4}R!tpA(uh7 zUJ)Q2(-_DacW1|+R601W9II1n(ChYf;J4AqhX)3Df$sDF0GSc;(T-HiXB#%tHMGbY z;X-eDF5xriFF{pIKIqgw8TrS@jBeTx&f&vrbb zH#(TX@E_u`mM*b0Svp8vuGeU0`Mv09B^;kXeN@tn>4c$s8)=r-@-UMqbmaVSdV)As z?xbX{I}~M(^2`!Rp5GcsHFY0&a}|?|kCCEj`HEPgxF0xy`TszNhHSI2%Lvt zw=3LS4=k(XVm*IjNv`0$3U@IJYnZRMcW!NDNu!x~5{Ec%c*w0V&B97Tn&yi~sQnGh zDKvV=Du+TkFvzc`PSN1CPLB_{*f!I6;XT}h@Ei%R63@E6<=vCoj@Nd7brw&Z*)RV9 zZ!zCd{*%Ri6}~#`h7W#D+3 z{{TwMk5%y_paEozNgD@@`CU#y_=?`oIjVHZHzOd>2BzvZH4L;WC_F<=X%5Yuyc{ag z480t9su19saHavQB=VpKBtw+~vcg5qfF^n2wurls0*X!1QHy7kcJt*7$X?FEOeY7F zeuB7j=je}rf#4GOq4Ch`Pt5~B6NUY6Pj9V6UG{|87 zRLL{1LB!JvGJ%9R=dB@e)P5*g65IV1$I@FLB)mxX)axA{!{2SmbXeDRPo%eQ4bq<5 z>@D`(qkC<*m?towB!i07$ybomGqIaS9hJ7OBD-~l8|4H{#|T|G5_x1A>ELrHPM*xe zi^k;}T@Oh{-cUxMjDk6e_K!3n!#JQsfO=2{Znk(+0(-N}5l`I^rKsG@`{8q+E_V|c|@!idu4Rm8&>rN-h4L1lfL^R^@^!HUFSZqN8MAxY5DTrJ6hlJ`iQ%Q{#MJDcb6!^VDXziT@@*&Da9Kqi+?d{(SD#Q0fSQT% zI#f-einliKS`ac@UZ%O6o7~kR^mh6K%dJvDW;{VoM;;jEikA_l6AUgi1R)mmvV?cP|^rSNe?laeg34=B9E__MJzuvdu zIJb*OtUZi4o)u+UX+LwzdunqvpgC3&C?N6k3io3rDB9YO8ss%QWG}|90 z+h)$;on=X&bCD>>2j5cXOH+8t$83Jdq;v0Hks@pKO1WGfb%gTX#;I1U-rQ^_vI`}+ z8?C7x&!*|*ef5OxZc>_Mn@g8x2{w(uIUq`Tm2`Mbiwv9lI}Fc8_Y_7lfCwbu>SGD`|7D*W=;P9 zD6e!aZdc~pRsf82Nj;PPm*wuLl|3X!o3!>(FK+F1WA-?@58ktIlyzGgDJgHc zcV}%|Tak$0#qA-jA(1jA28P^h$ff#Qaw3@OapgYoRV-=jN}X<0a)mx?cAK(e8?UHu zao}n;(U!ZSo53}%Q9haiG>DwA9)#3Y6rG)SV|I)eTOeD;**0z6G93!3)d2_6z3vAu zHa`@3JYGIo-*e0oY#e7%#~!uiDIaX$SxFVVz&Ab9u0?31Lx`J=k!NxbgLU~4#8VP< zD%L%{vERJe*KQX+D7daV6*Y0oDD2EK@Yu5HByMd!P#sTowXDjXbHn9hp`IQ!-fP=#oNf=qMhAdT~ zGTc#QRS2*l6bNd=>5)tZELW6&a0a6&bpH`J%wgW2FNm3P2ShqDFo+n8F|5S_?sr0;QBrne?Pk zS{g$RDP)R4BurLC)mU+)(rTE_&ti6l8}%0VcuSGM@^5u{`LHIY@*`E@AoUYH_}?SmHK)bcUnDSD!sQL#%3s@ff=?J;7>I>iSD5ugsI*E!O;a(~7rM%_jFU=O30Uo>}rsc{62-5!oWK*=wE|W5I~e<5)aqt09YK$Ve-O97iKd zkbL2bRtI^;gW4Qd{i!%G=PgHWhXgndbrKE--&!aTc=H|Z3d#go@TU(Ik zT#7yZ19ny74QiG7nK=U`lCzhH_g4dmf^eZN=`kFdFrN`cca`M znxgbO+kij7*6?N$ErJN$kZ&pH(zf$6eg%1LrMErpxya@@R&FjjqLh@hVMg)X9q7+> zayX7h-&C4=Zc9yXu_0K#SLm(>6!uz$^$%b`%!QNaZU>nU14V15jCbe|lrtQ7CH9o? zG+(HwTW3AwSrRXrKC}Qm@ZIkd%6_p&BSnP@c?vPtz}yc)e`86y9Sf6PNYjIL_tdeW zY2kB`;XZ%ag-FMY>Kk56r-2=6gll$&$|wxB;IQIj9%1S$8RF`Vp_93%c3sSF;CgAV zrg$Gpz|@_U-Y~gEU`YdX{{Xit>)|?_{6T+t_k2fR?}c@og3D-6PCC#6WVv1Kbsa~g zD;*S1X|05<1&nQdcDgdfff^pNNPH{$)>$&Bqik4ZC!tEmVh6gC>g9y@Qa1MB$cjJo zj%K{9xs{%tJT#7iEt&#@CyKe`+uYtLd{#=0k1n~#FG|fvQtYtHfJhlV29=`{AV_ck zAzPn1NreK;KFDHp){7kgo)SSAQ>VI=bOvDq*wk_V0BUV^3kF9ij-0boDNxd|#ERn@ z2CGs`O;IcW8tK-XLO?f(bktOgS#k!4(*~85L<9uqKK}rXDhmm62Lp`iPa0@UcHzJy zj{r~ST5^$QU=h31ms)fdR*>$f8l2}^#pqf&KG^m?4Y?F^z}?O5y9YzcK&Ly6@8oM< zABvV6TgCMI8E4_vO6euk=zB4@TFd6ie{9f;%*PTPSng;Q}qrf_L^6^Jl+R~{nYf>*FoAVbxqqln8xuW@ME8i zaYK%ARThrPa8~{#YG$y9{M6Cf!!^a|`bU*Ru1_^y6_j&MHquSV+2Kx;Zjs`jC>@8o zx8IoTC}t!U`OTuV1at8Lm94m5I%(9KMjS^62Cgwr%R|)v0O6}(3qO;&ZrpCkeR&}Y zbs=NIarHT_>QkJh*+L>d}sLb#`m5-5L+jgh6*IQ#{ ze9TxpQAHnpI7u@a;j*~vT^u6hi&eX`E+KQu{1L)M@(tR@m%5W^Z1~?eAUnx}>$Iw5Ej?N9PR+;Ou-9dDFtED#gOXWGnzjW6M znwI)At;MaiMU|f7*}$A{C$l;Yf9e%#O>RSqdkkcTQQt!S+=u$n`A_WMR^BIl(^)2@rU5Zb$VS(C6hUjCJ0OV)xlloLVX=;n-Z*ruJtsx_NIR=au zMn3dy8{u5?)taKM&9X9<-2@Fpv4RNC+fFO+tmhKbDtFHg=$9o&)y{`F&+Yx7eY^=l{b$co5*$d#Qf`cb`p<5PKK=8U_ z=Wq`^Og@zds61<3*KODQ( zD{f^asf{?Yoz0Z+F8o{5!}dM39-nAb$_;E>W}f5wA$qXwg#m*@b__232w|#Zd-Sfa z)AI7pyO?p9?ibkL7G)d3hUh+A>5*J(B0kUd*y!gw*cxl$8P>H@GjT3MaCo+W9W%zM zOwGiz9l33-9R|(q_RC@;+Av9FCj$82kMSCc z>xUN?zK4;Y^lY)#51Ac?&bqR`j7ep29m;iygMM6Vt};(!$;pmTbtKVwVn6LvW;1XB zlb{p=Io{Lu$7XCxc4=fC=dy!|HI_`ODC^<)S!8-18QRX>-|dOpdCEXDyBIorYtG4$ z$of7XhK?oTakn?ciNVzV6$&QO$WUoX=bF-tT!Ge@h{XV907g3NKv4yC^fXwg!ag)u zG-fCj8H!`0G5XLdBo4HONTkMt2VY7G3sL-3jWD>e zI2`$}zo@6kPdKSIX6fIH8{BsX1M0M%F2yXp$&N6~rw#|-(wbHcgx0&mQGxmVDL4l( zrhx8@k8=)nJf(9P+=$n}pycGQBS$R{n#V>GLCo&*=BBDTks`ncP2+-mvVO*_fX)sU zO&{4K_B8y&4Dcg>laKUFIOd5(Js2rg#v{o9?&j4_i74QG4GHq-!Rx9T9hXt6^Io3n zwCI+su@u7@Q@p2$tyGMq5mz>7>)ykojdZD$I-;XKj7(Q?$@DjV83FLg!&-$j^p@o~ zHL4veD8gJEkLk`hk9n(azo`qrOzgTxIo)IRQ;r6vPq|CLUwtOc`H6#bLX z`cYv-?_ivq5znFiC<9%z_H0w-*AdO_eU|suQ^uc}q$bhE?X9CW#n~6vqatfr5yGBe z9aQ`4P8D<~h}hliowZ@NHe5SO$%{ij5zSb6l=_2RY~@;--K*MdnP+qJ2t=3rOBz^O zuX!fFZ23@nv8a@i+_=HFNY_bWweQF~YEf@)-d&Ss#{_@p&!aK)T`Pk>7?z0d!@>Um z^lhvxLLi0|SS{Dd3}6Kw{=WM1=b6c#ipG*RHnzxs50A!_L897{gCvY|%~jA)MTyXH zr(&WG@g#mU004NrTuJ>ZN(icvfyS<_3d{?FGBA2kLbEZCX9V#bX^0sV9|0K{qDu4{ zWXB3dLlcwGQ5a`Hqn2sYssRyX7B1D55r%{l2pLwehUFO|7oM(eS+?N+ExpCxO z)AU=Tf&g=j*H&EbGv;i=4mE{xq*t}tH)ygUw#?vX3g@WGoDqV$t|A5N-L)4RoM-vvUV3{ zc7DgUkTTmw6`yzw=Q^`|O>K*arLOGd%fnkYE86P=rvCsuXF@V-WyJWIJ`wgNe%4t> z6G-y~3Nm-Jr7kIg;dR*KrMlSrR^nTgd19H{E_b)klhJdLT+?xuskF}6V{t{RS$2(y zZ}8ich@BWN10Q&CMm*VZ=>|?r5TDG7!REKSlJ@G(8~ce)OI=18RGuY3(vsrm2{}qC zP4_`A8ZwHCZ6(;$?Jb$Gww}@X{@k-4Hbn|7tPjn`N3>XL@S+@aIr*m@JTw%zX()2W zUZ)w`-KhPRhSKk`S9ft)JC(oL7ykg}Etnn}KK657mK?k`cTu$?izG8*R^6j%@?UYY zZm*lPyAsG){P7K@*V#bkHJv^)sv%BstOUG*| zBHrzMYJ{B@L_9~RuG#P~PhGp6ct2Rl%ciffR{OB~YSgn^#FN3hfNlItPhG~>heKT1 zKTn)?)by}^vxa(4;g^Y{jw!q6f>jYo9;F*9LJpwd*BrT{x;;OJO5*Jnd`QTnDj9dM zP7XSp@HEuX9D%FI6fp5eoe0++zZ#_>a-z~q+p0jwJgY^J&A@uxrVhI2LDYIxDUk7m z*7ma@$_>-V@yD%Qk*X>G0E0q|C$gRG#y=X-@wT?3l0Txj z%G>6N;~k^g8+ooCeW@Ivwtke1rac&CYa8b3dNGQ|sT}0DWj$q3CL( zDta8*aN0ZFm9>)aYIkQ{7#@CxyYXe_^E}MBxqOSFIbmY(4LHkge^sq1tyiI)r@0Cd zhkt5(C+i_Ry3ncX5PE3Es(?(k{vn^FkEdFd-4DT%v97Yis<+lh{?sMa1@vV6-ZziJ zH=_2Fn)-@-s4j*qU+Jsk zB9#S@iZ{0i-E-`6KB#CzV9RN|-Rx%)a3>sn7*dovpi}NG305lO2b%u?d_^Ss7Q@^J zhln0Wg%m3hBs-a5s`DKFH7+z#kfN-u2Bu&IXnNC@}hoB9C16h0tJ+wlZ(TAjRyznE(1d~uPJ z(}DNXPpT7L#>aD(=>E_(q-I2*Ma&Ug1C1r=$kLn?g&8z!*7i$MVYytx!zYzuvN-7@ zR}O7Z*N`k(QQulO6&jTlZPM=&QuP>>z62R~593_ib(WSzF-B#0^PvkrsLG>rX!zx)+Cof7EunCt}&z zMAr6DExbhK_eNRI+IKl-KKk78k~-r}&8bs+2M&Z!BQ1LHw~u1!5eE#(1#Z8Y<6scfW(7cn8% zI`GNiLdcNZ8yF{ml6S^=R*G?Caey3nXq>QsVhi%zJ*IYLTGtmn%($y3MoKrBeJIk1G z8GdmW4EtmGrOelg9VRAw8#~e7K*45H#2wcaE)kZiajCVrT+e@OrYpGqb06DYKM_&P z){Lr8R28(b$`8!s2ba=3mUv%ib++Rr; z^IJ==9)$3vR68qNS;Z=d;{qodt-QJoe#7#plx(FcH8-0g;xNQ6SKHGk{-qp!8EYA0 zXxcdwDMdJmg3p;1hKG!U9KrU-=UGvEm!r8YxLLQ*oTRJ6@fzfQKKf~iq4{KEBu%>f z+-j^p^AK?#d1~V5hKo>M{{Td)t1!>aoaQM9Se~|w%$y4_vy~zMW{iDhq@P-ycXQ?y zq>L#yYgrC3e(yD>U4r|RZfz{De;Cejy5s)<$`zZ6ehjqQ@kK#@ zd$Z*3wvry`oF&>13F*DklADXv98|VDso{!vni-TdZJ`FfrK?oW0y1gZD%q^|G7D)5 zdt>!3c(0{Gi;t1e=B2Mv&Hl^TyG9b1mhs#SXkBu{+}>gM)XyAdsjD=@#7`TzwvG>O zc2DMW86cI+KoJ~L=0)*v@p;!3<#8MYR>#orzpBb#F{*~-L=C;d8)g6ok$h;_;xoi& z*0?1JMD*jDGSssjyi!8O+C+B^yj&j$1Zk1T)N>mrZ@^SBwi$9rQV7$CKI#@jNklbg zjdz$f>E;hU15ehiNS6y5lKWWz1G+~H8DBn!ZYrm z2q5J1phSQu3MU#5#L;0ybEX8ICznb&@(Ze zI`X6j_p|+_muEV|K4i5$bu0eW%b$nl)oxs6Tbb5o#M8aP3EG+y;9#7y(uM^f=?%1F&# z`xCa{gSar+XgZHFnpa*y?lA7Ufag>7a}Iunt8sY}v1#4NHR4y1^;1r|F<4rzti-PY zFHc9KVQvJlEQ58lVW=aB^#_=w<7FvPS29GwU!MjX8{Pa?Y0-O)C|GX|4_ZHkN zC6SZI7m7b_GsJtTr(0|$h6c#*U^&m3IU1|#iSsKJ)V;Qk{YZ|Vg++Bm-*Xn~DHl4c zFPVLzLXu)}VT+%%d^}b~+26ixM!e!6w7cGf!?@1xuzW8F{>`FGYg=8e*xpTNDt3{LPP=@eo` zMkDSsgmwZB)gMYNIu9s z6nYBfo@?0ahBS-uS==PUhjiS3zO~5ttlcF>&NxsFJi~~sqZDS?;TpC8I2qy3HGHD6 zQ%BI_2aQDHR9L;w4!Fl3c@;EOf?2bGGp8Dx9SlHm)Q-F=;)!gWh8gG5s75eS0B{ay zYq%y>lHMjY^oahhK&F<*lmFn>PLY|LFd!BY|4m$4>YN#+{SoGr7%zrgC*If>KFhP_d zSG|kciM;9Vqm(&>Np7d<6D|~a$DMuSokNdOl!~ovrcofoR|iFqc^}?7)Ne(AE{%^-)|JU`s8V}qL)ci|jp&Qu{r$(Kg|0HwH7+(-?{Kr0b0 zqh8`o7=NX>iUwRQHF(==0P)!f=%S-U(#A+>Sl-W^Jf z8y!Zql%Ub9WSN%NZ0?~(?1xr}oP+A8pTk;#v|iqhR5(!E++jQk>M_&pFT_=*MFf+| zqyxPs=Ba~;;{)ul(nYFMCB(d!5Zt25?S~pIh3)k z@#3{o@e=SW%-0st6}n%Z*f;gS%P9Nn%zBEAQrA>gk8K&(SJWN>J{Hl2@}3~j1Bz~_ zE2!y7nnpryZKJt_<3{1FLso4GxU-1u4!}F5X)J&buDLt|~)2N9SqU=JG|;?ejYPC~J8M)An*%VTP6ks9s>LarEOXOA84 zbuEq5xr>)j+nw3cbnY;tcxvFk6T8qFrt7F-lai{`N?UI+2g`+K0OJEtai4VxMz3JP zOgEcMGUsslu)R9fDU-^EKuShXw(AfdEz4a$8l^HP4Qwc{BrGsU&ZJ{MuUe&)Qo@Ui zaEuDRH<#J|O=}#6FBKTpR&s;7H(cO0?+tz2YN{-YlJYtIukw4bwu=^))+dwNl}C3c z{-oWZbFYSHb*ap-CR8^unIz=NR&+-pNJMlnccdi9`W{{R#L zhmLVb3U$wZ@v4Ktx{K!x4w9$;=XK}H1`bZYu=!VG3NDhagQ(d@o z^pWP~!CIqy(K9l-uo8btVZpr`x}19TIc$|-a@&#)=JG$!-PBW0n@6ODw~!23rrmF% zyB<@?s&87_MRf2p#Pfg3x*WZhqj%atvhXZI{o@gh$;X`!16LP*WHnwyg$N6(^T#lNyM& zU=w(g;^jkn6+|ImIAcnb#>pxlJHuW^omjRAgb9!`SB+mnNk#-<>Cn)a+9E^+$yU^l zz*Ca!B*pGXx&!X4+Gwo;BTaN1@%qpPGpRek<4tqNPINg6foai(0nZ*iDRZInl%93S zRR<@S*YT{m%jF?nQsA9Ncw>Py(_q4yH&P2~7g86EIYpq0OsOUOv1uZL&zxgTD<_$) z%UII|Zz7jF_);|h@HIcUp5x?bkjSl-To%xDs#GAc1DtR^m0B`&7d^0W7Z?KvBaf%y zM<`jh*xPNgmUr#E%5e?L5DE0pBl_2)!*N&e$l=e!SH%;cXUB<~UIO59^l@H+zyV(t zN$#dPi3X_jtJHQTNP{~r1ah5PGvt5t)VP$GhlrIZ%33k0jlAiOYt&TG>{bXsU+L}h z;GAg4e)mc~r~+^bgD;IZ$2#amH{upFsX`3r{WA`JjZUj_Y>S8^lz}RRkbPXMz|kn) z;TJ^-Z0@0#E~C1}j5XG=lo~WsOpfRgkUU*EQso_x_9av@7|q7N7yNU3sb zN2t~CQM_^t0zo*Lm1D!b*!h0v7|D0H4QDrvjvzlsMI>@;~v(Y zaq2a!98FWQ>~~1Fnq1R(lv_$>fI-d#@=Qc8kt7TVK$k;cAH?BGb*l!rwsa6 zmBnDKPjiIgZ$pxJnNBf-(AS+MN2?iFA$0(aI@V1a#fA)uIFJUJQ&P>LD%ihowl3m) zx~!^3Fm%%#kEKgAQ__vizS`N>SQDR{ISd#!sl!4#8hep$CA)h#CW2E8f=LuBA<&!y z`}Cx)nQtbmu&MTC)Ekkw0Lk=&p&WTrX`7e7<2__eGc)X`Ps^i2a zXD%6{Ww)`FgB1we19SD^RNN)G2}v4Vt=R2_v{!cG2<3Cd-9|_HSYf|96|a?vr7xKr zUf1~{E57?Sc8>=FIX;z0^kIe-ulk9{=2zrm_*g%c*O|v{PRRC$Ws~!ZR(Qt=q54Jq z2BYw;VZ=gRbupI>HPY9Cr_QI-mp{U`FbH(cDFK-DpbYDpU||0My#h1!phgU4fG5}B zDGZ-ZR16@0+L1wLT16st>+YmdBx9W+nLrtzkEH`I?2WN?vo2Ox7?jRlK1bbIWyGeu zMx7puvbL?B)`PybBfa4)EzJJ_HRWW+;OUxa(7C(qq1|QhI~S zcG76%)dWbC{MzthLG^Nt0q8-Z?@4Ydtzt<-q*pvfk<2*JT_31lR37U$f>ZQ^$sp(c z^!&x-VV883mA54xR^-(0zT&ROJ+`*YHZeWS@7*GhrX&4UV}(>4*^Yo#YBHRu7bz&l z+2>uo?5A!8^_Jb9+AXPRYbr|*XK?$fTU17mLo+$^ZuIG1#vCgeq{%S<_h;mPp~^`)=POL7k@kKCugDV zc9&^y%Xhc8qk`F}^KTyt4~ed6aM62cbw`Sl-&3;LJ+Rpq@a*@Qn`hl^SiAch8{9=a zv1c3I**r7A^R7wblwPM^Jh7I{+Div_mXAHyJ|sS5KA**6)oP8?=)hOr#t$9`tt9Mp zCRN7~kUlv70BV+oigT_H4S8dqyZEf6jT0+xl*nEO%!kU=p2co8B?V6CE{o=0ZGGKp z(-jR?4i&euJ())l@2a~dhKE)HIl%j^$oy*V^kmmyWQPmg$~WRXADF3e==K_rlJ9D8 z=YA9AkZ~URi*fQQtgtbi_>Ued$kndsm*O7!PKGn?DtLqGRccC!rnNQ6Gg->fN~Nvb z>!%M|!Aq6X*wLW%vE>w6(*S$|rDLGf4 zxlxBVk*>JDxwy<|z0@poxHUQV^7vL6Go2Xlqz$c!W(+|mjy-FaowK8rBV!G)R>;?> z>q#v}TvgLklgHs&q)CjJ!vU^w_|mExWR2w*171vdd+F>g!ae4B5y*PgYApz2*vS|? z@zRDgM**)slmIL;al@@kLqKSAt_b7*0BS`L7YK8y#&o4YV3G!`9Qn|q&{-=W&IW^?cx2TkBO`$DIo;Ic@v2c1WXo#=u^8QRo&@qfl%qBq%2 zcesoZRG6q4Rb2@v3E)?#G%z+>D{aYSRvV^fwg3c_jpjl2SbJ&titXXJzF&rWcR2I# z+}g);qz{!12w5Xxz1`<1!240R?Ov_+Jm$NS(l2-AGQ_9EJ+z^*P`PzL#F-)XWnVhd ze?g&ptiCWtANs50VbRB0MGFeZ=eYr29xG<@uX1JkWTjcSTg?onO6 zvwOFaS(YfH)<%$p3I{SxOlFweXtQr6h5Q10Nu#-ixJeraU&I=6f)bM}&tO#VCP6(q z)^8nbTAh`|yG9nsaLe{se)N>&hT@rW+iM18Nsz|e&U`)As)N`n5uMwu1Pv*Nm<%`6{C(c0!b=365LX2M9 znsYU{7cI15UD@JW*hd01e|;%)E%gOYZ3?LH-6@V4R!o2Pms&9Y084SG-(u>wDoJ-e zsoiyw-A}O~?_$%KVXD;IL!`$>ZSUhD%DFt$?;Q2h8TXGB8}1I)#;WgSPi9@?I1jH4 zp?LMReQBqv+&5ArUzZ%X&5#&%?#kR24&(=t@YyXX5cN(ZJ@) zynoi3^%U$>MbBtcXS6Zj#`0Q9*n(AU;)fu3B^-6+YfN%)LS+Te^u`+c*VdmjVAtP3 z7GOUL0E>j*PtuUn60N+TaAD4otXQp~YPS~btT%xgjy0U)XxkL&o_)49PUNgmY5CWW zpA9qK;q&NdY~=*D8qXQmBi(a{+ayboMze_E47$xt#t(48^PlPoo7jkl1p z`l-RG9Ty|o`$1E8zAOm9EvX*kPnnG>H#Xg?PVHm5x5@&$%$O$wP&rksoy=YrZKhwB zX!d^bM{zfCAYTGDS6t+So@SiXC9ttiBwxg=#n~PF5;QWd@)00y;6YQxbDmWnu-azd z>eO1bqtH@pxr+vi4x>jXLn!pf=UJ>$Ow;{DTGWNHXzsCw+yLaA2*#Pg;(aNk)Q0jW z5p0(Tx^DVh=(NQ&Fp$Zs&l znfTU^EMDYC6qd$^Yj!KMn_OZ`bdF}xWCL{PA8B} zaQTr_JnKUeamIle%M<~GWafbwc-y3eApB_! z5={d$8V_1PSh2slvA9|7n{~$#$d6i?!A(;H==6Pq+8bT55{!tilwp+cZ$n;ATrLk& zP0gc2okmgPa~@U&{p%y6r*>;Db&V1l6~a$^ro2-jh%OAyGgj=82PkiIs@+< zjdkGS8quD9ejfEZ1U9!20;hTt!yaTc=;1;qWLf?DDhbbAAUw*k6`Q-p|`Lj@Y-CY+AI1 z(&9-8xP&@|Wk+nC)9q`VXgJpF=c?H4du_M=M=rKD?d`?B(fk5)fnzkNPr&ld)OPJJwwBEsGR-Z!G1=z_Vr)5Aem30WHPVcClFP-qaHm62IxF7M zMP`4+B-%FHOXUl+=!}vhW(m(93J-~{dGPUjXmn%ZWgQ-<>9%ie_C@`+%(%Hn*!MeWS@wN} z<`zknPB)YeMEOrT;>*LzI-U5qn9F?`z7mWO`2-vs@gDyG=DFsho~Vn}3Q*~1PG%z7G)iX9u0casY#^C9xLyVj{b#I!XeQlxI= z4?IWAJ=ID=XmZWExd(nDrg@KjUpJu?3&vN)ABr+OQStmKIQH0Sm3z5i9p$m#kJ^iv z_f}Nau`bimgtJ9B5+U7?eqMxA=2F+FRS`YKyGBy$z{A?(pLI7R^pKQaLsV|=3@vR5 z`XY2@86b2S;aEJhsOXL@ZJ7m=GX^B*n;et)n&)%9jnrt_TiF1*oq1-35Nx`Nsx<*f z>7cC<3>Lw`#+>>JmQnx~-@|YmNa;%5l}d&)cn&j+4RNTdZ$TtUBXpC;kmIF0&;iKK zLHJUzpcR418skGrGMX^6od+}KJgGLskPJX0^%R*zGYsTv#*+bi`tc_kdyP*qR2r4u z)a%sn%~EJg!W7`+EP2oX%O3F1jSh#UCah_Yg;&9y;10RgnsuNwIf^!bdW`a|G-PTE zFih_@zWy~W(9j<^fdJlNk7}o#A@a6WlW5wm0R*mkYC+^HH`55KagmI2G}s7{3k>Hhy6P(?i%iwu z?DUn4kzg_NN5CBPHOrF~>W$-*pf+U58A8~RJR~Z(g{qWMX5V`z6^#t(BlYDcg~r@peB%ZyJc?XBRyGRGmkw6M0v&i19H zzs})`VXDV<8u+&uYntrfaQ^^X{tiwvH7->a zHM1PV{XtsvB?!w&BZd=kdNZf&*Ze{48*;FAlEH4{;BRekl8;u5_)o&QXTkpf^8HS@ zabNu-)OH7KyB*q82WD*urIh)tocB`?dNvQ?Tv;%<{K)EtRV|sdn`dWO$OG)22C;bi z8mW~HrNmh7!z+z)hlj$am92+qlAB8Y4EMlFpZZ#bmP>GW)7Wo&vbKgd{*G=$_*i^u z?lbcyr4mi9(zhQ)BHYFHB+#^eRp^ZNmh+jN8sNQsW=jM|*c>lJ4JFOKmVZNe>TrBNd&RCD^rRw>D?g zi@_{y<`a!U95b9}-ZiUCmk_TuG#62sEdreC@dLaG9Mq0J@#3kLJJk*|YjaUFE(i<^ zqlj^y@p10P_#H=xRy1p4K6Md*rQB8jf7* zSko}@7&!eY6oXP3NFWT*F{sTM9orSb_DLU=78PZyO{aTnaQ8OviKI{@I36H4Z*s`% z#;s(MGJHHALv3x^`?cOl?c5@6m$SD4jPc8A%%^+W zQOg3gS#iD989X_owKHpBvim!AY#I%x1d=a^A#U#^>x>>1u09(ZT1g!Fc-+yII6Czg zb=h5^muW5g-QnPw4p8*eX0x9KKB~=e{-uvfm3VbEl5CmL)H1YcPk<4t0jWO<=9U>I zc1MYeT547ixR8$_$QU1csHGXS%^gsyottNHr{}iek@U&{bFQJ3@vHb=uTLQa?+UldHG!{VFOa!BAdw_|qh%-(Ys&R`s6hbIHo zc#7%8#zKA!;>*C~hO6RU28&FQ!1S)8jFG1ijPamEa-a+vf4u`lgQX&oBN}JpK*`Q% zC?Su>jY}FcI_W^k4b;#(BpoRY5(xhQy&=%ZCz=VCXk4UzRd7%lup;}jkhCO+rd4*XCjmQuw-DDnPSHk+sYH zTw&NLcl2E3(qgmeiz`mWc0*;s*sYs&VK2Vj7d_Qps%d zf0k$1TMFN^{hZm3(ao`#PP+tdy{r-AD)*TB%c)MRGotB54I@=`+Y5VZKm1Q|e-769 zLhS-~QB0#2+YZQm7~M=^W!>_q@{MQ;H@%(OhT286?B>?bWV%a&_j3DBz#f`&tY;;5ZwN6$+TvysG0t&@ zew@W&IlhMRiZ9#RLS3)rOG&F1i&s^v~ zI+B3iOpV@r>TOu)H^TBcNgqZ%S|SmUTQT%xl#H$fTTH2(m48ll)MyV~z~xf+@sfh0;m*DcGgC~z8)RknJT zIbuiI&0_GHEQNV?T;?*WMstCKuC*@5mMqb#UF|FsIirvaI8^*P)>8}P~}BX#w@@P0YRNOeic?t6SJ;m zv7F0pHDmOVX90&_M)j@mW^j6JWtS3~)axv-BAzbsFk^ig8$rFzSbGoo8uqc|QdW;A zCN~#MdjZ{%hLR=Juk~a8MQHXQ#$+mnLzUqb%JMxLk3UfcP8~^B0h} zhYV0C8{A@TV}DgVsWddow-a{|w{{D}qsMOkb;sE}>p4o1Nm<19lWtoM8p+4AHB)^` zBeT~QlJ~nl;i7S=ck|l0C1wy+?uV5mv#*c z7G4tT-l*P31MLCk_lz*4<3%YRi9N|V3twD(&5DZNS8TR`)1gtZw}oTj$E^b`lpC~$ zQ*q*?1$i3{yn_rhB!0A+tR>K1)KzO@$5IBOvB|O3iRy88k*@j0c{x$+Vr2(Vecdaa zqpC6#@pB&v&BW-0#2Co;)=eD|kO5A*aNq?+8mSUB)0aHdnkG)@1738RDKj??jlgpr zw2CKmfyV&pKj>op=k$4ka9Bi@@L$je6E_o=jUk4P_iz zzGbg-&bG&3w!MLAE%A45r;6y{4x{+4>|A^$zK0HP(`OxF@h_>)I+bFK3NSt;Ac8*{ z?N0VQ)|zy{=S&RrprUl3Xu*@iN(u;P<5Dzcv;bT^{b>v#j2u!a7(FOu6ULAPj>zHA zm1Wggbit(6=)muLE88gU6*hj;IFmm`KRo;E%i=g^4Oh$TR{m#a-3bU+-Dh#3;F6Eo ztCWU8OaLTe0Pv*DHB6ny*Lf_E{xr&8xoJ@~39Te1W9 zbEiX0V)q9WKgP5Hdthz7r`g@B2G-dQw%bDAc*843l7LulleoZ)>khC z$+P<-vat5nvg5wGx+BMTb-R$xeU;#%l?fwnZ`+7$>|eHb_i=50-`pq6b`_97uxy)n zM&P(;fZPp_szJ}iNK|cmFL5GwJ3F$QVVc^}f5rQC+dJL&w@u-^*6~L#OyjG!rDc;0 zWx6!SmQdN9R>}EO*|ThEw(i%plVxlPFFt3n?fYVwaFz;p66s;>WcC!qY%SiUS9tI=CWwfF(yKz zao2hy=TBa$c~sv)&@xWRg^c%v494W(uc7NtVW`-dA-TAaG>yE+mM|+R%-S(XyKl3U zc!|@PK9!wWX_5l*MbnTv{x#0!dmAXw$ieosUOD0Lrh$?|@drRT`cTjX9KIlR_4iYZ zgyL9NJV6@gL&~;NGjRn-EOYKT;qak58v;@?cwlinDkfA!$8@iiZY#q&WK=^f=u?2` z%AOd{ENfcC&O}H$9FAg%4GEJYRq-BTvXN+%MUvT|Hc4T_@CKcTz*Mox$>3>q0yC}#J$cYEV|0)Q9(^-O z07G;VGw!CCG92hK03$(-at#a+D2E!HFCBW)Q5#@6-Z~u*6VFPQsY2xv1T7XBj~wVQ zDrI$`<6TO^L*R!PgpRJVB>I6C^Sr$Z&Utpm5Wr zLx|HcGrfk$BT5k1!;(%0KpbkBA$gbIpw9|mA>{lWCB3XtwT(99C$haJxS+I z0%kH`H?D*Isk9bWW$_klU~vYsXsZ<}1{F)DEmql&OReJi^R+%;QuIkLe^Ms6aIZmUM*f--;{upE2@ z`G?&#>c#a(nAb))6=Eb-RCm#iK8jC99?7clASERUh$dHy+OgCQsCkNOx6nZsQ4t5} zpyoZK_xq{z@Db1L>x5(je7tL_Tql`NuUhBI&7gU$-Tap~&$Wm6rIn7#nWA3Q>@b&U z1pB@;ytDH(c;bIr^*9_nvF3Zr*z>r|w=Pw(JnOYxqu859Ti7JAvbx$4IQge(b~t+! zxFCiSPif>Q)BwQOambd3U9i96GqtgsOJ32#2Gp=tSnuvuB^Q#w7k78Wd!onMYyw3$ zsV*m<_QPm)b7*#!`t!4UIrd)0or79gNOH;H@tp|@8MO<_k|`H0J1MdD&742rTXq4p z*#~{HHl{4x%Z)|6_HM`j065!FO#oOewocVprk2|6fCgJx{OuEG z!>AtmiOD3`MlMc{=d&9KYoELHU%VjV12WwT3|*^}Ml`KGN?1eHd0|iFO%j zJWm;GIfT%Ymw@U$#2tTn69$h*TR70Oh1^ z0Mb#!ap^$Nr4ijk>B03FJ$hDhR*sBwILp}H3x|!ypqysBe5#r5Vs@;g*vTW~T76&j!Yafu%tA zA#@qtBbIs46c;S%lYl6&F-s$FD-?0{O z2IQ;8RneC^aTT0$WW>&fvF2YAv(5JBV0Ny}EhWGCt8vrLJ>#8vIJoG`NonkP`M*t) z)*ll3oWo=>RvWAiszwN|5@0onFTw!O(spS6jS*@zL$c&X*BdHhEUUlexghrgNW3A-Yr z?}-vYi0(L}kFxc|pXc1klF`c+Rw*QaCz5#ZWw&mi9EM8U4p)v!OQ+DsHZ?f7zNZhi zb_CY@bLabaW(}{h<;0h5VhSwVoEXLqVkd*L1Ez6bLBsx|325|Z&v8Gd&N|0bZnmz# zvF)v{*V|h*;P#hoT&=x^!nNNPknH#a1l>z@?0Ic9xl?FaZBEbj zUupI?vF1ydtm66iZF@uybprx1^IJxID2u~_%i@z58c+$Ni2ncw+ZNrPhqUuTsj;r6 zHg>HmD!k4HS)z#enl;CXxC&)i=slPDIEKe#TJ2r8vCh=ny`l|m*WJL#c1ZpR*Yk*+;OG{%|5 z@15Osrco0i54pS;jwhE~P%%Yy*TQ(S3N%_NxNg<8)f6qcx{NyX@TA7wjfbGL8qt*z~3 zxY$;TBeU%Ug<_KF)M7^vaz<@e(~Wt2Mkq%_{{Vy5;ioyPYfk4z7kP*u_V-sCX&tH| zrMf1ss|?|D(y*M(V-d-oAY)H2A?sOl*?gngMr8o;JXjiTRthu#Ko5jtm|seYD###m zT<4dq0~SF8I%lU!f{9#cNi>i$P~o$ZdJa`lVq+IPTg%hdt$32c0SO@I2Z*al3dBvb z*yZDG?0Y9l##kQcxaICwSS}IQaacFTvrv+H8goUW{_B<8d~b0ky0xljJ+06JEDnQ* z{i=CNvU|1~9XXFt$29p^Sik|$4}Dr7#u>=wI#9-eQ@l$NoE!itC)5B6OJto7E*PXc z1S@ZlKRz`zsO%PE3CfUh=NkSrn<|3?AzX9eilG3?+0z*3N`lBcy0GzNAThE#Ak&YGSTe4?_vmf6cO85(+u%25*kmnFCZ zr4gF$4lFq#-vp)!$1}s>RO5RRod{UB4oSe|!m~<>u-!!1EH|G}PBD?{I@LWzu`yV8 zWJsqR&;6+=R-w#ngwe)@8^fol*1cR&Y75Bo za>+Td$tZGiaO^noRvy1-dhx9+&WA?Jx+7ptHBHl&Us&7P9+gS-A)>a@y6$4{H^Q;e zE);lM(m~3ma-qc>7i%`mR#tOMG_%=njmhq<;A^CaI5?cfn(is%M-7YjC*V&JlaeO| zv?AMPSCJ9WhHaHl>;^J9y!NtKGs3Cwja#4hQ+gO zvWyzvv^L<|+!Wr+rNn9UQs+800ibkfqp`i0xoGXBb-9=3_U;k4B$%9cNci0^ua`NX zb`AZV^@ZHFSJv{`-^56g+T|K46ppIE8UXG4GqHO!b#-L>F_z-)<|4OS1GF$Oid4ta z%V%{C6qUg%ozf{bCeK*e+ZM^TrG#w}NOnXW&4ZG}ruVW-aort%I`eqUztVQ_nCs#? z^@qAb7=_0N9#il8HO0$EZJI01ueIa5XqMPUtBeO3&!{7atR<1AZ5SqsJ4EeE^B;PM zsTt5FaC6kuNw!>4LE2sIJ7KwRChGEy^ZxbRe=ZolTS{9*Qzq+4)g(Y0Fxip zkHW%}SGXoFADlwKTU{0(@}?O-p0p;`!*urwYxo@uJ4)MiPqqg9XZIA`lidkLt(mB~ z?6tg-eDh>a-MaAIIZ}F5xOOdM?s}YnSJodmRep2-;E(r~0PGcKZ#6|Nt4G7sZP zjMTw9r2F9U;yo%$MGnzH-fqsLQ=zU7E*(!-g3Hk6WGu2^@#X7YV?B7QC0I8U|bxxLx_vAwp3xt=wdKnk*r z8~}d7e>xKr?BtHjCf|0=*^}Wjvx1~j(m9zXAHRi0D_(0XL7sA zs<14l83bdNE0%mKTOFAA-i+cqMc5sgw6mD|tCdiD#TYv9smGRh-k;#<$&MLU#J`@W znQh+3?R}E$UNbBs`ieEjs1@m9<0CB}!z0Yiz)l*+;)$aNHP&$$GoCaIkZ@@LVCnkO zEfbnRPI3HDG!P^4<5F5PAkaG`>&}qO<4g{-vE8?qWH__F%-b?Uh6hrfwZp`4*YQVw ztGKsXp0RB-6Wd31YcG9j-&Hu&rhS$i*0>kvfs~axW7aaDs6tcB(J9n@_>WIYw7);) z88&Ek*J7;irT+jB+48-P&>)1pv||x`=vDV|so-<-wF(z6JE9t)L}gyjPbMnoha(HMXjl_ zyEEHV+8b`d}pyFK3mFrLBQDQp%neAzhVYQa7c4yTj2^Ph-zkY5Ovf zc57s${iW>;P#ezF-`&jXYj0r=ue0svW4eps-I>tw@cW7-oJVc1yGh%4cz!g23+@hdJa|$V3e#K99MO`J!s{eb4l3xu zm4~>D&<91^Pn6!;cFG%TeY<%Z+gmqyuv0&~Ybfc8f4F-fp&Iw~ro6bQ+aDW5$!&gkx=4)pmEW*Y}Y=(zCgJ znpL~Ko?{KDPzij4g;Aadjd*!;>s5WvpvQ}<)3M!lTeSD-c6KjlnmF%}X2)n~k=`yw zgMbnbv(CA5Lr!SyZwIYC&e<))eKL^5oib~amzz^dtpP;^nO6nzpglz;;kis?B(|hu zs6A@qsH7Q(Cm`n<;d{yBuO1lnqyjD^xJU2+ zQMdv7)>$Pa^w`o0Eou;SBgK{I59yj}OQ@O!oT ztW>%eL$Eh;+(%9otq>OQIT_G#Ju0kJVBOu*jyUzCguv8u@dJ5BBv)i*>wan5p z3}Iq8AOl&rYiz!4DGQd}bOd*6#0AqdoCc%^%`Nfb<_O8_Q~PLq>?mPyFvlLwwA2LT z8pSYh9dHj0bW`dUhpLf`VU+NGl~l>Gf?|uH+yMB?U|#RTt01xd?XD$-?EnzxI7SXWJlYD2zjXKx4!r}e6e{(#3CpSE_ z*&MfMJ0aU0t9LJI`!7A7-nD3icQ^f+Lu(~fX8A>u` zSs6;Qk;sFB4KmJ`vOg$$ce7Tr?C9fzYIb_@yUn4nZ_~WBk&Xe851tt@?V-&AYR=Pa z{G;|$YHU57vaPmt#@D{Ty727Y(?}#sD{b5et#*%sQmp>~R^_zd)iflH=VZ1#+d9fe z#r=lQhb;!ezmhwHZ8r7@x0yg~$yn%g$m>|oB1+#wNWsa`*K9R-;$py=A1^!)$9axU zIbys=HzwKaDAJ<+?%mnjF4N~1Qw6sz-H2FkNLc$QyjayK3XLt#Y!XCM2F;P6Y~W1c zNcCJ~k9B1{ku{7YP#vh+8QmKz13Kbi!{RG1+=+aQwFhcoFS|C(oewgbjx+Egg_Z#E z$h#ij*ltRh#4Vg|%#51!)MN9iQ;Q>(LACD3cHA?-?T#D3@u#3_EZJ;pmcod)zT*IW z;}oe6nUHNZwW@(Xx8Nk8R~d@t2~s|Gi*)8nj5H+c)QrfG3FgB$jglP z@MW`HODWff*h`6Mh?v=IVL3X?{%Yt^?0xy~M!ljtAZ-#l=q^k64=J z;j!h{X?Hx|X>5(5vn4Uz#8X@c9#iqJQxD z+)Y}hdp69zvD!8Xf3u|Tte?bGdE#$R;>vsCGpcO6dp0K#58qnG~x$!ewH z*Xm@+i~vlrk_z}+K4tr|4q~dhug^0!P`&IwW%j)P06BP{XYCas*80WFGsfeDip%B# zyEuH#IwxKSCVUZ==%clVZ?-+0yDMy4Cu@5%c@TxJZP&WGSWp0hNRX<^u?^=`7~XTd z*{@O@YFbG1GH_S&m69IG_R1(FwV(W+!Lyp*W_BiN7Rh0p0($`B3c)Wi5dY-c@dh< zIoG|nwzdZw?5D!>$leuShZ;h@tmgY!@=(+5eZATXsqK3$*~nox%@*mAtz~coHcX3w z-^u4?Oz!VvjUg!>I-CPYrx?_5)QvT!Xa?q>apjr-lL~-!$?HgBcZxckc?drdtqoYy zrhC81h48rSqj$3zd#jmOI%?iwyr5~v72s!FvuDv_cLZ;rVlLObi)P%z4bINKNBQNf ztljPa-`}=js!bbUsXn#02);V#(U%nd3+%|*dqZmWZ*1H4XKzk!ZSHi~dui}KbsCSU zo08loG3{3$8^TKq=8wtO!~7fY+(OK${Ql=zIg3dn(Z><5h*u2S-5n86W*lmd;skED z8rm^WQ#m$=Gj5&T030;Zv~IK^A{lz+lyaod(iC0LDPhfbrqNwp5JWi&(F2iwhWg(HXoFgYfc!alUS`g^a)Nd`JTPHjE`l;vhUs?xRxa>vYf0#Cjf=^kEyQATs&dA zx7_E+nagbuhm4J>yiV~kx^B4y0KOyM4{1(tI#o;NGw5tBJIK{i1tn8ewk_jP)(H=o zeZyA=+tci0Bv_7UWsROPs;+S$VTj9pms6~7R-~Wjp6MQ_01=9RsXhZmccG`D7l zXx(;R!f2Ch7_A#>Te?Hq?!??;Dd7ik#qQ2>pq+ea;Xak^9zZ>Z`C+lxy`F=y+jD2l zciHlo$(QR9azs7c4 z@7@TZglGS=`GBdj!jNC zH@B#6hIM_HgR~~q`!BZpnSNx)d$OBu&QA6_UN1G3#uTFhe7oROy4-B&uK}OX z)YYSCPMEu^Ok}9YJilt=$qHw!hb^OC!Pk{w&ZIFWBZ=d}iz}3RTyGtJ3M^cth6f+5 z1EU#puO7867ZxRzzC9~8jiVzDbLmoOnK~a&S_(`obkiDAF3blSaimf(Xb!sa%_51& z#<opa%&QV(>HGtQj_kg7<|b>&KjVGNE~q%${2*GzNBqJYifa4=84 zfzaLTE}#-PibU0kWEzo;H6Hp%ri=SKv^z${*;^M;N#;pTpbmz*G4V2wia9fIahlUg z>~HPv_CD7~XiC8`9w-|^J$2(UHAdBP}1Hq`Upelv7mCao8JkW^L;Md$Slm_x}J>WPHlp{l>Vf zTCIAo`9}s=IPbS|>0B_8TL;RMAN`UK-k*=x{uz@bZz(Mp-FW=bb6oRIt4_OaNwnFU zRW*iDy&DX=bo=T2S4J$|ALo&dOnp#}()^!xYqYBzw-AW#*9~d4E&h&WAmn)0jt;ul zT1{&fa=Lm+9GhBvqxNm3wv>+5?2hh8-quI%Z(2DRyox0nzk1|%$IR+CbBfy^9Mh?z z44e{b;LS`n-InbmY;A$F%k2G`vnMiN_F>RlUfoS2Zl+m?-*<9%aCc#hWSrN0GDcf7 zf>`AjO$gcc+e@)lhW+4{eZ92qq)x?lPAO%&w6te(iG3hG7bE&P9wXu%MVa5{=g`;o zuWNSaw^Kvd!?BXe=d(Ti-q%F9ER8BAWw^SLzKk$AAmsRtC@pAtjEKS|Mq|2sWloB^ zarfea?3c5i+0||$c%6_sq>9K&Hmcw@G7lq66BNLWICZ22X^;`G<49+ue3EvJZKRsU z=HM#K7r2NFFqL?m;~pja>&N5q^2?bX*8!KBJgoE!t)q7op{-o3mdqzdjA{tM!wxw- zD~cH!X|9KKv8I}RPP*1LN;0y>!^-M)1aTGg5S(*D{Z9&U zmKmJp!N1yDH)$Tsc8*d0ClZFUz9;DK?f(GhL_W~rBJwr!9A^gbPx~Lx_qcu~W{>wB zV2whQT;S{Y^fd}S5m(f}H%P$V(~@CJIIPje~9RAg#WYD$`sRM_ZdDd+*lMv+Z z1puk_8OAFX%@P9%l5%o*bj?XXvCDXVBz2*J1U{g)bHR@qRyr=L?;y&I@z19!=}ys$ zT9~3Wz{VerdFS6vQWLPwNWeKGT}KMgkXeQ`#xqjJh$P?>uAd4_q6X;u&BI^Xr2r~3 zy?}M&jc7=0#6>wEpTnIrgxL=QGZIM86OL6c8e>xhl~G4AsKpH=JFyZZVTl@JRc@7( zk}Wn5&IvoicTY0sn4_G0q(?b2WB?CAuCzv4iN`^WB!#zM0Ap4hJ=JbcsVO21h}l-+ zIgKdhPe7)H7F>)r@x}sa$Ry-g`Shoq{*el`Vo5z@9!^+s(6fMd{Q^T22->q0;% zt%A{lM-iHyRQe9e&E2G%p+bUlme&TeX(n3OVU}&vp12xSb24cVS+SFXeK`s&C@9sy zJMl*#&W9M%oMzWV$#GAp*yD(TcU4&P9X-dLR*$6ytEgS{amgBEd8IqC!ZKNy@&Ia0 z5!IxXx6m5W-idWKR(mX@>2b9ObPv?*(BDY9{{U5nLg$zo*P)AqQIeKT{{Z>>oS8U= z(@_5a`ui8;kUT{ZQaIrxq-p}7-Z;^Jn(c1?0E3w-HJ7_e-rmjcuN`geqb(HAA>I11 zp9=d~Ju4|p(M0DgHjVbtxi`;b)|(yFG!iiSXJp|d$?V62joQLR^rNAIEF$iJ$j5nN z&w;&TZb#CpF*1_|?V~EwGcrhn4JaQ-qwLC@9cpJ=gic3n?U-#KX|LT@%>iLH_k{rV zqLAvp=xWLd${1QosoVduq zZQ;_89>=pR+3m$rq*2KkxZBU8xrtYlGUFhR)}AGJu!5pJ_*cO#MgXb@6Jp|Caeq}b8~PN19| z72+sN8X6>CT7Wb>^{Pxw5_ep9h6vTEh^;M@QV>}|Q>h1qO%BR(>{~*2ks2oBzZol! z!kTRc<#{YGlmIRSsC|i)I6oZ?XtKVfxFgsxUu|d02$2RU0D`mtXzC6!0qH;vEC|rj z7?~F+NByV-d3SAga<0)?g5;cx*Pp~KPTU(B%Q%1|d!2Hf2-~3{Mh+^hbXboMqx0p| zRJCTf=gLyOwA?xNPXa5GBq;T8<+6;3NBdSR>x&dzjCA#=W{C}sUR^oTu;m_-X@knD z#YC{qqu)u50CAlv8LDIqo+nz8(+fIl$DJbVoMd|DlPNPgjx>r)!Oy7tsTF1dNz*|{ zu$8zB5IuR&12`Q16d~Cp5;LAZjV1;GfsQ2mB9T@aNxQqAxyKr5(5QlP#FLzwO_YdU zyazgwm~{Kcjx!hXOPriw3OUY@XNMTOhaE5&Y`d36dOH*_%xjY#C%?33&J%de*XxCcY9e!oru)T#X6MtS*hIDfa;+!*{j z%eCXdH87 z&juXUw!@vR8J0{}sn9UDyM-j*--zoC!1F2S)zs3Gzp2cdi!@!M>~6sA3JXoOXolcv zZ+e~yFn-L7f(=Tv`%AdmO?O8vCd>In?6uGqH$V7}!A|@!+%S)5N0kw?LpkuYsR-`k z-_Zfe>s?Ue9A7Ng@^epvQdbj0485M(mXh{!WZbV~(*Ee(_M+159d4vm@sw9`cc6%P zRdoSdhFHmH&Kcp9G-#mxknHxs+k0cQ+ka)vXW3niGQ+ZV1d@x3i~GezWk+@1 z0YN+Sa!l^lgjvb1M;hnB5-8I=IGSTj=P&ks z#f|O7mCAv0X(PcpD+dcA9o7MtAmH?*S~p#v`7`ZjX|`(L?5HDad9GH@+r53poN>u!0jtLTkE(kW50~tT3y)4O0ve=jBs$uQU3rMnMau#HD-Z@(SLp}vK)7%0TCy6)nY-lSNYyE=oT4Kn}kO#lu}0s+Vv|&Z7rRarpE2)bg}DK`c^Zh%LnA z)hIG~k!CX5l1iRKm2Vp}kZp$0=%ZbDRlP}C0hJ1HaqrjTQ)v!?Qs8DuA=tSfjC95-UZYw7iZWE> z^*O0XZGsm7E=Bz1TGpJoZYK5U&kkS$eI3W4BaG|iF zLS@~+T<>$vqNkX2DnTP0>$}Z(4}B?FNCO}QDN;R2{c%#?K%*OYWtTz8NB6+c#$vkw zH3323D7Jy38eQ;rhlKGxXmYTsAz_I=k|xL69=$ZAqL!!}uSPLMgtKD{$3w^8TB{+^ zk{k`?ZkXl9h6qD=f!PQ)B}4*vjSEZO4? zHOS!(YcYz8=hBZHBYt+S$9xLSa>TqSrJeAG2Zh=Zdx`4!Q z4j33DYp!bDB2}}U+r6r`ir`q;g}>Tt4|i(;7yx@yIL_`mRv9v0#@O-EsM-CUxx2j= zy`q%Qdys7rN%^c;;krKGt5!=_Maq4Sp)C8CW;j_JM$_ou{X>!UtrRH1&d4_H8Dj|D zJY=+gDfL`_)N-}Apk43kX?DHrYlro1b)4+8HO<<(yT#=lNFw+NGo??;(W<%!6wm50}^`S6mWOEiBeg6Q>G|6ak%FB%K;&HD!b}AxC zz{=;`N9ji}Q7a}!@gNR(rkJRPV%YWJ@S?(xO~rlD@_b29ZhlZ2XuSqk&llmR9awyM-fP|fa%7N!$vvD8TZgIx(##AiWz{iunVuP zA(AtKTT#l9MiMcBrA>_xr0J2L(tu>=IqE1GB(8XCLj(~ZjWAC-7$8{{kEco)STULH zR4PWQ6&t++%Sx8qSy=_uKppzcH%Ziq-&-3aRMa`MD?rmo&D`dIdA%+r9 zy4do+L(a6tmBrKi{{SRU8j?D6YkBR71iiNhQ|F1e>s`7v{l3R8srdVVz$g&i{Uy5( zqM!81&HSKkm_BN6wx};S&g^IA&Pa?)a_y@j3lwXnwdrHe8SKwDCJ94xoxJ%h z*x%z8sT{Iec1LAci@wozrdc|wOsjXr5@fg~Ao=aNh`vMzE?IZ!lsr^+JD*0*Nb_SL%pEP?kYAe>9A)X!6Jg821C*muzov66Gn&V?_m_?sx_I4Kj*Ev@EGQxeR zpNiMc&Jx2uNo~>p0LPi_rn1MLKgv28-BvQiu%}g`Z$Uw7YvqW$ox{9qiczuaYBK@8uifaso`-qjY2Xt??bIg7fOBkL&garu*?hiHNrC%j%#m!@qBHES=d2-=a zqhz;0<5a@44;1{BKYJ|1T}pGvyWnps=?*A#!uT1H|T?Xch~c0lG8yc1=(Y!BwnojejdpTkGvZs2ccgN7vpLr%n4_1QTQhU54ut|J z?ygi|j0VSq{{X0RtygAb`=E?+TcKPT?f${llzq~8k3&wJd{H)^gDPG~vD=v;J@jLO z1LH&JPXp*`BU;ke<>JthUrv@!#6x>_N(Zl1rsP<>FU8>r49jxsHy_~#>+IQJ7Tt_a!ytlYeVvI8Ps!A8$0F77URaywE^7Ha~ z`#tS@Q?RyuhyED3UCFkV%3-)>b{mG`B`q2gozT&EPcRK3#hz1RvNpEVdE?o(Hy6^| zL~bq;)f!fg6~Jj(R1>;0sis-F>=nI+)1LnTWY5`C+HleQ;zMgYTWvdJgkjCG)nCn) zjH44knd%Tpa|XdkqQAV_Upb6HX(rQ+R`S{aqZaZM$tw!^u*Y5~E0c)L%NEVBV&{>t z+3>BTDvAPSMx7yV;dT+KI=Ve>xBpb{t*p z%TF`+o4PCG1%T=+ERR!ItqzVhk9(jz1!CEBT8YN+-5Kh&17oxv9wU!lGyrUh$+!*( z8h*6s6Dxe%T#=KmD?U=}UvQwEGoF76C@htObYN(wULUO#D;%mdIPq}xs-ZF%HbzDi zV!PNT3vt#^*q*SY*vc zu*TWQ-Tdn9%TB~EBo)aiHgv`b1z{I;bfs58#L|Z4Ph-BYB*28%d|AaJ`i~80LCSXO z7Hyv7a;|P6Xm5e)aN9aE*f`R>)6q9^jn%-aBx>u%ngP+xxlZU!5ps(vWDk8z<7nRw zURG)@t#Szq?-j#1p1v%$YNU*Vpssd~=tvQ!F~*^qp^DrArDLG?we_OHf(|qXK}CfU zq@P}N4u>n`PyvSZpkTUEqSF?0&svsRW(B|)_~xdIOf+^M%`t|O5OOsfb)hf|e0qbL zkp;m3x^v9X6cU_(PLw1JEDn4Q zln4evfFG>w(yaHDxs0ZnNJdC;VpJ{*su{P9r!1G8}_c0qd3ys<#}a} zZT|pC<-N4|Kbqc0xwA}XQlhoN#7Y`VV9mqFD&~fgJpJQzVy-t_ay+ZkQcY-iEi~zv zC>jWUl_e$>1tv)MW3DL`W^n!J89wSjW;M^}Oag*gpqVGPk)oa=8aWi;gXvQwnx;!f zvUU&UCfjU?_HNg4Z?({33$6<<`}$WT;NiaAA8#{*HxF9J(Cz1ke6(zXydy0ivi_=i z(rWbU@8ohOS9Mlh*^X5B5?22J_j2^~G`#-+JQ&AWZ9AQxGKYP@fB@~TpJH5bUX4{8 zt`A?&KLTY1By~2Iaa~5;!h$%@W==>4+C$E}V< zzp1A+{f;2^AGMvGZtt_ZNKInJnjM>bcj0Da?)RdQ=WW&u=aT-M06E*Qw~kh&5b45iD-j#OJ`WDrarC zwl%kF_GPx&?ET8x_K#=e?7QZ|o$f7XcaLHHcpZ3GtCJo+Cm)B^f0NC{mV7+L_Gh&T zx2)#0yol`Wx3izQ+B-S?(M$(1?IU|FUpJc^p!p~KKIgfOsV;bJ*TCLd#k+|d?*cKP z*WFW!Jy`Ne^esB&vyBMA>JP1SG+=>s3$AiN&N+J0Xla5 zoi+%kJg>S*8;Ui@8t2I-Z3v?ykch()LZ8FkN)pf{wG4rv&Kb2i>F%qdY>=uByiXc@ zqq7_@P40U2p`j)~akxN3uN^482U?9)I1JcT9L;GILt^Be6qQEZ1I;NJ&Up$_ooqD_ zH&DKFkUgyCq@qUVNe5Ct3Ka+mSyu#tc>p-n$ z1~5$&!psrwp<(eJ?sU0FU~cQ4LxH3)M<7W8kP*CBfFOT-C>X1m8*~lrSb1@pjEr$b zGO?V8)v$L(VMew@XcGWuUbxb&B3mDU;vfT#L!E0x48xsJ?&nQ-4@xQY3nj?~O5xdb z!QeggF(GE=DAbt_3DZuekWtUlr<>G#rtZhGw^PKo8(K%%wr2$+!1>gR&?cfW>e~8O zr-Ss?*EVO$yLC7+@#^_;E@$7O`Xs9Zh zHUh{OIj-}CXnD2ujJq#rTs*IYIUTJufJY(E_D6!B>BCznEbu`2g-Ny_MN?;FmgpPeP`O=`U z!V;L?@Qy>5#+?Yx=|CEj>qP~E;scdlukQ)oVrF(kh zDKW%(^ELI8%GvYr#FpYx)j-G@Ze;N_nV`XCy~J?iM<{a%k~rWX^g5b*3v;O0^M`<7 z`>U=GLzZaU$E|9N%{OVS#FkP5ID=W`R*f;ePd&0-*2hA0uP%>D&613KIa2~z^vC5% zunHi=>&y3{10TF282qY)1H>Ouz|>9_bYjg~8jI^P4nWelazOSl=CfP6K`X%5J4bY6 zPBBqNiIN7nIlRDtV7h#*1K)361HEM%TlG+Gu8xjZ;j zmSH`3a1@I{0iiS$7{^{etso?07&;0Dh*s&q)RZs{4)@_qEX@8~szwe5dQn9f6OTG5 zEPy$4q=Lv+;yH>263BH2jWofd7zWdyNR&k~Wr`M&9jOJ)!1d z$JV-Gk}u{tB?(96I6m2SAtm0qvlwiW03RCH24{`;i1XlCSN9%mEK)-&MK9_5ZphDXnC4$R2g-lGwS2Vh zJN72@r|JTzVA9(S*8Z)ta3}UYw5zOr2H!{OA(0GncWK^1{d+d^A?mdbx@x+j*N*+o ze$&}oFKO6(*J?nULuNjT?xCI|(Yfi?rEPsX^+WLM+oL#}&y!uLvCj8p_J9`B24C>2 z)@QSpDOp}vmBHSJzT67sNZuM}710hNaNpubK29DJ+eUGFW%e!HE!lq9SzPv3*xoMD zycPYQ6&K^dexad-Z&uL@5cT#g4cg`dx4|Oa0#u^l99^o&4V9fwsz0i^EAh|cO`GG?Vw^t z%(P_Qju{XGn~4GM9D56l@u{9QB~05MR~Mnu_Di(~ZbU7vT~^=#Bn#z{lf~Wu2er?T zuLp|ZziHa}eUEpB;y-m$-0gNY*V=m}t?j|=jt!NfdoLbKpm z6*H~d+YolD+S|4rk&s*VrqVGVcQ1$MQ7)#+?0vEQH?LDR7;!lN04+byQ_aJcd_3vx z{{RK<$o7`ov>QB27;9VT7{z~MFx{5kWzfdp`?NLl{{XirOOjtQ`kvF2WVx5h&WsG4 z0K0a*bJMxoktQ*no??tOj$%DOb(q$sO2ifxo3Q5Ks5)RIZ~FTEd)uN>UXrz zb*yBK69D94PMOy-r`c-m@#Tid{R~QF@ z>sh&LMe^t{xMDI(U~sKlvpN87f_~32%BMnsU@`;<06b41eQ7@dr`*5^2PJXLQlPRO zn;G56$BP{)NsS8ubG#HP_24ReMn`@K(3b0t8T6x=IY43#cZN7%XRQ}wAd(OeG&<7g z0+o(%`W`1b3Y+dwcy(RlspVBnlDveo=QtymrDZKkLY_P}@X#I{>Ul?IM8xlDoavw9 zoLDl@PY7nfIK}|wTO&IWCh9mPw}&ND$KEO>OIA|Uv$6Je+1rx1*^z{`Lx;bUD+1$) z-uBO;S6>am<7_tsLIlQ)hv1xB{^@+)|zl3YY$ zOid&BR1H{Vvz)DCDf*hmH{^16J6CRYl6Hq-DYe<#$}hIbUJJ(%q49szb)iSBy*}fV zxpYTM+5W}s&5sake7)qyGVLi2{F9TZ4o+|lZOLaV%c;>@+az(W;_mL97l~HpJ;t?+ zD8^HXkIe7C0G@fGs^^V_loFJjFHVKN-V9kHl()DH_kqqA@y^ooPVuvUVW2mKGDBqEgh|zmzmIgV{Q!OMyDrAd^R84$>G$VBRB2B`t&&c zq1qjl7iJ<&p?$Nvf7$ycj@n&|wc%}<+A9L*7=l##LaKAF^C;#k=#K|;&AUqdottY( zCcqcp;gce{k7_bWa*`4Bh-6J9MLt$Kk;ai|wb(t6*`2N0yA7AxU8Z&}#kk%{Z`X7M zaKA)_m=!?nrui5Y#Lrw$_-MAcu)prFZtZ1?@uJwfQTvOSFRfZNc-y#y?`U_Fv`k6H zcWDcmoHd_eyII)XwHDU8yuG#9aTz0S)plXU>ct?@M5wJBAP=OG$`sLIX`Rm2@6C*R zI`!@EHl6H>+f!-UTP>r>8hE3gTXj?-P0|KRD{XDYIp#PX6u^MlJWe>$0!DImrXaUSEx-||15rQ;IM&YSL4Q(5+Ij=5SGt!H+T2f9i zNTJCdc+o*)PJ?uDrXT_{AJFxpfVmudqZG+(3yU!#6TsGU$7fC)?kv#VS+c&Ixz`3r zQSIT(nkhOJI@S#xaga3z$ee4B&XXvS#~nW^Lk)AB^PmQTd43cQi4C1GiU&XzAnWm^ zV@MGubEQp{Mr8ZxSx7ZLv<#7{(CNZ~hp5o&NC^jBe+mjgYo@fA(IA8A>p&U0HEjFw zMGnZ`&bh@Qlc6{?2p)OmMU+7!I%(3A1Q3vO(u)Hd2ZouUf)>%7;0=1xK+&CS>~iP8rK;TZ#qQoDo(J!s#`J8bE};FNw6%iO zTHET52AXulyf^^HGOgn7l;ANQ)JNHGyG3^V@)e1V-UbrGou2$h zQk^PN-oKcQ`2PS5qqR0h&f1nu4csetW^$mqgDfYZ&ZJUtOp5UlxXbc9sPv;)Ax}mN6zS3JbRv9?MOAYE-G<#ElhH7(2}*G#%(K$jgfJ* z;oG|{_72zD)^BBVx9$F#ONA?{i-|H8OUc-^%JzTp76Rr)ezj zt?l4)W4S4nM;nUx$ZY3>Z*i}m&4I#CvGf>oDaCg>jghqPb{^IjTRr#pfEPB5*p5iL zH$Cj?4=U3JcaBzx&4pxC&X;Z2-0dR0y6hZN`%F!UFIWI9J$mXm}V+V5HJRE)HzVpL|PS@&jseq$POg@D=dE# zG@gT+?NJs;V~PuMNJ;Jic_bt3Mk{V=+eO`(a^Cui`Rv6>`M_dz`b#m7#Tz20pU3D| zCx_Gz@d(jS+#*91#4L9)F?(iXrU^bM&-%X_T()Aa)zN zFSV2UR!!M;K@}QvJTN(msuhuu!45d-$6rbSQ9w>f*E(jRin9PgqU-(gs?b0)k87To zq}b>X2pLT?t_jkWb^{hd-eRlo{OP6?4|p4W94W~Md!C=QE8Q@liBNPNQLZ=xia=F2 zHxpc?rL0eJc_=;2yeqvcee7}`r%ExYl?h*@}@) zH|J=|L1_@o&c(bexbo@Nux-5&x=CuyRldU7+g{~v`#?y5Hub*FOqIqly*4#sM;>B? zt8K`X&c?#QAl&Z2i*ZMHyMh9Z065Xt*NtlkQ?s6PvuhAk1a9u5ePm-$586}Gx)IL9 zeGgqekPd6fhq{|36{ZKoIJPoR+8@nlBS@T{(N~UEdoa>~PW(Xl*Qwp+zUuR4spxtz zcC{O`rny)Q(l3WO-3P>@)N!hVX<0K!rL^u+;Iyzf44Lro&~wL1Quwt*EjK*oTSmQ+ z`%87RukQ8?WH!w0CuMI0mzyd@%F5Rks&Y5mQ@xD_hQ5P?!TWIj=egnWnfd3Y$i3M3 zEdEn==GWOfYHgj`ZJV-UNp1U7@kz5b%#p}<7X}c;_YRNVqXF@*qnPvF-S#VHY(Q={ zW##3~x;R^_3;QW;Z!Hyz2&R>S_b&vyxQ<05d!-@9M;PE>=foRAxS*q=>=xF)+539d zTW-@1%}Hdk%d@X8mRao5cS43XjYNwVc&tYL=9I+I=>3Q6#?jc2uF<(m-H*0NGXDVL zEuDV1wi{wQl31jXDZ@Gj%WgLJJ;PGjCqZFnCEU_&HHldt09zmlEK0l?a1dpNTgvH{{ZGM7~9slQPTA^`%>a5P^$)JjARVr z;xW}6d6umUVSSr}c$uBI$v$v5LCNXLvYWPR9gdbVq+pFTKkZpEhJ6`c0FXcj_N>^+ zC;`Iq)bi4h!c_q0r|C+7dJ}>=ex9_%FcMpabkD?9Arm7Z0F7IL$)@NKlYyS6QOwdA z0#@GPhWk{kC@tfF2-A%_5eHm=J=BHkAb6G*-Dt*<=(cK9V)B6=PY?wg&O(BFaoKP{U20bVm z1%Ut>MIZ@3hZ>TBJaqhNGLe9h$E^bhV;{8u5XU3$pkW5oa~$aaO4&K(>r4X4CXq>* zsOOHfsCEz`R~goUkN`Y?8dN(Zsq303Kp;AX;CY@DienTe?wmz3bpiJj;~6|^N3-hTjU*e27sa@Rb!~GE!EL8c=a`zyn-?>qUs2c~cz{IO*`DFoFL7wIQItu}Efd zKKce=!Q(&}MotgsK#seyA1GJdpLDglEpf6lw4FtDV#=DPVLWv0 z8$;d9ijMgYt-Z?gJqhG%SFVrvW_v&QAeECA*MkzN%u@|D>JM61dP{NbtacMLZQi0> zH+4AD-tBldqf|+2u8*TCFHJRFQ6Rg@V|+t=yf8cx58w8uZt3YSaaNbSeT1|EK=Byx zPuE)${{Z1eX*k}WPq9~8n%$#kZ9S`6Z5YMg&zHg8I^?I_kaG9dGShv#_AP6+{f|G| zpCu63-KFr9PT$RBUt(SH++0P8Bzo^0ymM4GGZo4(w$Zw;L z+T(M-RV)rb-(CZ7ju_{h*O!+IgYZ3Uc~tz)w_|M^y^FM3{>e;|N&?*57up4n*zwGn~kxu<&tCD{==tzb2$G1@&3gGC(jl?GpOK~apPaNUHnfE z9wHpkdaa*t&Zid-o>*ncJ&peWX1hnTcK*tTXxPYF89^G1I=DDxb>zx)BD`qHrsFLn zzda91aa*lZHjb(k@?+1HTUrp9v!En!;is>qNkZN{Xi4juO${>yCRvqNB#=QIGy{p` zF-w-&S4gb)wu!v3f18tmZA4l0ZY}Vsb4$d0udakcHq@Nq4glncp;zK*DNb7hQ9;YS zgBunTg4g6si4U^x0x zV?-ffa6G?hwEP7LgB3KZx-|rjBcH~mOmRg?c7#!=B;y>hQm%N=ut7<&R^};(t(tA1oI%{)b6y`#WP< zn=OF{bRQw^Tj?g1xwNvM5wBDCV~#wyl_P`prIK9PUHBAcmC0b?pD0Mk8ORwV9yQL} z>U5;K738^wD}CuDTX6uAP|B`X;kgklFA?_<>IkXH*JD~DB(EikfSGXIh zM)nZuhaOhwYGtvcPCII-TbA!%=C_#e%DRT>r#kZHzAbk>C_Ow4a!i)4{r%==n+&Et z8gV+*tpa+S_iOg;oFdz2Ty3jemoC%aNVc8Ka!CXs2KUnl!!TJ7(dUM`>0X}$gPvCQ zN14WEak?5qoHGn(r6TC*BKdjwL~hOBY#pIJ zzSf5R-R$1}`XMFS!zOo^yahy<-aEVC?$E=O;kI1%wm0^-S5{GNTS!1fI z#(2ne>ImmR+B;p1v-<i?ZFTkLP8? zx1s4b8$W04>uWuQX|va5+D?9Tw4k$RXjI9oqL(b~6G`RENSGcHyeor_&&wL>&aMj& zJh`68=vEHuC4J(`qrq~TupJx^Fs~MmUd?vU2*-S|x4LZ-O*ufDv(y0*HZ4<3k6Jrm9Q?E({E$$U`&b=u%G=wz3opq_Q zsD_sVjVmc4v*FJSb*!ZuH^q^~m2NFLhB#eRSK+%CtX$&rYl)#-a zkHUZ?Hltk!3PTy*jBvrK<`o#kZs(b)DFRyxDKe3O6T>usozu)|Kp4%94-Qm@fnucO zaiNVE3SiJCNX9txpe&sHX$*!?+_OM5ShBql6AbDe7SQLGYe-JF*yhOxx;b9mb{Yqa z-)!N$r&6N2@n!wD{iaig?yYo@<}yUlxkm&rOknq>JoGwa?eb-1BFR#nT?@x=jo2<14(wRr`{Uv(VCg z*XM&EOGo4HBFs|6GVzT}dFH=rGfT@y`ScmI*}GV-^lqwmz%twCDC_p)HNHHZ45tHr z3=%>&$&%Qg1c%IrqklEiqgw1?s(NlfEf@J~%u550qm=8XudOY<8ES{VvC)gTg=0}2 z!7^JPs+@V_KK_+6jcE4o*r+?zZ`fR|jo9v+T|0}l=hG*xOP5K13~6;?ZSN5?zp^kC$ zt(@b+SW|lWS{c7h5GhX*eQC%tsMQM!8YJAJc)YVZ^xn zGu3w|_LlL{f!STU+fky~+d#B?PBJ2NY$#~6;$hVNp~|N$IbE-m=*K=~ugrDZA8K9p ze`x&f)r(rQ6uY&~R!!avF~P?WYfc}Cc-^hKqBG!G6+O+K*VyLTcJ1F`m98R~w3~lm z#7OzU1IIKm@LQPpx_f+h*KZZV$2?Tw^K^gk&Q2SMc%{ibj)$|oqS>2!WWlude4=|< zmmrQIxH6H*sp2_Tkr_L2lBq4vLUCKCqc$w7ka9DV?)M6&ktvnQd>r+_1CageJ7$^` z_MDC^BeaZ^YuPs(jSq63C&x_itmf)9+|mnM>=aR2CA-gZLfTt^Srbg@g;DRN1e&+9 z2{&}NV!@v6ckUT&tkaAjoy7-$(^qw(i`R!?LZ!o2Tin-0s63_cv~5?uy%m;Bs*fO(Wcn zBZKIe^>h|9!( zY&#Qwv@Y&scDRu5a3lc14?+RZ5n1HPDLq-PEK!Ql8uXSo-(Bo5AUKdseYg zX`0=q+AB*&?zhahj0x_PmTfpL6c95|=X(~h*5wHME3~%l!d~t6k{dNpQ)Wc@Y=NYX zcsHo4jxMaqdD7A+MFz`DK^h_?NCqKz$I&wMVb9k()vR=4^4Vn~2zMd{PBPGG!>nhT z`c){B-*Q}lfP=pg&|_X7o}9-Tp$d_Tk({0HXmt1f{{W39G%z_B>7maP?;gMQq#=Q~ zqw(W70gChKjQ&*Egv}=q`jRyR+Fqm7R7sZ&zdkd8PR1j#XK@FC!RP1TA8GBouJ#F;`>HzsP^{OGTac;TG>V1TPpj205BYM_lygitnm?_{Fc+aqP&&0&3d-JY|!bv>Nh zmNBjMj@8Pr?k5|CpLdUSByt`hP6(wYlD0)#uBS(_puD#-T-~pF_fBS+K@8ECfX4(sA*OZdK*B;b>(+q`T=N?B6-XG|_<3iUH9`TmvQ9Yg>qrRQBV3I1%@hQx zkT-I5InPP}Gm&K-664J9D+K|ZZ%W*j9C<9}&ugnB1pK-0RHL^d;Y4}VHz*;?vc0s+>cvf^sxk+-sQ z@2uIP3NlYVG>`^$9doS=XeCT*(vVq_up=DlNhWCtxRq{gOCcbB70H(w>fqvR*1RQ7 zF{N@!C#eahD+GTPCaI1?pV0fNM`4g?DKH<_rIvsPQ`GaREPu zI-`>9uVYeB*VY3gi-Fde@Y11GNj(Jl9 zF|9EZkA)y4aOf!kIOr*b7zVmgU>5Fa1riVg`_L*jy`1d^)Yuo|?!~+Vnn%e5P~7SegY(IEXBonY?&0K44tGU9OGV`9;x zF8pPq?$7;jw?p=j(yrY;pWw(##7hOnb29;`+bZ$`1_0R+S|hTlFjv3 z8h{T!_Na2@(fp-y^KJ73EG7up#y)XjAjyM?PiiUg86kS4+WF$FReFgeY!uml|8rYSCZaEk(w1% zlxMtjI^W78yX-oH#4Tr!xZ5j*olk?p7aQx0 zWVV>~<4-0oO;)k!Z48{+JtS}YG1}dsur{T%u`pXHm`8PMyhLsWo#@EQ%BO>VI#%32 z5b?WPbu!{GEQ+4}4!de>N7?hu+kV9V0GQdgpv~GXi3rbl%jUbajCm(d>c%|WYp;vp zmS`!%exGBLhR*TJlP1RVv-^8yZT*=B)7jH3_R|C1I{JBm96<+&JS)bH-z=3$9+Z;Z zYMHT>ag&X4%S?)?6BcVW#sb*N>z&z}IRMuJMew)cD-63Me0@;6#$TA*sLyuSE8d)R zQdi-cm-7DrBU`^Ax5?f?1-gRW>N$*hgOmAbRO6x)9^u+V7T)j?4*)TX;a;y~cah=izhN0x{%TQf}wbGf^ z+Tj%@kTcuJg!eM4`L}bZVa-iTrd3v`H-I)tCwV~A{pwr+NDk$Lk}-}L9F0#SvGWE7 zG8kcavFxq7M@zDP zPGJCE_Lf&z&I)YgY&&V3NXx_hD_-Xd`a~h|=63sZ{{SbMpY=xm94q-Zmzz_%g)H`b zDQjknq!Fl83ychv=Uth2m-5F%a^m6D^G{hCxf>o5S==zo9Sak#nB*&v>O~EscWGoK znpVcU&mbUYq5lA<8246Fl263e3ANyJGHrdSw;ovb93^dl33s&HINfd`6#k>~qmuPw zb5YRfwhw0QHd?H)v6^FoFB?__@m2>u8r~4CQOT1tmW=7G*V$kd`0j(JzBBt*L|1c` zLks|}00mt5km#iU0P$+BQhAL{>{8p3*k*xFL-2Um{+|8@x#p|$W2O>M%*dt^<17q~ z%YsNp{?`}$`SvOBTtar;8cZ*6e)dn;s(wGFR# zF5B5Q^G26)**jzWx*WS?k1_+hUa#rAJ^XL@JipX0En*3 z_J-YdXKXe#&cTi>9i6r|6wkk4!EhvrKv^TlFuTZCMpHo!CpiVwy|wx6_SM)c+I^X0 zdTo=o+Z@NUHq>$C81C+%k9l4_+%b6~(_a+z$+XdmF3CHpDwUQGR)J!R{pq z^={IFWW0fyf@=w7s%>c&3qP}f$&f&R39hwWqWuN6t7 z*>O){vr8K<&aET^KHBg;j8=rS^N0+0~zsLs2i6gD&nIXUIXQW(@>jZUA%RgwvqjNoK) z>zYq(-JF~A4Asii??F$9~JT&y{QpQYCvmeY*GQd;=98W45K^Dd+C9#<_B0Jsuy5?rUYY#{t8Tu1P@k@#Rcf=tnBfjnfQq_fn$J4l`2GabOXQ{`D;y zCT2%7L16$n@}L4$&WHWzp;?>;4Js(Xo^${^s(*?_5sWsphDx@lr!QItNPTlmVE_(u zr78;}yEw?k<8f%V}he4^*n1~Io zyhkcPNML=`3Wq^AbaxnUM06nQinz**rw+#_+YZPi$Zu@dIn{u!tXZ5qj51?WU)*`* zk-TnE#u-kaiu9DNT0HiebjZQYP>CFA1rxii1yLbS5ARw6f(gf+D+&xJ407Q`g$A+X zN>&tMQT)+iMV*(lul8N)UhMfyHwn+#W&18Usii2XDr8Cts%N$KKel!~rG-FYX||zU zNedkudVQt+D+Zc+@6q@3JgoQ}KiY4d5yL4$o!Q=aN1itOah{Z(zi!?rz^?HJAs-CV zYOFjdH>#gvK~nY6{{Y|l8EVIBOKmEwjzed0COT{OBpi?HT0|MfEg```fFcl3FCqN=A~$@YPzn)J#>5b645HCWF}h&)mVAq zJy)JRDmi;=A7Zcn0PEbZb!Q=vN~A5z0l6^xxm560^{Jd4+TYx$%coCcPdpBWXNnxD zKj$`k^W<4Qe_F#;biC27{{ZmMGwrWoky&=`!)FTy^EyT|Buq8IQ|$F0g>+%clC9v# zlwID^HC>$BQSE>&u1|NgBM0YTfXreU-gHs`-PamwIn&FF_T8;x(AyqfbzjtX-Iv?9 zeV3Sg*Lm!tbxExTLj@x!Qv=V_uLD=Z@h=>&qukGk;nqc6dKdQYz__uxlec|;kbv2T$9`L^Tg=8JK8;&xAsgs zM`y~jTgp7#8CZFhfz?1fUIl86PtrVNk$0j#}4fcq6ztq3QWLQQRu15Odz|g4Fk9wU&E?XVZ2HnmA zsVsCj8T_go7}SOBi&T!*&c()W-s(G%5499=f*IIy4V+`0Y01i|?o4HEzJo+~(~d<= z4#6lR)pRST9<((_d0H-NvRFPj)wy9~4JIr_-fc*J56qjah-l@y>MLBSYxI ztC*IInmzHZaG>OIC(!++p{o*fYbDvh9s7J?_3lo9{{W!!Bar1-OCMvRIXi%k2*dqn zm3Oo)k7c?rI{yIj{An?vQ#ctd;l~m+!RwlqQZ<`S`5=MGAa0Kj zrYj7yq-_Z5d4Fj3?VYW(_ZNkJWT)xF9~4Z-0I3?4Inx!63|#X`8)V3#7T-ftHpR8E z+5Z6Jn|oxPr?R7ye$(X(vA4ypEfugMTZo*mlXwB%DmN_VzM2qGNh9W`Cn+}ilm~6& z?8j^_J53hQwfRBXJ46d{d`Q+ZYn6$!oN0{%Vp<**V;kMi4WwlwmUj_G@-RrZ zoq~eS_zI_~;3*m%Eyl#{*I>IrWqEfDn+EkHRJPjED$8lRDcmx5fJ+q6vbT#vmE}tH zpxqv;v35#Z-yOAivGzn;dE2F8=_(89eL3$lT=H-1hOM2&k@wTl;h;Cn)2}!}P9s z#NIMFi~aj~*_FGeJREBrpXwcJDmAm8+83#FD#GiD0R+Z%864Esl}g3b>GpcZ9l8b3 z<0Ou?&m&Ylq)_AjVd3jpF{5E?2_$hUMl}5DQX4M!L~$H4KoxW=0geX@ew2WXM?90p zn1d|ALg!PAk%K@O0O7=(=UON%hGoVv$ALb)%_cB+Rj@R`;p<9=VeaYI0~tL1)C$bT zx_~s#!kq<}S%!DPsQ9iBOY9Qd2?r$AUifq*gYrXv`0 z;pspCa(I3e0BIh%G}04gw2$FbkqwR908=DXjsX4XHZ+ROHckP_sj|`lo_u|24uK;l zr6G~s>8Qz|0CdO0jSON$L7Rs?QWV1!nlwxU$0On@8KPu{*G?3M zHCyqfB1;pK%7LN|P6sMXqA*AInnSSE0x)T$1|(|CM)!nqG}KdI*#rZf-Wk%RmY6G% zoEioZCjbwQXs|PTO!M`nVL$@J9DX$=5(YKlieM3NczkGVR6*V0&VWELIO;i4V+T6^ z^oj`N5snl9YDPH!0NR2Y9}MO^h8xkhnQG%YF`N!twY`mw;y1psQLe0`jdfzo3@2ZSpeURi>BEH} zCmL|16ku9*6hT~mI{av{P;gIiZ8}_ANYLCw+tJ8}3=gFylT^hh+3Wp>`9inb!Y!S( z7+USL7`C_?B-rKe^sHKIcjW%(mBetaI>&CuUh!}5#L?njGTUbg;CpeNL{e(>>)ZZO z$z^v6bd`Zd@Fl|zKlyWxy$w&FuK@Bu4Zr*_1}lkdCEb;oVoYJPmWMnEBg~(B@u5k@ z*Ww1P9X*x$Tn(s9lpm+IZUp}TKDD1KyN~jVzK_&Kf;N`j z47Q~I0GPBsWIt(tik_CWk5pHK-=i0EYaFPPZ|@-bo3-;N-IJ)LI47^y?l{S;xza%Bg)-E|MMeXsuj#P)L9+#!o@Spw6*P7&}oM2e(_W#m_lEZBJ~tX|C9 z7F9n9Bd*xHdui+qq^%OY)r;<|*2*^-<6RbI9Hmp`>Z4lMh2mZ({k=^1j0+<1HXWht z-Q07xZT?TnT+4U#yI*3*g@4LET z0Hya?eg>&i7O2LLWyIm`T35jGv0gm5v;LIoD|;2mtqi!hn(TKG#q)bId|A%(kB+|@ z9IvGzDA$WHtZFp@aiGRCik6B@OT!Uv@PogMEQ(6F9`Vwmkx8=zyF`uEznv86g~om@ zjMGw=b`3|eA}d>HBW&*%kmcnkdPY52jW@Vab`)75Mb^E>199(sYieWPG1RZa#C`NqgBHfBg+^ z=eoxnTuLxx$2D9p`m5gIzfQ-4;+Mrg&WDl2exod(4mHaj{eQu|yuD*?mheWfK^Rqr z-VhQrL8paRLA%Pf%bByE79^d$O+C!wR53G@!6A!r2Y|^Rm2yf~q1g!5rCXV8?PD`e zRy%O#zIJQ{JVs9+bw_&qEESWqvmuQ zE3*4C(luoIN#Dk|>~kxgrMY{nWr-Y<&nNabkRfIf+z#$x^>U7X-!WT7Tc^3tF6&|D zKk2%I_eOyFspM+f=uPznw@QVW<}iE{jTsL{=}XVlJiQ2XWpE^I*?*@x`CNUL=xAxD z;xzQ|A>=#QAS|SKl<;9kH>j)7lzte=1B`ys`l;q9Od1K4$OC0g@#E~c=tr_?wPLyx zac2~nE--O|{PEGpKYdJ~nQ@y&x^%NY zHpQ`*XWpd1qgzWUSB(Y^PWtZT`GtF5r(oreGu@s?>KXZ;D%l$Cu?J$t)x6mocG6#y z{?JH~o13kRC-{cKxsE~JM)O-n?CTq7!@Fh!rfbnW^m3i0vXaMZn^`Yxc9}?Hc(3+k zo$b7_ILaOD1`qa?hF6^;(=}Jq$#D!&%eyR4{YWY@pmGL)GiB_Jp|*CEJ1=J2wcY*W z811crP-JWt-37|7a1RqeHhL$?yY{-!-gaE=&+x0*WyHOS?G2=oSln9UGq~^7qJ`H7 zL%64o_@`Dxne1JT*tTwyOK)tDY@0bA*Jncx_U7n0c2#1|6<;H9q>(}KM%b<%Dp&BG zd@L*CI$13fbyWC}c_asgaX6i+n%$*p84md4!cIs1Sp91(kuD75w%wz}8+VD7Am^CJ z?kko`j)d&uVixgj97yAI48`jcS}lVjA6*k34Yq9<-{0$Pkt|#t-d6 zL1eTf9G`aeHh|5+$6YB<5Ye5|RArA3_oUH8cWk)j&XoWml}|C#N&qp9Fmg4>rXq0X zURd~RKnZmq;0$E&sc5Sm9BMI+JnQKaJZl^PrXw^S`T)g7ZeJP#$0Q$!r$pHFhy%mn zO(I(vpdYnR36@Yj{Hj|7ic?5Q=}_6CLPqh%1xUssl4+y^N{@yrghA=nfELT1BPNi@ z#sJ3(OklEu@8?p+2^ix_h6XZeQ0z59MFoY06u?`ezL@ybIN78!IF%=|<^^+P!PxY$ zah=L<0UT?VP(3(hOhd$V(z0a!d@8lprC*}X$-(Y+s3 z4C6kuP|zKJDw2p97|#>Vkir-`@}@Fy2Mu$|kicMh>q(6Po(ey+NT8AN=x9tDA&JHh z9$xAOV(2}3(gsdWFem~~A4*~ecUlUvbIy|)fSh8G1gt^Uf?P*i&LeysVmv|NT1HfJ zu5Zt~hDR zkz|vvuQ~=`8lTdYfh1>#!jS00jC=Xe6lcDR9T0s#3M^DXT|H>9XvJ0p5K6M0cibTICr|CAMt{^!^QLRPH{6-Kv+U;6=~VK--rKql3pC2&?(ETaohU z_5q?TA(|{jbfd<+n0oaGuPQ5BS~1^8u%MnNmeG5;$NvCPYWy45{{Z3@71lfTMc+wn z(Usl^E@B`n1&rn48cPdxUaRh?r6u`jt7-mfYPOY{zUtgC$pl;8CzSox=~zxW>-;lF zzTStE_T#ZvmY3_cc2D_Dt!{VFsQNj2j2$)Rr;TfeKQF;Qm5NZmiaVQ5%65v+w6?v) z-LQjc!LHD=1P1ywBuxsR5k_OE>!nsqT#vk7%+?t>mu7Uk6Kmb}cK%|a?kweGYwKKN zB!YYB2-Cb6*YmA-ekJ0U_VqL3Ff6OIi=C(JbL|O7ZMz97e~jFqdz)48+wDYNA(KFt zLxy?t*N=Y{!o!G#ui^fC99%aOEHdSn=jU?QWxGjZw`|&2(V)G6_g9t@=_FDO3blAN z<1Sfm?t1dob1jX>&Ef+q7#QXTDCAv*&cSFRBgc~7&>$Ssq!z^?w?bAm2M3S>p)`im zVP#LhfgCD?DnTCtPDca#R7oP!V!}HBago>E?x~^KhDAj?+_eL#qUb2CKGBI4noSlk z8Rcv$FHaHBRDR{UO4)J5*|6AsklLGUeCkZ>?UchmJehu$Ky}O!HZ(k){s7mh!+wtC z@nz9}^Vj+8aq%ChLl%+vrSv-pA7t!U4X((Cais9cblxeYbpuCpukFxRt1QvRxnQXt zV}$a)Y>cA!i6fbb-a4aza(9On8OL2~mCoIptaPYMv+fxabg2ux!%$AR)rOcnswFBe zF|(f9-J`JC*0M=)Itb9WdfUTwQBRrJ`B&du>9?XfmOiZU9@KohTpR0=v+a`p&_yyw zJ;7v!CXshic%olFcg1)7#}(*s{4HxgPr1Rwaf-Qd{{a1ciixwf-(&VB&FsF-4Bsie zxRMEWgO|m{otwI~ovD!hT(iH@%af3!2D_Y7RazcrJG;G4PVCpp73H68?mHU+UA?n5 zC6SY~y`*;$BvacdH*p@0pbdC;m(zmqgqJOJNZr7V;6#76er6sHTVAjG_JIJ4zE?XPPii{ z1n3{xZ$|!Uv?M2VN4%j+!hW&?sa*Y!N{X#I6?f(?K^Tm0lP$loDD$UG`>9DP@F_Qb zBpfc`l!8B}aJ&wB(S7|z<>(&pR`FmK(>}}l$FgdP8n2PAa=K&MU*uI-s7=kZa>Qe0 z4I64yX{h#)@*<*evZE?zE!q^8($VB3%L&lR2Q#Kh@;!eMTsf0S?ZqU|F5A}^Zz2KWgp78%EwqU+Egj(}@h(J;RK1TKXzH4fi-+&`H?|ZXutt_BWd@+C(jNv#%vf zg@$eI7TRSB?-uX;!M&PeR#Vw=Z0WYOlp9Lx<{LhHh|>D`Q+&Y-xDrdcJjGX95FXLB z{zCgP71P~p)3r9gWbabmD<077`Rwjq-sWixVVd1Y7Z5gAeThRKuMkl@#|zpYk-pRH zo2#Q@$=W@iv!x5P+ht^5TPn6&zp;}O#Nl;T0hfW!C?7HEJ(QB}=Vw|amuN3G)HjIF z*_*w!2X(Y;VgSW3SwRvw3;-<@%&YChR;MJ?V%roW&m@uQJ0=@jYe=l^WBIg}sHxnL z0RVF$aHl6+t$50O&i??Y_8fUv_LpQ$_R0{GV=Sl0-v0pRt*i4TIuOdQl_(NX=Y*ak z)A_0Q8KBzRBfNoyy7!7Tdvl|y>WBNyVLWspXqzu#;ZxNoTcy$tQar;|Ufg z8PKAua4E!tr{hr^&MLYZe%hCr>N^Lrl37{Xt>i{KwTvvQjD>!CtT>Na=KYrCY}w>h zNZSpQY@-UmuozLyRes7N_ZX+yMIBy0c|M&fJTI@ zlZ^AtW>~$%!0=<4KI)wZK?Oz|!(8*{`PFD3er`_=AkoSePjR0x#yDb*P_Zo*gbo?j zqKdIX-^G*v08!~nlq|s+-N_iw_pKBbL!ic-zbZ^(@~1n)IKktsAR4+4PL=d$ju9=u zPy-SYc#3o@Eyn`jWK|?XVVnvhBS_MJw>BpBEU;_|8-jgU(7C+4Fct?oqh2JV4gDr;PM5=S-yN%6L{y9Z{8-8&OhSn05WAXr#=}J~bl`cw^s8WF9{L zG=_-IG{qu}&NvLx7(o0*12DEn??53$pMc>~S|v!&4Mhk71PTC*dTBuHoMVT>odPp0 zjc5WfoY6sGF`g?q-qdzh3#B&} zz-Nh3%DQo8<$eb&@To5o&*y^T(o&Ks(AT92sT>VBJwrweG@+U&VU8aPl97aKr6JLP za>WHvAOJB)D2xtYjR8dNo>UUa-Ks=39_Za8h^jJd?)wq)mGf0ijoLOcY~n)N?E|a8 zeURsgPrbxea>q-<+sO0taQ5yyo~FQ)8F>_$2l;EoAjcw~W$~fSM{E8ce+F>=QCOjX zJY^W$sor=7OT+i#JWBqRHClA-+snXv`H6TQBi_M@qnPBNI7z)!@JUDDX*kxaRQ|u@ zci;2;8;zN@qm@&AlcP|z(XD%T@(s05Ls7JL zbV3$}bu;YtJEXA7#80y0r>%3&6{FTZ#?h7k0K44suH1GK`)1umw{{%O72T_MmiHrkc3D9G;>jxiA@j}U0d zjm7@}YuWwHAvGoA)f=sgw6>MDTUy2NA}#;kcKH_m5II zjvZx>X&e62c2Mn!VeMaKCXNo$gbN(t?m@I+&JDfaM_*;}ybl`mc%B|Pp=QwB{Y^`?M+*-*TmK$GZzj3toY~yxlWEv2|?4Mb;G$+0F}Ndx6j&fvAyD7FG9fFaYDj8uc|4$`;o09oOD$uA8G?Jn>V?$IN7Drd{$E zAYz}w53UcDA*b0 zcGrDW=XE~w{3;>C%6n{YJh8{Dx9!yM9@BQaYxag;^G)2?Dc*->!byxDw(Nef{afK) zmL48B_TRbX=i;T6>!f=dpOOn5k#XB=M%r+-^w#6Q*xMBscx?@&qzij_9~+TIpIak8 zhYMSyl5a!1`A(Oz7M-1+WOk5S?eCRFndg^nY{+D_OIMk zvD>!suVfPNT6S}0h1|QAXCRm(l$;phgl|afJla+=!mC4Nne{y{V|LqMUcs}sX8D|( zTGemuHdX0ZZvJf}6_S{)IRp4*)c;Lw6f4=EmG{zVn&7714e zc>pZjK=MdEIvP|KEfj9Cg>xVEZQF=GgOw%W=s!PEYQRQXEXi-dl#dd6d#Y}{QB~>? zWmOVqC_J(aO8Os4ej+f;29JPSQT89*(9vR}o!YknnfHB>x8{g~SpJ3F_t!3Te3+MSy!?0u^=N)R6ENkT_+D(_&&D)HX&9yQlTH5_+t zdlR#JIT^UL+U7{asTA82YQWn+Y}>S%-QTxwqnQwM9DS;S@MzEC4xE)`TXHLAC6UX=m+g?Jn0#w3D| zBu(`>1)99xGbO%NvONwD9WH0PH>0?kA>PPHPpi0J43VF_D~^*|`ki*x!%U_yvE7v@ z#}HhuipQ3I%YIc?T1(WLy;q>eMP&k4!Bg~e4G7O8S5``WikDEzTQeQWlwv8urr~tevIU(wMe% z%<-LDei$Y{?7MiMW>6ek&M$!V?79o6JO;}WUlG&Gzfyhf!KDoG zni?3Os2c!M8FD`;>sCNpt)E%|AOil>047Z7MTG)L_P+{40JcVyhA8h6e_BHzl>?Nqje$(JZf4kGBgwvnHv89u&EuH zp0tWg%;}yqnMP*^pyfzprYibV&yc+(YCwLcSxZ z0=hBf<#uw<8kUUn>&=^SX6GP<6%vPUPtK<%d=i^ap zuHE~1GtO~o`1S#yni*YD0ckas(}Z%5wHMicN}6fu>EFn9n*RWjypaaY)vTB&!0h8g zkLk`hk4L5AzdXain;n(4(E+!(-w+`i%G${TA5q16Fs-rWOGme{oZ)({{ms;oEWvWX zO^m}b=pUv!8r{bH%v7t$&B*S6g6T?JDa3M(HT3oLrKGf$3>ikJrD05`9;vZzENAV1Xr0=!n2Q^{K%iA88LYu6GK)-Hnv5?s*?;yBBe=_LM!N z*ukC{i83M+qPLk}9%MY!(~SNeNAj}P_thPjWcxv}J6C1%h!j51w;j~BEQ%zHBazVx zx7rn4ll^ykjm^YT&$8>Ts!cVj~W1Vzx`JNa3rWx?8tNV*R zvFuD;r%P_pc6#wFdr@kb+51<7S1}L%((rRrz%kVirFuE|cxQ)n&Kw*>@XEf2Ik5YG zX?J}l#@klUv3pBwd#jzBb*GGf%X8r&hM?zBt$g-;Q^NiwYrp2lw~falxcVJKGA;=k zk;1c0GO2=YV@(^7(C0X#ogn3Gsd0T2afjaB48as&lFWE2sL5tM7L*|@j-aiT%Ua0X z>`udNE8=eU>pslcpyh1?0d*+H7h&}Xe#-d$MSC1C>2Zg}m*Rc8FS+OOAE_nq;@`jL zxz!8n8yi%x*>R<%lsQ#I8@d6Ej-To}*KGKOv`;-@l%F*9W}wYG+!Do>MQ=8Tdn4IA zaD8iy$+mWKq_h&-tc;;l41QHm0DWX}r?N@5MN7~JxyI*bG zi@T`eTXiWK#F0d#l|@7V0g_D&NYNEihbJUxF{J}Hw>_weKa=}@$!yz3wlm$m?`ZDJ z0&iUoEl^{`u|%9y`&!T{6WLjIMdsPrR-Lfga<61|L7wnz_TG^hzOdUugUZ)Z02urF z(1DwspYnrYFKIhR+y2lF^R&qrJ(byg-u1K+xG~2gKb2O>A0nP4=Zykr>b5V+4{W;$ zusbueE==8{?N4asTeR4>F2-AZpFe`u5W~bLxO2WYv${0JWh@ctqcx6a*Hn7m%K1g? zrqb;N{{Uwqx>)w+%`7kMq|bCrKzGJD{;Y`D?v~S9!g$&?jzrFlmtE|#GL0nm)E#i+ zn)=pWMu3$jUG&6PIMjO*3SD&H+xF7GWFD?5I&u-?oXk4I$k|C0Q zvfcC})PFUcSdJ2IWcUEof1 z)KlScbIZa%lur?pmOd==JFUBE*z<6EJ^nS=PSmR?z3hGRo4uKIu5jivFx3K*cV$+{ z;N0uiXPAyVw7YiSZC=HD4#~3Ev+jdDdof-Zq?j>3I7rJL<<4=t8O0)~>Gm(ne{Afw zb8OADmffk@oy?Fy9@ar6!~#^@CM&ENIC5DW={)}k2R0XnqS=*i#4t+?)rM*6GZ z?z1j|v7w|hx=zJ*Q?wGKorc@1CEGA>{43f5wpWdU35pA_MZLg0Jj&RnO`fIM9?aQU z+T2HNv2Oc4Hqt6Kr)Qqz+@-6bIs}spsV|vho*5DSnE|QGladxZc=_kbcd!JCIHC*m zV@N`h0Q8C5R6qG|UK?%hdsSN&mGIll;4nL@a0UVUlBcrY*q}p4e5IpQRVUAG{{UAf z`U&ApS{8x8+o6PNS~VX@Zo|fd&>t|Xi|kC7aKob^G5stJ#y%u<#(zUj{RLj4q_!Ko z$~)V3(SaEtex!b4qEPfIGxaJ<9z+qT9=vNgN2A!)KC5z$)7Vy* zR?h|eX>)HV!!wMei^xfjXmW8;EPee;j!ws&?LNY7je|UweV)6SEwjF1Ry*jv?ho%3 zg#1;VFp_=+y_MVU)>I@CI>`Q0%LUU=ed3}yJ2A@&>W-qz ziYP^-0~z8fkcKBgOqMlx{?x=nH!Nm>1q^xDmpW+!Wt=GYbE+gTLOG60}ym=1LK4@xL@2_SNy zRz~&?wIED)EgpwdJim%*kvOI+YV4a`r3PbA9Da4xj%N-?*5?Jadp|X-hr&S3cH_=+ zWW;Kk-elpNR{Y4zm7+5!>!!3)A2g6??s5plDnZWJ;-fL%d@A};>qNuHH&J*CB($rBm&dvpG*3^^WnAC*f~srCq=ibo&{*ypdK{0N-VQ0A0gvxe-Dvjc%3A8T>WyXo z%4IH5RJ6Wm4w1|c+50W&SWgpLuTG5CGr!G`BkgBoHlE16Zqjy2SGTx`;^rk7IL=x* z7l8-Xj9FDwzF(>?Nv&4?=VRDz+U(xi?Dq+1Ew+ubfqS!GEr(r1o6U@-2KIE;&PX$fiV$W>4a5FL6k{OfKPGlz^!c${4R5-)bE zxU-H;rwKD66tdd3{u`JF*d*xa53u0lmMhh9jMsF}J05A`k;L45kNl_Xn8)}JXkprL zCV~r)RgMoJ`NxNr^?7-}NXI8})9L;XUmxnx{;#>d*qws;Lk^$fGVIh~a?|d!gZ}{R zv#lII=}?Zc`sz+^)Z*1Iq1oGPosY2J=l2fVM{CA~R_Z{Y#I404MZ!X-?)Z;0UX-UC zYLVviPcDl{m9F-j*O~8t10X02FueZ&K2^m$&Rd-@!lALRnq^|bVy_ue=X4zp1qyvn z8o|rC(G}QV&(b_T?qPk>jg4?Foux|t!e?2^acc9vybr`m~_w6AWYZ$n|c zx^D#W%s|Hh!o56rV+475__<_#quBF_ZEo)NUCqP6D=yC?y||7&^@U_Oh)T*nja=v( zt!qa$nzW1rEs>NP-Yo_>ngn*c2jq|CCvJ#N&e*OaxwTE91k=cnM)vYCSkChu8bZDV zI+3pmswU22=F;-g_I;mq6I$I`$k1FtDBXDELxx5jL8LO(ys)H9jUMw6pkhkv$4UUI z^D9c@!y2gYf;8j6;(#zJu^ND+aXS8#kPu4X#sDW>=F}7JrUzB>Y1vy{v9+e!yHecT z_J3e^R~L3@Ja?B;w(XUI01jH>Txaf&S`rkQf8{#!Yj#KFPyBAnYa8C!h(2+)t{yn$ zg3k8hBA+(381lmd1x)I?9(bXN8m*x%uVy|@BG}e*#dF$D+XTGZw?WoJYqOS3>uWcV zWUP}(^poq6&y@kx@B1s-t*>d@J&V|W#%)-yJ3X*0%l4CQTmy4&KIreSZdOBrkwOo3 z2nQLg=ZY=f#*xa>?sr|1`Csh6X!d>W^TjsGv9Y;Zce}kRw#DWoz$26$9n^0WBTjYA zJWXrR-WgNyXJakg62P+=RpL6sdl?L;(|K|$89x4|(Or&PZr?>5Q(WJ;w-)HqeCr?} zL>tV;mGn8K`AoXEX|^#x_`|U=Ia?i_+E|sYV~+znlf--5X%~lq z$kT;tLCNjAjf*zZxSwL$Phqm0t6N#!OfDsl!Z*~+0`HCd?&N0}&a{SW%&EE?Ix)Z` z^Wl$wr2t#maqPJ^g}i%KdF{4qJ})jUV_Bw+2smVoh!2B|jPRft>7A79Cc|kbi+f{s z)3R4&&nDf1S?zX~&M>JeUJ$ZR0=}Eu@kthSVg*t}NuJlRc6`fY9Du1}rx9plMLK{Y zR+SY^N+gPijs!GDj2)H-T1%dWbo??9dbU&)Kw;`zdwRn*2W~*RDSb*B_Bt0 zG<5s23KOrmHDTv^P;w%jys!N^al<~pojcd_QhF8=LRo_S9OKN5s6XFPR-dU2dIP$w zOCa5GtHN~G(DL`uL$bMoL{>0il>KZk!(KXjC-SVETG-V|J;Wpm=)nOXYS0}S58X8i z7xpR2juW*XCvSBm+gr1fi#@0b`OU1FTHJHQslqouYz@=QRC21Ot$k6vb2QC%%W3{< zA=*~WYjX(*(8w@Qoi}&5W1-+{icYjT>h(pr`!KP;&MaB&ZU&{}B|i`s`bRrpeC(+32j=V?0oMhI_iA6ol#jnZ*m~kG`f=d?RnFjQE{{UL%wOQKT8N3Ul zH!)o7y`ZYmx=Ogzsm>|$LPXS}47(a8V$iP>&IZ_zJj{pOuItwL;6bJw^b3ntu z#R4Y)E@%*kkwr^oqO_8hI&i6Fq$_ZrcUqBz5OetY)1g>Ogpeo!>Z2I^X_7GvVDbJb zh?63ZeK4W1LK_B}M7A4l#&MiiQ?;e;;%#-I5jHQf(Tu#u z@uKw{7KcViBN+HlQY+1AZy-C%$E9a1X`AEED4NTijHe|ro}#&@!=t|!>J4sElV(h$ z?v5NQo$%5<9Dk@ssafEaIH?^?bIJ`Ju+JH6!N*#bjZ};a(v=pZLn!I%Qqf94?(0)U za|Msif~*p{98l2tfH}^2@D(&ZVt2V`9{MPDNNyVbGy$1h`cMQj4m1oM{W?+^3`ZVx z#4mgTPZLEB!QTdo5G?pVwI+j@Q#sB@3PR@!3FVElna?rGt|_A|l2xf{Yh>CGkjvu6 zrnilpPH|6jl-k=7t)w_zKPuW8dJC5IMxCu!jx`msnGPfyby1+#r9N?Tn6cwH9=^1> zgOr`ajdY^NK(+t}mmx~VMhhGsK9t1Gj?CCM7j6#kht`Db=gE;p9fr>A^}Vu!!z6L7 zR1Y&R5qldhlm7sQ3-Nt~%WkvpM95;fjPJB6 zaC83vHU|B_8XCPef107ETJ-$fe$2m?84NOj=4}Wgb~%9J0QMyu#XNJZA78Ke6yt02 zPw;dxJ-pVy?{}8IP~>IeJs;E7y7X(q*yq(hA8?XsEnB&|@xVudZa5ykl+>JbmcnsT z);p6THLxX9yt8rRjBC4|Yv^c|$Niw6H~WR1$Rpl>ch)j_k#*e%i2(BSsDBF6ShAL{ zT_jgAtPq_(bF!aY4--Y|y!U@GQSz?v_Ac%ApSeS7Y_((;2`C|kBfG}(vi*s`^AEkm zRAj}~Kj-iFE)%^P{yxW#_S3O@OJ?ms+8)gou-jJONiDMKuDsbtmQ*~!r;9TAC-VDw z6yooiJDr!w=Wq5`YON+&qZT_~W}?0Qqp&PXlAHFyyvd$9^5*^+FO|bNbw0~3dbBX>&BG0w)W6*;S%3dS933W8!U{<@~Z;a$m8qnS1jdg zQ>H4mA*DdL7!J#Ulj0?OqhCz%;Zo#^Nt)fQw=6bnB3qdnHYXwlz%Ccaap}*OTFuV( zHHIe6Cu;3&qqjGq3N39Z+S^enSngnnh=v%$aBG(s3!LufsHBiLq3K(9c z?qa!JfO%N^#D zM>%I>>Uva`D|`l3&gkY&PCaN4w$81oQ>u<&3IH^bkf|fW+yMM_pkoR+ByNQnI`Y&hOP5XNlMOSLDjB>_jOb3Z0xC^sGDF@t@b7rWo7v7i^bXFdZKJa`2g$Ts8)jT3 z#@g+9TfWiUTd;4M*h0ixZ2XQ6@0Xc$>C&4QQQe!5Xm;MuVRkFKO_$m2j&62_+P{pF zJFh+7(7DL-h;bBSfFw`{N7>%p-&}1z(ssfbq}hKby9V7YHg{*^DkGh@3_CK-QL;n7 z*G%JFbFAlzGhY%e86_Q!F53BS+n4(u3s`JpvDz`q9J9;_o&qEB1xTe0m2>7vGBKrd zV&OR@cWG>IlZfVxR_2cLwmTwtqT1UlWWQ#+Z3KX}*VvP_t)$WC#$MDPqLB2A?jB;h zY~`c6>^Ej%`AE0gJ*@3r!d-0`U3PkRaU>D5Bzxj}p$Ja$R^Q{MajkRb&Y{rT79L}h z+B+Ka?1;9e%Cor_mXRy4f`02HBRd8vRfv7o2Zu^9aSDE6mkWv9_EWYS zC$_ss=OW`}_H(s6LTKUbPRYE288%+quvaXzMIFWwZs7+QE~U8dS4yJ?vCDR+VtkS} zYVWpA&DzV^U9Dqrxo>he_J+W^b=`5g{yU3r7L2ETGp2Ds9*Nl*SWUP_YXPbmAZdMqn&0fc&$GA$zxM7uZ-Nli^{{SWU z75k>Vbp20N{Q#IN1K$7uI?20%z5f83yj1jINsSAUWKvc@TYKB$_#E39-vjLr5TwSK zr+njh1HGwX;#M7W{{Y-I9O@ZJJe6Z0Z0X{WhIHg41I)jCd})AD6d8ynRQQdlJHW5n ziMmj~7uZa1d=fBZEhW0@vkZx1ZjJ8i_|xXEA#(bU?}KB!#<=e17y$J5AIh{+vM8BQ z5({QI28%EnH=!S~rqGiV+lEjj`WuDvGWlEFdH(>U)IIglmY$kwiD0cRNZgo@3yoFB zL;O>Fi9HG%M`GIFMA1l^k*s4z13AoRnESPcObSN$^SG2PwtTkHtWvjq8VpA;>Cp28 zRuRP3=FcK~74J53wpkAAq25LuMt`1l5``5R6kggZkD{3Z%fydnMe4N$Y*YUL1cDi` zd&n|!mr*fNr;vPpyeg?|#eGq1U3RZ#0Nd%bEtKPd5`p%KT@6U5y0FN`aHZ z8dS@NPhys4jeNTz?gq?Fyaxqgkyy(ETN*5pU@T>b!1t40-5yBQgbqAu(5#kq85p1l zVkj7&7L$k^X;|n{B%ZW@G|wJAC;_B^HT)_l$lbR6jc54wtI1D4yjC8QAoIMo@*-t0?$>dAAa zYcpMuvr;jpl)#PMXafpJmjsHam_SD+zF{?T6}Xsa9JVlZ|664IOaf;>zYW=~+B%>5mZ> z4&!w9R5%+f$XVVRkaVeN(M|L(EMuDY{pzdLlVwMIL94xTE_*P)8nFxaO`s0k@(iJ z;SMaHsrEVx9f4@DhF}T6Bv-40f`=}riNt=Xk-Z9?+!0FZiZndyo={P3BBPp8Nwy~T z#tWFpWy@9>FeY|j<0T!=Ui-5yr0#Pjxw$11)Q1%bBTYWXxQ&P?Xy#_=rdDeilw)_{ z)}JuI8#>{}h)+*_K4Cf^4`=UWK2ir-X|`o7u|>16S`asZ&2(eO-1B&jH~#>WXJvcy zHQiLlB5SAi(dJ7$rMa`W+i|h+jAxB5QFEf`zP5GIsWddjxmVzGQc!lcHx_pbacbr{ zSDzw2%MN0bKy}+IX~DE3ceYTs7|qttJR7UUSva+~pjh{cCWJDx8+1QL>z?-A{{W7n zp`~6QR5acA`++2V{$QLbxN((WaTMw}GLhwB`BC#|_xeBb8)~-p8)LL)w3iO&BM4+} z1bvBz=+xnn#q0Uz5`t^<=yW#o#WX}J<~8#|e97vaR=VRP(a$Kf%t<7)D&rE_Nt_ke zchr9rlX3Bj8%kah4Ppun&5_@U{P7PfdXHM9zp6T-Tj?#uMukgVSRAQ8Pioq0`#0-Q zqhAz1lv{VCy+tB<=CK|Uf6Ul8#!2Ep@RkOfu=hsd-<5j+&Xqj9WwEk~ zD>r3!r+9~IO!pVDjV=k_(>V_od@Q7rO6Y4W(vx(TDk?LLXlxS0bi&KJw+A>>BrD_0 z(U$U)?MB)kO2e07^BWi}?cG3OmWbgMa-~@D?(?i|_Zv=`t)m2GDKQ&EWbFN;Z1%fK z-Yc7VPVW0I>X+a*^vp8)@HI-;-}9+0CURGug6#&+ignmKM>ef&Y^K?_zC&!%ERSv& zWX6&d0of0TXiaut<0lREM=ov>6Wc~z3uJlwo2;KOdoc4KOG#?NjWNG!Vpu&iU4*jt8c>xF_t z9i$g=s)BCs{A-oTd`cfyV=ah!A~tpgtqcBsWjAwvR6@2K7LZ)3~vphn|oU2cdH2{(7a zQj+d2OM~H3e-$~P2#>phWnnsR?%}c+5g)Jm^YEYtUNyDM@kXy2SvU)GD*zQ)bY1KW z{{W?_0j0Rv)~aOOlsksqV;&kZ$IH2mNIhwQvmNS2_SS6Z_kck0M9d7q$Q{!vpAdG( zgz?gVEyLKJ)Go}v+P6C{?j4=8WD(y_By5Qc#DJ>tw(Dob$9GKn(9l^xtS;)Ctaq1L z06E?#O!|6IF*4eyEXsUnLddw~{{VUbyV)+-_K&iclU;0S)fROE?#^ZJAe~pszM6QK zJ{B5^&n7s{Q!W`CU847EzEZnG+Dlcn+7a8@*rD$XHtI%L4kg^N1Jbg?!p9r6ZJK1y zDXM2XvYTXoh+8(*vy*9Tz3=ljR`T~UN`w#ua$&H+h+(F<$2#gp4D~L=T6SV5mLAV- zl-gaBznxQR_Frx6)H^~urB+*U9^4#yb7={c10vr--GDrWz?%xntp6{Tnw_JYs*l!jfH>+a>ovB^NR0 z=}>~Zt;o0yVzziMkiJx0eM z3SKPB4+$eVE|}sm%zk36KHCu2eZ~&rScXS^1B~N|80HB70KHa?cSP!+h_cNHJ?Rr! zomNrBf7S>7;Ze5x6~5b%BLJg6Ne7#J9}OWde zw;H{QZw_3p=tjqdc!D~i<|`*1O;m~(HVEoh$X8V(P1Dp?GRA18DkCF(9l#soMRCE` z*VdBpDfku%i7h#-wPnHKPSK$7yzInHn*FY@b}7ONjm+R`_wOs!`dR zd@plvW!r6&FpuXBZQcC6=)foaTq{MH^)q;T4$xPud4RLzU{Dk+XWTl{9S~TPh1P7eFm(1^%g0pUnsvljkn0c2`w zMnK`5W`Uv#o-Ak`fapl*I?`ZdaT0Jib)f@gw1Gwm<5ZCjLw8VVjcJIjcPLdj{Hi3& ziKCVSEZf{V)>USfZEY>euA^GfA|%TzrBNiaU}`7=t=sOWL5e_fr47#0QN(BTs*#f1 z?QP=Ri4bxCRGP7&I`F0eU~wEr8e##Po@-oj>SdBZjQmX*CD2&o)IHO{Rwm@`nsgyD z$cidkDI-~RcBGM6N=C6oM2O7!#uu$Z$INQ;IQ1=vAyvki=bp9G9vUeazBYHER%>X9 z@Zz~L;Di~j)fOo3&-!Fif%hZFrx zi`sB4oIU0->BhQO29mRyU#q(c-pyr&CeUw+##j+=^$865oNMsuNnu8E<0i?D-ZFSr ziU`74r23bjwjC>2#KKc$mI{LvY=doRH=rJ?UX~w}^RqvQ(M+FBCOGdMYt6~?GtkHK zqA`J{wFTHnne$?m51O_HOIubRBo!|lS*&=8uBBJmwoG+V$6BA-iK^n}5^Vc8!SD~l znu0{jh@0vd5iW?JW74XOoSWPeZ5*1iilipW*Bc(y!NQH|t7KAUqU&Nvq_k&;0Z*Kl zjMvF;dkNrjIAW`rG8|e3Hig`6;v`YZgPEe-J8Xf6rN~m5avijZB1;s8DUk0Zi=hUg zz_lcH-Jk6xzSnS@%Ldm2RN)=SAN;E)7kAg(uVZHM#__s{+i)DuZNf;~?Z$fkMzf^X z{C4skiG4yX!-5=c!F!CWkNI+rzWPn~{vZ4>^7Q)?1$|HwL#X?4{**>e zFY{0EHk6m=<((Cc=(s!3l@l<`uxIGzQ|-omlU;C~?dj2+^Nnxo*gP9jZY=|MWc@4$ zP1fh1vS@z>vD>J8+Dp`K1;_cDM%wX93y|lYN^!(d`I?fuL>ZF5)bg7VbC)E3bs}<6Pes zHKwrq-09|1-$@Z|w>x#R4Wt+Fe~nw@hT3XM5{|)hy9mRwuM)#rwUKXhS0Z{FOK#F# zTwOAYdy8w83}Ckq00u$%zB5PwZ10Wj(5t(V)~EL!@2P*btH6EDj?vm|moxX4`ytNj zLlXy`IE=nV6yW0;;8vXKlS@J^D_8LwyA6qLvr-kc2@plat=QEjQgus?r=hEGcYS(3 zkHMHrCpY}AtH{{LZ4~jnyTVr*$!1TAGxp&;*V3*qQdHOR+r=3wwGMv`#jtK?SF0KajiaIj+Wsma}lZ}3US~XI& z`S_Ua<0NR=$#uYVJK@w1XFhN_t9XT7+9zfRjgTN!-%nu_<&+=!On8o{)Foe^o`HAy z`RZ4>v$DLlXl`JR>d};^bm})UbU5Dnw)8rCsl|z|jN$G(19!77hSThI`L(&WkjR#o zOWs7X?iAnMY?!50bGXMr?AJ~nGEwngQw+Q;W#G*O_q!a!v8;P}vu-AvV9GnDBN4PP zgDP6ZySkD|dp;WCXZCB;#l^yXbv*36EaB5ZJ*e!Yn_2r)+U>P^+k0tV_&Yxi%>_}X zh9#2e#_=rHdpaTzwl`SknXZbnn$BZv_G4x2ZpQ3OJDX>??cZr7O`!}Cvow}_HM|z^ z_bcX>==iX8{3$duQ`v6GUv`_c_WhrP{MK1r+h|=l+!mIwYjZ4{*xlS*jeV>N5*hBc zx0@fa2|vmkT1vf|+B-fSnX!90VQ7xCSVl;;y4p8Rr4mbqCGt;{fOn3R+9e-9ZHxG} zj?=xpiqb16Zsuu|XWQqxfl1Ohv+RLT${T65zHMarUHP~KZln>vs5+|Yj&uN+&JZvQ zzrBS+!~>1e7p8RMK*ns_Xs-6ES#-f8+t;177d@-mGK(J3 z_EtZetamZlN-fG-lvx}XgT)+(26fJ9v7H5OH|n`cRPycs*&0(YX5J}>g`pSx6qdtYMg_O8@y z?MahpUPYAKSB4a~`RhR2s3u6l2?*1{d2W-ZnOuWe=btQe-Is1vq?Z#54{-7Y^Uj?9Z|id^feNX=Tk_} z^P#MjUfx2|l?yh4=||AX%M!1$)r(YYosHca$^a`W4FEZHU${@5KJ8H=U%O^i2X;b! zjHi_K+$VwiQMF5=m56A!r3y~uqe$6!H{BWk0QYV1sB2#z&&n-53=HxgFiEgfu<ZimhU4>DRNL5xAT#qn?Ni4YH&^hz3RXU0nZ_nTw{QHha9tqY!0U$?mnk#+T z7m@U;PpF#cSl;?g#;*HrMS2As+r@-ux|fWRHxK%UuTf1q6GHp8 zLd|S2MzUHQ3?H=~f9z@+Yi~lYzo{_E8)cyb1mZ}Jn)3xul+%k$B$y^Jp!XxZgdCf5 zqbd7@@b^-x+t4q+s4@uTK*PvCtBwbwuMtD0G}5U38k?PvWp@T7S)c1;_9O$^U%goJGgTyA zmgNv?b>)in?DJ9*E<;q<=*+vf91c_gY8Y?<{A#F{!*>h9fI{+Gkif%dPsWh!aweTm zT68NgfDX8z0cl3=D6pY=oq19y!b19Wqyo`6r&l5R|@(!7VF*EUS8o8!ens&8q-*0D7%Y_;yM;dAz|emYjTw30H-tXbD> zxO?r1FdS8KJ{9U`R|a{wolP7QzEFCOHRB$@f~2?YQZcb17$h2KQewMB7X6EL3tiFH zClvH$U5zl4XU0CxhPb4)J7ckLyJBi6s~-$1x}9p$A+i170|Khapc&|}qoA|Ewjb%Q zQy0p4xqf4wkmhMIr-8!GSI+pr;-9SCJ*$Y4hT4OWa=qtUw~+qkx~#bLFjTWzo~ zws+@5pYBP>Is6;nSY*Z5>-RK_`W;)w%+f~D0XhEw>MdKzARf|ZonyY0uWsf02rLm3 zymmI~cVW6eSqpuMJw0k}mb-WD=2d$8n2j~8z7^x*?vp@&^B_ErRijwH&sFvf{{TJB z{f^X%=p!?Z^~UO4a7jMogORShc~krS&Uxdnx7d7;$c)q5W;xf-Zgu|vxamWSTE~9C zq@I%7xMgD65v!>&+{NMqd6mD4x>*(f08%F2H(%1ku1$Z^L4hQbZZHsS0J^XAOWax|-af^1V*?ok5e3&b7B8UBHjf>8iqH1ew7l2YzubL)hxZirc8wCrAZE3U z{T0B-n%##}#{#BMj_+>$QEG2xziy1P8p|A@5}o{@1($?3EBCRYzpY$TPsRF6{F%w7 zygsY^4vyT!9iURs9WHF2+4ok8HMZSR4tKu&7}5~LBwgttOm4dUbO-kpdR6rLqIJ6K z^kt0TsdioI0NtAyj$cO{o7S}R{{XW;FZwE6TJA9jhjn~S8S^3P4^L58$`ox0-sKrB znmn*jVq!bRJ{4o@kE?&YG_0H}^Yc?xD-=p@GD=!Vv-FJmI)D1mzm$vdrQrVnJpSct zy8Qg?42vKnmmq)-eSplWICrWvkqGvMOH65qdw7hIFeW>k9_Mu6I+4OBIxy;wr@EDT zm41ag%PV`-Fc4FeE4-=Co4GH)f#qCwb&+SAv-Kf~{?5@(pXYPANDj8u* zo3;@fnOlg4($~Xp2n1)IxvxtP8wu&NJp8;Q;i}aYr|i`GE3lh&dlw{|Z)o#@z|Xl`~7YHmAIY4Sy5+G+3hMX`+S7|v44 z&7vLc*cm=J?RjMG?`eQ)Xm)VhO?FV)_m8|!{Qo7jPOS+QF0+JS214ZA)ho&h3 zZcfc@BE8T2Kd&G|IB*mgT>W^7%NWwYnm z=V(i7e(_6wBnK~RDo*UKw-6&NZoVkkXMx3OWYMDeN!wp1(Jsf^y_LVR+1w{qdM^{4Hs@cT01-1O^bPCy`R6ii)mTOZ5mu$j_pixZ(H815i9*PL~k<# zkTl^)c6hq%J*_^|9$h1e5k+<7wG!si%8Aui1^SYXqp5 zZyr#5;^BU2GwzHCuW*@}!Q% z2ZtmI^0Q>;muJxQF~gQU*HdfWZ@7+cp}1cp!^+>^Ls565(Un!I)es&?PScVOSl0%?ua1xJUx-}MqU~UlzZuxS6c-@9sal^d> z%)J?EWV?|tfVNwtXKl45+Pkt{za9~uC0 zZto?xL4P|oJGawL@D2q1u~bO{LAkgPuu;7B?dMU|8`>V~0At9V+Pthv539OSmS0Eo z{HeF6{EE8<)2juJ;E3G)RO#g;{gQw7ntaKvMOCn;-f4hxBf2_8aKBe59?O3RT9&Q& z`;?xZ1c{$}5(5U^RyYOPF@&xWFAx7gU%#eFO z>O<0{=u#6jDSdQMPpUDru!CD?l*ZKoPoM? z;c;56HAZhy{{TaFr5N{9CZk+7daqi&CE&@{C3#rxcQ>FO8O`nD8uY3r%x65k)BqC$r&7| zpt5CjMI(keQ1k?f4{^NS{#6!fL8`IUr~!n5`%@4*rH`mIhEIVM=9r4@BRgrsrA3uP zQa=t(o|MuPV=@4y0@_XEjQgrv8bXO~Tn!CI)^ckXg<4g5U+*97&-QCSL5tuH+^{IP)~nEsge=rUK+R8T{xduY%2w#4lBvWg$ zPaQebl|e?%7wjM89)w4jbY z>IMckkL^GKBB>gVGyzIW7^OZXqQRn#&clI_>85yat5ak+BdP4iYorMt%iGcxMZ(!_ zUv4ruET^YN{A(%2Kh26(j>bfkOapGM%Zw}k07`Y}+_FdeR&MXd=*GUD#bbm^M%hHL^mb)cBTE&gow=fyZ|~ zW$LE6oOSU!RJ1Fzh|Fn#s>gZ)4(bv(_fP#c`;DQgZofZ03P>jryl$=oC$}2{qkI1V zH9w@?8FZnoKR*yJ&(5WJ<8gq(NtH&YMxHhOCXS`A&cEdppXcVqcHR+ymUCNtsj&%v6>cJ#X*&Gvt6HdNa- z!fRF8vTZ$>8d%$9#H}>8kx0KvlV4n&>7|hK_}8h2j)eEz^Rn=gj@ufIrSf$i)a=h@ z_77!R$!+AmRoXjcSV=9#)y!S>$8{p)wWiFrz;-wVv8HRXli22}G`+S>q1rv8d2QL- zHn;3=VRmYZ5jpM<*>7Op0>O9Wy^t47YT#0K2PVCp+DEdI_MyT>vg5s7oo*yzC7yOt z&)lv&YY-kb#lM0G4?ejo8;7V%z|wLOm@$NUZj6`1aA;dtY+f zvlcNm<i&g_v)_ zC}5-pL7n5BPaaeOYhd<+Z1#I>LA5q*%WVClXw25~?yLFNc1X_fW!+`sF|9NQdD-uj z{>II>Ew+zoY%Y5>wc7%I(sotNvfM778`~^Mj;EPbYNW+Rjkbqo`$cgb&e+%&TPl0I z=Cj$Iwd~|31fJk95q#psia=#-qaNka!89dfJu9)hJ8x}n(&t}LP)TEY_o~rN zw54N#^PTjHQyv$7IIaUa9u11);xm6rIxyq@rg~!pF%_RL68`{Ggs~sJ{MQRz{{ZOg zPq+PHYZ_*PPhq-0WChlPTLJIZh(Qg_#{ za$AV%hg#0)(yWEKgr@u~3|Tlu@UHhVx%#K-r%E}OK&C)=z%2`SH;;K4@c6on`5XTL z!8Ek!KQU(Iqx!H6WZXHd#cUMA`}0P(2)UrB$fz^dIwm z_0$BDjs~Fr0HpM*<+M*V6q+};$Uq8{tY^#bUWT%2jaH@@;hjSa_(=40G*V)=f?0Gh z-2mv?ETm|2$+{oPntd3nswlw+{p-+3`ZFr>z4aoCWt%u%S_JJLGYs zHeZS?d9^03A{!!UHwF}B(AXqUm%WgjYE45lMn?we)MT1eI}GVS7zRxMOE&1h)rSfg z2`KV5zlAEWveb6!iBFTU0oOtXy(nNLrVs5?L$V0d2Tag20L?KDj1oV3 z1TZZ+0KgOg2231Muoo=gM%kjmjzej=p7bj46w@<%okqjVt(q%fpR+cJ(-)q$M3(a-FsFzq>_`&FM1wJ(Qujo#@eO6NKP5#v)-keehfM?p+P zF;zagQDAgYAM&LA-`c%s{HK>MnB?^?=kFTv<+iB8h$k_v{8JM`_d>VtqV5u zQ9#*tC{=Z;Br_)=MTiz)H8c#!+!N?1LSxlKd#Z>f%A)(Jfvvc>C9*0@NC=A^PYOdH zpwscDAXsOQIzt7wQEFnAU?UX8&8($D_;<+hMo0AJ9Mp1dRF`wCI}+|KPjNn4)wGS+XK?+JdQ)$e)A>Y~Hml|YqgtsL@2sC! zkBLuJ`?RZ<#v@Og!bT6HjA!ZgdwCmD(e(Ha#)YEqA7I_~m$@>)R#lM6y8i&tx?X>F zPk&k^3U~GUgk`0DKEXz06Eg%6U6J&We@;+2k6NhR{{VNnF01=}f*XYig&T2BWQT;2 zw^aV{YPxCv07CQs0J2?UpKzDlmp?-~Xc&%K@NS}pl)U?iHy#V#+@|}Mpt@EHBJjD$?z50_ z<_OK^^+wcIs%CB^ZltQhBw3P7iESHHa5#kwIQ3Jgsq!D0#qEES3n{*Ff7uI`*tfSa zJU5nc5+Ir>G?FGxO8giN8oDuYGmpycb}-3;GSXhBFSmBS)r#8s-?n=jek-!!R#n* z5pCf)o8}g)zjL%@V8?RjX~|K@p-Ceo232wFk`8sLU~3uJ zwo79eJEx9EJtzX)Q$5TE5Qa%2-f-bbAyj1fK{ym3C$o1l4Y_KIu;A@8T&cE?V$2GI#j?X6CwAr_^otrmgFTRp7v~<&X)=PVs(NB&m zh>}95A+jmCD63$j%;@%x&Dgfa*--5J&e0)^AU@*tPZi+^gR_ z5qFm7=N3E~AL>SZJ>4oUm91h`Th~bg4bh2v>qiq?G4ZD$d5n7|g(_CHK;wEn7%MzG zhvuL>5+9_pZ7_N6XUcszQngxb*ll;;xXAAjqsp^Q0-rGY*ofrAiO1tqrTnj|C9hK? zy^UAAb_E<@%m!m%cz1)BzMGJeDPF@IqbZZRGSTsEIghlXk>V>kt2B(L(aUt?M(D(hFan+B zW&4@)kGR^7R5mn)tLr5PLc%o;PKupS<`&jVUUU5IPBu(i01rW3~r^FmIle(x}SD@d_4TT+rQ zi1(55lO7@H`8Kxvk9gIzdnE6!sSbg07l&_%c zsRe?JD6dH263wo<`}ksz#7S@laB?bJDIlU(ms6ttw3eXsF2fqezO|x6GEAD|mpoBn zK$PFpms&sz6ipXTT1=!UxH<|}Ix}}VnnMK1uIT(|upJaT+^M2lETk%fhP6~piGh3akHh?G?C&%-l^)SlC42aHC$Px*-ZNoWYGGbEi5bKE%crS&k5gKGEY? zn~f0+WYeJwaH?}a2zS@kkkF^e^{E&*8K4cXXJ;^N1yXP&8^0bRx;S}Mj(#RL6Qb=c zx6XD^kw#uDI{Y}-cM}e199SjGG;wXH&*5HEJwz)bI248)M4jMu(}it?>SdK^Xk7$* zWe+CM^{qIFnQ-q~Iz7M!n)=r%(_);cI-O`3nI`~aH9W;6Rx+27bJPk+>J4aiF^pL; z`=|7;WqgN|FPP(t47WU!n(?0JtsR9(!ybo?BG56#mK}JCNE<2lH82W0L&WgotrRN?RSTfyLlB|{3F|->_BUy6HavzI6x?jt57S!nQh2<1 z;C(sL1GkDxN$k?%34U|4B-Sa@JMfXqsK+tHR5eTceTq-l+zDcpCk`1_>4qbp`d16~ zBpd^DH4QZUeviy)ro26bl?3m`8YZ_sIDqscIxl>g3`lCB( z-(RB$J6kBWy!vZq7)kv(XZfP}ei>@JgIwPfbbX8+<&QHplW=Y&bNf?Q4;YI{_((0& z0W(`-OKA>djC1v0T7NF9Sc>_ydxaY!MczU?%Qy4KjaROpwKVBk)*@>3dPr=7Cy7aH z!~H3jiXT!rRk~}#xhb^#MYtwaNn5(PU#Ykl!}@eS>X*K{KI2TsDPa;1mD*XF*71x)s1jjTD9EFT)p^)h;E%*Hg+7vpHr~Xj&i?#k4it;Y(H&2IA z^cRcIrcDXGrTj2yJ!AZ!%Sy5pWmKKK(VwcEdUR^7Z^!7xrFeZ%GRCvULhlBTiV>HO z(2s3@u|%V5^G~=ba>(OelfoaojABTR8fesx13FC+=ymB*uk-U%Q?Jj>7^j9OMKO$xS|nE8 z8^eo0=gQqm@y4-LbKsS%%xF?;IpXJAEOU}sc*mMnMrmT9m{vE z6y&7JGrrzz4h6S->(WKkbEclU{(g58T4*_(mke0NFadi9 zaDurEG8hkdt#NTPhM!OJXOjeFuhiqVwf@_JIQCC(_HmbGeI>lRY8cJQf$uK6`}@xC zQg0_uqe%`o7t7MUTpV;KqulfI@Uo7pV}EQmHs0-3mu>`$wBWF|fi`z$;4#T<730Xz z>^+YW%CV6Z4EH%3s&(OAiQdOERC(8FHa^_8*>iT6w71d!0Eul)t95F&ZI_njOIANT zx=9q2?qiq0IOmm35+2sEve^BPu-W1@m$W-*rqtRqOqi0&&}D6HVq?MOT+1(}=%I}o z4VkttwjR^B+FK`RJ(kk8W87TD=E=~72P(j?nMlDDfbK0{Wp=XXW=poaHGi@;uGW>K z*&VX%>|ZyA=IT87q_Zrrv#Tk|hD3i#vV2)-)Rr9$J4^qjTUR&XWH(gyGcVXB8;Vor=S zpeUERhDBoRcYzzk=*rv&dAq^7NVMv~0wt8T?(4IIq@hok^}x}-@X+(7p(oH>%ebqE zcBgmVt+b#aEV7g+6#5@wzx)$cxM{wE{pc>Gn@yRv?h&Vg)E@9<_nAa95yvVC+}tWP64ZrwLF1anqhfYQIihS(D?tBEt3}6L7aI@82jOuwtQs z`#@-GSnx1LZ;g?%i?gLM<2fGJI?-@&>}L46gS9&(+e>HMS}py>jl{@S8`vDjBu|e6 z<#>R2j$*W2JUbEoqJ7Vs_Fu|pZ@U%RiS~ZpySUmASlklsDOjnr#ByrY^p-czRo``3|^3F*Tqr;uCSrezwMmQpJ;;rmk%d@(>64FV4t;Y=(bn&yfXg}MOrr$RJae&cdBUU-uJ zC=pUYik4CoPE8;Q6DL3Rr$9P3F*3+FsSG{!OGZSMoz0}Fbz{dOMEym2@Ru}CDr%YM z*O9fo)Yj+vOh6u-tH;S2Z62;Eb44*|3ms|=3kbMj&(gHVxt>jp7T5Ya*rntfO6$zN z6PFXI8?z{Am4`804V~0eo=krAEtHX1voX}vl|wD#`eX;257w$Xkv*B(O1riaV@xUi zE82e{fuWR>QNU+mJLE69R?C|oJxO$8aTyG?ztuMF1smfl1DYSE8^MfCeG z(Ecw#^zMO+d(o*; z_9gpE@2QgOeoyXFeLkOIF9Ob5Cy%?iUmM%0#((o*Z|~NXb7GmMfcmdS8e+YW0`<&1;`&oIP%CkH}O^1$K0Nt z9>9(!CXbe0+y4NRNA{z`>GlsFuiTCGNP^4s)@RD&%!Z4luCewCx2BT!CQK+tc?nQH zhV?kF-F~8*(_8+2;Jm+&v64oTKX)pDG4Tu>B!}%IdoTLX)w+B8f_19f*w;@3$Ce}* zkA#w-DJR&Kc^}KAVJO$8 z+Oc#kHV1q``Mt(CEUU#N`@>&-WZ&mU{!2^qu!(MoSp$qbY6Pn&S7cMcX29{rc{r$Y zWhjVQap2r$5cq^Z=4gKWE2k|q21*ahwPsVdKzj%aT@c) z@u+3rj2t5=-DPfLUn_mXq2)trfmsiE8zM(|NlfAk#3U7A`GeI>9P4N59KD5J1ebOz ztSpQQ!E!uN$fwz5Ivo9z@SLuWC`%C2N#kQEg*t1L7&d|fXCB4<75TuYnc)-(8 zb;pQTMh-S`({y8(hJ=-zt>)U=yB1qro!hO3m)j!W=5U*vG+Z{%+1t`ZX$s>JtoH;w z@&mlugI>liGBewL%=2>a(vGDY`|i(eEB&F`i@l*9+uB<~+$5=Xd%JP9?$qy0BLjQp zmN9r2BUcNG=xpb417O=*Y(C6G47&w8Pq#Z#rf0Av``dkwY){fg@a5v3X-4>NNHrKV zUqCk#TVM80%J*h$TaBe*b+qJ)8T&1@nmeS5H)66#z2A9ha;G78m`5yasLd%&MOz#o z^nVcu~|Tp-8^8O?fDL_!H%Tnyg6i9TWs~eZNVxw#^P<1vqXs+J`dpIfsXxC6^&xf^-JLgPg(H;@hG8Jr*8^3mTnpCn>ARi%u1LoqlV2dAZ4 z;IZ~6{anL~v3m&!VPz3uyP=pCJH0YV(zRSP7eXHsH`Kot!?RB;D7YBNP&DaQu|;$t zT{=-fX>4p4W$lA!ySr(4cVircn9O+p08j;g z3UnmR_stikv{1qpqooueg|Njjgf0C(6ahas^q@hDbEcF5^Pl`tc0Fx2-pcJn3543H zZ0~S1Hx}b4$Nf_qh zO-qq#A{m*^4I+$Kk3JMo4^#t%F&N2;01@f=QUX~`6e}?oG$bn?shoawNeadU(yE1E zNN@?^KqHXbl9^{%mzz`rIvtA|!D86z}jTB^3bB-08EC87O>CjkN7}9|Xc`$G}(y%(d$z1Q- zcT9DR07P{dg0ke=0=+me_2XR2EuLsw#vDV$G*N!hji~jIqh4BCOXq$o|bH#*trqx%kxCL5wf) zOa(mq$8~+w?2_HIVB=4P2u!|;G^!ztASfcJMOm48(qlzATbDkRhep2Pv!B|Plxr?f zlbQxj#@d@xVr?b9+0t%G2JEpmvC5g%Bwl0Jh^Jy`^?il6Yy%X5}O zbly|U9!xm%)}gA^e<)rL)U_lqyei6Bt(4|DS4m)D)1C)0P~w{K`k|)p$J|SUBN(O# zE+rUO{*B7~I5*}gZ=>JoA?>Q$*ly3-a_sUUn|#_S(T~Tx80vkHf?DY+YWVWhRs(n5UkpS%20 zs@rd2-+leeX;ouYor}OuBD!BP9$Vh(eA;WbaIJLTuuAeIo3e!xzXv~8DD~*xw9~Es z0K*ekxBU&9spmD--Qozq0*eZak`L$7BNFvCMn&oz^67!*F;Nb^e^Rh6$JwRG<2NmL8fK(SDzm?nC1-t(nJdZ}@*ZLRXsE zquIADqTIyZZ%HBpb*s?f@MeaMrjAV6u*+oZEsgR4+B-|++BY4fi8h2zlErgt1c8Ib z0;wU$T^CI&yOiSQM?tc_L+xzu{(mOexVpP}URj<KCxKqXFiWmEcr_Bk-7AUTSJd%A!uFQyVP(B!{ zQAFDsEEgOzRYC|@r`e)_F=o9e0L7r`Koj#|IZy!$ahd>;Y&uW@3x7%gA#Qq8p#}3} z(ts!C#83vOv|Bme+)SEF5Z^`|Lq92&6=bu8;Yf4<%bcIWfGoxWCQg+^ zlg9N|DdR!s2zEq_+9i$}XcV9voMH5gurq zIAzNuaZJM*>%zRYdSYZ|Ao8iPm3D*%NIeLzOB1-985KxI#b5Hp4-`1BHfvMR#_l8T z9TXjLS(+nXCD=J$0+oz*%scx+AN2~ne=;L4%Fg!iAMm+-REqYp{EYG8^PGLWSOZOY zSBjDBSn@IN=~PKxW;oFNDp^RNOYi7@6(cPmUEf{@G{DBkAB6xUxn{uQO2B#`P#Eiq zp%pIfNYQFrDI%JyNOQ<>^{FVbr~ov{VlHJqRo7i;0Icnqh$orGw9t*LXb^FxNNX-M zswIk&<2*kaEGVrc!&+8SMQ0@O7^F~!jAPP(Doq$CN&r!ZiN!ksmUkC+H<4ahN?^K+ zRFQpnsT>(kFlZ6!J)i9q8)-|#t8KNBb8})((afXUkNe2?Qfb|-{mJlq8wnzgNT0im z$!<^6+8rJ@9@2C_t!C0|O}ehdUcNoVyMU-BlYTbv+h1|x{W--P-S+7J0O5sp^!o>E zcX6}iXxT}$<1Mh%$B*hld94v{9$mY5p|qvv`MJ~EUM%R6EUL`o=x&FSO+2y=M!R7< z>-_!BS;D%11iUh=rb|)X+$IdL9t3qAMGh@Hj{Sj2HB#HTidN{EtarBhtq5+y!g6bN>a z_gILo)MF!qib>n;A+=sH7B`f+Me%@4_QZLIQBz;^Kg$;wMS+X}+*r4o-MsPt0H;5t zC8E<<_Uu#D>!iE)7$3V;m`S}3F%{PmqwGjIkJ75^U$5Mny*{5{_X(8A7tr0R?-UxV zuTl1t)mFB&kvFA1ViGWN?-F89{^HQ^Z@jeAy}y(utAF8&EgB$@7B;|;8y+Z60vI1> zsHJIndlgpeueqt(J2Am|tkiGgdP{8PITxEJ_oZ{>#npNnW69B)nR}^YRt1(wP8Lu{ zc^9YNUqf8ZnYp38NgPIxQWYmq4q7XvAVUlys}j`w^1dhA#(*d0)CC3eZD_lWPmg4(x?4o zdJp|1y0Wd;Y%b%Wr>;8~&vql|;DO=u+W4PB*k0I@7iLO5WqNHmcVa2+L(= z#f&Jda_zg3zrIGTSWk(Rv|1ZS3}fPKptXS&A+(Kb=7~T^6af<==l}yud$q22ubHZK zD;*fA&~fKL1%fnQJ!k_K1}9xj6e}&m zY>VP=`&CgbhSCATfl*#bvA|^hRGTd#s}^&PH7udAL5)om7FYxg2gaEph0h*z1%;3M zQ=t+g%@ivQVf<>66@+6PcvGQRB|tQQTM_us0ixvO{0#sbGN{z>rU@E7vwjvf0Pw8b zthzbdDEs+K^*OBMRx@^y07p949BC7hR$EoTAD${_D=rbDC7EMgPPGXX*{+u1<$X9+ z>_+9QYj6N!GHW*M(MF3P9%o8JEJnP|S|yTMbmdKn0M2odQrPINE3rP64U~yRG$b*D z096P?(+xn@lVeDsJ9x5AwVP$6RCXs%!lkm367gq`IzSu_V3i$Cs6zwprkyfmtsbYd z-7hwH=CUS!1XsC@^F;Bdqc|IjXNK-;b{fRwd^n2oCmNGSsg8FP%J)05f=SoXp_(Bu z$|ZoWAzj=otsHzp)YaL}VY`|yT#Dr4RY>aLoy5zhcR2W0Dbk9m3$t*bY};&TaeEG& z8;xs+=0-W6!p_$HfZ1~L@Yk=E{0#E3uZbM2WMlQOAoT%u*8_zOj1n?3c+vu~iFf$o zknC<1MmdULSCPrc8VZ{#h>1ZzsWc%CmOv1Jtqp=j6BhgAiju<-g%}?S1S&>67JxDf zMsu7JGffGzX$)%`XMx303<+lEoG)4eitTZe;m{5=!i2P>=r|fyIu`(&V z2U-9`k>vigfDYv1m>Jz;TvHJNq=rP6CNWJJ-i}l_WnsXBK#uFPy{M0CJa+d?w%c(= zBAbL)BcU7v{olfqjk{Vf+sNG%?+m@%VQ2pU?yQ^2915hyt*>3QYgk* z+R085U+UXG*?xPqDboJmsw%I~+&E>qvAEuZD+zUy-}+MyJJIxiN_OJ({{X)r(o0|Z zI!i63Z*>a3`Dl>oAo|E#?7ye2b;Bx>{IqjR8&C3?W>{KBR>+R%c%zkkk`M2dX(-$N z?{XBY{l37sTZa+Mdz;kqNSqJ)e~L|WX!MZR!>ZOGp7F?r=MmfuVVQV7I(qt0?dbOn z7OP+xmSQdM2X#0(icz2}Ivz%*?@4IJm1`Z0Gq{ytz3@yA&|NNpy$?hA8hp;`TlWrC zR~@?(B1)2pBEsDP;$LD>=}o4ct^LHBYM$Q2MJD-aAOU6rGut-FGsU({Ev2Z@;+0reLkS1pffiope|J4^daYnLBw9k~ET%0EX~r z$b6CxhLU&TFLAX?ynTx9pd%R7gfX1UZZwh>`%(H-HQR38iu3j8%~sRdqHJ7SGNr?L zWEw{|J=XgV`5Mb6JJoOQX$jVkZ)1`GYeAI0+JV_#-r_Kgz4a}SH-|XeinsTuu2-Wv z7lGwHv$T_F?RAZbmBpNi5i6N87?F?&-Xk1q(BPdX=5ld6o^x)c;{k__4(ZPyO7>Q$ z@}#MsWPF0{C)%GR`wYlSOJFA1(lO$GZ6OMO^f0X?OFaYT${tT%XxLqeb}jaBD$2Z$@CNcJF|;AE3>+J zlqt{WQ~UAmSM12Dou{&u+Bl+=%DQ)K0uzpztp5PjLF`-Mq_uP^KGb)Tn2oDJCUAmQ z7;kYED~wIm6!=z^-H`is`CD<}jxc_$^2JZTh7BjhKESXp;5OCTkKqiF$~E2H(TCkM zpAjLfF)G|$?MYFB-AIe=ZeTormxxq6(|t-<;<_3;t1YUIW^2iAH--Zl7zYD}2=Xxh z0KIe0Q|@mLPSh+%44|~z%n99o^B@-cG7R`nMjBLGdzx%CT0)Vs$>LBzW^v+Pf=qr+ zC{Y(PB3nc)uZBeZaC(9~r_^{&ClRRxUvamx5<)rl$KCHJA4zQ7SJirt>``K&1p>wy!J6Gqf>HIcAHC1})|asT z#+?A~u+g?RCS5i4$CT5)<3Yx{j6r7#4_>r~MQ4$i`tlVvP}rit-haZHLL3hE ziZG&>hs6jSMwBE=W3q@nYJ?(NursYoWhj+i>52aJsj}2e8GK`fARih5ieeaZ!k7{l z6i}>UgG@uwboAv^ku8i=$HJWxVQz|{7)K1yF>IORQqTz?1MZ|W15Olr(sC(8qjh$5 z*It#BrfV1+&eoDgBooBo3Q-n9&dP`?=cnshMOz~28+aop#74ZTro{zjTwE+m#|P4~ zNY%PEtn$v}5BpVYPUXvMJ-`{f)eloep>rl!?V~h|gN&w?0Ct6?&4Djbe1G(%~ z?){L3j#?Jn_#H)hoD}Xg*z)+OREoW;w)wu&7XWEG;GeuJE-p1I?rFkHMvhwkP{97R z!6tXb3b7li!13i>TqLzQ_@$w)nmygC&^V)uj-ufu(6nv0jw^l+=Y7}A7^Y`wFh z#oTAsx5B<8W10LW`)WBGImUR3^mF`-^YMJ=GrR(f8uG04(1y6z9RC0zQ)N)ae2fk> z>{Ld8opqoHa7fmG6k{E6nwC-*EW$lFdQoE%Cf+`xkjE-y{$zSm+?UMFBzM15R2~5gGVU1a6b1ATY0FxfS zd!IU)M*R9QCfAYDvdCs+br4^Hf-&@SFHCc(t9_;PW9j|A#XZH2H$fR|QLOf#)PU#D zA655MRe5&pDA^E_f5lqn`d570X`~L6vt@!Fz^5@8irF^@@!X!~2>&xv=f;twCdy&__Aqq;N?-JR6l|lM-tG z06&vRWNFvu@OZb%4#L{|F77M0hrIc-?!1SFB=R#2Glth9jv4aF#q}O#%^qZO9fj=9 z%iEh{Ye%&9?Y_c>0FtEFDAISV>_Z|2BT>e^{v9VBPai$rht;1VTN7ezj>ueC?47K; zX2ox%kX@p8YO*@1c=_iYYVtj)6AP_Q{{VJAm6=9(IS+*ZPDde33@y4cKm(aNQ9)uQ zzP5;FS>r*SOFEC#(rtGdi+dupouJt9?w7uVZ+URQ6inOZ*5?3QMU zC1;U*P8A!UOye~l>T$g+r^C%|fjy?P-!X{f4hBGQ7kG7Db)@*HA+8=(VrA_!BV*>I z2J%SEH%aNI16j+AOQCCpZ>e5h(_f^ZHMDC3aFiBer|%A)wGWMH?V)Rhi(Bdq#@5?k z(|FfRj3)Q$XqOW{f{qwoGV7)fZUh9X_k%Enk9Rs@nqx}Wo)uhd7)er(2Da2hAo0QT5BDQ6ScYSFMLt^GB&z>?zGga zNdt}R5zc`ViFkOa2gJUh)loJHeF1j=0QGk(`aKpDVMfUW1uf=JVg20=Iu(?zED?ct zNe-Ga5t1{>fzX3lxOOy*`;`#1X8>;FLm1Zsp5}Oux@s)F!dYQtR$WsEb93|D&k@y4 z7J`^Bx>O^0mmA2*uAIts9aPd7w^OLIJV#YO3YIj=+pd5V%c#j!UlS)& z5k6(=r&@|-+AQ178+Jm=yxJs-59gzdQ+loEx0y1aN+Tbo@Xg2gS&n)9Yk=F-~5A_GlnQD}bRj#N-t z1cCfg0}0T6lnlVXpBg}8Fanswyun6Jl?{}TgD_*BRW>>WOYdaxpa=KZOk%3Zp+$@5 zr9&+WdvbX2=SqUgb49vN2MU&pOsr$q-O8i}q(qE2C@iAKA`H`M)l-g~x zyR#ghOxJ%C@*G$`bCH(gcwlm`A)cZ@BxR2e?9!r(D5P-I=A9BS4rlSEBO4q!Py!?* z0zE2ONTVobY;&YgaY7^UH{d7`#bU>FPzBgw)Ago9WXU2Rz{jmHDNl2+9cftTsLafA z$Kgeeg|=A!)L6od9+Uv}1D6_L2|5qffefS~Xp~QCsJ>*1t67wtiRKDr|06o0MpGW@yX8UFBkDL*2a1k%a)d~73)N=>z zS5_?7qxrs!!zL=#e7{s)W{z0cK3Ww!t)Hxf^nR<*){dW-u?p7P{TL!?E&hV+cb2jY zM>i3J!#(GC zQMZgke+d(g<~``gePa5wd`fz+r=>Nf+QeJ$q=K3#-4`TDZN@oAnLpZ`qo;tAY50rW zV#^iFZpbyayj*?<`_`2`p8XkD)os-eR*=cLAXx6mI3LrL5ATIqZt48q} z6*0)W(GNNuUO!(|_2pFB+3oBkx~={H0LZo?FsX3F!<@l(r&K(FJt}Uu+oK-)Z`Bbr zQunz)zc^rgAJe!`&^0+Hem>xut#RVpV%5*{C)q z&5c?VX(emBg2kkoR?EAE#^^i-I9BoFrAtC3!bbNt^LC4F<;L`Js9j1&yvg^lPl`qr98jWj*$JDBsuWnB2vqj43S)VH>29E)l}MPUk) zh=cfkk~Z;zyg~cx(T1a)3IOsM^9WKm?xPc0x7NVg73Yvg402&h_Sc#Z+Of zbxiX6zlAlX+X>U(a|*{giDEb-rkeWt)6wdMs?m398&vMvRQRq{r>s`$&G$9+fmzi;?3oi0+Sh1ASe{ z<>=iFOYF*B*8PEO#G)Ic-oSN^Zk;nrZ63kCt8gT^Q@XSPR#FEN4=6%oH1<< zdOz5Iy};37Mmjc3ksaOdtc}J2{{UDXR_Mb@RoE}Mvg0g9QHBGfanpwOKPMG7IucoT zoTv*RA4rmUU#9*v_c*C2baxz8)rd@QA=XI$01hkaD%6Q_HDK>*Pr|xPOfGSSqQJ=E zc^eq_(nuRFA|y+$tyD#emSS=b;X`F4RFXy~17BK^&{4u%sJD#)aih zgxJ(WPKmJh0sbhUvlTJNl{yuM2pqmN2%Plz(*i=!16M(sq#(D27AhAcp+>xVQf#D( z7Z+LQ@T{dHNW`S-(ho|_>S~0P+&JmNq-9(Cps|sf0qkg_Sm&6RZxbB{O6r27aZTGd z*3yV#5sghtc559F*lnbpvyAmMBi!4;YaA)SW`c~7^wX6L5Q67iaH+DWfKGIz0fRso zTnYw}TIS(VbvUSOq>X!Am-zA;=}~3TV%Zx;JSvcxU?4j5s$e<8)geCI0!IXpD4DvwaMv10>;Iu(on4_=f2CkBwnZX7kB3ep^m z3W9;%39E77C;=s!Mi}8h7VY4`)L?a{ku8=UK%)YfjePSG*j_)E!jRG{mEunxl!^e1 z{?q|Gn$Q7gG#u%GTiDi^0i5VQG=O3cN)VZ1H8}qCswBw<7Jw@rC(?nDxv2j2phE(v z9+UxIc|piteJO!LaM;P^O#!W)wbG~!=Vg0iHpyS`{h+OPu-y2e<0ZL1+&-OC@TDlG zs7p;xNlESHwuQ{X=V#0VS#2240mw1rM-HQ%VD!>kbY(8EFVxrJRqAEvh9G%eOYPfiDwOG&LgI-%Q7^HXiJHo%pm zit0d@7~QqL_9R{#l6w2=e0i@)eBB>^Gb!V(R^30JxA z)9hmV{eI%qOK70Rd+S#^V~FeVsY%DiB|4XcgGl#5n#_q|bD1GJ4D-iBRF_!nOMNA| zihH&1tp@xVJ?tllG}fBOV0!5-$%#%o`%e-#o&))n=x9raVru}k(SP9#8(@3tDj=Z1W_*HrO zljZ1U9UYJ$CAE^=`5Yf=GuP6JueaEH{r=)fM2Er*);aMG5=6uF#ZA)hA7SqMOWcVg zEK*@M?3xHK#;V`>bFc41SFQg5KX6X8ujA}7AqCnehzU=MOKkXG@4`<5R+mTlBL!H6l zM`6?KJq#D;=U^60Z!sZ}yfQP4Wc`WP?R0;}mHvIof1luC-v@bFkjIRZs~|iB{iOA# z$zPwH$lS&ZaqjM&_P18S!Q${YuQ9@!)AQIL=lLNdELGDR>`0B2ZmXZNLGrlfr;RlG z39jLyD>F$D-H}0AVd4nqr!ncun$%6!fDO?Z+*0=ASuMD(+hEc?Sd_`8| z>V{k0v`4wP9v%q%e;U#mIx{)LswU>rL~(IyaNJpVf;}n9Eoy=?PevWJ%G_sn!8(r; z9%8OC=JO&^8X6K}ln7%es$ST6;cZ?&FI7A#F9EY9Q6t7s5g^ZY z!;k$0{%F)oP+AHqTyEn8k`%6h{{W{xQ`JtDHDy@0Pzo#M3X|PPx-y@#Gyedv{3==+ zHPI`xdj3_^bF$)F;AOuGx+ckKR17CBVv7n8(-L_5%_68#@n{Zn&XC5#22M}mO(8a0 zM8LotDv1n6NzD{13@$lSp;*OV&X|JGarn?88-bt!0Fr+?1~pQh2*N<&K+N9LG=wTk zfVvGcNwSnm6Wucs2O7!9*+f)oSmn6Xlvvyt#WHNCaGSZL(MaXCz5HTh7WTT*iWJQc z_|z8HNRBeZ=yRoZ$76x7i0yVd3#C`i@ZwsqXHrK;5~NAGpl7WEA=sSjnnM=KPaaf; zETtitjDGZh5^=-vq{brRa;uT2^HSMK8hNI99~sU~X4$0{?QNTh{3)a+%kiNDhrgv# zM2?LYI_XxCEsik&Jv!AggZd_lRyp(4DgZhCOl67D#i zPfCKzI}o#N08iOJg>-PgIfoJQo37Buot_8Y72U=BhZha=9P*|HIC@u@dPXw=@TA57 zl;>SfAxHxqb3nk5>w(Ipv7sf$ywVu5j_35C2SaU*TS|0IjgnMcfv38dQASyr$pe7n zNNEDGlSpPVVCnHR0JdJHfCD3t#Q;ud0}i_I9Vh^mPJg~M0Q61=mT8k?RAQ(^xFmJ- zpbGA~`cN=)k4gkqxSXE|{5{mbN~t4VC>dVuh6o(F(?T__q_#~^3uPqWP$qTVgF9xz zXH*7FmvODll%7T>+fTCoy!q9ve8y6p9qXz?7VGA1ocaJpUM%t>n67ETKe=i2`U@lH4hGe)7QFmqGacca}_rTMPl(yfnr57JAj1j#Ow;647 zg1^*=oRg?;}3h7y!8_yb99o@l?T3F?QKs=Yiu zs84?%qYOC&J2J3wgr6P>2icHvHC9VspJKJmp6OzWO0KOJw;ASC^IFbOG=$3i>5SpA zBu}P!ANT&nXU$$loVVsnjXTiUtbUX2k?k|aybwll;=}N+b z9oz1N*FH6k4goycB6uFFPev_Q=eYz9^IQ`r7RC}>a$r2HI?=FnFys<;*Pw;&zo2|)8_8Aq++u$}#B;)-)>Zs1ViIgwQY}TnTS>S9*#a(%t(Z=;gYE`2J zClWt*H__a$k%tEBO-lFN9BWmuH!ur==}|b}nNXE^0}aDT{#x;OCiYvC z9-#6xqbt$wIYzZx2HWbxylgfwlYY-b&`Vu};%J?k1p-0hmeijM5447st75c!`hd}R z&E1K^9VUSJPrPz(T9&%RY4ngdhU@8J%vTBKUIb98TCKxa==Kd}NyvuacXO_&cx3ez zN#2ifHCnBSlSfsU?nn+Im~cOI{{R#}5ibD4gC^+#CnHhCTvZF$7En~71(0e``IpsC zN<%1JSdR%(Fi9$SD<4ukjrYGA&QUasicZavkKl4ZV&elnBm;+|ip`dS3^G-L8@f1c zPyJtMdNm1*8IW$^lFC3CJ}(ci+FxEGlR%kU=;0i*`I_oE_Y%_<&Uy}%fVB)D0jIj139`zqQ8qDS#~O4d#(TaL$uorj32s!ZbYNqeEMcnTW|)H@ zFS?kBGIFBFK$1D>=|}}jFaVRvrLxi}PR`_koOP_5G)NVSiYRg~DiJn46r2H6kgTb- zK#JN&#-M3KK$+m3rR_wiwwV#Pa86H6Yo{J94s4lqIqj#~Dca>3TRQQrlr%AN)b>x4 z9kkb$Y8yENiLNQCXKWp#(2nuc=qU`qpmX@s0vi;7Q8?pL%0k)y0NRkiX46xpCNibL z&+}Qb(1>l2HgT^iNe;{LN5iK|w25rD8VmqG+N}`Tg)l+JPcuad$&x}AhQT7EyEAFS zt!CL{B3x>D)gWUfkZ$_&p|K=suSQ8Z^{iR6O>5^qysAnGPJL(tq3mthg8kuRg_LDS z-dgM6=Tffc9~TRao9^3N8TLrHL6(5;{5jWW8w-W@IXGEV{LTP2x>t>7uyi{;yURci zLMzqboy79LV-4QeV^=$$W~d`*A>1zP3~cnDc#xZ z*lptgE(f~1BMLcXD;qS+3gqJ)!Qg3Rf|8~XlTOi584+4*LEhT7w-&rglkF$*UQSF; z8`D^xgfc0w5i>yxTdas$TOfC$c>cBq>YVU7tzy!vUoWwuZv1`0?+dyt%!1}c#1|{| zH!JpAqk4W6?)Ts5!)>0Y}Ku%jLBqvzR}KJKfM|0{qd@V`E-9TZp6ww+OM0r z(Ob;D)N-WV><3GG!KqR9CF(u()fc7So&M$$R_e9tzQZNAFDlCxA-i7|=sp<-Rq72l z3wE?(Ql(E=`x(4$xE|v6KPkuM>M8u*5(?$Z6jOE=`LdxG;Y~D!+Rp@D_>)21}+>PK9 zd0C7|bZ_dw-lLk)`Q$%;qZcF#Dcu1UR~g6jru)m$s$6gLa+Isf>WYh)WFYSV4j3LP zeSe?EvsyDpsxhIBv|On3CJqQ=%?~W};Av3o0wiI9x+P+9#Zp2)IOG(yeqpzfDK`E@ zgATe#BpCQg2METWl#un|;eN!v*Xil5y7XWh`%HF`1=tx%CW zz{1}1#EqnL5ux;d=A}xsWpduADN$n~Upu@~LFQhX^rqDU)Ksy^Bn*T{bL_D4N;-S$ zTJ;)h`1SyzTsM0WFkQ!^1H=#9QCF(bj_XINF-lzmlCO7ioVg!SLf6b6!{lPzls`7S z@hLc2Ie*ps(aq6^E$V}H?z|Ia?arwv^C|Ts^`_Ntu_@l$n8bpsDe2u#IrPmQVdP0d z7={Ba=3iyKeGL>AQ@OTB90^p=5svad<$XES$|c4|zD1TYs^cnts#yIv?q~BuShQ$} zSI7)7$*$-c20d5ox7{=$vr*p`CtRLvcnat;qZVKZ3#)aa!iGm1F$C+LG$bP0L;xJk zQWImsXO9YWO^gE^IaLVF?J+=z-lb!rH;MG1D3wxu{LKMll0J0kOgx3fF$0om01Ux+ zQYj+5laG0+axFwlv1602wFLr4Gsc0~L3-1nSk+Ec(hDAoie$DYXxp^buB*osFh|cF zvFt9?eZ0*Q6W=$4jup|1DoT!AxZUV%E&fL?9?>o)x$j)@R0IY80M)6jWjzRvH+r4# zVLLSY9Sm)$9P5Hk_;^XmId@Is}wTvrxwXS52mTxvQ51h6+4L=&|;eKP6iP(Q> zw~e9!p)FhSpDBk6^BnHyURCBEiG+py=~%_QylQNugn-W6G^8@^wYGIUDv~9#(J{uo zG5J*zP`SCzgWpn8MNmr|o_di;puz#mS||(vd$Kj8B3P&t!3cKFxuj6Cr#cD%C5QrZ z@1Q{*8XYJQNHz5JrUNmc=RkuBb4)>n9C*-xhapCv_NE4|@^idY9vtWzDDUGWnqV#F zW;o3NEc%~)F%t!(*AfWgQcif&NE@TL?C)gOFeH_7+-t8E9<1calq?GS zD;0Zr6}l44GfGZ}7`A!;0BO5cz?6-(A z*2i~gF}RJdY!`Kb0_FqtZce%$O58_Vm8ag&4p0D(yV)Fghp~jB)Bf*r#L*c7 zZ?F>QFkG&I`ez&sX(->Haw978> z*Ii(`T{ZRSX+3n8sMeat`9zm2MXm7he@bztPrs3(`b*R+`lIMGE`?*dZy3@Wp{7qp z{`IQxexz@z^ae9~1WR18m9F0_6>bDbB zqu3$1!ORMBr!w0e2tR2LUtVJfOSRSwwK=;t01t@c}?r)i3sAj=}k5?1bR zxJ7Y~1cRedZuQ^XbgNBc+p!@sSy3=S-j>jvGxp*%SN(m3fA{wyMM;!Nyl^yIjChp& znOCJZuix$qPtRhT#Vjq|?s#~Z`4RS`Keb}w(Xx_ZfE;ft1`VJ%AxIv}4j}sR6veQq z0Bz#gMvqSS%_Mo`MZ&o%0Xgf%jA)pbL>xbngPt=L1h1XPCkLDkUF6)AbQL z5QBYt+kP=J>dJo7o;q~nSxI^tMf#AkxCky=eM$NY#M6%eYCXr=2iCNdRFRsKiz`Pv+mUH|mxSpY$6R#HLX~ME+;3QxB~>H3pT`q&p6|wrc4;1t@3G(RnE|j%fg)r`yhj{_isO6q&X}vszweto@)zx2r zQS~{=gaqh+tQ2W(d-q?s@!Q!)!vK=EuU78-_3uDuVQc19I7ZS z)jsDv61>>y(zRNU%h1||IXV$kkee-{^r|7Ts+j&MqHJzJ9`02_1fI04XdLE{!T_EW z#bXvDPK9Gafx?)ql6eYX4hIwe0D3?wS=DsTF;dw{6y&*QZPB2t+>I1Ps3ws^0RI4E zOh$8{2S%NL3Z#W&MuVj>1Ttt4K#myr&;=>>O|-HJT|+Q5sCHTr+QR`vizk-%D$&nE zIdwJefmo0L&b7|Xkpa$Vv65T?lSP0Ha4>&LRyrz4bieIV@%5@iHWZVE7+=Png%zG=a&@H2 zp)DCFH6t)C?>b;%&bi@C0cis9<5B`zLdT^82~nF`0BDE-r^cNU*$wHyYo|&;g@8`K zk4gYw{`%7Z)p&kpfei!>fEok|asL2MA6j5ko^o=a>CDp^uAQ-|pmb1qN#RTg-@wWL z0KEb&?ERl{eIQtr?q|)8wNZB{YkKEc33=_MxR_NZVeSt|{bf>x3xfw`86|(j1a>&1Ps>Sj20+ z&yIcE=>hEBfU#?S%3C$S%$J#(MQ^gl!awxap@JUbhc6k)p49Rnjaoj3l}dh|!)w>vvu$y4Wjap;icFZ?lxq~~c`zL6lW}&x>`t1e z{{Tlzv$lj65jcf+kZW^dPFV@|qdeBSvE)sE!Gz)8_NKQAbOq6#cyPO$qPnJ$Bp8o(!Z%y_EuB%A| zWbV{QI1*Y(qRYepc^^tHw0jD#Rr3-Q!oA$5ytVcuK4kdxs;b{%Z@0{3kQ|NX!~XzE z;BY>TNyHSt=oN1D%1M|mE(?d$;ovl^#~b&}Ma5PsA~r^D&?ALaeZ&y~ceca)qH<=!LN zaqO_DYpJ4r3{$=0QdO5vyq=z;(vaAeQWzjidtJyl4UcXU$-1peDSm&FRlz`TAAg^e zIUoBZp?-dM6a4(_NoPMvybk{WfU}GS<+&*2-n8$iscrfE0l49N$oGIjhKYt*K;*;P zUYy4&Vdi9eg-$%IGSQt!qXW~_d}yS>wj{?YWU1bdgDVV;e%R%owZPPJv|lo0AZX)e ziCRl=M|}f%;q_i+XsTLm>=$oc{lo7RMhuvm2}hfVBam)~)}_BerRq(qJPt_tlH11vYGLW>zr|_t>b5iaw0n}KDcH|$+p=(B$oe>; zH1$B!S}@_6gB%UXK=H=h$EQ(O84)O!oI`gBMjn{v4l7quMrz{93iDXMaX2q(+ADD) zvQ5R)*wv*aYjV?sF>bl z!@@)tN?HS=P1B%iF0^|EUaN9Gp3v_`JJ=4pzqs|ISosf0d5=d&Q9ZK*ygYH80sakI zeNmh2z*D-V;suvKNeSYoo+()T%-%+fGWg^4;-{WH)L3i-#t!T6VTP$N)A6Lx(>bW1 zSiluY4YI;6_qv@EW0V2uR7+%*pa>eDeE<+b!_tZi7_if!SbLy;l*ATj0z&7|bf64( zRP`d8&X^)Lf46AVJ7diJ-vXQKoc?me- zo)w#Bi2)RHyJ<-w*>*U$K;Gl&R*@DpV`kIxpjKLn-0?aJ(IQ(IWkdsB6x$UFHzkgm z0nVqGu233nYFixuWCu*^)|HNk16=XXS^yvhxzjWVhNQ|AAN zoSAV(j_TiE(AG^FqO@@kbBX}!dmVKe-AMy;0oUQiyZ9N@sNv%wrJGLOScz<5xr}QQ zYmSDxxaeF{>~nB)sn>Iv*)i^3q2$^c^RVe7yEd^mTYdohI5-|8A+ufi)x_e&>PC|p zKyjfOSDJby{fG6^W74{~Kbf4|PR4ekQmF{))u$b@GvOAdfXdCnywlJb6hxe!bb`w& zp%m2!2`1^otsoQPbLq;M4pjq|l)%EO4!r453vUVNdeRwMNpLhHUKpig6i+ii!-+SJ zO$b(8M8E@wtyL3X$lB@fp|BD`BBW*k%ZF1;0}K6{1P~w%c=4bJFP$;MngLRif(EA= z(*mTLapTH?qJ_?1Kb;|nShUHeDmGguv(w(nq=F;Q<67f`k(Nx9dM3r#5L!k6Ko45) z$B83`c^fx>M-u9A1#V<$w%2H4w?eAJO2;NtjbV<@IorLWl4fA7Tr!)H*BDWth&=DS zb<(DNHGk?`O}F&aIwu|$MiTaz5I>aM$guyd!4mQO=2xW#_}vs4RUVwZ?ePwY#IF4g{Mz7_8Zsl_ZbwX zF&*8c$8|K0^B_GempNeAeXGOENh`S`9Sg&#ZV$h$Xm3ppu*7)aseY=@XHNM^Z z8w3$F1R|HVA6Wx=;y#|0vP!%?jGf<)xG5uAsselK7tv%I?hju|6Xo%U+EVb4WdtLB z5#HLk@x(P6@n!xhsRmP^ z2N2z^p5WfUk*e2czj0~2cI+7MBW=PLyln49!5^t!ja9Kbi(|N~$erz}KTQeqA?uGy zm#2|SU-tyh6UMIYWPp8D+WF&ey-%4xF5*e2 z(m}}m>Khs{Bp@B)KvBCOeM*i(LG3R_p)oWW8>|ir?(lKqX!HL7xhaeD^TbQ<2g>1O z;uIeX{piml*Yl#r3eDmT8*a!vA$SIEC2)ML_fChE9NmMLxWeR-BqMTgH9$Dym;V66 z_)~ANCDH6ACsr)bph-w3TWt6r)d}EDW}WO)RleQKjnz;|2+VvWhaM>UjCATLF9E&v z1v|(ay|z8%2aF?72UPU*q??Piu-Z>YxZKAf7Z%UCA@gT}$0q)2tvyjR){HfpJB%av zC0%+DPc=14YFc$6#h{jFiN|q6*Ur$Q4-4gpTd#Sogu3|q~3F5!$rARCcgiX?W>r>B*FQMuw zdk@@D4`svYZ5vUIcYWTJzF#5y-egFUE-o!wAn{%*N3AD&p{AaUDCJwB-b8z=g!2Q_ zq3S8ADQ&o#tscZ=vzCl^S3}Pc^04dv^m~PR1SLi#SHmZ_5&gfKb}BSzgBc>N6Jc)! z7^Wh3n9wkk6F{tLN3Ogos8%^bilib>r2+>U)Qli8sr>1Hscw}&E>fCy6&pB*Rw z9FD&lOlVlt^rTQMz=o=00IvUdyxn!B1Sln7YHsT?9vgC=i$`C&a_a?cZc**k0 z&K}%%Qm<8PA9y&gA!yH0yGHu`1iLy#`?(e9NnB0@>PIM&g9!A~9_sSh>Mf0qz&Vye zJu9n&-JIN3!1k?4?gy=39nhW=c51ES0O~ZaK91H|ZPZ;kYe0(b>`(1Q48)9+lSKf~ zhk)Ts0}J?21Umtt_|OF@rQ|AENfnrZmL{a4Vp96>1AwMWHW0&rGggr;hQsot#3_)P zLkGLl(tso>=kOH7VK`sfkPA6%4RoMkgdZNYLKQOw8KwrhSqnA?4wQ;O_eAw4hB?%X z+-z>n$vlDNTrV6~Ml3E{ocVIm-R$j^6}kWy7_UkYq;O9oW!bJGw?bHe1ygiNR&rZ= zwF;`pjqVw)e7UIThBME0#@v=t#IYd$b;jFl>5OR8M6%q=ljR&JdJl7RZvsTRj2ep= z#wQrYoOGZLhveqOT=uFdSY>S^X^;Akg@0P#hgUNU?xK3*8uU&8OKYV7Mox6&)_^se zS7JkX87R1Mr~`;Ra-P1G#l-N6YS!mo4kgD&v7>F^$!&gc!2bZ2y5y~e-avA=|aEKTDF2gt_Mb;y5C?*_S}}jAP@AGt>s~>C#dQv`RpzH#(=D^h@JpKq=W`PQ!@Eaxc=2GcPUG-1|pdZHO30@ z48OSQDL9QtSVmnl;ZQrb8nOe({kZ=CN}4MF06#i~xZ@qz@hINz)7Oi{dUaZKDqC;eQH?O(3NL01|&swozPB-{){;qY5Iw;K+{=R#GTyZSs-J8 ze)6B*n%qxqb_M&l%#aPsfXcE&d?c~vMSM% zp%O)LVC^hFNed8OGx~~_oOal&Q&jgJjE|Cb{&8)< z`O}g3R5e z30HV)r2sZG<@nVkCdXtChY?JYd%>D4D1#xQ$3dyjIs{9)qUM++QJ(w^jPR&(G*BwM zjUmv~H)W+nta&(HPg)0Is)ah7nglxxRA)g{BLb2%_?kc%jAw?Xodu0l17FITC9t*k z3SuNL4wUE&IsPdDfY1aMp^QtmzqLt768K$z3P2<=X6PvtW8*)yAVem*E|d%dV$Rvd zeQ9!7a}SGWh4WP?668ef93u)fr6)kOD*W-Ao=-}SV);QR$He~t0ZNBr-3jBMH#Oh7zvG*2HqYDY7+p!v4bnK&yQ_4wDH#7CBAZx1eL8*5fsY{BHqU6{3r%aKz! zxg%t_o-BD7;=H`7rAMWS+)=sg(h%~WQC(aT)tvlW*k@^njt`CvK0Bd2A5%@e$$#Fs z4&p+wJT#^t)&*Tp8gv#G;NnIPDgw+n9-fo{4&z)>Y+@vQ`kI?56(wM~*WpNFrOp$B_OBo88*PRp=V<-dmpan4l-ADwIPwz}&s0;j4NC1*$ zQLo`n!i{ys!FIX+uf~sU6M99I(%!BCS#@$IUS?4oU1gAuS(|J=}L_<87`(BDZK$| zZ!Kbu1kh_)wpt#!Y<^;piEsd*M|bi`ZJ73z@%w24A4MC@`I_zFR_x^BUdZ$UYp~=4 zKkq;o2>4I}c8&CQJ3iv=j*%fMKKC!qngfa1+eodWE&1-Dzhhr*KI zP5T4dp54YH_xYODyQ`%7$d5mG=~SKT9mLgXEn+ehodsKz?G}ZH4hiY*PKiOfYZ$t_ zLt46&l193_Ye?xvq`OlZBt^RGJMZ}mbIrBi{p_{Yy;%5H@A14OZ(D|gZw)FspYa$B zpMnbakhaJBUm>cQs-+w)E1!+;(V6D&OPC29iQRQtV(k!L{4bdq1^jDssGGqxk73UZ666gC*FF?DK18*e9d_BHtGF9 z6eEY6uV|(EA1Dmx73SkF)_?i*Ih}_=_oH2wU&)9Scf2}J~-F#LPYoB6@@a=OESN>24 zii(UU1#Jm7*mu` zPUNw)vV98@0|$u(iH0YSbTO5PT#fKb6zh78tE1k_?)sTh#6TBz+X7Tn9r!xEA19dU zeK-dckmq7fvFYOU z)+rpBm8n}7rZ^Ds)hMd=a7{wKhwD|BYFKb6$6TzG2@4+ARD#!@;;n(N&+hiXKhhz6 z3Si8L0=X~a_p;mbN>op2q4t*|y*sRd{9;EbrHS(Qz{i+ekM()e3ZhuI_qZwHCB&n- zDP((BG@%njt6jK0t+hXyd zNlHZYSyPj^xCoG^i(?5Qv&i7QRJ->ppF;|kvT-bauUj&u+7V}t$r($a9|@qBg=Usz zN^w_b7V*C({s!@`)i0_%#Y-2~o}v5A4i5HLZ2s(>_W_O!WS)rKXUN-B-qGbJjYafQwf)lXtLme7dH|Oml?7 z(bA!_=pCV~wxZG7TKc%5@pr^(T&zGM%Afgt`F#BIoHcEAqX*EElBhQgy!9L_@vnn> zPwX%e@UhwU!!rxWJ|-BjV#>ds%<(!pd=$6$V#S{$-?kUhaI~sSTdtwO*k8~_HO!e~ zt{qdD-+=}(NE9+CF0_G$AXO16SJ%m9)PP56x3+f%*heX zYbebYm2$bNX#ekfW=gGUN3Fgguili~fh$qel+i`?c(I9wLo4E=yS4|f(MX0DTs%LOtE(;gdY@_p^!%YXrswXc+_d}xdL`)dFBJ`h*1Wt9 zwx-v++x!c0&IfmIrVWrIi|adYfOmz|F>*Q-_wVov{pzyUj}(vMH@~?Ef1mvoyxp)D zd0X4^5}4oq?dnae7oQh0jr!O!6R%GzLbm7!gH?GoCCme0a&-Q@FA7!%l5EfwyjOhT{GsVA=e z$N2XZb7j_aC8_dNp+ySrmejI# zTV8Zt1s9CAUUojF<=@DyNqA+o&hmQi*myh3Iqf#Rn6)U?W3fMRm(DhXpDP`);nUG4 zO3#Nm`&QCr?IRo>_U~O%lc&n35Fzmz(F|LF+Rng#{|%;q++dgov|vjZqjJ^+4GRcy z&x^&*JT34X^}$)hARCgPNNk9o9NA%L)><)S_aSd5Mnoxy>C1D^MI!(yeM06Dp6ZTN z06(&nk};@2%sN(y=5Ij#6-#LN@3F?LLMp$BII+{wR9L?0lQm_&eM7P0&uI(opsAya zSgWWu*xx+Mb98o@vfZK4&P_x9Ol$&i@8^3>Lmz~vOd5$`>nB6kN+p59+av!#QZnt@ zJ`=K7Tu>GHp08*W;1ll_K4U$J+OmaUrbj+n9p@E&ucNNIrsI(~HNTYe*c z{UrlY;}wiZ{UP_8E-CeBXwRT9j^A4*G-G*`dAEFd4t4~+Am9;9@cE`9k`xcrHv6-ZE)SI6 zun7<$f`qF|rcmbvj_gf(tZPKV&P%79&U8E5O;8f=0||&Gi`Ogn7ai3!;C|I6gEEr) z)g|DPFMtCOru?M@QV)@4In;}lfMW(B@?HZV=M+t{$GG+t%!SKSiHRz6S%+Ew;ql8V z8O3zXaRsA__UHO&!bPF&jfIAp=Pn9;wTn!Il~MN{=QZ`_#JCh_Ns8l1kR*@CvcU^D zj0J!9?iKY1zBN@n6YFlu3et0;T%Kiw;0go-3xp0%HxCLHHGO+xmyTFLov8OK!!BU_ zkMz-VAN_%1P>ISsrZCobG?B&vWkEky29&| z8)$S!UHS)o3MSEp+8=Oq9Szg}r451-AuHDk>q4^9>@8@x(YFnWQIb~&SzIzo$sH{T zJ2WPN`+10RS}|F%NR^Btygu?V%AT}Y;?zI=Z&tNDLOQrM^|DUEO{ADL?AkjGz7aGWdn0coNxHZ;L%ykRx80+2a6}Y0F52zPY$HO1Gk> znQ?#J&69XijL$x!O@8L*>Z2kZ5Ra5#-hPU}$J$hW&S>l>XZ87+i5<3@GGhi}OQn$3 z6%o+Hi8<+M;!bh4A)mBawZo@R_qm0!*U%4;BP2uK|5f~y*#EHysA;!3+g!9%&!1|7 zjQ;o|(yn0^oy7mV&=4b`(nL*)ES^;a;pk6g6hcAF%S(ZaDMVJK@>Ij;tV`rg1}qI} zV~}}OkL%IkeR6w63Pgq=rprRq`i^4Bx>9Z)@25+VK^nwF?n|mzFh(YUmP21gEahys z8gv+NA1Eyje*#~9{xPx_?WIiCDVkGJOsA=_DqBq0Rzk?KLQVg|Oak@2Qei1X-NlmY zvWvXu9F?Fx9h!^}r`CM<`@9Sb`-*za^D`=&x37uX6dhU85z`L!>TmXSld!S3d(JRI zWYLY*{B7w%QMq%S$=Mr{GtO|qebxc+qB!1JI{ov*TBAkid z!r7Dy^Or^AqtQy?abMabyf2LbX(&qv^BE#zan0i*&R9zuvBi80brpDqYu!CBG$oBp zUtGaHrrGi{w+7+KI)M3@-|zg4!>CiP5mMw$wO^+@%Js}H$gi#-_I%?%u>4tSbNaXY z%E+t`QLDJAy(e3~y;xB#uj>_H+$ud>->m)t#u;lMYNRLoQgSWh$G>sH_C?!Y_>Q;S zbGg-RpdM{iM}xMLv|q^Abb;zOtk&uNOzLZ=17!u}br_v2dA7Jn-_oqiQsmI*vfa9F9n4$$@ zj%kor``Xr9#yahvW*dgAR>IX{l{-FEx7xa|(a(N(J^FnR;i|+xuDwrwi>CggwQIPF zkcX$L)Lnt%xRkse^VVn@a%S5R29!KHn9T-t&p; z#;)7b*z+q&sdBB*@t5SVHFQN7b-?alZ6W&d{KAq_1MarX3PI$Pi>;P}F6dJ<)r{f^rxp^N z%^2YL8}QhCv$u-=&Nfc<<%XYB8K{a=dX6`RhS$lr+bvZrU8=2D6%6E_$Fd>t*3f*n zYXy^Lv3uxb9V+upv!>H7$Pn6)IGe7(*c+X8uU-CN8bPch;t@D@C|INFG2C2u#0`?Z zb8}|yYeiXyd6M&0G8BY{=BOd=fd^E)J;89{k~PBUa3#wCU4X$mD~Q+y8JGozKkNDu z1{?m^LCn|Y z5eJ@`)*&uH$cWq&csa%wLq&EUgUO`R{vHnQ-_VuOb09J?vMXUDu0+znNgAtY2d^Q< zGEDyE-BFE5HD@7XPAzZc8O}3;fqAuNiRnj3LlS(CYapVk&=qfslR+{;tYYzS%r8Dn zlL*6;q=^$50S+xpAwlfW=eXuUr17-4w8#2_mfO7B1}L&O>I+){CqJGTsW$CY?{_ao zk@0{G(SXCK+83d`zz-lgGuwGyaLvaEF)^U=-45GNi*<8!?#H|QQ%{k zRW6;9nuA}giLyW=_sO!uU2Sg-wp3rPsKMoRbagy5upnIh?5RkKw~>5aD*a^i?ug`J*qqJI?og>(bM%SkDm3}o| zXAE}7Kg~#WB3^1PFcJKX)*EN$4uGhp>(yrcRz3TiLG9_5s>P;0cT&*p2}|pEPd)BK z%bXXNW*gm}Ja-OYG_8Iv_Y#9Pfs4c+W`+823t^JELFbLg1($tAB#TA8;>)b`*RrChCZZ-Qaw|2uNFhOaUVKu-Y}O=QBlopHyq7 zqc(Z>e=N@*q%Uu=IzF$IifF8k?idXXv!kTOYdA;vfZLot^w|g++{4D%hy%;rfy6neGSPbR=J~5 zwRg@4yGGZs?a|Kg8f=gVbsEH$@0?r>e*AI-*~a5an%v7@ouPTlTqu~Qu2eo+s}c|2 zktxx1$K>I~mF+<0-$%Pi&T3UNC~&33{k+#)oqB%B5p(;+ECT1?LRAQtfh&+~Ox|T%$XTSd7%&5Fua>lDpo+ zsx-PuIQc3ujd#XId>$G8Z2ku_X!`4B&>fX(*{-}Q!V^!Q_s_HJ#KgiBI}v9?0O%+8 z%^r=W2n{$4Z`!csN?s|9@BP)folW+vWGhM5&mE0&2!N|kDk|isxML~h zXr*+k+WZwB+idkm@>uteYDSdIXF~ZngacJOY=iKo3l@K6$do^(y^S>HdU9Vf3u@9I zgkcqJj+7$ZPoK8Ihnm(UHfI-oF?mj7xkxeLHYIF-|KgdguI5AhYWr?#JbG zMPAWK@E)0LaJZD7`&Zn>uSvCtP~!b^)=FwVHSR1#5|IZ@IF)U59dIz&B&0Bkq$te1 zDLUx3jFnZBJ(4K}f`ys5SfT)AN|60_97qRBtB#<{e6 zMpmCHY8tA7Qz#%c^=OYjUu6Oa(ovf}?wS-h`8%i6tyZ_yWh{q3LRGdgeRbJBNy)y; zj2a>T%fhQy^!@ykNXJ5&Mw&iFt7aIr^!3 zkS*U9K!(MXDImm8a6$l+;7I7kuWj{hHNO}lg8?{*2o+z6D zW!FCH(=5QfvI8B^smBM^83@yjCod!eVfP!Ng293p zdv&GxfA=4n%SBv#{d6fmT~f5^_Bj|g1R9JiB!H(`K}ykvX(^~Hj{fc54WATf6Jj?c zQPkfS24;_+i9YK)9nI;H8~&3a83tNBM^4xv$lV*N4xvwK~kJBnFBEVge82j{btFNA}KL-O*Lo_hg?%CsP-^)u22N?*x_v(@zEd z*j0UR{tskcthM|gl>Kg{&eG0FLNRRaV0J1-yvK7H4d(RIGRt*;%Q@x;d7FEFe3{(WOu&4i8xh|X-JLpY z;XP--WhtD0z(E#(0BDn%XZup~+CM}+()RE#vzDW%6yWA}g|s=3(pN(}ljy+Gte$D> zN0K*3cIQ7@*3|>fc=U)`?izST{AJndXe+lOx5w(kY(BgLh|j6_i{<6Pm=3%0bMlOe zpkbNxRoB`7Kv^Hn+l*Jdx8k`c@~qw-W_51Xbq!A~Dr`Q*uujR(%Y3bSy)D;0Alfpw z-;pFMQ#3D0q^gd5`>Pp{H^>(duurxoFM0jlYcu8|)l=Z8@5d-s#Txk&FHJ_rP6`@! zE>>`N;AZ3qeM}-jez)#=7Iz2JP}MyH`BJu&YPker3FYxGedO-GT=}iApZ4~~aJ4`4 zN3L+SFgojgmTx5Qj8>kEbg)i3gAO-fv)yg+!;#gc2#}FVORFb-<9(q5WAL*&IFBH5zqJ;qqw{{1mgs3x4I(3N_iek>&jjvv}0Ckdh#A9-?XoQ z3(D4l;*q3Po*I^Ur)0vb|63}D;ptG52^6 z?Fy=j#*$M42g#ij5ZreWp{sct)y?N zDgY`*^vw1i${>addg>%hD#msgDc_kMi^44VwdIt#QL~Ody{lmygXsJn@kxf558Ks6 z0yfr-1<9Q{Iq?RZTocedIr!lHKS=xUh?4qfT*C>A-cr_H%0w-f@__Yw;Y3%$R6^?q65u(A-S2WG~2 zVn38wiu{u(HlD_qQr*VG1t0{_tU3!U6TjNeG1MQm0nvy)CTJmglC?JbdfP$^IF@nt zH?rKibosH~lw5se6`Lgu#=3Y`Mp5?13~eLk9UV!H-5pCNp@okIvMehqnI_;?%3qEj zzZjPU<mNUVu}aXLB@=T_m| zWnr}zjj2rNcujW<;7iAV@hVM?JsV$oi4y+UH68G9`47Yb%Q6uGMh3I_b$jR=f+tNzN`Tm!*pqGlYkqdQX8Y&?_TUuT6a?egB&$)x_qP>u^ zg>i7d^_$Km5E2J*`FIot6=+!RKD=9~n*&l$f0MiDI2%-n|_Eggu0@aoLMM_aILcj8!TP`lI+cwZTHc|<>+DopJ= znb_6A(2h;m$U1cl`Fp=;B>76OFU>k%+yu5eU9o0WVL9Yh@mq8CqjBRgvGWnW-xS|W zUcn0TY3gr4#M5wD;Y)hMyp}ferN}qtwwU!5DmJXoSb@;g^0iaZw?DsFqKdm(5>ia* z_ohjnak28Ai2egXL`W7L|5dlHAVz+S#%8%15fxfC;<@$#>c;dQzgnIe#HN-69D8%3 zEF1Ep+)_;%c(=SpIw*UcG0V-=w>3@)sKV`v;a4_C>G~-y*jH3dAYT)xbUWqmnp0$9#&?<}C`&%>$CF>%JQxpZ7gKk%?{6Y?g z+8ua!6rIgbUj|CsSF(!2ck7wFEHh_H$m+w$6tcL>6NGsZ?Accq(i_IXp$RUZp?KZ* z$S}KVg(q3}wn8SME~ZiH1D*UfyBC78=J0*RwQmh&HAKjo$NEroLuWgZwxc`N(*ASQ zLwLbunFM=cESZ2sw3{z!duwJkae}iUxcn|!g_i^JO?kPt_P>OvMP^%0vpcVBsX{gX z13mJnWt(RI2TCaU5A^Xr5JG781$*|`=(g~SB;`cN4WIH#WoU*Zdx14_gOpEvH-*it zmsYMZ@>4^Xn~R$W)0~<}`FQ|ePAXvxh&+!fvBAaRzdYH_xhOdn$EU- zrYgHdI-l(w6~{>{>13!Tn|DI;jjm$sPJVOz>EbHl#Mq8SJMrgZCGd3TLy>WYd&+>R9oS&SuI@Gd4a^=QnsFu_Q)p7}6f{h28`UKKjWT=}@v|kyN9D1a`EDYZWA|-&+f%VqX$y zj@rK=ookrGrLp;%96VJPVZDf20OG4+NSLl+14%WWcu+8t*a!p-Lz^NUMZ&hh1rp%z zF_)r%004jZ`vD!9VV_BMMyo}LIE0Qdh&ygmm!;2$B5GtrdSFoM}UT72O&xRx-k$`Z1P@!%`N ztbiHyckDX>=qiYBe<(GUPO+&ayfaE43YcIGHaALzhYD#=f1;n|{w{&syLOiEO@$96 zLKSs#4oj8wb@W?SJ3|Wp>G5NH(I#f71^HL$~=~ow7p+W>MMUFH>$TVii^^TjnrbXynOOT@4?fh zFUb{LW)n&n;V^EdgF>nQIMIel{T*vk=WWEwLI;IBdKO6J_b-KWD{V!vCMIBE*MPWr zT%R-{vSB82HMo{=uqke7_}t04+Mp+k!jYy}?TNED92g&F7QODbkw)Bp@?&~JM??@K zk};mOcNjjtgK>Kg8?y{LA8Lol^hm$AMQeHS6?*#9iQ_I5t*DWj%W3Ho4l1Em=8)*S>mqw)MA`~9o+^P<*bMWn)vYV%jJ9UMByc~Rm z82Km8B`<6L2a;AUuY1iU99`owiQMjTNtXs#avh{7|2N$o4FizK&+B6@HI}VfPNM-g zY`elgxEd^fQQy|wc6)QrH9h)=j^l^LENu^ZQsq%9p9n>#6LqYYGBhrdWYjGXFuq%P z;M(PWiU#M0hUobW^mht>-8}X7R{WFbfwE}3CEw;$?L~*^{LA&mt!`nxHtVW<`&D+g z<&=*hF~1}G=nN%w82Of}txCC@@(nogL~)?Y&>!33$GxJ*ScgJd&PQC7?B+ zijlP8963<5e%vxY1EOJaBh__PG*>^{uI!7vSRf3op8i*}mad#w)gh-!Ju|lzUOz=A z3B;$(Pqf#Oi4*1Ijz>Yy5dYFb+*$Vc+?x#`^!CI+)u=W@TP4M1Ks~^GKIrfE9Fh#ssWgk6uzx5L{|GyQ=E80Lxao`-EZ6a;|G90cG+JL~< z+WOAlDqv@*_U0_A=BpAGp{Sms)n4CWy2O8=Nwynocbwld`OXLxA`p}s`p2)qFDB-; z5#6oSA$8s(&mG!Ki+J0k+TosvKJ?_%bTiR4R2j_@MAjA!oI)6HX0x7cYBF~F4kCDB!Mgd$4$rJ@t!w2OGZMB{PZp$KIY-+u2B+y?^NoU-V(ZG*On+2$?WWkDAN zQmpI!UFG3|S!v;!4(3zv-ZCelb-gESt)Xctu9w_P6HcC>5wUCh7T)PtF zJa2Z@I`k&R4|jemJ*z)9iT?v}QvrRGMGTE%Nn+|}bz0ZNCi= z&aRvv^Re8-x+vtzAd7Gvta1!2UWvHnhK&~VkWWsgCCy^^UJG@5V?{1aTGsNm&|l~! z5r@JbC2ut2aU^^`kyqvK&%Tsp|0^bN#YpTBNcQZdm|R)ZSFQh`=1ZEE^&Bhw4C;kW zMFXEV2fh{;vh$%pKgu4nTwk)9#MUJlLPLetBFj#KU$ZIk)=xNwdy}s`ym=o^;$Gt- zJYpA9uj65Db$IHr{N1uj#erw6Jau=O6||?-Ka8o+ zp1vnO=QXVzy(-jJ&9Kn8$z7hE;lGmiOKe6w6b>)occUsuk9KUy`h)}>hzdpH*F1#8 ze)vaRCP;ilXd&WCi6yjHY1J(fxuv6#^vz-lfs)ye|62AQ{nX|$$lE>k0qx@F|5MLE z5Y?qrn?}bnMO@QG0Co%BicF6vfbHTY5)2_e^eLQ<2$5z296W&zz|rBEwZ<&>B0WvA z+j9;b%lR6ctieFXdEk-Wr|VG#*Acj^%*N1xx9&~HP3H}9qrTfanSJsD@R9Z9d}rkD zRm_;-y0fOlI-=OC_VzkVq_mJYxGh0rLQ^Mya(DbJ#IY+0ib(5sEDOwHM8i$xiEoqA zQT9^$A(mg*s0FY*ri%gIIue?-Rd!d*y*nlsKvw(-ROg-VYGCp9oZda)x&nom@e6fz zcXoAf;<$7v1sqsV?CMs!p?K!>(qhhqim)ZQs3zqD};V;w3Z|eM{k_ z;2>3TIRe8IjwWho!vRb9pO8AbMP)v=*`!7LFvTqisqx*IqlP%DTaO}z0C$w6Lk*R@`RP5R&8GZTriZAtPwI0E{X=FN^;lD zJ;>1t>u2BhPPzG@<06myPi>Rh3u>!>WQW~nNi$fm%h?vx?{X{xcWKtDysl$7`kVQs z41}1Ad2%~AIt2CMT!1^U8^o1^4hpJ%@hGsIVU1PofZ+~Idd8vbXtLlJX(rjYx%M?U z&eE6@UoLpuR#=C>&-Y|~N8E<61jC)M5EFp~A%A3IOht;t!Em@B&|*VnWSOZ(b`j7Z z(a?_?F&!#wNMiH0jw>qqj;xIXvm8oBw5v55XVKXXgbo2%LiRQNLDF#Wg3OA>WIkwT zE;lm!i;m4E9h45|qhkWAt;Bq)easNT@&zE{B5@IMk(H-1f*t;Ge#ySdDWS@!+BwwZ zod#%nRb^WtUB*zed{4hvlk&6;E@SC6!|`dxs)DqGmMa2>WoJFma%%qJCs^1EqcdDN z>B!Q^I^aB!v~iw+pM>-VE`@{H|2$Vp1d}k;2*Jx(rnB0i|4Q4TBR-V2gee9P=w;F`#GgZT)OCCbxKQvQ)`ADb zf-^X!3UWUr?s<;)Q6gAD>#M8mW>%U-WFMGcgf!`82evV=0bM!PF>Yf01S&a@`5FdB zhz{bb#L=*m0ALfrS%2Gah7Xt#^qFn;&Iuq&ku^MPlS{c#*~-DBu|FHt+}q+!V+GD) zt{kTe0E4AT`vJ&3UK3*F{>qFH@~E1OW}8O|C;hME)zVW+7Y7Hr!dBGSn-(6j8w**(+V!EU?G7oz4QYYT1=nQ`HaGHk| z#Yqg-4E-=-R2&HOyeXO6Dq#E%lqm0KC!8r&vxDFnv8d7$p7ta<+*0+~(xJXnYH8rN zsdY_bXV<1}H(BKkU#-ZLkm6?xrub~__IXR$P2rh*eBRnp_kOX|%D z2Pr(T&C$?2pBXM?O}7zL8+5*G1DSDG`6$CJZ_z?^<}8rNs%A8>6Ci@5&C(LC}Tk}Ec&n5mn!SaNmCuX=g;?6 za&VS8hbjEz{$mSSXM7v@hnSz)-glP&rW_?mX#&R;%ChsTAMkd9zlzOKt*d1vA?KKM zqGl12O$CvVO;g?cxuqa2Q)lIYXG=wgY_6N4Z7$B-I2V;d%JCTDyQH`aFTKs)FiDD_ zzl2!Zv4U*^aV|;*Y~@#7^+mluIE6yiLOS#5;euYEaXnQU&phctFgnL?s*xDQz$wFQ zp-C7^FedJuKf#Cqo+Vt*U+nX_8ixZ#lVI}ulA$8u!o$c%ss*aeh@X+&A)E~-<((|ZwmkoHCTA2pgvvD$^WIQGN!t}E$=NQh+=mrwzm=8^F?5>gmL(c`QD>U zA$wSWco#8p`&hs4s+SK44P0}h8 zRy-P%YP<(4Ku(h}HK+;I%G$}694-ZXa;T`oQKJ>s1^1wxixOd85Vj{iA`$WMp~O2* z75KkP2>`}ItPDm=#=&lnQe%v}!t=hE2^a&KNp31|6^>0|NyG8z67Q%>#t=Pr{aHZY ztDReX79ed|I-ybC*<#=IW@}=%EDLs&WUCyE5+)zChv)@~eh|1$xK~l@F^QdlL5nWj zSzgpi`2d24)ebBO0}3Q4o+0%5bfkqNe1!8&ng)c`cW?Bl!@b)fdHVY%d7KP<^4ZxD zAIj!Kf4?UOMW}{3BzeTt_iNyKT*HJ5DVbe zRAPFadUydB@2=*@=9u{Jj$I~nV(UYQ+<>`K?PbEyIh9yXL z{kC$i1T@oNiM_r|hA-b^7kf*A;oL|X;MEHc};Vqjtg(rc=$Y3Nctq}wxvl&L=MpnaSGA>GS0nG=irHp$yUoo98 zk2`bSmJ@`2RDB5~64Szus$Vw@%E?&-U}miX3MzC?J_wo|v2-1Lp~)t$N65vQ%XLs` zv}_N{To8OrPO?Ne#vx@&FIU%12_hHh;$HK8ac&@|#{k@rpP!}#oLT_>fb$pO-<=!Z zUATr6b;K2LU@3xKL!~D2C3>cY#)h$l4H=5gPwT6P+9z6WeB;b*-J+Pus)1_zahry2 zmk1o0g3Kb9{MrYiiva!Yv)Q7kH|}&gw`0WZ0BDVJ{`@Zhzh=yEC=N{d+*;;XLLHO zjoTr&{B*%L&f!sP>#qLYX!_qQexF*Cn;Tt-WfnbgyKN2P*buf*EMz84w(*0-2US0C z##lJH6UrV$y!7W03g~OZ!4<2NTlir^o=Q{ zl>-*$cEHWO`1!|tcPq2e>0RuSq5JL~WY+NcSYMICKGrhn#zxk4GhD}b)klG38`$$u zNRb^p({Wk2$MRNo#TVmwp5{_Mt7#Oqb5?7TRf{O&<_0d~yjJl{xHW(jOo_y8R6F`t z?N!xlkXi^_9?y~!pGK~y7wx#CJvW>-)`xyqn4m0T(;aIJAx6d&)A>Sr9Y1Z$V#4Fk zaU!}Oda8a?+D~7gw0s8VN9vl_x@bYA#$)6Kw)+b!uW@<(O^-@1pdvNL3zR8c{UiM} z<{MCy?~*g|&=17~XipB7sSJfLkYX)To<=BgNaW#M$LUZIPGf6N^gAkYbN{^>4Jk(# zv!16S1j-HMm$86x=w9!iY)z7D-wV8(HCfZ-AAOua!u4&BH-&OfCu! zL*~SzklN7_E(S|$B_W+U2beiO&?ICIrO7_Amr8b&xj}>CyZ7^v^u{5c_ z-*>q0K*Py(s&e;+YXCS;QYH6TCWGPk1UQ6L#$j1T_J27CB}LkxWm1zdDAg!yt zK7pBEv?Xy8Ot}bbBEAckVAPTA(a}96=@K}UegjZ3HTz~ROK@O=MBr{sM*ibg0bi|n zCh`8G{yF0D({iP6QB(=)7_x8vm{sQQgb%AqS!t+y0FLnOA1l*Uqf#Ib-;TuIMV-Kn zeIf^4JDp8d zvkk7TjouS=Mct-tt$IGY0-Yr#jN3OWnX(G@o-OxYtvY>Qq<~@e*Wv(MR1n8FG0T2w z7+f@8-p-k}`#y==!Rx6Vt5j85xl~Gdqvluie$9%c2QSGi{VwV)OrwT)U9dUo1JR_) z1=7Fu{p2{_2~CIe5ru2tD621)TWh(`UW-X(?Vg5&JsgyKv>7}kPF=3~)gc*wqbtT1 zi^x68sAe<9<%Gw*W{VHX0TA;Yk+CT0 zG8}oLlY56}{3>Bu95ed<+{sY)d)70|sil9*zqhR=+!{kQ^pS~N^5~`%f0zV32BS}a za-2!(3Jo)FFS0Jhw5n?1U$B*-4)I7Dqdt!X+B1;hCPG!NeGWZ3kGoG5;<`y2yzDEc zZpod~SVzkquW63*^%e_$eBVFkJ(Y#iw^;+~spak&G)X!KJ{|5qd;epK% z;y(~-4hD#KE0UVgiI`Pk-60Q0ly?Hz8kNu)6sFnTY?*SVXX-7A4(bEw7Zu>0?ZJL)55|8#>y5O zS%WB;tsnQKA_WP(UCPUa8e~RZ!oLCI6G<%(IGOgQ0^J00jL9VG!IlLuX6j&{%h#g< zxYVfmRMvM47Hlv;&%*u+7e7@Ym8bLvT{$k=n-?dcoc_9cjf1ue2XdbFSAmVpW_OhU zxnrqb%W9klG$OyRrLb?x`hlH!qN_pH!z{WH<7(#e7r5cGRnBrzk<03j(~0Z;W;%40 zvigZs(p|rN$eo|Oe_q&B3HmjeDEw(TsTNN{vxbUFS(3!c#w6=eHl9c@vS1v1vWEuW zyo%Ab!?FHH1F2A7`doKee9CRoy;OWQgow7A0+Q$g*8<5*fGD*>&yhnai*DhQCCyEI z$P^)@11Gv}H}JQwa!~4dWTUk)Pb*y5Ut1h%l~UgR2NN>KYMrmyJI9>NN_|@(H4yi& z9||&O&}9r_6OKt97GVhr7w*W_yTHecKx7!PSqi1?ryc0&wu>y=?gnYKTg&d%3e4kt z`Y|!*HU7!&SH^#!2ga769)<&;>zb*%6?%&;pbriTj!VI~+Deh`Zk2k?7*s?^&9K-Q zslIxtUM8A|btNHnuM@d})4Lpg7z7dex$I?ua{ex5L~SmcdhbC{r+QL;CHYXP__IVJ zln>t*fH+>S3MA|jfd6fu&($=m1zftID6savQ*QKcsKY%O(j*`8JnAo`V0P6o_?Ajp zzS=W?`Zh1c*lKRqQb?tMw*3IG^O}d#@l*#kd6j+0%=#>;aU#!BEOuABYDLAf#?B|o zsz$0w%%y5cPJJA16Zoa4y_Z7&j*$N3nM{3MnrPQIH(Ohm5JO8ZJX%yw{=Wmw!cGBD z&Wmfpcc<-FGo7x+R)`1(c7iE$V!c>c*i0gXzke@(;jXCfqF762XxmoJ#J-ee>_Vyx zpf71K_z`D8x&CNc3V!tXf&c{?F??6QXJ&#?a=E#MVjT;hBZ|wg?D~uYBxR_ zdhPjY_m9b##R+(D^NJ*<#h^K5Pvr6fl-B@5Z);=)TcT0sYnnG^qV`a+r$1*? zd~uRRZEuenOE1!@+o={-TQT0=R11+8t}lzG6*_r{mSppWnEP+t?QbkT1s4HD2WO0t z$VfG7!FNUW6kzoEOIE?GjS08EBvf+iZfs1h>x)_~G^xfA0h*!q?G4_U8*nRp%Ej6H zRXPtds9e>(73JKLMpTKFk_!Kqa-(2a40+=0p2#5mbBK&Wg0z)SlfGy=1-YBO%=Kt)y;0QvH;f!cQw1$YqER!iMN`t}w3);wyLD2MC03BEErGEZ)c$ODL2LMyBl_5VQXCEWFWpy|VNK-7Jx&A*M7JzJz2LY3D=tu8THUp}!djSx5R8C1KuI;K+L>xiEq6J>$=Sk}VmjI8Q zMDVh}vRJLhS(K$nk5j*iG>e#q&2jDVa{!CFj=o;+-UGT-##RtH5>0`AJ;cH|8yrsV zSBs5h14E0&aTy8%>|cZ0#Dj=GMu$s5tojo8*(|g?e(3kxFzfPzO3PB&NPxs{Z?X%9CbXLn06OvJe9e z19)a+8w@GyAPSA3$DF>ceQ172Od^mfAjuYxjiQ47Xfhi*!sKRC{vofgD*l;RmO z;YfjTG4G*nIX3A+Z7z}1Z?TFenyndb={ehf;$JgC{sZ~d3ttF`^ieG%(BcA*5n^jn z5HyOv$58|E_Ncfh1Mx7hso!y#mo)0A9#}*hE$|<0+Mr=)E<2Mj?PCk8(?$jx8@NJ# zeZy?cjAf~&jA~azg>*YqPNmAygtmH3bA9zb-m3Y_JBM}#su-QZROrfYlijI^R#Dh~ zGg9n=cOM}ajQNte`gmpYHP45Md#+>Ru5(J8l~lBcmHd+J4NidRCqrJFTbm=mv> z27akL&*o^(wgd>&ujLs2uur)DLA0rKcYjvax`r2H>gqKO?f&%!7yw4WB!`LF1*!|H zi5?7P&CW#^&NI86$J#lu|K`_q{{wlvBCk>IYIc@t2@MT^ct*aC5%`ydW50YHxcVjL zOpr^p-k^l$`sgmoL*<7uS)xxM;RD~_<8rsbj7s0AdE?b{#AocEa^J$=c8dAq7_d+A zbbR|)gLyNg`bI}%D~^RDRIua5{)+ZX%ZfMKT2|WYX%s)NJ;1hKD)z$jEgq@zx<|y$ zM>#bQ9-&+EH-jBsn`VjJk>md!UoQHTBZ67q+kbw)_t*e<*NO`|dhW@^$`r>lB8C0_ zR?L)_@=)F>h!h4|mJ-}*^j%Tj)|mOfUtQ+^$*F~m`5KmAIR zVvtO;`gaL1s;u`Eqt~zn&<4(%z927Eq@F()Nr0pKg_zNHKGb};O8(VuP#nf;uo3}% z$mVmW{97s>ucp9=jO>{eVxC6J9M)R%SS~E2`4o6oSymot?q*F` zK?u@;E(8X|-bfNs08gQ3Jzq8tXF$1c;osssS%#iY;ZB)jGPftMgq8_XjT*rbg_+7k zWAE&M^{!530m@0GT+cIJ40Jekk{27vo^PLq_9KgTK^U#dIap00*(iiD(?KE-d&)a$ z%nN-Dgc)i$CvCzMM#Y~`8s@ghZ#k0F5&X-UEX3D_Au@|r zrrCl;mCJrt)QHr#R2c&TXLF$->pYQJep**K8I^`YBmac_J=JkqQk2Cd5^E71pvVC$ zSoBJe8;OB^FpYdyBYu*m($Frugk?I4@xPdax$&zIXe3U?FK<0h!u+zrW=2G}9VvTs z)3bde0wcX@cB-Kt^$D1|#3LcPvkQ#;GNVW#xH3W5@p4{F#1QAO49I|Ej#o(jx2;Y$ zq9l{FGj z+t(YP+ns-#57QIMpoS|V_So|Hotv4N9ThP-^}+2*1GNkx9DOUQpqj=k%EJhI@U2db z)yzyeDvF=@%G@_!5#eyrsYZofwv6YK_W{j z??4{&2r`C+g*;snF7hPNE|`*BPeM5w(Ili;OY4`L+wQu@P?ONj`I|UgwR7r0_p$vS zweGgxOlo@*a{XUUp1p4OYuLy?-wsk3-QN3iTNill@Fr%Y_mdG;*0lQlmk9zly82R< z!r!bM*_dh*D#`}es^X);6A4bTK2;Qw|mx8h|4eEOQJ6ryhVDHu6 z=Meg~$ME*Bwo6qlPw2hcWqWVx^+RSaq-Sn%A)(r`R!ym6kJN~hmqDxPT18^Q3 z{pkU;d&;ZTM9^$51~`oD825e{*ZMr#xAWWZBVP4>lD(JaQ@G)G^ez(xyne9)o5=LO za`WP^GV&^06!E^cw0<`wDD$5?ZfoE3i;(MDM-K2GUF8Rdd6A~}8tyr^1X9K)&49Md z0m?YjlD$?#_QeVLtp*|f=XPLFCG!vC)E9O}oV-yVJ^hhBCyOe!ML;-u#F% z%VHLoyeGBLT}(ll8-xowGPhCnK?P6sRm=@XzNV|$Fjl9Gn447#O@M|MK~jQa(}Jbr z&;d&nI9J%!hI?R{g=4!vUMR7l7|9>W>}Z<|0LRN12Y5eFk? zT-?loo^qnR-o#RH<&^gr_a{6?(0zS;{-HUc1@wLGsp7ZHl@J0)j-;t(KSg^)Z{}|$ zl6AUj>$?x;p$W6~s=zR4Sa{yvA^VS>uU>yqiTt=TZmaYN@LcO5NHq%abqhLmFXZZ+ z#wet5?07g?T8U)x50hM3%eQ71H`hj1Q(569oxE6I2ilOxu8Oea`dX0FOO`Fk(0Gt` zhP2?@;Y`vp?q><0@OwITf0|zG4Y|*tTj+z~gQU0D;U6uRU>{({l_=YK7TP7>hqvFK z&CxlL5<3b3?@C&nRrGShZm?c?#KuCn0oAh;;tU1Yy$9KY1j_&t5e=YTd#K&^OO{hg<(fpXqT`7 zGwY~cay_So=HcH8!Y5Pm4v%sKjRu@GK&bCbU;ymASp%?gZQ0NrEp6}X1~+A z_}qz>xf2WKJx$myuiyEFj>4e$?mxUrM)fPj1>9IqCjSE@m%4YSa~0?spcK^GBsYRz z2gN(g8cRX!R7<~HXGh*!eL5TT{W#kR;m(gNs>=o1K0D*CmaAQdp9KWSfV6@unK0Fz~x`ZJTtJ8?>%s_y^gN(ZC$i?q8h z{{!ig{FFOZ2oH$$+Uz&R{AjC)xWb&B5AZ9heQRq$KU{PEMylNXi?syxJc8cscP2CU z>TF_ln(o`T?)UecQ_gY}QAFK$Nd^2sKA_qCm&s>$v=~K7Fm;rq;oU8qRVaKK!dO=> z&BrYM0F0>IztK6U`3_^HI`HRx2Vz@E3^LqXOIj!i3|7ILJ--TT7ir~~nZIpNg z^T}SG8jss1hnVnB`{wRA!R_Z9;qU3KP?P=v9>t~;MM59IHYYS-;gOG;RR%8g>K?!y z^>nD!k_DHVhE4oKc3hePfv)MpEgwh770!Bgvmme;#$0) zfIw&AIcj&c&w;vpVTN8^&?1lgEzf{0M!Ae(v0Abf2W4Nm^-@SRM7;!#SqoC+4=5N% zz#1epVBk(R;M@ix1&(BTgy`)FUEZXiqdm%rV8G${t|vrM3dbdyv89Qm4~PKC_A1e~ zvQWy<*4Tprdp$MN;X0h~6`2uIR7SbvSsZo3gfrvj@xsP2D&f&8 z6DXMkKHL^{Dn(e$#0E$;t7}rvY9e!|&^q{m_P%bk_UN0|9ql)$KYtUzQN$3m5M7Wa zdjt8{;9?U(7$a$L+6y79{SDh-V@%v$4t7%u=G6Q%n;>3^r(S9mSCC*&H3Ppk+uU|U z8CHULV;VQP7%-y!=>lrUn5UAHP(lo>v4a5PRx4w&u01YJL`0UEX}A<5n*7jrMU{KQ2QoEmaY_(D-x;=7;~S?iwniR#+#Q4cJT_(K(Bmf``?S4`)m3|xmr6vd6!*MYxHV$;O7I8j!@c~Yhek#z zxTI#ycz=~h`||;dgg>+OrC?86I3{pO4P)OSI(M^%{TW+b+pd z_(#7{c)mU9`%rt*lDaZj)`CqzJ->eQxN2G}xQTsl?OMWcz7imHBI|7}VVFpN!{lc{ z?tGo#@hAu`?%hD!M<0wdigJHH6r~U>#K@YI9@8~(F3~O}ajP+{W{DHV)6~~io^-4l)6_2w z2RW>K?yqD7g6Q-MB2v-SCdB=^7`{CNX2674EAXX~vP&v`r;xcPkJeTX9Pjz8*#HZi zp&gFT!2lTxGwO7CKBrlXvQdE9-r8+tHw_+9#g(7|dK~xb^NJxb9a-7s7!ABihh?;- zafEU_B;U3!%C*k{TNtv~rYnsfqX*k|8-qa{iWkwq&_P+3NHF@N&ALZVfHJ_dlWS>%~f zcg4e5hm+`2t3RMK#&Ijg_sC#d5&6qqzoD%|cVAfm0AAO8m? zY|JN(ARhLrB_-#p0Nqs;JJ82gUwEJZ>TD9W zTP}*nH3K9_WIV$~8H|d%fc~Q@LS<VZG3h{EQ2qLqJu$I;1*1g0%45RHduJwp$Dw4Zo9$US)|IAGlSgpN{uDb~{ z2I{sb`Jsv<=h=j`YTmEf!oU5r79ROhN$Ak6`Mq~MK~8XN=vK_npalMUx^>VeQ`^e? zg9D;`K{5^dQ)7y!_hGgL$vdNkQV`0AVA4MGE30x8%`o{CbTm{z$yKkJe!aiIOuXZF zd8}^Bb@3t|j2?k`p#l2Lt)asbi%Z3p#(w>z7(!!En*DtcG<>-X*dnPI==0O9u|5ve z@{!P^ij9CA{Q(y6udOY!Uuw^?y?4pN`6QEGT(iqm4?cn)7oB2x9A(EldJguT5CK9X!F179wt%??_l~y|JZ5t zbRZo+Ja|S8fSuENC)N|XT7u83O$PqwNMRvxF+4P5j^0)Lu@&F&uG8Fj->GVe5?ED$ zG%%j^snWa z>SY(|OV`bflHiRa0%5%+`+I!aYWF_EvUA_FM1sK1zm;eEJkNdk%+`bX!T>*4I59}Q zSl9BqG-KzYM}ljfVCnYAZj}4$8Y87)$*O&abBsjHlb2*iJd1_=G$IargLX1qKgawndRqALEww!f(%b-I9+{!K?)YbqqNrfK`3=T#^%AJxqD_Bg zRa`sOkjh)?`y(uLg8uGkDYw|n+9>v@M?};EbF!?+UT-lc3N5rB#c&051a#aAYG4bP z3XnRBd_(oIm5?0#)My)3wI?ErM5o?dm1KUJ%eO?@3>l@j?)qilw%U;oA)|f0ckZi> zG!m4fhP~;s0D(Nro)4zaXlbzo?kzV(RXMVuN~&q|#8 z9IWJV(coq~^P>C)-gm_=(@)sq)vuW3L&C-wzU>t7Fblmgz~c8lHB?9;+n1!JvELBl z{k~p>(AqOmWc5t8$&+S6>^kPKhKZ#F02*9IGCG2ajRu__<>x|qxrw?r3sP*AZAW#O z!oREl=RH~>cfbvtfjrs!u3EmKaYYYUri}t=F%YXttex3QbMG98ESN%MIGu$+xsSFC zkns9L>q1LGhWYLUB!-9cz;TZV(kQY!5?vuj-BVdkeyY(xkALQ<2-El2(GOeI@9STs zYXwt$(E@~YY2D$ZUyV>21(Rq3nI;5B3m4a@$}GS;D$D}fqF_dpr@3utY5PV-_>D&%9I07Ld_*ORx9LF1t7p)1eH5TRF`r;+VAGTK(_gnA5PK> z>XMaO5KkJdehd+RIOGGsgDv6mAj50n0$nXYHRzc>kaT^~8Lp5yL|wQpL+AM6-}vjA z47G?~Bcw}^ErA08lg8d+G8ZWe6K|@E?bETa>|~RZei3!TQEdDUOElO(IfK?+@K9aB z|0iye-wo~m6wd0-^w-;70K`XH0n#`Mxha)vY*Hpte&$Fqcys8Sstc>xp#W!+8Mo&w zhoo3x?nt9>alQm@jW$2t&(P)qdOYok)6WqgMYQmoQT`ujQLkZV^Tpq#g@Nb8S454c zT7%ga!U`nwNkbb@)A0a~zwFX89ByQb<+N+dwT$?5j>>-)9sR<|hK9})wkQq+aWIa) zE!@@#)QqU(5q$9IM-UU*u~sOOqj*2FqY(2=f9%ndQH+emJq~FLhayqGfJe0*`ffWQAp2y zKUYWb*2g3oKhY}=;WMo9hQ!iT=g4n?5HsJ;3yw1F(pyJh5gCc`ZaTluUa_1_Z@RQ8 zMW{Fb3}a!{Xu`|(A2>Lh_yd7NP>>U}BW)!b$uInewzsiuGh@B&&%Y@KULf=(;J6+* z%r%}1rIDB(9TVI(vES~9OG6vUoxp5~pRBJ{J`Zm}xFYM**^XQvtj@pI!g3_y+j)ho zBdGMp9RK+V#|2f~JQ^svO3IImZ`oP7dAYz*_JSYhS`8s-lC3LLtUUzp^ByAMsyp)K zB9B?XdCP^ZgUuA&jFMy8nB;BzLMmR;HBM7Phh;zXXdkG3Fcwa}DEBFs(G94b#9Kbp z`HJfGd#*jn?WgU9x7g?hccEIkD=inp{_eSRD@M5K>0a0qQ_R!X7>GXh>8_EbrFK&g zOEdlp^<@C1_wplOdm6n8V8n|Ie@K5=^7AJ1F^x*X`fX^qg>WK0{i(ID5AdK>w!Vim z&wXLaOM^Xjeh&5i4WZUjR5fTc+Z<$l{WEB6<>V*y#h0?X70+r7RM`}_sH=kio%?=g zWMXH-eJ;ovy9<*NiGx<4LvjkNPQk&+s-q8Rz)rXTH=wBIJhqzEKrM`)3GDGnv+(Z< zX*+I-vA7Ki8c}zj2Vft}UUnhPY6U?pEIdu_hz9voNfX@W^I{@7yFDHr4H#g3oF04X z$*zy5y5mKjW)=>qDx(g#veTZ6$ui9dfk8cIV)hMl_Mkq`!=#m~n%r1r%54WzHZzYR zE^3<=`M7r&T42YjD8O|#Q@MCsr8>AtQ5>%0>9-uMlk;9Z71&haf09*$iGOU?eM4-< zzLHoAVkjHyTk5(6wxAdS_lW|^+>vjT_Aw!#^thYnqeACqpeN;Vsn`@+qP10#F))m& z6$B$IO;;irSOe_6;hY&RhnERzDx|OV=^e`D)RWqijqZTIgZRbSW|EQ2UbxRsDXJrp2TT4CO>}W^;}ciwU?U z@-W23SwZxOSYn~H-Y6zN`HgS~uSPia#fZq7<1VZVOe~=B9k4zxI4I*Y8&#(=qH20N|G6uIT z*orU`md%b?F{_O(Vz>2yfE3S>H`n`6Sz3*6yPO6e#N>0ZcS$Bq)Q;21n3*Me(8?59 z3s+hGkOqvi1lL5UVu=*wWao=jPSon1k>G|0?i52*ud|7I@Np5Ucoz$X@e4Ylkv$V8 zfxI(K%{kmr;G#u#LmP>Io&E3`)#N}FD=Fj%6Gx5<-Z5W^r6=iC2ij3b6S|=@x2%vw zCR>_i18ncOZfSR@hJCSIvQFG}r|8mA^imvojo)bkyfacE3cV|1_k_}xkh1;aOhZk8QF=?kRF^&M!3cxWq`=%8@KMqNezQlMp7-J4g`fx@2 zwXx_FC@HG#ngd_qKLG5UL45<4#?q~)I9iX6B(`j?ciq)2cRWKYbO8m-HEk z@6xJZ$|*d?^y1unBkRxHkF)ojwXo4zms2^Bh&PpW0Y^ole&V}sFCkED41l=uIuKhA zR~`R)0=^ied{w;SQwN%C(e*0L@eKEEk<2brnpV*k1OmGXS4wM}5V$ zwg~YG14`7STB01Aidz5dR$^%61Ccu>fr0!vPuVo$syvg!Jv-B3F;(1YnCtBKmPGGI1S! zyW|L1dm=Z1Y=kb0ez16@b`I8Vrg5g^g$a0a6pR33OZ`a$%I$zIKElo5_m9kh=-maL zHk!vj2axz(;XAh%{Rs3XzYiRIn z9`*UhPwC8iDnXMUTVcd?D1i5NStbS?>{l)t*?>ewY;j4)UarYR74iU`BI z36!6pGZbBp8a)(~Cu_@b=pH<)e)yx)$&a}?_Y}un)NG-P%)a}@mrjnmW6Y$n zom@-)E=v#|uNzHlv&^I!;9kvwV>>o8NT+HEDtOYyNOe6+55XgBpQnQz>xX&CsO9}$ z%oik3Ktjr2Od|{XXEBK4MQ#hRaTEOuWms;P^^lj!R`~+yHv1oAG;vfj7qgdWGKJSHJHSOKj;Ik{Ln|{*^Ah~OM zR{gsV7+I$BZkKggrh4*ebqUadKGXH;F6gt>#hnRhuEqTI-FXx%x|^lN6OB0vyO47nqrN?AE(aJ^njs9yLnpVD#Gs9E}DFUvRbqob!p#p9!8 z{SZ+QWm?d(fLxhm6KC3EQR`e73-PN!S6^$?;YewRANriNl<$_!T7sz*6R8#?AFF%A z4LaW}C4CNi_qSup_I9-FSnh4|64~ye{?TqJ0Fu$|41YR*`NhzHcTMNc2!N-B z>i)zb6MCJNgu>3BC8=lFe7Ie#i)b*uM53~=UEpE1-69{y222B`MQ|5m_zV>fd z#0X7>p5zcK7~3weNpn*3Fuah8goMm`2nrd1$TA)cjmBr9NjrXpgzzaL+GhBFi z2;3MTXyb?8?efqW5^Vr-fY$?;DfdhKE_)+M$7}cb%-5^C!l+~_ z#B1;L*~h5Ft12SC@%lR`+dBH)>`6~D=sQ&w;xwCK-HCdW0Y5LN{HxMbADKG|E=eoZ z;(b`-9>B|s@6#(o-V{oo?;l40<-p_FR1yV`9h5)KGD+N`ut`BcP!j23p2m4&u;7)f9c=}{^q3PBkH<+FGT679D%UbZ(mDzBd|4WbXS3pK{>}$bQBA z-TDoQVNVK?gdfTC0esYI4-UvnS|5O3D_dfz6`Oddf*&!7j%RN=X@pu!UugB=lgcQK zy&M_$A7Q8#iaPH5j6a});X3wc*n$!SU#n-qK26()AIjeUuT?CKpG&vI@2X1K@D+nM z^tcf_Z9ia09fnuwkCmei>Vo9TXC`)8bC~^f1C(=0g zGJ0j^(~2^Ns9b?MV67651v-fFR#Cl2dzXAg`HzdiW=CW z&5^=t98qLXSWLk0hawGmDj)W_Ekm3Jt4!bhJ@vdy9PfH?%RJZ>lHi%xc6sfQJC7S=>q9+A}af=N}8lUV_0-j~9D(<&g)1@${lE5^F7-!^RLV zObE%CgN>_YEiU#%b~M9y_GiRB%NUsV;Ikn-`Qjpa;M~UUFIs&D#jhWdIODF6!$QKy zY#FFiir+lZl5=fZ#vF#n=e+`xmgrO=y!FT1Y5`&mKGXsn3y1rkD{9J|X55*iYC!wWiaO&yX zpMGw9EbcJJAL~^R`wBDg$If8A@Wk|S7q%MTI>}xc^gY7n5&)NXb!pA~A#J~*-ICp? zsZFfvev5E3(fE<+vTtxfa`!E3zrklgTuNT4JmCAKne6*I zBgw=3OC& zjkm7MH@h!#QUq$UQMvIouo|b-k)+y`64qZ-WygTmlPxIo^g;i#yZ~cd>SZC3xoKQH z+}tWp%|;u>)VUL0glaPw$9YTRSP@J5>#T6@qk#16Q{emE^%u+kEBW3XF=4i|(r1Tw zR*{7;h3{1!aR|X#-o63KSY%}Ov)_Z12OtGN2Gof+7PhJRLBozoIn}`$Wh;P*(36)~ zx__aOkaV6>T8{{?&p{fj>GzMc#v1W)3-K-rC_ZVdrle~%AYPT<4Ivs?oaI+Klg>hm zkpmV^GMC8JQEdm15;&6*Mcf{AiSacZ%!l_B4zfa&sM}_e@-kB$FE^*cV>lYP*A9#` zVEW-ZF-71_O<-kZ^)#!Td#R&NQf*jgcD$z0V5=|>Q8hbWn7#MMk{mPhaC*?{Le z%&y5~36{z2exyckb0F1h7pIekDya@kHmR1f_uPN$xmF63<$dR^SRHWbKqL>hDo0Ev z{UgPyISWk$7Klm3djL4L)_siBUD;b^PEhXXnb^^@XU?#=+NhpIQ}_x9@+2x20`G(m}49KTO^=z6>W_B$RMsl4o@A zDqN{7qPMYyJpEZJmhWC5OgTs#j5ENZ4?BI(#;}UOum@A(ppD9>7!egt&|R2Viq^(A z&TmOxjl==R_?BqrwS0)@&U{TWw`TUNGMmV-;ITTs`P%xi4GFhPR)WW|2FeHt%Ve3c zipYwIrh+0%x;6;1Y=c4Z#_y&OdlC4sz(`3_rHRB(Df@;2uf$X^thDyub_e-bVM6%d#Sz?6OoGf zW{l7*P7DS8?9fb7$q+&Pgfyb-A?!@=<2dJx{5AteDvB3xTBB7aeS?4D@bAU2`MJ4^Enoe03G6 zLNC00MpjcRt9~90O)Oz|YV4xsttq8wQvF^WBjBz(Z%X*N_l>^*H~vMb;-kd)cYUL* z-!nemFnTE^_MiTCML_KQ(|L@Mz-Y?(s4v@F=AKM%$B11N(GncZ_wOSF0tvUJ{ z_q)6QKpGCQBx9WNT8uH0!Rw~7hxX%X9uYu;kFJa;e9&_ z;kaY)ns?!ce`e8$F>yd-VbJxGs87~U63ualtvTF21gTA7SMF@{myrpo@kbks{8 zB@|g1Ta|FMHiY&!$VBzGyu})`cqZZ=cQK(G{kivo4JCAWAcKxhtnzvWz@%Bv-z-^9 zzes8lP1Q7YaBP^AgT<%$Pf^8C*raSzE5R9070Jh`rg;+X0dOo1il$-hC0hZq zIg)fii&5Ax;ab;%SMKGhiI@l1xOZAk^@n8mj$f9sG8*IJOZ8|o=1y1VesGA+`#Q#f zUjLfTIXHb~z;#-a{?@Q=ARU+O?=jx;`{dCzT?6^7U!LSvL?m-6&(+q}iLcgO3FdNB z&#W%%nb;<0%&AHDKcj++$Qh7S68_m$B-X@O;?i{Kq>RnbT#w&N#HtlK^`}6wh?c4a zK^o4aeu^=eeam(h$5M1Nx*@#BiM!gqQOS-76p{N!NtGB^_)lrdt`&2nUt8CFT8y&r-mt*ckc^x(6Dk~J+;>-q1xnE( zXhC2f65$2v&tr_s@e66#D{G#FYO*1a2yK>W4L)4TLabqL_#iHfatPd9`m5fBZS5EL zg#b^gpQjJ|i!(F-2h(M-JjxqyyCCS5FZgw)h7FsB>S1}Q|CG+kd$l;%(Zv5iCqHkW zUM>dAqU!1}LGi~%^0~K#MCxz!nZ3JTv`mDztaGb>V9Y%l1hper{)c_cww$ZFK-*qt%}1ywf61Rdw#7C-_9Zzb05a`B@~E4Q<20e zG0lf{bN8QqyPRQmbtZM}5a;9cga>x;)p#KNJDY9?7sgo*PkaOx3TOiAq_5(- z3@TxZzJYWMM#HA~>FI+7jbxQ&EDxE)TFG@4-CPsrLuSi5sQUK)=mPLRHPsJnG;i-o z+bJJ-3>3A(ysQS7Dw6j3)xzT}0Ub%F?7$Q!d;pp%D-7xT!gxDE2Lhvv|lyz>M=c zn`v=J^`y-du=t+?0PCOG3J%JOiAFqQjjzTQ-Ev9h7u}TrtOdP=<*G5X6hB>1ig+$y z3LL3Ixd2QAxlWI>7(l->0DJ_c=4la0_lY{qr&3X}CE_IE@p8-(PWs_cgF!$zJ)#RA zXgy=fn$HB?AS5t3snKF|H=)a}ij}C8wr+YVsJxsA*i5ax0^&h|c^(jO_IqkW29kD$ z8&jJV3W-+nF2-ikS%^CE+$)6jEEPChITYNEj^$^jz=-8 zkBJF_Q%rd_q|@^QrwH3}K@xLMuj8Kkn``oRzJViL%_a#K&nl9$SY`OU=MN4@{|oGC z-im#~5v8KIGu~&OKS^tsQ&oDXH=)X3mnr~`uIVj)oHV4>g(1a>0{Igq{t-uk3`^|$ zx@G2z@D3d7W;^H3l>$yc4_+MxQ3+NF*r+`X%P|%wEA3rZ%&PpAbNPJt~sE{g~$ogRJsA0Y;wMj2V)>~5S6^?mAvpXmw6b^ z%*%D2f1X|mygv01)8>_g(G~S`VGnW66bx&^jHM1AxDd1aG=aW5#5N31g#km0Jj%k}2j%}-4UzN^eVF+@-4dpLz~sXV+C&Ap)20_?DZUAY ziq2Dh@)Q)kyG5eoSGHI-A=T9rdlbF?oGGiHFg{*TgScd zC{#q}wg!`Yj13nJ|jN+bq4QzC&k3W4|E z$|4w~z=vPuT|7rf*RMl|^EUP3SFCD6b9db$xZ5dz&sfc@jl4L^GC^;v4nZYaYbhY9NBLP|58ab|4;mDW4*TWSMq!`7`n-O~ zZ*s}$WB*slph)x@qki%iQ@-S}@2ZC5e;_0N)5IX>(jQikJ63BnwA_oAw};T)Tfq&7 zdlXlbmxbL|iXT$$NI48sNa9bzH(q*Y`dsjQ&s?k}HrU7hk@dPW%=PR1ccGBZ`Y&at zqg7vFx}ELRqk$8Kka}W?#hiNjACn7bd8KwvHY`g6s5X!bw;MB00JmbN%$u0sZMXit zw==j;IoOVf5$mQ*bfvlf@&xzIG~OTotSKYoN!u2byZv_?7ebkbqyL*%6BvFw>iE>q zhi8XP5<~rqpUF|%@iWmi8#OKALm2yiv{hU*wQ$rtb7sHGVC0<56kM6IX9+=5w!P2Y@R=XAbwi%n}M*c;ZR+SmPngZhr;vp(Fr>1 z>sk^4`_IYyF0VsBH&UG zz`@>uaEjHrK|^4)6d!I$R7 z*+&|>44GqJ9A*h(&@~w=b4M1e~aq5f`kT-n-YQqEA zjLGdsm;)AyouiYj%n0DxkcsG29a+>jTzHR5^maub(uzz?Klx=5Na39B1mxz*Y)Rd7 z)f|v&Fk}ZWR=RRrLgKW4l zjvg$t!OabE)>j7x^6A&Fe`Ybz2s_2 za@fg7oLF`sVpRZ<6Nu0<0riz8eu)J$CtGQmr!nId|C)!kqdXX-C{se5q$w#dD^8^` z;E;ce2tL#^4|w0OsGTYr$FupxbOp*VIv8ym$C6wFkExG^tz|)>eC-N-+KpnC7lbiP~AZuzxAb1{^XNghkuV)|E;(@mMup4P$(+q zWo6!uJ>dDQ?bp&!u^3;aL;F^S>;jf_81LJ%`cD2 zxRvCWApG?z600zsvRAE4pB@*g$W}Gn4;3D~%O^R}pdNe6>1nJg?V1_@7aCRB41WvS zJRI>0Q^6TDnSZnRbX*bL%#!}f*GOhL;v1@)qgS4^i;8HfY}9ulBE^^vo#*9fDj~Q# zz`ahR3x}aml)~^fLDt916=+(1$(5Vp@F}@;(qbobhcc_~;-C^^p|vV~%b}1zhj|Q1 z`l(%T8gx`PPq>I^a-U8^C^2l|bEy~(Wd(u2bO;`b63X)|8m%y7uYl8nSN?}+ump$p ztcPM%xRIt!LRmHm4H2gn)LT$FL$CmPysAw-xVTD;&&Ss$p+H~g8!h_G@p=rB577g= z1Ft56PAIo)9;_p*BhAN)0EAOdAvn}On{qZ~!=v(44=@lk_xUG^W@xKWnu`Mp!>G8s zBpi?4KRbKGM2#<%~rQDu3brdyIfkdrm2pqJy{KV4(({V)0ymfi{ol*h^-u!(9;7ODjU~LJ>oesYF*2LyY3pJQI zupGIeRhw~#2-HwAC9#4 zH>xaEfU^93URl9s4mz)Tq9_W?7e7k6UWTkwbv#gt==Bsmqj8wp#h$Do zxsI;`ffhl!B_H&7JOqz&2o>w4Kw+UGt*AB{?5+&FdJz~8BlM^^oz6tq0h*%9n25-s zy6mMtz+3#hqmC=~%4zf0L}~t71AsUHi$Z2tSp?N9tUUr~W1EDQ@>jz&T>Hg_C{swx z4b3!P=yj3kDr6`GT~|j-RTBMm;tz|42yS|s5NMn+965xvteLu=+L>X--}DX!61;e8 zqNSmIerxB}+*U)8{9$+YVL0_Wt;nGUzsb?WOGe5G#aBC0#uS1Q3StIj{UthqTe4!K zW-aFbK!7nRo}_n%_K)gWUsBt|+5!>Xe<1G@@At>$s<(cUkbfLdGey^^8&>8#r)6Ph z2%4QLXi^(<=~9;T=v6_MIJ)04ZLAQX388NRefFGuB;$m7RZeC3R@oYy&2X>quLJoz zfEyesyRO~yVYSqXJh^A;crdj;{q=clRHL-uQrC@SYcW!8QNLL{61)ERs?v2h$wL;S z#y1<_fw@os$Ma}s$I1g>M;tFN4y;xh`VRi+5haXgvL!O8kTndLg=$47SEOt|x>jdW3 z>L&{bgyx1AvAP#J+KpjdJR`Ox72RS!H$7#Qir(FD?yQPn9NElhGPyr$Zc zWN}$FmJX%7lei~Zc>2aR0DHzRp3iofm$tZ)kc79O{R@IiIdmhyr_u_f>J`KNE(<}s zGm=NnDd@X0IpQIBppa;ZByWOkrRqqJjFM4Acu4ctgtc>8H_rvDr&5djeN){YzLx91 zRc`sSE5YOARtsYOKKC!4)uLgNK-P>)+4(*5*?`u1HQV?A#iZYs;ICyyL!K zck}i6Ya;74c&+;p*uLdQ7oVq~#^)BCw~kMuEv z%o34Kl-J%gfvdfuErqS}{5v~Xu#p6ez7-yCP3MB>!~k-)PWgudaS&Ji1N)m+Bp+ghX7}-FWj=eR{7cb-m*fC`m)e%L8Xvis zOXTnWffP43J6F~N@%^QbY(48K9~&TFH*~#0NKwKgZuxSZ^o@k+l*u^`N&U%FVs#Pe zJWSYm43g=EO=xVxr4*->w&t_Tz|+kv&MbwQk7gBo94W= zbIB5qA3!bWC}{f*uy!w&#*yQWMlW8pnfRtpmv2{JSz73S(l_o}8Q0L0-W%zEo5gGn zaUGwgnbprr!{1w8ED?upaa^Zcf+3{XgAHa5y(Y_)Iq1^Xyx0nY zp)Z6079jT|Pnv(tQh5UUfL7-dAM@=u5wa{%+y{Wj7<+sw_ zc$>tLH2Gi)zk6xjfd(|SM)4CL4S+i@S{Hos zbgl@OB7d!bREJ<=1)rJGzK+*mXA=A$r4UlC)7FH6@9)9Z|5Dd(>%Qvfu%Kl0wbFA+ zjjMR4zpA@7+JKO3Lh>L=uYye464z48srG_>E4p%7981T#3zRuH9DNLmV0jYs!lH0WrDNmT#x)et>HABwbTpE$T|Oo=CTG@san6w`3fCPf{S zzWcDMfI7q!NAcg1eIgmWmL>n+dywDzoc$r(>h4CUu(_$V##LttwOf`i@Fh(F9>M5h`A zfWWW2uu$pp<$ng5rK$5pCR;aPHVPUHA_#IR1~gZiK(1{_GT51@+yw*_5olgl zf{MX2Ne6*6=O3h`Cs${<7M;Job(>+WCP2B~$xz!*WF=zITM*a< zEr&7sa9dey?mY4(D0gqZU1qA@tb=>#kN5qEY!*^dS!6#zrEfA& z2bu(!A*Hd<%3JF{p_+>4cZa_}mc7CWnDa4>&{fqS{+>ToanTH%>0v~}1|{GKKpA&j zQ93E_A;j{mJUcVNdc4V64tnP=T8oJp&N4TSnj+7Nh$3X>ZnK$WW( zt5J{sx!iir(9eqY;JIW;+2Fsn8oC@Jv25g;l& z;hL{xjMT4qT6O#>j09A91>?{szSs&doBO=nZL zLDBy2GxwWbJboJ}i9v6$pPapl;ui9K*(z5`E1YO|g|jaAWkEZOXzR@7HbtYest!t% zsuWA^cn<9_JVx`}a#Pkjr~KMEt3K>ox}kO5Sr(S%QK<5JT0d84LXZlODXxd%A-1k)o~ae*XeL( z&R3oipVo5mxSbZyM}_o;c}s#Xa8f6b*B{>bcm*8r!dDSfQ;(ibF4#(GaW`r&+`E|F z$=&|keZ4gcH&Z_{B&7rhgZ8kS9#98ib})fVeWeMU0qVEUay8-1Xl#X6BiG5Z6ODT` zfMNM~B=|;QgqDxZaGyVLTB>Wg$2n#n7B4Pdyf>^B?Tx||eC7QQzPeyJ!ByXE;SF$x z#!yYMj;EcS5Dsh>k{ac+V}{*cow*M{{eWEtgvbvo#iCC(%mk|yE=)xP-&X?9hIay< zrL;{2kr?oqXu0+sn3^^--!~^*#b-gD8-|H)msM5exhW2pi`zUe_$6MGzdx@1d`{<6 zfp^g>)1KeCrBOr6Dcz{kY7u#VvSXWHxnTX*_9TCmUtqHmF~JfU%XN${Et7hPa7{!mhozVlM3pP3`Y5 za}*Ki`!Ej(d#Qy$_!riGQg9)bH*QxWJl<6VF_<=JOa2cuUqBnpGH75fQ1IxEjWu$CTCkN0^sI)jdKP1<|zGN#I#!B7G z42(84u8tIjtd=El5o(ZKrkzz z5g$7SO-*J=1VT3SUICH}LCbH9))>oKvMXTCy=jw#x{#a@Y;bbKi0tWaU#}WHxbwot z9JyzElG-8UrsmPJezNK=dC<(>pD6#q&xzcGy9?a{#IYE&A zj9N1-1YC}|F+pg)LN7ta`l|>&?ENNSt`yq+hWGO+eiJWF z^9z@)^CmDj<(c(Z+%Ns0urVRq^xrdV$}!tiSYA(j`}LdToX3ZE0~QU;_=0K$iTxSd zr_B+{K^Sik`(1tG;l&K+wb!@1Vh{qm5)8F)T6%aFQK?iR?m)+tq4cXw3p)=iYrC{& zBk&GSOO5}9yXc4sXX@JhqFQWkc#jda_bEHrV)clRLs+Ri^+u*y{>DdWF|)3iCJq8+ zH-T_9k`N#@>77~=<|nh%DW4hY#{lZW)k!@E%9eb@2AU;C*c7K;ZRdPa3cd&;gPOvr zeQ}gAOG+wAPzMpn*c#S}RXZX(b`1wsd1g&XH$eau>LkJG9iD}_Kz-kdQPc`?vr-w0 z@(&V(Ye9~{Wd~bkNGDMcR5jPv>g5Admlpc+a-P;Qy?O60q3l#;yeHEi_fc?d|X$xgO34v24G00RbS}z&4sX~QmJ_};G2{kICbV9^JXN3$- zwIHD*yRP+2A{OIWFnnC;qJZA0+o8?ZU*G76@;;yw7TbfC(WtbWSy$;O?0auDFY@S~ z)e2R{DcG~R*>ECPgH~%<@D%Hw!DimRy}&==ttUkkW4`Rxajltgo|CQ*?LsV`=U1qN zQUE1^cAswScm7229CtknAyil+BvuyXMj-w&V-Zh=-{bZeg~$pu{~N@(mTW0|V#aC@dEhAZ zn$!l*PODLdUcrgp+`9i~=YV@g6XthUs>&(u4Nbju6rz_74FXWDV!?~g75e>1)FqO9 zHLkI45^7E4?0q}eGGn2f{zDZ(;XZT&{ly7v? zDhc%c8_#Ymr!6@Ar#Th9t1j7#y+&Mo2A8f65$s2VbF7d30Yqq7vAb?A4)Z)r*5cB& zQtWG8fQ3myvG-&xcC;|_s`=FtsrCw3(;d$E&y8kr9u09TK+dmVBS>U9RH9hEN8E?* zp9fu6zN=Lw#9Wn5Z$y9br2n%z5Dm~}+UU|#_r~)Wb~2)8VV;n?c=x&%BUR>;S|3FK zJ;^C#^bYt%L?{ZS49;Ld0={dy;pOe(IVvGj8S!2!4TB&)mNF`<4=vc$l@ENm7vw-XkX z*jGOuWdAJWaOJOQ!p$x8W(%Auh)mt?mN-iDQExk@mu=x>Ec52*XcE%v(w$G@LQLmM zaBx==qE7hDt}^c&S4+*FH!9UFilxY%!z;Q$45jm`+mo@BLL6;wOyrfSlGKsPOh}C* zLD>j~TUZxu(5N;Lg5%6Re@KoRscjE|SEZM%)~pQ3tfyy*B{|GhbHO6x)1EWUWP<2~ z@A&}~^rXcfDlEsRuM%}VUc(A3PgY&)*?NAPaG_-RkILZ8wuR54*};;;2hkvIP=^cp zdYseg4o=&r90XU9h>hkyK*tbhBsIlgWWh%QMp`H^r?W?Tg`@-Q73rdq0*i>bf;ioD zi=vxcL5GV${zFsr75bB?-tG)$$4?GZ6IScQ^)tiHoSfVz2*P@xBykGwzo+1QaY*z2 zwTH0Z4?nggW}6W=6%JsdKHKgb_npTJ681Zd8c^Y+8#~()U824(G-C??+U#Tt3JDgg zhDr5#oUw%b=X4%VnJdfS3mAdeuX-FDXo#zS`)q=_`5=OK6ms7Qs6vNOcK9_j-CS8d z1UR9iZz7k)Ns<2lVJ=Y1-+p^Ino4uZ?>sxjbcO4YZ6A~Fq)c2*5dKLF)2-5?J|KWr zCUZzGWqv*?52$#?$^hADreNHJhMA{wa8b%>rIvy{yECXL!FvSYie#-MsOY?VrdVp6 z=NMzAHDjSd1AALc`|1%@e`X}>;QV1asY*9vUb5lS4qAHbX>2*g5PZ&O$QdYfZ z+Q7o)rKZ5!%zoLPU?VTcbiTtK$1w)G^^HEZ3-f(__Q#^q^X{+tGypXzmR$=H{1JwA zqKkA64BrAMLkvI%@<8pmYXNbCvoN+wFT^~Z>O0gXbfN(f+vh%;4Rf;3moVk|YhX84&Swpl@3@pid z4ITrW;o*ZZ2n$zk!rG3hqu`q={OjI)OkaKHjzvFP5r?`{U~oyq@B+jH2)4qszZ(Gr zs(1Ij&=*n?u%0qX+;DJi29RhHv)G^jG&gh3+$09`aWI{a91Zl9$V1)qqiNu*^=P2g zF*WzovvAw$P=Fh`a~X`hgi$L$b&l4H)6b%?3;8mBQ^v9}|G1QFWr0~7sN%X;wz$^m zTZS(-(L)x}6rljYOTqAZ1a&EJk0S0#84dL}x(H5uyI)NSuH)B(JstB8UxNq3i&N%V zRy{{k_47C>l5RsOdGdz+E?ig=9;-7Z88mf$9;TxT_ASQ}4;6>%KbvT%GBr3p>mnzC zjojOr2E82@=IdvY+?*V~_d!832TUA&bz+y#f9dA===kJ@ z+H|Xxh{+AJ$in6kB2OP?1ADedFZD#(KjJ#H8eSG~T}Qgi{zKb0Qd$jZt5y_Y?x)np zR~|vMX;vlOLFUrt$rsR7W>mg=rLq}(--;eS#H(Aw-T1IFI=Ql{KFK)oX%j=Q<0l%N zHv)*yd{MfI9P5})jbn_Dxx%pE;=v00tP|yRS}Lc|Uaq)-L$jriW>Y3i#6YN-A0G3# zf=c$6cB@5(_lkieG^%VcaC(5ZzLg7PxL-_w8k6U<>CLcS}S zVSuw#&L_l(5>|r7{}1E_g5c2UXxhSipNjugcP1kBXSKA#2-@yMGBv&yf zl0cvTRr$zfD1vx5 z*QQgzH@fP)T!G@8I}4bZpPZiO7CLO#3FY2hQtG3sEFWx>F5wXL?&y9YpbD%V8rHo} zV3&svpnzJ)CEKp%*%`dL!I~S0*_d~Z+XV0>Z#Gl$_kbuV_FL%8+yVQnV4pr=;*p?b zv&R?Ijjwav%uA1KYOUijN|rwN#BCXADo~HnCFW^&ANf}3jWlASv*?FJ3G7b>IG<{y zYQ?UxEElm{RF&Sb-^kt}RkKi56C(>md!rRR`CvXAc>(5}v@4?oo=EjV4h?%&8a^Pr zy+_E|0>&`akZL3QsgYP-R$OuiueCLrig}#xNW4~IEe^T2$^EW#2mM^yUfV$Ri!St2 znz?ar%qOANccx<$<%6WCgihZLw9#ogj>+G|p;&%>y(n6gHanx9i;rg#$l>FlAQ*O9 zL@}$QCcvzI7u8lSRI%wtTe<=bgGrx={$;GQ(uQ3r%rBoTVm<8ik*>hbCLue8NiPdw z9H?|j}!jLv1P_+Qg?EmRf{-C@d>X16@&t7)#Pz?G4l)^ z=UK_NiG4EKm7}Vvk?H<`1(m8OlH@c#H#eCJlDkU+xL=Q`9bC= zrxb2=fkgm}t-)$@JBdP8Q&OC3Su!O@9>=ZRQ59>I+?}_uK0lj zX!g0Xr;P4zY5tuLU*X5D-31;_IOiU54M+O!oWK0<{rd2QHu;8bKPcPrZkl}WyX0g- zmhY+sogn-iGKGuhe%$5z)?QE=Fa)o2RYsW%!)=+JvY@UjCN*M3wNjYiZJ*sIE zll1+xjECpElP{~n*HfhebC#vLbZX|j5i7klsmDLHEtju2pI2*0jfCv4BGrY`U!Y6A z)V4lg+wCi`# zn8D>18t`CgX#|!4&OQd5D5Bk2pn>$hvRf=xreHe8S3Z0|$b7aQ*H`4Z$t!vulEBJq zYoPX~6G5&FrsK6FzAWm(3e6ds208O@9RW(MqYD zkn5j3DXFozPh>Y+mRGWf<7$!AUtaeq9mFVrT2;i~NL9(qZ3Z#vMf8QYeQ172?+ko} zlw_jz5^_%$bcTMZXr`ZLX}4u)9UzqSdCKD}>154n-~~H{P62jJSFlCShB+{%=(Ba4 zjAo!bJPEKAQISAiKgS2JN;HY!^{9oOWTFF!FO$per0QC|dJ?I?TtPp^k&u}yqQ-m; zhOg+Yq9e{+?&gR@Nh@^M>Vv5wlC7m35(?YQi1Fual96@I0OF-4ZOQ7Z+L&Z+Lyjza zz+T61KE$?mLs+qJz1ecGN&R@Lb<^`3Rj3KjMk9s>g%3YBg*=doa-gxMl$U56v!=Gx zQQLLkxjq(cp#2olWBWGFh9)8&&~a&xzmMlUzXkvkNQ}n0dzmXghElTSqxoDBIJ<}UQ#Gc|R@q$S-1E!y^qbfS1 zaXP|q?;Xgvtr*_rpBcet^8?NDN-BKA7fKEUjd+7o} zLO}p%^gYN4v4_4I@N}&8V>@wr@s6%wABk6Abi4AE>e!phMB)VJL5XckOt4b=M1#f9 zZ*a7k+fK&Xk9_Sz+yv5Wk1t zcd(AS^VIPm}+# z5a+RD{aCbhiIqZ5puz6X-~tJ~E`+H{sBMUa^i(DURiIGuAqtWr25{Ip?|_%N&L%1~ z^7{>5@``h+@zPCw=N}Q^rhT;5;j@*D23~>>k9^j~R3+oYZKZ8~zfCBDjf}g5+O$XV z^EHuULpNh+DcHWM?P^hALIEUiIkS76YVcGW-^-PSK7zTRT(9o&_U#Xd0cov;wXRUx z-BbqG(T@ej0=kJj6B6tdOJes}i*p55>1Sm1>2gH<&&i+Y_DqbnBepbO>y_T&yMvF( z#AF;PAMQu39I#B3SeWSrl-&5{=y@6+J7Y4}sD1@;yVk98V0QT$j~`&J_r6NaXc4t5 zaguCc787rp1$|PVo_v&~DI*&3b3uW4tS2VpKcajq34pxNG|}w~Pw%6{p`Gf5Dp!$7;4q0}s=&VNxKwQi<-!zeqGK2qUv;d9Y4#<|e!D4jNLATLp| zyntbD>_F{X>wn5GzhAt%=@Rc%`{oh9>A^Pba-;b2)t zCg=8W=A}u~AwVDy;_UQ4(B;*_jY}z@Iq_Ow=m`3o`BI?2qx*XWi+tk8`%gKhh=Hv& ztv61>Q>PoVHhMypI+sZJyMeYvVIWHjmfjK8^U1YOoB~fDg=;{1+rw_TlzqfEJz84g zDfld11OFdL-QIRCZ`a@9W#+x5w(onE3MM*T;VHgJ)P{hNB|gj`Q!mcx|wqn8@`l0y16^Phh1BvIhpi7MN6Y|d+F3f}^h zDGLqi?`bDnCt1J{2Kw}V(i&9Z=Xj%1AXExF&hW}YJ$DV*6xow#Np$Ss{61kcU-5VM zM{`ZKIzbHw)W27ad$&)QjDJ~}v`>98=leBB+ag(#kz>_ZvJ&&5mBZ_$bXLGZ4AQ4I Pk)R?DVx+kJzq$Vd*Fhtv literal 0 HcmV?d00001 diff --git a/resources/assets/sass/app.scss b/resources/assets/sass/app.scss index 8632223..04dc2eb 100644 --- a/resources/assets/sass/app.scss +++ b/resources/assets/sass/app.scss @@ -11,6 +11,7 @@ @import "modules/article.css"; @import "modules/search.css"; @import "modules/tag.css"; +@import "modules/sidenav.css"; body { display: flex; diff --git a/resources/assets/sass/modules/sidenav.css b/resources/assets/sass/modules/sidenav.css new file mode 100644 index 0000000..17c82bb --- /dev/null +++ b/resources/assets/sass/modules/sidenav.css @@ -0,0 +1,62 @@ +.side-nav .user-view { + position: relative; + padding: 32px 32px 0; + margin-bottom: 8px +} + +.side-nav .user-view>a { + height: auto; + padding: 0 +} + +.side-nav .user-view>a:hover { + background-color: transparent +} + +.side-nav .user-view .background { + overflow: hidden; + position: absolute; + top: 0; + right: 0; + bottom: 0; + left: 0; + z-index: -1 +} + +.side-nav .user-view .circle,.side-nav .user-view .name,.side-nav .user-view .email { + display: block +} + +.side-nav .user-view .circle { + height: 64px; + width: 64px +} + +.side-nav .user-view .name,.side-nav .user-view .email { + font-size: 14px; + line-height: 24px +} + +.side-nav .user-view .name { + margin-top: 16px; + font-weight: 500 +} + +.side-nav .user-view .email { + padding-bottom: 16px; + font-weight: 400 +} + +@media only screen and (max-width: 992px) { + .side-nav .user-view { + padding: 16px 16px 0; + } +} + +.side-nav .collapsible-header { + padding: 0 32px; +} + +.side-nav .collapsible-body li a, .side-nav.fixed .collapsible-body li a { + padding-left: 45px; +} \ No newline at end of file diff --git a/resources/views/partials/navbar.blade.php b/resources/views/partials/navbar.blade.php index 09dfde4..5329ac4 100644 --- a/resources/views/partials/navbar.blade.php +++ b/resources/views/partials/navbar.blade.php @@ -2,7 +2,7 @@
-
    + + + + +
      +
    • +
    • cloudBlog Introduce
    • +
    • + {{--
    • Subheader
    • --}}
    • - - - @push('js') + +@endpush('js') \ No newline at end of file From e311a0e4801d06bcca84aec45409bc0391e43001 Mon Sep 17 00:00:00 2001 From: Miles Pong Date: Fri, 7 Jul 2017 15:30:21 +0800 Subject: [PATCH 56/78] Add copyright of posts.show --- resources/views/posts/show.blade.php | 13 +++++++++++++ 1 file changed, 13 insertions(+) diff --git a/resources/views/posts/show.blade.php b/resources/views/posts/show.blade.php index 9d95eb8..573c8c9 100644 --- a/resources/views/posts/show.blade.php +++ b/resources/views/posts/show.blade.php @@ -40,6 +40,19 @@
+ +
+
+
+

版权声明:{{ $post->author->name }} 创作,使用 + License: CC BY-SA 4.0 + 创作共享协议,相关说明 +

+

本文链接:{{ route('articles.show', $post->slug) }}

+
+
+
+ @endsection \ No newline at end of file From d9cd33d81f25f3babef3e5f2c6fb88a806a709f8 Mon Sep 17 00:00:00 2001 From: Miles Pong Date: Fri, 7 Jul 2017 15:40:48 +0800 Subject: [PATCH 57/78] Add category link in articles.show --- resources/views/partials/post-meta.blade.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/resources/views/partials/post-meta.blade.php b/resources/views/partials/post-meta.blade.php index f2cb0e1..471138e 100644 --- a/resources/views/partials/post-meta.blade.php +++ b/resources/views/partials/post-meta.blade.php @@ -6,7 +6,7 @@ person_pin{{ $post->author->name }}
  • - folder_open{{ $post->category->name }} + folder_open{{ $post->category->name }}
  • remove_red_eye{{ $post->view_count }} From 39eaa140971d9fe5575dcf51afe28e04030ae9c2 Mon Sep 17 00:00:00 2001 From: Miles Pong Date: Mon, 10 Jul 2017 17:16:22 +0800 Subject: [PATCH 58/78] Update repository --- app/Repositories/Contracts/RepositoryInterface.php | 7 +++++++ app/Repositories/Eloquent/BaseRepository.php | 12 ++++++++++++ 2 files changed, 19 insertions(+) diff --git a/app/Repositories/Contracts/RepositoryInterface.php b/app/Repositories/Contracts/RepositoryInterface.php index 65e664e..46303da 100644 --- a/app/Repositories/Contracts/RepositoryInterface.php +++ b/app/Repositories/Contracts/RepositoryInterface.php @@ -142,4 +142,11 @@ public function getModel(); * @return mixed */ public function getModelTable(); + + /** + * @param $column + * @param string $direction + * @return mixed + */ + public function orderBy($column, $direction = 'asc'); } \ No newline at end of file diff --git a/app/Repositories/Eloquent/BaseRepository.php b/app/Repositories/Eloquent/BaseRepository.php index b74e0d0..19e4241 100644 --- a/app/Repositories/Eloquent/BaseRepository.php +++ b/app/Repositories/Eloquent/BaseRepository.php @@ -368,4 +368,16 @@ public function whereHas($relation, Closure $callback = null) return $this; } + + /** + * @param $column + * @param string $direction + * @return $this + */ + public function orderBy($column, $direction = 'asc') + { + $this->model = $this->model->orderBy($column, $direction); + + return $this; + } } From 9548aa8fa6532f0c10325d526f779a5805276c28 Mon Sep 17 00:00:00 2001 From: Miles Pong Date: Mon, 10 Jul 2017 17:29:31 +0800 Subject: [PATCH 59/78] Update repository with adding scopeQuery method --- .../Contracts/RepositoryInterface.php | 11 ++++ app/Repositories/Eloquent/BaseRepository.php | 63 +++++++++++++++++++ 2 files changed, 74 insertions(+) diff --git a/app/Repositories/Contracts/RepositoryInterface.php b/app/Repositories/Contracts/RepositoryInterface.php index 46303da..4658ed1 100644 --- a/app/Repositories/Contracts/RepositoryInterface.php +++ b/app/Repositories/Contracts/RepositoryInterface.php @@ -149,4 +149,15 @@ public function getModelTable(); * @return mixed */ public function orderBy($column, $direction = 'asc'); + + /** + * @param Closure $callback + * @return mixed + */ + public function scopeQuery(Closure $callback); + + /** + * @return mixed + */ + public function resetScope(); } \ No newline at end of file diff --git a/app/Repositories/Eloquent/BaseRepository.php b/app/Repositories/Eloquent/BaseRepository.php index 19e4241..2ffc16f 100644 --- a/app/Repositories/Eloquent/BaseRepository.php +++ b/app/Repositories/Eloquent/BaseRepository.php @@ -33,6 +33,11 @@ abstract class BaseRepository implements RepositoryInterface */ protected $relations; + /** + * @var Closure + */ + protected $scopeQuery; + /** * BaseRepository constructor. * @param Container $app @@ -103,6 +108,8 @@ public function all($columns = ['*']) { $this->scopeBoot(); + $this->applyScope(); + if ($this->model instanceof Builder) { $results = $this->model->get($columns); } else { @@ -121,6 +128,8 @@ public function paginate($perPage = null, $columns = ['*']) { $this->scopeBoot(); + $this->applyScope(); + $perPage = $perPage ?: $this->getDefaultPerPage(); return $this->model->paginate($perPage ?: $perPage, $columns); @@ -154,6 +163,8 @@ public function update(array $attributes, $id) { $this->scopeBoot(); + $this->applyScope(); + $model = $this->model->findOrFail($id); $model->fill($attributes); $model->save(); @@ -171,6 +182,8 @@ public function delete($id) { $this->scopeBoot(); + $this->applyScope(); + $model = $this->find($id); $originalModel = clone $model; @@ -190,6 +203,8 @@ public function find($id, $columns = ['*']) { $this->scopeBoot(); + $this->applyScope(); + return $this->model->findOrFail($id, $columns); } @@ -203,6 +218,8 @@ public function findBy($field, $value, $columns = ['*']) { $this->scopeBoot(); + $this->applyScope(); + return $this->model->where($field, '=', $value)->first($columns); } @@ -216,6 +233,8 @@ public function findAllBy($field, $value, $columns = ['*']) { $this->scopeBoot(); + $this->applyScope(); + return $this->model->where($field, '=', $value)->get($columns); } @@ -228,6 +247,8 @@ public function findWhere(array $where, $columns = ['*']) { $this->scopeBoot(); + $this->applyScope(); + $this->applyConditions($where); return $this->model->get($columns); @@ -275,6 +296,8 @@ public function firstOrCreate(array $attributes = []) { $this->scopeBoot(); + $this->applyScope(); + return $this->model->firstOrCreate($attributes); } @@ -286,6 +309,8 @@ public function trashed($only = false) { $this->scopeBoot(); + $this->applyScope(); + if ($only) { $this->model = $this->model->onlyTrashed(); } else { @@ -319,6 +344,8 @@ public function restore($id) { $this->scopeBoot(); + $this->applyScope(); + return $this->withTrashed()->find($id)->restore(); } @@ -330,6 +357,8 @@ public function forceDelete($id) { $this->scopeBoot(); + $this->applyScope(); + return $this->withTrashed()->find($id)->forceDelete(); } @@ -380,4 +409,38 @@ public function orderBy($column, $direction = 'asc') return $this; } + + /** + * @param Closure $callback + * @return $this + */ + public function scopeQuery(Closure $callback) + { + $this->scopeQuery = $callback; + + return $this; + } + + /** + * @return $this + */ + protected function applyScope() + { + if (!is_null($this->scopeQuery) && is_callable($this->scopeQuery)) { + $callback = $this->scopeQuery; + $this->model = $callback($this->model); + } + + return $this; + } + + /** + * @return $this + */ + public function resetScope() + { + $this->scopeQuery = null; + + return $this; + } } From 26bb7b8f6d9677a1d7349f50275a92ddd5fb7f09 Mon Sep 17 00:00:00 2001 From: Miles Pong Date: Mon, 10 Jul 2017 17:33:48 +0800 Subject: [PATCH 60/78] Update repository with adding first method --- app/Repositories/Contracts/RepositoryInterface.php | 6 ++++++ app/Repositories/Eloquent/BaseRepository.php | 13 +++++++++++++ 2 files changed, 19 insertions(+) diff --git a/app/Repositories/Contracts/RepositoryInterface.php b/app/Repositories/Contracts/RepositoryInterface.php index 4658ed1..ff2ab18 100644 --- a/app/Repositories/Contracts/RepositoryInterface.php +++ b/app/Repositories/Contracts/RepositoryInterface.php @@ -160,4 +160,10 @@ public function scopeQuery(Closure $callback); * @return mixed */ public function resetScope(); + + /** + * @param array $columns + * @return mixed + */ + public function first($columns = ['*']); } \ No newline at end of file diff --git a/app/Repositories/Eloquent/BaseRepository.php b/app/Repositories/Eloquent/BaseRepository.php index 2ffc16f..e5e37c0 100644 --- a/app/Repositories/Eloquent/BaseRepository.php +++ b/app/Repositories/Eloquent/BaseRepository.php @@ -443,4 +443,17 @@ public function resetScope() return $this; } + + /** + * @param array $columns + * @return mixed + */ + public function first($columns = ['*']) + { + $this->scopeBoot(); + + $this->applyScope(); + + return $this->model->first($columns); + } } From 82e32606599ba2bf7151efbaadf5b5c23ec94964 Mon Sep 17 00:00:00 2001 From: Miles Pong Date: Mon, 10 Jul 2017 17:46:04 +0800 Subject: [PATCH 61/78] Update repository with adding resetModel method --- app/Repositories/Eloquent/BaseRepository.php | 84 +++++++++++++++++--- 1 file changed, 71 insertions(+), 13 deletions(-) diff --git a/app/Repositories/Eloquent/BaseRepository.php b/app/Repositories/Eloquent/BaseRepository.php index e5e37c0..62c80be 100644 --- a/app/Repositories/Eloquent/BaseRepository.php +++ b/app/Repositories/Eloquent/BaseRepository.php @@ -63,6 +63,14 @@ public function makeModel() return $this->model = $model; } + /** + * Reset the model after query + */ + protected function resetModel() + { + $this->makeModel(); + } + /** * @return mixed */ @@ -116,6 +124,9 @@ public function all($columns = ['*']) $results = $this->model->all($columns); } + $this->resetModel(); + $this->resetScope(); + return $results; } @@ -132,7 +143,12 @@ public function paginate($perPage = null, $columns = ['*']) $perPage = $perPage ?: $this->getDefaultPerPage(); - return $this->model->paginate($perPage ?: $perPage, $columns); + $results = $this->model->paginate($perPage ?: $perPage, $columns); + + $this->resetModel(); + $this->resetScope(); + + return $results; } /** @@ -171,6 +187,9 @@ public function update(array $attributes, $id) event(new RepositoryEntityUpdated($this, $model)); + $this->resetModel(); + $this->resetScope(); + return $model; } @@ -191,6 +210,9 @@ public function delete($id) event(new RepositoryEntityDeleted($this, $originalModel)); + $this->resetModel(); + $this->resetScope(); + return $deleted; } @@ -205,7 +227,12 @@ public function find($id, $columns = ['*']) $this->applyScope(); - return $this->model->findOrFail($id, $columns); + $result = $this->model->findOrFail($id, $columns); + + $this->resetModel(); + $this->resetScope(); + + return $result; } /** @@ -220,7 +247,12 @@ public function findBy($field, $value, $columns = ['*']) $this->applyScope(); - return $this->model->where($field, '=', $value)->first($columns); + $result = $this->model->where($field, '=', $value)->first($columns); + + $this->resetModel(); + $this->resetScope(); + + return $result; } /** @@ -235,7 +267,12 @@ public function findAllBy($field, $value, $columns = ['*']) $this->applyScope(); - return $this->model->where($field, '=', $value)->get($columns); + $results = $this->model->where($field, '=', $value)->get($columns); + + $this->resetModel(); + $this->resetScope(); + + return $results; } /** @@ -251,7 +288,12 @@ public function findWhere(array $where, $columns = ['*']) $this->applyConditions($where); - return $this->model->get($columns); + $results = $this->model->get($columns); + + $this->resetModel(); + $this->resetScope(); + + return $results; } /** @@ -298,7 +340,12 @@ public function firstOrCreate(array $attributes = []) $this->applyScope(); - return $this->model->firstOrCreate($attributes); + $result = $this->model->firstOrCreate($attributes); + + $this->resetModel(); + $this->resetScope(); + + return $result; } /** @@ -307,10 +354,6 @@ public function firstOrCreate(array $attributes = []) */ public function trashed($only = false) { - $this->scopeBoot(); - - $this->applyScope(); - if ($only) { $this->model = $this->model->onlyTrashed(); } else { @@ -346,7 +389,12 @@ public function restore($id) $this->applyScope(); - return $this->withTrashed()->find($id)->restore(); + $result = $this->withTrashed()->find($id)->restore(); + + $this->resetModel(); + $this->resetScope(); + + return $result; } /** @@ -359,7 +407,12 @@ public function forceDelete($id) $this->applyScope(); - return $this->withTrashed()->find($id)->forceDelete(); + $result = $this->withTrashed()->find($id)->forceDelete(); + + $this->resetModel(); + $this->resetScope(); + + return $result; } /** @@ -454,6 +507,11 @@ public function first($columns = ['*']) $this->applyScope(); - return $this->model->first($columns); + $result = $this->model->first($columns); + + $this->resetModel(); + $this->resetScope(); + + return $result; } } From 73f25eb968a82da3f6dda5486538eede360a7f73 Mon Sep 17 00:00:00 2001 From: Miles Pong Date: Tue, 11 Jul 2017 10:44:48 +0800 Subject: [PATCH 62/78] Update Cacheable@getIfCacheable --- app/Repositories/Eloquent/Traits/Cacheable.php | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-) diff --git a/app/Repositories/Eloquent/Traits/Cacheable.php b/app/Repositories/Eloquent/Traits/Cacheable.php index a109b3a..1c7c4fc 100644 --- a/app/Repositories/Eloquent/Traits/Cacheable.php +++ b/app/Repositories/Eloquent/Traits/Cacheable.php @@ -109,10 +109,15 @@ private function getIfCacheable($method, $args, $key = null, $ignoreUriQuery = t $key = $key ?: $this->getCacheKey($method, $args, $ignoreUriQuery); - return $this->remember($key, + $result = $this->remember($key, function () use ($method, $args) { return call_user_func_array([$this, 'parent::' . $method], $args); }); + + $this->resetModel(); + $this->resetScope(); + + return $result; } /** From 00a8cc07e7da557b5b54fff523fdec97680e0fdf Mon Sep 17 00:00:00 2001 From: Miles Pong Date: Tue, 11 Jul 2017 11:58:32 +0800 Subject: [PATCH 63/78] Add Post@scopePrevious and Post@scopeNext --- app/Models/Post.php | 22 ++++++++++++++++++++++ 1 file changed, 22 insertions(+) diff --git a/app/Models/Post.php b/app/Models/Post.php index 4d5a1bc..c838d5c 100644 --- a/app/Models/Post.php +++ b/app/Models/Post.php @@ -146,4 +146,26 @@ public function getContentId() { return $this->content_id; } + + /** + * @param \Illuminate\Database\Eloquent\Builder $query + * @param int $id + * @param array $columns + * @return \Illuminate\Database\Query\Builder + */ + public function scopePrevious($query, $id, $columns = ['*']) + { + return $query->select($columns)->where('id', '<', $id)->latest('published_at'); + } + + /** + * @param \Illuminate\Database\Eloquent\Builder $query + * @param int $id + * @param array $columns + * @return \Illuminate\Database\Query\Builder + */ + public function scopeNext($query, $id, $columns = ['*']) + { + return $query->select($columns)->where('id', '>', $id)->oldest('published_at'); + } } From d4ca131d9d494966da5f986a157a7ed1d2b7d9ca Mon Sep 17 00:00:00 2001 From: Miles Pong Date: Tue, 11 Jul 2017 12:00:16 +0800 Subject: [PATCH 64/78] Add previous&next post in articles.show --- .../Controllers/Frontend/PostController.php | 5 +++- app/Repositories/Contracts/PostRepository.php | 12 +++++++++ .../Eloquent/PostRepositoryEloquent.php | 23 +++++++++++++++++ resources/views/posts/show.blade.php | 25 ++++++++++++++++++- 4 files changed, 63 insertions(+), 2 deletions(-) diff --git a/app/Http/Controllers/Frontend/PostController.php b/app/Http/Controllers/Frontend/PostController.php index 0634d4d..8e7563c 100644 --- a/app/Http/Controllers/Frontend/PostController.php +++ b/app/Http/Controllers/Frontend/PostController.php @@ -45,8 +45,11 @@ public function show($slug) { $post = $this->postRepo->getBySlug($slug); + $previous = $this->postRepo->previous($post); + $next = $this->postRepo->next($post); + event(new PostViewEvent($post->id)); - return view('posts.show', compact('post')); + return view('posts.show', compact('post', 'previous', 'next')); } } diff --git a/app/Repositories/Contracts/PostRepository.php b/app/Repositories/Contracts/PostRepository.php index 8b92fad..a7c12e8 100644 --- a/app/Repositories/Contracts/PostRepository.php +++ b/app/Repositories/Contracts/PostRepository.php @@ -38,4 +38,16 @@ public function retrieve($id); * @return mixed */ public function getBySlug($slug); + + /** + * @param $model + * @return mixed + */ + public function previous($model); + + /** + * @param $model + * @return mixed + */ + public function next($model); } diff --git a/app/Repositories/Eloquent/PostRepositoryEloquent.php b/app/Repositories/Eloquent/PostRepositoryEloquent.php index ea4bb48..9eb5f87 100644 --- a/app/Repositories/Eloquent/PostRepositoryEloquent.php +++ b/app/Repositories/Eloquent/PostRepositoryEloquent.php @@ -232,4 +232,27 @@ public function getBySlug($slug) { return $this->with(['author', 'category', 'tags'])->findBy('slug', $slug); } + + /** + * @param $model + * @return mixed + */ + public function previous($model) + { + return $this->scopeQuery(function ($query) use ($model) { + return $query->previous($model->id, ['title', 'slug']); + })->first(); + } + + /** + * @param $model + * @return mixed + */ + public function next($model) + { + return $this->scopeQuery(function ($query) use ($model) { + return $query->next($model->id, ['title', 'slug']); + })->first(); + } + } diff --git a/resources/views/posts/show.blade.php b/resources/views/posts/show.blade.php index 573c8c9..58d009c 100644 --- a/resources/views/posts/show.blade.php +++ b/resources/views/posts/show.blade.php @@ -53,6 +53,29 @@ +
    +
    +
    + @if($previous) + keyboard_arrow_left{{ $previous->title }} + @endif +
    +
    + @if($next) + keyboard_arrow_right{{ $next->title }} + @endif +
    +
    +
    + -@endsection \ No newline at end of file +@endsection + +@push('css') + +@endpush \ No newline at end of file From 224235bc891d2a6d4e88dc2866696fc405b8a5b7 Mon Sep 17 00:00:00 2001 From: Miles Pong Date: Tue, 11 Jul 2017 12:28:47 +0800 Subject: [PATCH 65/78] Remove code by fixing --- app/Repositories/Eloquent/PostRepositoryEloquent.php | 5 +---- app/Repositories/Eloquent/Traits/Postable.php | 10 +--------- 2 files changed, 2 insertions(+), 13 deletions(-) diff --git a/app/Repositories/Eloquent/PostRepositoryEloquent.php b/app/Repositories/Eloquent/PostRepositoryEloquent.php index 9eb5f87..1d9fd9f 100644 --- a/app/Repositories/Eloquent/PostRepositoryEloquent.php +++ b/app/Repositories/Eloquent/PostRepositoryEloquent.php @@ -204,10 +204,7 @@ public function lists($perPage = null) $items = $pagination->getCollection()->map(function ($post) { // First layer cache - return app(self::class)->getBySlug($post->slug); - - // TODO method below won't work and why? - // return $this->retrieve($post->id); + return $this->getBySlug($post->slug); }); return $pagination->setCollection($items); diff --git a/app/Repositories/Eloquent/Traits/Postable.php b/app/Repositories/Eloquent/Traits/Postable.php index 9239965..fa90ad1 100644 --- a/app/Repositories/Eloquent/Traits/Postable.php +++ b/app/Repositories/Eloquent/Traits/Postable.php @@ -54,7 +54,7 @@ public function getWithPosts($slug) $postsPagination = $relation->paginate($this->getDefaultPerPage(), ['slug']); $items = $postsPagination->getCollection()->map(function ($post) { - return $this->newPostRepo()->getBySlug($post->slug); + return $this->getPostRepo()->getBySlug($post->slug); }); return [$model, $postsPagination->setCollection($items)]; @@ -71,12 +71,4 @@ protected function getPostRepo() return $this->postRepo; } - - /** - * @return PostRepository|\Illuminate\Foundation\Application|mixed - */ - protected function newPostRepo() - { - return app(PostRepository::class); - } } \ No newline at end of file From 11c4a5ce645c22ce4e6ca584eec3c4bd6b757058 Mon Sep 17 00:00:00 2001 From: Miles Pong Date: Tue, 11 Jul 2017 14:01:52 +0800 Subject: [PATCH 66/78] Update css of related posts --- resources/views/posts/show.blade.php | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/resources/views/posts/show.blade.php b/resources/views/posts/show.blade.php index 58d009c..598f4f4 100644 --- a/resources/views/posts/show.blade.php +++ b/resources/views/posts/show.blade.php @@ -57,12 +57,12 @@ From 93d8a57e55caef3238b456173c0e1f263f08466a Mon Sep 17 00:00:00 2001 From: Miles Pong Date: Tue, 11 Jul 2017 15:26:08 +0800 Subject: [PATCH 67/78] Add btn-profile button on large screen --- resources/views/layouts/app.blade.php | 7 +++++++ resources/views/partials/navbar.blade.php | 7 +++++++ 2 files changed, 14 insertions(+) diff --git a/resources/views/layouts/app.blade.php b/resources/views/layouts/app.blade.php index 41b2bdd..6e1d520 100644 --- a/resources/views/layouts/app.blade.php +++ b/resources/views/layouts/app.blade.php @@ -27,6 +27,13 @@ {{--@yield('css')--}} @stack('css') + +