From 19e8037c85d10fcc259321d6fa000176c1ed586e Mon Sep 17 00:00:00 2001 From: nexryai <61890205+nexryai@users.noreply.github.com> Date: Sun, 7 Jan 2024 21:05:04 +0900 Subject: [PATCH 01/38] Fix lang/vendor/backup/ja/notifications.php --- resources/lang/vendor/backup/ja/notifications.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/resources/lang/vendor/backup/ja/notifications.php b/resources/lang/vendor/backup/ja/notifications.php index 911fa4ab2..b8fff4a2b 100644 --- a/resources/lang/vendor/backup/ja/notifications.php +++ b/resources/lang/vendor/backup/ja/notifications.php @@ -31,5 +31,5 @@ return [ 'unhealthy_backup_found_empty' => 'このアプリケーションのバックアップはありません。', 'unhealthy_backup_found_old' => ':date に作成されたバックアップは古すぎます。', 'unhealthy_backup_found_unknown' => '正確な原因が特定できませんでした。', - 'unhealthy_backup_found_full' => 'バックアップが使用できる容量(:disk_limit)を超えています。(現在の使用量 :disk_usage), + 'unhealthy_backup_found_full' => 'バックアップが使用できる容量(:disk_limit)を超えています。(現在の使用量 :disk_usage)', ]; From 4e567e34115e018fb96eb9ab199ff157de5a4981 Mon Sep 17 00:00:00 2001 From: mbliznikova Date: Tue, 9 Jan 2024 04:49:01 +0000 Subject: [PATCH 02/38] Provide an informative error message when account size limit is reached --- resources/assets/js/components/ComposeModal.vue | 9 ++++++++- 1 file changed, 8 insertions(+), 1 deletion(-) diff --git a/resources/assets/js/components/ComposeModal.vue b/resources/assets/js/components/ComposeModal.vue index 4ffd84666..2c4e3ba42 100644 --- a/resources/assets/js/components/ComposeModal.vue +++ b/resources/assets/js/components/ComposeModal.vue @@ -1204,12 +1204,19 @@ export default { }, 300); }).catch(function(e) { switch(e.response.status) { + case 403: + self.uploading = false; + io.value = null; + swal('Account size limit reached', 'Contact your admin for assistance.', 'error'); + self.page = 2; + break; + case 413: self.uploading = false; io.value = null; swal('File is too large', 'The file you uploaded has the size of ' + self.formatBytes(io.size) + '. Unfortunately, only images up to ' + self.formatBytes(self.config.uploader.max_photo_size * 1024) + ' are supported.\nPlease resize the file and try again.', 'error'); self.page = 2; - break; + break; case 451: self.uploading = false; From 934f2ffdb40c3884fefe569f3dd46bfed3c89ddb Mon Sep 17 00:00:00 2001 From: Shlee Date: Wed, 24 Jan 2024 12:45:21 +1030 Subject: [PATCH 03/38] Update home.blade.php --- resources/views/admin/diagnostics/home.blade.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/resources/views/admin/diagnostics/home.blade.php b/resources/views/admin/diagnostics/home.blade.php index bf2b5d742..db44a2332 100644 --- a/resources/views/admin/diagnostics/home.blade.php +++ b/resources/views/admin/diagnostics/home.blade.php @@ -654,7 +654,7 @@ MEDIA MEDIA_EXIF_DATABASE - {{config_cache('media.exif.batabase') ? '✅ true' : '❌ false' }} + {{config_cache('media.exif.database') ? '✅ true' : '❌ false' }} From 92ff114d2d0649bde17478cb8915fed2af720f94 Mon Sep 17 00:00:00 2001 From: Daniel Supernault Date: Mon, 29 Jan 2024 21:45:59 -0700 Subject: [PATCH 04/38] Update migrations, fixes #4883 --- ...0_add_account_status_to_profiles_table.php | 14 ++++++++------ .../migrations/2019_01_12_054413_stories.php | 10 ++-------- ...021_01_14_034521_add_cache_locks_table.php | 2 +- ...ompose_settings_to_user_settings_table.php | 19 +++++++++++++++---- 4 files changed, 26 insertions(+), 19 deletions(-) diff --git a/database/migrations/2018_12_22_055940_add_account_status_to_profiles_table.php b/database/migrations/2018_12_22_055940_add_account_status_to_profiles_table.php index 04a88060e..097e86753 100644 --- a/database/migrations/2018_12_22_055940_add_account_status_to_profiles_table.php +++ b/database/migrations/2018_12_22_055940_add_account_status_to_profiles_table.php @@ -54,12 +54,14 @@ class AddAccountStatusToProfilesTable extends Migration $table->string('hub_url')->nullable(); }); - Schema::table('stories', function (Blueprint $table) { - $table->dropColumn('id'); - }); - Schema::table('stories', function (Blueprint $table) { - $table->bigIncrements('bigIncrements')->first(); - }); + if (Schema::hasTable('stories')) { + Schema::table('stories', function (Blueprint $table) { + $table->dropColumn('id'); + }); + Schema::table('stories', function (Blueprint $table) { + $table->bigIncrements('bigIncrements')->first(); + }); + } Schema::table('profiles', function (Blueprint $table) { $table->dropColumn('status'); diff --git a/database/migrations/2019_01_12_054413_stories.php b/database/migrations/2019_01_12_054413_stories.php index a61c447de..f58a8cf38 100644 --- a/database/migrations/2019_01_12_054413_stories.php +++ b/database/migrations/2019_01_12_054413_stories.php @@ -60,13 +60,7 @@ class Stories extends Migration { Schema::dropIfExists('story_items'); Schema::dropIfExists('story_views'); - - Schema::table('stories', function (Blueprint $table) { - $table->dropColumn(['title','preview_photo','local_only','is_live','broadcast_url','broadcast_key']); - }); - - Schema::table('story_reactions', function (Blueprint $table) { - $table->dropColumn('story_id'); - }); + Schema::dropIfExists('story_reactions'); + Schema::dropIfExists('stories'); } } diff --git a/database/migrations/2021_01_14_034521_add_cache_locks_table.php b/database/migrations/2021_01_14_034521_add_cache_locks_table.php index 121c69a37..07889b490 100644 --- a/database/migrations/2021_01_14_034521_add_cache_locks_table.php +++ b/database/migrations/2021_01_14_034521_add_cache_locks_table.php @@ -27,6 +27,6 @@ class AddCacheLocksTable extends Migration */ public function down() { - Schema::dropTable('cache_locks'); + Schema::dropIfExists('cache_locks'); } } diff --git a/database/migrations/2021_07_23_062326_add_compose_settings_to_user_settings_table.php b/database/migrations/2021_07_23_062326_add_compose_settings_to_user_settings_table.php index 58837cab3..49a9b2c58 100644 --- a/database/migrations/2021_07_23_062326_add_compose_settings_to_user_settings_table.php +++ b/database/migrations/2021_07_23_062326_add_compose_settings_to_user_settings_table.php @@ -33,14 +33,25 @@ class AddComposeSettingsToUserSettingsTable extends Migration public function down() { Schema::table('user_settings', function (Blueprint $table) { - $table->dropColumn('compose_settings'); + if (Schema::hasColumn('user_settings', 'compose_settings')) { + $table->dropColumn('compose_settings'); + } }); Schema::table('media', function (Blueprint $table) { $table->string('caption')->change(); - $table->dropIndex('profile_id'); - $table->dropIndex('mime'); - $table->dropIndex('license'); + + $schemaManager = Schema::getConnection()->getDoctrineSchemaManager(); + $indexesFound = $schemaManager->listTableIndexes('media'); + if (array_key_exists('media_profile_id_index', $indexesFound)) { + $table->dropIndex('media_profile_id_index'); + } + if (array_key_exists('media_mime_index', $indexesFound)) { + $table->dropIndex('media_mime_index'); + } + if (array_key_exists('media_license_index', $indexesFound)) { + $table->dropIndex('media_license_index'); + } }); } } From 61b1523368af6efafc7c3081fbc3b4bee4c8d212 Mon Sep 17 00:00:00 2001 From: Daniel Supernault Date: Mon, 29 Jan 2024 22:13:09 -0700 Subject: [PATCH 05/38] Fix newsroom migration --- database/migrations/2019_12_10_023604_create_newsroom_table.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/database/migrations/2019_12_10_023604_create_newsroom_table.php b/database/migrations/2019_12_10_023604_create_newsroom_table.php index 2651d5c4d..b463f5624 100644 --- a/database/migrations/2019_12_10_023604_create_newsroom_table.php +++ b/database/migrations/2019_12_10_023604_create_newsroom_table.php @@ -40,6 +40,6 @@ class CreateNewsroomTable extends Migration */ public function down() { - Schema::dropIfExists('site_news'); + Schema::dropIfExists('newsroom'); } } From 8a9a7c0e478386dda2b705c64b30075c3133845b Mon Sep 17 00:00:00 2001 From: Daniel Supernault Date: Mon, 29 Jan 2024 22:24:50 -0700 Subject: [PATCH 06/38] Fix parental_controls migration --- .../2024_01_09_052419_create_parental_controls_table.php | 8 ++++++-- 1 file changed, 6 insertions(+), 2 deletions(-) diff --git a/database/migrations/2024_01_09_052419_create_parental_controls_table.php b/database/migrations/2024_01_09_052419_create_parental_controls_table.php index bf803e4c0..6713e6849 100644 --- a/database/migrations/2024_01_09_052419_create_parental_controls_table.php +++ b/database/migrations/2024_01_09_052419_create_parental_controls_table.php @@ -28,7 +28,7 @@ return new class extends Migration $schemaManager = Schema::getConnection()->getDoctrineSchemaManager(); $indexesFound = $schemaManager->listTableIndexes('user_roles'); if (array_key_exists('user_roles_profile_id_unique', $indexesFound)) { - $table->dropIndex('user_roles_profile_id_unique'); + $table->dropUnique('user_roles_profile_id_unique'); } $table->unsignedBigInteger('profile_id')->unique()->nullable()->index()->change(); }); @@ -42,7 +42,11 @@ return new class extends Migration Schema::dropIfExists('parental_controls'); Schema::table('user_roles', function (Blueprint $table) { - $table->dropIndex('user_roles_profile_id_unique'); + $schemaManager = Schema::getConnection()->getDoctrineSchemaManager(); + $indexesFound = $schemaManager->listTableIndexes('user_roles'); + if (array_key_exists('user_roles_profile_id_unique', $indexesFound)) { + $table->dropUnique('user_roles_profile_id_unique'); + } $table->unsignedBigInteger('profile_id')->unique()->index()->change(); }); } From 0aff126aa0bb001f0137848a578adad7a1e5797c Mon Sep 17 00:00:00 2001 From: Daniel Supernault Date: Thu, 1 Feb 2024 22:46:13 -0700 Subject: [PATCH 07/38] Update ApiV1Controller, properly cast boolean sensitive parameter. Fixes #4888 --- app/Http/Controllers/Api/ApiV1Controller.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/app/Http/Controllers/Api/ApiV1Controller.php b/app/Http/Controllers/Api/ApiV1Controller.php index b342d68ce..dd0cbd062 100644 --- a/app/Http/Controllers/Api/ApiV1Controller.php +++ b/app/Http/Controllers/Api/ApiV1Controller.php @@ -3031,7 +3031,7 @@ class ApiV1Controller extends Controller $content = strip_tags($request->input('status')); $rendered = Autolink::create()->autolink($content); - $cw = $user->profile->cw == true ? true : $request->input('sensitive', false); + $cw = $user->profile->cw == true ? true : $request->boolean('sensitive', false); $spoilerText = $cw && $request->filled('spoiler_text') ? $request->input('spoiler_text') : null; if($in_reply_to_id) { From 339857ffa28f411ab201800d1439094b6556f3b5 Mon Sep 17 00:00:00 2001 From: Daniel Supernault Date: Thu, 1 Feb 2024 22:46:39 -0700 Subject: [PATCH 08/38] Update changelog --- CHANGELOG.md | 1 + 1 file changed, 1 insertion(+) diff --git a/CHANGELOG.md b/CHANGELOG.md index d251b3df3..5c73b4e37 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -89,6 +89,7 @@ - Update meta tags, improve descriptions and seo/og tags ([fd44c80c](https://github.com/pixelfed/pixelfed/commit/fd44c80c)) - Update login view, add email prefill logic ([d76f0168](https://github.com/pixelfed/pixelfed/commit/d76f0168)) - Update LoginController, fix captcha validation error message ([0325e171](https://github.com/pixelfed/pixelfed/commit/0325e171)) +- Update ApiV1Controller, properly cast boolean sensitive parameter. Fixes #4888 ([0aff126a](https://github.com/pixelfed/pixelfed/commit/0aff126a)) - ([](https://github.com/pixelfed/pixelfed/commit/)) ## [v0.11.9 (2023-08-21)](https://github.com/pixelfed/pixelfed/compare/v0.11.8...v0.11.9) From 59aa6a4b0237e6818767ad6a85d1623d544407d3 Mon Sep 17 00:00:00 2001 From: Daniel Supernault Date: Thu, 1 Feb 2024 22:49:04 -0700 Subject: [PATCH 09/38] Update AccountImport.vue, fix new IG export format --- resources/assets/components/AccountImport.vue | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/resources/assets/components/AccountImport.vue b/resources/assets/components/AccountImport.vue index 6e1fe9fcf..f7b7279f5 100644 --- a/resources/assets/components/AccountImport.vue +++ b/resources/assets/components/AccountImport.vue @@ -381,7 +381,7 @@ let file = this.$refs.zipInput.files[0]; let entries = await this.model(file); if (entries && entries.length) { - let files = await entries.filter(e => e.filename === 'content/posts_1.json'); + let files = await entries.filter(e => e.filename === 'content/posts_1.json' || e.filename === 'your_instagram_activity/content/posts_1.json'); if(!files || !files.length) { this.contactModal( @@ -402,7 +402,7 @@ let entries = await this.model(file); if (entries && entries.length) { this.zipFiles = entries; - let media = await entries.filter(e => e.filename === 'content/posts_1.json')[0].getData(new zip.TextWriter()); + let media = await entries.filter(e => e.filename === 'content/posts_1.json' || e.filename === 'your_instagram_activity/content/posts_1.json')[0].getData(new zip.TextWriter()); this.filterPostMeta(media); let imgs = await Promise.all(entries.filter(entry => { From cf005423369eba9ed2c3bba374dce2a1cf792fd0 Mon Sep 17 00:00:00 2001 From: Daniel Supernault Date: Thu, 1 Feb 2024 23:19:25 -0700 Subject: [PATCH 10/38] Update compiled assets --- public/js/account-import.js | Bin 27575 -> 27695 bytes public/js/admin.js | Bin 215887 -> 216009 bytes public/js/collectioncompose.js | Bin 10455 -> 10483 bytes public/js/collections.js | Bin 21432 -> 21570 bytes public/js/compose.chunk.10e7f993dcc726f9.js | Bin 93403 -> 0 bytes public/js/compose.chunk.1ac292c93b524406.js | Bin 0 -> 93554 bytes public/js/compose.js | Bin 68808 -> 68959 bytes ...89d7.js => daci.chunk.8d4acc1db3f27a51.js} | Bin 126782 -> 126677 bytes ....js => discover.chunk.b1846efb6bd1e43c.js} | Bin 71794 -> 71802 bytes ...ver~findfriends.chunk.941b524eee8b8d63.js} | Bin 125681 -> 125576 bytes ...iscover~hashtag.bundle.6c2ff384b17ea58d.js | Bin 0 -> 50871 bytes ...iscover~hashtag.bundle.9cfffc517f35044e.js | Bin 50916 -> 0 bytes ...scover~memories.chunk.7d917826c3e9f17b.js} | Bin 126019 -> 125914 bytes ...over~myhashtags.chunk.a72fc4882db8afd3.js} | Bin 172907 -> 172802 bytes ...over~serverfeed.chunk.8365948d1867de3a.js} | Bin 125271 -> 125166 bytes ...scover~settings.chunk.be88dc5ba1a24a7d.js} | Bin 129546 -> 129441 bytes ... => dms~message.chunk.76edeafda3d92320.js} | Bin 69772 -> 69671 bytes public/js/home.chunk.351f55e9d09b6482.js | Bin 239870 -> 0 bytes public/js/home.chunk.f3f4f632025b560f.js | Bin 0 -> 240076 bytes ...ome.chunk.f3f4f632025b560f.js.LICENSE.txt} | 0 public/js/landing.js | Bin 184612 -> 184645 bytes public/js/manifest.js | Bin 4006 -> 4006 bytes public/js/portfolio.js | Bin 45143 -> 45145 bytes ...dc83.js => post.chunk.eb9804ff282909ae.js} | Bin 221808 -> 221711 bytes ...ost.chunk.eb9804ff282909ae.js.LICENSE.txt} | 0 ...5.js => profile.chunk.d52916cb68c9a146.js} | Bin 223228 -> 222906 bytes public/js/profile.js | Bin 114832 -> 114769 bytes ...file~followers.bundle.5deed93248f20662.js} | Bin 27333 -> 27232 bytes ...file~following.bundle.d2b3b1fc2e05dbd3.js} | Bin 27304 -> 27203 bytes public/js/spa.js | Bin 202814 -> 203755 bytes public/js/status.js | Bin 136281 -> 136372 bytes public/js/stories.js | Bin 29453 -> 29421 bytes public/js/timeline.js | Bin 139435 -> 140280 bytes public/mix-manifest.json | Bin 5243 -> 5243 bytes 34 files changed, 0 insertions(+), 0 deletions(-) delete mode 100644 public/js/compose.chunk.10e7f993dcc726f9.js create mode 100644 public/js/compose.chunk.1ac292c93b524406.js rename public/js/{daci.chunk.b17a0b11877389d7.js => daci.chunk.8d4acc1db3f27a51.js} (67%) rename public/js/{discover.chunk.9606885dad3c8a99.js => discover.chunk.b1846efb6bd1e43c.js} (61%) rename public/js/{discover~findfriends.chunk.02be60ab26503531.js => discover~findfriends.chunk.941b524eee8b8d63.js} (67%) create mode 100644 public/js/discover~hashtag.bundle.6c2ff384b17ea58d.js delete mode 100644 public/js/discover~hashtag.bundle.9cfffc517f35044e.js rename public/js/{discover~memories.chunk.ce9cc6446020e9b3.js => discover~memories.chunk.7d917826c3e9f17b.js} (67%) rename public/js/{discover~myhashtags.chunk.6eab2414b2b16e19.js => discover~myhashtags.chunk.a72fc4882db8afd3.js} (73%) rename public/js/{discover~serverfeed.chunk.0f2dcc473fdce17e.js => discover~serverfeed.chunk.8365948d1867de3a.js} (67%) rename public/js/{discover~settings.chunk.732c1f76a00d9204.js => discover~settings.chunk.be88dc5ba1a24a7d.js} (68%) rename public/js/{dms~message.chunk.15157ff4a6c17cc7.js => dms~message.chunk.76edeafda3d92320.js} (63%) delete mode 100644 public/js/home.chunk.351f55e9d09b6482.js create mode 100644 public/js/home.chunk.f3f4f632025b560f.js rename public/js/{home.chunk.351f55e9d09b6482.js.LICENSE.txt => home.chunk.f3f4f632025b560f.js.LICENSE.txt} (100%) rename public/js/{post.chunk.23fc9e82d4fadc83.js => post.chunk.eb9804ff282909ae.js} (72%) rename public/js/{post.chunk.23fc9e82d4fadc83.js.LICENSE.txt => post.chunk.eb9804ff282909ae.js.LICENSE.txt} (100%) rename public/js/{profile.chunk.0e5bd852054d6355.js => profile.chunk.d52916cb68c9a146.js} (64%) rename public/js/{profile~followers.bundle.731f680cfb96563d.js => profile~followers.bundle.5deed93248f20662.js} (70%) rename public/js/{profile~following.bundle.3d95796c9f1678dd.js => profile~following.bundle.d2b3b1fc2e05dbd3.js} (70%) diff --git a/public/js/account-import.js b/public/js/account-import.js index 74d4d9e4db029e7d746d36f7b010d5559de66f2d..b68bfb4953f60434fced647f83e429bf13ae9504 100644 GIT binary patch delta 236 zcmdmfopJpQ#trjyrE6-GD)UQ=;xqG#OA^zI5_97dlS?woGD|A;H`nOCWx}Uma*eL) z<{X2&0xU-6hQ^cqGt@R0JN{8+F*LL=1@eq0>t^vx-jtrsZe(s?Vqk7GSs_D<)zI9? z*b*ok#0*q6d1=NJR$~i8WAn*&nZB&%CdOu#lP6^Q!gV~!Tnm-=&yeG@E=w#@$h6JV aFa%p@mu1ghs{_%5Dh;*+C_TA2+XVoY!%pS^ delta 158 zcmZ2~gK_(H#trjyH{aGh&9wQk!2})vV7rM eW3tvlMhnU&d4v^j+%hpXvEXtmK-hoL{57SMxwK~zo zdhul%N-=pcB@hU5w*t`N+hd%VdS9~|nHpM{Pd9XDwwtb_$Lz_GYG`1RY?f@Wy;hGo zPmsmX%*0@_prz5oy*$(P9GFEQ>bJW)FsCsK8(W$hnP}={+9qmP7#Ug^Y3k%ncXVSG zp61A`#g?dHX>MdV{kIFV52q5`)JPZRI967$Mxe2B)AxBXbFzZGWj>wXgV}z%x)*Z^ R3rHhe7VHFwB)2!S3joA@d%XYv delta 261 zcmX>(o%j4S-VL)ivenks>X;c!o*3>p+27KzdD5oslQuCHJwt&> zNr|&KH90>oC9$Y-`bB>x$>{~rOzhKlI5Y7wDH={^Ok@&ean8vv-hRu8srNOjp{bdr z(PTkOqv`kEnR%wK(qs1IFfuo`OifC%*#29OIZu$)%*f2x5Ugar1G54|$Mz!*%xTQ5 z=BB2mmeciJn0;9cO^ht3*Sj$LA+%q0VUA;kr~zu17RH8?`_$DopWqReVl_23F|*kGK+S~_!UW35@mZH87AX|lrfNVGUsSiBJVnD9 E0BMsbp8x;= delta 86 zcmewycs+1K6Ni{mL1|J>X0np4ZKhsXW^raxW=>{F<>oCMtSqdiMuui4oA>cpO0gQ6 j85ejC7ETZYHFKhc>B18bV@QZi}f;7ifv(x$&9?xlk>#5Ca;m`V$7UuE-5db zsh5&ilBlVZ3R0+7P+FX!Q37Ocj*;YNVKFqawAh?4D`voIX<%qzKDj_vZSn@+1dc>= zOJma%6Qjuzenkk*BtHuT=aQc-f+Ox9g5VVU$00a3{aq0pwE#_KV*_KTH9V7B0u)$4 z7EfLgFoo5`(8AbqvSXkRtC6XZh3Vu;fxZZx&jVLO6%@$I@mZH87AfT0W@>=kZ#LOJ b$eyiM2c&CqV1PVA*4zwa8Blg|Nw5n5wnKH< delta 272 zcmX@Kf^o-k#tkyOlQ(fmZLZ=i;hwB4*~3^ed4r@pXNg`)Vo9Q=PU__I;$oZsOMYW! zH8wXeH=C>&EVo%g?z=v#p^=5TIfy$kTV(Q%AfCxVejXgA$;L*;Mn*}K7x@(-I5Peg z2u_T@ErPSqKLo+~>mP^UBnP-6I2!^qnT^a%VYcxFDzJd8pKKI3h1Jy3$kJr;=|CS= qQwtL_^T{$nz6gzlL93w(6ob{FKG+}Zz@`IH3lcOp1DU)(xETQTs!*x` diff --git a/public/js/compose.chunk.10e7f993dcc726f9.js b/public/js/compose.chunk.10e7f993dcc726f9.js deleted file mode 100644 index 106a118f4ead46c9ff824895ae1ca74cb51f1065..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 93403 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 diff --git a/public/js/compose.chunk.1ac292c93b524406.js b/public/js/compose.chunk.1ac292c93b524406.js new file mode 100644 index 0000000000000000000000000000000000000000..ed1b9307165c18197ef96a8506c9df975246e5c9 GIT binary patch literal 93554 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 literal 0 HcmV?d00001 diff --git a/public/js/compose.js b/public/js/compose.js index 699a19dad47b38629223f57f7ecbbedd4bf0236d..e643034014c94a6b6bcd1ece89505781d306cd51 100644 GIT binary patch delta 270 zcmX>xljZ&_mJRD9m<)_3H%cqpIVLCPm*$ly6lYeYD&%D5W|k-vr6wk4q^2n8C^_fn zl_VyYC{*T`7AYjAjmJRD9HXBK<=bUVy#5(z*(#_46l-;#hjZ6#-&8KhRVU(LL%f-mC*~Kq! zJFA(onI%F{Wcy22MnM)kg zT9{22xWt&So%t4HER?w+cYMU?F#W+x#u65gexTFjr`x|^2Xfj1}8`HZitJ zGMY{<=yjgH?-ZjDOzs3@!1mfRj4fRJCYA<9S&R&fOeQO`NlkXJ%%04;R($j6m9GUSpE{9nGMZNCM&W@O?I%%p1kXv_~tV!UkeH(CMV~Y=9TEDWEQ0+m*|&l zKDB!$BZlbYQ@hZUHn!ZSsZd9-HTVyUWIGVrnwk;g1_DNXBBaz^{PK zlK-N(Sj`L!Ee)qva4`C^nj4rKnN3e%Vocnw&B^!!CdVkqD8&MFl*ROq{EUv&6~_77&t7IUVPrKoH#9St&UTg2m&MS~ z!fd+Zb;gA4+pjX_@Uwt)O%I4*l%L-4n302R5j6qPT z3C9?Nw_BfJtm0xdu{1C=+rH}(<6TBpQv)Molj(D=F#58Xnwl9+PdLMvu-*46V-7zH zNZEA5my8-PzdmAgoUZ+pu?VWk@FAl*E6|(9hSME^Qrr2TG0HPTOaVzjTmX`pKK~`- FO8}9fYqbCX diff --git a/public/js/discover~hashtag.bundle.6c2ff384b17ea58d.js b/public/js/discover~hashtag.bundle.6c2ff384b17ea58d.js new file mode 100644 index 0000000000000000000000000000000000000000..3ef77ac5dce3366d458bf459cea31e701119dc79 GIT binary patch literal 50871 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 literal 0 HcmV?d00001 diff --git a/public/js/discover~hashtag.bundle.9cfffc517f35044e.js b/public/js/discover~hashtag.bundle.9cfffc517f35044e.js deleted file mode 100644 index afb2b3de0fe07582cc3cbfc84f701ecb18683c2f..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 50916 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 KJIESl=>G#ByCPu# diff --git a/public/js/discover~memories.chunk.ce9cc6446020e9b3.js b/public/js/discover~memories.chunk.7d917826c3e9f17b.js similarity index 67% rename from public/js/discover~memories.chunk.ce9cc6446020e9b3.js rename to public/js/discover~memories.chunk.7d917826c3e9f17b.js index ec86c87f7d14df1c59c4315deb87e844c5d7b8ea..f8ed91112991bc5e2d23c485396bd760269070a3 100644 GIT binary patch delta 249 zcmX?ngZx(+y5A3PIFP ze}9ZIaQpj{j7?npW|kHvhMGE=w#6EzMy3YS3$HTH-!6ZZ(S(uJ+}zO2V0y$gMqd^~ zLkqL%8?G`YZ0Eern9I)s(l!0!V@3_AOCLUAbe#U;8DkL(NYnHS&w(;v$4&>yY(Mjy bQH~j6$i?T3>MS6KO&7e!=rBFvHREdlB7#$v delta 329 zcmcb0o&E3)_J%Eto*t|w<|c+FlMRK`CM$f*-hSVMv5JXB$w5hbd!#p`JwJp(lP8#SfR*S)GX}9uH%MX>ny&B1$mv{Al%JNFld6}JSzM5lSQ(#}n44-}qK8e` z3L#utoLU4@sj00LlQ+5HfcW%)Y(}x|OA;B4eOWDy%?*u#ZZevFU^}DR_K@|AEs`vz zMnIP|9%T%INKZF7&KS78^(12x7psY-fuY%Uo-2%Z8CgvYjEqgDzq`ul%VKJ3W;Ffa z8ODU|^RF@H@hK`{gDi#%62{hra)g-GXrB|qv?r$OcmSj#4@!?vRYbN znwo(GjHWx3F)6?llrRNs=c!=&#>;AEX<=fxoxP3e922X#xuKcC^jjTFzAT1@7C;-T zm=d;kcQP#yW&tUiZa9-kgB9dRgXxa5m>j3ioy+uu1*B=Z;X)=&785f=pu{33r|nC+i}{%XeVHwd&8IK0VyfC+7|YZu$!uz5 zFnysFlkxQ05+((RWC>I7_QmB)UwK(gEDa3Jw$E*4I>*FnYG7n+GQFUK$(O~{)XZr4 z!44)77LbDJh4Yy-n1TMC-mrkldAjjjrY9^Q#US6yPoFTIiIWB7&*_abn4GqE&SR2i Y1{*M)aW+t!5m3T#GL!vu@kLCp0nJir2><{9 diff --git a/public/js/discover~serverfeed.chunk.0f2dcc473fdce17e.js b/public/js/discover~serverfeed.chunk.8365948d1867de3a.js similarity index 67% rename from public/js/discover~serverfeed.chunk.0f2dcc473fdce17e.js rename to public/js/discover~serverfeed.chunk.8365948d1867de3a.js index ed30efc2f88164fc646bc142750fa9370e4431e6..fba06dbcabb3fc7afe1c302b8364b4bc51fb0c10 100644 GIT binary patch delta 235 zcmcb9iT&M0_J%EtHmWsfi_u!0mDPycv~F<|?&V~j0atR|KQhGyI4FEZX`WHmJ~GB%mc zc$v|c#njZyX!`!sj0xK}U1rSXX8|dj?syYq$umYS7EmBe54_LlIDO({#v+Ku$r~5R kO;32l$O#P$ko5M_CyesUVAEjIT+BuW#t^-%FBo3}0RAd;p#T5? diff --git a/public/js/discover~settings.chunk.732c1f76a00d9204.js b/public/js/discover~settings.chunk.be88dc5ba1a24a7d.js similarity index 68% rename from public/js/discover~settings.chunk.732c1f76a00d9204.js rename to public/js/discover~settings.chunk.be88dc5ba1a24a7d.js index 959ab4d3fa5f9feac1746e6e89bb4921a638e177..76bbfcf7d1cd6fc94f413c76160a564ae0ac7103 100644 GIT binary patch delta 225 zcmeDB!oKh`d&3sSXQ8a-W@g3)lLHS=+Fl#RSjjZ~q!}aMc8*9!Lw;5h6Ej1I)P)Sj zK(^@*%NSL*ugPbO@?|kIFgBj4`*goMaqargi(2VI0Kyj%3fnOP&rYrqqd;tK- CjZMP< delta 355 zcmZ4ZnZ4@^d&3sSXQ8Yn<|c+FlLHS=+Fl#RSjohqs$ z=Wnlh#AwXOZ)#v6per9xLt|BP&`=H`ZG2Gc*VGWxO@8d{ibcVuJi tWQU3-@-s@afNYvx$jNBGU6+q>DkE6c^g?b%DORAVreB<6(nEuO4=oQ@x>Y?dId%KX_+~xdMTO3 z1v!b8@p*~4srJ}~tq{Vc#i>Ogm73a0F?o~w!lWiA%od(JVJ*kz!ZmzWtd_>+hQ^Z* zp3UC;{@FKi7E>dj^#{+YPA>ST0F{gQ8?d?MKO-BfsezHP$@DH(Mqd_FQ!}IK3mF-G zrr&2`6xnXg#;C~-l`r6Clwt+>!f<*ZAEV>;le~)Y9)HAzRwG)r3P z^mw*7i=Dbp7O1E`VN=c7xiD$FbbcwscN0+B* z)=#JDvfa7rp2y44>EQCunCvncM7$i~tz>yR8v`o*9lp!GTJFgRHqqgEIvvl>`-j1r|=4u|cf8|cY=-g*CCmya9E_wVyZmVIpV zaeA`mf#W0wOp~ni$em^XG|qlHpZ*N=NEXYBw(Jw&7j-&!@7f~pZTmvsjnlUoUv*b= zY+r)+Wq&+Cmz~Q3JbpU*XEIv$<19;0rtR=nciFkZ|8=+SZ{2@*`?InL&dTZEbDdcc)^JpNb`*gMF1_p)OgBgVfOKzMd zI4O%LIF|Z?n{F26$FuRky-6+xTfp+^iU*J93HX_Ts;0~IZNg)SqjdgMPTukxr3|>3 zW-pSX$?W7r-r#S5DgQ8H-FO(~Kn;l{daCSs9E>}HIyhB; z?MvCV{#i0k43={V|KbvpgCc;4^@8w3x%249g03ospdDASpKnjOjm`mF4Lz_VWfT|63* z686*auz94h(WnsSi)22zIFy$Se(`EKn*ePLJ+ixZ?`)A!k*pTJX*ix8j?+wN^xeBz zvU~+D0%9919|Qz1mhcS}^QzO`N_Ie`G0+_3c|5p01yg#;h2RXIBn8rJdxWXTO#V!| zm4JGIX7%&ea1M{b;K$!3_n%X?kDxIDB(Iyktl=;Ab#ohzuV%qRwg%e1r_dm^Sy8#C)72 za}ux=f&vHx_&9!?#?$cx#3(<;-NZOmfou&aCIlQG+)*jHf6?Chb8-feAtKSl83ti{ zljMUJpW!_|vzo4ZO7HSHBL5F~CtEjQ);pVx6>tjJJ&AFO`=fX&%iYf}$pYJ#7$HOsj(FASW29+;z8Gzw zj0_gu2McRQGGgmI&RW@OG)l7Ucs1z*x}eS@3WdP{5OJDD0OM;N#}HV@5yhKMXONx8 zlXmpuY>9E_^VtG)E9yr7Ia@7S2BX$Ec?%t;HJ&9|YnngUnnIa*3$+28hjIIOEmXnhjkofEzcIqj+5NFI|Jg`B*EW0jXFXfJ!jS%*4Y6VLG?Q5GETyWog@ zSRUa#SJN9jZ4dEzJ*F=b0xBQ8G&6mu2UdiqbXCW*$z*n(zfnAZdROPO{>c@TNRAZF zg(6Nka#==kRF+~;AlQ=_^_5_qBx5Cv1|Gj)Mb;wFAb2$}#o~vyzz=tYA1XYY?A0*U zHOEqRu0#b*Ke4GDnOqk^#cZCPn}NU~pB@N+V#|}a(1rpM?2l1{&Lq-FKf)yLd$Qe)s;P$Gab8?_bjdwTKRywwNNknoaba{37bT+vV`uw}Cw-y#Dh7d@MOP z94QM?4ag7<@SFmTM~v{!(=w6-=oCJuBN&#*GvQrX%+M%Xc!Mh%s)+@XyigEb{!=LU z1%mYv#(cSic7kv5-xzbBBCe*TUegd?lTfAsEF#P4k5B(8r5X(fZ zD)>#4XYpa(4=@VP_-Q-I=TF#Rax(94)Job``>37U^tiq3lVrVG#MA6JS@hFoa)y~= z9c`ZPY`D3XeOdR683FdPd-pmRCL%l{s;xESz0MB$Flmexo@wJVfa{ZtV8JXg=AE>o zV&Yy>1zg%KUR(#bv{QQ60q!c9z^u&0)-F``I9%u@XH{CEJj4~2?Sa!6R^iT?B{U3F zn(MlSHH^@>T!_6ecP`F;nUh-Oh!P??A#dE&o^D4^7D?-3wt@t1f1JnDWotQWsbI`| zi3^BnJE5FcCbqU!`*=)D*n8 zUbR_5XwBdU$aDyruL>9XqJ+TAQ-9q)dChIZN?3qIJ^BgK$sGW!_DeP*?O$F2QucV& z-FbNb;m6^Rm)RMJ-Wr1~7~13Q`}ZH*o*T!ZrFwh!(T)=eV{eEC3Fbj8TB6m`-#Wn8=se7Q| zL@L6AIzpNvzB`xN1`L6t+1q51qrc5Ls>68jg5rD($%TKE)w-g9xAw?I_vE0K27kRg zfc|kW+HeYC`3#CsR{-d}dmsX4Xr!@|_8~pbFOrEkCbQFY9(7+U-8&%7a2laVTRq$2 zs0$88H58hZ+FAz*xinD(Ji2h_9{8s~z^ShJCVV^?xUsAIQiVdV_X(iTGbm7pdHi7e z@dxNjq3?BTciZ`s9&J8;2+t~guiJ8V#rL}N2>Kv>uk_PCc;pUr;BT#JT9_Iw*X}(3 zZI!%Qq(}5K=3Z9Ve8cVm= zu-mY{aSpg}$#Vc$sCJUiwF;v*$DkzDmyK zIM;B1bEFZ@B|M#&+u-#jUO72|ULXA>62IC@%>H>g{XslWgYE9yc(Mx3wFngGT$bsi zU`v*4yxrW$poff3H)xQ<2S6X@@ghFMtp97UysB3?O*C#|^VFkhns5eCu~q^_^Qr&o zqfQ;-<>@j$`3sx*@iJS{jH2_p)d({V3LAI4R&e}2-s*6 zB+u#HyFey8uuih%PY7(mxrObM9F6*z{tpxrYLkKGoGuqk2DTMO%Ov=dIw6m-T_LvG z7OFkHOBKsH~VX34=y+gvxg*7Q?wmI%ZRPTa5aQSVPr>Men%xzq9S~1Ay|4|kar_G4hmfh9AmcVS#U^0tul#gx z$*a}vmhWJ@@80df56kUlqz&wbKT&bV=F7Hve2`1{P>v5v$ocvo(0c6GODr`Re@h-z z-Zi!4MWH@iEi!Mi+Kmfl{;waW{ygXQ&NEi=C zIG^;7)*#6zB>`*BuL6s~XYt7_M+4xRIpw^U5dcLzV4sgZIhnQTyMi@oxr8W!kb#@L zDh@Px@nrUDMv=V{GEd(teu!rzhN`G;G&ZSEkeyepNdweYiX^y?V2``N`PiexdV1z!1(% zVl7Mp%>h>6UGh$v5v1U~!j7VeknGF}mEClDD8CPvv%{*D zJ{RYdHku&U_t&cu6tG_nhD28C? zG+31gEtP%|kq~Gj5>(-fffGeJT&>@~WRKHnVu!J!RbK}uB0$=qbx$G?H87wcn_+?l z^hh`KRp5nsUlco{E{(v7BV4d5^3@%NnOHay^{E`0HN6t+bntPv`FOr7{tRp%Qq=_D|14Z}R>3#%Dh?{0Ki1NQ- zOD%<&;5>$B6}#|)M8m1C0fTP_l`erh7`|&OE?<`YoLp3mAbjK1r&hau=5>b;0DW2m`SK1jG--zudtx>J;ecp!bFf4K{YZZa7<>qKph#yWW~E zabFE~^L3jYaF_yxhYHU~Q&5S)Yfr`xDon@eBH-knvw*QX6T>y^rl1FjFiy_!YZ=XT z^r*yHKv#IA8O1+)S0E{RXuY1}G@`9qjc6;>h_(&}n|gTNz%Ru(21TM0!TUO~AXnXR z_d?M#O#ki=l{p%MxmWBPVwwq%)7=g|#aCU%r_n(1_jC-A%^yu1VfC0*=ec=+$uDDb zkF~aU9aXDYlReu6#@z(EJL0*xy;L@-|;zPIe}>GD+56+o9ZrZZU0 zCGem>pPodW{ftq6gTiZ0U=kwwOzeF5CWGfTM=T2F_yg=rgpL3^InrHs-!XnDpUXew z1hi4v66GW>67=9z*snzOs9r9N>4>jmfMq`}DF}u_pg6-+To#)DOU$I3*Wj0LG7ksRs3XO>|9#e zQ{Is~vTCdgZrLI-7<6xBaT9UWy=^ZJks{`-X(CJD(-f4Slmh91Sw>4_siulSY+*dZ zErRC!v+A^_Nun55>5n_VW8f$%Yu=G<21vJ}d=_h5Y663sIM5U>;y^2ZK&PB6Oo*fi zX-a^bLg@(zfK9&ilB=yTQ=;@7U2>3&ozrYRHhlp2+`v_D+$RBG@1p~d-aG(M6%R4i zd{C$}jm*Kpz6dtL2md?dXrP+lCw0`rS*wd$raQG>h;f7Sh9%92!0b^nxB)b*`;w4t zNXjPMHvxm|$<9+yGK5)Oj*$FXV>_tM_WDWf9U+SA&0b-|T!+2=h}c>QY<%=+>;B_k z7fPX?S&OgDLn%~qD@IbN+fvO067vQr7wp3OV!hkddtw`-Dj0br4#rKNDA+(goXgY< z!1bO^OvKVxh%C2HUa{%WhD@iG3%@m{hNQuFfr+SKfx7`SQ&6h?!BZ>EtZr4mVpT` zi)0s$4qGwG{w?7emYP?Bv5PbD6u(NB$j&Mx67ENgpJ%|5Jn_Bc>mdi#Wdr25Ua{yN z=9FgNSZoh|<%Yj-PHw8Xu1d=;jVUyp5PRIy!DJbqEAD6bQX3xGr#YC5W6%nMk|TA< zyTJ^u&cWd$C=&u*6XD&+`F@cGs?FLB69Btx}4#E-iD z4PZ&Xs{_ABY609IZ07?5b!~kJAO_KkA%|9^gFka%6(St@@C*qWz zVWD0{xZd;_DCHymBSgne9A_GmEx&0hD(Y;5@&;1(;;AmUI^UTmZhoBN8UmEK>6gQ@ z2!2u!S71FZM2VK}Ng<}f12T01e8#P^i9M~U1(nB$k#2FKx&?dFyqJ?K1=T-i?B6RG zqG2NrK+Dn(m5=?k5{@1EHcB6pEz&*vWidfag>4!~wjBu8Aw!$s;px(KqZ{PU)E=joEckS**-9KB zc3j>pjcHKVTWgPZ@OA+fZuHW?%XdV<%EGTfwUA-j`FHpcuqorq3{iInzCwwMcLHkf zk8mBVb!B>rK+bqXAhLWAv;mI_NN_<8@W&arX&dwt6;iD0x!GDm2-KH*sUbVT;%@Lx z3E?Z?(tHtdvFCHnV{5!rWO*gIvw+MBghY?F2X{Wkb<{&v<|&cKqnuv42r-X9!KZw| z9Go}3%=i8}`x+Ij!zl>f)(%j+t2$JH?)#T3SQbp@qkLRHux?%%4he}ilqpnrmLg1^ z*cGCb7+@H%Xr+^IaO_FtiOZ!3_6i%9kziuI4vWej;zVEb2zeGBOYz5gDh2xAb52R`ruYTtZE0ij_m}Dvi5z&oBGM=J()rM15Z_@w3{jigEA=E z%DO6NIslkU^zkP(c+b-bp;m$BdaD85{M`A|4ZP)OcEDsgqFE2inzbI;U|8zVo{xs_ zd%b(eP;YRN;3b=ExWHT@WuYKR)UymEss1FCA{c?6?Uat@wOL2u6#Vq6r`3mJAW}kH zT1aXrmYT*B=BQ@$1S<7vHTJT_0mlZJ0+pQrd911MBVVm~RtW`C(LgBdI9s(*=BJe| zKF<(o9Uf&fCkW{Yz$apL@cU^z9VL@+KXjw(-a7-iT%fu_QB>BB3KDdVLR{D`G)REH z;9@&jahJhc*{L^p)Jz4MS z2RVl}iPr0Y{D2Qp@;7tX6 zVd@Scs~0N>3Dgfm7m+>Lu-`9|GgMaj_uO)~_8V`!g7J^E@vN$iT8K&*%Xg0n;9tFJFPbcV6(~j8BBpH7{ zWvY~UT*%2hk1H_kbVEJ`ElqRI!I-ODSR^hj1fD0QNa(Cs5G2V{+Nhv(2nyQxlHm8pot75zg&$%>@w%ukCa?D_+9``x>^Vb0%?Y6F%p?$}QLHBXQ6R_Um%)w^m>9`M>%ShTlk z^APRFA84pn-Y*LcbKR*^b4f`%s$Q&|I;io|2`RKtH6`o?XAs21Iw$!Ty+TNrA(d4_ zEZ_FWK4ri!AY1rFnGd$+{d*ZjItEc$W0g7doLIN-*X?C6MB`=_s(|_|N)|1{J|aQT z#%M}#v%(fa$a)Sf_^Md6^sWuTJ{)$Vu|Z)_!rS+*Ez$K9Px6r|H^7rWdrKc$92E=XP(DPRbkih>+i-;Fl# zo4`U%opOB=5lezuYfw7L-!Y36OfG_eXeJH?u+a2OOy!&O_&A@giV;hrO!?530oB_o z$P@Yf*Ghx@Ci~|PXzya*J1ed*o{gj)pOuz>Hj$c0?P#37jXExvZ{e!g2lL0wO!Di) zc7bjz5o&@a(+Jf$pwdGB#}!oEMsN(SU!a1}u<28fs398ewNpU(Vgg=*-e;%+OS5BM zO0zHJJwbTnUt11sbnExwR%ckMjL4YPtM2ah)`!F}PJ^=R=mfeARAV#U`;T_FP^gpzowqh0p|7q* zHcovp_Bxj3V^KBQ)p~`}-H>Myr=V3p`Oz{c=p0Q@AFGEl!K37KHYv91ye%6Hax;}h ze#_Do;7+b;GQTBNnkBmapo?N`$PINolBJiRcH;SOrK|&W7l}*M@&)qqgP7{5wo8g* zr53vuun!kQQK&Gg!bqBhYw`{sS(sGbBY(r{{NK7nKLdLf5V=4wJyL?UX4Id7Oqs{6dbg&GlD73N$C*8&_N_4**f=tdNBnkqOExkCM1Gn@x4E7 z0dXVyv7%)1^&&no!&wlhgk`SoWP@;ZTeR3hoUxv~00P%w${pQxlr%PMu_m=nX)A4t z)!~6qRyr@zdB%o7oJzI+@~twn1@^Akg~0v*<IPC0bh5pdNdjy%U zs-n5t)zX7Fc3{T7c1)*zi693Qo|aZ?EY++p!Z<`__U{@YmZPQxH(@d8AR{cpugKdS zOehI%=!0Sd3sQToet_g7!8Jv@J-4hDD|$PUJ{uyfWvUSqP-_siGdpg*yf{0W zP43=}GWi1mK7|`>7KZ?n*<#vhfv-0n5c|gt1Zm-%Vo) zg-idY)mA(1?Yp@R{0F;IsoV|Uq5<8l(p}^wNSE5ZFU{m%Tywx*;O{H^_x=0Q3#eX; zqn1u#>42ra2qZ>N;o@tXp@YrA`}gin^q0T5tI>h`md@dLF*~dID07!WHIdkbv@v!w z&cWt%$QGuJ7mUfMf|UcRznp1?Ap{}xCR}#u!X=H#f(?Kd4=gL( zl0Lb<$Vt)jcrNd}e;=W{i~L!;Fq!xh*A2p6+4#TP`-5N7_uqG>OZ@fd{nmr`JKG)n z30LCTJQ;WP1v-D;=%c3bvYmw+gq4=Ih*V%PJ8#iG@(Oz+0h8_M`zh=_>9`dy5%4pY zu5}p>Y&=G*=xI+jsD=)yU7_1k<5Az&vogRG7Q?A0CqSm)q;yBP z6=xUI(f3Af8MaeUlvVuX@MKl&-A&3K# z0!a_t$;$s`+Kt_VIeLl3Uo96Gm#a3Gg#fxMEsg<-v&uK3I0e2l%&zingW}6Mb`jW2 z#xom=-NzF>kF224hx^Ik5J0wNXwT3#^jb$D*^R#8y%+8x3f1W z5^Zb!86VEN3)5#6cNKwoeU3gp$s67n^mmp;+ zo)3=&7f*)>nnPV*P*`?wU}N&L;L?Al$pk)|x5FrTmyA}l!bIJZp`>M^{}7wP9|4#1 zeLe)X=Sx7Wd+_TWe-W}5d}YSj5i;O%wU|Z+H3oYy4n_1rQ5Hjak$i0H(WO>9S3&P{bfWcVZaBKYnncjb+HrRZ z7)=x(M?+x5>-eC%>`s*r=!~%Jkys)1u`zxDF}kbaSc!onP%E(inNU!0f?0b7@EELC zK*_`SJccW+v!B4X0H46yq`m6f)ry%2U_s1@!euEl1nL&njN1k;cfW(Uc|UU9h&ElQ zbBp$vXQ42l0kLM>t4Ui{+!5TG?!{s)sh%`pOMsuw z#={w8e_+aRy0@pOvlvntm?S5#uu^td=;g`qhxP(6<0arC{}&%S>OfopL0Bbjag(bn z+*7o`1MWK=IGvzB;P;{Zi;wO}4`4p7Xc9i};BsoqiH9dT(>+WNCJ>fAdiHLVNP0Y$ zgW)=2?sG>o7>qa`A1zjM#BA8X)v-Ez@$jwC7@jNLEiN!J;)*fcslwHmkO2_)PX=dQ z!8Y8lK)~Rw=TBg+Z(UvGtJFb3nRHdQ74ER;h8Q{rtO;$X$vjCsDI@4xkPTo}F!ua9 z72gKY!i%P;H*C8pSq6@T5j?ccx>s>5Nzo{BI@Iv6f`=Fwvh3;vf)U)K5ZB$qAVe59 z7{n-mj!_a2U!9taMX*vIYK0Wg2qb7ty`+Ui5{@a_|Lqk7T!I*sYj8JzIBI zMi1#BmN!#+=xBytRbfIiA(Leo=~t#0f>`Q~I}W>Se>+1b1yHfoWcee+@dL;|BCcQ- zq=wiJ{`13Z)D3{*KvjT^5>Ep!oQn_J4-qQz{sjIO{&Jp+FsleDP`{35*IB6+=# zQ&ESuT?mWbuHZ%9cbf5(3-sXkar<5U!{;>*pF8t6&*5-| zR}nYj+2*&-sv_?Hta9B0HpjgheF?Z+yeSxIAUwaiI$-53LR1nZa<2XDVzUxx*tcL-ebn+ar&`H#$ zv%JJj&MH==z~Dx(=(H|P24ut5?(_Da^MN|}V(_y&3IsOycFTl$eBeo_Ob-9dPx49t z2}(@exI4oMK)Z(4CJ8wJJsScZXK7|e7KmOD)BfD1wk9vYDel!PTG=Zb0u#pm6upE= zauK&uZFpoG0FMe;yhW4v7bx~&<}ynuMfPfA|*{uI!0h2t=X#B0uDWxnbp+wFain4U4-d%!I6ljttQ-pz|`y|JgA&Y4_1LNQc%4Px8 zb33JySRvcA><-PpDs0vM7V%M@P)X9dZ}{2JNm`V6TYrQ={U^)zX0AbTBnW6QGb=T}hj2DA^lf!;Q4|uf7XgzH*f!5s zZH!8npsp%)1o!iKG0G(8iz1|Yp&90SoM{u35vi5SEV8%-_6%-_ve2A=KY%*tU;`y0 zYFWmCN1C{ebo#X=sE;_UqckbMYuN-_e)iGGFp=57s zZ}!!2bFbGUMF78@YT!=*nAw4tuu8xY1`px^1x;AKV~cS+f}I0laNwHm-j^;OIeDue znLyGP9u7N=lX`H@N5SP>kDKt;*}+>J(?JPo4~@hjZX$ zeLo^pRU@HFS`w&&2$@Q!DO#jE;zWVP5fqIhs3jO}|-B%DeFh%SKwWi-{ii(3WJwaiz?tDUAM!xB(Y>g5)nli{HI7`RA z<51Q&x{yw22$~orFh36De9^&ZArjkgzB)5_Icb4=?Rhct%*32EpejYqZwfTb{M>uM zd62?x&%foA<(T5OUeHLv8mM|B2!Zlp%8fLs0V)EG1vJ&!0Zv7CGF+HbM7ATBY+E8_ zO0%+sN`47w>%fFfZ>yY`#7N$E<bc_l(vYei`+ zj{$wMTFyN6pb_vm#tt)FS4U^*lHLSHgu;)b0h|ax zi>J?!(ZQ=Sy-X^r{UA=df!uxxw;yl2u7uyxLxH-kBdeCFszdi}nx#kSBwb#($@mxq zcVS`~f9`iSpP_T-;*cS{?wVA6M)n5j&A;Y5^2N-3Kb|ZZLQj|!Vq9TLL7|=m-d_R{ z%b(5=Qaw6-1!wDo@v#9;+KF^^MsTbp;9x+DNQ$h{#UT0%ygqQZv4q$2bZX$-$$hE5@6 zJ$gDENyK5{X;3y>JP$C%{`Z$Z{n*#2h4lDBxw0ZL^jXYB#SEZMNe{Dc=}C6cYsx3> zoI2IaMZ&r=pE^4q{aiV~?mahe9(@w};?zNye&eGoA5~ENi$11@x&X}b$u8VXvz$UQ zLQtA!=VuxRBWE;Do*cIkb|A*3{0NEJ(9S>a(#DhDg#e&NfW3~@nb9C?2ohw(+K{ca zIj{jtv)i`D(~VKb%;54zs437Kql+OOrdG|+Nm)PBlLC{!g1N#GSD&0llTY3m3TDJz zrl!Fq%;s;c?Sb@wqu!UVgDSWB%Qr`s+_U=A}WwUXLf&_f8OLAT-ldeTK= z2=Wsh&dHcRF|;l~AIcP{fS^X%=y6 zeW0=rxUL2&+kTD5wq?OWuSbc>k;Spo^xE=n6xi;X5^IIBfUS$!s&yVuB?eN*6|V?9 z+aTF3#-Q?%MT=RFsLt;SaDs_Q)w$@Y{Oim1BPX2-imU3@dcjO!MuUm8PJ;~h43D!g z482c-h*Rz9xV@fM^^70_Rs?d$1MYR$6(oZz#M=<@ga#r22#Y5Wz?P1SdAgnJ`;s-gdXZ!*dPQzwIw6 zgGU*?EFW4B2ohf?(uL$#^Ya|3%inWXst79hk1!DLE21QbT3I{M6{7^oF_*c1WysSKq2Kn z6+PK@EktZ4+dyDNr{K)8>dKv>6D@4JFIyRj&5!$Ad`TYi1v3YQXQL-@H*%2HY=q?| z<8BL)8$6btA4I?H{?{lm0iLiL5{JEra-%W}5F_vMvaGUrc#O zN3d%`hdl*fJVoOSms)@QK*gGSG{O2?R$cFQTc~6dJc;Xt-1V<7(55fk?7--$h)WjvDjmHk z*a=bDuC7?)4NDUiVPmUiT0YVj^7V@PBfDzw@Y5{FA!}w?68qdn-f)&~!}4;8#d%ln zm-nyqM7U517UV87r6JeLpQ>5yx6K1)-gv&}*DLRaQhC7>J0w~ijAxr zd9pw$S)mB!>l88O7pxd_L+tQeeB?TH6^J0qyAqs${i~TYwg|@!nlHh4z=!tpOY&0t z5+hWoSH+^@#cxV+5W8U1JZVQVB5XogD_4)1ty=E`H7T_+0vx~KwK%5Ky7{u{XFnqL zKU>Y&T!yzI=;Di(DWt728pe*2JmJC~Y)w&N3Hh{K8^-PDIvWAMV$GVTu=bn;XA?(7 z$(tTEd#Z=nNIWJp5^S~IEg@~?Woa?r$88ZqnKK!t32j!O4RQ_E5v^~V< z)q16^P4dkz%}gKaY5N&nRk=h*5e|A+=d=FFyn;qP7m>k(g_0N*3j?W~eu7OZ7g_KX zm`fzk0Hnwoo?rHfsP}@<2o!!uNSwGr6dq6^-Y|?k2U~&dT}P18%ncAO!=`p*W3QiG zVSs#ka7ya_KY=U>fjR)C9V4^D912v%kd9+1oCDjP+4PO0daj&!8Yl<*0D_`iAt7qXMOsrT8=*nGi8|9_&2+ zfELLG&GW(Tjuoxg7A5r8=$@*6sg{b(Dr=l2l@a_^ww0Wg&~IP?*ONG!E2HQ1rjs0GA-<)^pvy_Ixp}p+$_Vj+A1yiYuL3IaaXhh z8kM}=NadF?9yGoeiFRIT97{2Y>Nkx%P`O}I$=|{tLWN~zHERm7-Ai3oAfA2`gsD$t0)V1HA@2p0xj=-Omr8Dz%8R3t;nb>M zOLo?OtzZXziLwAJ^YsL|%3s8<#ew=C!^lOz9(*At7qjDARK?MnJ(0mBx)106-A^3E}U4<-*n&}Ua z?A~VCBu4Lc{9-6iG79;i+lm_=p<%k0O;#sS{fgl|Jv27&|+d!W<3RT;$t-PI8V)FnK!h|mbvg-=_msq2k&%A#CPQIczR_Uvr-&s3u+ zOBd^LdN0IiO!uF#RzbikA)eocFTPCAPFm0rPEJ_*2_>%3z%Pkfg1;zH!~tO9hp~f` z>B(=@SD!40(HG7Vj%dsgN9|}s-@2rsdOBzfI=8l|;-L{gsH)?$@ zWL~H{{~HxD*R3m7G8ao(_B$(Oz7{V&S2Dk8eSNS5k&Pj{Fuc-!AzlWta}27W+)EFa zRO>2V6&(Cr$$WO63pcrp47R;@ogKVP_+6xXEvJCFe@~@R5edXd_qmd}aLr!_n%oal zE)9ctXn5@ClVWhc?iR|t|GG-%=*{zZ_x76gBnT0+^5qgDw)tTDagZzgZ&O{G2@HB1 ztU?m2t9QC0JETLH!{?8aTSx7v!4;lhf#5PagC6nW1yzzEx z!(6S|MmS;?B(p{7`1OHBnB||SNqfNoqKPVp73@9K?~z;u`;@Jc-Vx-eMj8SgF4U(* zP+yivSQtnG`y$RPY#LHeJQ;57C13iw5SAmhm)yJOh#58fJ9*^@AlJTs96wk;Ci!pM z`%|NFObJ7QpL(N-(Gk2R(IMB6tE~29pkgD=#&xe^8mL#9TTHcZXYyXFIJoJjx| z|8d0ZigmtWMU9#N@>j*cPWyEPBn(VZDEQyWor}2ljdswHv?xzP74{lt;jFBNFtDuo zN`BIIhwSB!FZY=EraQbIn)P5oarC>z3T$F;p}BRV{bju0*&qDl{NAAbkMZT!qpPnv z`x_@gWjN2-V2h&fxlMsX%e0|u0E)yfdDenuR+$uV&Os`-cfn=}5V|1d)P~&u7*@5E zHOkf-)~b(`Y-{qsb>_9oLsbi#en<>&Wh2{zz{rNbomuTy8`%a)fSZ|kfPSfTa>}=a zCOt=yK*o@7s9x=o<2>KQX76`H460D^UlRr!PO;piyLhi0SQ^|d1eNkS2|I&IZ{hB6 zaDtH^8StN-9lu{^hubL$`2JO14j+KrCpq{RI5!|b!2;qP8|XlqEO;cpm1bVKdLMEM zwZnUP%SYo`P=#uX>-@)|#9_*%3x_M0w9qmHHmPcpuv<(kS9Y6Y|C%PI`LmX5qjAqN zG5U+qk#uY4_F8ShU(C=dkYov{0-C4CDN+~U(8&f_`{B<0-N&743sV^mLQJX`bcHV3 zL&JtpK)(9;(eBRu+b<_n(ziu3mprbA5AJ_f(&-SClD40fbhNShtfc=glyp(6!&FKi ze-da1DoI~jxNqd0u6iNcFw01vo#vQxsU19_e_IJ~Q5*(QWR5-%c@2C-Q5xkE(4O5D z5}ye}P|R*1eW#iy_1f}=px2C;Z5b7lz%T*3tZDYgNI5`y9tkaqLm)HWUjHi+rsmL{ znTj@W!51fX(Y-2}eOzAe7=`?i@0h>;H#R^lzb{=8ak22eTtxMKt}~?fzet6FCmK;5 zg!l59&+2r&e*YV&)9Bf9ojTnRlEo-ySUrICh{XAUIe$!Y1u9!nyX?ngc|Kdb$*<~@ zus*^_m&9k8z55a&4X`@kS3L`_6rJoJCo%e$ptS_P92k5NWn?ozNUN(%Q=Z(AsufIk zC})|E;uIxsQZ*acSDSb5diRIF37b}6eBC?%zfN+~tb28<_SLQM)vbd8id*;o z`gMfE=7)C!Y}XF39S*RK0fcFfmXWjH`GNxK6ZuwC{u8kD8Es!k-_L}@A{)f4p01og zULb(^6IRosk}q|g^IF^7s|=*vyKm`8U2QG$V{*I=W`9>17291s?MVPY4o z2-*zUcR)qZ3=I5#>>j_m(m!mEU!DGM*y9(z9C(u9#vh{~B5Dk237vLl_!ToL)d!r{ z>M=`G*$3PpLbFgEGR!Ckn_P#=<1o`rjwu4VLgw{SvCzij1SP;tTx1lsmkGlgIbn6& zkndLFGFgMnWK{&7(GyzO{FI?)i>dwh-X~8mdv#kMD19Hqy{$G+G34K96@c@5A9258GM$ z@$T-L3F$5x%_DWc>34g@;t7`wj`rR$Kpcl09u`0FdiYcnF3JD0k@b^$prK zQzB9S)W3-p9L;*jLW>rPrp1{Y9KTyx_XGKGBX`S$$o z-D&@sfCn75GVBeYP^@)r3pUU9o)zE_Y{B`RW)dNUZ%Smsux;(B6rHN|rXe&#+4jP; zw9v!s56|LhdW?SZXsJg}U=e`U`35RB5W@qxekIJsNtbv|w$!9K_a;l3>D>yMqlex; z9paj<9u3*WfUy9nUc{p}$>Pa$ia423GI(9u0K0$CMG}b}gG)H+UnUE7SwmL^_^j|x z=`B2QpjNL;`q#M~1T#?$sj$O`{0-FU>KTuyXL0bwO=qXI-VGFrj{Nic%e(~Q6uhAO@y zb+-^mvoC9Hi{P8)eT= z)x4t{Ed0d!NvR4WCQ0-WlO0=w*8LET(N>1#)!MT*%E!lD6h)J&&(Khrea{vpo2FUe zFYp9r=C}OJ+L!gDQKnFP3x&YBRP@mR0MLe&EF0l3Q+F8tdq!HFEIMdm)1AO>6^~z{ z?hArP7W^GcLHOq^K1r4_AzJy_^q;+@)2;vf$&cTE`|Rbb!=InLc=_y`AR-0S1}kVl{ttk8M4duBHl( z6mt$(081u|uD34ZiMI@2uyv)BKRF ztsc|lC3>i=W< zJsOR(y#UK>9$8m+$iH2AAzm!v3u{E4Y3#QY29H}V4&C*JJ7{;T+dG56!OtD`wRHNw zp;k|}vTS)}iKTX>%4O&o2AK~XmMLqZWe~{n+O=H?@;seQ$f!McZ4BvVc~JzabkE{< zsB>w$RhpqltPTu6F;$}=6H7Iv7i!3~+v3o2uD3LMhAk774HRQ>@d^$wL^Zj=>v(mEtj^wt8#F9i&5mT$2_1KftP{C(Bbm zdxZP~{tnhKNfdsg0S0FevqT8FVM8@GJhNILb-^pL-7S>o_>a<rhl`CeGR4?Jl>8hqK@_*c1{J$ z45x~Tp3TN6uL#3`@PJ-})&T7v5Goj`*eWPYbKI=tJ$6ewL^u^TQvAxrOXzY|M9RV* zQ+)~zfvK9?(9_IM? zu@F(`Xe*j%6@K6}rHBwTWN*Avt3s16g;izCmQIkTEw3!_s z*Z}9EFFwbUzAg>qnnO(Limn;z^AWh$A8V1uO-x&Vu!9*h70}LcdD2^|`J|0z%g?8= zd>V1qu00rHl;zndS!8GJR8CgC$%yB}ANVG7WcGUn8mx5w z%i-4U{t^Rdg2pC}TjyTX@AnZCMK>Sn#n-(aM1riA>4afD&_nw62Bm1&?1g~-g6gvV zjQa0K8*}Mz;L1$8V6%HD8jc=YFn8m$k5d@y1Gg*Qw(rutK zAK&m&c=Eu7H`pqbn3;?Ua%NL1hhnUql|Edam;=yF=H@3;h`pd~H=G%4=jXJNz%Ft2 z{q(qaD%2|AO(1I1^YyFduwx{BsqOOv3N`iP@faapC_2@fB*&~BRk?X~)Z3KnxuxTa zFXyg2Q1sQ`lNL@)i>47AyJXzTE}+t%WmH^FlgS*_k(W3+=)}d+S}B@e$4Bx4>;_yw zza_Pl)fd+KGHyw+`vQ`DA;<6@Dg;?kqGQ-@dgo%N=p8{dh`!?Xf4LEVB?X|5Cn#ow znSc_s%plPE@@Rq5J*{x&U(&AAJmfdC=|8?$wh&*pxVWQ}B#uZ5jyj< zPFFC-f4RXSzd~^=EN*$4TphL~|4W5L{?80o!eaD-+o0D_x^eo-~w8Zh_2FbilCmXFi7z;m>ZpQD!VSc<-j zgE{Q5_4iZk4px4qkn-O~w>X*xfvbr1(JNi;B_euSGESc_xJ$CmREpt$_mly_K+yg`=sQOLYn^^34 z4P6-VkExc>_j4;);M?B8Ho^Hnr2}+C4Le-;al(_REl7{ zE3a@pS|$z!&GDt@fI6@9Zz)bK@szwG;Fn)N;~knB`OFJ}v42QGo{UY@#6!g^Fiq-r zUP@Ir|DNt)VRZ1wQKF%s-;dwfYuZNO>zKYLT@Yd;09?J^9Oe&dA81QJu|kA?S^aQG zfXI2RhT?)WMJ|`q1bfk%0sR0P^6%_;Vq+|}J$#C#KqTSrsmS48&3k6hj)11PlJ7us z6oukj&B3J(nC0)oW^pCo)zB|PXc*P=pfIREFWKrV*ZA@-Uw+2c?n}YxT60@9L*yEC@VFtY74HV#E(3zY!*3;Gl0Am(ya)^SPB2@IE(6)*; zKe!}GBuL{Vy2Zfdu7x{A-3ihI0?N6~C<;-DD{qQvzkAm|3MG3_`3aq}+;oQ&ZCExH zZw;8GpA{e$moM7CAd$UpF;Na~2>2QLR=Vy0WgCJd2t>L(1X^x60xR=SVhftaiqQ|c zRzTN{#~_OiT%tB;XywmG_wMe}N})*(FO8Vjd<(|Z93hw8OAFpc$%nFg0CKB2x-|~6 zG0uTj_A&_zv#tp~^lcJV47zx8<(b#CN9ToW4rpE0pht#SkqN2qWRsSD!DqE!;V|HV zF{+y&xIvdbe2$R%J`_9)bL7wNoMn^nh?t{wgzf_gu`CZ3@IabHLGZ|rjPnui1@WP1 zP77F{%0g=c_l#PjqdKziU(L{Ocs2)9q4JM^juN;L(-|5eW@oe6@)Q~mK5EJLX7Wb+ zBQb%~s&|c{+Mgs1JSj3_o@F9)@hUCTpAXN+JUj&y1<*54jZpj{#95OpEKP|Eu;%7&HvaoSYOrAz$%A@Eb>praOH}nm4-(JT4M4 z4863gA&@0|X?SWs{InCh>i|Ii5BtTLJ^SL-%$>vv3lXxfNKcW5GOH6v@7+@eQ2F{- z!yQ0DPDJsL1MqcM^i6+aB(-xYtC$h;=Xdf6f;%jA^G zFomMAd?rLS)@LG*?p(sX;D7YJcXBKyoD{eGCCk@VxN)~xAW}!EJTy$tG69r(tc+cpKzVw@xcp`RMER4-;iy~W{ghSHlNR^HaX1s84MK&E5^ z2gB$zpztYVN(0P3BD9(yVDKDD{~ri!P0wN4Tj2Bg1AazLBlrj8RRd&`F^(qZc%8|) za??!CaS&YhMZs7Liy>^jusn<8(i$ZThVmhN2G&$-)I=lWn@M})qN9@@g0-hu7UK)0(qz22z_%E{ zY>F&`U~1(!1QQ@W0zxq;UD0g@M-(EKHfZ#~{^bIO_8R@&(VpHXqdny>hbJ+hWaF!w z(H>MTir?ad0Qet5eeT}1m=|*S`SBq`NPZ6#2}D!7{ykMInwWFyS(g%fZ~t-CqR9&R z7NsL$Gxbhzwndi2+x$B&VV6_TgczKPQm?`S^ZadQfRA$irtva~IIv^g5EMe#3#^?2 zyNA_*&b(+5^SmCh(aO8wM#%*j)_oQ#aYMl7gNJbCazfMDM_o_J2)BMg!7OgLqG0%N zNveW0 z)j25!SikiaF2FCk84B8Ybj5TTZCc-Vml-wXc|(x3WO&>hfxWw^y&eoD03rAvEc24V z<#1h-<4b}TY`>EWtwoftIgo9G`}ejq4j~_*@l}80USYc|u&_5yexoTOnV=+h`As{`irp{rDeF`SBM_WOt9O`L0s|Dq4>ptN5jx$sPLghlm_C;)M?8CfcCw z1k)`lJ2!b7J4GEy#EOQF*aa$mbA8xP>%%djEE4LF`Q{h*hxvS7dvq8`Ew})OoJ!|( z$^kg8|DeFg4TB#ymO%Bxe@I+#%{}R0ZD806$+G)TtX%5_%i=4LOP#E#H$;dE1qhvs zYq#7mn=)d${h|TRUm^4-8pqQUmi}X0+jsC~eFKlc#Q^p&1OZXB*TDG(FxMTQ{W{8MvQ5VD zNy^qa-zVF1NdsmllDfIob0Q5@ZsOKJeGPc(;LbpWb*T(!(S~i5(w|Iba1FQ`iYWS^ zfe?8KU6o(%F$zB4DkC*cLMs(sgsZS&J*5XZYSqexb*Yp1r`bHa14rLf(RC3)CZFNcFY;J3|M`-z=pHX#MtWQTje_OMPlioKMYJq@w%+(z z4zAHS9B1`>hUmb2cOj_B0@Pf}$Uzlgxgf?FBZ3M!avJA0=C=#4S^x+nq+GJfjSZ#J z7kO5K4d91v0u)uRKFYo`Ko(PH|GF`KS{bApmX|kJi%PG#N-vCQ?NM@#3g$=$B(+) z>C(w&+Hl@GgUR%Uup9SKL?UU8xraErqc;wS4lx#Nfv!7Rz`YE3{RR=>Gb9?>p6e%} zBNjJo5uXD;Wh)2u8#o3&ChuDRM3?yV7<)s97?PG);1ESDQ2gRV>Rg;2=AB?V2VaR8nXLjXWs)d!CrJ-k`v zmJd7ELgdS*SudWUMv~0KAA?YgVfD8gl7aattAL!fj-=>EZ?gq+^LTdN%g#!GitLF+ zJWf%0a1d?nA|tFDA(acY{g4d@&;A)N!$ILdS3`F2Js!EO?Pl_TM_9?EX6qWs4PMdO z#jUeNZwDAjoG2~eJRP$i!tN%g?Y8}a{Hk9YjzI|EDBSi_Hm=&dqx68XqW znOQeVv!2@0;Ae#dpz>Ka(rZ0a9C=T#JQ<0XLm3YIkSpAwdyO7{XPJa_E>@DI9If_yEQ2xKax!nOj`5$m{BVrev1X6?&d|PjC ztkS@3H`2r-g$U4{P7{L8iTV89g^OJr^t}--pCBm>VXC3ao*M(UDEn4|`wvu^Z;1Vr zNe$fmGZ!WvJl@%T@LLKKA4JKZ9vIYbLd4EyM=8)#u>n#OG7cBu#VQ((AyTNk2+d*l zCY-7;T+KLA`q&8`jiP~2R{js393x24aCB4T{MLNg+iuN|ATu1z-t}fX zRw>@h-?dPj6$%gl+U{Xc7E7Z{Gh29(aYfaDWF{S%wl$64w(wst>d7RNzfh8FVuDIR z)HzGXP(F=QOwyWxL}0TAupFE`pyl*U-IKiDl61~7GVbA2QoU+9bBzex5t~OM>sCH@ z4Al}nrkKjZewy6EADxXpCK!HTXQfXG2a!w=Uvx77%qJ9P(giAFeM~5zwaBN0L0C2iUC@+}Tyq|P z){~D3f+rJ1k|Y1{)13$tf25oa%`Wt`-v|_Z_+x_NXEWIcurR22#d~{aXZI5u)Q(I* z>(XjCpmc?U?8vLy9$;rdm%xZNNhhD@7nDbWpMcp&N*ryla+_SLCvoq%JExs&mvwFy zJs6x&&PG_MV5yYe?Jwga$shOP8BG?a+hvk0Jiu%sl_Ub}vyf%{5BkIR|BO%um69M) zi?D>uqq1gOA^O1=Nb$=9QdwXjqT_UN_CiK|g~)#-co#>8;3<+bb1L<(N@}H3N;-bY zMeY--QevNSEPrxhA}LC*^zIv5sxeV`VWIgEDR5=C(=#-REKWg;5cb&yX~LUPU~0lZ z#+cDz4AP-3+_~-4vVq2PV!yb*nOiUTx3xVVtZRGz#Rd(REVrd&6}nvRza4IVu?Lj8 z-XtN*7CFk+UcrLXU6+}Gh=^jXq!zMkw)mck0RNc&V;TPcUs&@@@UOgl^i)SVw&L?7 zm4TVT!>pW#YqjK}EZIsOA4@a}$ILmg09{gmei|j}kkqi5N8`G$7iwTA5KpO!L3h z58aJsN92)=$N8jC?ZHd62B7 zBXiG1IUP|O3y$)icD{bJ{q2KB4ug1H6N-lcH>oZHD$fW>JGu&CFen-T$C-PZ=UT+W z-;+q~nx?I)&?lJd zVw!Ul^KQ#LXeKwva{40KoFO5%4huz@fGB|bCH(;`gyM7FR{9q;O&7#rQ``oAzLj zUlpwTqzga*$%U|nbt~`>p=|F0A?un%SUx?UbRFp#LXmLtB@1=kT1pRoRAd4bq{XEP zhjQjH42AT+qE!mKT24A2Y&Y|f8hZn+5o)AY0}XX#?nEAU5@@=(QIQU^Gt?gogiS;| z1xL?JIiQBDrl__TVGgSPfboeVYOr(bN!vtkXKms*lG`b!_>Xl?!(E@#mXCXY~Bf*v>|+#AiO19A~g3KKr&d~2TRTkqE0Tuehh(H+AzxcxT?YK zCq9e@`WZ5y3Q)H_uaKY+&bK&-J9ZFFKwN(g8CH|=`2McWp+QO##6BNGH65-+4;n>2 zM1lPj#}MQY%6T58v4fiETc0*cqvUx~gTCf3NM?hlvQ;ls;B<;KVk~zwk$H9z>QHb# zZQ_#TtNQ2EFjzS46G$&rE#BT+#;D&+iN(@hf0;8vzV+lS5<(GoZU=rkU!kpry3)c0 zA)ed0Pb`i?Lyr9#S@&mv9@q$&=)zr+%#lC~n=~99|D2z6^)GEJBC4l^_7tqqzSxHb z1L?dJn#f+biBH5Vqt$5DhLB`(S#{loD=qr)ijoWHY1IYTLMCc9TlD5LDL$qG>lkeu zpd#v8zQK;;twp=l>AF><588u~#%hnBU;ud3N&?Fv+i7SujNPz^F1y!DnT1kVv* z&ej#Nu|Ot+pg6g+(@SU1T(F}uFDVD5$AFgMv;;$2t2r}>x1WElBF#X}P~lFjLk~TY zbH-FPWn+w~)YOK_AEB;w!er)ZoP6VG;pqpAoYklTTm@*AG=P2Q2EG}h#84k^5N-A! z3Ox`BGwhcU5(y z21M%-)o}bKCa*FK#TKq6OA72wDt;{`d!!Gb>nO0v z*IKfmmNA|}nQCErdP(VtHycv3aLFq>kGD1-|CW->zan|16x*qU0CA>jV<$h2hNmcx;Y8Nc_a#M%$-d+N&%6eUm}R+KpB&>lMR^0!9KLW8iFt0^kC&e zzD5sqGZ9EMosH1D7v({+w}`JS8y6~cRjdOdMF-?0=ZUXaZG`nNTKHG z8uk2^yM9fSF>Ld+Re8@!Nzf_hBFQ4>JO~AzQNNWw6-gS34Wi!GecNDAPUcJD9Mn@~ zq@y(CK(*$KY`D$Gt9elJbsy^O&vBTqRms(Yr>%xG=4mrtG--OSK7oo!o9d8mdQV9? zU4+}_^Di$S7NDLu-yzrUuql`eOyZ9_u+1Wx9))c3Af@v4%I@9g5fZd#B^sBmxfTRC zWQx<>j{;9QJWU|^^`LA>NQ**H3J@G9`J)b$1J_LFrT1G^J|y!S16^99&t0 z`aY#9=nK>+psr;LIMOih-{43aYd8e~D3Ymw>XOlj{Hwy*|M&m=zeOLOn|42+cK>d08TI!Wdm%C^|6BElyLh{* zgi~QhAvg-!8Rp@_N$b9gHh;fl-=R?>KK(6nekyjxWq+ESPcFWdY_eobrm^L!kXOAiXc{SYQxfd-L# zVj140UC^k&K#nVl|25}D^Y5_(6S#urv-xTgFU)(Hb=#h3qScHqcv{aJEf#AgPIiLxG)ESy-q%U+3}P{69+M9Z?2tU;GW zr~8nGrZ?KrzSj#%W^QkEOB$_i&Mfsk&2y@rR7BkxM6Q{7kHW3WyZp-nbQv)o{QPRT z)gWbpOl%{Ci=F8ZlWzEU1hCBJNd7{OlG-8p#B)C2rFphNMSq&0R-dL_`LxVQ3|}Gw zvDrQkWpEL3&4S9B^rjb)gjHuNMH6ITc)~bE%tvZIj9*S>OXlkyuG+5^@m04(7?e~v zh`Pr?t!8(MOT=G8fF+LB^8qd_!*l#s>`Dg=g{2#VIi<#lYCM{fTeT^CyHRd>ykeTfCGHD9JnBr-X!p82E93fl9I_)l`-w_W2SpU~59nn;VD#weZll zbC9sq46_N-g^pRa4qXQb4XXG!fY`nrAbwT``k|0`bqX{?nm#&YOp>=yj@AK1I19K- zHPlP#+Yj)cAdaJfxHXZ>9^EcLK&ARYXbC^()nbO7NRy3J2p6-oi6|~>G(JIjQWmN} z%_wG_>T&hHp?C^&_A)sX((Pjn6;!wS?F*{({gBK5JE~8 zRJZ^qe!Ab^8L$dDVN0>pfN8W0*|Elms}`tSj?$T#ZmvRA&Xy!)2%Y|Z28KNmzgj!% zs_7+LdyZdHYLR-f+CGcb*z z<<)OII)rN_jXskM)|+{26J}0kuV$7hiH=t`m=ZN*WdE49@PEqx%l~VlfPatgYl>CV zI~B%-j({#Q)q}sNB_FZSkAkjleW=S9jN$Truz^RD)uM--7TDw{DdNNwWKnOHb-8@b z`(x)y^Fo$=4#QFY&a62e2&?#$-}z2bQFv>HSq!80`0^yA$`X7!-y z`3CNC{Hus#9!4y?N#IH@l3oVs==A0}wv=dEVrR{TlUK3$7~iHo*SeO)U?RwIhr5vd zl1h-ruz8l3Qb}l71#5M%qx(QZgid(YQryK5Is93zz}=4OS6lm0{(@CpkhCzKNmxXL zCQEve876D?Fc^zDL#@EPhGZlw0~MO~Z#%}ej6rIy5eUe-su_Z)B+ZH(sd_Dq3Y(Vh z&sI*_u8EfgnI-8CD#Tx?CUgiY$HL92d-7|8^Q zjrTi&G?aE@rx&(73~!7-c=^^CR7;F^HXZTBU)R#wIH$D@m?0Ar+;G+xPi69BQeYZ& zu`+97U~0}#jhJ%lz@MV+7LvM1*(ib}J%5opVWMF3w?4GUVg9Z72*qm<-QvAA>UVJE z@bp(*(v?+eYHfDqKmFYfPCyw;<#i{}midR3lHr+c&5<#z0nX>AaJ@D1wznvrFe?w_ zMS!w3JS5-Iws>Z}?SMq4=HQSXyFAYWXy<`$9(1*{4kTzg4=Wa?^pusMG7{(Y{(dRH zBeY$T=Cyhh#3H;M7JFNJBx}V#=1WW2DGB*go1};sO=86Ibai%=A@a(Zyel#6busfY zQ!hk-qtl*`^zG&HLO=k~)3@<67+DCjX|DjO7)t#CEs6mFXq>G0+lbiR6zX3*f+74+ zwZJZt{NQs)-XZV^3%vaf+&};?i{1LWS@^DdzG`wfLdf5oA$>R&UNJ`rYeYU47l@o7 zG!n^B&RCzu!5c~1&j9CEiglvs8KM$qXI_I>^6d+^`2=u!d7;>X**@Gw-ir#eTBil2 zp)eO`ptlKm1H98req%#CaIA1}y#UT5Y9#~kSEKyxRHnKeC^>D2r$~VHUwEnt=HKJR z6lMVUu$wlI<(`J*H0!(&=0rT<3=>p{>;Gf6_uP-RyNhU^2^>LP^!k)4u%XFyOqTnB>LbaK(M z&e3^4CIGlKJ1#VZxehF4pa7AX0#Y@{=a^C0v}-U8Z&m1i<(SIG7uPIAKl@N~p*qCu zh$01aa&i4RmB(BZNzTnmC+EYU0HDs=p9T~nxZ&J51Ie|73OT<>JVP16IZPfcZ%=fJ=>`FYu=+|25C6BnMReNLx(7wd1T*hG9u5a>x-VuJ2^?YOg9af4O zMDnYFKlvCPeQKRUZm9L{ZjQSj7yZY2${OJ6(0ApR4~Mpb*vrC2`QhZyE0odx=V zaAG-17EdJ^vz?*=Is@ve@|8G73?*gBWH~kTA$5^oZc?_UuXYF{p&Jcm;RZ}*l)Nvk zbwe^zD6jo%FuE+Bd`jB!H+TzMQhRWTB_Z$92!jtq4V2gVttn&a1&YHj5JBfGSJ50{ zZzvNA2aY!P6-_fj+^=^Y*Qe{wSJ`QB@FC6;kE&JtKM)PczIr8EqP-@)6oGEMH15>Km#DVxl~8^LHyg{H}HQy zil4;acTQ$jW>pqYxUieDwAzt~x@G3cljnZn88Cr3f|Y6GKZkRnrIVVPU6QS+&yXB( zv^tw7@$_RO+(m-sXWzl!8|061afn$$O079@i~sxI|EJym{8@#t3Yzzq>zn2M56VQ4 zx{Z#0S37|t1feKJrq&C5(KhWg2QM4yjaVV-!RUvDKmt@L&1qRKC>hyVPQBjc>`Dti zvv32=*zq-vkj4GIeQ3898X5VGR$E#R)XE) zkF4gRF-o5#`p6?j4mJ^+4G}dk*XV`2;p8?M;Ao@6Ap^P=jpRK#7NDI;4SxWY7cjjI zs?Tz_t68g!KIO880t&{M;Y5|ZoM)?8iNfH9b}P+9hpA^;ef85 zy~$kB6*wj_ry*%edeGCyA0~ z-EH^>Z-yhrD%Q0;8JzIyAheR7cqFc769gs>s{b~pBXDTx4HT{hRtXP1UW4~xykOKC z<&W{=dk|B6mXzlHLv1v>MkLe?ENL+asCXh_?g1xBQ09?d6G{|xk4`Ut`324`A4cep zYo3u0iEoGF8cVjl@WloInxRk;>+;)E0 z8j>s~EW#L2c{H=YqoC{d1+?+9ajR9)7<}e#A48Yz}2SK}k~#nt)aTZuOb5La=cF=44@eKfpfCdrW)2B^P0@5K8*}wt&`E`18}<(5iJ+GXx?Sr9ThOOhbEWvt@(~Uv7Q)iPL4)2S7Vj#PtdLw%PUjpKAf+Mc>-pJchDz8gRbb02ybOp z5-_ER-eFX=c+6UcI#?*@gW*=AHO(%zH$lFHQBei1kTRuXOG7!7Dnk)1fSW-ta?0!v zvk|=`-mwvL`YRU+Czn!pF^e`uA=RLkrWgsWJ->}?E9Fo{E}RmHSNZ{J#Gw~) zKj~AcANCWPFS6&g2wHyorIpWYkvx?TkW0glEcQQv%%;>0nf~RXimbcbjBlgVd_(`|3>d_t5; zVs0CKUzL@8Y@7&1)~B7CR*)`X6KMi`cd>USY@2AmTGaYImYvc{9K$?EqE&qq(|#wY z2{CKO5bTu-w^5dZpWpSlC|N%)aA4K>{Qo1~ z+Q~(Z;v>p?U9@%nuxt@s2u0_q$9OuzQZ~X<0JD$y&X6i@0o@n@%UShOJAOIpmC8TS zC_xFBwB|n>+$JVK*OknQ*!-_XOQybTdr!r0veJ|<{7N7Iqb;!~o*N(d|lvhNVm?lr!IhK3&hinX$j+>{n7qaz#beXh7yitxx*# zifU@^HKd1)%adYnUw^0_A9b3axM@VpP;jqpm~aducO&-P-*Oy@+5xkL2Ut-b=6C+5 zj#^2qIe<`w)Seu;3;<`6<0lr_ff|@Dup>hg*2HqC2d{i6$5ZjLhf2U|otLR{_waw` z7%Mwo2cBB%e1}J@jAO4#Kb#GOhVu!(Y`B_DxeHJ(#i=xbKk!Y6&jPh8;Jug+rwc~& zApL@WPLQzj?+10;ZAp@O19b%6 zoDap5{$`R)FPB$rt(F$~JZ^W}PtQFe?o{oKWnIFk-c?+*PlfJPcyU7a zDlYi$RpTk9w?{p#tc(dc!fPNj86)Ubipa5&K1vu-4l(c9G`tA!NngwMz^e}Dh&i}J zn&vaF&#RaI8E0nc2er<-nL?(8PVSUPExoCTjLbH2^kUxW4r(Ui+&nu<>%Mrah4L0{BL$6*I_!6$lwu zZlY>G{~Wmx?iT_e-ym>&JcX79q!h)06)Naf%o#{pytJ$M;r@#AbZVaGwgibDKU z_;6B)dD)cDd~iwS@Rf9CC0P(wqYVnTCJ{e~BDf)u0ONx8xG^wnC^mCSEs#9WJT}(s z1TKTm0w_E8@>JEl{g@E*K)NrsvlGB>r@Mj7yq%0;6h{*07 zcIJM%cmG&IT?r&J!>VU`fy(&(^93`pPc-yrUiFa)=g!B+6U*$zfThlD$gKEY$`YC^QY&~ zRQiw1t=xH7t9u!dF$oA!t*Vu9szu~GIPU^)ec@}gU;7b3ms&U{e;T}1Sq_l~i5C#N z$6e?=xjskbE~(I2M&rcuDAe}y-!i)>94t<(A9w!94BKe_cs@FLZ)ZNmGQgBj@d1q; zN^b;mQQv;KcxB&1{}{~s3||OW66JR6o##jicHM^EE9LM%{3A@w*lOW{;fJ?Al4^{x zHn(-zK!!a)7ko+H^ii48-p^PF4|L8wyvCp%Q0 z-Qr@G|1>3~tdJ4Ga*>sqBG4&ESob(X%-NV%D&Nk6{?po*cl$Yt zSg{#N(8C#{3m!sbrBk6}SCJNXX1tp$=fLj4}c9T{4q1YHxfwmTvkZr-C?-ef$ge3o4B9{@{K zU3&c(@gO~bk)?@JE1DF?i;S76LDan*qi9C6(ySayI-Or0!a1Y0$V1;t#An8DzN|xL z=^Ivd$h;jd?hs;Rgf6FB%^LQ$M{-f3VIg_fU1GvBbL%^l>2YRlGsbPIe%R&F^YT)C z*HOIj?ib(=XQh<|oH>piOVCflC1_i`8i-%Y4*e4Oa41nsX~W+>c@4>bU(V;ldpNJ; zzu-ppHE%|T>>4wU-;>6IhkvTKK<*;1ng|6cDi)-Gvm^Nej*!SZwXws3+VI7*XXA#M z>*@I7Ae`>vP=oPi_!4Hg(Ak{2H@=wtYxDEZ<1TjO}MOM|^#FIGAA_D;~Gq zJZ7$H8#0un!^iB8E%4b730ikmqHB6FWHq%AkF_LVHq}%LzQ|_F{XpInk6cJ=CgkoDIuSCT=y}j}5R)ROL2hnz7W8wE zd=g}kvgg1)yv-@lcR$@3kn#6%0`|xfJh~i3fA9X*2VfI|?~Rv3aPMA>;Cr`ABf0m^ zV-kFCm@>qax!17 zq;~+xEX;DQDGlg<&mPt^2OH5I1?EgkY_uZwG~iTMM4lX4?_L|jFtvHHJm+%ipQGMM z@*M45ueE~!J{EkDw;Ouf*q6(=3N--6L6&u0Ads;gp3KCDXSWN)+O7h%d*qW&n)U8pF5fGDIP>yqLzMV{_KPK(+QN0d zw3+>v*;goBwtB)YPy={fp5O{J3aD;fVemWcwX85g&wi)9Fp+z-_ZDTG&_R49QLxW^ zsU5EOd&sguHf!za{_G)--D@e@6{Ofb^v(2Qj!-sfnfHViF}}V*SEJcf!lhRc=gfnj zltlZxusA1wPU9tVyb$;QKL2_?yfyxfwRWSDYW;2L5(mPukXjaIcwGyy6TsTWFDZ*C8Met4UpD&#fu65%f7bgH$BY3i|AsGns_ z8ybDfr`opa=erp^kWJ~52J(S2wAvm@8a@`23749UblohWI!l)Cl4M%R*9|qc*B}Hh zEXHaYU1$6(S12Z)spp9*v-NigYrG=peS(%6rbZfoad%K<%uwa8x}1FI&{^G`HnZz# zq9wdq25xo)=AA)H}z!$=0}6PY@=>d zeZm@=t)sM7F8@Yji20m+PpWC4EBlK-Jm+zSQt@2hTs$8o7sK1hvhmNG%RijTbLOoV z^m?6Q<(Y#QoK(ZXbD9F!y_`BDZ^kEYt6LUIBf&QU^nzzN{iaDYueZLanx2uMh|Dr# z(2gHU#YlkRlCkG7+otbh82{t1gU*v8DP?7)k3=oxjI5y+uhGf&Fk7;Hy!bopG(~0F z_3jG<4)_Jx^{QaH5=a9l1I6f0PCm#>=Y zwkdMwSY-6|+xZ0If(o(K;pFW0ItRQBz*9dTLL!25%^{49p%mmm$n;3dKp|+7fs=@h ztbEq#&=O(}0Ko?(O{(ONr=u~#!e#&*v@2)sXlgdaf3c9e*|kC{Sku79~XAIz^KbQq_iq_PC-djhejY;fom19 zExtw0aKgZ5IEELftxx|`C3~UXIy$>QvFF9$pW1T59tTDcG#4ZAXNLlG{$l7VHvnDU z7;X#gG+7Qu!zBpaWX4_)misSew{u3%+9LFT%N7U?FxJGP<5TMOo656r4Kb0}tp8x_ zQW?mqzF*%%WoJhhCD3OmZ~8VzXJDp*J6?gAbB~Me>c!&{w^!0QhSBD=CPZ{?)e&K|u!v`(jhqHUpcyn&d3KhM`h72+f?{U7r ze8Ky*1nB)H^I|zc%oqqmbD?k(7zmkPY+xNZ2Pmc(R&u0`@f!czM5&Z_XmSX3Nb;Ql za%Iu*$l`W<2C9)|-WK^-2t7yzEg`051Vr)MI5{BqwZs3XGwGmje+yzf)=2+$s){>_*Ga3Ynp|H7G0={ zg>W*KNs_hDIYeE3oth^P*GaOId8J6T3K74G(ryK+9luuhI#L=9&!QaWBjXv7x9J5q!mq^12=u|?&n%Q-|{ zlv^}U<`gB>jM%a&Yn&>fG%ZB_iWz#>IDal#p3W3%Tjc$&=z;pvBAHKzus|WpK|~7* zoiIAsU-Ih)c|XX9EMLYm!)%(=DA*Q6a-)Xbhjf7$Rs?aKUkAkQUI z{9`FS*3I^W1vxZr0*ApY|KqRLh|FFX?0E6h4J2cPMQGmVE98;EW*6~3_+UX&&S;YS zG}VQqg~Ov?V^Jx6P(J<*M7{Syv9Q@{=T#nP4RNV7&Tv=}*3~wbKCf7(Gse`_+2;Wk z_n|~ndtZ%BR`<6?@$KZouh?z#>A1gsY&Hx+vZHreVKSb;EO!!^Nw-YhU?%YK7F(o#R(9 zAUQ-e61`g;H;0=X&kkHOC0Ud?aT28;EUnJlsd!O1Eer6Q*?5x7-|#IYoJOuDH)-szQ@<^nWAoV3nFxCb_YNKeg3uXyHD9o!Qks>CRl7|af)BDU? zX&ruAdEN+69YjA_O31%6Mq#rDQ46m9v@zorQ0WjM-pz+M2$Rgv0T2u6aaa4-W?KUz(H~Jd{vx#7EtD$SsF13UXq@qcY#24E zILm3WSR6DP9fYQFBM#8~_At%tuS+0;-D|anuG&jAA+N(Mh6pVi__rbB#*k|fA;mEc z<*2-a1FPW20OhUw#B}*>4rJM+?M5WqAHEug#TszbhLa^0yXvV?g1D}+l%sbxlakNl z%y_^?ZGZEgBWY5?)n`B{H?W=!t>VBSM_@hh;|8VJAVuQ@NQ-0>%twy}P)o>?tqdXe z#bH$!F$wPrPQ|xJS{UFP@`#L-vlO)8Q$ZE_Tf{#DK|#hTBZi(6gi{U=5J_39xPLWz z?0gVEt9gjLc-FKY#z?S~gg?Z(SYi*UM2KJHaNs*e49Gn>Mm!Rigeo=a<-cS%3cn+=nFcINE1RA<@7&vRZRiUhuhq)JPB!glv;YCCD3L|x4 z1#3l~5@Q5Ln;IOk^;*Hx8^cV@rS;l{dUA1E+PeWqtP_{5^*aTQcXLqv5#F*2RkF(U@Ltpp zMhZ9pT7?8Uz$Vjmy6{?=*&1j}dU#nGIbDr~>x*Z^6>G1gWXx4r$rw~aXnm2z0Ik+k z0kei8bXh760*Mw~t>=K-f2iV0eIIN*S)7!~SF$Pt*%mK7NO z$fRWL{sSe{9MAY`)V2_V{m;SBX%)xtFd|S=f)YfhG`Gg1Om!K%DdfBbx&ilY8zTYD z5$pARPHcQ`PO|vgdA_&@d^g~eACJCi(8DSM7ur$$dG9Koh^Q6iqeTZT;GUbxH2&0! z1eA{q_>FnLzXk<=UdURthV7xfovh-|w@C08uhn>Csj;W&xEG9Bz^~@$*iivL zPmO*`a@4wHy{BIMT}Z6HU^-0`1nY+J7OxEns0t-Otj!3;3ef?mP};AmRs+UyJziD^ zohGypt4-Ji7Kfi` zL}-+Xhr?soEOaz1O=5=4A$(joJ3_7w)!d2F1k#m+CzJ{o@O?CB(GK{E6+>~!~Y8Fq`t z?5zoqL%6pjgd)Tal|Nm&9U$bbDiCq3P%GX~>5-9_vkmQcS!&jpZHv}Kj4}CiwNNtE zyj7JO^8#q8$>!&&3v-q(|Y}H$-g<%mX4y!H(#(Rg)Vfw958Df^Gyi zF*PJ$tBb3nlCLRNsk)#3Wdm#&GQQ8vwpqW{?pf6fbWW+~P*;i8d9TEtK8;#rDcHE9Xu2vB;7?cmJh#g{|q^j)#$3H!V;Z6uO%;9^M zT5G+#6weFyA#%PogwdKH;$lcH(l7FzwEVM?I|@qcX0pCT^41tMHH?geOqN*7-EBf? z6mdzO?l2Qy5Hsq{tyhU~l?71+i{o%RlpntsCzBE70(Ck037O%of@+~KNg~6=CTO^h zzX)9iC%BlMBk0re1}*)KtUE98c2NDdIU?UH!-|;!i5O~$zt>jGST&ToHT|0Xa-?^| z$!&tS!ny0|hmZ00CNTB$>(?+CB|id)-%9gmoZRqTV+H+ClY-sB>nM!~M{Z)j0#?t4 zfBy-A_Q;RWuaIyFWUDpzw9Ju5ZoOgjDw*7fO6u2t6rY&}X(*amR2Ra5e=&S0w=h`J zHg1BgoFrpy%oq0D_%u6{_Vd5J`WjuTvIgSFVKjz!i3brmG;4P?XY>q6H@{|L|M^?^ zd>mi3G|D41N~G|f5nve=YYLw`8GrF^jBH0ToNS7-!4hX+C`xwDpo4oJ2mv)aa^BJ> z%n1+F9bcE_}RRIPVw(jt2{&m5fVb}M!LvL+(gPy z6)uuOR=+^}y|8SH;A=ahrBswr#5M<}94U<~5K%=H7n764oBhy2-v<)iAkPi5k}75> zUpqtjz8sAz!)Zkc{BUBo?YS{yRo)HfQ_z$QMMP-f3WDd)U8&xdWXu0hly-%9lOqA! zQ!ab3JSZb@D{|FP=0TIB4PYT1aV^#HCmR-cf>=@Y7%z>(C19G-L`qnfsUbCPlF>CY zDQ!xn%~Ug|H621_Rps0fDz}Zr=I1mKc+rsPNeQ?0;)%>GvJ|sotdIb-hE{|M^6c!N zh}NxN&_aon9Yzy5QmKg>Ol~wGG|bdU-Bx%oRr;-L{jG_EBHuGkwKX`Tf)l)HlS@6+sW%pD21%d2HbS0K{Y{wm-EB zZ27J>9QPX-l1s_K0}@+lfsAPM*%TF!?oED(-Mj~v1R?2D4(n|_gIe}}itJ@KL47#i zQOEl`%gVt7Fi)WWj#U-I?2F=&hN!6X4xt~*`YnoXS^Q=-&H0782HRLfd10-Rp_O>u1{3a%y>7Rg4^bJ1bg=8({4u7WD|sK(JlYkSR6 zK7r^V3pdNA(a>8uUf)2@!?$>vd9>5~9G! zz4FgOe$SH1JremV<7?EM0{ups_f=B48!v8QU%SWUo8fq#j6}v#{j>vP6B9@I3l!|g z(Ac~fF z683eq?_2H362~Hz6y-%Z-15q{i8fo6hO&7Lajm>*B?bLTo~s4CE#xylk6-)DI~6_! z@R_@T5b8o(Vnz$B6;OMlhK&d>G&2$*Rw7Hi!^_`VcINepvH(BBFExI1k z`I!go@OC+)?O>AlMyN$HoI?#pTC{obm0SodIeM*PA6Zo7R8?8L&}5~czofjEdj>`n zRslgBxVl(JSb+rBevnK5l{OtktA#jKaC0_Q|B78mcmmvh+PQdi++KpqX7TrTQ)FWz zcVKxBhKpit1(F37S7YL`A%F0CbZneg){|iCY$^3yzd5UL)uEJ;gxvJ0l>>`vX`{~U z6Xz%|vz*^&P%XdZtNEB$=1Dmj%TkEDd2?2Vs)ED0-Lf_L5YBRAv=>vQ35;uT6*6_J zP1qtM?%bsHMmoKIxBY3I`9hL${KktPr15G2s(F5nic{E3x+8R~P(}07Af@Vv%d&6L zpUFO#u4J(o4eQ|p#=aC`7DDM_RRF>XSdC8;rVFI*YqYO%mJs0*OVfMS6pi0QuKQQ_ z-;7}N)RwmPvxpuPe+s1~PaC$DKm(i`c>J!ViXp3Rc&W3yN4u;Te2!MfuAc z_=%--0rM5J5|6(_cKU%XsBJkts!w&2ReH@9N0bSX79qo+EUqbiYV1vH#|O#H35<%a z=o4HyyZ8DC1z`dr53rW(C*5e}ZMNV*79CKs)RZ59Z78A;#3kC`JnC_J0>?0W)GSh% z^c_vSF-be2&gO#UYz0?lX>DOe@T(tecFclM3q59F^{*r$=1VCB0zJ)|m0(b@M5c?s z!(t$hcE$|L5h|$h3T0V2i&c;_7s=Cw2ZhJ!)~f>v(;E9`4R2;QZzuzp`{U7$o3(=L zT2Z-D@PAGe$;?#_7Q2AP-iwGEb*xFuiJrHgZnW5HYjAp^M>&h;UFkcb5GsejaNO`!{1v44_) z({qOZg-Ul$5)^DOF&z@@k!A1!kr#s>5HUM3h!k&zBh;~_ND(uOIy>t12pO%CmM`hW z21#SDoDE0Nm*w9ky}@8EdZf%N#PYg!9aG=7<(gXM31&acreY|JaTn3J_~oC!`{r+X zjEGGDQiCZtlZ$!zKmVJbC?MfE`yw9!gdq7keo}aP+!5ofhnF+RG-hV$G&HBa#94E`^Wj=cRR(By*?P1NaPrwc} zJ{wQQ%lkNT+M;O^l=~y`GDV2=U9evTzcjB?M0tY-H@4NOSzd#Su~` z2isF8f@6C=H-Xr+yhh~Qzm6+{5-7M)BcG7g#@36Hs>C zs^Wg7xesTJ!79Uuh(dO+O%H9z2`ul!B~0(L3Cf67Xq2DdPFU9{b4n1jD$DffP?lez zcCVN(7gysOHQMbFXU(bh$7sOR%|PzzPg5GbaVo##e@bMwu7S{BvB#2eiL8|Q>{=?+ zTDhqL5lVa)7fCWQV9F!W$A*>?SaoV;PkRh!v2J(!1~ z9-J>>sG2w|%fYdTts69B$exp)Jv4F$Fc0%JZ*F=LqaZC%rvf3-D_b;5#9+T#HgqC0 zRTH5%w@{#_Sxc*Rlc$znCz+*!7+?Sqi%iUuK8OHWE}LaIYP-$pMie&drV9$P=g=_< z(~^?6yc1TuRXlSdy4AN_b?NSLxAhe2_l7AG619lJ+;A`|oUG9%tqnAg;PYhSPLuu0v{1U&<0omckpoIlB*JdwY?#SMRIYch&xBMhQL;+$r>% zP)1nqcmxe&I?_w}D;6Hv&n};QI>&<`hqNomxkS`I8#!^Ybu88~A?x~M5j~nP?Qb-f z@e8wM$NK#9=v^s88WVdx+bb+aw7gnh8;n7qbUbeQ9;GS74KYzq<+u!*%;Bp>NJ{R5 zR%1manCkQK^LNSFb7RJkxL$)7Zew97a#Ki6qS>dcy(&YD9h$k%N&jF}Wp#J50MoD> zvqWo3QlBROjr^!0vET?Zctc*eG zvCd(ON^UvwVg1%x4;e0=)F&tXDeOnLF}9FMxZ`Eu>kd;Py4mDPP${e_;-QjEZKQn7 zQDJ6Yhwai;pcW%!+MzF`t&uN@ugm`uy8{H$rz!X@EJ*4HqzoxNE+%-w;swc?Lo17b zgvCNWqq0~^0l{zz4qo15;<$%UD&a)whoLZfk{_>ENsBVqT*257I->}aw-qQ; zrl|xyj40{2JJO_|*)!6l9}bbmEGvsQcIWK=?iqF5sA>bs=>6D*{ZTmQhYpBa8n~Or zVO&BvU5hjt;`f6DZa7M3BRTj5k4Ru0t8##immNv~Q+y?rRg-lcaR>?q2V6Ts+Js12 zH@;f*#13eO`5=;KwuSiS+rN%+A;;&CFBlI#hRQ?b+uA9Lb zH`VdNrG zWfi|OGi&1&@&H==B=tjIX-dDr(-A>I!Cm{5F-LEJy!K7CD1?Ug)S_b<&Iob7k{OQV zj0f8C!7@-8b2eGRhFF^q-~COl-PPUIhVeMV8Zky}9XsC16|~z%0R|(#*-!ys17o}; z&RfhSt0k}k%rX8`m^+fWSU4*`VulNxrquEhNii_SnAu34UeDFUe~b3vCOqC)xOlc$ z`e*p!=hq)<$Ni&b^9h8^h2+H*S4u0&XU!?^5T#SsCM4Kmc0Q}~lJ#z=q&}KmGx8H# znrm!k((m9^^P$mgcb-H5p>UVLK89!qgwBQ*GA&$@Ab zMjPQ8u4DztMntg^N%;3xP~xYuK`twr&e@E#-&;Y=i&~0DkZgVImpDL$UH#q)>YX&! z5W}ZmsbI@iP``J6vO)``W9Lw@;)TsDll+^|u7gMFkv!E5i!{NNEz{@9$goyhhcpoF z)wEUyQ6=g3&QFNDeH6(4-uVeppk7J?8aYIQEGZpCT03fx#nbNmRQ=nGMI9?pu~@I4 zhJI!aRPK}IGxa}+hz{SW71I0NW~cS!g!D*str~eFd^Z0qLR8t+sql@}cJ&}>1>_SQ zjx&~aCU@Gxe{EAQ(&dXAT4lU_3oi09vr z6%g;*E;1F|PDPtA$|llepYsJ}8I<)6iRT-Yds-!RV)geuM;#?b-7KD8%@|PcEJ}>l ztbDIg+JRfnbIG{*KMUqh=dvHz<1`GI_WkQ7y4#prR{L8lJKlD+0pB(C{MPbX^WR?(%G}poJ^U zCrIS@vwn{TwSzy#X0hTn<1N-okZT0IL)QKM6B1;m=Ea5Z+QUZ%eYH~Q`z@T|D zi#kFX4akBR5j_lx%D>|_X670CgGt(b%UYjteTuLlI6FB*`;@&JyJm~;#3pUu<3vM* z%b}ZnwDC_=PdZ>4b_!%6L3lq5_l*sBHlCrlaIq~C_i2apKoR>2wM5#8$&_RMUAd3C zcx66#Ylr7C0ufk^{i%{nh!58hi6D`t6mHz3)Gn1oA$7p#j{uX za`xT*_ogvDC7%pUTP>}rL(LesbTz1ch2G>z9T&Nd0WzO}DnWTxgKOY$^5~Z)x7gMM zh*8Six9elLgYpi>72CfuUpSDoRuTTZ6qSWoA;+zFfmO=HQlUW5!LsH|%qP~A`{pO& zEHcfF*oqCa`lRf|n|4Xw;!j(74F7GJr$&rL=nPN7C1Qwg#N8}^F_nv#g*1}nbq&*8 z5o(O*S_w*+bHcoPlsO$a>xFaT8-v9drCTTH zC&@_k#dFQr_3Rce;fqG*(@XbE23grfV)1G@n~#$PW$K-0gQR$V>-jW!m!Ad)LQa4a zxIM7OshfiZ04%9#S&Fpde2dIIU!IFBTCsJ{IcNNn%OHvDyA>!@j7UWSb2M(5V?q+= zTr5Dqir?))(PEN|U2(Pl^9;RI^lxCLRA;@JQx1q6D$T?(&sv|ZNd!QTdcxMCpGyI`SO5L54Zu1%55n2Pj@v+3KI((m7>=@#{u`dDR z))KT8LW4a_j`?{a0mNHVC|c=aOvI)@y-AinWdT%F78%?iq?HC#dWuRAZYHT!#ylP6 z9s2;tnnbr4$+r|Z03pK^tx#o5Wnjqr0A(`0OD0I$EQX~QpzD)hjh*}sWvWp{m5BwZ z)zpJ(mM1H92Df>&gyeHAGR@Ng^aK+_`Y3r3}p_eFpCNcoi;_Q zK$}UKJr;|Bwt`(iI}A!^95W4=gAu+ zK)<;izd#vD73{AMdKnVLFC7rgYV$7smu(V^^kS zl-;$Up2JACwtjDnW2;;fo>OCR^_chsm2z*vDlKEl>5s-XVxOa(1f6%SIDl$ItdvYk z0vco4he$565@K#&3Jo_lrUHhH=j_d5cjgY-R$k@e1A!k$O;Oto2lLY1@Z3gsqcBWl zMElI%21RkQaEQ}|vjm&hr2{`_YA9u5!Gm7mSwZnMg5 z^?QAfg;c*cPee!}4!SXJt2r7eUs_<^jZ5kb@qqs!e%RPBmn3rdfT~fIAV99cVnaX5hbw=!#k45r!(&$(5D~f&RaF49$Z^&T zV^}IQjY;_BM;l!7s8p8y6vNBfsnl+{_|mG)3eYo=OLfEzpuXe40(LZ-yF&~@oe3Da z>#sl5I=#*lEI>nZ@I4)qV5-R^^|Gq1f^ChF8chRQ0#_DxTi(RwR-Ymc@H=40|g~|f2K(EqU{pC^GiO8?E8cH<=OC{S(ASn zuo4EpyN8Fh3QGSRRM}q>5d`4LZk0bbUpFT3R4f?c0U0cL_l9**tA`K*(h*-tTA7-A zyvr!^XB^qqtZgO0CMoh@d(asa^vv@S0j*Nhiy;gG-U8+-`Q<#M>S?pWEoD&18+pTb z?!BC#W`zV#I1+q9aWZH6mhRu4%7|wt+&T60tZP&kcsf>{u)YTG=L?j z#up6@mZdnsKn~tQ!m8y%ifx~NUcI?Opa9Il3yXjhAqq$mBIHp=lj$zOxpPgt7D+N4 zEP&R@^aFN(-v`D`aZhKY1WAE&_clvnO+*0_BVffxQP3!6w}iG7$CyND87M6(!~~>t zj|0h$fh56bZ2pq52ACk0*wki-YP6d~ zS&AB9q*P%k)^oKN(P|}^uvA(YQXx~2;3XfAVh7LX8d*1~F|XZBZV?tNkw?bDmbakg zj(wqER{ie2@`|w2Q@DYinH$5-J+9D7*i?M(1%vLi` z1X}mhhV-2}PLb8=_gy--)pFQRuN;3Z_taLq1Vatl!ks*YIQXFC*CLrxhrTOPd`y8F z?WyQ2FNGW|Z3|#)WSee`cms?jA3&KSS6AJ3wTG+`xjLx+$fRp%F{nE^yqEEY zsKxHK#m=CiMMC{0mspRb{a9-`+j|=PuCcw0(v8-5hzIVaYqVSO;#o^#;8jk0l_U~k zo6430parTV-cCl}BP;L={DPwY*NMb$F!B>dJatHzALr8X{NVx~jnQAF5C~)!?-#Xi z##kDQoch7V|7{%w%syObXChWCB7)Ch&*k4V8uGUF3Xti*bAu5OBLBVoEfx@NF5!M&0b}YEEYpnQNtMd zDScceMmLS1-|&=L4M!}l0PLTWiy^wF$#}X3r&vBM%+coeNtb5Zd`eS`3ErM)^YbEW!7yV zjRkQ;q2B}mkI1^~6VR+<1a0lcqY;(zC~c`cLx=L&9M#iZNMONmCOb`RPeL0a&uvgS zLpi&;D^#+GIm=|fwG2_Q+Vr;|OEF~l;1h`KrX7I)weA%QRGJLKP>X<~oHrCt~ftcoRQFHrsO3K_PJt3ZQemft9MKNS#I?LyuQHpfuS$Rb50Ma08Q z2nIeZ_6P(U*gt(K&P3&N*#)Ni0JiCYsuKxRm>Vzta(%Oe@L_Qw%+oNKJOq@cQU?!u zKBy*I6K4HC=CW_vaBY>vbA~VucEM7GB$p?OK8AHQT7Y@OYLT{(EP@gv6_u!EqMUsY zVO2Te30rvE7=N>eNxzhyNs18pduhqtDENtL` zYm;8{TfsSs&li;Ax?$@Pqj~+JVZAyLb3f0mt7&FzH>nNo2AzpRX;Kq;2UT=HuE5za z9#s(Ua!{{phay-h?a`)egmjtfOBb9Yxt%JRH5PZ5&Uey*mlQLzODR3DW9@fo7*f$0aZzP1y9G5tp3ZHThoLopVpuhp?ZVOFxd& z>=|A0Dz@6)5)Yxu_?k5Q6P(qqJuVg~O*-9$27Azwe2Gqje=QDB?lQeC87^N`|1%CT zls37)Y*_C~`rXun;^)S)qS#1UafLCR)&~QhFZ4=LFF*g>{*`l%=HzT`T&8T5&|C{K zhfyAIpa3akbo@hU8hmj#tyllZDvH~tzfiFPSjSN8ga7FeyFk)WYD&Y+4q7I6MLw(Ql^GFoOqV$8OG-n+uw}1oE3^9tH+r zAP72_c8*FKe--#&i0ud>s7l#^!S8!qg*{mCeAhi*Gz6q?$YU9C=j0g$wOFLRW4Cg1 z#O*&ob{ldDeTjQL880J=D2@6x$Zi4w)={19aQLdvO)LB7nh5!PiBzjpxb!>i3EVf^ zq~A}_-cHbCZ4}MtNE-T0pQJ6>mH}O$r0iX6GlQ^3MCwljvt3CdwZ71AdQTMus@$%G z6)Z3i`F_icL?ED6fM1gavvOC_Mg~2Ee}&sx-gcvjbR(ouZbiQq4TX^nRaYI?z%8XU zE1|qZ)jd$A-}2#65KsbRQ~Ry=LO;{U%g1G`QmU3B?@;=H{ie4Akt|Fs))TS9!Im}I zIy-~sCbJSTY?8xKp;$b+_BeCVX@ObI>6KDemyYf^Jf)i+p0$=Jd>4ic$r+<&z!JXb zw2+jg5hc_gqswW$g|StOcGqCgztimUmgw}MATwDmSKgs9goVkonCaCbxqgM~f}@YI zDIW)hC28y@fFB`eAyI^XDfSJ<(>vtt{icb8fHn7rSlOu$CWz|9)d{5;}Mo!BFSP z6#&VUWdnQbI5Ks5=x`cT>qqqXTd$<75-!A?i#7b7t-zc%_zfMh`+eHFqat{O3Kg0a z7{tL?-?lcX`XK%+iT-k+4zbZka+X;~MA8&cbiR7?Gr8_}Ck?lj`#oQ3lm-C?nlf!uBqC`nI8BROWbPWmi zeW$&xzXFX*=19bqLY|1#5EuNba}5I~ZP ztl6*vdqM0Piy2Iz-sJ*;jPERRC?ph!+s}SP%lcv|AxD7K6@oEBkjLqn=JeaZP~{pR zF!R~y_8f6oXhnllce$Xd!%!R4%gd5{6tK#~Xygd$1md)k&)9Hb6ulpT&c7Mbt$nW% z`8l6mqv)%Y&_yRPXkcpe;q1g6#hsRULZHlk$o|f+AU9u$Of%IENcZUL%*N_?1<{Vg zb#FPY9VhnRf5((T>dAK*)#esvp-aCSWp`VZ)YS>D+@Jyz_;Bo_yp~^7ep@2wqljqG zt4s`^jWW9#GcXKs({;aFW*RZ95sPVzo(scG((tTUcyKZ$Tny5=p5by8*l4cv>_*6; z$Iv7^40Uu^1jGlj!wHYwxy7>{&|h(#TWtS{ zM=F*Gh|?e#kcPJj0#9x(-tbTlG`{AK)xmi59zVwT>*98dzaTWR1e%s<`eyXr$qo`A zG+5M3aXie&{H5k_Mj6H17x2z2dHZ0D+%kqD6g{f3Fi1^{>53n`g^=N*v?E=smLss~)^X7zBIm*p-WS7)89jb!f-- zm+Cl9=U%I7uz!7?FzlNlzIx#Y`HcXm*;~k`1${2`(XY%iIy&Hnj29M1iZ4pv0pPTC zJP-^*QC2NrY=|#wN64bkf0gu0(MH>IU?oxT=>cuN_dm|;G@P0f$@$_l5|9!Sf29V7 z4tQj2*~q98vOG#p8|f4aIif-9Q7cYlR0~%EwAGv^*G>ve!>PT=Jxc|CezW^ zphiEy&wu4fenyHZ8n)NGyR!V3>3^`gffI+_s#F4G_e7L*zDa)hB~%9Wc`6J}ES*iI z6ef61Dry$cI$Ph)+$Nfj|oC-X5z2PFhJeEvZ%Sm(r^Okd)GY<{BSys=rPSpyTo(|I-Nm4Jzop ze_h04KnoI7%1ZDKgAT?^9D81XGEp0$+@##mKfcGuYE`8|miA_7QGzy{_>vM3_TydX3954klvR*3~+Pk^I*cd5* zoQe+2xgb$bMz4fYd^4)a-s;tY352hN=K{lU&+FU>vqxr4ykb5`c~Z|7_U1a7UmD3| z#P#5NL`B#)3bMX7NRkpYa39KFPPH%=Hxz`+Fd0=J{_p?zUwKhJ_Yu*jsI$dCLM`KJ zct`a@NU5k4pstnKg&OsE$drLFP3;60f|GLn(?*)fH#j(a@u%5`!&8>y9KTo`w0fq{!^X|+;_84}{-{mNLdolb_J34B$I-d%ze`r{q0iyu(iBk*9LkO!D z*!G9wrz-^G;9_=uyTF#buY-ypSbe~hoHUuvJVR(G^j2!o3Y zl;zX>rIoWZP~xe4FjXA~ot1A$I38_Rr0J}mTU!N1@B0m; z{x=^)d%l2~X>vcP(}{;9(tCtuU)R23`t5ha^H=ioYpkdCD!H5`m7l(;{eZ6O%USKO z$>c6U8v3yI<$OGx)E2Oe!Im~3Uu-sIoyCIX4_iR{Q%|KI95tIOKgK*1VYjQ6%^k+l zuWwcY=We_hpN&y&_x?c>8$Ubg4m)RkozF)G5*;|0&Lnv-#9EMjB`8?S4(^64Tfjol zG9+Nl(=3`Iiz7r*T-aKn9T<_a2Z2Q zKV`{Bf9~a{^WfQH2dWUBrmSP&)e%GLe-2(2eQ2aT6-%uK7=UJgN=j!6SCd#Z_f@7cITc54gpZdPP#N4o_tip|}nLZdWN%ba}+= z0irCkf>Y+f8imT>ibpnp4eNLeK0CV@on0iG4{32(ZY zim-z;pEk0ckFeqG6YQRRx8CXC&-flwNZsQe3$zBq3!JV1X1d7+$qmhf+xIkzs(_SE zoPWfp-3Do}(-xt8Bh)m~XjTSobk<3sc`UC-1m0vwo zWmhS*aUvc1=Y92{l^dLNuMZnlztwLj4k-cLzgF$jILfcSF#(Ll(mYbO=BbUJXdImi zp%-9NjvU;w`NsKhk;H6jFjkhVsr4APN=Nom|4_wxzUv}ivn9!>K4#?6gO%R{1-Q(c zm4*gp2q90u;$cSK+IW1@>9#(dwGpx+1|t@)raoZ- zvw6&{W7Q!s))=8d8rKxqWuk)^vqq>tuX@*C55t zoONDn?P_$mqMs3MzJ}mj`SM+|Kvd{I{!!^wzMdzEK~QO-GljS@oahyx`52WcflBE$ zjctT6u6YWH5GF372QzyLYx!#eaR2*39e0Yr zot>^7uE9{f2Y$BSEBY+%6n*x*g#9#nD9)}N?KgZ%aL7|I+ee_psk8`meQ!8WD|5#| z%!1rn_QY$mX81}2&X)ScNZ%Gw2} z7fvg`nw&u)?&MnoSa0%iM;sWJcQ+ND7D zw^iZmrb4GD%>>T6Zq{T=QN(zj83>YbAc`rUw8L5#$R^#zVpoEVf;sXkaHrY+bcQKJ zV%q4S)>(omrr{8=i@8h6C5?chqO}NQdZnJmae!@DqgMVSzUn1dC&f;ad0^Y8be9po z({CE1*XmDOlT`4TKEp!9mRo1qRUHlt2;!=MxDk(W|v;jU$Hs`5%>O<>piKAJK7_v)oe;);QISOAGA0dKj@z zopg>rUBp*4Vu&&UHu@CXQ70hO3!F>3 zB?>yO*9VOLZi2vm77}qYc~vjzqLtejLr8oR z+z^_zv#294@KnC)s^8k9AeiRP2g?7CZx-XlCS(AUhx$+uLm9(8M#fs$dd5Z{ zQ_^6CP~!=FN@{b7Q9A}J=gFO1CF1*5#5e}X6ro>mrf~l=9}cz~bFS*f3{7$ zg&lB`V8w${8`=BdSq81C#m}dCB7w!;MWlAahWIf<_aQYs_sMbdB6F{O)NOt`;a?+o zto(J}yGXhhqmr@z>C*xmMG?<_X|2*Y<{uh9htCh^eE?_b1Cn03!};e5XrU96!$4em zssdi++rKfY<yr$ zhImGbV_srk6Cs6xB@y3Rba?kdMxh?0sclx$lGG6+Yi0NsDUOjHk3Gifi95zyz`Nz< zQP=d%I+&hE`v+HOpLfu#HUFi?F!@^J#M)=Q34b<9l6G>GqQBiJ6PVaz{yDBKm$Pfc z7nzCERAZ?^G>1Z0!ysX^7{0ObV$>sPWl!DhYh*gGm)QVrMdWCWVfGq1Bg`joS_(A_ z9go|sGv;G#wmR@JTC{hpxgsf>5)`F>X7%}qk+ReQ^Dx|(?N+NzkHxc7^~9&E5Ys(m z^%b?86$i;-k*J34O%Ql<-DZfM;n5{I0indL* z!Ot`{UR5J!)hjn?@G}k8RmteHcB|cMpXjHIu-4tB&mOP;ZFPc(Xw`0V3;yW9PAD!nufA;F)4L{Cz^ z%BIFX)UOwHtAs%fyq_fMo$45Hr6B8VK8;c z#ULc?cK%@TgZoHZG%~N)-*&*82Qbk<)LeOo<)^2kAbcQ~>njeb%!bg6gxYCn-Z_8E ziY7^PT`RCFD-^d-uP%43d+2+-ER+zd5Ha?hw2u3qFnE4d>D5B2;6*iw*YK1kO(Wa) zNTn^*>-QQ;=lxcSaOwy{Kv-7ICPq~3;Z(9z@HUclsHM5kkZ4rZ%6BDn*bmsq8}*J( zy3H*J{M@V8a?%-{~ z#a(6%V=SyqZNZcI3wN<0{Ye+U{PKXZX1#u=yM+OA-CU)#%D(4{FwfQ_!1ajvQv04O z#GY-kJ=VgN={5VFYq#0!A8js>tedMOyzG6hy=MCn@Ks{0_C43$@$n;ol|fW{pJ}_f zMIoeh2q4im`<`m2-8GY0UcDBR#Y#%<9nWoH@|MDhya?;*L0P;8Jq|-b))(wK-2gvTcL7gs6qh0bo zHYm38Zu_{`+nnwDD?jdZnr7ukoqluog}0g~$DPMsc)Nw8zT3jP$IT-gL=;p!=pG;K zzViJY#n?_CA9c40y!Lk*?(Uu{BnK^+U7+diMuZ-B!5|n%J5n9Uncben#Jy9U<4&u+ zg{JTCNT=8984Nt>w{Z%e@`iLl7I$3lQU9c8*&t-#?yd_48*KK0(|crtv9s4c>UDOc zvfWnq#1fnSQGX9BKLJ~AKK9Bx{dRv>GTZBdsgTM7h@GAJ%i|KAZu@9Q6z{h?E$lAW zd(=NV2DU%tGu`j+%2ZB{Ac*RETg}$)lI`Q}Z@atW_V&8ReM7Qay?(E=>-OSQwA-!6 zmlONF))pGKFT!`4T^wXXY4^@dd!21eLOw6;9z)_*MC|uKYIfb3$3?`>algBTbmK3$ zeR9+R{*lta(9A>llqpTO)7nOf^cUQR1Y&q-uhnbrK}YKzoiz7)_Nq25F{eZycRQUO zX%E<^!EcpeO`&ywBn z9sIg&4tS^8*$2mNcX~jiM_zdkqS(RH!g)WDs{l=i-#;$+xu zYCT|th{Su|&o0gFyG^Zg+*N6P&r>_5VSKl#!5ylmkUdYWOUw0+Q#)#_$iL^QiEVke zsrCD?(Lcg55Hs*@Q#(0Agz_UyO)R#%O|9EJQOEh7H&m>vyG`w+f7}(3WY1F*^Wtt( z>$O{t0yQxN?l!e{A3OR8xF#mM-KKWZg3aL(rq-u^w%gQ>TE|@x0{4t-V)@!_YMrCb zqmW#&QSCN0L?lot+`Hr<)}-C0);T)rJqF1=+L^nfn8@SEM7wsJ=y%YI^HFxQv*YQ6 z#-et&J)cf7YV3w*$50s`186X_ZDYL&^t>)YiXUM=JG2k%1~p``GgD{pghLeg-KGX_ zF2djTKQ##gH?EIHy4 z0J5uO1SH)c}Pj!Tr_sgffeA9din z-*rR@Un)Cd8|-1{5ha4CW-6UCorFafrn!xkiNC?S3{S7N+EY z5C!)@a3mO|?1(22KzBwQgnyJAuLE+khttpai;^RDVQJZY7bO6quL zlpV3#?(7a#2>~cMVjn)l-ASDI-b;>1wy`_G5r22d5g~xJ_CRpxXf8P-&e0xlRUEt} zN5pYF*?o=TVJ$i09;{K2;^^2cIba{!=I%?Bq_&bHN{0T<1VFO1N{%Rb_B)R#=}{#| zlx+E(N0c0ik|Rpa`_3auZbHcsC3Ah}5haSc?1-SjyW^_Fj+PveS>!t}QDVKy4!FDJ z2IrqaRwW0Nl|3|^N3xTEwGJ9B1VR7 zuXB8aMl|}P--jvA{y=3{#sHbe`X@{b(I1^Q#3cIzfvFw$0hlL_(hs09hkfh=l9m4- D!O$kr diff --git a/public/js/home.chunk.f3f4f632025b560f.js b/public/js/home.chunk.f3f4f632025b560f.js new file mode 100644 index 0000000000000000000000000000000000000000..76c5f028a02ab58d6d219fb46075ff11c339fddb GIT binary patch literal 240076 zcmeFa>vkJQmM-{zo&w6QBLgh}yotJihFL0EF6)eCdnCDQ^-^)Tl0cHo5(uD?fG8e{ zZ!!-sZ*cyfN0}#?@7sGvWaJGbWw~UZQg>B}$V+6zjvf1c+4%Q6t?y=w)+8Mz(=2JF z)8pCVEMBIwX=^@7VqD6Sq;)zwOZubJ)%0!uc<1>3@q?Z1&F$Tz-3Ob;{eNWrAD%yb z_T#H({pI^*>)$v2k9L+!j{E1y(L5f#eag4y>3dvC#>2)tA3nS}==A5S?6m#n&G!9= zn+M&?$B%aJ-ygJ>-K3j!hTmL9D^6#*NJqMt$QlhY-in)ypnwwx_4dZTzT z0}Lk7VBv0Eb;t2C9vrWxBW_x|bGb;CtHty(&3>50<77Ozv(?4)kJCvqcsEPOt2y3h?;mET z@gf<2ixu{n_iI2^W@ZlEXgdFR6iT|RCsKYYj^S@yBb z$LYzM2ab~%Fio=3BX^el(>VL-eEKucBUvmj+Oki8U)1T`y=#lWx9tmkH%{MXeAQje zv3&{Nm;LboU3M-D@c8NIAIWIhkFzX2nYP1Q-DT$r|JU8RzjgoN?a#_0I4j!^c6aQo zJiNcN^GMIi&cjFdALv|vjmIG9m*u;j*R zf|Ig{f@7&Kxanq5emolw+}q@0umvoiu6Xcxo`9bjsA{@Q-z7YTI7;VF<>W2DRmy;i zY4$QXn#@j4z^g#G(L=%%XoB($uF}HA8ztgf09g3mZw1T8w}Y8b}y4fyB#99(y3PU4B2!e zj@`E(!Jm~gmyV;(Rj1QGi{}krutD(98}JpGumIDMhccb%r`e%ApwG$<2t4}*(8Z$> zDPcby51U6C8;uHKzDVYii$i(Y;1{o!vkB0~&?CEh_s$jx70GJhn}*}r;W*8NM&G@g zCCk^~A|STG@d;y@x-QpYWyjDI^bM_SA zBY1TenVaSVZV98tXKbOzaZ zJZVQi&XyQ=KA$Z>x1w(JpR?7XWiV=ulXuWzTH{%gwWj%lttph5cTgL!c^J2k*OJ9z zw&0cv0ZtZAfz~Gh-Z|mRkkg*(jpQ+zQOL_C}n@ncs`5VOpsCRWf>z`afiR4J( zTqxp%BbQ|qM`bAn1%f?^QC|txNitT#XyEY+R%9T4t#Q!IXH3;b|b_@TnX$zBap zU2`mD=So!2^b?!fk;!!tRLthtxfuu?^67y9D7HL#2W==I!TuOE=u9G=1hl@NOD+3N zuf+O|y0`S!RaZ#*Z2TJHdn3UFZS5`j01!cSlW?4YNI+x|+^{3z^3U1&djX3D$HOz%YM^WNz7EA~f zh2Kd;_)%5Ezq{Ry->0*zPyMPLZKNBH&|IeD0(VKr5R-&bExQ6yQN5xn$HCWOWpi}sqj$l|K&xChnF+-zl;SH{6s3sOj@w>{cyS%z(oX4N2e_+b0<$s~Tf0!%<8YyuoK8wg*mQScN-lme4Rz zX|C%Q)-Xcjav}D@+_^aWWln09BT9(qguHQ6d%7JxStPBC*$NW4{c#>om#yWjrGhc< zEn14(t@$Yq!#);n3<4@O-3({n0?oLQb1=4XJ33UGFl6$dpS*thJp`lto{j{;lqQh! zk%2`&U zdevqLp*4daAk!gezA9YkixL7ePyKcK|d^jJ+WmB$x-WXo*%!m-EO( z_6%JqIi9y`0iY48!!ZpX77?kj{Y|1s1D=73ySkGBp3csR_lra-r6G<-IIe_8vM=j z0Q$$hXu~Ol+r??tuuHp^?T;+K2Q!zf30Ln9NSodDMNQbnk#P!)b&fZS`!6 zqb@iY)lg_sYHJ-N83d72oU5Bj|(lz0yzn;E_Affxoq?X<=%#T)Xr9 zAFJf`B0Zv?G54~<<~x1?Lv`TK`C0en&HcsBpVIx)*DD-_@!OJY$^vXXvoxPw*@O5%F z$GL_BoFk2JF5&6K+y-wh@yf{w^!n(}k@(eKVfHW5=?~(08fHk16p*9&<&gpW&WMEriv`m6OsT1-T+ZAG~ zjdAyGFcxMI{4(j0?q2ceiJ{f|B@ya?>5^X5paLhU0s{pcAvazZH{e25ra;imhESDP zM4HS#_|4|syNWe;hWSkhru+U${21))iOPyOlQ3vBN2q+4VlkY1q@#8ygY(_H`Syx@ zV%PJdue*nN(pD~y2qAvs{}hZqsM%d%+5z!|(+k@m8^^Bzeh8V$2{LYTQ)~jJ{>o4H zmb_ZsZut(j`|jNy{IJ|^M%ut`_!AX(Y`$!(#|OED59RofopLI@N9$bl_5Plofxy6AGG2?X#PC5~eK#><1XiG=ZR zg!4)NXbqBlRuZu0{3@^*d={U~ax?(0nN!Yt839nl1NQmolapDSzAIRhmP?2t2pPD^ ztKvYD7f)udXB0^aZ^=p1Sh0l?FnB4?5I08Canzm1%hLf3$cQK0;H8a-;Z$%ZD)!?6 zW#Y6e<2ZC>H^wHOEbXVse|o}AO2c+tb!AFT;a9b@(ud0v)2la|o1ctL?iV^Q1PtNK zB-X+t&>Ua|-X-s(89@r(D_ohrGd;hAmFbGGjX0hL#-)Gi2g%NyP}xnVhw}SyIXkRc z>2q;TX`=~peSf_wK>_>KfT+ioF`LRhhY)^gr^r8UmSbEkuZL9CQ#U*RWtNwb1DY0C z_SgEbuyhK85IGUtQ6v>h1YJ!MQo|g)H~@x^bh3~Yyg+P%#JV^Oa)IQ#2t+(6jA96O zPJ>m6&{F9a5eb1dB0&|t7&uXs!`1rzOZGUOCUzJrTJ?2sA_AlxTK6OZQ3C@CvKb~= zK#z1oUj<&M_eHTI>e2|TIKl<1B46EMn2CiWQO@8dX;hf|l|g}L8Zh`~Q0Wr5gWS3jE>G>48jPp7< z=hE}D_#~;0%3WNl)CH5fA`HX|5D-5Q|8fV*s8gV$gWek|G}zery5VejiZU`}?Rsmv z#C(}=ceHKMIhBicF`Z0g~41HTgE7!-+01n--~f?RdO z-3vv}F#WqfROV<1=3cRHh-oH3PIo)>6kl~2pGE`4-_kKeHh(m6gwEXXn%WmkbJYXk3f%Ygps@XSXk<3oY3~> zUH2>m+50OhYo0|y=03N)_Z5W#$X_};R=rOQ)IR{&kwn9g7| zm%xMme0maf_A^HP4GOP0fk}wyGqLmKn+%@Y9I+^v;}5Vi5jq0wOBv2$r< zPkBe~$f~g}xMhpTV9>ph#ZAOf_qM$_M2eWRrim#5LsR;~j;y_clhy$(s0iANPFd>p6 zq$vSz3Z*9?05)dBvtf8#0|%F8tP*8j=Rz2PUF|1?~pSOhKvYuOau1c-dz)9jk)& z*}O;UJ4$l*kkgcI>O0E!Md*QHPucB*fJ|EdA^`>kUkYL!C^+ZY4p4JtZ)h_4;$ivXVR25IFCG?&--b_K4B{W>VNqN9Ki!vN za%F>eL*!`Z8!*>Fon6}1;P~R6pu6OczmNDM2cXay%-9J(>uOAjXy_pn zT>M9UY|%BcB`retHy=Ovh{W|UWeHX0P>8N_aPQ@Nx%Y}bwOCRHSOzA% zERtO~I&8%#`?rK^SZZDg#xBmpQ~WwzB0H;)NVp#{ex3nK^2Bq=*Fz4f%Ld4Ay=Kup z%qh*jwb&l~$_;JSKQC=r8YdWPjfIA$DkDiB}eLz zcY_&RorA+iP$mSrCc?Xs^Zgud!w81FR|QU$8!28i63?Q z8^Dr&R|kHN)B?Ca*ve~7cKn$W6Lk_J-2Y=?kDnvN);TaN!!kPg#K;;d)?gTrb z!a}`@aJ}g5a+6MI@y3o4HhBi-Uebqn^Uc`+wf3aWq3*uU2> zM8ifLfR?2nDj)l6B^*2SZInJHTcmsT%VL6<3fnY}Y&#IFLxwiN!_%efMmH9CgW(n6 zlzb|??g6hzUDz*;<%DQ}-Lg7f1=Lfx=DVScF_^#NX$VYx-+xrzs69@vSn%mqvz0hN z?6|yH8q=Vzx7Hr-;Ozn|+~}o&m+y&!m4#n}Y9Yh4^Y8E@U{l7I8KUkEe1#Gh?*!D| zAK^M!>&o;Lft>M(KxFwSXagPDf(>CZQDx_G~bF;OC5U4NrQbTrv#ogeY z62e!&rTHS_V$bKC$JThM$nr{ZX91ZN2#FqT5AJ-7>!^pU%u^zdM>)N85n>*Jf=~H^ zIXG{6neY8|_7_yJ4yPb^TRTAQuIf+)y6<1EU|BGoPx5j7z`A*5I3y(6P^M7fS&A@u zVpoV#Vt`@5qLogfP zWOgqlPk9q+5vuepuqa8jszi#X2s7O;S;-f&rVY5;^{+vp#1ujc23b{o#KMudS72*h zStjZXxW(yk(3Cjk+UvHQ$m$?U%1NDxJQx|u#o27ypTRKDH0m=gT^N?|Kv9F@WX0$% zmjnTV7{40H53*D(g5cFP=!07Uv8o;5I<^xq%G&o8Z|Wzf_hbh34?IT9Z(Z`?E;5|<#gjxlf>#YWK^K<7L%qR8f|qQv;R17sl!byMQO`1vr23OkieLnOwo^Kq*Jd4sQ}ENPo>m`@fk+8) zX(6ehSZW$in4_A}6R6ay)!54x2OJw@3RHFibd*fO{m_lBd+!Y7a)Ig!MNwHhDoD^d3UOh(&>#W& zf{X2BjXS1bV$SekN0{VHo&vQm1johW@#q{?)0H=P;)riP8IPa-%@7B#hg>3Zmz5*L zA5ZZSr-`KK0$xcWsO=3~^^7%ftki@4F-Rn@O|l!gHYT|p7V_Sz7zTbI^H0MK^kluO zm(L(AuqNZvzrE7Jx7^vnLsse7_5%h#g&tt5NcVz*A5=m9R;3(6KINX)qadbrgEtlQ zg{eD)tX`}jBv3yLT}1X|!+yU^&QMw9Uvtad+Hbt^3dTRu#YhoA!rmRgj!!KtldIiKOYXY&}bHtdU0rSLD%pyEmPN}u@O zd;1+2ZnOUd@caSM0FITcu0pw3+A032Lb$hiXPCC5quKZZc@*$wKb@dQO*>*glVtpS z%2X-yxR8^19#>%6>4tm?TAJpZgE3dRut;252s}?pkgoRwpiYaw7SS^4#1WuMO!`C8s2Ns~syWnw`5e zX&S|mk`+nUnV%L<*!2hI_Pcj+!<@e()dnnI+_9bfYn~qCt0KLweK_n!VcW6I%+L!aTYy!N^m*NS3xj<0iv1|-*X$o# zyDnsEOP*+9NwU!e7??d=;l+0VD=jEKw>2< zNrh1xC@lFsq-mn98^5@o_#~6(g2Lnew461FE-G zkSFr{Z?p(B8$qcUD|sJR39cBGd#;rV*-hK&6HLk1MFSjo=tuzd!|{VbiA|QA0G`Yo~zn#RR+rz0XhumS)Gi zlxAPbdxG%DzqTCO=;Y%_DYYA@5_;C|*!}&~ii~ z8>|n7cv=@IiHZ%Af8lkw7qw6iE*iAU!)@Mwgd^4|zI>h}Z}~F+UGwsz2luP*j^hiy zihtI;x$~g)mfEt!^@Qg$VJq;;hK+^Pth7TUle12zXCpw~wEV5Ht6Km`CGGSV#7TVg!Hu}F4 zl=A7TF*BYVt~$>5$D(SqtMv+{yCKgaPC=`H@}p%?&^el*K2{H9f=9{eY*K91d0RFZ`1qqEKN}g^@H1*W?{OvM{N+i!02Nvi?bgDz7a2esAS zu5c9iKk>x$t>b0wO&HvT$g&0B_tFTqgUYS;nm&udg^X?A$5aeddcl6-qXAYy%ISb5 z7Ore*lacb(y&8d_EL^F?DL80lX9QE6lhPrGp@T?9vUTnO^0v*<IPC0bh5pdNdjy%U zs-n5t)zX7Fc3{T7c1)*zi693Qo|aZ?EY++p!Z<`__HP;?mZPQxH(@d8AR{cpugKdS zOehI%=!0Sd3sQToet_g7!8Jv@J-4hDD|$PUJ{uyfWvUSqP-_siGdpg*x;Q(U zP43=}GWi1mK7|`>7KZ?n*<#vhfv-0n5c|gt1Zm-%Vo) zg-idY)mA(1?Yp@R{0F;IsoV|Uq5<8l(p}^wNSE5ZFU{m%Tywx*;O{H^_rr(M3#eX; zqn1u#>42ra2qZ>N;o=*cp@YrAhY#*f^yfdjtI>h`md@dLF*~dID07!WHIdkbv@v!w z&cWt%$QGuJ7mUfMf|UcRznp1?Ap{}xCR}#u!X=H#f(?Kd4=gL( zl0Lb<$Vt(QcrNdJ_zIhrJ`6d1?gs{Y@n&!?@~0-7cp+#TT#u^f+d<%O6XA6v7de?U#m zT4$?l**cBUWIAqDcD~(dDdl4uY}hItGTBC5T6c@&!-wP>=q}RQhE7vRAMV#4L{Qg= z5q2IfO_3Gw&%REy`y!eT0`IZ|XCz4TFHPE=%gNAv7(eU)CRc(cz?b1AJetEYw%}V? z$wdhgVo&K2_!(KO$zpjC9+IxMxkUXoye?+8D|CBmJnH*;RtA{DVmS5W1jrPel4 zko3Tvto(1L-Pk>tqnB9x)pBuhxoTrs2%x*t;uxSft9&DhQ{X$p>?+?jD88Iy7lF-W zJhP$LeLT_g$O;;LxStFT0c2Z-_6%)9uXPlXO|}GY+UbW6Zw|a!Fm6w~(P27$H+zdB z(YDr~@!_nypj~~MPiO8x#&s#!tYZ9>9U{=Q3XEEm4(WP|6vceeg~#Q9+S6cg2~w8g z`S4h9@pOowIn?z9g=Gf^HYPs{F8ybkOyIM5H;j_^$!J9@Ow>IYN?IoR53woy5pX%* z=R;t7z68X&2fyC)7a@DWS61zd?jq>b>QRFd0u&;d-ctu*$_Ea%KOJ}94xiq=`?USE z{Zkvj#lvs!-hB&31u~i{seKE0;#6M@-|9%OhVS#;86F0I7x(a@lP~542=?V0v<8Ef zup1c|ApXUM$v<>M3(@1(b2Z-LF=h(`O#oB=El^-Ixo-^Pmec z4GC8^jp=Z@57Kvyy6e5|1MEzEjIGh%J9t*u z9>#q(g$9Mb8rnlIpp~!l?^EGHb4oNeoJ~J`fRK>LMh@Mfw3a?Cd;}aWe0rGV3wpu< zOP?LGxuvWvTFhq4=n8DqGw_!(Nt-Hwh?c+Xx95m;>nBzx1{HwL5K)W5FTx8hk~a%E zb(vGYQ0Rhsp6O|B0K8*rtKx@yT8QkOH2X3B5imAYM8}SYs82l|x)C4?XnXj*d-vk6 z-Lre_0dG8<49bmbS^%a8X#to8!bP7{=Fr*Qhtz2|(GB&=-JL2bPp__Wwv=mjGb|1c zTf;FyJxJ&fxb3K%2a?tMZrpy=g|O)D3SQ)WuNhCdKo5Q&x8K)4d|vbLxif$B91d4_ z6>%e;ZGPvhD&qdnD%U+=bKI-Zmw@{P72F_n=MEGD=!?VQIS`^UHZcU-Y1Vm852~hW z@35&Q{WAn|7rt+hGdUF47f8DMwO1jMyzjt51p!Soj>E&@`z|HVdKl12C(jWJokVRq z%PZXEtYTFP3~mIAPV3TSKsIdczG(j`AE<*b20y!_Kwxukw@jGF2cCq=l8^(?vmxMdmS$#Tf#?M>?N4oLYw`k|;$FR?mA$edFk$RZ(My;l z7jY}qhDWvm@Tic*TQrG(fnpz44nVDd%^`%5a>PsPv>16HayoHT1ET1SQt6hT_d$eD z0zR;;W&wB{kyebr4#9%(=D^!3Qqtt4V+0n`nyrd0;LwAaSxsF}P5=k=>RzOG(c_(KeZ7(bcE9lQy`P0C`)(h-6c3hfhLJEMHo1`PjY-2vY3`LFbZ(#la6g|HqfBzXC_<_inqjWTnKnTgky^RTB8yvK&)|kA3(fiW1E_NjHc%p> zmSr4xq>0-&p8jMnj5V7~wcxjhkW!U<;7P38Nj_lUqC!|sap#J0o1E_$Oz+>P=n z`VK;}J8?KoL9N*^*1XHBE3%yE2pacWGIErcr~D#%uKdPvhIS!%^|crXzlN%ie@OTh zT@Pw?f*!Gt^fNEi!szPgGBA+b7{(ksIWt7Nkb>2aDa8t z0jOO6Y$O=Lnq_9?h08^4D_%C4nl4kg0TI1&tJ}fvPux5GWs}+(?repd!#%KvSI^;8b)c!-Y9TWIJ-nwk1-g zG%H)EIf!7JShfYXL$|gL+9yb;Thx0Ff&gra#jqOS0aS9R+Pr_ z7|`-F>1IA!g)M{l+_4ntYn?W{2m?ZIPb##_4=}llnDEv4Yz=;5~ zc=`+(9lR>j%cQc}58|X7$n95f`|-BxO86Z;6sYSuvTB*CI&|NqS$dRC(&dGljE_NZ z7bceR=YD7N89H|^4jIDhu1VErWN(n({Byn|U(DS1jQTiOL)CVrv~ort_b`= zIU8Z#<%AB~r;T@;8yRBTN2jQ=4SqSB263nVMeVUp^I~EEqfCjKDl!EJgBTs=Cn)}+ zZL*v8zkSkavo!QFhJVY4%YMpfA21}x^-MBc8Yjt|zReU#-{?}wu;xu`9~Q>J&?%&> zM^A?%i8w4g4a#PV=K-eJ|NiQyANv}$kRD$sS5_p3K8v}im;ux&>0$OQJ;^S5P5Gpq zQ>U7_NLW|qQ)lO+pDPF0z31l5qfbI#oH_{8Z+w*HqY8?D(#P~r7l2tl*@c^FmQzSZ z2ujoJ{7mCuWA0aUt+WF^Q+IaH25CGH&u-CCVGa6(KL4u4}8?v=F z2R49dcH7o?x-sgQ8C?DdH3gbubTOpE)T$XeDeGr?Qeg5|FjqL@>XXxG^2s|x!Hl@e z)HJw++5D}wJ&+!7)cf*vPz4u<9oQ_M?BH*7MF!jPRI>O2`hfiH>B!-ra;vCW0V@5ujtH zmy3gZ9Um1CL6USFoy)MgtZo4f`soPmcDj5im(UT zX}z9JyP}V(nhkZ81SwibgChkmx;C+V+DJ zzrsTokmkOdp98H2HM&YlMn-jn>zg7Qkp0+{iWD`%;WbSCi3(p5wOw2xOw-{^1!oae z4!JoSEmHAI8{#=$ZQreXQhc+3C=)tg$T7|#qA^n>_6S3xT1o9K=ph8tpxbbNJ?SDb z1o?>$=VZ*E7+M#g4`m8ez)#+Zx>YwzU7?>8bdm%vsmiipsm|558;;|fhKd}dG>bU3 zK2X^QTvr2?ZNJ82+p=Jx*P}$`$l};(dTn_(3T$^xiM2vmz}CfV)jE%-5(BB@idO`l zZIJ91V^I0XqQ$I7ROfdEIKf1u>Rj|x{`F=1k&{jZ#Z`4{y<{dZqrpU4r$L5$hR0bL zhTf+^#Hsdl++I(sdPWcdD*`#>0rxuW3X;JU;%$g{LIV`+qLF!&RTx<^lTm_N(FFbo zM=5GV6QC!}IfzVgCGg-#fLFjAr~nR_yBAH?rHnwWP%)X}CS-+BvSPx9*q(NAYjm27 z-pZEiiHFNoWr*E@mGoF4h{UxLQm&O`QvE@Hh~T4tf)g9$OqeY*Z@XLI;kkzD-}aZ3 z!J~{`mJclm1c@&c=|b|W`FW1iTM9CkcM#*xpQ})C0ZsE8bEvLOXa@=DSAgDVgB%SgS4hc<@ zQjSyTXx~-pK_VU7%)EptU0uKXW-D>9hk1!DLE21QbT3I{M6{7^oF_*c1WysSKq2Kn z6+PK@EktZ4+dyDNr{K)8>dKv>6D@4JFIyRj&5!$Ad`TYi1v3YQXQL-@H*%2HY=q?| z<8BL)8$6btA4ILS{a2c4HwPY1|y%dL{rI>zrkU_39uzD>~0tA&e3P`L*m2$y+KKbN?=}k`5 z4pYfc)PmtXFfe3)gYUE*os}<~GN^h$+dp!@C;e|h6Ip-cI|lJD%{1S=WL*&WzL@fm zj$qe>4tol|c#6gu$g_wqf_p5)5&YER8uL+qRdHMw z*J5?+tYLOPO(D;S2}g(5yj_IZM0+KWaPlWLeP6sJfOzIpYRV#BlboTJmc-y#SvoIV zs`IrVEnM=&feIj{qI)7g&=vx>ms)@QK*gGSG{O2?R$cFvBxqWncKO?GzQTc~6dJc;Xt-1Wa)piN)6*@4kh5tl6Tbvk-m zuoI%PU0t!p8QCy-mYoUN~vPu>txka|L`e0JRs(&jc3dBTM~*qWlk67p%eHjLZPbv6Qi#hNuwVeL5y&L)nE zk~ckS_EZnCk$6mIB-m=ZTSD5(%hF=L$D`@6ifhshGG-KDeE4D64$3X7src@yN)2GnHwNnhE46r#$G?W z!T|a7;FQ$;e*#$&0(AgNJ4R-QITWajAsxq3I0v>nv*{a0$vLYt-BezQ^&3jCw4#N3 zOK+LXJsZD<%2l9?Ap)a#eQ(JJh%^+4pFu&A%2DC;^$qDEM+HhNOYvzsG9hB_JlJ{s z5iODnn&*Sv9V=R~ElTLG(LGiDQY{smRn|C5DkJnq@YH2*EKH!FF4k$2-WAZOE^3LD zfKSs<=&h+#3quUo-vLhXg4ZMq3M6J~Wm?!p=_zR=bY9?HxLJm4wN+a3*RX3b;;v{1 zG%9(!k;*S)JZO9`6YadxIF@1()o&VkpmM>alD~yPgbK^bYSt8DyO+AGKs@~>2w%I& ztMcHXFb#as$D+uE{Hq|w21?J)Rkc-jBJ^6FZT`mf5{#X1KlgEoTypgd5+kLR5+l3* zd%t7p%ciDox1OCrAwyq;t&+I*uOMtWf#{16g8mvR;M`IOVF6$XjrcqC+yJKVjG%BAuM6VoHB#&y!euK}yvI!lZCPU4zC+=->D7 z2^Xd$F-R6BlFzQ6t&R|siMngS5Wt!6>*0cP1pq~ZLf#7~bAbpmFO}Rbl@~`P!>Luj zmh7zmTEPzb3S|LU=IaS^mA{JLhy(TChmnhbJ@`sY$fYWrV8&(}(IFX_ychi&9G{RQ z+^V*i?v~_NkpBkPy2d0tSz6dKG7}IRkIGfN2Nfi^LGvM$PjiCWgy7Q=cNMZMYNkIx zvU{6llNi0*@r$86$tdK5ZYyqhgof!}Hd&oS^(%(=j4Ng-Tmho2n28mC#-d>~Ei5|A zuW-=}5h~f(B%%q)Vt2SFqsaeQAADT{JFMMAeu6G2MT_S_J{Ggm``%zWO>nJ83~jI5}bICzQBC1HU9{3I3u)5eI;YAI1(& zrYFBqUwyJ1MqfEgIMz;|$_VDR?pIMu8tLLTqR-V*Ub>$xM#Z}@`|v#yrk;xeZGM8n zW?C9SuN~Sz=jnKfB1~J4qSk4Wo}6N?{2R-lZ+(ay9!5ypFGi~w%rLLNf3-m=K0Zk{ zWT_iSlFn$oK~2NIf3+92Hop0)gNnySDu9pn7f?eYO4}${Ubk*s22RnWWUA$Z-H%W$ z!`ho)3YjCyzpnl(6-_l0QDjI8Ngh0iF2|;9d?+YQzq3N-uV^qWm^*SVcH2tk-l+AZ zka?l*{BKmqT(_=R$y_XD+3&2B`C7dAQpx!{lOROQ%9l%s*ye-n$3d>}zf5&$CNSu6 zunI}6mctk==x25Xs?tyAQ$(yt#ayj=YXv1zR|To|84kn1-W16eYr5Ole&$dyb=q4VJblTp5D?T!XIkqGnV-Y~ zt$!`m0nCD~-N;bW#Z^pR&VELab4tIjR6X$Rl{}2Bnik_CSq99UA@tURRXc1?IV`C7dJ`&>vW7KkyIp0?R(I=2U?H&hK^fqX8^CA3C4VK5v_ zEm78d07nQ0fsB@km%#@$+`^y$_p0R~hQnAJ&-@v4!E&*9{GT%dPk6>8fgf0xKN)K zL48>wVPPN%?2920 z?@x`!F(nKIe(H@TMn~|PM2B2MuCm&bfr^bd8`r&xX`o(ZKBtBW*)TOn@0t&^aV7y= z{KpZqE7tjj6*Xr5%U=}(JMA|SkT5Vsq2PZfcP`@Ix7tBR(xN;GRoH8og|o66!oafT zEBQ&=9kQ1@zT9Kto9^&>Xx4)T#nJB;E3k>Zh33|c_Sf-#XMgbb^LvB#-^Z6*kFLJy z>~EX|mEk;RgDr}_=QafnEz^ds0Voo`avfz>YPMUe;>V3#5 z)DG|EEgy|%K^3YkuJa#<5{D_5E*!30(n8A+*rcjW!fr9GT-j}o{cD<-=FeKLjmAC8 z#ONcFCvZmP|Bjo_;c_g$b4uQ;gd;PCSn3_X( zW-8ji1z()lMfa*?_HlW=V-)g7zGMFWf3N{!`F-h%h>L~y(uFnkSs}Z?|-YhNQns=wV;7<1zGiE#o7GIdJ0i^b8_B=EyAFg&AD+f>W7ZbB;qn1!#RxtgCo?pOUCZ= z%YvmrEDW_46{je9ld9RkzS+Ec*SkObP1v*owXbf4uWlU-P~5ur z*S|zKY<_q*z;^8b+u;D)7(kfzXc;;Coi8Y$K9TP<gmb} zFf;U15A8jSZX1&1A(RB5h%uBiEv?#xO=Cg)mF4{ zf!HzpcpHu>Z0Pmd3~y4F8-a3`VzZQ57(_ZE&^G)$YbcGNWZX)j$vHE#yU0s0g^Sn*E|WFLY!>vkE)o>cLBM`FL`H)T)L+V;f?S$0HhNY4j!WJ>05iZ=brDVWeX7=prINy{rLX&W+M%4Mx#X#=ks`H^FADY@vxn> zAMft&JO<*mx3})!-+^0`7Hf1LMay8`e)#YaOpLgVyStk#>?Pp{3m1;?2C)**lAw;G zE6V$1{Jq4QBRQf07valWO~yY@P&xI=}`A^+ZKUt6S<*0=})s};SxQNoutf3K}2+eiF zadWHm46JY}sP{DoOFrjWJ^t&b8oVgncl6CIeO^r z(;=?u>d}y03>XWL>P0+yn=GD8r-+joC4)Dm4Y2zMT_lm%F}Q@2{#CMImo;=%fX@p5 zl-|M<2Ws`oq<@{;K`;~5kP16|I8KgMC$L#C^#k=K6SSqkfu6#I9=4Fn#V?+AUtXm6 zxTs5-g0)PZjK>gyHLWKcTkC7qHC(P4Ss#WVC-H2YV3wRP-Re+{K!qtXJk1DvVW{FO zQg;i1H2bpFR-Tp88ARW|e*H5lZ_pRWPa=*8luy+M`l3*ogq3cA4H~43m_2vszE$@8 zRLwiO!NO0hpOmUFVv6W`4`htbJKe8f6N#w@?V2OGO_I003=R$+8jtGIfXHzh|V?$)bZ6Hr)yAR`K{1 z>b@X&WWnFD6oh}l;*(?<6QY%$P5;?DI^Fs&p8WXyyJxRnAO8I0<*R4k1`#RJ_@ji; z4n@OVMNh);Ct`L?W=62ibcks|shpq)W@E`(O@YE1%ZI|g7LJbIKGQzyxunPJ#V5&u zF+08tyL<1$RO>1h|I2`S(KKy^JWGJdDs6x|Ew;oN0m;a>~e~6Eg z$>4Hx5V36z>$}y%^M_~u@$84gSATo{`sw#oaBA?XPu?sfHnt;_{J&Tn9qN zkZj;kN1XO*=)W#cq4I(!>=~KI%uIg_7owS*l|ql2ZH;VGNXM)C%HsWnRp9d z!N@ER=XT}|nb8_hdVm@BWcLFHb6{+cUh2ydXv2{6bM7pwWJdu;2ubTw6Q zq?mKS0$4IxbiH*MPrPOLf~_m11WIpp7<@Hj4g)glln3;wp7k1ZiM|6pAGZu@E!0OG zol3hqmZ$ed+RB7d6&zqyrL6)d&U8@YT4C37OOXy+&ewzYkG=X5ApKHS;bexyZ4H8n5qHWfyYhihG<)w4lWNoD*a zX!V%(zlc_^D=lpi^WJNMwVzKxPSAcAECbD?q-uQzT#d(QDn9MGhR^7U3RVgEsQ>rr zb2J)fdjXc&JhHCtkbk@KLcCbS7uJY8)7Wn*3?8>!9J=cbchK%ww|54CgP%L>Yw7fV zL#>`{W!dt|5=-q$mCMjG3^E@&EK}A*%OH^DwQIW)7K>! zQRmWht29HASRELCVyZ?#CYEYSFV&D~x5c65TyJUi3|l5D8z{!&;x!y#h-z|!%QYl~ zb6>Lo>nqg6f(x5Bl?je#6f2lrgyvWjfMvd^4Xq+|__0vSs#P>pcmX+a<&g^0a->eB z4Z0G!IIk1f3i(?gcFkNWW{og{ybxm)1ddOnD#c?+ZS~fUJ4lBBxh5<2e}Gj@PnM^C z_6Yd}{2i=ek|_K}0}Rd{W{D7T!-i^XcxJUg>Vj8fyIUyF@$aQEy{y$_DDm3DojZ`& znWKw16m8mxKztZTXdht5bBnB}&y>nYsd>|s6$P5)*O`x;C)c)T51L>=ur?3@ag z8BP@wJ)4bDUJ-`>-~qh`tpVCUAXG3=u~kr*=D1nOd+e5Wh;S-wr1+JKm(b;`h?Ipr zruqW;7bo5&85E|}+d80k3)SF39GF%@pLTu(8W04SfpUG~-jE1F*2CM{Wi1-oJk0U& zV(N;9!fWS8eBvcA}4fj;Cw6ddC;Gr47AyJXzTE}+t%WmH^FlgS*_k(W3+=)}d+S}B@e$4Bx4>;_yw zza_Pl)fd+KI&Mj^`vQ`DCCBg{Dg;?kqGQ-@dgo%N=p8{dh`!GBJmj~t>EFLvwh&*pxVWQ}B#uZ5jyj< zPFFC-f4#vWzd>;FEJfeN z!5ntj`r9dX2P;2QNcnH0TO3V;z*WThXqfGJyqJQ+!9XXbqV27%hacgDJPVwV_tB2# zftrdQKiHp>i zs59rSztq4mH9u($1D^vBNthc_)QsO3Y*bF!vxt*x3vcIEteNwgv8n9AU} z!h+m-H?VraKmZy9whYmA6%D5OKvFuzwRl?O*R`UQyD`acAWs^#`P_|BeuEaPiyq}< zMwFxNP=3o@?9HY}GxVAw^&716`=tIomP~iU9=m&umN}@|OAG@q?g1hbRQ;yyO)Pf2 zhAxcw$5cz``?(cC%8av2G|W~~G!(B*?C;k_Yn;36j6?`8O|!6^5R=i~SGnzj-6OHALBE(oy^0Ipt_p#LLuV|y}BA>zmLl)*;c zNaywzT{i2DmEZ}1P6b3P#POGv6h9o3^YN+$Ucz8Ru~p6-tV(MJ^aE&OfV1|AC9>EY z@hKJz!G(LQf{A-I@2o*<16t=wRs@Y!x1NJbFfjYz$IarZ7KHIpC7D7at`A9l4*g=R zcIk2mTW%F@7^Utl_3hfO!x!lH-3^QFHe~Ra0IUe^UJ0-?s?E+S`~`Wu8#KFD>|&NH zvv~tE4`%CRW?{Yx#K`)ZX#}tf!L@sCugV?1lprICU&8Mk?eL;Y!4$U6lqDf|_Ihok z9kgY;ZDu8?Kr~i~^OJv6HjT{&4z*U^;gOs{?M_$wu!b$!MI~guDO~^V zUH>TT2YbpY>2KzyJEUmCXsd_KfLZ!k0b+6aV%QKQvezx#%fSt?O!_@T@OwH7gjZc2 z0wcE^+mI7+M_TYfhRKWq?IjaRP zQR@%(-Qwrmk$?*DKAi~|A+}yx2s;X2l$|7y-p$>w(V&gd9`rSoNpzTdPDrDBl_;dJ zNHo{qc|)swUcTpmHg*mDWS|*Yv3ig;>F*HKS1TUQ4IUVy#tT9`6o$hWNG#|>&9z`p z{_M_KJPMD9QC>&D7lMJlzAr-sasW-kU@7Fu#{GFf2El;8K;iFc7z|8(=0VQq#S~jmS*83x;1iC1U z@X!)#A_00lWbMS1|h*Im_% zg>5sZn;V%-6K?$`e{tEZ0a{i3Ft|!r+=HSbnB?!}m7IQ)`zjL_(#L9}kQQ0aihRFw z32%)5(f7{Wu~@uP-13(!y8D5bIpgLw{ z?BWE<(;LR+FZ(CTpHx;zRV;5mt%`91;q@MI96lNUdR3YOkSQ&}A2T`)m_Z6T)c~^( zrrZPpgXd7%B|!*mdJfaxf&h^};Ahk{f`33>H9$7mE@`2U*IDQ*H_bvH2eF7>6>Qru zu);(RL%oPZtx>XIX5U%K?AtwBEteQ+a4EX* z;tYl$m}UmiPyc7s)$*1QOssD)Z586BkaBp@(Mb=n?Ncm^;h0jGGhSTaTa5QMy&o|{ zwE`bvFAz=wK^v5==w*c84gp>pv=L$da#=)Mv;OXAPw%tQp7NK&lNeC4@zu>}4+=fS z?{Go@{EwkNckfz=5V`#P_>d7dzXys0qNz<1pQ_POtY7u4ONqTVm$~BFWQBZ7R2@pR z^)UnNA}x8!`FC7?GpC^WLpT+s){X_{`P<9@ALaZ_i)PMsVD`HqD1@*VSUVx%VRfK0 zFB%X%uSY1k@@{yYash^AvV}_A5U}~+AzZnf(9-xx*Hf}tu3u0viyN*e7(QH*YOVkc zI2fZZa+$J#EIIVcdF^m~kIt=-t#JATwKiR17UmXajYExJ_v}{qthz9Rfu#dIQbv+4 z!k3P~E8nUe3@ia5fQx7#QBrCia1(K%DCsyCuJR|U`JPy_*(-hY9)zVkQkoPtUiIaQ zz1nZRMOW~PZia$(9$hhA2ItndDP{svdEO9Yt#$xzj=ye^2dlAHR6R1<|f*p?F7>; zDmyoM8#_fENyLhV2I2)OeRF--PwV3`p)3;Wkoo2p_lN0^UVC&HNG-Skhn!01bjkrZ zuK%FG$PI%ZHw&4PdT2KKpf)(c~gpgGx-5 zY|rIbn4L(<3|G&I^q;wj{{!Vn;QfQ&0|n`&kfH@=w$XWDGMT}P;7U%SMux_XHYq;%FV9?`e2V5p7=bQ zll$q)yMkI|h!7^e{xc7s`{w68evqSogX70hKhg1XVEXk35Z;GhaRA*seplPoaKNrV zf}d-H>JK4z#uWrK4pKOY!pO|Mtb7Jp?2;*q`W)UUW|?UDn}q-v86$Vf2joJn`N=L3WMpc`3GtLd#m)`$DiH?SK`@Aq-I~ zL~wO4kJDr_X6a9sgK|MV-VcM*RuekY;EK0E5bs-obOZM@ZNOdW!5}ti2(wKqQS_py z=EAkMK4vL3@np`eRKFYo`Ko(PH|GF`Kgm%YpwawvJi%PGBIgwXS+F?}#3k80$B(*H z^U}#?nnQPMXXoJ!yEVYI#q4|*>`PH)4+h!MOS$wNoMyZl`_zZP{zxpL0SK zUH@>jXO_&Q9Wjlgd#M9TJ)%JbWaynQnAfpDk{V)^9M#*ee_mW&ozh_PVDc-_$g?q$I1w+NV@ zAur4JTt5jNu>h{|B0dLx%2p2QH*gGmOy0NtvBIFo*c&>;kmJRAkf`~AS|KM=7UV3m zODJ+I=js&`!UmUGqX+eiW@MeW>KJHu#kuRTSy?BO_QZf&J3_>yH7Gz+4%AzS}ts|+C(%Wpo+&rG0_p-AR zpdx!>5sy<8Y8*scyGWqxM#y|aDMTa>!n1$I%WzOQ(AAI~e2+(NYrB~|;1L#nsoA(c1w=5+_OvI8VoHAF;d1X}fKIAiwI@hGS5|#wr!HU0VLa?Y|*VJ^-XquduuG zX#3#}yA^-j5&S6D>WF-glm@9vaE)o_sAi~xr67s-R!7gs(;PBu579-C8`kh6A$qHf z3`ailN@muL(yXVpH27H|0jPY|jr3a26i43ED^Et^KUkjq(m#;B1RX|4U7%?QcOK8Us|D{(HxjR*OZgIZuGvvYZ<9o(;;mP5ts5<8 zCnuAH_(UHth_JqC&dsdrEYG-Jw911_&&J@lvx&SUTV}x_03seQNh*bLzZE9jBo+d3 zd&dax2D61!1o3rjyuh=R5*7oP68=H z3BIkjXVSoJH`2r-g$U4{P7{L8iTV89g^OJr^t}--pCE@1VXC3ao*M(UDEn4|`wvu^ zZ;1VrNe$fmGZ!WvJl@%T@LLKKA4SQa9vIYbLd4EyM=8)#u>n#O5;Pa!#VQ((AyTNk z2+d*lCY-7;T+KLADcT7hjiP~2R{js393x24aCB4T{MLNg+iuN|ATu1z-uH0!Ap4Z? z)d>fXRw>@h-?vc9777pm+U{Xc)|R78Gh29(aYfaDWF{S%wl$64weVjs>d7RNzfi$# zVuDIR)HzGXP(F=QOwyWxL}0TAupFE`pyl*!-IKiDlI+(p3KYPpq&axsUD|4!wy6EAB~_sB^Z8SBdX5{2a!w=Uvx77%qJ9P(gg~LeM%^x6U*m>L0Dx7P2-f1 zTyq|P){{>Of+rJ1k|U?_^PLD2f28^l%`Wt`-v|_Z_)~)7XEWIcurR22#d~{aXZJH3 z)Q(I*>(XjCpmc?U?8vLy9$;rdQ^kljNhhD@7nDbWpMcp&_8e`na+_SLCvoq%JExs& zmt}z#Js6x&{YO}+V5w9p?l0pbNw@dn8BG?a+hvk0Jiu%sl_Ub}vyf%{Pli0HKOvMs zr6fqyA}k^EsI1vmh<@+|QvC9OR2Epb={Q}Sy_8X3Bk~`a?!}QIc#7oAn%b%Q>NQz1|z5B+NYD^SfSZIDk>Vetq^bCD9i&GFIgnhO_n($^6 zn3^z$=2$wL!xrtCQ(ig{GkU?}nRS z?E$5(H%Z8{MUJwySFqr8*JWlPBBEGYs)g*DExxBBz~85TUxxqxXO@T){3|aXE$C6b zuJ}AjWngCTFe@kQT5bT7@}xMIl;5-uxV!;pSH#5Zjwz&v#Ob`G-u+EtTxH3UG}O4P zzc0({3J0&O3y))EGQ6vV0`j1;=J{5)S$V|iT0>dJqiq?{y;3`ZbgiLA=^pGO5pP~!cTAX*t zUnF4XJ($A1t^~rl-pVe%prTzp)bjsra}$ILmg4tdgmei|j}kkqi5N8`G$7iwTA5Kp zO!L3h58aJsM{MfdJ5KpMo;sxJHIUlc`i`jU2%=a|XTn2VPZi)EBgJ#Bq%TKS++eq* zQ2CL4^v6E2&gkQ2)=$N8jC?ZH zd62B7BXiG1IUP|O3y$)??fm7@_ID2&ISk@)O(-4)+@!h)s5~Pi?dU3m!JudW{O9g% zo@)^ge@`N{mxDZC55#p<5nduA7&Xp2p0kyNCAX|1$p;O0GV%I7RCFR@sbSAiYMQpH zLZ4u+i)qeL%)2e~pqbnt%jt_`bB2W6IxG}r0-^x!m-GiHMV>MGBs6a1?_^CbFD_hI z^klr6pls)YtzL2!Oc$BIz?Ifgi{Ho6Sc?{&rNV`k7vmo(ZQ7^Zo{*B=0L|#KplY;k z;_ex9e^s#Vvn~JuBp1RO)~&!lgeu1igsf{4VfplY)^((32t~rlmn_tEYbibWNs$Ru zkQSFF9Lkx)Fci}Niq10dYB}kAu-(i@YU~ZPMyQcq4K&n|xf6NZNucTCMnyWv&QQ}V z5H=C<6dXM><$xNp_@vriggL1C1I8zgsKL&yCv6kGowbSc6uAXctedA!*RkbmRxaGd z%vzLfY(}aj7Wo^z7mzFvql7>1zgKu?tI>$+r2@Rk`GJxg`kK7o+k(9&v^`))YTgv{ zaBeHtSGV~pC5>yA#WEvhjA#HC3W!YKW-l_f;i?RLiqNTRJ{3TaU}*S?XiuZ%6MDq; zTlb=_1=ZcyPEaxt6f1Akv3VzK(uVMTg7B7biO}3{0Lfr^A1ygIh&s6p`zZu!=~^l4 zU#turzZ++ekDAejxG%2vHlfzv6{h_T$!MCRE= zs6)Z|w24cSuj-#u!(idGPawTiwRn4P8Kc}aB^FD2{bkMw`PP$nNC-vTxgGfFe1$F~ z>Pib2gm`Y}KCw6o4LSB}WZjFPGDiX}Y|?Oa{9}I7)xWe0i>RIw+EcJb z`(hs&45af?Xd-*zCO#3fj8>yn8$y!FWz}^TuC(aGD@rb)r&SkV3z?|dY|)#~r1+Q$ ztYdV&fQqPV`4&IA2$?#Wq4RU`YSk+5;Sf&h)iRkg&e*nT?Ws1)PO~Vb0?}l)8uwO; z1fb+QDiGaVMq!JKu@_V#gr=Re#K?^TYiOSV9a`2Vzp7@BwJT65T2T88K{d#5@YY+V z5WGNuIXivC#sZlPf?Dp*PA`p6bHR?vyrdkI9s^p2(-I7At>(-i-hS~H6=?=)h6;CL z9eU`IoHM4XDH~%g&AEIMi> zP(t^q>?wd&P^0SI6m%7!VKWpk7A#XdF}DQD_I4o#-hP(-C2N3E@>hqLYJIu{9Qkq3 zy{oDtH6U7#sD|S=F?p3?D7J7lSyEtcQt@jk;Zu;Eg)juS4|1i7p6e&(&EMuYT{p!g zTt|UTzSfcjwT$r;%2W%}(@RQEyxEYNg-c%9dAzmx__vf~{u#+DrPxj-1c)B2bkn~6Z8>1>2n$0!eyy+eFu*|<=lt707xDLNo0IZu4eY9p+F(Zau)Um=<@ z^Cfn7(bwp=-1TdsjA5Int;%~=N`g)~7fBX5=Rqj&jQXwgsYud)Z4mXg?%M`~axz~E z=b)Y{BORq72dXt^WW#MfUd@A&ulrDMe~!a^txC!!JZ&|kF;AQEqDj+p^$Ao=+Ej;h z(|bzF=_1@VpMQDzumJVM`3|{$hdtC>U=n}afo&Gi^eAML2Pu`WS9b3{kC31}t30}N z&9xxFAyb_0eiC@f;b{WNuLosALRu7pQh?w<$scu~EMKpHQgZTc2}+;3rYTjs4|X4Y z=HSX2)b}Y>K^vt;0d*}~z>$V|{{~0eSi>m@K#@!ZRF{lKAC3h2SV?XPAczC$0M~x+4CPeUHAD`1E(k`Kj0$m;GsSKDqc#vdNM$na0|W zJEDl^DmG~tk3{}+5*Uq12y1dbD}q?TsSQi-eQ$Em_%;+LLjpYoG}Wb}O6h}|tq5WP z>9nr{ie-40c0r>8139iJ{@0ur&A-PEOyCNd&*rO1yfE)&)@^&DiS{+V;AuT?v|LdB z10C{#N>=MnUM`0Dq+$cehvLY*VWqSBdhKgKa+%6v3G9!2+Dbp%(;fbnX6 zi|nmIrZI@+qD^7Qf!;%V=DO-m;e#%Nk&jZj5uX_-CdztHvT$PcE?Y}}MggmS6D`Y9 zvIboio$f;#n%-zfd#)Fh%-r7SmNZ)3oLTBQ&2y@rR7BkxM6Q{7kHW3WyZp-nbQv)o z{QPFP)gWbpOl%{Ci;esclWzEU1hCBJNd7{OlG-8p#0x&)rFnLZMJt=2R-dL_`LxVQ z3|}GwvDs}9WpEL3&4S9B^rjb)gjHuNMbBtpc)~bE%tvZIj9*P=OXlkyuG()D@m04( z7?e~vh`Pr?t!8(MOT=G8fF+LB^8qd_!*l#s>`Dg=g{2#VIi<#lYCM{fTeT^CyHRd>ykeT482D*`fl9I_)l`-w_W2SpU~59nn;VD# zweZllbC9sq46_N-g^pRa4qXQb4XXGwfY`nrAbwT``mvCBeF`)~nm#&YOp9^EcLK&ARYXbC^()nbO7NRy3J2p6-oi6|~>G(JIj zQWmN}%_wG_>T&hHp?C^&_A)sCpw3aVFl`oY*(a* zQ?xSCh7|ugc}Ap$5wfwY@eTeci4PL~-O}t9a=ukoFo?5Gjg!8mXpA%Wpv4uNdt*C< zkdg%zF2ISO?)P^FtU^xMQY40rUWal>ratCR6fx)>|9quH>08A+GoN7RcL{S>TU5M z;D;tT!mEt)`=dY*>v+mf-k`mhGE26wvp?;n4RL&o&m@EOX5QL_nUmS;nPp0%j*Ipo>iP;4f;)M=bQCpsQOS>hc9+xV#^1;L&8Y=pm;CHaSX)I57oT)SG2p zE}!%M*tycYkY%64aFo9>YmNuPD*ohmzL!)K-kPtbsQ)f5*k*)S{>}@KF|=M6P~pccQHf`e^x7Sx1;*a)_#<~U=V(2A0AGIui*G|^^ou8<#CcT1#y&!>q1w#~?ym0z1GS$J#aL61n<1|AL zco+mu7AcGa@=uRd)8V#35f7$(O;%?RI!@xb)a`K3pxhZ=TqdkCMt$uK{@r3w*9{$$ixIUob|<1nf#a( zm_}W!%$gXOnln@*rrbL4r)ax{q%Kl6iXcgIV5Cl%DA@e1k1cYTe=9yh@ft+8c(0B6 z9b7p){Z*HAWtEy*n_c-&f474ZP{vYu-3hd1{$ZtLcxGF3WDIM7^Z6-UZ;ia|9f~K+ z$^&^3pll5f$#=9Zo>^}@Ad#s#IHboe&+`DV*h!blUTgzP(&t2nZm0`Zj(BBMV_R?G+#uL#aQYMKK@%jgu9B8xgykLj8+J zFoYkf7T86SAAAnUdjuX~fw$j*8wlWKv0HyP3*U9mS4|E_2>F{cqz}i!E9NL+jmXF1 z0+ADhMj{!?8SB$Hcq2*s8Q|PXu}%~{LsY`-%xmyUzJ1{~p8!rTFBDra+lRZzdr@Il z>$IRW6z1X#^fn=HfOne7Z)}JMjuj5B7r=Q$tz-cHYLvg7%2c-lC8rJX6bZ2Y3r|(S z{9C-3!VCZ(mh+sI$ExmR#Yt5kFy~LKGeoa7gR`TMo zbb>I_eF}heob2p*>RyM%ynQX0|ki86p*SpKF5s0rd@++c&kG9E5}qezPM%~`q{^t z3)LZJM-(ZblZ)%msXXSQNOEpgIyoN)1psx{{yd-%!42oe8Az@rRLJ>7;u+E?Anl^H zDbB|jM(BD*FTmM^TvhZogwly`XF!{@vjVeS2nrXN+=SYDA3pdp293`Yg`1C{dN>YfYqey2EgWLKmQBF0p9g0b#PEP z=x&Ed&vuW#Depe~GW?k){@+6?w8Z(5?k$F&T!>FiTxbAEjZq}f9{D;eJ9A7Ek3OEt zek2UlFd(SO>0>4iLoxjd6K^0KVp~61MMQuE=8&i@G}jX8oZ_&fuO_ z07{fXW3+U`hi?paCt^Bo{%Z&V_dVchzY~~KsrpEm*T@;__J5NexI-g{g~ZgcHkAvUn=VnE!u!U%K4Lk)-)5C}>9_tpOBH9^h1Kr0UkR%%pCaN}91Tby*om zBuR9E02csR#i3}n53;}4_6_#`KFU1FexG|pWJG2pkT_UHt!gwa5kMYsc=-9b``!o* z&sJyOF(fHdrpSr#hml2o*+H2({jtL}624L37A~MJ>xaLHCZaXLvi>S5OmgaRlNr64P`NYz1U2e4;;S!2bWNN)27H!i`bL(ZH-oOgc4n{vL00~f~G-qWwP%^T!oO!*? z*_9T4X5wZwW5?G7LgsgqGfA}Z#J#yW)vJn^-14??ks?7UqL+m6%Gm=faWo!^$S{Y| zcnP+{A6d&qF-ji=edIACw>A-<4GA@H*XS3wgYiw$$I(WILjtIl$;UR@(Ctl9U(7~u)e%l%1nN|Pqr~=_pI(_)8ix%D9c+<=9T`7? za3ELD-(%ov%#k!U!Ll9mAgjVyDh{WY|3}9lv`tLIa0tc4gz~E|NmWa^fHbfsr zbE4L$e~jiofSKa4WRSI14)vg%p;>F)F>Dpom~9-D}r18 z8lgX~xker=YKjK5c0p>ZDD4xWeGuA0F4)tjt-!&U@^V07Q8-1=vz< z2*|LP5^;mn|H!hjEtOKMf&enEAQgRy@DprbVc7q%hNx~(;TwMz?!H<|%Tkc3?Q*b1 zfxbHc_k8ZEZk|jkiC+}}B1Bq((c+Y8{Y_=d3fDinmyE9G=>2vnj{gksL6tfGaRpjj zR+Xq5$wmVT)r6F4)3kZ%6KRsO9as)Daw>`m8gHS@9*}FPpq#%Ou`w@mVnoKJ9Ny8k zi^JBCWHDwD#(>MCnFTHdU$-})jhDr(R>flQg}c2djqXaYAnPG^4n(gYa{5%?F)Z2} z%!io5EXU=gg(ruSCkt#2bvz+SQw*95tqR=oGh>xt69CNV!uI!o`ZVt`js0O6(MH1h zUrA%KH29az^Q5uB^3dwV(~QoTwJ5ueJ!R7rO}Da`tM7wODuiv=U!YF}y;RWcTEDPm zt?-3k^GY=lbgYV&wW6v+%Tv7DaP30nk<14*NK*&|bpuI;2vAxKd9tp zvp9 zvmeYx^bYuoMa=1^91>2xR^3y9h6)_Z?l!1DSVm(SGT`KQ+G?9Ji55;CPQaD4JOWDG zpa3SV`_F>g#0BWOl35j-|5dbP8q2o7srpS(n#zUW$O^z|3)th!H~`hoFa0lk=uwoU zt^nQc{KsUm5_2LB5T}lARw6VkWlE)-`5uhvdJfKv|1Iagl0uS8Dyl{SnIE)1>4z(- zskztC9@Z{TioJdPP&+*6G(U3Fh?t|`PTMfy7)E}L_;Y{HI1=>(W(yCnqCVX3{7)UV zl2~&9P=(Z=9E1$8&Sb|=4A_Ahm=4&H;R!3S92&tZ59N3&QTEUXSZ?z&RqhV)@0?&| z$LkAO zy$EN4Q6^W2i$;r@i57x?F%aob2xVyek7hc3_7Z;Xv_C{H&PNxG8)-|D%o?a8@aAkF zk@Pp?WOA{%WNWpw$me0Z+kSfC2??iaZ!8-UMjan7#Co=PpO3EMOM6uqUPTlq46ot~ zKfG!p#f=!IFCmjEAWJ8tu+AFow(lh8=m{CONjAuv!*|g^#XWDsTmVw!3u=Ll^ay; z=bs}N!hHe&@(qCFqX|OwPwzZThddI*Bb8epISyb`=)p^v#ZS}em>mcGDhlya;jfdf zn3qlY%wI049KMv#EM*HKYP3P&#w_ATF$C9S5)fRl9@kzB3&mzmsa+&*X&#$uwpuPj z&$3W}ImvlDYd!E}Bu52B(edn}jSX$E=WV<}H$q#*T(h zn(h$hminng3JUivBDz20!qlU+iZkJH?lc;v%_LX%U3{hXpY&3x6EJ#0M{{xc0ZUK! zW`yI;uSXM8gIE8$0$p|JJ|k`P#HUADq%iZK`Ad{$@S2kN`3cA2CsCJ%_p?gDn^ z_jK?6zJR$BXl6!K>jcet$eJ|#Y@Uo4LI(&fnaG?=DxbbVvw@gl`{0+Vj+T?VX0m64 z$r;i~@&cFkPB^zr<59IH3Jr?ij!^+p%^9F$dfSP}vkW*GDh~T-%YE6;VDaTlMI6{osxK}FQO@sc^+Lw3pF^XET z9!t=}8RH8cL1eX4;bYmQ%`2qhmx~{KalqL_Z<^7|%US< zl3BkJGs>B^T5u)I-BL>np%U~*M%7qAgnpjLy$EUQDzQFLUVB$~qplehkXjF6GJDmO%{%NYl&Sp~N88%sS?^TlZLMuJFh7SlJQ?YxO)C- z(_~mME0OjIFVG3)BL>@OLTie7V|WUYe2-IIFy`oi4i%I9ah64hA7`1qJpz(gPS-nkcoRNpbv=n3)<>-HQ>5W;83!%Ausw`Q;&8Fj|W|9C?ZO%=pchb;wM8 z&B_j$yW_FaX=MTDj$_9X^wV$&+Lo^R5|^^Ceu;cIlqjaQ;cuVZhUCAmX0yQ^f>-ii zNF#fjH==!ZjTyy%lg5Jkf2_B_?jpAugn|?m3sS(@k$jFoNaUW{$WcLU@Z#CCQNxV& zWOTk44tKt#j<4PA>+mrWVq%mITbEno7YJ*=+ee&^JY;bCzZf-I-Se z<|)}hDEZMlq9N5|8V;)HaLE=t#;K5g3591uetkkGLdFw44>}K0Qsgwqk87O;ecU6T z1bIo>b6_vt}RR4FC_P@!G4+Zays~>7MX@bn_iESp=iHo`W9*04g(cR zlPO~o2WN_QBHaWwdw^4WoSGAi%Mcz@P*oM75h^3jRzwLVBUe;jLOH^}ILT+wlX+_; z{RJzTU9((hN&)@v*~6OdV58cjz?^A`jaI~-1)SQ7$dg0s-7Di5rZq2~=Uh(xbJROY zo}<0%m39!o!-6OB=Z5}l{L5uRg$jUiE6chrP{>$Hfe@EWWtR^GJNTYb&!eCzZ4Lf(HhJGtCS0ZD5EY~K=D-D%|Bx&f%kGJHej?fAYQkkXw zAj5U_ro0$YZp`ULPiEkQ)0;W4w#$~BT8aGyQPwKec?J@ z`po`y`ZWrdEg!H0YJjfGGhA7X0 zw8Qmo4_Ovuv(lgLj~@EiotC0q!iwER-%ieFfU-%;yeBk?(bYA&8cinxmtMx4GZ%hT z7VYoC{EYHB#Y^O5A%6ec?3>x(#>6*P`i)A8@y!^t6DW_trHxXa^DJ{xX$wm5CHvlxxKb0UQK!2zK{Y1wQo0>E)6-_`%&DHvzz@*`P7s>!NRStKF`(d%bM+2?Dpm(I2oN zJ|aQW?-<3LpMk*P%?EfoR~=Q1YBcd+vsThLybns0+0Z9;t118qcb!zU_YFYCzPdrc z;1pHd-F=I}1)mNV<{Z*A8NM1%7c6)G=4S7g`?m?ILS8X15#d4(r&>Foq!F9B##u)6 zp)t06qHU{wxt$^c*_1A6U>_($tL>qr;bSqIaH-iy*Ud7j(`4~3NhXzi-B9Cu4Ip@7 zF;>&)IumEPL^1J9Jx^4bt-niH;}xLyF6vMd+I8!2XnQbeZZ*T|4OLyWl*B0Po`kWz6}w^(Yb;wx0neIQR}*_?hs zsbTnWUVZfDa;oh)7##MVYm*CgbL z#pG8=T5H`BGS7m~`SW3NKDZe#8vnSy_~JyaGk3jU z)awK@&m6qqq#6mHvlJli<jR1BglUDL~$@tE^_!lPYp+Qz%QX$x6`Xu$|UT&Jwsa>$(?; zB`}!C!AuR6Ky?KF#`MMk0o3-KayPGy94lY-T+L)HzW_!EW>(-4c}!$g3P-zQRO_*; zq9VWTZpxte_Y+}I>2TL!Nh79Srd(tbE)+JojTmM5x`_+u84#O8G!2@dEGxio^<2*i zBRE#I*IF&bM^=FEl9IAw&y=gRx`5hnGO@feK(kd#c)4W5Pzfxg?~3S6u!e4~CILgp z>8h&kQ!kYwLTu2DG*W1fKLMGwxBsQ8HhtHGApA9}yoI`~G#0S@ZFPlP*piFE$c@)E zH(xB+%v@{aciOf-KK{DCnV^YBt9ChnygRrFR~49+eQxLnMsRPwp8DAU8WDnPj$kZ?QiubP>7kZ^0%(%JNnj%@ zpLII)gqQ=s<%5wXRq{uZ;Rvv>DHaaa8Jm~TGciGI^s}b?AH_~iGOV7rCp#837*w|N zFYQP>fjS@uLnw4=k6oW%qtD78AXY@%Ut%{w~r6j4tA`q*A+Q;N;W=vSGyYV`eo=27oZcPV^J3^veK}!|1EUC{dXJ)Q_+^3O_DuM zG~B)%JG*Pjzd%LS-O}r}4iEc#i&_GbeeuWpDvnuYjt+Tei|Pp)Meim1wRvN>m#|?B z!w~&FTsAVs(U0=gHpIEWFYy6DIM$Dy*Cf8^SSc3Y zQ>ra~ObhKdGIryNi_JNcB97hmLH9AKvn08N&cIo6P7l!AWFBTo{3g7EHO<08i!M~f z0-TIxl4LFn4$)R$W#-Anb+YVaRw**ALc*`2v|E8`$EVf3j+Dm2vm}S{$oq^+U0`{p zqsX0^_=}Bnmq&YIdwr8{HK#G{0e_(rbp&vo7rVeYuD&ijKcZI^vz>?;#+-)2x{~(I zv%zq5LpQY4SG5WUWh!i+TZrFT%1crctqWeZriu3D?TcnPKT?Drq^13riA9yEiy2g1 zlv^}c<_smZjM%a&>zpcKG|ff-iaB~$1b;4Ap3W3%o9E-M=z;q4Jef@f@IWEUK~xJW zop4VZh+tF^kS6IZGw$e=JnV!h8(bBA?!TD)0kLrxu~*7QNVdca1OmsY zds;p;iSZ{7p>rEA4c`e^&ZczL*|^q1NV7YUIk&d?nzRFpy4lm!Uo`xsc4dCNCC?>N z{Cy!k*3I^W1vxZr0*Ap&|HIGLsLUP=b~OL_8k#X+5t{e;3VCGk*+rrc{<0t`XE;uN zp6Eoi>ewEO~jOg06aaI&|%9a^Ge- zfk~xJ;_w;91Pp~__O1QVxF&M)ITLCNb<7-wMy9>OU<$&r}D}=;$ODZ2c15R$@DuaeTqslTB>hKb-K;tC!nl`ZZHN7 zBukW>`UdR{ZTmcFJB~f4fT&)B*Q<;O3bfj^WxK_`09TmGa3pBtd9EsQGqsF11;G|p&DF^rm2 z9OWdL&-a>*4xnk=h&?pF-A^<7>jFfud#(P^WqYYEee;YP#9J!VdQX1o{ z9G7?Nz$*B$h4SWoY`Xk5`!a3vcB7K*j$Tc`V#RXQ2IB=LyX>lA0$kTf%F#QYNy+PR zX1v8lZGUs0V`);t)fYgiG_a8kt>QqCBd8wqag9=J(4uhyq(!m;^D$xp(h|00D?`Zd z60oX^nuPm>rsCTpEe!AsxkTQS^AxlYQ$ZE_8{nTopkU+F5yQv{;FNiwl&! ze3v2;eM`1bh^j4Nc18C0L+{NM$>q1PH#G!eM;8-`Z_okg^h(2ncd=!$gWbZxHX9`x zqeRgQ&JA2u<`>5+3ycIcJQ14dz)I*jClle5;_$lK%UYr-k2R9bS8vAv#peBkR&7+p z`<3O`NF_E}^-9IldxsgAOY5~0_4MMjw08r6Sf?&q?{~U5-jDt2Pl%RPXp&W~26tk9 z5Gmjm&>AGL0oEC=vxQgc%+^6;(!7oM1 zABB|6-M^rOnd3QsjoB7bu>UwXI<4Ut9!3Bq1(YB*rTJ+z%v6`Ln?lK3U>k7nHgOWr z9kJTp=fFm1<|Iq3o#%^tzFpG<1JD=mW_8!{cAbhSZ?fDI_?JJ7VxV%I&oAW z&r_$LvK;j;+32Z+aM4QY_mkY<$JLt zM)OxUr(o`ko=e(dnoN>P1uur(H)x4eRpzrQ5`a(U_FF84ASpj&%8j6ik?t9)km^pV zPk_#maGCX}Rwq-5p$?NjV>B)SZrlvqjU5WdTMDszNT2E=6?E@1=tWWzRS(FS-;lrS=BGpp2436$j|pNJf^yCj0Y9I8S!4g zmNs}Z@X<8(l@)%E1j4~u@9l2--j4rXts-P7C=aZN9b%uQs_z2FKRt!vP6#*5(R-F# zYrVUa&I|V;a=sP9Xk8F-H6(}hi##VS|7`S*g3`K~tZ&i06@#XZk)g235_7q|NvMqi zm*m+FQ;7vJqu%`VDiNtNC#hg^eBBo1$InN}cu2iKLr#7|X82PO$!G+f7D zK-VD&&ZlPpeOlR|rN5DN=K*i~)qkG>`Cb`R%m~QDP)q#1wqnMtVbrbY*X)-gy&a5i z65JJzT~9w^j5pVTtDjH5g2O2J35)ohG=Ij)4evEx(1)57><(^6X+#8a6Z;g1dN%y~ zZvfgOKSG~E#w9CTt+}gZj68Cy9ix}Y_*zU-zy71d%oL=dWM)ZS7zh4E_)uRKy#F4{j9Pfe$5j`~PcQt496ht?>Vq*WHU7aGz0NiHbFa&z+7xe>Xz5BLz-2#o17ab1)PoJ7>tjT@QkQnH@QA=@sUL z2j-4(JxWh{VJ{wE!C8b0evVd);>4fVJa7DTRzauucd1t%DuO5pp>-o&n8>{keFq?pmD#!WK3VkV_c zskE7D=Cr1-P+e6ecZADr;<5Q9O$44d1U)HmTMtiUMv>*172}1(LMyZ)G?1sK{{ULI zeohZ1Qg(NW)gRFg5zEZvCCXK~e6RpxO!=QpE|;wDE;0@?|9* z^qv@3RDH{1@fwG@7YMe}E;7*Q(+Mgd-I@FlyLtC62}07R9M#);2DR+(DY2K`1dZW*PaE%V zEGq{Wz$}6NJ5o~&qc6fE4Ny_%9iShJ`VES16HZgIOpTNNm43EvL zQOvdpnaBt>OWj<&qAZDP$A|JweZjAL}sx(1x%`ZctZmkJh zWW=4DwBAUkchqfv++e=2WE{WI{6}fLT0m-EoTK6lHk0lM8!I%?yfjFuI^weITa0J2 z&!sC_EKb9Ec!BXRMTCWLx>yx}Z~)fg(}d{)t@{e?Yn&%Uq{PDXo;5||caZD;_1(8a zI6bwct$i%egAz}nw&YpE))QzJCtVVW8d`Ct=`G;{!$JkiYsm#gET!-ap17p^3iR#GU9x`x!=y&9;W1Cwi2#Xx^pXBSs!`C&}R!iz)ji zAj*h89PUlQDfyUWiVC^b5-D|gro}v1D^h=h77@-<7hbDX;79$Vc4G=%;2ZlV88{CzYIHgp zj}~`v;B$?r)Ux^$91e6$vlko>)@glczDXnQL{UQVM8QU4-$a|^9}Y)In;c?K zg9uLS`O*Yx)8Y!qxqlv2gd|>kVJ4l7$D`}{XkNc1-W|DW1XFzR$A5l4`lB@#(h(VC z9Z!8ucF}2(3y3)n6Lbk%#0IkZrg1w;-u)n1bj^ar- z<8T{xG6b2l6tlH&heUakjX;15k{SGq{6Q*GrRxBb4+!nBhc4V+#W%2is3xFnxmCse zN^=j+I)hb*5fz2vUYj0T$O$~}g9Tjg(=p13Rp^wT-Hch+D04~xT9s*fd?+igP`g*$ zm-EZfwL0x~NVDct`|oJL)lDFG_2&tl-Z+)t^FJjrTUV^mU$DoLafz&y+4M>()LOl% z0u@SP7w1VbG|QAHq7S`V%3w99l|AjTl@mqNteq;I{p!~^bv%^;bBytr6{`pLFwBFq z1sqjlM`gKnEE4O6%m~?Y+OtPS?f~Z3e8rvXp2X;q7MN3klIWE!8YbefU#=TEm6@iA z@S7VLP?M~u)rQGa&#%+WQbi1F02PZu%+o$d09h%U6*%g<&Dlm&HtVJf3bNOltkWi~&;xWFm}jc8oeyro zCqYm1H=PF}BX}6okzO)hG56ShcKVdlIT-{!q+LPIB~brtsZ0L_g^ytF0pV3^# zFU*#G*XN%{f0Z(%F}2t8y~1Ne&#R5K!5IWj$K$5=QJVs8h>3ct$7RT5hFCQqDY*w) zixrh%s?SHy-zBHdjT=L7y@oE_#==u%hhUVk>=o8mm0`q=#N4B#cQ7ilx?i%3rH~vm zJ-jW0BSLOek>l7FaVVVas<5(&!bhXa^ULWwZu{J~zRhCDc}fpWc1HCUS!qRQ9!L;z z?L^$iMMNANl&vWE)g?@VB_tfYDWqTh2|j!dU{mtVS?!O$c{1Z*_dI->v(hqK87zbB zqPsH2J3+fuv(0_|gFU-aF5&qEoc#1`I;^K3oiU!{6+AB^00J*xH!P)Zq^rDxoMTn6 z7FFDGti#5vwH7kMJ83*ldQ;ekZsKSmlW@n&tgkyvh2&-vE5V^Kr$}^4vb2%zHA8io zSsi{$SAAL>kZE_mkgrCbBylePN$d;|Xr89nyNDmD9gqs6^tc${gry4sFWN#TmH@dH zb9s#FVT$OGOZRI92QTj~agswgl}MrV!7vs*t&iVV$%``Ixni;5>ckHIs`uxfZSC32 z5}K{2=?&lf{EdZ3`qu3VZL=KdY9|dR3{fo>fdGB-3i^fkfAjN1s)@ReIRwRm1F0QhZNemN z2w%N<;sdm=c@V8La-$#n_x+x9R>ovxAy*7lS0p8YQ{$jm)z{~iUg0OpFJrID9|9+J zGc@CdI-0x@T7R>cz8MWYHC5N|&GZ~!@0JgZX~mg%;SwtQdOCee4|91kvv+ueX204s zrMdOX8hxi`)FvY2EokwTv<-cODSZY{M}!20cI{Qh6}<-W+B?;o5IWgYZ;ll>LtuO* zD;$X#_w?gKWS}bMbi9E7ur?dK`>T9+TX)|!OtcxEh!Jpg>~<&Lpw%{tFBtvJ!URAK z#CHqETU;f}HLwE8F|kv)I+B@qH!DA3gmavx)aw#SFEEan=}@j-E!8A;i`L-=8gIN? zJXxbIm(LwX+IZ#|-rL>xS)|K)O2%Wk%Ai);1>sg&&*~o@!>ci<3QJ>h- zTvIcXdWVRbzZ%_k=ShGEMY;sOF(4fPn+?5VTC^eocm%66`cKgM6YLgmY8zLLP5U(* zHX=1#xeBt4h+!p~@TWFV5~H#Jmn9A7Y&P1bHc+#ocH$8tTaEjY;HQYIPi>&yNmC7R zdiqrgHf#g+sq2$fTBsenV2V{QY*v}%-h_S~TvCtZsAfc@0amt5k1M0YT5BEJK(tTO zN*zRvq)%O+fVq8?mHpK92?$UxodHc8A^=Nj2a&dpaHPRU`Lw$}RsT9=LB|SAEY|9$ zqn}v=mAho|Oydutq9blP$J@H{`_)EFun6A5vf`E zK@r+PSk4Q{xbZ&=#?QdA59)Ci23-68_XgQ*+%3!FEmj_*np%DH8I0t}aVPt`L0l}E-S*?nJHOM6 zG%V21w*Rj0>E^z9lPt->vK-BDEM*mt%fPHfQjJ`Plmy$vh4xPJB(jenq|(H?W7(?u5E zpqijJiP#HIM^jY%Ep`&(cRC1HJcZ^Powt;hvB0bRj$(D}c1%uNe5Jbveor8z+&W+~ z#8^`n3>FfI#3#EH?j}W!2?W}XShp81bqg7iUx^XJBffIPxMuwk7-)F~)V{Qw)a*-NQi06}16;HU{b8rmI{Yv*s3lO1 z-XMePyz%Dj#A2wT9@jaLd8Y#umA4&SD|5Id-rh-9F&{mk=w2n`2#aPSZQ3TDNbwvH zGMAC+_UQ=#A))8za`thG>JD* zftE4;yn2&eu|kPk@eofc#8Ra|$ia%{3>Xu0%02TVNfsIAT4KfGpEBCbhZQg0uuIAo zf7mKx_-`vbfg6q!8c)InfW6le2bRB>U&XJ5HIn6ZjnG_z|Hbukk2RRm`wKC$9wJz{ zG`NW6Q(0_3cnpK>T14(_G($xe9NKKj2d7vOSB5(0lFeivO_fUO&HJ+0TOE*hzVCE| zFWa=YI-gz%KGn5=fimWtGVd;BqD9WF;G*lslQ2R()iIhp5*|K(u4%NML*XTY#7IYa z>8{BTD_c9vUoEDyQ8K4az4d62sm^CTpCs?{!{Cbm)OQNEx2$oZb8CSGmVB`+N7{0{ zMShsC&O{fj*ka@yGych?bwu{vDio?lq$+_q8aGV*Ad7Rc4-jC*Z^58sG0uTXTtWW4 zKraQ$4cvzsMK@#0Eh1l)rpK6TZLrm#^U*jS;7K{@jqAbU@=G7}Ur*j6W1+6S3Xt)| zmIX}qd~H!hj(UOf$0(Kx(?T=)8)S~5`wd-a*5iP)nJr5Y+au!BIC+s(R25-b_{@OM zl{s~F!SS9IoztIvtXBs@8@LcjVcekS12XD8)Iyi5Iv(*+iSz&po zzr@C)lU?b*qJ+M-8mgKTjoqdTXjT zD_@MM*i@+3Nu8%IfHKFTgByah+JI_LQ4PY4B=yRetD~}G7Yni?`z*%tEe8&kkoZBX zR2f%Uff~E+QYMqzWQ<(O; z(>$Gp9%Eq0>E*y4XSK19gb3b_CU=l;=@|^E_wS4E(t(6OrHW3TAA=&E&QgYcC}R)o zmUK^%+q-NLqf8(iS4pZZv$7G!yr@rF8O|JVVOIJTK5Z&Vfj5&gdmnLFYdd}8s^M;G1^q#vi=8QY#7jv6jD3adfiIsmcQUem+Ej(9{sEYm7UT=+c zIUSt6{b`EM+Nj`hGe>pp(FMu}XM~R7jwxR?dA~6Q*!Y#{8D+~WnCEbktt_e=lh~@) zgy+;aTsLt^T0*vAXFG=86bQ#6dUC zZFNV(2$1R&`bn$4yZ4eiLp|VsNFNro<+3;S?@`LBvUnlEpllchF1O{5_blkd`GB+@ zRO(7I^`Q{pM-LafCSkf#75@4G%#;f>K!*RpJ_^O9q-;0ZQz3aDX1M(u`^FKs0*S$bwzsg1bCs&DyXS$1@Py9EZJ&ddni_16!zPOsDIKE3cNJ-!S~ zLZ~L=G|H;J3icXC&a#85g^p2!hNMS1_K5ns+29&rv5W>>WgXRXpbqMHIM%H9kJFy5 zK?8P|lPmC}*Sn~*G-f}hj{Na{jN&VRa=GmM*;`Z1h<27_v6%v)>e00&Z+skPs~r^H zcG_ItQOld+`)58fK(w0SQ4P?C~nC-l;GUC&RX*%ne^u%>tynP-QV?raYNkE z87aY15Zt}VvRH#CK*j>R_^8wwrRm(*sl53`&ecdQ=i9jLFy?S0dGW;-UM)|b(vukVcbA{XhMImX6@Bp zyY@_EJF}kHIZ7#2MWItFVtSN(r?SgvR{z{)@r?0a&zEKUFn<>}vq>dRx634%iiQjy zlb&lfHOHugg+yL(DjsJgJ7y)hj22aoMYVq_05xjSu7k1^9o}fEB2sMRYA34IQYm4% zv}&c~kEtA^jSijXrBH&Uwfb%0YSSVScR<+Y z0hBp*b=l2pH}X_#;-}d%*|6kQMCb3xB5X)PR_f^sF+T6TsDk9qb~uSTe|BJ- zNF{3*pQI^+u19{edFUFEZ~N7sm<>XvZ@fpcva#8N^e z@EQEM{F_cg{%oTH6gr69;0=Jt{~&*h2ZWmooR%0jc98m7!*is&8th9+CQ+@jWpw1#C-Y1ZWbJ=diB z>Ig}3wgVl`wLH;l2L(#KUWx+#Kw%~NVE9PzkPU&oIPV1S}nAO!8N3lsc7^kdIn>I*>fVgu#QqK6=@H`7&5q%aJ`0N3iL3 z@gt{8==pqvmfHbLO8p;@oUD`(o#Jxw?@z`Fs%px<@HWUQ7Kc4YUA{}C*gCNS6OL(q z!`$zwhQK-$a$m4HhQcC~6q^)~hpBK3Jot^2xj}Ca^QW)I8CX82UEsS9);2v*brOMU zbEEm6udWx+J}fOnjU$(`RY zG^juxFnH>95-;K^`wq6+XoZUnLU3i)Ykn&@MhW_Yb6hoSrC_v_pEqn+C*tqtxpmdX zjPoXS!d;_ZaHvjdCU3urzQh$o8%Dzl055y>y7mo%o6;U_Do4ndxw>%Z97*m})vPhU zy>P*k4k91cQ-!~cR=Mt2vmpyjW6Fju!dGpdk^997#~a#I5lN8N9Slr6WjZc{0eQlv zD~!bC?5@f4;_;k2#y&*+$BL1~@ozG$#B zEZLVBHTc(j4}~bxpC!fR%j&=25W{Md-xm!VUP+&uhEV+ESl0R)N`tHr)MQaX z6#Me?&+T8i=x9#S)^=hlR=JuhSIkkAw>YqXbY=AY`_jty{B}~W{(M&ZdRp9oHyxub&{|#Effr_AwRTE|hL$z`DhgR3`s>89SMAD} znOUO@NR*HlEWjeu`U!$IP2TOzT|;PP_Kp!)-cMB-D7&y`{Z6*-Bkh$n{1u>+;ngXt zUVZ50=tU!xe_x=y3!3mHlwby@`@3>)^bWygxI;B6rVe2Z4o(c}M;RTe6jK)?EP2I#wTHJv5s zBX~ZATTJZ9{eBg>Tl75qu7!tL0|*eH&ZWtsvc}&8{TEU@Py|(}JJA2M$5l9lh0eF# z<9S1t^bKV!A$Lxn(WMrbw0G>5ZjQwL`$%s?GNG?=uV&+AG!f-dzXjb*R)7^wr&}C8 z+XPSZAfGRwe+`C6w@UR(uLWLJmVUi``gDkPc8DHvuPDoqJM_CgPa6s^vvh%}vU7dc zyo9A9(y$^#?ovjnWrlv&d#X#IChpR;f*%Ho-|tzR$O@=0;J0MQEZtSKc|m{Q-{7{E z_uyzg-4NN78}YAsL)XY6*45HA>z4AGrK`L^@jY;+-}B+oC7>S0hVvWmg+8W{*OJTl zrqnn^`l0mc`dx1a04>Zf))TQL%$9ZBI&Xs)EGwrO53fAQTy$FCTyxf?RM%y^dxm)F zx`$__KMK!=C5q@TrM~`Xa*Oo6-!+raB@m6r zosmb`-#@@`ljVL6JlW_9!GIO##hxvmBrjUCY+G$Cd1>rw8Qb{xq=GzI#0@G2Cas-Q z{6Iowu+T4AP;SX!QVT_wGZLiBx`TsI-6?8pq@38SmDZdb0`-;SEf~#L7j){T*9dE& zuQr>t;h`1~MJvW;1U(8;l47n6rdd?VfN4 z$T&d@%74GLKXP?&F)&eQ$t4z&nac)XV8chITo1!e{c8Pyaeo_|lvyH>mvVlLG@ZjE!(>6R8J@Y6%F;Ep-UF@QIw&)`3f!U{xJv!yc~i zE(1BrqXRx1P$SZn1Q3A{AXVbSW)M*)kCPy$!L%mr_BzMCCzr)<>r~cB+>H}bAz$V!qm2IX{@CINcIeg8Uh1d%aY^-T8fq9pM1DOa~vps~;@2B+>~PE&_~8q0QS4@BqRM0RUmY5+iI(<{_|l}ftk^aTq{ojx3$1f{ssGEOLz z*$3Ir`5ENKEBG{1^niSi5zj1Q$E%BWAOU#6e^@#8=Al&PIH_H?_thmJ#sprtR zNea@6p@fqO*ToQ>>*+1uf*Q^DJi8Hg=m|6diQVp@TkiCozsQb0uwFz8hoWrx0)+U? zJBH?DBi_@zr2#W_eRJB zB_N^bQvJ=lSlpKJ$I4IMrD&!@FK_%}^P_h;eC{{#YauKqlJxU_@jWh*K?4zhwlZvw z0Z=>Yqs8wu7rm5g_C~b?(?xxgx5>N?pBw50$8X~czvETk^CEqp%w_d$uhQn$a-TBC z_-phxvj@vAya5=3EqCn9B}R-|-rhX4qxwq?AE#rlRTcAJpCtr;6X>g7{3xFRgPOjD zep=A(LNEQ=T%&Ktx*_p}HIm|!(tEIQ+S(li2Bj!#77!ug>)H{vn8^SjyII;~*0vs4 z$`pKlK%ej3Pg6S#XXZpwzj%$nQbOjh+`#YwkBu!F8B;>0N9}1Xn_@0UG-wTK)rpL0 z;VOZ)nzQ7}X`uv{K_Wua@&@-TRqQfgd45bL!*9TienhnY($oCn7L9vtuX%fE*Uv8Lt{{{r@`RV(&H6&(OZ| zSHKR-j_dQ!u|Q6L{R0Aikq?ncrtM?0O zS%H<53V`N2UgAuD9X^(h(}(^~C-}E0r1$=Hk%$2=NKh~AZHTIq z@{9iQ10GhZDi^Z6H^Yk(w8_Mil!35kCUy;90gulJ%ta&p zO-7Zcsp9u~?42(Tgo1gqepm2n@5eRXjW-1=r>X-pFUZuBp-Rzjhc($-{kC8L;Vt30 zz-zeYb#8>&BQqy{V;)F-QqLCl<|>(87|mqJ`QUlW3rDVzDkWy%E{wmNX<$CkXWgNp#N-e+P? zn$@@Tel2qq-Os`?RvQ0ylf1M=9&Itg;LAC(WPsJZy11`T>uK&Xpq!Gqe3Jia=_t)A z@l@WM;*R~!(mMo{N8c5BI?L$RmaU@q{01rjH1EZFK8KrWeAllth=*L#JAkvVYF{%8 z_xr)wEBW{h=2Lr>TuhV7&)?R5MA!4hwDy-|e48K}eNg)fKEQEp4$l~TX|vJ!dPCMx z%vlAo1+qW!O#1#ov$^zP%tjG$yKLIrVNCt%dgfa7{EN4)C z>YC5rU%qLge8Fuq9w5Wd4%aKesflELX80R+=$?CGeC=K451zQxU(NhIf%MjrnYN0~ zi5Br=k))-wijIh0GE8kL(Zp{gLpZyc&8M^eHA2QP(@$9W(I0#H;oN(^*uI8-PEyg) z_sWT(0zhuPEcwt$dm^4%1sH&5fJ=>Ut|oR#xkx9OoKO2c<<|XXy27>~p|`>(mSwe< zPR<&rYCT!P(N9wR*KRh&ZOY#5%*=(-Y%YG~(zlC3bv~V9PbyH~hNHoKj%wC?Kt+^) z25`(FAnOdsc|5xAU!(dcOgUWh-rGJ)>Pas-Oit|_SpvD=bsB)g9IoL?nk?)UGW~)} z?3PQY%I+>Yd!6lZi!1etBw+2I$XkTtx)pG{N|mC^BW4c}b(tlSGQX_RRq0>y$Odb} zavuH9PS1y@=gIo7xEzg#^zDrA(3N?1wfnu4ri;OV*WFAd*nXN-8`;iB*zoo-c2AyL z?{x5Ie2=N5?r@J~wfci|oUUNabdwE{8=i@|S*3;Msk|OlERQfcqu}a6ZDA^F61Rl>s4&AXyvQ%6re>R;>!%l4&fhr3WKImz z={LIgRB0UYJ3Y~`Z~wD?4m;QEhWXn2W}ETWZ5c76O6h1B#8ig2uS%8bd|-5e&Ue^s zdTc*56dLUw=8*oplR;Jng~JpBdFbk*uhzmMBx0tmPHVH=_oC$L{CNb!S*}o@7!VFb zn9_>11?EKwS3ur~bf3%niXT=zT$r3rzLDt|%s4kfqoikFU3N1m%b~^Q zRrWyXUvF1}Cua7yX|)zn^B=y*yEWQJ2ge`FtpRt@^>rPkvC+DQ3|i4U6#!ASzwEu^ zy5v=rhB`Nv--D_PtW%ih^Bx&Jtaxt&nl&SWR6m1OwM(CRqQN^u4SS-&YXKS8V{6yp6L>Rp+HucE<4SR5$4dzMA zr*?eYDp^@;_dd01s)eWVp^A-s*G0c(XOdxkMC8%E)!zdHxXhiEh5|E$k*81bC?oG} zJUs4nTOaFKejx!H9!P3T_I%RKoS{%Xk5DYB{NygKG+?%Cun0?FdLU)^Qws{-L*eV9 zPpD&1H;yylkgWB7Da_O_;t`_>$_OA_RPLFA1`ZS+J4<0yZE%#Zt>}-&Jmw!5fQbQy;U8*(~PPvF4CC zYmCw${c8&RGSQb9w?=3`u=ti9;`@xS6u?Se zUU~LI-qfMq0l&y%F}>>7iNVbhnlA&e`OYe0jD@C}TMXy^P^*nCpj9wrEPxXr&Q9OL zc%qpDmpA(hW}*=%Vqh)#eaTPOj|SI&giM3|jctmzl9iF=eL5pJ0=9o9ltDm`%+dR- z1D4c*~&p}F_Iq$rd z+*NeAlAlp+zJcOg`RZLV2P*XMf3Nf^-^`N45U6z0nLynbjP)Ckxqzwt?-bhzXI%3H zid|xz$Su1>y0K~(TgnzUYQI7CGfuxUefSf>hv1X!vwH4Hs{G8Rh}I>0$IW4K5f=mj z4dzy*f0{svB6Aj_p{L zC`#8ii+l3iek1i`Tu&$eR*-{lTk!J!yG66(!<&$?Ua7~2rOuMSX;D;iv23Y=aB4ZU8z(krxZ(d30+VP(NINNPf`U&lMI@Y3{0f>zr!FwFNd{-H&;vnw`!^JW2*k z>N%o}$PoJ|6Y%q>ZkO<*JT63I??xk50ox&h1YAo2(%yJ01`U`Ib;inc;Ik&^i0)l_ zlPW$4qt)}=r&dch=BeBgf2lD~>P#jK4(JYXS$c-jsFQy(aip?G%+ua{)1z^enU&|v z5n&_to7MKz-w-pHaTfE!g2afHM-!M#GWcII{D zMc(W41hPW!XXMz$ZmWn+ox+{epVwERWxcm~mk>j$zI+N@gYt_JQ;!>g$Wlr#YsGV* zR-wbi6)bdoaj;+$xLsUq_xNnk8JznEIs%=v6j(%+^~RA}$dTPR9Zdu3C zHQJfCD(M@uh^F7lqac*#&Ig(RjIQUS`8sR>gNON0fT4`h9+9zjZ9QkBPbn!_A+&gc zn3DQjV%&~kD96}N+O>B(t4$F%pV%QgwMaudjQVV1Cn03!};q9c%f61Lm)0ARe`MX z{ofd9MT7RaEQNGpx%Vy4Qpj&_r`I_s*%@&6;nFW`)&$*EHc)R8DF6dQ3GO@3J`bgf z)LqB{t8~HaBivJQF8MI_L=$(M*3m zk0rc}&zaIHsET-@o~6 z&Em%9oLUA;SF(RTnlZ{wFLO%CkYOxnai3YY4W8sb->wY~U=BsT$)nLy&5YcCvWQt9 zcE0@4qxoJxeb9co2KJdMAaVmfF{HHB2dG$b-o zjCqMYO_US@OCqtg=wwj=H9A z)*W9y&w2K?DDN!rOlO8$1E3^1|B{BwLKv1o^4qpQYp zg=h|i&W0diGa25o_GC07X?0KC?JHzDu%lTYHJXs4HG9 z!y>4L&0P?uo#F8%IRT-@;WQ9>mf}NP%d%Qd9mepH|E#dFN*=b8o+L?{hA}&lDT4rjhgN zMOP;O5DV5-&FHgstKDlK>!Xb3ED$q$V`M-qXgESWmlQS^84#t0ISib%x)uWEZso+i z_hhG@vW2Cy4xWGjJ220ZXY9fgja~$weR$OFe#CTs=^H|ZKLv{(r*@UgHLYLG>(&T^ z8F)8NG&}(?Bg}5~h=Zk9%;@K-FCO3(HSWh5>vam+LD5s?3JajfC21XyG|~%ZesRbY4rSE2|W@ zP_HicU3cG)c-d6~Rw3f-YabtXKbkkF8Z;{O%27z^)%zl@;Gvo%YIs7IrZGx-vsyJ^FAv_IB|?2U@XfD!N!=1J)Fvx3hqX-4y`l?4T++vmfkDSVIQ!Ocj|RJt%D76 zAZA{@mg7zbjLH>ksZCMCMasbJ*CsFSN6;~5C@V|j6@6-<456G7a@L=<9!>@*?lNr{ zXJKt(3!cngxGx*hrF8!5ulFcx);sEKLUOCdDy3C+JyyUxTN?<@m1AYT)UL-0wP%xT zkCkI(dd;rK+HLlZ4%Uw`tQxB%yzG3ey=Hp@7P)$?z*y~iti8j-M_5*ZsCGTlV?fLv zVW4;2B61@rwkk%9vyc?8Q24Ezunr0I&l90n|ii~01v8}Eu_)We$`0* z>NAv5|NQg4=`V}dFIWj~fIs$6=8fTAQk&wBy;i%^gdL=JPhP;YJKsZvxMp+TY7YB* z1N&!fgj#|KSk~t2VhAk84$17OpCv_Z!K3Rv(-{)Vk0xHef9S zZ~n)f-eJp*b`T%!{X>~y%2@d?Z-B?g?M*Zwe}j%Y&4WYTpl%b}z5NDtx;Tw?%DdR0 z*vz}_!(PeG1Ag$?pZQ^@(=;EG6!o>l}7k z?G0>1e@8mKUe8eA@lhM6@F{Od7i@9M`5qiWNi|{+N^p1E3D5VAnn$4N9g4x&*=ry4 zI$LttZmWB2na$C`(GF&Q46)pN?3s6t+DF^6*s2tJ&IKvwhtCZFjfiV7>0)kzv`b-cb)a z{dU`nQ_*g>9$!y9>a{j7w|o`8)9m6P8&11(VcP3#;uG=@UiT0hw-Vw}53FX}oq1eB z>>M6-H_&eU3Ac|AI>x4irGYaUU3KWRpz5q2a`1P!+c`cqx*?c15(~FH(2vW(+HLs3wwv%FY+5tngPoW^Xn$~Y zV1@EyIhhWR5VzcJ;zw{^80H0@yX`(hX+m5A1qODv;Z>Uvl4IOZkvH+G`*hw?eoY;j z-nQ+hk6s{9aCSKTnALl5aNOE*+aa&phTc0(`m47*;Pbt9rw2lMgAZfKBB6iPcEngkiP8(I$(Au92%SB>uW?S|Gl?5eiDyEF;5f!z;>&K6n3WS?3{6k0l(eQ;I;t#ZTCYH2dtQmVDy@7Gzt^2wo1t4okkV-RbnU-$%jym3$-6{s8K3 zN4-c%f{K>o*cfS8|HI9&l`1zfhoTW#4$vBjRf-ZUw?2gskiv8J*ky zjc{U@d?9jgnANo96a_q0@{NZF9mMXpeWSpa%DxeP-tFfo2%?g2JOaFN`!~Y6DZP(K zc{|+JO-UXHEKbQe0&=(g*$^yD$rnNu+yTQ8FiP1s9zy}$np6S*DEYn)*vHN<7pgtF7c5B}aej^C)RrCEqBS_FKPE@}o+=QS#-texoEwlzgLPy>I+z^qEXQIfj1exo3p zO1_b)*;~I*07WHVC<)fvzmd3>l5dnW>8;<`h2sKFXQUA$$F|owJOESI4@XCE#@P=j q?n)Gpx$NkesUiBI(}tpCKLDD_4jkqexJ1$ibPhQ)`Q-uW%Kr}+7Hy&c literal 0 HcmV?d00001 diff --git a/public/js/home.chunk.351f55e9d09b6482.js.LICENSE.txt b/public/js/home.chunk.f3f4f632025b560f.js.LICENSE.txt similarity index 100% rename from public/js/home.chunk.351f55e9d09b6482.js.LICENSE.txt rename to public/js/home.chunk.f3f4f632025b560f.js.LICENSE.txt diff --git a/public/js/landing.js b/public/js/landing.js index 8a3b2322cdd1f7df3a19254143461b144b5aed7b..c9da7051de0f96448bb51dc1bc12745859352bf3 100644 GIT binary patch delta 276 zcmZ3oi2LXw?hOl9uo#<}nN4@pV3eQiP#(K^{n0YU&C^${W|qszPfW?oOSe+WNvx_= z(osrDEJ@T&Dp0b@*DEc`+3dJ3FND?7(#*nOx}yxE-SkX$M%(Fn%#6Yui3VvFriP}8 z)90}=rXzT~Y>Zk6o;@4m)#>|L7{%a1+wZb4vazrj1I?T+D930#y?~2Rkr`;gc3V!y zXFM#1hL#4?)x{Y7Sj~)#49uq&N-+9xD#0wZk6UOXG))#>+H7{%a1+yAmKvazt57@3%w zPF6HBnr_9(sK5-gV0#=V<1-!>BNHRb=^kQ?eym0YhDK)77m70aa4Nwp+x|g}F;9>c zq{wu7q6(ur#Ld$SRT&+(U(jF-VPpYmo9-yYC_kNFgOLkpo~bEVx_z1!X{m!2Mo zaVL7@1eo^ZkpmZwYdq@Fvws3E`Wv*GL`=L?Qct}f&->K-ygGPw@Z!&j{^2h=4eDk_ ztjd=5ut{rZ9`p~Fc0R}GCY|+XXL>lAd_wFBWBh58u21V=0ohx(2*nE&b1CT$^=yW; z>M>phkHYznlb~zk;_>{3u_8#D@{e@S7x+YB!y+(b14ihLFdv9&vvHQq!Zd&>J0a+)Hxk~ z9V;-y4fU2mmOC>}E~_jmB6*QlLOLpo(gD}!JC~kLCVF^&Ik^ys9e%$2^24C~(sZD| z-fqL$8M5PFqA=9EoQ1RxC(v$sMOj8%+Su7Fq-*H!^nDl1rU#TXZDS#M_lQXt{@6|C zF{HB!FzJqArH zeGH#H47H1#wpZ?d8Mc^E1|lxX`!buQhTr$-B|T4Y636{}@1yHc zrEg9_^|4mT}8%p|L6lvqSPzZkacuO+-^O5zkhHqV3)QiL`CA}yYwW= pq(VI28NlLEv07Q=@Yc5->SnVJHF&u`)c+c69Ss&c4R7~<`v)5%5sCl+ delta 908 zcmZ8gJ&zPO7}g4LaG*Ou0|kg%rdZioGqT5Hd%SzTBtk?HNc@4*N_hMMBj#o+c5=E_1qO!19c8wXNe2iIhp5@W;E!MCj^`Tp7H2(C^DZ% z>s`TzZ??vW22uJ#WK`r{av>6;DAThPt*7#D%l%*wOg;KoGUJZW$ z1NT}eEuD@`s=`B3g{F`QjTtnZD;~WIOoh{}b5BPjH#|R|oUx=D-kksSiZyXwcELVg zukFbRsy1(l>`-s>%%**H6xvm9SVoCY8+av~E<^uy-*;8H>H|uews9f(Sj5B*e{UyK zIMO*2FzF7%!W_1X`4iiXR|Ykt#pd8go3>5py0$ZRxN$)tn;zRPH2wY7hmFAJUD}1C z_DQ(?sH#19T3>i@&#p0HS;+DHGtDY3tHz^dRoCP{6x@JL-CA${U*CWj+D8|!kL>B4 zi*H9aobl=L)Tb-d!9~-A@5gsG7Uw>#ksI#rJb>7K+qpKf!(Th>oSP;%fp*{TT)hS< z{cs#i4|-krZWWfjail$D3vkSK4=y_bQ7=qGmYWHQ!1nX*-nSO}v_%#YfuHZwBZ$dZ nSUwIwg*S=Sra~UCW80x_GU-r*=gWQfX~32+V4yU--Tm_e?#K>g diff --git a/public/js/portfolio.js b/public/js/portfolio.js index ce1e7097f3d39f860b828a19bffb63d3c9efbcdd..f28a7af06b642500909073b5d56234c5e26246b1 100644 GIT binary patch delta 75 zcmccqfa&G~rVXkstj3l=F!|zI$;l;!*_+q4^eZzOPZpdZHaTww`{t+><}9q{rskGr co2RXjVP*z0CkL#TVF78HT(I78vgigU0A+j|kpKVy delta 70 zcmcclfa&@JrVXksEJjAAW|I@wNKP&(%-+1NrC)jSo_5>KRVyS|Sj~*g3=B3;Un9c| TVNQ-;DFso_yWU~4_y#8c(3-6;f(;B_JfHAK`zh>eA)ja;RL*vQ?9 zkXIkq+FT*i-6>dzjhDjeI53JJ*eF<7x|6lAeDC|^dpwJOJBxo8iR!Wnn7gtf0->0y zRCn^bdFwb&;%n5G(!sG9r18%-S=D!IkwJUxP5EX9l5YfmG78a_~9}N!v*M2rlMeAd!$N zaCtUY8QIKu!ebIE0!HzK!J-}-fdSIt`&_b!Aeq3jfN@)L9!RtTDC^iL3_+*IUFAn4 z$8l7|5}b1tvF^tq(H&L^4jbFaS^-*ZvnIo*CCKAy32v#0F+KZgOVCEcDMN4$#`MWN z%v#j=V`CaJwplTVpuGh+BD7hhQG&E>HjqsSf0jc_laHs*q^}w1g+oN1_)>wbR~ucE A4*&oF delta 590 zcmZWmOK1~O6y?49rdlKzUHAc^7%goY+s@2;^Rt$=BeMteIJpS3@sy z&5Ec7mC)sn{1u;U_%zdG!Vw0pkH8R?S7}}TXwoIha?`njoNv*uXPGN>j?cEpbJ<;` zH~R2Xhn~dJJJOHSFX+*UN-bWf2TSvf;C?jK9$RQNtF?MGb`ZY24==`1ODXe(+}#E~ z`AJ6QOowjd!Eglrz6S&NVT;80ZJVCP?j#wO-A(%OL^cS+=3=8gUa7UBusztE4c1rLEjnX8IGHJDMoHyfX5nGrk<*|M?h$5 znB$uvn3aF>aGQXzg!<751wslkBtP8$o zTb6C&@+g$$+bJkO*47QrNL8G3uP1YK$Fx(~%2mjoVrnrGHwmy@gnmucB#_L(3?8`y z-*O(aS1}Q>@Ht>8S>BDs>x)_fj?Vv!bEq2iRqn`@V20 zs=w;?9~=5W4a#U!2ixpnh6`J|K23}uO`8cw)m4L)dI;O2tsa)7yDXZhoInq0P_OJp zWGvX)w%CnHvogEz1>>s4#dpJ$QU-LGgS9a}@{z`Dv}(WSxukn0l;z`3oC}%q9ktho zW5xrS@*Mj84Wm5e%TVw9ih@e_BV;@b9bwb*07gy6Nr@`z9K`h}Xa(&&vR1mtp$CEXku6g*u%>hw%!Isen=d delta 559 zcmZuu&r4KM6y~0DZ|FlygbJas9+VS<<9)wo=Cw#)jZA2QQ!Xs4@s%%-oN;s}s97bn z4TPXW3!x}#>ms_)Lh=tNa}zCs7_v=2AZcsRea(QImgoD<_wk+cy?)!dv(b6?9(xI+ z3GQZGixvd-(eg8PQ#BG$2W}3TNi~&(4?Wy+rS)L*d6Oo&0&Qwz7}gkdZ33st8XTqN zvtYDepD&f7a;<7oFakNl+?_ukg5zyxS~RWqz%g|{4~+?tb){p`6O%ns9V;-hhw3j_ z_c=3JOBJh$TB@=*e`9toO3lnxD|6wUVmT~Dga3z5?!vdK(PF%LB57VOQ(=l7q}4ZY zK-HhZ?~wc1j73Z1cuK7bd}VOo(K8!Hhki|92Wc>;es*Edi=K|Q)Q=ZXOGpl2L4A}s z$-uKI4Dkp(?nhU|a)+z|99N%gq`kuRrIl8<1AGU<_obhu(HxEmM`qI=H3o57{mEel zgePssB|nd2-1E{ltp^yY?|J;PpT`zdIFG%wFGPdudR$_cFrcBUxYaVyI7H3PR>H9vy GZ+`)N6s>pw diff --git a/public/js/profile.js b/public/js/profile.js index a9fcd40df7425c630591ac17440d6d66e0696eea..0c28afe41fb385927f3b46dd472bdc5f5c6e06e0 100644 GIT binary patch delta 455 zcmYLF%}X0`6lC1rVhlYWn*YJGL3e&rB9Mwnj>8rDvt zgI7in5v;p%J74+;*+m=Q(8O=U7;0mRuIp4gfycVaxv2F!(!7#^AhyJ3&8gVTbe}hF zW*5BO-YGL<_Dm+ded*r$xj04F5aO@1IBI8xp$Ex4#5?+u$GF>+z6LeFW`16ze_1rs zpFGA~Pasvd(DkxKc5p$L+h~4)Y{47u&f{JX6vMDeIhCRZc;$Ha^Xx7@)QL83e@qn+ z7M)2V&mP8kqJRhlBM_iu0TYf$Qn<~eSfipys`9owHjwryhNh@g-op@6C0VAMpNR7J zzo3Ho{f0!#zcI>mS(d1}kJ0B?ymKGtZsr(S<(y};hz7x~mukldQS1bn$7{PtpXgMo q(OnUPe5{CIo#@yFsCI_V|IrpbpjzaXQgy9Fpw3m(m delta 478 zcmYLFze`(D8094InHnTkEY>0jQP5U2+;?+taublK1v@mNSPCsDs0fmwDO5VNMNrVi zr3o26oRWYF!M36lFI1@(ap-8o$w7ldK@j`{I_P^QI)3LD=R1e9p46OY_9s^Q4WVR& zN?EiMvoM;eJ@o153tYNrKZ-_g{QdZ3A~_WZ1ju>`q5lWb1f6<~R%A|=eVLwvdR>U) z$h75;YVPGDNh(P^rq~Rsb$S?mev|WXNM-Wx+URT%)4Dm0H_(4SV$Dtd1;ljm6Si92 zN-?|6S8qr$sV0;d{X)B+(Lkvj1|L*F`jry$uM1QBDS@R zd6y};kdmwwymBd~PghZZ5mZvx(6Di%RdlwBAssBhZnM85VSj$1-Lw~H)VqUT>e|K! p)5#)-awc*pUAF_}Dkt9Bobrxs`!~+ZooveBH&0NH9q8M`^J^w@mp%Xh diff --git a/public/js/profile~followers.bundle.731f680cfb96563d.js b/public/js/profile~followers.bundle.5deed93248f20662.js similarity index 70% rename from public/js/profile~followers.bundle.731f680cfb96563d.js rename to public/js/profile~followers.bundle.5deed93248f20662.js index 51805c382e38769537647ef7ba3b16dc547c3648..171ddf72d22d9d134c4aab433171c92a15a28e79 100644 GIT binary patch delta 144 zcmX?lmGQw9#tlncSWQgK3=JkLq)ATxU{So;)YXe^vZA@lW-gy&9IR#r#>PfKIm69t zp=&u=EG;cfCr?aOn>;^Okp(2RnK6Dh3#+-gp_#$tgUP-uhK3eqlMf~&Y%WUK3lm?E jE(NutG0S1{n>1NTsH>QcPY<2?#1_#!gl=SJ}MS`xpm{rLno; zl7I#trQ*tQIB)#)gvvLnJ3Vn3`?A?b6ORS;$8yNJ+ayFTPl#M6aMIKP@vS zRWBv8xF9F7GCnUcH`N}yuoXhMv^cd0q*7B`DJCzb1OzAFv{IkE)`w$rpZ7ivR!d`Z zL*vbXA@?|0OpOeTfeuieEFG%=5ufZ38?^aCTqX;vsezHP$z;1^UlvnSGo#J@$+E0a hv5gs0P`58kcbqJkc^a%@GEf*|;KFnVmfBcNYXBEbPSpSa diff --git a/public/js/spa.js b/public/js/spa.js index b496ba43251a148ddfce642a4907f3d58aa748e7..baee816fde3938837fdd8bc3557024567fec61c9 100644 GIT binary patch delta 365 zcmdnDf#>yho(;*lEapar7SjV`8PzARKNUJTec;1RA2@145kOhFa~V*ie`Mn%xY?4X>2^*I-YSFN3wyTp@n&> z+4h_9j4sS9hK7~~(-o5${aDS6j10`DXQwjya4Nyvvi)Q-<1-GZcE=I4j?(l?Jx2ek1;}xgvddB3zTbDC}iBOP{<^=8~~d8aC86w delta 372 zcmaF8ooC+$o(;*l%oY}A(=Qe6wb|WazAlRZmu_*e4*80^8O}{%}UkV zI8X#++6)a@jf~9AEG92BRGaK)5;}SPIl0XnjzlnScHX&~dGdly&YJ`F);F_QSQr=p z)fi0=$YbQ0UKPdYFnzf*qX37Qg@LI>l7-3i{mzW(2%eq`qZWdf;KF!y`U59MF}Tq7 ze@=|P(kv!MCZ>}Ex2sQF&of;&o>2kl2ZQN>@r;4nzsE7YVP-WkH#aq!{vwHS8b^wW zxlyu(LF)FlWJVWe79$fQ%jxIR82wm{3=ECTrW+0o9#Yz^Kj&3>%>O zhoy{;+s_p+hBAWn18tU{{-K1ClLZt6(;pTxI&Gg?#CVJmY9?4G$cd(4o$Y5!7`LA- IVUk-80OiDfUjP6A diff --git a/public/js/status.js b/public/js/status.js index fb8eb6b7e86a03c42ac511fad336168ad25accdf..0bced46dd3d20d9e7b270163514ab76dc3e32da8 100644 GIT binary patch delta 1028 zcmZ8gU1%I-6y1LGn`o$47gBukL0TB_q9THdSVXB99i>pHV4-Ls3RM(EioZ}uP18WEzcb1127LSOx%ZxP z@8N#mycJzIADv&olii%Gsxp~>pq+Lt;&D2cMD2(B@jbV-)H!T*2t~`W#_5KDOl;OJ z+9zzscIRl zj?-a@u30!~xneHw+PSG>XNPy=cw*bSjB8Dll1cHjnfJcfn>aK&YdSNQU{AHV2V8L@ z%DUn@8q_@)JgXCRS9wp*IIf*{tOLbtaabBDmFVNcc$U7th`5)(+31fQ#12N2G8$;{ zBeeK$Jc1zx#a}yw5%6kqB$=i9K6H33=eJYOEbj4N?ZZ|0r;cE#kI5<8{w+#0){iFd zpNm`k;TP}=BjY%B`}87|sAv3;cwc%a2byogPI^v26Fn10)W7gLUT)=7P18KXZ1)4R zKZ9?4innW8oSZpfPo2yPj``G_&?!uquKB=;ypS!5GX=-Hw7QQzzl4Op?<#&0cwN^r z61`W;_S3cB(M`WDp)qDklbN)fHbiYD&@Q^3mWD25#apx^f#0(e#9BS&E{B6bV|rjpj`#u>yHB8e0wu##gX6R_O_5 z8T<{+bYTVE|Er7L!RRJ5eFyjRs;*0Fb*+c|##KDZLR8Cm)2}Gha~Ew~7}3}o2K~qy zo&c|BR9UK~`EY~anAb4CDSB5|c-BK@;t=!~?xL6RX+{rh=1YU7{;sM|n+Aq^@#%#cY3yvFBrDk?A_t zUK9K<8i+81PSvrW%e)(jRECxtSTB7NXN7gz;51t4Y#poR!$V2anK(22H@C42<3cSu tvz1ly>sEw$8faiYmNyA$xzH4vkF(yIVDQj`jg}2d1|zJ85TbKMG*wX| zA)+K3t_L1O1VKbpKao^a;(>ao7l{Wc>MyCZszgJGoo#hIp6}js&pqe69oL*MuR0HP zU|$6@bZQ%bhuZIB1D*CDvvUz%2^&lHL~G4Rprt7o*=q(8-llLoToaCj6U`-|U?fr# z4DAlo?X3?b!qNI-)6?>QM}^s1V(yPMn(=t58Yr~6)O8H`$=E;+|GgZ!j8-Uc(UQB! zO@8SWdHD)#X7KSdt56M5^;CNT)bGfPVxqCIJpee^vnau4#4&Qek_e6`BJJ}{~tEaXjm`)F~;JmZoW(;)5jeP2Bg^TxH z!j%F+QT#f+`G6w6{WW^P4?M>845~SoT6gdf^7!#5cvqNV7?QQGP|#btWwwL8)^B#YQ08D6R2e1oQ2u;Sp@IQK}(fqi5eRCqvf!mem#>{f?DP zP!&~6E)Du<@CV#!i(R8w&qJfw1kvaBsYqW(9XsTUE%{1u2DAsY; zFH|y7m32*`Ex)lw)MQCE=;9w#WfuN((fJ1&6a8g|B%cYeHKHyVvTF70ygR^DWGkvt zrg=)j74c$4lO%=QBC8Y?NmlgnN&kL;_b_&Hl3?jsUsFK6Q(2~H=w&{Gy0h3)dOC&m zk15e@7b_C2Ym>%Gv$9yDU`f&J99Aq^H(>A-shN#SS%h>xsmo!Nbi>8^14$0Xm`G#D!>@T_^L7D&n diff --git a/public/js/stories.js b/public/js/stories.js index e38874d8ef59090d7b352ad949113541f47f1c33..5455268298a882e6f82b36d1155233eb0fb864b1 100644 GIT binary patch delta 415 zcmeBu#`yLrx60&38>$j9ASr4J?d6 z@{`kkyyljV!x9LzF7aQXAvHNaJscr$F5O2ACL3Fwk(!yF zQDS9jP?k|Ud11Q5WRDC%gxbUm4+Ljp#${xV;pDxUtq6g{43o)qS&|5W`B^3i&h0E0 z1ZRGh+GO8sE`&gQwkd*>m?1KGL$(n@;8pfc1ZQ>5T?A)BZWw~|E;kXuS)C(0xg>87 zLck*5liAeLabgR3eXU{n?ISw$i&iQa%q7ttEq{Rx%uSd1-=MfGKH%l@^(e) Y&`8NDa$wVeC diff --git a/public/js/timeline.js b/public/js/timeline.js index a0ec8756310e378e673bdf4ac86d04ada613f94e..ed0fc12141bf522d7956e39d2ec2ad665cf561a4 100644 GIT binary patch delta 539 zcmYL`&ubGw6vugQXU))B5o{~1HY6#SDph7@Hv6LorHu!LRuZA!Jgio$5TaBoCQdz+arpYQkk-mJFx_6Dyn)|e|T zj~ag=+pN|Kz0FGfJT}W~ule3-JK^1^0u~ z*Y0K}?wwg&DCzbGNS|Q7@9b7mRQ(AT>3s)|@Ic)3a#k*&tq#oZ-wHqAR3g^s>@WC4 z*nz?Sx=wYVoG_K|3q|k;WaM~3AN&n33>LmR^lTdxE$u*RFSXuS7eIonr?rU94vbzxbad&ALR0qp~(Qo>d=%5jF-LP{$3;WTX|uwQ@VXaln> zUr=8UUNRjig&XNJ`(@XA@LO-}UL3-#8U2l*U=SyD|51E}v43#{#|+!^cNG%DxL}0F x)EdE)X1I7K7bC~;xWS?zDh!20I4`w_F|SvWI16#XFowx+RB9)2l5V9i{|}fbr#%1w delta 601 zcmZuuPe>GD6z9G9#+}m4Vzm%=+c83r7-m1enfX?N(!F%ha-lALSVdMG&+RbtyUpT_iko2rNWg=pb7&v({eXo!aIA zvM!~|Gyc%`JFE5b_I`iyT8t??BV3_aIpGwF;eT`~$3?(4@3OCv)^_8{&p5 zZAV^~f~*=$HM@lx^f$XtHTX>DccAOvNKNlRF{Y&*kIo#%)3mY)r_`lgSk#!{!trm% z2Ig%{u|UkGTph+L%g9h0kPdBhVuVG3mRrY7oO*Edd%>lF)2JgA?+(_P)E_C zdl_k`=|(G#>aH!*f|fdPM0K>`Szui74CN2tIi1^S?uO84(@Ji$N#lh4IQtg-pkdr3Q)kjT$g*k(Z zd6W}7hM2saIl@mWK-Y?0g1{4CID!LZbbFVSvyoUL03XUYVGrk|mo1?wo>f<{UiaOr=Yg0gIiZFHi0*CPL^gxaM6-l_7cG zB$vj?72l(z@yn@elQL)}iIKW5tdxq=TG)v4T_Di-`_zpo+LJY;9#EyH6sq`SefqYH>M2qUN+HX>Y+xQ;|5nfBoS^!HEsB1}a#xD%DsTGGuReX^7*UGkb?U^k`jr z=dmKWesK4}{;g^M=G_N3Z{Pb$58CZ-zy9Ljm{XtLk&jIas39d60h~Gmt)5D?P&Otp z&STzNLqKUh`<6pRAETr3_{G{^t@zfXE24;E2kpxSrM30(1Ps&Z`3 zMS1> zB-m7D)Vuv-qxR@)xy%$h_TV_zHmncj%MI$9e~}a8T8I4Yl=5> zYjhu6WM{QKJ2Wel+8J{mNtWZ?N)@tPL?SLQmm)A^^uLjq>23vWhYqu?7 z_A;G`PKyzxQM2vaawBy<@x)t0Hr(Lbw4ul)zP Cu?S%R delta 1848 zcmZuy&5o5t5Y0tEm_g_AJ3?akK-7sLLs$P*mquN=^$ljx-BlI9pP2+*8WZ9JDE$H^ zu1!ql0SGH!LfsmlfrZwc`AFb8i@T}n@6@TPbLu|ddA{@8-eOWs(o}qRscQ6<9D;)q zTdasF(D-ig!Q_jF*bB5Q3N6NfAqh9|HHfbo#_x;WDOYt7bD@?w76f~rrBQ3_Q{mi4 zJ#~5PoVq>%_SzkU3V;|>1Y~k0WS>iJvFKqv^~2)5*oC4Kux}xGV`rewcyQp-+4b9Z zH>PPCw@zOfH&5S~x+_p)jo_MnM+a7MBmdJiWb`5+#m}C>7D_n47ZX zSk;%L5^@^9oVhavjugF8CGyVR0ys646fKkpY5aZW?u3q7@D6;A%w7UwRu`m)K!L55 z5ze}s8e_-zq?bNZA?9o+bC2^^v7i-oq)A;l3prmF(D-<&##S-0Y)FItt_6@m%eB$)t{jVt@+8VhxAKlaY6DdftvL^B3X>!X-6xxOHb>=%%(af6Hm{D)Hnx_g=iYOS*?A`>oB!uS^=0TQv>a*uk{O z$!Nd7biSE2-p(1o|u8n?+qeLCo;`(^*#ktM6j;SkMofKy|A^!;5#VhYN9tbc1w)0 zCGvV=2KF`uND_Q8-$^OXykU(7h|sjv@#E&z7Y?Cp*Qq3~9D1>1W6+mBnTNcddqFz` zxuh678eVMGE{4<)YgRUGr^9D&Tw7d)1PQHt&E4*8Ki=bb`sQ24?0=cn?tHApP6-Er zDp;B9f1yNGF##5{i9GSFaQq})j%V_|->ykp Date: Thu, 1 Feb 2024 23:20:12 -0700 Subject: [PATCH 11/38] Update changelog --- CHANGELOG.md | 1 + 1 file changed, 1 insertion(+) diff --git a/CHANGELOG.md b/CHANGELOG.md index 5c73b4e37..d762a135b 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -90,6 +90,7 @@ - Update login view, add email prefill logic ([d76f0168](https://github.com/pixelfed/pixelfed/commit/d76f0168)) - Update LoginController, fix captcha validation error message ([0325e171](https://github.com/pixelfed/pixelfed/commit/0325e171)) - Update ApiV1Controller, properly cast boolean sensitive parameter. Fixes #4888 ([0aff126a](https://github.com/pixelfed/pixelfed/commit/0aff126a)) +- Update AccountImport.vue, fix new IG export format ([59aa6a4b](https://github.com/pixelfed/pixelfed/commit/59aa6a4b)) - ([](https://github.com/pixelfed/pixelfed/commit/)) ## [v0.11.9 (2023-08-21)](https://github.com/pixelfed/pixelfed/compare/v0.11.8...v0.11.9) From 622e9cee9736e319285384bdd9194d4a8415828e Mon Sep 17 00:00:00 2001 From: Daniel Supernault Date: Fri, 2 Feb 2024 02:29:33 -0700 Subject: [PATCH 12/38] Add S3 IG Import Media Storage --- .../ImportUploadMediaToCloudStorage.php | 54 +++ .../ImportMediaToCloudPipeline.php | 124 +++++ app/Services/MediaStorageService.php | 445 ++++++++++-------- config/import.php | 6 + 4 files changed, 431 insertions(+), 198 deletions(-) create mode 100644 app/Console/Commands/ImportUploadMediaToCloudStorage.php create mode 100644 app/Jobs/ImportPipeline/ImportMediaToCloudPipeline.php diff --git a/app/Console/Commands/ImportUploadMediaToCloudStorage.php b/app/Console/Commands/ImportUploadMediaToCloudStorage.php new file mode 100644 index 000000000..bf23794c9 --- /dev/null +++ b/app/Console/Commands/ImportUploadMediaToCloudStorage.php @@ -0,0 +1,54 @@ +error('Aborted. Cloud storage is not enabled for IG imports.'); + return; + } + + $limit = $this->option('limit'); + + $progress = progress(label: 'Migrating import media', steps: $limit); + + $progress->start(); + + $posts = ImportPost::whereUploadedToS3(false)->take($limit)->get(); + + foreach($posts as $post) { + ImportMediaToCloudPipeline::dispatch($post)->onQueue('low'); + $progress->advance(); + } + + $progress->finish(); + } +} diff --git a/app/Jobs/ImportPipeline/ImportMediaToCloudPipeline.php b/app/Jobs/ImportPipeline/ImportMediaToCloudPipeline.php new file mode 100644 index 000000000..f884e7f2a --- /dev/null +++ b/app/Jobs/ImportPipeline/ImportMediaToCloudPipeline.php @@ -0,0 +1,124 @@ +importPost->id; + } + + /** + * Get the middleware the job should pass through. + * + * @return array + */ + public function middleware(): array + { + return [(new WithoutOverlapping("import-media-to-cloud-pipeline:ip-id:{$this->importPost->id}"))->shared()->dontRelease()]; + } + + /** + * Delete the job if its models no longer exist. + * + * @var bool + */ + public $deleteWhenMissingModels = true; + + /** + * Create a new job instance. + */ + public function __construct(ImportPost $importPost) + { + $this->importPost = $importPost; + } + + /** + * Execute the job. + */ + public function handle(): void + { + $ip = $this->importPost; + + if( + $ip->status_id === null || + $ip->uploaded_to_s3 === true || + (bool) config_cache('pixelfed.cloud_storage') === false) { + return; + } + + $media = Media::whereStatusId($ip->status_id)->get(); + + if(!$media || !$media->count()) { + $importPost = ImportPost::find($ip->id); + $importPost->uploaded_to_s3 = true; + $importPost->save(); + return; + } + + foreach($media as $mediaPart) { + $this->handleMedia($mediaPart); + } + } + + protected function handleMedia($media) + { + $ip = $this->importPost; + + $importPost = ImportPost::find($ip->id); + + if(!$importPost) { + return; + } + + $res = MediaStorageService::move($media); + + $importPost->uploaded_to_s3 = true; + $importPost->save(); + + if(!$res) { + return; + } + + if($res === 'invalid file') { + return; + } + + if($res === 'success') { + Storage::disk('local')->delete($media->media_path); + } + } +} diff --git a/app/Services/MediaStorageService.php b/app/Services/MediaStorageService.php index 128001de2..216e37497 100644 --- a/app/Services/MediaStorageService.php +++ b/app/Services/MediaStorageService.php @@ -21,28 +21,40 @@ use App\Jobs\AvatarPipeline\AvatarStorageCleanup; class MediaStorageService { - public static function store(Media $media) - { - if(config_cache('pixelfed.cloud_storage') == true) { - (new self())->cloudStore($media); - } + public static function store(Media $media) + { + if(config_cache('pixelfed.cloud_storage') == true) { + (new self())->cloudStore($media); + } - return; - } + return; + } - public static function avatar($avatar, $local = false, $skipRecentCheck = false) - { - return (new self())->fetchAvatar($avatar, $local, $skipRecentCheck); - } + public static function move(Media $media) + { + if($media->remote_media) { + return; + } - public static function head($url) - { - $c = new Client(); - try { - $r = $c->request('HEAD', $url); - } catch (RequestException $e) { - return false; - } + if(config_cache('pixelfed.cloud_storage') == true) { + return (new self())->cloudMove($media); + } + return; + } + + public static function avatar($avatar, $local = false, $skipRecentCheck = false) + { + return (new self())->fetchAvatar($avatar, $local, $skipRecentCheck); + } + + public static function head($url) + { + $c = new Client(); + try { + $r = $c->request('HEAD', $url); + } catch (RequestException $e) { + return false; + } $h = Arr::mapWithKeys($r->getHeaders(), function($item, $key) { return [strtolower($key) => last($item)]; @@ -55,224 +67,261 @@ class MediaStorageService { $len = (int) $h['content-length']; $mime = $h['content-type']; - if($len < 10 || $len > ((config_cache('pixelfed.max_photo_size') * 1000))) { - return false; - } + if($len < 10 || $len > ((config_cache('pixelfed.max_photo_size') * 1000))) { + return false; + } - return [ - 'length' => $len, - 'mime' => $mime - ]; - } + return [ + 'length' => $len, + 'mime' => $mime + ]; + } - protected function cloudStore($media) - { - if($media->remote_media == true) { - if(config('media.storage.remote.cloud')) { - (new self())->remoteToCloud($media); - } - } else { - (new self())->localToCloud($media); - } - } + protected function cloudStore($media) + { + if($media->remote_media == true) { + if(config('media.storage.remote.cloud')) { + (new self())->remoteToCloud($media); + } + } else { + (new self())->localToCloud($media); + } + } - protected function localToCloud($media) - { - $path = storage_path('app/'.$media->media_path); - $thumb = storage_path('app/'.$media->thumbnail_path); + protected function localToCloud($media) + { + $path = storage_path('app/'.$media->media_path); + $thumb = storage_path('app/'.$media->thumbnail_path); - $p = explode('/', $media->media_path); - $name = array_pop($p); - $pt = explode('/', $media->thumbnail_path); - $thumbname = array_pop($pt); - $storagePath = implode('/', $p); + $p = explode('/', $media->media_path); + $name = array_pop($p); + $pt = explode('/', $media->thumbnail_path); + $thumbname = array_pop($pt); + $storagePath = implode('/', $p); - $url = ResilientMediaStorageService::store($storagePath, $path, $name); - if($thumb) { - $thumbUrl = ResilientMediaStorageService::store($storagePath, $thumb, $thumbname); - $media->thumbnail_url = $thumbUrl; - } - $media->cdn_url = $url; - $media->optimized_url = $url; - $media->replicated_at = now(); - $media->save(); - if($media->status_id) { - Cache::forget('status:transformer:media:attachments:' . $media->status_id); - MediaService::del($media->status_id); - StatusService::del($media->status_id, false); - } - } + $url = ResilientMediaStorageService::store($storagePath, $path, $name); + if($thumb) { + $thumbUrl = ResilientMediaStorageService::store($storagePath, $thumb, $thumbname); + $media->thumbnail_url = $thumbUrl; + } + $media->cdn_url = $url; + $media->optimized_url = $url; + $media->replicated_at = now(); + $media->save(); + if($media->status_id) { + Cache::forget('status:transformer:media:attachments:' . $media->status_id); + MediaService::del($media->status_id); + StatusService::del($media->status_id, false); + } + } - protected function remoteToCloud($media) - { - $url = $media->remote_url; + protected function remoteToCloud($media) + { + $url = $media->remote_url; - if(!Helpers::validateUrl($url)) { - return; - } + if(!Helpers::validateUrl($url)) { + return; + } - $head = $this->head($media->remote_url); + $head = $this->head($media->remote_url); - if(!$head) { - return; - } + if(!$head) { + return; + } - $mimes = [ - 'image/jpeg', - 'image/png', - 'video/mp4' - ]; + $mimes = [ + 'image/jpeg', + 'image/png', + 'video/mp4' + ]; - $mime = $head['mime']; - $max_size = (int) config_cache('pixelfed.max_photo_size') * 1000; - $media->size = $head['length']; - $media->remote_media = true; - $media->save(); + $mime = $head['mime']; + $max_size = (int) config_cache('pixelfed.max_photo_size') * 1000; + $media->size = $head['length']; + $media->remote_media = true; + $media->save(); - if(!in_array($mime, $mimes)) { - return; - } + if(!in_array($mime, $mimes)) { + return; + } - if($head['length'] >= $max_size) { - return; - } + if($head['length'] >= $max_size) { + return; + } - switch ($mime) { - case 'image/png': - $ext = '.png'; - break; + switch ($mime) { + case 'image/png': + $ext = '.png'; + break; - case 'image/gif': - $ext = '.gif'; - break; + case 'image/gif': + $ext = '.gif'; + break; - case 'image/jpeg': - $ext = '.jpg'; - break; + case 'image/jpeg': + $ext = '.jpg'; + break; - case 'video/mp4': - $ext = '.mp4'; - break; - } + case 'video/mp4': + $ext = '.mp4'; + break; + } - $base = MediaPathService::get($media->profile); - $path = Str::random(40) . $ext; - $tmpBase = storage_path('app/remcache/'); - $tmpPath = $media->profile_id . '-' . $path; - $tmpName = $tmpBase . $tmpPath; - $data = file_get_contents($url, false, null, 0, $head['length']); - file_put_contents($tmpName, $data); - $hash = hash_file('sha256', $tmpName); + $base = MediaPathService::get($media->profile); + $path = Str::random(40) . $ext; + $tmpBase = storage_path('app/remcache/'); + $tmpPath = $media->profile_id . '-' . $path; + $tmpName = $tmpBase . $tmpPath; + $data = file_get_contents($url, false, null, 0, $head['length']); + file_put_contents($tmpName, $data); + $hash = hash_file('sha256', $tmpName); - $disk = Storage::disk(config('filesystems.cloud')); - $file = $disk->putFileAs($base, new File($tmpName), $path, 'public'); - $permalink = $disk->url($file); + $disk = Storage::disk(config('filesystems.cloud')); + $file = $disk->putFileAs($base, new File($tmpName), $path, 'public'); + $permalink = $disk->url($file); - $media->media_path = $file; - $media->cdn_url = $permalink; - $media->original_sha256 = $hash; - $media->replicated_at = now(); - $media->save(); + $media->media_path = $file; + $media->cdn_url = $permalink; + $media->original_sha256 = $hash; + $media->replicated_at = now(); + $media->save(); - if($media->status_id) { - Cache::forget('status:transformer:media:attachments:' . $media->status_id); - } + if($media->status_id) { + Cache::forget('status:transformer:media:attachments:' . $media->status_id); + } - unlink($tmpName); - } + unlink($tmpName); + } - protected function fetchAvatar($avatar, $local = false, $skipRecentCheck = false) - { - $queue = random_int(1, 15) > 5 ? 'mmo' : 'low'; - $url = $avatar->remote_url; - $driver = $local ? 'local' : config('filesystems.cloud'); + protected function fetchAvatar($avatar, $local = false, $skipRecentCheck = false) + { + $queue = random_int(1, 15) > 5 ? 'mmo' : 'low'; + $url = $avatar->remote_url; + $driver = $local ? 'local' : config('filesystems.cloud'); - if(empty($url) || Helpers::validateUrl($url) == false) { - return; - } + if(empty($url) || Helpers::validateUrl($url) == false) { + return; + } - $head = $this->head($url); + $head = $this->head($url); - if($head == false) { - return; - } + if($head == false) { + return; + } - $mimes = [ - 'application/octet-stream', - 'image/jpeg', - 'image/png', - ]; + $mimes = [ + 'application/octet-stream', + 'image/jpeg', + 'image/png', + ]; - $mime = $head['mime']; - $max_size = (int) config('pixelfed.max_avatar_size') * 1000; + $mime = $head['mime']; + $max_size = (int) config('pixelfed.max_avatar_size') * 1000; - if(!$skipRecentCheck) { - if($avatar->last_fetched_at && $avatar->last_fetched_at->gt(now()->subMonths(3))) { - return; - } - } + if(!$skipRecentCheck) { + if($avatar->last_fetched_at && $avatar->last_fetched_at->gt(now()->subMonths(3))) { + return; + } + } - Cache::forget('avatar:' . $avatar->profile_id); - AccountService::del($avatar->profile_id); + Cache::forget('avatar:' . $avatar->profile_id); + AccountService::del($avatar->profile_id); - // handle pleroma edge case - if(Str::endsWith($mime, '; charset=utf-8')) { - $mime = str_replace('; charset=utf-8', '', $mime); - } + // handle pleroma edge case + if(Str::endsWith($mime, '; charset=utf-8')) { + $mime = str_replace('; charset=utf-8', '', $mime); + } - if(!in_array($mime, $mimes)) { - return; - } + if(!in_array($mime, $mimes)) { + return; + } - if($head['length'] >= $max_size) { - return; - } + if($head['length'] >= $max_size) { + return; + } - $base = ($local ? 'public/cache/' : 'cache/') . 'avatars/' . $avatar->profile_id; - $ext = $head['mime'] == 'image/jpeg' ? 'jpg' : 'png'; - $path = 'avatar_' . strtolower(Str::random(random_int(3,6))) . '.' . $ext; - $tmpBase = storage_path('app/remcache/'); - $tmpPath = 'avatar_' . $avatar->profile_id . '-' . $path; - $tmpName = $tmpBase . $tmpPath; - $data = @file_get_contents($url, false, null, 0, $head['length']); - if(!$data) { - return; - } - file_put_contents($tmpName, $data); + $base = ($local ? 'public/cache/' : 'cache/') . 'avatars/' . $avatar->profile_id; + $ext = $head['mime'] == 'image/jpeg' ? 'jpg' : 'png'; + $path = 'avatar_' . strtolower(Str::random(random_int(3,6))) . '.' . $ext; + $tmpBase = storage_path('app/remcache/'); + $tmpPath = 'avatar_' . $avatar->profile_id . '-' . $path; + $tmpName = $tmpBase . $tmpPath; + $data = @file_get_contents($url, false, null, 0, $head['length']); + if(!$data) { + return; + } + file_put_contents($tmpName, $data); - $mimeCheck = Storage::mimeType('remcache/' . $tmpPath); + $mimeCheck = Storage::mimeType('remcache/' . $tmpPath); - if(!$mimeCheck || !in_array($mimeCheck, ['image/png', 'image/jpeg'])) { - $avatar->last_fetched_at = now(); - $avatar->save(); - unlink($tmpName); - return; - } + if(!$mimeCheck || !in_array($mimeCheck, ['image/png', 'image/jpeg'])) { + $avatar->last_fetched_at = now(); + $avatar->save(); + unlink($tmpName); + return; + } - $disk = Storage::disk($driver); - $file = $disk->putFileAs($base, new File($tmpName), $path, 'public'); - $permalink = $disk->url($file); + $disk = Storage::disk($driver); + $file = $disk->putFileAs($base, new File($tmpName), $path, 'public'); + $permalink = $disk->url($file); - $avatar->media_path = $base . '/' . $path; - $avatar->is_remote = true; - $avatar->cdn_url = $local ? config('app.url') . $permalink : $permalink; - $avatar->size = $head['length']; - $avatar->change_count = $avatar->change_count + 1; - $avatar->last_fetched_at = now(); - $avatar->save(); + $avatar->media_path = $base . '/' . $path; + $avatar->is_remote = true; + $avatar->cdn_url = $local ? config('app.url') . $permalink : $permalink; + $avatar->size = $head['length']; + $avatar->change_count = $avatar->change_count + 1; + $avatar->last_fetched_at = now(); + $avatar->save(); - Cache::forget('avatar:' . $avatar->profile_id); - AccountService::del($avatar->profile_id); - AvatarStorageCleanup::dispatch($avatar)->onQueue($queue)->delay(now()->addMinutes(random_int(3, 15))); + Cache::forget('avatar:' . $avatar->profile_id); + AccountService::del($avatar->profile_id); + AvatarStorageCleanup::dispatch($avatar)->onQueue($queue)->delay(now()->addMinutes(random_int(3, 15))); - unlink($tmpName); - } + unlink($tmpName); + } - public static function delete(Media $media, $confirm = false) - { - if(!$confirm) { - return; - } - MediaDeletePipeline::dispatch($media)->onQueue('mmo'); - } + public static function delete(Media $media, $confirm = false) + { + if(!$confirm) { + return; + } + MediaDeletePipeline::dispatch($media)->onQueue('mmo'); + } + + protected function cloudMove($media) + { + if(!Storage::exists($media->media_path)) { + return 'invalid file'; + } + + $path = storage_path('app/'.$media->media_path); + $thumb = false; + if($media->thumbnail_path) { + $thumb = storage_path('app/'.$media->thumbnail_path); + $pt = explode('/', $media->thumbnail_path); + $thumbname = array_pop($pt); + } + + $p = explode('/', $media->media_path); + $name = array_pop($p); + $storagePath = implode('/', $p); + + $url = ResilientMediaStorageService::store($storagePath, $path, $name); + if($thumb) { + $thumbUrl = ResilientMediaStorageService::store($storagePath, $thumb, $thumbname); + $media->thumbnail_url = $thumbUrl; + } + $media->cdn_url = $url; + $media->optimized_url = $url; + $media->replicated_at = now(); + $media->save(); + + if($media->status_id) { + Cache::forget('status:transformer:media:attachments:' . $media->status_id); + MediaService::del($media->status_id); + StatusService::del($media->status_id, false); + } + + return 'success'; + } } diff --git a/config/import.php b/config/import.php index 2d1af28e1..f754da490 100644 --- a/config/import.php +++ b/config/import.php @@ -39,6 +39,12 @@ return [ // Limit to specific user ids, in comma separated format 'user_ids' => env('PF_IMPORT_IG_PERM_ONLY_USER_IDS', null), + ], + + 'storage' => [ + 'cloud' => [ + 'enabled' => env('PF_IMPORT_IG_CLOUD_STORAGE', env('PF_ENABLE_CLOUD', false)), + ] ] ] ]; From edbb07cc37a6636bb4e4a1931b6ebe7f25652ce0 Mon Sep 17 00:00:00 2001 From: Daniel Supernault Date: Fri, 2 Feb 2024 05:30:32 -0700 Subject: [PATCH 13/38] Add import video thumbnail job --- .../ImportMediaToCloudPipeline.php | 7 +- .../VideoThumbnailToCloudPipeline.php | 147 ++++++++++++++++++ 2 files changed, 153 insertions(+), 1 deletion(-) create mode 100644 app/Jobs/VideoPipeline/VideoThumbnailToCloudPipeline.php diff --git a/app/Jobs/ImportPipeline/ImportMediaToCloudPipeline.php b/app/Jobs/ImportPipeline/ImportMediaToCloudPipeline.php index f884e7f2a..cdf91e376 100644 --- a/app/Jobs/ImportPipeline/ImportMediaToCloudPipeline.php +++ b/app/Jobs/ImportPipeline/ImportMediaToCloudPipeline.php @@ -14,6 +14,7 @@ use App\Models\ImportPost; use App\Media; use App\Services\MediaStorageService; use Illuminate\Support\Facades\Storage; +use App\Jobs\VideoPipeline\VideoThumbnailToCloudPipeline; class ImportMediaToCloudPipeline implements ShouldQueue, ShouldBeUniqueUntilProcessing { @@ -118,7 +119,11 @@ class ImportMediaToCloudPipeline implements ShouldQueue, ShouldBeUniqueUntilProc } if($res === 'success') { - Storage::disk('local')->delete($media->media_path); + if($media->mime === 'video/mp4') { + VideoThumbnailToCloudPipeline::dispatch($media)->onQueue('low'); + } else { + Storage::disk('local')->delete($media->media_path); + } } } } diff --git a/app/Jobs/VideoPipeline/VideoThumbnailToCloudPipeline.php b/app/Jobs/VideoPipeline/VideoThumbnailToCloudPipeline.php new file mode 100644 index 000000000..87931bd7a --- /dev/null +++ b/app/Jobs/VideoPipeline/VideoThumbnailToCloudPipeline.php @@ -0,0 +1,147 @@ +media->id; + } + + /** + * Get the middleware the job should pass through. + * + * @return array + */ + public function middleware(): array + { + return [(new WithoutOverlapping("media:video-thumb-to-cloud:id-{$this->media->id}"))->shared()->dontRelease()]; + } + + /** + * Create a new job instance. + */ + public function __construct(Media $media) + { + $this->media = $media; + } + + /** + * Execute the job. + */ + public function handle(): void + { + if((bool) config_cache('pixelfed.cloud_storage') === false) { + return; + } + + $media = $this->media; + + if($media->mime != 'video/mp4') { + return; + } + + if($media->profile_id === null || $media->status_id === null) { + return; + } + + if($media->thumbnail_url) { + return; + } + + $base = $media->media_path; + $path = explode('/', $base); + $name = last($path); + + try { + $t = explode('.', $name); + $t = $t[0].'_thumb.jpeg'; + $i = count($path) - 1; + $path[$i] = $t; + $save = implode('/', $path); + $video = FFMpeg::open($base) + ->getFrameFromSeconds(1) + ->export() + ->toDisk('local') + ->save($save); + + if(!$save) { + return; + } + + $media->thumbnail_path = $save; + $p = explode('/', $media->media_path); + array_pop($p); + $pt = explode('/', $save); + $thumbname = array_pop($pt); + $storagePath = implode('/', $p); + $thumb = storage_path('app/' . $save); + $thumbUrl = ResilientMediaStorageService::store($storagePath, $thumb, $thumbname); + $media->thumbnail_url = $thumbUrl; + $media->save(); + + $blurhash = Blurhash::generate($media); + if($blurhash) { + $media->blurhash = $blurhash; + $media->save(); + } + + if(str_starts_with($save, 'public/m/_v2/') && str_ends_with($save, '.jpeg')) { + Storage::delete($save); + } + + if(str_starts_with($media->media_path, 'public/m/_v2/') && str_ends_with($media->media_path, '.mp4')) { + Storage::disk('local')->delete($media->media_path); + } + } catch (Exception $e) { + } + + if($media->status_id) { + Cache::forget('status:transformer:media:attachments:' . $media->status_id); + MediaService::del($media->status_id); + Cache::forget('status:thumb:nsfw0' . $media->status_id); + Cache::forget('status:thumb:nsfw1' . $media->status_id); + Cache::forget('pf:services:sh:id:' . $media->status_id); + StatusService::del($media->status_id); + } + } +} From 081360b905a1541c0e2ecc84226d8df5c511e406 Mon Sep 17 00:00:00 2001 From: Daniel Supernault Date: Fri, 2 Feb 2024 05:45:06 -0700 Subject: [PATCH 14/38] Update console kernel, add ig import s3 job --- app/Console/Kernel.php | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/app/Console/Kernel.php b/app/Console/Kernel.php index 4148e38ab..aadaa1f7a 100644 --- a/app/Console/Kernel.php +++ b/app/Console/Kernel.php @@ -42,6 +42,10 @@ class Kernel extends ConsoleKernel $schedule->command('app:import-upload-garbage-collection')->hourlyAt(51); $schedule->command('app:import-remove-deleted-accounts')->hourlyAt(37); $schedule->command('app:import-upload-clean-storage')->twiceDailyAt(1, 13, 32); + + if(config('import.instagram.storage.cloud.enabled') && (bool) config_cache('pixelfed.cloud_storage')) { + $schedule->command('app:import-upload-media-to-cloud-storage')->hourlyAt(39); + } } $schedule->command('app:notification-epoch-update')->weeklyOn(1, '2:21'); $schedule->command('app:hashtag-cached-count-update')->hourlyAt(25); From 04c5e550a529308d0db93a7c92aba8bdc986adab Mon Sep 17 00:00:00 2001 From: Daniel Supernault Date: Fri, 2 Feb 2024 05:46:28 -0700 Subject: [PATCH 15/38] Update changelog --- CHANGELOG.md | 1 + 1 file changed, 1 insertion(+) diff --git a/CHANGELOG.md b/CHANGELOG.md index d762a135b..e6e4513d5 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -15,6 +15,7 @@ - Added User Domain Blocks ([#4834](https://github.com/pixelfed/pixelfed/pull/4834)) ([fa0380ac](https://github.com/pixelfed/pixelfed/commit/fa0380ac)) - Added Parental Controls ([#4862](https://github.com/pixelfed/pixelfed/pull/4862)) ([c91f1c59](https://github.com/pixelfed/pixelfed/commit/c91f1c59)) - Added Forgot Email Feature ([67c650b1](https://github.com/pixelfed/pixelfed/commit/67c650b1)) +- Added S3 IG Import Media Storage support ([#4891](https://github.com/pixelfed/pixelfed/pull/4891)) ([081360b9](https://github.com/pixelfed/pixelfed/commit/081360b9)) ### Federation - Update Privacy Settings, add support for Mastodon `indexable` search flag ([fc24630e](https://github.com/pixelfed/pixelfed/commit/fc24630e)) From 32c59f044030b875607fcca8c45723968b40bfb9 Mon Sep 17 00:00:00 2001 From: Daniel Supernault Date: Sat, 3 Feb 2024 13:30:02 -0700 Subject: [PATCH 16/38] Update TransformImports command, fix import service condition --- app/Console/Commands/TransformImports.php | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/app/Console/Commands/TransformImports.php b/app/Console/Commands/TransformImports.php index b88401178..a5a4dbb7a 100644 --- a/app/Console/Commands/TransformImports.php +++ b/app/Console/Commands/TransformImports.php @@ -70,6 +70,11 @@ class TransformImports extends Command } $idk = ImportService::getId($ip->user_id, $ip->creation_year, $ip->creation_month, $ip->creation_day); + if(!$idk) { + $ip->skip_missing_media = true; + $ip->save(); + continue; + } if(Storage::exists('imports/' . $id . '/' . $ip->filename) === false) { ImportService::clearAttempts($profile->id); From d3ff89e538076debf916386ba92b19eae81aa0c0 Mon Sep 17 00:00:00 2001 From: Daniel Supernault Date: Sat, 3 Feb 2024 13:31:11 -0700 Subject: [PATCH 17/38] Update changelog --- CHANGELOG.md | 1 + 1 file changed, 1 insertion(+) diff --git a/CHANGELOG.md b/CHANGELOG.md index e6e4513d5..cc42cb51f 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -92,6 +92,7 @@ - Update LoginController, fix captcha validation error message ([0325e171](https://github.com/pixelfed/pixelfed/commit/0325e171)) - Update ApiV1Controller, properly cast boolean sensitive parameter. Fixes #4888 ([0aff126a](https://github.com/pixelfed/pixelfed/commit/0aff126a)) - Update AccountImport.vue, fix new IG export format ([59aa6a4b](https://github.com/pixelfed/pixelfed/commit/59aa6a4b)) +- Update TransformImports command, fix import service condition ([32c59f04](https://github.com/pixelfed/pixelfed/commit/32c59f04)) - ([](https://github.com/pixelfed/pixelfed/commit/)) ## [v0.11.9 (2023-08-21)](https://github.com/pixelfed/pixelfed/compare/v0.11.8...v0.11.9) From 7caed381fb784c0b228423888b69d1fb38dbfbe7 Mon Sep 17 00:00:00 2001 From: Daniel Supernault Date: Sun, 4 Feb 2024 02:40:04 -0700 Subject: [PATCH 18/38] Update AP helpers, more efficently update post counts --- .../Commands/AccountPostCountStatUpdate.php | 57 +++++++++++++++++++ app/Console/Kernel.php | 3 +- app/Services/Account/AccountStatService.php | 26 +++++++++ app/Util/ActivityPub/Helpers.php | 3 +- 4 files changed, 87 insertions(+), 2 deletions(-) create mode 100644 app/Console/Commands/AccountPostCountStatUpdate.php create mode 100644 app/Services/Account/AccountStatService.php diff --git a/app/Console/Commands/AccountPostCountStatUpdate.php b/app/Console/Commands/AccountPostCountStatUpdate.php new file mode 100644 index 000000000..6d5ba00a6 --- /dev/null +++ b/app/Console/Commands/AccountPostCountStatUpdate.php @@ -0,0 +1,57 @@ +count(); + if($statusCount != $acct['statuses_count']) { + $profile = Profile::find($id); + if(!$profile) { + AccountStatService::removeFromPostCount($id); + continue; + } + $profile->status_count = $statusCount; + $profile->save(); + AccountService::del($id); + } + AccountStatService::removeFromPostCount($id); + } + return; + } +} diff --git a/app/Console/Kernel.php b/app/Console/Kernel.php index aadaa1f7a..7953ea783 100644 --- a/app/Console/Kernel.php +++ b/app/Console/Kernel.php @@ -38,7 +38,7 @@ class Kernel extends ConsoleKernel } if(config('import.instagram.enabled')) { - $schedule->command('app:transform-imports')->everyFourMinutes(); + $schedule->command('app:transform-imports')->everyTenMinutes(); $schedule->command('app:import-upload-garbage-collection')->hourlyAt(51); $schedule->command('app:import-remove-deleted-accounts')->hourlyAt(37); $schedule->command('app:import-upload-clean-storage')->twiceDailyAt(1, 13, 32); @@ -49,6 +49,7 @@ class Kernel extends ConsoleKernel } $schedule->command('app:notification-epoch-update')->weeklyOn(1, '2:21'); $schedule->command('app:hashtag-cached-count-update')->hourlyAt(25); + $schedule->command('app:account-post-count-stat-update')->everySixHours(25); } /** diff --git a/app/Services/Account/AccountStatService.php b/app/Services/Account/AccountStatService.php new file mode 100644 index 000000000..0b5d45a3e --- /dev/null +++ b/app/Services/Account/AccountStatService.php @@ -0,0 +1,26 @@ +onQueue('low'); + AccountStatService::incrementPostCount($pid); if( $status->in_reply_to_id === null && in_array($status->type, ['photo', 'photo:album', 'video', 'video:album', 'photo:video:album']) From ddf7f09ad41bd2b935ebfb360286e48a4c6370f0 Mon Sep 17 00:00:00 2001 From: Daniel Supernault Date: Sun, 4 Feb 2024 02:40:59 -0700 Subject: [PATCH 19/38] Update changelog --- CHANGELOG.md | 1 + 1 file changed, 1 insertion(+) diff --git a/CHANGELOG.md b/CHANGELOG.md index cc42cb51f..c37659fba 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -93,6 +93,7 @@ - Update ApiV1Controller, properly cast boolean sensitive parameter. Fixes #4888 ([0aff126a](https://github.com/pixelfed/pixelfed/commit/0aff126a)) - Update AccountImport.vue, fix new IG export format ([59aa6a4b](https://github.com/pixelfed/pixelfed/commit/59aa6a4b)) - Update TransformImports command, fix import service condition ([32c59f04](https://github.com/pixelfed/pixelfed/commit/32c59f04)) +- Update AP helpers, more efficently update post count ([7caed381](https://github.com/pixelfed/pixelfed/commit/7caed381)) - ([](https://github.com/pixelfed/pixelfed/commit/)) ## [v0.11.9 (2023-08-21)](https://github.com/pixelfed/pixelfed/compare/v0.11.8...v0.11.9) From b81ae5773f82e823ce53892e4abdc8cdae509c78 Mon Sep 17 00:00:00 2001 From: Daniel Supernault Date: Sun, 4 Feb 2024 02:50:48 -0700 Subject: [PATCH 20/38] Update AP helpers, refactor post count decrement logic --- app/Jobs/DeletePipeline/DeleteRemoteStatusPipeline.php | 7 ++----- app/Jobs/StatusPipeline/RemoteStatusDelete.php | 6 ++---- app/Services/Account/AccountStatService.php | 5 +++++ app/Util/ActivityPub/Helpers.php | 2 -- app/Util/ActivityPub/Inbox.php | 2 -- 5 files changed, 9 insertions(+), 13 deletions(-) diff --git a/app/Jobs/DeletePipeline/DeleteRemoteStatusPipeline.php b/app/Jobs/DeletePipeline/DeleteRemoteStatusPipeline.php index 4969fca2f..77cd5286f 100644 --- a/app/Jobs/DeletePipeline/DeleteRemoteStatusPipeline.php +++ b/app/Jobs/DeletePipeline/DeleteRemoteStatusPipeline.php @@ -22,9 +22,9 @@ use App\Notification; use App\Services\AccountService; use App\Services\NetworkTimelineService; use App\Services\StatusService; -use App\Jobs\ProfilePipeline\DecrementPostCount; use App\Jobs\MediaPipeline\MediaDeletePipeline; use Cache; +use App\Services\Account\AccountStatService; class DeleteRemoteStatusPipeline implements ShouldQueue { @@ -56,10 +56,7 @@ class DeleteRemoteStatusPipeline implements ShouldQueue { $status = $this->status; - if(AccountService::get($status->profile_id, true)) { - DecrementPostCount::dispatch($status->profile_id)->onQueue('low'); - } - + AccountStatService::decrementPostCount($status->profile_id); NetworkTimelineService::del($status->id); StatusService::del($status->id, true); Bookmark::whereStatusId($status->id)->delete(); diff --git a/app/Jobs/StatusPipeline/RemoteStatusDelete.php b/app/Jobs/StatusPipeline/RemoteStatusDelete.php index 07a2f6236..a81607755 100644 --- a/app/Jobs/StatusPipeline/RemoteStatusDelete.php +++ b/app/Jobs/StatusPipeline/RemoteStatusDelete.php @@ -39,8 +39,8 @@ use App\Services\AccountService; use App\Services\CollectionService; use App\Services\StatusService; use App\Jobs\MediaPipeline\MediaDeletePipeline; -use App\Jobs\ProfilePipeline\DecrementPostCount; use App\Services\NotificationService; +use App\Services\Account\AccountStatService; class RemoteStatusDelete implements ShouldQueue, ShouldBeUniqueUntilProcessing { @@ -109,9 +109,7 @@ class RemoteStatusDelete implements ShouldQueue, ShouldBeUniqueUntilProcessing } StatusService::del($status->id, true); - - DecrementPostCount::dispatch($status->profile_id)->onQueue('inbox'); - + AccountStatService::decrementPostCount($status->profile_id); return $this->unlinkRemoveMedia($status); } diff --git a/app/Services/Account/AccountStatService.php b/app/Services/Account/AccountStatService.php index 0b5d45a3e..12fd3f94f 100644 --- a/app/Services/Account/AccountStatService.php +++ b/app/Services/Account/AccountStatService.php @@ -14,6 +14,11 @@ class AccountStatService return Redis::zadd(self::REFRESH_CACHE_KEY, $pid, $pid); } + public static function decrementPostCount($pid) + { + return Redis::zadd(self::REFRESH_CACHE_KEY, $pid, $pid); + } + public static function removeFromPostCount($pid) { return Redis::zrem(self::REFRESH_CACHE_KEY, $pid); diff --git a/app/Util/ActivityPub/Helpers.php b/app/Util/ActivityPub/Helpers.php index 4e71a2fae..511ef2502 100644 --- a/app/Util/ActivityPub/Helpers.php +++ b/app/Util/ActivityPub/Helpers.php @@ -39,8 +39,6 @@ use App\Jobs\HomeFeedPipeline\FeedInsertRemotePipeline; use App\Util\Media\License; use App\Models\Poll; use Illuminate\Contracts\Cache\LockTimeoutException; -use App\Jobs\ProfilePipeline\IncrementPostCount; -use App\Jobs\ProfilePipeline\DecrementPostCount; use App\Services\DomainService; use App\Services\UserFilterService; use App\Services\Account\AccountStatService; diff --git a/app/Util/ActivityPub/Inbox.php b/app/Util/ActivityPub/Inbox.php index e26f0a48c..5c9959e17 100644 --- a/app/Util/ActivityPub/Inbox.php +++ b/app/Util/ActivityPub/Inbox.php @@ -48,8 +48,6 @@ use App\Services\UserFilterService; use App\Services\NetworkTimelineService; use App\Models\Conversation; use App\Models\RemoteReport; -use App\Jobs\ProfilePipeline\IncrementPostCount; -use App\Jobs\ProfilePipeline\DecrementPostCount; use App\Jobs\HomeFeedPipeline\FeedRemoveRemotePipeline; class Inbox From 8b843d620cea62b3a272f8f305574c7ad0ab25a0 Mon Sep 17 00:00:00 2001 From: Daniel Supernault Date: Sun, 4 Feb 2024 02:53:40 -0700 Subject: [PATCH 21/38] Update ProfilePipeline jobs --- .../ProfilePipeline/DecrementPostCount.php | 15 +----- .../ProfilePipeline/IncrementPostCount.php | 49 ++----------------- 2 files changed, 5 insertions(+), 59 deletions(-) diff --git a/app/Jobs/ProfilePipeline/DecrementPostCount.php b/app/Jobs/ProfilePipeline/DecrementPostCount.php index b463f1dda..74d0523b5 100644 --- a/app/Jobs/ProfilePipeline/DecrementPostCount.php +++ b/app/Jobs/ProfilePipeline/DecrementPostCount.php @@ -35,18 +35,7 @@ class DecrementPostCount implements ShouldQueue */ public function handle() { - $id = $this->id; - - $profile = Profile::find($id); - - if(!$profile) { - return 1; - } - - $profile->status_count = $profile->status_count ? $profile->status_count - 1 : 0; - $profile->save(); - AccountService::del($id); - - return 1; + // deprecated + return; } } diff --git a/app/Jobs/ProfilePipeline/IncrementPostCount.php b/app/Jobs/ProfilePipeline/IncrementPostCount.php index 1a94f1e6c..a1f9ceca7 100644 --- a/app/Jobs/ProfilePipeline/IncrementPostCount.php +++ b/app/Jobs/ProfilePipeline/IncrementPostCount.php @@ -14,42 +14,12 @@ use App\Profile; use App\Status; use App\Services\AccountService; -class IncrementPostCount implements ShouldQueue, ShouldBeUniqueUntilProcessing +class IncrementPostCount implements ShouldQueue { use Dispatchable, InteractsWithQueue, Queueable, SerializesModels; public $id; - public $timeout = 900; - public $tries = 3; - public $maxExceptions = 1; - public $failOnTimeout = true; - - /** - * The number of seconds after which the job's unique lock will be released. - * - * @var int - */ - public $uniqueFor = 3600; - - /** - * Get the unique ID for the job. - */ - public function uniqueId(): string - { - return 'propipe:ipc:' . $this->id; - } - - /** - * Get the middleware the job should pass through. - * - * @return array - */ - public function middleware(): array - { - return [(new WithoutOverlapping("propipe:ipc:{$this->id}"))->shared()->dontRelease()]; - } - /** * Create a new job instance. * @@ -67,20 +37,7 @@ class IncrementPostCount implements ShouldQueue, ShouldBeUniqueUntilProcessing */ public function handle() { - $id = $this->id; - - $profile = Profile::find($id); - - if(!$profile) { - return 1; - } - - $profile->status_count = $profile->status_count + 1; - $profile->last_status_at = now(); - $profile->save(); - AccountService::del($id); - AccountService::get($id); - - return 1; + // deprecated + return; } } From 09ca96cc2be7910287e5064b1d590e092865cb13 Mon Sep 17 00:00:00 2001 From: Daniel Supernault Date: Sun, 4 Feb 2024 02:54:37 -0700 Subject: [PATCH 22/38] Update changelog --- CHANGELOG.md | 1 + 1 file changed, 1 insertion(+) diff --git a/CHANGELOG.md b/CHANGELOG.md index c37659fba..6e0d1f104 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -94,6 +94,7 @@ - Update AccountImport.vue, fix new IG export format ([59aa6a4b](https://github.com/pixelfed/pixelfed/commit/59aa6a4b)) - Update TransformImports command, fix import service condition ([32c59f04](https://github.com/pixelfed/pixelfed/commit/32c59f04)) - Update AP helpers, more efficently update post count ([7caed381](https://github.com/pixelfed/pixelfed/commit/7caed381)) +- Update AP helpers, refactor post count decrement logic ([b81ae577](https://github.com/pixelfed/pixelfed/commit/b81ae577)) - ([](https://github.com/pixelfed/pixelfed/commit/)) ## [v0.11.9 (2023-08-21)](https://github.com/pixelfed/pixelfed/compare/v0.11.8...v0.11.9) From 00ed330cf3aa2442c73591c34c2ae8dae8cb5c0f Mon Sep 17 00:00:00 2001 From: Daniel Supernault Date: Sun, 4 Feb 2024 03:16:57 -0700 Subject: [PATCH 23/38] Update AP helpers, fix sensitive bug --- app/Util/ActivityPub/Helpers.php | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-) diff --git a/app/Util/ActivityPub/Helpers.php b/app/Util/ActivityPub/Helpers.php index 511ef2502..5819dc0bc 100644 --- a/app/Util/ActivityPub/Helpers.php +++ b/app/Util/ActivityPub/Helpers.php @@ -548,10 +548,11 @@ class Helpers { public static function getSensitive($activity, $url) { - $id = isset($activity['id']) ? self::pluckval($activity['id']) : self::pluckval($url); - $url = isset($activity['url']) ? self::pluckval($activity['url']) : $id; - $urlDomain = parse_url($url, PHP_URL_HOST); + if(!$url || !strlen($url)) { + return true; + } + $urlDomain = parse_url($url, PHP_URL_HOST); $cw = isset($activity['sensitive']) ? (bool) $activity['sensitive'] : false; if(in_array($urlDomain, InstanceService::getNsfwDomains())) { From 152b6eab9acd9b008ac961ffaa6ad73794c3587c Mon Sep 17 00:00:00 2001 From: Daniel Supernault Date: Sun, 4 Feb 2024 03:18:58 -0700 Subject: [PATCH 24/38] Update changelog --- CHANGELOG.md | 1 + 1 file changed, 1 insertion(+) diff --git a/CHANGELOG.md b/CHANGELOG.md index 6e0d1f104..becf2298d 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -95,6 +95,7 @@ - Update TransformImports command, fix import service condition ([32c59f04](https://github.com/pixelfed/pixelfed/commit/32c59f04)) - Update AP helpers, more efficently update post count ([7caed381](https://github.com/pixelfed/pixelfed/commit/7caed381)) - Update AP helpers, refactor post count decrement logic ([b81ae577](https://github.com/pixelfed/pixelfed/commit/b81ae577)) +- Update AP helpers, fix sensitive bug ([00ed330c](https://github.com/pixelfed/pixelfed/commit/00ed330c)) - ([](https://github.com/pixelfed/pixelfed/commit/)) ## [v0.11.9 (2023-08-21)](https://github.com/pixelfed/pixelfed/compare/v0.11.8...v0.11.9) From 4d4013896c936a7541277ccda4a6832b31ffbcd8 Mon Sep 17 00:00:00 2001 From: Daniel Supernault Date: Sun, 4 Feb 2024 07:11:05 -0700 Subject: [PATCH 25/38] Update NotificationEpochUpdatePipeline, use more efficient query --- .../InternalPipeline/NotificationEpochUpdatePipeline.php | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-) diff --git a/app/Jobs/InternalPipeline/NotificationEpochUpdatePipeline.php b/app/Jobs/InternalPipeline/NotificationEpochUpdatePipeline.php index 477b1f9b3..79df5aa9a 100644 --- a/app/Jobs/InternalPipeline/NotificationEpochUpdatePipeline.php +++ b/app/Jobs/InternalPipeline/NotificationEpochUpdatePipeline.php @@ -61,7 +61,12 @@ class NotificationEpochUpdatePipeline implements ShouldQueue, ShouldBeUniqueUnti */ public function handle(): void { - $rec = Notification::where('created_at', '>', now()->subMonths(6))->first(); + $pid = Cache::get(NotificationService::EPOCH_CACHE_KEY . '6'); + if($pid && $pid > 1) { + $rec = Notification::where('id', '>', $pid)->whereDate('created_at', now()->subMonths(6)->format('Y-m-d'))->first(); + } else { + $rec = Notification::whereDate('created_at', now()->subMonths(6)->format('Y-m-d'))->first(); + } $id = 1; if($rec) { $id = $rec->id; From fa97a1f38e1a0f37c4f1a59e4995e8e78ffb8802 Mon Sep 17 00:00:00 2001 From: Daniel Supernault Date: Sun, 4 Feb 2024 07:18:05 -0700 Subject: [PATCH 26/38] Update notification pipelines, fix non-local saving --- app/Jobs/CommentPipeline/CommentPipeline.php | 26 ++++++++++--------- app/Jobs/FollowPipeline/FollowPipeline.php | 22 +++++++++------- app/Jobs/LikePipeline/LikePipeline.php | 20 +++++++------- .../StatusPipeline/StatusReplyPipeline.php | 24 +++++++++-------- 4 files changed, 50 insertions(+), 42 deletions(-) diff --git a/app/Jobs/CommentPipeline/CommentPipeline.php b/app/Jobs/CommentPipeline/CommentPipeline.php index 3b2d896af..1917ecea5 100644 --- a/app/Jobs/CommentPipeline/CommentPipeline.php +++ b/app/Jobs/CommentPipeline/CommentPipeline.php @@ -91,19 +91,21 @@ class CommentPipeline implements ShouldQueue return; } - DB::transaction(function() use($target, $actor, $comment) { - $notification = new Notification(); - $notification->profile_id = $target->id; - $notification->actor_id = $actor->id; - $notification->action = 'comment'; - $notification->item_id = $comment->id; - $notification->item_type = "App\Status"; - $notification->save(); + if($target->user_id && $target->domain === null) { + DB::transaction(function() use($target, $actor, $comment) { + $notification = new Notification(); + $notification->profile_id = $target->id; + $notification->actor_id = $actor->id; + $notification->action = 'comment'; + $notification->item_id = $comment->id; + $notification->item_type = "App\Status"; + $notification->save(); - NotificationService::setNotification($notification); - NotificationService::set($notification->profile_id, $notification->id); - StatusService::del($comment->id); - }); + NotificationService::setNotification($notification); + NotificationService::set($notification->profile_id, $notification->id); + StatusService::del($comment->id); + }); + } if($exists = Cache::get('status:replies:all:' . $status->id)) { if($exists && $exists->count() == 3) { diff --git a/app/Jobs/FollowPipeline/FollowPipeline.php b/app/Jobs/FollowPipeline/FollowPipeline.php index 225334304..67733919f 100644 --- a/app/Jobs/FollowPipeline/FollowPipeline.php +++ b/app/Jobs/FollowPipeline/FollowPipeline.php @@ -72,16 +72,18 @@ class FollowPipeline implements ShouldQueue $target->save(); AccountService::del($target->id); - try { - $notification = new Notification(); - $notification->profile_id = $target->id; - $notification->actor_id = $actor->id; - $notification->action = 'follow'; - $notification->item_id = $target->id; - $notification->item_type = "App\Profile"; - $notification->save(); - } catch (Exception $e) { - Log::error($e); + if($target->user_id && $target->domain === null) { + try { + $notification = new Notification(); + $notification->profile_id = $target->id; + $notification->actor_id = $actor->id; + $notification->action = 'follow'; + $notification->item_id = $target->id; + $notification->item_type = "App\Profile"; + $notification->save(); + } catch (Exception $e) { + Log::error($e); + } } } } diff --git a/app/Jobs/LikePipeline/LikePipeline.php b/app/Jobs/LikePipeline/LikePipeline.php index b44c90c8b..e55c64f80 100644 --- a/app/Jobs/LikePipeline/LikePipeline.php +++ b/app/Jobs/LikePipeline/LikePipeline.php @@ -79,16 +79,18 @@ class LikePipeline implements ShouldQueue return true; } - try { - $notification = new Notification(); - $notification->profile_id = $status->profile_id; - $notification->actor_id = $actor->id; - $notification->action = 'like'; - $notification->item_id = $status->id; - $notification->item_type = "App\Status"; - $notification->save(); + if($status->uri === null && $status->object_url === null && $status->url === null) { + try { + $notification = new Notification(); + $notification->profile_id = $status->profile_id; + $notification->actor_id = $actor->id; + $notification->action = 'like'; + $notification->item_id = $status->id; + $notification->item_type = "App\Status"; + $notification->save(); - } catch (Exception $e) { + } catch (Exception $e) { + } } } diff --git a/app/Jobs/StatusPipeline/StatusReplyPipeline.php b/app/Jobs/StatusPipeline/StatusReplyPipeline.php index 35238d293..d8af7b96b 100644 --- a/app/Jobs/StatusPipeline/StatusReplyPipeline.php +++ b/app/Jobs/StatusPipeline/StatusReplyPipeline.php @@ -87,18 +87,20 @@ class StatusReplyPipeline implements ShouldQueue Cache::forget('status:replies:all:' . $reply->id); Cache::forget('status:replies:all:' . $status->id); - DB::transaction(function() use($target, $actor, $status) { - $notification = new Notification(); - $notification->profile_id = $target->id; - $notification->actor_id = $actor->id; - $notification->action = 'comment'; - $notification->item_id = $status->id; - $notification->item_type = "App\Status"; - $notification->save(); + if($target->user_id && $target->domain === null) { + DB::transaction(function() use($target, $actor, $status) { + $notification = new Notification(); + $notification->profile_id = $target->id; + $notification->actor_id = $actor->id; + $notification->action = 'comment'; + $notification->item_id = $status->id; + $notification->item_type = "App\Status"; + $notification->save(); - NotificationService::setNotification($notification); - NotificationService::set($notification->profile_id, $notification->id); - }); + NotificationService::setNotification($notification); + NotificationService::set($notification->profile_id, $notification->id); + }); + } if($exists = Cache::get('status:replies:all:' . $reply->id)) { if($exists && $exists->count() == 3) { From 80e0ada946c489497835b41fa670286af512da60 Mon Sep 17 00:00:00 2001 From: Daniel Supernault Date: Sun, 4 Feb 2024 07:18:54 -0700 Subject: [PATCH 27/38] Update changelog --- CHANGELOG.md | 2 ++ 1 file changed, 2 insertions(+) diff --git a/CHANGELOG.md b/CHANGELOG.md index becf2298d..591025bfd 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -96,6 +96,8 @@ - Update AP helpers, more efficently update post count ([7caed381](https://github.com/pixelfed/pixelfed/commit/7caed381)) - Update AP helpers, refactor post count decrement logic ([b81ae577](https://github.com/pixelfed/pixelfed/commit/b81ae577)) - Update AP helpers, fix sensitive bug ([00ed330c](https://github.com/pixelfed/pixelfed/commit/00ed330c)) +- Update NotificationEpochUpdatePipeline, use more efficient query ([4d401389](https://github.com/pixelfed/pixelfed/commit/4d401389)) +- Update notification pipelines, fix non-local saving ([fa97a1f3](https://github.com/pixelfed/pixelfed/commit/fa97a1f3)) - ([](https://github.com/pixelfed/pixelfed/commit/)) ## [v0.11.9 (2023-08-21)](https://github.com/pixelfed/pixelfed/compare/v0.11.8...v0.11.9) From 240e6bbe4f57b320bb00a3b30f0a1a907c8975d7 Mon Sep 17 00:00:00 2001 From: Daniel Supernault Date: Wed, 7 Feb 2024 02:47:34 -0700 Subject: [PATCH 28/38] Update NodeinfoService, disable redirects --- app/Services/NodeinfoService.php | 10 ++++++++-- 1 file changed, 8 insertions(+), 2 deletions(-) diff --git a/app/Services/NodeinfoService.php b/app/Services/NodeinfoService.php index 10575ff9f..6284538f0 100644 --- a/app/Services/NodeinfoService.php +++ b/app/Services/NodeinfoService.php @@ -22,7 +22,10 @@ class NodeinfoService $wk = $url . '/.well-known/nodeinfo'; try { - $res = Http::withHeaders($headers) + $res = Http::withOptions([ + 'allow_redirects' => false, + ]) + ->withHeaders($headers) ->timeout(5) ->get($wk); } catch (RequestException $e) { @@ -61,7 +64,10 @@ class NodeinfoService } try { - $res = Http::withHeaders($headers) + $res = Http::withOptions([ + 'allow_redirects' => false, + ]) + ->withHeaders($headers) ->timeout(5) ->get($href); } catch (RequestException $e) { From 289cad470b0a04c2836e19aa57d6566df95ce668 Mon Sep 17 00:00:00 2001 From: Daniel Supernault Date: Wed, 7 Feb 2024 02:49:29 -0700 Subject: [PATCH 29/38] Update Instance model, add entity casts --- app/Instance.php | 120 ++++++++++++++++++++++++++--------------------- 1 file changed, 67 insertions(+), 53 deletions(-) diff --git a/app/Instance.php b/app/Instance.php index 6a7b8e6f2..77752d498 100644 --- a/app/Instance.php +++ b/app/Instance.php @@ -6,63 +6,77 @@ use Illuminate\Database\Eloquent\Model; class Instance extends Model { - protected $fillable = ['domain', 'banned', 'auto_cw', 'unlisted', 'notes']; + protected $casts = [ + 'last_crawled_at' => 'datetime', + 'actors_last_synced_at' => 'datetime', + 'notes' => 'array', + 'nodeinfo_last_fetched' => 'datetime', + 'delivery_next_after' => 'datetime', + ]; - public function profiles() - { - return $this->hasMany(Profile::class, 'domain', 'domain'); - } + protected $fillable = [ + 'domain', + 'banned', + 'auto_cw', + 'unlisted', + 'notes' + ]; - public function statuses() - { - return $this->hasManyThrough( - Status::class, - Profile::class, - 'domain', - 'profile_id', - 'domain', - 'id' - ); - } + public function profiles() + { + return $this->hasMany(Profile::class, 'domain', 'domain'); + } - public function reported() - { - return $this->hasManyThrough( - Report::class, - Profile::class, - 'domain', - 'reported_profile_id', - 'domain', - 'id' - ); - } + public function statuses() + { + return $this->hasManyThrough( + Status::class, + Profile::class, + 'domain', + 'profile_id', + 'domain', + 'id' + ); + } - public function reports() - { - return $this->hasManyThrough( - Report::class, - Profile::class, - 'domain', - 'profile_id', - 'domain', - 'id' - ); - } + public function reported() + { + return $this->hasManyThrough( + Report::class, + Profile::class, + 'domain', + 'reported_profile_id', + 'domain', + 'id' + ); + } - public function media() - { - return $this->hasManyThrough( - Media::class, - Profile::class, - 'domain', - 'profile_id', - 'domain', - 'id' - ); - } + public function reports() + { + return $this->hasManyThrough( + Report::class, + Profile::class, + 'domain', + 'profile_id', + 'domain', + 'id' + ); + } - public function getUrl() - { - return url("/i/admin/instances/show/{$this->id}"); - } + public function media() + { + return $this->hasManyThrough( + Media::class, + Profile::class, + 'domain', + 'profile_id', + 'domain', + 'id' + ); + } + + public function getUrl() + { + return url("/i/admin/instances/show/{$this->id}"); + } } From ac01f51ab66df0b4f4657e70bbe0befe2c022b9f Mon Sep 17 00:00:00 2001 From: Daniel Supernault Date: Wed, 7 Feb 2024 02:51:50 -0700 Subject: [PATCH 30/38] Update FetchNodeinfoPipeline, use more efficient dispatch --- .../FetchNodeinfoPipeline.php | 97 ++++++++++++------- 1 file changed, 62 insertions(+), 35 deletions(-) diff --git a/app/Jobs/InstancePipeline/FetchNodeinfoPipeline.php b/app/Jobs/InstancePipeline/FetchNodeinfoPipeline.php index b8c79d67f..943281bb4 100644 --- a/app/Jobs/InstancePipeline/FetchNodeinfoPipeline.php +++ b/app/Jobs/InstancePipeline/FetchNodeinfoPipeline.php @@ -4,6 +4,7 @@ namespace App\Jobs\InstancePipeline; use Illuminate\Bus\Queueable; use Illuminate\Contracts\Queue\ShouldBeUnique; +use Illuminate\Contracts\Queue\ShouldBeUniqueUntilProcessing; use Illuminate\Contracts\Queue\ShouldQueue; use Illuminate\Foundation\Bus\Dispatchable; use Illuminate\Queue\InteractsWithQueue; @@ -12,45 +13,71 @@ use Illuminate\Support\Facades\Http; use App\Instance; use App\Profile; use App\Services\NodeinfoService; +use Illuminate\Contracts\Cache\Repository; +use Illuminate\Support\Facades\Cache; -class FetchNodeinfoPipeline implements ShouldQueue +class FetchNodeinfoPipeline implements ShouldQueue, ShouldBeUniqueUntilProcessing { - use Dispatchable, InteractsWithQueue, Queueable, SerializesModels; + use Dispatchable, InteractsWithQueue, Queueable, SerializesModels; - protected $instance; + protected $instance; - /** - * Create a new job instance. - * - * @return void - */ - public function __construct(Instance $instance) - { - $this->instance = $instance; - } + /** + * Create a new job instance. + * + * @return void + */ + public function __construct(Instance $instance) + { + $this->instance = $instance; + } - /** - * Execute the job. - * - * @return void - */ - public function handle() - { - $instance = $this->instance; + /** + * The number of seconds after which the job's unique lock will be released. + * + * @var int + */ + public $uniqueFor = 14400; - $ni = NodeinfoService::get($instance->domain); - if($ni) { - if(isset($ni['software']) && is_array($ni['software']) && isset($ni['software']['name'])) { - $software = $ni['software']['name']; - $instance->software = strtolower(strip_tags($software)); - $instance->last_crawled_at = now(); - $instance->user_count = Profile::whereDomain($instance->domain)->count(); - $instance->save(); - } - } else { - $instance->user_count = Profile::whereDomain($instance->domain)->count(); - $instance->last_crawled_at = now(); - $instance->save(); - } - } + /** + * Get the unique ID for the job. + */ + public function uniqueId(): string + { + return $this->instance->id; + } + + /** + * Execute the job. + * + * @return void + */ + public function handle() + { + $instance = $this->instance; + + if( $instance->nodeinfo_last_fetched && + $instance->nodeinfo_last_fetched->gt(now()->subHours(12)) || + $instance->delivery_timeout && + $instance->delivery_next_after->gt(now()) + ) { + return; + } + + $ni = NodeinfoService::get($instance->domain); + $instance->last_crawled_at = now(); + if($ni) { + if(isset($ni['software']) && is_array($ni['software']) && isset($ni['software']['name'])) { + $software = $ni['software']['name']; + $instance->software = strtolower(strip_tags($software)); + $instance->user_count = Profile::whereDomain($instance->domain)->count(); + $instance->nodeinfo_last_fetched = now(); + $instance->save(); + } + } else { + $instance->delivery_timeout = 1; + $instance->delivery_next_after = now()->addHours(14); + $instance->save(); + } + } } From 1e3acadefb200fbb4d594909083c5a275e413b77 Mon Sep 17 00:00:00 2001 From: Daniel Supernault Date: Wed, 7 Feb 2024 02:52:37 -0700 Subject: [PATCH 31/38] Update horizon.php config --- config/horizon.php | 349 +++++++++++++++++++++++---------------------- 1 file changed, 175 insertions(+), 174 deletions(-) diff --git a/config/horizon.php b/config/horizon.php index f9cfd960e..5aa37f2fe 100644 --- a/config/horizon.php +++ b/config/horizon.php @@ -2,201 +2,202 @@ return [ - /* - |-------------------------------------------------------------------------- - | Horizon Domain - |-------------------------------------------------------------------------- - | - | This is the subdomain where Horizon will be accessible from. If this - | setting is null, Horizon will reside under the same domain as the - | application. Otherwise, this value will serve as the subdomain. - | - */ + /* + |-------------------------------------------------------------------------- + | Horizon Domain + |-------------------------------------------------------------------------- + | + | This is the subdomain where Horizon will be accessible from. If this + | setting is null, Horizon will reside under the same domain as the + | application. Otherwise, this value will serve as the subdomain. + | + */ - 'domain' => null, + 'domain' => null, - /* - |-------------------------------------------------------------------------- - | Horizon Path - |-------------------------------------------------------------------------- - | - | This is the URI path where Horizon will be accessible from. Feel free - | to change this path to anything you like. Note that the URI will not - | affect the paths of its internal API that aren't exposed to users. - | - */ + /* + |-------------------------------------------------------------------------- + | Horizon Path + |-------------------------------------------------------------------------- + | + | This is the URI path where Horizon will be accessible from. Feel free + | to change this path to anything you like. Note that the URI will not + | affect the paths of its internal API that aren't exposed to users. + | + */ - 'path' => 'horizon', + 'path' => 'horizon', - /* - |-------------------------------------------------------------------------- - | Horizon Redis Connection - |-------------------------------------------------------------------------- - | - | This is the name of the Redis connection where Horizon will store the - | meta information required for it to function. It includes the list - | of supervisors, failed jobs, job metrics, and other information. - | - */ + /* + |-------------------------------------------------------------------------- + | Horizon Redis Connection + |-------------------------------------------------------------------------- + | + | This is the name of the Redis connection where Horizon will store the + | meta information required for it to function. It includes the list + | of supervisors, failed jobs, job metrics, and other information. + | + */ - 'use' => 'default', + 'use' => 'default', - /* - |-------------------------------------------------------------------------- - | Horizon Redis Prefix - |-------------------------------------------------------------------------- - | - | This prefix will be used when storing all Horizon data in Redis. You - | may modify the prefix when you are running multiple installations - | of Horizon on the same server so that they don't have problems. - | - */ + /* + |-------------------------------------------------------------------------- + | Horizon Redis Prefix + |-------------------------------------------------------------------------- + | + | This prefix will be used when storing all Horizon data in Redis. You + | may modify the prefix when you are running multiple installations + | of Horizon on the same server so that they don't have problems. + | + */ - 'prefix' => env('HORIZON_PREFIX', 'horizon-'), + 'prefix' => env('HORIZON_PREFIX', 'horizon-'), - /* - |-------------------------------------------------------------------------- - | Horizon Route Middleware - |-------------------------------------------------------------------------- - | - | These middleware will get attached onto each Horizon route, giving you - | the chance to add your own middleware to this list or change any of - | the existing middleware. Or, you can simply stick with this list. - | - */ + /* + |-------------------------------------------------------------------------- + | Horizon Route Middleware + |-------------------------------------------------------------------------- + | + | These middleware will get attached onto each Horizon route, giving you + | the chance to add your own middleware to this list or change any of + | the existing middleware. Or, you can simply stick with this list. + | + */ - 'middleware' => ['web'], + 'middleware' => ['web'], - /* - |-------------------------------------------------------------------------- - | Queue Wait Time Thresholds - |-------------------------------------------------------------------------- - | - | This option allows you to configure when the LongWaitDetected event - | will be fired. Every connection / queue combination may have its - | own, unique threshold (in seconds) before this event is fired. - | - */ + /* + |-------------------------------------------------------------------------- + | Queue Wait Time Thresholds + |-------------------------------------------------------------------------- + | + | This option allows you to configure when the LongWaitDetected event + | will be fired. Every connection / queue combination may have its + | own, unique threshold (in seconds) before this event is fired. + | + */ - 'waits' => [ - 'redis:feed' => 30, - 'redis:follow' => 30, - 'redis:shared' => 30, - 'redis:default' => 30, - 'redis:inbox' => 30, - 'redis:low' => 30, - 'redis:high' => 30, - 'redis:delete' => 30, - 'redis:story' => 30, - 'redis:mmo' => 30, - ], + 'waits' => [ + 'redis:feed' => 30, + 'redis:follow' => 30, + 'redis:shared' => 30, + 'redis:default' => 30, + 'redis:inbox' => 30, + 'redis:low' => 30, + 'redis:high' => 30, + 'redis:delete' => 30, + 'redis:story' => 30, + 'redis:mmo' => 30, + 'redis:intbg' => 30, + ], - /* - |-------------------------------------------------------------------------- - | Job Trimming Times - |-------------------------------------------------------------------------- - | - | Here you can configure for how long (in minutes) you desire Horizon to - | persist the recent and failed jobs. Typically, recent jobs are kept - | for one hour while all failed jobs are stored for an entire week. - | - */ + /* + |-------------------------------------------------------------------------- + | Job Trimming Times + |-------------------------------------------------------------------------- + | + | Here you can configure for how long (in minutes) you desire Horizon to + | persist the recent and failed jobs. Typically, recent jobs are kept + | for one hour while all failed jobs are stored for an entire week. + | + */ - 'trim' => [ - 'recent' => 60, - 'pending' => 60, - 'completed' => 60, - 'recent_failed' => 10080, - 'failed' => 10080, - 'monitored' => 10080, - ], + 'trim' => [ + 'recent' => 60, + 'pending' => 60, + 'completed' => 60, + 'recent_failed' => 10080, + 'failed' => 10080, + 'monitored' => 10080, + ], - /* - |-------------------------------------------------------------------------- - | Metrics - |-------------------------------------------------------------------------- - | - | Here you can configure how many snapshots should be kept to display in - | the metrics graph. This will get used in combination with Horizon's - | `horizon:snapshot` schedule to define how long to retain metrics. - | - */ + /* + |-------------------------------------------------------------------------- + | Metrics + |-------------------------------------------------------------------------- + | + | Here you can configure how many snapshots should be kept to display in + | the metrics graph. This will get used in combination with Horizon's + | `horizon:snapshot` schedule to define how long to retain metrics. + | + */ - 'metrics' => [ - 'trim_snapshots' => [ - 'job' => 24, - 'queue' => 24, - ], - ], + 'metrics' => [ + 'trim_snapshots' => [ + 'job' => 24, + 'queue' => 24, + ], + ], - /* - |-------------------------------------------------------------------------- - | Fast Termination - |-------------------------------------------------------------------------- - | - | When this option is enabled, Horizon's "terminate" command will not - | wait on all of the workers to terminate unless the --wait option - | is provided. Fast termination can shorten deployment delay by - | allowing a new instance of Horizon to start while the last - | instance will continue to terminate each of its workers. - | - */ + /* + |-------------------------------------------------------------------------- + | Fast Termination + |-------------------------------------------------------------------------- + | + | When this option is enabled, Horizon's "terminate" command will not + | wait on all of the workers to terminate unless the --wait option + | is provided. Fast termination can shorten deployment delay by + | allowing a new instance of Horizon to start while the last + | instance will continue to terminate each of its workers. + | + */ - 'fast_termination' => false, + 'fast_termination' => false, - /* - |-------------------------------------------------------------------------- - | Memory Limit (MB) - |-------------------------------------------------------------------------- - | - | This value describes the maximum amount of memory the Horizon worker - | may consume before it is terminated and restarted. You should set - | this value according to the resources available to your server. - | - */ + /* + |-------------------------------------------------------------------------- + | Memory Limit (MB) + |-------------------------------------------------------------------------- + | + | This value describes the maximum amount of memory the Horizon worker + | may consume before it is terminated and restarted. You should set + | this value according to the resources available to your server. + | + */ - 'memory_limit' => env('HORIZON_MEMORY_LIMIT', 64), + 'memory_limit' => env('HORIZON_MEMORY_LIMIT', 64), - /* - |-------------------------------------------------------------------------- - | Queue Worker Configuration - |-------------------------------------------------------------------------- - | - | Here you may define the queue worker settings used by your application - | in all environments. These supervisors and settings handle all your - | queued jobs and will be provisioned by Horizon during deployment. - | - */ + /* + |-------------------------------------------------------------------------- + | Queue Worker Configuration + |-------------------------------------------------------------------------- + | + | Here you may define the queue worker settings used by your application + | in all environments. These supervisors and settings handle all your + | queued jobs and will be provisioned by Horizon during deployment. + | + */ - 'environments' => [ - 'production' => [ - 'supervisor-1' => [ - 'connection' => 'redis', - 'queue' => ['high', 'default', 'follow', 'shared', 'inbox', 'feed', 'low', 'story', 'delete', 'mmo'], - 'balance' => env('HORIZON_BALANCE_STRATEGY', 'auto'), - 'minProcesses' => env('HORIZON_MIN_PROCESSES', 1), - 'maxProcesses' => env('HORIZON_MAX_PROCESSES', 20), - 'memory' => env('HORIZON_SUPERVISOR_MEMORY', 64), - 'tries' => env('HORIZON_SUPERVISOR_TRIES', 3), - 'nice' => env('HORIZON_SUPERVISOR_NICE', 0), - 'timeout' => env('HORIZON_SUPERVISOR_TIMEOUT', 300), - ], - ], + 'environments' => [ + 'production' => [ + 'supervisor-1' => [ + 'connection' => 'redis', + 'queue' => ['high', 'default', 'follow', 'shared', 'inbox', 'feed', 'low', 'story', 'delete', 'mmo', 'intbg'], + 'balance' => env('HORIZON_BALANCE_STRATEGY', 'auto'), + 'minProcesses' => env('HORIZON_MIN_PROCESSES', 1), + 'maxProcesses' => env('HORIZON_MAX_PROCESSES', 20), + 'memory' => env('HORIZON_SUPERVISOR_MEMORY', 64), + 'tries' => env('HORIZON_SUPERVISOR_TRIES', 3), + 'nice' => env('HORIZON_SUPERVISOR_NICE', 0), + 'timeout' => env('HORIZON_SUPERVISOR_TIMEOUT', 300), + ], + ], - 'local' => [ - 'supervisor-1' => [ - 'connection' => 'redis', - 'queue' => ['high', 'default', 'follow', 'shared', 'inbox', 'feed', 'low', 'story', 'delete', 'mmo'], - 'balance' => 'auto', - 'minProcesses' => 1, - 'maxProcesses' => 20, - 'memory' => 128, - 'tries' => 3, - 'nice' => 0, - 'timeout' => 300 - ], - ], - ], + 'local' => [ + 'supervisor-1' => [ + 'connection' => 'redis', + 'queue' => ['high', 'default', 'follow', 'shared', 'inbox', 'feed', 'low', 'story', 'delete', 'mmo', 'intbg'], + 'balance' => 'auto', + 'minProcesses' => 1, + 'maxProcesses' => 20, + 'memory' => 128, + 'tries' => 3, + 'nice' => 0, + 'timeout' => 300 + ], + ], + ], - 'darkmode' => env('HORIZON_DARKMODE', false), + 'darkmode' => env('HORIZON_DARKMODE', false), ]; From 01b33fb37efdb595709b5379ba5482b72cf4093f Mon Sep 17 00:00:00 2001 From: Daniel Supernault Date: Wed, 7 Feb 2024 03:43:20 -0700 Subject: [PATCH 32/38] Update PublicApiController, consume InstanceService blocked domains for account and statuses endpoints --- app/Http/Controllers/PublicApiController.php | 10 ++++++++++ 1 file changed, 10 insertions(+) diff --git a/app/Http/Controllers/PublicApiController.php b/app/Http/Controllers/PublicApiController.php index f888eb512..78008eda4 100644 --- a/app/Http/Controllers/PublicApiController.php +++ b/app/Http/Controllers/PublicApiController.php @@ -42,6 +42,7 @@ use App\Services\{ use App\Jobs\StatusPipeline\NewStatusPipeline; use League\Fractal\Serializer\ArraySerializer; use League\Fractal\Pagination\IlluminatePaginatorAdapter; +use App\Services\InstanceService; class PublicApiController extends Controller { @@ -661,6 +662,10 @@ class PublicApiController extends Controller public function account(Request $request, $id) { $res = AccountService::get($id); + if($res && isset($res['local'], $res['url']) && !$res['local']) { + $domain = parse_url($res['url'], PHP_URL_HOST); + abort_if(in_array($domain, InstanceService::getBannedDomains()), 404); + } return response()->json($res); } @@ -680,6 +685,11 @@ class PublicApiController extends Controller $profile = AccountService::get($id); abort_if(!$profile, 404); + if($profile && isset($profile['local'], $profile['url']) && !$profile['local']) { + $domain = parse_url($profile['url'], PHP_URL_HOST); + abort_if(in_array($domain, InstanceService::getBannedDomains()), 404); + } + $limit = $request->limit ?? 9; $max_id = $request->max_id; $min_id = $request->min_id; From 5b284cacea474367701041093c445cff545ad742 Mon Sep 17 00:00:00 2001 From: Daniel Supernault Date: Wed, 7 Feb 2024 04:41:12 -0700 Subject: [PATCH 33/38] Update ApiV1Controller, enforce blocked instance domain logic --- app/Http/Controllers/Api/ApiV1Controller.php | 69 ++++++++++++++++++-- 1 file changed, 65 insertions(+), 4 deletions(-) diff --git a/app/Http/Controllers/Api/ApiV1Controller.php b/app/Http/Controllers/Api/ApiV1Controller.php index dd0cbd062..b94a11c92 100644 --- a/app/Http/Controllers/Api/ApiV1Controller.php +++ b/app/Http/Controllers/Api/ApiV1Controller.php @@ -219,6 +219,10 @@ class ApiV1Controller extends Controller if(!$res) { return response()->json(['error' => 'Record not found'], 404); } + if($res && strpos($res['acct'], '@') != -1) { + $domain = parse_url($res['url'], PHP_URL_HOST); + abort_if(in_array($domain, InstanceService::getBannedDomains()), 404); + } return $this->json($res); } @@ -483,6 +487,11 @@ class ApiV1Controller extends Controller $limit = $request->input('limit', 10); $napi = $request->has(self::PF_API_ENTITY_KEY); + if($account && strpos($account['acct'], '@') != -1) { + $domain = parse_url($account['url'], PHP_URL_HOST); + abort_if(in_array($domain, InstanceService::getBannedDomains()), 404); + } + if(intval($pid) !== intval($account['id'])) { if($account['locked']) { if(!FollowerService::follows($pid, $account['id'])) { @@ -575,6 +584,11 @@ class ApiV1Controller extends Controller $limit = $request->input('limit', 10); $napi = $request->has(self::PF_API_ENTITY_KEY); + if($account && strpos($account['acct'], '@') != -1) { + $domain = parse_url($account['url'], PHP_URL_HOST); + abort_if(in_array($domain, InstanceService::getBannedDomains()), 404); + } + if(intval($pid) !== intval($account['id'])) { if($account['locked']) { if(!FollowerService::follows($pid, $account['id'])) { @@ -676,6 +690,11 @@ class ApiV1Controller extends Controller return $this->json(['error' => 'Account not found'], 404); } + if($profile && strpos($profile['acct'], '@') != -1) { + $domain = parse_url($profile['url'], PHP_URL_HOST); + abort_if(in_array($domain, InstanceService::getBannedDomains()), 404); + } + $limit = $request->limit ?? 20; $max_id = $request->max_id; $min_id = $request->min_id; @@ -766,6 +785,11 @@ class ApiV1Controller extends Controller ->whereNull('status') ->findOrFail($id); + if($target && $target->domain) { + $domain = $target->domain; + abort_if(in_array($domain, InstanceService::getBannedDomains()), 404); + } + $private = (bool) $target->is_private; $remote = (bool) $target->domain; $blocked = UserFilter::whereUserId($target->id) @@ -1252,14 +1276,19 @@ class ApiV1Controller extends Controller $user = $request->user(); abort_if($user->has_roles && !UserRoleService::can('can-like', $user->id), 403, 'Invalid permissions for this action'); - AccountService::setLastActive($user->id); - $status = StatusService::getMastodon($id, false); - abort_unless($status, 400); + abort_unless($status, 404); + + if($status && isset($status['account'], $status['account']['acct']) && strpos($status['account']['acct'], '@') != -1) { + $domain = parse_url($status['account']['url'], PHP_URL_HOST); + abort_if(in_array($domain, InstanceService::getBannedDomains()), 404); + } $spid = $status['account']['id']; + AccountService::setLastActive($user->id); + if(intval($spid) !== intval($user->profile_id)) { if($status['visibility'] == 'private') { abort_if(!FollowerService::follows($user->profile_id, $spid), 403); @@ -1404,6 +1433,11 @@ class ApiV1Controller extends Controller return response()->json(['error' => 'Record not found'], 404); } + if($target && strpos($target['acct'], '@') != -1) { + $domain = parse_url($target['url'], PHP_URL_HOST); + abort_if(in_array($domain, InstanceService::getBannedDomains()), 404); + } + $followRequest = FollowRequest::whereFollowingId($pid)->whereFollowerId($id)->first(); if(!$followRequest) { @@ -2011,6 +2045,11 @@ class ApiV1Controller extends Controller $account = Profile::findOrFail($id); + if($account && $account->domain) { + $domain = $account->domain; + abort_if(in_array($domain, InstanceService::getBannedDomains()), 404); + } + $count = UserFilterService::muteCount($pid); $maxLimit = intval(config('instance.user_filters.max_user_mutes')); if($count == 0) { @@ -2653,6 +2692,11 @@ class ApiV1Controller extends Controller abort(404); } + if($res && isset($res['account'], $res['account']['acct'], $res['account']['url']) && strpos($res['account']['acct'], '@') != -1) { + $domain = parse_url($res['account']['url'], PHP_URL_HOST); + abort_if(in_array($domain, InstanceService::getBannedDomains()), 404); + } + $scope = $res['visibility']; if(!in_array($scope, ['public', 'unlisted'])) { if($scope === 'private') { @@ -2697,6 +2741,11 @@ class ApiV1Controller extends Controller return response('', 404); } + if($status && isset($status['account'], $status['account']['acct']) && strpos($status['account']['acct'], '@') != -1) { + $domain = parse_url($status['account']['url'], PHP_URL_HOST); + abort_if(in_array($domain, InstanceService::getBannedDomains()), 404); + } + if(intval($status['account']['id']) !== intval($user->profile_id)) { if($status['visibility'] == 'private') { if(!FollowerService::follows($user->profile_id, $status['account']['id'])) { @@ -2780,6 +2829,10 @@ class ApiV1Controller extends Controller $status = Status::findOrFail($id); $account = AccountService::get($status->profile_id, true); abort_if(!$account, 404); + if($account && strpos($account['acct'], '@') != -1) { + $domain = parse_url($account['url'], PHP_URL_HOST); + abort_if(in_array($domain, InstanceService::getBannedDomains()), 404); + } $author = intval($status->profile_id) === intval($pid) || $user->is_admin; $napi = $request->has(self::PF_API_ENTITY_KEY); @@ -2871,6 +2924,10 @@ class ApiV1Controller extends Controller $pid = $user->profile_id; $status = Status::findOrFail($id); $account = AccountService::get($status->profile_id, true); + if($account && strpos($account['acct'], '@') != -1) { + $domain = parse_url($account['url'], PHP_URL_HOST); + abort_if(in_array($domain, InstanceService::getBannedDomains()), 404); + } abort_if(!$account, 404); $author = intval($status->profile_id) === intval($pid) || $user->is_admin; $napi = $request->has(self::PF_API_ENTITY_KEY); @@ -3200,7 +3257,11 @@ class ApiV1Controller extends Controller abort_if($user->has_roles && !UserRoleService::can('can-share', $user->id), 403, 'Invalid permissions for this action'); AccountService::setLastActive($user->id); $status = Status::whereScope('public')->findOrFail($id); - + if($status && ($status->uri || $status->url || $status->object_url)) { + $url = $status->uri ?? $status->url ?? $status->object_url; + $domain = parse_url($url, PHP_URL_HOST); + abort_if(in_array($domain, InstanceService::getBannedDomains()), 404); + } if(intval($status->profile_id) !== intval($user->profile_id)) { if($status->scope == 'private') { abort_if(!FollowerService::follows($user->profile_id, $status->profile_id), 403); From 6921d3568e7662b55268a0b2ab5799758735b74a Mon Sep 17 00:00:00 2001 From: Daniel Supernault Date: Wed, 7 Feb 2024 04:42:27 -0700 Subject: [PATCH 34/38] Add InstanceMananger command --- app/Console/Commands/InstanceManager.php | 298 +++++++++++++++++++++++ 1 file changed, 298 insertions(+) create mode 100644 app/Console/Commands/InstanceManager.php diff --git a/app/Console/Commands/InstanceManager.php b/app/Console/Commands/InstanceManager.php new file mode 100644 index 000000000..a495d9617 --- /dev/null +++ b/app/Console/Commands/InstanceManager.php @@ -0,0 +1,298 @@ +recalculateStats(); + break; + + case 'Unlisted Instances': + return $this->viewUnlistedInstances(); + break; + + case 'Banned Instances': + return $this->viewBannedInstances(); + break; + + case 'Unlist Instance': + return $this->unlistInstance(); + break; + + case 'Ban Instance': + return $this->banInstance(); + break; + + case 'Unban Instance': + return $this->unbanInstance(); + break; + + case 'Relist Instance': + return $this->relistInstance(); + break; + } + } + + protected function recalculateStats() + { + $instanceCount = Instance::count(); + $confirmed = confirm('Do you want to recalculate stats for all ' . $instanceCount . ' instances?'); + if(!$confirmed) { + $this->error('Aborting...'); + exit; + } + + $users = progress( + label: 'Updating instance stats...', + steps: Instance::all(), + callback: fn ($instance) => $this->updateInstanceStats($instance), + ); + } + + protected function updateInstanceStats($instance) + { + FetchNodeinfoPipeline::dispatch($instance)->onQueue('intbg'); + } + + protected function unlistInstance() + { + $id = search( + 'Search by domain', + fn (string $value) => strlen($value) > 0 + ? Instance::whereUnlisted(false)->where('domain', 'like', "%{$value}%")->pluck('domain', 'id')->all() + : [] + ); + + $instance = Instance::find($id); + if(!$instance) { + $this->error('Oops, an error occured'); + exit; + } + + $tbl = [ + [ + $instance->domain, + number_format($instance->status_count), + number_format($instance->user_count), + ] + ]; + table( + ['Domain', 'Status Count', 'User Count'], + $tbl + ); + + $confirmed = confirm('Are you sure you want to unlist this instance?'); + if(!$confirmed) { + $this->error('Aborting instance unlisting'); + exit; + } + + $instance->unlisted = true; + $instance->save(); + InstanceService::refresh(); + $this->info('Successfully unlisted ' . $instance->domain . '!'); + exit; + } + + protected function relistInstance() + { + $id = search( + 'Search by domain', + fn (string $value) => strlen($value) > 0 + ? Instance::whereUnlisted(true)->where('domain', 'like', "%{$value}%")->pluck('domain', 'id')->all() + : [] + ); + + $instance = Instance::find($id); + if(!$instance) { + $this->error('Oops, an error occured'); + exit; + } + + $tbl = [ + [ + $instance->domain, + number_format($instance->status_count), + number_format($instance->user_count), + ] + ]; + table( + ['Domain', 'Status Count', 'User Count'], + $tbl + ); + + $confirmed = confirm('Are you sure you want to re-list this instance?'); + if(!$confirmed) { + $this->error('Aborting instance re-listing'); + exit; + } + + $instance->unlisted = false; + $instance->save(); + InstanceService::refresh(); + $this->info('Successfully re-listed ' . $instance->domain . '!'); + exit; + } + + protected function banInstance() + { + $id = search( + 'Search by domain', + fn (string $value) => strlen($value) > 0 + ? Instance::whereBanned(false)->where('domain', 'like', "%{$value}%")->pluck('domain', 'id')->all() + : [] + ); + + $instance = Instance::find($id); + if(!$instance) { + $this->error('Oops, an error occured'); + exit; + } + + $tbl = [ + [ + $instance->domain, + number_format($instance->status_count), + number_format($instance->user_count), + ] + ]; + table( + ['Domain', 'Status Count', 'User Count'], + $tbl + ); + + $confirmed = confirm('Are you sure you want to ban this instance?'); + if(!$confirmed) { + $this->error('Aborting instance ban'); + exit; + } + + $instance->banned = true; + $instance->save(); + InstanceService::refresh(); + $this->info('Successfully banned ' . $instance->domain . '!'); + exit; + } + + protected function unbanInstance() + { + $id = search( + 'Search by domain', + fn (string $value) => strlen($value) > 0 + ? Instance::whereBanned(true)->where('domain', 'like', "%{$value}%")->pluck('domain', 'id')->all() + : [] + ); + + $instance = Instance::find($id); + if(!$instance) { + $this->error('Oops, an error occured'); + exit; + } + + $tbl = [ + [ + $instance->domain, + number_format($instance->status_count), + number_format($instance->user_count), + ] + ]; + table( + ['Domain', 'Status Count', 'User Count'], + $tbl + ); + + $confirmed = confirm('Are you sure you want to unban this instance?'); + if(!$confirmed) { + $this->error('Aborting instance unban'); + exit; + } + + $instance->banned = false; + $instance->save(); + InstanceService::refresh(); + $this->info('Successfully un-banned ' . $instance->domain . '!'); + exit; + } + + protected function viewBannedInstances() + { + $data = Instance::whereBanned(true) + ->get(['domain', 'user_count', 'status_count']) + ->map(function($d) { + return [ + 'domain' => $d->domain, + 'user_count' => number_format($d->user_count), + 'status_count' => number_format($d->status_count), + ]; + }) + ->toArray(); + table( + ['Domain', 'User Count', 'Status Count'], + $data + ); + } + + protected function viewUnlistedInstances() + { + $data = Instance::whereUnlisted(true) + ->get(['domain', 'user_count', 'status_count', 'banned']) + ->map(function($d) { + return [ + 'domain' => $d->domain, + 'user_count' => number_format($d->user_count), + 'status_count' => number_format($d->status_count), + 'banned' => $d->banned ? '✅' : null + ]; + }) + ->toArray(); + table( + ['Domain', 'User Count', 'Status Count', 'Banned'], + $data + ); + } +} From 1f3f0cae65f6ef100e0710ddb0919e2a2ed986e8 Mon Sep 17 00:00:00 2001 From: Daniel Supernault Date: Wed, 7 Feb 2024 04:43:32 -0700 Subject: [PATCH 35/38] Update changelog --- CHANGELOG.md | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/CHANGELOG.md b/CHANGELOG.md index 591025bfd..640f6531a 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -98,6 +98,12 @@ - Update AP helpers, fix sensitive bug ([00ed330c](https://github.com/pixelfed/pixelfed/commit/00ed330c)) - Update NotificationEpochUpdatePipeline, use more efficient query ([4d401389](https://github.com/pixelfed/pixelfed/commit/4d401389)) - Update notification pipelines, fix non-local saving ([fa97a1f3](https://github.com/pixelfed/pixelfed/commit/fa97a1f3)) +- Update NodeinfoService, disable redirects ([240e6bbe](https://github.com/pixelfed/pixelfed/commit/240e6bbe)) +- Update Instance model, add entity casts ([289cad47](https://github.com/pixelfed/pixelfed/commit/289cad47)) +- Update FetchNodeinfoPipeline, use more efficient dispatch ([ac01f51a](https://github.com/pixelfed/pixelfed/commit/ac01f51a)) +- Update horizon.php config ([1e3acade](https://github.com/pixelfed/pixelfed/commit/1e3acade)) +- Update PublicApiController, consume InstanceService blocked domains for account and statuses endpoints ([01b33fb3](https://github.com/pixelfed/pixelfed/commit/01b33fb3)) +- Update ApiV1Controller, enforce blocked instance domain logic ([5b284cac](https://github.com/pixelfed/pixelfed/commit/5b284cac)) - ([](https://github.com/pixelfed/pixelfed/commit/)) ## [v0.11.9 (2023-08-21)](https://github.com/pixelfed/pixelfed/compare/v0.11.8...v0.11.9) From 97b7cb2719924ca70a330842fa4b1e3772eb37d5 Mon Sep 17 00:00:00 2001 From: Daniel Supernault Date: Wed, 7 Feb 2024 04:49:44 -0700 Subject: [PATCH 36/38] Add migration --- ..._add_active_deliver_to_instances_table.php | 36 +++++++++++++++++++ 1 file changed, 36 insertions(+) create mode 100644 database/migrations/2023_12_05_092152_add_active_deliver_to_instances_table.php diff --git a/database/migrations/2023_12_05_092152_add_active_deliver_to_instances_table.php b/database/migrations/2023_12_05_092152_add_active_deliver_to_instances_table.php new file mode 100644 index 000000000..d6e413768 --- /dev/null +++ b/database/migrations/2023_12_05_092152_add_active_deliver_to_instances_table.php @@ -0,0 +1,36 @@ +boolean('active_deliver')->nullable()->index()->after('domain'); + $table->boolean('valid_nodeinfo')->nullable(); + $table->timestamp('nodeinfo_last_fetched')->nullable(); + $table->boolean('delivery_timeout')->default(false); + $table->timestamp('delivery_next_after')->nullable(); + }); + } + + /** + * Reverse the migrations. + */ + public function down(): void + { + Schema::table('instances', function (Blueprint $table) { + $table->dropColumn('active_deliver'); + $table->dropColumn('valid_nodeinfo'); + $table->dropColumn('nodeinfo_last_fetched'); + $table->dropColumn('delivery_timeout'); + $table->dropColumn('delivery_next_after'); + }); + } +}; From 4d02d6f12e460958560f9314f07b9215bc5560d4 Mon Sep 17 00:00:00 2001 From: Daniel Supernault Date: Wed, 7 Feb 2024 05:59:12 -0700 Subject: [PATCH 37/38] Update ApiV2Controller, add vapid key to instance object. Thanks thisismissem! --- app/Http/Controllers/Api/ApiV2Controller.php | 3 +++ 1 file changed, 3 insertions(+) diff --git a/app/Http/Controllers/Api/ApiV2Controller.php b/app/Http/Controllers/Api/ApiV2Controller.php index 93f930cd5..ce15a8a49 100644 --- a/app/Http/Controllers/Api/ApiV2Controller.php +++ b/app/Http/Controllers/Api/ApiV2Controller.php @@ -96,6 +96,9 @@ class ApiV2Controller extends Controller 'streaming' => 'wss://' . config('pixelfed.domain.app'), 'status' => null ], + 'vapid' => [ + 'public_key' => config('webpush.vapid.public_key'), + ], 'accounts' => [ 'max_featured_tags' => 0, ], From 2becd273c4af81efab27052d671926f830eee930 Mon Sep 17 00:00:00 2001 From: Daniel Supernault Date: Wed, 7 Feb 2024 06:00:09 -0700 Subject: [PATCH 38/38] Update changelog --- CHANGELOG.md | 1 + 1 file changed, 1 insertion(+) diff --git a/CHANGELOG.md b/CHANGELOG.md index 640f6531a..d939ea1e0 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -104,6 +104,7 @@ - Update horizon.php config ([1e3acade](https://github.com/pixelfed/pixelfed/commit/1e3acade)) - Update PublicApiController, consume InstanceService blocked domains for account and statuses endpoints ([01b33fb3](https://github.com/pixelfed/pixelfed/commit/01b33fb3)) - Update ApiV1Controller, enforce blocked instance domain logic ([5b284cac](https://github.com/pixelfed/pixelfed/commit/5b284cac)) +- Update ApiV2Controller, add vapid key to instance object. Thanks thisismissem! ([4d02d6f1](https://github.com/pixelfed/pixelfed/commit/4d02d6f1)) - ([](https://github.com/pixelfed/pixelfed/commit/)) ## [v0.11.9 (2023-08-21)](https://github.com/pixelfed/pixelfed/compare/v0.11.8...v0.11.9)