From 6f679181588136f15529bfd044e01578578100ac Mon Sep 17 00:00:00 2001 From: dotMavriQ Date: Sat, 14 Mar 2026 13:02:26 +0000 Subject: [PATCH 01/77] fix: improve search and harden API services MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Replace in-memory search filtering with PostgreSQL unaccent + ILIKE across all index views. Search now splits on words so "Jürgen Habermas" matches "Habermas, Jürgen" in the author field. Accent-insensitive matching handled at the database level instead of loading all rows into PHP. Scope trusted proxies to private networks instead of 0.0.0.0/0. Add logging to all API service catch blocks. Add missing indexes on comic_issues.comicvine_issue_id and episodes.show_id. --- app/Livewire/Anime/AnimeIndex.php | 64 +++------------ app/Livewire/Books/BookIndex.php | 82 +++---------------- app/Livewire/Comics/ComicIndex.php | 71 +++------------- app/Livewire/Movies/MovieIndex.php | 41 +++------- app/Providers/AppServiceProvider.php | 4 +- app/Services/ComicVineService.php | 12 ++- app/Services/TmdbService.php | 36 ++++++-- app/Services/TraktService.php | 8 +- ...26_03_14_122109_add_unaccent_extension.php | 17 ++++ .../2026_03_14_122144_add_missing_indexes.php | 30 +++++++ 10 files changed, 140 insertions(+), 225 deletions(-) create mode 100644 database/migrations/2026_03_14_122109_add_unaccent_extension.php create mode 100644 database/migrations/2026_03_14_122144_add_missing_indexes.php diff --git a/app/Livewire/Anime/AnimeIndex.php b/app/Livewire/Anime/AnimeIndex.php index a10060d..dc84db0 100644 --- a/app/Livewire/Anime/AnimeIndex.php +++ b/app/Livewire/Anime/AnimeIndex.php @@ -8,7 +8,6 @@ use App\Models\Anime; use Illuminate\Support\Facades\Auth; use Illuminate\Support\Facades\DB; -use Illuminate\Support\Str; use Livewire\Component; use Livewire\WithPagination; @@ -46,21 +45,17 @@ class AnimeIndex extends Component 'viewMode' => ['except' => 'gallery'], ]; - private function normalizeForSearch(string $string): string + private function applyAccentInsensitiveSearch($query, string $search, array $columns): void { - return Str::ascii($string); - } + $words = preg_split('/\s+/', trim($search)); - private function matchesSearch(?string $value, string $normalizedSearch): bool - { - if ($value === null) { - return false; + foreach ($words as $word) { + $query->where(function ($q) use ($word, $columns) { + foreach ($columns as $column) { + $q->orWhereRaw('unaccent(COALESCE(' . $column . ", '')) ILIKE unaccent(?)", ['%' . $word . '%']); + } + }); } - - return str_contains( - strtolower($this->normalizeForSearch($value)), - strtolower($normalizedSearch) - ); } public function updatingSearch(): void @@ -133,13 +128,8 @@ public function updatedSelectAll(bool $value): void }); if ($this->search) { - $normalizedSearch = $this->normalizeForSearch($this->search); - $allAnime = $query->get(); - $this->selected = $allAnime->filter(function ($anime) use ($normalizedSearch) { - return $this->matchesSearch($anime->title, $normalizedSearch) - || $this->matchesSearch($anime->original_title, $normalizedSearch) - || $this->matchesSearch($anime->studios, $normalizedSearch); - })->pluck('id')->map(fn ($id) => (string) $id)->toArray(); + $this->applyAccentInsensitiveSearch($query, $this->search, ['title', 'original_title', 'studios']); + $this->selected = $query->pluck('id')->map(fn ($id) => (string) $id)->toArray(); } else { $this->selected = $query->pluck('id')->map(fn ($id) => (string) $id)->toArray(); } @@ -196,39 +186,11 @@ public function render() } if ($this->search) { - $normalizedSearch = $this->normalizeForSearch($this->search); - - $exactMatchIds = (clone $query) - ->where(function ($q) { - $q->where('title', 'like', '%' . $this->search . '%') - ->orWhere('original_title', 'like', '%' . $this->search . '%') - ->orWhere('studios', 'like', '%' . $this->search . '%'); - }) - ->pluck('id'); - - $allAnime = $query->get(); - $filteredIds = $allAnime->filter(function ($anime) use ($normalizedSearch) { - return $this->matchesSearch($anime->title, $normalizedSearch) - || $this->matchesSearch($anime->original_title, $normalizedSearch) - || $this->matchesSearch($anime->studios, $normalizedSearch); - })->pluck('id'); - - $matchingIds = $exactMatchIds->merge($filteredIds)->unique(); - - $searchQuery = Anime::query() - ->whereIn('id', $matchingIds); - - if ($sortBy === 'date_watched') { - $searchQuery->orderBy(DB::raw('COALESCE(date_watched, updated_at)'), $sortDir); - } else { - $searchQuery->orderBy($sortBy, $sortDir); - } - - $animeList = $searchQuery->paginate($perPage); - } else { - $animeList = $query->paginate($perPage); + $this->applyAccentInsensitiveSearch($query, $this->search, ['title', 'original_title', 'studios']); } + $animeList = $query->paginate($perPage); + $allMediaTypes = Anime::where('user_id', Auth::id()) ->whereNotNull('media_type') ->distinct() diff --git a/app/Livewire/Books/BookIndex.php b/app/Livewire/Books/BookIndex.php index 068164c..0fdd071 100644 --- a/app/Livewire/Books/BookIndex.php +++ b/app/Livewire/Books/BookIndex.php @@ -8,7 +8,6 @@ use App\Models\Book; use Illuminate\Support\Facades\Auth; use Illuminate\Support\Facades\DB; -use Illuminate\Support\Str; use Livewire\Component; use Livewire\WithPagination; @@ -16,27 +15,17 @@ class BookIndex extends Component { use WithPagination; - /** - * Normalize a string by removing diacritics/accents for comparison. - */ - private function normalizeForSearch(string $string): string + private function applyAccentInsensitiveSearch($query, string $search, array $columns): void { - return Str::ascii($string); - } + $words = preg_split('/\s+/', trim($search)); - /** - * Check if a value matches the search term (accent-insensitive). - */ - private function matchesSearch(?string $value, string $normalizedSearch): bool - { - if ($value === null) { - return false; + foreach ($words as $word) { + $query->where(function ($q) use ($word, $columns) { + foreach ($columns as $column) { + $q->orWhereRaw('unaccent(COALESCE(' . $column . ", '')) ILIKE unaccent(?)", ['%' . $word . '%']); + } + }); } - - return str_contains( - strtolower($this->normalizeForSearch($value)), - strtolower($normalizedSearch) - ); } public string $search = ''; @@ -164,12 +153,8 @@ public function updatedSelectAll(bool $value): void }); if ($this->search) { - $normalizedSearch = $this->normalizeForSearch($this->search); - $allBooks = $query->get(); - $this->selected = $allBooks->filter(function ($book) use ($normalizedSearch) { - return $this->matchesSearch($book->title, $normalizedSearch) - || $this->matchesSearch($book->author, $normalizedSearch); - })->pluck('id')->map(fn ($id) => (string) $id)->toArray(); + $this->applyAccentInsensitiveSearch($query, $this->search, ['title', 'author']); + $this->selected = $query->pluck('id')->map(fn ($id) => (string) $id)->toArray(); } else { $this->selected = $query->pluck('id')->map(fn ($id) => (string) $id)->toArray(); } @@ -246,53 +231,12 @@ public function render() $query->orderBy($sortBy, $sortDir); } - // For search, use accent-insensitive PHP filtering if ($this->search) { - $normalizedSearch = $this->normalizeForSearch($this->search); - - // First try exact match in SQL for performance - $exactMatchIds = (clone $query) - ->where(function ($q) { - $q->where('title', 'like', '%'.$this->search.'%') - ->orWhere('author', 'like', '%'.$this->search.'%'); - }) - ->pluck('id'); - - // Then get all books and filter with accent-insensitive comparison - $allBooks = $query->get(); - $filteredIds = $allBooks->filter(function ($book) use ($normalizedSearch) { - return $this->matchesSearch($book->title, $normalizedSearch) - || $this->matchesSearch($book->author, $normalizedSearch); - })->pluck('id'); - - // Combine both result sets - $matchingIds = $exactMatchIds->merge($filteredIds)->unique(); - - $searchQuery = Book::query() - ->whereIn('id', $matchingIds) - ->with('bookShelves'); - - if ($sortBy === 'page_count') { - if ($sortDir === 'asc') { - $searchQuery->orderByRaw('page_count IS NOT NULL') - ->orderByRaw('CASE WHEN page_count IS NULL THEN title END ASC') - ->orderBy('page_count', 'asc'); - } else { - $searchQuery->orderByRaw('page_count IS NULL') - ->orderBy('page_count', 'desc') - ->orderByRaw('CASE WHEN page_count IS NULL THEN title END DESC'); - } - } elseif ($sortBy === 'date_finished') { - $searchQuery->orderBy(\Illuminate\Support\Facades\DB::raw('COALESCE(date_finished, updated_at)'), $sortDir); - } else { - $searchQuery->orderBy($sortBy, $sortDir); - } - - $books = $searchQuery->paginate($perPage); - } else { - $books = $query->paginate($perPage); + $this->applyAccentInsensitiveSearch($query, $this->search, ['title', 'author']); } + $books = $query->paginate($perPage); + return view('livewire.books.book-index', [ 'books' => $books, 'statuses' => $this->getStatuses(), diff --git a/app/Livewire/Comics/ComicIndex.php b/app/Livewire/Comics/ComicIndex.php index 717cb14..df67315 100644 --- a/app/Livewire/Comics/ComicIndex.php +++ b/app/Livewire/Comics/ComicIndex.php @@ -8,7 +8,6 @@ use App\Models\Comic; use Illuminate\Support\Facades\Auth; use Illuminate\Support\Facades\DB; -use Illuminate\Support\Str; use Livewire\Component; use Livewire\WithPagination; @@ -16,21 +15,17 @@ class ComicIndex extends Component { use WithPagination; - private function normalizeForSearch(string $string): string + private function applyAccentInsensitiveSearch($query, string $search, array $columns): void { - return Str::ascii($string); - } + $words = preg_split('/\s+/', trim($search)); - private function matchesSearch(?string $value, string $normalizedSearch): bool - { - if ($value === null) { - return false; + foreach ($words as $word) { + $query->where(function ($q) use ($word, $columns) { + foreach ($columns as $column) { + $q->orWhereRaw('unaccent(COALESCE(' . $column . ", '')) ILIKE unaccent(?)", ['%' . $word . '%']); + } + }); } - - return str_contains( - strtolower($this->normalizeForSearch($value)), - strtolower($normalizedSearch) - ); } public string $search = ''; @@ -133,12 +128,8 @@ public function updatedSelectAll(bool $value): void }); if ($this->search) { - $normalizedSearch = $this->normalizeForSearch($this->search); - $allComics = $query->get(); - $this->selected = $allComics->filter(function ($comic) use ($normalizedSearch) { - return $this->matchesSearch($comic->title, $normalizedSearch) - || $this->matchesSearch($comic->publisher, $normalizedSearch); - })->pluck('id')->map(fn ($id) => (string) $id)->toArray(); + $this->applyAccentInsensitiveSearch($query, $this->search, ['title', 'publisher']); + $this->selected = $query->pluck('id')->map(fn ($id) => (string) $id)->toArray(); } else { $this->selected = $query->pluck('id')->map(fn ($id) => (string) $id)->toArray(); } @@ -197,47 +188,11 @@ public function render() } if ($this->search) { - $normalizedSearch = $this->normalizeForSearch($this->search); - - $exactMatchIds = (clone $query) - ->where(function ($q) { - $q->where('title', 'like', '%'.$this->search.'%') - ->orWhere('publisher', 'like', '%'.$this->search.'%'); - }) - ->pluck('id'); - - $allComics = $query->get(); - $filteredIds = $allComics->filter(function ($comic) use ($normalizedSearch) { - return $this->matchesSearch($comic->title, $normalizedSearch) - || $this->matchesSearch($comic->publisher, $normalizedSearch); - })->pluck('id'); - - $matchingIds = $exactMatchIds->merge($filteredIds)->unique(); - - $searchQuery = Comic::query() - ->whereIn('id', $matchingIds); - - if (in_array($sortBy, ['issue_count', 'start_year'])) { - if ($sortDir === 'asc') { - $searchQuery->orderByRaw("{$sortBy} IS NOT NULL") - ->orderByRaw("CASE WHEN {$sortBy} IS NULL THEN title END ASC") - ->orderBy($sortBy, 'asc'); - } else { - $searchQuery->orderByRaw("{$sortBy} IS NULL") - ->orderBy($sortBy, 'desc') - ->orderByRaw("CASE WHEN {$sortBy} IS NULL THEN title END DESC"); - } - } elseif ($sortBy === 'date_finished') { - $searchQuery->orderBy(DB::raw('COALESCE(date_finished, updated_at)'), $sortDir); - } else { - $searchQuery->orderBy($sortBy, $sortDir); - } - - $comics = $searchQuery->paginate($perPage); - } else { - $comics = $query->paginate($perPage); + $this->applyAccentInsensitiveSearch($query, $this->search, ['title', 'publisher']); } + $comics = $query->paginate($perPage); + $publishers = Comic::query() ->where('user_id', Auth::id()) ->whereNotNull('publisher') diff --git a/app/Livewire/Movies/MovieIndex.php b/app/Livewire/Movies/MovieIndex.php index 6e6f60a..930ebae 100644 --- a/app/Livewire/Movies/MovieIndex.php +++ b/app/Livewire/Movies/MovieIndex.php @@ -8,7 +8,6 @@ use App\Models\Movie; use Illuminate\Support\Facades\Auth; use Illuminate\Support\Facades\DB; -use Illuminate\Support\Str; use Livewire\Component; use Livewire\WithPagination; @@ -51,21 +50,17 @@ class MovieIndex extends Component 'viewMode' => ['except' => 'gallery'], ]; - private function normalizeForSearch(string $string): string + private function applyAccentInsensitiveSearch($query, string $search, array $columns): void { - return Str::ascii($string); - } + $words = preg_split('/\s+/', trim($search)); - private function matchesSearch(?string $value, string $normalizedSearch): bool - { - if ($value === null) { - return false; + foreach ($words as $word) { + $query->where(function ($q) use ($word, $columns) { + foreach ($columns as $column) { + $q->orWhereRaw('unaccent(COALESCE(' . $column . ", '')) ILIKE unaccent(?)", ['%' . $word . '%']); + } + }); } - - return str_contains( - strtolower($this->normalizeForSearch($value)), - strtolower($normalizedSearch) - ); } public function updatingSearch(): void @@ -143,13 +138,8 @@ public function updatedSelectAll(bool $value): void $this->applyTypeFilter($query); if ($this->search) { - $normalizedSearch = $this->normalizeForSearch($this->search); - $allMovies = $query->get(); - $this->selected = $allMovies->filter(function ($movie) use ($normalizedSearch) { - return $this->matchesSearch($movie->title, $normalizedSearch) - || $this->matchesSearch($movie->director, $normalizedSearch) - || $this->matchesSearch($movie->original_title, $normalizedSearch); - })->pluck('id')->map(fn ($id) => (string) $id)->toArray(); + $this->applyAccentInsensitiveSearch($query, $this->search, ['title', 'director', 'original_title']); + $this->selected = $query->pluck('id')->map(fn ($id) => (string) $id)->toArray(); } else { $this->selected = $query->pluck('id')->map(fn ($id) => (string) $id)->toArray(); } @@ -215,16 +205,7 @@ public function render() $this->applyTypeFilter($query); if ($this->search) { - $normalizedSearch = $this->normalizeForSearch($this->search); - - $allFilteredMovies = (clone $query)->get(); - $matchingIds = $allFilteredMovies->filter(function ($movie) use ($normalizedSearch) { - return $this->matchesSearch($movie->title, $normalizedSearch) - || $this->matchesSearch($movie->director, $normalizedSearch) - || $this->matchesSearch($movie->original_title, $normalizedSearch); - })->pluck('id'); - - $query->whereIn('id', $matchingIds); + $this->applyAccentInsensitiveSearch($query, $this->search, ['title', 'director', 'original_title']); } if ($sortBy === 'runtime_minutes') { diff --git a/app/Providers/AppServiceProvider.php b/app/Providers/AppServiceProvider.php index 719a47f..3a02436 100644 --- a/app/Providers/AppServiceProvider.php +++ b/app/Providers/AppServiceProvider.php @@ -19,9 +19,9 @@ public function register(): void */ public function boot(): void { - // Trust all proxies (required for Traefik/subpath) + // Trust proxies from container/private networks only (Traefik/subpath) \Illuminate\Http\Request::setTrustedProxies( - ['0.0.0.0/0', '2000::/3'], + explode(',', env('TRUSTED_PROXIES', '10.0.0.0/8,172.16.0.0/12,192.168.0.0/16,fd00::/8')), \Illuminate\Http\Request::HEADER_X_FORWARDED_FOR | \Illuminate\Http\Request::HEADER_X_FORWARDED_HOST | \Illuminate\Http\Request::HEADER_X_FORWARDED_PORT | diff --git a/app/Services/ComicVineService.php b/app/Services/ComicVineService.php index fec449a..bbb22fd 100644 --- a/app/Services/ComicVineService.php +++ b/app/Services/ComicVineService.php @@ -56,7 +56,9 @@ public function searchVolumes(string $query): array ]) ->values() ->all(); - } catch (\Exception) { + } catch (\Exception $e) { + \Illuminate\Support\Facades\Log::warning('ComicVine API error: ' . $e->getMessage()); + return []; } } @@ -104,7 +106,9 @@ public function fetchVolumeDetails(string $volumeId): ?array 'creators' => $creators ?: null, 'characters' => $characters ?: null, ]; - } catch (\Exception) { + } catch (\Exception $e) { + \Illuminate\Support\Facades\Log::warning('ComicVine API error: ' . $e->getMessage()); + return null; } } @@ -155,8 +159,8 @@ public function fetchVolumeIssues(string $volumeId): array usleep(400000); } } while ($offset < $totalResults && ! empty($results)); - } catch (\Exception) { - // Return whatever we collected so far + } catch (\Exception $e) { + \Illuminate\Support\Facades\Log::warning('ComicVine API error during issue fetch: ' . $e->getMessage()); } return $allIssues; diff --git a/app/Services/TmdbService.php b/app/Services/TmdbService.php index 87b08ad..32f43c0 100644 --- a/app/Services/TmdbService.php +++ b/app/Services/TmdbService.php @@ -63,7 +63,9 @@ public function findByImdbId(string $imdbId): ?array // Fetch full details return $isTV ? $this->fetchTVDetails($item['id']) : $this->fetchMovieDetails($item['id']); - } catch (\Exception) { + } catch (\Exception $e) { + \Illuminate\Support\Facades\Log::warning('TMDB API error: ' . $e->getMessage()); + return null; } } @@ -100,7 +102,9 @@ public function searchByTitle(string $title, ?int $year = null): ?array } return $this->fetchMovieDetails($results[0]['id']); - } catch (\Exception) { + } catch (\Exception $e) { + \Illuminate\Support\Facades\Log::warning('TMDB API error: ' . $e->getMessage()); + return null; } } @@ -118,7 +122,9 @@ public function fetchMovieDetails(int $tmdbId): ?array } return $this->normalizeData($response->json()); - } catch (\Exception) { + } catch (\Exception $e) { + \Illuminate\Support\Facades\Log::warning('TMDB API error: ' . $e->getMessage()); + return null; } } @@ -136,7 +142,9 @@ public function fetchTVDetails(int $tmdbId): ?array } return $this->normalizeData($response->json()); - } catch (\Exception) { + } catch (\Exception $e) { + \Illuminate\Support\Facades\Log::warning('TMDB API error: ' . $e->getMessage()); + return null; } } @@ -183,7 +191,9 @@ public function findEpisodeDetailsByImdbId(string $imdbId): ?array ? self::IMAGE_BASE_URL . $showData['poster_path'] : null, ]; - } catch (\Exception) { + } catch (\Exception $e) { + \Illuminate\Support\Facades\Log::warning('TMDB API error: ' . $e->getMessage()); + return null; } } @@ -215,7 +225,9 @@ public function searchTVShowPosterByTitle(string $title): ?string $posterPath = $results[0]['poster_path'] ?? null; return $posterPath ? self::IMAGE_BASE_URL . $posterPath : null; - } catch (\Exception) { + } catch (\Exception $e) { + \Illuminate\Support\Facades\Log::warning('TMDB API error: ' . $e->getMessage()); + return null; } } @@ -295,7 +307,9 @@ public function searchMulti(string $query, int $page = 1): array 'total_pages' => $data['total_pages'] ?? 0, 'total_results' => $data['total_results'] ?? 0, ]; - } catch (\Exception) { + } catch (\Exception $e) { + \Illuminate\Support\Facades\Log::warning('TMDB API error: ' . $e->getMessage()); + return ['results' => [], 'total_pages' => 0, 'total_results' => 0]; } } @@ -335,7 +349,9 @@ public function fetchTVSeasons(int $tmdbId): ?array $normalized['seasons'] = $seasons; return $normalized; - } catch (\Exception) { + } catch (\Exception $e) { + \Illuminate\Support\Facades\Log::warning('TMDB API error: ' . $e->getMessage()); + return null; } } @@ -369,7 +385,9 @@ public function fetchTVSeasonEpisodes(int $tmdbId, int $seasonNumber): ?array ]) ->values() ->all(); - } catch (\Exception) { + } catch (\Exception $e) { + \Illuminate\Support\Facades\Log::warning('TMDB API error: ' . $e->getMessage()); + return null; } } diff --git a/app/Services/TraktService.php b/app/Services/TraktService.php index 49529bb..44db31a 100644 --- a/app/Services/TraktService.php +++ b/app/Services/TraktService.php @@ -53,7 +53,9 @@ public function findByImdbId(string $imdbId): ?array } return $this->normalizeData($data, $type); - } catch (\Exception) { + } catch (\Exception $e) { + \Illuminate\Support\Facades\Log::warning('Trakt API error: ' . $e->getMessage()); + return null; } } @@ -90,7 +92,9 @@ public function searchByTitle(string $title, mixed $year = null): ?array } return $this->normalizeData($data, $itemType); - } catch (\Exception) { + } catch (\Exception $e) { + \Illuminate\Support\Facades\Log::warning('Trakt API error: ' . $e->getMessage()); + return null; } } diff --git a/database/migrations/2026_03_14_122109_add_unaccent_extension.php b/database/migrations/2026_03_14_122109_add_unaccent_extension.php new file mode 100644 index 0000000..5176eef --- /dev/null +++ b/database/migrations/2026_03_14_122109_add_unaccent_extension.php @@ -0,0 +1,17 @@ +index('comicvine_issue_id'); + }); + + Schema::table('episodes', function (Blueprint $table) { + $table->index('show_id'); + }); + } + + public function down(): void + { + Schema::table('comic_issues', function (Blueprint $table) { + $table->dropIndex(['comicvine_issue_id']); + }); + + Schema::table('episodes', function (Blueprint $table) { + $table->dropIndex(['show_id']); + }); + } +}; From 1cc860683a53661262b07da875d067c073d8299d Mon Sep 17 00:00:00 2001 From: dotMavriQ Date: Sat, 14 Mar 2026 14:21:14 +0000 Subject: [PATCH 02/77] fix: rename date_recorded back to date_finished for books date_recorded was a confusing name - it's the date you finished reading the book, not when it was recorded. Rename to date_finished to match comics and anime. Clear bogus finish dates on unread books and move the original shelf-added timestamps into date_added where they belong. Sort options now hide Date Finished and Date Started when they don't apply to the current status filter. --- app/Livewire/Books/BookIndex.php | 11 ++++++-- app/Livewire/Dashboard.php | 2 +- app/Models/Book.php | 4 +-- app/Services/GoodReadsImportService.php | 2 +- ...ate_recorded_to_date_finished_in_books.php | 28 +++++++++++++++++++ .../views/livewire/books/book-index.blade.php | 10 +++++-- .../views/livewire/books/book-show.blade.php | 6 ++-- 7 files changed, 51 insertions(+), 12 deletions(-) create mode 100644 database/migrations/2026_03_14_135935_rename_date_recorded_to_date_finished_in_books.php diff --git a/app/Livewire/Books/BookIndex.php b/app/Livewire/Books/BookIndex.php index 0fdd071..9673c19 100644 --- a/app/Livewire/Books/BookIndex.php +++ b/app/Livewire/Books/BookIndex.php @@ -45,7 +45,7 @@ private function applyAccentInsensitiveSearch($query, string $search, array $col public bool $selectAll = false; - private const ALLOWED_SORT_COLUMNS = ['title', 'author', 'rating', 'page_count', 'date_finished', 'updated_at', 'date_started', 'date_recorded']; + private const ALLOWED_SORT_COLUMNS = ['title', 'author', 'rating', 'page_count', 'date_finished', 'date_added', 'updated_at', 'date_started']; protected $queryString = [ 'search' => ['except' => ''], @@ -61,8 +61,15 @@ public function updatingSearch(): void $this->resetPage(); } - public function updatingStatus(): void + public function updatingStatus(string $value): void { + // Reset sort if it no longer applies to the new status + if ($value === 'want_to_read' && in_array($this->sortBy, ['date_finished', 'date_started'])) { + $this->sortBy = 'date_added'; + } elseif ($value === 'reading' && $this->sortBy === 'date_finished') { + $this->sortBy = 'date_started'; + } + $this->resetPage(); } diff --git a/app/Livewire/Dashboard.php b/app/Livewire/Dashboard.php index 1236b8d..b96999a 100644 --- a/app/Livewire/Dashboard.php +++ b/app/Livewire/Dashboard.php @@ -59,7 +59,7 @@ public function getReadingStats(): array $bookStats = $user->books() ->selectRaw("COUNT(*) as total") ->selectRaw("SUM(CASE WHEN status = ? THEN 1 ELSE 0 END) as currently_reading", [ReadingStatus::Reading->value]) - ->selectRaw("SUM(CASE WHEN status = ? AND " . sprintf($yearSql, 'date_recorded') . " = ? THEN 1 ELSE 0 END) as read_this_year", [ReadingStatus::Read->value, (string) $year]) + ->selectRaw("SUM(CASE WHEN status = ? AND " . sprintf($yearSql, 'date_finished') . " = ? THEN 1 ELSE 0 END) as read_this_year", [ReadingStatus::Read->value, (string) $year]) ->first(); $comicStats = $user->comics() diff --git a/app/Models/Book.php b/app/Models/Book.php index 377330a..38e58b9 100644 --- a/app/Models/Book.php +++ b/app/Models/Book.php @@ -37,7 +37,7 @@ class Book extends Model 'date_pub', 'date_pub_edition', 'date_started', - 'date_recorded', + 'date_finished', 'date_added', 'shelves', 'notes', @@ -61,7 +61,7 @@ protected function casts(): array 'owned' => 'boolean', 'published_date' => 'date', 'date_started' => 'date', - 'date_recorded' => 'date', + 'date_finished' => 'date', 'date_added' => 'date', ]; } diff --git a/app/Services/GoodReadsImportService.php b/app/Services/GoodReadsImportService.php index 657dc46..7b32f6b 100644 --- a/app/Services/GoodReadsImportService.php +++ b/app/Services/GoodReadsImportService.php @@ -55,7 +55,7 @@ protected function mapRowToBook(array $row): array 'status' => $this->mapShelfToStatus($row['Exclusive Shelf'] ?? $row['Shelves'] ?? ''), 'rating' => $this->parseRating($row['My Rating'] ?? ''), 'date_started' => $this->parseDate($row['Date Started'] ?? ''), - 'date_recorded' => $this->parseDate($row['Date Read'] ?? ''), + 'date_finished' => $this->parseDate($row['Date Read'] ?? ''), 'notes' => $row['My Review'] ?? $row['Review'] ?? null, 'cover_url' => null, ]; diff --git a/database/migrations/2026_03_14_135935_rename_date_recorded_to_date_finished_in_books.php b/database/migrations/2026_03_14_135935_rename_date_recorded_to_date_finished_in_books.php new file mode 100644 index 0000000..7959329 --- /dev/null +++ b/database/migrations/2026_03_14_135935_rename_date_recorded_to_date_finished_in_books.php @@ -0,0 +1,28 @@ +whereNot('status', 'read') + ->update(['date_recorded' => null]); + + Schema::table('books', function (Blueprint $table) { + $table->renameColumn('date_recorded', 'date_finished'); + }); + } + + public function down(): void + { + Schema::table('books', function (Blueprint $table) { + $table->renameColumn('date_finished', 'date_recorded'); + }); + } +}; diff --git a/resources/views/livewire/books/book-index.blade.php b/resources/views/livewire/books/book-index.blade.php index 77d368f..539011d 100644 --- a/resources/views/livewire/books/book-index.blade.php +++ b/resources/views/livewire/books/book-index.blade.php @@ -109,9 +109,13 @@ class="rounded-md border-0 py-1.5 pl-3 pr-8 text-sm text-theme-text-primary ring - - - + @if(in_array($status, ['read', 'reading', ''])) + + @endif + @if(in_array($status, ['read', ''])) + + @endif + diff --git a/resources/views/livewire/books/book-show.blade.php b/resources/views/livewire/books/book-show.blade.php index f81a42a..1f3a436 100644 --- a/resources/views/livewire/books/book-show.blade.php +++ b/resources/views/livewire/books/book-show.blade.php @@ -211,10 +211,10 @@ class="btn-danger inline-flex items-center rounded-md px-3 py-2 text-sm font-sem @endif - @if($book->date_recorded ?? $book->date_added) + @if($book->date_finished)
-
Added to Library
-
{{ ($book->date_recorded ?? $book->date_added)->format('F j, Y') }}
+
Date Finished
+
{{ $book->date_finished->format('F j, Y') }}
@endif From 4e46572be9ee77d1a8cb4d0137a779929ce80bfe Mon Sep 17 00:00:00 2001 From: dotMavriQ Date: Sat, 14 Mar 2026 14:41:29 +0000 Subject: [PATCH 03/77] fix: cap ComicVine issue pagination at 1000 issues Prevents timeouts on very large series by limiting to 10 pages. --- app/Services/ComicVineService.php | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/app/Services/ComicVineService.php b/app/Services/ComicVineService.php index bbb22fd..edf9d9d 100644 --- a/app/Services/ComicVineService.php +++ b/app/Services/ComicVineService.php @@ -122,6 +122,8 @@ public function fetchVolumeIssues(string $volumeId): array $allIssues = []; $offset = 0; $limit = 100; + $maxPages = 10; + $page = 0; try { do { @@ -153,12 +155,13 @@ public function fetchVolumeIssues(string $volumeId): array } $offset += $limit; + $page++; // Respect rate limits if we need more pages if ($offset < $totalResults && ! empty($results)) { usleep(400000); } - } while ($offset < $totalResults && ! empty($results)); + } while ($offset < $totalResults && ! empty($results) && $page < $maxPages); } catch (\Exception $e) { \Illuminate\Support\Facades\Log::warning('ComicVine API error during issue fetch: ' . $e->getMessage()); } From 2dcf479074f476f01db2dc5e0cc13715728bc83b Mon Sep 17 00:00:00 2001 From: dotMavriQ Date: Sat, 14 Mar 2026 17:55:02 +0000 Subject: [PATCH 04/77] fix: hide irrelevant date sort options based on status filter Date Finished, Date Started, and Date Watched now only show in the sort dropdown when the current status filter makes them meaningful. Switching to a status where the active sort doesn't apply resets to a sensible default. --- app/Livewire/Anime/AnimeIndex.php | 8 +++++++- app/Livewire/Comics/ComicIndex.php | 8 +++++++- app/Livewire/Movies/MovieIndex.php | 6 +++++- resources/views/livewire/anime/anime-index.blade.php | 6 ++++++ resources/views/livewire/comics/comic-index.blade.php | 6 ++++++ resources/views/livewire/movies/movie-index.blade.php | 4 +++- 6 files changed, 34 insertions(+), 4 deletions(-) diff --git a/app/Livewire/Anime/AnimeIndex.php b/app/Livewire/Anime/AnimeIndex.php index dc84db0..b9ca1c3 100644 --- a/app/Livewire/Anime/AnimeIndex.php +++ b/app/Livewire/Anime/AnimeIndex.php @@ -63,8 +63,14 @@ public function updatingSearch(): void $this->resetPage(); } - public function updatingStatus(): void + public function updatingStatus(string $value): void { + if ($value === 'watchlist' && in_array($this->sortBy, ['date_finished', 'date_started'])) { + $this->sortBy = 'updated_at'; + } elseif ($value === 'watching' && $this->sortBy === 'date_finished') { + $this->sortBy = 'date_started'; + } + $this->resetPage(); } diff --git a/app/Livewire/Comics/ComicIndex.php b/app/Livewire/Comics/ComicIndex.php index df67315..f92d99a 100644 --- a/app/Livewire/Comics/ComicIndex.php +++ b/app/Livewire/Comics/ComicIndex.php @@ -60,8 +60,14 @@ public function updatingSearch(): void $this->resetPage(); } - public function updatingStatus(): void + public function updatingStatus(string $value): void { + if ($value === 'want_to_read' && in_array($this->sortBy, ['date_finished', 'date_started'])) { + $this->sortBy = 'updated_at'; + } elseif ($value === 'reading' && $this->sortBy === 'date_finished') { + $this->sortBy = 'date_started'; + } + $this->resetPage(); } diff --git a/app/Livewire/Movies/MovieIndex.php b/app/Livewire/Movies/MovieIndex.php index 930ebae..62de86e 100644 --- a/app/Livewire/Movies/MovieIndex.php +++ b/app/Livewire/Movies/MovieIndex.php @@ -68,8 +68,12 @@ public function updatingSearch(): void $this->resetPage(); } - public function updatingStatus(): void + public function updatingStatus(string $value): void { + if ($value !== '' && $value !== 'watched' && $this->sortBy === 'date_watched') { + $this->sortBy = 'updated_at'; + } + $this->resetPage(); } diff --git a/resources/views/livewire/anime/anime-index.blade.php b/resources/views/livewire/anime/anime-index.blade.php index c559e32..5188854 100644 --- a/resources/views/livewire/anime/anime-index.blade.php +++ b/resources/views/livewire/anime/anime-index.blade.php @@ -122,6 +122,12 @@ class="rounded-md border-0 py-1.5 pl-3 pr-8 text-sm ring-1 ring-inset ring-theme + @if(in_array($status, ['watching', 'watched', ''])) + + @endif + @if(in_array($status, ['watched', ''])) + + @endif diff --git a/resources/views/livewire/comics/comic-index.blade.php b/resources/views/livewire/comics/comic-index.blade.php index 02558ce..1fbb8bd 100644 --- a/resources/views/livewire/comics/comic-index.blade.php +++ b/resources/views/livewire/comics/comic-index.blade.php @@ -106,6 +106,12 @@ class="rounded-md border-0 py-1.5 pl-3 pr-8 text-sm text-theme-text-primary ring + @if(in_array($status, ['reading', 'read', ''])) + + @endif + @if(in_array($status, ['read', ''])) + + @endif diff --git a/resources/views/livewire/movies/movie-index.blade.php b/resources/views/livewire/movies/movie-index.blade.php index 1f1606f..fca93cc 100644 --- a/resources/views/livewire/movies/movie-index.blade.php +++ b/resources/views/livewire/movies/movie-index.blade.php @@ -130,7 +130,9 @@ class="rounded-md border-0 py-1.5 pl-3 pr-8 text-sm ring-1 ring-inset ring-theme - + @if(in_array($status, ['watched', ''])) + + @endif From 8db674f42a13e19ca7002c54bd85c2709b18d9e1 Mon Sep 17 00:00:00 2001 From: dotMavriQ Date: Thu, 19 Mar 2026 02:04:40 +0000 Subject: [PATCH 05/77] Fix pagination duplicates across all index views Add id tiebreaker to orderBy clauses so rows with identical sort values get a stable order across pages. --- app/Livewire/Anime/AnimeIndex.php | 17 ++++------------- app/Livewire/Books/BookIndex.php | 18 +++++------------- app/Livewire/Comics/ComicIndex.php | 17 ++++------------- app/Livewire/Movies/MovieIndex.php | 17 ++++------------- 4 files changed, 17 insertions(+), 52 deletions(-) diff --git a/app/Livewire/Anime/AnimeIndex.php b/app/Livewire/Anime/AnimeIndex.php index b9ca1c3..29e741a 100644 --- a/app/Livewire/Anime/AnimeIndex.php +++ b/app/Livewire/Anime/AnimeIndex.php @@ -5,6 +5,7 @@ namespace App\Livewire\Anime; use App\Enums\WatchingStatus; +use App\Livewire\Concerns\WithAccentInsensitiveSearch; use App\Models\Anime; use Illuminate\Support\Facades\Auth; use Illuminate\Support\Facades\DB; @@ -13,6 +14,7 @@ class AnimeIndex extends Component { + use WithAccentInsensitiveSearch; use WithPagination; public string $search = ''; @@ -45,19 +47,6 @@ class AnimeIndex extends Component 'viewMode' => ['except' => 'gallery'], ]; - private function applyAccentInsensitiveSearch($query, string $search, array $columns): void - { - $words = preg_split('/\s+/', trim($search)); - - foreach ($words as $word) { - $query->where(function ($q) use ($word, $columns) { - foreach ($columns as $column) { - $q->orWhereRaw('unaccent(COALESCE(' . $column . ", '')) ILIKE unaccent(?)", ['%' . $word . '%']); - } - }); - } - } - public function updatingSearch(): void { $this->resetPage(); @@ -191,6 +180,8 @@ public function render() $query->orderBy($sortBy, $sortDir); } + $query->orderBy('id'); + if ($this->search) { $this->applyAccentInsensitiveSearch($query, $this->search, ['title', 'original_title', 'studios']); } diff --git a/app/Livewire/Books/BookIndex.php b/app/Livewire/Books/BookIndex.php index 9673c19..717de27 100644 --- a/app/Livewire/Books/BookIndex.php +++ b/app/Livewire/Books/BookIndex.php @@ -5,6 +5,7 @@ namespace App\Livewire\Books; use App\Enums\ReadingStatus; +use App\Livewire\Concerns\WithAccentInsensitiveSearch; use App\Models\Book; use Illuminate\Support\Facades\Auth; use Illuminate\Support\Facades\DB; @@ -13,21 +14,9 @@ class BookIndex extends Component { + use WithAccentInsensitiveSearch; use WithPagination; - private function applyAccentInsensitiveSearch($query, string $search, array $columns): void - { - $words = preg_split('/\s+/', trim($search)); - - foreach ($words as $word) { - $query->where(function ($q) use ($word, $columns) { - foreach ($columns as $column) { - $q->orWhereRaw('unaccent(COALESCE(' . $column . ", '')) ILIKE unaccent(?)", ['%' . $word . '%']); - } - }); - } - } - public string $search = ''; public string $status = ''; @@ -238,6 +227,9 @@ public function render() $query->orderBy($sortBy, $sortDir); } + // Tiebreaker for stable pagination (prevents duplicates across pages) + $query->orderBy('id'); + if ($this->search) { $this->applyAccentInsensitiveSearch($query, $this->search, ['title', 'author']); } diff --git a/app/Livewire/Comics/ComicIndex.php b/app/Livewire/Comics/ComicIndex.php index f92d99a..c27e1b9 100644 --- a/app/Livewire/Comics/ComicIndex.php +++ b/app/Livewire/Comics/ComicIndex.php @@ -5,6 +5,7 @@ namespace App\Livewire\Comics; use App\Enums\ReadingStatus; +use App\Livewire\Concerns\WithAccentInsensitiveSearch; use App\Models\Comic; use Illuminate\Support\Facades\Auth; use Illuminate\Support\Facades\DB; @@ -13,21 +14,9 @@ class ComicIndex extends Component { + use WithAccentInsensitiveSearch; use WithPagination; - private function applyAccentInsensitiveSearch($query, string $search, array $columns): void - { - $words = preg_split('/\s+/', trim($search)); - - foreach ($words as $word) { - $query->where(function ($q) use ($word, $columns) { - foreach ($columns as $column) { - $q->orWhereRaw('unaccent(COALESCE(' . $column . ", '')) ILIKE unaccent(?)", ['%' . $word . '%']); - } - }); - } - } - public string $search = ''; public string $status = ''; @@ -193,6 +182,8 @@ public function render() $query->orderBy($sortBy, $sortDir); } + $query->orderBy('id'); + if ($this->search) { $this->applyAccentInsensitiveSearch($query, $this->search, ['title', 'publisher']); } diff --git a/app/Livewire/Movies/MovieIndex.php b/app/Livewire/Movies/MovieIndex.php index 62de86e..f77e37d 100644 --- a/app/Livewire/Movies/MovieIndex.php +++ b/app/Livewire/Movies/MovieIndex.php @@ -5,6 +5,7 @@ namespace App\Livewire\Movies; use App\Enums\WatchingStatus; +use App\Livewire\Concerns\WithAccentInsensitiveSearch; use App\Models\Movie; use Illuminate\Support\Facades\Auth; use Illuminate\Support\Facades\DB; @@ -13,6 +14,7 @@ class MovieIndex extends Component { + use WithAccentInsensitiveSearch; use WithPagination; private const TV_SHOW_TYPES = ['TV Episode', 'TV Series', 'TV Mini Series']; @@ -50,19 +52,6 @@ class MovieIndex extends Component 'viewMode' => ['except' => 'gallery'], ]; - private function applyAccentInsensitiveSearch($query, string $search, array $columns): void - { - $words = preg_split('/\s+/', trim($search)); - - foreach ($words as $word) { - $query->where(function ($q) use ($word, $columns) { - foreach ($columns as $column) { - $q->orWhereRaw('unaccent(COALESCE(' . $column . ", '')) ILIKE unaccent(?)", ['%' . $word . '%']); - } - }); - } - } - public function updatingSearch(): void { $this->resetPage(); @@ -238,6 +227,8 @@ public function render() $query->orderBy($sortBy, $sortDir); } + $query->orderBy('id'); + $movies = $query->paginate($perPage); $rawTypes = Movie::where('user_id', Auth::id()) From ee1505241324679bf40d8e55e9f4d04963befe4d Mon Sep 17 00:00:00 2001 From: dotMavriQ Date: Thu, 19 Mar 2026 02:05:23 +0000 Subject: [PATCH 06/77] Add missing WithAccentInsensitiveSearch trait --- .../Concerns/WithAccentInsensitiveSearch.php | 21 +++++++++++++++++++ 1 file changed, 21 insertions(+) create mode 100644 app/Livewire/Concerns/WithAccentInsensitiveSearch.php diff --git a/app/Livewire/Concerns/WithAccentInsensitiveSearch.php b/app/Livewire/Concerns/WithAccentInsensitiveSearch.php new file mode 100644 index 0000000..07d096e --- /dev/null +++ b/app/Livewire/Concerns/WithAccentInsensitiveSearch.php @@ -0,0 +1,21 @@ +where(function ($q) use ($word, $columns) { + foreach ($columns as $column) { + $q->orWhereRaw('unaccent(COALESCE(' . $column . ", '')) ILIKE unaccent(?)", ['%' . $word . '%']); + } + }); + } + } +} From d89d78f3615c2d8a56f9cc5a3279eab33e735efb Mon Sep 17 00:00:00 2001 From: dotMavriQ Date: Sat, 21 Mar 2026 11:43:25 +0000 Subject: [PATCH 07/77] fix: N+1 query in BookImport, update factory column name, add DB sync script - Replace individual Book::find() calls in dispatchCoverFetchJobs() with single Book::whereIn() query - Update BookFactory to use date_finished (was date_recorded after rename) - Add bin/sync-db for pulling production DB to local dev Co-Authored-By: Claude Opus 4.6 --- app/Livewire/Books/BookImport.php | 13 +++--------- bin/sync-db | 32 ++++++++++++++++++++++++++++++ database/factories/BookFactory.php | 8 ++++---- 3 files changed, 39 insertions(+), 14 deletions(-) create mode 100755 bin/sync-db diff --git a/app/Livewire/Books/BookImport.php b/app/Livewire/Books/BookImport.php index 6b26341..8459c9a 100644 --- a/app/Livewire/Books/BookImport.php +++ b/app/Livewire/Books/BookImport.php @@ -121,21 +121,14 @@ public function import(): void protected function dispatchCoverFetchJobs(array $bookIds): int { $dispatched = 0; + $books = Book::whereIn('id', $bookIds)->get(); - foreach ($bookIds as $bookId) { - $book = Book::find($bookId); - - if (! $book) { - continue; - } - - // Check if book has external cover URL or ISBN for lookup + foreach ($books as $book) { $hasExternalUrl = $book->cover_url && filter_var($book->cover_url, FILTER_VALIDATE_URL); $hasIsbn = $book->isbn || $book->isbn13; if ($hasExternalUrl || $hasIsbn) { - // Dispatch after response - runs in background after user sees result - FetchBookCover::dispatchAfterResponse($bookId, $hasExternalUrl ? $book->cover_url : null); + FetchBookCover::dispatchAfterResponse($book->id, $hasExternalUrl ? $book->cover_url : null); $dispatched++; } } diff --git a/bin/sync-db b/bin/sync-db new file mode 100755 index 0000000..48ce67a --- /dev/null +++ b/bin/sync-db @@ -0,0 +1,32 @@ +#!/usr/bin/env bash +set -euo pipefail + +# Sync local dev database from production (gerty) +# Usage: ./bin/sync-db + +REMOTE="gerty" +REMOTE_CONTAINER="teal-db" +REMOTE_DB="teal" +REMOTE_USER="teal" +LOCAL_HOST="127.0.0.1" +LOCAL_PORT="5432" +LOCAL_DB="teal" +LOCAL_USER="teal" +DUMP_FILE="/tmp/teal_prod.dump" + +echo "Dumping production database..." +ssh "$REMOTE" "docker exec $REMOTE_CONTAINER pg_dump -U $REMOTE_USER -d $REMOTE_DB -Fc" > "$DUMP_FILE" + +echo "Dropping and recreating local database..." +PGPASSWORD=secret psql -h "$LOCAL_HOST" -p "$LOCAL_PORT" -U "$LOCAL_USER" -d postgres -c "DROP DATABASE IF EXISTS $LOCAL_DB;" +PGPASSWORD=secret psql -h "$LOCAL_HOST" -p "$LOCAL_PORT" -U "$LOCAL_USER" -d postgres -c "CREATE DATABASE $LOCAL_DB;" + +echo "Restoring production dump..." +PGPASSWORD=secret pg_restore -h "$LOCAL_HOST" -p "$LOCAL_PORT" -U "$LOCAL_USER" -d "$LOCAL_DB" --no-owner --no-acl "$DUMP_FILE" + +echo "Verifying..." +PGPASSWORD=secret psql -h "$LOCAL_HOST" -p "$LOCAL_PORT" -U "$LOCAL_USER" -d "$LOCAL_DB" -c \ + "SELECT 'books', count(*) FROM books UNION ALL SELECT 'movies', count(*) FROM movies UNION ALL SELECT 'anime', count(*) FROM anime UNION ALL SELECT 'comics', count(*) FROM comics ORDER BY 1;" + +rm "$DUMP_FILE" +echo "Done. Local DB is now in sync with production." diff --git a/database/factories/BookFactory.php b/database/factories/BookFactory.php index 57c52d3..010db58 100755 --- a/database/factories/BookFactory.php +++ b/database/factories/BookFactory.php @@ -41,7 +41,7 @@ public function definition(): array 'status' => $status, 'rating' => $status === ReadingStatus::Read ? fake()->optional(0.8)->numberBetween(1, 5) : null, 'date_started' => $dateStarted, - 'date_recorded' => $dateFinished, + 'date_finished' => $dateFinished, 'notes' => fake()->optional(0.3)->paragraph(), ]; } @@ -51,7 +51,7 @@ public function wantToRead(): static return $this->state(fn (array $attributes) => [ 'status' => ReadingStatus::WantToRead, 'date_started' => null, - 'date_recorded' => null, + 'date_finished' => null, 'rating' => null, ]); } @@ -61,7 +61,7 @@ public function reading(): static return $this->state(fn (array $attributes) => [ 'status' => ReadingStatus::Reading, 'date_started' => fake()->dateTimeBetween('-1 month', 'now'), - 'date_recorded' => null, + 'date_finished' => null, 'rating' => null, ]); } @@ -74,7 +74,7 @@ public function read(): static return [ 'status' => ReadingStatus::Read, 'date_started' => $dateStarted, - 'date_recorded' => fake()->dateTimeBetween($dateStarted, 'now'), + 'date_finished' => fake()->dateTimeBetween($dateStarted, 'now'), 'rating' => fake()->numberBetween(1, 5), ]; }); From 77389d8b5cbdb043d0abd4bdd323e6e95ec06f48 Mon Sep 17 00:00:00 2001 From: dotMavriQ Date: Sat, 21 Mar 2026 11:46:00 +0000 Subject: [PATCH 08/77] fix: N+1 query in BookSettings::recacheCovers() Replace individual $book->update() calls with a single bulk UPDATE query. File deletions and job dispatches still loop as needed. Co-Authored-By: Claude Opus 4.6 --- app/Livewire/Books/BookSettings.php | 18 +++++++++++------- 1 file changed, 11 insertions(+), 7 deletions(-) diff --git a/app/Livewire/Books/BookSettings.php b/app/Livewire/Books/BookSettings.php index 9145018..f86ec78 100644 --- a/app/Livewire/Books/BookSettings.php +++ b/app/Livewire/Books/BookSettings.php @@ -84,23 +84,27 @@ public function recacheCovers(): void }) ->get(); - $count = 0; - foreach ($books as $book) { - // Delete existing local cover file if it exists if ($book->cover_url && str_starts_with($book->cover_url, '/storage/covers/')) { $filename = str_replace('/storage/', '', $book->cover_url); Storage::disk('public')->delete($filename); } + } - // Clear cover_url - $book->update(['cover_url' => null]); + Book::query() + ->where('user_id', Auth::id()) + ->where(function ($query) { + $query->whereNotNull('isbn') + ->orWhereNotNull('isbn13'); + }) + ->update(['cover_url' => null]); - // Dispatch job to fetch fresh cover + foreach ($books as $book) { FetchBookCover::dispatch($book->id); - $count++; } + $count = $books->count(); + session()->flash('message', "Re-caching covers for {$count} book(s). This runs in the background."); } From a8a749a3e5b5e0acb3d442bacb8798694c62fa7c Mon Sep 17 00:00:00 2001 From: dotMavriQ Date: Sat, 21 Mar 2026 11:46:59 +0000 Subject: [PATCH 09/77] fix: add identifier quoting in WithAccentInsensitiveSearch Use query grammar wrap() for column names in whereRaw SQL instead of direct string concatenation. Co-Authored-By: Claude Opus 4.6 --- app/Livewire/Concerns/WithAccentInsensitiveSearch.php | 7 +++++-- 1 file changed, 5 insertions(+), 2 deletions(-) diff --git a/app/Livewire/Concerns/WithAccentInsensitiveSearch.php b/app/Livewire/Concerns/WithAccentInsensitiveSearch.php index 07d096e..989f99d 100644 --- a/app/Livewire/Concerns/WithAccentInsensitiveSearch.php +++ b/app/Livewire/Concerns/WithAccentInsensitiveSearch.php @@ -4,16 +4,19 @@ namespace App\Livewire\Concerns; +use Illuminate\Support\Facades\DB; + trait WithAccentInsensitiveSearch { private function applyAccentInsensitiveSearch($query, string $search, array $columns): void { + $grammar = DB::connection()->getQueryGrammar(); $words = preg_split('/\s+/', trim($search)); foreach ($words as $word) { - $query->where(function ($q) use ($word, $columns) { + $query->where(function ($q) use ($word, $columns, $grammar) { foreach ($columns as $column) { - $q->orWhereRaw('unaccent(COALESCE(' . $column . ", '')) ILIKE unaccent(?)", ['%' . $word . '%']); + $q->orWhereRaw('unaccent(COALESCE(' . $grammar->wrap($column) . ", '')) ILIKE unaccent(?)", ['%' . $word . '%']); } }); } From eea99bfd1ef160ac4d5810c3e0c25fe51bf52006 Mon Sep 17 00:00:00 2001 From: dotMavriQ Date: Sat, 21 Mar 2026 11:53:22 +0000 Subject: [PATCH 10/77] refactor: extract WithSourcePriority trait, delete dead view - Extract duplicated moveSourceUp/moveSourceDown into shared WithSourcePriority trait used by all 3 MetadataEnrichment components - Delete unused book-import-fixed.blade.php Co-Authored-By: Claude Opus 4.6 --- .../Anime/AnimeMetadataEnrichment.php | 21 +- app/Livewire/Books/MetadataEnrichment.php | 21 +- app/Livewire/Concerns/WithSourcePriority.php | 28 ++ .../Movies/MovieMetadataEnrichment.php | 21 +- .../books/book-import-fixed.blade.php | 286 ------------------ 5 files changed, 31 insertions(+), 346 deletions(-) create mode 100644 app/Livewire/Concerns/WithSourcePriority.php delete mode 100644 resources/views/livewire/books/book-import-fixed.blade.php diff --git a/app/Livewire/Anime/AnimeMetadataEnrichment.php b/app/Livewire/Anime/AnimeMetadataEnrichment.php index 2efdbf2..9ed9213 100644 --- a/app/Livewire/Anime/AnimeMetadataEnrichment.php +++ b/app/Livewire/Anime/AnimeMetadataEnrichment.php @@ -12,6 +12,7 @@ class AnimeMetadataEnrichment extends Component { + use \App\Livewire\Concerns\WithSourcePriority; public array $sourcePriority = ['current', 'jikan']; public array $animeNeedingEnrichment = []; @@ -36,26 +37,6 @@ class AnimeMetadataEnrichment extends Component protected const ENRICHABLE_FIELDS = ['description', 'poster_url', 'runtime_minutes', 'genres', 'studios', 'episodes_total', 'media_type', 'original_title']; - public function moveSourceUp(string $source): void - { - $index = array_search($source, $this->sourcePriority); - if ($index > 0) { - $temp = $this->sourcePriority[$index - 1]; - $this->sourcePriority[$index - 1] = $source; - $this->sourcePriority[$index] = $temp; - } - } - - public function moveSourceDown(string $source): void - { - $index = array_search($source, $this->sourcePriority); - if ($index < count($this->sourcePriority) - 1) { - $temp = $this->sourcePriority[$index + 1]; - $this->sourcePriority[$index + 1] = $source; - $this->sourcePriority[$index] = $temp; - } - } - public function scanLibrary(): void { $this->isScanning = true; diff --git a/app/Livewire/Books/MetadataEnrichment.php b/app/Livewire/Books/MetadataEnrichment.php index 70f5bb5..615b245 100644 --- a/app/Livewire/Books/MetadataEnrichment.php +++ b/app/Livewire/Books/MetadataEnrichment.php @@ -13,6 +13,7 @@ class MetadataEnrichment extends Component { + use \App\Livewire\Concerns\WithSourcePriority; // Source priority: sources listed in order of preference public array $sourcePriority = ['current', 'openlibrary']; @@ -59,26 +60,6 @@ public function clearJobStatus(): void $this->jobStatus = null; } - public function moveSourceUp(string $source): void - { - $index = array_search($source, $this->sourcePriority); - if ($index > 0) { - $temp = $this->sourcePriority[$index - 1]; - $this->sourcePriority[$index - 1] = $source; - $this->sourcePriority[$index] = $temp; - } - } - - public function moveSourceDown(string $source): void - { - $index = array_search($source, $this->sourcePriority); - if ($index < count($this->sourcePriority) - 1) { - $temp = $this->sourcePriority[$index + 1]; - $this->sourcePriority[$index + 1] = $source; - $this->sourcePriority[$index] = $temp; - } - } - public function scanLibrary(): void { $this->isScanning = true; diff --git a/app/Livewire/Concerns/WithSourcePriority.php b/app/Livewire/Concerns/WithSourcePriority.php new file mode 100644 index 0000000..1032446 --- /dev/null +++ b/app/Livewire/Concerns/WithSourcePriority.php @@ -0,0 +1,28 @@ +sourcePriority); + if ($index > 0) { + $temp = $this->sourcePriority[$index - 1]; + $this->sourcePriority[$index - 1] = $source; + $this->sourcePriority[$index] = $temp; + } + } + + public function moveSourceDown(string $source): void + { + $index = array_search($source, $this->sourcePriority); + if ($index < count($this->sourcePriority) - 1) { + $temp = $this->sourcePriority[$index + 1]; + $this->sourcePriority[$index + 1] = $source; + $this->sourcePriority[$index] = $temp; + } + } +} diff --git a/app/Livewire/Movies/MovieMetadataEnrichment.php b/app/Livewire/Movies/MovieMetadataEnrichment.php index a7e547f..604f8d6 100644 --- a/app/Livewire/Movies/MovieMetadataEnrichment.php +++ b/app/Livewire/Movies/MovieMetadataEnrichment.php @@ -15,6 +15,7 @@ class MovieMetadataEnrichment extends Component { + use \App\Livewire\Concerns\WithSourcePriority; public array $sourcePriority = ['current', 'trakt', 'tmdb']; public array $moviesNeedingEnrichment = []; @@ -61,26 +62,6 @@ public function clearJobStatus(): void $this->jobStatus = null; } - public function moveSourceUp(string $source): void - { - $index = array_search($source, $this->sourcePriority); - if ($index > 0) { - $temp = $this->sourcePriority[$index - 1]; - $this->sourcePriority[$index - 1] = $source; - $this->sourcePriority[$index] = $temp; - } - } - - public function moveSourceDown(string $source): void - { - $index = array_search($source, $this->sourcePriority); - if ($index < count($this->sourcePriority) - 1) { - $temp = $this->sourcePriority[$index + 1]; - $this->sourcePriority[$index + 1] = $source; - $this->sourcePriority[$index] = $temp; - } - } - public function scanLibrary(): void { $this->isScanning = true; diff --git a/resources/views/livewire/books/book-import-fixed.blade.php b/resources/views/livewire/books/book-import-fixed.blade.php deleted file mode 100644 index 126738f..0000000 --- a/resources/views/livewire/books/book-import-fixed.blade.php +++ /dev/null @@ -1,286 +0,0 @@ -
-
- {{-- Format Selection (Mobile First) --}} - @if(!$importResult) -
- {{-- CSV Format --}} - - - {{-- JSON Format --}} - -
- - {{-- Format Specs --}} -
-

- {{ $format === 'json' ? 'JSON Format Specifications' : 'CSV Format Specifications' }} -

- - @if($format === 'csv') -
-
-

Supported Columns:

-

- Book Id, Title, Author, Additional Authors, ISBN, ISBN13, Publisher, Year Published, Original Publication Year, Number of Pages, My Rating, Exclusive Shelf, Date Started, Date Read, My Review -

-

Import from a CSV export. Required: Title. Optional: ISBN13, Author, etc.

-
-
-

How to export:

-
    -
  1. Prepare your CSV file
  2. -
  3. Click on settings icon (top right)
  4. -
  5. Select "Export Library"
  6. -
  7. Download the CSV file
  8. -
-
-
-

Duplicate Handling:

-

Books are matched by ISBN13 → ISBN → Title+Author. Enable "Skip duplicates" to avoid importing books already in your library.

-
-
- @else -
-
-

Supported Fields:

-
-
Required:
-
title
-
(string)
-
Metadata:
-
author, isbn, isbn13, asin
-
num_pages, published_date
-
Ratings:
-
rating (1-5), avg_rating
-
num_ratings
-
Dates:
-
date_started, date_read
-
date_added, date_pub, date_pub__ed__
-
Content:
-
review, notes, shelves
-
comments, votes
-
Other:
-
bookCover, owned
-
(external URL or boolean)
-
-
-
-

JSON Structure:

-
[
-  {
-    "title": "Book Title",
-    "author": "Author Name",
-    "isbn13": "9780123456789",
-    "rating": 5,
-    "review": "Great book!",
-    "bookCover": "https://example.com/cover.jpg"
-  }
-]
-
-
-

Duplicate Handling:

-

Books are matched by ISBN13 → ISBN → ASIN → Title+Author. Enable "Skip duplicates" to avoid importing books already in your library.

-
-
- @endif -
- - {{-- File Upload --}} -
-
-
- - - @error('file') -

{{ $message }}

- @enderror -
- - {{-- Options --}} -
- - -
- - {{-- Loading indicator --}} -
- - - - - Processing file... -
- - {{-- Preview --}} - @if($preview && $preview->count() > 0) -
-

Preview ({{ $preview->count() }} books)

-
- @foreach($preview as $book) -
- {{ $book['title'] ?? 'Unknown' }} - @if(isset($book['author'])) - by {{ $book['author'] }} - @endif -
- @endforeach -
-
- @endif - - {{-- Import Button --}} -
- - -
-
-
- @else - {{-- Import Result Section --}} -
- @if(isset($importResult['async']) && $importResult['async']) -
-
-
- - - - -
-
-

{{ $importResult['message'] }}

-

You'll receive a notification when the import completes.

-
-
-
- @else -
-
-
Imported
-
{{ $importResult['imported'] }}
-
-
-
Skipped
-
{{ $importResult['skipped'] }}
-
-
-
Errors
-
{{ count($importResult['errors']) }}
-
-
- - @if(!empty($importResult['errors'])) -
-

Errors

-
    - @foreach(array_slice($importResult['errors'], 0, 5) as $error) -
  • - - {{ $error }} -
  • - @endforeach - @if(count($importResult['errors']) > 5) -
  • ... and {{ count($importResult['errors']) - 5 }} more errors
  • - @endif -
-
- @endif - - @if($coverJobsDispatched > 0) -
-
- - - - -
-

Fetching book covers...

-

{{ $coverJobsDispatched }} book {{ Str::plural('cover', $coverJobsDispatched) }} queued. This may take a few minutes.

-
-
-
- @endif - @endif - -
- - View Books - - -
-
- @endif -
-
From c587a2826704111ab3ef9cf0e896cff13b7b232d Mon Sep 17 00:00:00 2001 From: dotMavriQ Date: Sat, 21 Mar 2026 12:00:21 +0000 Subject: [PATCH 11/77] feat: add BookOpenLibrarySearch wizard, fix $query property clash Rename SearchBooks $query to $searchQuery to avoid collision with Saloon\Http\Request::$query on PHP 8.4. Adds search-openlibrary route, component, and view for searching and adding books from OpenLibrary. Co-Authored-By: Claude Opus 4.6 --- app/Livewire/Books/BookOpenLibrarySearch.php | 160 +++++++++++ app/Services/OpenLibraryService.php | 46 +++ .../OpenLibrary/Requests/SearchBooks.php | 34 +++ .../views/livewire/books/book-index.blade.php | 6 + .../books/book-openlibrary-search.blade.php | 268 ++++++++++++++++++ routes/web.php | 2 + 6 files changed, 516 insertions(+) create mode 100644 app/Livewire/Books/BookOpenLibrarySearch.php create mode 100644 app/Services/Saloon/OpenLibrary/Requests/SearchBooks.php create mode 100644 resources/views/livewire/books/book-openlibrary-search.blade.php diff --git a/app/Livewire/Books/BookOpenLibrarySearch.php b/app/Livewire/Books/BookOpenLibrarySearch.php new file mode 100644 index 0000000..fbad5ff --- /dev/null +++ b/app/Livewire/Books/BookOpenLibrarySearch.php @@ -0,0 +1,160 @@ +existingIsbns = Book::where('user_id', $userId) + ->whereNotNull('isbn') + ->pluck('isbn') + ->merge( + Book::where('user_id', $userId) + ->whereNotNull('isbn13') + ->pluck('isbn13') + ) + ->all(); + } + + public function search(): void + { + $query = trim($this->query); + if ($query === '') { + return; + } + + $service = app(OpenLibraryService::class); + $result = $service->search($query, 1); + + $this->searchResults = $result['results']; + $this->totalPages = min($result['total_pages'], 50); + $this->currentPage = 1; + $this->step = 'results'; + } + + public function loadPage(int $page): void + { + $service = app(OpenLibraryService::class); + $result = $service->search(trim($this->query), $page); + + $this->searchResults = $result['results']; + $this->currentPage = $page; + } + + public function selectResult(int $index): void + { + $result = $this->searchResults[$index] ?? null; + if (! $result) { + return; + } + + $this->title = $result['title']; + $this->author = $result['author'] ?? ''; + $this->isbn = $result['isbn'] ?? null; + $this->page_count = $result['page_count'] ?? null; + $this->cover_url = $result['cover_url_large'] ?? $result['cover_url'] ?? ''; + $this->publisher = $result['publisher'] ?? null; + $this->published_year = $result['first_publish_year'] ?? null; + $this->description = ''; + $this->status = 'want_to_read'; + $this->rating = null; + + // Try to fetch description via ISBN if available + if ($this->isbn) { + $service = app(OpenLibraryService::class); + $details = $service->fetchByIsbn($this->isbn); + if ($details) { + $this->description = $details['description'] ?? ''; + $this->page_count = $this->page_count ?? $details['page_count']; + $this->publisher = $this->publisher ?? $details['publisher']; + } + } + + $this->step = 'configure'; + } + + public function addBook(): void + { + $publishedDate = null; + if ($this->published_year) { + $publishedDate = $this->published_year . '-01-01'; + } + + $book = Book::create([ + 'user_id' => Auth::id(), + 'title' => $this->title, + 'author' => $this->author ?: null, + 'isbn' => $this->isbn ?: null, + 'cover_url' => $this->cover_url ?: null, + 'description' => $this->description ?: null, + 'page_count' => $this->page_count, + 'publisher' => $this->publisher ?: null, + 'published_date' => $publishedDate, + 'status' => $this->status, + 'rating' => $this->rating, + 'date_added' => now(), + ]); + + session()->flash('message', "Added \"{$this->title}\" to your library."); + $this->redirect(route('books.show', $book)); + } + + public function backToSearch(): void + { + $this->step = 'search'; + $this->searchResults = []; + $this->query = ''; + } + + public function backToResults(): void + { + $this->step = 'results'; + } + + public function isResultDuplicate(array $result): bool + { + $isbn = $result['isbn'] ?? null; + return $isbn && in_array($isbn, $this->existingIsbns); + } + + public function render() + { + return view('livewire.books.book-openlibrary-search', [ + 'statuses' => ReadingStatus::cases(), + ])->layout('layouts.app'); + } +} diff --git a/app/Services/OpenLibraryService.php b/app/Services/OpenLibraryService.php index 1edb50f..462f3fa 100644 --- a/app/Services/OpenLibraryService.php +++ b/app/Services/OpenLibraryService.php @@ -7,6 +7,7 @@ use App\Services\Saloon\OpenLibrary\OpenLibraryConnector; use App\Services\Saloon\OpenLibrary\Requests\GetIsbnDetails; use App\Services\Saloon\OpenLibrary\Requests\GetWorkDetails; +use App\Services\Saloon\OpenLibrary\Requests\SearchBooks; use Carbon\Carbon; class OpenLibraryService @@ -18,6 +19,51 @@ public function __construct() $this->connector = new OpenLibraryConnector(); } + public function search(string $query, int $page = 1): array + { + try { + $response = $this->connector->send(new SearchBooks($query, $page)); + + if (! $response->successful()) { + return ['results' => [], 'total' => 0, 'total_pages' => 0]; + } + + $data = $response->json(); + $docs = $data['docs'] ?? []; + $numFound = $data['numFound'] ?? 0; + + $results = array_map(function (array $doc) { + $coverId = $doc['cover_i'] ?? null; + + return [ + 'key' => $doc['key'] ?? '', + 'title' => $doc['title'] ?? 'Unknown Title', + 'author' => $doc['author_name'][0] ?? null, + 'authors' => $doc['author_name'] ?? [], + 'first_publish_year' => $doc['first_publish_year'] ?? null, + 'cover_url' => $coverId + ? "https://covers.openlibrary.org/b/id/{$coverId}-M.jpg" + : null, + 'cover_url_large' => $coverId + ? "https://covers.openlibrary.org/b/id/{$coverId}-L.jpg" + : null, + 'isbn' => $doc['isbn'][0] ?? null, + 'page_count' => $doc['number_of_pages_median'] ?? null, + 'publisher' => $doc['publisher'][0] ?? null, + 'edition_count' => $doc['edition_count'] ?? 0, + ]; + }, $docs); + + return [ + 'results' => $results, + 'total' => $numFound, + 'total_pages' => (int) ceil($numFound / 20), + ]; + } catch (\Exception) { + return ['results' => [], 'total' => 0, 'total_pages' => 0]; + } + } + public function fetchByIsbn(string $isbn): ?array { $isbn = preg_replace('/[^0-9X]/i', '', $isbn); diff --git a/app/Services/Saloon/OpenLibrary/Requests/SearchBooks.php b/app/Services/Saloon/OpenLibrary/Requests/SearchBooks.php new file mode 100644 index 0000000..29109a8 --- /dev/null +++ b/app/Services/Saloon/OpenLibrary/Requests/SearchBooks.php @@ -0,0 +1,34 @@ + $this->searchQuery, + 'page' => $this->page, + 'limit' => $this->limit, + 'fields' => 'key,title,author_name,first_publish_year,cover_i,isbn,number_of_pages_median,publisher,edition_count', + ]; + } +} diff --git a/resources/views/livewire/books/book-index.blade.php b/resources/views/livewire/books/book-index.blade.php index 539011d..2d67a77 100644 --- a/resources/views/livewire/books/book-index.blade.php +++ b/resources/views/livewire/books/book-index.blade.php @@ -32,6 +32,12 @@ + + + + + + diff --git a/resources/views/livewire/books/book-openlibrary-search.blade.php b/resources/views/livewire/books/book-openlibrary-search.blade.php new file mode 100644 index 0000000..941bbae --- /dev/null +++ b/resources/views/livewire/books/book-openlibrary-search.blade.php @@ -0,0 +1,268 @@ +
+ {{-- Header --}} +
+
+ +

Search OpenLibrary

+
+
+ +
+
+ {{-- Flash Messages --}} + @if (session()->has('message')) +
+ + + +

{{ session('message') }}

+
+ @endif + @if (session()->has('error')) +
+ + + +

{{ session('error') }}

+
+ @endif + + {{-- ===== STEP: SEARCH ===== --}} + @if($step === 'search') +
+
+
+ + + +

Search OpenLibrary

+

Search for books to add to your library. Powered by OpenLibrary (open source, no API key needed).

+
+
+ + +
+
+
+ + {{-- ===== STEP: RESULTS ===== --}} + @elseif($step === 'results') +
+ +
+ + +
+
+ + @if(empty($searchResults)) +
+

No results found for "{{ $query }}".

+
+ @else +
+ @foreach($searchResults as $index => $result) + + @endforeach +
+ + {{-- Pagination --}} + @if($totalPages > 1) +
+ @if($currentPage > 1) + + @endif + Page {{ $currentPage }} of {{ $totalPages }} + @if($currentPage < $totalPages) + + @endif +
+ @endif + @endif + + {{-- Loading overlay --}} +
+
+ + + + + Fetching book details... +
+
+ + {{-- ===== STEP: CONFIGURE ===== --}} + @elseif($step === 'configure') +
+ +
+ +
+
+
+ {{-- Top: cover thumbnail + key info --}} +
+
+ @if($cover_url) + + @else +
+ + + +
+ @endif +
+
+ + +
+
+ + +
+
+ + +
+
+ + +
+
+
+
+ + {{-- Publisher + ISBN --}} +
+
+ + +
+
+ + +
+
+ + {{-- Description --}} +
+ + +
+ + {{-- Status + Rating row --}} +
+
+ + +
+
+ +
+ @for($i = 1; $i <= 5; $i++) + + @endfor + {{ $rating ? $rating . '/5' : 'Not rated' }} +
+
+
+ + {{-- Actions --}} +
+ + +
+
+
+
+ @endif +
+
+
diff --git a/routes/web.php b/routes/web.php index 01773c9..72a50a5 100644 --- a/routes/web.php +++ b/routes/web.php @@ -3,6 +3,7 @@ use App\Livewire\Books\BookForm; use App\Livewire\Books\BookImport; use App\Livewire\Books\BookIndex; +use App\Livewire\Books\BookOpenLibrarySearch; use App\Livewire\Books\BookSettings; use App\Livewire\Books\BookShow; use App\Livewire\Books\MetadataEnrichment; @@ -64,6 +65,7 @@ Route::get('/', BookIndex::class)->name('index'); Route::get('/create', BookForm::class)->name('create'); Route::get('/import', BookImport::class)->name('import'); + Route::get('/search-openlibrary', BookOpenLibrarySearch::class)->name('search-openlibrary'); Route::get('/queue', ReadQueue::class)->name('queue'); Route::get('/settings', BookSettings::class)->name('settings'); Route::get('/settings/metadata', MetadataEnrichment::class)->name('metadata'); From 050409cac0dfb6435755eb5cb50a2e3942adce1c Mon Sep 17 00:00:00 2001 From: dotMavriQ Date: Sat, 21 Mar 2026 12:21:13 +0000 Subject: [PATCH 12/77] feat: add Google Books as search source, rename to Discover Books - Add GoogleBooksConnector + GoogleBooksService (no API key needed) - Search wizard now supports both Google Books and OpenLibrary sources - Google Books is default (better coverage for self-published titles) - Rename route from /books/search-openlibrary to /books/discover - Rename button label to "Discover Books" Co-Authored-By: Claude Opus 4.6 --- app/Livewire/Books/BookOpenLibrarySearch.php | 23 +++-- app/Services/GoogleBooksService.php | 92 +++++++++++++++++++ .../GoogleBooks/GoogleBooksConnector.php | 45 +++++++++ .../GoogleBooks/Requests/SearchVolumes.php | 33 +++++++ .../views/livewire/books/book-index.blade.php | 4 +- .../books/book-openlibrary-search.blade.php | 18 +++- routes/web.php | 2 +- 7 files changed, 203 insertions(+), 14 deletions(-) create mode 100644 app/Services/GoogleBooksService.php create mode 100644 app/Services/Saloon/GoogleBooks/GoogleBooksConnector.php create mode 100644 app/Services/Saloon/GoogleBooks/Requests/SearchVolumes.php diff --git a/app/Livewire/Books/BookOpenLibrarySearch.php b/app/Livewire/Books/BookOpenLibrarySearch.php index fbad5ff..ebca81a 100644 --- a/app/Livewire/Books/BookOpenLibrarySearch.php +++ b/app/Livewire/Books/BookOpenLibrarySearch.php @@ -6,6 +6,7 @@ use App\Enums\ReadingStatus; use App\Models\Book; +use App\Services\GoogleBooksService; use App\Services\OpenLibraryService; use Illuminate\Support\Facades\Auth; use Livewire\Component; @@ -16,6 +17,7 @@ class BookOpenLibrarySearch extends Component // Search state public string $query = ''; + public string $searchSource = 'google_books'; public array $searchResults = []; public int $totalPages = 0; public int $currentPage = 1; @@ -57,8 +59,7 @@ public function search(): void return; } - $service = app(OpenLibraryService::class); - $result = $service->search($query, 1); + $result = $this->searchWithSource($query, 1); $this->searchResults = $result['results']; $this->totalPages = min($result['total_pages'], 50); @@ -68,13 +69,21 @@ public function search(): void public function loadPage(int $page): void { - $service = app(OpenLibraryService::class); - $result = $service->search(trim($this->query), $page); + $result = $this->searchWithSource(trim($this->query), $page); $this->searchResults = $result['results']; $this->currentPage = $page; } + protected function searchWithSource(string $query, int $page): array + { + if ($this->searchSource === 'google_books') { + return app(GoogleBooksService::class)->search($query, $page); + } + + return app(OpenLibraryService::class)->search($query, $page); + } + public function selectResult(int $index): void { $result = $this->searchResults[$index] ?? null; @@ -89,12 +98,12 @@ public function selectResult(int $index): void $this->cover_url = $result['cover_url_large'] ?? $result['cover_url'] ?? ''; $this->publisher = $result['publisher'] ?? null; $this->published_year = $result['first_publish_year'] ?? null; - $this->description = ''; + $this->description = $result['description'] ?? ''; $this->status = 'want_to_read'; $this->rating = null; - // Try to fetch description via ISBN if available - if ($this->isbn) { + // If no description from search results, try ISBN lookup (OpenLibrary) + if (empty($this->description) && $this->isbn) { $service = app(OpenLibraryService::class); $details = $service->fetchByIsbn($this->isbn); if ($details) { diff --git a/app/Services/GoogleBooksService.php b/app/Services/GoogleBooksService.php new file mode 100644 index 0000000..49d3cc9 --- /dev/null +++ b/app/Services/GoogleBooksService.php @@ -0,0 +1,92 @@ +connector = new GoogleBooksConnector(); + } + + public function search(string $query, int $page = 1): array + { + try { + $startIndex = ($page - 1) * 20; + $response = $this->connector->send(new SearchVolumes($query, $startIndex)); + + if (! $response->successful()) { + return ['results' => [], 'total' => 0, 'total_pages' => 0]; + } + + $data = $response->json(); + $totalItems = $data['totalItems'] ?? 0; + $items = $data['items'] ?? []; + + $results = array_map(function (array $item) { + $info = $item['volumeInfo'] ?? []; + $identifiers = $info['industryIdentifiers'] ?? []; + + $isbn13 = null; + $isbn10 = null; + foreach ($identifiers as $id) { + if ($id['type'] === 'ISBN_13') { + $isbn13 = $id['identifier']; + } elseif ($id['type'] === 'ISBN_10') { + $isbn10 = $id['identifier']; + } + } + + $coverUrl = $info['imageLinks']['thumbnail'] ?? null; + $coverUrlLarge = $info['imageLinks']['large'] + ?? $info['imageLinks']['medium'] + ?? $info['imageLinks']['small'] + ?? $info['imageLinks']['thumbnail'] + ?? null; + + // Google Books serves http URLs — upgrade to https + if ($coverUrl) { + $coverUrl = str_replace('http://', 'https://', $coverUrl); + } + if ($coverUrlLarge) { + $coverUrlLarge = str_replace('http://', 'https://', $coverUrlLarge); + } + + return [ + 'key' => $item['id'] ?? '', + 'title' => $info['title'] ?? 'Unknown Title', + 'subtitle' => $info['subtitle'] ?? null, + 'author' => $info['authors'][0] ?? null, + 'authors' => $info['authors'] ?? [], + 'first_publish_year' => isset($info['publishedDate']) + ? (int) substr($info['publishedDate'], 0, 4) + : null, + 'published_date' => $info['publishedDate'] ?? null, + 'cover_url' => $coverUrl, + 'cover_url_large' => $coverUrlLarge, + 'isbn' => $isbn13 ?? $isbn10, + 'page_count' => $info['pageCount'] ?? null, + 'publisher' => $info['publisher'] ?? null, + 'description' => $info['description'] ?? null, + 'edition_count' => 0, + 'source' => 'google_books', + ]; + }, $items); + + return [ + 'results' => $results, + 'total' => $totalItems, + 'total_pages' => (int) ceil($totalItems / 20), + ]; + } catch (\Exception) { + return ['results' => [], 'total' => 0, 'total_pages' => 0]; + } + } +} diff --git a/app/Services/Saloon/GoogleBooks/GoogleBooksConnector.php b/app/Services/Saloon/GoogleBooks/GoogleBooksConnector.php new file mode 100644 index 0000000..75057bf --- /dev/null +++ b/app/Services/Saloon/GoogleBooks/GoogleBooksConnector.php @@ -0,0 +1,45 @@ + 'application/json', + ]; + } + + public function resolveCacheDriver(): \Saloon\CachePlugin\Contracts\Driver + { + return new LaravelCacheDriver(Cache::store()); + } + + public function cacheExpiryInSeconds(): int + { + return 86400 * 7; + } +} diff --git a/app/Services/Saloon/GoogleBooks/Requests/SearchVolumes.php b/app/Services/Saloon/GoogleBooks/Requests/SearchVolumes.php new file mode 100644 index 0000000..8d0951b --- /dev/null +++ b/app/Services/Saloon/GoogleBooks/Requests/SearchVolumes.php @@ -0,0 +1,33 @@ + $this->searchQuery, + 'startIndex' => $this->startIndex, + 'maxResults' => $this->maxResults, + ]; + } +} diff --git a/resources/views/livewire/books/book-index.blade.php b/resources/views/livewire/books/book-index.blade.php index 2d67a77..caa4a53 100644 --- a/resources/views/livewire/books/book-index.blade.php +++ b/resources/views/livewire/books/book-index.blade.php @@ -32,11 +32,11 @@ - + - + diff --git a/resources/views/livewire/books/book-openlibrary-search.blade.php b/resources/views/livewire/books/book-openlibrary-search.blade.php index 941bbae..2454e75 100644 --- a/resources/views/livewire/books/book-openlibrary-search.blade.php +++ b/resources/views/livewire/books/book-openlibrary-search.blade.php @@ -20,10 +20,10 @@ Books
  • /
  • -
  • Search OpenLibrary
  • +
  • Search Books
  • -

    Search OpenLibrary

    +

    Search Books

    @@ -55,8 +55,18 @@ -

    Search OpenLibrary

    -

    Search for books to add to your library. Powered by OpenLibrary (open source, no API key needed).

    +

    Search Books

    +

    Search for books to add to your library.

    + +
    + +
    name('index'); Route::get('/create', BookForm::class)->name('create'); Route::get('/import', BookImport::class)->name('import'); - Route::get('/search-openlibrary', BookOpenLibrarySearch::class)->name('search-openlibrary'); + Route::get('/discover', BookOpenLibrarySearch::class)->name('discover'); Route::get('/queue', ReadQueue::class)->name('queue'); Route::get('/settings', BookSettings::class)->name('settings'); Route::get('/settings/metadata', MetadataEnrichment::class)->name('metadata'); From 0ef932961b7a1d0eea411c128d3492328d7ed0cc Mon Sep 17 00:00:00 2001 From: dotMavriQ Date: Sat, 21 Mar 2026 18:24:28 +0000 Subject: [PATCH 13/77] feat: scaffold Playing (Games) category with IGDB Discover MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - Add PlayingStatus and OwnershipStatus enums - Create Game model, migration, and policy - Build full CRUD: GameIndex (gallery/list views, search, filter by status/ownership/platform), GameForm (create/edit with multi-platform input), GameShow (detail view with 1-10 rating, completion bar) - Add PlayingIndex category hub - Integrate IGDB API via Saloon connector with Twitch OAuth - Build Discover Games wizard (search → results → configure & add) with platform filtering and owned-platform selection - Add igdb_id column (separate from rawg_id) - Add CSS custom properties for game status colors (both themes) - Update dashboard to link Playing category Co-Authored-By: Claude Opus 4.6 --- app/Enums/OwnershipStatus.php | 30 ++ app/Enums/PlayingStatus.php | 30 ++ app/Livewire/Dashboard.php | 6 +- app/Livewire/Games/GameForm.php | 211 ++++++++++ app/Livewire/Games/GameIgdbSearch.php | 224 ++++++++++ app/Livewire/Games/GameIndex.php | 185 ++++++++ app/Livewire/Games/GameShow.php | 46 ++ app/Livewire/Playing/PlayingIndex.php | 31 ++ app/Models/Game.php | 62 +++ app/Models/User.php | 5 + app/Policies/GamePolicy.php | 36 ++ app/Services/IgdbService.php | 117 ++++++ app/Services/Saloon/Igdb/IgdbConnector.php | 44 ++ .../Saloon/Igdb/Requests/GetGameDetails.php | 36 ++ .../Saloon/Igdb/Requests/SearchGames.php | 48 +++ config/services.php | 5 + .../2026_03_21_123331_create_games_table.php | 50 +++ ...3_21_200000_add_igdb_id_to_games_table.php | 29 ++ resources/css/app.css | 16 + .../views/livewire/games/game-form.blade.php | 293 +++++++++++++ .../livewire/games/game-igdb-search.blade.php | 336 +++++++++++++++ .../views/livewire/games/game-index.blade.php | 397 ++++++++++++++++++ .../views/livewire/games/game-show.blade.php | 277 ++++++++++++ .../livewire/playing/playing-index.blade.php | 54 +++ routes/web.php | 17 + tailwind.config.js | 6 + 26 files changed, 2588 insertions(+), 3 deletions(-) create mode 100644 app/Enums/OwnershipStatus.php create mode 100644 app/Enums/PlayingStatus.php create mode 100644 app/Livewire/Games/GameForm.php create mode 100644 app/Livewire/Games/GameIgdbSearch.php create mode 100644 app/Livewire/Games/GameIndex.php create mode 100644 app/Livewire/Games/GameShow.php create mode 100644 app/Livewire/Playing/PlayingIndex.php create mode 100644 app/Models/Game.php create mode 100644 app/Policies/GamePolicy.php create mode 100644 app/Services/IgdbService.php create mode 100644 app/Services/Saloon/Igdb/IgdbConnector.php create mode 100644 app/Services/Saloon/Igdb/Requests/GetGameDetails.php create mode 100644 app/Services/Saloon/Igdb/Requests/SearchGames.php create mode 100644 database/migrations/2026_03_21_123331_create_games_table.php create mode 100644 database/migrations/2026_03_21_200000_add_igdb_id_to_games_table.php create mode 100644 resources/views/livewire/games/game-form.blade.php create mode 100644 resources/views/livewire/games/game-igdb-search.blade.php create mode 100644 resources/views/livewire/games/game-index.blade.php create mode 100644 resources/views/livewire/games/game-show.blade.php create mode 100644 resources/views/livewire/playing/playing-index.blade.php diff --git a/app/Enums/OwnershipStatus.php b/app/Enums/OwnershipStatus.php new file mode 100644 index 0000000..82f5feb --- /dev/null +++ b/app/Enums/OwnershipStatus.php @@ -0,0 +1,30 @@ + 'Owned', + self::PreviouslyOwned => 'Previously Owned', + self::NotOwned => 'Not Owned', + }; + } + + public function color(): string + { + return match ($this) { + self::Owned => 'green', + self::PreviouslyOwned => 'yellow', + self::NotOwned => 'gray', + }; + } +} diff --git a/app/Enums/PlayingStatus.php b/app/Enums/PlayingStatus.php new file mode 100644 index 0000000..b00c277 --- /dev/null +++ b/app/Enums/PlayingStatus.php @@ -0,0 +1,30 @@ + 'Want to Play', + self::Playing => 'Playing', + self::Played => 'Played', + }; + } + + public function color(): string + { + return match ($this) { + self::WantToPlay => 'purple', + self::Playing => 'yellow', + self::Played => 'green', + }; + } +} diff --git a/app/Livewire/Dashboard.php b/app/Livewire/Dashboard.php index b96999a..60fd1d2 100644 --- a/app/Livewire/Dashboard.php +++ b/app/Livewire/Dashboard.php @@ -33,9 +33,9 @@ public function getCategories(): array [ 'name' => 'Playing', 'icon' => 'puzzle-piece', - 'description' => 'Video Games, Board Games', - 'route' => null, - 'active' => false, + 'description' => 'Video Games', + 'route' => 'playing.index', + 'active' => true, 'color' => 'green', ], [ diff --git a/app/Livewire/Games/GameForm.php b/app/Livewire/Games/GameForm.php new file mode 100644 index 0000000..6e797aa --- /dev/null +++ b/app/Livewire/Games/GameForm.php @@ -0,0 +1,211 @@ +exists) { + $this->authorize('update', $game); + $this->game = $game; + $this->fill([ + 'title' => $game->title, + 'platform' => $game->platform ?? [], + 'genre' => $game->genre ?? '', + 'description' => $game->description ?? '', + 'cover_url' => $game->cover_url ?? '', + 'release_date' => $game->release_date?->format('d/m/Y'), + 'developer' => $game->developer ?? '', + 'publisher' => $game->publisher ?? '', + 'status' => $game->status->value, + 'ownership' => $game->ownership->value, + 'rating' => $game->rating, + 'hours_played' => $game->hours_played ? (float) $game->hours_played : null, + 'completion_percentage' => $game->completion_percentage, + 'igdb_id' => $game->igdb_id, + 'rawg_id' => $game->rawg_id, + 'mobygames_id' => $game->mobygames_id, + 'date_started' => $game->date_started?->format('d/m/Y'), + 'date_finished' => $game->date_finished?->format('d/m/Y'), + 'notes' => $game->notes ?? '', + ]); + } + } + + public function rules(): array + { + return [ + 'title' => ['required', 'string', 'max:255'], + 'platform' => ['nullable', 'array'], + 'platform.*' => ['string', 'max:50'], + 'genre' => ['nullable', 'string', 'max:500'], + 'description' => ['nullable', 'string', 'max:10000'], + 'cover_url' => ['nullable', 'url', 'max:2048'], + 'release_date' => ['nullable', 'date_format:d/m/Y'], + 'developer' => ['nullable', 'string', 'max:255'], + 'publisher' => ['nullable', 'string', 'max:255'], + 'status' => ['required', Rule::enum(PlayingStatus::class)], + 'ownership' => ['required', Rule::enum(OwnershipStatus::class)], + 'rating' => ['nullable', 'integer', 'min:1', 'max:10'], + 'hours_played' => ['nullable', 'numeric', 'min:0', 'max:99999'], + 'completion_percentage' => ['nullable', 'integer', 'min:0', 'max:100'], + 'igdb_id' => ['nullable', 'integer'], + 'rawg_id' => ['nullable', 'integer'], + 'mobygames_id' => ['nullable', 'integer'], + 'date_started' => ['nullable', 'date_format:d/m/Y'], + 'date_finished' => ['nullable', 'date_format:d/m/Y'], + 'notes' => ['nullable', 'string', 'max:10000'], + ]; + } + + protected function parseDateInput(?string $date): ?string + { + if (empty($date)) { + return null; + } + + if (preg_match('/^\d{4}-\d{2}-\d{2}$/', $date)) { + return $date; + } + + if (preg_match('/^(\d{2})\/(\d{2})\/(\d{4})$/', $date, $matches)) { + $day = $matches[1]; + $month = $matches[2]; + $year = $matches[3]; + + if (checkdate((int) $month, (int) $day, (int) $year)) { + return "{$year}-{$month}-{$day}"; + } + } + + return null; + } + + public function addPlatform(): void + { + $platform = trim($this->platformInput); + if ($platform !== '' && ! in_array($platform, $this->platform)) { + $this->platform[] = $platform; + } + $this->platformInput = ''; + } + + public function removePlatform(int $index): void + { + unset($this->platform[$index]); + $this->platform = array_values($this->platform); + } + + public function save(): void + { + $validated = $this->validate(); + + $validated['release_date'] = $this->parseDateInput($validated['release_date'] ?? null); + $validated['date_started'] = $this->parseDateInput($validated['date_started'] ?? null); + $validated['date_finished'] = $this->parseDateInput($validated['date_finished'] ?? null); + + $data = [ + 'title' => $validated['title'], + 'platform' => ! empty($validated['platform']) ? $validated['platform'] : null, + 'genre' => $validated['genre'] ?: null, + 'description' => $validated['description'] ?: null, + 'cover_url' => $validated['cover_url'] ?: null, + 'release_date' => $validated['release_date'], + 'developer' => $validated['developer'] ?: null, + 'publisher' => $validated['publisher'] ?: null, + 'status' => $validated['status'], + 'ownership' => $validated['ownership'], + 'rating' => $validated['rating'], + 'hours_played' => $validated['hours_played'], + 'completion_percentage' => $validated['completion_percentage'], + 'igdb_id' => $validated['igdb_id'], + 'rawg_id' => $validated['rawg_id'], + 'mobygames_id' => $validated['mobygames_id'], + 'date_started' => $validated['date_started'], + 'date_finished' => $validated['date_finished'], + 'notes' => $validated['notes'] ?: null, + ]; + + if ($this->game) { + $this->game->update($data); + $message = 'Game updated successfully.'; + } else { + $data['user_id'] = Auth::id(); + $this->game = Game::create($data); + $message = 'Game created successfully.'; + } + + session()->flash('message', $message); + + $this->redirect(route('games.show', $this->game)); + } + + public function isEditing(): bool + { + return $this->game !== null && $this->game->exists; + } + + public function render() + { + return view('livewire.games.game-form', [ + 'statuses' => PlayingStatus::cases(), + 'ownershipStatuses' => OwnershipStatus::cases(), + 'isEditing' => $this->isEditing(), + ])->layout('layouts.app'); + } +} diff --git a/app/Livewire/Games/GameIgdbSearch.php b/app/Livewire/Games/GameIgdbSearch.php new file mode 100644 index 0000000..7b5f0bb --- /dev/null +++ b/app/Livewire/Games/GameIgdbSearch.php @@ -0,0 +1,224 @@ + 'All Platforms', + '6' => 'PC', + '14' => 'Mac', + '3' => 'Linux', + '167' => 'PS5', + '48' => 'PS4', + '9' => 'PS3', + '8' => 'PS2', + '7' => 'PS1', + '169' => 'Xbox Series X|S', + '49' => 'Xbox One', + '12' => 'Xbox 360', + '11' => 'Xbox', + '130' => 'Nintendo Switch', + '41' => 'Wii U', + '5' => 'Wii', + '21' => 'GameCube', + '4' => 'N64', + '19' => 'SNES', + '18' => 'NES', + '37' => '3DS', + '20' => 'Nintendo DS', + '24' => 'GBA', + '33' => 'Game Boy', + '29' => 'Sega Genesis', + '32' => 'Sega Saturn', + '23' => 'Dreamcast', + '38' => 'PSP', + '46' => 'PS Vita', + '34' => 'Android', + '39' => 'iOS', + '170' => 'Google Stadia', + ]; + + // Selected game configuration + public string $title = ''; + public ?string $summary = null; + public string $cover_url = ''; + public ?string $developer = null; + public ?string $publisher = null; + public array $availablePlatforms = []; + public array $selectedPlatforms = []; + public string $customPlatformInput = ''; + public ?string $genre = null; + public ?string $release_date = null; + public string $status = 'want_to_play'; + public string $ownership = 'not_owned'; + public ?int $rating = null; + public ?int $igdb_id = null; + + // Duplicate detection + public array $existingIgdbIds = []; + + public function mount(): void + { + $this->existingIgdbIds = Game::where('user_id', Auth::id()) + ->whereNotNull('igdb_id') + ->pluck('igdb_id') + ->all(); + } + + public function search(): void + { + $query = trim($this->query); + if ($query === '') { + return; + } + + $platformId = $this->platformFilter !== '' ? (int) $this->platformFilter : null; + $result = app(IgdbService::class)->search($query, 1, 20, $platformId); + + $this->searchResults = $result['results']; + $this->hasMorePages = count($result['results']) >= 20; + $this->currentPage = 1; + $this->step = 'results'; + } + + public function loadPage(int $page): void + { + $platformId = $this->platformFilter !== '' ? (int) $this->platformFilter : null; + $result = app(IgdbService::class)->search(trim($this->query), $page, 20, $platformId); + + $this->searchResults = $result['results']; + $this->hasMorePages = count($result['results']) >= 20; + $this->currentPage = $page; + } + + public function selectResult(int $index): void + { + $result = $this->searchResults[$index] ?? null; + if (! $result) { + return; + } + + $this->igdb_id = $result['igdb_id']; + $this->title = $result['title']; + $this->summary = $result['summary']; + $this->cover_url = $result['cover_url'] ?? ''; + $this->developer = $result['developer']; + $this->publisher = $result['publisher']; + $this->availablePlatforms = $result['platforms'] ?? []; + $this->genre = ! empty($result['genres']) ? implode(', ', $result['genres']) : null; + $this->release_date = $result['release_date']; + $this->status = 'want_to_play'; + $this->ownership = 'not_owned'; + $this->rating = null; + $this->customPlatformInput = ''; + + // Pre-select the filtered platform if one was used + $this->selectedPlatforms = []; + if ($this->platformFilter !== '') { + $filterLabel = self::PLATFORM_OPTIONS[$this->platformFilter] ?? null; + if ($filterLabel) { + foreach ($this->availablePlatforms as $plat) { + if ($plat === $filterLabel || str_contains($plat, $filterLabel)) { + $this->selectedPlatforms = [$plat]; + break; + } + } + } + } + + $this->step = 'configure'; + } + + public function togglePlatform(string $platform): void + { + if (in_array($platform, $this->selectedPlatforms)) { + $this->selectedPlatforms = array_values(array_diff($this->selectedPlatforms, [$platform])); + } else { + $this->selectedPlatforms[] = $platform; + } + } + + public function addCustomPlatform(): void + { + $platform = trim($this->customPlatformInput); + if ($platform !== '' && ! in_array($platform, $this->selectedPlatforms)) { + $this->selectedPlatforms[] = $platform; + } + $this->customPlatformInput = ''; + } + + public function removeSelectedPlatform(int $index): void + { + unset($this->selectedPlatforms[$index]); + $this->selectedPlatforms = array_values($this->selectedPlatforms); + } + + public function addGame(): void + { + $game = Game::create([ + 'user_id' => Auth::id(), + 'title' => $this->title, + 'description' => $this->summary ?: null, + 'cover_url' => $this->cover_url ?: null, + 'developer' => $this->developer ?: null, + 'publisher' => $this->publisher ?: null, + 'platform' => ! empty($this->selectedPlatforms) ? $this->selectedPlatforms : null, + 'genre' => $this->genre ?: null, + 'release_date' => $this->release_date, + 'status' => $this->status, + 'ownership' => $this->ownership, + 'rating' => $this->rating, + 'igdb_id' => $this->igdb_id, + ]); + + session()->flash('message', "Added \"{$this->title}\" to your library."); + $this->redirect(route('games.show', $game)); + } + + public function backToSearch(): void + { + $this->step = 'search'; + $this->searchResults = []; + $this->query = ''; + } + + public function backToResults(): void + { + $this->step = 'results'; + } + + public function isResultDuplicate(array $result): bool + { + $igdbId = $result['igdb_id'] ?? null; + + return $igdbId && in_array($igdbId, $this->existingIgdbIds); + } + + public function render() + { + return view('livewire.games.game-igdb-search', [ + 'statuses' => PlayingStatus::cases(), + 'ownershipStatuses' => OwnershipStatus::cases(), + 'platformOptions' => self::PLATFORM_OPTIONS, + ])->layout('layouts.app'); + } +} diff --git a/app/Livewire/Games/GameIndex.php b/app/Livewire/Games/GameIndex.php new file mode 100644 index 0000000..4f36d5e --- /dev/null +++ b/app/Livewire/Games/GameIndex.php @@ -0,0 +1,185 @@ + ['except' => ''], + 'status' => ['except' => ''], + 'ownership' => ['except' => ''], + 'platform' => ['except' => ''], + 'sortBy' => ['except' => 'updated_at'], + 'sortDirection' => ['except' => 'desc'], + 'viewMode' => ['except' => 'gallery'], + ]; + + public function updatingSearch(): void + { + $this->resetPage(); + } + + public function updatingStatus(string $value): void + { + if ($value === 'want_to_play' && in_array($this->sortBy, ['date_finished', 'date_started'])) { + $this->sortBy = 'updated_at'; + } elseif ($value === 'playing' && $this->sortBy === 'date_finished') { + $this->sortBy = 'date_started'; + } + + $this->resetPage(); + } + + public function updatingOwnership(): void + { + $this->resetPage(); + } + + public function updatingPlatform(): void + { + $this->resetPage(); + } + + public function setViewMode(string $mode): void + { + $this->viewMode = in_array($mode, ['gallery', 'list']) ? $mode : 'gallery'; + } + + public function sort(string $column): void + { + if ($this->sortBy === $column) { + $this->sortDirection = $this->sortDirection === 'asc' ? 'desc' : 'asc'; + } else { + $this->sortBy = $column; + $this->sortDirection = 'asc'; + } + } + + private function safeSortDirection(): string + { + return $this->sortDirection === 'asc' ? 'asc' : 'desc'; + } + + private function safeSortBy(): string + { + return in_array($this->sortBy, self::ALLOWED_SORT_COLUMNS, true) ? $this->sortBy : 'updated_at'; + } + + public function deleteGame(Game $game): void + { + $this->authorize('delete', $game); + + $game->delete(); + + session()->flash('message', 'Game deleted successfully.'); + } + + public function updatedSelectAll(bool $value): void + { + if ($value) { + $query = $this->buildQuery(); + $this->selected = $query->pluck('id')->map(fn ($id) => (string) $id)->toArray(); + } else { + $this->selected = []; + } + } + + public function deleteSelected(): void + { + $count = Game::query() + ->where('user_id', Auth::id()) + ->whereIn('id', $this->selected) + ->delete(); + + $this->selected = []; + $this->selectAll = false; + + session()->flash('message', "{$count} game(s) deleted successfully."); + } + + protected function buildQuery() + { + $query = Game::query() + ->where('user_id', Auth::id()) + ->when($this->status, function ($query) { + $query->where('status', $this->status); + }) + ->when($this->ownership, function ($query) { + $query->where('ownership', $this->ownership); + }) + ->when($this->platform, function ($query) { + $query->whereJsonContains('platform', $this->platform); + }); + + if ($this->search) { + $this->applyAccentInsensitiveSearch($query, $this->search, ['title', 'developer', 'publisher']); + } + + return $query; + } + + public function paginationView(): string + { + return 'livewire.custom-pagination'; + } + + public function render() + { + $perPage = $this->viewMode === 'list' ? 25 : 18; + $sortBy = $this->safeSortBy(); + $sortDir = $this->safeSortDirection(); + + $query = $this->buildQuery(); + $query->orderBy($sortBy, $sortDir)->orderBy('id'); + + $games = $query->paginate($perPage); + + $allPlatforms = Game::where('user_id', Auth::id()) + ->whereNotNull('platform') + ->pluck('platform') + ->flatten() + ->unique() + ->sort() + ->values(); + + return view('livewire.games.game-index', [ + 'games' => $games, + 'statuses' => PlayingStatus::cases(), + 'ownershipStatuses' => OwnershipStatus::cases(), + 'allPlatforms' => $allPlatforms, + ])->layout('layouts.app'); + } +} diff --git a/app/Livewire/Games/GameShow.php b/app/Livewire/Games/GameShow.php new file mode 100644 index 0000000..5a83338 --- /dev/null +++ b/app/Livewire/Games/GameShow.php @@ -0,0 +1,46 @@ +authorize('view', $game); + $this->game = $game; + } + + public function updateRating(int $rating): void + { + $this->authorize('update', $this->game); + + $newRating = $this->game->rating === $rating ? null : $rating; + $this->game->update(['rating' => $newRating]); + } + + public function deleteGame(): void + { + $this->authorize('delete', $this->game); + + $this->game->delete(); + + session()->flash('message', 'Game deleted successfully.'); + $this->redirect(route('games.index')); + } + + public function render() + { + return view('livewire.games.game-show') + ->layout('layouts.app'); + } +} diff --git a/app/Livewire/Playing/PlayingIndex.php b/app/Livewire/Playing/PlayingIndex.php new file mode 100644 index 0000000..75bdda8 --- /dev/null +++ b/app/Livewire/Playing/PlayingIndex.php @@ -0,0 +1,31 @@ + 'Games', + 'icon' => 'puzzle-piece', + 'description' => 'Video games across all platforms', + 'route' => 'games.index', + 'active' => true, + 'color' => 'green', + ], + ]; + } + + public function render() + { + return view('livewire.playing.playing-index', [ + 'subcategories' => $this->getSubcategories(), + ])->layout('layouts.app'); + } +} diff --git a/app/Models/Game.php b/app/Models/Game.php new file mode 100644 index 0000000..805bcf4 --- /dev/null +++ b/app/Models/Game.php @@ -0,0 +1,62 @@ + PlayingStatus::class, + 'ownership' => OwnershipStatus::class, + 'platform' => 'array', + 'rating' => 'integer', + 'hours_played' => 'decimal:1', + 'completion_percentage' => 'integer', + 'release_date' => 'date', + 'date_started' => 'date', + 'date_finished' => 'date', + 'rawg_id' => 'integer', + 'igdb_id' => 'integer', + 'mobygames_id' => 'integer', + ]; + } + + public function user(): BelongsTo + { + return $this->belongsTo(User::class); + } +} diff --git a/app/Models/User.php b/app/Models/User.php index 39cf7e2..ee0178e 100644 --- a/app/Models/User.php +++ b/app/Models/User.php @@ -77,4 +77,9 @@ public function episodes(): HasMany { return $this->hasMany(Episode::class); } + + public function games(): HasMany + { + return $this->hasMany(Game::class); + } } diff --git a/app/Policies/GamePolicy.php b/app/Policies/GamePolicy.php new file mode 100644 index 0000000..596a3b2 --- /dev/null +++ b/app/Policies/GamePolicy.php @@ -0,0 +1,36 @@ +id === $game->user_id; + } + + public function create(User $user): bool + { + return true; + } + + public function update(User $user, Game $game): bool + { + return $user->id === $game->user_id; + } + + public function delete(User $user, Game $game): bool + { + return $user->id === $game->user_id; + } +} diff --git a/app/Services/IgdbService.php b/app/Services/IgdbService.php new file mode 100644 index 0000000..e52a12b --- /dev/null +++ b/app/Services/IgdbService.php @@ -0,0 +1,117 @@ +connector = new IgdbConnector(); + } + + public function search(string $query, int $page = 1, int $perPage = 20, ?int $platformId = null): array + { + try { + $offset = ($page - 1) * $perPage; + $response = $this->connector->send(new SearchGames($query, $perPage, $offset, $platformId)); + + if (! $response->successful()) { + return ['results' => [], 'total' => 0, 'total_pages' => 0]; + } + + $games = $response->json() ?? []; + + $results = array_map(fn (array $game) => $this->normalizeGame($game), $games); + + return [ + 'results' => $results, + 'total' => count($results), + 'total_pages' => count($results) < $perPage ? $page : $page + 1, + ]; + } catch (\Exception) { + return ['results' => [], 'total' => 0, 'total_pages' => 0]; + } + } + + public function getDetails(int $igdbId): ?array + { + try { + $response = $this->connector->send(new GetGameDetails($igdbId)); + + if (! $response->successful()) { + return null; + } + + $games = $response->json() ?? []; + + return ! empty($games) ? $this->normalizeGame($games[0]) : null; + } catch (\Exception) { + return null; + } + } + + protected function normalizeGame(array $game): array + { + $coverUrl = null; + if (isset($game['cover']['url'])) { + // IGDB returns //images.igdb.com/... — upgrade to https and get bigger image + $coverUrl = str_replace('t_thumb', 't_cover_big', $game['cover']['url']); + if (str_starts_with($coverUrl, '//')) { + $coverUrl = 'https:' . $coverUrl; + } + } + + $developer = null; + $publisher = null; + foreach ($game['involved_companies'] ?? [] as $company) { + $name = $company['company']['name'] ?? null; + if ($name && ! empty($company['developer'])) { + $developer = $name; + } + if ($name && ! empty($company['publisher'])) { + $publisher = $name; + } + } + + $platforms = []; + foreach ($game['platforms'] ?? [] as $platform) { + if (isset($platform['name'])) { + $platforms[] = $platform['name']; + } + } + + $genres = []; + foreach ($game['genres'] ?? [] as $genre) { + if (isset($genre['name'])) { + $genres[] = $genre['name']; + } + } + + $releaseDate = null; + if (isset($game['first_release_date'])) { + $releaseDate = date('Y-m-d', $game['first_release_date']); + } + + return [ + 'igdb_id' => $game['id'], + 'title' => $game['name'] ?? 'Unknown', + 'summary' => $game['summary'] ?? null, + 'cover_url' => $coverUrl, + 'developer' => $developer, + 'publisher' => $publisher, + 'platforms' => $platforms, + 'genres' => $genres, + 'release_date' => $releaseDate, + 'rating' => isset($game['total_rating']) ? round($game['total_rating'] / 10, 1) : null, + 'source' => 'igdb', + ]; + } +} diff --git a/app/Services/Saloon/Igdb/IgdbConnector.php b/app/Services/Saloon/Igdb/IgdbConnector.php new file mode 100644 index 0000000..3b7940d --- /dev/null +++ b/app/Services/Saloon/Igdb/IgdbConnector.php @@ -0,0 +1,44 @@ + config('services.igdb.client_id'), + 'Authorization' => 'Bearer ' . $this->getAccessToken(), + ]; + } + + protected function getAccessToken(): string + { + return Cache::remember('igdb_access_token', 3600, function () { + $response = Http::post('https://id.twitch.tv/oauth2/token', [ + 'client_id' => config('services.igdb.client_id'), + 'client_secret' => config('services.igdb.client_secret'), + 'grant_type' => 'client_credentials', + ]); + + return $response->json('access_token'); + }); + } +} diff --git a/app/Services/Saloon/Igdb/Requests/GetGameDetails.php b/app/Services/Saloon/Igdb/Requests/GetGameDetails.php new file mode 100644 index 0000000..5d18754 --- /dev/null +++ b/app/Services/Saloon/Igdb/Requests/GetGameDetails.php @@ -0,0 +1,36 @@ +gameId . '; ' + . 'fields name,summary,cover.url,platforms.name,first_release_date,' + . 'involved_companies.company.name,involved_companies.developer,' + . 'involved_companies.publisher,genres.name,rating,total_rating,' + . 'screenshots.url,websites.url,websites.category; ' + . 'limit 1;'; + } +} diff --git a/app/Services/Saloon/Igdb/Requests/SearchGames.php b/app/Services/Saloon/Igdb/Requests/SearchGames.php new file mode 100644 index 0000000..1a17b6f --- /dev/null +++ b/app/Services/Saloon/Igdb/Requests/SearchGames.php @@ -0,0 +1,48 @@ +searchQuery); + + $body = 'search "' . $escapedQuery . '"; ' + . 'fields name,summary,cover.url,platforms.name,first_release_date,' + . 'involved_companies.company.name,involved_companies.developer,' + . 'involved_companies.publisher,genres.name,rating,total_rating; '; + + if ($this->platformId !== null) { + $body .= 'where platforms = (' . $this->platformId . '); '; + } + + $body .= 'limit ' . $this->limit . '; ' + . 'offset ' . $this->offset . ';'; + + return $body; + } +} diff --git a/config/services.php b/config/services.php index 17df9a0..b700810 100644 --- a/config/services.php +++ b/config/services.php @@ -48,4 +48,9 @@ 'client_id' => env('TRAKT_CLIENT_ID'), ], + 'igdb' => [ + 'client_id' => env('IGDB_CLIENT_ID'), + 'client_secret' => env('IGDB_CLIENT_SECRET'), + ], + ]; diff --git a/database/migrations/2026_03_21_123331_create_games_table.php b/database/migrations/2026_03_21_123331_create_games_table.php new file mode 100644 index 0000000..3999e23 --- /dev/null +++ b/database/migrations/2026_03_21_123331_create_games_table.php @@ -0,0 +1,50 @@ +id(); + $table->foreignId('user_id')->constrained()->cascadeOnDelete(); + $table->string('title'); + $table->jsonb('platform')->nullable(); + $table->string('genre')->nullable(); + $table->text('description')->nullable(); + $table->string('cover_url')->nullable(); + $table->date('release_date')->nullable(); + $table->string('developer')->nullable(); + $table->string('publisher')->nullable(); + $table->string('status')->default('want_to_play'); + $table->string('ownership')->default('not_owned'); + $table->unsignedSmallInteger('rating')->nullable(); + $table->decimal('hours_played', 8, 1)->nullable(); + $table->unsignedSmallInteger('completion_percentage')->nullable(); + $table->unsignedBigInteger('rawg_id')->nullable(); + $table->unsignedBigInteger('mobygames_id')->nullable(); + $table->date('date_started')->nullable(); + $table->date('date_finished')->nullable(); + $table->text('notes')->nullable(); + $table->timestamps(); + + $table->index(['user_id', 'status']); + $table->index('rawg_id'); + $table->index('mobygames_id'); + }); + } + + /** + * Reverse the migrations. + */ + public function down(): void + { + Schema::dropIfExists('games'); + } +}; diff --git a/database/migrations/2026_03_21_200000_add_igdb_id_to_games_table.php b/database/migrations/2026_03_21_200000_add_igdb_id_to_games_table.php new file mode 100644 index 0000000..1b6aa64 --- /dev/null +++ b/database/migrations/2026_03_21_200000_add_igdb_id_to_games_table.php @@ -0,0 +1,29 @@ +unsignedBigInteger('igdb_id')->nullable()->after('rawg_id'); + $table->index('igdb_id'); + }); + + // Move any IGDB IDs mistakenly stored in rawg_id to igdb_id + DB::table('games') + ->whereNotNull('rawg_id') + ->update(['igdb_id' => DB::raw('rawg_id'), 'rawg_id' => null]); + } + + public function down(): void + { + Schema::table('games', function (Blueprint $table) { + $table->dropIndex(['igdb_id']); + $table->dropColumn('igdb_id'); + }); + } +}; diff --git a/resources/css/app.css b/resources/css/app.css index e2544cd..5014f61 100644 --- a/resources/css/app.css +++ b/resources/css/app.css @@ -85,6 +85,14 @@ --color-status-watched: 34 197 94; /* green-500 */ --color-status-watched-bg: 240 253 244; /* green-50 */ + /* Playing statuses */ + --color-status-want-to-play: 147 51 234; /* purple-600 */ + --color-status-want-to-play-bg: 250 245 255; /* purple-50 */ + --color-status-playing: 245 158 11; /* amber-500 */ + --color-status-playing-bg: 255 251 235; /* amber-50 */ + --color-status-played: 34 197 94; /* green-500 */ + --color-status-played-bg: 240 253 244; /* green-50 */ + /* Stars */ --color-star-filled: 250 204 21; /* yellow-400 */ --color-star-empty: 209 213 219; /* gray-300 */ @@ -180,6 +188,14 @@ --color-status-watched: 184 187 38; /* green #b8bb26 */ --color-status-watched-bg: 60 56 54; + /* Playing statuses */ + --color-status-want-to-play: 211 134 155; /* purple #d3869b */ + --color-status-want-to-play-bg: 60 56 54; + --color-status-playing: 250 189 47; /* yellow #fabd2f */ + --color-status-playing-bg: 60 56 54; + --color-status-played: 184 187 38; /* green #b8bb26 */ + --color-status-played-bg: 60 56 54; + /* Stars */ --color-star-filled: 250 189 47; /* yellow #fabd2f */ --color-star-empty: 102 92 84; /* bg3 */ diff --git a/resources/views/livewire/games/game-form.blade.php b/resources/views/livewire/games/game-form.blade.php new file mode 100644 index 0000000..51d0bcb --- /dev/null +++ b/resources/views/livewire/games/game-form.blade.php @@ -0,0 +1,293 @@ +
    +
    +
    + +

    + {{ $isEditing ? 'Edit Game' : 'Add Game' }} +

    +
    +
    + +
    +
    + + {{-- Basic Info --}} +
    +
    +
    + {{-- Title --}} +
    + +
    + +
    + @error('title')

    {{ $message }}

    @enderror +
    + + {{-- Status --}} +
    + +
    + +
    + @error('status')

    {{ $message }}

    @enderror +
    + + {{-- Ownership --}} +
    + +
    + +
    + @error('ownership')

    {{ $message }}

    @enderror +
    + + {{-- Platform --}} +
    + +
    + + +
    + @if(!empty($platform)) +
    + @foreach($platform as $index => $platform) + + {{ $platform }} + + + @endforeach +
    + @endif + @error('platforms')

    {{ $message }}

    @enderror +
    + + {{-- Genre --}} +
    + +
    + +
    + @error('genre')

    {{ $message }}

    @enderror +
    + + {{-- Developer --}} +
    + +
    + +
    + @error('developer')

    {{ $message }}

    @enderror +
    + + {{-- Publisher --}} +
    + +
    + +
    + @error('publisher')

    {{ $message }}

    @enderror +
    + + {{-- Release Date --}} +
    + +
    + +
    + @error('release_date')

    {{ $message }}

    @enderror +
    + + {{-- Cover URL --}} +
    + +
    + +
    + @error('cover_url')

    {{ $message }}

    @enderror +
    + + {{-- Description --}} +
    + +
    + +
    + @error('description')

    {{ $message }}

    @enderror +
    +
    +
    +
    + + {{-- Your Progress --}} +
    +
    +

    Your Progress

    +

    Track your time and completion with this game.

    + +
    + {{-- Date Started --}} +
    + +
    + +
    + @error('date_started')

    {{ $message }}

    @enderror +
    + + {{-- Date Finished --}} +
    + +
    + +
    + @error('date_finished')

    {{ $message }}

    @enderror +
    + + {{-- Hours Played --}} +
    + +
    + +
    + @error('hours_played')

    {{ $message }}

    @enderror +
    + + {{-- Completion Percentage --}} +
    + +
    + + % +
    + @error('completion_percentage')

    {{ $message }}

    @enderror +
    + + {{-- Rating (1-10 numbered buttons) --}} +
    + +
    + @for($i = 1; $i <= 10; $i++) + + @endfor + + {{ $rating ? $rating . ' / 10' : 'Not rated' }} + +
    +
    + + {{-- Notes --}} +
    + +
    + +
    + @error('notes')

    {{ $message }}

    @enderror +
    +
    +
    +
    + + {{-- External IDs --}} +
    +
    +

    External IDs

    +

    Link this game to external databases.

    + +
    + {{-- IGDB ID --}} +
    + +
    + +
    + @error('igdb_id')

    {{ $message }}

    @enderror +
    + + {{-- RAWG ID --}} +
    + +
    + +
    + @error('rawg_id')

    {{ $message }}

    @enderror +
    + + {{-- MobyGames ID --}} +
    + +
    + +
    + @error('mobygames_id')

    {{ $message }}

    @enderror +
    +
    +
    +
    + + {{-- Actions --}} +
    + + Cancel + + +
    + +
    +
    +
    diff --git a/resources/views/livewire/games/game-igdb-search.blade.php b/resources/views/livewire/games/game-igdb-search.blade.php new file mode 100644 index 0000000..a05da0c --- /dev/null +++ b/resources/views/livewire/games/game-igdb-search.blade.php @@ -0,0 +1,336 @@ +
    + {{-- Header --}} +
    +
    + +

    Discover Games

    +
    +
    + +
    +
    + {{-- Flash Messages --}} + @if (session()->has('message')) +
    + + + +

    {{ session('message') }}

    +
    + @endif + + {{-- ===== STEP: SEARCH ===== --}} + @if($step === 'search') +
    +
    +
    + + + +

    Discover Games

    +

    Search IGDB to find games and add them to your library.

    +
    +
    +
    + + +
    +
    + +
    +
    +
    +
    + + {{-- ===== STEP: RESULTS ===== --}} + @elseif($step === 'results') +
    + +
    + + +
    +
    + + @if(empty($searchResults)) +
    +

    No results found for "{{ $query }}".

    +
    + @else +
    + @foreach($searchResults as $index => $result) + + @endforeach +
    + + {{-- Pagination --}} +
    + @if($currentPage > 1) + + @endif + Page {{ $currentPage }} + @if($hasMorePages) + + @endif +
    + @endif + + {{-- Loading overlay --}} +
    +
    + + + + + Loading game details... +
    +
    + + {{-- ===== STEP: CONFIGURE ===== --}} + @elseif($step === 'configure') +
    + +
    + +
    +
    +
    + {{-- Top: cover thumbnail + key info --}} +
    +
    + @if($cover_url) + + @else +
    + + + +
    + @endif +
    +
    + + +
    +
    + + +
    +
    + + +
    +
    +
    +
    + + +
    +
    + + +
    +
    +
    +
    + + {{-- Platforms you own it on --}} +
    + + + {{-- IGDB platforms as checkboxes --}} + @if(!empty($availablePlatforms)) +
    + @foreach($availablePlatforms as $platform) + + @endforeach +
    + @endif + + {{-- Custom platform input --}} +
    + + +
    + + {{-- Show selected platforms that aren't in the IGDB list (custom ones) --}} + @php $customSelected = array_filter($selectedPlatforms, fn($p) => !in_array($p, $availablePlatforms)); @endphp + @if(!empty($customSelected)) +
    + @foreach($selectedPlatforms as $index => $platform) + @if(!in_array($platform, $availablePlatforms)) + + {{ $platform }} + + + @endif + @endforeach +
    + @endif +
    + + {{-- Description --}} +
    + + +
    + + {{-- Status + Ownership + Rating --}} +
    +
    + + +
    +
    + + +
    +
    + +
    + @for($i = 1; $i <= 10; $i++) + + @endfor + {{ $rating ? $rating . '/10' : 'Not rated' }} +
    +
    +
    + + {{-- Actions --}} +
    + + +
    +
    +
    +
    + @endif +
    +
    +
    diff --git a/resources/views/livewire/games/game-index.blade.php b/resources/views/livewire/games/game-index.blade.php new file mode 100644 index 0000000..57e18c9 --- /dev/null +++ b/resources/views/livewire/games/game-index.blade.php @@ -0,0 +1,397 @@ +
    + {{-- Header --}} +
    +
    +
    +
    + +

    Games

    +
    + +
    +
    +
    + +
    +
    + {{-- Flash Message --}} + @if (session()->has('message')) +
    + + + +

    {{ session('message') }}

    +
    + @endif + + {{-- Toolbar --}} +
    +
    + {{-- Left: Search & Filters --}} +
    + {{-- Search --}} +
    + + + + +
    + + {{-- Status Filter --}} + + + {{-- Ownership Filter --}} + + + {{-- Platform Filter --}} + + + {{-- Sort --}} + + + {{-- Sort Direction --}} + +
    + + {{-- Right: View Toggle & Actions --}} +
    + {{-- Bulk Actions --}} + @if(count($selected) > 0) + {{ count($selected) }} selected + + @endif + +
    + + {{-- View Toggle --}} +
    + + +
    +
    +
    + + {{-- Select All --}} + @if($games->isNotEmpty()) +
    + + +
    + @endif +
    + + {{-- Content --}} + @if($games->isEmpty()) +
    + + + +

    No games yet

    +

    Get started by adding a game or discovering new ones.

    + +
    + @else +
    + @if($viewMode === 'gallery') + {{-- Gallery View --}} + + @else + {{-- List View --}} +
    +
    + + + + + + + + + + + + + + + @foreach($games as $game) + + + + + + + + + + + @endforeach + +
    + +
    + + + +
    + @if($game->cover_url) + + @else +
    + + + +
    + @endif +
    +
    +
    + + {{ Str::limit($game->title, 50) }} + +
    +
    +
    + @endif +
    + + {{-- Pagination --}} +
    + {{ $games->links() }} +
    + @endif +
    +
    +
    diff --git a/resources/views/livewire/games/game-show.blade.php b/resources/views/livewire/games/game-show.blade.php new file mode 100644 index 0000000..a9cade5 --- /dev/null +++ b/resources/views/livewire/games/game-show.blade.php @@ -0,0 +1,277 @@ +
    +
    +
    + +
    +
    + +
    +
    + {{-- Flash Messages --}} + @if (session()->has('message')) +
    + + + +

    {{ session('message') }}

    +
    + @endif + @if (session()->has('error')) +
    + + + +

    {{ session('error') }}

    +
    + @endif + +
    + {{-- Cover --}} +
    +
    + @if($game->cover_url) + Cover of {{ $game->title }} + @else + + @endif +
    + + {{-- Platform Badges --}} + @if(count($game->platform ?? []) > 0) +
    + @foreach($game->platform as $platform) + + {{ $platform }} + + @endforeach +
    + @endif + + {{-- Genre --}} + @if($game->genre) +
    + + {{ $game->genre }} + +
    + @endif +
    + + {{-- Game Details --}} +
    +

    {{ $game->title }}

    + + {{-- Status & Actions --}} +
    + {{-- Status Badge --}} + + {{ $game->status->label() }} + + + {{-- Ownership Badge --}} + @if($game->ownership) + + {{ $game->ownership->label() }} + + @endif + + {{-- Rating (1-10 numbered buttons) --}} +
    + @for($i = 1; $i <= 10; $i++) + + @endfor +
    + +
    + + {{-- Edit & Delete --}} + + Edit + + +
    + + {{-- Completion Progress Bar --}} + @if($game->completion_percentage !== null) +
    +
    + Completion + {{ $game->completion_percentage }}% +
    +
    +
    +
    +
    + @endif + + {{-- Game Metadata --}} +
    + @if($game->developer) +
    +
    Developer
    +
    {{ $game->developer }}
    +
    + @endif + + @if($game->publisher) +
    +
    Publisher
    +
    {{ $game->publisher }}
    +
    + @endif + + @if($game->release_date) +
    +
    Release Date
    +
    {{ $game->release_date->format('F j, Y') }}
    +
    + @endif + + @if($game->rating) +
    +
    Rating
    +
    {{ $game->rating }}/10
    +
    + @endif + + @if($game->hours_played) +
    +
    Hours Played
    +
    {{ $game->hours_played }} hours
    +
    + @endif + + @if($game->date_started) +
    +
    Date Started
    +
    {{ $game->date_started->format('F j, Y') }}
    +
    + @endif + + @if($game->date_finished) +
    +
    Date Finished
    +
    {{ $game->date_finished->format('F j, Y') }}
    +
    + @endif + + @if($game->igdb_id) +
    +
    IGDB ID
    +
    {{ $game->igdb_id }}
    +
    + @endif + + @if($game->rawg_id) +
    +
    RAWG ID
    +
    {{ $game->rawg_id }}
    +
    + @endif + + @if($game->mobygames_id) +
    +
    MobyGames ID
    +
    {{ $game->mobygames_id }}
    +
    + @endif + +
    +
    Added to Library
    +
    {{ $game->created_at->format('F j, Y') }}
    +
    +
    + + {{-- Description --}} + @if($game->description) +
    +

    Description

    +
    + {!! nl2br(e($game->description)) !!} +
    +
    + @endif + + {{-- Notes --}} + @if($game->notes) +
    +

    My Notes

    +
    + {!! nl2br(e($game->notes)) !!} +
    +
    + @endif + +
    +
    +
    +
    +
    diff --git a/resources/views/livewire/playing/playing-index.blade.php b/resources/views/livewire/playing/playing-index.blade.php new file mode 100644 index 0000000..76f7624 --- /dev/null +++ b/resources/views/livewire/playing/playing-index.blade.php @@ -0,0 +1,54 @@ +
    +
    +
    + +

    + Playing +

    +
    +
    + +
    +
    +

    Choose a category

    +
    + @foreach($subcategories as $category) + @if($category['active']) + +
    + +
    +

    {{ $category['name'] }}

    +

    {{ $category['description'] }}

    +
    + @endif + @endforeach +
    +
    +
    +
    diff --git a/routes/web.php b/routes/web.php index dae91ae..e01e06d 100644 --- a/routes/web.php +++ b/routes/web.php @@ -22,6 +22,11 @@ use App\Livewire\Anime\AnimeMetadataEnrichment; use App\Livewire\Anime\AnimeSettings; use App\Livewire\Anime\AnimeShow; +use App\Livewire\Games\GameForm; +use App\Livewire\Games\GameIgdbSearch; +use App\Livewire\Games\GameIndex; +use App\Livewire\Games\GameShow; +use App\Livewire\Playing\PlayingIndex; use App\Livewire\Reading\ReadingIndex; use App\Livewire\Watching\WatchingIndex; use Illuminate\Support\Facades\Route; @@ -73,6 +78,18 @@ Route::get('/{book}/edit', BookForm::class)->name('edit'); }); + // Playing category + Route::get('playing', PlayingIndex::class)->name('playing.index'); + + // Games + Route::prefix('games')->name('games.')->group(function () { + Route::get('/', GameIndex::class)->name('index'); + Route::get('/create', GameForm::class)->name('create'); + Route::get('/discover', GameIgdbSearch::class)->name('discover'); + Route::get('/{game}', GameShow::class)->name('show'); + Route::get('/{game}/edit', GameForm::class)->name('edit'); + }); + // Comics Route::prefix('comics')->name('comics.')->group(function () { Route::get('/', \App\Livewire\Comics\ComicIndex::class)->name('index'); diff --git a/tailwind.config.js b/tailwind.config.js index da5064b..183b50a 100644 --- a/tailwind.config.js +++ b/tailwind.config.js @@ -74,6 +74,12 @@ export default { 'watching-bg': 'rgb(var(--color-status-watching-bg) / )', watched: 'rgb(var(--color-status-watched) / )', 'watched-bg': 'rgb(var(--color-status-watched-bg) / )', + 'want-to-play': 'rgb(var(--color-status-want-to-play) / )', + 'want-to-play-bg': 'rgb(var(--color-status-want-to-play-bg) / )', + playing: 'rgb(var(--color-status-playing) / )', + 'playing-bg': 'rgb(var(--color-status-playing-bg) / )', + played: 'rgb(var(--color-status-played) / )', + 'played-bg': 'rgb(var(--color-status-played-bg) / )', }, star: { filled: 'rgb(var(--color-star-filled) / )', From 6fa1486fbd13edb1ad7a25b14c607c223e359cfc Mon Sep 17 00:00:00 2001 From: dotMavriQ Date: Sun, 22 Mar 2026 18:22:23 +0000 Subject: [PATCH 14/77] feat: add Games category enhancements and Board Games scaffolding - Add PlayingStatus enum (backlog/playing/shelved/completed/mastered) - Add OwnershipStatus: borrowed, on_emulator options - Convert game genre to JSON array for proper filtering - Add platform logos (NES, N64, PS2, GBC, GB) with CSS mask-image - Add platformMeta() and shortPlatformName() helpers - Make external IDs (IGDB, RAWG, MobyGames) clickable links - Add genre filter with whereJsonContains on game index - Fix NULLS LAST sorting for nullable columns - Scaffold Board Games category with BGG XML API2 integration - Add BoardGame model, migration, policy, Livewire components - Add BggService with Saloon connector for search/details - Add Board Games to Playing hub, navigation, and routes Co-Authored-By: Claude Opus 4.6 --- app/Enums/OwnershipStatus.php | 6 + app/Enums/PlayingStatus.php | 18 +- .../BoardGames/BoardGameBggSearch.php | 105 +++++ app/Livewire/BoardGames/BoardGameForm.php | 201 +++++++++ app/Livewire/BoardGames/BoardGameIndex.php | 185 +++++++++ app/Livewire/BoardGames/BoardGameShow.php | 46 +++ app/Livewire/Dashboard.php | 19 + app/Livewire/Games/GameForm.php | 28 +- app/Livewire/Games/GameIgdbSearch.php | 8 +- app/Livewire/Games/GameIndex.php | 31 +- app/Livewire/Games/GameShow.php | 85 ++++ app/Livewire/Playing/PlayingIndex.php | 8 + app/Models/BoardGame.php | 61 +++ app/Models/Game.php | 1 + app/Policies/BoardGamePolicy.php | 36 ++ app/Services/BggService.php | 107 +++++ app/Services/Saloon/Bgg/BggConnector.php | 34 ++ .../Bgg/Requests/GetBoardGameDetails.php | 30 ++ .../Saloon/Bgg/Requests/SearchBoardGames.php | 30 ++ config/services.php | 4 + ...3_21_201051_convert_game_genre_to_json.php | 42 ++ ...22_125044_update_game_playing_statuses.php | 21 + ..._03_22_140000_create_board_games_table.php | 43 ++ public/images/platforms/gameboy.svg | 1 + public/images/platforms/gameboy_color.svg | 1 + public/images/platforms/gog.svg | 1 + public/images/platforms/n64.svg | 3 + public/images/platforms/nes.svg | 1 + public/images/platforms/nintendo_switch.svg | 1 + public/images/platforms/playstation4.svg | 1 + public/images/platforms/playstation5.svg | 1 + public/images/platforms/ps2.svg | 1 + public/images/platforms/steam.svg | 1 + public/images/platforms/windows.svg | 1 + public/images/platforms/xbox_one.svg | 1 + public/images/platforms/xbox_series.svg | 1 + resources/css/app.css | 76 +++- .../board-game-bgg-search.blade.php | 293 +++++++++++++ .../board-games/board-game-form.blade.php | 297 +++++++++++++ .../board-games/board-game-index.blade.php | 390 ++++++++++++++++++ .../board-games/board-game-show.blade.php | 266 ++++++++++++ resources/views/livewire/dashboard.blade.php | 11 + .../views/livewire/games/game-form.blade.php | 31 +- .../livewire/games/game-igdb-search.blade.php | 14 +- .../views/livewire/games/game-index.blade.php | 25 +- .../views/livewire/games/game-show.blade.php | 78 +++- .../livewire/layout/navigation.blade.php | 45 ++ .../livewire/playing/playing-index.blade.php | 17 +- routes/web.php | 13 + tailwind.config.js | 35 +- 50 files changed, 2688 insertions(+), 67 deletions(-) create mode 100644 app/Livewire/BoardGames/BoardGameBggSearch.php create mode 100644 app/Livewire/BoardGames/BoardGameForm.php create mode 100644 app/Livewire/BoardGames/BoardGameIndex.php create mode 100644 app/Livewire/BoardGames/BoardGameShow.php create mode 100644 app/Models/BoardGame.php create mode 100644 app/Policies/BoardGamePolicy.php create mode 100644 app/Services/BggService.php create mode 100644 app/Services/Saloon/Bgg/BggConnector.php create mode 100644 app/Services/Saloon/Bgg/Requests/GetBoardGameDetails.php create mode 100644 app/Services/Saloon/Bgg/Requests/SearchBoardGames.php create mode 100644 database/migrations/2026_03_21_201051_convert_game_genre_to_json.php create mode 100644 database/migrations/2026_03_22_125044_update_game_playing_statuses.php create mode 100644 database/migrations/2026_03_22_140000_create_board_games_table.php create mode 100644 public/images/platforms/gameboy.svg create mode 100644 public/images/platforms/gameboy_color.svg create mode 100644 public/images/platforms/gog.svg create mode 100644 public/images/platforms/n64.svg create mode 100644 public/images/platforms/nes.svg create mode 100644 public/images/platforms/nintendo_switch.svg create mode 100644 public/images/platforms/playstation4.svg create mode 100644 public/images/platforms/playstation5.svg create mode 100644 public/images/platforms/ps2.svg create mode 100644 public/images/platforms/steam.svg create mode 100644 public/images/platforms/windows.svg create mode 100644 public/images/platforms/xbox_one.svg create mode 100644 public/images/platforms/xbox_series.svg create mode 100644 resources/views/livewire/board-games/board-game-bgg-search.blade.php create mode 100644 resources/views/livewire/board-games/board-game-form.blade.php create mode 100644 resources/views/livewire/board-games/board-game-index.blade.php create mode 100644 resources/views/livewire/board-games/board-game-show.blade.php diff --git a/app/Enums/OwnershipStatus.php b/app/Enums/OwnershipStatus.php index 82f5feb..d2c7dcc 100644 --- a/app/Enums/OwnershipStatus.php +++ b/app/Enums/OwnershipStatus.php @@ -8,6 +8,8 @@ enum OwnershipStatus: string { case Owned = 'owned'; case PreviouslyOwned = 'previously_owned'; + case Borrowed = 'borrowed'; + case OnEmulator = 'on_emulator'; case NotOwned = 'not_owned'; public function label(): string @@ -15,6 +17,8 @@ public function label(): string return match ($this) { self::Owned => 'Owned', self::PreviouslyOwned => 'Previously Owned', + self::Borrowed => 'Borrowed', + self::OnEmulator => 'On Emulator', self::NotOwned => 'Not Owned', }; } @@ -24,6 +28,8 @@ public function color(): string return match ($this) { self::Owned => 'green', self::PreviouslyOwned => 'yellow', + self::Borrowed => 'blue', + self::OnEmulator => 'purple', self::NotOwned => 'gray', }; } diff --git a/app/Enums/PlayingStatus.php b/app/Enums/PlayingStatus.php index b00c277..f2b3ae9 100644 --- a/app/Enums/PlayingStatus.php +++ b/app/Enums/PlayingStatus.php @@ -6,25 +6,31 @@ enum PlayingStatus: string { - case WantToPlay = 'want_to_play'; + case Backlog = 'backlog'; case Playing = 'playing'; - case Played = 'played'; + case Shelved = 'shelved'; + case Completed = 'completed'; + case Mastered = 'mastered'; public function label(): string { return match ($this) { - self::WantToPlay => 'Want to Play', + self::Backlog => 'Backlog', self::Playing => 'Playing', - self::Played => 'Played', + self::Shelved => 'Shelved', + self::Completed => 'Completed', + self::Mastered => 'Mastered', }; } public function color(): string { return match ($this) { - self::WantToPlay => 'purple', + self::Backlog => 'gray', self::Playing => 'yellow', - self::Played => 'green', + self::Shelved => 'orange', + self::Completed => 'green', + self::Mastered => 'purple', }; } } diff --git a/app/Livewire/BoardGames/BoardGameBggSearch.php b/app/Livewire/BoardGames/BoardGameBggSearch.php new file mode 100644 index 0000000..43c48da --- /dev/null +++ b/app/Livewire/BoardGames/BoardGameBggSearch.php @@ -0,0 +1,105 @@ +searchQuery) === '') { + return; + } + + $bgg = app(BggService::class); + $this->results = $bgg->search($this->searchQuery); + $this->step = 'results'; + } + + public function selectGame(int $bggId): void + { + $bgg = app(BggService::class); + $details = $bgg->getDetails($bggId); + + if (! $details) { + session()->flash('error', 'Could not fetch board game details.'); + return; + } + + $this->selectedGame = $details; + $this->step = 'configure'; + } + + public function save(): void + { + if (! $this->selectedGame) { + return; + } + + $boardGame = BoardGame::create([ + 'user_id' => Auth::id(), + 'title' => $this->selectedGame['title'], + 'genre' => $this->selectedGame['genres'] ?? [], + 'description' => $this->selectedGame['description'] ?? null, + 'cover_url' => $this->selectedGame['cover_url'] ?? null, + 'year_published' => $this->selectedGame['year_published'] ?? null, + 'designer' => $this->selectedGame['designer'] ?? null, + 'publisher' => $this->selectedGame['publisher'] ?? null, + 'min_players' => $this->selectedGame['min_players'] ?? null, + 'max_players' => $this->selectedGame['max_players'] ?? null, + 'playing_time' => $this->selectedGame['playing_time'] ?? null, + 'status' => $this->status, + 'ownership' => $this->ownership, + 'rating' => $this->rating, + 'bgg_id' => $this->selectedGame['bgg_id'], + 'notes' => $this->notes ?: null, + ]); + + session()->flash('message', "{$boardGame->title} added to your collection!"); + $this->redirect(route('board-games.show', $boardGame)); + } + + public function backToResults(): void + { + $this->selectedGame = null; + $this->step = 'results'; + } + + public function backToSearch(): void + { + $this->results = []; + $this->step = 'search'; + } + + public function render() + { + return view('livewire.board-games.board-game-bgg-search', [ + 'statuses' => PlayingStatus::cases(), + 'ownershipStatuses' => OwnershipStatus::cases(), + ])->layout('layouts.app'); + } +} diff --git a/app/Livewire/BoardGames/BoardGameForm.php b/app/Livewire/BoardGames/BoardGameForm.php new file mode 100644 index 0000000..74db856 --- /dev/null +++ b/app/Livewire/BoardGames/BoardGameForm.php @@ -0,0 +1,201 @@ +exists) { + $this->authorize('update', $boardGame); + $this->boardGame = $boardGame; + $this->fill([ + 'title' => $boardGame->title, + 'genre' => $boardGame->genre ?? [], + 'description' => $boardGame->description ?? '', + 'cover_url' => $boardGame->cover_url ?? '', + 'year_published' => $boardGame->year_published, + 'designer' => $boardGame->designer ?? '', + 'publisher' => $boardGame->publisher ?? '', + 'min_players' => $boardGame->min_players, + 'max_players' => $boardGame->max_players, + 'playing_time' => $boardGame->playing_time, + 'status' => $boardGame->status->value, + 'ownership' => $boardGame->ownership->value, + 'rating' => $boardGame->rating, + 'plays' => $boardGame->plays, + 'bgg_id' => $boardGame->bgg_id, + 'date_started' => $boardGame->date_started?->format('d/m/Y'), + 'date_finished' => $boardGame->date_finished?->format('d/m/Y'), + 'notes' => $boardGame->notes ?? '', + ]); + } + } + + public function rules(): array + { + return [ + 'title' => ['required', 'string', 'max:255'], + 'genre' => ['nullable', 'array'], + 'genre.*' => ['string', 'max:100'], + 'description' => ['nullable', 'string', 'max:10000'], + 'cover_url' => ['nullable', 'url', 'max:2048'], + 'year_published' => ['nullable', 'integer', 'min:1900', 'max:2100'], + 'designer' => ['nullable', 'string', 'max:255'], + 'publisher' => ['nullable', 'string', 'max:255'], + 'min_players' => ['nullable', 'integer', 'min:1', 'max:100'], + 'max_players' => ['nullable', 'integer', 'min:1', 'max:100'], + 'playing_time' => ['nullable', 'integer', 'min:0', 'max:9999'], + 'status' => ['required', Rule::enum(PlayingStatus::class)], + 'ownership' => ['required', Rule::enum(OwnershipStatus::class)], + 'rating' => ['nullable', 'integer', 'min:1', 'max:10'], + 'plays' => ['nullable', 'integer', 'min:0'], + 'bgg_id' => ['nullable', 'integer'], + 'date_started' => ['nullable', 'date_format:d/m/Y'], + 'date_finished' => ['nullable', 'date_format:d/m/Y'], + 'notes' => ['nullable', 'string', 'max:10000'], + ]; + } + + protected function parseDateInput(?string $date): ?string + { + if (empty($date)) { + return null; + } + + if (preg_match('/^\d{4}-\d{2}-\d{2}$/', $date)) { + return $date; + } + + if (preg_match('/^(\d{2})\/(\d{2})\/(\d{4})$/', $date, $matches)) { + return checkdate((int) $matches[2], (int) $matches[1], (int) $matches[3]) + ? "{$matches[3]}-{$matches[2]}-{$matches[1]}" + : null; + } + + return null; + } + + public function addGenre(): void + { + $genre = trim($this->genreInput); + if ($genre !== '' && ! in_array($genre, $this->genre)) { + $this->genre[] = $genre; + } + $this->genreInput = ''; + } + + public function removeGenre(int $index): void + { + unset($this->genre[$index]); + $this->genre = array_values($this->genre); + } + + public function save(): void + { + $validated = $this->validate(); + + $validated['date_started'] = $this->parseDateInput($validated['date_started'] ?? null); + $validated['date_finished'] = $this->parseDateInput($validated['date_finished'] ?? null); + + $data = [ + 'title' => $validated['title'], + 'genre' => ! empty($validated['genre']) ? $validated['genre'] : null, + 'description' => $validated['description'] ?: null, + 'cover_url' => $validated['cover_url'] ?: null, + 'year_published' => $validated['year_published'], + 'designer' => $validated['designer'] ?: null, + 'publisher' => $validated['publisher'] ?: null, + 'min_players' => $validated['min_players'], + 'max_players' => $validated['max_players'], + 'playing_time' => $validated['playing_time'], + 'status' => $validated['status'], + 'ownership' => $validated['ownership'], + 'rating' => $validated['rating'], + 'plays' => $validated['plays'], + 'bgg_id' => $validated['bgg_id'], + 'date_started' => $validated['date_started'], + 'date_finished' => $validated['date_finished'], + 'notes' => $validated['notes'] ?: null, + ]; + + if ($this->boardGame) { + $this->boardGame->update($data); + $message = 'Board game updated successfully.'; + } else { + $data['user_id'] = Auth::id(); + $this->boardGame = BoardGame::create($data); + $message = 'Board game created successfully.'; + } + + session()->flash('message', $message); + + $this->redirect(route('board-games.show', $this->boardGame)); + } + + public function isEditing(): bool + { + return $this->boardGame !== null && $this->boardGame->exists; + } + + public function render() + { + return view('livewire.board-games.board-game-form', [ + 'statuses' => PlayingStatus::cases(), + 'ownershipStatuses' => OwnershipStatus::cases(), + 'isEditing' => $this->isEditing(), + ])->layout('layouts.app'); + } +} diff --git a/app/Livewire/BoardGames/BoardGameIndex.php b/app/Livewire/BoardGames/BoardGameIndex.php new file mode 100644 index 0000000..dfc97d5 --- /dev/null +++ b/app/Livewire/BoardGames/BoardGameIndex.php @@ -0,0 +1,185 @@ + ['except' => ''], + 'status' => ['except' => ''], + 'ownership' => ['except' => ''], + 'genre' => ['except' => ''], + 'sortBy' => ['except' => 'updated_at'], + 'sortDirection' => ['except' => 'desc'], + 'viewMode' => ['except' => 'gallery'], + ]; + + public function updatingSearch(): void + { + $this->resetPage(); + } + + public function updatingStatus(): void + { + $this->resetPage(); + } + + public function updatingOwnership(): void + { + $this->resetPage(); + } + + public function updatingGenre(): void + { + $this->resetPage(); + } + + public function setViewMode(string $mode): void + { + $this->viewMode = in_array($mode, ['gallery', 'list']) ? $mode : 'gallery'; + } + + public function sort(string $column): void + { + if ($this->sortBy === $column) { + $this->sortDirection = $this->sortDirection === 'asc' ? 'desc' : 'asc'; + } else { + $this->sortBy = $column; + $this->sortDirection = 'asc'; + } + } + + private function safeSortDirection(): string + { + return $this->sortDirection === 'asc' ? 'asc' : 'desc'; + } + + private function safeSortBy(): string + { + return in_array($this->sortBy, self::ALLOWED_SORT_COLUMNS, true) ? $this->sortBy : 'updated_at'; + } + + public function deleteBoardGame(BoardGame $boardGame): void + { + $this->authorize('delete', $boardGame); + + $boardGame->delete(); + + session()->flash('message', 'Board game deleted successfully.'); + } + + public function updatedSelectAll(bool $value): void + { + if ($value) { + $query = $this->buildQuery(); + $this->selected = $query->pluck('id')->map(fn ($id) => (string) $id)->toArray(); + } else { + $this->selected = []; + } + } + + public function deleteSelected(): void + { + BoardGame::whereIn('id', $this->selected) + ->where('user_id', Auth::id()) + ->delete(); + + $count = count($this->selected); + $this->selected = []; + $this->selectAll = false; + + session()->flash('message', "{$count} board game(s) deleted."); + } + + private function buildQuery() + { + $query = BoardGame::where('user_id', Auth::id()); + + if ($this->search !== '') { + $query = $this->applyAccentInsensitiveSearch($query, $this->search, ['title', 'designer', 'publisher']); + } + + if ($this->status !== '') { + $query->where('status', $this->status); + } + + if ($this->ownership !== '') { + $query->where('ownership', $this->ownership); + } + + if ($this->genre !== '') { + $query->whereJsonContains('genre', $this->genre); + } + + return $query; + } + + public function render() + { + $perPage = $this->viewMode === 'list' ? 25 : 18; + $sortBy = $this->safeSortBy(); + $sortDir = $this->safeSortDirection(); + + $query = $this->buildQuery(); + + if (in_array($sortBy, ['rating', 'plays', 'date_started', 'date_finished', 'year_published'])) { + $query->orderByRaw("\"$sortBy\" $sortDir NULLS LAST"); + } else { + $query->orderBy($sortBy, $sortDir); + } + $query->orderBy('id'); + + $boardGames = $query->paginate($perPage); + + $allGenres = BoardGame::where('user_id', Auth::id()) + ->whereNotNull('genre') + ->pluck('genre') + ->flatten() + ->unique() + ->sort() + ->values(); + + return view('livewire.board-games.board-game-index', [ + 'boardGames' => $boardGames, + 'statuses' => PlayingStatus::cases(), + 'ownershipStatuses' => OwnershipStatus::cases(), + 'allGenres' => $allGenres, + ])->layout('layouts.app'); + } +} diff --git a/app/Livewire/BoardGames/BoardGameShow.php b/app/Livewire/BoardGames/BoardGameShow.php new file mode 100644 index 0000000..e92c6a3 --- /dev/null +++ b/app/Livewire/BoardGames/BoardGameShow.php @@ -0,0 +1,46 @@ +authorize('view', $boardGame); + $this->boardGame = $boardGame; + } + + public function updateRating(int $rating): void + { + $this->authorize('update', $this->boardGame); + + $newRating = $this->boardGame->rating === $rating ? null : $rating; + $this->boardGame->update(['rating' => $newRating]); + } + + public function deleteBoardGame(): void + { + $this->authorize('delete', $this->boardGame); + + $this->boardGame->delete(); + + session()->flash('message', 'Board game deleted successfully.'); + $this->redirect(route('board-games.index')); + } + + public function render() + { + return view('livewire.board-games.board-game-show') + ->layout('layouts.app'); + } +} diff --git a/app/Livewire/Dashboard.php b/app/Livewire/Dashboard.php index 60fd1d2..fab5082 100644 --- a/app/Livewire/Dashboard.php +++ b/app/Livewire/Dashboard.php @@ -4,6 +4,7 @@ namespace App\Livewire; +use App\Enums\PlayingStatus; use App\Enums\ReadingStatus; use App\Enums\WatchingStatus; use Illuminate\Support\Facades\Auth; @@ -116,6 +117,23 @@ public function getAnimeStats(): array ]; } + public function getPlayingStats(): array + { + $user = Auth::user(); + + $stats = $user->games() + ->selectRaw("COUNT(*) as total") + ->selectRaw("SUM(CASE WHEN status = ? THEN 1 ELSE 0 END) as currently_playing", [PlayingStatus::Playing->value]) + ->selectRaw("SUM(CASE WHEN status = ? THEN 1 ELSE 0 END) as backlog", [PlayingStatus::Backlog->value]) + ->first(); + + return [ + 'total_games' => (int) $stats->total, + 'currently_playing' => (int) $stats->currently_playing, + 'backlog' => (int) $stats->backlog, + ]; + } + public function render() { return view('livewire.dashboard', [ @@ -123,6 +141,7 @@ public function render() 'readingStats' => $this->getReadingStats(), 'watchingStats' => $this->getWatchingStats(), 'animeStats' => $this->getAnimeStats(), + 'playingStats' => $this->getPlayingStats(), ])->layout('layouts.app'); } } diff --git a/app/Livewire/Games/GameForm.php b/app/Livewire/Games/GameForm.php index 6e797aa..1e0267e 100644 --- a/app/Livewire/Games/GameForm.php +++ b/app/Livewire/Games/GameForm.php @@ -22,7 +22,9 @@ class GameForm extends Component public array $platform = []; - public string $genre = ''; + public array $genre = []; + + public string $genreInput = ''; public string $description = ''; @@ -34,7 +36,7 @@ class GameForm extends Component public string $publisher = ''; - public string $status = 'want_to_play'; + public string $status = 'backlog'; public string $ownership = 'not_owned'; @@ -66,7 +68,7 @@ public function mount(?Game $game = null): void $this->fill([ 'title' => $game->title, 'platform' => $game->platform ?? [], - 'genre' => $game->genre ?? '', + 'genre' => $game->genre ?? [], 'description' => $game->description ?? '', 'cover_url' => $game->cover_url ?? '', 'release_date' => $game->release_date?->format('d/m/Y'), @@ -93,7 +95,8 @@ public function rules(): array 'title' => ['required', 'string', 'max:255'], 'platform' => ['nullable', 'array'], 'platform.*' => ['string', 'max:50'], - 'genre' => ['nullable', 'string', 'max:500'], + 'genre' => ['nullable', 'array'], + 'genre.*' => ['string', 'max:100'], 'description' => ['nullable', 'string', 'max:10000'], 'cover_url' => ['nullable', 'url', 'max:2048'], 'release_date' => ['nullable', 'date_format:d/m/Y'], @@ -136,6 +139,21 @@ protected function parseDateInput(?string $date): ?string return null; } + public function addGenre(): void + { + $genre = trim($this->genreInput); + if ($genre !== '' && ! in_array($genre, $this->genre)) { + $this->genre[] = $genre; + } + $this->genreInput = ''; + } + + public function removeGenre(int $index): void + { + unset($this->genre[$index]); + $this->genre = array_values($this->genre); + } + public function addPlatform(): void { $platform = trim($this->platformInput); @@ -162,7 +180,7 @@ public function save(): void $data = [ 'title' => $validated['title'], 'platform' => ! empty($validated['platform']) ? $validated['platform'] : null, - 'genre' => $validated['genre'] ?: null, + 'genre' => ! empty($validated['genre']) ? $validated['genre'] : null, 'description' => $validated['description'] ?: null, 'cover_url' => $validated['cover_url'] ?: null, 'release_date' => $validated['release_date'], diff --git a/app/Livewire/Games/GameIgdbSearch.php b/app/Livewire/Games/GameIgdbSearch.php index 7b5f0bb..1a04231 100644 --- a/app/Livewire/Games/GameIgdbSearch.php +++ b/app/Livewire/Games/GameIgdbSearch.php @@ -66,7 +66,7 @@ class GameIgdbSearch extends Component public array $availablePlatforms = []; public array $selectedPlatforms = []; public string $customPlatformInput = ''; - public ?string $genre = null; + public array $genre = []; public ?string $release_date = null; public string $status = 'want_to_play'; public string $ownership = 'not_owned'; @@ -124,9 +124,9 @@ public function selectResult(int $index): void $this->developer = $result['developer']; $this->publisher = $result['publisher']; $this->availablePlatforms = $result['platforms'] ?? []; - $this->genre = ! empty($result['genres']) ? implode(', ', $result['genres']) : null; + $this->genre = $result['genres'] ?? []; $this->release_date = $result['release_date']; - $this->status = 'want_to_play'; + $this->status = 'backlog'; $this->ownership = 'not_owned'; $this->rating = null; $this->customPlatformInput = ''; @@ -182,7 +182,7 @@ public function addGame(): void 'developer' => $this->developer ?: null, 'publisher' => $this->publisher ?: null, 'platform' => ! empty($this->selectedPlatforms) ? $this->selectedPlatforms : null, - 'genre' => $this->genre ?: null, + 'genre' => ! empty($this->genre) ? $this->genre : null, 'release_date' => $this->release_date, 'status' => $this->status, 'ownership' => $this->ownership, diff --git a/app/Livewire/Games/GameIndex.php b/app/Livewire/Games/GameIndex.php index 4f36d5e..2002407 100644 --- a/app/Livewire/Games/GameIndex.php +++ b/app/Livewire/Games/GameIndex.php @@ -25,6 +25,8 @@ class GameIndex extends Component public string $platform = ''; + public string $genre = ''; + public string $sortBy = 'updated_at'; public string $sortDirection = 'desc'; @@ -42,6 +44,7 @@ class GameIndex extends Component 'status' => ['except' => ''], 'ownership' => ['except' => ''], 'platform' => ['except' => ''], + 'genre' => ['except' => ''], 'sortBy' => ['except' => 'updated_at'], 'sortDirection' => ['except' => 'desc'], 'viewMode' => ['except' => 'gallery'], @@ -54,9 +57,9 @@ public function updatingSearch(): void public function updatingStatus(string $value): void { - if ($value === 'want_to_play' && in_array($this->sortBy, ['date_finished', 'date_started'])) { + if ($value === 'backlog' && in_array($this->sortBy, ['date_finished', 'date_started'])) { $this->sortBy = 'updated_at'; - } elseif ($value === 'playing' && $this->sortBy === 'date_finished') { + } elseif (in_array($value, ['playing', 'shelved']) && $this->sortBy === 'date_finished') { $this->sortBy = 'date_started'; } @@ -73,6 +76,11 @@ public function updatingPlatform(): void $this->resetPage(); } + public function updatingGenre(): void + { + $this->resetPage(); + } + public function setViewMode(string $mode): void { $this->viewMode = in_array($mode, ['gallery', 'list']) ? $mode : 'gallery'; @@ -142,6 +150,9 @@ protected function buildQuery() }) ->when($this->platform, function ($query) { $query->whereJsonContains('platform', $this->platform); + }) + ->when($this->genre, function ($query) { + $query->whereJsonContains('genre', $this->genre); }); if ($this->search) { @@ -163,7 +174,12 @@ public function render() $sortDir = $this->safeSortDirection(); $query = $this->buildQuery(); - $query->orderBy($sortBy, $sortDir)->orderBy('id'); + if (in_array($sortBy, ['rating', 'hours_played', 'completion_percentage', 'date_started', 'date_finished', 'release_date'])) { + $query->orderByRaw("\"$sortBy\" $sortDir NULLS LAST"); + } else { + $query->orderBy($sortBy, $sortDir); + } + $query->orderBy('id'); $games = $query->paginate($perPage); @@ -175,11 +191,20 @@ public function render() ->sort() ->values(); + $allGenres = Game::where('user_id', Auth::id()) + ->whereNotNull('genre') + ->pluck('genre') + ->flatten() + ->unique() + ->sort() + ->values(); + return view('livewire.games.game-index', [ 'games' => $games, 'statuses' => PlayingStatus::cases(), 'ownershipStatuses' => OwnershipStatus::cases(), 'allPlatforms' => $allPlatforms, + 'allGenres' => $allGenres, ])->layout('layouts.app'); } } diff --git a/app/Livewire/Games/GameShow.php b/app/Livewire/Games/GameShow.php index 5a83338..9a4928c 100644 --- a/app/Livewire/Games/GameShow.php +++ b/app/Livewire/Games/GameShow.php @@ -38,6 +38,91 @@ public function deleteGame(): void $this->redirect(route('games.index')); } + public static function platformMeta(string $platform): array + { + $lower = strtolower($platform); + + if (str_contains($lower, 'game boy color') || str_contains($lower, 'gbc')) { + return ['key' => 'nintendo', 'logo' => 'gameboy_color.svg']; + } + + if (str_contains($lower, 'game boy advance') || str_contains($lower, 'gba')) { + return ['key' => 'nintendo', 'logo' => 'gameboy.svg']; + } + + if (str_contains($lower, 'game boy') || str_contains($lower, 'gameboy')) { + return ['key' => 'nintendo', 'logo' => 'gameboy.svg']; + } + + if (str_contains($lower, 'switch')) { + return ['key' => 'nintendo', 'logo' => 'nintendo_switch.svg']; + } + + if (str_contains($lower, 'nintendo entertainment system') || $lower === 'nes') { + return ['key' => 'nintendo', 'logo' => 'nes.svg']; + } + + if (str_contains($lower, 'nintendo 64') || $lower === 'n64') { + return ['key' => 'nintendo', 'logo' => 'n64.svg']; + } + + if (str_contains($lower, 'super nintendo') || str_contains($lower, 'snes')) { + return ['key' => 'nintendo', 'logo' => 'nintendo_switch.svg']; + } + + if (str_contains($lower, 'nintendo') || str_contains($lower, 'wii') || str_contains($lower, 'gamecube') || str_contains($lower, '3ds')) { + return ['key' => 'nintendo', 'logo' => 'nintendo_switch.svg']; + } + + if (str_contains($lower, 'steam')) { + return ['key' => 'steam', 'logo' => 'steam.svg']; + } + + if (str_contains($lower, 'gog')) { + return ['key' => 'gog', 'logo' => 'gog.svg']; + } + + if (str_contains($lower, 'playstation 2') || str_contains($lower, 'ps2')) { + return ['key' => 'playstation', 'logo' => 'ps2.svg']; + } + + if (str_contains($lower, 'playstation') || str_contains($lower, 'ps vita') || str_contains($lower, 'psp')) { + $logo = 'playstation4.svg'; + if (str_contains($lower, '5')) { + $logo = 'playstation5.svg'; + } + + return ['key' => 'playstation', 'logo' => $logo]; + } + + if (str_contains($lower, 'xbox')) { + $logo = str_contains($lower, 'series') ? 'xbox_series.svg' : 'xbox_one.svg'; + + return ['key' => 'xbox', 'logo' => $logo]; + } + + if (str_contains($lower, 'pc') || str_contains($lower, 'windows') || str_contains($lower, 'linux') || str_contains($lower, 'mac')) { + return ['key' => 'pc', 'logo' => 'windows.svg']; + } + + return ['key' => 'default', 'logo' => null]; + } + + public static function shortPlatformName(string $platform): string + { + return match ($platform) { + 'Nintendo Entertainment System' => 'NES', + 'Super Nintendo Entertainment System' => 'SNES', + 'Nintendo 64' => 'N64', + 'PlayStation 2' => 'PS2', + 'Game Boy Advance' => 'GBA', + 'Game Boy Color' => 'GBC', + 'Game Boy' => 'GB', + 'PC (Steam)' => 'Steam', + default => $platform, + }; + } + public function render() { return view('livewire.games.game-show') diff --git a/app/Livewire/Playing/PlayingIndex.php b/app/Livewire/Playing/PlayingIndex.php index 75bdda8..4b76ead 100644 --- a/app/Livewire/Playing/PlayingIndex.php +++ b/app/Livewire/Playing/PlayingIndex.php @@ -19,6 +19,14 @@ public function getSubcategories(): array 'active' => true, 'color' => 'green', ], + [ + 'name' => 'Board Games', + 'icon' => 'dice', + 'description' => 'Board games and tabletop games', + 'route' => 'board-games.index', + 'active' => true, + 'color' => 'amber', + ], ]; } diff --git a/app/Models/BoardGame.php b/app/Models/BoardGame.php new file mode 100644 index 0000000..0bbf3b4 --- /dev/null +++ b/app/Models/BoardGame.php @@ -0,0 +1,61 @@ + PlayingStatus::class, + 'ownership' => OwnershipStatus::class, + 'genre' => 'array', + 'rating' => 'integer', + 'plays' => 'integer', + 'min_players' => 'integer', + 'max_players' => 'integer', + 'playing_time' => 'integer', + 'year_published' => 'integer', + 'bgg_id' => 'integer', + 'date_started' => 'date', + 'date_finished' => 'date', + ]; + } + + public function user(): BelongsTo + { + return $this->belongsTo(User::class); + } +} diff --git a/app/Models/Game.php b/app/Models/Game.php index 805bcf4..91f8add 100644 --- a/app/Models/Game.php +++ b/app/Models/Game.php @@ -43,6 +43,7 @@ protected function casts(): array 'status' => PlayingStatus::class, 'ownership' => OwnershipStatus::class, 'platform' => 'array', + 'genre' => 'array', 'rating' => 'integer', 'hours_played' => 'decimal:1', 'completion_percentage' => 'integer', diff --git a/app/Policies/BoardGamePolicy.php b/app/Policies/BoardGamePolicy.php new file mode 100644 index 0000000..fddf8a3 --- /dev/null +++ b/app/Policies/BoardGamePolicy.php @@ -0,0 +1,36 @@ +id === $boardGame->user_id; + } + + public function create(User $user): bool + { + return true; + } + + public function update(User $user, BoardGame $boardGame): bool + { + return $user->id === $boardGame->user_id; + } + + public function delete(User $user, BoardGame $boardGame): bool + { + return $user->id === $boardGame->user_id; + } +} diff --git a/app/Services/BggService.php b/app/Services/BggService.php new file mode 100644 index 0000000..1d25d41 --- /dev/null +++ b/app/Services/BggService.php @@ -0,0 +1,107 @@ +connector = new BggConnector(); + } + + public function search(string $query): array + { + try { + $response = $this->connector->send(new SearchBoardGames($query)); + + if (! $response->successful()) { + return []; + } + + $xml = new SimpleXMLElement($response->body()); + $results = []; + + foreach ($xml->item as $item) { + $results[] = [ + 'bgg_id' => (int) $item['id'], + 'title' => (string) $item->name['value'], + 'year_published' => isset($item->yearpublished) ? (int) $item->yearpublished['value'] : null, + ]; + } + + return array_slice($results, 0, 20); + } catch (\Exception) { + return []; + } + } + + public function getDetails(int $bggId): ?array + { + try { + $response = $this->connector->send(new GetBoardGameDetails($bggId)); + + if (! $response->successful()) { + return null; + } + + $xml = new SimpleXMLElement($response->body()); + $item = $xml->item[0] ?? null; + + if (! $item) { + return null; + } + + $title = null; + foreach ($item->name as $name) { + if ((string) $name['type'] === 'primary') { + $title = (string) $name['value']; + break; + } + } + + $coverUrl = isset($item->image) ? (string) $item->image : null; + + $designers = []; + $publishers = []; + $genres = []; + + foreach ($item->link as $link) { + $type = (string) $link['type']; + $value = (string) $link['value']; + + if ($type === 'boardgamedesigner') { + $designers[] = $value; + } elseif ($type === 'boardgamepublisher') { + $publishers[] = $value; + } elseif ($type === 'boardgamecategory') { + $genres[] = $value; + } + } + + return [ + 'bgg_id' => $bggId, + 'title' => $title ?? 'Unknown', + 'description' => isset($item->description) ? html_entity_decode(strip_tags((string) $item->description)) : null, + 'cover_url' => $coverUrl, + 'year_published' => isset($item->yearpublished) ? (int) $item->yearpublished['value'] : null, + 'designer' => ! empty($designers) ? implode(', ', array_slice($designers, 0, 3)) : null, + 'publisher' => ! empty($publishers) ? $publishers[0] : null, + 'min_players' => isset($item->minplayers) ? (int) $item->minplayers['value'] : null, + 'max_players' => isset($item->maxplayers) ? (int) $item->maxplayers['value'] : null, + 'playing_time' => isset($item->playingtime) ? (int) $item->playingtime['value'] : null, + 'genres' => $genres, + ]; + } catch (\Exception) { + return null; + } + } +} diff --git a/app/Services/Saloon/Bgg/BggConnector.php b/app/Services/Saloon/Bgg/BggConnector.php new file mode 100644 index 0000000..73bac31 --- /dev/null +++ b/app/Services/Saloon/Bgg/BggConnector.php @@ -0,0 +1,34 @@ + 'Bearer ' . $token, + ]; + } + + return []; + } +} diff --git a/app/Services/Saloon/Bgg/Requests/GetBoardGameDetails.php b/app/Services/Saloon/Bgg/Requests/GetBoardGameDetails.php new file mode 100644 index 0000000..513027f --- /dev/null +++ b/app/Services/Saloon/Bgg/Requests/GetBoardGameDetails.php @@ -0,0 +1,30 @@ + $this->bggId, + 'stats' => 1, + ]; + } +} diff --git a/app/Services/Saloon/Bgg/Requests/SearchBoardGames.php b/app/Services/Saloon/Bgg/Requests/SearchBoardGames.php new file mode 100644 index 0000000..9aa6946 --- /dev/null +++ b/app/Services/Saloon/Bgg/Requests/SearchBoardGames.php @@ -0,0 +1,30 @@ + $this->searchQuery, + 'type' => 'boardgame', + ]; + } +} diff --git a/config/services.php b/config/services.php index b700810..5f6b8b1 100644 --- a/config/services.php +++ b/config/services.php @@ -53,4 +53,8 @@ 'client_secret' => env('IGDB_CLIENT_SECRET'), ], + 'bgg' => [ + 'api_token' => env('BGG_API_TOKEN'), + ], + ]; diff --git a/database/migrations/2026_03_21_201051_convert_game_genre_to_json.php b/database/migrations/2026_03_21_201051_convert_game_genre_to_json.php new file mode 100644 index 0000000..176a6f7 --- /dev/null +++ b/database/migrations/2026_03_21_201051_convert_game_genre_to_json.php @@ -0,0 +1,42 @@ +whereNotNull('genre')->get(['id', 'genre']); + + foreach ($games as $game) { + $genres = array_map('trim', explode(',', $game->genre)); + $genres = array_values(array_filter($genres, fn ($g) => $g !== '')); + + DB::table('games') + ->where('id', $game->id) + ->update(['genre' => json_encode($genres)]); + } + + // Change column type to jsonb + DB::statement('ALTER TABLE games ALTER COLUMN genre TYPE jsonb USING genre::jsonb'); + } + + public function down(): void + { + // Convert back to string + $games = DB::table('games')->whereNotNull('genre')->get(['id', 'genre']); + + DB::statement('ALTER TABLE games ALTER COLUMN genre TYPE varchar(500) USING genre::varchar'); + + foreach ($games as $game) { + $genres = json_decode($game->genre, true); + if (is_array($genres)) { + DB::table('games') + ->where('id', $game->id) + ->update(['genre' => implode(', ', $genres)]); + } + } + } +}; diff --git a/database/migrations/2026_03_22_125044_update_game_playing_statuses.php b/database/migrations/2026_03_22_125044_update_game_playing_statuses.php new file mode 100644 index 0000000..6bcfd95 --- /dev/null +++ b/database/migrations/2026_03_22_125044_update_game_playing_statuses.php @@ -0,0 +1,21 @@ +where('status', 'want_to_play')->update(['status' => 'backlog']); + DB::table('games')->where('status', 'played')->update(['status' => 'completed']); + } + + public function down(): void + { + DB::table('games')->where('status', 'backlog')->update(['status' => 'want_to_play']); + DB::table('games')->where('status', 'completed')->update(['status' => 'played']); + DB::table('games')->where('status', 'shelved')->update(['status' => 'want_to_play']); + DB::table('games')->where('status', 'mastered')->update(['status' => 'played']); + } +}; diff --git a/database/migrations/2026_03_22_140000_create_board_games_table.php b/database/migrations/2026_03_22_140000_create_board_games_table.php new file mode 100644 index 0000000..3c3c032 --- /dev/null +++ b/database/migrations/2026_03_22_140000_create_board_games_table.php @@ -0,0 +1,43 @@ +id(); + $table->foreignId('user_id')->constrained()->cascadeOnDelete(); + $table->string('title'); + $table->jsonb('genre')->nullable(); + $table->text('description')->nullable(); + $table->string('cover_url')->nullable(); + $table->unsignedSmallInteger('year_published')->nullable(); + $table->string('designer')->nullable(); + $table->string('publisher')->nullable(); + $table->unsignedSmallInteger('min_players')->nullable(); + $table->unsignedSmallInteger('max_players')->nullable(); + $table->unsignedSmallInteger('playing_time')->nullable(); + $table->string('status')->default('backlog'); + $table->string('ownership')->default('owned'); + $table->unsignedSmallInteger('rating')->nullable(); + $table->unsignedInteger('plays')->nullable(); + $table->unsignedBigInteger('bgg_id')->nullable(); + $table->date('date_started')->nullable(); + $table->date('date_finished')->nullable(); + $table->text('notes')->nullable(); + $table->timestamps(); + + $table->index(['user_id', 'status']); + $table->index('bgg_id'); + }); + } + + public function down(): void + { + Schema::dropIfExists('board_games'); + } +}; diff --git a/public/images/platforms/gameboy.svg b/public/images/platforms/gameboy.svg new file mode 100644 index 0000000..409f68a --- /dev/null +++ b/public/images/platforms/gameboy.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/public/images/platforms/gameboy_color.svg b/public/images/platforms/gameboy_color.svg new file mode 100644 index 0000000..a63a8b6 --- /dev/null +++ b/public/images/platforms/gameboy_color.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/public/images/platforms/gog.svg b/public/images/platforms/gog.svg new file mode 100644 index 0000000..ad17caa --- /dev/null +++ b/public/images/platforms/gog.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/public/images/platforms/n64.svg b/public/images/platforms/n64.svg new file mode 100644 index 0000000..ae87f08 --- /dev/null +++ b/public/images/platforms/n64.svg @@ -0,0 +1,3 @@ + + N64 + diff --git a/public/images/platforms/nes.svg b/public/images/platforms/nes.svg new file mode 100644 index 0000000..73b5055 --- /dev/null +++ b/public/images/platforms/nes.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/public/images/platforms/nintendo_switch.svg b/public/images/platforms/nintendo_switch.svg new file mode 100644 index 0000000..3e0b814 --- /dev/null +++ b/public/images/platforms/nintendo_switch.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/public/images/platforms/playstation4.svg b/public/images/platforms/playstation4.svg new file mode 100644 index 0000000..e2a4e7b --- /dev/null +++ b/public/images/platforms/playstation4.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/public/images/platforms/playstation5.svg b/public/images/platforms/playstation5.svg new file mode 100644 index 0000000..59e14da --- /dev/null +++ b/public/images/platforms/playstation5.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/public/images/platforms/ps2.svg b/public/images/platforms/ps2.svg new file mode 100644 index 0000000..39dff96 --- /dev/null +++ b/public/images/platforms/ps2.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/public/images/platforms/steam.svg b/public/images/platforms/steam.svg new file mode 100644 index 0000000..3142813 --- /dev/null +++ b/public/images/platforms/steam.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/public/images/platforms/windows.svg b/public/images/platforms/windows.svg new file mode 100644 index 0000000..267504c --- /dev/null +++ b/public/images/platforms/windows.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/public/images/platforms/xbox_one.svg b/public/images/platforms/xbox_one.svg new file mode 100644 index 0000000..7ef96a2 --- /dev/null +++ b/public/images/platforms/xbox_one.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/public/images/platforms/xbox_series.svg b/public/images/platforms/xbox_series.svg new file mode 100644 index 0000000..392d5c3 --- /dev/null +++ b/public/images/platforms/xbox_series.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/resources/css/app.css b/resources/css/app.css index 5014f61..35bd5cd 100644 --- a/resources/css/app.css +++ b/resources/css/app.css @@ -86,12 +86,39 @@ --color-status-watched-bg: 240 253 244; /* green-50 */ /* Playing statuses */ - --color-status-want-to-play: 147 51 234; /* purple-600 */ - --color-status-want-to-play-bg: 250 245 255; /* purple-50 */ - --color-status-playing: 245 158 11; /* amber-500 */ - --color-status-playing-bg: 255 251 235; /* amber-50 */ - --color-status-played: 34 197 94; /* green-500 */ - --color-status-played-bg: 240 253 244; /* green-50 */ + --color-status-backlog: 107 114 128; /* gray-500 */ + --color-status-backlog-bg: 243 244 246; /* gray-100 */ + --color-status-playing: 245 158 11; /* amber-500 */ + --color-status-playing-bg: 255 251 235; /* amber-50 */ + --color-status-shelved: 234 88 12; /* orange-600 */ + --color-status-shelved-bg: 255 247 237; /* orange-50 */ + --color-status-completed: 34 197 94; /* green-500 */ + --color-status-completed-bg: 240 253 244; /* green-50 */ + --color-status-mastered: 147 51 234; /* purple-600 */ + --color-status-mastered-bg: 250 245 255; /* purple-50 */ + + /* Platform Colors */ + --color-platform-nintendo: 229 36 39; /* Nintendo red #E52427 */ + --color-platform-nintendo-bg: 254 242 242; /* red-50 */ + --color-platform-nintendo-logo: 255 255 255; + --color-platform-steam: 27 40 56; /* Steam dark blue #1B2838 */ + --color-platform-steam-bg: 239 246 255; /* blue-50 */ + --color-platform-steam-logo: 255 255 255; + --color-platform-playstation: 0 55 145; /* PS blue #003791 */ + --color-platform-playstation-bg: 239 246 255; + --color-platform-playstation-logo: 255 255 255; + --color-platform-xbox: 16 124 16; /* Xbox green #107C10 */ + --color-platform-xbox-bg: 240 253 244; + --color-platform-xbox-logo: 255 255 255; + --color-platform-gog: 164 93 226; /* GOG purple */ + --color-platform-gog-bg: 250 245 255; + --color-platform-gog-logo: 255 255 255; + --color-platform-pc: 75 85 99; /* neutral gray */ + --color-platform-pc-bg: 243 244 246; + --color-platform-pc-logo: 255 255 255; + --color-platform-default: 107 114 128; + --color-platform-default-bg: 243 244 246; + --color-platform-default-logo: 255 255 255; /* Stars */ --color-star-filled: 250 204 21; /* yellow-400 */ @@ -189,12 +216,39 @@ --color-status-watched-bg: 60 56 54; /* Playing statuses */ - --color-status-want-to-play: 211 134 155; /* purple #d3869b */ - --color-status-want-to-play-bg: 60 56 54; - --color-status-playing: 250 189 47; /* yellow #fabd2f */ + --color-status-backlog: 146 131 116; /* gray #928374 */ + --color-status-backlog-bg: 60 56 54; + --color-status-playing: 250 189 47; /* yellow #fabd2f */ --color-status-playing-bg: 60 56 54; - --color-status-played: 184 187 38; /* green #b8bb26 */ - --color-status-played-bg: 60 56 54; + --color-status-shelved: 254 128 25; /* orange #fe8019 */ + --color-status-shelved-bg: 60 56 54; + --color-status-completed: 184 187 38; /* green #b8bb26 */ + --color-status-completed-bg: 60 56 54; + --color-status-mastered: 211 134 155; /* purple #d3869b */ + --color-status-mastered-bg: 60 56 54; + + /* Platform Colors */ + --color-platform-nintendo: 251 73 52; /* gruvbox red #fb4934 */ + --color-platform-nintendo-bg: 60 56 54; /* bg1 */ + --color-platform-nintendo-logo: 40 40 40; /* bg0 */ + --color-platform-steam: 131 165 152; /* gruvbox blue #83a598 */ + --color-platform-steam-bg: 60 56 54; + --color-platform-steam-logo: 40 40 40; + --color-platform-playstation: 131 165 152; /* gruvbox blue #83a598 */ + --color-platform-playstation-bg: 60 56 54; + --color-platform-playstation-logo: 40 40 40; + --color-platform-xbox: 184 187 38; /* gruvbox green #b8bb26 */ + --color-platform-xbox-bg: 60 56 54; + --color-platform-xbox-logo: 40 40 40; + --color-platform-gog: 211 134 155; /* gruvbox purple #d3869b */ + --color-platform-gog-bg: 60 56 54; + --color-platform-gog-logo: 40 40 40; + --color-platform-pc: 213 196 161; /* fg2 #d5c4a1 */ + --color-platform-pc-bg: 60 56 54; + --color-platform-pc-logo: 40 40 40; + --color-platform-default: 189 174 147; /* fg3 */ + --color-platform-default-bg: 60 56 54; + --color-platform-default-logo: 40 40 40; /* Stars */ --color-star-filled: 250 189 47; /* yellow #fabd2f */ diff --git a/resources/views/livewire/board-games/board-game-bgg-search.blade.php b/resources/views/livewire/board-games/board-game-bgg-search.blade.php new file mode 100644 index 0000000..f89866e --- /dev/null +++ b/resources/views/livewire/board-games/board-game-bgg-search.blade.php @@ -0,0 +1,293 @@ +
    + {{-- Header --}} +
    +
    + +

    Discover Board Games

    +
    +
    + +
    +
    + {{-- Flash Messages --}} + @if (session()->has('message')) +
    + + + +

    {{ session('message') }}

    +
    + @endif + + {{-- ===== STEP: SEARCH ===== --}} + @if($step === 'search') +
    +
    +
    + {{-- Dice / board game icon --}} + + + +

    Discover Board Games

    +

    Search BoardGameGeek to find games and add them to your library.

    +
    +
    +
    + + +
    +
    +
    +
    + + {{-- ===== STEP: RESULTS ===== --}} + @elseif($step === 'results') +
    + +
    + + +
    +
    + + @if(empty($searchResults)) +
    +

    No results found for "{{ $query }}".

    +
    + @else +
    +
      + @foreach($searchResults as $result) +
    • + +
    • + @endforeach +
    +
    + @endif + + {{-- Loading overlay --}} +
    +
    + + + + + Loading game details... +
    +
    + + {{-- ===== STEP: CONFIGURE ===== --}} + @elseif($step === 'configure') +
    + +
    + +
    +
    +
    + {{-- Top: cover thumbnail + key info --}} +
    +
    + @if($cover_url) + + @else +
    + + + +
    + @endif +
    +
    + + + +
    +
    + + +
    +
    + + +
    +
    + +
    +
    + + +
    +
    + +
    + + + +
    +
    +
    + + +
    +
    + + {{-- Genres (read-only display from BGG) --}} + @if(!empty($genre)) +
    + +
    + @foreach($genre as $g) + + {{ $g }} + + @endforeach +
    +
    + @endif +
    +
    + + {{-- Description --}} +
    + + +
    + + {{-- Status + Ownership + Rating --}} +
    +
    + + +
    +
    + + +
    +
    + +
    + @for($i = 1; $i <= 10; $i++) + + @endfor + {{ $rating ? $rating . '/10' : 'Not rated' }} +
    +
    +
    + + {{-- Notes --}} +
    + + +
    + + {{-- Actions --}} +
    + + +
    +
    +
    +
    + @endif +
    +
    +
    diff --git a/resources/views/livewire/board-games/board-game-form.blade.php b/resources/views/livewire/board-games/board-game-form.blade.php new file mode 100644 index 0000000..01e0557 --- /dev/null +++ b/resources/views/livewire/board-games/board-game-form.blade.php @@ -0,0 +1,297 @@ +
    +
    +
    + +

    + {{ $isEditing ? 'Edit Board Game' : 'Add Board Game' }} +

    +
    +
    + +
    +
    +
    + + {{-- Basic Info --}} +
    +
    +

    Basic Information

    +

    Core details about this board game.

    + +
    + + {{-- Title --}} +
    + +
    + +
    + @error('title')

    {{ $message }}

    @enderror +
    + + {{-- Genre (tag-style) --}} +
    + +
    + + +
    + @if(!empty($genre)) +
    + @foreach($genre as $index => $g) + + {{ $g }} + + + @endforeach +
    + @endif + @error('genre')

    {{ $message }}

    @enderror +
    + + {{-- Designer --}} +
    + +
    + +
    + @error('designer')

    {{ $message }}

    @enderror +
    + + {{-- Publisher --}} +
    + +
    + +
    + @error('publisher')

    {{ $message }}

    @enderror +
    + + {{-- Year Published --}} +
    + +
    + +
    + @error('year_published')

    {{ $message }}

    @enderror +
    + + {{-- Min Players --}} +
    + +
    + +
    + @error('min_players')

    {{ $message }}

    @enderror +
    + + {{-- Max Players --}} +
    + +
    + +
    + @error('max_players')

    {{ $message }}

    @enderror +
    + + {{-- Playing Time --}} +
    + +
    + +
    + @error('playing_time')

    {{ $message }}

    @enderror +
    + + {{-- Cover URL --}} +
    + +
    + +
    + @error('cover_url')

    {{ $message }}

    @enderror +
    + + {{-- Description --}} +
    + +
    + +
    + @error('description')

    {{ $message }}

    @enderror +
    +
    +
    +
    + + {{-- Your Collection --}} +
    +
    +

    Your Collection

    +

    Track your status, plays, and rating for this game.

    + +
    + + {{-- Status --}} +
    + +
    + +
    + @error('status')

    {{ $message }}

    @enderror +
    + + {{-- Ownership --}} +
    + +
    + +
    + @error('ownership')

    {{ $message }}

    @enderror +
    + + {{-- Plays --}} +
    + +
    + +
    + @error('plays')

    {{ $message }}

    @enderror +
    + + {{-- Date Started --}} +
    + +
    + +
    + @error('date_started')

    {{ $message }}

    @enderror +
    + + {{-- Date Finished --}} +
    + +
    + +
    + @error('date_finished')

    {{ $message }}

    @enderror +
    + + {{-- Rating (1-10 numbered buttons) --}} +
    + +
    + @for($i = 1; $i <= 10; $i++) + + @endfor + + {{ $rating ? $rating . ' / 10' : 'Not rated' }} + +
    +
    + + {{-- Notes --}} +
    + +
    + +
    + @error('notes')

    {{ $message }}

    @enderror +
    +
    +
    +
    + + {{-- External IDs --}} +
    +
    +

    External IDs

    +

    Link this game to external databases.

    + +
    + {{-- BGG ID --}} +
    + +
    + +
    + @error('bgg_id')

    {{ $message }}

    @enderror +
    +
    +
    +
    + + {{-- Actions --}} +
    + + Cancel + + +
    +
    +
    +
    +
    diff --git a/resources/views/livewire/board-games/board-game-index.blade.php b/resources/views/livewire/board-games/board-game-index.blade.php new file mode 100644 index 0000000..86fab54 --- /dev/null +++ b/resources/views/livewire/board-games/board-game-index.blade.php @@ -0,0 +1,390 @@ +
    + {{-- Header --}} +
    +
    +
    +
    + +

    Board Games

    +
    + +
    +
    +
    + +
    +
    + {{-- Flash Message --}} + @if (session()->has('message')) +
    + + + +

    {{ session('message') }}

    +
    + @endif + + {{-- Toolbar --}} +
    +
    + {{-- Left: Search & Filters --}} +
    + {{-- Search --}} +
    + + + + +
    + + {{-- Status Filter --}} + + + {{-- Ownership Filter --}} + + + {{-- Genre Filter --}} + + + {{-- Sort --}} + + + {{-- Sort Direction --}} + +
    + + {{-- Right: View Toggle & Bulk Actions --}} +
    + {{-- Bulk Actions --}} + @if(count($selected) > 0) + {{ count($selected) }} selected + + @endif + +
    + + {{-- View Toggle --}} +
    + + +
    +
    +
    + + {{-- Select All --}} + @if($boardGames->isNotEmpty()) +
    + + +
    + @endif +
    + + {{-- Content --}} + @if($boardGames->isEmpty()) +
    + {{-- Dice SVG icon --}} + + + +

    No board games yet

    +

    Get started by adding a board game or discovering new ones.

    + +
    + @else +
    + @if($viewMode === 'gallery') + {{-- Gallery View --}} +
    + @foreach($boardGames as $boardGame) + + @endforeach +
    + @else + {{-- List View --}} +
    +
    + + + + + + + + + + + + + + + @foreach($boardGames as $boardGame) + + + + + + + + + + + @endforeach + +
    + +
    + + + +
    + @if($boardGame->cover_url) + + @else +
    + + + +
    + @endif +
    +
    +
    + + {{ Str::limit($boardGame->title, 50) }} + + @if($boardGame->year_published) +

    {{ $boardGame->year_published }}

    + @endif +
    +
    +
    + @endif +
    + + {{-- Pagination --}} +
    + {{ $boardGames->links() }} +
    + @endif +
    +
    +
    diff --git a/resources/views/livewire/board-games/board-game-show.blade.php b/resources/views/livewire/board-games/board-game-show.blade.php new file mode 100644 index 0000000..828cf1c --- /dev/null +++ b/resources/views/livewire/board-games/board-game-show.blade.php @@ -0,0 +1,266 @@ +
    +
    +
    + +
    +
    + +
    +
    + {{-- Flash Messages --}} + @if (session()->has('message')) +
    + + + +

    {{ session('message') }}

    +
    + @endif + @if (session()->has('error')) +
    + + + +

    {{ session('error') }}

    +
    + @endif + +
    + {{-- Cover + Genres --}} +
    +
    + @if($boardGame->cover_url) + Cover of {{ $boardGame->title }} + @else + + @endif +
    + + {{-- Genre Badges --}} + @if(count($boardGame->genre ?? []) > 0) +
    + @foreach($boardGame->genre as $genre) + + {{ $genre }} + + @endforeach +
    + @endif +
    + + {{-- Board Game Details --}} +
    +

    {{ $boardGame->title }}

    + @if($boardGame->designer) +

    {{ $boardGame->designer }}

    + @endif + + {{-- Status, Ownership, Rating & Actions --}} +
    + {{-- Status Badge --}} + + {{ $boardGame->status->label() }} + + + {{-- Ownership Badge --}} + @if($boardGame->ownership) + + {{ $boardGame->ownership->label() }} + + @endif + + {{-- Rating (1-10 numbered buttons) --}} +
    + @for($i = 1; $i <= 10; $i++) + + @endfor +
    + +
    + + {{-- Edit & Delete --}} + + Edit + + +
    + + {{-- Metadata Grid --}} +
    + @if($boardGame->year_published) +
    +
    Year Published
    +
    {{ $boardGame->year_published }}
    +
    + @endif + + @if($boardGame->designer) +
    +
    Designer
    +
    {{ $boardGame->designer }}
    +
    + @endif + + @if($boardGame->publisher) +
    +
    Publisher
    +
    {{ $boardGame->publisher }}
    +
    + @endif + + @if($boardGame->min_players || $boardGame->max_players) +
    +
    Players
    +
    + @if($boardGame->min_players === $boardGame->max_players) + {{ $boardGame->min_players }} + @else + {{ $boardGame->min_players }}–{{ $boardGame->max_players }} + @endif +
    +
    + @endif + + @if($boardGame->playing_time) +
    +
    Playing Time
    +
    {{ $boardGame->playing_time }} min
    +
    + @endif + + @if($boardGame->plays !== null) +
    +
    Plays
    +
    {{ $boardGame->plays }}
    +
    + @endif + + @if($boardGame->rating) +
    +
    Your Rating
    +
    {{ $boardGame->rating }}/10
    +
    + @endif + + @if($boardGame->date_started) +
    +
    Date Started
    +
    {{ $boardGame->date_started->format('F j, Y') }}
    +
    + @endif + + @if($boardGame->date_finished) +
    +
    Date Finished
    +
    {{ $boardGame->date_finished->format('F j, Y') }}
    +
    + @endif + + @if($boardGame->bgg_id) +
    +
    BoardGameGeek
    +
    + + {{ $boardGame->bgg_id }} + + +
    +
    + @endif + +
    +
    Added to Library
    +
    {{ $boardGame->created_at->format('F j, Y') }}
    +
    +
    + + {{-- Description --}} + @if($boardGame->description) +
    +

    Description

    +
    + {!! nl2br(e($boardGame->description)) !!} +
    +
    + @endif + + {{-- Notes --}} + @if($boardGame->notes) +
    +

    My Notes

    +
    + {!! nl2br(e($boardGame->notes)) !!} +
    +
    + @endif +
    +
    +
    +
    +
    diff --git a/resources/views/livewire/dashboard.blade.php b/resources/views/livewire/dashboard.blade.php index 917ad1e..b78b47d 100644 --- a/resources/views/livewire/dashboard.blade.php +++ b/resources/views/livewire/dashboard.blade.php @@ -30,6 +30,10 @@ class="relative flex flex-col items-center rounded-lg border-2 border-theme-acce + @elseif($category['icon'] === 'puzzle-piece') + @endif

    {{ $category['name'] }}

    @@ -45,6 +49,13 @@ class="relative flex flex-col items-center rounded-lg border-2 border-theme-acce {{ $animeStats['total_anime'] }} anime @endif + @elseif($category['name'] === 'Playing' && $playingStats['total_games'] > 0) +
    + {{ $playingStats['total_games'] }} games + @if($playingStats['currently_playing'] > 0) + · {{ $playingStats['currently_playing'] }} playing + @endif +
    @elseif($category['name'] === 'Reading' && ($readingStats['total_books'] > 0 || $readingStats['total_comics'] > 0))
    @if($readingStats['total_books'] > 0) diff --git a/resources/views/livewire/games/game-form.blade.php b/resources/views/livewire/games/game-form.blade.php index 51d0bcb..ce71a47 100644 --- a/resources/views/livewire/games/game-form.blade.php +++ b/resources/views/livewire/games/game-form.blade.php @@ -60,9 +60,9 @@
    @error('status')

    {{ $message }}

    @enderror @@ -109,11 +109,28 @@
    {{-- Genre --}} -
    - -
    - +
    + +
    + +
    + @if(!empty($genre)) +
    + @foreach($genre as $index => $g) + + {{ $g }} + + + @endforeach +
    + @endif @error('genre')

    {{ $message }}

    @enderror
    diff --git a/resources/views/livewire/games/game-igdb-search.blade.php b/resources/views/livewire/games/game-igdb-search.blade.php index a05da0c..0313371 100644 --- a/resources/views/livewire/games/game-igdb-search.blade.php +++ b/resources/views/livewire/games/game-igdb-search.blade.php @@ -216,8 +216,18 @@ class="group relative bg-theme-card-bg rounded-lg shadow-sm ring-1 ring-theme-bo
    - - + + @if(!empty($genre)) +
    + @foreach($genre as $g) + + {{ $g }} + + @endforeach +
    + @else +

    None

    + @endif
    diff --git a/resources/views/livewire/games/game-index.blade.php b/resources/views/livewire/games/game-index.blade.php index 57e18c9..f9644ee 100644 --- a/resources/views/livewire/games/game-index.blade.php +++ b/resources/views/livewire/games/game-index.blade.php @@ -104,6 +104,17 @@ class="rounded-md border-0 py-1.5 pl-3 pr-8 text-sm ring-1 ring-inset ring-theme @endforeach + {{-- Genre Filter --}} + + {{-- Sort --}} +
    + + +
    + Searching Discogs... +
    +
    + @endif + + {{-- Step: Results --}} + @if($step === 'results') +
    + +
    + + @if(empty($results)) +
    + + + +

    No results found

    +

    Try a different search term.

    +
    + @else +

    {{ count($results) }} results for "{{ $searchQuery }}"

    +
    + @foreach($results as $index => $result) + + @endforeach +
    +
    + Fetching release details... +
    + @endif + @endif + + {{-- Step: Configure --}} + @if($step === 'configure' && $selectedRelease) +
    + +
    + +
    + {{-- Album Preview --}} +
    +
    + @if(!empty($selectedRelease['cover_url'])) + + @else +
    + + + +
    + @endif +
    +
    +

    {{ $selectedRelease['title'] }}

    +

    {{ $selectedRelease['artist'] }}

    +
    + @if(!empty($selectedRelease['year'])) + {{ $selectedRelease['year'] }} + @endif + @if(!empty($selectedRelease['format'])) + {{ $selectedRelease['format'] }} + @endif + @if(!empty($selectedRelease['label'])) + {{ $selectedRelease['label'] }} + @endif + @if(!empty($selectedRelease['country'])) + {{ $selectedRelease['country'] }} + @endif +
    + @if(!empty($selectedRelease['genre'])) +
    + @foreach($selectedRelease['genre'] as $g) + {{ $g }} + @endforeach +
    + @endif +
    +
    + + {{-- Tracklist Preview --}} + @if(!empty($selectedRelease['tracklist'])) +
    +

    Tracklist ({{ count($selectedRelease['tracklist']) }} tracks)

    +
      + @foreach($selectedRelease['tracklist'] as $track) +
    1. + {{ $track['position'] }} + {{ $track['title'] }} + @if(!empty($track['duration'])) + {{ $track['duration'] }} + @endif +
    2. + @endforeach +
    +
    + @endif + + {{-- Configure Options --}} +
    +

    Add to your collection

    +
    + {{-- Status --}} +
    + + +
    + + {{-- Ownership --}} +
    + + +
    + + {{-- Rating --}} +
    + +
    + @for($i = 1; $i <= 5; $i++) + + @endfor +
    +
    +
    + + {{-- Notes --}} +
    + + +
    + + {{-- Save --}} +
    + +
    +
    +
    + @endif +
    + + diff --git a/resources/views/livewire/albums/album-form.blade.php b/resources/views/livewire/albums/album-form.blade.php new file mode 100644 index 0000000..371fd02 --- /dev/null +++ b/resources/views/livewire/albums/album-form.blade.php @@ -0,0 +1,256 @@ +
    +
    +
    + +

    + {{ $isEditing ? 'Edit Album' : 'Add Album' }} +

    +
    +
    + +
    +
    +
    + + {{-- Album Details --}} +
    +
    +

    Album Details

    +

    Core information about the album.

    + +
    + + {{-- Title --}} +
    + +
    + +
    + @error('title')

    {{ $message }}

    @enderror +
    + + {{-- Artist --}} +
    + +
    + +
    + @error('artist')

    {{ $message }}

    @enderror +
    + + {{-- Year --}} +
    + +
    + +
    + @error('year')

    {{ $message }}

    @enderror +
    + + {{-- Genre --}} +
    + +
    + +
    +

    Comma-separated

    + @error('genre')

    {{ $message }}

    @enderror +
    + + {{-- Styles --}} +
    + +
    + +
    +

    Comma-separated

    + @error('styles')

    {{ $message }}

    @enderror +
    + + {{-- Format --}} +
    + +
    + +
    + @error('format')

    {{ $message }}

    @enderror +
    + + {{-- Label --}} +
    + +
    + +
    + @error('label')

    {{ $message }}

    @enderror +
    + + {{-- Country --}} +
    + +
    + +
    + @error('country')

    {{ $message }}

    @enderror +
    + + {{-- Cover URL --}} +
    + +
    + +
    + @error('cover_url')

    {{ $message }}

    @enderror +
    +
    +
    +
    + + {{-- Your Experience --}} +
    +
    +

    Your Experience

    +

    Track your listening status, ownership, rating, and notes.

    + +
    + + {{-- Status --}} +
    + +
    + +
    + @error('status')

    {{ $message }}

    @enderror +
    + + {{-- Ownership --}} +
    + +
    + +
    + @error('ownership')

    {{ $message }}

    @enderror +
    + + {{-- Rating (1-5 stars) --}} +
    + +
    + @for($i = 1; $i <= 5; $i++) + + @endfor + + {{ $rating ? $rating . ' / 5' : 'Not rated' }} + +
    +
    + + {{-- Notes --}} +
    + +
    + +
    + @error('notes')

    {{ $message }}

    @enderror +
    +
    +
    +
    + + {{-- External IDs --}} +
    +
    +

    External IDs

    +

    Link this album to Discogs.

    + +
    + {{-- Discogs ID --}} +
    + +
    + +
    + @error('discogs_id')

    {{ $message }}

    @enderror +
    + + {{-- Discogs Master ID --}} +
    + +
    + +
    + @error('discogs_master_id')

    {{ $message }}

    @enderror +
    +
    +
    +
    + + {{-- Actions --}} +
    + + Cancel + + +
    +
    +
    +
    +
    diff --git a/resources/views/livewire/albums/album-index.blade.php b/resources/views/livewire/albums/album-index.blade.php new file mode 100644 index 0000000..feea2dd --- /dev/null +++ b/resources/views/livewire/albums/album-index.blade.php @@ -0,0 +1,381 @@ +
    + {{-- Header --}} +
    +
    +
    +
    + +

    Albums

    +
    + +
    +
    +
    + +
    +
    + {{-- Flash Message --}} + @if (session()->has('message')) +
    + + + +

    {{ session('message') }}

    +
    + @endif + + {{-- Toolbar --}} +
    +
    + {{-- Left: Search & Filters --}} +
    + {{-- Search --}} +
    + + + + +
    + + {{-- Status Filter --}} + + + {{-- Sort --}} + + + {{-- Sort Direction --}} + +
    + + {{-- Right: View Toggle & Bulk Actions --}} +
    + {{-- Bulk Actions --}} + @if(count($selected) > 0) + {{ count($selected) }} selected + + @endif + +
    + + {{-- View Toggle --}} +
    + + +
    +
    +
    + + {{-- Select All --}} + @if($albums->isNotEmpty()) +
    + + +
    + @endif +
    + + {{-- Content --}} + @if($albums->isEmpty()) +
    + {{-- Disc icon --}} + + + +

    No albums yet

    +

    Get started by adding an album or discovering one via Discogs.

    + +
    + @else +
    + @if($viewMode === 'gallery') + {{-- Gallery View --}} + + @else + {{-- List View --}} +
    +
    + + + + + + + + + + + + + + @foreach($albums as $album) + + + + + + + + + + @endforeach + +
    + +
    + + + +
    + @if($album->cover_url) + + @else +
    + + + +
    + @endif +
    +
    +
    + + {{ Str::limit($album->title, 50) }} + + @if($album->format) +

    {{ $album->format }}

    + @endif +
    +
    +
    + @endif +
    + + {{-- Pagination --}} +
    + {{ $albums->links() }} +
    + @endif +
    +
    +
    diff --git a/resources/views/livewire/albums/album-show.blade.php b/resources/views/livewire/albums/album-show.blade.php new file mode 100644 index 0000000..95d2bdd --- /dev/null +++ b/resources/views/livewire/albums/album-show.blade.php @@ -0,0 +1,241 @@ +
    +
    +
    + +
    +
    + +
    +
    + {{-- Flash Messages --}} + @if (session()->has('message')) +
    + + + +

    {{ session('message') }}

    +
    + @endif + +
    + {{-- Cover --}} +
    +
    + @if($album->cover_url) + Cover for {{ $album->title }} + @else + + @endif +
    +
    + + {{-- Album Details --}} +
    +

    {{ $album->title }}

    + @if($album->artist) +

    {{ $album->artist }}

    + @endif + + {{-- Status, Rating & Actions --}} +
    + {{-- Status Badge --}} + + {{ $album->status->label() }} + + + {{-- Ownership Badge --}} + @if($album->ownership) + + {{ $album->ownership->label() }} + + @endif + + {{-- Rating (1-5 stars) --}} +
    + @for($i = 1; $i <= 5; $i++) + + @endfor +
    + +
    + + {{-- Edit & Delete --}} + + Edit + + +
    + + {{-- Metadata Grid --}} +
    + @if($album->year) +
    +
    Year
    +
    {{ $album->year }}
    +
    + @endif + + @if($album->format) +
    +
    Format
    +
    {{ $album->format }}
    +
    + @endif + + @if(!empty($album->genre)) +
    +
    Genre
    +
    {{ implode(', ', $album->genre) }}
    +
    + @endif + + @if(!empty($album->styles)) +
    +
    Styles
    +
    {{ implode(', ', $album->styles) }}
    +
    + @endif + + @if($album->label) +
    +
    Label
    +
    {{ $album->label }}
    +
    + @endif + + @if($album->country) +
    +
    Country
    +
    {{ $album->country }}
    +
    + @endif + + @if($album->discogs_id || $album->discogs_master_id) +
    +
    Discogs
    +
    + @if($album->discogs_master_id) + + View on Discogs + + + @elseif($album->discogs_id) + + View on Discogs + + + @endif +
    +
    + @endif + +
    +
    Added to Library
    +
    {{ $album->created_at->format('F j, Y') }}
    +
    +
    + + {{-- Notes --}} + @if($album->notes) +
    +

    My Notes

    +
    + {!! nl2br(e($album->notes)) !!} +
    +
    + @endif + + {{-- Tracklist --}} + @if(!empty($album->tracklist)) +
    +

    Tracklist

    +

    {{ count($album->tracklist) }} track{{ count($album->tracklist) !== 1 ? 's' : '' }}

    +
      + @foreach($album->tracklist as $index => $track) +
    1. + {{ $track['position'] ?? ($index + 1) }} +
      + {{ $track['title'] ?? 'Unknown' }} +
      + @if(!empty($track['duration'])) + {{ $track['duration'] }} + @endif +
    2. + @endforeach +
    +
    + @endif +
    +
    +
    +
    +
    diff --git a/resources/views/livewire/concerts/concert-form.blade.php b/resources/views/livewire/concerts/concert-form.blade.php new file mode 100644 index 0000000..af8c58b --- /dev/null +++ b/resources/views/livewire/concerts/concert-form.blade.php @@ -0,0 +1,221 @@ +
    +
    +
    + +

    + {{ $isEditing ? 'Edit Concert' : 'Add Concert' }} +

    +
    +
    + +
    +
    +
    + + {{-- Event Details --}} +
    +
    +

    Event Details

    +

    Core information about the concert event.

    + +
    + + {{-- Artist --}} +
    + +
    + +
    + @error('artist')

    {{ $message }}

    @enderror +
    + + {{-- Tour Name --}} +
    + +
    + +
    + @error('tour_name')

    {{ $message }}

    @enderror +
    + + {{-- Venue --}} +
    + +
    + +
    + @error('venue')

    {{ $message }}

    @enderror +
    + + {{-- Event Date --}} +
    + +
    + +
    + @error('event_date')

    {{ $message }}

    @enderror +
    + + {{-- City --}} +
    + +
    + +
    + @error('city')

    {{ $message }}

    @enderror +
    + + {{-- Country --}} +
    + +
    + +
    + @error('country')

    {{ $message }}

    @enderror +
    + + {{-- Cover URL --}} +
    + +
    + +
    + @error('cover_url')

    {{ $message }}

    @enderror +
    +
    +
    +
    + + {{-- Your Experience --}} +
    +
    +

    Your Experience

    +

    Track your attendance status, rating, and personal notes.

    + +
    + + {{-- Status --}} +
    + +
    + +
    + @error('status')

    {{ $message }}

    @enderror +
    + + {{-- Rating (1-10 numbered buttons) --}} +
    + +
    + @for($i = 1; $i <= 10; $i++) + + @endfor + + {{ $rating ? $rating . ' / 10' : 'Not rated' }} + +
    +
    + + {{-- Notes --}} +
    + +
    + +
    + @error('notes')

    {{ $message }}

    @enderror +
    +
    +
    +
    + + {{-- External IDs --}} +
    +
    +

    External IDs

    +

    Link this concert to external databases.

    + +
    + {{-- Setlist.fm ID --}} +
    + +
    + +
    + @error('setlist_fm_id')

    {{ $message }}

    @enderror +
    + + {{-- Artist MusicBrainz ID --}} +
    + +
    + +
    + @error('artist_mbid')

    {{ $message }}

    @enderror +
    +
    +
    +
    + + {{-- Actions --}} +
    + + Cancel + + +
    +
    +
    +
    +
    diff --git a/resources/views/livewire/concerts/concert-index.blade.php b/resources/views/livewire/concerts/concert-index.blade.php new file mode 100644 index 0000000..1036c8a --- /dev/null +++ b/resources/views/livewire/concerts/concert-index.blade.php @@ -0,0 +1,384 @@ +
    + {{-- Header --}} +
    +
    +
    +
    + +

    Concerts

    +
    + +
    +
    +
    + +
    +
    + {{-- Flash Message --}} + @if (session()->has('message')) +
    + + + +

    {{ session('message') }}

    +
    + @endif + + {{-- Toolbar --}} +
    +
    + {{-- Left: Search & Filters --}} +
    + {{-- Search --}} +
    + + + + +
    + + {{-- Status Filter --}} + + + {{-- Sort --}} + + + {{-- Sort Direction --}} + +
    + + {{-- Right: View Toggle & Bulk Actions --}} +
    + {{-- Bulk Actions --}} + @if(count($selected) > 0) + {{ count($selected) }} selected + + @endif + +
    + + {{-- View Toggle --}} +
    + + +
    +
    +
    + + {{-- Select All --}} + @if($concerts->isNotEmpty()) +
    + + +
    + @endif +
    + + {{-- Content --}} + @if($concerts->isEmpty()) +
    + {{-- Microphone icon --}} + + + +

    No concerts yet

    +

    Get started by adding a concert or discovering one via setlist.fm.

    + +
    + @else +
    + @if($viewMode === 'gallery') + {{-- Gallery View --}} + + @else + {{-- List View --}} +
    +
    + + + + + + + + + + + + + + @foreach($concerts as $concert) + + + + + + + + + + @endforeach + +
    + +
    + + + +
    + @if($concert->cover_url) + + @else +
    + + + +
    + @endif +
    +
    +
    + + {{ Str::limit($concert->artist, 50) }} + + @if($concert->tour_name) +

    {{ $concert->tour_name }}

    + @endif +
    +
    +
    + @endif +
    + + {{-- Pagination --}} +
    + {{ $concerts->links() }} +
    + @endif +
    +
    +
    diff --git a/resources/views/livewire/concerts/concert-setlistfm-search.blade.php b/resources/views/livewire/concerts/concert-setlistfm-search.blade.php new file mode 100644 index 0000000..bf270e6 --- /dev/null +++ b/resources/views/livewire/concerts/concert-setlistfm-search.blade.php @@ -0,0 +1,379 @@ +
    + {{-- Header --}} +
    +
    + +

    Discover Concerts

    +
    +
    + +
    +
    + {{-- Flash Messages --}} + @if (session()->has('message')) +
    + + + +

    {{ session('message') }}

    +
    + @endif + @if (session()->has('error')) +
    + + + +

    {{ session('error') }}

    +
    + @endif + @if (session()->has('duplicate')) +
    + + + +

    {{ session('duplicate') }}

    +
    + @endif + + {{-- ===== STEP: SEARCH ===== --}} + @if($step === 'search') +
    +
    +
    + {{-- Microphone icon --}} + + + +

    Discover Concerts via setlist.fm

    +

    Search for an artist to browse their setlists and add concerts to your library.

    +
    +
    + + +
    +
    +
    + + {{-- ===== STEP: ARTISTS ===== --}} + @elseif($step === 'artists') +
    + +
    + + +
    +
    + + @if(empty($artists)) +
    +

    No artists found for "{{ $searchQuery }}".

    +
    + @else +
    +
      + @foreach($artists as $index => $artist) +
    • + +
    • + @endforeach +
    +
    + @endif + + {{-- Loading overlay --}} +
    +
    + + + + + Loading setlists... +
    +
    + + {{-- ===== STEP: SETLISTS ===== --}} + @elseif($step === 'setlists') +
    + +

    + Setlists for {{ $searchQuery }} +

    +
    + + @if(empty($setlists)) +
    +

    No setlists found for this artist.

    +
    + @else +
    +
      + @foreach($setlists as $index => $setlist) +
    • + +
    • + @endforeach +
    +
    + @endif + + {{-- ===== STEP: CONFIGURE ===== --}} + @elseif($step === 'configure') +
    + +
    + +
    +
    +
    + {{-- Summary header --}} + @if(!empty($selectedSetlist)) +
    +

    {{ $searchQuery }}

    +
    + @if(!empty($selectedSetlist['eventDate'])) + + + + + {{ $selectedSetlist['eventDate'] }} + + @endif + @if(!empty($selectedSetlist['venue']['name'])) + + + + + + {{ $selectedSetlist['venue']['name'] }} + @if(!empty($selectedSetlist['venue']['city']['name'])) + , {{ $selectedSetlist['venue']['city']['name'] }} + @endif + + @endif + @if(!empty($selectedSetlist['tour']['name'])) + + + + + {{ $selectedSetlist['tour']['name'] }} + + @endif +
    + + {{-- Setlist preview --}} + @if(!empty($selectedSetlist['sets']['set'])) + @php + $allSongs = []; + foreach ($selectedSetlist['sets']['set'] as $s) { + foreach ($s['song'] ?? [] as $song) { + $allSongs[] = $song; + } + } + $preview = array_slice($allSongs, 0, 5); + $remaining = count($allSongs) - count($preview); + @endphp + @if(!empty($preview)) +
    +

    Setlist preview

    +
      + @foreach($preview as $i => $song) +
    1. + {{ $i + 1 }}.{{ $song['name'] }} + @if(!empty($song['cover'])) + (cover) + @endif +
    2. + @endforeach + @if($remaining > 0) +
    3. + {{ $remaining }} more song{{ $remaining !== 1 ? 's' : '' }}
    4. + @endif +
    +
    + @endif + @endif +
    + @endif + + {{-- Status + Rating + Notes --}} +
    + {{-- Status --}} +
    + + +
    + + {{-- Rating --}} +
    + +
    + @for($i = 1; $i <= 10; $i++) + + @endfor + {{ $rating ? $rating . '/10' : 'Not rated' }} +
    +
    + + {{-- Notes --}} +
    + + +
    +
    + + {{-- Actions --}} +
    + + +
    +
    +
    +
    + @endif +
    +
    +
    diff --git a/resources/views/livewire/concerts/concert-show.blade.php b/resources/views/livewire/concerts/concert-show.blade.php new file mode 100644 index 0000000..f7ba49c --- /dev/null +++ b/resources/views/livewire/concerts/concert-show.blade.php @@ -0,0 +1,283 @@ +
    +
    +
    + +
    +
    + +
    +
    + {{-- Flash Messages --}} + @if (session()->has('message')) +
    + + + +

    {{ session('message') }}

    +
    + @endif + @if (session()->has('error')) +
    + + + +

    {{ session('error') }}

    +
    + @endif + +
    + {{-- Cover --}} +
    +
    + @if($concert->cover_url) + Cover for {{ $concert->artist }} + @else + + @endif +
    +
    + + {{-- Concert Details --}} +
    +

    {{ $concert->artist }}

    + @if($concert->venue || $concert->city || $concert->country) +

    + {{ collect([$concert->venue, $concert->city, $concert->country])->filter()->implode(', ') }} +

    + @endif + + {{-- Status, Rating & Actions --}} +
    + {{-- Status Badge --}} + + {{ $concert->status->label() }} + + + {{-- Rating (1-10 numbered buttons) --}} +
    + @for($i = 1; $i <= 10; $i++) + + @endfor +
    + +
    + + {{-- Edit & Delete --}} + + Edit + + +
    + + {{-- Metadata Grid --}} +
    + @if($concert->event_date) +
    +
    Event Date
    +
    {{ $concert->event_date->format('F j, Y') }}
    +
    + @endif + + @if($concert->tour_name) +
    +
    Tour
    +
    {{ $concert->tour_name }}
    +
    + @endif + + @if($concert->venue) +
    +
    Venue
    +
    {{ $concert->venue }}
    +
    + @endif + + @if($concert->city) +
    +
    City
    +
    + {{ $concert->city }}{{ $concert->country ? ', ' . $concert->country : '' }} +
    +
    + @endif + + @if($concert->rating) +
    +
    Your Rating
    +
    {{ $concert->rating }}/10
    +
    + @endif + + @if($concert->setlist_fm_id) +
    +
    Setlist.fm
    +
    + + View on setlist.fm + + +
    +
    + @endif + +
    +
    Added to Library
    +
    {{ $concert->created_at->format('F j, Y') }}
    +
    +
    + + {{-- Notes --}} + @if($concert->notes) +
    +

    My Notes

    +
    + {!! nl2br(e($concert->notes)) !!} +
    +
    + @endif + + {{-- Setlist --}} + @if(!empty($concert->setlist)) + @php + $songs = is_string($concert->setlist) ? json_decode($concert->setlist, true) : $concert->setlist; + $mainSet = collect($songs)->where('encore', false)->where('tape', false)->values(); + $encores = collect($songs)->where('encore', true)->values(); + $tapes = collect($songs)->where('tape', true)->values(); + @endphp +
    +

    Setlist

    +

    {{ count($songs) }} song{{ count($songs) !== 1 ? 's' : '' }}

    + + {{-- Main set --}} + @if($mainSet->isNotEmpty()) +
      + @foreach($mainSet as $index => $song) +
    1. + {{ $index + 1 }} +
      + {{ $song['name'] }} + @if(!empty($song['cover'])) + (cover{{ !empty($song['with']) ? ' with ' . $song['with'] : '' }}) + @elseif(!empty($song['with'])) + (with {{ $song['with'] }}) + @endif +
      +
    2. + @endforeach +
    + @endif + + {{-- Tapes --}} + @if($tapes->isNotEmpty()) +
    +

    Tape

    +
      + @foreach($tapes as $index => $song) +
    1. + {{ $index + 1 }} +
      + {{ $song['name'] }} + tape +
      +
    2. + @endforeach +
    +
    + @endif + + {{-- Encores --}} + @if($encores->isNotEmpty()) +
    +

    Encore

    +
      + @foreach($encores as $index => $song) +
    1. + {{ $index + 1 }} +
      + {{ $song['name'] }} + encore + @if(!empty($song['cover'])) + (cover{{ !empty($song['with']) ? ' with ' . $song['with'] : '' }}) + @elseif(!empty($song['with'])) + (with {{ $song['with'] }}) + @endif +
      +
    2. + @endforeach +
    +
    + @endif +
    + @endif +
    +
    +
    +
    +
    diff --git a/resources/views/livewire/dashboard.blade.php b/resources/views/livewire/dashboard.blade.php index b78b47d..29e21ad 100644 --- a/resources/views/livewire/dashboard.blade.php +++ b/resources/views/livewire/dashboard.blade.php @@ -19,20 +19,29 @@ class="relative flex flex-col items-center rounded-lg border-2 border-theme-acce >
    @if($category['icon'] === 'film') -
    @@ -56,6 +65,18 @@ class="relative flex flex-col items-center rounded-lg border-2 border-theme-acce · {{ $playingStats['currently_playing'] }} playing @endif + @elseif($category['name'] === 'Listening' && ($listeningStats['total_concerts'] > 0 || $listeningStats['total_albums'] > 0)) +
    + @if($listeningStats['total_concerts'] > 0) + {{ $listeningStats['total_concerts'] }} concerts + @endif + @if($listeningStats['total_albums'] > 0) + {{ $listeningStats['total_albums'] }} albums + @endif + @if($listeningStats['upcoming'] > 0) + · {{ $listeningStats['upcoming'] }} upcoming + @endif +
    @elseif($category['name'] === 'Reading' && ($readingStats['total_books'] > 0 || $readingStats['total_comics'] > 0))
    @if($readingStats['total_books'] > 0) @@ -70,29 +91,6 @@ class="relative flex flex-col items-center rounded-lg border-2 border-theme-acce
    @endif - @else -
    -
    - @if($category['icon'] === 'puzzle-piece') - - @elseif($category['icon'] === 'musical-note') - - @endif -
    -

    {{ $category['name'] }}

    -

    {{ $category['description'] }}

    - - Coming Soon - -
    @endif @endforeach diff --git a/resources/views/livewire/layout/navigation.blade.php b/resources/views/livewire/layout/navigation.blade.php index 60a2f35..3281303 100644 --- a/resources/views/livewire/layout/navigation.blade.php +++ b/resources/views/livewire/layout/navigation.blade.php @@ -61,12 +61,12 @@ public function logout(Logout $logout): void - + - + + + + - +
    - Playing + Reading
    - - {{ __('All Playing') }} + + {{ __('All Reading') }} - - {{ __('Games') }} + + {{ __('Books') }} - - {{ __('Board Games') }} + + {{ __('Comics') }}
    - +
    - Reading + Listening
    - - {{ __('All Reading') }} + + {{ __('All Listening') }} - - {{ __('Books') }} + + {{ __('Live') }} - - {{ __('Comics') }} + + {{ __('Collection') }} + +
    +
    + + +
    +
    + Playing +
    +
    + + {{ __('All Playing') }} + + + {{ __('Games') }} + + + {{ __('Board Games') }}
    diff --git a/resources/views/livewire/listening/listening-index.blade.php b/resources/views/livewire/listening/listening-index.blade.php new file mode 100644 index 0000000..21f2955 --- /dev/null +++ b/resources/views/livewire/listening/listening-index.blade.php @@ -0,0 +1,63 @@ +
    +
    +
    + +

    + Listening +

    +
    +
    + +
    + +
    +
    diff --git a/resources/views/livewire/playing/playing-index.blade.php b/resources/views/livewire/playing/playing-index.blade.php index 2f75bff..2805d64 100644 --- a/resources/views/livewire/playing/playing-index.blade.php +++ b/resources/views/livewire/playing/playing-index.blade.php @@ -39,18 +39,18 @@ class="relative flex flex-col items-center rounded-lg border-2 border-theme-acce role="listitem" >
    - @if($category['icon'] === 'dice') -
    diff --git a/routes/web.php b/routes/web.php index 8b3c42b..bbdf797 100644 --- a/routes/web.php +++ b/routes/web.php @@ -30,6 +30,15 @@ use App\Livewire\Games\GameIgdbSearch; use App\Livewire\Games\GameIndex; use App\Livewire\Games\GameShow; +use App\Livewire\Albums\AlbumDiscogsSearch; +use App\Livewire\Albums\AlbumForm; +use App\Livewire\Albums\AlbumIndex; +use App\Livewire\Albums\AlbumShow; +use App\Livewire\Concerts\ConcertForm; +use App\Livewire\Concerts\ConcertIndex; +use App\Livewire\Concerts\ConcertSetlistFmSearch; +use App\Livewire\Concerts\ConcertShow; +use App\Livewire\Listening\ListeningIndex; use App\Livewire\Playing\PlayingIndex; use App\Livewire\Reading\ReadingIndex; use App\Livewire\Watching\WatchingIndex; @@ -103,6 +112,27 @@ Route::get('/{boardGame}/edit', BoardGameForm::class)->name('edit'); }); + // Listening category + Route::get('listening', ListeningIndex::class)->name('listening.index'); + + // Concerts (Live) + Route::prefix('concerts')->name('concerts.')->group(function () { + Route::get('/', ConcertIndex::class)->name('index'); + Route::get('/create', ConcertForm::class)->name('create'); + Route::get('/discover', ConcertSetlistFmSearch::class)->name('discover'); + Route::get('/{concert}', ConcertShow::class)->name('show'); + Route::get('/{concert}/edit', ConcertForm::class)->name('edit'); + }); + + // Albums (Collection) + Route::prefix('albums')->name('albums.')->group(function () { + Route::get('/', AlbumIndex::class)->name('index'); + Route::get('/create', AlbumForm::class)->name('create'); + Route::get('/discover', AlbumDiscogsSearch::class)->name('discover'); + Route::get('/{album}', AlbumShow::class)->name('show'); + Route::get('/{album}/edit', AlbumForm::class)->name('edit'); + }); + // Comics Route::prefix('comics')->name('comics.')->group(function () { Route::get('/', \App\Livewire\Comics\ComicIndex::class)->name('index'); From d619e90097a94f60b7cd8488bb9b94ca6b6c34fc Mon Sep 17 00:00:00 2001 From: dotMavriQ Date: Sat, 28 Mar 2026 16:51:48 +0000 Subject: [PATCH 16/77] fix: update commonmark, phpunit, psysh, pest for security advisories; fix stale dashboard test --- composer.lock | 270 +++++++++++++++++--------------- tests/Feature/DashboardTest.php | 7 +- 2 files changed, 145 insertions(+), 132 deletions(-) diff --git a/composer.lock b/composer.lock index 5f7dfb6..885f28d 100644 --- a/composer.lock +++ b/composer.lock @@ -1784,16 +1784,16 @@ }, { "name": "league/commonmark", - "version": "2.8.0", + "version": "2.8.2", "source": { "type": "git", "url": "https://github.com/thephpleague/commonmark.git", - "reference": "4efa10c1e56488e658d10adf7b7b7dcd19940bfb" + "reference": "59fb075d2101740c337c7216e3f32b36c204218b" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/thephpleague/commonmark/zipball/4efa10c1e56488e658d10adf7b7b7dcd19940bfb", - "reference": "4efa10c1e56488e658d10adf7b7b7dcd19940bfb", + "url": "https://api.github.com/repos/thephpleague/commonmark/zipball/59fb075d2101740c337c7216e3f32b36c204218b", + "reference": "59fb075d2101740c337c7216e3f32b36c204218b", "shasum": "" }, "require": { @@ -1818,9 +1818,9 @@ "phpstan/phpstan": "^1.8.2", "phpunit/phpunit": "^9.5.21 || ^10.5.9 || ^11.0.0", "scrutinizer/ocular": "^1.8.1", - "symfony/finder": "^5.3 | ^6.0 | ^7.0", - "symfony/process": "^5.4 | ^6.0 | ^7.0", - "symfony/yaml": "^2.3 | ^3.0 | ^4.0 | ^5.0 | ^6.0 | ^7.0", + "symfony/finder": "^5.3 | ^6.0 | ^7.0 || ^8.0", + "symfony/process": "^5.4 | ^6.0 | ^7.0 || ^8.0", + "symfony/yaml": "^2.3 | ^3.0 | ^4.0 | ^5.0 | ^6.0 | ^7.0 || ^8.0", "unleashedtech/php-coding-standard": "^3.1.1", "vimeo/psalm": "^4.24.0 || ^5.0.0 || ^6.0.0" }, @@ -1887,7 +1887,7 @@ "type": "tidelift" } ], - "time": "2025-11-26T21:48:24+00:00" + "time": "2026-03-19T13:16:38+00:00" }, { "name": "league/config", @@ -3488,16 +3488,16 @@ }, { "name": "psy/psysh", - "version": "v0.12.18", + "version": "v0.12.22", "source": { "type": "git", "url": "https://github.com/bobthecow/psysh.git", - "reference": "ddff0ac01beddc251786fe70367cd8bbdb258196" + "reference": "3be75d5b9244936dd4ac62ade2bfb004d13acf0f" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/bobthecow/psysh/zipball/ddff0ac01beddc251786fe70367cd8bbdb258196", - "reference": "ddff0ac01beddc251786fe70367cd8bbdb258196", + "url": "https://api.github.com/repos/bobthecow/psysh/zipball/3be75d5b9244936dd4ac62ade2bfb004d13acf0f", + "reference": "3be75d5b9244936dd4ac62ade2bfb004d13acf0f", "shasum": "" }, "require": { @@ -3561,9 +3561,9 @@ ], "support": { "issues": "https://github.com/bobthecow/psysh/issues", - "source": "https://github.com/bobthecow/psysh/tree/v0.12.18" + "source": "https://github.com/bobthecow/psysh/tree/v0.12.22" }, - "time": "2025-12-17T14:35:46+00:00" + "time": "2026-03-22T23:03:24+00:00" }, { "name": "ralouphie/getallheaders", @@ -4041,16 +4041,16 @@ }, { "name": "symfony/console", - "version": "v7.4.6", + "version": "v7.4.7", "source": { "type": "git", "url": "https://github.com/symfony/console.git", - "reference": "6d643a93b47398599124022eb24d97c153c12f27" + "reference": "e1e6770440fb9c9b0cf725f81d1361ad1835329d" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/console/zipball/6d643a93b47398599124022eb24d97c153c12f27", - "reference": "6d643a93b47398599124022eb24d97c153c12f27", + "url": "https://api.github.com/repos/symfony/console/zipball/e1e6770440fb9c9b0cf725f81d1361ad1835329d", + "reference": "e1e6770440fb9c9b0cf725f81d1361ad1835329d", "shasum": "" }, "require": { @@ -4115,7 +4115,7 @@ "terminal" ], "support": { - "source": "https://github.com/symfony/console/tree/v7.4.6" + "source": "https://github.com/symfony/console/tree/v7.4.7" }, "funding": [ { @@ -4135,7 +4135,7 @@ "type": "tidelift" } ], - "time": "2026-02-25T17:02:47+00:00" + "time": "2026-03-06T14:06:20+00:00" }, { "name": "symfony/css-selector", @@ -6759,16 +6759,16 @@ "packages-dev": [ { "name": "brianium/paratest", - "version": "v7.8.4", + "version": "v7.8.5", "source": { "type": "git", "url": "https://github.com/paratestphp/paratest.git", - "reference": "130a9bf0e269ee5f5b320108f794ad03e275cad4" + "reference": "9b324c8fc319cf9728b581c7a90e1c8f6361c5e5" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/paratestphp/paratest/zipball/130a9bf0e269ee5f5b320108f794ad03e275cad4", - "reference": "130a9bf0e269ee5f5b320108f794ad03e275cad4", + "url": "https://api.github.com/repos/paratestphp/paratest/zipball/9b324c8fc319cf9728b581c7a90e1c8f6361c5e5", + "reference": "9b324c8fc319cf9728b581c7a90e1c8f6361c5e5", "shasum": "" }, "require": { @@ -6776,27 +6776,27 @@ "ext-pcre": "*", "ext-reflection": "*", "ext-simplexml": "*", - "fidry/cpu-core-counter": "^1.2.0", + "fidry/cpu-core-counter": "^1.3.0", "jean85/pretty-package-versions": "^2.1.1", - "php": "~8.2.0 || ~8.3.0 || ~8.4.0", - "phpunit/php-code-coverage": "^11.0.10", + "php": "~8.2.0 || ~8.3.0 || ~8.4.0 || ~8.5.0", + "phpunit/php-code-coverage": "^11.0.12", "phpunit/php-file-iterator": "^5.1.0", "phpunit/php-timer": "^7.0.1", - "phpunit/phpunit": "^11.5.24", + "phpunit/phpunit": "^11.5.46", "sebastian/environment": "^7.2.1", - "symfony/console": "^6.4.22 || ^7.3.0", - "symfony/process": "^6.4.20 || ^7.3.0" + "symfony/console": "^6.4.22 || ^7.3.4 || ^8.0.3", + "symfony/process": "^6.4.20 || ^7.3.4 || ^8.0.3" }, "require-dev": { "doctrine/coding-standard": "^12.0.0", "ext-pcov": "*", "ext-posix": "*", - "phpstan/phpstan": "^2.1.17", + "phpstan/phpstan": "^2.1.33", "phpstan/phpstan-deprecation-rules": "^2.0.3", - "phpstan/phpstan-phpunit": "^2.0.6", - "phpstan/phpstan-strict-rules": "^2.0.4", - "squizlabs/php_codesniffer": "^3.13.2", - "symfony/filesystem": "^6.4.13 || ^7.3.0" + "phpstan/phpstan-phpunit": "^2.0.11", + "phpstan/phpstan-strict-rules": "^2.0.7", + "squizlabs/php_codesniffer": "^3.13.5", + "symfony/filesystem": "^6.4.13 || ^7.3.2 || ^8.0.1" }, "bin": [ "bin/paratest", @@ -6836,7 +6836,7 @@ ], "support": { "issues": "https://github.com/paratestphp/paratest/issues", - "source": "https://github.com/paratestphp/paratest/tree/v7.8.4" + "source": "https://github.com/paratestphp/paratest/tree/v7.8.5" }, "funding": [ { @@ -6848,7 +6848,7 @@ "type": "paypal" } ], - "time": "2025-06-23T06:07:21+00:00" + "time": "2026-01-08T08:02:38+00:00" }, { "name": "doctrine/deprecations", @@ -7619,39 +7619,36 @@ }, { "name": "nunomaduro/collision", - "version": "v8.8.3", + "version": "v8.9.1", "source": { "type": "git", "url": "https://github.com/nunomaduro/collision.git", - "reference": "1dc9e88d105699d0fee8bb18890f41b274f6b4c4" + "reference": "a1ed3fa530fd60bc515f9303e8520fcb7d4bd935" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/nunomaduro/collision/zipball/1dc9e88d105699d0fee8bb18890f41b274f6b4c4", - "reference": "1dc9e88d105699d0fee8bb18890f41b274f6b4c4", + "url": "https://api.github.com/repos/nunomaduro/collision/zipball/a1ed3fa530fd60bc515f9303e8520fcb7d4bd935", + "reference": "a1ed3fa530fd60bc515f9303e8520fcb7d4bd935", "shasum": "" }, "require": { - "filp/whoops": "^2.18.1", - "nunomaduro/termwind": "^2.3.1", + "filp/whoops": "^2.18.4", + "nunomaduro/termwind": "^2.4.0", "php": "^8.2.0", - "symfony/console": "^7.3.0" + "symfony/console": "^7.4.4 || ^8.0.4" }, "conflict": { - "laravel/framework": "<11.44.2 || >=13.0.0", - "phpunit/phpunit": "<11.5.15 || >=13.0.0" + "laravel/framework": "<11.48.0 || >=14.0.0", + "phpunit/phpunit": "<11.5.50 || >=14.0.0" }, "require-dev": { - "brianium/paratest": "^7.8.3", - "larastan/larastan": "^3.4.2", - "laravel/framework": "^11.44.2 || ^12.18", - "laravel/pint": "^1.22.1", - "laravel/sail": "^1.43.1", - "laravel/sanctum": "^4.1.1", - "laravel/tinker": "^2.10.1", - "orchestra/testbench-core": "^9.12.0 || ^10.4", - "pestphp/pest": "^3.8.2 || ^4.0.0", - "sebastian/environment": "^7.2.1 || ^8.0" + "brianium/paratest": "^7.8.5", + "larastan/larastan": "^3.9.2", + "laravel/framework": "^11.48.0 || ^12.52.0", + "laravel/pint": "^1.27.1", + "orchestra/testbench-core": "^9.12.0 || ^10.9.0", + "pestphp/pest": "^3.8.5 || ^4.4.1 || ^5.0.0", + "sebastian/environment": "^7.2.1 || ^8.0.3 || ^9.0.0" }, "type": "library", "extra": { @@ -7714,42 +7711,42 @@ "type": "patreon" } ], - "time": "2025-11-20T02:55:25+00:00" + "time": "2026-02-17T17:33:08+00:00" }, { "name": "pestphp/pest", - "version": "v3.8.4", + "version": "v3.8.6", "source": { "type": "git", "url": "https://github.com/pestphp/pest.git", - "reference": "72cf695554420e21858cda831d5db193db102574" + "reference": "8871a6f5ef1de8e7c8dee2a270991449a7b6af73" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/pestphp/pest/zipball/72cf695554420e21858cda831d5db193db102574", - "reference": "72cf695554420e21858cda831d5db193db102574", + "url": "https://api.github.com/repos/pestphp/pest/zipball/8871a6f5ef1de8e7c8dee2a270991449a7b6af73", + "reference": "8871a6f5ef1de8e7c8dee2a270991449a7b6af73", "shasum": "" }, "require": { - "brianium/paratest": "^7.8.4", - "nunomaduro/collision": "^8.8.2", - "nunomaduro/termwind": "^2.3.1", + "brianium/paratest": "^7.8.5", + "nunomaduro/collision": "^8.9.1", + "nunomaduro/termwind": "^2.4.0", "pestphp/pest-plugin": "^3.0.0", "pestphp/pest-plugin-arch": "^3.1.1", "pestphp/pest-plugin-mutate": "^3.0.5", "php": "^8.2.0", - "phpunit/phpunit": "^11.5.33" + "phpunit/phpunit": "^11.5.50" }, "conflict": { "filp/whoops": "<2.16.0", - "phpunit/phpunit": ">11.5.33", + "phpunit/phpunit": ">11.5.50", "sebastian/exporter": "<6.0.0", "webmozart/assert": "<1.11.0" }, "require-dev": { "pestphp/pest-dev-tools": "^3.4.0", "pestphp/pest-plugin-type-coverage": "^3.6.1", - "symfony/process": "^7.3.0" + "symfony/process": "^7.4.5" }, "bin": [ "bin/pest" @@ -7814,7 +7811,7 @@ ], "support": { "issues": "https://github.com/pestphp/pest/issues", - "source": "https://github.com/pestphp/pest/tree/v3.8.4" + "source": "https://github.com/pestphp/pest/tree/v3.8.6" }, "funding": [ { @@ -7826,7 +7823,7 @@ "type": "github" } ], - "time": "2025-08-20T19:12:42+00:00" + "time": "2026-03-10T21:04:33+00:00" }, { "name": "pestphp/pest-plugin", @@ -8287,16 +8284,16 @@ }, { "name": "phpdocumentor/reflection-docblock", - "version": "5.6.6", + "version": "6.0.3", "source": { "type": "git", "url": "https://github.com/phpDocumentor/ReflectionDocBlock.git", - "reference": "5cee1d3dfc2d2aa6599834520911d246f656bcb8" + "reference": "7bae67520aa9f5ecc506d646810bd40d9da54582" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/phpDocumentor/ReflectionDocBlock/zipball/5cee1d3dfc2d2aa6599834520911d246f656bcb8", - "reference": "5cee1d3dfc2d2aa6599834520911d246f656bcb8", + "url": "https://api.github.com/repos/phpDocumentor/ReflectionDocBlock/zipball/7bae67520aa9f5ecc506d646810bd40d9da54582", + "reference": "7bae67520aa9f5ecc506d646810bd40d9da54582", "shasum": "" }, "require": { @@ -8304,8 +8301,8 @@ "ext-filter": "*", "php": "^7.4 || ^8.0", "phpdocumentor/reflection-common": "^2.2", - "phpdocumentor/type-resolver": "^1.7", - "phpstan/phpdoc-parser": "^1.7|^2.0", + "phpdocumentor/type-resolver": "^2.0", + "phpstan/phpdoc-parser": "^2.0", "webmozart/assert": "^1.9.1 || ^2" }, "require-dev": { @@ -8315,7 +8312,8 @@ "phpstan/phpstan-mockery": "^1.1", "phpstan/phpstan-webmozart-assert": "^1.2", "phpunit/phpunit": "^9.5", - "psalm/phar": "^5.26" + "psalm/phar": "^5.26", + "shipmonk/dead-code-detector": "^0.5.1" }, "type": "library", "extra": { @@ -8345,44 +8343,44 @@ "description": "With this component, a library can provide support for annotations via DocBlocks or otherwise retrieve information that is embedded in a DocBlock.", "support": { "issues": "https://github.com/phpDocumentor/ReflectionDocBlock/issues", - "source": "https://github.com/phpDocumentor/ReflectionDocBlock/tree/5.6.6" + "source": "https://github.com/phpDocumentor/ReflectionDocBlock/tree/6.0.3" }, - "time": "2025-12-22T21:13:58+00:00" + "time": "2026-03-18T20:49:53+00:00" }, { "name": "phpdocumentor/type-resolver", - "version": "1.12.0", + "version": "2.0.0", "source": { "type": "git", "url": "https://github.com/phpDocumentor/TypeResolver.git", - "reference": "92a98ada2b93d9b201a613cb5a33584dde25f195" + "reference": "327a05bbee54120d4786a0dc67aad30226ad4cf9" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/phpDocumentor/TypeResolver/zipball/92a98ada2b93d9b201a613cb5a33584dde25f195", - "reference": "92a98ada2b93d9b201a613cb5a33584dde25f195", + "url": "https://api.github.com/repos/phpDocumentor/TypeResolver/zipball/327a05bbee54120d4786a0dc67aad30226ad4cf9", + "reference": "327a05bbee54120d4786a0dc67aad30226ad4cf9", "shasum": "" }, "require": { "doctrine/deprecations": "^1.0", - "php": "^7.3 || ^8.0", + "php": "^7.4 || ^8.0", "phpdocumentor/reflection-common": "^2.0", - "phpstan/phpdoc-parser": "^1.18|^2.0" + "phpstan/phpdoc-parser": "^2.0" }, "require-dev": { "ext-tokenizer": "*", "phpbench/phpbench": "^1.2", - "phpstan/extension-installer": "^1.1", - "phpstan/phpstan": "^1.8", - "phpstan/phpstan-phpunit": "^1.1", + "phpstan/extension-installer": "^1.4", + "phpstan/phpstan": "^2.1", + "phpstan/phpstan-phpunit": "^2.0", "phpunit/phpunit": "^9.5", - "rector/rector": "^0.13.9", - "vimeo/psalm": "^4.25" + "psalm/phar": "^4" }, "type": "library", "extra": { "branch-alias": { - "dev-1.x": "1.x-dev" + "dev-1.x": "1.x-dev", + "dev-2.x": "2.x-dev" } }, "autoload": { @@ -8403,22 +8401,22 @@ "description": "A PSR-5 based resolver of Class names, Types and Structural Element Names", "support": { "issues": "https://github.com/phpDocumentor/TypeResolver/issues", - "source": "https://github.com/phpDocumentor/TypeResolver/tree/1.12.0" + "source": "https://github.com/phpDocumentor/TypeResolver/tree/2.0.0" }, - "time": "2025-11-21T15:09:14+00:00" + "time": "2026-01-06T21:53:42+00:00" }, { "name": "phpstan/phpdoc-parser", - "version": "2.3.1", + "version": "2.3.2", "source": { "type": "git", "url": "https://github.com/phpstan/phpdoc-parser.git", - "reference": "16dbf9937da8d4528ceb2145c9c7c0bd29e26374" + "reference": "a004701b11273a26cd7955a61d67a7f1e525a45a" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/phpstan/phpdoc-parser/zipball/16dbf9937da8d4528ceb2145c9c7c0bd29e26374", - "reference": "16dbf9937da8d4528ceb2145c9c7c0bd29e26374", + "url": "https://api.github.com/repos/phpstan/phpdoc-parser/zipball/a004701b11273a26cd7955a61d67a7f1e525a45a", + "reference": "a004701b11273a26cd7955a61d67a7f1e525a45a", "shasum": "" }, "require": { @@ -8450,9 +8448,9 @@ "description": "PHPDoc parser with support for nullable, intersection and generic types", "support": { "issues": "https://github.com/phpstan/phpdoc-parser/issues", - "source": "https://github.com/phpstan/phpdoc-parser/tree/2.3.1" + "source": "https://github.com/phpstan/phpdoc-parser/tree/2.3.2" }, - "time": "2026-01-12T11:33:04+00:00" + "time": "2026-01-25T14:56:51+00:00" }, { "name": "phpunit/php-code-coverage", @@ -8546,28 +8544,28 @@ }, { "name": "phpunit/php-file-iterator", - "version": "5.1.0", + "version": "5.1.1", "source": { "type": "git", "url": "https://github.com/sebastianbergmann/php-file-iterator.git", - "reference": "118cfaaa8bc5aef3287bf315b6060b1174754af6" + "reference": "2f3a64888c814fc235386b7387dd5b5ed92ad903" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/sebastianbergmann/php-file-iterator/zipball/118cfaaa8bc5aef3287bf315b6060b1174754af6", - "reference": "118cfaaa8bc5aef3287bf315b6060b1174754af6", + "url": "https://api.github.com/repos/sebastianbergmann/php-file-iterator/zipball/2f3a64888c814fc235386b7387dd5b5ed92ad903", + "reference": "2f3a64888c814fc235386b7387dd5b5ed92ad903", "shasum": "" }, "require": { "php": ">=8.2" }, "require-dev": { - "phpunit/phpunit": "^11.0" + "phpunit/phpunit": "^11.3" }, "type": "library", "extra": { "branch-alias": { - "dev-main": "5.0-dev" + "dev-main": "5.1-dev" } }, "autoload": { @@ -8595,15 +8593,27 @@ "support": { "issues": "https://github.com/sebastianbergmann/php-file-iterator/issues", "security": "https://github.com/sebastianbergmann/php-file-iterator/security/policy", - "source": "https://github.com/sebastianbergmann/php-file-iterator/tree/5.1.0" + "source": "https://github.com/sebastianbergmann/php-file-iterator/tree/5.1.1" }, "funding": [ { "url": "https://github.com/sebastianbergmann", "type": "github" + }, + { + "url": "https://liberapay.com/sebastianbergmann", + "type": "liberapay" + }, + { + "url": "https://thanks.dev/u/gh/sebastianbergmann", + "type": "thanks_dev" + }, + { + "url": "https://tidelift.com/funding/github/packagist/phpunit/php-file-iterator", + "type": "tidelift" } ], - "time": "2024-08-27T05:02:59+00:00" + "time": "2026-02-02T13:52:54+00:00" }, { "name": "phpunit/php-invoker", @@ -8791,16 +8801,16 @@ }, { "name": "phpunit/phpunit", - "version": "11.5.33", + "version": "11.5.50", "source": { "type": "git", "url": "https://github.com/sebastianbergmann/phpunit.git", - "reference": "5965e9ff57546cb9137c0ff6aa78cb7442b05cf6" + "reference": "fdfc727f0fcacfeb8fcb30c7e5da173125b58be3" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/sebastianbergmann/phpunit/zipball/5965e9ff57546cb9137c0ff6aa78cb7442b05cf6", - "reference": "5965e9ff57546cb9137c0ff6aa78cb7442b05cf6", + "url": "https://api.github.com/repos/sebastianbergmann/phpunit/zipball/fdfc727f0fcacfeb8fcb30c7e5da173125b58be3", + "reference": "fdfc727f0fcacfeb8fcb30c7e5da173125b58be3", "shasum": "" }, "require": { @@ -8814,17 +8824,17 @@ "phar-io/manifest": "^2.0.4", "phar-io/version": "^3.2.1", "php": ">=8.2", - "phpunit/php-code-coverage": "^11.0.10", + "phpunit/php-code-coverage": "^11.0.12", "phpunit/php-file-iterator": "^5.1.0", "phpunit/php-invoker": "^5.0.1", "phpunit/php-text-template": "^4.0.1", "phpunit/php-timer": "^7.0.1", "sebastian/cli-parser": "^3.0.2", "sebastian/code-unit": "^3.0.3", - "sebastian/comparator": "^6.3.2", + "sebastian/comparator": "^6.3.3", "sebastian/diff": "^6.0.2", "sebastian/environment": "^7.2.1", - "sebastian/exporter": "^6.3.0", + "sebastian/exporter": "^6.3.2", "sebastian/global-state": "^7.0.2", "sebastian/object-enumerator": "^6.0.1", "sebastian/type": "^5.1.3", @@ -8872,7 +8882,7 @@ "support": { "issues": "https://github.com/sebastianbergmann/phpunit/issues", "security": "https://github.com/sebastianbergmann/phpunit/security/policy", - "source": "https://github.com/sebastianbergmann/phpunit/tree/11.5.33" + "source": "https://github.com/sebastianbergmann/phpunit/tree/11.5.50" }, "funding": [ { @@ -8896,7 +8906,7 @@ "type": "tidelift" } ], - "time": "2025-08-16T05:19:02+00:00" + "time": "2026-01-27T05:59:18+00:00" }, { "name": "sebastian/cli-parser", @@ -9070,16 +9080,16 @@ }, { "name": "sebastian/comparator", - "version": "6.3.2", + "version": "6.3.3", "source": { "type": "git", "url": "https://github.com/sebastianbergmann/comparator.git", - "reference": "85c77556683e6eee4323e4c5468641ca0237e2e8" + "reference": "2c95e1e86cb8dd41beb8d502057d1081ccc8eca9" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/sebastianbergmann/comparator/zipball/85c77556683e6eee4323e4c5468641ca0237e2e8", - "reference": "85c77556683e6eee4323e4c5468641ca0237e2e8", + "url": "https://api.github.com/repos/sebastianbergmann/comparator/zipball/2c95e1e86cb8dd41beb8d502057d1081ccc8eca9", + "reference": "2c95e1e86cb8dd41beb8d502057d1081ccc8eca9", "shasum": "" }, "require": { @@ -9138,7 +9148,7 @@ "support": { "issues": "https://github.com/sebastianbergmann/comparator/issues", "security": "https://github.com/sebastianbergmann/comparator/security/policy", - "source": "https://github.com/sebastianbergmann/comparator/tree/6.3.2" + "source": "https://github.com/sebastianbergmann/comparator/tree/6.3.3" }, "funding": [ { @@ -9158,7 +9168,7 @@ "type": "tidelift" } ], - "time": "2025-08-10T08:07:46+00:00" + "time": "2026-01-24T09:26:40+00:00" }, { "name": "sebastian/complexity", @@ -10014,24 +10024,24 @@ }, { "name": "ta-tikoma/phpunit-architecture-test", - "version": "0.8.5", + "version": "0.8.7", "source": { "type": "git", "url": "https://github.com/ta-tikoma/phpunit-architecture-test.git", - "reference": "cf6fb197b676ba716837c886baca842e4db29005" + "reference": "1248f3f506ca9641d4f68cebcd538fa489754db8" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/ta-tikoma/phpunit-architecture-test/zipball/cf6fb197b676ba716837c886baca842e4db29005", - "reference": "cf6fb197b676ba716837c886baca842e4db29005", + "url": "https://api.github.com/repos/ta-tikoma/phpunit-architecture-test/zipball/1248f3f506ca9641d4f68cebcd538fa489754db8", + "reference": "1248f3f506ca9641d4f68cebcd538fa489754db8", "shasum": "" }, "require": { "nikic/php-parser": "^4.18.0 || ^5.0.0", "php": "^8.1.0", - "phpdocumentor/reflection-docblock": "^5.3.0", - "phpunit/phpunit": "^10.5.5 || ^11.0.0 || ^12.0.0", - "symfony/finder": "^6.4.0 || ^7.0.0" + "phpdocumentor/reflection-docblock": "^5.3.0 || ^6.0.0", + "phpunit/phpunit": "^10.5.5 || ^11.0.0 || ^12.0.0 || ^13.0.0", + "symfony/finder": "^6.4.0 || ^7.0.0 || ^8.0.0" }, "require-dev": { "laravel/pint": "^1.13.7", @@ -10067,9 +10077,9 @@ ], "support": { "issues": "https://github.com/ta-tikoma/phpunit-architecture-test/issues", - "source": "https://github.com/ta-tikoma/phpunit-architecture-test/tree/0.8.5" + "source": "https://github.com/ta-tikoma/phpunit-architecture-test/tree/0.8.7" }, - "time": "2025-04-20T20:23:40+00:00" + "time": "2026-02-17T17:25:14+00:00" }, { "name": "theseer/tokenizer", diff --git a/tests/Feature/DashboardTest.php b/tests/Feature/DashboardTest.php index 4c3bfcf..ec4402c 100644 --- a/tests/Feature/DashboardTest.php +++ b/tests/Feature/DashboardTest.php @@ -30,8 +30,11 @@ ->assertSee('Listening'); }); -it('shows inactive categories as coming soon', function () { +it('shows all four category cards as active links', function () { Livewire::actingAs($this->user) ->test(Dashboard::class) - ->assertSee('Coming Soon'); + ->assertSee('Watching') + ->assertSee('Reading') + ->assertSee('Playing') + ->assertSee('Listening'); }); From a9b193d92ba705022af2d0219c6a44d090c790d0 Mon Sep 17 00:00:00 2001 From: dotMavriQ Date: Sat, 28 Mar 2026 17:22:26 +0000 Subject: [PATCH 17/77] refactor: extract WithIndexFiltering trait from 8 index components --- app/Livewire/Albums/AlbumIndex.php | 26 +--------- app/Livewire/Anime/AnimeIndex.php | 31 +----------- app/Livewire/BoardGames/BoardGameIndex.php | 26 +--------- app/Livewire/Books/BookIndex.php | 31 +----------- app/Livewire/Comics/ComicIndex.php | 31 +----------- app/Livewire/Concerns/WithIndexFiltering.php | 50 ++++++++++++++++++++ app/Livewire/Concerts/ConcertIndex.php | 30 +++--------- app/Livewire/Games/GameIndex.php | 31 +----------- app/Livewire/Movies/MovieIndex.php | 31 +----------- 9 files changed, 70 insertions(+), 217 deletions(-) create mode 100644 app/Livewire/Concerns/WithIndexFiltering.php diff --git a/app/Livewire/Albums/AlbumIndex.php b/app/Livewire/Albums/AlbumIndex.php index ec3f206..1540464 100644 --- a/app/Livewire/Albums/AlbumIndex.php +++ b/app/Livewire/Albums/AlbumIndex.php @@ -6,6 +6,7 @@ use App\Enums\CollectionStatus; use App\Livewire\Concerns\WithAccentInsensitiveSearch; +use App\Livewire\Concerns\WithIndexFiltering; use App\Models\Album; use Illuminate\Support\Facades\Auth; use Livewire\Component; @@ -14,6 +15,7 @@ class AlbumIndex extends Component { use WithAccentInsensitiveSearch; + use WithIndexFiltering; use WithPagination; public string $search = ''; @@ -52,30 +54,6 @@ public function updatingStatus(): void $this->resetPage(); } - public function setViewMode(string $mode): void - { - $this->viewMode = in_array($mode, ['gallery', 'list']) ? $mode : 'gallery'; - } - - public function sort(string $column): void - { - if ($this->sortBy === $column) { - $this->sortDirection = $this->sortDirection === 'asc' ? 'desc' : 'asc'; - } else { - $this->sortBy = $column; - $this->sortDirection = 'asc'; - } - } - - private function safeSortDirection(): string - { - return $this->sortDirection === 'asc' ? 'asc' : 'desc'; - } - - private function safeSortBy(): string - { - return in_array($this->sortBy, self::ALLOWED_SORT_COLUMNS, true) ? $this->sortBy : 'updated_at'; - } public function deleteAlbum(Album $album): void { diff --git a/app/Livewire/Anime/AnimeIndex.php b/app/Livewire/Anime/AnimeIndex.php index 29e741a..975a190 100644 --- a/app/Livewire/Anime/AnimeIndex.php +++ b/app/Livewire/Anime/AnimeIndex.php @@ -6,6 +6,7 @@ use App\Enums\WatchingStatus; use App\Livewire\Concerns\WithAccentInsensitiveSearch; +use App\Livewire\Concerns\WithIndexFiltering; use App\Models\Anime; use Illuminate\Support\Facades\Auth; use Illuminate\Support\Facades\DB; @@ -15,6 +16,7 @@ class AnimeIndex extends Component { use WithAccentInsensitiveSearch; + use WithIndexFiltering; use WithPagination; public string $search = ''; @@ -73,30 +75,6 @@ public function updatingMediaType(): void $this->resetPage(); } - public function setViewMode(string $mode): void - { - $this->viewMode = in_array($mode, ['gallery', 'list']) ? $mode : 'gallery'; - } - - public function sort(string $column): void - { - if ($this->sortBy === $column) { - $this->sortDirection = $this->sortDirection === 'asc' ? 'desc' : 'asc'; - } else { - $this->sortBy = $column; - $this->sortDirection = 'asc'; - } - } - - private function safeSortDirection(): string - { - return $this->sortDirection === 'asc' ? 'asc' : 'desc'; - } - - private function safeSortBy(): string - { - return in_array($this->sortBy, self::ALLOWED_SORT_COLUMNS, true) ? $this->sortBy : 'updated_at'; - } public function deleteAnime(Anime $anime): void { @@ -151,11 +129,6 @@ public function getStatuses(): array return WatchingStatus::cases(); } - public function paginationView(): string - { - return 'livewire.custom-pagination'; - } - public function render() { $perPage = $this->viewMode === 'list' ? 25 : 18; diff --git a/app/Livewire/BoardGames/BoardGameIndex.php b/app/Livewire/BoardGames/BoardGameIndex.php index dfc97d5..0d63f82 100644 --- a/app/Livewire/BoardGames/BoardGameIndex.php +++ b/app/Livewire/BoardGames/BoardGameIndex.php @@ -7,6 +7,7 @@ use App\Enums\OwnershipStatus; use App\Enums\PlayingStatus; use App\Livewire\Concerns\WithAccentInsensitiveSearch; +use App\Livewire\Concerns\WithIndexFiltering; use App\Models\BoardGame; use Illuminate\Support\Facades\Auth; use Livewire\Component; @@ -15,6 +16,7 @@ class BoardGameIndex extends Component { use WithAccentInsensitiveSearch; + use WithIndexFiltering; use WithPagination; public string $search = ''; @@ -70,30 +72,6 @@ public function updatingGenre(): void $this->resetPage(); } - public function setViewMode(string $mode): void - { - $this->viewMode = in_array($mode, ['gallery', 'list']) ? $mode : 'gallery'; - } - - public function sort(string $column): void - { - if ($this->sortBy === $column) { - $this->sortDirection = $this->sortDirection === 'asc' ? 'desc' : 'asc'; - } else { - $this->sortBy = $column; - $this->sortDirection = 'asc'; - } - } - - private function safeSortDirection(): string - { - return $this->sortDirection === 'asc' ? 'asc' : 'desc'; - } - - private function safeSortBy(): string - { - return in_array($this->sortBy, self::ALLOWED_SORT_COLUMNS, true) ? $this->sortBy : 'updated_at'; - } public function deleteBoardGame(BoardGame $boardGame): void { diff --git a/app/Livewire/Books/BookIndex.php b/app/Livewire/Books/BookIndex.php index 717de27..264ec55 100644 --- a/app/Livewire/Books/BookIndex.php +++ b/app/Livewire/Books/BookIndex.php @@ -6,6 +6,7 @@ use App\Enums\ReadingStatus; use App\Livewire\Concerns\WithAccentInsensitiveSearch; +use App\Livewire\Concerns\WithIndexFiltering; use App\Models\Book; use Illuminate\Support\Facades\Auth; use Illuminate\Support\Facades\DB; @@ -15,6 +16,7 @@ class BookIndex extends Component { use WithAccentInsensitiveSearch; + use WithIndexFiltering; use WithPagination; public string $search = ''; @@ -73,30 +75,6 @@ public function clearTag(): void $this->resetPage(); } - public function setViewMode(string $mode): void - { - $this->viewMode = in_array($mode, ['gallery', 'list']) ? $mode : 'gallery'; - } - - public function sort(string $column): void - { - if ($this->sortBy === $column) { - $this->sortDirection = $this->sortDirection === 'asc' ? 'desc' : 'asc'; - } else { - $this->sortBy = $column; - $this->sortDirection = 'asc'; - } - } - - private function safeSortDirection(): string - { - return $this->sortDirection === 'asc' ? 'asc' : 'desc'; - } - - private function safeSortBy(): string - { - return in_array($this->sortBy, self::ALLOWED_SORT_COLUMNS, true) ? $this->sortBy : 'updated_at'; - } public function updateStatus(Book $book, string $status): void { @@ -177,11 +155,6 @@ public function getStatuses(): array return ReadingStatus::cases(); } - public function paginationView(): string - { - return 'livewire.custom-pagination'; - } - public function render() { $perPage = $this->viewMode === 'list' ? 25 : 18; diff --git a/app/Livewire/Comics/ComicIndex.php b/app/Livewire/Comics/ComicIndex.php index c27e1b9..a683260 100644 --- a/app/Livewire/Comics/ComicIndex.php +++ b/app/Livewire/Comics/ComicIndex.php @@ -6,6 +6,7 @@ use App\Enums\ReadingStatus; use App\Livewire\Concerns\WithAccentInsensitiveSearch; +use App\Livewire\Concerns\WithIndexFiltering; use App\Models\Comic; use Illuminate\Support\Facades\Auth; use Illuminate\Support\Facades\DB; @@ -15,6 +16,7 @@ class ComicIndex extends Component { use WithAccentInsensitiveSearch; + use WithIndexFiltering; use WithPagination; public string $search = ''; @@ -65,30 +67,6 @@ public function updatingPublisher(): void $this->resetPage(); } - public function setViewMode(string $mode): void - { - $this->viewMode = in_array($mode, ['gallery', 'list']) ? $mode : 'gallery'; - } - - public function sort(string $column): void - { - if ($this->sortBy === $column) { - $this->sortDirection = $this->sortDirection === 'asc' ? 'desc' : 'asc'; - } else { - $this->sortBy = $column; - $this->sortDirection = 'asc'; - } - } - - private function safeSortDirection(): string - { - return $this->sortDirection === 'asc' ? 'asc' : 'desc'; - } - - private function safeSortBy(): string - { - return in_array($this->sortBy, self::ALLOWED_SORT_COLUMNS, true) ? $this->sortBy : 'updated_at'; - } public function updateStatus(Comic $comic, string $status): void { @@ -146,11 +124,6 @@ public function deleteSelected(): void session()->flash('message', "{$count} comic(s) deleted successfully."); } - public function paginationView(): string - { - return 'livewire.custom-pagination'; - } - public function render() { $perPage = $this->viewMode === 'list' ? 25 : 18; diff --git a/app/Livewire/Concerns/WithIndexFiltering.php b/app/Livewire/Concerns/WithIndexFiltering.php new file mode 100644 index 0000000..2562be0 --- /dev/null +++ b/app/Livewire/Concerns/WithIndexFiltering.php @@ -0,0 +1,50 @@ +sortBy === $column) { + $this->sortDirection = $this->sortDirection === 'asc' ? 'desc' : 'asc'; + } else { + $this->sortBy = $column; + $this->sortDirection = 'asc'; + } + } + + protected function safeSortDirection(): string + { + return $this->sortDirection === 'asc' ? 'asc' : 'desc'; + } + + protected function safeSortBy(): string + { + $default = defined('static::DEFAULT_SORT_COLUMN') ? static::DEFAULT_SORT_COLUMN : 'updated_at'; + + return in_array($this->sortBy, self::ALLOWED_SORT_COLUMNS, true) ? $this->sortBy : $default; + } + + public function setViewMode(string $mode): void + { + $default = defined('static::DEFAULT_VIEW_MODE') ? static::DEFAULT_VIEW_MODE : 'gallery'; + $this->viewMode = in_array($mode, ['gallery', 'list']) ? $mode : $default; + } + + public function paginationView(): string + { + return 'livewire.custom-pagination'; + } +} diff --git a/app/Livewire/Concerts/ConcertIndex.php b/app/Livewire/Concerts/ConcertIndex.php index f8108d9..913c71d 100644 --- a/app/Livewire/Concerts/ConcertIndex.php +++ b/app/Livewire/Concerts/ConcertIndex.php @@ -6,6 +6,7 @@ use App\Enums\ListeningStatus; use App\Livewire\Concerns\WithAccentInsensitiveSearch; +use App\Livewire\Concerns\WithIndexFiltering; use App\Models\Concert; use Illuminate\Support\Facades\Auth; use Livewire\Component; @@ -14,8 +15,13 @@ class ConcertIndex extends Component { use WithAccentInsensitiveSearch; + use WithIndexFiltering; use WithPagination; + private const DEFAULT_VIEW_MODE = 'list'; + + private const DEFAULT_SORT_COLUMN = 'event_date'; + public string $search = ''; public string $status = ''; @@ -52,30 +58,6 @@ public function updatingStatus(): void $this->resetPage(); } - public function setViewMode(string $mode): void - { - $this->viewMode = in_array($mode, ['gallery', 'list']) ? $mode : 'list'; - } - - public function sort(string $column): void - { - if ($this->sortBy === $column) { - $this->sortDirection = $this->sortDirection === 'asc' ? 'desc' : 'asc'; - } else { - $this->sortBy = $column; - $this->sortDirection = 'asc'; - } - } - - private function safeSortDirection(): string - { - return $this->sortDirection === 'asc' ? 'asc' : 'desc'; - } - - private function safeSortBy(): string - { - return in_array($this->sortBy, self::ALLOWED_SORT_COLUMNS, true) ? $this->sortBy : 'event_date'; - } public function deleteConcert(Concert $concert): void { diff --git a/app/Livewire/Games/GameIndex.php b/app/Livewire/Games/GameIndex.php index 2002407..4c36981 100644 --- a/app/Livewire/Games/GameIndex.php +++ b/app/Livewire/Games/GameIndex.php @@ -7,6 +7,7 @@ use App\Enums\OwnershipStatus; use App\Enums\PlayingStatus; use App\Livewire\Concerns\WithAccentInsensitiveSearch; +use App\Livewire\Concerns\WithIndexFiltering; use App\Models\Game; use Illuminate\Support\Facades\Auth; use Livewire\Component; @@ -15,6 +16,7 @@ class GameIndex extends Component { use WithAccentInsensitiveSearch; + use WithIndexFiltering; use WithPagination; public string $search = ''; @@ -81,30 +83,6 @@ public function updatingGenre(): void $this->resetPage(); } - public function setViewMode(string $mode): void - { - $this->viewMode = in_array($mode, ['gallery', 'list']) ? $mode : 'gallery'; - } - - public function sort(string $column): void - { - if ($this->sortBy === $column) { - $this->sortDirection = $this->sortDirection === 'asc' ? 'desc' : 'asc'; - } else { - $this->sortBy = $column; - $this->sortDirection = 'asc'; - } - } - - private function safeSortDirection(): string - { - return $this->sortDirection === 'asc' ? 'asc' : 'desc'; - } - - private function safeSortBy(): string - { - return in_array($this->sortBy, self::ALLOWED_SORT_COLUMNS, true) ? $this->sortBy : 'updated_at'; - } public function deleteGame(Game $game): void { @@ -162,11 +140,6 @@ protected function buildQuery() return $query; } - public function paginationView(): string - { - return 'livewire.custom-pagination'; - } - public function render() { $perPage = $this->viewMode === 'list' ? 25 : 18; diff --git a/app/Livewire/Movies/MovieIndex.php b/app/Livewire/Movies/MovieIndex.php index f77e37d..37fe6cf 100644 --- a/app/Livewire/Movies/MovieIndex.php +++ b/app/Livewire/Movies/MovieIndex.php @@ -6,6 +6,7 @@ use App\Enums\WatchingStatus; use App\Livewire\Concerns\WithAccentInsensitiveSearch; +use App\Livewire\Concerns\WithIndexFiltering; use App\Models\Movie; use Illuminate\Support\Facades\Auth; use Illuminate\Support\Facades\DB; @@ -15,6 +16,7 @@ class MovieIndex extends Component { use WithAccentInsensitiveSearch; + use WithIndexFiltering; use WithPagination; private const TV_SHOW_TYPES = ['TV Episode', 'TV Series', 'TV Mini Series']; @@ -82,30 +84,6 @@ public function toggleHideEpisodes(): void $this->resetPage(); } - public function setViewMode(string $mode): void - { - $this->viewMode = in_array($mode, ['gallery', 'list']) ? $mode : 'gallery'; - } - - public function sort(string $column): void - { - if ($this->sortBy === $column) { - $this->sortDirection = $this->sortDirection === 'asc' ? 'desc' : 'asc'; - } else { - $this->sortBy = $column; - $this->sortDirection = 'asc'; - } - } - - private function safeSortDirection(): string - { - return $this->sortDirection === 'asc' ? 'asc' : 'desc'; - } - - private function safeSortBy(): string - { - return in_array($this->sortBy, self::ALLOWED_SORT_COLUMNS, true) ? $this->sortBy : 'updated_at'; - } public function deleteMovie(Movie $movie): void { @@ -175,11 +153,6 @@ public function getStatuses(): array return WatchingStatus::cases(); } - public function paginationView(): string - { - return 'livewire.custom-pagination'; - } - public function render() { $perPage = $this->viewMode === 'list' ? 25 : 18; From 08ddbc30fee480d4b1c9a728c0d5c6d667431cef Mon Sep 17 00:00:00 2001 From: dotMavriQ Date: Wed, 1 Apr 2026 10:59:56 +0100 Subject: [PATCH 18/77] =?UTF-8?q?Upgrade=20Saloon=203=20=E2=86=92=204=20(C?= =?UTF-8?q?VE-2026-33942,=20CVE-2026-33182,=20CVE-2026-33183)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit saloonphp/saloon 3.14.3 → 4.0.0, laravel-plugin 3.9.0 → 4.1.0, cache-plugin 3.0.1 → 3.1.0. No code changes needed, all 91 tests pass. --- composer.json | 7 +- composer.lock | 382 ++++++++++++++++++++++++++++---------------------- 2 files changed, 222 insertions(+), 167 deletions(-) diff --git a/composer.json b/composer.json index b57ab16..19d776c 100644 --- a/composer.json +++ b/composer.json @@ -13,9 +13,10 @@ "laravel/tinker": "^2.10.1", "livewire/livewire": "^3.6.4", "livewire/volt": "^1.7.0", - "saloonphp/cache-plugin": "^3.0", - "saloonphp/laravel-plugin": "^3.9", - "saloonphp/saloon": "^3.14" + "saloonphp/cache-plugin": "^3.1", + "saloonphp/laravel-plugin": "^4.0", + "saloonphp/rate-limit-plugin": "^2.5", + "saloonphp/saloon": "^4.0" }, "require-dev": { "fakerphp/faker": "^1.23", diff --git a/composer.lock b/composer.lock index 885f28d..3c0aa6f 100644 --- a/composer.lock +++ b/composer.lock @@ -4,7 +4,7 @@ "Read more about it at https://getcomposer.org/doc/01-basic-usage.md#installing-dependencies", "This file is @generated automatically" ], - "content-hash": "1b1758dddb29e51a2dfdfcef730e2592", + "content-hash": "2947305932cad3f8701e09f064791987", "packages": [ { "name": "brick/math", @@ -852,16 +852,16 @@ }, { "name": "guzzlehttp/psr7", - "version": "2.8.0", + "version": "2.9.0", "source": { "type": "git", "url": "https://github.com/guzzle/psr7.git", - "reference": "21dc724a0583619cd1652f673303492272778051" + "reference": "7d0ed42f28e42d61352a7a79de682e5e67fec884" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/guzzle/psr7/zipball/21dc724a0583619cd1652f673303492272778051", - "reference": "21dc724a0583619cd1652f673303492272778051", + "url": "https://api.github.com/repos/guzzle/psr7/zipball/7d0ed42f28e42d61352a7a79de682e5e67fec884", + "reference": "7d0ed42f28e42d61352a7a79de682e5e67fec884", "shasum": "" }, "require": { @@ -877,6 +877,7 @@ "require-dev": { "bamarni/composer-bin-plugin": "^1.8.2", "http-interop/http-factory-tests": "0.9.0", + "jshttp/mime-db": "1.54.0.1", "phpunit/phpunit": "^8.5.44 || ^9.6.25" }, "suggest": { @@ -948,7 +949,7 @@ ], "support": { "issues": "https://github.com/guzzle/psr7/issues", - "source": "https://github.com/guzzle/psr7/tree/2.8.0" + "source": "https://github.com/guzzle/psr7/tree/2.9.0" }, "funding": [ { @@ -964,7 +965,7 @@ "type": "tidelift" } ], - "time": "2025-08-23T21:21:41+00:00" + "time": "2026-03-10T16:41:02+00:00" }, { "name": "guzzlehttp/uri-template", @@ -1286,16 +1287,16 @@ }, { "name": "laravel/framework", - "version": "v12.53.0", + "version": "v12.56.0", "source": { "type": "git", "url": "https://github.com/laravel/framework.git", - "reference": "f57f035c0d34503d9ff30be76159bb35a003cd1f" + "reference": "dac16d424b59debb2273910dde88eb7050a2a709" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/laravel/framework/zipball/f57f035c0d34503d9ff30be76159bb35a003cd1f", - "reference": "f57f035c0d34503d9ff30be76159bb35a003cd1f", + "url": "https://api.github.com/repos/laravel/framework/zipball/dac16d424b59debb2273910dde88eb7050a2a709", + "reference": "dac16d424b59debb2273910dde88eb7050a2a709", "shasum": "" }, "require": { @@ -1316,7 +1317,7 @@ "guzzlehttp/uri-template": "^1.0", "laravel/prompts": "^0.3.0", "laravel/serializable-closure": "^1.3|^2.0", - "league/commonmark": "^2.7", + "league/commonmark": "^2.8.1", "league/flysystem": "^3.25.1", "league/flysystem-local": "^3.25.1", "league/uri": "^7.5.1", @@ -1411,7 +1412,7 @@ "orchestra/testbench-core": "^10.9.0", "pda/pheanstalk": "^5.0.6|^7.0.0", "php-http/discovery": "^1.15", - "phpstan/phpstan": "^2.0", + "phpstan/phpstan": "^2.1.41", "phpunit/phpunit": "^10.5.35|^11.5.3|^12.0.1", "predis/predis": "^2.3|^3.0", "resend/resend-php": "^0.10.0|^1.0", @@ -1504,7 +1505,7 @@ "issues": "https://github.com/laravel/framework/issues", "source": "https://github.com/laravel/framework" }, - "time": "2026-02-24T14:35:15+00:00" + "time": "2026-03-26T14:51:54+00:00" }, { "name": "laravel/octane", @@ -1598,16 +1599,16 @@ }, { "name": "laravel/prompts", - "version": "v0.3.13", + "version": "v0.3.16", "source": { "type": "git", "url": "https://github.com/laravel/prompts.git", - "reference": "ed8c466571b37e977532fb2fd3c272c784d7050d" + "reference": "11e7d5f93803a2190b00e145142cb00a33d17ad2" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/laravel/prompts/zipball/ed8c466571b37e977532fb2fd3c272c784d7050d", - "reference": "ed8c466571b37e977532fb2fd3c272c784d7050d", + "url": "https://api.github.com/repos/laravel/prompts/zipball/11e7d5f93803a2190b00e145142cb00a33d17ad2", + "reference": "11e7d5f93803a2190b00e145142cb00a33d17ad2", "shasum": "" }, "require": { @@ -1651,9 +1652,9 @@ "description": "Add beautiful and user-friendly forms to your command-line applications.", "support": { "issues": "https://github.com/laravel/prompts/issues", - "source": "https://github.com/laravel/prompts/tree/v0.3.13" + "source": "https://github.com/laravel/prompts/tree/v0.3.16" }, - "time": "2026-02-06T12:17:10+00:00" + "time": "2026-03-23T14:35:33+00:00" }, { "name": "laravel/serializable-closure", @@ -1973,16 +1974,16 @@ }, { "name": "league/flysystem", - "version": "3.32.0", + "version": "3.33.0", "source": { "type": "git", "url": "https://github.com/thephpleague/flysystem.git", - "reference": "254b1595b16b22dbddaaef9ed6ca9fdac4956725" + "reference": "570b8871e0ce693764434b29154c54b434905350" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/thephpleague/flysystem/zipball/254b1595b16b22dbddaaef9ed6ca9fdac4956725", - "reference": "254b1595b16b22dbddaaef9ed6ca9fdac4956725", + "url": "https://api.github.com/repos/thephpleague/flysystem/zipball/570b8871e0ce693764434b29154c54b434905350", + "reference": "570b8871e0ce693764434b29154c54b434905350", "shasum": "" }, "require": { @@ -2050,9 +2051,9 @@ ], "support": { "issues": "https://github.com/thephpleague/flysystem/issues", - "source": "https://github.com/thephpleague/flysystem/tree/3.32.0" + "source": "https://github.com/thephpleague/flysystem/tree/3.33.0" }, - "time": "2026-02-25T17:01:41+00:00" + "time": "2026-03-25T07:59:30+00:00" }, { "name": "league/flysystem-local", @@ -2161,20 +2162,20 @@ }, { "name": "league/uri", - "version": "7.8.0", + "version": "7.8.1", "source": { "type": "git", "url": "https://github.com/thephpleague/uri.git", - "reference": "4436c6ec8d458e4244448b069cc572d088230b76" + "reference": "08cf38e3924d4f56238125547b5720496fac8fd4" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/thephpleague/uri/zipball/4436c6ec8d458e4244448b069cc572d088230b76", - "reference": "4436c6ec8d458e4244448b069cc572d088230b76", + "url": "https://api.github.com/repos/thephpleague/uri/zipball/08cf38e3924d4f56238125547b5720496fac8fd4", + "reference": "08cf38e3924d4f56238125547b5720496fac8fd4", "shasum": "" }, "require": { - "league/uri-interfaces": "^7.8", + "league/uri-interfaces": "^7.8.1", "php": "^8.1", "psr/http-factory": "^1" }, @@ -2247,7 +2248,7 @@ "docs": "https://uri.thephpleague.com", "forum": "https://thephpleague.slack.com", "issues": "https://github.com/thephpleague/uri-src/issues", - "source": "https://github.com/thephpleague/uri/tree/7.8.0" + "source": "https://github.com/thephpleague/uri/tree/7.8.1" }, "funding": [ { @@ -2255,20 +2256,20 @@ "type": "github" } ], - "time": "2026-01-14T17:24:56+00:00" + "time": "2026-03-15T20:22:25+00:00" }, { "name": "league/uri-interfaces", - "version": "7.8.0", + "version": "7.8.1", "source": { "type": "git", "url": "https://github.com/thephpleague/uri-interfaces.git", - "reference": "c5c5cd056110fc8afaba29fa6b72a43ced42acd4" + "reference": "85d5c77c5d6d3af6c54db4a78246364908f3c928" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/thephpleague/uri-interfaces/zipball/c5c5cd056110fc8afaba29fa6b72a43ced42acd4", - "reference": "c5c5cd056110fc8afaba29fa6b72a43ced42acd4", + "url": "https://api.github.com/repos/thephpleague/uri-interfaces/zipball/85d5c77c5d6d3af6c54db4a78246364908f3c928", + "reference": "85d5c77c5d6d3af6c54db4a78246364908f3c928", "shasum": "" }, "require": { @@ -2331,7 +2332,7 @@ "docs": "https://uri.thephpleague.com", "forum": "https://thephpleague.slack.com", "issues": "https://github.com/thephpleague/uri-src/issues", - "source": "https://github.com/thephpleague/uri-interfaces/tree/7.8.0" + "source": "https://github.com/thephpleague/uri-interfaces/tree/7.8.1" }, "funding": [ { @@ -2339,7 +2340,7 @@ "type": "github" } ], - "time": "2026-01-15T06:54:53+00:00" + "time": "2026-03-08T20:05:35+00:00" }, { "name": "livewire/livewire", @@ -2593,16 +2594,16 @@ }, { "name": "nesbot/carbon", - "version": "3.11.1", + "version": "3.11.3", "source": { "type": "git", "url": "https://github.com/CarbonPHP/carbon.git", - "reference": "f438fcc98f92babee98381d399c65336f3a3827f" + "reference": "6a7e652845bb018c668220c2a545aded8594fbbf" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/CarbonPHP/carbon/zipball/f438fcc98f92babee98381d399c65336f3a3827f", - "reference": "f438fcc98f92babee98381d399c65336f3a3827f", + "url": "https://api.github.com/repos/CarbonPHP/carbon/zipball/6a7e652845bb018c668220c2a545aded8594fbbf", + "reference": "6a7e652845bb018c668220c2a545aded8594fbbf", "shasum": "" }, "require": { @@ -2694,7 +2695,7 @@ "type": "tidelift" } ], - "time": "2026-01-29T09:26:29+00:00" + "time": "2026-03-11T17:23:39+00:00" }, { "name": "nette/schema", @@ -3765,21 +3766,21 @@ }, { "name": "saloonphp/cache-plugin", - "version": "v3.0.1", + "version": "v3.1.0", "source": { "type": "git", "url": "https://github.com/saloonphp/cache-plugin.git", - "reference": "8ff15f9807e5027704eaf05c7f66a8c87f61f661" + "reference": "106d89b6645aa1c054f9687ef8b1eb2ef0b44c47" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/saloonphp/cache-plugin/zipball/8ff15f9807e5027704eaf05c7f66a8c87f61f661", - "reference": "8ff15f9807e5027704eaf05c7f66a8c87f61f661", + "url": "https://api.github.com/repos/saloonphp/cache-plugin/zipball/106d89b6645aa1c054f9687ef8b1eb2ef0b44c47", + "reference": "106d89b6645aa1c054f9687ef8b1eb2ef0b44c47", "shasum": "" }, "require": { "php": "^8.2", - "saloonphp/saloon": "^3.0" + "saloonphp/saloon": "^3.0 || ^4.0" }, "require-dev": { "friendsofphp/php-cs-fixer": "^3.13", @@ -3807,36 +3808,36 @@ ], "description": "Official plugin for caching Saloon responses", "support": { - "source": "https://github.com/saloonphp/cache-plugin/tree/v3.0.1" + "source": "https://github.com/saloonphp/cache-plugin/tree/v3.1.0" }, - "time": "2025-11-20T23:47:02+00:00" + "time": "2026-03-25T20:44:39+00:00" }, { "name": "saloonphp/laravel-plugin", - "version": "v3.9.0", + "version": "v4.1.0", "source": { "type": "git", "url": "https://github.com/saloonphp/laravel-plugin.git", - "reference": "2562dec6d8341a0dfad0ab51a6fdc7df2e32d45b" + "reference": "d706b3e8c357d4eeda03ffa03966df1bf2cf70e7" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/saloonphp/laravel-plugin/zipball/2562dec6d8341a0dfad0ab51a6fdc7df2e32d45b", - "reference": "2562dec6d8341a0dfad0ab51a6fdc7df2e32d45b", + "url": "https://api.github.com/repos/saloonphp/laravel-plugin/zipball/d706b3e8c357d4eeda03ffa03966df1bf2cf70e7", + "reference": "d706b3e8c357d4eeda03ffa03966df1bf2cf70e7", "shasum": "" }, "require": { - "illuminate/console": "^11.0 || ^v12.39.0", - "illuminate/support": "^11.0 || ^12.39.0", + "illuminate/console": "^11.0 || ^12.39.0 || ^13.0", + "illuminate/support": "^11.0 || ^12.39.0 || ^13.0", "php": "^8.2", - "saloonphp/saloon": "^3.5", - "symfony/finder": "^6.4 || ^7.0" + "saloonphp/saloon": "^4.0", + "symfony/finder": "^6.4 || ^7.0 || ^8.0" }, "require-dev": { "friendsofphp/php-cs-fixer": "^3.48", "laravel/pulse": "^1.4", "laravel/telescope": "^5.16", - "orchestra/testbench": "^9.15 || ^10.7", + "orchestra/testbench": "^9.15 || ^10.7 || ^11.0", "pestphp/pest": "^3.0|^4.0", "phpstan/phpstan": "^1.10.57|^2.0.2" }, @@ -3877,22 +3878,75 @@ "sdk" ], "support": { - "source": "https://github.com/saloonphp/laravel-plugin/tree/v3.9.0" + "source": "https://github.com/saloonphp/laravel-plugin/tree/v4.1.0" }, - "time": "2026-02-26T22:03:11+00:00" + "time": "2026-03-31T17:13:46+00:00" + }, + { + "name": "saloonphp/rate-limit-plugin", + "version": "v2.5.1", + "source": { + "type": "git", + "url": "https://github.com/saloonphp/rate-limit-plugin.git", + "reference": "f3e7700b73cef0322fea3392a57449d96b748ee2" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/saloonphp/rate-limit-plugin/zipball/f3e7700b73cef0322fea3392a57449d96b748ee2", + "reference": "f3e7700b73cef0322fea3392a57449d96b748ee2", + "shasum": "" + }, + "require": { + "php": "^8.2", + "saloonphp/saloon": "^3.0 || ^4.0" + }, + "require-dev": { + "friendsofphp/php-cs-fixer": "^3.5", + "mockery/mockery": "^1.5", + "orchestra/testbench": "^9.15 || ^10.7", + "pestphp/pest": "^v3.8.4 || ^v4.1.4", + "phpstan/phpstan": "^1.9", + "predis/predis": "^2.1", + "psr/simple-cache": "^3.0" + }, + "type": "library", + "autoload": { + "psr-4": { + "Saloon\\RateLimitPlugin\\": "src/", + "Saloon\\RateLimitPlugin\\Tests\\": "tests/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Sam Carré", + "email": "29132017+Sammyjo20@users.noreply.github.com", + "role": "Developer" + } + ], + "description": "Handle rate limits beautifully in your Saloon API integrations or SDKs", + "homepage": "https://github.com/sammyjo20", + "support": { + "issues": "https://github.com/saloonphp/rate-limit-plugin/issues", + "source": "https://github.com/saloonphp/rate-limit-plugin/tree/v2.5.1" + }, + "time": "2026-03-25T20:56:11+00:00" }, { "name": "saloonphp/saloon", - "version": "v3.14.3", + "version": "v4.0.0", "source": { "type": "git", "url": "https://github.com/saloonphp/saloon.git", - "reference": "bdd2ab945fb490d51b3c419cc21c5937651f5ef4" + "reference": "1307b1d72cacdd2c9c20978cdf7a0b720b4bf3bb" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/saloonphp/saloon/zipball/bdd2ab945fb490d51b3c419cc21c5937651f5ef4", - "reference": "bdd2ab945fb490d51b3c419cc21c5937651f5ef4", + "url": "https://api.github.com/repos/saloonphp/saloon/zipball/1307b1d72cacdd2c9c20978cdf7a0b720b4bf3bb", + "reference": "1307b1d72cacdd2c9c20978cdf7a0b720b4bf3bb", "shasum": "" }, "require": { @@ -3952,7 +4006,7 @@ ], "support": { "issues": "https://github.com/saloonphp/saloon/issues", - "source": "https://github.com/saloonphp/saloon/tree/v3.14.3" + "source": "https://github.com/saloonphp/saloon/tree/v4.0.0" }, "funding": [ { @@ -3960,20 +4014,20 @@ "type": "github" } ], - "time": "2026-02-26T22:12:38+00:00" + "time": "2026-03-17T22:58:33+00:00" }, { "name": "symfony/clock", - "version": "v8.0.0", + "version": "v8.0.8", "source": { "type": "git", "url": "https://github.com/symfony/clock.git", - "reference": "832119f9b8dbc6c8e6f65f30c5969eca1e88764f" + "reference": "b55a638b189a6faa875e0ccdb00908fb87af95b3" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/clock/zipball/832119f9b8dbc6c8e6f65f30c5969eca1e88764f", - "reference": "832119f9b8dbc6c8e6f65f30c5969eca1e88764f", + "url": "https://api.github.com/repos/symfony/clock/zipball/b55a638b189a6faa875e0ccdb00908fb87af95b3", + "reference": "b55a638b189a6faa875e0ccdb00908fb87af95b3", "shasum": "" }, "require": { @@ -4017,7 +4071,7 @@ "time" ], "support": { - "source": "https://github.com/symfony/clock/tree/v8.0.0" + "source": "https://github.com/symfony/clock/tree/v8.0.8" }, "funding": [ { @@ -4037,20 +4091,20 @@ "type": "tidelift" } ], - "time": "2025-11-12T15:46:48+00:00" + "time": "2026-03-30T15:14:47+00:00" }, { "name": "symfony/console", - "version": "v7.4.7", + "version": "v7.4.8", "source": { "type": "git", "url": "https://github.com/symfony/console.git", - "reference": "e1e6770440fb9c9b0cf725f81d1361ad1835329d" + "reference": "1e92e39c51f95b88e3d66fa2d9f06d1fb45dd707" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/console/zipball/e1e6770440fb9c9b0cf725f81d1361ad1835329d", - "reference": "e1e6770440fb9c9b0cf725f81d1361ad1835329d", + "url": "https://api.github.com/repos/symfony/console/zipball/1e92e39c51f95b88e3d66fa2d9f06d1fb45dd707", + "reference": "1e92e39c51f95b88e3d66fa2d9f06d1fb45dd707", "shasum": "" }, "require": { @@ -4115,7 +4169,7 @@ "terminal" ], "support": { - "source": "https://github.com/symfony/console/tree/v7.4.7" + "source": "https://github.com/symfony/console/tree/v7.4.8" }, "funding": [ { @@ -4135,20 +4189,20 @@ "type": "tidelift" } ], - "time": "2026-03-06T14:06:20+00:00" + "time": "2026-03-30T13:54:39+00:00" }, { "name": "symfony/css-selector", - "version": "v8.0.6", + "version": "v8.0.8", "source": { "type": "git", "url": "https://github.com/symfony/css-selector.git", - "reference": "2a178bf80f05dbbe469a337730eba79d61315262" + "reference": "8db1c00226a94d8ab6aa89d9224eeee91e2ea2ed" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/css-selector/zipball/2a178bf80f05dbbe469a337730eba79d61315262", - "reference": "2a178bf80f05dbbe469a337730eba79d61315262", + "url": "https://api.github.com/repos/symfony/css-selector/zipball/8db1c00226a94d8ab6aa89d9224eeee91e2ea2ed", + "reference": "8db1c00226a94d8ab6aa89d9224eeee91e2ea2ed", "shasum": "" }, "require": { @@ -4184,7 +4238,7 @@ "description": "Converts CSS selectors to XPath expressions", "homepage": "https://symfony.com", "support": { - "source": "https://github.com/symfony/css-selector/tree/v8.0.6" + "source": "https://github.com/symfony/css-selector/tree/v8.0.8" }, "funding": [ { @@ -4204,7 +4258,7 @@ "type": "tidelift" } ], - "time": "2026-02-17T13:07:04+00:00" + "time": "2026-03-30T15:14:47+00:00" }, { "name": "symfony/deprecation-contracts", @@ -4275,16 +4329,16 @@ }, { "name": "symfony/error-handler", - "version": "v7.4.4", + "version": "v7.4.8", "source": { "type": "git", "url": "https://github.com/symfony/error-handler.git", - "reference": "8da531f364ddfee53e36092a7eebbbd0b775f6b8" + "reference": "8dd79d8af777ee6cba2fd4d98da6ffb839f3c0fa" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/error-handler/zipball/8da531f364ddfee53e36092a7eebbbd0b775f6b8", - "reference": "8da531f364ddfee53e36092a7eebbbd0b775f6b8", + "url": "https://api.github.com/repos/symfony/error-handler/zipball/8dd79d8af777ee6cba2fd4d98da6ffb839f3c0fa", + "reference": "8dd79d8af777ee6cba2fd4d98da6ffb839f3c0fa", "shasum": "" }, "require": { @@ -4333,7 +4387,7 @@ "description": "Provides tools to manage errors and ease debugging PHP code", "homepage": "https://symfony.com", "support": { - "source": "https://github.com/symfony/error-handler/tree/v7.4.4" + "source": "https://github.com/symfony/error-handler/tree/v7.4.8" }, "funding": [ { @@ -4353,20 +4407,20 @@ "type": "tidelift" } ], - "time": "2026-01-20T16:42:42+00:00" + "time": "2026-03-24T13:12:05+00:00" }, { "name": "symfony/event-dispatcher", - "version": "v8.0.4", + "version": "v8.0.8", "source": { "type": "git", "url": "https://github.com/symfony/event-dispatcher.git", - "reference": "99301401da182b6cfaa4700dbe9987bb75474b47" + "reference": "f662acc6ab22a3d6d716dcb44c381c6002940df6" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/event-dispatcher/zipball/99301401da182b6cfaa4700dbe9987bb75474b47", - "reference": "99301401da182b6cfaa4700dbe9987bb75474b47", + "url": "https://api.github.com/repos/symfony/event-dispatcher/zipball/f662acc6ab22a3d6d716dcb44c381c6002940df6", + "reference": "f662acc6ab22a3d6d716dcb44c381c6002940df6", "shasum": "" }, "require": { @@ -4418,7 +4472,7 @@ "description": "Provides tools that allow your application components to communicate with each other by dispatching events and listening to them", "homepage": "https://symfony.com", "support": { - "source": "https://github.com/symfony/event-dispatcher/tree/v8.0.4" + "source": "https://github.com/symfony/event-dispatcher/tree/v8.0.8" }, "funding": [ { @@ -4438,7 +4492,7 @@ "type": "tidelift" } ], - "time": "2026-01-05T11:45:55+00:00" + "time": "2026-03-30T15:14:47+00:00" }, { "name": "symfony/event-dispatcher-contracts", @@ -4518,16 +4572,16 @@ }, { "name": "symfony/finder", - "version": "v7.4.6", + "version": "v7.4.8", "source": { "type": "git", "url": "https://github.com/symfony/finder.git", - "reference": "8655bf1076b7a3a346cb11413ffdabff50c7ffcf" + "reference": "e0be088d22278583a82da281886e8c3592fbf149" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/finder/zipball/8655bf1076b7a3a346cb11413ffdabff50c7ffcf", - "reference": "8655bf1076b7a3a346cb11413ffdabff50c7ffcf", + "url": "https://api.github.com/repos/symfony/finder/zipball/e0be088d22278583a82da281886e8c3592fbf149", + "reference": "e0be088d22278583a82da281886e8c3592fbf149", "shasum": "" }, "require": { @@ -4562,7 +4616,7 @@ "description": "Finds files and directories via an intuitive fluent interface", "homepage": "https://symfony.com", "support": { - "source": "https://github.com/symfony/finder/tree/v7.4.6" + "source": "https://github.com/symfony/finder/tree/v7.4.8" }, "funding": [ { @@ -4582,20 +4636,20 @@ "type": "tidelift" } ], - "time": "2026-01-29T09:40:50+00:00" + "time": "2026-03-24T13:12:05+00:00" }, { "name": "symfony/http-foundation", - "version": "v7.4.6", + "version": "v7.4.8", "source": { "type": "git", "url": "https://github.com/symfony/http-foundation.git", - "reference": "fd97d5e926e988a363cef56fbbf88c5c528e9065" + "reference": "9381209597ec66c25be154cbf2289076e64d1eab" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/http-foundation/zipball/fd97d5e926e988a363cef56fbbf88c5c528e9065", - "reference": "fd97d5e926e988a363cef56fbbf88c5c528e9065", + "url": "https://api.github.com/repos/symfony/http-foundation/zipball/9381209597ec66c25be154cbf2289076e64d1eab", + "reference": "9381209597ec66c25be154cbf2289076e64d1eab", "shasum": "" }, "require": { @@ -4644,7 +4698,7 @@ "description": "Defines an object-oriented layer for the HTTP specification", "homepage": "https://symfony.com", "support": { - "source": "https://github.com/symfony/http-foundation/tree/v7.4.6" + "source": "https://github.com/symfony/http-foundation/tree/v7.4.8" }, "funding": [ { @@ -4664,20 +4718,20 @@ "type": "tidelift" } ], - "time": "2026-02-21T16:25:55+00:00" + "time": "2026-03-24T13:12:05+00:00" }, { "name": "symfony/http-kernel", - "version": "v7.4.6", + "version": "v7.4.8", "source": { "type": "git", "url": "https://github.com/symfony/http-kernel.git", - "reference": "002ac0cf4cd972a7fd0912dcd513a95e8a81ce83" + "reference": "017e76ad089bac281553389269e259e155935e1a" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/http-kernel/zipball/002ac0cf4cd972a7fd0912dcd513a95e8a81ce83", - "reference": "002ac0cf4cd972a7fd0912dcd513a95e8a81ce83", + "url": "https://api.github.com/repos/symfony/http-kernel/zipball/017e76ad089bac281553389269e259e155935e1a", + "reference": "017e76ad089bac281553389269e259e155935e1a", "shasum": "" }, "require": { @@ -4763,7 +4817,7 @@ "description": "Provides a structured process for converting a Request into a Response", "homepage": "https://symfony.com", "support": { - "source": "https://github.com/symfony/http-kernel/tree/v7.4.6" + "source": "https://github.com/symfony/http-kernel/tree/v7.4.8" }, "funding": [ { @@ -4783,20 +4837,20 @@ "type": "tidelift" } ], - "time": "2026-02-26T08:30:57+00:00" + "time": "2026-03-31T20:57:01+00:00" }, { "name": "symfony/mailer", - "version": "v7.4.6", + "version": "v7.4.8", "source": { "type": "git", "url": "https://github.com/symfony/mailer.git", - "reference": "b02726f39a20bc65e30364f5c750c4ddbf1f58e9" + "reference": "f6ea532250b476bfc1b56699b388a1bdbf168f62" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/mailer/zipball/b02726f39a20bc65e30364f5c750c4ddbf1f58e9", - "reference": "b02726f39a20bc65e30364f5c750c4ddbf1f58e9", + "url": "https://api.github.com/repos/symfony/mailer/zipball/f6ea532250b476bfc1b56699b388a1bdbf168f62", + "reference": "f6ea532250b476bfc1b56699b388a1bdbf168f62", "shasum": "" }, "require": { @@ -4847,7 +4901,7 @@ "description": "Helps sending emails", "homepage": "https://symfony.com", "support": { - "source": "https://github.com/symfony/mailer/tree/v7.4.6" + "source": "https://github.com/symfony/mailer/tree/v7.4.8" }, "funding": [ { @@ -4867,20 +4921,20 @@ "type": "tidelift" } ], - "time": "2026-02-25T16:50:00+00:00" + "time": "2026-03-24T13:12:05+00:00" }, { "name": "symfony/mime", - "version": "v7.4.6", + "version": "v7.4.8", "source": { "type": "git", "url": "https://github.com/symfony/mime.git", - "reference": "9fc881d95feae4c6c48678cb6372bd8a7ba04f5f" + "reference": "6df02f99998081032da3407a8d6c4e1dcb5d4379" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/mime/zipball/9fc881d95feae4c6c48678cb6372bd8a7ba04f5f", - "reference": "9fc881d95feae4c6c48678cb6372bd8a7ba04f5f", + "url": "https://api.github.com/repos/symfony/mime/zipball/6df02f99998081032da3407a8d6c4e1dcb5d4379", + "reference": "6df02f99998081032da3407a8d6c4e1dcb5d4379", "shasum": "" }, "require": { @@ -4936,7 +4990,7 @@ "mime-type" ], "support": { - "source": "https://github.com/symfony/mime/tree/v7.4.6" + "source": "https://github.com/symfony/mime/tree/v7.4.8" }, "funding": [ { @@ -4956,7 +5010,7 @@ "type": "tidelift" } ], - "time": "2026-02-05T15:57:06+00:00" + "time": "2026-03-30T14:11:46+00:00" }, { "name": "symfony/polyfill-ctype", @@ -5789,16 +5843,16 @@ }, { "name": "symfony/process", - "version": "v7.4.5", + "version": "v7.4.8", "source": { "type": "git", "url": "https://github.com/symfony/process.git", - "reference": "608476f4604102976d687c483ac63a79ba18cc97" + "reference": "60f19cd3badc8de688421e21e4305eba50f8089a" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/process/zipball/608476f4604102976d687c483ac63a79ba18cc97", - "reference": "608476f4604102976d687c483ac63a79ba18cc97", + "url": "https://api.github.com/repos/symfony/process/zipball/60f19cd3badc8de688421e21e4305eba50f8089a", + "reference": "60f19cd3badc8de688421e21e4305eba50f8089a", "shasum": "" }, "require": { @@ -5830,7 +5884,7 @@ "description": "Executes commands in sub-processes", "homepage": "https://symfony.com", "support": { - "source": "https://github.com/symfony/process/tree/v7.4.5" + "source": "https://github.com/symfony/process/tree/v7.4.8" }, "funding": [ { @@ -5850,7 +5904,7 @@ "type": "tidelift" } ], - "time": "2026-01-26T15:07:59+00:00" + "time": "2026-03-24T13:12:05+00:00" }, { "name": "symfony/psr-http-message-bridge", @@ -5942,16 +5996,16 @@ }, { "name": "symfony/routing", - "version": "v7.4.6", + "version": "v7.4.8", "source": { "type": "git", "url": "https://github.com/symfony/routing.git", - "reference": "238d749c56b804b31a9bf3e26519d93b65a60938" + "reference": "9608de9873ec86e754fb6c0a0fa7e5f1a960eb6b" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/routing/zipball/238d749c56b804b31a9bf3e26519d93b65a60938", - "reference": "238d749c56b804b31a9bf3e26519d93b65a60938", + "url": "https://api.github.com/repos/symfony/routing/zipball/9608de9873ec86e754fb6c0a0fa7e5f1a960eb6b", + "reference": "9608de9873ec86e754fb6c0a0fa7e5f1a960eb6b", "shasum": "" }, "require": { @@ -6003,7 +6057,7 @@ "url" ], "support": { - "source": "https://github.com/symfony/routing/tree/v7.4.6" + "source": "https://github.com/symfony/routing/tree/v7.4.8" }, "funding": [ { @@ -6023,7 +6077,7 @@ "type": "tidelift" } ], - "time": "2026-02-25T16:50:00+00:00" + "time": "2026-03-24T13:12:05+00:00" }, { "name": "symfony/service-contracts", @@ -6114,16 +6168,16 @@ }, { "name": "symfony/string", - "version": "v8.0.6", + "version": "v8.0.8", "source": { "type": "git", "url": "https://github.com/symfony/string.git", - "reference": "6c9e1108041b5dce21a9a4984b531c4923aa9ec4" + "reference": "ae9488f874d7603f9d2dfbf120203882b645d963" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/string/zipball/6c9e1108041b5dce21a9a4984b531c4923aa9ec4", - "reference": "6c9e1108041b5dce21a9a4984b531c4923aa9ec4", + "url": "https://api.github.com/repos/symfony/string/zipball/ae9488f874d7603f9d2dfbf120203882b645d963", + "reference": "ae9488f874d7603f9d2dfbf120203882b645d963", "shasum": "" }, "require": { @@ -6180,7 +6234,7 @@ "utf8" ], "support": { - "source": "https://github.com/symfony/string/tree/v8.0.6" + "source": "https://github.com/symfony/string/tree/v8.0.8" }, "funding": [ { @@ -6200,20 +6254,20 @@ "type": "tidelift" } ], - "time": "2026-02-09T10:14:57+00:00" + "time": "2026-03-30T15:14:47+00:00" }, { "name": "symfony/translation", - "version": "v8.0.6", + "version": "v8.0.8", "source": { "type": "git", "url": "https://github.com/symfony/translation.git", - "reference": "13ff19bcf2bea492d3c2fbeaa194dd6f4599ce1b" + "reference": "27c03ae3940de24ba2f71cfdbac824f2aa1fdf2f" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/translation/zipball/13ff19bcf2bea492d3c2fbeaa194dd6f4599ce1b", - "reference": "13ff19bcf2bea492d3c2fbeaa194dd6f4599ce1b", + "url": "https://api.github.com/repos/symfony/translation/zipball/27c03ae3940de24ba2f71cfdbac824f2aa1fdf2f", + "reference": "27c03ae3940de24ba2f71cfdbac824f2aa1fdf2f", "shasum": "" }, "require": { @@ -6273,7 +6327,7 @@ "description": "Provides tools to internationalize your application", "homepage": "https://symfony.com", "support": { - "source": "https://github.com/symfony/translation/tree/v8.0.6" + "source": "https://github.com/symfony/translation/tree/v8.0.8" }, "funding": [ { @@ -6293,7 +6347,7 @@ "type": "tidelift" } ], - "time": "2026-02-17T13:07:04+00:00" + "time": "2026-03-30T15:14:47+00:00" }, { "name": "symfony/translation-contracts", @@ -6379,16 +6433,16 @@ }, { "name": "symfony/uid", - "version": "v7.4.4", + "version": "v7.4.8", "source": { "type": "git", "url": "https://github.com/symfony/uid.git", - "reference": "7719ce8aba76be93dfe249192f1fbfa52c588e36" + "reference": "6883ebdf7bf6a12b37519dbc0df62b0222401b56" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/uid/zipball/7719ce8aba76be93dfe249192f1fbfa52c588e36", - "reference": "7719ce8aba76be93dfe249192f1fbfa52c588e36", + "url": "https://api.github.com/repos/symfony/uid/zipball/6883ebdf7bf6a12b37519dbc0df62b0222401b56", + "reference": "6883ebdf7bf6a12b37519dbc0df62b0222401b56", "shasum": "" }, "require": { @@ -6433,7 +6487,7 @@ "uuid" ], "support": { - "source": "https://github.com/symfony/uid/tree/v7.4.4" + "source": "https://github.com/symfony/uid/tree/v7.4.8" }, "funding": [ { @@ -6453,20 +6507,20 @@ "type": "tidelift" } ], - "time": "2026-01-03T23:30:35+00:00" + "time": "2026-03-24T13:12:05+00:00" }, { "name": "symfony/var-dumper", - "version": "v7.4.6", + "version": "v7.4.8", "source": { "type": "git", "url": "https://github.com/symfony/var-dumper.git", - "reference": "045321c440ac18347b136c63d2e9bf28a2dc0291" + "reference": "9510c3966f749a1d1ff0059e1eabef6cc621e7fd" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/var-dumper/zipball/045321c440ac18347b136c63d2e9bf28a2dc0291", - "reference": "045321c440ac18347b136c63d2e9bf28a2dc0291", + "url": "https://api.github.com/repos/symfony/var-dumper/zipball/9510c3966f749a1d1ff0059e1eabef6cc621e7fd", + "reference": "9510c3966f749a1d1ff0059e1eabef6cc621e7fd", "shasum": "" }, "require": { @@ -6520,7 +6574,7 @@ "dump" ], "support": { - "source": "https://github.com/symfony/var-dumper/tree/v7.4.6" + "source": "https://github.com/symfony/var-dumper/tree/v7.4.8" }, "funding": [ { @@ -6540,7 +6594,7 @@ "type": "tidelift" } ], - "time": "2026-02-15T10:53:20+00:00" + "time": "2026-03-30T13:44:50+00:00" }, { "name": "tijsverkoyen/css-to-inline-styles", From 0ec47b1960bcc4a278e6678366b0c622852adfdf Mon Sep 17 00:00:00 2001 From: dotMavriQ Date: Wed, 1 Apr 2026 11:04:22 +0100 Subject: [PATCH 19/77] =?UTF-8?q?Upgrade=20Laravel=2012=20=E2=86=92=2013,?= =?UTF-8?q?=20Pest=203=20=E2=86=92=204,=20Tinker=202=20=E2=86=92=203?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Pin SESSION_COOKIE=teal_session in .env.example to prevent the L13 prefix format change from invalidating existing sessions. All 91 tests pass, no code changes required. --- .env.example | 1 + composer.json | 8 +- composer.lock | 1594 ++++++++++++++++++++++--------------------------- 3 files changed, 729 insertions(+), 874 deletions(-) diff --git a/.env.example b/.env.example index 7882e6c..30f3d28 100644 --- a/.env.example +++ b/.env.example @@ -33,6 +33,7 @@ SESSION_LIFETIME=120 SESSION_ENCRYPT=false SESSION_PATH=/ SESSION_DOMAIN=null +SESSION_COOKIE=teal_session BROADCAST_CONNECTION=log FILESYSTEM_DISK=local diff --git a/composer.json b/composer.json index 19d776c..e9c8be0 100644 --- a/composer.json +++ b/composer.json @@ -8,9 +8,9 @@ "require": { "php": "^8.2", "intervention/image": "^3.11", - "laravel/framework": "^12.0", + "laravel/framework": "^13.0", "laravel/octane": "^2.14", - "laravel/tinker": "^2.10.1", + "laravel/tinker": "^3.0", "livewire/livewire": "^3.6.4", "livewire/volt": "^1.7.0", "saloonphp/cache-plugin": "^3.1", @@ -26,8 +26,8 @@ "laravel/sail": "^1.41", "mockery/mockery": "^1.6", "nunomaduro/collision": "^8.6", - "pestphp/pest": "^3.8", - "pestphp/pest-plugin-laravel": "^3.2" + "pestphp/pest": "^4.0", + "pestphp/pest-plugin-laravel": "^4.0" }, "autoload": { "psr-4": { diff --git a/composer.lock b/composer.lock index 3c0aa6f..a637295 100644 --- a/composer.lock +++ b/composer.lock @@ -4,7 +4,7 @@ "Read more about it at https://getcomposer.org/doc/01-basic-usage.md#installing-dependencies", "This file is @generated automatically" ], - "content-hash": "2947305932cad3f8701e09f064791987", + "content-hash": "7b55cab2fb95ee80cc8b1039342120c0", "packages": [ { "name": "brick/math", @@ -1123,16 +1123,16 @@ }, { "name": "intervention/image", - "version": "3.11.6", + "version": "3.11.7", "source": { "type": "git", "url": "https://github.com/Intervention/image.git", - "reference": "5f6d27d9fd56312c47f347929e7ac15345c605a1" + "reference": "2159bcccff18f09d2a392679b81a82c5a003f9bb" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/Intervention/image/zipball/5f6d27d9fd56312c47f347929e7ac15345c605a1", - "reference": "5f6d27d9fd56312c47f347929e7ac15345c605a1", + "url": "https://api.github.com/repos/Intervention/image/zipball/2159bcccff18f09d2a392679b81a82c5a003f9bb", + "reference": "2159bcccff18f09d2a392679b81a82c5a003f9bb", "shasum": "" }, "require": { @@ -1179,7 +1179,7 @@ ], "support": { "issues": "https://github.com/Intervention/image/issues", - "source": "https://github.com/Intervention/image/tree/3.11.6" + "source": "https://github.com/Intervention/image/tree/3.11.7" }, "funding": [ { @@ -1195,7 +1195,7 @@ "type": "ko_fi" } ], - "time": "2025-12-17T13:38:29+00:00" + "time": "2026-02-19T13:11:17+00:00" }, { "name": "laminas/laminas-diactoros", @@ -1287,24 +1287,24 @@ }, { "name": "laravel/framework", - "version": "v12.56.0", + "version": "v13.2.0", "source": { "type": "git", "url": "https://github.com/laravel/framework.git", - "reference": "dac16d424b59debb2273910dde88eb7050a2a709" + "reference": "9e48d1fe933e89de628dafa167d2c5778566d4cf" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/laravel/framework/zipball/dac16d424b59debb2273910dde88eb7050a2a709", - "reference": "dac16d424b59debb2273910dde88eb7050a2a709", + "url": "https://api.github.com/repos/laravel/framework/zipball/9e48d1fe933e89de628dafa167d2c5778566d4cf", + "reference": "9e48d1fe933e89de628dafa167d2c5778566d4cf", "shasum": "" }, "require": { - "brick/math": "^0.11|^0.12|^0.13|^0.14", + "brick/math": "^0.14.2 || ^0.15 || ^0.16 || ^0.17", "composer-runtime-api": "^2.2", "doctrine/inflector": "^2.0.5", "dragonmantank/cron-expression": "^3.4", - "egulias/email-validator": "^3.2.1|^4.0", + "egulias/email-validator": "^4.0", "ext-ctype": "*", "ext-filter": "*", "ext-hash": "*", @@ -1314,9 +1314,10 @@ "ext-tokenizer": "*", "fruitcake/php-cors": "^1.3", "guzzlehttp/guzzle": "^7.8.2", + "guzzlehttp/promises": "^2.0.3", "guzzlehttp/uri-template": "^1.0", "laravel/prompts": "^0.3.0", - "laravel/serializable-closure": "^1.3|^2.0", + "laravel/serializable-closure": "^2.0.10", "league/commonmark": "^2.8.1", "league/flysystem": "^3.25.1", "league/flysystem-local": "^3.25.1", @@ -1324,25 +1325,24 @@ "monolog/monolog": "^3.0", "nesbot/carbon": "^3.8.4", "nunomaduro/termwind": "^2.0", - "php": "^8.2", - "psr/container": "^1.1.1|^2.0.1", - "psr/log": "^1.0|^2.0|^3.0", - "psr/simple-cache": "^1.0|^2.0|^3.0", + "php": "^8.3", + "psr/container": "^1.1.1 || ^2.0.1", + "psr/log": "^1.0 || ^2.0 || ^3.0", + "psr/simple-cache": "^1.0 || ^2.0 || ^3.0", "ramsey/uuid": "^4.7", - "symfony/console": "^7.2.0", - "symfony/error-handler": "^7.2.0", - "symfony/finder": "^7.2.0", - "symfony/http-foundation": "^7.2.0", - "symfony/http-kernel": "^7.2.0", - "symfony/mailer": "^7.2.0", - "symfony/mime": "^7.2.0", - "symfony/polyfill-php83": "^1.33", + "symfony/console": "^7.4.0 || ^8.0.0", + "symfony/error-handler": "^7.4.0 || ^8.0.0", + "symfony/finder": "^7.4.0 || ^8.0.0", + "symfony/http-foundation": "^7.4.0 || ^8.0.0", + "symfony/http-kernel": "^7.4.0 || ^8.0.0", + "symfony/mailer": "^7.4.0 || ^8.0.0", + "symfony/mime": "^7.4.0 || ^8.0.0", "symfony/polyfill-php84": "^1.33", "symfony/polyfill-php85": "^1.33", - "symfony/process": "^7.2.0", - "symfony/routing": "^7.2.0", - "symfony/uid": "^7.2.0", - "symfony/var-dumper": "^7.2.0", + "symfony/process": "^7.4.5 || ^8.0.5", + "symfony/routing": "^7.4.0 || ^8.0.0", + "symfony/uid": "^7.4.0 || ^8.0.0", + "symfony/var-dumper": "^7.4.0 || ^8.0.0", "tijsverkoyen/css-to-inline-styles": "^2.2.5", "vlucas/phpdotenv": "^5.6.1", "voku/portable-ascii": "^2.0.2" @@ -1351,9 +1351,9 @@ "tightenco/collect": "<5.5.33" }, "provide": { - "psr/container-implementation": "1.1|2.0", - "psr/log-implementation": "1.0|2.0|3.0", - "psr/simple-cache-implementation": "1.0|2.0|3.0" + "psr/container-implementation": "1.1 || 2.0", + "psr/log-implementation": "1.0 || 2.0 || 3.0", + "psr/simple-cache-implementation": "1.0 || 2.0 || 3.0" }, "replace": { "illuminate/auth": "self.version", @@ -1399,7 +1399,6 @@ "aws/aws-sdk-php": "^3.322.9", "ext-gmp": "*", "fakerphp/faker": "^1.24", - "guzzlehttp/promises": "^2.0.3", "guzzlehttp/psr7": "^2.4", "laravel/pint": "^1.18", "league/flysystem-aws-s3-v3": "^3.25.1", @@ -1409,22 +1408,22 @@ "league/flysystem-sftp-v3": "^3.25.1", "mockery/mockery": "^1.6.10", "opis/json-schema": "^2.4.1", - "orchestra/testbench-core": "^10.9.0", - "pda/pheanstalk": "^5.0.6|^7.0.0", + "orchestra/testbench-core": "^11.0.0", + "pda/pheanstalk": "^7.0.0 || ^8.0.0", "php-http/discovery": "^1.15", - "phpstan/phpstan": "^2.1.41", - "phpunit/phpunit": "^10.5.35|^11.5.3|^12.0.1", - "predis/predis": "^2.3|^3.0", - "resend/resend-php": "^0.10.0|^1.0", - "symfony/cache": "^7.2.0", - "symfony/http-client": "^7.2.0", - "symfony/psr-http-message-bridge": "^7.2.0", - "symfony/translation": "^7.2.0" + "phpstan/phpstan": "^2.0", + "phpunit/phpunit": "^11.5.50 || ^12.5.8 || ^13.0.3", + "predis/predis": "^2.3 || ^3.0", + "resend/resend-php": "^1.0", + "symfony/cache": "^7.4.0 || ^8.0.0", + "symfony/http-client": "^7.4.0 || ^8.0.0", + "symfony/psr-http-message-bridge": "^7.4.0 || ^8.0.0", + "symfony/translation": "^7.4.0 || ^8.0.0" }, "suggest": { "ably/ably-php": "Required to use the Ably broadcast driver (^1.0).", "aws/aws-sdk-php": "Required to use the SQS queue driver, DynamoDb failed job storage, and SES mail driver (^3.322.9).", - "brianium/paratest": "Required to run tests in parallel (^7.0|^8.0).", + "brianium/paratest": "Required to run tests in parallel (^7.0 || ^8.0).", "ext-apcu": "Required to use the APC cache driver.", "ext-fileinfo": "Required to use the Filesystem class.", "ext-ftp": "Required to use the Flysystem FTP driver.", @@ -1433,7 +1432,7 @@ "ext-pcntl": "Required to use all features of the queue worker and console signal trapping.", "ext-pdo": "Required to use all database features.", "ext-posix": "Required to use all features of the queue worker.", - "ext-redis": "Required to use the Redis cache and queue drivers (^4.0|^5.0|^6.0).", + "ext-redis": "Required to use the Redis cache and queue drivers (^4.0 || ^5.0 || ^6.0).", "fakerphp/faker": "Required to generate fake data using the fake() helper (^1.23).", "filp/whoops": "Required for friendly error pages in development (^2.14.3).", "laravel/tinker": "Required to use the tinker console command (^2.0).", @@ -1443,24 +1442,24 @@ "league/flysystem-read-only": "Required to use read-only disks (^3.25.1)", "league/flysystem-sftp-v3": "Required to use the Flysystem SFTP driver (^3.25.1).", "mockery/mockery": "Required to use mocking (^1.6).", - "pda/pheanstalk": "Required to use the beanstalk queue driver (^5.0).", + "pda/pheanstalk": "Required to use the beanstalk queue driver (^7.0 || ^8.0).", "php-http/discovery": "Required to use PSR-7 bridging features (^1.15).", - "phpunit/phpunit": "Required to use assertions and run tests (^10.5.35|^11.5.3|^12.0.1).", - "predis/predis": "Required to use the predis connector (^2.3|^3.0).", + "phpunit/phpunit": "Required to use assertions and run tests (^11.5.50 || ^12.5.8 || ^13.0.3).", + "predis/predis": "Required to use the predis connector (^2.3 || ^3.0).", "psr/http-message": "Required to allow Storage::put to accept a StreamInterface (^1.0).", - "pusher/pusher-php-server": "Required to use the Pusher broadcast driver (^6.0|^7.0).", - "resend/resend-php": "Required to enable support for the Resend mail transport (^0.10.0|^1.0).", - "symfony/cache": "Required to PSR-6 cache bridge (^7.2).", - "symfony/filesystem": "Required to enable support for relative symbolic links (^7.2).", - "symfony/http-client": "Required to enable support for the Symfony API mail transports (^7.2).", - "symfony/mailgun-mailer": "Required to enable support for the Mailgun mail transport (^7.2).", - "symfony/postmark-mailer": "Required to enable support for the Postmark mail transport (^7.2).", - "symfony/psr-http-message-bridge": "Required to use PSR-7 bridging features (^7.2)." + "pusher/pusher-php-server": "Required to use the Pusher broadcast driver (^6.0 || ^7.0).", + "resend/resend-php": "Required to enable support for the Resend mail transport (^0.10.0 || ^1.0).", + "symfony/cache": "Required to PSR-6 cache bridge (^7.4 || ^8.0).", + "symfony/filesystem": "Required to enable support for relative symbolic links (^7.4 || ^8.0).", + "symfony/http-client": "Required to enable support for the Symfony API mail transports (^7.4 || ^8.0).", + "symfony/mailgun-mailer": "Required to enable support for the Mailgun mail transport (^7.4 || ^8.0).", + "symfony/postmark-mailer": "Required to enable support for the Postmark mail transport (^7.4 || ^8.0).", + "symfony/psr-http-message-bridge": "Required to use PSR-7 bridging features (^7.4 || ^8.0)." }, "type": "library", "extra": { "branch-alias": { - "dev-master": "12.x-dev" + "dev-master": "13.0.x-dev" } }, "autoload": { @@ -1505,31 +1504,31 @@ "issues": "https://github.com/laravel/framework/issues", "source": "https://github.com/laravel/framework" }, - "time": "2026-03-26T14:51:54+00:00" + "time": "2026-03-24T18:42:09+00:00" }, { "name": "laravel/octane", - "version": "v2.14.0", + "version": "v2.17.1", "source": { "type": "git", "url": "https://github.com/laravel/octane.git", - "reference": "5d6eb82d12596f2d73e5c8b23c0abe896938fa0e" + "reference": "eb6150b9aa30956e3a2c04dfebf3a03c5d963a3a" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/laravel/octane/zipball/5d6eb82d12596f2d73e5c8b23c0abe896938fa0e", - "reference": "5d6eb82d12596f2d73e5c8b23c0abe896938fa0e", + "url": "https://api.github.com/repos/laravel/octane/zipball/eb6150b9aa30956e3a2c04dfebf3a03c5d963a3a", + "reference": "eb6150b9aa30956e3a2c04dfebf3a03c5d963a3a", "shasum": "" }, "require": { "laminas/laminas-diactoros": "^3.0", - "laravel/framework": "^10.10.1|^11.0|^12.0", + "laravel/framework": "^10.10.1|^11.0|^12.0|^13.0", "laravel/prompts": "^0.1.24|^0.2.0|^0.3.0", "laravel/serializable-closure": "^1.3|^2.0", "nesbot/carbon": "^2.66.0|^3.0", "php": "^8.1.0", - "symfony/console": "^6.0|^7.0", - "symfony/psr-http-message-bridge": "^2.2.0|^6.4|^7.0" + "symfony/console": "^6.0|^7.0|^8.0", + "symfony/psr-http-message-bridge": "^2.2.0|^6.4|^7.0|^8.0" }, "conflict": { "spiral/roadrunner": "<2023.1.0", @@ -1542,11 +1541,10 @@ "laravel/scout": "^10.2.1", "laravel/socialite": "^5.6.1", "livewire/livewire": "^2.12.3|^3.0", - "mockery/mockery": "^1.5.1", "nunomaduro/collision": "^6.4.0|^7.5.2|^8.0", - "orchestra/testbench": "^8.21|^9.0|^10.0", + "orchestra/testbench": "^8.21|^9.0|^10.0|^11.0", "phpstan/phpstan": "^2.1.7", - "phpunit/phpunit": "^10.4|^11.5", + "phpunit/phpunit": "^10.4|^11.5|^12.0|^13.0", "spiral/roadrunner-cli": "^2.6.0", "spiral/roadrunner-http": "^3.3.0" }, @@ -1595,7 +1593,7 @@ "issues": "https://github.com/laravel/octane/issues", "source": "https://github.com/laravel/octane" }, - "time": "2026-02-20T14:34:10+00:00" + "time": "2026-03-18T14:14:24+00:00" }, { "name": "laravel/prompts", @@ -1719,33 +1717,33 @@ }, { "name": "laravel/tinker", - "version": "v2.11.0", + "version": "v3.0.0", "source": { "type": "git", "url": "https://github.com/laravel/tinker.git", - "reference": "3d34b97c9a1747a81a3fde90482c092bd8b66468" + "reference": "cc74081282ba2e3dae1f0068ccb330370d24634e" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/laravel/tinker/zipball/3d34b97c9a1747a81a3fde90482c092bd8b66468", - "reference": "3d34b97c9a1747a81a3fde90482c092bd8b66468", + "url": "https://api.github.com/repos/laravel/tinker/zipball/cc74081282ba2e3dae1f0068ccb330370d24634e", + "reference": "cc74081282ba2e3dae1f0068ccb330370d24634e", "shasum": "" }, "require": { - "illuminate/console": "^6.0|^7.0|^8.0|^9.0|^10.0|^11.0|^12.0", - "illuminate/contracts": "^6.0|^7.0|^8.0|^9.0|^10.0|^11.0|^12.0", - "illuminate/support": "^6.0|^7.0|^8.0|^9.0|^10.0|^11.0|^12.0", - "php": "^7.2.5|^8.0", - "psy/psysh": "^0.11.1|^0.12.0", - "symfony/var-dumper": "^4.3.4|^5.0|^6.0|^7.0|^8.0" + "illuminate/console": "^8.0|^9.0|^10.0|^11.0|^12.0|^13.0", + "illuminate/contracts": "^8.0|^9.0|^10.0|^11.0|^12.0|^13.0", + "illuminate/support": "^8.0|^9.0|^10.0|^11.0|^12.0|^13.0", + "php": "^8.1", + "psy/psysh": "^0.12.0", + "symfony/var-dumper": "^5.4|^6.0|^7.0|^8.0" }, "require-dev": { "mockery/mockery": "~1.3.3|^1.4.2", "phpstan/phpstan": "^1.10", - "phpunit/phpunit": "^8.5.8|^9.3.3|^10.0" + "phpunit/phpunit": "^10.5|^11.5" }, "suggest": { - "illuminate/database": "The Illuminate Database package (^6.0|^7.0|^8.0|^9.0|^10.0|^11.0|^12.0)." + "illuminate/database": "The Illuminate Database package (^8.0|^9.0|^10.0|^11.0|^12.0|^13.0)." }, "type": "library", "extra": { @@ -1753,6 +1751,9 @@ "providers": [ "Laravel\\Tinker\\TinkerServiceProvider" ] + }, + "branch-alias": { + "dev-master": "3.x-dev" } }, "autoload": { @@ -1779,9 +1780,9 @@ ], "support": { "issues": "https://github.com/laravel/tinker/issues", - "source": "https://github.com/laravel/tinker/tree/v2.11.0" + "source": "https://github.com/laravel/tinker/tree/v3.0.0" }, - "time": "2025-12-19T19:16:45+00:00" + "time": "2026-03-17T14:53:17+00:00" }, { "name": "league/commonmark", @@ -2344,36 +2345,36 @@ }, { "name": "livewire/livewire", - "version": "v3.7.6", + "version": "v3.7.13", "source": { "type": "git", "url": "https://github.com/livewire/livewire.git", - "reference": "276ac156f6ae414990784854a2673e3d23c68b24" + "reference": "152b5a1a3f9ee93b6887a3bad6ab8e6db035efa5" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/livewire/livewire/zipball/276ac156f6ae414990784854a2673e3d23c68b24", - "reference": "276ac156f6ae414990784854a2673e3d23c68b24", + "url": "https://api.github.com/repos/livewire/livewire/zipball/152b5a1a3f9ee93b6887a3bad6ab8e6db035efa5", + "reference": "152b5a1a3f9ee93b6887a3bad6ab8e6db035efa5", "shasum": "" }, "require": { - "illuminate/database": "^10.0|^11.0|^12.0", - "illuminate/routing": "^10.0|^11.0|^12.0", - "illuminate/support": "^10.0|^11.0|^12.0", - "illuminate/validation": "^10.0|^11.0|^12.0", + "illuminate/database": "^10.0|^11.0|^12.0|^13.0", + "illuminate/routing": "^10.0|^11.0|^12.0|^13.0", + "illuminate/support": "^10.0|^11.0|^12.0|^13.0", + "illuminate/validation": "^10.0|^11.0|^12.0|^13.0", "laravel/prompts": "^0.1.24|^0.2|^0.3", "league/mime-type-detection": "^1.9", "php": "^8.1", - "symfony/console": "^6.0|^7.0", - "symfony/http-kernel": "^6.2|^7.0" + "symfony/console": "^6.0|^7.0|^8.0", + "symfony/http-kernel": "^6.2|^7.0|^8.0" }, "require-dev": { "calebporzio/sushi": "^2.1", - "laravel/framework": "^10.15.0|^11.0|^12.0", + "laravel/framework": "^10.15.0|^11.0|^12.0|^13.0", "mockery/mockery": "^1.3.1", - "orchestra/testbench": "^8.21.0|^9.0|^10.0", - "orchestra/testbench-dusk": "^8.24|^9.1|^10.0", - "phpunit/phpunit": "^10.4|^11.5", + "orchestra/testbench": "^8.21.0|^9.0|^10.0|^11.0", + "orchestra/testbench-dusk": "^8.24|^9.1|^10.0|^11.0", + "phpunit/phpunit": "^10.4|^11.5|^12.5", "psy/psysh": "^0.11.22|^0.12" }, "type": "library", @@ -2408,7 +2409,7 @@ "description": "A front-end framework for Laravel.", "support": { "issues": "https://github.com/livewire/livewire/issues", - "source": "https://github.com/livewire/livewire/tree/v3.7.6" + "source": "https://github.com/livewire/livewire/tree/v3.7.13" }, "funding": [ { @@ -2416,32 +2417,32 @@ "type": "github" } ], - "time": "2026-01-23T05:41:38+00:00" + "time": "2026-03-30T22:04:01+00:00" }, { "name": "livewire/volt", - "version": "v1.10.1", + "version": "v1.10.5", "source": { "type": "git", "url": "https://github.com/livewire/volt.git", - "reference": "48cff133990c6261c63ee279fc091af6f6c6654e" + "reference": "32a111951779f9dcf2a08a5704acb940ac9a146c" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/livewire/volt/zipball/48cff133990c6261c63ee279fc091af6f6c6654e", - "reference": "48cff133990c6261c63ee279fc091af6f6c6654e", + "url": "https://api.github.com/repos/livewire/volt/zipball/32a111951779f9dcf2a08a5704acb940ac9a146c", + "reference": "32a111951779f9dcf2a08a5704acb940ac9a146c", "shasum": "" }, "require": { - "laravel/framework": "^10.38.2|^11.0|^12.0", + "laravel/framework": "^10.38.2|^11.0|^12.0|^13.0", "livewire/livewire": "^3.6.1|^4.0", "php": "^8.1" }, "require-dev": { "laravel/folio": "^1.1", - "orchestra/testbench": "^8.36|^9.15|^10.8", + "orchestra/testbench": "^8.36|^9.15|^10.8|^11.0", "pestphp/pest": "^2.9.5|^3.0|^4.0", - "phpstan/phpstan": "^1.10" + "phpstan/phpstan": "^1.10|^2.1" }, "type": "library", "extra": { @@ -2487,7 +2488,7 @@ "issues": "https://github.com/livewire/volt/issues", "source": "https://github.com/livewire/volt" }, - "time": "2025-11-25T16:19:15+00:00" + "time": "2026-03-18T14:16:30+00:00" }, { "name": "monolog/monolog", @@ -4095,47 +4096,39 @@ }, { "name": "symfony/console", - "version": "v7.4.8", + "version": "v8.0.8", "source": { "type": "git", "url": "https://github.com/symfony/console.git", - "reference": "1e92e39c51f95b88e3d66fa2d9f06d1fb45dd707" + "reference": "5b66d385dc58f69652e56f78a4184615e3f2b7f7" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/console/zipball/1e92e39c51f95b88e3d66fa2d9f06d1fb45dd707", - "reference": "1e92e39c51f95b88e3d66fa2d9f06d1fb45dd707", + "url": "https://api.github.com/repos/symfony/console/zipball/5b66d385dc58f69652e56f78a4184615e3f2b7f7", + "reference": "5b66d385dc58f69652e56f78a4184615e3f2b7f7", "shasum": "" }, "require": { - "php": ">=8.2", - "symfony/deprecation-contracts": "^2.5|^3", - "symfony/polyfill-mbstring": "~1.0", + "php": ">=8.4", + "symfony/polyfill-mbstring": "^1.0", "symfony/service-contracts": "^2.5|^3", - "symfony/string": "^7.2|^8.0" - }, - "conflict": { - "symfony/dependency-injection": "<6.4", - "symfony/dotenv": "<6.4", - "symfony/event-dispatcher": "<6.4", - "symfony/lock": "<6.4", - "symfony/process": "<6.4" + "symfony/string": "^7.4|^8.0" }, "provide": { "psr/log-implementation": "1.0|2.0|3.0" }, "require-dev": { "psr/log": "^1|^2|^3", - "symfony/config": "^6.4|^7.0|^8.0", - "symfony/dependency-injection": "^6.4|^7.0|^8.0", - "symfony/event-dispatcher": "^6.4|^7.0|^8.0", - "symfony/http-foundation": "^6.4|^7.0|^8.0", - "symfony/http-kernel": "^6.4|^7.0|^8.0", - "symfony/lock": "^6.4|^7.0|^8.0", - "symfony/messenger": "^6.4|^7.0|^8.0", - "symfony/process": "^6.4|^7.0|^8.0", - "symfony/stopwatch": "^6.4|^7.0|^8.0", - "symfony/var-dumper": "^6.4|^7.0|^8.0" + "symfony/config": "^7.4|^8.0", + "symfony/dependency-injection": "^7.4|^8.0", + "symfony/event-dispatcher": "^7.4|^8.0", + "symfony/http-foundation": "^7.4|^8.0", + "symfony/http-kernel": "^7.4|^8.0", + "symfony/lock": "^7.4|^8.0", + "symfony/messenger": "^7.4|^8.0", + "symfony/process": "^7.4|^8.0", + "symfony/stopwatch": "^7.4|^8.0", + "symfony/var-dumper": "^7.4|^8.0" }, "type": "library", "autoload": { @@ -4169,7 +4162,7 @@ "terminal" ], "support": { - "source": "https://github.com/symfony/console/tree/v7.4.8" + "source": "https://github.com/symfony/console/tree/v8.0.8" }, "funding": [ { @@ -4189,7 +4182,7 @@ "type": "tidelift" } ], - "time": "2026-03-30T13:54:39+00:00" + "time": "2026-03-30T15:14:47+00:00" }, { "name": "symfony/css-selector", @@ -4329,33 +4322,32 @@ }, { "name": "symfony/error-handler", - "version": "v7.4.8", + "version": "v8.0.8", "source": { "type": "git", "url": "https://github.com/symfony/error-handler.git", - "reference": "8dd79d8af777ee6cba2fd4d98da6ffb839f3c0fa" + "reference": "c1119fe8dcfc3825ec74ec061b96ef0c8f281517" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/error-handler/zipball/8dd79d8af777ee6cba2fd4d98da6ffb839f3c0fa", - "reference": "8dd79d8af777ee6cba2fd4d98da6ffb839f3c0fa", + "url": "https://api.github.com/repos/symfony/error-handler/zipball/c1119fe8dcfc3825ec74ec061b96ef0c8f281517", + "reference": "c1119fe8dcfc3825ec74ec061b96ef0c8f281517", "shasum": "" }, "require": { - "php": ">=8.2", + "php": ">=8.4", "psr/log": "^1|^2|^3", "symfony/polyfill-php85": "^1.32", - "symfony/var-dumper": "^6.4|^7.0|^8.0" + "symfony/var-dumper": "^7.4|^8.0" }, "conflict": { - "symfony/deprecation-contracts": "<2.5", - "symfony/http-kernel": "<6.4" + "symfony/deprecation-contracts": "<2.5" }, "require-dev": { - "symfony/console": "^6.4|^7.0|^8.0", + "symfony/console": "^7.4|^8.0", "symfony/deprecation-contracts": "^2.5|^3", - "symfony/http-kernel": "^6.4|^7.0|^8.0", - "symfony/serializer": "^6.4|^7.0|^8.0", + "symfony/http-kernel": "^7.4|^8.0", + "symfony/serializer": "^7.4|^8.0", "symfony/webpack-encore-bundle": "^1.0|^2.0" }, "bin": [ @@ -4387,7 +4379,7 @@ "description": "Provides tools to manage errors and ease debugging PHP code", "homepage": "https://symfony.com", "support": { - "source": "https://github.com/symfony/error-handler/tree/v7.4.8" + "source": "https://github.com/symfony/error-handler/tree/v8.0.8" }, "funding": [ { @@ -4407,7 +4399,7 @@ "type": "tidelift" } ], - "time": "2026-03-24T13:12:05+00:00" + "time": "2026-03-30T15:14:47+00:00" }, { "name": "symfony/event-dispatcher", @@ -4572,23 +4564,23 @@ }, { "name": "symfony/finder", - "version": "v7.4.8", + "version": "v8.0.8", "source": { "type": "git", "url": "https://github.com/symfony/finder.git", - "reference": "e0be088d22278583a82da281886e8c3592fbf149" + "reference": "8da41214757b87d97f181e3d14a4179286151007" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/finder/zipball/e0be088d22278583a82da281886e8c3592fbf149", - "reference": "e0be088d22278583a82da281886e8c3592fbf149", + "url": "https://api.github.com/repos/symfony/finder/zipball/8da41214757b87d97f181e3d14a4179286151007", + "reference": "8da41214757b87d97f181e3d14a4179286151007", "shasum": "" }, "require": { - "php": ">=8.2" + "php": ">=8.4" }, "require-dev": { - "symfony/filesystem": "^6.4|^7.0|^8.0" + "symfony/filesystem": "^7.4|^8.0" }, "type": "library", "autoload": { @@ -4616,7 +4608,7 @@ "description": "Finds files and directories via an intuitive fluent interface", "homepage": "https://symfony.com", "support": { - "source": "https://github.com/symfony/finder/tree/v7.4.8" + "source": "https://github.com/symfony/finder/tree/v8.0.8" }, "funding": [ { @@ -4636,41 +4628,39 @@ "type": "tidelift" } ], - "time": "2026-03-24T13:12:05+00:00" + "time": "2026-03-30T15:14:47+00:00" }, { "name": "symfony/http-foundation", - "version": "v7.4.8", + "version": "v8.0.8", "source": { "type": "git", "url": "https://github.com/symfony/http-foundation.git", - "reference": "9381209597ec66c25be154cbf2289076e64d1eab" + "reference": "02656f7ebeae5c155d659e946f6b3a33df24051b" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/http-foundation/zipball/9381209597ec66c25be154cbf2289076e64d1eab", - "reference": "9381209597ec66c25be154cbf2289076e64d1eab", + "url": "https://api.github.com/repos/symfony/http-foundation/zipball/02656f7ebeae5c155d659e946f6b3a33df24051b", + "reference": "02656f7ebeae5c155d659e946f6b3a33df24051b", "shasum": "" }, "require": { - "php": ">=8.2", - "symfony/deprecation-contracts": "^2.5|^3", + "php": ">=8.4", "symfony/polyfill-mbstring": "^1.1" }, "conflict": { - "doctrine/dbal": "<3.6", - "symfony/cache": "<6.4.12|>=7.0,<7.1.5" + "doctrine/dbal": "<4.3" }, "require-dev": { - "doctrine/dbal": "^3.6|^4", + "doctrine/dbal": "^4.3", "predis/predis": "^1.1|^2.0", - "symfony/cache": "^6.4.12|^7.1.5|^8.0", - "symfony/clock": "^6.4|^7.0|^8.0", - "symfony/dependency-injection": "^6.4|^7.0|^8.0", - "symfony/expression-language": "^6.4|^7.0|^8.0", - "symfony/http-kernel": "^6.4|^7.0|^8.0", - "symfony/mime": "^6.4|^7.0|^8.0", - "symfony/rate-limiter": "^6.4|^7.0|^8.0" + "symfony/cache": "^7.4|^8.0", + "symfony/clock": "^7.4|^8.0", + "symfony/dependency-injection": "^7.4|^8.0", + "symfony/expression-language": "^7.4|^8.0", + "symfony/http-kernel": "^7.4|^8.0", + "symfony/mime": "^7.4|^8.0", + "symfony/rate-limiter": "^7.4|^8.0" }, "type": "library", "autoload": { @@ -4698,7 +4688,7 @@ "description": "Defines an object-oriented layer for the HTTP specification", "homepage": "https://symfony.com", "support": { - "source": "https://github.com/symfony/http-foundation/tree/v7.4.8" + "source": "https://github.com/symfony/http-foundation/tree/v8.0.8" }, "funding": [ { @@ -4718,78 +4708,63 @@ "type": "tidelift" } ], - "time": "2026-03-24T13:12:05+00:00" + "time": "2026-03-30T15:14:47+00:00" }, { "name": "symfony/http-kernel", - "version": "v7.4.8", + "version": "v8.0.8", "source": { "type": "git", "url": "https://github.com/symfony/http-kernel.git", - "reference": "017e76ad089bac281553389269e259e155935e1a" + "reference": "1770f6818d83b2fddc12185025b93f39a90cb628" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/http-kernel/zipball/017e76ad089bac281553389269e259e155935e1a", - "reference": "017e76ad089bac281553389269e259e155935e1a", + "url": "https://api.github.com/repos/symfony/http-kernel/zipball/1770f6818d83b2fddc12185025b93f39a90cb628", + "reference": "1770f6818d83b2fddc12185025b93f39a90cb628", "shasum": "" }, "require": { - "php": ">=8.2", + "php": ">=8.4", "psr/log": "^1|^2|^3", - "symfony/deprecation-contracts": "^2.5|^3", - "symfony/error-handler": "^6.4|^7.0|^8.0", - "symfony/event-dispatcher": "^7.3|^8.0", + "symfony/error-handler": "^7.4|^8.0", + "symfony/event-dispatcher": "^7.4|^8.0", "symfony/http-foundation": "^7.4|^8.0", "symfony/polyfill-ctype": "^1.8" }, "conflict": { - "symfony/browser-kit": "<6.4", - "symfony/cache": "<6.4", - "symfony/config": "<6.4", - "symfony/console": "<6.4", - "symfony/dependency-injection": "<6.4", - "symfony/doctrine-bridge": "<6.4", "symfony/flex": "<2.10", - "symfony/form": "<6.4", - "symfony/http-client": "<6.4", "symfony/http-client-contracts": "<2.5", - "symfony/mailer": "<6.4", - "symfony/messenger": "<6.4", - "symfony/translation": "<6.4", "symfony/translation-contracts": "<2.5", - "symfony/twig-bridge": "<6.4", - "symfony/validator": "<6.4", - "symfony/var-dumper": "<6.4", - "twig/twig": "<3.12" + "twig/twig": "<3.21" }, "provide": { "psr/log-implementation": "1.0|2.0|3.0" }, "require-dev": { "psr/cache": "^1.0|^2.0|^3.0", - "symfony/browser-kit": "^6.4|^7.0|^8.0", - "symfony/clock": "^6.4|^7.0|^8.0", - "symfony/config": "^6.4|^7.0|^8.0", - "symfony/console": "^6.4|^7.0|^8.0", - "symfony/css-selector": "^6.4|^7.0|^8.0", - "symfony/dependency-injection": "^6.4.1|^7.0.1|^8.0", - "symfony/dom-crawler": "^6.4|^7.0|^8.0", - "symfony/expression-language": "^6.4|^7.0|^8.0", - "symfony/finder": "^6.4|^7.0|^8.0", + "symfony/browser-kit": "^7.4|^8.0", + "symfony/clock": "^7.4|^8.0", + "symfony/config": "^7.4|^8.0", + "symfony/console": "^7.4|^8.0", + "symfony/css-selector": "^7.4|^8.0", + "symfony/dependency-injection": "^7.4|^8.0", + "symfony/dom-crawler": "^7.4|^8.0", + "symfony/expression-language": "^7.4|^8.0", + "symfony/finder": "^7.4|^8.0", "symfony/http-client-contracts": "^2.5|^3", - "symfony/process": "^6.4|^7.0|^8.0", - "symfony/property-access": "^7.1|^8.0", - "symfony/routing": "^6.4|^7.0|^8.0", - "symfony/serializer": "^7.1|^8.0", - "symfony/stopwatch": "^6.4|^7.0|^8.0", - "symfony/translation": "^6.4|^7.0|^8.0", + "symfony/process": "^7.4|^8.0", + "symfony/property-access": "^7.4|^8.0", + "symfony/routing": "^7.4|^8.0", + "symfony/serializer": "^7.4|^8.0", + "symfony/stopwatch": "^7.4|^8.0", + "symfony/translation": "^7.4|^8.0", "symfony/translation-contracts": "^2.5|^3", - "symfony/uid": "^6.4|^7.0|^8.0", - "symfony/validator": "^6.4|^7.0|^8.0", - "symfony/var-dumper": "^6.4|^7.0|^8.0", - "symfony/var-exporter": "^6.4|^7.0|^8.0", - "twig/twig": "^3.12" + "symfony/uid": "^7.4|^8.0", + "symfony/validator": "^7.4|^8.0", + "symfony/var-dumper": "^7.4|^8.0", + "symfony/var-exporter": "^7.4|^8.0", + "twig/twig": "^3.21" }, "type": "library", "autoload": { @@ -4817,7 +4792,7 @@ "description": "Provides a structured process for converting a Request into a Response", "homepage": "https://symfony.com", "support": { - "source": "https://github.com/symfony/http-kernel/tree/v7.4.8" + "source": "https://github.com/symfony/http-kernel/tree/v8.0.8" }, "funding": [ { @@ -4837,43 +4812,39 @@ "type": "tidelift" } ], - "time": "2026-03-31T20:57:01+00:00" + "time": "2026-03-31T21:14:05+00:00" }, { "name": "symfony/mailer", - "version": "v7.4.8", + "version": "v8.0.8", "source": { "type": "git", "url": "https://github.com/symfony/mailer.git", - "reference": "f6ea532250b476bfc1b56699b388a1bdbf168f62" + "reference": "ca5f6edaf8780ece814404b58a4482b22b509c56" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/mailer/zipball/f6ea532250b476bfc1b56699b388a1bdbf168f62", - "reference": "f6ea532250b476bfc1b56699b388a1bdbf168f62", + "url": "https://api.github.com/repos/symfony/mailer/zipball/ca5f6edaf8780ece814404b58a4482b22b509c56", + "reference": "ca5f6edaf8780ece814404b58a4482b22b509c56", "shasum": "" }, "require": { "egulias/email-validator": "^2.1.10|^3|^4", - "php": ">=8.2", + "php": ">=8.4", "psr/event-dispatcher": "^1", "psr/log": "^1|^2|^3", - "symfony/event-dispatcher": "^6.4|^7.0|^8.0", - "symfony/mime": "^7.2|^8.0", + "symfony/event-dispatcher": "^7.4|^8.0", + "symfony/mime": "^7.4|^8.0", "symfony/service-contracts": "^2.5|^3" }, "conflict": { - "symfony/http-client-contracts": "<2.5", - "symfony/http-kernel": "<6.4", - "symfony/messenger": "<6.4", - "symfony/mime": "<6.4", - "symfony/twig-bridge": "<6.4" + "symfony/http-client-contracts": "<2.5" }, "require-dev": { - "symfony/console": "^6.4|^7.0|^8.0", - "symfony/http-client": "^6.4|^7.0|^8.0", - "symfony/messenger": "^6.4|^7.0|^8.0", - "symfony/twig-bridge": "^6.4|^7.0|^8.0" + "symfony/console": "^7.4|^8.0", + "symfony/http-client": "^7.4|^8.0", + "symfony/messenger": "^7.4|^8.0", + "symfony/twig-bridge": "^7.4|^8.0" }, "type": "library", "autoload": { @@ -4901,7 +4872,7 @@ "description": "Helps sending emails", "homepage": "https://symfony.com", "support": { - "source": "https://github.com/symfony/mailer/tree/v7.4.8" + "source": "https://github.com/symfony/mailer/tree/v8.0.8" }, "funding": [ { @@ -4921,44 +4892,41 @@ "type": "tidelift" } ], - "time": "2026-03-24T13:12:05+00:00" + "time": "2026-03-30T15:14:47+00:00" }, { "name": "symfony/mime", - "version": "v7.4.8", + "version": "v8.0.8", "source": { "type": "git", "url": "https://github.com/symfony/mime.git", - "reference": "6df02f99998081032da3407a8d6c4e1dcb5d4379" + "reference": "ddff21f14c7ce04b98101b399a9463dce8b0ce66" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/mime/zipball/6df02f99998081032da3407a8d6c4e1dcb5d4379", - "reference": "6df02f99998081032da3407a8d6c4e1dcb5d4379", + "url": "https://api.github.com/repos/symfony/mime/zipball/ddff21f14c7ce04b98101b399a9463dce8b0ce66", + "reference": "ddff21f14c7ce04b98101b399a9463dce8b0ce66", "shasum": "" }, "require": { - "php": ">=8.2", - "symfony/deprecation-contracts": "^2.5|^3", + "php": ">=8.4", "symfony/polyfill-intl-idn": "^1.10", "symfony/polyfill-mbstring": "^1.0" }, "conflict": { "egulias/email-validator": "~3.0.0", "phpdocumentor/reflection-docblock": "<5.2|>=7", - "phpdocumentor/type-resolver": "<1.5.1", - "symfony/mailer": "<6.4", - "symfony/serializer": "<6.4.3|>7.0,<7.0.3" + "phpdocumentor/type-resolver": "<1.5.1" }, "require-dev": { "egulias/email-validator": "^2.1.10|^3.1|^4", "league/html-to-markdown": "^5.0", "phpdocumentor/reflection-docblock": "^5.2|^6.0", - "symfony/dependency-injection": "^6.4|^7.0|^8.0", - "symfony/process": "^6.4|^7.0|^8.0", - "symfony/property-access": "^6.4|^7.0|^8.0", - "symfony/property-info": "^6.4|^7.0|^8.0", - "symfony/serializer": "^6.4.3|^7.0.3|^8.0" + "symfony/dependency-injection": "^7.4|^8.0", + "symfony/process": "^7.4|^8.0", + "symfony/property-access": "^7.4|^8.0", + "symfony/property-info": "^7.4|^8.0", + "symfony/serializer": "^7.4|^8.0" }, "type": "library", "autoload": { @@ -4990,7 +4958,7 @@ "mime-type" ], "support": { - "source": "https://github.com/symfony/mime/tree/v7.4.8" + "source": "https://github.com/symfony/mime/tree/v8.0.8" }, "funding": [ { @@ -5010,7 +4978,7 @@ "type": "tidelift" } ], - "time": "2026-03-30T14:11:46+00:00" + "time": "2026-03-30T15:14:47+00:00" }, { "name": "symfony/polyfill-ctype", @@ -5518,86 +5486,6 @@ ], "time": "2025-01-02T08:10:11+00:00" }, - { - "name": "symfony/polyfill-php83", - "version": "v1.33.0", - "source": { - "type": "git", - "url": "https://github.com/symfony/polyfill-php83.git", - "reference": "17f6f9a6b1735c0f163024d959f700cfbc5155e5" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/symfony/polyfill-php83/zipball/17f6f9a6b1735c0f163024d959f700cfbc5155e5", - "reference": "17f6f9a6b1735c0f163024d959f700cfbc5155e5", - "shasum": "" - }, - "require": { - "php": ">=7.2" - }, - "type": "library", - "extra": { - "thanks": { - "url": "https://github.com/symfony/polyfill", - "name": "symfony/polyfill" - } - }, - "autoload": { - "files": [ - "bootstrap.php" - ], - "psr-4": { - "Symfony\\Polyfill\\Php83\\": "" - }, - "classmap": [ - "Resources/stubs" - ] - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "authors": [ - { - "name": "Nicolas Grekas", - "email": "p@tchwork.com" - }, - { - "name": "Symfony Community", - "homepage": "https://symfony.com/contributors" - } - ], - "description": "Symfony polyfill backporting some PHP 8.3+ features to lower PHP versions", - "homepage": "https://symfony.com", - "keywords": [ - "compatibility", - "polyfill", - "portable", - "shim" - ], - "support": { - "source": "https://github.com/symfony/polyfill-php83/tree/v1.33.0" - }, - "funding": [ - { - "url": "https://symfony.com/sponsor", - "type": "custom" - }, - { - "url": "https://github.com/fabpot", - "type": "github" - }, - { - "url": "https://github.com/nicolas-grekas", - "type": "github" - }, - { - "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", - "type": "tidelift" - } - ], - "time": "2025-07-08T02:45:35+00:00" - }, { "name": "symfony/polyfill-php84", "version": "v1.33.0", @@ -5843,20 +5731,20 @@ }, { "name": "symfony/process", - "version": "v7.4.8", + "version": "v8.0.8", "source": { "type": "git", "url": "https://github.com/symfony/process.git", - "reference": "60f19cd3badc8de688421e21e4305eba50f8089a" + "reference": "cb8939aff03470d1a9d1d1b66d08c6fa71b3bbdc" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/process/zipball/60f19cd3badc8de688421e21e4305eba50f8089a", - "reference": "60f19cd3badc8de688421e21e4305eba50f8089a", + "url": "https://api.github.com/repos/symfony/process/zipball/cb8939aff03470d1a9d1d1b66d08c6fa71b3bbdc", + "reference": "cb8939aff03470d1a9d1d1b66d08c6fa71b3bbdc", "shasum": "" }, "require": { - "php": ">=8.2" + "php": ">=8.4" }, "type": "library", "autoload": { @@ -5884,7 +5772,7 @@ "description": "Executes commands in sub-processes", "homepage": "https://symfony.com", "support": { - "source": "https://github.com/symfony/process/tree/v7.4.8" + "source": "https://github.com/symfony/process/tree/v8.0.8" }, "funding": [ { @@ -5904,41 +5792,40 @@ "type": "tidelift" } ], - "time": "2026-03-24T13:12:05+00:00" + "time": "2026-03-30T15:14:47+00:00" }, { "name": "symfony/psr-http-message-bridge", - "version": "v7.4.4", + "version": "v8.0.8", "source": { "type": "git", "url": "https://github.com/symfony/psr-http-message-bridge.git", - "reference": "929ffe10bbfbb92e711ac3818d416f9daffee067" + "reference": "94facc221260c1d5f20e31ee43cd6c6a824b4a19" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/psr-http-message-bridge/zipball/929ffe10bbfbb92e711ac3818d416f9daffee067", - "reference": "929ffe10bbfbb92e711ac3818d416f9daffee067", + "url": "https://api.github.com/repos/symfony/psr-http-message-bridge/zipball/94facc221260c1d5f20e31ee43cd6c6a824b4a19", + "reference": "94facc221260c1d5f20e31ee43cd6c6a824b4a19", "shasum": "" }, "require": { - "php": ">=8.2", + "php": ">=8.4", "psr/http-message": "^1.0|^2.0", - "symfony/http-foundation": "^6.4|^7.0|^8.0" + "symfony/http-foundation": "^7.4|^8.0" }, "conflict": { - "php-http/discovery": "<1.15", - "symfony/http-kernel": "<6.4" + "php-http/discovery": "<1.15" }, "require-dev": { "nyholm/psr7": "^1.1", "php-http/discovery": "^1.15", "psr/log": "^1.1.4|^2|^3", - "symfony/browser-kit": "^6.4|^7.0|^8.0", - "symfony/config": "^6.4|^7.0|^8.0", - "symfony/event-dispatcher": "^6.4|^7.0|^8.0", - "symfony/framework-bundle": "^6.4.13|^7.1.6|^8.0", - "symfony/http-kernel": "^6.4.13|^7.1.6|^8.0", - "symfony/runtime": "^6.4.13|^7.1.6|^8.0" + "symfony/browser-kit": "^7.4|^8.0", + "symfony/config": "^7.4|^8.0", + "symfony/event-dispatcher": "^7.4|^8.0", + "symfony/framework-bundle": "^7.4|^8.0", + "symfony/http-kernel": "^7.4|^8.0", + "symfony/runtime": "^7.4|^8.0" }, "type": "symfony-bridge", "autoload": { @@ -5972,7 +5859,7 @@ "psr-7" ], "support": { - "source": "https://github.com/symfony/psr-http-message-bridge/tree/v7.4.4" + "source": "https://github.com/symfony/psr-http-message-bridge/tree/v8.0.8" }, "funding": [ { @@ -5992,38 +5879,33 @@ "type": "tidelift" } ], - "time": "2026-01-03T23:30:35+00:00" + "time": "2026-03-30T15:14:47+00:00" }, { "name": "symfony/routing", - "version": "v7.4.8", + "version": "v8.0.8", "source": { "type": "git", "url": "https://github.com/symfony/routing.git", - "reference": "9608de9873ec86e754fb6c0a0fa7e5f1a960eb6b" + "reference": "0de330ec2ea922a7b08ec45615bd51179de7fda4" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/routing/zipball/9608de9873ec86e754fb6c0a0fa7e5f1a960eb6b", - "reference": "9608de9873ec86e754fb6c0a0fa7e5f1a960eb6b", + "url": "https://api.github.com/repos/symfony/routing/zipball/0de330ec2ea922a7b08ec45615bd51179de7fda4", + "reference": "0de330ec2ea922a7b08ec45615bd51179de7fda4", "shasum": "" }, "require": { - "php": ">=8.2", + "php": ">=8.4", "symfony/deprecation-contracts": "^2.5|^3" }, - "conflict": { - "symfony/config": "<6.4", - "symfony/dependency-injection": "<6.4", - "symfony/yaml": "<6.4" - }, "require-dev": { "psr/log": "^1|^2|^3", - "symfony/config": "^6.4|^7.0|^8.0", - "symfony/dependency-injection": "^6.4|^7.0|^8.0", - "symfony/expression-language": "^6.4|^7.0|^8.0", - "symfony/http-foundation": "^6.4|^7.0|^8.0", - "symfony/yaml": "^6.4|^7.0|^8.0" + "symfony/config": "^7.4|^8.0", + "symfony/dependency-injection": "^7.4|^8.0", + "symfony/expression-language": "^7.4|^8.0", + "symfony/http-foundation": "^7.4|^8.0", + "symfony/yaml": "^7.4|^8.0" }, "type": "library", "autoload": { @@ -6057,7 +5939,7 @@ "url" ], "support": { - "source": "https://github.com/symfony/routing/tree/v7.4.8" + "source": "https://github.com/symfony/routing/tree/v8.0.8" }, "funding": [ { @@ -6077,7 +5959,7 @@ "type": "tidelift" } ], - "time": "2026-03-24T13:12:05+00:00" + "time": "2026-03-30T15:14:47+00:00" }, { "name": "symfony/service-contracts", @@ -6433,24 +6315,24 @@ }, { "name": "symfony/uid", - "version": "v7.4.8", + "version": "v8.0.8", "source": { "type": "git", "url": "https://github.com/symfony/uid.git", - "reference": "6883ebdf7bf6a12b37519dbc0df62b0222401b56" + "reference": "f63fa6096a24147283bce4d29327d285326438e0" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/uid/zipball/6883ebdf7bf6a12b37519dbc0df62b0222401b56", - "reference": "6883ebdf7bf6a12b37519dbc0df62b0222401b56", + "url": "https://api.github.com/repos/symfony/uid/zipball/f63fa6096a24147283bce4d29327d285326438e0", + "reference": "f63fa6096a24147283bce4d29327d285326438e0", "shasum": "" }, "require": { - "php": ">=8.2", + "php": ">=8.4", "symfony/polyfill-uuid": "^1.15" }, "require-dev": { - "symfony/console": "^6.4|^7.0|^8.0" + "symfony/console": "^7.4|^8.0" }, "type": "library", "autoload": { @@ -6487,7 +6369,7 @@ "uuid" ], "support": { - "source": "https://github.com/symfony/uid/tree/v7.4.8" + "source": "https://github.com/symfony/uid/tree/v8.0.8" }, "funding": [ { @@ -6507,35 +6389,35 @@ "type": "tidelift" } ], - "time": "2026-03-24T13:12:05+00:00" + "time": "2026-03-30T15:14:47+00:00" }, { "name": "symfony/var-dumper", - "version": "v7.4.8", + "version": "v8.0.8", "source": { "type": "git", "url": "https://github.com/symfony/var-dumper.git", - "reference": "9510c3966f749a1d1ff0059e1eabef6cc621e7fd" + "reference": "cfb7badd53bf4177f6e9416cfbbccc13c0e773a1" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/var-dumper/zipball/9510c3966f749a1d1ff0059e1eabef6cc621e7fd", - "reference": "9510c3966f749a1d1ff0059e1eabef6cc621e7fd", + "url": "https://api.github.com/repos/symfony/var-dumper/zipball/cfb7badd53bf4177f6e9416cfbbccc13c0e773a1", + "reference": "cfb7badd53bf4177f6e9416cfbbccc13c0e773a1", "shasum": "" }, "require": { - "php": ">=8.2", - "symfony/deprecation-contracts": "^2.5|^3", - "symfony/polyfill-mbstring": "~1.0" + "php": ">=8.4", + "symfony/polyfill-mbstring": "^1.0" }, "conflict": { - "symfony/console": "<6.4" + "symfony/console": "<7.4", + "symfony/error-handler": "<7.4" }, "require-dev": { - "symfony/console": "^6.4|^7.0|^8.0", - "symfony/http-kernel": "^6.4|^7.0|^8.0", - "symfony/process": "^6.4|^7.0|^8.0", - "symfony/uid": "^6.4|^7.0|^8.0", + "symfony/console": "^7.4|^8.0", + "symfony/http-kernel": "^7.4|^8.0", + "symfony/process": "^7.4|^8.0", + "symfony/uid": "^7.4|^8.0", "twig/twig": "^3.12" }, "bin": [ @@ -6574,7 +6456,7 @@ "dump" ], "support": { - "source": "https://github.com/symfony/var-dumper/tree/v7.4.8" + "source": "https://github.com/symfony/var-dumper/tree/v8.0.8" }, "funding": [ { @@ -6594,7 +6476,7 @@ "type": "tidelift" } ], - "time": "2026-03-30T13:44:50+00:00" + "time": "2026-03-31T07:15:36+00:00" }, { "name": "tijsverkoyen/css-to-inline-styles", @@ -6813,16 +6695,16 @@ "packages-dev": [ { "name": "brianium/paratest", - "version": "v7.8.5", + "version": "v7.20.0", "source": { "type": "git", "url": "https://github.com/paratestphp/paratest.git", - "reference": "9b324c8fc319cf9728b581c7a90e1c8f6361c5e5" + "reference": "81c80677c9ec0ed4ef16b246167f11dec81a6e3d" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/paratestphp/paratest/zipball/9b324c8fc319cf9728b581c7a90e1c8f6361c5e5", - "reference": "9b324c8fc319cf9728b581c7a90e1c8f6361c5e5", + "url": "https://api.github.com/repos/paratestphp/paratest/zipball/81c80677c9ec0ed4ef16b246167f11dec81a6e3d", + "reference": "81c80677c9ec0ed4ef16b246167f11dec81a6e3d", "shasum": "" }, "require": { @@ -6832,25 +6714,25 @@ "ext-simplexml": "*", "fidry/cpu-core-counter": "^1.3.0", "jean85/pretty-package-versions": "^2.1.1", - "php": "~8.2.0 || ~8.3.0 || ~8.4.0 || ~8.5.0", - "phpunit/php-code-coverage": "^11.0.12", - "phpunit/php-file-iterator": "^5.1.0", - "phpunit/php-timer": "^7.0.1", - "phpunit/phpunit": "^11.5.46", - "sebastian/environment": "^7.2.1", - "symfony/console": "^6.4.22 || ^7.3.4 || ^8.0.3", - "symfony/process": "^6.4.20 || ^7.3.4 || ^8.0.3" + "php": "~8.3.0 || ~8.4.0 || ~8.5.0", + "phpunit/php-code-coverage": "^12.5.3 || ^13.0.1", + "phpunit/php-file-iterator": "^6.0.1 || ^7", + "phpunit/php-timer": "^8 || ^9", + "phpunit/phpunit": "^12.5.14 || ^13.0.5", + "sebastian/environment": "^8.0.3 || ^9", + "symfony/console": "^7.4.7 || ^8.0.7", + "symfony/process": "^7.4.5 || ^8.0.5" }, "require-dev": { - "doctrine/coding-standard": "^12.0.0", + "doctrine/coding-standard": "^14.0.0", + "ext-pcntl": "*", "ext-pcov": "*", "ext-posix": "*", - "phpstan/phpstan": "^2.1.33", - "phpstan/phpstan-deprecation-rules": "^2.0.3", - "phpstan/phpstan-phpunit": "^2.0.11", - "phpstan/phpstan-strict-rules": "^2.0.7", - "squizlabs/php_codesniffer": "^3.13.5", - "symfony/filesystem": "^6.4.13 || ^7.3.2 || ^8.0.1" + "phpstan/phpstan": "^2.1.44", + "phpstan/phpstan-deprecation-rules": "^2.0.4", + "phpstan/phpstan-phpunit": "^2.0.16", + "phpstan/phpstan-strict-rules": "^2.0.10", + "symfony/filesystem": "^7.4.6 || ^8.0.6" }, "bin": [ "bin/paratest", @@ -6890,7 +6772,7 @@ ], "support": { "issues": "https://github.com/paratestphp/paratest/issues", - "source": "https://github.com/paratestphp/paratest/tree/v7.8.5" + "source": "https://github.com/paratestphp/paratest/tree/v7.20.0" }, "funding": [ { @@ -6902,7 +6784,7 @@ "type": "paypal" } ], - "time": "2026-01-08T08:02:38+00:00" + "time": "2026-03-29T15:46:14+00:00" }, { "name": "doctrine/deprecations", @@ -7260,29 +7142,29 @@ }, { "name": "laravel/breeze", - "version": "v2.3.8", + "version": "v2.4.1", "source": { "type": "git", "url": "https://github.com/laravel/breeze.git", - "reference": "1a29c5792818bd4cddf70b5f743a227e02fbcfcd" + "reference": "28cefeaf6af20177ddf5cc7b93e87e4ad79d533f" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/laravel/breeze/zipball/1a29c5792818bd4cddf70b5f743a227e02fbcfcd", - "reference": "1a29c5792818bd4cddf70b5f743a227e02fbcfcd", + "url": "https://api.github.com/repos/laravel/breeze/zipball/28cefeaf6af20177ddf5cc7b93e87e4ad79d533f", + "reference": "28cefeaf6af20177ddf5cc7b93e87e4ad79d533f", "shasum": "" }, "require": { - "illuminate/console": "^11.0|^12.0", - "illuminate/filesystem": "^11.0|^12.0", - "illuminate/support": "^11.0|^12.0", - "illuminate/validation": "^11.0|^12.0", + "illuminate/console": "^11.0|^12.0|^13.0", + "illuminate/filesystem": "^11.0|^12.0|^13.0", + "illuminate/support": "^11.0|^12.0|^13.0", + "illuminate/validation": "^11.0|^12.0|^13.0", "php": "^8.2.0", - "symfony/console": "^7.0" + "symfony/console": "^7.0|^8.0" }, "require-dev": { - "laravel/framework": "^11.0|^12.0", - "orchestra/testbench-core": "^9.0|^10.0", + "laravel/framework": "^11.0|^12.0|^13.0", + "orchestra/testbench-core": "^9.0|^10.0|^11.0", "phpstan/phpstan": "^2.0" }, "type": "library", @@ -7317,41 +7199,42 @@ "issues": "https://github.com/laravel/breeze/issues", "source": "https://github.com/laravel/breeze" }, - "time": "2025-07-18T18:49:59+00:00" + "time": "2026-03-10T19:59:01+00:00" }, { "name": "laravel/pail", - "version": "v1.2.4", + "version": "v1.2.6", "source": { "type": "git", "url": "https://github.com/laravel/pail.git", - "reference": "49f92285ff5d6fc09816e976a004f8dec6a0ea30" + "reference": "aa71a01c309e7f66bc2ec4fb1a59291b82eb4abf" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/laravel/pail/zipball/49f92285ff5d6fc09816e976a004f8dec6a0ea30", - "reference": "49f92285ff5d6fc09816e976a004f8dec6a0ea30", + "url": "https://api.github.com/repos/laravel/pail/zipball/aa71a01c309e7f66bc2ec4fb1a59291b82eb4abf", + "reference": "aa71a01c309e7f66bc2ec4fb1a59291b82eb4abf", "shasum": "" }, "require": { "ext-mbstring": "*", - "illuminate/console": "^10.24|^11.0|^12.0", - "illuminate/contracts": "^10.24|^11.0|^12.0", - "illuminate/log": "^10.24|^11.0|^12.0", - "illuminate/process": "^10.24|^11.0|^12.0", - "illuminate/support": "^10.24|^11.0|^12.0", + "illuminate/console": "^10.24|^11.0|^12.0|^13.0", + "illuminate/contracts": "^10.24|^11.0|^12.0|^13.0", + "illuminate/log": "^10.24|^11.0|^12.0|^13.0", + "illuminate/process": "^10.24|^11.0|^12.0|^13.0", + "illuminate/support": "^10.24|^11.0|^12.0|^13.0", "nunomaduro/termwind": "^1.15|^2.0", "php": "^8.2", - "symfony/console": "^6.0|^7.0" + "symfony/console": "^6.0|^7.0|^8.0" }, "require-dev": { - "laravel/framework": "^10.24|^11.0|^12.0", + "laravel/framework": "^10.24|^11.0|^12.0|^13.0", "laravel/pint": "^1.13", - "orchestra/testbench-core": "^8.13|^9.17|^10.8", + "orchestra/testbench-core": "^8.13|^9.17|^10.8|^11.0", "pestphp/pest": "^2.20|^3.0|^4.0", "pestphp/pest-plugin-type-coverage": "^2.3|^3.0|^4.0", "phpstan/phpstan": "^1.12.27", - "symfony/var-dumper": "^6.3|^7.0" + "symfony/var-dumper": "^6.3|^7.0|^8.0", + "symfony/yaml": "^6.3|^7.0|^8.0" }, "type": "library", "extra": { @@ -7396,20 +7279,20 @@ "issues": "https://github.com/laravel/pail/issues", "source": "https://github.com/laravel/pail" }, - "time": "2025-11-20T16:29:35+00:00" + "time": "2026-02-09T13:44:54+00:00" }, { "name": "laravel/pint", - "version": "v1.27.0", + "version": "v1.29.0", "source": { "type": "git", "url": "https://github.com/laravel/pint.git", - "reference": "c67b4195b75491e4dfc6b00b1c78b68d86f54c90" + "reference": "bdec963f53172c5e36330f3a400604c69bf02d39" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/laravel/pint/zipball/c67b4195b75491e4dfc6b00b1c78b68d86f54c90", - "reference": "c67b4195b75491e4dfc6b00b1c78b68d86f54c90", + "url": "https://api.github.com/repos/laravel/pint/zipball/bdec963f53172c5e36330f3a400604c69bf02d39", + "reference": "bdec963f53172c5e36330f3a400604c69bf02d39", "shasum": "" }, "require": { @@ -7420,13 +7303,14 @@ "php": "^8.2.0" }, "require-dev": { - "friendsofphp/php-cs-fixer": "^3.92.4", - "illuminate/view": "^12.44.0", - "larastan/larastan": "^3.8.1", - "laravel-zero/framework": "^12.0.4", + "friendsofphp/php-cs-fixer": "^3.94.2", + "illuminate/view": "^12.54.1", + "larastan/larastan": "^3.9.3", + "laravel-zero/framework": "^12.0.5", "mockery/mockery": "^1.6.12", - "nunomaduro/termwind": "^2.3.3", - "pestphp/pest": "^3.8.4" + "nunomaduro/termwind": "^2.4.0", + "pestphp/pest": "^3.8.6", + "shipfastlabs/agent-detector": "^1.1.0" }, "bin": [ "builds/pint" @@ -7463,32 +7347,32 @@ "issues": "https://github.com/laravel/pint/issues", "source": "https://github.com/laravel/pint" }, - "time": "2026-01-05T16:49:17+00:00" + "time": "2026-03-12T15:51:39+00:00" }, { "name": "laravel/sail", - "version": "v1.52.0", + "version": "v1.55.0", "source": { "type": "git", "url": "https://github.com/laravel/sail.git", - "reference": "64ac7d8abb2dbcf2b76e61289451bae79066b0b3" + "reference": "67dc1b72da4e066a2fb54c1c7582fd2f140ea191" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/laravel/sail/zipball/64ac7d8abb2dbcf2b76e61289451bae79066b0b3", - "reference": "64ac7d8abb2dbcf2b76e61289451bae79066b0b3", + "url": "https://api.github.com/repos/laravel/sail/zipball/67dc1b72da4e066a2fb54c1c7582fd2f140ea191", + "reference": "67dc1b72da4e066a2fb54c1c7582fd2f140ea191", "shasum": "" }, "require": { - "illuminate/console": "^9.52.16|^10.0|^11.0|^12.0", - "illuminate/contracts": "^9.52.16|^10.0|^11.0|^12.0", - "illuminate/support": "^9.52.16|^10.0|^11.0|^12.0", + "illuminate/console": "^9.52.16|^10.0|^11.0|^12.0|^13.0", + "illuminate/contracts": "^9.52.16|^10.0|^11.0|^12.0|^13.0", + "illuminate/support": "^9.52.16|^10.0|^11.0|^12.0|^13.0", "php": "^8.0", - "symfony/console": "^6.0|^7.0", - "symfony/yaml": "^6.0|^7.0" + "symfony/console": "^6.0|^7.0|^8.0", + "symfony/yaml": "^6.0|^7.0|^8.0" }, "require-dev": { - "orchestra/testbench": "^7.0|^8.0|^9.0|^10.0", + "orchestra/testbench": "^7.0|^8.0|^9.0|^10.0|^11.0", "phpstan/phpstan": "^2.0" }, "bin": [ @@ -7526,7 +7410,7 @@ "issues": "https://github.com/laravel/sail/issues", "source": "https://github.com/laravel/sail" }, - "time": "2026-01-01T02:46:03+00:00" + "time": "2026-03-23T15:56:34+00:00" }, { "name": "mockery/mockery", @@ -7673,23 +7557,23 @@ }, { "name": "nunomaduro/collision", - "version": "v8.9.1", + "version": "v8.9.2", "source": { "type": "git", "url": "https://github.com/nunomaduro/collision.git", - "reference": "a1ed3fa530fd60bc515f9303e8520fcb7d4bd935" + "reference": "6eb16883e74fd725ac64dbe81544c961ab448ba5" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/nunomaduro/collision/zipball/a1ed3fa530fd60bc515f9303e8520fcb7d4bd935", - "reference": "a1ed3fa530fd60bc515f9303e8520fcb7d4bd935", + "url": "https://api.github.com/repos/nunomaduro/collision/zipball/6eb16883e74fd725ac64dbe81544c961ab448ba5", + "reference": "6eb16883e74fd725ac64dbe81544c961ab448ba5", "shasum": "" }, "require": { "filp/whoops": "^2.18.4", "nunomaduro/termwind": "^2.4.0", "php": "^8.2.0", - "symfony/console": "^7.4.4 || ^8.0.4" + "symfony/console": "^7.4.8 || ^8.0.4" }, "conflict": { "laravel/framework": "<11.48.0 || >=14.0.0", @@ -7697,12 +7581,12 @@ }, "require-dev": { "brianium/paratest": "^7.8.5", - "larastan/larastan": "^3.9.2", - "laravel/framework": "^11.48.0 || ^12.52.0", - "laravel/pint": "^1.27.1", - "orchestra/testbench-core": "^9.12.0 || ^10.9.0", - "pestphp/pest": "^3.8.5 || ^4.4.1 || ^5.0.0", - "sebastian/environment": "^7.2.1 || ^8.0.3 || ^9.0.0" + "larastan/larastan": "^3.9.3", + "laravel/framework": "^11.48.0 || ^12.56.0 || ^13.2.0", + "laravel/pint": "^1.29.0", + "orchestra/testbench-core": "^9.12.0 || ^10.12.1 || ^11.0.0", + "pestphp/pest": "^3.8.5 || ^4.4.3 || ^5.0.0", + "sebastian/environment": "^7.2.1 || ^8.0.4 || ^9.0.0" }, "type": "library", "extra": { @@ -7765,42 +7649,45 @@ "type": "patreon" } ], - "time": "2026-02-17T17:33:08+00:00" + "time": "2026-03-31T21:51:27+00:00" }, { "name": "pestphp/pest", - "version": "v3.8.6", + "version": "v4.4.3", "source": { "type": "git", "url": "https://github.com/pestphp/pest.git", - "reference": "8871a6f5ef1de8e7c8dee2a270991449a7b6af73" + "reference": "e6ab897594312728ef2e32d586cb4f6780b1b495" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/pestphp/pest/zipball/8871a6f5ef1de8e7c8dee2a270991449a7b6af73", - "reference": "8871a6f5ef1de8e7c8dee2a270991449a7b6af73", + "url": "https://api.github.com/repos/pestphp/pest/zipball/e6ab897594312728ef2e32d586cb4f6780b1b495", + "reference": "e6ab897594312728ef2e32d586cb4f6780b1b495", "shasum": "" }, "require": { - "brianium/paratest": "^7.8.5", + "brianium/paratest": "^7.19.2", "nunomaduro/collision": "^8.9.1", "nunomaduro/termwind": "^2.4.0", - "pestphp/pest-plugin": "^3.0.0", - "pestphp/pest-plugin-arch": "^3.1.1", - "pestphp/pest-plugin-mutate": "^3.0.5", - "php": "^8.2.0", - "phpunit/phpunit": "^11.5.50" + "pestphp/pest-plugin": "^4.0.0", + "pestphp/pest-plugin-arch": "^4.0.0", + "pestphp/pest-plugin-mutate": "^4.0.1", + "pestphp/pest-plugin-profanity": "^4.2.1", + "php": "^8.3.0", + "phpunit/phpunit": "^12.5.14", + "symfony/process": "^7.4.5|^8.0.5" }, "conflict": { - "filp/whoops": "<2.16.0", - "phpunit/phpunit": ">11.5.50", - "sebastian/exporter": "<6.0.0", + "filp/whoops": "<2.18.3", + "phpunit/phpunit": ">12.5.14", + "sebastian/exporter": "<7.0.0", "webmozart/assert": "<1.11.0" }, "require-dev": { - "pestphp/pest-dev-tools": "^3.4.0", - "pestphp/pest-plugin-type-coverage": "^3.6.1", - "symfony/process": "^7.4.5" + "pestphp/pest-dev-tools": "^4.1.0", + "pestphp/pest-plugin-browser": "^4.3.0", + "pestphp/pest-plugin-type-coverage": "^4.0.3", + "psy/psysh": "^0.12.21" }, "bin": [ "bin/pest" @@ -7826,6 +7713,7 @@ "Pest\\Plugins\\Snapshot", "Pest\\Plugins\\Verbose", "Pest\\Plugins\\Version", + "Pest\\Plugins\\Shard", "Pest\\Plugins\\Parallel" ] }, @@ -7865,7 +7753,7 @@ ], "support": { "issues": "https://github.com/pestphp/pest/issues", - "source": "https://github.com/pestphp/pest/tree/v3.8.6" + "source": "https://github.com/pestphp/pest/tree/v4.4.3" }, "funding": [ { @@ -7877,34 +7765,34 @@ "type": "github" } ], - "time": "2026-03-10T21:04:33+00:00" + "time": "2026-03-21T13:14:39+00:00" }, { "name": "pestphp/pest-plugin", - "version": "v3.0.0", + "version": "v4.0.0", "source": { "type": "git", "url": "https://github.com/pestphp/pest-plugin.git", - "reference": "e79b26c65bc11c41093b10150c1341cc5cdbea83" + "reference": "9d4b93d7f73d3f9c3189bb22c220fef271cdf568" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/pestphp/pest-plugin/zipball/e79b26c65bc11c41093b10150c1341cc5cdbea83", - "reference": "e79b26c65bc11c41093b10150c1341cc5cdbea83", + "url": "https://api.github.com/repos/pestphp/pest-plugin/zipball/9d4b93d7f73d3f9c3189bb22c220fef271cdf568", + "reference": "9d4b93d7f73d3f9c3189bb22c220fef271cdf568", "shasum": "" }, "require": { "composer-plugin-api": "^2.0.0", "composer-runtime-api": "^2.2.2", - "php": "^8.2" + "php": "^8.3" }, "conflict": { - "pestphp/pest": "<3.0.0" + "pestphp/pest": "<4.0.0" }, "require-dev": { - "composer/composer": "^2.7.9", - "pestphp/pest": "^3.0.0", - "pestphp/pest-dev-tools": "^3.0.0" + "composer/composer": "^2.8.10", + "pestphp/pest": "^4.0.0", + "pestphp/pest-dev-tools": "^4.0.0" }, "type": "composer-plugin", "extra": { @@ -7931,7 +7819,7 @@ "unit" ], "support": { - "source": "https://github.com/pestphp/pest-plugin/tree/v3.0.0" + "source": "https://github.com/pestphp/pest-plugin/tree/v4.0.0" }, "funding": [ { @@ -7947,30 +7835,30 @@ "type": "patreon" } ], - "time": "2024-09-08T23:21:41+00:00" + "time": "2025-08-20T12:35:58+00:00" }, { "name": "pestphp/pest-plugin-arch", - "version": "v3.1.1", + "version": "v4.0.0", "source": { "type": "git", "url": "https://github.com/pestphp/pest-plugin-arch.git", - "reference": "db7bd9cb1612b223e16618d85475c6f63b9c8daa" + "reference": "25bb17e37920ccc35cbbcda3b00d596aadf3e58d" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/pestphp/pest-plugin-arch/zipball/db7bd9cb1612b223e16618d85475c6f63b9c8daa", - "reference": "db7bd9cb1612b223e16618d85475c6f63b9c8daa", + "url": "https://api.github.com/repos/pestphp/pest-plugin-arch/zipball/25bb17e37920ccc35cbbcda3b00d596aadf3e58d", + "reference": "25bb17e37920ccc35cbbcda3b00d596aadf3e58d", "shasum": "" }, "require": { - "pestphp/pest-plugin": "^3.0.0", - "php": "^8.2", - "ta-tikoma/phpunit-architecture-test": "^0.8.4" + "pestphp/pest-plugin": "^4.0.0", + "php": "^8.3", + "ta-tikoma/phpunit-architecture-test": "^0.8.5" }, "require-dev": { - "pestphp/pest": "^3.8.1", - "pestphp/pest-dev-tools": "^3.4.0" + "pestphp/pest": "^4.0.0", + "pestphp/pest-dev-tools": "^4.0.0" }, "type": "library", "extra": { @@ -8005,7 +7893,7 @@ "unit" ], "support": { - "source": "https://github.com/pestphp/pest-plugin-arch/tree/v3.1.1" + "source": "https://github.com/pestphp/pest-plugin-arch/tree/v4.0.0" }, "funding": [ { @@ -8017,31 +7905,31 @@ "type": "github" } ], - "time": "2025-04-16T22:59:48+00:00" + "time": "2025-08-20T13:10:51+00:00" }, { "name": "pestphp/pest-plugin-laravel", - "version": "v3.2.0", + "version": "v4.1.0", "source": { "type": "git", "url": "https://github.com/pestphp/pest-plugin-laravel.git", - "reference": "6801be82fd92b96e82dd72e563e5674b1ce365fc" + "reference": "3057a36669ff11416cc0dc2b521b3aec58c488d0" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/pestphp/pest-plugin-laravel/zipball/6801be82fd92b96e82dd72e563e5674b1ce365fc", - "reference": "6801be82fd92b96e82dd72e563e5674b1ce365fc", + "url": "https://api.github.com/repos/pestphp/pest-plugin-laravel/zipball/3057a36669ff11416cc0dc2b521b3aec58c488d0", + "reference": "3057a36669ff11416cc0dc2b521b3aec58c488d0", "shasum": "" }, "require": { - "laravel/framework": "^11.39.1|^12.9.2", - "pestphp/pest": "^3.8.2", - "php": "^8.2.0" + "laravel/framework": "^11.45.2|^12.52.0|^13.0", + "pestphp/pest": "^4.4.1", + "php": "^8.3.0" }, "require-dev": { - "laravel/dusk": "^8.2.13|dev-develop", - "orchestra/testbench": "^9.9.0|^10.2.1", - "pestphp/pest-dev-tools": "^3.4.0" + "laravel/dusk": "^8.3.6", + "orchestra/testbench": "^9.13.0|^10.9.0|^11.0", + "pestphp/pest-dev-tools": "^4.1.0" }, "type": "library", "extra": { @@ -8079,7 +7967,7 @@ "unit" ], "support": { - "source": "https://github.com/pestphp/pest-plugin-laravel/tree/v3.2.0" + "source": "https://github.com/pestphp/pest-plugin-laravel/tree/v4.1.0" }, "funding": [ { @@ -8091,32 +7979,32 @@ "type": "github" } ], - "time": "2025-04-21T07:40:53+00:00" + "time": "2026-02-21T00:29:45+00:00" }, { "name": "pestphp/pest-plugin-mutate", - "version": "v3.0.5", + "version": "v4.0.1", "source": { "type": "git", "url": "https://github.com/pestphp/pest-plugin-mutate.git", - "reference": "e10dbdc98c9e2f3890095b4fe2144f63a5717e08" + "reference": "d9b32b60b2385e1688a68cc227594738ec26d96c" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/pestphp/pest-plugin-mutate/zipball/e10dbdc98c9e2f3890095b4fe2144f63a5717e08", - "reference": "e10dbdc98c9e2f3890095b4fe2144f63a5717e08", + "url": "https://api.github.com/repos/pestphp/pest-plugin-mutate/zipball/d9b32b60b2385e1688a68cc227594738ec26d96c", + "reference": "d9b32b60b2385e1688a68cc227594738ec26d96c", "shasum": "" }, "require": { - "nikic/php-parser": "^5.2.0", - "pestphp/pest-plugin": "^3.0.0", - "php": "^8.2", + "nikic/php-parser": "^5.6.1", + "pestphp/pest-plugin": "^4.0.0", + "php": "^8.3", "psr/simple-cache": "^3.0.0" }, "require-dev": { - "pestphp/pest": "^3.0.8", - "pestphp/pest-dev-tools": "^3.0.0", - "pestphp/pest-plugin-type-coverage": "^3.0.0" + "pestphp/pest": "^4.0.0", + "pestphp/pest-dev-tools": "^4.0.0", + "pestphp/pest-plugin-type-coverage": "^4.0.0" }, "type": "library", "autoload": { @@ -8129,6 +8017,10 @@ "MIT" ], "authors": [ + { + "name": "Nuno Maduro", + "email": "enunomaduro@gmail.com" + }, { "name": "Sandro Gehri", "email": "sandrogehri@gmail.com" @@ -8147,7 +8039,7 @@ "unit" ], "support": { - "source": "https://github.com/pestphp/pest-plugin-mutate/tree/v3.0.5" + "source": "https://github.com/pestphp/pest-plugin-mutate/tree/v4.0.1" }, "funding": [ { @@ -8163,7 +8055,63 @@ "type": "github" } ], - "time": "2024-09-22T07:54:40+00:00" + "time": "2025-08-21T20:19:25+00:00" + }, + { + "name": "pestphp/pest-plugin-profanity", + "version": "v4.2.1", + "source": { + "type": "git", + "url": "https://github.com/pestphp/pest-plugin-profanity.git", + "reference": "343cfa6f3564b7e35df0ebb77b7fa97039f72b27" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/pestphp/pest-plugin-profanity/zipball/343cfa6f3564b7e35df0ebb77b7fa97039f72b27", + "reference": "343cfa6f3564b7e35df0ebb77b7fa97039f72b27", + "shasum": "" + }, + "require": { + "pestphp/pest-plugin": "^4.0.0", + "php": "^8.3" + }, + "require-dev": { + "faissaloux/pest-plugin-inside": "^1.9", + "pestphp/pest": "^4.0.0", + "pestphp/pest-dev-tools": "^4.0.0" + }, + "type": "library", + "extra": { + "pest": { + "plugins": [ + "Pest\\Profanity\\Plugin" + ] + } + }, + "autoload": { + "psr-4": { + "Pest\\Profanity\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "description": "The Pest Profanity Plugin", + "keywords": [ + "framework", + "pest", + "php", + "plugin", + "profanity", + "test", + "testing", + "unit" + ], + "support": { + "source": "https://github.com/pestphp/pest-plugin-profanity/tree/v4.2.1" + }, + "time": "2025-12-08T00:13:17+00:00" }, { "name": "phar-io/manifest", @@ -8508,16 +8456,16 @@ }, { "name": "phpunit/php-code-coverage", - "version": "11.0.12", + "version": "12.5.3", "source": { "type": "git", "url": "https://github.com/sebastianbergmann/php-code-coverage.git", - "reference": "2c1ed04922802c15e1de5d7447b4856de949cf56" + "reference": "b015312f28dd75b75d3422ca37dff2cd1a565e8d" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/sebastianbergmann/php-code-coverage/zipball/2c1ed04922802c15e1de5d7447b4856de949cf56", - "reference": "2c1ed04922802c15e1de5d7447b4856de949cf56", + "url": "https://api.github.com/repos/sebastianbergmann/php-code-coverage/zipball/b015312f28dd75b75d3422ca37dff2cd1a565e8d", + "reference": "b015312f28dd75b75d3422ca37dff2cd1a565e8d", "shasum": "" }, "require": { @@ -8525,18 +8473,17 @@ "ext-libxml": "*", "ext-xmlwriter": "*", "nikic/php-parser": "^5.7.0", - "php": ">=8.2", - "phpunit/php-file-iterator": "^5.1.0", - "phpunit/php-text-template": "^4.0.1", - "sebastian/code-unit-reverse-lookup": "^4.0.1", - "sebastian/complexity": "^4.0.1", - "sebastian/environment": "^7.2.1", - "sebastian/lines-of-code": "^3.0.1", - "sebastian/version": "^5.0.2", - "theseer/tokenizer": "^1.3.1" + "php": ">=8.3", + "phpunit/php-file-iterator": "^6.0", + "phpunit/php-text-template": "^5.0", + "sebastian/complexity": "^5.0", + "sebastian/environment": "^8.0.3", + "sebastian/lines-of-code": "^4.0", + "sebastian/version": "^6.0", + "theseer/tokenizer": "^2.0.1" }, "require-dev": { - "phpunit/phpunit": "^11.5.46" + "phpunit/phpunit": "^12.5.1" }, "suggest": { "ext-pcov": "PHP extension that provides line coverage", @@ -8545,7 +8492,7 @@ "type": "library", "extra": { "branch-alias": { - "dev-main": "11.0.x-dev" + "dev-main": "12.5.x-dev" } }, "autoload": { @@ -8574,7 +8521,7 @@ "support": { "issues": "https://github.com/sebastianbergmann/php-code-coverage/issues", "security": "https://github.com/sebastianbergmann/php-code-coverage/security/policy", - "source": "https://github.com/sebastianbergmann/php-code-coverage/tree/11.0.12" + "source": "https://github.com/sebastianbergmann/php-code-coverage/tree/12.5.3" }, "funding": [ { @@ -8594,32 +8541,32 @@ "type": "tidelift" } ], - "time": "2025-12-24T07:01:01+00:00" + "time": "2026-02-06T06:01:44+00:00" }, { "name": "phpunit/php-file-iterator", - "version": "5.1.1", + "version": "6.0.1", "source": { "type": "git", "url": "https://github.com/sebastianbergmann/php-file-iterator.git", - "reference": "2f3a64888c814fc235386b7387dd5b5ed92ad903" + "reference": "3d1cd096ef6bea4bf2762ba586e35dbd317cbfd5" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/sebastianbergmann/php-file-iterator/zipball/2f3a64888c814fc235386b7387dd5b5ed92ad903", - "reference": "2f3a64888c814fc235386b7387dd5b5ed92ad903", + "url": "https://api.github.com/repos/sebastianbergmann/php-file-iterator/zipball/3d1cd096ef6bea4bf2762ba586e35dbd317cbfd5", + "reference": "3d1cd096ef6bea4bf2762ba586e35dbd317cbfd5", "shasum": "" }, "require": { - "php": ">=8.2" + "php": ">=8.3" }, "require-dev": { - "phpunit/phpunit": "^11.3" + "phpunit/phpunit": "^12.0" }, "type": "library", "extra": { "branch-alias": { - "dev-main": "5.1-dev" + "dev-main": "6.0-dev" } }, "autoload": { @@ -8647,7 +8594,7 @@ "support": { "issues": "https://github.com/sebastianbergmann/php-file-iterator/issues", "security": "https://github.com/sebastianbergmann/php-file-iterator/security/policy", - "source": "https://github.com/sebastianbergmann/php-file-iterator/tree/5.1.1" + "source": "https://github.com/sebastianbergmann/php-file-iterator/tree/6.0.1" }, "funding": [ { @@ -8667,28 +8614,28 @@ "type": "tidelift" } ], - "time": "2026-02-02T13:52:54+00:00" + "time": "2026-02-02T14:04:18+00:00" }, { "name": "phpunit/php-invoker", - "version": "5.0.1", + "version": "6.0.0", "source": { "type": "git", "url": "https://github.com/sebastianbergmann/php-invoker.git", - "reference": "c1ca3814734c07492b3d4c5f794f4b0995333da2" + "reference": "12b54e689b07a25a9b41e57736dfab6ec9ae5406" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/sebastianbergmann/php-invoker/zipball/c1ca3814734c07492b3d4c5f794f4b0995333da2", - "reference": "c1ca3814734c07492b3d4c5f794f4b0995333da2", + "url": "https://api.github.com/repos/sebastianbergmann/php-invoker/zipball/12b54e689b07a25a9b41e57736dfab6ec9ae5406", + "reference": "12b54e689b07a25a9b41e57736dfab6ec9ae5406", "shasum": "" }, "require": { - "php": ">=8.2" + "php": ">=8.3" }, "require-dev": { "ext-pcntl": "*", - "phpunit/phpunit": "^11.0" + "phpunit/phpunit": "^12.0" }, "suggest": { "ext-pcntl": "*" @@ -8696,7 +8643,7 @@ "type": "library", "extra": { "branch-alias": { - "dev-main": "5.0-dev" + "dev-main": "6.0-dev" } }, "autoload": { @@ -8723,7 +8670,7 @@ "support": { "issues": "https://github.com/sebastianbergmann/php-invoker/issues", "security": "https://github.com/sebastianbergmann/php-invoker/security/policy", - "source": "https://github.com/sebastianbergmann/php-invoker/tree/5.0.1" + "source": "https://github.com/sebastianbergmann/php-invoker/tree/6.0.0" }, "funding": [ { @@ -8731,32 +8678,32 @@ "type": "github" } ], - "time": "2024-07-03T05:07:44+00:00" + "time": "2025-02-07T04:58:58+00:00" }, { "name": "phpunit/php-text-template", - "version": "4.0.1", + "version": "5.0.0", "source": { "type": "git", "url": "https://github.com/sebastianbergmann/php-text-template.git", - "reference": "3e0404dc6b300e6bf56415467ebcb3fe4f33e964" + "reference": "e1367a453f0eda562eedb4f659e13aa900d66c53" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/sebastianbergmann/php-text-template/zipball/3e0404dc6b300e6bf56415467ebcb3fe4f33e964", - "reference": "3e0404dc6b300e6bf56415467ebcb3fe4f33e964", + "url": "https://api.github.com/repos/sebastianbergmann/php-text-template/zipball/e1367a453f0eda562eedb4f659e13aa900d66c53", + "reference": "e1367a453f0eda562eedb4f659e13aa900d66c53", "shasum": "" }, "require": { - "php": ">=8.2" + "php": ">=8.3" }, "require-dev": { - "phpunit/phpunit": "^11.0" + "phpunit/phpunit": "^12.0" }, "type": "library", "extra": { "branch-alias": { - "dev-main": "4.0-dev" + "dev-main": "5.0-dev" } }, "autoload": { @@ -8783,7 +8730,7 @@ "support": { "issues": "https://github.com/sebastianbergmann/php-text-template/issues", "security": "https://github.com/sebastianbergmann/php-text-template/security/policy", - "source": "https://github.com/sebastianbergmann/php-text-template/tree/4.0.1" + "source": "https://github.com/sebastianbergmann/php-text-template/tree/5.0.0" }, "funding": [ { @@ -8791,32 +8738,32 @@ "type": "github" } ], - "time": "2024-07-03T05:08:43+00:00" + "time": "2025-02-07T04:59:16+00:00" }, { "name": "phpunit/php-timer", - "version": "7.0.1", + "version": "8.0.0", "source": { "type": "git", "url": "https://github.com/sebastianbergmann/php-timer.git", - "reference": "3b415def83fbcb41f991d9ebf16ae4ad8b7837b3" + "reference": "f258ce36aa457f3aa3339f9ed4c81fc66dc8c2cc" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/sebastianbergmann/php-timer/zipball/3b415def83fbcb41f991d9ebf16ae4ad8b7837b3", - "reference": "3b415def83fbcb41f991d9ebf16ae4ad8b7837b3", + "url": "https://api.github.com/repos/sebastianbergmann/php-timer/zipball/f258ce36aa457f3aa3339f9ed4c81fc66dc8c2cc", + "reference": "f258ce36aa457f3aa3339f9ed4c81fc66dc8c2cc", "shasum": "" }, "require": { - "php": ">=8.2" + "php": ">=8.3" }, "require-dev": { - "phpunit/phpunit": "^11.0" + "phpunit/phpunit": "^12.0" }, "type": "library", "extra": { "branch-alias": { - "dev-main": "7.0-dev" + "dev-main": "8.0-dev" } }, "autoload": { @@ -8843,7 +8790,7 @@ "support": { "issues": "https://github.com/sebastianbergmann/php-timer/issues", "security": "https://github.com/sebastianbergmann/php-timer/security/policy", - "source": "https://github.com/sebastianbergmann/php-timer/tree/7.0.1" + "source": "https://github.com/sebastianbergmann/php-timer/tree/8.0.0" }, "funding": [ { @@ -8851,20 +8798,20 @@ "type": "github" } ], - "time": "2024-07-03T05:09:35+00:00" + "time": "2025-02-07T04:59:38+00:00" }, { "name": "phpunit/phpunit", - "version": "11.5.50", + "version": "12.5.14", "source": { "type": "git", "url": "https://github.com/sebastianbergmann/phpunit.git", - "reference": "fdfc727f0fcacfeb8fcb30c7e5da173125b58be3" + "reference": "47283cfd98d553edcb1353591f4e255dc1bb61f0" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/sebastianbergmann/phpunit/zipball/fdfc727f0fcacfeb8fcb30c7e5da173125b58be3", - "reference": "fdfc727f0fcacfeb8fcb30c7e5da173125b58be3", + "url": "https://api.github.com/repos/sebastianbergmann/phpunit/zipball/47283cfd98d553edcb1353591f4e255dc1bb61f0", + "reference": "47283cfd98d553edcb1353591f4e255dc1bb61f0", "shasum": "" }, "require": { @@ -8877,34 +8824,31 @@ "myclabs/deep-copy": "^1.13.4", "phar-io/manifest": "^2.0.4", "phar-io/version": "^3.2.1", - "php": ">=8.2", - "phpunit/php-code-coverage": "^11.0.12", - "phpunit/php-file-iterator": "^5.1.0", - "phpunit/php-invoker": "^5.0.1", - "phpunit/php-text-template": "^4.0.1", - "phpunit/php-timer": "^7.0.1", - "sebastian/cli-parser": "^3.0.2", - "sebastian/code-unit": "^3.0.3", - "sebastian/comparator": "^6.3.3", - "sebastian/diff": "^6.0.2", - "sebastian/environment": "^7.2.1", - "sebastian/exporter": "^6.3.2", - "sebastian/global-state": "^7.0.2", - "sebastian/object-enumerator": "^6.0.1", - "sebastian/type": "^5.1.3", - "sebastian/version": "^5.0.2", + "php": ">=8.3", + "phpunit/php-code-coverage": "^12.5.3", + "phpunit/php-file-iterator": "^6.0.1", + "phpunit/php-invoker": "^6.0.0", + "phpunit/php-text-template": "^5.0.0", + "phpunit/php-timer": "^8.0.0", + "sebastian/cli-parser": "^4.2.0", + "sebastian/comparator": "^7.1.4", + "sebastian/diff": "^7.0.0", + "sebastian/environment": "^8.0.3", + "sebastian/exporter": "^7.0.2", + "sebastian/global-state": "^8.0.2", + "sebastian/object-enumerator": "^7.0.0", + "sebastian/recursion-context": "^7.0.1", + "sebastian/type": "^6.0.3", + "sebastian/version": "^6.0.0", "staabm/side-effects-detector": "^1.0.5" }, - "suggest": { - "ext-soap": "To be able to generate mocks based on WSDL files" - }, "bin": [ "phpunit" ], "type": "library", "extra": { "branch-alias": { - "dev-main": "11.5-dev" + "dev-main": "12.5-dev" } }, "autoload": { @@ -8936,7 +8880,7 @@ "support": { "issues": "https://github.com/sebastianbergmann/phpunit/issues", "security": "https://github.com/sebastianbergmann/phpunit/security/policy", - "source": "https://github.com/sebastianbergmann/phpunit/tree/11.5.50" + "source": "https://github.com/sebastianbergmann/phpunit/tree/12.5.14" }, "funding": [ { @@ -8960,32 +8904,32 @@ "type": "tidelift" } ], - "time": "2026-01-27T05:59:18+00:00" + "time": "2026-02-18T12:38:40+00:00" }, { "name": "sebastian/cli-parser", - "version": "3.0.2", + "version": "4.2.0", "source": { "type": "git", "url": "https://github.com/sebastianbergmann/cli-parser.git", - "reference": "15c5dd40dc4f38794d383bb95465193f5e0ae180" + "reference": "90f41072d220e5c40df6e8635f5dafba2d9d4d04" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/sebastianbergmann/cli-parser/zipball/15c5dd40dc4f38794d383bb95465193f5e0ae180", - "reference": "15c5dd40dc4f38794d383bb95465193f5e0ae180", + "url": "https://api.github.com/repos/sebastianbergmann/cli-parser/zipball/90f41072d220e5c40df6e8635f5dafba2d9d4d04", + "reference": "90f41072d220e5c40df6e8635f5dafba2d9d4d04", "shasum": "" }, "require": { - "php": ">=8.2" + "php": ">=8.3" }, "require-dev": { - "phpunit/phpunit": "^11.0" + "phpunit/phpunit": "^12.0" }, "type": "library", "extra": { "branch-alias": { - "dev-main": "3.0-dev" + "dev-main": "4.2-dev" } }, "autoload": { @@ -9009,152 +8953,51 @@ "support": { "issues": "https://github.com/sebastianbergmann/cli-parser/issues", "security": "https://github.com/sebastianbergmann/cli-parser/security/policy", - "source": "https://github.com/sebastianbergmann/cli-parser/tree/3.0.2" + "source": "https://github.com/sebastianbergmann/cli-parser/tree/4.2.0" }, "funding": [ { "url": "https://github.com/sebastianbergmann", "type": "github" - } - ], - "time": "2024-07-03T04:41:36+00:00" - }, - { - "name": "sebastian/code-unit", - "version": "3.0.3", - "source": { - "type": "git", - "url": "https://github.com/sebastianbergmann/code-unit.git", - "reference": "54391c61e4af8078e5b276ab082b6d3c54c9ad64" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/sebastianbergmann/code-unit/zipball/54391c61e4af8078e5b276ab082b6d3c54c9ad64", - "reference": "54391c61e4af8078e5b276ab082b6d3c54c9ad64", - "shasum": "" - }, - "require": { - "php": ">=8.2" - }, - "require-dev": { - "phpunit/phpunit": "^11.5" - }, - "type": "library", - "extra": { - "branch-alias": { - "dev-main": "3.0-dev" - } - }, - "autoload": { - "classmap": [ - "src/" - ] - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "BSD-3-Clause" - ], - "authors": [ - { - "name": "Sebastian Bergmann", - "email": "sebastian@phpunit.de", - "role": "lead" - } - ], - "description": "Collection of value objects that represent the PHP code units", - "homepage": "https://github.com/sebastianbergmann/code-unit", - "support": { - "issues": "https://github.com/sebastianbergmann/code-unit/issues", - "security": "https://github.com/sebastianbergmann/code-unit/security/policy", - "source": "https://github.com/sebastianbergmann/code-unit/tree/3.0.3" - }, - "funding": [ + }, { - "url": "https://github.com/sebastianbergmann", - "type": "github" - } - ], - "time": "2025-03-19T07:56:08+00:00" - }, - { - "name": "sebastian/code-unit-reverse-lookup", - "version": "4.0.1", - "source": { - "type": "git", - "url": "https://github.com/sebastianbergmann/code-unit-reverse-lookup.git", - "reference": "183a9b2632194febd219bb9246eee421dad8d45e" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/sebastianbergmann/code-unit-reverse-lookup/zipball/183a9b2632194febd219bb9246eee421dad8d45e", - "reference": "183a9b2632194febd219bb9246eee421dad8d45e", - "shasum": "" - }, - "require": { - "php": ">=8.2" - }, - "require-dev": { - "phpunit/phpunit": "^11.0" - }, - "type": "library", - "extra": { - "branch-alias": { - "dev-main": "4.0-dev" - } - }, - "autoload": { - "classmap": [ - "src/" - ] - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "BSD-3-Clause" - ], - "authors": [ + "url": "https://liberapay.com/sebastianbergmann", + "type": "liberapay" + }, { - "name": "Sebastian Bergmann", - "email": "sebastian@phpunit.de" - } - ], - "description": "Looks up which function or method a line of code belongs to", - "homepage": "https://github.com/sebastianbergmann/code-unit-reverse-lookup/", - "support": { - "issues": "https://github.com/sebastianbergmann/code-unit-reverse-lookup/issues", - "security": "https://github.com/sebastianbergmann/code-unit-reverse-lookup/security/policy", - "source": "https://github.com/sebastianbergmann/code-unit-reverse-lookup/tree/4.0.1" - }, - "funding": [ + "url": "https://thanks.dev/u/gh/sebastianbergmann", + "type": "thanks_dev" + }, { - "url": "https://github.com/sebastianbergmann", - "type": "github" + "url": "https://tidelift.com/funding/github/packagist/sebastian/cli-parser", + "type": "tidelift" } ], - "time": "2024-07-03T04:45:54+00:00" + "time": "2025-09-14T09:36:45+00:00" }, { "name": "sebastian/comparator", - "version": "6.3.3", + "version": "7.1.4", "source": { "type": "git", "url": "https://github.com/sebastianbergmann/comparator.git", - "reference": "2c95e1e86cb8dd41beb8d502057d1081ccc8eca9" + "reference": "6a7de5df2e094f9a80b40a522391a7e6022df5f6" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/sebastianbergmann/comparator/zipball/2c95e1e86cb8dd41beb8d502057d1081ccc8eca9", - "reference": "2c95e1e86cb8dd41beb8d502057d1081ccc8eca9", + "url": "https://api.github.com/repos/sebastianbergmann/comparator/zipball/6a7de5df2e094f9a80b40a522391a7e6022df5f6", + "reference": "6a7de5df2e094f9a80b40a522391a7e6022df5f6", "shasum": "" }, "require": { "ext-dom": "*", "ext-mbstring": "*", - "php": ">=8.2", - "sebastian/diff": "^6.0", - "sebastian/exporter": "^6.0" + "php": ">=8.3", + "sebastian/diff": "^7.0", + "sebastian/exporter": "^7.0" }, "require-dev": { - "phpunit/phpunit": "^11.4" + "phpunit/phpunit": "^12.2" }, "suggest": { "ext-bcmath": "For comparing BcMath\\Number objects" @@ -9162,7 +9005,7 @@ "type": "library", "extra": { "branch-alias": { - "dev-main": "6.3-dev" + "dev-main": "7.1-dev" } }, "autoload": { @@ -9202,7 +9045,7 @@ "support": { "issues": "https://github.com/sebastianbergmann/comparator/issues", "security": "https://github.com/sebastianbergmann/comparator/security/policy", - "source": "https://github.com/sebastianbergmann/comparator/tree/6.3.3" + "source": "https://github.com/sebastianbergmann/comparator/tree/7.1.4" }, "funding": [ { @@ -9222,33 +9065,33 @@ "type": "tidelift" } ], - "time": "2026-01-24T09:26:40+00:00" + "time": "2026-01-24T09:28:48+00:00" }, { "name": "sebastian/complexity", - "version": "4.0.1", + "version": "5.0.0", "source": { "type": "git", "url": "https://github.com/sebastianbergmann/complexity.git", - "reference": "ee41d384ab1906c68852636b6de493846e13e5a0" + "reference": "bad4316aba5303d0221f43f8cee37eb58d384bbb" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/sebastianbergmann/complexity/zipball/ee41d384ab1906c68852636b6de493846e13e5a0", - "reference": "ee41d384ab1906c68852636b6de493846e13e5a0", + "url": "https://api.github.com/repos/sebastianbergmann/complexity/zipball/bad4316aba5303d0221f43f8cee37eb58d384bbb", + "reference": "bad4316aba5303d0221f43f8cee37eb58d384bbb", "shasum": "" }, "require": { "nikic/php-parser": "^5.0", - "php": ">=8.2" + "php": ">=8.3" }, "require-dev": { - "phpunit/phpunit": "^11.0" + "phpunit/phpunit": "^12.0" }, "type": "library", "extra": { "branch-alias": { - "dev-main": "4.0-dev" + "dev-main": "5.0-dev" } }, "autoload": { @@ -9272,7 +9115,7 @@ "support": { "issues": "https://github.com/sebastianbergmann/complexity/issues", "security": "https://github.com/sebastianbergmann/complexity/security/policy", - "source": "https://github.com/sebastianbergmann/complexity/tree/4.0.1" + "source": "https://github.com/sebastianbergmann/complexity/tree/5.0.0" }, "funding": [ { @@ -9280,33 +9123,33 @@ "type": "github" } ], - "time": "2024-07-03T04:49:50+00:00" + "time": "2025-02-07T04:55:25+00:00" }, { "name": "sebastian/diff", - "version": "6.0.2", + "version": "7.0.0", "source": { "type": "git", "url": "https://github.com/sebastianbergmann/diff.git", - "reference": "b4ccd857127db5d41a5b676f24b51371d76d8544" + "reference": "7ab1ea946c012266ca32390913653d844ecd085f" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/sebastianbergmann/diff/zipball/b4ccd857127db5d41a5b676f24b51371d76d8544", - "reference": "b4ccd857127db5d41a5b676f24b51371d76d8544", + "url": "https://api.github.com/repos/sebastianbergmann/diff/zipball/7ab1ea946c012266ca32390913653d844ecd085f", + "reference": "7ab1ea946c012266ca32390913653d844ecd085f", "shasum": "" }, "require": { - "php": ">=8.2" + "php": ">=8.3" }, "require-dev": { - "phpunit/phpunit": "^11.0", - "symfony/process": "^4.2 || ^5" + "phpunit/phpunit": "^12.0", + "symfony/process": "^7.2" }, "type": "library", "extra": { "branch-alias": { - "dev-main": "6.0-dev" + "dev-main": "7.0-dev" } }, "autoload": { @@ -9339,7 +9182,7 @@ "support": { "issues": "https://github.com/sebastianbergmann/diff/issues", "security": "https://github.com/sebastianbergmann/diff/security/policy", - "source": "https://github.com/sebastianbergmann/diff/tree/6.0.2" + "source": "https://github.com/sebastianbergmann/diff/tree/7.0.0" }, "funding": [ { @@ -9347,27 +9190,27 @@ "type": "github" } ], - "time": "2024-07-03T04:53:05+00:00" + "time": "2025-02-07T04:55:46+00:00" }, { "name": "sebastian/environment", - "version": "7.2.1", + "version": "8.0.4", "source": { "type": "git", "url": "https://github.com/sebastianbergmann/environment.git", - "reference": "a5c75038693ad2e8d4b6c15ba2403532647830c4" + "reference": "7b8842c2d8e85d0c3a5831236bf5869af6ab2a11" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/sebastianbergmann/environment/zipball/a5c75038693ad2e8d4b6c15ba2403532647830c4", - "reference": "a5c75038693ad2e8d4b6c15ba2403532647830c4", + "url": "https://api.github.com/repos/sebastianbergmann/environment/zipball/7b8842c2d8e85d0c3a5831236bf5869af6ab2a11", + "reference": "7b8842c2d8e85d0c3a5831236bf5869af6ab2a11", "shasum": "" }, "require": { - "php": ">=8.2" + "php": ">=8.3" }, "require-dev": { - "phpunit/phpunit": "^11.3" + "phpunit/phpunit": "^12.0" }, "suggest": { "ext-posix": "*" @@ -9375,7 +9218,7 @@ "type": "library", "extra": { "branch-alias": { - "dev-main": "7.2-dev" + "dev-main": "8.0-dev" } }, "autoload": { @@ -9403,7 +9246,7 @@ "support": { "issues": "https://github.com/sebastianbergmann/environment/issues", "security": "https://github.com/sebastianbergmann/environment/security/policy", - "source": "https://github.com/sebastianbergmann/environment/tree/7.2.1" + "source": "https://github.com/sebastianbergmann/environment/tree/8.0.4" }, "funding": [ { @@ -9423,34 +9266,34 @@ "type": "tidelift" } ], - "time": "2025-05-21T11:55:47+00:00" + "time": "2026-03-15T07:05:40+00:00" }, { "name": "sebastian/exporter", - "version": "6.3.2", + "version": "7.0.2", "source": { "type": "git", "url": "https://github.com/sebastianbergmann/exporter.git", - "reference": "70a298763b40b213ec087c51c739efcaa90bcd74" + "reference": "016951ae10980765e4e7aee491eb288c64e505b7" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/sebastianbergmann/exporter/zipball/70a298763b40b213ec087c51c739efcaa90bcd74", - "reference": "70a298763b40b213ec087c51c739efcaa90bcd74", + "url": "https://api.github.com/repos/sebastianbergmann/exporter/zipball/016951ae10980765e4e7aee491eb288c64e505b7", + "reference": "016951ae10980765e4e7aee491eb288c64e505b7", "shasum": "" }, "require": { "ext-mbstring": "*", - "php": ">=8.2", - "sebastian/recursion-context": "^6.0" + "php": ">=8.3", + "sebastian/recursion-context": "^7.0" }, "require-dev": { - "phpunit/phpunit": "^11.3" + "phpunit/phpunit": "^12.0" }, "type": "library", "extra": { "branch-alias": { - "dev-main": "6.3-dev" + "dev-main": "7.0-dev" } }, "autoload": { @@ -9493,7 +9336,7 @@ "support": { "issues": "https://github.com/sebastianbergmann/exporter/issues", "security": "https://github.com/sebastianbergmann/exporter/security/policy", - "source": "https://github.com/sebastianbergmann/exporter/tree/6.3.2" + "source": "https://github.com/sebastianbergmann/exporter/tree/7.0.2" }, "funding": [ { @@ -9513,35 +9356,35 @@ "type": "tidelift" } ], - "time": "2025-09-24T06:12:51+00:00" + "time": "2025-09-24T06:16:11+00:00" }, { "name": "sebastian/global-state", - "version": "7.0.2", + "version": "8.0.2", "source": { "type": "git", "url": "https://github.com/sebastianbergmann/global-state.git", - "reference": "3be331570a721f9a4b5917f4209773de17f747d7" + "reference": "ef1377171613d09edd25b7816f05be8313f9115d" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/sebastianbergmann/global-state/zipball/3be331570a721f9a4b5917f4209773de17f747d7", - "reference": "3be331570a721f9a4b5917f4209773de17f747d7", + "url": "https://api.github.com/repos/sebastianbergmann/global-state/zipball/ef1377171613d09edd25b7816f05be8313f9115d", + "reference": "ef1377171613d09edd25b7816f05be8313f9115d", "shasum": "" }, "require": { - "php": ">=8.2", - "sebastian/object-reflector": "^4.0", - "sebastian/recursion-context": "^6.0" + "php": ">=8.3", + "sebastian/object-reflector": "^5.0", + "sebastian/recursion-context": "^7.0" }, "require-dev": { "ext-dom": "*", - "phpunit/phpunit": "^11.0" + "phpunit/phpunit": "^12.0" }, "type": "library", "extra": { "branch-alias": { - "dev-main": "7.0-dev" + "dev-main": "8.0-dev" } }, "autoload": { @@ -9567,41 +9410,53 @@ "support": { "issues": "https://github.com/sebastianbergmann/global-state/issues", "security": "https://github.com/sebastianbergmann/global-state/security/policy", - "source": "https://github.com/sebastianbergmann/global-state/tree/7.0.2" + "source": "https://github.com/sebastianbergmann/global-state/tree/8.0.2" }, "funding": [ { "url": "https://github.com/sebastianbergmann", "type": "github" + }, + { + "url": "https://liberapay.com/sebastianbergmann", + "type": "liberapay" + }, + { + "url": "https://thanks.dev/u/gh/sebastianbergmann", + "type": "thanks_dev" + }, + { + "url": "https://tidelift.com/funding/github/packagist/sebastian/global-state", + "type": "tidelift" } ], - "time": "2024-07-03T04:57:36+00:00" + "time": "2025-08-29T11:29:25+00:00" }, { "name": "sebastian/lines-of-code", - "version": "3.0.1", + "version": "4.0.0", "source": { "type": "git", "url": "https://github.com/sebastianbergmann/lines-of-code.git", - "reference": "d36ad0d782e5756913e42ad87cb2890f4ffe467a" + "reference": "97ffee3bcfb5805568d6af7f0f893678fc076d2f" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/sebastianbergmann/lines-of-code/zipball/d36ad0d782e5756913e42ad87cb2890f4ffe467a", - "reference": "d36ad0d782e5756913e42ad87cb2890f4ffe467a", + "url": "https://api.github.com/repos/sebastianbergmann/lines-of-code/zipball/97ffee3bcfb5805568d6af7f0f893678fc076d2f", + "reference": "97ffee3bcfb5805568d6af7f0f893678fc076d2f", "shasum": "" }, "require": { "nikic/php-parser": "^5.0", - "php": ">=8.2" + "php": ">=8.3" }, "require-dev": { - "phpunit/phpunit": "^11.0" + "phpunit/phpunit": "^12.0" }, "type": "library", "extra": { "branch-alias": { - "dev-main": "3.0-dev" + "dev-main": "4.0-dev" } }, "autoload": { @@ -9625,7 +9480,7 @@ "support": { "issues": "https://github.com/sebastianbergmann/lines-of-code/issues", "security": "https://github.com/sebastianbergmann/lines-of-code/security/policy", - "source": "https://github.com/sebastianbergmann/lines-of-code/tree/3.0.1" + "source": "https://github.com/sebastianbergmann/lines-of-code/tree/4.0.0" }, "funding": [ { @@ -9633,34 +9488,34 @@ "type": "github" } ], - "time": "2024-07-03T04:58:38+00:00" + "time": "2025-02-07T04:57:28+00:00" }, { "name": "sebastian/object-enumerator", - "version": "6.0.1", + "version": "7.0.0", "source": { "type": "git", "url": "https://github.com/sebastianbergmann/object-enumerator.git", - "reference": "f5b498e631a74204185071eb41f33f38d64608aa" + "reference": "1effe8e9b8e068e9ae228e542d5d11b5d16db894" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/sebastianbergmann/object-enumerator/zipball/f5b498e631a74204185071eb41f33f38d64608aa", - "reference": "f5b498e631a74204185071eb41f33f38d64608aa", + "url": "https://api.github.com/repos/sebastianbergmann/object-enumerator/zipball/1effe8e9b8e068e9ae228e542d5d11b5d16db894", + "reference": "1effe8e9b8e068e9ae228e542d5d11b5d16db894", "shasum": "" }, "require": { - "php": ">=8.2", - "sebastian/object-reflector": "^4.0", - "sebastian/recursion-context": "^6.0" + "php": ">=8.3", + "sebastian/object-reflector": "^5.0", + "sebastian/recursion-context": "^7.0" }, "require-dev": { - "phpunit/phpunit": "^11.0" + "phpunit/phpunit": "^12.0" }, "type": "library", "extra": { "branch-alias": { - "dev-main": "6.0-dev" + "dev-main": "7.0-dev" } }, "autoload": { @@ -9683,7 +9538,7 @@ "support": { "issues": "https://github.com/sebastianbergmann/object-enumerator/issues", "security": "https://github.com/sebastianbergmann/object-enumerator/security/policy", - "source": "https://github.com/sebastianbergmann/object-enumerator/tree/6.0.1" + "source": "https://github.com/sebastianbergmann/object-enumerator/tree/7.0.0" }, "funding": [ { @@ -9691,32 +9546,32 @@ "type": "github" } ], - "time": "2024-07-03T05:00:13+00:00" + "time": "2025-02-07T04:57:48+00:00" }, { "name": "sebastian/object-reflector", - "version": "4.0.1", + "version": "5.0.0", "source": { "type": "git", "url": "https://github.com/sebastianbergmann/object-reflector.git", - "reference": "6e1a43b411b2ad34146dee7524cb13a068bb35f9" + "reference": "4bfa827c969c98be1e527abd576533293c634f6a" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/sebastianbergmann/object-reflector/zipball/6e1a43b411b2ad34146dee7524cb13a068bb35f9", - "reference": "6e1a43b411b2ad34146dee7524cb13a068bb35f9", + "url": "https://api.github.com/repos/sebastianbergmann/object-reflector/zipball/4bfa827c969c98be1e527abd576533293c634f6a", + "reference": "4bfa827c969c98be1e527abd576533293c634f6a", "shasum": "" }, "require": { - "php": ">=8.2" + "php": ">=8.3" }, "require-dev": { - "phpunit/phpunit": "^11.0" + "phpunit/phpunit": "^12.0" }, "type": "library", "extra": { "branch-alias": { - "dev-main": "4.0-dev" + "dev-main": "5.0-dev" } }, "autoload": { @@ -9739,7 +9594,7 @@ "support": { "issues": "https://github.com/sebastianbergmann/object-reflector/issues", "security": "https://github.com/sebastianbergmann/object-reflector/security/policy", - "source": "https://github.com/sebastianbergmann/object-reflector/tree/4.0.1" + "source": "https://github.com/sebastianbergmann/object-reflector/tree/5.0.0" }, "funding": [ { @@ -9747,32 +9602,32 @@ "type": "github" } ], - "time": "2024-07-03T05:01:32+00:00" + "time": "2025-02-07T04:58:17+00:00" }, { "name": "sebastian/recursion-context", - "version": "6.0.3", + "version": "7.0.1", "source": { "type": "git", "url": "https://github.com/sebastianbergmann/recursion-context.git", - "reference": "f6458abbf32a6c8174f8f26261475dc133b3d9dc" + "reference": "0b01998a7d5b1f122911a66bebcb8d46f0c82d8c" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/sebastianbergmann/recursion-context/zipball/f6458abbf32a6c8174f8f26261475dc133b3d9dc", - "reference": "f6458abbf32a6c8174f8f26261475dc133b3d9dc", + "url": "https://api.github.com/repos/sebastianbergmann/recursion-context/zipball/0b01998a7d5b1f122911a66bebcb8d46f0c82d8c", + "reference": "0b01998a7d5b1f122911a66bebcb8d46f0c82d8c", "shasum": "" }, "require": { - "php": ">=8.2" + "php": ">=8.3" }, "require-dev": { - "phpunit/phpunit": "^11.3" + "phpunit/phpunit": "^12.0" }, "type": "library", "extra": { "branch-alias": { - "dev-main": "6.0-dev" + "dev-main": "7.0-dev" } }, "autoload": { @@ -9803,7 +9658,7 @@ "support": { "issues": "https://github.com/sebastianbergmann/recursion-context/issues", "security": "https://github.com/sebastianbergmann/recursion-context/security/policy", - "source": "https://github.com/sebastianbergmann/recursion-context/tree/6.0.3" + "source": "https://github.com/sebastianbergmann/recursion-context/tree/7.0.1" }, "funding": [ { @@ -9823,32 +9678,32 @@ "type": "tidelift" } ], - "time": "2025-08-13T04:42:22+00:00" + "time": "2025-08-13T04:44:59+00:00" }, { "name": "sebastian/type", - "version": "5.1.3", + "version": "6.0.3", "source": { "type": "git", "url": "https://github.com/sebastianbergmann/type.git", - "reference": "f77d2d4e78738c98d9a68d2596fe5e8fa380f449" + "reference": "e549163b9760b8f71f191651d22acf32d56d6d4d" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/sebastianbergmann/type/zipball/f77d2d4e78738c98d9a68d2596fe5e8fa380f449", - "reference": "f77d2d4e78738c98d9a68d2596fe5e8fa380f449", + "url": "https://api.github.com/repos/sebastianbergmann/type/zipball/e549163b9760b8f71f191651d22acf32d56d6d4d", + "reference": "e549163b9760b8f71f191651d22acf32d56d6d4d", "shasum": "" }, "require": { - "php": ">=8.2" + "php": ">=8.3" }, "require-dev": { - "phpunit/phpunit": "^11.3" + "phpunit/phpunit": "^12.0" }, "type": "library", "extra": { "branch-alias": { - "dev-main": "5.1-dev" + "dev-main": "6.0-dev" } }, "autoload": { @@ -9872,7 +9727,7 @@ "support": { "issues": "https://github.com/sebastianbergmann/type/issues", "security": "https://github.com/sebastianbergmann/type/security/policy", - "source": "https://github.com/sebastianbergmann/type/tree/5.1.3" + "source": "https://github.com/sebastianbergmann/type/tree/6.0.3" }, "funding": [ { @@ -9892,29 +9747,29 @@ "type": "tidelift" } ], - "time": "2025-08-09T06:55:48+00:00" + "time": "2025-08-09T06:57:12+00:00" }, { "name": "sebastian/version", - "version": "5.0.2", + "version": "6.0.0", "source": { "type": "git", "url": "https://github.com/sebastianbergmann/version.git", - "reference": "c687e3387b99f5b03b6caa64c74b63e2936ff874" + "reference": "3e6ccf7657d4f0a59200564b08cead899313b53c" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/sebastianbergmann/version/zipball/c687e3387b99f5b03b6caa64c74b63e2936ff874", - "reference": "c687e3387b99f5b03b6caa64c74b63e2936ff874", + "url": "https://api.github.com/repos/sebastianbergmann/version/zipball/3e6ccf7657d4f0a59200564b08cead899313b53c", + "reference": "3e6ccf7657d4f0a59200564b08cead899313b53c", "shasum": "" }, "require": { - "php": ">=8.2" + "php": ">=8.3" }, "type": "library", "extra": { "branch-alias": { - "dev-main": "5.0-dev" + "dev-main": "6.0-dev" } }, "autoload": { @@ -9938,7 +9793,7 @@ "support": { "issues": "https://github.com/sebastianbergmann/version/issues", "security": "https://github.com/sebastianbergmann/version/security/policy", - "source": "https://github.com/sebastianbergmann/version/tree/5.0.2" + "source": "https://github.com/sebastianbergmann/version/tree/6.0.0" }, "funding": [ { @@ -9946,7 +9801,7 @@ "type": "github" } ], - "time": "2024-10-09T05:16:32+00:00" + "time": "2025-02-07T05:00:38+00:00" }, { "name": "staabm/side-effects-detector", @@ -10002,28 +9857,27 @@ }, { "name": "symfony/yaml", - "version": "v7.4.1", + "version": "v8.0.8", "source": { "type": "git", "url": "https://github.com/symfony/yaml.git", - "reference": "24dd4de28d2e3988b311751ac49e684d783e2345" + "reference": "54174ab48c0c0f9e21512b304be17f8150ccf8f1" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/yaml/zipball/24dd4de28d2e3988b311751ac49e684d783e2345", - "reference": "24dd4de28d2e3988b311751ac49e684d783e2345", + "url": "https://api.github.com/repos/symfony/yaml/zipball/54174ab48c0c0f9e21512b304be17f8150ccf8f1", + "reference": "54174ab48c0c0f9e21512b304be17f8150ccf8f1", "shasum": "" }, "require": { - "php": ">=8.2", - "symfony/deprecation-contracts": "^2.5|^3", + "php": ">=8.4", "symfony/polyfill-ctype": "^1.8" }, "conflict": { - "symfony/console": "<6.4" + "symfony/console": "<7.4" }, "require-dev": { - "symfony/console": "^6.4|^7.0|^8.0" + "symfony/console": "^7.4|^8.0" }, "bin": [ "Resources/bin/yaml-lint" @@ -10054,7 +9908,7 @@ "description": "Loads and dumps YAML files", "homepage": "https://symfony.com", "support": { - "source": "https://github.com/symfony/yaml/tree/v7.4.1" + "source": "https://github.com/symfony/yaml/tree/v8.0.8" }, "funding": [ { @@ -10074,7 +9928,7 @@ "type": "tidelift" } ], - "time": "2025-12-04T18:11:45+00:00" + "time": "2026-03-30T15:14:47+00:00" }, { "name": "ta-tikoma/phpunit-architecture-test", @@ -10137,23 +9991,23 @@ }, { "name": "theseer/tokenizer", - "version": "1.3.1", + "version": "2.0.1", "source": { "type": "git", "url": "https://github.com/theseer/tokenizer.git", - "reference": "b7489ce515e168639d17feec34b8847c326b0b3c" + "reference": "7989e43bf381af0eac72e4f0ca5bcbfa81658be4" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/theseer/tokenizer/zipball/b7489ce515e168639d17feec34b8847c326b0b3c", - "reference": "b7489ce515e168639d17feec34b8847c326b0b3c", + "url": "https://api.github.com/repos/theseer/tokenizer/zipball/7989e43bf381af0eac72e4f0ca5bcbfa81658be4", + "reference": "7989e43bf381af0eac72e4f0ca5bcbfa81658be4", "shasum": "" }, "require": { "ext-dom": "*", "ext-tokenizer": "*", "ext-xmlwriter": "*", - "php": "^7.2 || ^8.0" + "php": "^8.1" }, "type": "library", "autoload": { @@ -10175,7 +10029,7 @@ "description": "A small library for converting tokenized PHP source code into XML and potentially other formats", "support": { "issues": "https://github.com/theseer/tokenizer/issues", - "source": "https://github.com/theseer/tokenizer/tree/1.3.1" + "source": "https://github.com/theseer/tokenizer/tree/2.0.1" }, "funding": [ { @@ -10183,7 +10037,7 @@ "type": "github" } ], - "time": "2025-11-17T20:03:58+00:00" + "time": "2025-12-08T11:19:18+00:00" }, { "name": "webmozart/assert", From a6aed15ee18472086d99c547713998911ee3f98c Mon Sep 17 00:00:00 2001 From: dotMavriQ Date: Wed, 1 Apr 2026 11:21:22 +0100 Subject: [PATCH 20/77] Merge TV episode selection into a single-step flow Episodes now appear inline under each season as soon as they're loaded, with watched/watchlist toggles right there. Removes the confusing hidden "Review & Import" second screen. --- .../movies/movie-tmdb-search.blade.php | 336 ++++++++---------- 1 file changed, 145 insertions(+), 191 deletions(-) diff --git a/resources/views/livewire/movies/movie-tmdb-search.blade.php b/resources/views/livewire/movies/movie-tmdb-search.blade.php index 2934ccf..8101364 100644 --- a/resources/views/livewire/movies/movie-tmdb-search.blade.php +++ b/resources/views/livewire/movies/movie-tmdb-search.blade.php @@ -253,7 +253,7 @@ class="h-8 w-8 rounded-md text-sm font-bold transition-colors focus:outline-none {{-- ===== STEP: CONFIGURE TV ===== --}} - @elseif($step === 'configure_tv') + @elseif($step === 'configure_tv' || $step === 'select_episodes')
    -

    {{ $title }}

    -
    - @if($year){{ $year }}@endif - @if($genres){{ $genres }}@endif -
    - @if($description) -

    {{ $description }}

    - @endif - - {{-- Show status/rating --}} -
    -
    - - +

    {{ $title }}

    +
    + @if($year){{ $year }}@endif + @if($genres){{ $genres }}@endif
    -
    - -
    - @for($i = 1; $i <= 10; $i++) - - @endfor + @if($description) +

    {{ $description }}

    + @endif + + {{-- Show status/rating --}} +
    +
    + + +
    +
    + +
    + @for($i = 1; $i <= 10; $i++) + + @endfor +
    -
    - {{-- Seasons List --}} -
    -
    -

    Seasons

    -
    - - + {{-- Import bar (sticky, shows when episodes are selected) --}} + @if(!empty($selectedEpisodes)) +
    +
    + {{ $summary['selected'] }} selected + @if($summary['watched'] > 0) + {{ $summary['watched'] }} watched + @endif + @if($summary['watchlist'] > 0) + {{ $summary['watchlist'] }} to watchlist + @endif
    +
    -
    - @foreach($seasons as $season) -
    -
    - {{ $season['name'] }} - {{ $season['episode_count'] }} episodes -
    - @if(isset($loadedEpisodes[$season['season_number']])) - - - - - Loaded - - @else - - @endif -
    - @endforeach -
    -
    - - {{-- Loading overlay --}} -
    - - {{-- ===== STEP: SELECT EPISODES ===== --}} - @elseif($step === 'select_episodes') -
    - -
    - - {{-- Summary bar --}} -
    -
    - {{ $title }} - {{ $summary['selected'] }} selected - @if($summary['watched'] > 0) - {{ $summary['watched'] }} watched - @endif - @if($summary['watchlist'] > 0) - {{ $summary['watchlist'] }} to watchlist - @endif -
    - -
    + @endif - {{-- Episodes by season --}} + {{-- Seasons with inline episodes --}}
    - @foreach($loadedEpisodes as $seasonNum => $episodes) + @foreach($seasons as $season) + @php $seasonNum = $season['season_number']; @endphp
    {{-- Season header --}}
    - - {{ count($episodes) }} episodes + isSeasonFullySelected($seasonNum)) checked @endif + onclick="return false;" + > + {{ $season['name'] }} + + @else + {{ $season['name'] }} + @endif + {{ $season['episode_count'] }} episodes
    - - -
    -
    - - {{-- Episode rows --}} -
    - @foreach($episodes as $ep) - @php - $epKey = "S{$seasonNum}E{$ep['episode_number']}"; - $isSelected = isset($selectedEpisodes[$epKey]); - $isWatched = isset($watchedEpisodes[$epKey]); - $isDuplicate = $this->isEpisodeDuplicate($seasonNum, $ep['episode_number']); - @endphp -
    - {{-- Select checkbox --}} + @if(isset($loadedEpisodes[$seasonNum])) + + @else + + @endif +
    +
    - {{-- Episode badge --}} - - E{{ str_pad((string)$ep['episode_number'], 2, '0', STR_PAD_LEFT) }} - - - {{-- Episode name --}} - - {{ $ep['name'] }} - @if($isDuplicate) - (already in library) - @endif - - - {{-- Air date --}} - @if($ep['air_date']) - - @endif - - {{-- Watched toggle --}} - @unless($isDuplicate) + {{-- Inline episode rows (shown immediately after loading) --}} + @if(isset($loadedEpisodes[$seasonNum])) +
    + @foreach($loadedEpisodes[$seasonNum] as $ep) + @php + $epKey = "S{$seasonNum}E{$ep['episode_number']}"; + $isSelected = isset($selectedEpisodes[$epKey]); + $isWatched = isset($watchedEpisodes[$epKey]); + $isDuplicate = $this->isEpisodeDuplicate($seasonNum, $ep['episode_number']); + @endphp +
    + {{-- Select checkbox --}} - @endunless -
    - @endforeach -
    + + {{-- Episode badge --}} + + E{{ str_pad((string)$ep['episode_number'], 2, '0', STR_PAD_LEFT) }} + + + {{-- Episode name --}} + + {{ $ep['name'] }} + @if($isDuplicate) + (already in library) + @endif + + + {{-- Air date --}} + @if($ep['air_date']) + + @endif + + {{-- Watched toggle --}} + @unless($isDuplicate) + + @endunless +
    + @endforeach +
    + @endif
    @endforeach
    - {{-- Loading overlay --}} + {{-- Loading overlays --}} +
    From f80a64f01f1f2fb2f9ee7692344f10546e00b405 Mon Sep 17 00:00:00 2001 From: dotMavriQ Date: Wed, 1 Apr 2026 11:23:59 +0100 Subject: [PATCH 21/77] Refactor Board Games for BGG integration Dedicated BoardGameStatus enum, improved BGG search (exact + fuzzy), proper detail fetching, theme colors for both normie and gruvbox-dark. Drops OwnershipStatus dependency from board games. --- app/Enums/BoardGameStatus.php | 36 ++++++ .../BoardGames/BoardGameBggSearch.php | 106 +++++++++++++----- app/Livewire/BoardGames/BoardGameForm.php | 52 ++------- app/Livewire/BoardGames/BoardGameIndex.php | 25 +---- app/Models/BoardGame.php | 13 +-- app/Services/BggService.php | 45 ++++++-- .../Saloon/Bgg/Requests/SearchBoardGames.php | 9 +- ...28_180000_refactor_board_games_for_bgg.php | 41 +++++++ resources/css/app.css | 24 ++++ .../board-game-bgg-search.blade.php | 11 +- .../board-games/board-game-form.blade.php | 32 ------ .../board-games/board-game-index.blade.php | 28 +---- .../board-games/board-game-show.blade.php | 29 +---- tailwind.config.js | 10 ++ 14 files changed, 259 insertions(+), 202 deletions(-) create mode 100644 app/Enums/BoardGameStatus.php create mode 100644 database/migrations/2026_03_28_180000_refactor_board_games_for_bgg.php diff --git a/app/Enums/BoardGameStatus.php b/app/Enums/BoardGameStatus.php new file mode 100644 index 0000000..8b74cc3 --- /dev/null +++ b/app/Enums/BoardGameStatus.php @@ -0,0 +1,36 @@ + 'Owned', + self::WantToPlay => 'Want to Play', + self::Wishlist => 'Wishlist', + self::ForTrade => 'For Trade', + self::PreviouslyOwned => 'Previously Owned', + }; + } + + public function color(): string + { + return match ($this) { + self::Owned => 'owned', + self::WantToPlay => 'want-to-play', + self::Wishlist => 'wishlist', + self::ForTrade => 'for-trade', + self::PreviouslyOwned => 'previously-owned', + }; + } +} diff --git a/app/Livewire/BoardGames/BoardGameBggSearch.php b/app/Livewire/BoardGames/BoardGameBggSearch.php index 43c48da..d9b7767 100644 --- a/app/Livewire/BoardGames/BoardGameBggSearch.php +++ b/app/Livewire/BoardGames/BoardGameBggSearch.php @@ -4,8 +4,7 @@ namespace App\Livewire\BoardGames; -use App\Enums\OwnershipStatus; -use App\Enums\PlayingStatus; +use App\Enums\BoardGameStatus; use App\Models\BoardGame; use App\Services\BggService; use Illuminate\Support\Facades\Auth; @@ -15,15 +14,37 @@ class BoardGameBggSearch extends Component { public string $step = 'search'; - public string $searchQuery = ''; + public string $query = ''; - public array $results = []; + public array $searchResults = []; - public ?array $selectedGame = null; + public ?int $selectedBggId = null; - public string $status = 'backlog'; + // Editable fields populated from BGG + public string $title = ''; - public string $ownership = 'owned'; + public string $designer = ''; + + public string $publisher = ''; + + public string $description = ''; + + public string $cover_url = ''; + + public ?int $year_published = null; + + public ?int $min_players = null; + + public ?int $max_players = null; + + public ?int $playing_time = null; + + public array $genre = []; + + public ?float $bgg_rating = null; + + // User fields + public string $status = 'owned'; public ?int $rating = null; @@ -31,12 +52,12 @@ class BoardGameBggSearch extends Component public function search(): void { - if (trim($this->searchQuery) === '') { + if (trim($this->query) === '') { return; } $bgg = app(BggService::class); - $this->results = $bgg->search($this->searchQuery); + $this->searchResults = $bgg->search($this->query); $this->step = 'results'; } @@ -47,35 +68,48 @@ public function selectGame(int $bggId): void if (! $details) { session()->flash('error', 'Could not fetch board game details.'); + return; } - $this->selectedGame = $details; + $this->selectedBggId = $details['bgg_id']; + $this->title = $details['title'] ?? ''; + $this->designer = $details['designer'] ?? ''; + $this->publisher = $details['publisher'] ?? ''; + $this->description = $details['description'] ?? ''; + $this->cover_url = $details['cover_url'] ?? ''; + $this->year_published = $details['year_published'] ?? null; + $this->min_players = $details['min_players'] ?? null; + $this->max_players = $details['max_players'] ?? null; + $this->playing_time = $details['playing_time'] ?? null; + $this->genre = $details['genres'] ?? []; + $this->bgg_rating = $details['bgg_rating'] ?? null; + $this->step = 'configure'; } public function save(): void { - if (! $this->selectedGame) { + if (! $this->selectedBggId) { return; } $boardGame = BoardGame::create([ 'user_id' => Auth::id(), - 'title' => $this->selectedGame['title'], - 'genre' => $this->selectedGame['genres'] ?? [], - 'description' => $this->selectedGame['description'] ?? null, - 'cover_url' => $this->selectedGame['cover_url'] ?? null, - 'year_published' => $this->selectedGame['year_published'] ?? null, - 'designer' => $this->selectedGame['designer'] ?? null, - 'publisher' => $this->selectedGame['publisher'] ?? null, - 'min_players' => $this->selectedGame['min_players'] ?? null, - 'max_players' => $this->selectedGame['max_players'] ?? null, - 'playing_time' => $this->selectedGame['playing_time'] ?? null, + 'title' => $this->title, + 'genre' => ! empty($this->genre) ? $this->genre : null, + 'description' => $this->description ?: null, + 'cover_url' => $this->cover_url ?: null, + 'year_published' => $this->year_published, + 'designer' => $this->designer ?: null, + 'publisher' => $this->publisher ?: null, + 'min_players' => $this->min_players, + 'max_players' => $this->max_players, + 'playing_time' => $this->playing_time, 'status' => $this->status, - 'ownership' => $this->ownership, 'rating' => $this->rating, - 'bgg_id' => $this->selectedGame['bgg_id'], + 'bgg_rating' => $this->bgg_rating, + 'bgg_id' => $this->selectedBggId, 'notes' => $this->notes ?: null, ]); @@ -85,21 +119,39 @@ public function save(): void public function backToResults(): void { - $this->selectedGame = null; + $this->resetConfigureFields(); $this->step = 'results'; } public function backToSearch(): void { - $this->results = []; + $this->searchResults = []; + $this->resetConfigureFields(); $this->step = 'search'; } + private function resetConfigureFields(): void + { + $this->selectedBggId = null; + $this->title = ''; + $this->designer = ''; + $this->publisher = ''; + $this->description = ''; + $this->cover_url = ''; + $this->year_published = null; + $this->min_players = null; + $this->max_players = null; + $this->playing_time = null; + $this->genre = []; + $this->bgg_rating = null; + $this->rating = null; + $this->notes = ''; + } + public function render() { return view('livewire.board-games.board-game-bgg-search', [ - 'statuses' => PlayingStatus::cases(), - 'ownershipStatuses' => OwnershipStatus::cases(), + 'statuses' => BoardGameStatus::cases(), ])->layout('layouts.app'); } } diff --git a/app/Livewire/BoardGames/BoardGameForm.php b/app/Livewire/BoardGames/BoardGameForm.php index 74db856..465c2a9 100644 --- a/app/Livewire/BoardGames/BoardGameForm.php +++ b/app/Livewire/BoardGames/BoardGameForm.php @@ -4,8 +4,7 @@ namespace App\Livewire\BoardGames; -use App\Enums\OwnershipStatus; -use App\Enums\PlayingStatus; +use App\Enums\BoardGameStatus; use App\Models\BoardGame; use Illuminate\Foundation\Auth\Access\AuthorizesRequests; use Illuminate\Support\Facades\Auth; @@ -40,20 +39,16 @@ class BoardGameForm extends Component public ?int $playing_time = null; - public string $status = 'backlog'; - - public string $ownership = 'owned'; + public string $status = 'owned'; public ?int $rating = null; + public ?float $bgg_rating = null; + public ?int $plays = null; public ?int $bgg_id = null; - public ?string $date_started = null; - - public ?string $date_finished = null; - public string $notes = ''; public function mount(?BoardGame $boardGame = null): void @@ -73,12 +68,10 @@ public function mount(?BoardGame $boardGame = null): void 'max_players' => $boardGame->max_players, 'playing_time' => $boardGame->playing_time, 'status' => $boardGame->status->value, - 'ownership' => $boardGame->ownership->value, 'rating' => $boardGame->rating, + 'bgg_rating' => $boardGame->bgg_rating, 'plays' => $boardGame->plays, 'bgg_id' => $boardGame->bgg_id, - 'date_started' => $boardGame->date_started?->format('d/m/Y'), - 'date_finished' => $boardGame->date_finished?->format('d/m/Y'), 'notes' => $boardGame->notes ?? '', ]); } @@ -98,36 +91,15 @@ public function rules(): array 'min_players' => ['nullable', 'integer', 'min:1', 'max:100'], 'max_players' => ['nullable', 'integer', 'min:1', 'max:100'], 'playing_time' => ['nullable', 'integer', 'min:0', 'max:9999'], - 'status' => ['required', Rule::enum(PlayingStatus::class)], - 'ownership' => ['required', Rule::enum(OwnershipStatus::class)], + 'status' => ['required', Rule::enum(BoardGameStatus::class)], 'rating' => ['nullable', 'integer', 'min:1', 'max:10'], + 'bgg_rating' => ['nullable', 'numeric', 'min:0', 'max:10'], 'plays' => ['nullable', 'integer', 'min:0'], 'bgg_id' => ['nullable', 'integer'], - 'date_started' => ['nullable', 'date_format:d/m/Y'], - 'date_finished' => ['nullable', 'date_format:d/m/Y'], 'notes' => ['nullable', 'string', 'max:10000'], ]; } - protected function parseDateInput(?string $date): ?string - { - if (empty($date)) { - return null; - } - - if (preg_match('/^\d{4}-\d{2}-\d{2}$/', $date)) { - return $date; - } - - if (preg_match('/^(\d{2})\/(\d{2})\/(\d{4})$/', $date, $matches)) { - return checkdate((int) $matches[2], (int) $matches[1], (int) $matches[3]) - ? "{$matches[3]}-{$matches[2]}-{$matches[1]}" - : null; - } - - return null; - } - public function addGenre(): void { $genre = trim($this->genreInput); @@ -147,9 +119,6 @@ public function save(): void { $validated = $this->validate(); - $validated['date_started'] = $this->parseDateInput($validated['date_started'] ?? null); - $validated['date_finished'] = $this->parseDateInput($validated['date_finished'] ?? null); - $data = [ 'title' => $validated['title'], 'genre' => ! empty($validated['genre']) ? $validated['genre'] : null, @@ -162,12 +131,10 @@ public function save(): void 'max_players' => $validated['max_players'], 'playing_time' => $validated['playing_time'], 'status' => $validated['status'], - 'ownership' => $validated['ownership'], 'rating' => $validated['rating'], + 'bgg_rating' => $validated['bgg_rating'], 'plays' => $validated['plays'], 'bgg_id' => $validated['bgg_id'], - 'date_started' => $validated['date_started'], - 'date_finished' => $validated['date_finished'], 'notes' => $validated['notes'] ?: null, ]; @@ -193,8 +160,7 @@ public function isEditing(): bool public function render() { return view('livewire.board-games.board-game-form', [ - 'statuses' => PlayingStatus::cases(), - 'ownershipStatuses' => OwnershipStatus::cases(), + 'statuses' => BoardGameStatus::cases(), 'isEditing' => $this->isEditing(), ])->layout('layouts.app'); } diff --git a/app/Livewire/BoardGames/BoardGameIndex.php b/app/Livewire/BoardGames/BoardGameIndex.php index 0d63f82..38310dc 100644 --- a/app/Livewire/BoardGames/BoardGameIndex.php +++ b/app/Livewire/BoardGames/BoardGameIndex.php @@ -4,8 +4,7 @@ namespace App\Livewire\BoardGames; -use App\Enums\OwnershipStatus; -use App\Enums\PlayingStatus; +use App\Enums\BoardGameStatus; use App\Livewire\Concerns\WithAccentInsensitiveSearch; use App\Livewire\Concerns\WithIndexFiltering; use App\Models\BoardGame; @@ -23,8 +22,6 @@ class BoardGameIndex extends Component public string $status = ''; - public string $ownership = ''; - public string $genre = ''; public string $sortBy = 'updated_at'; @@ -38,14 +35,13 @@ class BoardGameIndex extends Component public array $selected = []; private const ALLOWED_SORT_COLUMNS = [ - 'title', 'rating', 'year_published', 'plays', - 'date_started', 'date_finished', 'updated_at', 'created_at', + 'title', 'rating', 'bgg_rating', 'year_published', 'plays', + 'updated_at', 'created_at', ]; protected array $queryString = [ 'search' => ['except' => ''], 'status' => ['except' => ''], - 'ownership' => ['except' => ''], 'genre' => ['except' => ''], 'sortBy' => ['except' => 'updated_at'], 'sortDirection' => ['except' => 'desc'], @@ -62,17 +58,11 @@ public function updatingStatus(): void $this->resetPage(); } - public function updatingOwnership(): void - { - $this->resetPage(); - } - public function updatingGenre(): void { $this->resetPage(); } - public function deleteBoardGame(BoardGame $boardGame): void { $this->authorize('delete', $boardGame); @@ -117,10 +107,6 @@ private function buildQuery() $query->where('status', $this->status); } - if ($this->ownership !== '') { - $query->where('ownership', $this->ownership); - } - if ($this->genre !== '') { $query->whereJsonContains('genre', $this->genre); } @@ -136,7 +122,7 @@ public function render() $query = $this->buildQuery(); - if (in_array($sortBy, ['rating', 'plays', 'date_started', 'date_finished', 'year_published'])) { + if (in_array($sortBy, ['rating', 'bgg_rating', 'plays', 'year_published'])) { $query->orderByRaw("\"$sortBy\" $sortDir NULLS LAST"); } else { $query->orderBy($sortBy, $sortDir); @@ -155,8 +141,7 @@ public function render() return view('livewire.board-games.board-game-index', [ 'boardGames' => $boardGames, - 'statuses' => PlayingStatus::cases(), - 'ownershipStatuses' => OwnershipStatus::cases(), + 'statuses' => BoardGameStatus::cases(), 'allGenres' => $allGenres, ])->layout('layouts.app'); } diff --git a/app/Models/BoardGame.php b/app/Models/BoardGame.php index 0bbf3b4..916f403 100644 --- a/app/Models/BoardGame.php +++ b/app/Models/BoardGame.php @@ -4,8 +4,7 @@ namespace App\Models; -use App\Enums\OwnershipStatus; -use App\Enums\PlayingStatus; +use App\Enums\BoardGameStatus; use Illuminate\Database\Eloquent\Factories\HasFactory; use Illuminate\Database\Eloquent\Model; use Illuminate\Database\Eloquent\Relations\BelongsTo; @@ -27,30 +26,26 @@ class BoardGame extends Model 'max_players', 'playing_time', 'status', - 'ownership', 'rating', + 'bgg_rating', 'plays', 'bgg_id', - 'date_started', - 'date_finished', 'notes', ]; protected function casts(): array { return [ - 'status' => PlayingStatus::class, - 'ownership' => OwnershipStatus::class, + 'status' => BoardGameStatus::class, 'genre' => 'array', 'rating' => 'integer', + 'bgg_rating' => 'decimal:2', 'plays' => 'integer', 'min_players' => 'integer', 'max_players' => 'integer', 'playing_time' => 'integer', 'year_published' => 'integer', 'bgg_id' => 'integer', - 'date_started' => 'date', - 'date_finished' => 'date', ]; } diff --git a/app/Services/BggService.php b/app/Services/BggService.php index 1d25d41..578b46b 100644 --- a/app/Services/BggService.php +++ b/app/Services/BggService.php @@ -21,21 +21,33 @@ public function __construct() public function search(string $query): array { try { - $response = $this->connector->send(new SearchBoardGames($query)); + // Try exact match first, then fall back to fuzzy + $exactResponse = $this->connector->send(new SearchBoardGames($query, exact: true)); + $fuzzyResponse = $this->connector->send(new SearchBoardGames($query)); - if (! $response->successful()) { - return []; - } - - $xml = new SimpleXMLElement($response->body()); $results = []; + $seenIds = []; + + foreach ([$exactResponse, $fuzzyResponse] as $response) { + if (! $response->successful()) { + continue; + } - foreach ($xml->item as $item) { - $results[] = [ - 'bgg_id' => (int) $item['id'], - 'title' => (string) $item->name['value'], - 'year_published' => isset($item->yearpublished) ? (int) $item->yearpublished['value'] : null, - ]; + $xml = new SimpleXMLElement($response->body()); + + foreach ($xml->item as $item) { + $id = (int) $item['id']; + if (isset($seenIds[$id])) { + continue; + } + $seenIds[$id] = true; + + $results[] = [ + 'bgg_id' => $id, + 'title' => (string) $item->name['value'], + 'year_published' => isset($item->yearpublished) ? (int) $item->yearpublished['value'] : null, + ]; + } } return array_slice($results, 0, 20); @@ -87,6 +99,14 @@ public function getDetails(int $bggId): ?array } } + $bggRating = null; + if (isset($item->statistics->ratings->average)) { + $avg = (float) $item->statistics->ratings->average['value']; + if ($avg > 0) { + $bggRating = round($avg, 2); + } + } + return [ 'bgg_id' => $bggId, 'title' => $title ?? 'Unknown', @@ -99,6 +119,7 @@ public function getDetails(int $bggId): ?array 'max_players' => isset($item->maxplayers) ? (int) $item->maxplayers['value'] : null, 'playing_time' => isset($item->playingtime) ? (int) $item->playingtime['value'] : null, 'genres' => $genres, + 'bgg_rating' => $bggRating, ]; } catch (\Exception) { return null; diff --git a/app/Services/Saloon/Bgg/Requests/SearchBoardGames.php b/app/Services/Saloon/Bgg/Requests/SearchBoardGames.php index 9aa6946..833155e 100644 --- a/app/Services/Saloon/Bgg/Requests/SearchBoardGames.php +++ b/app/Services/Saloon/Bgg/Requests/SearchBoardGames.php @@ -13,6 +13,7 @@ class SearchBoardGames extends Request public function __construct( protected string $searchQuery, + protected bool $exact = false, ) {} public function resolveEndpoint(): string @@ -22,9 +23,15 @@ public function resolveEndpoint(): string protected function defaultQuery(): array { - return [ + $query = [ 'query' => $this->searchQuery, 'type' => 'boardgame', ]; + + if ($this->exact) { + $query['exact'] = 1; + } + + return $query; } } diff --git a/database/migrations/2026_03_28_180000_refactor_board_games_for_bgg.php b/database/migrations/2026_03_28_180000_refactor_board_games_for_bgg.php new file mode 100644 index 0000000..ee57344 --- /dev/null +++ b/database/migrations/2026_03_28_180000_refactor_board_games_for_bgg.php @@ -0,0 +1,41 @@ +where('status', 'backlog')->update(['status' => 'want_to_play']); + DB::table('board_games')->where('status', 'playing')->update(['status' => 'owned']); + DB::table('board_games')->where('status', 'completed')->update(['status' => 'owned']); + DB::table('board_games')->where('status', 'mastered')->update(['status' => 'owned']); + DB::table('board_games')->where('status', 'shelved')->update(['status' => 'previously_owned']); + + Schema::table('board_games', function (Blueprint $table) { + $table->dropColumn(['date_started', 'date_finished', 'ownership']); + $table->decimal('bgg_rating', 4, 2)->nullable()->after('rating'); + }); + } + + public function down(): void + { + Schema::table('board_games', function (Blueprint $table) { + $table->date('date_started')->nullable(); + $table->date('date_finished')->nullable(); + $table->string('ownership')->default('owned'); + $table->dropColumn('bgg_rating'); + }); + + DB::table('board_games')->where('status', 'want_to_play')->update(['status' => 'backlog']); + DB::table('board_games')->where('status', 'wishlist')->update(['status' => 'backlog']); + DB::table('board_games')->where('status', 'for_trade')->update(['status' => 'shelved']); + DB::table('board_games')->where('status', 'previously_owned')->update(['status' => 'shelved']); + } +}; diff --git a/resources/css/app.css b/resources/css/app.css index 35bd5cd..bbbd6aa 100644 --- a/resources/css/app.css +++ b/resources/css/app.css @@ -97,6 +97,18 @@ --color-status-mastered: 147 51 234; /* purple-600 */ --color-status-mastered-bg: 250 245 255; /* purple-50 */ + /* Board Game statuses */ + --color-status-owned: 34 197 94; /* green-500 */ + --color-status-owned-bg: 240 253 244; /* green-50 */ + --color-status-want-to-play: 59 130 246; /* blue-500 */ + --color-status-want-to-play-bg: 239 246 255; /* blue-50 */ + --color-status-wishlist: 245 158 11; /* amber-500 */ + --color-status-wishlist-bg: 255 251 235; /* amber-50 */ + --color-status-for-trade: 234 88 12; /* orange-600 */ + --color-status-for-trade-bg: 255 247 237; /* orange-50 */ + --color-status-previously-owned: 107 114 128; /* gray-500 */ + --color-status-previously-owned-bg: 243 244 246; /* gray-100 */ + /* Platform Colors */ --color-platform-nintendo: 229 36 39; /* Nintendo red #E52427 */ --color-platform-nintendo-bg: 254 242 242; /* red-50 */ @@ -227,6 +239,18 @@ --color-status-mastered: 211 134 155; /* purple #d3869b */ --color-status-mastered-bg: 60 56 54; + /* Board Game statuses */ + --color-status-owned: 184 187 38; /* green #b8bb26 */ + --color-status-owned-bg: 60 56 54; + --color-status-want-to-play: 131 165 152; /* blue #83a598 */ + --color-status-want-to-play-bg: 60 56 54; + --color-status-wishlist: 250 189 47; /* yellow #fabd2f */ + --color-status-wishlist-bg: 60 56 54; + --color-status-for-trade: 254 128 25; /* orange #fe8019 */ + --color-status-for-trade-bg: 60 56 54; + --color-status-previously-owned: 146 131 116; /* gray #928374 */ + --color-status-previously-owned-bg: 60 56 54; + /* Platform Colors */ --color-platform-nintendo: 251 73 52; /* gruvbox red #fb4934 */ --color-platform-nintendo-bg: 60 56 54; /* bg1 */ diff --git a/resources/views/livewire/board-games/board-game-bgg-search.blade.php b/resources/views/livewire/board-games/board-game-bgg-search.blade.php index f89866e..b6f1d65 100644 --- a/resources/views/livewire/board-games/board-game-bgg-search.blade.php +++ b/resources/views/livewire/board-games/board-game-bgg-search.blade.php @@ -237,7 +237,7 @@ class="w-full flex items-center gap-4 px-4 py-3 text-left hover:bg-theme-bg-hove
    - {{-- Status + Ownership + Rating --}} + {{-- Status + Rating --}}
    @@ -247,15 +247,6 @@ class="w-full flex items-center gap-4 px-4 py-3 text-left hover:bg-theme-bg-hove @endforeach
    -
    - - -
    diff --git a/resources/views/livewire/board-games/board-game-form.blade.php b/resources/views/livewire/board-games/board-game-form.blade.php index 01e0557..2dc5eb7 100644 --- a/resources/views/livewire/board-games/board-game-form.blade.php +++ b/resources/views/livewire/board-games/board-game-form.blade.php @@ -190,20 +190,6 @@ @error('status')

    {{ $message }}

    @enderror
    - {{-- Ownership --}} -
    - -
    - -
    - @error('ownership')

    {{ $message }}

    @enderror -
    - {{-- Plays --}}
    @@ -213,24 +199,6 @@ @error('plays')

    {{ $message }}

    @enderror
    - {{-- Date Started --}} -
    - -
    - -
    - @error('date_started')

    {{ $message }}

    @enderror -
    - - {{-- Date Finished --}} -
    - -
    - -
    - @error('date_finished')

    {{ $message }}

    @enderror -
    - {{-- Rating (1-10 numbered buttons) --}}
    diff --git a/resources/views/livewire/board-games/board-game-index.blade.php b/resources/views/livewire/board-games/board-game-index.blade.php index 86fab54..41d8590 100644 --- a/resources/views/livewire/board-games/board-game-index.blade.php +++ b/resources/views/livewire/board-games/board-game-index.blade.php @@ -82,17 +82,6 @@ class="rounded-md border-0 py-1.5 pl-3 pr-8 text-sm ring-1 ring-inset ring-theme @endforeach - {{-- Ownership Filter --}} - - {{-- Genre Filter --}} +
    + + +

    Your instance URL is not stored.

    +
    +
    + - + + +
    +
    +
    +

    Made & dogfooded by

    +

    dotMavriQ

    +

    TEAL is a real tool I use every day and keep sharpening in the open — free to download, free to fork. If it earns a spot on your server, that's the whole reward.

    +
    + +
    +
    + + + From 6765cfbc738f6e03e75d8469189aa5d0ea13ce2f Mon Sep 17 00:00:00 2001 From: dotMavriQ Date: Tue, 2 Jun 2026 19:52:48 +0100 Subject: [PATCH 38/77] license: relicense from MIT to AGPL-3.0 MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Copyleft so TEAL stays free — anyone running a modified version as a service must share source (closes the SaaS loophole). Updates the LICENSE text and the composer package metadata (name/description/license). --- LICENSE | 671 ++++++++++++++++++++++++++++++++++++++++++++++++++ composer.json | 8 +- 2 files changed, 675 insertions(+), 4 deletions(-) create mode 100644 LICENSE diff --git a/LICENSE b/LICENSE new file mode 100644 index 0000000..8d414fd --- /dev/null +++ b/LICENSE @@ -0,0 +1,671 @@ +TEAL — The Essential Aggregator Library +Copyright (C) 2026 Jonatan Jansson (dotMavriQ) + +This program is free software: you can redistribute it and/or modify it +under the terms of the GNU Affero General Public License as published by the +Free Software Foundation, either version 3 of the License, or (at your option) +any later version. The full text follows. + +---------------------------------------------------------------------- + + GNU AFFERO GENERAL PUBLIC LICENSE + Version 3, 19 November 2007 + + Copyright (C) 2007 Free Software Foundation, Inc. + Everyone is permitted to copy and distribute verbatim copies + of this license document, but changing it is not allowed. + + Preamble + + The GNU Affero General Public License is a free, copyleft license for +software and other kinds of works, specifically designed to ensure +cooperation with the community in the case of network server software. + + The licenses for most software and other practical works are designed +to take away your freedom to share and change the works. By contrast, +our General Public Licenses are intended to guarantee your freedom to +share and change all versions of a program--to make sure it remains free +software for all its users. + + When we speak of free software, we are referring to freedom, not +price. Our General Public Licenses are designed to make sure that you +have the freedom to distribute copies of free software (and charge for +them if you wish), that you receive source code or can get it if you +want it, that you can change the software or use pieces of it in new +free programs, and that you know you can do these things. + + Developers that use our General Public Licenses protect your rights +with two steps: (1) assert copyright on the software, and (2) offer +you this License which gives you legal permission to copy, distribute +and/or modify the software. + + A secondary benefit of defending all users' freedom is that +improvements made in alternate versions of the program, if they +receive widespread use, become available for other developers to +incorporate. Many developers of free software are heartened and +encouraged by the resulting cooperation. However, in the case of +software used on network servers, this result may fail to come about. +The GNU General Public License permits making a modified version and +letting the public access it on a server without ever releasing its +source code to the public. + + The GNU Affero General Public License is designed specifically to +ensure that, in such cases, the modified source code becomes available +to the community. It requires the operator of a network server to +provide the source code of the modified version running there to the +users of that server. Therefore, public use of a modified version, on +a publicly accessible server, gives the public access to the source +code of the modified version. + + An older license, called the Affero General Public License and +published by Affero, was designed to accomplish similar goals. This is +a different license, not a version of the Affero GPL, but Affero has +released a new version of the Affero GPL which permits relicensing under +this license. + + The precise terms and conditions for copying, distribution and +modification follow. + + TERMS AND CONDITIONS + + 0. Definitions. + + "This License" refers to version 3 of the GNU Affero General Public License. + + "Copyright" also means copyright-like laws that apply to other kinds of +works, such as semiconductor masks. + + "The Program" refers to any copyrightable work licensed under this +License. Each licensee is addressed as "you". "Licensees" and +"recipients" may be individuals or organizations. + + To "modify" a work means to copy from or adapt all or part of the work +in a fashion requiring copyright permission, other than the making of an +exact copy. The resulting work is called a "modified version" of the +earlier work or a work "based on" the earlier work. + + A "covered work" means either the unmodified Program or a work based +on the Program. + + To "propagate" a work means to do anything with it that, without +permission, would make you directly or secondarily liable for +infringement under applicable copyright law, except executing it on a +computer or modifying a private copy. Propagation includes copying, +distribution (with or without modification), making available to the +public, and in some countries other activities as well. + + To "convey" a work means any kind of propagation that enables other +parties to make or receive copies. Mere interaction with a user through +a computer network, with no transfer of a copy, is not conveying. + + An interactive user interface displays "Appropriate Legal Notices" +to the extent that it includes a convenient and prominently visible +feature that (1) displays an appropriate copyright notice, and (2) +tells the user that there is no warranty for the work (except to the +extent that warranties are provided), that licensees may convey the +work under this License, and how to view a copy of this License. If +the interface presents a list of user commands or options, such as a +menu, a prominent item in the list meets this criterion. + + 1. Source Code. + + The "source code" for a work means the preferred form of the work +for making modifications to it. "Object code" means any non-source +form of a work. + + A "Standard Interface" means an interface that either is an official +standard defined by a recognized standards body, or, in the case of +interfaces specified for a particular programming language, one that +is widely used among developers working in that language. + + The "System Libraries" of an executable work include anything, other +than the work as a whole, that (a) is included in the normal form of +packaging a Major Component, but which is not part of that Major +Component, and (b) serves only to enable use of the work with that +Major Component, or to implement a Standard Interface for which an +implementation is available to the public in source code form. A +"Major Component", in this context, means a major essential component +(kernel, window system, and so on) of the specific operating system +(if any) on which the executable work runs, or a compiler used to +produce the work, or an object code interpreter used to run it. + + The "Corresponding Source" for a work in object code form means all +the source code needed to generate, install, and (for an executable +work) run the object code and to modify the work, including scripts to +control those activities. However, it does not include the work's +System Libraries, or general-purpose tools or generally available free +programs which are used unmodified in performing those activities but +which are not part of the work. For example, Corresponding Source +includes interface definition files associated with source files for +the work, and the source code for shared libraries and dynamically +linked subprograms that the work is specifically designed to require, +such as by intimate data communication or control flow between those +subprograms and other parts of the work. + + The Corresponding Source need not include anything that users +can regenerate automatically from other parts of the Corresponding +Source. + + The Corresponding Source for a work in source code form is that +same work. + + 2. Basic Permissions. + + All rights granted under this License are granted for the term of +copyright on the Program, and are irrevocable provided the stated +conditions are met. This License explicitly affirms your unlimited +permission to run the unmodified Program. The output from running a +covered work is covered by this License only if the output, given its +content, constitutes a covered work. This License acknowledges your +rights of fair use or other equivalent, as provided by copyright law. + + You may make, run and propagate covered works that you do not +convey, without conditions so long as your license otherwise remains +in force. You may convey covered works to others for the sole purpose +of having them make modifications exclusively for you, or provide you +with facilities for running those works, provided that you comply with +the terms of this License in conveying all material for which you do +not control copyright. Those thus making or running the covered works +for you must do so exclusively on your behalf, under your direction +and control, on terms that prohibit them from making any copies of +your copyrighted material outside their relationship with you. + + Conveying under any other circumstances is permitted solely under +the conditions stated below. Sublicensing is not allowed; section 10 +makes it unnecessary. + + 3. Protecting Users' Legal Rights From Anti-Circumvention Law. + + No covered work shall be deemed part of an effective technological +measure under any applicable law fulfilling obligations under article +11 of the WIPO copyright treaty adopted on 20 December 1996, or +similar laws prohibiting or restricting circumvention of such +measures. + + When you convey a covered work, you waive any legal power to forbid +circumvention of technological measures to the extent such circumvention +is effected by exercising rights under this License with respect to +the covered work, and you disclaim any intention to limit operation or +modification of the work as a means of enforcing, against the work's +users, your or third parties' legal rights to forbid circumvention of +technological measures. + + 4. Conveying Verbatim Copies. + + You may convey verbatim copies of the Program's source code as you +receive it, in any medium, provided that you conspicuously and +appropriately publish on each copy an appropriate copyright notice; +keep intact all notices stating that this License and any +non-permissive terms added in accord with section 7 apply to the code; +keep intact all notices of the absence of any warranty; and give all +recipients a copy of this License along with the Program. + + You may charge any price or no price for each copy that you convey, +and you may offer support or warranty protection for a fee. + + 5. Conveying Modified Source Versions. + + You may convey a work based on the Program, or the modifications to +produce it from the Program, in the form of source code under the +terms of section 4, provided that you also meet all of these conditions: + + a) The work must carry prominent notices stating that you modified + it, and giving a relevant date. + + b) The work must carry prominent notices stating that it is + released under this License and any conditions added under section + 7. This requirement modifies the requirement in section 4 to + "keep intact all notices". + + c) You must license the entire work, as a whole, under this + License to anyone who comes into possession of a copy. This + License will therefore apply, along with any applicable section 7 + additional terms, to the whole of the work, and all its parts, + regardless of how they are packaged. This License gives no + permission to license the work in any other way, but it does not + invalidate such permission if you have separately received it. + + d) If the work has interactive user interfaces, each must display + Appropriate Legal Notices; however, if the Program has interactive + interfaces that do not display Appropriate Legal Notices, your + work need not make them do so. + + A compilation of a covered work with other separate and independent +works, which are not by their nature extensions of the covered work, +and which are not combined with it such as to form a larger program, +in or on a volume of a storage or distribution medium, is called an +"aggregate" if the compilation and its resulting copyright are not +used to limit the access or legal rights of the compilation's users +beyond what the individual works permit. Inclusion of a covered work +in an aggregate does not cause this License to apply to the other +parts of the aggregate. + + 6. Conveying Non-Source Forms. + + You may convey a covered work in object code form under the terms +of sections 4 and 5, provided that you also convey the +machine-readable Corresponding Source under the terms of this License, +in one of these ways: + + a) Convey the object code in, or embodied in, a physical product + (including a physical distribution medium), accompanied by the + Corresponding Source fixed on a durable physical medium + customarily used for software interchange. + + b) Convey the object code in, or embodied in, a physical product + (including a physical distribution medium), accompanied by a + written offer, valid for at least three years and valid for as + long as you offer spare parts or customer support for that product + model, to give anyone who possesses the object code either (1) a + copy of the Corresponding Source for all the software in the + product that is covered by this License, on a durable physical + medium customarily used for software interchange, for a price no + more than your reasonable cost of physically performing this + conveying of source, or (2) access to copy the + Corresponding Source from a network server at no charge. + + c) Convey individual copies of the object code with a copy of the + written offer to provide the Corresponding Source. This + alternative is allowed only occasionally and noncommercially, and + only if you received the object code with such an offer, in accord + with subsection 6b. + + d) Convey the object code by offering access from a designated + place (gratis or for a charge), and offer equivalent access to the + Corresponding Source in the same way through the same place at no + further charge. You need not require recipients to copy the + Corresponding Source along with the object code. If the place to + copy the object code is a network server, the Corresponding Source + may be on a different server (operated by you or a third party) + that supports equivalent copying facilities, provided you maintain + clear directions next to the object code saying where to find the + Corresponding Source. Regardless of what server hosts the + Corresponding Source, you remain obligated to ensure that it is + available for as long as needed to satisfy these requirements. + + e) Convey the object code using peer-to-peer transmission, provided + you inform other peers where the object code and Corresponding + Source of the work are being offered to the general public at no + charge under subsection 6d. + + A separable portion of the object code, whose source code is excluded +from the Corresponding Source as a System Library, need not be +included in conveying the object code work. + + A "User Product" is either (1) a "consumer product", which means any +tangible personal property which is normally used for personal, family, +or household purposes, or (2) anything designed or sold for incorporation +into a dwelling. In determining whether a product is a consumer product, +doubtful cases shall be resolved in favor of coverage. For a particular +product received by a particular user, "normally used" refers to a +typical or common use of that class of product, regardless of the status +of the particular user or of the way in which the particular user +actually uses, or expects or is expected to use, the product. A product +is a consumer product regardless of whether the product has substantial +commercial, industrial or non-consumer uses, unless such uses represent +the only significant mode of use of the product. + + "Installation Information" for a User Product means any methods, +procedures, authorization keys, or other information required to install +and execute modified versions of a covered work in that User Product from +a modified version of its Corresponding Source. The information must +suffice to ensure that the continued functioning of the modified object +code is in no case prevented or interfered with solely because +modification has been made. + + If you convey an object code work under this section in, or with, or +specifically for use in, a User Product, and the conveying occurs as +part of a transaction in which the right of possession and use of the +User Product is transferred to the recipient in perpetuity or for a +fixed term (regardless of how the transaction is characterized), the +Corresponding Source conveyed under this section must be accompanied +by the Installation Information. But this requirement does not apply +if neither you nor any third party retains the ability to install +modified object code on the User Product (for example, the work has +been installed in ROM). + + The requirement to provide Installation Information does not include a +requirement to continue to provide support service, warranty, or updates +for a work that has been modified or installed by the recipient, or for +the User Product in which it has been modified or installed. Access to a +network may be denied when the modification itself materially and +adversely affects the operation of the network or violates the rules and +protocols for communication across the network. + + Corresponding Source conveyed, and Installation Information provided, +in accord with this section must be in a format that is publicly +documented (and with an implementation available to the public in +source code form), and must require no special password or key for +unpacking, reading or copying. + + 7. Additional Terms. + + "Additional permissions" are terms that supplement the terms of this +License by making exceptions from one or more of its conditions. +Additional permissions that are applicable to the entire Program shall +be treated as though they were included in this License, to the extent +that they are valid under applicable law. If additional permissions +apply only to part of the Program, that part may be used separately +under those permissions, but the entire Program remains governed by +this License without regard to the additional permissions. + + When you convey a copy of a covered work, you may at your option +remove any additional permissions from that copy, or from any part of +it. (Additional permissions may be written to require their own +removal in certain cases when you modify the work.) You may place +additional permissions on material, added by you to a covered work, +for which you have or can give appropriate copyright permission. + + Notwithstanding any other provision of this License, for material you +add to a covered work, you may (if authorized by the copyright holders of +that material) supplement the terms of this License with terms: + + a) Disclaiming warranty or limiting liability differently from the + terms of sections 15 and 16 of this License; or + + b) Requiring preservation of specified reasonable legal notices or + author attributions in that material or in the Appropriate Legal + Notices displayed by works containing it; or + + c) Prohibiting misrepresentation of the origin of that material, or + requiring that modified versions of such material be marked in + reasonable ways as different from the original version; or + + d) Limiting the use for publicity purposes of names of licensors or + authors of the material; or + + e) Declining to grant rights under trademark law for use of some + trade names, trademarks, or service marks; or + + f) Requiring indemnification of licensors and authors of that + material by anyone who conveys the material (or modified versions of + it) with contractual assumptions of liability to the recipient, for + any liability that these contractual assumptions directly impose on + those licensors and authors. + + All other non-permissive additional terms are considered "further +restrictions" within the meaning of section 10. If the Program as you +received it, or any part of it, contains a notice stating that it is +governed by this License along with a term that is a further +restriction, you may remove that term. If a license document contains +a further restriction but permits relicensing or conveying under this +License, you may add to a covered work material governed by the terms +of that license document, provided that the further restriction does +not survive such relicensing or conveying. + + If you add terms to a covered work in accord with this section, you +must place, in the relevant source files, a statement of the +additional terms that apply to those files, or a notice indicating +where to find the applicable terms. + + Additional terms, permissive or non-permissive, may be stated in the +form of a separately written license, or stated as exceptions; +the above requirements apply either way. + + 8. Termination. + + You may not propagate or modify a covered work except as expressly +provided under this License. Any attempt otherwise to propagate or +modify it is void, and will automatically terminate your rights under +this License (including any patent licenses granted under the third +paragraph of section 11). + + However, if you cease all violation of this License, then your +license from a particular copyright holder is reinstated (a) +provisionally, unless and until the copyright holder explicitly and +finally terminates your license, and (b) permanently, if the copyright +holder fails to notify you of the violation by some reasonable means +prior to 60 days after the cessation. + + Moreover, your license from a particular copyright holder is +reinstated permanently if the copyright holder notifies you of the +violation by some reasonable means, this is the first time you have +received notice of violation of this License (for any work) from that +copyright holder, and you cure the violation prior to 30 days after +your receipt of the notice. + + Termination of your rights under this section does not terminate the +licenses of parties who have received copies or rights from you under +this License. If your rights have been terminated and not permanently +reinstated, you do not qualify to receive new licenses for the same +material under section 10. + + 9. Acceptance Not Required for Having Copies. + + You are not required to accept this License in order to receive or +run a copy of the Program. Ancillary propagation of a covered work +occurring solely as a consequence of using peer-to-peer transmission +to receive a copy likewise does not require acceptance. However, +nothing other than this License grants you permission to propagate or +modify any covered work. These actions infringe copyright if you do +not accept this License. Therefore, by modifying or propagating a +covered work, you indicate your acceptance of this License to do so. + + 10. Automatic Licensing of Downstream Recipients. + + Each time you convey a covered work, the recipient automatically +receives a license from the original licensors, to run, modify and +propagate that work, subject to this License. You are not responsible +for enforcing compliance by third parties with this License. + + An "entity transaction" is a transaction transferring control of an +organization, or substantially all assets of one, or subdividing an +organization, or merging organizations. If propagation of a covered +work results from an entity transaction, each party to that +transaction who receives a copy of the work also receives whatever +licenses to the work the party's predecessor in interest had or could +give under the previous paragraph, plus a right to possession of the +Corresponding Source of the work from the predecessor in interest, if +the predecessor has it or can get it with reasonable efforts. + + You may not impose any further restrictions on the exercise of the +rights granted or affirmed under this License. For example, you may +not impose a license fee, royalty, or other charge for exercise of +rights granted under this License, and you may not initiate litigation +(including a cross-claim or counterclaim in a lawsuit) alleging that +any patent claim is infringed by making, using, selling, offering for +sale, or importing the Program or any portion of it. + + 11. Patents. + + A "contributor" is a copyright holder who authorizes use under this +License of the Program or a work on which the Program is based. The +work thus licensed is called the contributor's "contributor version". + + A contributor's "essential patent claims" are all patent claims +owned or controlled by the contributor, whether already acquired or +hereafter acquired, that would be infringed by some manner, permitted +by this License, of making, using, or selling its contributor version, +but do not include claims that would be infringed only as a +consequence of further modification of the contributor version. For +purposes of this definition, "control" includes the right to grant +patent sublicenses in a manner consistent with the requirements of +this License. + + Each contributor grants you a non-exclusive, worldwide, royalty-free +patent license under the contributor's essential patent claims, to +make, use, sell, offer for sale, import and otherwise run, modify and +propagate the contents of its contributor version. + + In the following three paragraphs, a "patent license" is any express +agreement or commitment, however denominated, not to enforce a patent +(such as an express permission to practice a patent or covenant not to +sue for patent infringement). To "grant" such a patent license to a +party means to make such an agreement or commitment not to enforce a +patent against the party. + + If you convey a covered work, knowingly relying on a patent license, +and the Corresponding Source of the work is not available for anyone +to copy, free of charge and under the terms of this License, through a +publicly available network server or other readily accessible means, +then you must either (1) cause the Corresponding Source to be so +available, or (2) arrange to deprive yourself of the benefit of the +patent license for this particular work, or (3) arrange, in a manner +consistent with the requirements of this License, to extend the patent +license to downstream recipients. "Knowingly relying" means you have +actual knowledge that, but for the patent license, your conveying the +covered work in a country, or your recipient's use of the covered work +in a country, would infringe one or more identifiable patents in that +country that you have reason to believe are valid. + + If, pursuant to or in connection with a single transaction or +arrangement, you convey, or propagate by procuring conveyance of, a +covered work, and grant a patent license to some of the parties +receiving the covered work authorizing them to use, propagate, modify +or convey a specific copy of the covered work, then the patent license +you grant is automatically extended to all recipients of the covered +work and works based on it. + + A patent license is "discriminatory" if it does not include within +the scope of its coverage, prohibits the exercise of, or is +conditioned on the non-exercise of one or more of the rights that are +specifically granted under this License. You may not convey a covered +work if you are a party to an arrangement with a third party that is +in the business of distributing software, under which you make payment +to the third party based on the extent of your activity of conveying +the work, and under which the third party grants, to any of the +parties who would receive the covered work from you, a discriminatory +patent license (a) in connection with copies of the covered work +conveyed by you (or copies made from those copies), or (b) primarily +for and in connection with specific products or compilations that +contain the covered work, unless you entered into that arrangement, +or that patent license was granted, prior to 28 March 2007. + + Nothing in this License shall be construed as excluding or limiting +any implied license or other defenses to infringement that may +otherwise be available to you under applicable patent law. + + 12. No Surrender of Others' Freedom. + + If conditions are imposed on you (whether by court order, agreement or +otherwise) that contradict the conditions of this License, they do not +excuse you from the conditions of this License. If you cannot convey a +covered work so as to satisfy simultaneously your obligations under this +License and any other pertinent obligations, then as a consequence you may +not convey it at all. For example, if you agree to terms that obligate you +to collect a royalty for further conveying from those to whom you convey +the Program, the only way you could satisfy both those terms and this +License would be to refrain entirely from conveying the Program. + + 13. Remote Network Interaction; Use with the GNU General Public License. + + Notwithstanding any other provision of this License, if you modify the +Program, your modified version must prominently offer all users +interacting with it remotely through a computer network (if your version +supports such interaction) an opportunity to receive the Corresponding +Source of your version by providing access to the Corresponding Source +from a network server at no charge, through some standard or customary +means of facilitating copying of software. This Corresponding Source +shall include the Corresponding Source for any work covered by version 3 +of the GNU General Public License that is incorporated pursuant to the +following paragraph. + + Notwithstanding any other provision of this License, you have +permission to link or combine any covered work with a work licensed +under version 3 of the GNU General Public License into a single +combined work, and to convey the resulting work. The terms of this +License will continue to apply to the part which is the covered work, +but the work with which it is combined will remain governed by version +3 of the GNU General Public License. + + 14. Revised Versions of this License. + + The Free Software Foundation may publish revised and/or new versions of +the GNU Affero General Public License from time to time. Such new versions +will be similar in spirit to the present version, but may differ in detail to +address new problems or concerns. + + Each version is given a distinguishing version number. If the +Program specifies that a certain numbered version of the GNU Affero General +Public License "or any later version" applies to it, you have the +option of following the terms and conditions either of that numbered +version or of any later version published by the Free Software +Foundation. If the Program does not specify a version number of the +GNU Affero General Public License, you may choose any version ever published +by the Free Software Foundation. + + If the Program specifies that a proxy can decide which future +versions of the GNU Affero General Public License can be used, that proxy's +public statement of acceptance of a version permanently authorizes you +to choose that version for the Program. + + Later license versions may give you additional or different +permissions. However, no additional obligations are imposed on any +author or copyright holder as a result of your choosing to follow a +later version. + + 15. Disclaimer of Warranty. + + THERE IS NO WARRANTY FOR THE PROGRAM, TO THE EXTENT PERMITTED BY +APPLICABLE LAW. EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT +HOLDERS AND/OR OTHER PARTIES PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY +OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, +THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR +PURPOSE. THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE PROGRAM +IS WITH YOU. SHOULD THE PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF +ALL NECESSARY SERVICING, REPAIR OR CORRECTION. + + 16. Limitation of Liability. + + IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING +WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MODIFIES AND/OR CONVEYS +THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES, INCLUDING ANY +GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING OUT OF THE +USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED TO LOSS OF +DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD +PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER PROGRAMS), +EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF +SUCH DAMAGES. + + 17. Interpretation of Sections 15 and 16. + + If the disclaimer of warranty and limitation of liability provided +above cannot be given local legal effect according to their terms, +reviewing courts shall apply local law that most closely approximates +an absolute waiver of all civil liability in connection with the +Program, unless a warranty or assumption of liability accompanies a +copy of the Program in return for a fee. + + END OF TERMS AND CONDITIONS + + How to Apply These Terms to Your New Programs + + If you develop a new program, and you want it to be of the greatest +possible use to the public, the best way to achieve this is to make it +free software which everyone can redistribute and change under these terms. + + To do so, attach the following notices to the program. It is safest +to attach them to the start of each source file to most effectively +state the exclusion of warranty; and each file should have at least +the "copyright" line and a pointer to where the full notice is found. + + + Copyright (C) + + This program is free software: you can redistribute it and/or modify + it under the terms of the GNU Affero General Public License as published by + the Free Software Foundation, either version 3 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU Affero General Public License for more details. + + You should have received a copy of the GNU Affero General Public License + along with this program. If not, see . + +Also add information on how to contact you by electronic and paper mail. + + If your software can interact with users remotely through a computer +network, you should also make sure that it provides a way for users to +get its source. For example, if your program is a web application, its +interface could display a "Source" link that leads users to an archive +of the code. There are many ways you could offer source, and different +solutions will be better for different programs; see section 13 for the +specific requirements. + + You should also get your employer (if you work as a programmer) or school, +if any, to sign a "copyright disclaimer" for the program, if necessary. +For more information on this, and how to apply and follow the GNU AGPL, see +. diff --git a/composer.json b/composer.json index 04cf6d0..49df165 100644 --- a/composer.json +++ b/composer.json @@ -1,10 +1,10 @@ { "$schema": "https://getcomposer.org/schema.json", - "name": "laravel/laravel", + "name": "dotmavriq/teal", "type": "project", - "description": "The skeleton application for the Laravel framework.", - "keywords": ["laravel", "framework"], - "license": "MIT", + "description": "TEAL — a self-hosted tracker for everything you read, watch, play and listen to.", + "keywords": ["self-hosted", "media-tracker", "laravel", "livewire"], + "license": "AGPL-3.0-or-later", "require": { "php": "^8.2", "intervention/image": "^3.11", From 5c52c549cb76879f866bc6dc6a102e2c3f381d33 Mon Sep 17 00:00:00 2001 From: dotMavriQ Date: Tue, 2 Jun 2026 19:52:48 +0100 Subject: [PATCH 39/77] feat(landing): real app screenshot, copyleft ethos, OG image Adds a 'See it in action' band with a real library grid in a brutalist browser frame, a coral 'Human-made. Copyleft. Clanker-free.' manifesto, and a 1200x630 OG share image. Footer/trust now read AGPL-3.0. --- public/brand/og.png | Bin 0 -> 70432 bytes public/brand/screenshot.webp | Bin 0 -> 165812 bytes resources/views/welcome.blade.php | 51 ++++++++++++++++++++++++++++-- 3 files changed, 49 insertions(+), 2 deletions(-) create mode 100644 public/brand/og.png create mode 100644 public/brand/screenshot.webp diff --git a/public/brand/og.png b/public/brand/og.png new file mode 100644 index 0000000000000000000000000000000000000000..5e0c1a79e4a20544bc8033b33aabf941ac3cb059 GIT binary patch literal 70432 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 literal 0 HcmV?d00001 diff --git a/public/brand/screenshot.webp b/public/brand/screenshot.webp new file mode 100644 index 0000000000000000000000000000000000000000..ef65e9987a13a74bd086dc98f82ffb96f5d9a45d GIT binary patch literal 165812 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 (@1C{U`4 zw&IwBVp&Kc?^m2ZXO0!(;icvN^5y)ZXAXtJsuPB%`$9oCn=J5(BgQRFXne|INk%U^ zlno8h>)x&rSrM?gCAezCuvkePNj|gGt|quMhkSt~zKqXRwEI&@Tnr~e_zN>}W$>fC zW4VgCG&#W?@_TC{jkSCHK~WaIxbZwungl#=cm;o~OEfclGnHUfH@o9r5|syAkj6-s zazHRnc`#t!k+b8)aqfqx3Z=xT=jlCI$CG-P8JwIk6r3buku#nOcv_mg$EixXur z?a&YyoY~9zs}yU#Ay}2Oh9gvp68^!hKyb+%+U4s=BI)o;=}JpYK|-!$lO{vI@q@s$ zl??>rsNI?jvuN%O(L)HXTG>)_B5iY^eRF0HQ+NDNRgcNW(b6VUFX-svZ*6he&grl0Q{$5p zpdR4@8_teQbRR;wJ5A=)=a(`Ek#EQInxu2G)SP9UzHA47yUF(?X!9v;y933u&VO}G z7M*>3Daf)US=o(1<%uB=u#F#l#T1aO2JSRq_#f10nL%-$diX3P$vCxD=qn zm}ZAH2iqA8Yt?nH{s~r${>uY))iO_)8tmmS=XK^5WkaKmiZ zFwNhmml_JZH*2hBXH8VCk50muQ|T0}PVfIXonpO_M6WeHB|Aj-AP_p;u2Eb}ySC zS+ITSGK>qsBNqa8<0LBXNLcMaOiaYZbG%NQ?ko)IvyCfRo)3B=g!In;Zh+`GWsPtS zIA7%-eA2eSjrCe}Dm`H&%viDhe zQl$u;6ZAt(<0-ll&yo0JAR9N-_Vo{!5wNidRekNHIFn`^I%66!d&0cWr#EbI--*Zo2M z{iy$WTB-FphY`1X?sp;5MPLx6^o+xo`Exhw<<;N}6!~O>$gIcwW_SI!A=(iXus;uC zouxtu`{4JNQBuR@$XHqNJ?2jgL&V z9jDzl<_}gWLB&5^ovmDu^zB0;!4!(uWMp z$L87$$SJiauBVb5Iyy6e9V6z2gBi8!S&kdr)KAMJ#8{TEs@OCQg~{?{X6rJT?x8-- zIR3;>Bx~0upd0_PBNH*EpCOhoI#VjxHZ&aL?`Cra!DnYS+idX6$;!4^!d*rQ{q>Ku zQ3k9zyjt}rZaBXbaH|{ELWu5D5*uN>DT_~Mp-5&lrX}tw)p;^9KN}cUE zAe?8+!qYF7#C1~j$bH_~>%u`bO~o|C6IE2niRxrp-DH<1zd~;%C@nyBRK4uX+HFZc zTf<}-l+GLXs4dM*&iGs!V@IOpmRUYCGJ<&=gcY}c>owlp4y;QYG16&5rd6H-eih3` zXFh6>I_(PNzP$fol#hZ(d1NeZGC&g3+n{y$EKKU5UQYHhbMW4e6TOfru>2K#S|N*3 zzeF4d@oUz75c_GD%|3(?nZ{CMRKd6j1$8Rj_m2crhT#d7->&drC{OGw~x-Da&jR3r!@nXlN$9~*BZ4N{y;Df2e^{BpV(4k2(Y`J>q zu!b|C^IQ4RCLG#gZQp`ZbXUFmZyQ_{(+B-+DIsdct%=8;GFO-%BraFhH@>f7(zn8F z)5_(>_*(~~h4ob;w_MUG>ko0E3X#AWSCaP|0%0$9el>fiC&0M@K0~N!rB#RXS|Ydk z-$ zxz@0U^g?3(fDx%Hy;X^1VZ5F#T{u1d7@I-y{ltFYP2!vfuW)aQJd zoV0FOW_CeEKmYwlaxtQz1Yr0r^!VL;~UiX;OHc~B|Tz&v)(=jAjWNmy%lJ=;So zPgbERGJhut7npXA*?n;_rR2P4wEa|a)V}eMxnA9l=}c??86vdMQG*%@2nEISgr$nU zH>CH{K4tK_Xw`oCzW$M40Vv}~-gQGy+SC)Kn6dWmo^P#@|K{ayIK8M?m=O1tj!jwU z7F0`)J}YeCB`YWsYu^L@~s~^_F}e3HAwu(F&wd zq`xB6)1lESd3CtKHSWqeCknN{53uEo^D}paX=lXO}j-Ony;BlpWMnI^Cr_%VvrI z09LZSvqB&CXw6tL&5v&{1ucYstS}vl2M`om$z#q>DZOU5JnpaK5qi=ysJ#6T9o|J- z0OgF*@U;Bhlhb#o+$a7|C)o0^LEHYcPb=>Q~u-+ zz(wX_?63?C9`3-V=h2VYQL_Y1>)!C@ZVPYG@;8s_2F$a6OED9&pTo!Vo_&;3I!_${ z4Qs^v2vPOd z>pXlV<`RBN!I6*Wv4Og5pzOuC(kqq$z~{-s8iWsnAM^;|{`QjAw_JI1C?HmsYo>3> zURjDnTnAWUYu`{+d~)A0&;&gvudje3cUpLrsJ0pyeA#;JK(w*rJa;7bzj0&jQv&Q0 zIl+JCGw#=qiazIN&_i~tUI&lD1ulb~Eo>!+KVOx!BVv=}<7l-srx7DpuEl2g##_?G zBt4A(lB#c2Fx1Gfl8K-wjp-Kl`1R1ZRXYrk_Ne%2K=Z#qDkL45FB9@7li9R*{yH;hzBA=-J^oX&-!A)42uSw@cr~AQ^Pz zUrA3O{bSsy9DCh^&GfGyZRgH{Ua{$(@$gA@2k1mzM*E|0VFHI3_1Y!<6wRs$Rf%UA zx}XJzN{&TQX5(r4s8scXE7oDb4T^Q$9a_ERD=2p~&smUzP@W#@Ne;Kkt8_rjJc_Ua z*znU&Ui~~8TIf_l&S=BLG2&;o*Y`9m@C7<9h-D~d9mHYGwqttuwIksM!Q*q7y);Y80dUtGHyO+9!pazy~&t_5n z)>l?^XC?mJ$&CuU(n^=vRoQ-?;bEtQ(~M@@M%Z?NXRLRATDwLjZQp zxJSC#k8yP+&7XBkOu~R$BnU7FOj$=IokUMs9M-0fVooJZSfw$93crQ94)q;B(S7{1 zZ>uOP)1%jb0Cj(ID}|phxz(jO;Rf}@F4JsqZ-CoHJ9VYOvQiEdbzDH{k)k{e8{yCM zh`iDkCaa=<#dgKeRjWQtWxA5+kK}K~T}@~@zy-7+kpMN$+n3=DzT)WbK<+v;UrtH+ z_>+!OeCgx;uA1gm9l^cwE4%qj2#FYqL(A(1_2=)u0Ra1E)g;%1OI=e!;Guup{sP)= zWdgFRKmY+wZAp6G3XP7j50OQ_?ONi>ZDuU2GzgSt_*!0gV(>Yh;7@ad`v48a0PK30 za@JrnQqF2kTcH^>S+K$Sx!(ef0UOwGY@ol6zq%>K`E1@>1O~Ba{{cM;sBG)0uS02= zN~k`O(Xt;ne1su%Riqy*V1h8;=S@oC=oMF=QV(Z6#2%?~U)TqLXceBJWM+qH;2{i2 zzzId)I019XDIDbI;&aAiZ&{al`R1||y;>jG0T6{RR)_Wf{xdI@hopOlmyPz$9$}W) z;{xFLHV-h%Y~kh^ZJa#AEwhJ;W8ZK>m#ahj03q_O2C$&$JM3z}000000000000000 z0000000n)>NfC232k(1!q{NrF$f3Iu^AqpOZjcdIUHxk)q2)w<@2aqDQv-}eAD~yV zwu(tVB}?T;^@aB()BQp8<^FI=Pk2@CW|CozqUeCr{G>#&4YCvgJ**|Yg+_itm6j^x zO>jA0pfWL>BVy22f1;|FqF2H<+Y_)cIpr2bRPYr|x!6M9H{t3E)8O2LLv0OFrw3BD z6M>u4NNRuwSgi$0*Ym)g@u*MTO=B`&?o&PafD(zU1+M9rrp7T_ntpR~{r!#lY+KTc zn<2qPUpdQtn>t@LAcjjyAYlkYb~jk$x~Pgd9s#Abu&Lo{5EzEj6LUVaK$c0PG z4uAJ^Z3QJptjo91=$2#JIBjl0PRoI#3Yi(S@gk z>WIgn&xbd$QvTtDdA8jIo7q$atVz>HyF1wVtYw9az^;Uu>R9yM5q;*AsxW~x?-Ef# z&obh>_J4IxwJn6YlENxEtSsUXr<6k>EPbAoy~;sfL`GxOry+EPiys)1{~O+Q=30ry|GGZLA2mvo#xV z+xt+X)Q263IU?5R>7CThwJ~!AEwd+~Ksb>Ty;I1qgOJ;!z4j3dYx~V5>Y>ay-IE-J zJgJ`RpGh%9`*tm2Thh?jL}$zRd0aC6)#V5DX`PYE(zG%Rz zk0nWj-JrO+8!W@9p-93~W$6XiGzbyLSI9rURgDrW7^WYcNczc3Z{HPT*Y?D{?fnC- zsUv6nO+iz^yZ%kPXuW=>LFi^bwDFMIFN9|neN`ydbj%9<8NWG(%VAYWAEPOhh(P;J zK|4GOT@m+}-{Fi#Hbjn}l~)u=F5YM*F4Qum)#hGFu`NMaezWS`Xl@i@|IaJ^;ZbTZ z5=i7u^DqphL9{;|}@fB%qJ*)%xHX)a(t(lCH2y z&q>Y(YIe-5J$}g_U>Lb(i+NroiI%7@HO|xCq`&il4fPTOBeiz^%?L!tbwtRu6`Qzb zXX?Q;6QbD$E}+slzWjTGe^Huefr7z7Lg&i*8*;+REBcM*x@GLk%{`DTNaui$I+!e8 zEQ=}pnH*3V2YbvW|8FQC8fyqot#R4CMARN%F<#J&6iE~rMEE5UFqA1>4z>ce+ z00Q+`Gh5)i@2PTydn4=Hq}x+t@BOlTMgzQ5Q3%Md;5h61$tU13*O*Y<(nhvfO`<9j z)JT^Ibd2zTs38MC;r>y4YvMsH$4{$Zix{;lZ#E+g&*-KQc2r1LpMpl@wYxvWO*>E9 ze%zE@rX3rCx_l~O{jg9DLI)Z~&7x4}y_=w-E6NO~$ZS9h{(rdK?(*-m!g6A~z~>4v zragb-i0Iga$b2#s#36$8zeKS4@DOA~-u};sVv;IuRcJ0cqi94m33D9dca$q`X%M2S60V>{ zxB3zPX~5jdFwUM3L%K9fT7A_>kSaIct9&HQ4?vkos>^j%^vC4w# z2p$zi+YVNd^hfvDD=I0xuY(PXd$mlX?e8;5Z83dJswE+_#K@wIKgK!}?-FOqsglIe zl1l$BnQK%gEn#COt}XIKtq_oBzfI5qPr+N>v!=<4g8gE?6?n63UUJK{!og19B_NVv zo>BxGq$_wrY8{|UC*-Hz0Apm?z2NU}{7|Hova##l8T+v1{kaa!Nvz5$VfY>D3+b{j z5-h>F#X$CU&QtrtWYf1w=2H6$KmY&$ z02^Um5oVU(-vqnAtt?_e<+nY^$_qmj$g>__!kTeZk1Jc!PslOlDc09I5mTeMEVtB+ zY#GqKxA{jdWqZi`OZQwULSOl=!T3&V^X(FEDu3*he$_vxMuYC-Z5NXnQfkO54wDY8 zoTmRmrrNCf_S<5SX*vafsdG^NJJuITfYl_)G%?uHCo7luHVwyKw zK;T~_aa|!C{EKYKlaSzcIU@NS(s)m^eK!SzB=^MgIN|+cSb3VhFSj}AJHhopfv$;W z__*k2KhB5-L;(mGv~&>FU4-wuINDseJDp81UeHkjy8f1b4oR&2Q` z--8GIuo_fz1dDAIceT@tLx6L(a(M=-H<;Q$z3w`Jix%5?1VO?uAe$bNsjQh!M+LBt zdPA=tDuEHnrVf}%A(vz7$fXF}nZA}+RigLf;m^_9cJL=X=vWCp8Re7}7?}1nu(6~i zc~Qzdd%cU{38EJcy{@qx5l3;AXbtnqxBo6hi0PyMglTlsUv(+JBttnnD;BS<;ofe> z2fy>YcrxRqmZ8hLv+v&M2G+YN_Q!hP@xHZt<}*)ezO5gE?_(b$y7XC-G4w*Yu#@7! zb3&y+&b7%bND@}{04ktCb~R;mfxC93&bAU#qH1YD{SI6qCAE|wXkLVMlzoY`fdPw^ z9Dp|oMxs;^fa?@0P3}^#BL;g5WWIR4JL-_IS>i~#>*BCNdxz%avsRoq%ZN>a300y> zu@$l&@ga8poYf21k@ZwP+Yzn@UccUD24@XQ>p8%` zh6a)*ya}6Nf|?6aTR}0$Ax8_e3>TpOgipSx5d(=Ii_~zvac^C{w6YM!AEUe~;vG-( zlTGg?vdkVn|2~{$n)=62tXf@88Ieazi(eZ~Go{e{a1{~U4|E|{6T7a!irmd{c)mkF z8rPh(dN!pF4LY7MjTZtwUp^o}mx$jeYe#3c8(nuIgL-d2hw&;qt@O0dO;DR)`K><* z00_?@is+vCt3K*!48=S<+Dn7^>b8|TBE;5OEh1+o*hS{8co9!~%ixPnGLhugRADkc zv6AH>G0`kckSNcWfvpJ6Z*M;%(Vdt`i~HWBI&!)4dT8rDu5mdnH|<_A*YRVTsy7It zqOTO7-n%eq7E332AXklZPx0s6zb>1cPtZ6_8B;Sh*gKt&*^BfzGu3&$r6)sc*EzhVD6~WmV?kX;Gry3HIi=O4lI)I5t{8 zeu*(dFSI!hbLR)Grog2hPx$f@>{b$L(G9W9dkno+wv793AGV4jk(<5G-5O4wQ1aRm z3vHQaRTD!(z`FmwE`%}A+t+`Ul#(1Pe!_*Sa!*R0(kcGvrb4GJhXVm=^n-qG>=+DM z>csZlcs|j5!~DQ-8hEk1cq481RJg}qsW{yr{7cGo>hTiqX;N?`V2TbQvESw zMoBnwwR!=4Ipk$|XnNjQ()A9QBDBW+=M$QmBu8PIMRPs83{&<9`qKaymKkwLL- z$WPh7v9^3Kv22tZxXxoX*LytQ{p{>oL z@lUJE_n|z2wLjXB9q0vTeKTRadtqZe0RZ8D-NkQkoXH&&zTSLYl~7!#$wSC99DgWS<3K1sow13j?}=-(KM4E_7jz-a|9tn4(MLA);^uTmkkCFCxjqjX$h zy&m7_5fFURNkknL*&4-#4v9N(t@4yS+MGl-q&N1+ll8-wivbZs?rz2xj)O6*e0N*w zb&0q22Zj)r&8(T`*>D zQyK&H>C`J(U;;3XE)1#H9?Glyg-hzTa@tgM4PqfBX)DQAZK-;;K9uIo_qufWdKI&H z?7C5jP2$$^tAdW5mhklue#AebSnLhk&(`|0BjcTMb5eO29v%Pmo+`P%q&>FFv}O$* z%jdQaN?i`)IGc}{M?Li?hGKh5hVvNR*o@KD`H{7RZ@QI`*5mgufjM%q8ebLi7nX&A z`C#kS3YbtPii>0iw^fNS?pOJNAtmiam9d<1clN5OLvjUZ{J zO6&?e6eTeLNR01Kv`PXt&ZQga}eZca3;wH}A>WtgK8!}jQDw`Dnv z4D$Y5_o)@}xRkL37w(nI8;Rh%Wkp6bOi=EO2yK$RbX=OXi!J9TK|oEW4eFz=3JXRtex{TJT#k>N4_Y z?p5x&fR-URH39)uBZw0=Y6jVknnXFbF}x8@={1na>xjc~Aq)6U39;AP$yv*h=`1a8 z2Y?;tpNk82CO4I}f1IyQ>R&&_o2!|pQ%4NTzJ@~vtG&%WoGCT;pEGRYBC?`9Ibx0i zQF=ZBAE_M;8u2c&CYA?uGvvHtGx?&JsmjYe1PD-~7n%yW%c+n=1%RYttv^;29tD{z zA5z1>RvpC*Q{ZL#zXp1=R@E3>E;wln`o~m<0jr;u=3eR z{x8-@d%9&F?K|uV0{6xSW%Nf?>&x4@KTPBMzqO-l>RT>gLiE!ux~v{w40G(0@LWag zrhix=WY+&=XLu1;W)eu-ptD11_Xo=wSP92I{{56Kk5+2;t{MN z`8}+=hP3Qj0Y8nwC1#)qo|#|zF8_Jn`2g)qPQAQ0EpK)7_Ti~zI2azGM=`|jzHC%! zX42ofq-&ef;fD^fILea*dB1q^lZ5IOGg=)gcNDyahR8y<;=?ZTI*`-_+%xZx4;qUG5ze2YmVoySK}Qb$bfia`jTXDv`bub@&8} z>Dl$4m&!@-$}Ul2K^4{|P%$n=A!{UNxvpnH3b&tHX-yzoR_^EFXLblvt#cZva848- ztqMdm@QUxG{DbwK!BgB_p)I|q2@u-p(uDV^<^5NL@LeDxgACs_%7a#O)WQ;_)Jsb` z!UP~oXRE_9R>@#G+vak>jLT&DtlF>syqZP!uLNHB%FYwMZ~0Hz9-BO&)PS0@fEX8! zWuXhNUvk5R4bzRkKpKBb@r=mNdlge1gO7j0hTkrTg_y`iI7mwgRb~9Ej><9v{)BAF zY7{1=`ae$1I9p%<1}yuz0TsZS3|G?x2;B3?lj%3D3e_f5Kzuf!*8e>S#HVL1Gy7T86s{7_30rLpfilAQ z&6vM_-)1naChAo3#I~uk#>SIZ=oa$rdySaP@an&9pm&pAgk_`V87lj%G@IDV_r zKkT3z21;G}NKfX7^D$)w^mADQSK}|LpO|I(#4kwwNvZ{5L9dq7upFT(oDeGiP7xIpw|_qFOQJejk7DHExOw%(|h2)Uz@L0ZnAV{dhK%BMLa*Gv-Q@VuIe+PD1;)Y=i z)^6#z`CZ#1_}@Y7;(01pd)cEmpO?DTu?NmD(L=s0gmm>oLHiK=xY81P-Z*S$&be>Q69P zh^aDX9uecUFNAX@zGN-Hdoi}*T#8;QR^ehP*aOR;e?`hLBNA8xiyHy~ZD8L|o2?JK7d~fh9BvaLn_aW$vFl`Xz-=?c^^F;_`?{@oZfG@Zt`3bNJcR(Js1AHear*>sQ-g-_fZ60X zDgNTHC}}9yXPR!NrUf@fJL_&=cYw-=wES1{XN?QdcA>qDhR zQJldI7=j20iCmZC67S4m%avcZiv2Fvz!y4F6rXZHTDH#)!3!Z#H*0b28VD1dNzc?2 zs)>?na~P`xZSjU*1$D&#D9%1M{P3&9l%qAnP{x9C@0P4LatpIXhuO8UZ8^V}h039k zf1RC7-K**vNGRARBN4=GxjdCf7<-h78zbVg?&F*uLDRb?6wu)w4R0YYw0w)>8_JHB zW`s=%vUni-g96m^)_ubx@;okMVaEB5b}*o2H;zwNA6EYs+$AI??`6rJi<%mpf|A(t z1|j}CSoR$$3uipjYv7NKq;#Van&?`c*}^n~-siHDgnv!@?jfzsH3CYg1--FDe^+*s zH+`2u&TRbLN7_?<&uia%BOIu^^T1O`73~ufIF8nICzV@U%e6o>KGWOT{68%*LYk6^ z`6~2b2H7q!RDL;30yB&Uv(NZ26To{Kwjwnq-SX8&kI??DZr#h@vk8l_b3rk2F1&ea z5n&gFxF;IclEZ`9C6sf)lOD`TR^T!Ps@p*=A09croVm)dY(i@0O#YCFc>d>23y-vx zXb8`H$eKvYw62As>o-$U_#7pF+~o89AHqFdi6?6y;M5R78<``03jmnI?S9fC{_a55 z^d8(z{$BFuEsj54qK}Pmk4$6VxO>coiO+u7nPz?or~uIgT~@l1i1a&lT^j+b{n*Kl z6!lzwb}yFKHM(-VuQqL3<(}Moz(DIdVnP^5QBKuy3?TO-HB1@IRRnF3ea4N@S}=$WF6xhlENJ)8y}Qk7Ww9L>5zF{xNntRNd4{OUvfnsrTN`WaJR59{5R3Z`ynam2`hVYW9r-y4$qQ<`42 zb?`a$^TnpVdMpBHBCPTtI>%Wv=M`pu=Lh5Rl$3rrf<2%V>;VVQpw5Q#C`j_TbJa!0Dt{xz@q>l6e;|a7Z)6r zHE|zD<}mxMryLu);?pb~FZ$kR;{@?~wjw3#NfOvbcZ=){?DxOp8d=@r1y-EKIi1(` zDBi%rq<k^kiPDk}tgKtyj0vzl7pYubwtPIRoImMS{b3pOzv;LJ zM`Q_gjC($pAwvuF=#zEn+7Eo`Qq}rmbF!bWS<^e(5k{!`oFT7#hJY~6i}`FFEyc~@ z2(YnFJ?^eg+SHwN4wG5iNP7T(H6X#OaG|1coR`uRb1Cm54=ZETopg%;dTeaA0&^+CTF&(^NU%jY&4jeHe4buJt5X6hY z5SDy#M&NhkZg~s%ZyWQG(NOjJlkojB-a%6WYxjms3zKg7Pi4Sp>i1Tnn6=Kxe;Z<$On?=xrSlR=ebt6#B4rYP`{ zgiVf*0@aUD5CTD)SW%&o2&3fY-zC}Ere(m*7isHCbWnbKP{^DkkvGP`n=D!N<#>X* zJxk}CkB2;qV;3^E@@szIgDJ0{w=N9)U+JV2Tch)k&775DKNnll*n zKu*oR#@*b5FCN-TPX_~>Na$SY94xS!<`Wg1rk{8!Eyw-Bckuak)Fb<>;QVczw)*Tu zsW4SDl7#%E4%YVFFXleT3OS{H^Scd@vXFlsWRTDSO1*BNB5x@bFYc5VEOiXc=XrB-OVj0-p&&XcN=`|KCpn}ghxsvFSpQjxgevR||j#r%f zU`lr)Y8br_Lnk~_?zjh+T-mYo5St#=XrmIt=zym4oF9zo4!%LP8nD0Clp}ak{xS2* z2>(airTxM>AD@@VHRZ{}&`Hv`mo$_m#iJ*$L5?`e_@uGnRtK-Tb$j#C7~I*!6_NJD z03>tnkpMFhrX{8Wi$CM{*5l0UYIY*G9D1j6G0UnvOSkbNkN^1gFK6_jShrDaI=!@X zY#<)+XS589O3ftD_>Zm}VQp0eSkP9iyiMinogG|jKBYC7745hdEoHe*$tRFr8Yv4m zfM>8xP4%q`y48Orf64nst0flt>bRRT!l(9y!JeLW55*m#ZLyAngTOgU)56VvwvtrD zFrzQ0C*?Gq;}o<|^QEr|c7odFGCWRsWfvwB0z5p6V<&itwrTlVm-^odQbAxn*@c$` zk9ey_!$k2p80;5VPH-<^jp;{~y1TkRm~!<6Ck-?wl8a|a2pIMF#_v^W_W@i%V*1ZGAC-SBo1~Sz?6mzw=K*C z(g2_S*)FDK<0f`DA=8G7P;(c9gRxM$i+k?=&xAaB81TZ*q{Ni8CRKjTyl?>Hx7)Ew zOAC{Nmz>}Rg}{&6J>?@vU~ia#q8E|&aGO?=CPkRk<5IlOU$gqWHXThQ%Piv-D$o%r z6b!Oojh<3Tg}i}7ep?@$w~BNu;Zwd`9Mh@Kw+~N4jB@b)v-tRH2%HfZo_tR|C&5Q& z-`mpneNld}ALc^B#zH+Ure}ALKHF5q&n*HuOD)#6UUO{R-aRX$@=6P*_9ntxaL8eU z&n_?~Tz#+I?9R=tCgXvgzkUIz90Sx~WBLt|8CifdJ|*kFx+*x7+P)DNmVZp?g>6}# zr+^D*S;r|bcqvI9lp@Al(AX&r;4)=Nm*J&3@7Rb80#}75 z-ldg%p!5hdO#j>SSgJWY8K@HLOjJ>h^gJ0HzyBFz+^+#f9A4ohk;{*5y4pl(k`M2d zfvAv0;h$os#yGT*?_}(Ob^WuL{Dv(l(10x+Uj>7)w<9OaI(*SNDp)*PnolW z1)gW`-S)y3L%low5bnp2nUmk6s;JwF$mp}1u@0{~JHQM}Q~~l$*SlL>>1)Kh;$H^n z0i_%Ls?`sK4w+ytS}&_9%G#QP?)lU^x*SDzp9OdH)D@nnC=G37+BsADZI9eFes%AS zdS>Uez_{9wk=#^Gf@V42xX`n~=&vY(9vo!gPHHF_;H6OQ8vtYgYQV6tDfH=wTEy2X ziT`cJYh`Cv0qHxg-MoKulp3D@d^#bO5{8RFN(2MtFB|63?Kmxyk+$v!D+6~=V#Js{ zt-3k*LzePG^yp4P5y|FWYp6moT%D(WH-Vj`d;3qdxz>*?%)C1Mrc^k%($8J4jsc^& z^qc6<(a%Zm`(z13T_s;lvQ567#9nW7?F%5Yd7R-%q4i=%qy@jUF)$rK;cN~wp6yvk z`y*HPpRbxcesv(*RvS}bufUvxVDG(j!Ax*r$LM?ogHspQ zuphQ4*&o~6W@8do!eQI#Sbb9yo<8q2Ml$xKn-uNX?>o;?)vY|w(wF)v>*crDwQMVF=aWD1 zjmu9BEP)L=*XoVd8p*A_7#k2*mN}d;;R}Tth!^MWJ$KF|SuADLtons>GwWqpCsg1z zpUZf$*Rj#or{iobPttf>Q%dH73x8;@RB3cfz7ydJTljI{g#e>AtBfYm%}v%9HrY^t z@IT=%QIvNIV7qp`nes16-mn<|Nx2zVJDM5bT1e;e~d~U(U&qm2i1n6s(=0(}xhp`MDq4L%sTwUW-L)6a8H^`;cf+5i2J6J$FuOO8 zAa!Yd+^AHbF{SRFsasS;O=A_rbO2`IVd(Lq;|ND^hm;%?T<Xp(orW&jnz8Z{#Jp1kipnc00MzKr@*+hjaj{ky~BDY)F1PyJhEk$?d9 zWCNHd_F7Q5^Y5zU)LfN7=;SE04A9$SM{xoYU{e&W%j_G$Tv$cGFmc7aZolCQJokN1 zW}dZ1F+iN*D@IfbMPGhV_Bjo+%KqTX=K$7%>@8g-yS{Ul=daK?vCw&o?Q*##lMCW( ze&Z_jTVVA<_6+$u@D$|D|e&0)-tBd&6?qSuNdk zu1Hsxdq;#Y2W@xpxr_?_xj~<3>u1>0{j@HQHz7P5NrGm`o??3%H)ane#Yw$}LVC^k z?U66bN_<$d>W^&BVF!=r#DFVh5*(ZuZ|6@)x~&z8SH*?f+SEJRjLKvy?Yc9CnFjy| z_$I;`mI1JF3Cw+y)+5Iw*>VND6@ya2!h+Ej7l6(cEJ4i$i?XiCwCqTzPC zh+BSYAqRd`=^%t2W<|10vbVeK1a(HT`!ad+3Xsv98?GZsyfH69t#es@Y+1X#+p=nN zaKMGtjw)sgKNb>)dKv`DIIR32O=M!uNXDo7P(6MSumPiIEVBr3E95LMjQ z*;Psf4tyJ)*r-ubFP>o*Q0{VJUQ|8RQp~AigdTS5THFb~holA3^Q@j`rle?ML2k7g zo2%?XU^4$JcqAcK5tKljroL1>OnnWr^nJ~2P%RL>Igt0ci8DfySt1{v!d?fdGe@Vb9!|4 zQlY&5eB-}}03_Rl0ebhcTod=qAm~)@IV4W0!pHx;G1zDJqN&KdQ~=XV{zigj9oKY?m`7I$8G* z04?Vc6P@+XD`&0jb+HK`4U2$>ji_+EbRFx2-wX@fr;CCkuS-cA)Fh2YSEM0S7m&kdkgmmEz?{C{wL{&ua88Yc9++UCHs#!}57Lf)sur zrH(VzlkN{ji_bB+Btd4^_j7AGczlN9_a@z%W;J$f>2t&!q5VnKHvT3p)LvxSzjfUQ~0n+AvJHYS{k^BGO@|cAVsDaf(Z7SqxR|nDZx16p-6*RYRr9T z5v+ianu_LX9^B9Th9sE5{QmC~#OdG6-h^m;o`%CN6y=;lE^pHF}EO&*<~B? z-|(N}nq~+Y0=`y5^BlliQXjKR2M$uA^VRKAkCdL}v7z^c?Z9+G;6t=8VfY|kU!H@m zjlkaFl&9A<-uVSsTUVW#)h75WxrsV}JC++f@J+?G(x2{F|AkiwJvW%zzUUAP;%g>| zPHd~Wmj4Vnp~>~Y+;6eF=J>*B7LDSK2u3k`0}JI#qX?G7&J%f-Cv4K6}A(5kxf5}bm+lK~ImC_Bd$bP>Fw38wyt$QWu$t3f_9u^JCVmGMaIt8IRh0?NDm< zLA}-=(czvb=c?gs!e1{%RvNGijKPo^(GQf!aK{n$NP0{z8!3U}z3^SM$(i3;%Qln& z2c)?vcctac|PQ5DVxd4 zWcQY9EgClIbEYJ__Rpg!`~Q+~XD`K|CGChQbMt;g%?w1?CVL!dct-1bv&vw+r;x%$ z2zJCFb2~loFb6eLA8wCCYJ(oYrH`^G1O(^5^SBjb?y} zY2&a)cCjoHk7XTVM04}fGnKrErs_uUU$5ugf>0QaGU6St>)9|C7lPW`qyZwkn3&v) zmx-GFWt6l|RcH!A#=?&OPb;r0NHlfvk*a*1Y0zat1vuw7H0-`_DjH$DFcGNsk_|gR z2fZy$l15umME`zd-d}y8*m64lW#89>IyFgh36#!`X5;=aZn_6$b2Jt)X*^Q-Tys(d zlQJ^sdy*PkBjaY2<7Un9TTrjWJi|y|jniSVGS*>|Jx%!#$_f}~$KkC36Xa^kH-FOl zX|Op2Q*S;J!NdJhRn&pC#Ri{Z9JkEUOkTQL$q(wqCJ* zs7_w8U7IN|kq`pOKo}_!J?C6!i#*Cz87=L5@+k3|Y9txdE>a9^_YFf8k2 z-!$1+wixEskeZ1!6`(Hmvksd`{2riL@S@F3;I4T?_p$u9s8;GWCpKIqGrTF$L!;dy zDz);=u><0Tur$2tnEn1=>0a}opL!_+j@hC=fI ztb3q+=ZL_zu*L=IcT!7gT|&#xL6Y75q^`r1^&tBjh5iJP@4RJ{d+EP~O7Z(o2!BzY zpt~-twEe+D2!pR_OII;B7#9}r${X6@i1^O(DyI_&=Z4p$`04Taq2Qg7>unFreO_q; zlQ;wGQ<6xoW^kvW&8*XtUfR-@55+27*p1RBUEVW;II8|@k?PC#+Wg{D9^#Zu>e?^W zF<`FhL|+oP1q-ERof0DXf22SXlaj4jh>bnh=I43H16w-sk?1pDPgElz=(eexn~=O3 zG@No2DrebU5~aP{9jpc%(We4X(u4sMu(Jh#u977E3W)dz+fiJs}NXqOdy3yDH^@@byI5gq zbHi>yM^-2=mTrlm9q9pA_Uoa3J^PBf!yK)@WjSGx?TVoUTlR4xKv#pYiJUTqg1pel z$;zhA$zR{1@k3tyJ@_GDt`6W>P0Bw26NW!Y$pz&>{4>sa^|hvu7b?7A7K^%w;D(&C zApa!N@Eb6D9_y!$%#E-!FF8L=_P(U~S$T*$gT-cdCpeC&4rW|q$1hEp2Iq$e_#z@u z=n4&i1lfL*x>)VZCsG^#cRmxUC(oKrN^*fG6;{(y8)HG#4-Q_Ut(f7l-nA{*H zUm>FkKN$dp^CnagWnoSFC2aou!C43`qDFvadCS8mJq+UX^scbpl@WIhMrvQz^gl`u z2zvsT>nFJ5ygtJw_oYALUTsmI+4x1l%=b7^eX($PQ@ta>>@hJSn7*8a#sMKCCIXg< zkG8LVwSfegnJ*V~6bm8KE-Im2K`>{h_J1LY`ckn@a<5muJN%A5SA9&k@29Ks)S?W6 zuPCzejriVWFTwZcd}_=mx?uUKLEYIvBb0UDglsBu#S7;1rIFBmYT&6Z(s7;*O`*h0 z$)rdo*D@EkHr-3!fug{^Be}yMFK-2ru*LINZi05@ zzkpX*pa5xnM5V%Hvn~hp_R|ZR#P$L|Ry^Wm@hp-j&L9+Qp79Ws4nw5r7s9<>1SMky z{Bjj;l8SH2hw_!#PT^L$*1~_F2|xApwhjo7e0ed2I)Gc60sK_2;k=8&97?BuEze2v z^E!r0$$9aLU<^c}QpjK$$*LMzZmL%G>&Mj@-Yg?77XxslJkG7N8Emw*5|ZkRCD2S- z77)|RVH?{P7DjImTDRR-@+kD^g~(GA&F`N-E-6BnbJ~;aR&z^y0^_1Tjux5 zKCo3c6J$sg_`De9Y=tK&0F8H4>cp=Rn-=bfm_EYiRb=w&BSY%pg6_1d%Fa@l2s0FK z#S;+>+k`~rq1KyUr_516XaaXbmrLY6)nY8SpsW-%yl~Zrjsi`kIfsfT_yjQVq^!jn z>m^->Wu%QbAYb+_8snvTZrWq;WjRi~sWeZH>Bq4iNd77Qo{7*OeAK_?BhT$EPxnXA zdCRffDyE(`hMmz_a|E`Bg<&DFkopRxi{Mb-(9=4`1MiL6(jwg>8U^Lodc``#STbxizMc}JE z(t~J=ZNU0DX_w4W-2>!t(fKHCH6P`#E#*d5 zhR4BYstT6Xmu{v2xi^8ca>mEzn&akuNyUy!^sOn)KR-m+Y#|<|w#WEkT7~9ps+0M$ z0IdCF7(}^xO}oF$W=w}kIklufZJY+F{$x}E0~scaVzKurZak%pD3#EEQ!}oo_^tCK zZw-PitizA(OEhm0-vzDecGPw_rp;O{4|hmS80DrFcsD)SPa=ToS`fdUq#izNPeXz;s{>vNw4G)yX6$mlECL6!|WikAFwBMJV?89=%fDSfCi+dKq zT9wNum3?wqCWj^#>Mc^CWsnElx-dxs6L#vMD?SJqq?SSMWch)o#oA17MG$fQ<10h7;-b>bp=zxqks#|c zNO0y}EnBsUH0+&;*EJ@GI0=c8xvx(Z3-a{!s(AqhofN1D`S}JTQH&0+-8cpGKR+2n z8Z*Ij%c|`)Ywr%_N%mSNf<>Gv)^BY!CEKweATQxQA5Zrp@Gckqhp$)R-9O^>H zuO^tqXw{HHV7wXe9Y>;y*y&|o0vqf->@M;uc6Tg*G}QVs`x_elr9`;v9Gp`WP` zSBV?oFyPeJl>8vs@19~MWMk;Mr0N2El>O<~Fwmku`4v;>gFJ}<|1No23q?9f_D1)9 zghJuPmh<`bZEl|E%VEBG<x;VO=z55EcRtphqD z+!j@pg=&f48I=y96O>+Zk+PXs9*o++R%s8^7u6sGPdCV+cmzo5l5ynh{cO+6P|R|b zcy}p-JZd+-1(t;1sFX^8BRlPN;4c2?a<6x|R?`GO4=(Odqh}8Cbeb|MmQ{(ZA!|Rt zYotoGIUn{+y{Ji8>u*E;NF{xaIvd01qamh{mq@MkSl5H^Dhl2S9Ej_v3~k z0+&b&Fl;Am@o;ErI9i^@z<_3hs}l$(nSUYhnm(;ku8PAnJn^T#-U)N`Jothh@_3|y zK+Q#`I{6wdbB<~YrYEA|9i=$1#54xV7hF}-E_3;hqSn{N=7|5Ix7h%{G~MB+GW?B6 z0KM7GlShR-ct?I9+ObOIEsYA00!+=KzxMJG9JC%=6gh|(-tYa1YfFs6y!LG7i8NOd zf5G)$5kmR9khE?ugAkySn?^KL>(~gP1uue60D+2Gi!BqUz#YEclP4YFba(t?Ct*ur zeAShF8|GG>GVH@!`)PhnjswZ?b~iQMCra8u3`z6YeZ$*hbPfB~NT&{b^1%JwRi)|q z(Yst&1w9gQgypSTf1MG6UnWq~3LdU+J9ow+MX?riB(#CPJnMG#XP6br5I0NHEYC28#2ie=K^yg7^s>4g$(&Lxt_(sITZ*BSGM6QpmITY~@D zI~f*GqRgkhM+#m4 zu{9SDM?}jT1J>fMzj;p)#mooq#t@tJHSS~E zJLsPAwOd?It7b$*ItcZlB{Bu zKDJxsdA6mZEO3Lq(4UYdRu53;B!}E>P)dv5p1d=(tU^9ghQw#^uKpFC#%amhzD5&= z1mt24`{ryUFWSQ06xjEZ?fQ1ebuCYUX6s*DWnN-+^Fr zdlR;l1vFkdu9E<%*kv!Y{!2@&+_vJz;ZrYZghZtsFk@+{qpjUePe9?(mIW+CW|-a) zn$WtB?OfGj?5yyelI;pQQj+3{@LY->m4RP1ORMOs)sPxQSZyF_Fu%Q}1w;s5w}i!a zmUrxQ`4zjr7ZoB}Bj1Xe@(kydR4G7(Oa$M={6a|1?H`qA)ygj2fFUJh$8;|Cwp2pT z-`P`}=Chs7UvmYd$hsQKkz1F&l2B~voum4eC{jJ5fBPK+TIa3k}<7mKpX|sG?)5S6QUMdIo43 zO_c170d70elC~Y{zSNmOU@C9^@dhfZD6HEM=@Al10jP1BKS!%=XI;1J(yZhb z>oTu_JE^mkx0H9+1iKX)$g7lFzROmb`Zw&yS;H_svWSK6Ckr|XhUD+GrHTP}hl>iO zConDWxck;K?%5qPVlddH>_{YzeI|`2Kf^|f+IwKLcs74SSi(UqN_OW_49YoTobSVQ z@Ui3idM05D_Fbm&I&x95UOy_i)7Lh|V|(Pd>qw`=oO@=yg%c<1KaB{HgwYT~$W{(J zxd2LG8vOoQSRFK^1z^v>byp)65Y)e3-WVAy+%dbPm4Pz@SHpt5(mx_BexXWDgvIVB z40pa~Y16h_WnZEN|u*_9Hn3B%I zKC>$k7etr+MdW3uPB*1gmt+;sOwa*id@Qjl+Oq#J1`;Y-vkC^Zk84#DfO^cE3v5dE>6@J-uSi!hPplJV zv9BTTG=Kh0?%54~Rklq>G5FicZrvWU!Dvq5AB`Q(kwJpt` zkvh0mxCUI0Ca?=%9pbn1PSAq3YEgVS3z(R^TnFKZea5{PP2km-L^grCrk)6-I@wt! zLk<=C-kEu)?vOeC;apQ2@*{n%gF!#Zp_t|)u>O0$Su+_f#h>^kc8$aY#1LW9J7(}a zz@fzsE&Fcr_SIKdBta-Q)=q-46h(by$)Y?XAdZypT)MKQN%7|{XHVLkO{UBvrVSm; zN6siF?2Jfr#wzWn6vwauIzCZ&9hA2_^i~lStqZRLsM?ynFUU`BEy>0Sd4JhbX z_qi~K3Gykjp~@Ga;ItO`N~3F0M+jINk1U#s2ZqCYo;=5oKbg&qzG|?1YpUQyQ+v3c zAhJ<=N8b;jF%+56E{@_N9t;}L|1 z#u2QrexA5kl%5}^TQ43WM=z}fNk<6W@N%U~8YI7@-0RVI3}uNjD39${{~6yVg^=WC zOHb{Rk4Yh!ixei@=GsRKE!kiM^Vo>#KDJ0&hB0NW#ZFlWRZ@icoWs30w&uCX-@5m< zPN8-}7CB<61!zALl?=9^*-#Y^HwS`P4 z*1q#FwEkC20evL%_WuLEv21abPBq6QFp)IrDSngyQb| zC9sjp`>VMMJBf$6j~9DySx6BUiBNWh`6Emc0Z;2l;c`8^Juou+erITVS0x%V(BDNT zq<#}kPgH^Kss21G3G?H|UqVKCQmo8k&V=4m$oUgzL};YcBRq{Ekk7)k1w8_tW{q}= za)oJ_C-4Jh6(KbQAE_Fa#Jdwx^4c~%(v^K#Nm1N0gR(l99CN@`f09e`>8Sa@35lr; z@4n+r3c9@(U0(&}1xYLUsmH>8H@zp;(z*PBOMstX-!h*`}0B6qU%Ix))(FLN;Sk(ZEiA zK)aISesmr0+tRq<*};vm-Jb70j#fy#y3 zBk)N-XYh@XPZcwtr-^B$wW24jx|AF9vU;z~Ry4<`@)aoAp;*Q1r;==jB`qr+aF+qM` z<(|BA7i9r-c7CNy3*k$j9Q%u-k7`_ZgR36x9PQ>y0s41*I9J>xv=t>aBG)Se5XIX% zteZvK=Moop5_CsaW>y#9FSo6ec7Df$5W)102CG8zb<=CIXhtZB%t7c;}@2byeI z)wI+r?rGgCHcg$=d59d~KQqU6GAgp@Dv1B_R)?l*Vwna#2pJ1{nIr+RUw7ZTl+vNz zDM6Kv8zLU%zJ{_>m5yWWQ?XCb8jA*mmivkFXTQ3YCwm-b#wTglobA_i{$mRXqWT+V z*a(wr2ygXKBjDJcq*uN&{DTo>W5!*F*Tv>2Jva(3@_ zflI0t1<1ElAYbI3{P}kd!H&-&4G*hdd^ohqX@jf_DvnChuC9|dgL2^xPIDK`OPk~; zst&jDE_!2123mN_-g~ey5XCZ;cfjyfbow?=@PDEEyZlL0Oe#pKQ{!NtLd|qN3d7X; z?8o)t!-d&hsV}Oiy}xncBe10!8tV%PC3T8eY`PX~@osD1P(+n$3juj+oUjO~MV!2O zJ`I0hPknAmU%qX=5J#Mkg39Bt@*lW9!RwpZFCM<`6w0;{MV%%9J~J}Cj3Z9OMKnlAo`NTCc!s`)sj2Afw~kd=csGUuVm|uh_W;@7E)ANr`LOI3s}} zm=hA0*OWO^+&h1SV>R6d6d`2Z#*mFy1pzL&CjR6fOT7 z-GcG8ro-2#XO32bI(Jx0vrrPU!sB{#D-(uv%1lLHrVr7l(2{H0oLZP7$+?A-f9R39 z`!tFA;2k~Q;YBogOXGxk>*2_07zPMAVS`n32Ef1}ki0m!cvO&0M5O9BnCqZBtM4g| z&`J=Kh+V5R(U&tV2hWCxk*U8GL2UIF#jLa$-Tc#&T3PSUa+dO@zK*bpPzR2bu+*l7C`cSJ1XY08sP#vABi(9|H4 zk|BwCZkP|hsr2yHg2Dnl(apB9%N`WhOB5+^xqK=V$-7MhmymGPGWz5pHOJbcr0o<} z3ILNVdtWH|V}L1aa(6~Oo4^k`3!@Q? z4RnYSTfiQmmPZ%p9Ydly=*IDL_U6~9sKu*{Y=Kv^bRMru{B z1^2xgg)_Jk?m~6vdEL#ND`!HQXJE&z6l6ZC5;?liMwlu>b9r%NAsA2p0&>GHsr+wx zDZytX@O@b-Ek;uz*ZMO-z9R`Mh?Y}OH0 zF1${DDSMnY3wtb!8Fkf43Nj!4D^Vd^Z@VNm|6@N)aIn@C z-_=34J@T;BsbP4;a^I!IS$NpioIn?SZIY39<_-Yt|Ee31gm*)P@Q^9H2v z;B%H}a`WFhYKLgcO0BmjZxaH8&3NI{N|NE}#(RYV^uCahC_~mc0UG^4%CcV9^#iMAUAyGS5nHs1+_oA`pT zV&GL!a^-IuFrxS(zBTy)tRQKt?OGGzYs`~pMYZ1?=)z%8@qx>lU*05dBX}I*;j{i@ z!gRK4!m-j>Z->twX6;rt(F02)lIdlXee|#?25&A?z2~ z9{tx!t#&hKGQ(~D1w}wz@tDSzv^gGWw(XV|?9u!cY$OE6c^M^_mI^=qz&|>(;o#cp z_ij&wu7LyBoZw1Gl1=xR_aBSgTAUIR|4X~>Qj2CvJqWIG_Ma_l(BhB#b%AGaQnaIW zc1#1g;MLB(VKJlB!^Fyus6u%-&QF|6x(bfE9M%ab1Rv&Iy%e&uFYc^CP;N1DgZsdI z1Vi9AL_;3ur(WV4tq7{bQ2zRd7h^St^joRJZgWs6wD5((Y%Z0{G2AVr($$G=ZD?i| zLw2uE-tO3&#@AMsxe~tRFNATpkY#uvUKeAuvG#Ks>m;)pxzU@pLte<3(E*!>`HZRot6!oBgs?Jrvho(XkcDCDPPm?n(Rw~up8Eh-o zLbh7n4fd_!VF+&`f>~)PV8JshT<$>#aBN+2>ohU|IKr&?!pOcr|DpgXkQ;`bD%Can|tu0WYH4Ep;mvq~kw!m~l*m6wyV} zw)Z$v76RfjtAf(?9MBY(hP{bk(@4bqqe}xTK>;tXzG+dq&eak_^P}s|rUH5Vd8HI+ zgSUk&{980jloLdE4km<7N&w94qFG%%1`u93nKYbm_4p*+;LV$8+o<-2f<04)B-gix zx8NJzo)t*$B;SZ6pppSr!}s z{S590)_&#>{Y1qFKaoG>BP<4$;_gHzjAQO6xxmz2LP`>mVtOH$duPXV=!Dn2;cOu8 zOq$+as3dm)U+vKQO4-Wo(z57~FnZDpV^<(f`=d!k-Z$xN&G$ZC1I5f@f1ieCwjJV5 z?fLrju+xH>#~0etGQ0|jMRQ*B#{eI=jk!aN4Oq@WeF|bCv8?&`ExZ%AF^SP8oAg42 z(XZmb%a32H@XF46r44qT9sctj827{a1r=+INy2sOP-!WThgXw~bc&kV05eOE$#Xv^ z6xS;QY9DzzQc(iFUxYQz8(1aI4gpnHCv{h5EYgK~B7Hn3IN{pB$W2zj`Wa9sr}2${ z;oTlwd`k5rB@9gKA!1J}8g%9N9e;fmOawi&rd8~}x`91d@=gH*WUqn5Z&I%?Rl_{D z(ozVylCAb5+~WLT=9BsRPDvWH@u5UshGIk` z@%D473eFIP_}$F?v1Owz)-6^nyV5FX{_Vw+yDJTEeV)wS+hUy4@&9HDL(FB$z7oDP zimGEr3pKu8rZ$PUR5`LVZ(-{4UsUOpnwz**yiDAenyDwk@|}En0}1T>s$e7tKFi&{+cJ%E_7c6+S&r*qO4tgndfuHVXLFJ`|xAd-e}>9tj63PP5d zbB3Izf#C2VKuA*`qcCwEkwufZgUvS1%M@NhZ6%X2otPyne&&u zzPm^URoAPghVhvGl>8KaCE43SP0B!87Wvg=%NMpud zX_49;ir&o=voTx4fo2d`yMW6!s@-z4^zP23eC@^q@Mg|i8Ovb9w<$y#upV#bvD!u` z?Wm2L`PchmiF7D+pB2u^?kls6k!)kXw06R>HaKbMxxq8=^Z>qNQ#Q)j^-Io%``KY8 zjCG?EeS0Q2`kS#r^`YLZB7Ka$<#pt`>Hf~6iwlnX^DHh-nD>`g5pb)8GmFHscUS=l zYxraZlKR;AJAw+_56hJqM3VJfwYv&)MNh{CMNXccKGP)J8TspY^lnKd5Ihn%;{pif zZ6_WhPp9QmFu^qIIJ1xY?|##(&5)i3kj}B95@V+W|CnFrEpjfUBtw36DE39F6Hm=Ve>gW8j1l0bU z&gM@sYWpVZxMA<;?<3iD&2@$3*OTXo;{zv6Mw{JUn8!!tLszS%hoca9NV=c78leXK7}6GLnQ z%6HhmH{5e_!yd86Q|-lMQK>z};V;GjxKU`!E*9gnpA(@RvtQQtU2FErH-;%Y42}_FA#Z!YQGMrg9?QkkM(99aSVTfb)4wOPYw5MJZeyE$;&LLs zJ-SQeM1>7$I)vX0um*?COj&X;Zh*Ii?ezQ!d98$tk%$J zEqE+A=LL@c7KSFz!ZFxe8u?6Tgt*2l8qB^58OB4CL@xJ!u1sBbp}Vc56?g^gVylGE-ioqS|vZ=s5W>| z{L!Y(Gu@2Gd!UC=m5fnWo%Y}%`TpRneJZ4tqEb)N5gzFCNi64D6xI}Gp<4l3A27(t z8n}*p7St)St77I3{+$?YcNt_h1YN?A!3?9}k;qJl$il*|e>$BX#5r&qzMc}iFSifMugty(eA^KtYjVHwTqqkQ zwU4iwy+xlCy~veVBFowvqg!PEz`RDLNbOd3W$wsaS~r0Myzw*iXaVQRt!qL|8|Kjt z97rDVt4}sT6OJ5iH@Eo&t&sJ>b6^yQz+vN3(BL2`DQW45Z7P?PS1LSIp{uK#wZ+nQ zDcYK>!Pn|%`>j^+gN`~7a%oi}&+`Zc8>mD1;SRP1%~hIZM%p&z7jVX(iBwVFV6YRD{d1#Hwgy% z5Xf+v1QO}9iN|5bQiZa zYf^f8smRVU+%nA;1)6baf$D!I0K=8F1}TIC66Le0Zt1;?*erWgi}Qd_e_H#|SnMr$ zm%db+C&mmVP`Pln&`&arXw<8HXx-n?DeysT5x<`1R@!t5$2Pe(1DmzBV_5yOp;C{3 z+Ld{YSysllLs_{pux_THM*wL69M3;bdQSPg#jMys|6W_yD2>##GW)>lY38e+Uk9&!Jc&fNANy{R?lf& zNa!2b^vmgwD&z0OmjAYOlwk8$lWCTk>xs#xo!I+*9_7DSeahqLGoGHvX07s~QC~1a zwgZKB$F6#Z%^hO*oUcYSsTHu4EqJjjj6;y2!O7Rxn4yLW3q)1&eU9pF+e?mjyh(!= zj5XQd#(9nJgQ7$;n~tX#Zg{%_*ZTkZhF7Q_4@=ky<$U$oZ`%mh% zIf;*3oOD9j3 zcSBLJ;fF^R@9f=lg)W*GmERvSy?XkrbZEpj&*WJN1`?^d9q?DwrVJ}&eXw=VKX$iq z0kmx23b5N~JnUzzA(pvNkGuw4rhVo=^ywO|q4?33z}OlB++mwtm)3pSVt7_QJwGkt z$;`71*N;B4R_v2^rXrSOnkl_dD1is0sC`(<=Wj@D{K<_r&1#uPmu^O!a13^}JHLSQ zAex(E|98LlEGu{Z2+jT9L|*ODCHig_+m#WdmhK%>(}t4fOY?R?Ns>&*TS3uiu(9TV z&e1b0E4Hn0_l*@JlO2d|*Yuy7{gQT``pZ^^v7QyGEEj27hJ&Q=@%B%O1594bY?Maa zM)DZ#9lbn3ACw5#tfV47CJeK66R~q!Up6;z)Pe82e!byw<+JxK+rwMPVDc)y=R~2q z;;IM?`o6A+-;F+=?^4)f=%!uKAtG4@f}M@w-dA-2nHuIxlpVSKIIolCbz12}Ij*UO zh2?q#p%SzopsJ64|D=@;Cu-n>ZjiaIYJ_d=7eBQ>P|quS8f3kPnuDy)mfBtJvTyL5 zZ0dNS;r=cmKu~*uc;zN2R>S-~F=f9@VHGhAN`3FDAzli!H0wZbH~#iffc%=jRWg&l zX1)MIR_JTtDysh}g}74R?HcTk`Zy!&=E*)T(VTx-%=w_7e<}vqxsL6^ex8Ou+ry7V zuug^ek0!8kAAjW0)HGZC?m(i`+14bCQ1_bly1XK*xT2Zz@QDnMelV`riE2ltn&~7T zjHdb`NZT)@f8J2?8!6I>n!n;0^dh%A4#0F%6?!0$XyM6CXQaJ0lLhKu5M&Q!A=_Wm;E1Azn3w zp0CWUyPuKx-30XcD+?O`pO~I@k>Z-P4gzR3%7lOOoB=(knH6Zjm0jHPp_DQS>V8_X z*#{_Z6>SLDK?7!N!ir@ttPw~bpRD^96+Wb%QV$*83&ZJ;Izvbs*I45(f@RNbWKq2Y z18oCbs2-O4V=%iE3bn&{C1XZ^?pa^11)|-IW?MloGa#iHpJkoyQ%g9`nWdJlYy!xn zf;OZHH!l=kQse#<3;@_j(Uy0Dc(*uFfEJnBYnNlM3^}`~4}qFG@y)~qTSs7izrlsX zfhn~#B#F5Lj1l#iUv7tk_1#@eIiz6J07V%#_G}g5-!7#ug{7GKhq#O00UmD#hUZ4L zqGyU$W3!^$>gJnpsAgPV7Q~s$YIZpRJjT@)L)W z1rb7km*j}ysKEb(tZ{i|aH&y&#Z76`&?u&*)&hQQfC>v>u-JqrZBguF*ZD!ctD(y8 z%AG5exYLPCK`Orz3kpF4mfSp&r~Bb2wUXG{1snf1eZzx=sRODoKaWAu#be&P*>`yy zJjlqJC~|^9CL|0s|L7)n^bnD(kCpCEv#+*(3AG#;n&u6wg!j0Zi#`&J3CrcR#8X67 zw36}KCE1T?SpSn#{Yyt|p&hqS8P(cnevCmkdzVO~SqZLp=YiL)9E}+i0m!z75ogsp z@4jYMIyd|psGX^sW@PuYMD;Cz7HTh$j$B#l^i+@}&4*Gu7oYl{`4t;PeF|};VAe`8 z^=4g!A!}m1)D9*JCva)l1$NP(=)4Q4VZ=W4{@s*A`4kuAkHQ)9B6;H6rF1_KxqGdG zs}XD#V%3j8Yl#O4Ac;sez8A%M_Iv?~FE?WXu36D%0a2ZqUsA%Wzlc;{dChiV#bcaJ zMQUGhbahxewQ?I@g@38-^869Q7?BZpQOu<{p`fnxt&L>t!tzuO>#jlQ+Lg~LD(+kx zLHt=>0YRQKigTll!gk#pJG<$y^RjW5=S(HzGF1dB^e_)GK6kZ=bRX4l@iVim#?>7#$hCCiGdXVNUYCnTd;j zIjJJ`-NAK5F0bY|5C8%4$e~4T@eXLSfWf^9b6%XDHYG)0s2Qv%{Gv!?_8j`{b$uZm zm-u*c)cc~~rflMwMa7^5{A9WyRDSl`VJA@`%JaIBM2Y1Ecrq8kSaDU%QnLYTurLdO zneL zGRj;mKVI{7Jw>VTDMuH)^JVT;~s>;(U_`TC=^#l$%QmooU^!*8n zgq}=;=wNISz4q^p2cX+L&sNzsDoM`d&nNV}uS-o%A=MRq=fpQNU%q#lMXsDI3x`jF zXKEFO4k=!<^BsEHrXBzeCS^R=IC6O36mO7|jf|)%ANF*rg7rbR3qfoY&b-pYwpBPR zTxDiiq1Mq?ODykuP8Tcjba`EhZpS3NpW}u4x=W)UPB!4xoUQCB-NdHhYHy>elh7^z zjqKzUg;{&PgYxrr-Uy^7IbrZsfVY7;+L|raJdwQtL*x%+V5UVBV^HZq0;S)|j*Mlj z*j}hg(>Qa|oP}BqCzs)h8?DdAeJQnpZe&{nfDT$k@<|$io24mP8?sfo z4ekhs-6R(JPzjStk6tN)B_~&Cg7$h?lPH;4V=gMoX_tkckyGMjN3F-g;l=ZDa;qTy z+ce+o=NUVmh%wj5uxi>gkJE1}g;oWX;}lNKFfC-DM>bYDGpq&K3jHeq98@<|wa(zm zC@_l*cF4%+vS(OrygX5j4^gQ5)aj_5va>+9jt@yiR=@1 zUfYv+rn-rKt|nTUTkJ;NqMBxpoG&W^>XU;VaK=Uwh7p3NRMk78oSPso3yu7%3zgqHmb^&5R?rsLzpHihhyEdvwe_V^t z*T1-Jcym5+DijtlJ(MO*kxqm3*FEEmVhrsVe~dq+P{s5I+argLLJpdy7S`~0K^woc zO={6{vBU7WIuQ3^Vmm&-(9R1DrF^8V=q9>1dB&Lf8BgVljWp_~VdY3N*n)ph%VWx> z$acAyv>;uE^GIyi7xe)gDPFP#Ha`Eo_Vs3S#TpQSsPZ~65)&VXpJZpf&G(Oct_TaC zj3hm)TObkpmE9`Iq;{tZ$Yq5@tZiiig-5LXCaBiV>`X-Y;o`>SlG05y_5_W@1hIta zrQ|3ca2RdV$Bt$!9BJ!7mmObrJ*2g+tSqW*i7L81V^Adin+#+i56QGS^pzuaCpH3u zj0r(+9RABF{4R`XS_y5FozfRm%MD)}Y~oih=)bOy>F`+6fv89VA_(ejDY>58Bv&Im zUm^H*5(oEVHL#Z>5K4ZKr52`oPej(U)XC7UoBO6~-lJp+WbGyvq84mN$D zibz_V@^?cYEbMsn8}HcK&9LI$DB1{2%m9N}2fM_oY2>LxX#}POTgSZHMMekuU!*mW z!gdWVgxDAKvt+D$TtCU=F^_oAosX06xnYY;s4CV&E~e zE0k*c-Qi1RJ+yswi}K&fcvSc%4JXP({jV*aGpIrFhRcEJRwduc^Os-EC)Q%*mN%KC;U7rF@(;CAVv#K0Axr~9iQ&vleIHqy`fP<_0v_+OgC zf|;tN05?ijLj(`r)Ji}C-;?6Aa{Z#1M*_X{Q1`;*^6>u2)eL@7r@rFh<>0xH9x-D2 z;Jf2duecsbL#!B8m;)12&pa{cr48K?q&^_ZWR)i*qkS$lU<XUY6c^`)I?$9i7z~ zJ9pQ@b}jyDF|CzIK9P9^c!^`k&W>5Dhc zDm!K7eL0G9-YNdUyM=4Pbr%6~6%Q-O0NHw~{in(|Fy2^es23~{ks~?dUXwoL(4)u> z^p$^AVmI_hr4$g`0Oy6)AMg5#0h8VOyFky9z9Z)3hqh%UtEomwr1o0LdR7!h8m$l% zd@^&zIETxsS~Hzt8D?q4cx!vL10c0sHBVw3f1KY{agE&7Cn)I@)bW#Y4z=fetr3Ko z>np1c$_$h}&?IUeQfFyOmv=&sl9k}AK2I3&mGMwdSpB~%o zvJ6lLA^QUp<52LE|70jAbhlm`Rcsi?0S}fgBIZ&TUH5>o?ial|S$D6aU=)fNGsFl4H zg8`;y(Kgv(fr}(X(q@IMhFj1Fsq00T0{>K+BvbOZsNrBvm9QI(hU4caR6If4MP1jz z(nsK56H~$6%12S?_Id(Prbk7w-odB}#m!LviGva){s7`qFk!(0Gn?Z297+DlV z4j0mDS5477b`kNI69@s>r2snlDn#~va&K}tV0ii#>^~QLdK&g#YVVwawUMK!JE~k? zY?z=$4441t@#<37Byr51vVqm-v2tzc@nRsFS>yq9dU9TnQj zW2tQfE6{csjan^xAy+BJJ!{7ywv5CcAQw8uvfipgCcM;?B5sT`v!DMbkEKhM#m|@X<84}u>Dgn?#SHL1ux^(fc3o)JCoN4jr zb}Yx~qZC5{DVwZ{dGz_bi=<{!!tv^}A9<{tc5BJM3RJ6Q3MuK2zqkb8IPX6iw)#5C zST`Dxpxe~&WY`D>`ZK%5jSq(0Vgg^5@tY4naji%_8pkzN=dg2QJ)8QL97{`Ra&)c= zXpo|vG03o`39SNT<627kZ3+5Pu=9Q0Oh&mV527E_7!b<6aaTUvjEHd- zr}{5tgIfzttjKKCS}!0wDHH2Rv;X5h;N#@YI(FdGQiJpv`;<23p)Cu>xB^m~Ba>9k zLVSfK?!sNMVar^{#FQtiOM#lcPey;{%=S%s(?0emHz+N^tI))Qow_YUX_d|{&Oc zq3vRTz#Lb=Xr=&N8xyq1m5^H%ZkvszOh(lIiXT8`8B(-oBbT~F)?4FQtrE86g>!OX z4^5G+pvtekM>BbB8Hsw_XEHXOx4y2{0qfq2HflW>eRQF?S#NINtLO4Jy4w5oOPXQR zrK{P3hMl-2Sd6IiQKth2BqD_lI?P`G8BPfilCaq>8H4J@H55pmiaW-kWiQf@ZEssJ z=-4*M`Z@XvqmNUjg;4K~6^|jYV|M62#{(&nQc^xgwz8Mnx2V3AU(S|96@C+7$aAL` z_^^Njv&>4NCem&PD4G=}Q6z2MK0Y#i-8f-S+%y~w*NvwsM&v${v{Ah9aRere+Xk*)6O9#7Htb2*& zcz5Q+X80s$yuMBt1uM!b+i#Mnu-`HBK$H)knbd+m6=Ky{yV>+*+@#_;(p(#_M{XoN z-5|EY;ak1_@O$2 zyN>Tg?TI4gC7M?ZF}Zc16qQ)ZcRCNMGImZ|cI2}Xc-n9~2JgwgO4k;S7E`NX?EC85 zKQrvDtE_U2OtGNw70FRNeGz`8;06Wz^i_0WlBcK5+6eYBab1QgijlXwt}1U+O&y{~ z;a9c=@JL+bQRrR;m72ziDXzQY|EymxpG833pVZ_q-i$={MI@k{m=yhd31hw9qJjBn}X@gXFHR%4^UEZy>VIJg|us_{tQEbK1KyNQ?kM zr|M{utZ4orDHUSICHHy&L_oX0(qqpbt_Y^cszS+Bt$_;Y?N*l}=XoMULgI;XfBfHsKj13_&Wz z_N6`qD(-i3mH3YD1t7G%`%dj4KPC)Bm|}6YbKmsZmIhq&0)6_R!9G`8Yd5mJLiO*K z9Hh3XjQ=jsKW0+R}8tOruj&;$#D>0{d9t5wMZ~Q7`Fv z=eHqf^r;`wa_2|g7BIgB=UXp28V1Ny7`R`shrjBZzbQ(5h5Zds0Xr$h1gdiiQias^ z%#cHPJ#9773YzjnRNa}QBmeIEd6MSA$|R57*HuZ3}Fst4LkEzy8%`k+~=3+m)=^g_mYdquNBQgxU404Rzh5vD-1?K6*QeF zUnoHqGYyX)ZHv@{E$=Mu)}nILq+bE=U45(nFV98K9e+mtD|lrP@lF1rwsxb?0kp?5 zcZ)B-asu<_4f!%Rm!T{4Zjp_;(|5+PBk7;S)}Z+4>Qtms|Al>v`^|p}!)PUMK_fEZ zNO%M&oTNi5@NQPpuzCa+xv{DSTV43Uhx7(rjv6u%m+*gpU3NuJ6TUr_Gf%GeY8x7y z8V6#;YSR~rZzU0f+JQk|Lt_2mM7@arO0hD=GAt~WcEqDo{s~On9qutyq=k9#AmK^C z8447Q2jGn#Wbcolm;c~a47Vku%^(t_>)}C1oH!kEsznY>TiRCkwa$dD#FV+79%_W4 zoM5eD+%2|nNie5L#V9HiBil9NVWDq9#5<`aT-kp~{xc||q7Og!xEp&Q1`#b{Ys&p$E^if2xZN%$!!M*6oy2{Bq^#bAGK{e^Ze$vm~Ibx5HOU&uruz)Y{@ zt=iFWm!g_4!bB!FUkdJgf-ycnFHNV5dv{MbYsBi`R10aJFvjQ zS$cq)y37ru36G-G%~l+6+0L!Al*R}#*{Z-nXDG3d0n$7@iV^NAA$XFK(-kG2l%2CzcHm9@n9{V=S@ z?y9)M*RvK7?d@aF;2HqpXh^5lXei95qRKaaMudgWtxy}@Z^ctd;Be(r15^Mh2v;^! z;jhP?vwX_WqaiLCuo?D0l&E5PrKdbLJ=wEU6`fK+ne%@v8;OeExqdwf4 z8rSG6@MvIkf;WV>I828PU|eUB9#p#2EXNnkuaz&L)0|IRFpdvc$e`>lK-k>(7h+){ zIGb}tXbd0~Bz>Om)+XUBTSIp`mqt3+kZB~7Hhl#b^wP&~5}A(yL^+Ym6sLUBCXQB! z|GWHm`cX->i^(r*L>m_{Zd zFn3_4c9O)i=oD{Y{F^9V z2uX2peQOYe#=n?6T7-K9p!}Y)Of9+Ab4Th9F8_ne4m0iWa$}N7HAH_k+8w4Pg0H~M zaTeCR+vbrK4f)W}H1=3nLbGtTaMy3DkvxF}Ml zP)L(sQ{GVN-^NDb!YnySPd8w}i@_bnV&Zpp+#+%6!L0Q$;Iuc+@Lb5YRVy3=YwwmC zBDZS(+?Bpu>YuH{HNbiyc3)3IBSr4+3Qy%)DlGuT# zmZsGHb$krxj;6~qceTQK)=|fiSiV8YuE)cz6X0N$31#IpT|pJ}0Z7l_uL09;La;Sb!onQIodY*fdFs0=t_YO^W4_3J+@E`(;|LD?{Q)P&yMY&Y znMT7@Q7U0M3qOr3M4sqw?X(ucvNh(%uS;-LiAORaQawLJZkNvRhDIdR0Z)XD z0Pf-aRP;%<**t#@-8#O7OK->r1j3bE9l>W?kBI%#_QB8BvKpGq*peoG3qPl1$rXAB z@q$yGLD&U6&P|VGk>%b4aPjxh{2(4y10$1FMfsG#gh!7o?Y#7JVoGgwA}+2<_wh>8 z$96+u7xVcOnc&S@1ysc^wr-h`UT#ef+@?LH!q4T^hR@i7_G@yv(vuP8GN`7r@ z^eks(MMn7iFO^O#F{G?Yu%NxMO@aLIDq^t<#svgWGxv(GFl%QJ??L1=TVvyQpzO}6 zhcDt10X#js(EXelc|F8k{TsTRbT2|8o8`-muF@Cj@JwECsq0y*X#&)tXq? z?7I#- zkzN@RQ>jS@UN@gCfn-2D7PpRI>aiAkKVW`p;qC^B=S&r>I#uYwY;T8phms)Wy-WH7-&92EneSob}uN{+OG2&`0F$h*RJ(L~cR9sRu!h0jxH*HYlsP6_}%WI?Kt zTccjfi|Abg*io@)5*%EGI+T3bEmWOR7(vio$O2slsxr?)>zy1c=DK~?0-pn2{58-|2 z7yvH}-2XDParaH684qgn5-VCF;M1A8Vqunch8R~wjt%3puji&y8SCzFs$;a#`hayE z{CTF*YCj1@8W*-I9$T}AtBAwS(g5Me;MA~X%N+gAA9II^^vY!I_5fl0$}{~&EF_Xl zz0!LcFAgV|_51%Rih;gR4RXSVEVN>GKnIQYT;uf6%r*8kiE>WR2FBXzChvpCme!+J6(g@LqdbPIw-2~rE=uO=g5-P;FC z82U?PJvI?XBv$SO?+-`-#ORUbz%cMN}p@qxKtNdB*lkgy?TJmyW{@~0_wNrH>;J=_Ghhyj;dtxl{duYld)-vFc znQiI}!@5sV(DVDfM=C^_phJy5*bO&3^8>tYg?s&SKQU0OJ9Bcl)! zf3UzDYAkXaE&meX2@d!Y(5kyu@lT2AJrw!K7z7U(H}dyR(`a-nMsYyr#b_99%y|7It+~Bf-9ck~ zvxr%&cK43y8mC$Lu}Hari^&j*rpR7R6jb~7|JH^0ir>qV1|M>wjGpJWfuL)iwy3X= zvqVo;ZqU)o5u^cKAGR)d`9)uJv9e ztFcOt4no|H2@dc+j~f`JvXJH<^Aq4~(WMtQavp2gqnh#`bxo-R6p&Y@x-G4AsBdh1un zsO`uIbb|^fVx|7V4hEhd+740dZxoKFYoR5DQU)uc)zTh(5}a^j?(Zs0*Ny3g6{X*> ztI?#)(h065shv3rnNp|`CcSfpR);rKv_#5XB`O}qyG~H0AcwuHfHa(QbHxKV(1ycJ zpr1)AfEyA@0l8%`m{b{i>-Z{a;_w=3e%V=d`*CTznsxmLQw>BOdv+_zi4B%PY|7;F zm~L%3mSkH1Zqwt@gF{=_78+xiu7LTA*Ozw5CbGv!wQmH*27M;R7v(`c!4R3aIY*C$ zmTJC%pOAI1#}RGp?Lu(h|F`@_Jfc%Gz?`ZGJdAn2Q2jVL}-VZ{83aWZ@z` zrUA)#@3=1@7D_)G69VhL@=|`(kkT60kvGS%M&6-(tjRWEOBU+Ba&eO!ZkTyS17eg6 zDreh&WF0>WMQ)SU$j$|DGEkj$@*El19lbiu3ByIHAk<86hEn7U4oK4>22e!Q*r+5B zgbwt|xK7MYslFqI2H!JtMg8;d;d#J+kwx3RWOoj0$MwHCE@<5GY>nykc&W8>U-6!U z@m}!fFF$IB=ofV01i9gJlAn7wwd#5M3!6P#+Tt#lLl%vdc7bU(L`;@z>zDvuboSZYdr z`$KrpmL`rU+p<&iuXWq*@$O_BX9V2Nd7YhK^NpQ)!Pv2I*f=Jc(fRB31TeH>t?s-4 z8Zr~bN6f}f@}-h{j>cbB0Z*&$y^eMqfME1}7ShocZ#&YrA8E8%nt2byy(mAo@H8N9 zGR6aLXq>h&UKL!y+k)ZU0D&hW10;Go;ARNSwybh|94abtR4Z*{GCNIyg4&wGUehda z>SxyNp%SaNO1?PE@p9Y+$5*}efcRq_SU+FbZ#7VNy;J6_aa^%ed^O3PUC5Uc?FL2W>C*)7!k874S)v1Cd4WBq&kn z)dJt+J6Y57Nee{KaIWkZ-Ir4#R=_rh5zt#fANY`O%ijd_s;crFZN2&Pt{RvDqFpf_ z))ge-29m=~ca zNebs7O8J zkAVGfP;O$}VkrYwlobP-eGjt!yr&cS*;IIrM0~ro05``1<=FX9^ z$>UdV6r5BA9B9+;ajqPq4^_;={tLZ^4H1Y@B8^btJSU-n$X&s>!Ojsv-+X{^W>5u9 zGO!cNH7sSH;7yN~$hCAmF~wPvzf_XsOh``k+4D~|^^5O5KK_tsShG(Zz3r79t71#LegQCwQ=zXDH%j$F=3A9JY)(Y@Kz=N7WC8hLo9iI&W=iH{{r zttC|!P9(f>!a)1h4B&%TVQOA%$B~~3iz%J?FjG_XM?4(*q;tIL4A^n@WPz;}yP`@i zhd3IrsWFGmtlQa};-G8?nz4Q%YIKR0@UsewV9zR-M~9mZAN%%=_EEn9!6_?jT$OA$ zEHtDP!G9cE;(xU25BR&mhDrISZs+tJ(U8O7X-2c*lqUmS-FX&+?5RkHsp(8$`qH9_ zZ(TAZU%#?|pb`-~lD;N8_k+bMYFx{`QQLaLhbX=lUZVzi)jnN#McoVRiJL)uj-2-0 zfV*Zk^eIQ))^L|n!RnoR)+4shVrI7owwwi7!l~S;R&Ca+ppzkX=WgB9BHz^Wfs8~C zBE|m7eaMimW1PuNfUp47+v=0m$|v#Uv%|tHazK15>rEy51^)$(&hC|ih94;Yi&?YQ zrayk|uxm+l)6Vp-+xM@w93n58LG2D$7%R${6Vbtid`uR+9LIJ*<&?u%Go7+uXHer> z{p2^^I#Nay4WVki7t{p*gxTWM1q&4mP4zTR4OtezZUAmkT4_HN?dYm=-r}=c9w*-N zUbY_WW__Z^loD)Xu?0FjCOS7e>QmnFp-dbq$z3z=&(Tfv@dF}mV!;FV;;&Qq$Kpqb z!EPG16H<7F{mLxx0E;UW8En0zV-N^cjG^Hy_+mUIHYFi zyyOVl<|1Gk-Or13oKY*K0J^LzUpOt4##<0#&_kBfw#zC^Bo_GcT*m)8?Bj8l1#n<^ zds;QT=PXw21(vpi0@hH4>;~VibdqiZ=|#hQPhBqlSvGO+P{)Rr< z^>hEw0WCqyrPmUBj-D#{3n~BLJBC+^@2Eh|EOJGq9>eHB-3Ujj32ZQv{f?^TkS-pz zC$eBeaj}%S$W)x9M3v3VDo!8eH+(8iZx$w#kI)~>98>v~uDGO9Rd|O+fy(C)c&$v4 zdEAexZVJqxCbR1G3bX8kLi%B?dt`Yj^&j4Q?w6u%hcMu2?j{cgnp99p*iT8L+HN&c z4iW{p3^1v*atN;#y%1;SBkbot5!P0Ayc;l7f-E-mzneA7twaB9L;XvI6Xdav!RYLy zUdEGaRycrawwN?Q{vlpHDipa=a5eC~@sdR33c_!&kNOY2UV6tv8CvV$fLLSCV_HTB zuwmgYwwchpKcase5)0TCaaeqdfW5dN59u#1Yh+k5ojBhH#z7w z=|MrUnCux4-E6iom4Iin)X=>y1SoiCT`@P?L?+An;-Brq(w5T9zC?K|Y>{Y=@JBm0 zz{qO;j(E6_Ob;;E2R}3#fSP{X z*9lj|!E3?Hdgg}&8DXbsf^bs_VocjE(Z<3zY>8K^*#)jXtbMpCV{%&Wb7%pnDihZA z%nPm#@dy95r%32qGz(tA*DKepByN~_;;Eeg(oQKCi(;~l>W|w~V4Jn;Hm_H)_OX7+ zK;4$F>k7xvT6qpX!6f~3DKURD-SpY|GDDGU=G_y#k3^(4jwyJ{u_V#`G_sBp*(17I ztCiYeGNhStf@Io*1rse*0yu9Tm!q>CyQwD3Qb_4x2?9P=Ls6|XA~VNyHaoBSR@C7YF6e_bTYUpxjh_Lw!zsJ|91`@D(BU`C{*o~Pt`X% zN36fBI4r7RQLLyV;`*S-$+p?~9pVa&JFo;m8eJ-RlwX_9Q;0K=sAa>V{D6o^lm$&B zRiuQr!JGQ=oaku-0NdLW3u#yXAF8=?Bw`o!#gc_U4!ya-)xG85<}?(xgY1+=fjmaK z+Yf-|;w&r=H8!V>T_+5jYFTTX{GmT%U}*BAVZYN9QB|kfx$Yy-tcrab!x}etNMK*U z5iBk0SrPSe>0X|BS&UAb;edvbU%h)uG*%)Xxm1XX(O{4D0tuWZOQ&|8s)KNTuI?yi zqiXzeD~t=e>OLQX@Z<*`)>PD2gfpPTWB-oNYiGk^2%Hf9#6L%!AmLl!@EFL+)7NZ} zOUov5Nv6cXu2?}=d_g?sb2>{><58TS4(}WlR{`r&5jmThz3>c|%z#?MhcBOQW`RQS) z1#a;d@m}KsYjrKmc93P? zS>Ihu@@@a(3kW&17&myfyR_Z|(Swa0ZGWdot3!IL-e7tc5(9&i$l<&toK*miqF^DK z&PL0okp)!t7sQVwScD$zSW?D)D0r;9Oh1qR@9p0%n763-d=t+5!5gY6SkgQ_#s-Hb z|Jdqki1sy+%{<5+-Tn3>cptc`1FPBK%cp*gGYOu_h!fz*`%GO~>VRQV5%&lcAiz;L zo`=;qTQ5|%BwOvibkXG9W#>Fb9?BTqk)dEo27iybcV^DUBtAb3V#2xzWINrEj(V`@ z9?F{=;)gp{D~Wup#zvff3C)+2?Ll!SF)bJ{NFS-Fu0+$*s_aT2Fm6t>*b}1pID6oRVdKmLOIT|}OTp6=(vU<732I>fpD z?UU7&i+&nJ&JCR_Lmf7;C~1`mf~nLtB8l6DbBfqn+JQP}-YAVL^^{q4=u=MC#G<~G z_b}~1=v6^t8k-!Yf{Japj;d_KKTj7UA{jkm7G^ADC!WfDy*8&EJYp8Z8#RBxP{gO} z58b?wL0)sWYc9O5v50YbKRd!_6N8020`Os{@+?~~Mj*Lop`!|vA6f4WDbb{rzD?9VNDg>x`2pOL)T+hX z8w#XOKSF}Zr{=R7!njkUHD&1<&y%2^(6KKMVv`enVTFL^gB^D_hPk<8nP-HR_uBx~ z2!S2IKmz#^;oF?Rg~%wU3e}6?<0jY<4tlQR>$B^UOq zjsrwoTeEC9F%g{hdnnxVfX;>W@`Q+Nbe<#z2-qJAR#D|k#Grv5P4vnL|isyytT12Cl17SO`5$(D>hw_5PxT}Zte$a0wxO8)bY`RQ`wunjy z{u>IWAWCS>sXVtV!6mPO0}d*L9V>cGKE___jow`jO;U3W5!XE@=9z=83UQ1-p>mWX^&y!Ps*#;^M98my}vE=Ti4>;$~h0}yDPyjrRL!MSpTW6 ze#9Dr5G8yf=|*D*Vy(GT*HP|%7_(n**f2okKP#1fx9iS`5y|-SlKtv6V_IEjwdAXf zmI=t#O1`!FOLKAt7$iu>UX7Y15KA&Ur2=PplUaOFSgSEd0kL9+JfA&8fca(8f(dK? z9&9*L*I`6Bdc*pZ0dQ#scCUN@p;Ehr81`=tctH(;6#!`_&QASJK zk&s0fqzyLa?urr&y!_s916$!kOPTT$kv4Ti^!w-&rGQEsVcB5s4b`79NB!>4KNboD z>byplPHQ!sM%^{qNWao&tVsO+PqR}zhg?GInrQ%FpS&7uXU6V&ofIw&uM1G^zm!>l zU}RaKX!~@lIZ`J5t!Mxzw)%eEsY#P2U!^n~Z$LBWL-(C>= zT#)3yCj?FtoT|*wY15=>g7yNow*jG*^euxsI^S;d7%8{;dyS+#>ucV*K%$q9Ia4L~ z6O}98GL7|qvp3d-na`jK;)O$$0o-2BdvdE(m$!OV&%Z4Q&n@67%BXhdcYhykv;bIo z?MIr5l#y2QIw~5MP-~U@PnW>c^|rTT@^Iqz0%VAS&r|zGzV77hQ_!&guvImA{1}Q# z_|B$zp3*1$g@^^eou=oAl1ePHZOc8?4x_~7!kU%{M=nqf#T8s>wBZSA3$WS0LFb&< zLU5jRz0*OOhH5*sCrj-UM{c3Z=o=oCuw_8hR2QL*bLAAZ*td1u$P~JV z%xm1<+kumZT5@qu{nO*|&q36_FG{Na z{VsS4+|`qGvpCW~lRRMz0l#f-;N!6t`z=cF;+G3^bltUBU1&GdYKAb(XZBI3i{AI;GRV^7Is4y3$-N!NVjngu2F zj_HmjpF;C68nmT07F7Xq)Zviltj}s)tLF5~PgEnpqaNt!kqiP2<+m3j z`KIeEJS2d=W?P)f0r)bLD!NYIblGwuntgO97(CiN@OuS=QDR<9JRRFssSOh5+%sTU zSop7@&=bc^JBj7QTR|L5s#z~@q?TU%xMPY91YP>W*Xf3((WsM;)P9M^7vb&DQT|w- z(CW&3XS?mMV0qxVQht$q3xV^Z^XF%j<0U170k0#8)>}S%!5m4yX+~O&#VT;B_-`13 z7f-E!Vxnn!6iz$ge* z8A5cc&9@oz@S@&ukUCcBC;St&2eprRLVSo8&3mPU)DeA=slE;D}~Y z?>V(qaei&TXwV>HlkX>cF4`anF~lx^fH}kS7ZvIvtK03T9|Q7rO%K%~s0|V>ab_GD zsEibxkoj5cBrqK7W;z0j9x8|3X&>@qI4iI zh=*E5X%h4OfQTNnepKHiC^j$ZRS6gs>W(JxBlHDWlRu8}Cpih|D-TEbN$QW4Z0$MgKho@mB@ z?ZHnZz%EwI&*gU}zn>t|K@75*5f88TpQj32OR1<#=faKh>u$OfV{`^0^u%@D0C`+P z6OoE1l)Ntcl-}{O)0rhH{GhM?_ZWxWbO`b}1pzv^jyDUD|GxIdQkq=6oD;+*HPaSk zJ5L-qJ`yi;|MAj}i_`4Wp_;L6Z59{&W~}B_^p=f2->*&_Ql7uO-9S% z%2jPt6>W$g0hw{IKI19oupXPXFj6Q-?HZjR*(UY;Q49!Ahhz zl0YZ>y||5xL9vQmNg`~?8Fflqb$-E{PfbW3TwIiAWCnq^uBr58jVua6K`K0!P$Icj4^IHRPdHWwc^3pegw?kSTP@4I=^K?~%;DciRb z`2v%$EjN*ZVr8)P2h;x0#2kdljMF(ZtRE8shm2<3HlpLUL<1-umzjJS;+TaP+neHk z>EdQtISvnUB7|%%_7(<5NaV{Y`qdB0%q9b0;og^CByH1V0_ZG*J5$mPVGIEPkiLy2 zZEW;lw2}iNL<8LvVcB@%b!${HjmFOz3!XbD>R{;cJOI;jP&>|$Cz9}~-P5!Yo8tYL-(6l<%?m7&STd*@RENKv@JqB*WCyBS+KN|N`XPtuC2bc)c>-Vn z85zHN0!#cMtjqjSI@lN||FmP6$P$Et6V zLG3sGZGhmK7Jzw3ZSo!6bCsnc?*rwAg{8?+H$7l&J&{Ht%y}sk)GKMWunU3fO6Z4W znKG$%MCK7AUGh4X(Obx+&~~bnh;nj)R8i8cxq$@vaFC0G2i~KQ`&6KyxC~-Qd2M!! zMsNos>nHVWo5#Xgg3JRG=fn%5v}OEULyv2!i}yz)#oW_+c}^hEBrGgv^&O*@97#k5 zHfXc$b4nZTBMXCY-j^Wv<4;TGopj>k%v~rT58i%zl0RA2aDFdvHaA0EOZ^=2Mk$aCx$OF!r zl4bJt4EMdxoEFES`#~ZrrE!7aUO3u|hgp6;vDLyX5%XlCo$IN}ajvh*2%0Lp+qfB$ zQmrlJrdQ$i%&jm|*?OxZMH>Q1ckG#R`b+V>d`p9Gx@q=&Zh_0)Jq!1hzIQp$>Os>8 zNkJkwuX5Ub)kbP^s!6^MPbT26D^>Vtm}GtYe>JVmU}FP1$wCjSnmxh*K`e1t$u8* z&3AMoYj1TDgpg-5)9!1f_RBrX3nepbcT@qh**L(kC(?VG*HX}9SVfjN2>l>5Q-$9q zlqe=E_*Im7WQZ~*lO~gPwI}?lj>D$|0dbxlSyGdqNuzo$E^Fw23hQBAJhTjvGQXjA!#F69%)Qaa&S~_L zQGxp^v(+65k{aod`*aQ?mx!M>Ta5c}oszJfev>A@m<=*-Kvi<<*7mM}s3ItCryAfA zAkwSvJm*Pfdcb<~)od~6+sqEpeZ8ce!M5eaKHlSxpgzY!9Qa%%SIvQsf56s2La_k& zc^%IB$-I5&OSx9=0Nc|3h@Xo}p>13eAeLeh4-@i#ep=Hb+AEgWb49_d*m|KRf>+IZ(2h6GY?^nvD$`XkR*9Fn43?1cjuI`;>x znPL=jTMP3=bUoHz;lq3?v85qkb-HRmWhDQ~d{X>7q)orG<8pKiQvlC9qum9c-A#OL z?7AKs9WTpqs)yt~CVwzuF^@5GG?H|nq)!jzt=X1;9^%gNHa!G~2nz(fJ9!pzkAMF^ z>SLi*1b9AJc{Xo$53{@~)udV$(Ayu&`R)2=!3h)8Q21AfYYgn95UVc)ro9bSdLYH) zwG3q8&Z}{fL!s_Iu}M^l*EY8_cPl5g7Scq*13WVR!#z5vF^7?YYgv+}A?r?B1p7#5 zz~?f9_IR)eeNg~~eu3e)i=VP{Y)#daC*}y!fSj#i_I%1TT8Nff#a}$9@3M(4nJJPD z#Vi?N+N@W3x{PFEU`#C)Om!ZP(jm|Vax057mM${OL=2_%t(B75>qc>-^cvMcN^Mc1KqR5+v5z=!FQ_D1hO@g{9WC_pA(vDKQYS zwh$S#UXw@$*`msTo2KeLSJyDI0kA+B#Jjh1AC_gv)Si$d(jWs>31?dMANgLJ@!f@p=ybC;`>QM{ zT(QrdsjhA9P|2)yGgfJbQjeamLSxM+x<*2?LTUa4%jGNqUQf!I(|PsnA4LB#;!0m| zujCIN{i8C$4iYJij=yy&VcMVv9HXBhNiN|#+*x(1i$E)EP7bbNx6r;c;@bZN`yc@# zmRFx|))7TPxUF+0G3ks@el(0*`<Ix z+#mbm{uzOu`x&vT>YoXePny6ekLGdDyvPuJF)$Wc88Z7W#1lCDbE&a{kQCF$I^A89;KurFywm`IuU3S6_h< zm&aax-za;6C!qQI)fW(&@F|Y9sXOpp z_a)lRC9|M)k}4lBhS!i5(~M3-z@^^1qG#G;^^z9NCO#l*mCjQa21MBEqT-oBH5;M@ zaCUI`9{|@de#5^DzMUm1f)HB43}0myTRX##@W>Ze#5W+WM|xd9%3@f_%}tyr@)wh) zTm6~H&v;ru6sx|s6Gb>hSpOBjYtaL9W*b>r@;90<5fH*a+fkWT25|`~F=gP`^>Z(+ z=t-JC<{lixj#lj)5QT_6h@hM$M}z?~NqVdoc>2|=C8SY|OwxX4N0X~o_VL>Mk<3hd zav(#bn&j|^9S}P$JeW+H%Izs|m=)qN12d5=uTUl1!&c%~EhCD~h&i9gWPvoE_bU;P zZIxi+P!6BV!v}t&2?51LwNWlyD%r^tsA~6+qewSedTuP}o5EebYUE6aYYVU>HZHl_ z3*q70DiSE1psLE>S`7NP@y9%IN>XR7m|GQOlsg3|PI(uePgo(wv*!Cv%LK%0!%UD+ z_i|3n?B8$t%R8;;ek_Nws=6vnuwkOZLNbBPkJ8{O+kB$HR!v||$o+68h2LyQ0C+6@ zDd=q)_?2O}^Xs%g=Z}v0i`=JHIkQ$I|9|1ay2{Vjb-2Y*r@3G5g+qQWOzJV^`ew0pvB*{`4Cp*=gA_-8d#h%n- zdkUC@4JtDVQz;PdP$64|0dgkS*|qU<2j$REH(Rpe83gulAj+%CF`| z6h=~TKvLe`{N=t$&jZF~b+W7v#85_XP*>Ya!w5U2K&?39GP2-f2@PNsh$T%-0@s#e zFjMf2`HZ4>OM`0#nn7W1Fo_?BAvKq9@~fQdo(-3v&C**41wQ%xQ)|U?Q*a7{n1*9K z4%pRuyg^mkDMGqpi+7k2fbLWiM`o143I-=7VGmU7$;lXap9dVAhYimJD=D^SRaLpr z)NPNVMruR4bp!YGr7a7GG%-9%?2otElQ z;{0Y#A%Lx3r=&LqIsdDvY^!z8K)of`mVB*f49z8(84HL7b z#>lZ4yIbj9a&OCMZlNxGUDTnOlmV#h__AReS1SPDq-6)?wU0Lu@J>koqhxe?T$~9B z4ol*sgX+s2m8}eHY!(At7XVYRlWZ(bE54cpQR(KJVf~`!5nR2Va42rCCuQe28$Uh< z@kdcSsWaIDH?qEIC^^#nhjzvy`g1Ck1jPO^Yn<<{obAOQ)(E^|(%24bwc|g(scnF| zsx?>3{^_Nf=3{q5@IgAv%tnx_?RK&@5d@o!1(peTcD9=#_EBKz9WMs>qm>4kP60}q{P1;B~B@7klG(MbwNsxk~v_z53@hK68HAEZgk{KZ}pqH3B zo*!C1taI3~_x5)BozNGdBmKfsPN`b2xmPU-fHqz2=h<<&#KoI(F%7&Q%NAZ;jy<>p zusoeNcB96n79!Fr=^1rOJPWy2*gPqh7-xgc#uCNMkzxupER<9b6gn_>0dteAPpNkI z#&tjWgJJLGH|BOf8sA7!q_d51pyBB)Djvx|n>mK=S0x0y%V9|!$4*8jAYYxWJKHdJ ztR&D(fKX~QT{7dk7D>I-1@$y3;ChBdp0GTHABQ@I3ueT~)&-CbI=ZB0)WWVdyK*|7 z&6w`oCTZhic;Pt53)G=yQ=2^XZu> z4Hs*}E$Ti$5Y-FwVoL;}3yn=z7pWhh%C7^IkU0sJBFk;BUiH_h0XS8Ezj~mcHl|BV zvvvvT@01Q6Wq)jo+UiswO=J7+MPXR8J_*5)x;*qh0jlWift~6TmTgQecFG?NT2oQ`*5*`3;itg(79=_aYEg!7>_khG6)eYl{IO&OHPgkGK8j% z4bzw6dix0_rA>3;Hab}490p^4aI!k)^-U@|IWIE zK(e1!!gHaEZ6agaD1URP<{zLEJ|4CkfIWGG4t`zBO&nzE%8tK&p@kKVAhB)k>_^zL z$d7LXQ3R1V2{U5VYH>)IouDLevkUs|#pV3yq9e;DfP~mAQuI;7_~oDM>K139U;-m~ z>1TJ0R4w{5?+RXbH`QI`R@a&j?$vN=-G@hVl3O?OKV;D)J<$7?9cBp?!P|iMf=#8m zQwmH_Uk60Bf8}P51%}=Ln%i;j^4r+oaFj+yvX0dm8Pd3ljE(wU?)D8j*cfA?4MfXJ zTtLEDY~2_iiAFAscZw2IySPQI6G|evZh*bdLLkC?bS~t-5*B;j{WZaUWad5 zul1I^;rXQ^Wc^L0Dl#PSuCh8@U89 zh3`=A*#q^hnfdalvq zz7i(S|G@R>jWm1N zh7W7%&G`^JFEfLgEUnLxhBZt=&Fi%2w+81BC6F}%Y?AiAO>*dwV1QotM)rBZQ{@a9 zwC*8(|GGW)1AD<<31LPIYe7W+Nbx^kb-Y}{&HTfejAfqdeYT~`P$tVgf$Gb0>?kzn zWa<~w2qVr}NEnq39R8v5*)rg(FIp&lp3v;69wvM_#G!s6j^b%ZEdw4a*=9R%1 z6>Q}CVfu5S+_Om1;wP$j1F(k&ENvH`!Z4osz>wjQuJ8F1MxcuID*NoRfvk~1!`c@r zRczfnQLO5~RPo~16Q+`p8BX51>MC4oJ|-o@)+}(o+DJ~E_Sa0j=WMR$2Q9?pJEmTpOQzIDm?1w;zgTdtDyV`fCxvar&DVwFMC ziRcZG?r)|-GZPi^I=_VIeQu3E7=xx&cE|bW$b34*mZau=k!`#A&bU!y^XSKDG-wC5qrwPgL4tTS`3Fbx<(b(*-EwpjcLB z7E?#0u{-1ovq(moIK@PFzy&PE2)g;Zx;?|?zK5BQUpL8!man|$9sgU;-hY-fOw_j{j-89W-%k@-JIiIdl~eB&9AP@%}`Jf z1m~()t9<0_zg#Etf=g{`2@o%!U%bmjk!|#U5mhe-t9o3rC8Qk!YswJcZ@~2!oSL@$ z@SLipmU07U@r@Ll3))jZtPOHM< zhx3V=-PxDvl*zB%+uH{RQ$cSRtIl?&lk-#?AwxAvr^EpBJ&yK?=*SqisUpCoJ=FJUvcAQ>q?QhG-l=&pD0u=(py@>QjgdS|)kCj$#FvjWU7~(vL{IbVmgSxKHgWa0 zV5`@*>A@1(Tb|Oh9xtV+TzT8apRLYD^NTwGbm#X1GVkI`cdlLZK~ysEOFO-hPVusU zwI9hLXVsnE!BF;yD@1LQX2is5vH}e6uo8d*>eFjv9BOL_Pk9i(0YetR8qKW@s_|~y4*(HV?_EqQ#E@hqvGm3#P7mTAemmxIqcR+#!KOyDwuz< zcme{WEPS=_Y;9K=bI}-rpJ%@;9&PA-`x*xhr%)RDJiVG7E~f3ZX6x2qHOQsZ=XU|=7c=hR`=f0Nz9O`-Jqld&;a);8+I)_U<)CzlJt1PWny&Qn zQe&$rFmxabO>gSic~zeon^Yh22azTw95$oQAQdk94E8?=?TD*!mF>nWWeOg)#BZhD zT1=F$C)O{kz^dF7+43{bPd?x9wb9SSf@rfzIdJh z>XCvcM~r&^wi{By*ra%4d+NOo5{4ZYj8{l%{NCZ|SFrJp_1PQo^iROT*9qvuhkoG; zvah>tRCv6DECH5;^~0NxmSC6H*N_0EjR`r$ZclfwIWR2iOBH zh?U4_Vs&wpHrIg(N8Pk&ObK*!zxm*g!PN0i4yllNpkLLzchL=Bk>lB1=7|i0i2w(? zv_`DM!I{!0v3B~h3>A94C447x!@Z?1tQzUZ4CD%2)L7$Z8k=O@1FWdcXgkkP+(hMl zbOczfGoDP!}aG@Q=^%~e@wfuWsQk;F9@T}7=XVNTFr&uyB z*0joJExh5yF{xGAk|^fh}drh!fEug)lQ*xUAV*n49KE-0u=7yuvwLfw(CDO8hI>vU3@T%Amo zVJ85n7*wXCeAB&#vHJ3W+WS+(d^#a2$hZW4PTaj1mlrX; zv)RwW9z>+xx$Fx+Y3}Nmev7{^3#jfyxtkfc^y`ZzA!e!n;Ja$!>ic$)w*LiYzb09ffF7E`zPa6RZU8}eV5d&@D@(Qd`2OQVwF|vqD(z@kUojiz z)euYcEvm|`o*$$TZlIn`DDwtPVGi#i^1He{L-%u-O;%J~Ldap4HUUTVJ1bhgMm5y^ zlwa2GfKoHeg!%u#x1HU^t_p9ErcJQt;kEtkL z<7&5ZC1;7Xsg`tR0Oh>`6`|0b^OXHd(q~^f#l4Ufoo{F8Cq6`ib zARAb?$gjk_dAqcNe;r$3bz7A;Gki(lEx*;$4nzwb+vc8)mpgM7(gdB@=DFQ+cUB-p zy9P2Y69Mh8tfoVX@&@Kp4xHX*55<>nL?U8S$4Q4>EXumX-6%QvR~op3V`A}#^b(<1 zPoDbISj@Y0mmjd>1C#CdhsyPMu606!F{|N`BI8L)efZYj6kz0HZj-w>50vps2!5|2 z4KH>6B1AfZjqk1nB<+Ry!qUVk+=|8ajlFnn+TD4G_kD4{b`wGp@$|8~+skvbc^#WI z32lH}@&LtK1t?i2N;{j(hJ z%vKmIs=f=A?GL%nD+v%m4KCJE-?kjxCocf_>pGO}HNPHtugdn44rQzHEW(T+X6u!O z|5|fSE({HDW`UL}SUu*x(eBXj>w6-3?$(XU+WPiWl810y2H-{N=^vBYdcO>%2E~JE z%g%~sHWy65qxAI$!XDDrQR>9~SiCOtjH8V=Q&-=+5xVIm#P-}1Wz*&(LH4C~29fRr zF=0PJqCb;8@FQ*+E{Kk#bdt1Yfa@mJU51BBm^Uf0ypv&iK@?`Nh z@N?87m7{zG>8v5CuDVEudhPMlTI-G94EKTsB7#*O7)2(7(L#6Q7lV1#Myyu(m!Vq1 zoM{3#+aPSP?fnQ>1>t!Ln{kSra-l; z+z-#18R&^>&Nf99t5&jrOExwewZM$C8XQ~OJ5mD4w)X=kRAM9ss2@Yu_)arcuMk9J z$y9SES5rTWa|#o`bN~Dlq8UWJx4hp9{4az-j&jUDZ;dE48JP^a;vlGT3%2vM_Gr)} zM7IiRhY{4mW?qwf4u^5&L}&ZS`_9h?;Ki|mE|f6)-oZJSOKv+H5EKk`znrmpwD~r_ z4Zv?jM{J!VZgI^uNTl)^MU5=#h&cS5N>%~f%j)nr8}f7j(K9gVl1^=%UxA-xBFsjh zOm-D%Fj$dnGRiEEQ_(V#9@=1Y)aK~O5-B30G&Irmcs6Gr^~n@!Y z^d1_sJoouab3ySNNg|;1%t7V0{0SRMO=%EN5CRnmL$WFIRGnWspzWrJuLG$$vJhaw zUlP5pTkL27Ih_GJ4h3nqQe==PIj1Xgf>b(-tt4?;)kBr>;8jl;yxhhxj%tq{BlD%8 zRmWn;mow*n#o3D6^%D@Pu*#Ubxe(LNZp?LGd-}iFX|jsboD>*n!BL^EbBgcRqu|QF zjZ*nXTisNq8rnDCo{AA(p0A4t3meq-t?G(N6IM(Z&jyG3He!7bHrEl9jr(8iNjg@B z>k7oCm!-$mS5X#_oHBtG9{4sn1O}>hG$9Bnfi)53FlL%K=$)QXoWZfPSW{?GM!N`t ze?)n{Qv~(Do=pL|T>OdLMt8 zoqUeFO%dA+w%7BLkyUi!v4rYpfvh+o*;4vy=g>&N&4oBo`Nxq?&1nDyHeFu*1SI5V za8^Tv+v2R6l3J+vVAHxNT7@}7-D5in^#%f5&bo6H?h_dhgAUNxqM(o-PB@P5*QR*b zcS|#78V?*-#WR{1zTaB-Kgw*&`$F$<%87!9Tv>D|H3xN7iI(zgvz?`2Y?roYdju3Q z{Yz)cKi?w`{OUU=5HclsSwNj4YwdTv+u;YY_Mn6sa90^&Wm_#fkWEc2JJT5~Z>Z6x%GJcHU_#(uY)|?RQj0|PmsmZZ z^$_2U<~AN>`pggDB^`y!Y3jP(nN9l%t^7JCq|5iUg|-=Ptv(L371AD*xh)^cz!@K) zS11m#={j)kpN9=3)#miXM3j6e+Ii~h0|m`F?1jY;rnEwF$i)lO=o*VQ33amtJ31+a zLA+2?Cr<^_7ithI(4SgT`vxnbCRnh?eCht9;`z_c<;1!1Qd1K5)vqcF3p@wv-4)J( zL%I1RS6ov803>1CP}nXY6?+s}rjSmDwK)6-d?&gkQCbmGeuwj6S8FC_*eEquQ~iGr z`$*bDxZ%WQi(-=SORv~#CC0$wl>42vP|jOX-z0eu}j2)L=OB;-b< zlck*WZwzRoXp{KCl2i35TH|hUqjs)Klqd&)l!aBULowv}E%T?`ZK@P30_hCN)sfBO zbpN+bi643Ni#W^igOpPbe+ijlMS`X$9bpkEUS(&U_VUUHW4Ia7Tcc-9u0QQuiWt48 z7&n14^z0{l1lz&|B5?bCKFMPv`&EcT7PS}^y6PXW#YnpvV6^%Z;%)cBMa`LrVCK)$ z`6bR*j-qe0B`AFyO5?4#1kc=p=r`R&uz6w6(&_AgJtniuYJZVBA-UydlhSVNsXyKo zu!J)zpzuaV6}2s+u^Z#Pkq_#!iO3%|(X$!|+;J3d9?AQ)aDwqP=@lD-ISdo@wIZ|D zU}$}{rceuPsM}if0#mfd4XMk;Ls|l>V?Vwl3)$7wc3O21|E6p64B}Y_P7IPq43+z@ zsjSlPB0+OGw4V=oZ8{tbQv;ceo-s}Yoq*O40=k!{+s>ns?KJ@`sGp-=Du- zz4hL@jXH+AwqA$Kc6YzG;gj;Udy0qXjQV5ARK8xh77%m^%PMH%d`>oVqo?aU!JElD z>P~3+{8tX}J1#W~3-Ej{!xR1#m?kg;?9F5lI3;Ei8}dv#k72+(VITC`@?PqYs4yh& zn851L)3(={PIP&3=$phMqvvatYDQRq8c;n_fJJ_J*CbR6EEC_?=fU&Kk7_6cRQ8{| zBkP>mv(rSA*SF?GkHxdP_8H(Mw;@n1D0`NhfzNvXE1j?r^r_atrstykaOJ-Vx5eOE zTKUuX5@^Ducxj!cAJCl@XUsG!a=_Hl3dJhMRUXHmNQ%Y;yQ{)3#p=4@bbREHk{!6W zN`s-Ga8Z&qsPYI5for0`%@jpjcI&bU=LXslJ(jWoQ0)5mMVgrCXa*q8H9^$jaW?cI zGIJYK0PxU#D7YQ8GHWh)r&LJ6ejLCHSRZGR{1jifWnBINVqITDRqt^@|{{`e3_w%s`S*}yEi$E{f~x+?W~3Z&<meVVYc$EOGnizILwrITkx^=-m_I3`g%2MXI2UGPmB6 z0(7JS*w2rOqyZs#a)HbA9bL)t75G748B?~W#5_pT4E2ciREzE)lN9T~``DILn*f^o96 z0iRp4zx{wqn$ld+J19`shQY_}bdEHj=(%0E!Jj}T)3)mRbNaO1=Q2~tlwBVOrG}7x z?uiB3B3ES(4Qd7O)m{O0qcj3NAH8W7*|Hjpbf3RI*!c3BWeyEh+rBv}F#DWSRUXYi z0-S|QWp*wF;Ei8pnNYHW#hY|#aTfvnKN0OtKs7f~gkacCFv#MNH;?iAC)=DIw@b$V z=@PPnqt>>~eG)^9=qiIHV??|kC7Nk4^SYN-n6Kpk+oHp6H}Tf^UO$B-!Sh>)Pp~ev zd^3+iwIs?KLFR3S=A5GyL+laVM6afEOl9Ptvdsp#yZ2)!&Xo|8gQP zmYuKRVaI`_wXH)oL3CDxt&BAk^;WJcX7tjTNdmh`m98G~NfAXNm%zYbt8!oum7RUM z0D=Xwe1S>*JF#r_@4)U4*?meyJo!kL{Rs|7yC}_|rOu_F`Zey4QuNUP4=Iof?&l+c z#Rv7hzCW2sFrtVJ*TSt%hmWrt$Qnijx5SijY}(3GqPJ4`Ic>YAxyOMq0R{nFO87}V z#7Znj@(ly{2Pcb|l%PEQMKBWyK-^eXV;IxqX_bn6e$)bT7qQ9l!g?n@vxd98{x^A7 zsBP__6kpr+{7Kq=ZQks$pf?LFC`nEAH4D^T*V>|@o^8oc^ZopnHwl+pPVFK3>^K8q z2bO*OkX+OHA$}GT*dB{2VppgC_Jk1+bEdmr66Uh2%D2S+HxbI1;O!|5 zh;yz|>(n-!H1QBtwr1P)kshgF>d^{4mw8o4tW?7X$6=YErGWM%{%=2BObc?EF@YOb z{0=Hx3qO>5yMLejlQC;XGKb*v7`hdCxEG6c^5!C})qgyd zf~cXnEeh8@a{%4OgeP0TE2Go2&qP;wsMU;0kQ@;U4BX&;W zs{6@kFuhu$-D{~5-raa7eW!etWy;?`cu(ZST%E>nN;DD_1(B^R?=ANvX>z!t?+ska zC=ucdxB`>J`YGe(Ch{)W1chDO(Pgn^{C^8?C|56{wM=DRY>#y@3lVxj;=GDXHV@Xs z0p3kvjGtiAO+Fn>_iHALJP%30SE7(%h#FzB1>>~aU*gu+UU=}K^V=;|O}@H%5&)5z zq{byMd8!+@ccuaMzF9}QiyU!l5lIof>Ve~F&q6B&(k-C%alxiOGp%AIIKfRQ#4j&3 zwLi!cY;7bwkJ^)*t{S_4m0v0T~ zf4NrjKjsU;Wa|7$EZ#HAI1!m*7-j9bL=7&OyU8d`i?N$saDOC`D`{p0>7lI1$>rAG7i8sllFmU-SQ zZeQ**s5m)53RP|%*~nj7wbP3;WK|D8r80;+{jXf9odm6Z#J{!>VOKc=gTHj2o}d;I zMHC`VbcH3zc8rZK@txv>hLOXgZtI*Csr~<<#Kb{sMJ6*0%K@H}L89RWEml0>)Hq!m zALrGT;~l-i@z+%$)o_}!bz3l?&~(pAjUDfo*DVzloc}xQBisGDQ9oxCt_Ai)vA56r zPh5>%G27)mec|71D4r97cx73yuJ$Q)e{@I6E;1_8=52UHs!c?uf%5^jfHVyp$a3$u z`OT?NAyHr@peVC-jS;`%dg+_V5)LA<)t4T%ZdRHYPjtgS%8NlL)Q)Efq$D!Ju$4+A z0Kr_M!}hniAJ*xS1X*hvk$3HCJu7A0Rs%=1$>hYm&4?g*UZb5rG)mg03kR5ehQy(Q zGupt+FDaqbi*~p5Z*D}O388DW(7XQ=Y2H{0<;5w+09LYm{`TN`^Dr-_sg?k(Tp{(X zOgi^3$(NP;G*~G}NDiwt4@Uu;%vGhhW9P%tZE22QWxnUTaKrV#F@$Z1^ZW{cC3zAS z7<{lC#1u=xZy&KYTL!LXVrliK>1E$s%p~R9Q358~e}1%Mo@|~koYIMSF6Esx0Qdde z-RlaIBM8JM3E#W_qQdMA|0<7|5=wTp*IzGKxqw7SChT=ztQf(LEqK^Irw7jHGKA{p zSslAdut^n-)JB-lIO4@poh!uG&wCp-w59>_Ugo9qd}PMG_bnWQUWxmb7S2!-V3t`N z3Pl?nzr|P{gU@)ZwjG6y^FH7EOQJXI=>WM;2ugYhpi3+UN+@euW+ug(sK(>OQsj=sP_yN{hSJiotm% zSBCMrnePiPxJE#=5&IbJ7IOQ4$|RExG(-rUItA7g;M7Lfu&2>6eha|Pz742_nA+ea zXdb)R-_bj?x2Set?TsP*+=zksEMxH})hDO@Yg03E*hY3 zH!iXUl5(&1`|E%*w2A!98I*oh* z+ahD08g@&3aPz}6#z@0J2btKde~c92ye#HyGbC2P@}dJmcg{*wY}$U59F!gzYq9cGa0 z*iybetYH(P%i0(tF}_r~L!pA~dGyd{6;JZgY>#-2JfP5I3qMnrD1VLJwsy)Rcu~Q% z0(y);X#d#5l?yG%30_4!RrJDIOsSOstwpKEGkH(w>Go0p$)7b_4AZ*;4tjXaDay1& zxGv+OutDMOe1n(hSsOt#OXW?V1CR+@fs2MHVe?B-Tsza6JIyU>sNaASt5SlqQRjxf z!lu;XDIY7*$b(`sVP;hnAuMtCgpnxtk2}&@mFQK8tIrYZeOEzfQhMzlY~4@Wj~b-2q^Av)eIGNu_iFrA1rCiD;P?R&_B_>#(?p z*qC1VB0XN{4Q`x^sN;rDd5o)bwzBlg3zM*Yd7ya!>u2y>)MvGduWO@KRw_Wx;B5BGpYk?(M)3)pWiTA zwNJsdvM@$KT!Rd6WJwO+mZFkVjEXpzm90K~QoXSPaTU3DhOV&kNUg_S<~zk?WT4x% zJQvhZT-cl+C<=n38s-{c^&oa_U&$N3D>gc-RJGmROU5HtMltV4wm$OTMWnh#_!Pt! zIq*CEBR<2%`zA1hdzNq4%WY4?R;KEPujc1G?F-7VSHUT2E^?J~sEV$ckvA|%9`Z#P z5J%Bf3t|9bAY<5PdEZu10rT9~rY3kzd=0E)E1Xkg>IcfDheBBkH>cq}GVo@^K)nDap zHt9;`0eKG;ZKWs0qFjR(SPaGwYt|&H_}%nI4deBD?$@HuuV-#D_6XD9PaR)Tfe{?i zxz~{apWZOgDN0LS$Ex0WTDDC-@rht54n`0_pf-1Y-6r;}Ety2aqs9J0M-Da0hgDER z@022u?P1osQlht-Wu|l?v#qoAePkF}7z|%*OdW#t+x(|si)}+1&Lu}*R7^78Nv!wa z(lDDVJ$hNW{6ou3xwWMePGPP6XbV1;g>1=gGA&iOg*|4b9#&$SeF?8D(O;jWxLwe8 zF~ZnY@Ml1n8#Mw;98Zw3q7GgowpnlBebFgtSQ)lRRmC+A=d+eCFd%$PZ)gzd#RVhb z=YU)TU_9U^GrI!tu*unwrB3$D`9gcli9D9Fx&d`YXtHx6{hos}`A|N9>`0a!DsLBC z_N)WoLd{-k;NY%E2xM?Q1Bxm8a&4nqiOkUHBe~GfskeR1rO~zDYZJcY&2#6arFaXH zMkZ#%w4WBlLb7xzRT$tfItdhC9PWo zUD*HEI|a5h#Jh;*Oftw!e5@6J7{y;h9FaCjC0Q5+a@Q)wXiI&W~n}BLs_ht_CCQ^n~B5 z^3F1p=jIUH&_W+oxII;M$H^S7zVKtITWK4nVZaCg3N*;U+d|H?Uv@FewLZsuogb)1 z*i8N-?vj89FGiP>noFdVUqf3p!__3d_PZAQ?KNE{SSe#sp4^m#eA=z-qo5ZW!hLD2 zheN~xR+qn6OCY`mWG(!$cqCKhj~d*#-(xYY%quSLkzho-lTF&H=4(`gA<5rF;%lya zv}@%p2*e_o|HeF%U88#hS0J2?Cp}p+$#!Y_fqcrGJ+AyGjll6xq>?`M`v!RcG6yq&h3eTV?TpV<` zv-*?X<$7A7mOM!l@QzWC%eL)UmkUxgw{?JUeY*o`^Aez(Xj`YeoU_man;&6iJOe{a zESL=B8|G14EJ@o7;d`I}oGsz9Glm+-v)Sl;n*YAeRag-zxpDKvOq%@B9|3R5Fb&D4 z2NDvb?5yAg!re z?`WG61&O(98G8C#W9b1`8R*^_JWL*cn~f+;fyMX}vDp}N(5Um?NQ_5?Hnwq; zoXyk-38EUyyi(ThoKZ)Ul+g>_UW;uyOF37q>TXuk{40=$Tu^h<@ej-%GsIv#!T>E8 za0h|EvQp>UGQtvPoowr=@5D_?*>ZIA;>>f(;MH>mmpy`;iv@QP7q-2UitQ{t0KC*DnI=uXj&rWP+JiLczoGq)cSU6q+-NA1*#pgl5)XZ zD1Kx_1O&m2BPFa|->kVoAw%&Bh8_%7@mXXGIgNvk!~NOa^f`+BGbSa9_8)|CtnmrJ z^~U)4HniPPTXMC*#TS*&33c-p@swaf7`s`S|4B9rrtLF;?-TvpeFHugx@77mVQX$T z8O*B?7E)j!iL**G;U2fzCy&{(?~|h{kpf^^a(iK1!sn*}&>PLcSK{$cr6)D5RYBS|JpHsNAKC^4wC)+A)KzIzXxm0O0f8pM-8-6uQ{L+x z<9Gu}O#xi@?qPJm7&dyt&B`iMm%9PL{q>k~^Ua$~hs4F8vtq_p$gEkQx&4mN(j@HHNXy zFpo0u2(0^+b66O0>cumV08Oi(Rpy(ak^om@t9ItO;e*RJy7;&YgqZnAPCnfCcGxf| z3J3?sV$zZBJ@IKk{(#lq4rocGs#7tg;Qc9m7kN)Lo;(iAo`3;^=dDuY?y2^a8%2pq zT^WYvo!-jxS(FR?az6|1k?T6=tP=|XGp-)N8R|wZMz~;pjO!_0j$ih64n-EX;M8~#Q92QEfcYg(OCbVrbr`4oN4Uw5y5Dt-6Yf-= zf$(GQO2espi#@DX&2hA<(+o9Jz6|OU=C9@}LmO>h^?aV6^bBs91JeF9sJU246s?@| zp^wDYXLBbkeCZGZD4k6%UPaB%qy3!I;+J`1u*B$ggt`lbbwNPMc-eJ$pH8TrfUban zRG^gCgc-KwbwBd+Hj_qa|Iii9fkB1?U7Dw_(7VIGSD&GBdQGrt@i*zB9)rP#M z`=&cSU(;3o+0GcJt4v(mcnRx|PII)j>$`q`jt>>$ELe#G&ro`7o`TB37M$5eC^|J- z54s3dyC0 zHA#YFYEzdJ?M?nvnEyF{A`SZZzT_Ei(a1_;%FmhB_sOyQW7HEZ#~UB`Y|F3@({!x& z5z_`DfUWHw;Cmk5EZbvRPD>p@P}lmdY0|Ng^y^04WdB!6M|>C}JR7~u`9=g1qYLLc zjdofoda>Kv2fMHEB)SZGh>|X!4p{9;);d=THWdg1c-{(rSV55h6GFTg$=w5w9(gx3Z?&i-5{3Xq3u5pe|lk@X}>rUq}{bjXt^ylJV zJ1DU(V_T>=1D5X)J`P+%uwi;*wtZA6a!Klbuaxs;cJ#ds^c!d(rk;q<-x>4~rk(0Q zcEUL|c=ctF`kcA9luelfB{h!C+b)*i#b1e!tfEa}e*FO$wpn?MJqW3N;ZExZ9$@n4 z`Nc2kkEuwC92b++e9YpC9Ch0KC*85eeh{vWdm&Np)#F(H((ONkPJG!Yc`_OLAY`qM zUXvElM`uQIY&o7vDOOCRQcw#QNvX5$E=ya0#^btRN-#VQuDy3L7pq^{FbGwKcLxZV zN7TA2zffAUYZy#S&(*aeQ`C`vqJq)BEq>0?;5=>~#KVFXo; z)Pan&IP(EObPp?^h@Qms1=RTK|HNihdAY!4`*b8bIW)FLW^eo>r*e0XsmIkRNWmg5`K-9RlU+1gT?sSQ_3N^{d!NTtL1 z=m@j7QZOR^(>)%LvN;uUjQ{D zERT}h^(WrS=*O3S>DDKE0Jb7wZ+j;y zK`6W3^1_~+sjCKlKxq9$Y9LV5UpFUj`^rZzzT13D_QV69%~p)_S$(0x;)fZc&%Ok+ zoE7`JnFl4(yC2u`Ryh_qb!mtImAIadAQq`#VJ$EXf%@(BM${6caF^nd%KsKRbmJ!^ zyJIl~tRlR2J9o^!wh0D&0(2k_TnzhEOov~khn!pAsEPp!V#4*k2jfct*=nD~YN0C3 z@|_C1)#ql?0Zm%%BlKy^Kzxh?RhDQeZ%P!M9am<#6KuLrGEc#&Lx6kp=~+!D4R`3F zR8&=8naTAhh@lNur{fs!xV%j*!v8s1R&Cs!a*_yefNfII|#}R|M|@iumyz1#TVmQyixsV)X*(sv>{c9 zC+xzRtij4zvaEIC8mr;6*P>>c#*(z68e@_hYX!LtSYfA9JIsBxD&O(E`U;+V{B%^9 zLDtlF`8@B>3YZjT43*NCWxhWPjwzAb(Vr!tlXV?(epCo^OfEKE>TH1MyWlFPW6n+P zdTruoo;_SJ#?N79+1O#EhDe~gFo#5yJ}bup*H)EYK%~qr^5~BZ2P9ifoCkAmy}{t{ zcE4LCONiqBFmK)=jA7)E>(8^u{w}Y{H$c!kC*dC#KWe$$RUg{=D_CAL4QVG(}N^RK0jzD7)Coo()-^B)~*utp(^U04HI0 ze91XC`*CKUCNa4Wt`~q}*TK>3T0NXKH=X+u%i2 zvL65c4wa^NQXl>XClXsYzhwI?;@>@~kppYdZiODlT;l5>?bGmfStXW)usDA=F7_xh zB{J);ZRh2}MH)I=f0Vc&eAG~aL`4lDvQf`{v7Z>vh-)@qt)n>NpK6uFXA1wG?T`AKk`YIfF@=9 z9Ff`1vQZWn1_6D!c0xWZM+0mk6fR~WxHID+ghFsCe?~*u zKnW&{H`ujK$xiZTZ^ecI)S$FF&W8^`?y-Z6@;)TKeRgVXOW?b46$xNIv9!y?9GQE# zq=)WEE>`m|m!E1llMY2i&Dw}zo3rU+AW9PM*)Y?Lzi@LAupgH#9B zjDAL|r^5V8sbzWkL=FcYeM8~)GnMv z+q0pU#f#{zWKTKU1ns^Q%9m0tp;+mqDd$5&Bx+A92?c%k$*JQ`v2o_>T-|kUOApA- z&F(X7AW#sIx7L-UbZIiipoCfsw~CM&jhe9+UWA%fimGvGXIlLf{${6i+_>0@cW7zG zEvLL}E%yGmQ=nh>t>3AJdT=51={$vADCf%pm@&Mp!l+c>R9<5RFu-Cal@o3B8ouE;D* zELOP@gT`If5#Dv+nI&v(yA2*Krcj^qs{JZb&!|R3S7OQlM4>%XY1(}AQHu}~XWF_n zjT*5PexrsS5jlOfC8(Vi5No2p&qRe)5G;_$G-C@?RC_km>#l$LHSPC_a>3NriTvBh zuY~3YXM;{4_IjO!0X4)78q|yuni>HdL_i*X?QOgf3IzJ?n%GG zZ$Aq?f%dxWT*c{av3Xon({K*{+2as{NecQ7%B5I$o*!*WJ2k}CZ_e#k)4uOYlIx;C zs9g6NC=ogvAfUs5k@Y^8q+uKPDgRux&B6MW%$W)%YdyZZlW|+L0HKZ7#^gsL+gHq8 zE?pjH`;eZFx}%}Z>RWVW4e1SAu{o0$OOh4Pqs4k7`PH_tF-Ci~m6#Yuo5E-(?TIy$}G z^zS7h9uUE9E7_Q#W^j1Wj#JFq(n_t!7N&~$byW!S+9+X*AMEgZO%*F=r~61y0>+hI z7t)Y=&G`jxmCafgWzy~-g$OM>6)+%V4QMuucybAV-N7#|O$RU`mVKz&>i7S8{)@s7hQ}A2 zzg5DgP>s=3!!FT0s|E9rn$3%DigaG|tq9`2Cg>|p?Q@$@%B)q+QD@CA!h0=Pg~hhE zecM_0g>lmM)i8l`Imhptl12Du7{)CAu#OTd@F}8d`o({2#*=-NW%)m40=(JLnnEf&BIy1!t-1-8nRfgmnrA z;CIyZh%uqHO^g6D|Mq)^LFP1X5ad3a>Tc~0Ptp9G1=HWDr+{A4Zt5?&w|=?nk_d9t z`akGPxrBBs7xR#Q?lsGA9U~8fmEx>kSJl$$t<9l~+JMyTioSAwxV`pG?Qm#-GB8Z% zmb67IC$jRAM$Iek0udq#8ko=#P@nl%%0p;)v2X)*C!kdNCg(w<<0+FT&I>w z`Onf8v-Rnbuj5gT?HS3vD>&n`U-E^6BfE6sTfK22GIJ`+ZBNyw;$=`MfO4C(_P}rD z*>q@`eqKeUCQ8HKSh%&6#-(I&1H2LbBT==ekE2Ntm?u_e5luD}R|wSmeR-Fe-@6~< zhi;J&c-N*Ze4FZCKuUtZ-owXWu6vYg!v3jOTrj#q@w-0AE8s460im>=5C@s-#ctZb>@;oHVh)8YL?(&TL^=2r752T2_VCg z0fwzk$z4nzgXqB0-|yE9RmqH;j8?BV1Q-*dzJre0vPF8Rsnn1M;8~gyY+*ZP8Djsl z@~_80(Js{0m&44M zv0M2#@uqnts|4Y-sr}|HoO8)%B)re1$G2AX6YoT)XUZEj{p$UI0%>idE~>zeB5b6? zY<((Y>*3UC>UvHeNE$SlGj&j<>`?#p-4jkxF4(5eUfO8#Ziu*BJ#3FAMEL$re!%-+ zhFKR0ks#AaRRA_X$-l1E%&$=HSS|fj@c85I!259`^bF}katBgUEwy-lq=9M;iejBL zKww|Dus1M~+R_5c7uJVbW4*Q*76{w@`L|?yeaPPYSge67h1WsHy0Axq?rbyi9nZ%@ zsgHP#`ngm>G+K!m+mnZ`B9stb72(X2k%4EgaSAae;UGS%gM}-R4|v-Tlm?t|SI?4$ zTpzar{$OXPIz+pJcI$Uj9p%oOAvVl-wKA(sx(b$PXjt!*UM?bn3pO#3z2n$o%u4z) z#Oiv^{O5dc$oDIo;~%ElsYy}eFnyqd-J74MAQnxCSwN66hMy+XLYMsF~NkDw3bhXeB^w7M;k5XZ`qT*SNn$(6DMR! z8Lr*%S_*8R&F)7g0fp(kCGgFQF+$k**;K|Y(i^K-+`@7J805TPa@@t)bN0d;&h;|A zYvp^F3i*aX=qQbjHcR+aKPAfSNxS~JTIPs*d;9{u2-<_R!?tkxOE{ty0qlGVMw4xP z9%b%v8U+_z@bc-+G|tw8PkO3*ugJoy(jYa8m}IIwT=txSuv8^-8%KB^{zXB{rEP`N zJEGr**qWp5H|kr=|3qPI_OBPQjp|KQ77*i-F_ONGU5csAPC0D@uMWS^BxEoDWm~AN z17isNzoV6f($|v8~pzr0L;JJDp5`yfWYf#2YytXuj^Sb@1@IwjcO zM5k8nX2SiQ-&`q$;0Jb44aORhgAYhdktmVTXqGa($GtKjJd-F=KKL;b-a!%e!*HT?SFjyga3&QHsiPr#7it*42_HAGTKNe#v5dR(Cq3%M86tvV8%_+sDDidn z9tA~)r8F~3?kMni?d#ewv^5uVrRQKwFc8RB)y<{wY-_!Ee6Rh*jYneB67sHY!C|w( z{wN?_&=)M-8J~u#n*wI#3E=l&&1tVl`WHVn3>b%?R9&c^8mezUp>+gWIZ)?ypzpN} zhC2&h5vl(1Ek*}JW%XXGpgC>|0p&OZKdE|`Vl-0Xa~p`h;MhIY=ZhECkl9V#NgOl_V6KdArtpmtnpy@RH3aIOF`-ku>|Et z<_*v|37D)q9yeaKy*}-p{+@{p^l|rK?f((r0*}c%74{a3#&Z($gY;#C?axs#+5V!M z6ga;Z(c8hqe$%2CFLy?1{5s^`+(5}Lx>FRTd>z+B@ID9(0HvXa$rInbsW&H@v})Ud zX#p#NS0?GMEHMj!qwxE=>C2<2lh3lR7?l^cp1g_SiX7s@iSFnJk9W{?miSFB-dlPHtST<+D1Hoi6pn9vM^{@7=D=fStvEVx`q=-`J11#oQG{xZHM z+@%tn0rQzhX@dXo%Y~i4SRrX7TIT+amXUtO+=8G=0Uxt|j5!s~8l5M&igjs}??3BU zgc!KnpO~>ud|62N(5~IM3`Hr8Mk26_31OH5}S$o$P&5{o@3eb<| zLaz{3?IO}0s$mf3DUp~x-kuLsuMY{2V%SY>Q<;C;jFm_$$p)6{KMT&IT*qZFA&*-> zQ_zFH#C!yl#Xw6Fv~#Md_v@%F*Y@tJ(*Ib-8A%p<$IvJDNOVvX*7xw0V(r_p`Qf>M zhfTe82%;r?k59*4KSGQ!nGy{ez!rk|-Z1L)Eo^AqO)3xwxSMC$k>$XF|JH@2av!(C zAxV(PTrQ{Wa>#kj1}pEu97RZ2d*HsRK;hfb1F|*(`4G5R9BnQH^`Th^0-QfO?HZUc z{4Mp-BxUgHvn&d40{VNbr;GrljD7vgRD(w44DE{YNaVeL9hfwf_ut;rZaCx#EQ2o) zph9Nbmot#|kqA?Ct%7*tg7?2<*tC1QoFW(Ewz#Ow^K!BHBG%1}1(%t?xTU$tA?QD# zh#=KX@)408E={U;TE;yO?|cST4i`>g|4AqF_`7WT{kb95a5G4onR=Z0DmSzdT}V8i zsbVG)VPeP6s!W05X;hqBskbXwWIMkz47K3hIvBZ64;@2+{wiMtAHa#x=gWNDD7gUI zy%QU>S-bzCE3o-GJccUj9!9ltutp*l3OMIF?0X~AR^D5w-%Aq!^TF(WP3J+y`SGkr zurcP#T_A}V!gStO9oEj3sVhwbY38PmrN;tiq51&f9X==nGwf0O`>mHPMnUjb(@z3| zPlRq!TDCIM7Y3x%E*10-fsKB~JTr4eF`i*1&u}_Dqmy8qnz)a`UUa*u7B-&##D0-h z-SP5qa|b6Dc;?gqB0HAmd*H zu*uTyZx;h3{ifb4A}D*MKfsF%-B*Z+EVI(P;!5dUh3xUOa8W0HR}*d8INJjM_x$8z zi*RDaDgDAD_`>^gf^}>tz(K+Jxu~I_5@@Ah5mV<@T7v_|kceUa*jGe=b}yThZ7uk& zwgm4@D(Xrvi+%1FXEP+Nd15kc@o(sR>!nRCyRk>wQV`#;;64#-N{owUyYZYt5Zq3uem80_W>qqz7X4IfF}(>7P&tkHAC@w}LqV zkX^%}p93>SvKk`2=8UBN^55&?{Qv*`6gie?g5;0zp^IaLIe55WZqZjY2s0(gbI{kY z$2(4pp)1}rKrQQWKaWWDX>iNKQ%^>MZfuk}EPl7JHhB$qT;VcJBYJ=$^X9+p?L+q2 z@z0@>6GE2Z41qk((G(wmnY1ip>*9U^_Cjhyi?W=ve+U#E*i9@0ET-aR5>4PG8_yQn z?@_I8$dyvhd|XFfT31(k*RkSgMom@o@7raXY*Q~A>Yj!It$H3ENRnqW$f-;?)`-p> zx}_r!$}q#+EBq(#P#oWT`ghf6Ex*Ta2!Zd>XDMRU_Ez@FLq< zwhm8rvd!G9I0CmKe%yOB5?MlS>k38<%8b#Sq_yEdz*a+NB4`6e0f)5oUwrj^KV&h` zE1?2i2jD%wPk6g&C{_F6cx2+8voV*J7g%4-ZJ%#hw2*U6f!Wv{KBTbyOD1w zH{Ksyso$r&i@P!o8@ZOoX<}I_sA83NhFGVv+sIEr`#Bs%yAh5mV}?c77r;9p^~)q8 zZnG{ANfC@A(g_RizK+rQq?uW?0SjE$pbov{CrqApcn&mL* zZ}%=0;+uFsEN3-DIJZW01<2M^-Q`dsZ^RU>^Q(0RA!*tZ!ddfhzppA<taupL6OC#uqz+!Tp4p zPx`b&Q!OOIuLu3$a3KRtnf!$f{tNKdPl=DC%xPXUVIJ56zEz6&n}CwguVJxvyYseG z7=ufS;G@JaUbfDum&<}*+DU9gTtRcMq-#m9WINiCKodXqHPh*zjwO=1jde@qer)!6 zDNVx?y$g9j>9csQhr}u^xQ7y32cX%QOg9F7_BoMjwX~xh{nf3Oa2qIGHUymC0Jy^F zMF*oBCxvgE$7{TOGDW|k&P><=9(dQB94>MQmdD=-rju!KGUwcRGQboGS+ zs$G9i-}WBH=p=WI>+*n$*{rWE&Kp9REds9kE}GoI2%-gt~pY3-WR)S zQg`Ty_(!~jgkdDc3B2nCG6H!K>JA0sbw!T@&@R>X_Fw=hJJL6*pz zYM2)#MkA`0sbF4=7v2U3KxjfdXHiak7c*TeS^DcLYN;^n8D2HFb{*T%Wb9(rc}OUi z&RYN@_v!w9Rajxv{Jy#Yp=P47CDb)w9b7|Ktz;@f<-w3Mi0OGh4rSuktq$yNG{MP1 zi}TaL+f0_uc9^@l1efOSx67!`5PUofDrK$T&0@NsBw=e0_;h;pT^>_nPdjk6WZ}Jx zVcZTJrCo3wso;3M%g4BguMWdP^`n8{CYT?&Uij5&3A$W}$v7%`S1+@SZHJer{Js6( zkABgT!955(u~Wz-9MdE>ml<5kN*x)X!|%0G;X7|7vB%cH1I!^+Ax4n@!N=>!2c(Rd zwd)d;M(ur8fm36;W<>@_1l@&c+{CR&J*HkyDwK>a*NH2$lxC9Mx~UK%Sa~u3GPiUs z8-@N|K;I%~W5fEeie2TpH1b|z=R15BwS5wi1wtZ~1l^mAqgCqy34%m@)e$RLW?Y67d1y?QE6>HAX@iX?Q@>(^DpQ%kh&PJHSi=w-A9NO z?#>F4DqihNbmhk-SNQEEFUy5Jl{;l@y_kp;R$G+NGYu+|=l|>&PblTCU6OS z!{-f24Bh$pXBD|k`rh|AUAcW-UN?E-THN=a*to={Ykl@c)Q2IC`d(N*YoA6@Cvg4ND$xD4t&RUdmNtn)aH?y=OB`C|^W2 zs4Kis;+s)tn>TE(qTjzh7ahneQIu4EdHl-lch;Fs$Kw#bD6sb0NSep$QTxx6zp?C*xGlu!y#u*tAZl<1Tb*m{3F6NbMc5UL_VB-#O0HmWyvEb zu`2xL-5pUaQ%&J>{Yd58AK;HUpx41O9~?nLGpyY&jQ$ZkEA5r3oBt${CUD!?gj@B~ ztJpI?j6(Pe+qfV^jFaw9vk%U@?=-Bf^iUUXnBSYam!+<^DQ2NB)yRvfQ$M#VKK0f4 zQn2cIE?3iBlzpSEUN@hj`xYi8r46_h=~|yo|8cK_T*br9Ba_;Y$cNy=eOico|c$???qo7{1a8It5VC<~N8$7KW z-!8-ZjG78B?~9WYg8n@Col;_kd$r)-1~jUPB$9RFzOF8dYoJUa&P=LK@i0cNz|FvK zZMTZE?uaZc_7T9VzD)E;N|`4U!Uxj#i3wwe%+Izi<;e2hZgW;imjX|`&@K5J~`B10E9RnEepCXwIyq~&a|7dDeyKQa2{)N{X^1J zYC)DMcY5S<-MT@tRVxB-IUB%K@x$}iXqvI`A1S^a54~BIhYkloCl4Y1IhL#k*J)7h zRN_8>&HLimCW1>iazq%C$P4O0S}IU+Pw)WhV;Hmp#YJMyUNa`)H4@R9#NS>Yr*Tb{ zmE41w{l5T;9|c@U;kVmbM)*@$wfQ$GKAlf}FpQ1N+~ud0{F{fRCcZyxINy#Vey7KK ztx5y`G+clqLARq<)u?JvKVYJGo4Z3orYbnQ`6}t=B%rLGabBMVmxb@*cAsnj{i=zx zWbA9~dsr)Wsx^nW!XRX?@t2SWvESvK9Qa7!B$nOT~l(*XHs)!r;b4YNO5G*$n4^wyA{Li++Jgj#FpEmKIU~Ex> zt2@Y0j*R`*xNR;V_m@`?NIBm(gG37O{E_C>x`qhDGZ|{WU;6GfeR2zjrJZT7dL|n} z9t5%Lp?fLfSk*{gd4-*aVy!NOoeN@hIS~EVQX>xKvW3-ew9pdYs7^Y;--xs2chAe0 zDwCgd*5_G;w5CrB2L~)W`tYOI%8JA7H(k=pexbXl@B%hSP!VIhz#ERb7Hq@Z8eK_i zBDdIi>~(_>qOVk_(8PQXJH6KBXPE5%Di?k1zRUoF`WD#YUl!+$`OE^*U5zB3kbxJ4 zjn`zBU7h~7go8k3VBY$efL^J3yB|>;8myVW@Ez*9+P~YwX>_k3n0#g>OQ#j>k^n;? zlw(jloN9T?l62nIzsdJF!YRkB8JVoU%3PPWxcF^7Jk2aRT)`t}b~b)Odh7njYH)9< z4`mhyedbKSM;eCw zIb6dgNq5;a5f8~Jo2xp-nwk$Vw8M@;?rkzFB(YEW8m9yD*p~+AhAOuet!QYDr~Wul zu9-tVF{jyfMK>pqS=y%t@FtKhl2&YJ(<;zH+*A(;n+TY`cX$BgVxqJx#Q)2Bl=Yzo z;2xH*rBLXr-l-)xdhPD@u|tCJ!J0kgcrp~-MbJ)5JYu5gsF4zB8ej zpAKIQmj~gD^ItxF{B9iPXo$t^PzcVVh2U8yUTryZwNZ}ugnU(Sby4>pmOT)`#LFv7 zX*jCebVx7f{@G>n&d8pG@!j!&FycU3!v}JMYAFPONNt&te{S!B#{r+MnKFps-cT|& zj{?e)VWvAp^NQhQ>wsW(=VJIN@@xe5QQ3Pz8eL1#RhrJ*v_~9Xz3KfHhqx*LY2Pk3 zz%GKN;X*IMEd2xZr*k54#|j&%@=W+& zV6o|bv!gOjjvq-B?< z{H<%j>mB+DWzWZgJ4L#PM<$CW``o!Lk>r&F+a*^xKR*qVZtCMtlR|7-i$>uCyOc6A zN?sepri49{GXN%-=YraEQzAChTj3B6YaY-#yO2>#(7&97(@8mlh0Ih?6YnoUCXQS` zXaKu>BlF1Po2%{;uQYRHoHu(ZFQ9<6M5z8lyamVz6wVc$>T53@;V(ICE){pD;((X6 zv8-XcJ7qq8Um%Kw?rmOd$GBk-e(%qpNa@-2>6lNhp0Ex!Ve7Z+&{xY~ezPA~Td%#{4;4!zM{+=do5I%X9<}^nFvy zC%k_22Uxhu9*c{GXO-OT{C2<#rO*SK-*orKSzL$z_^)=Xk2he~}T;UtT1LA7j zZGUa{LBHm1B_8fH2bUK*fI_rG6MXO&fBCATgZTidE$SEHjFaBVT!{F?@uK%qAjpRI zm&fJ{fRNNoSVYWDUdDGfIAa#?5*KqvQgGJrJ)3@~lk5OxVAETeE>v({8SDrnSnF6+ z@cN`;;pLVoZ@vj;VGN{B_O70go{>NFIG!@Q%NVr2xU^?NL*?Ny$e-Z-Qoi*vN5kaX zH^BL)S#H{YR7%+n;MYT<&1(o_B-I~VblHo2t0gzh_dV$;yqbHb4#03P3keplr9mYm z=O3uBC?pD|M};z(w9<3!wq>-NRp-*eLCe(mCqKDsP3L*ct6{8@Opwb21j&3@9*>kh z?jUcNGWghD?M)@zW**#MVQS$HKw)Jt@ zV-{B!RfPdrVgUVqYsg;s4V<7m9D)0b{qS=KZ-fjWHA*pWw==gxs26QzGJ)E~7ikzF z>Yq~)A@_FyJ9q2%o{tp@ptE~jf?dk!{C?z{^8dPknm3)!0TU4Aq3_~JTzM)CdBm=078HPs=U6_O$NaUAC*k8-J1@R zV;=Zx3fAEhO8Y&tAH3#L@wj~7;&Z6n>-`KpFDLD7NafK_mwn2-kxvq@KkqDn^P%qF zwr+Wd!qiuu8vT-fL;Tjd{FIaG4m+lEt&8a}2Z)V08#&DIfISxDjf88~GQmMvXfDc> zEMlz#YcEnXRm!^a++-pV6d@hUv(;Fa^S(n_92}8MocA-1tO*-6-$BDPZQ$|Ls+GlBw zgvfxkLvVVlnJ6s-hg9 z7bt@d!i0L;L@kz*vW2h@uN4N)6buw=q1DB}2RjwKwz@H%+zU^OB0%`DPsBA}qvA~Y zCDi=yqpAk>sg=&K*3iXSq*%fb8Z*9to=#cx&n4;)58AitNSjEeb&7Iug5=kuHX`xw zkJp7y%wqBrwiM)Uc>;4r;XV>qXlG+C*RC?K{o4eA70_(a*^m5_`NR;M@rIBtq6})2 z5-^ECz&OzbcFsI2-Vka&s!l0nw}&(6@z!-vLME88bf_|W``SbcvpKwjV-Zi&D*}Vk zch$Bjn~U~U!GOouG^J^>Z8a;Sg9P{Qc`WOP=j|B5r!{%)m9{fU9NIH1L?j%bTSmdh z*5WfP0~fBX zHd^lMiM^NSbP!TvbK z?7?L4Gc=>Tk`X}wYuS-`UOYCFI$|5)C2}x2@(S-*xS%-Ps=_p7-j_*TX+JF%;Fb|u zQOyfp_RhF}oNs{sSh%z}$N8wlQeCQeuP&Vsrz)-0b=c{NaWR?+$~HNMJPhe2kqDLv zNlx&~_n7+Zoyhaxbx^5cIsx)sfAoQx@(PeWK9i!oQPTX5aJE38uJN}&W2w;GF)ouJ zG_(gPBmIlD=R29_lwpn-G=*q;A5__l2y%emtZanABn*5XZS|%k13HEJQxdfGs}2}i z-CDf;99-;SHeev2pv$Eg%7*j+6ZU%we1gxiJl{u?a^8`2*v9r zt?sX;n;9ZqG6B^VVg(AZx5V_tFgFgqaD%@#PC%qE0YayXEESzn18u3M{M11*63huMZJ8kc{VW(c(PhxoBeqsOpTy7{dJodjxh%jtb9P#toV!Hv((HZ( z4=-+Ik-*nZKM8+n-(;-cK&WNZzJz{uQvtg4<_;G(J+ip598$PCV*Nm=F)ly(HGKcb zR>49Goe?pzzH>F~_dwqTH-*a?=1LSynv@6ulQ4XFHfR&-6@USAPEg^`RC-gHW3iT)oN!T5Yldp z`wuk{9<}iZV0mF9ANZ(G>Q^%#T7-m81{3)w5w(L}l5SOI?RK% zSB*iTM~&UtqIHgm%vL8JJTk-f%h5zzXG$n9y^oa@$BDUJ-S?~owXEk9^Qp~eT4s!R zxguJuL7#J3upqx^*ijtas8J;;c8CRcQ)4qL7P?6evHC!k9ofsdb!WmDi?p9AC?tc> zI0UK0AK94ewQLtG>5muS`%%q>h72vOml*81z+fcNtHh8?j^mKUI1?tRwtXP3tWCo=rRmp22 z9+FJ&#uKP58?E%ofZp%#x(b{0=O! zxx>VjLJ=SknY{vUY7?J0_Kr!E_ssS?fe@m|z2LK{{#qrJmCmIkeL7+|n|!>$xlNr* zK91=%@F^4%+OU^rNhn7uB037B`qRaROZmSUd@+++V7Kw6XJi?o!zg0r@4Re951Cc| z;%5doS+^+_sgKCjiCj{qmd~@qo*t{fdr~HLY1I86)Rkwcb$?g+Q40-jOK2L(i+L^$ z=BNfEN>f~qPil4#2Ne+J8*+Ovk$7y#o!RZ_^L6ur`7|fm0>|0OMfnWmWqsY=(6{=g zP7j{5>Kb3v{G69y-t`jatrHkDq615bBUw2pNjCO*w^gI&-HP(;T^z2h*jB&^7QR~h z8Op(Dn9Q&g`;fNu_}O`=r*v=%STryE;cY!*>|!K1HGNGW#o)%m=q(3wktXd(U)}!& zUx`wkAm;j{e8!JzVyBwtvhHiEwI%uu{z)oYaPl?yd^-JuQ|*xqZDz{4-f=Lp^GYvP zeUW-hK=N|QXX>d$-P*I>AEz?gf92}H{bO4K{+actT)9>c`1p1;@uqb-BVc>GFDK>) zCR-r&T!4?l}09r^yu`N-#qubt413KLbc5sJe%8250Kuj- z651#XMBKgkMk|JTDE}KjYNgO}#*Rd^<$$C>x>#$tlSpyCty*~Y_Rpl!IOor6n)FCS zmP5zAAX4nj;}8lvVwFjd^cvTDN>B|_xYV>|!vOF0st2A|E49t3E79{X|FFVBMLo?n zt4Kd2t{Tm3H1_2684_OZF;GJMOE6!E9UO#fy??Gnj9tow@=LT`>d-$-o!)B!Lhg>2 zJp#&QGZ-Z>0+&8P3eUnz$p=Frk9a1*&97Z%2rChGii~lENwF0w;I9*vC2TL=#r@~# z7^^&e+z%E3uCr(O(KGlB%B@+|7SAH^8k#p(S1buFf{p|T<3($CXU}H(tf`OMS!7kG zKbK2WU4ze|Dl%>GoRZ41rwwCyuG^ot)S~Cx{NMEGO@HQq8B@S5e@Cz^@M=E+8v@E; zUx#C2$IhZELF0xR_8Kn$;;J+ULEgr$NG!3~>-_2;AdWIE@f^`U_0Rjl8T?ukbH*-9 zl$}gQRH_WuZGI>Qt6^U?CE(v>@!(!gt!9L9HLUl$(Q$MRoyj+o0Amt~=mUtjZ-xrL z078p~zwn_88%h+v?ivnC`^x^MuEV^V=9{$^0xzx`M%#P%gqf>>^bh`STQA4+SYlAS z=$%}wf;D`&g|iTx4PSlQF#DQ14|b$w=6|i$p6K#>?R3gcENJg($F$y@N#b{d}{L$`i|QH8t@WxvqbdK=J8x z6P;hCimt72Ds#UC2Un0kLD3fJJED0FzW4EVAb33S+G@Zi>g2cJZIyFWf( zHUyGAS7L%3S8rK}_6$WyaILxfPVv(S;xhTMKq$X=%A-jo-P}lF=Ej&Y=-)gZ_B)BW<@H{9*<-N;yX&4TNeNHZ7hAdt zMzg$=Fp0Hl_t7`3M0QaMHw@KV(8Q4i$|g+yM`Jend*rKGrgYr7-yL{h(2OL0z(Cew zPD)(}lRF6`RrZHx*Jyh=Hm(x;$t0AUUERND{d^qB(lH1^mF~^7v^&gcN=aoBjmy>di_W(upLQ|b`$nqAC}p93o(zoE%Iyf?n2;EuFU2GrdyAUAO`@6Qd*M% zl%d=9g99lwo+`F~)PpH9fNFAtLtK5Hq%DNhH!;C#dponpqb>M9a4jPze*~7Md_6&B zaZV3OaA%=Wo=M(6k$ETzYyyvQ;vbysjbhURn^WJQScGHSkD#9i>9C(--3M<-0!N4d zR{VEPD5@~`1fB_lQmN*d?LOu80W;tY?6HS#wb7D#x-ywhifZum&U@Za4jXQ_E}5fk zIP{f+`6-8NnI)!Mm-vnyVyVDN1U4dQqY_RbR~!7srIx=!2ZwEz^G)gr3U`A|yRl0~ zeprNx`#XD+h3G1HPciVFy(@g4f%8(CbEY;*d)sY80|8}cwk^5WNN|60b*O2s}3rd(J% zdqe!5piFHlNZu-p7WUHo^G@9RwN;;v(;vb=TIa*zTM&t_gJP@SFS15i^dDj*RE8X$ zb&JiWUV&-NK;DBt58m9ay}O?5l^TQMb>{CulfynHlk3m)Bn9B=euRuPQ-J6n35{UQ zQGXY3^FF$xbF`! z*A(-B?a@}z@#GE&Jslzy*RSN|9nkX%S89AFUgz8w>Rw6SQ?)>2Z~{BL3W+mf4hWme z2DKaNGSjmARUlFHba1u^LIJS63LY5z!l23!#+jOU28nW zjS;T<;skX#i#Zz)R>1FOtFSY*@s&i?SowbacYMqCN&2GsMd7QwKIw^kxEAXROmRvl z#Su9+e^Co}4DT>QeX4;i_L8(p;tFUDMC=Rx_mzxVf!zA~H1c>~Xwq%%-VlwLvsQ9| zyn^ebRVq|xy;DbQoHYkyvJVQY%i;(Y%ztn(#>=LEpkABA2>w(eP(lXH=bOC zCNs^;M1;j=sse7}z*LP1Wy?z8^{zfA%KeH}K2H>_@Q%nejkVgRg7h#dYZF&{$wS4?6^bJR5}| zTu$)#b-+>+1^cK97jNF}Ff$un41(6jiw=N;Bpgno2s(oeEfRNnZ=Kl{ z@I9;O8ZHT*{QK^#Umn3jzUOztJv+P)9OQNOP9|yn^0zXAkP6-iw3kOoc|v2$YaKujshKwL2e&E^^72 zWIP|Qrcl~Y9H;vcaO@#fEovk==%!(#m$&*N9SoUyynb;Rg_-}cmq%#cx65HH4Ya^_ z&H1ST2VMgvkR-aL2>^Zz;kNl+zGr6W3Y8tokg!bCZZ{;phzQb`kKt!82tu zK_F< zgt1l``$x1Qz}>iLs!&;q0T7&=i&LkmCk{r|kGft79aovehLU0ibqPNdh26SNW?2;@ z6?*?et9u9}XMfayi6Ni>1Q?88 zCuHCiGUtk)9g5%O@?X)hm*N4AVBDpz7ByNH-(lq$&5vp8RHI=Y^PsExu)bRl>K0rH z0%Y4PSAtQ;-||RGh5XO61MFPm)YqaGWptJAd2wL9y_gga%;DG@xzI!fMGos&j&V%` zTYZ_cUbKBfR=ACk$A z$@qVEXmK2dG&}84)e-nSd3UecfTbUh|LH9JWlAU&Rh9DQv8-tqhQc4Dr4I6vJJsx| z?6S6zPsV=)>s<@G$W{0J%IbswlPyX}g~W+&@a*;>U8e-OKrQx``uQ-Fg`mpg>dhr7 z4N&@C@RieXslGJM9I2_x5s3GU6Y=;uFhsh&A`=S)!@r}pmy@bpY2Y(o{sP^++$5(a z5<6u|8h`39bw{RX>kvA0UH$sD3({4-&DvF$#ZMLb@YFJ|~XK;MudoPVT? z6>?)+sZX6Hizh%~?wWkvmlp$6uCW!KEoNiIrkDi)(;LtdX&c27%Uy%1Fry5+x5&QJ z7(+LhckmQFn0sKb8&GDw5arw-Hml6LqQXdApfxP-sH|*Db+*O_UM%&e%7SGZsfn2L z$W#iVc)eN^@Gh5G&k4H_4oEYJ8NVv0=3f#}%+-BKF0~WTMU7k|z!x-VYgGRkNQbUL zds|-0TYFQnyqYuo$70^1KG<9b3~z7(gfPrYyWgAQy`)wlE?>ot6<;{e8H3KM2m`=5 zhYTC|JgNHMT%s`?f8&g_J_HW$Du|qzD$HA#n(;~v8p;9=BGbXQv})f?x}KNE8mIQc%+lU>B1Dp}&tZf;A%S4;elX)S zhWg+k9;pdpl&3W<9ybo#`;?Gd28?h#rRGv3J53F2aKQJLqNN!4ms5GV@HBI`9}N|A zKXb}2`L)?#C^Z0c1)GMkr!3FVVx=dQpkj=37fxmi*?5LHsxhPD& z7j8riU3he@N=NmT$4e|U)ELNhRF~0evEKY2?Pt0iGlJgdcPnea@kM;auqVuQeOQ zL^guO9#o@_+dgY%_OPMTM0X0_V&`rWnGBOnu_upk)`2ay`KkHayXDV8wq*}0L!$uB zvAqsRG_$1*Ma6IVN!kmU z2UuT*1ghn^0I-_FX^NlBSt`cfbmzAPskj@PU0WhdJ4?%`7XE7cfhP>Gpt5phSXp2- z#;sY8_Hv4{-f3A>_-8G|FKGbe?I4luFcfYQ=UlZ!{_Y7#aIYujeMR*3A|6JWbNadB z4=KSgh7<^2mf2GyTlE)2&=z#8@G&W|c@J&7WN^5*&s}6;7}_m9u(v!a9Rk2HqrhuO zt8YvGjrStuj3n~2{yVPt#)86_MkzLCydKENC3@#=dcX;sZAs){2p&qjm!1r!IgRiZ zk(b7&=H(&R^8ZX@ZtCtX3-ygGI+i!($2(8Ffq}kRXN{D)A*dq#(j7$Y^r_BwTqrp+ zmGYLoN{xwbnF*_KoS_n@jvz=|m>7_za62Eb9>&l9ejO*15ZZ9`Lmx-m%m2#tjC%3V z1_z*FnIFg}3?Cv9YlR&&G5wv$Tc~M{2@eaT2Cl1n_3W2R`>17HQzz8E4yeGTdqWk$ zB~O~rMyeO9R_B#J(`z)K0f-koaWxdKQoUkQ<5y5YA9nfbo%YuVfV`eK19~v!V3|qa z7Cvu*l?0f&AH08GhKT#`Q6RrPHTmhCs7LHAP5>j%LyASyu?K>01b2nEQqP5VW>YF;>!lkHT^_SR2r?uB_%=d%430$(=!-P zyszz#0i$F{np1?g8G$>HcQ%6*w9jHUD=ZzZVMEjG*nv!{l~KMa=j9`VP>P{&PIu&5$8QK?NT480Cm3Z!$R*vgygk2^dkp?TJcFcqUI8@QeY{-P9d|CqeXFkDx2hIO1b#iRy;wZ+HqzD!nkxXzo<;sy+vsB)+xp1k-72c&V5f*l;b zrL3i-({6iEcLZz!ytGJtt`J~n1Uc{*V99#PL>^Cmlq+$sCj6l^ zovqx;Xqx@fqGoXUL7E#pwN4n9i!MA6AFrR7bRGqH3;!XHAZRwneCIHcC(IH{HCH~1 z^VBj@!=i#)EYl5lT~}UN3x%xlP>VH^hQ-qRa5d@$UP>Qitg*F3WVwu&*%0OU3uWBT zjn|duLWdmphGL`0sPZG#6F5Q9u?zpxuj^f%^KWBIH7*?h>k3QukT73RCjvP(b|vnB zB`d|RK>V}`BmqTpH)dFPkkKDp%XN$Jl5wC5hwR+A7qjtk<=z0#nQNYtKti4+BfLD~ zdPPRkAl82ejes5ZT9`MP{B`${0OC?G`{^w>G&eg??`uk4u$=>7Q9cSgWxZ|HEcCe? zOM#z1)0mRBH*tPD3&C(Q-NJhv$akEzyyqEnnANj>~fJb=FC$R znrV^a6}L}j83Z0&hi$pch_L2~{)1=;;>%|cz~s14TG77cy7>CHSgobcPWo{2{@7x~ z(<7cF&&xbY2Je@@oiICioA+K91f{*|(@6`I{X~lm-1SyT)=oRf2swx1`+x8tzq8ZdP z-50ry#}eaPp?od*8Ow^ALnkfE#I)?ynHJyU{_wjHEeyytz#<-V!wV2I4N$1NM!4q& zt1af;X^0x7-(R^GP&cP>xkNA9hby4k_nuj%7E7o+B}Sx#1jTSDr81*`YrNBT;do=!ZQzo36UkjtN@`(@068L4#ygE7DP|{T-R?U z&%>pEkEh4Nw;$`$J%?43+fiA&d;R7=h0S-iJ*XU6=_F73426!bU-3@PJ*7O5z%g9uN2KGSKl z5%(^aJ}^$ke<5>V=)^YN;Wv%F+w}MOH3+ap3KO$9&32x3xSmv%puKx|iq0EF)(?z; zg~igBLe_%sfxG-Wd7QjQ;xEcAk6@YUY0Oeb7a{BEF!JpK%nUhW!DYU3Lof@ZZV83l zGC$tYu+XpVcsuk>y3nfm^7IDg-T| zW;{{zFdXo+l_=o0a(8a9ekp<`-Y(`>7+rFLEk}05+9JVW55UEc z4>`gRTRy_IV|o7JS#s&p|UvVC^DIZLIdb+Z%ps6G~&AL3iy|DOMjf0iuSuE}%- z&f~?kvluIHqg4;U>j{#`fZH>c{4OC5uhFEz2dzGo-Hslxpr#*hU0mrR%RR&^wqqfo z`?K-xVu%Y)AU#|Mkg~8{b@Pnf?>^^ZTKHPKT;3!p2^w$^HCz8*U@kk`^LTVu`Srhb z_Ai=Hua2}wNY<>yyXy=0CF$P*rBUCtTgtmMq4@+#b|UgO>j34j%m!M^-4j4#wYw*_ zX#F1pjqCMZ$w>9$v59w~K+xtd-;Vh6%an)))eT$c{1JOY&7!}`WM{ro+4)zigW>Hx zBmZeHnudBwiu_L0;wVU3n#Vdd1m$U3-0i$N9J8?kPpBLk{!K{>R~Re6YZQ*kICk3E z=~H)Daf@>IJ=Ujh%&U~vwe0|M0mi9Hc_cDpod^gkN9S{8432n^a<%-3VDW)yAQugYo1o>uZpGWy=Q4j8vp)aljkYs0JQ0?XN>pe+@h>ZxKF%t=iYZot6pevxsy z?=z6fYUjMuB2Xwz+(**FkS7j-7U`Dfi~t*yhRPewG3N^YVy!_ILt6hE5iS~_%{^kes^-FS^3wuE2}{Ll;#xzWoohz0 zl65c&%LbuRtswBzn^`>@YLa0DPp{fk!mh@p`eWdUa-?UO)p zj{Bwe?~sb=K+1uk@1>F=Tte7hcT+2%tZhpDGFCOSZh516PSPFrhf2GUw!VTwbr2Rm zh5;+vOL&1E(AX&BS@!dbhz6?dGmf5DFnE@ zWPz3DnIJlHE_}N1#-A1b#W>NLki~N=O>`ui0y#CpowUzpj$P(FnrsPk@6eGE+w5$B zE@{ET;IM5&3ElzqA{S6>ULkD8ScWu~rV)Vr1dy5U7s;puqkF+wO6X)w2P8HEf(Wwg z0m^NaEqBxw#R{ep@`cc9viWYQt2Yb}xiL;53-+y8UEq46ZB1?$5xCW}%7h4}4NXd4 zMq5GU%!8PXkkm&RF4oV}Kh?8Yeagi53r|f9!GuiC{jFd7m$i{wZlrLHjcO9(sAIs9 zw|IxTC_j-lcFxalp6o|k`5!)M|2A#kE5aw70c+D{Kl9V6fVv?%>Ny^_-a=Q_dz!Qv`k$V+!WsGWb>|w+>5@G%EHX;&vAbz;{T-u=# zjAlesPNj^=%vSfp_!;jV^BYFE6k8*_y*gn)ep7U$op)z>5K$j)d$~r(im;14XJ`SU zCpsm;Bcu*aYDX+NQ@ltmIQv#Hw<|Zf#V8?LZC{%bay$Gdn_xlf&{&97@CUff7C9K= zu0jgXgwI>W{B$%CAIPW_d?^m-Wvru1Y=F@-_V|>+<;;WxEHY-gjPnIJ`@GleaMqC3 zx*GZ~DYuX6TeF7jt~e^i*rHJPGaB$|;gf-mw@Zmr3g?=RInM3JT}1xH+2{KYuh%$-}L4q#O~ zjio3i)&ZTgH64utY9svs-fdwB>BjG=?WDA;6B!UfuT{U@Drbw8IuUDxv){rtv}{u` z$G|OCHZ|UopH*&XlSf@D%xO&Q*BBJt?oOvy*xJ2|6phZr1WSg60$&SAm+-j>^Ueor zMRc$iPs5G~fZ?ug121&)I0G(u_!#-=)G*~l zo!A9Kx4a^w4(>X84d$@exMPF)cUbm}Tz_|jum;NaQ0l_Ub=up0wfXcaXijLZ=Iq?k z|6Y0}U~*P*Kji~V?JNbp&mnIEvz4Aa`VOB&n_1l3W?Kn_Ybx^X+h;X$GF6XThv2C6 zJVNFD%X7Z_fj?=gfA94FdFPBO0kFK|WK!S@h%&!bHeG#gK0S zA`xe&Pu-^ppOc%~xQsQOnt!^~^@R+vDrV@NjKWh9L!~YDO&7uX{MRqIM)@Jv%W&5? zP;dpeJ0Z~SW2VY@#>9aExx8AS+ZC=4`|>ltsL!%nDW;48MyS>TU0JgqHQu)#BU|mm zIPpTNs!J7i_+Obj;hWz4`&Cz#4-)V-1l2w?LwGv{Dfb}&TBU?2JvF9u6ch8VB3BZ^ z;mBldgIgiW@+3HAAMsfq`8!)x#Lwd=Rf-=20~NcU2JDFM`b@`s5u=|H z6erFuvf9~oPSplw+$s}n&dyiMCPw}SGIRv0Ks}#h7W`tP%B@OVJ^bY z_DA-Wb$fcUTaYNxWxr5r&x^I^=FUo?Vrw`MSGQRAjN+`)LCY8AZBWBp^nZ!(^1bDg z?OcmJd}ZiAMMN&nPES})vND6m#~phv_o_dI!NJS4Rv}_bFdkrocRgdQdyb_hhqQQj z%G-)&oPp^n*sT9yKNdll^=VM;*t5k_L=EoR$+KpMTPaJ+5Q$B%hMo~hoT06t$#0R> z9#S4J_}YTc+1<$7TghMAc)%c%#5Frqj2NiV1&Byp=n=aYua)wIPod$xEflb!U3eK~ zwqxGcU{HJTktJ1dUE4JU*WXcyluX3Wns^citWRB%aH8+iUO(A%(4P@|EDg-gJNO8w zvmE$DM+=7;{LtWB&=T3C)(z%{@`}0fU>BY&HICQ?f!U)ODEeILSQK+cNQHOuy-BB{ zsyD@jl+*wt#qn|?gTP|par6&+$3s;xg`q!h7NO8qDbQ~2^3y=2HquT5?zl5gdo~+b z**JiNl?@k)8VXdj{;f$Y{89h6FJkZv5hl;76YEQEvh0VLhGL9NCq$*-?dADTUbDeFa!9eXv1x^&GM-9GoXwq2b*!AD#C%gBSKRV1SmI&^aisD79)x27n zkIpeRZB92!QR&(6owJ`2jEhuRVT(@uuA)$ZU2_dI7FQc~S-AMA! zg8TzhSLBE$jOp!~F^X4HvJls9Fq`tHP?v9H!m=qA>R&8EE?`2*VdTsl&m;_bbSBZg z%HB?oE1T7MzX&SzjxtQ;i)M&ogCeE+>>@6{{Mv6l`>G!fAWMKBO>po1XM!8P% zcaFLoY&MSk0M^fGspweBodqq+(aA)b#43#Ly>%>C^vN-s7y<^Nf236eYTWe3JIYTu z+|J!U&fhAtX8gB~)I+Q&wk>G6gb@2_Y3B?TB=Q1sfNOcU@I?gFwYPVNRc7ueWJ&h7 z>=yB($+3A4__jIeNF>WLBD<#zb(Jvob)Cw~uoNOQlN+5I^C-yVo6)thM=WYx={AT! zl)edb!=#ex>rfP94v9wf`$}_Yrd5a-5&GJ#3jQgWOB|Y9 z))!7Mp%l$Ua^_3CfxrIq&)9Ei14zdgd~ud`qBv=2>{iDt0{pk~V?|(T7#X9zQS1Qn zING-Un&H`+6kQqnQ#UOM@bWe=bH%9H;O8|YjKnmJc+lj6^et1-aKL|u)cQAc(z-Ir z+^cse1*@@%O~?h3ErxgkhABY*Y$6~j$1o=75lm&<_rK{mnAg>;Qh!_z6hs0UX&xjc zWEij!srn*cT8Z0ce_R=V12tp9rMMVzdc-WU#a#B9ma0q5Xow`4y2&o z?G#qwssD3upR-*AT`9QCFth@&n+uNxC|d_G6lYGiZGm6rKm`M2&0A$(Ji3Cjlw2LM zUoSH+!VriMUIH-@f(0zPIN{05O2*? z5TrLpg!O-p4Omu3DJPodkv0kg-~6kE(S4D5P-YI?PpAQWcA114V}ExW(kxzyiY>_vv<$PzWl6bRKNIVUF|9PCC0ge2ZPS9rk7v+RA zvTc|>!VaT9p^p&)CtBfa&b^tDCEkTyauJk)w}OTmbnM1Q3=9MunHNZRRtWJw``m)- z`6|AD4xExg$$@GHCgUOTzvqAQk`BTiRKv{?8Y*C#_9<{eddB&WjDOqPSbfh2*0e&czbHQ zOc9)97-b2hq}^}W%uP?})G2!JC)?of$;?*`xRXTWW9_gU(Pzc|pP7`1;!ajI=z34D zd`wT`7onN*vQN0FqqXcH2OD8QbtQbaA7!fgg1pZrCqyY1JKVa~vHvLhOCjvcat$jA4+V0bo@yX3GZ_zyJi*LqI0B`;{cZ^Kb|d_ za#d`*_Ci`y2@6=I45n$El_r3{>^-PHC*G!igqlbOL7qYmCyW&EDpcTTKuYyheW*4% zS-Oq8w9^R9EHxy2)zS9+?QPV*SjvV@WuRW%n=a&<66SH?q=hs&JZSgaF`XFS2{;3} zeL4}iE$dvUW0~5TvuO?-vZZBv(G)yOW6NtqZtnQ8z*N%}X%ri4A96i-DX}gz^4(+x ztSNQIzwrTNnD_l{pGmXLU|kQTJgN}qVsO@$Z_0tflvytiEm?_Fh8c~280AQ#EH?uZ z@_;EcuLWJavsqbKYs~s5`hungDUHYVw5m%tnkS%EjJlKlH6B0(jujskyJ)<+9#2q|M&Pm0 zBOi7(vShh`4va=NAgkiX!g80rEArqCxs{M4T7`PgPsnyf0l82+%e9+T*sTO$Bp+za z5&soxCC$f@J>@LP_(j$yDyS~W;ebL}XBK|>hEGmR3!V#$5W{%(jK4$6!6)U0$Dfk> zIpVu@XV0mchZeN1A>Wevw$0?YYlsjg%RcuOF$D3K>4D_V$P7gtBdjbP>T4IHab%Se zH7^2Y>V#>_%?H+&#xgZIuF%u}8p})4+&w1ByD12IzsI;$KOhY)@h-(;z9-hZJbo4; zbF?HZQl0iyw_{07Q>5%rz<82GuJA1L+oo3>6YU{J##l73{_oJZb>vjrFNDtxxT3K; zd%YF-L6(I9Db^QNcvmMx?z1qVMHgK^V_)X~Xg@Dx#c-jXe75yGe-@Ie%+`8B5FwT1 ziegwzuRxoP^#}TK4grTd@taPaIw+G&l*A;5&`h*4UCcQ>YxzcmfwI!G%P|)NCR|{^ zGgq3=>$v8rSRjh`q6%es^>Z4-990bS(C?Lx}9r@#E>ch zgEEf9S9!6p(QY(mg$Q+pYUBKt8aRyOn=D10Bt>m?KUXYs?#c<09^h}a0?bO)ZDUT# zY`&AO*LR(ksTnWN{fDXsR9LP+p7JOb8?WKq{9et?4OTOL4y7lA1Wug`SS?nv>~hBl zI+F`Vgxw^G6Brv|5J=xx=z*`v+$f2Sa;U$^$qIUo&0c}_H9AkqZ-tNy>rL3^3Ao?( zVfDXQNXW57yH$Mt^nQ}Tw;yX`UoYBYpNACNrd6snC6m*^ogT8ZmtjHbxbrK!BU&l5 z`|`UJ$o-x-@h?L_-8%?x)D`Fq^U%T*Ci0Ks z^&_-O5%!n6AK~okZCF33a$A8K1Bfkyve+I?rhW=yDxrBIH1FWhE8D?JyPnsQKH2W>_j+zL6jxjMp4l3bL9%$;uph&`F(FhCO;g=JXsMHMrQyydDwhi; zz0MM;1|8IF-bRCk!+n_Df_4u(%9hN<#Gkf6wONNh@*ryOjqu(1%0VlItL>Z5yg-Pi z;WV!1ct?3zm&sFR$kV_Ox)Cj{GkcmdnY;ls1riHE$hT3ZLLx;))}i#(sQZ@DM!r48 zw07~2Dn*v@6g@ca=0(2cbYFEtV3&ULB2)TrU}rLMmzm1ap7;?$(%~CkKKuPe8n(K2 zBT+Fr$nh(5ael+gqut|Cs8kGtAtwjp-kPCxn^K%`7k*dA=PxJu9dgP>u{96~Rjm{j9iI`1^_E#PRg;`|Ha$SkHO8FVl`7ftU95%ts7X zXz7WUDg0tc^>;1md+&JDPliZpm82;s?Kaq4mD;o^I|Md~Tta!4+=YS~GBGBOlTpE- zcyg1rE{YuC9pJ3uhb7au_;~Og6`?-;>M;hcKH#F2nFovy7S#e$%WqbDoIvUeDVHnp zufk^lJCN}I$u7UnaH!dvIa~z;T?RZDfqA=Cf?^&1e|N$xk)Vy>5;hr>25?j}Lx+XB zBD|^uSWW7Od=NTL?+IW1_N3iV4yH?fJFy?RiyBRn5v`~J&xf9}Ih*gy?a?(BeKAjGwTXU$rZ``?}<>oi~7ChCc@EW8Z+I zZ61H`_pw#F5by}=+eX(|>FOr`vZlB~L6n%%)ZhAi52LbNtteYTTyYc^F1QE0AYKF) znts`NSI;v{5hHL$KJf1~itoaoe#vv^bb|HwF6es7K863`bPl?e@|bxHw&ueq4?F^==u z2p}F+CO$b}T2`!!~UWW&_2Q5#aFnkanJ zlO4NXKS6X!(n~kRJQ*;c1{f&K|9l3+p07dn^P-;_`n>HX_9MdQ`M>i9JHH6n;Y2XY zRj#KQnqr(BBX5-5fgw)IJEQ+J_EFw>Y&mGipzwPQO zF>&$YX<=6Ho#dIqs8E~A0`~MlevJ)YF`}O0TQ2W=Gj`AH{KInb|1d<4dlxe$S3u4h z(ByZPZz)0kZk#ES8`S<|Vv4Dr1Fwzez++o7RM_|ye*%5G(PeL5BSHta`lyv1TR838 z+^V^(Sg&SZO}5|Y!=nZ_-4h^vf;1Sfi%!Jdz>q29jfa7gp1Wa>~ zO>jBJjo!~vM3o9JN6)A1c5)g3NoGa1MI zwY7>S6;-JT?F&!C@3LV|e1IMXK89uC8+{nG)to|lIL+W%McQ*uj0CZB`aLg?kj`?G zfzYkVxdGlYz zkh|`7ueF%71DN$Mg=8-&IaHG z!srTqe3FL_iUDa-Hy<9>DD)7R1t2bKDM*rxT(4O+EIIJW!+Y0OOSH9%NF@ssTsueV zruQ7-r`*7g{gDAGYwiY&a8z)?L`NrD05~ji&r+)h@_RuvtKKzrv`w`2rQsxlrz<9& zS&ZLV9Gv_HkQm-pW%5}6b=@>J>RA>aYItq(O$EUSWLL1SivXNN_qWl*_Upx3PH+zx zC<~QmPmRfc87XY%gh1o}+Wv7bESZRc-g7woI&Rw@tj}eV&Hel;BsmRdF&p4}$Rc23 zU!1W#?clervf^?9>TCfJ9LOzX{gn1{f zj)x@!V!HFD9}QcM3)y| zY}4wt@s%9O0k{I8K%*1y>+c7i!H^S__y%Mo-h7*MS1f#tI7dUl=jEIk+CKD>I27ZKVxZv7y~`hs1@4p1-Y0?VB8?T#{-fAoCe|Zc5t1}- zaMs7X{Ig_S+5e8hmZfVE4?P#&xkCckuIn!YnK^CyinV6=3=u_S%p1R3TK&QzMi&N) zCHecpL1t%_0iKdjQK!MwDX;z+YI`;iI735p-R`|()1Gkzgn=&M?=QE!PkQ=-WIg$j zL3DyeO?*_h8mNe}hf^X~SFbcBvmaI)r!1ByI`(u8ps}*F;_sE+^8`z@3^Z@F>~|{# z@#gNXP_NIeu=lxC(%BVTZ*Rn+Bipxo5Mr)XY)UKcz4O$gMR!jzm|sjdPg*z|WNK*R z1HBOI4J^B>dJXB5st}ajzvs<^zmuAtPi*_RLWr;-1K~}L{qQ1^%SPg2rGver<;P4s z@5Ik_Em#t66!!N!z6XvuH;bQtXn9Q;XavIf*V&9N>PJEpL6dH#|cW#*}N#^~(IB!2>0F2xx*qJE?+2OaDuw4!Y<- z^5*&_Y`0dn!A<_Rq}Q(RfIiomuL(e{hY(UEABLhbwiTfR`;4Z1xIao1S=9b7E-y-V zIa_xp&z7eMV;EKq0fxjAA;E7}JU?g>{n5iw1~XPeq#s*{7vGMlpuE+N+NP4jDy}}a zOBjWTficS}jpU>07E4JwiTc!VzN9m0M6JhUUWr4p}kGI2TzIibs~E$#EqK^{i3^WaQmFOu=+=ZuiD zDdd$azr2bP)s+XcQN%gG^@|i<->CoH6?6;Ae;jk1zP2UmOt(5&9?F{!mK)d8JOTb| zVTaETeWOB z+|;sq_LH2OH{5={th~>a9W&pm$Ro;r1df{cRpk@DNKiMNKBt#zWY@Ax>ijA~2_4#% z$mS&(UKF?f60ndb=2W7R6>mR_tvz9ayEx0UE)_Xp3@O?mzYyo4x+8teWKUyal_X~B zp=6-_BlsGFYaRiT6$O{$mAG9k$q?aZ0lXXGj*FPj+S9JqdTv+@1CVh4{k;$?)qo4h zp1oG(Yz#ewb46f%iEkOn15e8<}i?;bMB^A+Z#j0;^bo)Q(o%_4hW<`5CF zgMXw(vEL{kBH!BgqHz{s=bkS5tJ!Pp7LuhruKd(I7ylSNZ~kIqDjZQ837~4>zk0%f zqxS3)`za>GnyakZcCb(Rc*Bnz7atT%VDG`me4tpW1SfK-hrU#a6uZY*tJhOWWYMAo zy0`gx3~TX`$1IqC$ z%+udvhS@&Mcfl8gnA7L?I=x1Q-0sHnvNVeO&H^e6xQacUj?*c? zaFTTwmwO&x%BSG=X{@~un~Ag}1S&iSN3bnjjzfDrTwPCQgAd&H4fit8L{xBf;m?yx zoU{!#f25gkVu3X`ZNp2_h*vzU1X7l6xi}UDI+kjH52rl+dxiEvnulqi|`9}1(Y6tZtuObj+;gFU)1?X^fGJ zEI9A4mnN;ehfrO#PP9itt%n2M#=5E=2WoVC*w=;C_XkhWwSqp?g%-xSA($LN3EZoF}$S1lr(l+pG@K4b7a&qw)s#+}P z%Dk$fr;zd3-?9Na?E6o%odV+0^WZ1GU~bZWVZR9wvLi)XxC+h3Z%msF5G`FI`-M+U|ZE9FN0= zC-EGW5+;mhAuxp_&ftb<5iUcl2*XUxxkV5XV7Tzq4S9B&b#Rb`KoY*tblBp+O_*U4 z_oP&%6_-k;&^ZtvM5X=$7RbCfE~>fJR{T9T-5JFg*DhdNagYf!K_!+D3X)TYNnd6<&luA4CPW^7bZm@oy709u zZjL9N%f9bjH^A#v-S%zOd@wyx2Sv2 zs^5rF1Hvk17HbD0=)f@ZGj@(pFm%ogDXC4-=y~VBfld*t^JF`Ol40Syy!x0ftfR9t z^7{Pv$qL$T!2aZp;z;U(Sg;>c=1yZEoh}r+jd%?+&^M;1b<$W>M6U*odnw*W19_FR zo7UWR_b$ZLj5ScFyp)`E8t}YrKyz>6Z(nAj-_!%X>j6XRp}e7y3h0LNbj9Dv&L-tg zx6|c}rPC?-p#E^j{@HWEMPT;*Dk+Cze!R6((am%_^#;IC^h=$Osc@TpP}ob8{6{0{ zUTIs%)M3mROJU}86Qma$okaGK-+{_laiXjDQG_MPK+lP|H!1ja8GQ>sN`XfYa(kOd zU1*fe^4JTA=pgj#o`+FBBHfp^KZWiWrqCpf;PA(gPnLaQl&=EaqrV6$U%l-dRr-6=JI#L4rSzMsB>lfMFSUd&SFihS!x7S!p0k& z-6Dp4f%j&}C$fCpy#p!_HMU*i1J74;93vhBFx+TX(2FZ|2|FyVF9o5R#YKh&z1KH9)(^>NDsHft&~R{i`ZMB%tDf<4K#8H09sMkl5{Yn5`$v%YT^(W`WTwnT zIsx8T(-bI}7{TwRNMod1oz+8Ko(zOthsk;^&fnhBQ1U7k=#Og&RU?nc}FqR?IpXx{pOg-)G4 zdaCceqegvN(@JPixnJ$J;6L>&njE={_UyydlY8D_hX{)GK$U*=>l3x0bH_DF0d|hj zm+-;jUyY;Kb(a};nCQjozjB5v6FbPj5@PDohfrBkWyggRrFM%uxiY~;6AYlq7_yXU zfwE0aFnTh3kS@tF;!M+=PS`o-Qh1!fTZSyYh9*DB&-D{JPts9V{XopMm(K0PvT z-}R(5+m&VL41VAJ8Zgc=i4S`Pb*JfsFfzgjEfZ(?x7+T9 zFd3et94KD3F022ZTjpk8=}TYSR8aN!+W*P6Gd4Y6#y$cmH>#6P)0Z6L5%6usE;o@G5lL+;?2QODsi-+?_eUpB2+1>I8tX z>s{dq*h9kx7LHHA8mF=)${aVq;aHm5Vl(5R);8`iU8S`R-#@j zepPA!jx2DL?gBqOM zKHv+51q00CfJ7Qk3`wu`64&hUa;vn-xzjb;5qvUl9~_JDE44eUFacBA(K{U&U#~a0 z2DL%^dqP&Lrc~!bcq!^b`at`bzs)7uid?7;0DNdLSujG~7p{U%=h5JQb^-$CLv!+S zP&fRd!lJVRNbf@sxIhc?Vg5)_=v+Hb>n;@n8OdjXvF^(6T!!UJe2o&v~? z7G+iF)sw*hP+3G`Z+27%3JVR_F7vb6V0yZhZ>vH;!I6IOQ*gz#08f9W(~XyqXbMp( z1c|S-+7Zg^2NCaH9L-tD(2QkvFvM6q08~nquKJz$uIF`N1t6Kmw1B6SOsE)%HBLY;{it>ER*7Q)pRfURo>q9|U)zj}QQJ+N1{%@0(80J^FEJ zEWz#fHi;uZx>pNrKb)SnzUkUhm&Cm1X(Jr}x?u1!GxFyc(HwCg?A=uqG%TAJUi-oH zqIY)?*Xxqa0G7dTgSEFXfcGVgkV3w~S67*|n%S0p7l|=JJ{)tR&`i=^z@6w$cy<`- zK?-@%tUs^98RqVmikD_Y4_Zr0Cw}oiL)lxJPac(syQiPpVSQzI;K}(X=|GVzlCo5m zmlT*D{_nM~bEASMCfD0ji59SWi4Ts&x!B&60Z!NIPywVxdH_KP2uO71BS04i0}D+R z9|V;E%M_IB8>2|(hTG~D0qX*^>-U>SY|llE-m3e9eh3qe^Q1wunb{Cq@W}w8>h=qw|R_KrvvIs zjp|3$LA)+Y4$ZBg8f-#hGiLqdga}N08$||`Bej7o9#_fnjvdL8F;I!jrby^O9Cp;j z7^leuYPRESN)>Tloz38(vIKB8?M)4WC4uTt)4!OLXX1f9X*UC)$=!sY6xQk_rgk!N z2(C>c$9Fx>&A<(yS{QDn3}%JgQ6&!Znsy)(ib-I3*0ZcxNepCw8cvHLQK&iK6MGfK zX^R|p%e?2edu^R292qd!B;r&2fp2IztexnYQ|_KwHgm}gs9U*{e?c3^VVV9E$k+W; z7!dzy0$(JP#TMzbX{tTCo?(`D;dY>^Q|CLi*H{{sL=!TH$)CL9j69nrAUuQ$MNFJh zGON85GsRO$T%cyifT4a(;hOF$jvC6J&CT&wbz-$B@a(1p2k3QYFSnX&E=+Iq$oV^; zn|4ZK*6lK+j-vtUs#m8_@QG**t1u)zc>C!kWgKr9QG6$s^%>J%!s}C!*<~_V)j3Q{d@_tl&4^sKg4Z?8s^XxQx_vs)SQOypzR;8*U!s$qKL?M;%y={?B z?aWAz?_{GDJUotV9lr7e|+gOFNX(M4xt=rr( zg@eBe6bk^8f^-}v&NV^?7q^B@FlA6u2a7H7{esCI?s>H*--iBbY1M(oS*_Vz#3H`M zl&wC?6FRB~&|kscx9fKVMdEA6Ul!PIV0}}~aa!Ux|LfHF-)jFhso54Og@;g~t&7UB z`M$;ZVv-YZ09n>g9ko~T<3>*R*ZXVK&I3oTvh4%KnyiuTL3nHe=^it1ML**WQ4JSp zE&*PQf|k@U5)=ur99YGefm{F#4@B#&tqu_`*u4y7qw>M$Kbldlt{UC#6#dcSbUqf= zmu>N_8`RW^OGpymg$hiwEyP{gBC1m<{5RwXo$eOwN!A&M$b|#&9)=4L$qaok!yG){ z#E0Kl!jm#vzvI1Nu!LtEEtvAA~^Fvm~}vMkw#ahm;U+ z$q6=ac5t=|9Tl7bQ>Ok54c4y>;~CGeG`v=jD7uHW_il9>T=C7ZwL@`(x}gu5#<<%*F-%hNvEct* z7K^b#u@sn_LgRRCB<7Z4_xst_OGaALM@T$B!&SJoI}A(f{^`1ry4(*QTk~OI>m3tc zF=mwu^B{c2e3PsS6AI3LLbLu=b55R8ALZYB9d=ggL}*o2SJp<9WYjwz8Hxe=(UkQJ z4v8J(1SHeEAa`h>NO#{WSC%AR*3N@!;98g3m&I+BP;LkMnP&-rmpu7>X~bh$)d4#cO?nBa=rT1mz8t2Yi+6zc*d z=u2vQkQbrdQ%vR0aKIBIKYQ2OqNj#APvh?2{^`R6vr8QWqu=dV^lLm4VCIJ^Nrdbv zpo+{!bCtMQmSlSRx{Q;A88hW+hpi_?+_t|%BnEOXHX7L|&K0U_hX3!>J3C6P`}g`; z#q`aW3(=cRtU@ZKIjWI4#gC45rZ))U!bQ?vJ5QrJ}+}A%8Q}z&yXQcCX*Lh>#?UlDrmAD>8bwO;Cbp+h3 z$;^=M9VzGOmXQD$qFY_gIbdk%{25qJ7k@*56R+a&!eGW{Gpi?PKhKuR#7r>M%W%N} z7vF@625o*UVlAvtY6}WPR;xhuu6^fU76#Ela%&xrR3iT4PTMCdO=wiWmva!6ne8|T zTv36uN{NdHxYF}Qd+ee@ySuTNYoLh5k2?ydX8E%~PqOJKjf{BpgN1G8tU)G`GjKw>o zD|dP@=$GSVs#tCOF<@b^y=Q}Iur`wg^~8OjBNG5dK)Js~_+8&tlAf@aF^ZsCxGW~8 zlCmSaQ@MoIE78s7zHabKGGMMC2o6~Z7fxu`+X@B*x6D34qbVlgHS@k~No?(*T%bXm z!1*WUOsbU!|G^R6gn2)yna02>C^z>rqxbkxsBO(dy`lfLEe4^lM|(2zVFh11IP1%; z2XY(NHU2czg|D@Se@(kAnX2wBiFcEkxEgH9KItlj(W6|uNzhUp`KC%3>wEZRs>C7} zLONq#ubKKG+?&MnuW^p>`KL!oSWB}Ioe>d%#|N#l4rGg5Ztq*r3zMf8O$gBdm5zU( z`6=UO7WkL+BNnc_?7}O&=bD6>B;r)-2e*$GLe=d(FEy?}J)oG|KO9FDe*xYgE#9JL zKU0O@d+yC4ndzeY)x_H)!jJ-`2)GXt-_^mze^jbv`sz<{KC;?rP1dVyOS)MuRMi_r zYM?|a?$>Li&n;?jNq}nt=z2zKKNMS4CTLsS`8v^JjZ zBjUQ;_=p$mFoj@B(OK4x52bBt4PPaj1if9sNo86Sxax&4+EBeZS~|Q=-A)ofUg*x> zxX6!J&h5C2-rby@p$&fR){|FL^-jtvXZBgZg0%vdz42yxp@X{mTiF3>R?iBB@h}b|k(nu6}^gJu}|b)Qx#^*?YCHJ$6)Na`3|WJ35RB8`>Ut=hk?og0$b(;P zE}rERYn#7$yzn?V$F!q@ zeZ(LFa*qc^?*}SSi4M$-(U~sLAk0;y-&`_VnJeEGb%qFPSB3tWiTj;f6VMqPI3;iA zCGaYKk%7$U{rIUA42rC$MKSA~2%u!(Q*T-Zyyk-aW@W))voWD^uP!FSKB%RT?-nLk z)6DhtRh*GdiEzj5YR~54&&3J+1OXTUnB2ZTRpxT$4oYYQ<7`_|nMONkiU3Me7sTK3 z;K@gRt)P1Xp6739KUz>HMD22t3JvfW+D)limY!*!H%DzdqkpmYXwm5UGno@QTa+#J zy??rO8`Yq_&o|B>GIm(%W6Tg|YIR#rial_f6UJx9Qz;=CB-d%}9m&ukqfaVUU-F1) z7&g;N+8LO(PX(JL1L4#An)6_er#nsS;2P@HFEe)~iG|-p)lM}8?j*9+${q5i?AO|# zUhW!39XuufzorG0>`-dp$SXEKSWx*Z*g?$!lq-SEWW$OpSSCQOHWWP?M9j1WD7Xb( zdXjw}PwgxmYgBU-pw`fu}0?cJZ*Se4!-^p(ClhoS=XcC}fmt_s>suJ*x0T z;ADRbS#p4cJ|rzWdsb%~p#i~W!U+FvpnEF}g4;MCW;EcMC|X0JPT$5^foYxfSh?b) zvZKQo5BW-omL6+Q3qi$JLuF`lx4pr+j4-J$h+YtRk}h^l0ISodiu&wv7SGT&=QM;= zY$E*A`rfRM=MScnu+K znyxQiih=j&GdSz$QQWqaYk*iY%lFZT6xk%p;L z-LH6ERJ%C2S2>)%1IRt4)^67x|u7KhMKkU-{B7AwN|IhWE=PtU5~!X5m1f+`g^m z{7e5wq&&RQ`0omNSmD&RFy_lsUmI&hc&TzC46t;yFknaR+E!Mf?_f}oeNW_6?&e5w{0 zPkDSG?5QxLJ4^3BMp(>VL72 z{)&Y~aGy@kGpXODX>Tj)@aNm1LjjFTm08ckVab-pe+`QD3)av41yRKKIACRN-ALwshtXN24`#P6! zLD-`|!JoM~5`2W@3=R@m>VxT{zv?CYk`m@lmG)NdRO77R&s$8bxfG3oV&&fo| zv|ilY*Y8`oY44)-wg-6`m@d$7JybB_Au6>?dhi`-x}1K|djl)iDBH;5dNV2_3A2+l zamvq{jAYL5B{KO?vxN^5Px)Jof#ULOYW#4J=1~C_gYF8bQiq*Ye?|Md{>vrkV=vrB7%0HD@53~V6^+sY(yH#D z@PBqI3BB~p0obO7XRFXzH3z%ENtXe*8w4B9>v+Ai`CUD1785@iFZ;Uzg{n_nh+noP z)iAU1dU0DtD?2LRdV*{P(6AQ^473ZRdpc^n(%mCKB!nn@=Gqa2zdk?u)`NC%6=7*< z-o33(a3L!Tcxy3}0&GG1Q>d%S#LRy7D17z`nJGr${x(nM?sQeeFHarl*!P=3%q1mz z@u^0a?7}3X=WUXk6FpE%G~dAK-h`AHN4$(xuO*U#h6$Fm9U;RJ;>^m>OmV{=yEE7{ zxx;vUMG5jU(d5iN)CT7`X~qg=X~n(a+Wk43f6HPVn-U~r?hN&HMnO0TE`oSlpdR*8 zEctjVlg?${^`V#^>v+7BpZQD!dqLQ+-6$tGG->0DDiF=UBZep?(pZ^eA9ytHnEY(i zvmlf`LL^*T~&aH~0o`@~Q9_90)NLb(*<|80P$EN(Ca&;)CcFYI>MeFw zY4H^>Blw4}76njrYycJxsJ&qYRdA^6YX%>X1%)^hKokw!hQNFhuk|{rqT%d!6Qu4T z=7B9&vjpQX=CpX>5BjLgpCOr&&}Er__&8*lxB=F>Opf@1^~jV9>x^rWBNXO@r?T`lsFGaK#5 zsGu_%7_RN1Q%8h0@1E^RYTbU_Tcm_~h3X7ObA`3?%h?8*&+!_7tXcBi-}qIbZ71y< zPT0FE+V>q3X{wntFKz1H()D&BZ~vMCx+yP+0t3;WABOMxdd6}D5NjuDBTc&_uX0* zS^dQB$BG2yDYf8UQCA2&=lI4O{S@kN-x-f|F@WBFiYksJf2kH%Y9>=K7$3Z?LZU?E zLjn*Q-}u?qy7ub6-@I#ncJnFqA1VG_UP2ZP9Ou0(`2WSpaFdUtwRNP)*W2Gt;B%U*lLREb3%KyA#+TFRawlRj>ul zZCtdPg<}!!rdX-IFJTz*cwoR}a!Ha8B8l6t7(0Vk8UB)gBSdI%r8Cf`$T;T#fL@(2 zVCzU3rsRn50&{{9LpPY+1-PfbQ@{NhyfJYnF((Y$GIRBcE6y!!ypO;34rOM%Y5xlu z_EwS3SRzR7@@Y33iw~9UFr=v5EC3eNHws_-GF4v5y9eTg##e1VBa0=55!(LL-*WZy zoS;<}9P5Lf9tK<6WzoJucbO2~M`Fa)Br1+!WhFa&pLd$#Fz?jIzntDj(p~!de0fWI zCg`XClF{ErY6c}`S-~rbPRSRkcBp4Z?$O1I#aX1lsu2Z_yLDLx2*8oGhM>buORdiu z`4@AY-qi4fueD7}8xV!aXEVGf=*N@+ss}|O4O)TV_$ z9)v;Ba}~&y&~3^_cPD4)_Z~0->SasE(5m{HjU=e;1|cC2fyjax0kT>a7vLQ@?P&c0 zqbK9+Ko-rg;Q@Fy`#bLSP9e{KcPMOFFp0JidROG~ zZ^&;@D;QT-q>F{%eJXpAD?94LO6izhnQ{hk(oQx?PZjGg!Obv;2;2Kc*hYsH7X(YG z&&F8hyo?%NddACvfG2l!stg^?FDeHhv;EBVm}pi2sb{6x#f zfzUaGmtE*NXo_!SJq#SW2tJGsK3@D;w;#WhiRCTo2ZjCIQm(OH^`1?f#&=o7%4&i$ z^r?P7m@9CM-zq)>*J9yu^axR{;+S?mYibRbkv3kN{ATLr+<-l+ff?V8wN!#># zaw`V7C5L)5hso;x{kg=v9~Nc&;)iOM4s0QxpIp3&ugrQTd_t1h^TuBLNks`A0=9QG zI1V-1$^p|)0LkH;~M^ z+Z!aR>D+1#te3~y%K#>Kw`UZ0Z5d+odnheuA%0fh6Svw&iMx;b0KglBvB!0rkdqx$ zDlelVh#j}iAvZRadQ`nYu{HN5|NUG9qiS~x@J*Xy0t#ZfzUk`Fk-Zcaudd`+=Ph?d9Sk?1 z=6KI}m@7ryN*7OUzn_~!E{Cz5*QM{#j~+U2-;0De32}eH6#=E9`wZ!f*tPP!cMH>I ziOY7#06#QR>-52k>zn~o9Wb$Zr)y}KE42!>9Zl47eBs)%qNC3Y$?5Ii;F7H9!0~^K z*OB`4LT56=ME2Ea?diMECMAQMfXxJuDu)l3%58(QwN+2$dC~l|?#s!{R_g`N#~?AU z*Cq$ih=$agB{5(vn>L!q_Gn@VE?w?MCQE728T z+-`HKXaVSR>74;m#@d(9W%H!I7Voa7jH0dIzkQ8?L@@N=O)ZtwCTuC}cf5mssBRqS z9o!@|>pt2jjeCiv-xi+zS=IESSB;5c82HvQQGu;h5M#Kd4I9mQ3)X?QUzpoWz8jiz z1KjNUKQBeadzj^50_bGD-RUuJR!w>`PQqUQPLU=5)k{JCrT&h@3qlfD7p<{(Ug?l$ z4VM~9cwKwv$kEQ)Sg2RB`kR5-NU05glKO9!;1}PoXr*&2;6V8E#Lo)L=E32MIvo=r zN}*jrHJEiAruhgXd)ay$9%hEw6S`&yu=Q?KX*;WfmFuP+zCvoo|Fn||D_Gg}7Q~R@ zg9J^rV0x6A4WahfCOZd}f#V+3Z<5NvPGG@UFt*RLO}Rb&PEVN5rfgUOkh|r9wv!&? z_6FuSn?DjK3_{6FP&K~C&|Nq7iJn@mG|*Z9X;eFxOc3T+>~;C>Rr8wd;e(~hW9xDJ zFSm#`O)-HhWM93>)=7Mo?X;twM!$3IWfJv6Dp*=uUq9#eZBlrM&6d=x8fjTUH~yD> z*O=^tny0nzXWU6O9-L#p)ZpF&+8$3PLSfilaz_z@*rD1y=K9@=!^9&)jN)nr#>gr? z1HzgOo}p?1s^-!)Aqe6SF34ZzJ{RIYBn8q%hTnUz7{N#z8pOlP*gx7{RYMepftM{X zCRme`^d<+8i71Y^*p-VyYIH;<9D#?2>Dr2<0AC$k2<0#$bW_THiAvd%VZYL>QTO`vhu4CSdC! zu);-gh+-A8*0D^t&uPGHSUv!WvF(~ePj)&;>J$S1_FtM;o7@z3seAO$)()y@rr+0M zFbW@GpS+br!aK$5rCCCaQwL~9d&L?G7bB3;^8ZzXrlIp0OH`jvV2W!C7n-+3d=vGE z|MZ7LgjoxFkLB`QKm0Y{!0gZ9rC#TFWpKE{E33uh!DG&V-I|*%JdxOjxe)ANrr!f+ z-1an|%FS!I649L89ZF9X8;&^H@Thd+sleDF1~75|17?Xpmed1bH*i^agg5(xJp@k( zT{4qWDqFJXQz9uD^81G-h|{&NDMz?@BlTOolAYphN!1iY0PnA}64O%}{WsM(Rb{%d zPd+n>g(POn!n9SGi}i1#R{jI47#wZdwgEUR+G2IGA59j$Hn5&q|Xr_SaU{F(BFGj_#$>(t;U1sG!T#S z=PL!$9~)KVQrdSgBMh{kC_2*7uBn#=zu{dInlx!s@(j=cU#8tMX_S|?E#X^3F1)kN zSs86MO?W|NDQ3y9E_yuN?wX{a{~DFr;RUdOftdp!2oAbJB=rTwdo$L=3NZ@N-WpxM zK1ZKLO-D3{(K25TaBD$AWEfONl7ZU>F;3$@VgBOTP*`uVln%#=4E{5N0x9f#Ag=>o zt*W=zvnx;K^?V?VA%*)9$n4g~BabM#VW{_|oDB^-7lT^o+UmwlQtV#iNBvGO5`mAq zC$h1rUoLdklJBuj-md;|`)^Lkn~SD6T>3DGY+9pKZ1;td`{uHj{zk;k2ARSuN9dQF3{Exm!DB#rnyB2c`*O+4~nMJwhqm9_aj?w>D4Fvy#j}9a?I)+uJS>hpQP2IvY z11LfHH(L2hf^6RVQwr_Y_Eu*wv1jR^)f*4zdik7{U%AFf*?o<27Yi-?M4f^O35Ms* z(4gN4rimf(jg~q`B(?f*!bUC zDi^$Wb2Hb*qeJ@QS@#eJaZn-%YenmErmM=0wj)2o`bsRQ%OkoaW!5Gp?eP)M2kZ>| za3zg?LK1HGC)yP~CQ1zPvg+6)Nf_VD&Vi|;-K-JVT{YxfCUzp-K0?x?D)y}o@k#5k zRBxnpCM`;5!H1V30&kiH_o$LrP8^QD4!EqO6df3TJ_Z0qn`kr!qI(m)riu2F_dN{0 z_~3bI!SO}&_J-&f0>kzAGQ>lsL}3GO6BDR1g)ox?1m}*MDHb`r#dc*skv%H#+wkBpId>>xKl7^t!_-9Eg`c>GxkpK055omw z1{~Mtrft;O=+7`iri%QwS;+%+OMh{;=2Paw&{6P2UbOQlk(bNvy#=JRx}t&#p4tBr zKlZ^Eh0ePe#T7bsLz+wR2_!$k{kfs&Q{`+{M5egh3!b_)gR3slkJ&QRLtJj0sv|~n{fE{t7mgppB?Xw=StrjTxEmM#_wa>2fIk<;3~hrZ3x$OQh}*mVLh!P$51 zW&2jz7hAkAF(NsIm1;945H!{)57#TYErq1b#kV-F-%^GZ=&5)fa#zwGH)5q&*?5jU zA9!fjHt{F7l?bXYsaY;i@JJv)QHGUKX3}JH0@o}uU;_IM6#d#4G2Le6=qO1z1+fD5 z$a=x+ND@a|@%vvD1-H&uh(_{uUOZEe+C<+`sl zl|3nvHN=fcZHk|5+$YqJWi|}V5a(#&n)hyDly7D`nc8A8f4@fYF&)UHn7MKh4DgDr zuH1(cNY%(UVV^But}Rx7aBdOZ#60Z+^ zMI{Rhk~b(5)o^9-TW4g5Wp_&Iooh@Zo6tULD-`OG8&e)Z_$#<-`A3zIe!Pe=2FCBZ zQ(kCg0~}tCad~|N9lJ6KMeviO4^)JnyS&3Cs4(jxYM?QmO2hmx-qCFJeWm$d39mDp zG4$y*>8Ohz!I;%ZMHMx;>i4EX(eT&aJ>H-W9RECM6j?;b>P4mb%!-nx;Vt!Rp@wWT z%r?XH{k>!5&{FN0fD)g5s*Sce2k1Z_x4AXub-WSZ-; z2q8Q$UVyKRLE@>J^=Ec#BN=B0>AYxL zeMq!fY<;iD+=k{cE|?x5kA(0*A~)p9kehXI^Xs92x;-0kj=HkBQm6E&X05mc`)7;M zkx&y$;kJhJGAYO$DLy3Lm5$g-kxYVuk|Kt)%y2^QWhXZZLhqA>#3_ z{djuj%=T(gizeL{$)Vdh8Aa-Q(DE*FW#;`Lkl`*b7Lz0c2GSS7MY{p?_i4r(b}m1&shvsFk$s62Oz!nKf2BO9m~kS{fYyyaxuc(A6bxdh;{Jp&Oc?&^$IV#Lxgnfcj#h=Q<*DRS?W)_9IZy#M7^7lo%sWfM^W{_ecpn&VL>` zv!>(w-@rZXP{2+6!+db$y$_hsydy*Uu1i7)qnUF4c7ixP4)nbRf1C@_)AZsJAArF%x&ba7 znp@QaD3C;Gj?g)y(?z>N0EHR7ck~j1{HE-xjZk!ByZajkgcgMh4|AH32xb$7cstni z2+>s&(?DGyLkVHOhZ2mxGn9XAq0Friy*n92tY`u7YPG|gOD>N=ckqC7pws_H2<+s* z%(zbHWRBq@qO(Y@SUy?x^X37F8Jk5x$TTEc>OM^@b{e(b=LD0?7V|~w@P%r>xF2tZ z)W>(Id*C03OPtA(XDGKBesJ}$8&PfG)r?7QIwTvc&Uk&TZABOK`>+K!%)isxlf%eQ z1rgdzfR@fv0oreIW_Qltw|Mr(%8KCFyl1S#bDdIXZ2pWn!De9kw&FU4ErvD5nsedk z2&K^@fgnWq2Nv=~L$?=e23t6eXHanoz*f<)U{9k3M5v4)4=_DVZ`k=0QHmU_nG+s4 zxwzdy=#>%EKbG>mVnS9y*l>UV-U$H}y}-rCipAJKgYG(V@N>1_7@bM2We=ZM$DKmr zWiOzwYQ}RM?cL~D00Q;w?3lP#=aIh=&7_TO)}9c@=(}cYe;q7uU=hzP zlm8S#m%w@R-rlhTE7|T&=Uj?69<&}u!L9^u*^;fY0 z@{s{$V@{P!Ta(K6Y%(;rjtchHpNTP*`RAro+LpPKTG2md-hC##AE+5dld6@Ywj@0R z8>2AZa8u#vv<{B`drBENIAl})230S;gmuXv>6s;mr1S#o%A!)JIR-*`&ase_1sOOz zt=6U1qcBaafdR?{H!iG1VK7o#V=#P>CwXdKcZs;#ThrftZ&q8YCN9buc-79+R>S`;_F_5E;4!*+cKy$!_GQGr=h3DQb^ z>Cnfe=OV(9IpJrDb0F%DS%Ud+xA1KZ$y22TTi@pU+HKOU{aWSxOQ^xrhhDPDVsBi@ z8oTFnJ}V!w#qg;sw8O*Pl5coDT8a>IWkvl{P`bd3%G-^Juke^eKt6<>z&L)qD?}?K z6or)Mrj{^FGi~&f=>u{>wYX-pT35x*KMY3C6No};iL^tSLwD%%7ciQ&B%lF^{3`>fcH#?klM5^!i8Ovd zO8`Cb4_bk7uH}ws0a@)8yo8z4x*`Sua5<_;WQ@^|>1?!Uky_B#?Q;M|QeN{-n6%*} zo;KiQOUUag4<4AD>Bf{y1)$9=5mP@HnK0h}jc*owO6IOk5(vFK$#pX>T3p%?V%kTU z^Zv@Xv-Tou4HI~^XrZ-Ruy!&vpDWK$Xd z9-mDm!Gh98g>RW|c=jTh{Q4jGs=A*b=}Uec+eIAb^%)?d%&2gzvF)T#xDT3hfxho# zN`7pbqd+H~KE-gMv1)eX%I7WkxTu1YNfD&w2kUfYVXaRaF;n>nv>k4;7liypB|k4X@nz2Ngnx|k(- zmg_3=u6lgnVh*Ja^4s#5xR&O-qEZ{6`H&Se#br#j7Ap6kHR`3&csx`W_%-!1JQ}Jb z3SQC^T~~4DBrF}LCR&70)?>&BRnVXq5_-xUf80KGS6TY=~oU_+BK%)jz9Pp<-1wf*=uSr zLde0l2gPfR#Bq&o8iFLO(8GadbZ_rtqQmm?SGHcrlrj^QAQ(%yP~hWwu3RiVxCpZ4 zc_0vsJi8oilr#HjuUhc{2wl=bx;NHzs~MplMUhW*kWZwiNGYzY_$Dqt{Y|9dCtmA^ z1w1NdU14f5(-l0Pb8DH4IvdZ5KucQS2}-K@QFu2^NA7?TIo%X0SMq5>%u^{*fwbI6 zBrrz<`8WH?VMVjbPS%kxo|tapK#e&PjDt@$cpHd61*O_-d7I0)x3PS!1F+Qe;c#Po zm_))FnHP039YmI&R!IJGTC?$*L+qs+w0Zz#nP6%pH27Vy`c z9xy6nTQ=>BCCdN^|MB1AeVw!9t@1h15w2-GET0poacSUqVnuAC^Yaww{KG)~*TG)t zA=Ks~$L+p~7ufR9;c@=(0`^M*x!t{bp6g--dKP0O!PW{g>)NueDX= zx!&9%h=VIAvOzm2EK=brRI!vuxYyVIwoC48O&tlx6~)U9(;Z8T=moMujDX-POXPkUQJ$O{%DoZl0js|EytDe!v|9U$W@ zK9CwwkWqJANZy@Z^9x`twciI9*cR_-S8K*vMqbnB7zz;w4+@u6kaf9s#CpW6#Pqo0 z=P8);C2?Tz42=+zO!d(?YPM+A`6^$R8s6BhwvzyFK}mvDtHH!bK$Tb>=R|Ai&h_JL zc>(D1eo0Y-n9{!NsffK}E`nP4I<5K+ z3d{pt-6-L1wAT-c@i)~v_Lju1YVKt%!{QQ{FuQkid2#(t;T2mwoAC#K>Ljl=N5lh(ry-ZFpQ7F%SXzYzSH~jqP?BZ!$z@U9 zAahL4zLVdZpe#;zSNu!zG!z(0{-H6%phM)3OdnOB#^g*z7Smq|K7Z6#=0&TDscr6lq99`P?)SdsqDsHLeEI;3qs7rmD4-G1MNBs@Cp*B+Z z)-`QL3PW=zQCIR_xYB`}PfmufuCfNz)J`;$kB`rI;$_f9H&^?)e=G^KB>OsFA$X=< z6II4 z&gLHDgEj6`OwJ|}uTo$|KXr#ofKCd$cfH-vVV~rcY5-@+F_59E`H*+XvxRZx;*ap0 zUzmi7h@RL-pC_H)uG3vALlVt4fq$m*t%^>>`IS?mjxFKFBs3lanC$l9SH>WlW-Q9m z5e-+Va0+VZ1*^P@2S0qVs~jp;M@%MmIeZ-O#Z5=fZz89A#mj7%u(9t6NY4pVtdQE& z1Ab2InQLdd|3f#0#azG;tY5(lm+YW5GPA}DRf2RF^{Z7!qV*@LOsS|BZU9x7q* z96;PZd7}F|?dv;BTU>)_`MU!pnjdS^GPn&mWNxY# zL4rcs%?ydMCi6UgGM!aN>>nKK$r=E(L=K(^pHs0mLiI79#L~=bseRa{sONkO%T(Vv zEGDl9cwtH8B*J&dld0}s0wa&6J-+7743hRQVHM6Ewprit@LmcZ+75Vut$)HTwE#J8 z{yUO$!tXy~NGx<%eq=hl?K7ybB!*a?L-i&D9xhY#;CAW7<6Y0v5UG&|EASU8C|h+0 z&lhev6SzO1rg8f!XJX}$e;A<&c3nWS9&*gor6u-m&e*b4K<#3Ibu0FQ7J;2>$s>m| zi7L{rQ6TjV+RwYih2Rq9bNo?ySbHSj%l176@>l!agl+Rq7`z-xI zX7w^sd}LPbWXl`hzU`Lu7KpCj$(IXRBF-p;?%g;j##pJYuLSO4O=m;=OxT7UwVV(8 za38Q1I|yp&pZW>S=}&D-7I1TgO3Mdu$3>N=3Z329Wr5qrcvpjx#0*Y$PUXLQim@{j zg`c9db5bPX{h{-~%*7OCm205JA5cJKW+H6-I#5w_+M*)l+Dgzc_^c$PNdrcsTBW63 zW_3?8Ixgvdpa`qWQ(m&$I{{DnGM7MFjq{=hd{1V)h8EkkeDtfhu;`W8`lrtInZ?pI z0#WOgC?3ye4l=F>XB{>tTAU{wN=)Qwdvgeihpiqd|E>x3XCiTW^ZsRW$iQ4~Rq>!x%vXF0IX zR4)eb-v`~_P1Ov}X{B0JjJ55ZLY=a^n4FL^;azhJOfW-(d&^6_Ven#;73?qa61Ctv z0tuAs&dN`DlK&`SvJzeI28SnTj{z|kycm#Aw-}%jj9mP_){1XDg|~pb3$1>FuS16_ zxwsBfYQZ7)lNxUFO#THtFD*CbF{Z6srCoQM&QP4u4lR2}CZ1MA&ux`JIKd?AwshYc zHUJBmuI2gZQ{>naPJLo6;A&?!SBLequfQ|PYh2^0q^ox}XaZS2{b3*GCtS9Rei$SW zi6!28U$VH4afgRzhl7wgzA7)4@?sCxtH?lUdavuR0- zmf*&nY16K{h%Ctz4C=O)Jy@G%-u-3H?#1~)Sbl(H|6lcPU1x}$g_>coEf7o*H=7{S z6{-cY9ki+4=4T^*MnI~_*uctvWDU)=iMpvzc3{nPjInq<1vi`p!39*cXV&Ak7jeDc zCq(-Nbwres^AF8orI6!m5l!n_g0nx)?$du z<{3Bz(9kKpAfuvxj_jmfwT5Am#O0-6BB&`TsAjD^zAlLV%j6{9Y)Ro6r}qBhgUbp? zhs?4kn%yhH*UUc`Y&he4BrCz=b`Jt^R8|-M3zz~Twwo=t;z2!yZK%)4we%hGjj1v5 zI2E^L0B$NkL-NF~7L6WiNv&I7NUFUf#nb42|6khrZno(Um5g@5ML0%U1nxD^+1~ec8i^b9|)!k zYe^B^$($#zRoZce77#1#$tKmhFf1E0-}!suL+l+$K%s9E_V?QXT|AxkrwzD-_4B#8 z@H(RDjD}9Ei8`cUk7L~VO4U(l5{iAL)1X%O&pnb+P zFTCZuf<#Q;@C%|$M?bd47x~Y=U2}jM&z=^+uT8NqeOwShwi;=S6kh?h*}u~5dFQ8e zK1GbNUHbeA4y>S91BW+B_vtQ}ofeZ^t`C^@ya*K|^^wH7Lx^j_KxIZpH?dYGGn-Blu_6Mv<`;#I5#>+t+_3uJkJ8{Yew!KOW)nZ28 z5=O#C_0~A06xYgcy(B6Pa;8SSp@n@-X+&c){U|6DIf76grVw{FD|KG9VL%72uMHV& zPQ}mW9B3&ZC$WCPW$?Q`dQ_}r90;Cqx-vq%y}HJLVz8=QS>#XGRUI2R%kZ&0mu`K~ z>}hzI0~M8yk&E1_kJ^{t1wnF<&n8&Q{Sp#i<50db2I>~r5it5YgLK(a#VFquoXK(X_D4Sr+6&6j{ zYcg$+VVKXjf=u7^Kyb!{mzbSn61`*FOI|g7aCzlbFkEfA@O2>z6r%L8qUcCvKN8jc zPP?!|)%Gr6O}0xrwg*&^o-hzr)Sf0+_hgT@FQ8Z$t4(&N1ovgeVNy6Sjv49hz$`GC zrSdQ-JReC4aYW94Z`o3a&$o&kUmBFM?%(g-_wc~Y*Jh6B>wvU~Rj+=5c)>AW03(%N zx1VpRn5dPBDDKQ}%d{;;^ekxMm?_}9p}N8s(#4zJFt|eVu*ABw*uEaazWE3n<&5*S zB^nViNxn5)P`snuNpRWGuGdE6(kS6Q2H)n_<)Qj|=LEQ$viLAG0X>tRi@P?qAPw;j zKv}*?9!5{_OGxAzNKb$7Qi_+9YS+m+F7Xa3(FK+33&0->N*Y72o`%sg-fA*Qq$Q5h&8Z}b6GvEwJcqbyuCRh=gyu`m0urbZ zklzl93{!(ErE|G#yjdfn4`?d?u%WxqGgOkF8`PTeVEvEyp zyZmoZp<+G=VajRkKPkjZc`Y+lo^p>qTzX*G;7?@lcRzY~G|pdy8if;YQZJz9W}49j zC}n37?jc%G0*{i7*KkEmMBhv{n=;eJbj}weD%7-YZST#r@)@_WhQ@_$Q_Z_LCo{xW z_Y-a@um5}jm2pp^o61Aht<2T{k8s6qS>RS+WIM;BHiN(v0AvB1aHJO@qwM1-8nobj z5}35Y(f~I=$iIA=-Z}JL^D2_w8fRdler21j%Zmfckp^0zU8^y+Tv*@cS4y$a_<-}h(MCzb)U)dZAK259+8d~eEF$JqB=#HACZo8P*d_;2uDq7 z?^bL9rEqJp-@g+^B#C!!dP;xOQQr7(VTGfm<(yCo>hQ9+&or z6TJjr@bo-{o86^*aF-nw(ff#D)cHQ!1$cz+B6Eib*J)){l@8MY#TW^Rezob_ zDN=4?Fhs(=d`bzuf0H!fr_c)fK451JOgULMi&iTv731=6`L6k$j~Xbl-xfrC2*A<*vkd+9)SVP-HWl2YTn=C^N^L6tWWQ$yaL}7Z=~D<7-UZ8qoY+>(;ZPxeojmPJd;9pFr@nui!Hc+QV4N! zbiqVF7bwp62TG3;2X3q$Ls;#v&mWFQh?xa8u9tY#9c$dG`n^xHEdU>oUiRKMwd-b3 zsQSr}bWi}Vzc3}#BL{r%#$*4667%T$`?WgLHA3>p#WB*uAP0MN6c;Ppj*1v)uGE`A zkbp<}v9564TOgscEq+m7d6cogFFKe<3zSiesDq2Em!s@g0uQVSs~t{Qlh8z1S~8$c z@NAG8Q7o6QCIB8}eD$UzN~Z*`!y0PS!9wX~%*}$hm@u~q&VfEUecOczRvyU(Q{0cX zeeOfBd}-BIBvc=B)HdsM&|Zo$s8g!+2`|(&(qnYEE(gMv2BDvZcE7PuQKz#E3-9}n%F8z(%rGeR(D>+K^JXc`Ca zQx|CHfcJV{zhT?}>A1|FFA#yc;_TXer=ME!!nG94;>D1itEo5Oq2crcg;WLv{33p) z1H>&pWO&K-VK)KGffW38ahauKP8?{MQwI5gDG|m2D;@Vf`>Xad=== z6wLpe!o6xO$rDVV74hch5(=8*#q{!(X{e^?>Y@5ard5k>pfjN-sY%LVk-2BeCBHbr zn*LYQML^TDPmS&05@_C%6^i`zBia8`N?IV6hQDT1qD1ecmDnm9`!a)F*?g=0q9fm- z*5E!>K8Nb-;74as z?IKEetWuPG^$NGryjt3wKr6zfkt-yzHegZrsAg-YwA1}7^_85wFK>EW2MW$uRJuKI z<&4+FX(nHcD_EibR2t@%Fwcb8y0MB}dpn6*e9r*XYSVN++|2j2^}gYanRemO9~lx> z-5pStDu63%>>&che+(i4wuD$`#e6n-h`tt(XWneV&+r;qWTO+I>sBhk@HIkwpu zv16pLqHzGpys;3ek?xOmRC4<=%5mxU2xHo7oa%vr4H3!IcPvhzbu)TDLU1hSN0b_v zpOhqkgL?(>xPq38OkO>^p^6?RpjUFZzu{bNc@d+g2Ny><1`b5Z zHJHk8`OOF$(Q27DM-DpJ?Z!+&ZwSfZf2&tW8OW|J_6IKQTl)Nd_H^RFcSb4*{(R?0 zYFuYB+NSsYI*V7Z3wJBN&nNS(coA*o{2@+S)=Gjhr)}IIh61iYtlHDEsrCtt);ZAZ(2?%A7-AJ?E z95&AwJd{NMc-?uyi0O)MxQy-Bt3KYblc);WfsUlB7h54EvJ%6U1qAwE|9Zg2Uv16} zFwv_KNkpK-2*Bk)i1$l8_(M-(iC6J!0XkgLgXBW`eHtjc2FutyQrCLEcm+-CqjX{o z6%XOl6cnSd8pmz1U-gAv>CD#fm3}b}`YmOY2=d_5MzI*ZW|y&Gs#9~d+``L4=}_&X zpRz6nV=dVo=%FoicKaEii~~t5FG22J!H3zc&;xB3 za4;Z2be34;<>Ody=?rx)Lp03)hF+CaE;+a1tfuSKgLR-}F`W)t!wW9teVy_AVCIg4 z*#_$bUM{>clSTHAy@Ch#;l~%Ew;RPc_vMW&hG0$I?OUj7IVR?!&U*$5Edl&_p95YV znVg!0pLRbrkU(qKLQo*EwxpA!s+q~*N55|m*x%xlbLVdhz`sV28%jOl>CoU4Ua%`kVb6`ChID^#>v!swm z=Z4_DkUlbb&eqWi04Pt*>O(ECy2+JjyaYxJI2oB>$Xg5?a~wgM1@M^<-lMP{l7H_U z0HJ`V`Q&`18XxFbd;N5hp+9uRkWqX{wy6E&U>+g-TS+X_)hKt)K>C$q2YuJBinn>= zbPs4M5`CDro-$uy4yFB;%D)#hrhVqR=GLU}GpqoH+P>>2@2%_DO%)Tp+a))YiQhl69SGcKQ`{ji{|EiQnI^;^OA+mczX|C|8OqQ?xf!mzXq!11Od0GW| z4`ijBby7NA+5z=f9()1cHKHK#=<@(OQ(d>+ayQ zHMRF@4Xi?0p!_Q|>+*kBf-*wzYSt*IrP*lUudiV|uWfuF9A;Zyx7C3$4H=F_$oDZsvJ4hA*47go_AE}C`Linkd-5O!&z@1N#A_%vJyKR2mx`K?R z##S-hi%5Ny93`E0GrJ13c1nDVfjCL6xE3k1mJ#+}by!BvV3BC!8-B1CYN=^>XN+q)vILO#G`u}s~?OaARu=CJwz@bT#Eizz7z zZVmA_>7e#wv;qvM-P@f42@Ww!zWTu8$JcUQlgcm2&q{04j10laXmvA|zL9#?72=n_ zJ<>AGC9a_pmNRhL(JsUIC`0xh8r<*UX;A1MUhyFjW9;UiLUy@qmf zq#W*(V3w%?@mm_lhTSDT2z$e&;J5u~w63`2mVSX_MP1ebmDP_2{g}8>WYY-K*R&rI zaJ6F@HfQs*@&_<%lk>yi=Xgf|KJse+xE2y4bdf5~Ml+OL&EpQQ1H1XmQ$I>=zBtxM zP+fDDM+CuG(7wt1&6E{~y{&Uy0m_&XBPT?$VS|j=B-n5UO|!!Ro?NeU28(FcA-*ud zuJ#X_Y)MC>1Q=eI<3{c*IUrX`J8c#{|k zWqhj?!mA986M_mZ@JW&;=O2{+0^Rv9oRDy+0ZJvSdU}1oi*Y{mSf5CHi0#wB`Yy>- z;7tlV6;=1m?VtwD&P`@+8Wo3Dv=bo^Cca;jw8UiaB2E^U0s(JA&Gv9GoltaoIN7WM z%8wpQa(?_3EOQocIFv2|mrN21xYL7F`XHnV{S>l!5Cur*9P7eWGkr*!Ps-KMv^TXq9%e*GaVA*LkAnSUaN?Eq-AHC1ZFW3|;PkKV z>t%)_kpjL(muy4mDCfY9VtRoTiS_rx*3d3noWNf5!Kc@K!##*80>$;T>{)-3Bvmj4 z7W0#Jm!Q&{f0%LaO^w(rkPfU3hm88RgfNx!7D31#F?YWKSuD0==4ZH-mSk^n;w{vL z*T;5}vCP0ox6ALV)+ak2IeZ2wU-$@YW%CtwaJBm`Jf%zX2+mq73-* z{@ouuuZjz~w)ha4`(TDoPluSJq`Bd_(em%71&c)eGZotsO_o+d739s}vP@5k;u@M> zU~Jr$Q|6+~0<&{wD;&h(SIa~m7G(N8zvBn3P|aFZDf81SMq?;THT$}>`;!XdPhe1H za*DUhrU>^0hq0nrc6wJwY$0DEp4}dcpqF{iPaz$={(v6^s-n>kN12 zspaaR`Kq4ErqTR}UWPLsz1dTql8}+v1sQjN+03YLS3^ny z`|BLDJWvr^Fw)srByzO>RZ<4$AHWd^A&wUEZwB^2*m*^F$czG`X()xo;jr-BdSQ{N zj$f%1+?J^Jo7Pe{sPAf^^EpLLg)i#Dl|Tx!I#83CQ@zjv+WT3kv>RxqKGzzPxvfJU z_ZwnXAPC-VEwG;*2Q{I!st?(SZ$*f>k5P)jmuY}{O{(pgF426ZG62y!73nSgO_E9a z2tlf|j8iiZfKW?-CjjCyb!arHMw;XW&7P2QykhmSw`rs!^ONi{WPMfdBFs*}#S-4O6DYcWIL5ccmq|+y_$(#f=?^0=y z#(r~nLJCWVPvPXgqG4y41{$Vo@H&u8q0G~2S8=G$l>Q_ad-xn~cq8#oZ2%_`Z3*E9 zK7|-{!M6ECm2WQC#!o$9HNjr*pMr`sKRb<;n@}WE($rAMKLHP5v=K#cC-6qWU*f1q zI(*-TSX28(#3Bjn`!AS;vhm(0*l8(F7G{~x(?W5=3(XPcVjCC1f3O)~yp6ahR$E`) zIxHO%Z&2NeQWSaijqX={KdDeXHPymPM8y{T_9OtxlF;f&dgg6>ngb{fr3)eAfSVzG zt-SYllB%7=`9Z7Eyc?;)`hN-klBqqCwk6UF*jGUUwT9TggO5t{idlD|^LaocTrCzd zO(#}9MDD!+EnKGcmL_emTidaDj?m_S)hM$IO5&gq?CZ5kgxs#xtW+S>i(Ja`G%I&20^r)yr=@z{MWP{~ zcCicv#udJh(yV3~t()T9(O{dGb#8QXoig)^DAs;6{&?r!rJ2xF^(ln&) z%Rh8fK1#|@oW7NKwHgIMp=9==j4eDEd5j_zK;)*80TISLC|l^_NS*Uw{i_1;OB!{S z0?DQzCwC_U3&8Mx7?2D5nVDDgUK)0;#R!(W3mP+LDoi#DJh!)>=%4dOM%&`@?w-ge9&erl57+6)98Ur|VWW8jJbQTu6_sLFs z?-Adq$9lQx?4uQKW}mgn*X+t$yG1nhCir@*YGuTUNYPcVUQ4zuet2*Kc1}1Dq{$tB zoZy$?Tl*Qc2Rs~JmK<^i_Zom9a(a1ohNxMtMH)OuZnJM(-w9dx|X3Aw{;b@4ta ziyb`e6V{yyXjS+&{R@>_Dj+K}{fEsbINE{3; zkaG&c53m_D$9gg1i=xMbKnZ{;%6hK1QXpN;tLvm9f;I18q>#Zn*T&D}o&Ux!UAQnE z$J^ORA<*1a^7yL;6gAIk{*@~aWy~t1E9mOX)X__)f9b2Z+;)ulluj;TMAV6*&qHA& zK8mcPtOX6`eZlQHAhDQ>>^5nkD6I(Jm2rOtD6t^vx!$M&c`!QE9 zv&V>&qGt)Pt}=5{yM8yK(tl%5mk{)5k!lidhGD&<`Qi(Y=QZ@HtM<3Om;W0nFs)v_9UpUBm_ML;*VOT1^gOne;$b;qJ7m;#n?-{}hS7WKBKfv4s?CzY^f zLL^>Gg@nYI4w+*W1h(qeIYGC35r%z3?Do#u208WNc`5-bXystBn{fvvsP8#=k_%nc zMqV9paY??#qoz>#^5ZGApX2g}mX4?KG}|eb+~^OAwiH!Es45Wg2Ut0<34J=N;a!XA z;*JmVn18#!97r0IzUMLmnZ6z5A+Bb%xRxtQY4E${{wT`BiGV7pT0rr8U=vrEqykQY z%2EMs1BH?MXsHuuZ4h*ts|vNr7D2^IPyVT#l##M)U98T7NR!A>rdBTW^4nJZ7B+d5 zFNZytpQt;YcTa9u^ruA7$KP-PmB)E%I^f4M#=t|Fd zP4mbU$PQ<=RGa*Mfb&_a!mEH?vnB`ov*=i)*5~f{)IDM-T137}m33|C?y}Bgh^4W& zaLUV=J&-z?Vg%L0(5-o!`nOUrI1&6lYrr%ip~Hqvl)WHPuQIl_+RMql0})Ezz<9jq zw>Avcqm-YE;ntEUde7TJRQRU~e4_maa8SCoiqYZ8jH@}c-@IKqkWfc{B@jW?NLBij zsAt+T!)X5Y#VZ&{g8;8eHj%(FsUdV2rwdGL`rCu(qfe@T+-uGlcZ8JeTx9*2CfZxj z62{7(EZ(#oXnAQ|GjStJSdul*1Xxj$1o~_#OR_8adx6hJ%ZRQdTpnVd(e*=K^oLa( z%q-?|4_q)B^*w3-d(g6p!Sy$v90Tu*C;K$B`oO}RPR}DB58Bx(Ha%yUtCaD{XqcJ5 zLCTXs=AI-ikc~=@#6!u5;j2{l@CYP8M^4rXF~&lnZm+~IiTH#8f{?!9(5zAexcA(P z56Xu&yN!$z&R{lK(VYQL`!}56^>^mMDjDkAXB&o&d8EYidD2SM-}-{?eTlmi{-p|Cj~-T2 z!up8qzPjs?n+vinRe`_-i&ENj)NQ#gb_qa(!{2ve69xujr#)IM{MJQ}jzm(2sbDx$ zZMBp8C(Y)~0jThM;b~$-SG%YLB{rR}_{KHe@zYytEd>#EKo(P{wtt#Zv4UP}?dNBH z=!>Q^hh-(*CTNe@S$eB2yS_=(=(z*l8`9JX>#sR85(;bf20`R!7y$%eFeaGrZ|YYv zE;k&V4hP@$yG`ju#_ckP(R@=uvLmQJ`B0kdbLvC&v*dFeQ!wb!FpCv={aV`{pU?h) z**c%xYI>AxeB;+2%nk#ISF(@NaZ$YHBTSYPI!Ja>@vXPBA(_IAL3C=0WjA4|s2f%S zrH!zQgcsyqjtO0`CUSmX7dXD?In}*GXvnG)`SU2Oamwq@7XuYv54MC8@Q;NQv?7SXp%MCv(aJ5XvG}srX0qbmh`B<2cCF zaStEi3Q4y=KJh^M?kvDAdeGmUpNalgc0@f=MWUP#B zO~PLUYRR)im@v~h!vFgZ_=0SN-Kgs+CnxoOq{ld+PM;JVIL)y$+`Kz{M*1y;%_TD! zvv>IK6NskR6lPI5--dLut5p>#|9VP&e@}imtYP`SA!|gOrPi{{%%M|8wF7o)5${_a zu4h*b-@m_Mu)A|RaFRj5xh3QiwfFus32BG!rUL}B!(d=VA#I+u9xa#TNW^RvPY<@7 zg#yV~VXMWtv<)|;S6BZc0nJZoRi%UOytbDr64X-IGz^J9z9Vt}o$r?*mM{RPv!ZX7 zDzhSVW#B%FX5|3G&gLUcH0I+N@IBi)C<6K@fd^DA&J-$ooXmLlh18%SQA!wN7uwMN z){YFj@1m_3sZlYOM=e#@AJlq`)8&5=*9NQ3S__N1TN|bseU_r%LjNqPhs+FA-)XV& ze)HivWGUrm8M0$~-u<;Mi6R99f_3lMY%%9ZJ+G|$!GNy30BfO5W@Y$TqG0#A=&Tb{ zNC3N+5In z!lx~V>%(<}5I571LOX;$5WD7{wO15wS4;U3E~fE5{z0%}@3Z8@@gTM24hWD|STSzW z+)@B1-#K70LH&T>QqtgXfs_XlYK41=K6t}DdeV2LKFGx5v$*Kr?)6@m2z&z;_Ky4= zcwg+S_XZ@)@8a8$?$u2f^Mt+g)KRB!uu)`(gR2w>tZfasG7fUkfe@Qdp3)KqRK(Tr zalP)Dsy&)JV{YS?D@J_GSgYRrm?su9=*Y8-%I_0#=4o!kqqcK=JF{-B6y}_6XL)_q zTJvj3&K7DK3Fo!}zWGLf7}6|ENQfJG{RebsTHbS72~;>gMy5lWi5dJ)@vjf6+@vX2 zhQ)jIY3rp$qp(Y)5=zc%0<{>Qwi_fnNx*P(qkbRPEhCxLGV3vc+kwS12KDmCY!^TT z^Kz!=Cb$2J?MzNKPOax}D0&sVQ&1azh8`*d?`BNDex>L$eDImgyFzXD8kit$?3FRW z*JBNRL3%%v<@N|_o@>e}_&l}dzZZv*YiIMnmZot+)d=BAI-9X}S>|i<_B+s@Hy)VG zU$4bY8X^O_!c}p&oI*avEhzbOm}4Wtm6Y);E=+S52TL87JACPXo80_OGdigeOu!yb^WBM{wnvWd;h8Nyoj1(* zV1;8DgXAo%o7*(FvIh0l&{4aO3?r?VPja2ng>bP)q==-%egEYmLGJ7j*SsZUNN(lW z4cqGV0%q6%uXEEs0^rITZcz=_mklH?>02vq0UEVPA=s;%$%HOH41=xYN)sJ}OL&f~hBE2@a?#Rf<|V8;(E(g!^dnPOP#%are+MoHLB z_AzW=2&gUp%|qv(6`nJNYYIFG8mOv}1kjrGU?$M1t*m=W1js>pPehvZxjdrpwr6L@(`cRF_tNCge63s zpn;;zYgLW_K@`&-*pnpDDLS-i;FWpS@g$s-IE`cY2^!=dh?p;Sq&U=QoP7_NEiLA4 zs5d&9OzV+WMgMKJd%9I-PH5YzF-5LVMM!+#_4d3@V56^IV8H@Z6&$PQ>2kn23H_xg5@V(OBfk z!f-A`y)SgFc6Kls<7uL#Lwtr@y73K|BQSWTaAey=bmq+I&m<|fk2vvDp$f!|BXB0R z&CeZVWd>)LO+H%VsAX+uE>68O>C_1GuNU&izE0D}h8$ZHn1!D#Qwszw-bE*?V3hz0 zQ>zl(B8a(I<&w-xLbs4BKVv=<@E8)2*>kz1mTl*LkVTvy6&32?c5V$YZKCvMULrq9 ziEQ!8I2$KYx5`-+K+!Z88>Z-R{$Yn+9S4j?qXy12~Nr5kc8x!7k z1POQ2L+@Z;KyA4{wyaz`pQ!!n2QlHtU9#8;6d?c+BYR_LT66kFQwMuFH+~uPNYoV)w^#oFN zGtXw0TxIy=+K0jO+slH<%pv;-F?!fg#@$dj{6i|PM={3zIP>&4Pd%oYM4@SR8j*nQ z6{tEd7}q3Ck!SE~|L^={jy5w-mOCN_%E(<4J0om|htxQA?1j&BXxy@ZfvDI;Vz!R? z@#v(Gl*?qDLm~Rfhb=>l-=SZS|C=x)U(oU{ptpPp!Cgmt`B<7aoQTi*RKr0cdj9U9 zu{Lg1f$#*4k!nDd?Ru>zYuy3Ccw<&+g;w`e93=jL5UI_q}^IPo<)>mpPs zi2?CgCp?d<@MU?a2AI!ErA<<1eO#zUk$`K;wWAPBy1A3X4ERqlu3b^Kg-?Z(DiKz~ zqWl^tm)?q;_5iOYrRC0xQq51Zx$rsCTFX)N1cgY$tqRLre$}7CJrxz4Yh0T|1GDyF z_@Vpctq8e0!j30rhF!F@lA677-*Y9{-Ieil;md|Xqf>%QP8c4T*iLLN5*lUxV&iVT zhIeugD#xlBtq6!t8q$T_S55jX$)iA~a?Re~c z04NMWy&0saKSTn`h3ej8-P{EB5WW5aoiEpH=DL%(B zf{DNTH5%D>vf!{2nL2*3hyvcg@Z*TPgV^y#{re?m9+#n^gPJ07Ne$f{*=fPjVtsb- zLkpN_L=av83Hvw#7>vdz@?%MZkE^1oITvAT!b&d&FrLnDcyS5eYBwmZSi-Y)q)>@K zBNJJ7mBr-z3*<%7^Pz*P4tNcLfS>+$rRYowKphisD9DuyL!6h09r~)g?9?mkQYr>{ zr1|WqhtME2fHbD1;#SBeBM{u|>})lyr{FMdI%7|i#40Za_SUA(O2o}1fOd~rPt=eK z1MWCDhUftHZmfJfJJ;_^_tkcf#^%uwg+@S>7@kL*K@KitIu&sr|5dBDQhU`jcDK|o z2g?bz{FP|s_CQF*S~;)C60e~(NY*2&h+YP)*d$-^X_>Y*{FyJB{MOINLV8>OqQxc$ zz6Lj?9djp;w8;~@v>t|Hn9%D(3 z7@T#zg3c*3n=WgaZbn3Ut4h))e)=uE++R&`d+ zSkMij0>4H#YKSv`O}xl#Jcc593GqiO|5(7A5UNagU$bl$}NK9D-CC6ESX zYx_mJeRpQ8J`3)9-tW79cc=1Q0=9dNEJ{92ZJU+t7Dk7s{w1@1P~KRu(3?+zvxgjo z@1*i5ODS5g10!uB+bi}9Y}AnT@BbY=oX7hML-v~~mKm_g1h?ZCVmw+Zghyx(apLLu zZZB_Gam#2}6;!>WCgVqyL2emyu=#S_AHewy4FeLxjDFJ#7)idL^l&36*6QI^36dW! zOklgiHQ*-GHao381$;WCD!&*OSA>A&RN&FBLh(rMIWqOvUEeaIu4m3Zln$h*KGQb< zu+tPRuKWw`Z0`rN@wls-g0p%b8}FqiSh(80R8=jYm5{|qaoAEkzfVp(1j#SUXb1q1 zrjiwrhH!*^N8}y?>%0tNP;6z?E1|zJBxt|duatem6pgc4-hpuD1I$ z=`DIlF!xjewc-HmCx1n3#WCFEAE+j3u5fw?LEX z83L|NF%6u!W8M_IXP&8x_;tu@W{1|Ars3xrqr5P+HzM(A2j3Hsv8lQ`Y%ZM$Y~4u( z!5b)U&)VnVo~$Kra$eFFZ~L}plNRe2Er2u^BH>EBZ_p6|e8cYG6G~fz<2aF5C`G*u z`Y&sD;swv(!^LRh4vL>+Pjt6r?Q=HWNWK7jUbmhoPY?y&uqy3qxK#N74 zQ@&e-NiSi0kp&NtQi(hP0i&U@k|7OD^Ud#c#!5Y9;GbTy%(w1h>PY)^nOQ(NttWl@ zW5`~JApQ@Hw!cCSf5Fj`Nz#OEm8@410?3Oeg6AF8S;8IuP1umzJ!FbXplwm{iG>tB zcim!l0kMSID?VC|S9NwJ#GI6FOeMG1@LFNfr+X$?_0sdBSbZ;sHW*{T(Skc?n2jW5 z$sLN)6^5@G(kA>npMo0(@EzrZ&J~gDVOdQatYyr>$`-SJa%NC2Nzm4vK3M#z_g zdKo>M*}c$b%Za}cZW)}jphEGLC2=_1t1NhuCC3=M`9$fUDXLqv{h+E&e99w>qw%nT zREH%pk5k@Y+fOEV463l%JxLZOX9n!~*^&E*pGm0+eS~id>%_hsc+S*<`&k$Q$e@0$UZOXO ze5E$cYx}b)VgT*8YIG|JDqVhNthVl1gcjf?UZ(q+R4Hw~f;D%*zl7DJtiWefV?h#|kAp)P+LaKcv&# zg7GIGxl9%me4Exa!o_C%h1)tz1d({Cu-50sr*ya`{m?=|5|w@!7-GGCN4#rh5fpvE zUG$`<g8W}Z`yv}pzQm0tMpH$vt_=Ra$XZv09zO^0N>q*!qI1RIW|4mZ{Tqyd_yGG6Zy>$BWw(@=ed*bikjd#R>D)2P=X?mM8i?Hd z&n3~2h@=QkZo0;&ERBtwnpC0GsD6JXQHVk2sfnz^-FLHs3wj2rC6l6y#UAk_ZZuc9 znk@Pl-m$eOrzl)^*C(~&@TVD7Brk2S%~7N>)`w=2cZ58IT;!@Q+sBt6(JL;PXTJUv>Oxyu%B=i{$#J@c%q9lzNKHMpF; zTb0#Q#HbRok*XvLhV&<-Bq zwEI6=6Sv(~-w;NXR9xnmBbmvF@tyayOvqX|KM?Ro`=EcEf|ej7x4PlhA~C8ac77Nq zAxs6i?1VCoa?6ad6jO;4j1d+dHlJp&=;no|T!2yfuv1CjHwhr4evjn^UBBROvukbU z7!Z%}L2)h=V$zSK+jo_f;ZOzW7c?5<79yL2+v-L1YwjTP>2g7qgwovdaD?0lX zxotTJ1p`DOL*6QU+4xZ0G7J1ELrG2~ioD_3^zHVgDlbjZor`k6f(OK6RX|f>&3n%W z%d29Ar^^_k5GA74DK2x2m;VmNyY<{Ij4b%>BFg`AUs9$%?zrY+HcYYbM4ZJ)+NjTJ zWW(+pSne0Amhp_W zl7Oytq1Q~JDxNJVGo!tX_8%MCpj0WBQ*+u+?mbkQ=u0uP_C(^F5V><2M}#8Mw`0=a z6NcJJUuLo^v%v4o9>b{EM-0oO{36x)srmJ_~k3yp09T>js~88`tD7=<3TKd z{zLq9DO~>B_ba85Y!UUb|1J{J+JMhXPn;ULK>KtarNN1i`Ms@DB5F2YwIzeygcV-KqU~xDNI$=!yY<`}`!PX)(KR>KYVUkLBtih_J1rH?bU_ zT`rYj*CXH)mpo8GbR%xmZ%$*lRQww}%DOQGRfA%4Y5N+_*y%vt zI8WNUx0kX^MmRlc5F~X-PRV3m4te?LWKyL*v)rj!8 zYs#oP^PNi+9gaAgj$)FEmW6m6Pa>*!ZOK}t6*8}Wcse<9ts;ebJnP5sE*-K_j`IcN zx+IZFSy~VhN-bE>VqZ{GJtqXXwoy>?QivBAIQzcibgCJK6$;zG3~752>@oA>SmCfi zb>T0J)n{uQ1cS#fzPef!0VgJ6Nj=6$RB+(Jt}R|UmugYJZ=ewD$(G*eU#yTemV5$`ZjlFOn<| z?Cw+VRKKP`Uh3r3+0-f_=Df|IX4DFWG@29op+T&>5=Nl1q7>kRSuzro8mjwUR`a_5d2%QQHLlg z_?h$14v$5_4#3r|elry@kWfC~QuNf{UvY<*K6qc~$oZ#SU3 zt5q0h*fcs+pr>ii0+K#qGpST6%nCk*ScO_LyPk}%oCxH+q@k!$$&`}iD8t9Q@Ni`P z#Mcrw5sfFCTDr@ONVo!k`wxz*}NfE+sW8s(dJH)&2R)FjS78h>J z4DZx`rYxv9fufVYGwgFQH^@tvzA>SzGA42^1xF7Nn5h2xhm~j@-K(Ou?n{gV@rK5T`J^NypAX3l2U{3L?fW} zeuP``lHsp6uQ4apKR$}NXcyOGXH6pJ(qnY>o5|S|h7|q!2zC*yU%OigR!cI`L=UJw zI-ezO!e(6@H(GL8{~Qr$;Ax%VnS&-Q`CPa}ex9nfrEKaaF;=?^S_h*qSzZTF*E$m+ z_+yGufFSVYy`W>l4Iuw123?m zivcq^?^4dvwE~~mnB2$|6PnPOeRv|S985>-YvlgnzJa(ZOZ+4DE zYiuz|7Vq6>fw(fVB;;)ZX)qJPxM{;6dH((Y_{h8$!RzYx5@HV$oA(S2PC=s9@HjUz)z+}kh;YCwsZ<;c5D&VBd? z!>(kpq9T*4*@#5EQbi(m}_^w!B!{L475vbZG zQ1?4`e2zSY60JgPLC)I|H8l4~+(+H_PXQ``?5lfGGr2H>0Cx^AOLCj_kYVXs@PTm` z_vhny{@=>@lIH(^BxZrnYI;EcTLkll>t!zqfX?^I+gE@z{Sco&g*m(8W0E>{V9nVU z!|H>~6L2^h`%7HR;O2K8hr?lX*N|lFYHEaQfsz${eah7hERD@o7R$JNIYyPBH+(5$ zq`g7^DtqEYmnBi9b!)C->l+#>BF;60v6tn^Y+-fm*6#$iMk1&eB%U-|MxenXq0JJJ zho||+=MSAtuVqv)Aq?K~-1d{f%qcg-E(j#tR$wZigG2(7nEWs5INi54xs5{sKqj^w z`(1^q>B+`duT0V=Ds=&1J+_&{lD&dBaL2ZKefL7h!OplB-RJQ4H#ww?Ru4E;j-` zXmnPO54>#{UvO>T$))rA4zSmHI+^L8#?~*6N9S(BOL5y&ygZGiqo0qtgrQ9gm!lzT zRNW7&wU4JwUKtV|wS}!*V;ym{G(&0Pz82NavUPf@*zJXI(pT>)@IvL3HZ?+=f>LG! zNi)(zS-W+EDsg1$Q>l?zejbCNKQ~*u6IUXg!NSVJ{~p$0?N*R4NUX7`huSzMsO&ov zPo~g(PhE*Jl^?k&5fJ4Bc70j{Nl_ri(5aiQ$*Dm*V(2!0||(dds)74qo~L;4v>7nU?+!#ft%23ckt=dWKAMnKn0Qn+p3Rd zA^s+Ap2hiy_GLYUr$)~WyN6%6xA#AZR2)#Op!^UXGUQtueLJjg$4dcVZ(&)_iVNSE z`5dhKFLUXD=&cp({a|tvz1aF1NdE)SWYe!Qsm726{B`L6KqjOoLh03!u`Q*?Y@K>b z;vauCyl*VAw0SGLG0<8|tN=Yg!oT#9*$Fe(D{Ui@%3>YU9l63r2h4ngD=e)Upb}yk zf9wHX!!wgDD3NOSPXbynU@o%4YSn$V+am=gi92LLUrW0 znQ!NQjN09h#k3Jw2=MC`pplKAR60`lKmT4`^_4yjtjao3$0IVO}E*MsourZVXx_cil(3m{|6 z&m)9rl&y7Hvc*(*RJjCZ@gvyTyY}ZuZ3Y$XC+bM>Xa2&4y6UGP*IBQn(y{X7O)e<^ z)s9LI$@1M5LQIekJ-VsfZ>klR6cH7G=ou0#QEclTl5;zP0LdL;ECsfRT(j9vwMuRG zbpk5FM@gq^rTErSQXc#467ab&Zglxk<_x(D6ye=TjmWbJabq}HDBuC+PuQHh>{*9G z`o;jQdM`x=Owz3q)ClEGg!~GzI}d6AD(KGyaBDnlq&uTxx$T zIY~UhJ3(ZiSBRTFzUe_71Cu_%Y+VT&Ir^8{YTxKURl^)cjuvdB*WG?Oo~~X8w)$5h z5dC%3#2glv9-@`nJ#J!Y4Yt7M5cP53umxVpy^^R!)Cs`v-=J{fc?eu&eU*%`7nonA zwPy>-XUphRQa)p5+`dcpO_ATew!lKsSs=HXvLV!ew&tB!d#elp`ru{zTnv)7XO zxq!nBFQpZJ*uW7@yR=59zTYj|kNwKqVYx?fjzPUcVSJMz_biaO|LC$v9s{y>3Z(X> z;>znt1(W#ZDf+0`&1%CIuiaHUdNW}U;cW~`a7im=?zruC?qM&4^lxY3d&z_*&W+fi zzG&v@(7JmJgu@_O0i~?u9t>e@*s^7841$2{k`=m>&>u~{qCx_mVX49XxC_m#*wPM? zBx(=JW-^TdZ^j%qBKl?{i+>v@4-w*hKM-# zM@`YT5F?rMta#Muz`EY`RszJ7nd>?O{-Clo4^M+osI~8lKeha7+lrpvCCnt$b|g|pRBp)t`iL|;pV>)zQcCHAn=f6PgfA8x>6EWqoe^$3TO81Ier8X_oLO6>S z;=4V}QYN;Cv)#dnQA!Ik)w$ePRxDPNmRzc4NFphjE);~EByEaK-eboBU0!=f8QlS| zQkeOKhi7HT3GBS}%LgPV!u;Daj?LyK_FT_7J5%;uE0R>7Q4P$fPv!J?x(yS{KByqG zAL(W@F$3@-0*zH8AnrSgP;RpQi=oR9uE^11#&cyPAJHZv!Pa+PHwaRUk9efVQQ~dO>zPly8LR8Q09L@vJ#3t^NDT>)}D4w32z4K z@|X!lIFMh@T{^uX1LZ1m@gvlcYG)sttFR4+c_XC8pDEiwBJo7dZt`0*nWaRJJ3eqh zdIFDEes~os z94+0+<^L?)(59P*PQ`0qsNb*(fsq$n+C3dFdXzyq%isZ0nTU;MDTC)*j@{NJDYrwnmb+;x80$9c(<0 z6*KnJz9%jyODV~lV8z&0Jc4E9+|DPrrqoM}E}P3h2>S(a-v zO#;xZAn8XwZBOcE^iOzp>E9Xy&dHs4-47wE8!chRHA->5-Fu>V6$H?KbrKbosyIRo zF~vjlYo9+9?}Grcbg}DUe2*HP5vX$mg2GVEUz!??!ZUHHR|*ya2kAC&SLfn`5zI=} zVoe4Uj?q6qojA4l@g6y7Q^WqZ{C+2vxhZp*;?|h%EIRU|^o4OS4PPpq$)6|;!kb1d z$|;-jIt%q{@~}fhw=>-hIup|r#Ju>a3V!U7$Gt1&cUIIHF9UCJ01{1j>+m&cuG*yk zNbA7a^R2b3=rSr_SD#&qqF7n)gEu4|u$1FsLp)L|>W%bt_lh(Okr;&zV4}N=lGyZ@ z%k`ws|EM=a*VXP^U4dBhG+Rtv;{GRb~hsy&; z(Q21C@pa;$%>V-@K6YiQ!VCW&@{9hL0Sc^GeaF5nZV2+aP^-Dn9^Z1_97{*bdjQ}i zN6ltu>}1FLkQw^YUY^Z}A(!Kp@@%^?%6$ZUg+UKS632WG+scG^vJ9lyG^B6mu0|0W z7oXL+Bt!SJmi9-TR^&~ryHD>k@>?4X!r%woLIj%6mrv;yXs~T2$fGL0O zf9}+(uIqW=4|GRRyYr6n^!OLm{Yvo<5`IePLN9++PNz%0v+$CzJtE&id?fqaiFti5 z9UDUd6CYjPW%8<m|WoLqJ304(s?vx znW{bx*Bq@6t~yIkfMs*N>dP@YZa2sGESq$IPge`0KB$7fOtfRDLNhOg6Iu2@V622q z6kK9d3O%(DoV>b8Ygz{m{@2Oal&=)W;VyQshOOWqTpd8gcM`JP9jz4Nqj9Gc*!^WK zRgens5xIg@d8b4#=`V_+dt?aI|2~MjF2(+cK4u2d-69#-syFd(=qzslnVd$ukd^c62t!_q#@$>RdLdVY5KA5&?wtRIlvYghSM#=Oy@=l!V)U)NX;h$hHS;6HwHMs?mI->&Pi_9)@L9m1 zBE>Q&@(@nJV^XMnrl>NxozJ|t<8f$ladAZ~5_Y4fR1x)l^E~Qe7+jRR;}z@>|J70O zdyb6BoKA;hZ9HqdH+`F}<{1>TnvOPr7TLPd->YypKA7#nwUri?6dckc98{-t3mF>U(pG9oM0`{mpmT6M%RyWV)(-QoIR3T5i1dh(tpl)2 z;KKF*o_<x5``ejvv*MpQ{r*boVJq}_wPd9J)I{5wnc)|H+r4X@ zKTGl^BVfl!T)tIXS{AH!*uky(U=X?=Ty&bS`9q}$ zr~Q@MoCGOULp`c5Ao);WTC&14-cSjlW$>zXAV7wmVfyrUeE2;!?lu?%a7)o6CSFN2 z0;wwQ0)kNCPT(PDkG9V&Xe2k%NRhP%%`6i2TocLg{a#-m7@3c)5t9<}#5t#E`82Ql zQyfzA&=nkO%9p+eV}2|e=gm`r{%tWB?&5QA#ib%H1Hg9_n|Wn`|I^dnmKOEJPOZr5 zjtxoNG|vf9Z`wCVwhuXEpb$yDB98QUt}-V)w@%%|fS_^b*=3kRc zVpDk6q4X4ZyO#P1Q)!x{-^wr*&cgm?`(z9rKg5}xI+s1(!{Oxy)5eqa7^IB~eZ{Fj zph4ef?L&bzFUD4B*fiKLj->1@Z5p^(KExuBB`t_mHU9Lw@fzm&tLr||0mQJ2&4u=s z$C7qqs>b{Xt3gjWo3b9ChvNZs3{lqAl^^2}WYzo!a?_vbGnG24Y9gMbW_Q6bdU_55 z`fCWe&x1Oi+3A|Gh5QKtpoa*XzDW|RD%U&#;okJ$bX8^1-i_0nvCq~?vMJXoEi*z? zqaZ-@gBdXA^2A`kVN6{xEc=FB8Y|2H>+l99H*FCsiGY*2v9QI+v5mT#vx zCWWVe&xlG~{e$(O5n8D=OZk3~_S;V48NUZoN3mb~efuW8$TW>6E+-BaOADPdtgD$pA8>U{US5Y(r<-mbtfg+AKz_OYg0||ofx9$ z_Q9_9$x_=%(5EqOmNOx#j83}VueYQSYn|9*exUE^%Gpf5$e|U1LcivoCUQKU#{KQ3 z_jx%sU9?(MjaNMOPn1%9X+MQ+o7+zk(eSP=-pHcZ4fmTl?&lu#hnGz=Y%b3GIJ}1N zWN`{l2n&iZFAcfJKjTHaa#r5z*)j$Zej~3-?-{Kmcav8mik`rJhy?TT6)1k3sNW%X zD+xnm|BHmS&T*2E8%h(5C)NYn?+hY>I@ZD+DFBXPJWgB3J4jxMd&e2F*=~{~tawY1 z#K1Bn1qDO`x+;Zng1$s*r~~#qcBK}nOqQL>2Ek{GyzQrv6fZI&@+KwF&D$4u zstMVXbsMn`tlw;Aw>W45Y@vv-Z)R2;5HU1+yb!pb{VGJ**6cr4ueX~~pibG;K2nx`U^~bMjpLV3c3v@!B9)c=y;@HfN3pj$@ z>DpaQOVD$&^`Xahfo<8EVV*7t#z)}V5`rj|6M@L3)-Suu)^D2Vnc7@3R*?ucd!{>f za^c@#nU9n8&|?Of;7PE2tKsI6M$RrQ_+68bF1#-xj`X`g8=x6q{_9VCy}#N-S{s=U zi0PL9R1!V?7A9oM7q>+|J(giND?{UHDOoB3Qyjo>bm`R7e7*zYU+W{}0@)`{+G61? zEWvqxjyPNY3|TR8#?UO*YD$isXM2Pa`Okmt+>G0bJmC992)+r?+Jt_xpQIJVD2qrW z-RY`%j}16-`KlO}DO$a!w@CV7G~=TL_e zZ*IY0xexC^Cd2HX`tdlI^rl2($xd+_1M^9owG!D$E$tG=smEO*Xg zI+KZuG?5=m{rUuM{?lWBMP{B??7oTOKw zPu9V@RtrEg+iDn3X#uan zb8=7k_(dNLh_}|nxdDIx0#!o*9k@d|FqDBEp;5TpT7zR{$1x+Jz$r_J?q+5&V~~P_0I0 z*Y`p*-Iw=4@qMksee%rUFOU>5wTnoAAX^pA$2OqMuDbItHc5M1$QV8k!A8W!#VWto zs82gX$yejh^vNLpFa}UIBM2)32#Ftu(@Lzw?3LTJ zA48jQDTOHxI>rSh;5}oMv!I+{(Zguq^N!c5F#HS%Cw-JF^I@B(_yr_lIJf)ufcZaoBL=3GhDkR z95-mg-E5DkcD$v@0a^aU?GE6mLoqYy>-HHEooQ!h@-?YxRh|{F67-U&^!w6_W)#qI zk|o7g8{lfoS=@b^msY^)l0xP{dy}y zW>dIj2S3*gmlP2|Rwcc>RDGA$4kuJiZ}$w!Sg*|{YrgKgYtdEYJ~Iu%1s!R9Y08}~ zVISx%mO2f1)UWD{*WD`n6-53thTuUO#=>f6YNb0-q-(gezvuRj$#^7zJjh7*x61#J za@AB`^JXJNWsL~Ap=ZpzN|+~P&@;&y%Kh#6+Pu-jXMMWO=x5nCKB%vPajt7xc6msV ziR9Q~ABiuEqO>w78$S3g+Cp_mw#zq_d6dlwq zCjj#4f*#E21L+xXkta=Hrju?S;E9EPRVYZ^DE7XNB>KPa?9wuUpBQM9aA>Jiim-w~ z{blK}%WQSLLdNo-T36lQ{6#*NgNWgx2J?TuP0iQ|9fRK~15~0xaLaoKecJZ65bz2r{p0bxHp7nuVc0%%(Y z6!Xb5d}Xo$*E7ycO8Hy{1SBBN_>#X@|Hpd(yw5Vnq5tm@a+~xpNtZ!6kBd+;7+_d=SEW7nktx-e^luYbQ%+ZuU0&CSH?Vd zN60%RF^>V=Oz5)nR%#MoIBH?=b=qyP!aQkVUGmx3DgfofTVDrYcR}3RDnUE>SWy@2` zc5K@LLT6tCKH@}vKHe5Uj1oi%&p7wGJ)V$}C$8&R>KH`P&odumreR0x+onW%Nu0p$ z)|FejM~oXFDV@Lck|*Q}_E?iBvl!aVd&ALNX<1$IPrZMkI`@w_OL&71tCk!?g$=UTz`?Zb>QdA~;UaY$xuV$hy0%qGuSov2u$L+s#wx(igX`I5I zqL{Y#p8}KG{sG%+F~TW~hAxp65&vT%sj$^}!XV5xc1WGJBTTPV;1r|8`gt;n1_hs2 zBvQT_%e{~QAz@h6D>ob}(>HhR7D!@#V^(bnRz1u&w08#CH@Y(~&9rA^o%8_a(-qz> zl=b)+f8qF%vb^KS3%BzN(R?xqmI$v&RGjh@HUaYWph9S4; zeYov6pmArCjtY$z^xK_tsr8}OQIL;z@V2Giy|bQ{BU;0(ZFcLZ6h=@^c2dazk*5`~ z7c~!xxHCM*G<^-4i`HdFYPOCX8Z1t9+(n7$f4_1@n1!%z%O+`ns3uO(5Isf~%Z_>4 zBWsN{P~y=rB~7kiJi!?bqRNxL%fWz*Q7f;Ul>#($2I5;TOd!o#z^{D!mOzmxPM8J; zKnkrL6cmC6$V~R6LSMoLQn;U-Er^&yC4^m;j9Z=syCXUSKpYlh0hw(Bvt}5BlnM3r zzD15OomGLf0o86@P{m;1R|lfXIaJ2mNgH=vwef2h_D?v82nb<($WxY>JG4g$B;alk z(AlSdC57x7qT%TsKB)Y+suE+CUkX!EFsR!j=7~ulDt=x1p^0Bho|o(=NT#d7lTG&60Kkxc9` z>36-Pd0F=`FU!N}*|S^X6%lHu3O z@pE0bnkXRlCGW_X9r=O7=Hfs-(s_C4`SaS{9_h@+xKgwN zVu7}DCRQ;XtL5bqw!hXHM(y;qg-XVe1?w=I<**jySVW6(`j%yWh_@tzmu}{%A~;8D zQpREY+XGQc+E4|(Yw9@->;?g#7q#ct8Se;^cYD0_{$g=n36MzO#3glOMhl~dNSbEe z=-F4F*zy&Ibk1JG3rERvxSf$Uk%|v*QF`gYryjjx&N)c?SROMF&8zRw1B?b8LfhQN zM&*@N2A0cXS+P314vJi^;8XizDtPJUP-jX2rj6l2mmNMilbKi~TWt?| zqq^H&{elA;g%x2ax~m&%hy%Ab`b(VHHzStv`G>MEa|$b^fyreimyYa%;f6`UNc>=N+M`OVKFY z>0Ski%R*wrpLC{;u}e>)&4U%F##q|2lQ7|O=dd4-TTZ!j53)O16N3yRq7rb{PKFt@ z{Ei4<`FT0cAr_x+&wc!M{RGHn&iZkQ6Z}l|@ZBp1pkqwc%`{28k?vwJ8R#Oax4rAW z&m!YQ&rES7P6YkN2?C@<&+}BU7i}#|O^*N81VsE%C2915YPbW$X9=r?fIKlDR}nG2 zcumrzZtP^LPlm$!Z*H9X-#QNdFV*!}U?09|24J&aZpv=)Z;BFxYb9y)>`VOsR10lf z2WkcUn8$R1y_a)c1AbBn%szNFFr_!`d%zVbn=P`{O{(md3yS#F;W^N;MNkf_2i?qX z+nn)6Rb>8J=SYQtwVhh3Cn(x+N~8-wi-pBRc5jTJBOJZZma{FT`WsUl0#9vsHZy5X zhur(7XU4>5E)|PLvVFkuWfZirx3uCxvr4XG-ZSW8=*M+`H=`(lsI79cAvEdp8HP>`Y*jy#cG6t;3 zKM1Uu6>96|*V>taW*v%oP(PIz@MghuZOi?FlDN^fbrUMdQ#kW2>Da*^tU#|*x93a4 z5n`n!?Tm9=j7c2wNsBmnh^ey>mp+jS-Z&)BiM?v-!-&o8@TQl1s)A5igh>lJW`Eea zO#(|*3$hhqcwqEvyxIJ3$m+_Si77V7w>ks}zXl+O+Lwiwuq`7eT@}H*h>d50yWq^w zTzqN`Assz2_M~b~`?yvgv!dF0j&IPXW}77}b$s#Dv);Bq<&$4A=%s28iQb6{pwpUgGr5;1_%R)43h|2@Hs ztg6O0edJy9dY65b?&f}g%q7uZDr^r}4L#3DxeyU$88#LE@inmJqA2kbWDZFPY`Mup za2VG623fnd{}2hu!e}tio3))=t;9&--8U8wxt+2RL0rU4w+jWmt^|*~U}6`U_3Bp4 z>3w+hlg0RRx@PaiSJn1DkU40xZfERh8pgh`q{Qi@(xqDHV-<&xzYQK`bRX;rLUVt! z2(klq%>W|??#PHFR%5rLX*LkEo7N9hY1UJl7O(8>7X1oU`W(E+W~dm`rZ-<(ymh{| z@r+3?3{M`Y>)<+n?~q$Di8N`=i+gigP@X6=7t$X>I=(|o!5ti>wu z-6-!Pm7WU9X&^U+<}ul5+Dpky4p8=l>l=sZ4ENN-5}ueedHPyxK0r31N+w(W@wD%q zjjiUp&DiT>Mvwwabx5qdWvPbU+E}q@-jskm-F2MYo%rAc<9zY$jH>84q2vXf*5RwV z1!M2V(>-BCW~zXox}!vA!AxG&|Q#K9Tp7MarN#I8yu4BfACtOOb1#ycj zDavm!ZM8Dx;6(MmmY(rm{7&fG-Tk>6ARmQq{S2`M zk78@0)i(-IR%;0UxCQp4%3NDt*MZMM@+xGdc7()W-bUJGqkbc|VJSv-p%H_j%W*3t zWh{X&)$|W2f}fXA&t<@cjytiqYMI+>+=YY*{?he?UMhFk$7<6M*sWB-u6OuK^d--kp0WYWofaleV5BvIU^pq= zKS?*;M+jdc(-WkaF_BP38AG%h{a=Z$6&%;Suc`d@C=2gR(l%!)^e%;8V;aGytTfpkR)QAS-=q3OOGjKEq^{FKRg7{p+eR#PUsmB7l(%AeQAp_+f?Tv5`4x4pI@_yGG+or3VO^w8f{bRc6JXOrLN}{@ z9Vs+-bFxk=!7qU;PX)4py5y!aUy!X_D%FzoXHMf8pl^)+40+n_`5ZdyKYSlo>K`LBf- z>J$l(-OLr*oCnB*IV)l69WZh?VrFeza4Q5puq3DxfltN%@Jte(%<3)ZdQ;)rzX>21 z4)^H_0t^x}lHFH4(Xt_MF*F%I7zTLfZEUjk`vyaKY5!)0BdX576+|Qwf?rJ>#G06* znX0Aw+=ix*>=)lKjF-=I7C6fsQZ=rN`y?IxBr^21rIcy8ur8!MmtAvC0290L0`)mY zicwegsV^q($F`@yiHqm{v2^9({F~z+>IHr7mOPiBB!3a7=4omD<{Qfs_<0q{&(D} z$()UsnSOnskdJL2oMYUz%QQ`Ks%4@K1$c%=1FB+%bv4)N@i054HBBpucmT7#XK7As zA+FUqf8ARjB69_$J2tlMY=yZqvf|xMO!d++rG1tWp5`WF70NO@GhORB+r$<5t*&iE zTM*2DOg)|Zc};8efRz#3g_*Z_n5yUM8PpfEo1&RwK~KD$%%u?=&!rPu_zXVHCDIYD|S6@idx(Ps#i z^k6;oKtQ>>9R~XBYgbsM4J4JDadS|SZ;G$V<-Ya4nmDSPNIBjZQ@;20F0zQyD$^OMPo+0eaq8EdJ< z;^q!Ky-vzoECnbNjql&Z_=Fv$m0vynMoa(8lwZ!Fpi2_}hNuC)AzJ>{?^51=9Uuy) z8EcokXsWwtT8`2|HJs2lJ0uFHSf&C`$Z_7Po2uJk+VzsV6*Kgas1bOomrrE^0xSA? zZ`ZAfyZx4{DaCHMA6!hjwMw-}0#IN`Kcj!nLuLURmwDU?5cpR~0l%7qZ2FQ{ z3y~&2%7MMq5fEX^Qc2fJ9iA839wdCU6R1b=`KDN;S7OJ^$yhwxW-$Kr)>S0`^) zV#?#$`^on%_L#Slx!Wh6oq}PEWKw9YE4_FXkd&g0Vq=hV@w}nWT}mQu9A2Ms)lrmE z$_3HTwk-x?uGulegnAIA<|E~m;ZbTm4XACOFV7np;BP%Sg=UHxa(2e|*ASyW$Q@<25?XRe__veu-FoC;sKjFv#oI zqP*oPdwZZ8oW62#HF$&5A#uIqnO3ejz-|YOdm)Mc+ZNCCQ1C%!gqauv@)wn z2|42{9?L`(Ru1;qWn~mN`8O?ADv^Y42ux$@nnz=%V-1{!W|s?vaiPe(YS#Kq08Asn zUL;jX?L^LmF-VTbzk5a_l-`czY*`^IL!t$0zWK>sXUH$07wQ4nbP~jGvSzG-LI3;_7$)I zq{IIg-Q=3p;hxkFR10h5l|e1gGY9CPI@{0N2t$|l6&6&kl*?-|syZg@OP_X@;FM>$ zfX4qJ&!fY?$qk5-yW*-v+^LR&{dGX*E}-IkCZskJFD7YicA#hD(ST^k4YJ?EC^d7* zAU3xNrZrBKGv}mM)lL%*k}Vep19g``jfiQQezp5{NoTgk>!cqfkuKi2)UIags%ZL< zWE!+fSw}DGhSf-l22d2(R;W!}&B$7+7x|oX`GA_%=(c1-`JlCM?U38Pn&&bxL{rHm zG<^0sf4Q$_;3{Nus2i!=bJdPnXxb)je0+YLa$HRTo>!Jt7ECay<8c3I576_fOtvMn zNma)+vRAT)Yec6d4}5?;d3Ag$FDeqOEjaer#9RaOsU_gULHc2 z2x;1fVmyqL$_K^D5;Nv;lwe>)AV4d_@B1XK(t3}C*i)JPZ7d;s+;&++YW=m>e*g#`E- z;`$+K=QLL7onb-Tbs0mUp#Sy#d2E$Va6L5?>svB2!nxvifQPCuK7?boY;$`BgvbFJ z;)`}<{RG!$56j6#eYc1JXW52vSfnrh@i6`Q+S5wm`){0%DcbvJaKM0gV;qt@f18sg zpabf^Yr0sr;B7^|LfFJnm}8_j;6;mDKq5&m!7Jpl%3*D5hL>-4&*EI|mu`_Q1lh!a z<}yff4{}?!kcKn^y9BM`KGge@%|TtGy)(7p$g@z2coo+fEACd2TBb}SR2wGZaFHIvB+<9x+oqM7pD zyY+3`N^yYC>OuAjm2<8pB<9K!q)|HhK|$iBFU5bgI;`@I9H>$nO0I4VOKVstY_Dw7 zW<5jj1(hh(P6OCAqf9=v8l0|)v!~zbWvN@CzqFYIf_VHuzhj_(>*eoqhiJi1T3r#f zhh3l8zw++NxXU{VJWzQ68!=BdYd>;?8$DJaIl^T5*sN9Sl}N)D`(foh@&}n*hyfTT z2Wr#D^9UmAXvfwm!{;DfD!e;u-iRG^as4c(%!E)9OzF+Gk{27SgTeTV-g{ zGaV&L>&RlTn6(VC9+VnQ80kfMi2T#X7Im6RhESek)!&cFGclG#gfEY!;|ZH6CO*D3 z$wLco%Mba-vnJyA{6_@tPb!oY2I=t{u@iAXjisu1 zS;9UZxw<)f=UZBFYQzf(7`Bi-5e?uUY?S=ZkfyF5Go00zi$2kvo$ZldK%b}!qQI(v z@O{5^ZH%73eLvQ#yR`--zfHYa-2HmR@*0L#k*~jB;XuuWUkrjkYn+y+85>1cql{^n zvopghY&E}W-t7y@q>u9Sc>Hf@k2zIQH&L!c04qA z7)({$$bj&^&KgaX6$MqT;6(F(J3*=Ym_Q)5R1I)wP;#TR_@4EiodW!3u7vmK$@{jX zwX2^zm&#DIdTGDC#f6!{OO@OR}-mcC@XjyO8=YQT0t6(P@=1@q+0!=`i2WDMt$UPzCh)1%)?t( zt(6<*v^6wZo(p!_gHQG)NuiWhz1Y|KHWP2btz_DqxTI-_<7| z&RtiI24WG);bp{aIG^h~Co^%GLV}<9n-LSP&F2Upe^}Ve6^pLcX` zq_z=5DxslS9~#=zOm`jhk!CZYH=jmd5={a19=O%B_wDLbA;p1=TT<|RH5Um@Fz~qJ z9ZmA6A0jAW;=>Fz&!wf*FpG-ve0a`7=Fj4V75PXb_mqCx$KI7&#{x=A|9l~$DBv!w ztJ%Hb8}8{A$bD@0NV|MFJ0?2h-TYH(cz=@npBG^Y19$X!P2&2dssBbE5!-9lR-~HQaO%ar#ZKuEB=fu5n%TV* z6fz)8l)_eTIXO@>iO2E>+amK|RmR_pC54K(-?OyFOY2 zB2`k7bNZQwR>QW%z!01wqF9vGE&nR#)C#8DpA$5*7z0UbwJ~c7$ za4&n_lz3wN3MyA~(X7>(@E>ACeQ{f1;MZDJ7=_7v7Z1`rW9#L-8McLt86M>jC>^Zq z)87+p!n)J&h^C2pJf%M11I8UG3zXsGZ6$gNVW)O?lv38TJpluI@0$e=c_S~PPj6U4 z!laW7I}SV;S=2NX828Oas6!ewSpVr(|2tzZC?))lrC|kn5&oxFTpML$X*&iJPlQ?% zq6=S;`C{ZCiS!{0oO?#Au2E49WQfT<=QzhH!wZdK~@S;%fS}v_Nys3jBGOk*O#@yr< zAIybKdq+)6;e^zTqL@7lF{>ZM5(pt{bKz!ufmO=bcF zgwS^T6x{agi27l>k)*?B%Dy0A3pF-}w)*0-y|6fGL$`nWFN5El2<>oe>ujz4Yp%`zxPp0fyv<)+Z~2NV+o-3PdC{Y2 z0pRx0DmO{#C-kQKmOR7b|9e-S`DI7HPyN1_o1WW7I5*7lQfOLp+Dm?_Fs_!=<;pqy62H1Wv)W2#~*boei| zQ`){h_(~nykM!!t>6c=92Bm1#$&|B5u3BkYs69) zLVs?Ljl@wN#Ci0qOF-gP`iYBHylAMF#DQ!e4iu$Y>T5}eQ1Ad(bi z(RkVAO8nPQ4Qlp4Y(BFj-1HnMPnf1`A%nK$-#SgZLIGh@R~O@M^=Ga}cnWn-Rsr9a z0pVWmyB0ryXhr_}s2Fd|T*?GyLg-3(QU_H-%mFvF&!96>uNNrwFDtN)TbtHvecm5o zq<`SCb@+z=uoc7jT*C?%xW$#|Hv4{5ds-tW)Kbj7eJ<~OGNOi169PgI8Q8Eht!)%; z6Vk>QA&AiI#B~=(4oD@H!RY~%w;k2SoLVTZ!Y;{8O%XVxya}8Eji2=E;VgS2kDyk| zF0!NBc8Gvj^78u)5fpW*z;a{3^uPYLI^WfwD&&><3L7K)g>$oJT;Yne7Mtf-gp6Jq ziiEyw@+Ldh%`?dn0z+m6J2b)ZiNZ|{3_bX&%}K%unV`f0AFT}}S%fPq)X0esK~GOQ z{UsFQweh#ualek3!ybSJR}_v?>A45895|+pOqR_dKw(+O*<(~cfV}*rf*nZ2nznU; zKL|ZJ7X%^+oP}qih<^X^mt~m$ginB6RY0F|&D;3$mudR$!cG(MDH!Vxg-Sm*9j^`O zy)0mT1nn#mAgq+%=3;U7)cd?F%`WMNKdmzAOUfZuNUxF#wDYaOz~85Dw&6H72%^X<7Il;X#}~ZG_VkcI;h3 zQwu3G8iU!LMJ6_o7#xpifJ0{#K|L{8iXHxzI{%Q4i9WToq%AH|UnZ*0xsAq*A7Eyj zLFe4#`bQ?=s#f!QRKKrJF*%z>Z4krX_Q+bJdj7Q|EIdqLGE^z*SJIg=j=7}qJukwf z$b~A>!UQP;1!_L*ssmm}orQ^{h*&H)J5dWV@6|EUa*Iza3kc*zC*IAz^x_sZi9XI2 zG!*L_O>lBnA(*KrcPW*V#jZMk>GwN8FkaoIwHT#bt_AnZHCoU4YIzgDk*pa`Rz$&Y z)jq8x%KK=r`dKXcBg={#>hJ~&NgJDAC8`KkKc+Q*j%kx0J5X~tdIZvRSZM>qDMTMI zAmPy(>`l+ky=dnMQ7KWR@!@^pFhS^(6>v<=sM-f>LP-`1A2}1Xm${K`j4mUAjDLvl zazS4Cz+^0({z473H+&mb4=GXkQJSAyr#{VI<8iODsN=>-tE!;QN~5O1(t?|&{F&d5 zbG$M7a8$2&QSYs)J#{CHREiFZU#}Vvr*^fP1;T40mAC498vX!wq%88xR#X6E0}!Nv zCFcpYFw7`IGJW)FVg=iTdo;HIg;1Eh!!;ik<*$eTR`b8MaAEn%hC`s1q+(k(ISHmW zXU`|k+|fXq(;w6gQTC7+8DxX&hea&@h6cee4o2V=JLW=;{tf_J#^V8#zJ@_vtuEI7 zfLv`E$nYUCpNuOD_E(GU#?BVt^kF>n`%b4mz)k z-IxE2rT3THJTOFIVM4NKJLe4%_SQ9ZQv;BbMCd$?prai}m~*I{X4?gE^%2hrYE%A~O4%9EJhvv> z@!PzWJ%=|3=KX?iqI;x5*V>EBH&E;*RhCC#MCYS~yZr|D+MU)P0--Gwz!Xs&8$v|e zg#P&eV0tY*)4ZUT03z^ZV}-s9WMFi$BPc?TlnnSO5oaB^%E}F)uA)rrViSYRwx}ru zVKk@S4)t$857REi%n#dB>>)RjP%Y;H;6Dp`my!005(#KnZ*`B@F~QtHH;UkDWG4SQ zCzMP(-A#!RYmT4#ea_m1D<`&_=(Pc*X8%~W?(_HEUwDq}=vrLl`pF6`u)3X($fsgyWiPwQ2_)n34@hP zH*|Aw5Z|$LYpxUw#_dvGz@sh&Z+M#u8oIGc{6qJ8GFeQOJwm!!0*n3*j=P8V`Wl)L zDC0x5C{F8w zCwfpy*KwV0>xH6;41;eS(^TX!h9nuE7pjny`Q?zeV~C>bn(WH9Iv*@rjluBxaGc@`FhEJS7 zdbtNjg*xnPS;Z;Nq$AloJb5~^#K7?U^{MR%`2kUIj({A7ZYcEnAhI9ftn)Gjvg){3 z;vc)wkvwuYE&y1kiRa@~0O;s*s4c%w2=8dqi!I;utKzq8m8zWS-d_0VXh%bPq(|{A zXv&Y@tQ8E^y0?lhL?v4j;NAeWoq;F37$}bfc=hJ(%#O8>g4ez%nLFqc%W4L^@^kuR zrbd2DXIS!;k9(kLIVa6#)H|z8q!$b!?E|~e3=|@2% zCI=^b!ieDH<$~?pL4%5_H?o?vg-%&N*Q9Z9kTxE;1NSszr61kkQmZJZmdX@fc-!AV}ztU zmug5Kw54p$Ic2H)3-SCHty!eAxGDs?9)K$!(MG;jWq92Y5|4d^Y7_a~Q^P?~VROra zZGfX0fU;cHC>6?B@RBc7*kx&zzFxG7!BCb8Y$FE&H=})wKip5^+*ZEQS`_-LXa%gy zXK_*z2xx%?POO4%4~P#DClBE-vWnfEN}vyQKjXk{dI1p+&hXPUHMCe6ZmWdasP<2J z(jZY$=!!^v*#_7Gm?CrPKGZq-U>o(ZY-EY}&7eOvfTH9q{R#H{ER~kI>ZEj8Q0jr1OV0s{j8KOw^2!4~rx2 z5Sl3|g=EGz%=>Bg#q)2k+%Q1Ai9jNHT>T}nQE9fTVxE=NO1w}Q7n3}1M_lJ@zzlP_ zLsKFYY;cyUem!!IDwb!g70EB0vxvSgKUFmgEkCRUpFOBrY>)`FW6SsQpd|OFC^N3% z(fNiqm!~P~bmksttn#w(aO1Sc`LEa*(2v86Dbc#Ycf4Fi;XVH8!mdF6FlU%s!pJpm VqX#R)5thPCtL>?^$Uevz006v`+l&AJ literal 0 HcmV?d00001 diff --git a/resources/views/welcome.blade.php b/resources/views/welcome.blade.php index 56e4574..910f9a7 100644 --- a/resources/views/welcome.blade.php +++ b/resources/views/welcome.blade.php @@ -158,6 +158,29 @@ .terminal .c { color: #6f8c8a; } .terminal .g { color: #FFD23F; } + /* ── Screenshot band ─────────────────────── */ + .shot { text-align: center; } + .shot .frame { + border: var(--bd); box-shadow: var(--sh); background: #0F1E1D; margin-top: 26px; + overflow: hidden; max-width: 980px; margin-left: auto; margin-right: auto; + } + .shot .chrome { display: flex; align-items: center; gap: 8px; padding: 11px 14px; background: var(--ink); } + .shot .chrome i { width: 12px; height: 12px; border-radius: 50%; display: inline-block; } + .shot .chrome i:nth-child(1){ background:#FF6B5C } .shot .chrome i:nth-child(2){ background:#FFD23F } .shot .chrome i:nth-child(3){ background:#00AFB4 } + .shot .chrome .url { margin-left: 10px; font-family: var(--mono); font-size: .76rem; color: #9fb3b1; background:#0F1E1D; padding:.25rem .7rem; border-radius:4px; } + .shot .frame img { width: 100%; display: block; } + .shot .cap { margin-top: 16px; font-family: var(--mono); font-size: .85rem; opacity: .7; } + + /* ── Ethos / manifesto ───────────────────── */ + .ethos { background: var(--coral); border-top: var(--bd); border-bottom: var(--bd); } + .ethos .wrap { display: grid; grid-template-columns: auto 1fr; gap: 30px; align-items: center; } + .ethos .mark { width: 96px; height: auto; border: var(--bd); background: var(--cream); box-shadow: var(--sh-sm); padding: 8px; } + .ethos h2 { color: #fff; font-size: clamp(1.8rem, 3.6vw, 2.6rem); margin: 0 0 12px; } + .ethos p { color: #fff; font-size: 1.12rem; max-width: 60ch; margin: 0; } + .ethos .kicker { color: var(--ink); } + .ethos b { background: var(--ink); color: var(--light); padding: 0 .25em; } + @media (max-width: 880px) { .ethos .wrap { grid-template-columns: 1fr; } .ethos .mark { width: 76px; } } + /* ── Maker / footer ──────────────────────── */ .maker .wrap { display: flex; align-items: center; justify-content: space-between; gap: 24px; flex-wrap: wrap; } .maker p { margin: 0; max-width: 48ch; } @@ -213,7 +236,7 @@ @endif
    - MIT licensed + AGPL-3.0 copyleft Docker in ~2 min 8 libraries, one place
    @@ -242,6 +265,19 @@ +
    +
    +

    See it in action

    +

    Your whole library, one tidy grid.

    +

    Search, filter, rate and revisit — the same calm interface across every kind of media.

    +
    +
    teal.yourserver.tld/movies
    + The TEAL app showing a movie library grid on real data +
    +

    ↑ a real TEAL library, running on real data

    +
    +
    +

    Why TEAL

    @@ -271,6 +307,17 @@
    +
    +
    + +
    +

    Why it's built this way

    +

    Human-made. Copyleft. Clanker-free.

    +

    TEAL is hand-built by a person who actually uses it — not generated, not slop, not a growth funnel. It's AGPL-3.0: run it, fork it, improve it, but you can't lock it away or sell our work back to us. Built for humans keeping track of what they love — not for models strip-mining your taste.

    +
    +
    +
    +
    From ea9369ddc84067f4f8cd074d4aaecf116278b3d1 Mon Sep 17 00:00:00 2001 From: dotMavriQ Date: Tue, 2 Jun 2026 20:03:45 +0100 Subject: [PATCH 40/77] landing: soften ethos to plain 'human-made & copyleft' MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Drops the anti-AI framing — keeps the human-made + AGPL copyleft message, nothing more. Updates the OG eyebrow to match. --- public/brand/og.png | Bin 70432 -> 65002 bytes resources/views/welcome.blade.php | 4 ++-- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/public/brand/og.png b/public/brand/og.png index 5e0c1a79e4a20544bc8033b33aabf941ac3cb059..4985b9ee3f01d3a682c9b90a26682fde9448428d 100644 GIT binary patch literal 65002 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%0DHl^dL-+qN5!qbUzR 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 diff --git a/resources/views/welcome.blade.php b/resources/views/welcome.blade.php index 910f9a7..19d8d53 100644 --- a/resources/views/welcome.blade.php +++ b/resources/views/welcome.blade.php @@ -312,8 +312,8 @@

    Why it's built this way

    -

    Human-made. Copyleft. Clanker-free.

    -

    TEAL is hand-built by a person who actually uses it — not generated, not slop, not a growth funnel. It's AGPL-3.0: run it, fork it, improve it, but you can't lock it away or sell our work back to us. Built for humans keeping track of what they love — not for models strip-mining your taste.

    +

    Human-made & copyleft.

    +

    TEAL is hand-built by someone who actually uses it, and it's AGPL-3.0 — copyleft, so it stays free: run it, fork it, improve it, share your changes back. A small tool made to be kept, not monetised.

    From 7a1b78752d115d1fe6a5f89c59eb6a7a4e14ebea Mon Sep 17 00:00:00 2001 From: dotMavriQ Date: Tue, 2 Jun 2026 20:15:03 +0100 Subject: [PATCH 41/77] landing: use the books library for the screenshot Swaps the 'See it in action' shot to the book grid (more varied covers) and updates the frame URL to /books. --- public/brand/screenshot.webp | Bin 165812 -> 127298 bytes resources/views/welcome.blade.php | 4 ++-- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/public/brand/screenshot.webp b/public/brand/screenshot.webp index ef65e9987a13a74bd086dc98f82ffb96f5d9a45d..559dc6620e3305a27beca905ce7a097217527ea1 100644 GIT binary patch literal 127298 zcmce+V|XTA6fGD#9ox2T8y(xW(Lu+yZQFLzvDvZhbjiKCYIK74c11+;x_ykbl&-LZEi{p7nGzI+rp%1`% zAv&4M@TGelI|Ld59{mSC3IITdoi8BWh2@TIq0kX94JZZl`P>EmJv@QOz*Ar-z<>Yt zS?HPQrGLrq=_jWPlK0_qcpu?$ZAd_yR2a0=_u{ z3xVALqMrC`q1*m@|3;uI5O_xPp8iJk2FxR3?|%~l0VEo1IsnGj} zH1P0i6zF>2{WS*gzoGirO{`yc{PI8RKlBFzfsdfT+l`M`XrN*%P#h=%Ap5wz;_B_s z_PhN0_=LVjdWn|?62HCN>}~1dKk9c1On-yJ1R~$L-gj>e&;76c;~$3sV;{TkNbkExLcq_~cgvUhr~U(fci`^d z7tel&{LFusddt7*?=sx&|NA9Aeto@s)j#+5_?7ub0WE=iUyjG|YeWzISNXR>L;m@| zc7X2R3Hy)6UjlD|1whpgXCQEI_gv`s@58cz${(hGTY+an_rOb`8(=>$7q}1b`CC)p zGY9Oy=s)z$_?iKJ0pLo-1|DnhoM$t zaTx#aMN_Hj6tBr~Fs1F_b>@c^8zQu4dnMIH_Q$mQ^3@@(Td_R|P6w(rwXt%q2V6moK= zOm?`NEnK#Wtc8fg-68BjH^__d9b(c9`}s2_CaKNv8)R|aOH0XNlvrFiR_tU|4)bbe zrI)QQ*3(O_8Z+^N>70G_qs(EgL54F7$P3vWri`*3gr+)6}%9;Pm^kY1qCsuuuX%X*bB`X^N$%B8Jspv&W zY%rCxNZ%HWMnd*%(S^HC>J#g@G$7#-%K2lVBt)0#>nVeXlv?5GCJMrr8AK=VEhe5o zk(+w5K+x_)!|~}v@tta6oQGOS#^C1vKZ}e5A&jR|R6eFrovoZl1UDK?upxWsPYN3- zD_mAmYTJbbsvaTke~U}t0mizk3{;7|>{g{CT#QodZl7R$iEj?s%?7ok`JD6qg?Y}Y z$Z$u5P#O`V!J@on*N`690%n`C06c@7G&d)qu_3gwYnY4dmVX~LuCn`I7nqCKJs+3# z@*BV0+BAWExrFD2_}pv6)DP+i2v4JHUQ(l4d$mPFa{k2NlLPVuER@w6R65NB!v9m$inBB z(qa(+Iq($ckWb{o|NGLxxBY_V4B>$%Q1#B5kDDv5vIp=Sxy10&e!3-nu;PcqnGpBS zr69r`Tax!phm#CtM6f1Q8OE2(DG;dF7k`WDC;0!XUP8$iu9!tlL|pZ#&;`T(G2s!v zYZyWni$r5r21#V9Mp(Q;DKA$XU3^3t684N|T3Wq*QEc92zk{cFBruARmODHG)#(4U zZjnA=8k?u@B!8{GMyf<-HmkkHxq_K9|Kbz=1bfw6JOiBp=Zra#ANf7BLfb$A0xj%C zX3)~t#XAg!@IN!_vg+P1TQQLB7*K22hb~c?85|qUM}-0arvh*8R_K!q_`@ToIB5rrmF zFgP%MlPkTgPFlw&g)E2iG~Kz_wRJf5ZHL)aEn13dP+JDt#49_*gB5Yt;}kJ2%J}i8 z-VeOIY;&vp%z`wv5O(Xl@187qC*}{r`xdD!!lFrgr*+N)r$1$;j;P57dV&~edIe#3YItQ z);O$fVe?=i7N=*^lO!5I3(9q>8q9z0GJq?A0>*}ee5d&eet??rRFJ{lx`PGICy zm?G%FD4nUZoA>B22yX=$4KL<V+{I9< zuEVUKFixYt?P5-JiUa*0hFRg;5!!tuj2H0y!>vP~fsN44j$pPt(g=ZVglYmyZJ1vm zq3>iBGp^ORqTd81^s`%yuk%HQ{~!L9{|WUbHH-h@P2ECzFY`fVHEM}ANWf5TR}-pG z*JtOs=-k!>2E}7H%>VMc{ZB&-wNQxu2U%Q0zrYl|*pc4@BK}#LV4)4BX0ixU#lIz( z7rVeLH2>H5Kg{rNBb-kF7RrBn-|kF>!z_kMx*x1DLm5?<5fFtS9^8D15k zkGpqf-W`7(nBY)DgR|GAQmDJez)U-6H)B`ZUX8yVg!!E@jKZyiEf~z;x~mwU=`X-=?@RHbx~~ewcv&cF7;A0D zbSvtLWhQy*du0MpaL+uK2$3p7Q3v#v6z){0ZmZRPU~LD3yrRCIl+bO{uV)irndW-I zKaDE39JG*Ywn^A>mqV+9mE<54M;GtucW1sA+^TB)DayjO64739kWOj;GRmDwY~DlaH&+5%p0J;VjEbYWb7#UtEzv zpU1}W;cCp1D@slO?E#MG2w#nVv_X@Epz8h2>+hUs2ReQnrM{VUkvWgW_06RMG{>uq z^sVGaBX;`NyDk~1KVki}T~1W}TEoxO(vX@vuW+2Fs47ZYIxMk`T9cHF>wz7;&9Lrf z4yZbYr|h-w+?}w0H=xu3FFb0CH=bVErCgU1ZCO6Gl77^0kyZ4urNh_iEEa~wYRyje zdMhu)PB{8Q_i~-vkk_ROMNf;fn&TsuCORb1bK?~U7xEdN92_k)%lMpQ-{2q7%gpB* z3%QB&Cc`#;uZhWrmx;yhD7Gz=xK)0G43M1PMIR8<$(ZFJnII!|`Oh?mGFEICN5G+J znz4Vt>d~M6;@WdtuDZG+oaAl>eF0n=;5-t)tLjthM*@m&i(BntDPSmR8p+Lf+LV_{ zp-F|_PB3(SVRLTOrv@rEnuz1PLK&g%)wk6m*G7lC-Z_7Jt{B7P(udS^9c+ z@@A;Jc8gSlG(7Hot>n;?uE@~niro>fPp`xLk&Ub4V8+Y$dGm|FKX(raVRXSCv87{6 zVs7-b$}>~mJJ9k~Ku>H!tz$}8{uS`_7MMXlZPFQcj*ClQv@SjNXZa5w(lff~U@tL0 zqyiue8nZ*yu?tgGd#iBc1L^tX0=X$kBhuV1MUL*I*3P#juuiw#EEZo&?lpC{=@!}w z1JZ8G7^HN7-#D8$c~t&NbA!R3!)A5A0&^T~O{{dN_l*k4KfVR8-ES12 zva(Mn|HemaUp#x$`=)0+LiM@SQ#!}$brbuS{dG2SF#6eluBQ51fsL1!wTYMh z1vdSl041?M>Wi*uPDp7BZg1i@MGV~C2NUZQoMGth_`zD_mO5G%l`mqlIQoRD?{+Hh zb#F<1+wcf;X{6q5*iVQ2A}t%Sl$5NnX=s9{wcaU;>DNmPG*u>aFx<}Xl{}RX!g$6) z+Hv77DNSoPhaVHiXh})E^&<0V-2LGl##^w;lK08MNR_|!2IT6P=4siyZ#aksULQX@ z8Wf-48NebXp0j+9+(9y*m@JE#qVX;5YRP)2z{wBpc0cI(v%rfk=gNYFYG$bI)rE!p zu>W)IQA6S-m-;AMNL8eR8r}XbsXV*t%q3}TEIv@i?h)P;oR$R*8M$sKl-Xx?(d~BM+h1xj6(x0Vv@$d=&cuxb z*()n+=f09L^#o(8>~R0I=GdoxYYJtg?CedGKFIsP+|?i#m}$^E>Zdehi~j+IZUn5= zEB-b%pl_{aKvv8DGyzQXvh0|^{TB#G9DJK8lruJeCGLGyEuj|vApk6ce_wc+4L4=ahE5T(mv_FqJoj{5f|l= zd0n`?Um0YRC-RGiUU3!4i|fJmHCp!Pt8;-+W+e`kF{EujF_ZY~<_O}6)Icl|qQfQf z!WXo;uUFv!la|8lnD zvc|jEnd=pZ2;_nHX^GuC`4>Nt`!iPkf~O8}`YC@R3Tq;Coi(`SC04}kD$FCzdHH~B zOwr;1k#=myY-^3|@eAvLBT{u+oVN?a;c+CUpJvc3Dn{$Lk1==wR6s$}n1M@LPB}O^ zY-v=ab!?3PhjZlhSM@Cmi{ck>iz8Oa+wmMisscl5sRb8g4e|;L&?3H8yX~}Zp%}L& z07WF^9CFqM6Pcr%GUcQuf`$8IhEQ=TnvbN+`n=&16$9}Pyy0rpt;#CSn$=hA!i#*a zF-9fgR^^TR$|_zEn`JZH4Rh5o>qX&?h(#OYW{~z(MEmbMykOLfTr8%U@qSXXm;|wM zxhZI+j!I8AjO0kT1lcicuiprlJ{A#;4f#Rn+`IQCb;BBJxJO$8uw-9sTXiJ~&U%<* zE0*MgUXNDb_9+SOkbE_LVYa3OeTo=&cS&x}Fy;XWPwIDY&#D+TXb3&i*m$E7H4*UE zeMTg35M!JK=<>o4!eyHw6Yw_)K?Of_+z{f~u06GtC#bnT2=t+xNeKF|i5Ea2>?FdqY#7-IzlGm- zDYm-KYTsuPSXo!$CD;MXjUfK8`{s_X$yk(Hjf)rr2$YhM6(GT=xU65e7Pvex?qXd1 z@O=rmptT%96LcK{By|PHb*^x935Kve%{6g^$$rBS1988g{R4oD3z+XYjYEFU#57N5 zq>r0Y3H4L#Rq{-STZ8UpQ*FBxx~S2>6C;n7s|$2y=n}kh$sEfyh+=3%wpNN;9=(P4 z%QMMTpPx@Q3pw}uLwMjdQoz1#O88#}N9v5evTGo5fFxyyd)H)fal6RVX^jsH^{%5o z14r>sK<=1T8?B93R{4}`;R+Ta7}DL&enQd$3K}P{xPdCTIva^!(>M{z*aUB;QYj5| zwuu$1?l|H7CHkiByz6HzB=D=IyC=w^wQ{u}1H6@k;-lY2sJv?TmU#(^M zj&fx6)=QJ86N5KxumlX*y44OIwr(B~s}Yl-AE0y@ef90;#FR4%`LK z-@8U1s{Td;W#%wS$P&Itycu&HB5!ZD1rdOW?FvdEdLigGQ$<{0-#In4GUB z7{S=X2O6bvgt{LN$FD?|Dx+U{d5)Lrb%g4Ei?_|HepOHTprn4uQM2Xqmo=zq+8v7* z;v-;uUA04|V?(nahx|X!SWUSk(sNh`){peS{6b4=wwy!cL4JObGl#5C)^Gl<1^tM* zOJhkvIkoPr_&hMlai^sN?P>K)yZV9T)UmeK$nmVPS8)RSu4$OM8|;D@nEpj@i<{>x z=Y`}aYl`}yQmJLr-O~o2S=x!&dxjwNzO$b`Hw*8dT}e@j%&F&x z2Lys0eRHlf;J{XbnjRfPmmNhxPxnfxYhP7hRB+=-81g4>UM@Mt*y)eI5%wsLq@p$U zq%A2R`DLR>& zgjgu5$Ad`zMMa9gbgZxDew_)7J&K`U2tPCo2)6dehj`TP{$(zkq|M|$ ziz$ZUn&V%0OrZ#Z6o}Eb(egS|)*{yXRXDhwr*jkiPr%2D&=hshC3alT&X&SzAZ zoj9P?SGuSO!NS+0P!SmMEC^2mM0d_|U4XF}S!leh>yk!=ChV5k^+v9~@ry6!mHmPd z{&D>Kt%l=##Yv;wstOLCN2s8~PYaDxQv1KoPIt{wMfOwx`k~*>Gp<;)Sxx(+1R%7H(UNm()Gyp&@kpxR-Gya3%#iz^Q;ktI z%*#E>(O+~RY4pQB-2c+m3oR?Hv$(K;+QFbFchWm_a4Y={7i@d24`}1EmCn01gY(R3 ze7anI2I*y$P08vwG4W^ip;P@|VLLaYd?v}Jt zk$PrHrY)SIDO920;&%wd?$N84YH*~s^8V~9Z&}h(o)?R%21tn{G9e)zaIDo^b`i={ zKuw+!Zz?!E?4rrYb*JA*<_fr^TpV0vz_9#2KYnk3f{7K(Pd}$ua|8_9yce@|Sm99X z8L1}^PvVDGQFF-hhyskAx0Og|2Edg=J+1tOxM2}cpPCnz8tD~a-8j!eq2}XA%ec7Z z*|TTGvLQNd0LBB>SZ6mNx#CfB&vehT6i0sOg8aB{4)tGO;$WMNZR)qyp|7DtkzrlD^$y5<%W_j8p)mWlfnQn{$QG(HA*;QHF4mdr$!d)iCkPbA>UzS=$ z1w<`k5L(oq9X8rJI>pWj5{6?abIHzFIaBd5sl6AXoxeb0v18kB; zyU0n@3?9|c*~zC-s89rp13}ex>OYuxbnfA|k1q1&C(G`mK7}=j)v}|(mXT(kwz)FR zAsvth=I6<&Ha|fA==^>(1wx!6tFN0bWXJtf=3mWBY%BJ$IgdNDmS}&1hr=0tONQk; zC%A4JaY{_?WM`0Q|18hI8RqU7|Q`{C31x!p|c8uK6D#4j151yS*-TGg(H2#&mFx zW>-WjV&RV%mp0$+vieKD%qz-N9_%Ndr91zK38)6%Ch`d%fi& z&BV%o*Wos(%p!r^MoDC3(nq3D2<_qcGe#x9+?}pl@Z&2%l)b2?lOBFQs6ZR zJC_wIG~Y&ob0=tSB27S5Mos56BV)#Ef5hcO8JsNgR+A0L-}e~E5!mqO>iom~dXvqm z$v19In8ekt@hqQ1W`h&z)E62I%KF$F+UX%8+`td>9~r@<__prg4xMKY>k;gaU*2nA zr@7EpW#L9v?RWf~ZSX5fmo|cWzuirhmpWioYC4^~<^(a-de)MK@zc4=TS0FKk_j1n!FGyTs9WV(%OCF?&5L8Mue{|6f!b9$+Vc7?jESxt{1(ZsCeGUB z>3cn%Ye%=W&14?jLujRL({J}70gOA=y1i+N?|V%DBf-g{mge9L%Uw}zLam`tCwI+# z2G&Ay@foQlspgNDP;G8G4iU&z$>8B7^v9!3&AcFwV~Agl)7J(-vHziui~otqoBRMH zfA~{62R7wfV}IHC;h!4KN{rQld~$gQSpmfiAS5i-Omn8PF5fjk8C0uV>F><@Q)bO-!n~A{+jW zU4yiBu~D)tCn@BRqj2u_qYlXLld}9=N*BM8tukuFyJruIlRhErgf}-5#SY=bZbg)Q zGkrOOWjHx*gEt$5p;^Qsjv$n?H`m9MBKyi370|!}dSuo%!{O#rVgGSjSGR4ukUR0l zLb#Vkt0NVC0wJG9wMJcU<5fOH<$zq3{I`p&Ou7Z&T?Gorj4VH$Bys*RAJo<1WzE+V zs~gdLug$%zoDT8Uf)v8sc#--X+(N10quF2j$-n4T*QQhEO6z1VI(}4BZ>NxT-(NdF ziDWUpzj(>x=pRuq)Vx%r90=o%m)0W<*}@vv;?Z?WX6^0SBO}O05jE7=v>VIvk3FOq zD6d5Rf%{l#RD&8qDs1EBBEp@47RtOIIUoO?1|BYAxb5 zOS4X5BojtoC_0?e=L!dMYM+`#)7%$wOWsiOr(x^&lYNubpLgG}bS$<J)XZpBWf zxVGQ)65J>caj`uS_Nn<7DAxASzk0uT;k?@Q{Z*RZF2z#-tu_0IDMAqk=8N|3>vQL3 zml9e?H1=)hes&ec z3u3K~Xj}a1@B0CV66RwwMb>l_xg71_jcmd{B4G>Ox-IC%9Q&sAV1L3|(EjuGGSO7$Nf##OTme2EpxPuMQtNUK)#3^*wGccU*_ zz5n>23FC-&V)U-6$@8X!XT@*JaVs7h6TEhpeOvifIro^p7mj#=UZMEC4tQ zkap(G?l3JW0A{dGZ`Z)!JI{q2mUhRtubz4@`)1XUVakFmyYd5KeCGW5K$0i&aHb~q zaQcY(=qzgfQflWP0?&a9Lh~bBcVU`kuGYdlKtZ^IJ80j^Z%z}BN0croRIR$+`0yy- zt@uLfOlHoU5@H}>!lK>c4eZa(hFiz5Sr@FEcaRR2tbObSPjv1!pEx=UDJML*1KBAB z3!JNODiPP0@&dc@)raBAGs2%znjGAl(08G>6j&t+rj##35?<~I-TopK1hsSgzJTO~ zrqx*B%{3KRl?5yCj5gneTill85~nO6MyI^dS3zMR?j~zS?1U@|vZ4IvuasoOc5unj^w;jhPbMqTa}m&Pk!HYQh09O>#XYWC z*lJy-%o$-UKM?2;zy0euPHuXch%qA<^xpirl&mwq;2`>Uo$X61vICR_IEOT4_te;;+zFP4jFR(aVF+N9I<~vE} zdEa-hs5wK^`OyzZLxdyjNOJPPqYLu5?e=~{d_L{XTrC+%OXj*`u3?)0sbc8d<$`Wb z;QdBNM7;){KD`wS`sg2j__K=cxx|n529EV!#sZ5)mpN6&$cHZyV z@}AlUA}nL+`2L!*t5Xv9Lt<#3`&Y?%qfY6CHz}fX#o818%#^JU_t3KN6GNL8f+OJ1 zr{R*cd6KrP6l0NB9ZW=DWqea51z~$P9xd_fCyHqx@pPc>(Pw;s%82UPORDmu`~AVu z4+`h{f&c-2yVS;lbJZ6YvLj|h#mZO@cN&Jlg4psSxgPV8<W!{&>z;7lG~cwrk_GTb7`^D~h_#kOw;6ZEy0H6wL19W5iX5^>c2 zDqi4Bqf%!*ldQx)3~$6Ei{HO%4qaj(^aqEk!4znUbPLNw9@b4o*=beY$qjx#_};al z+vHLk5PxGbkNx6o?qIh&V%v1=8nb=s*!MIS=+zJK`>So26v%f!U)_mZ~Be zhJ>kz;}O*^*6P+`aEHQD|ByV(9%UqMr?EXpY;d+*kd!toP49hSXM8wnWZHmt2`nmm zjG|}C(JX~PZ|K!^RS~n<=lh)0o-aTh`*FZAME7VH@NHB+7fxdN`re9qZxgPFqw)2x z4}x4c%1OVYARlizeB{!dd59i%-JjpJjsd+99}|#{uR-+yU>WSLY;o{ zQ*xaJx(w&Go7?4j*tD)y1TFN{lQ5;hoAf))Yyb2ubtNg7ZsH^;{lIKE1FWy7lLoWK zSqKE}bywz;&fxFGj%mxqZu#9lx<2)d;}^B?P}52U<6?R8XL$&ZwD)i^7DQ%ITQ8H3 zPvy%cw4m!>N700VXQzk-cpNG4|I(t7V{A2A^A74UjNc zQ(?WfKR7>bU{!1EKkZtQ$k%$k(NIfZfrq4#b@m`+f}3DSL%y8~z86ID4K7=%d>NKA zZ2MV;g~uiP&Tkkt0kz|Y?dEfnC#gd9(Fog@BfG#%X;>+UR&a#*U~`|+DxtNJ?xJtk z$71lyZcWd@@Aq4w-i`(+_meGok5akSU_S;;jw1Q5eZKE=`^C*`07K!sdoCy=A`gA1 z-LmAK@l&<<(NC%|wdi0glowm7;x|)iLwwsO z)yF9{K=iC4V9&)Vv&9gT+WBTa2kh)XhvH8u$+IDYO$~>(zcg4MH`zMmPy@k(aHoph zaTnR~gySER9yP4%`d4OiOl_!%D{7_HH%ytC8d5zd{pL(#pYfKgXddSoLdqIZH1Tr-swM@NUiRFV?mr? z2)d!L@3m|K52S>ZshQxWtL{Kc}amnY@gFzc0 zYazBTDD<^o77A1mkff1!wlbq}m8xWkyT^b~)a}%&c0piQ6AP9Nj9dvA2wT(ls%n8# zH`h;k!lx);Z^WfnFXIx(*xHX>cd8`M>knii8zF!`o%U-GD`~q(PN~`yhmf7(JDi+G z42ZZ6ROtPHoX#o@wFPS&Klf~k6nYIIrw}q0k|a@b=6<;qiT+I_#Mi{bWcQ&%Nyw20 z5f~k#Lej-g%(BxIjhG4pG5F!Ot~iZ5<-&T>(HK6wj=ghr8DX6LPZS6O=S6Nu${a$M zGyWpy-2TUBB3Bdl#}N$j1W(%amuQ&Y}@~d7I--eNQ{vRJW!O;5|GF z_)xG+l3Gn6a8|77$0wZxlFco-I(Um32Wi&P{y5xSFr76geBb*~o}N{GW5QafjAau! zinHNI6KK^viLXA4=)5rG3q#~iD_zSfLU$x_PcH;uS1WUvn7rx){uSjeO9bMM)TEED z&bXi!br`kJ)6_d%su&wGLd>T}|V2oUEk~Lg%XUzoHTF{*eAr|^+;PlFm)6Wu! z8tUlphY5{UBV*X-*h=Z9+qlfNO_nu>!7lm+-k`BEv`F;r1;sm|YeRl8N{4=cbAD+> zb=xN0&6}l9CIlkcXp0*lRPP{ni>EYvT|-9lWjUUxk`5Ar_muPu9kiW)`ax8`RbBq+ zD1V~M><{M)q`)Wj84L@(MFI%vT1w@}XvXtLB<>L2pA(Y)5A^+BfNTEdAI#igiS~Wt z#l$Q{b$}m*^0yGSHfW*IjWTMh(O5`7-p&o=PXx5f3coC`)b-a1Vg!=DaA>-w>R|5% z3W34^2xD3lzl3TT(-)Ifiw325YEPl-^-Q%54T+_3hw2i0;=CLGN`5zMk}!MdR}jFv z`^a%0N=>&JuFr3DveDVnDFI+Ke+%)IKLc!|OH)oG9Z;xm47uD#DX3!^@`SoB( znN+-Qmpa9WFcVe2-bW&jMj-#=0Oj*S5Bu71a*=ksrMJ`oXNF8Pyj;L{KbN#!68jZE zpcs#l%j;%ZwOCW4817C}L!5+3>?0v#9^JWDN5qFY?*oXF-%EW2-9n4PF_afck1i?^ z{~Tw>9SZrL2FINz;?eQ?>@pRH6$=d^tqf@Zz7%ui^ILW`W>xVZJr7~FTae;gtoI%{ zzMA-rlKr$X`TXfxw#Kgu%O32^vV1Efx5F97TCAOlI zm5iDA33c66ajLPQJ~9~tXw9Xc$K~UPSLGSHkR4`{6Dwk=`Ga*R>5oYSikhD-mv*ga zW?YY-NM9+TjRZej`;vQPB5LgDb2H*is}GOy_8+ZF>-cZmd-fmR_6Gu>IgMqyZ$fZ) zvyu}y^E8DCLD-4I?-q)atQAO4DOba)*g|zK=xGP)BMU5@>JqwnyA*CUaS_k`>4hbA z_UPWfD@^+@OhF)Yh~Gs&W*=qls~>kuHlC5ta(NJo*G4_}F)w|ZEx!OcjKf57S!5Ru z4J)A*+p`T&RRpu47pl>U_&RG{G!=I#9Xl&Cy}rDn<||Q>{KvY|j>iJyw1-f%*v|=I z7uZuQ4$)TuBg+Pfk@jBra|{*2g8jtu$ISIACE>LV`s-+zPrR`Jmb_QS>|rjl$e8dR zSL`y|*0E0hG}>ma;^*`LZ%cw+?P}&13&-u~O%nGBWtAjLGX;hWnef2kYZ0T-=l3b# zNvttj5OXQr_aj&D?7S~_#46V73B%@nTkGmNJi_Njd@m|>)dg1ki5-FhOccM_E-{clO+$LDbpL>bjV%ezqw zi^rcc9Ta<{TcapYo->a>AtIc|ca5BAl%P6&T}~c=-#m-RSmekxCIT$j!NO7(mMrpj zjCSmHAk!x{w&NHf8W@%?QGqt(TDe|^G|6P#0um{yj2=!xIT_|I>gOaw@~!q}$>k2S=SecCC=)Le%Uv2THVpt8&;O_?7O^`o&lq&eutrC5TE~{{<`iK3T*ej2i>rWIuyK$GuHi)6 z@TMQ-lG~B=zqyQ_VN#m*B?)KgbV%Oc<~a7$JeMrKd$1!JMSPs>Yb*QVr2r$GvYch! z6Pwt|ZLS@c$dML1^5=`7$B}{`Y+;Oqv};Mvy1y6j&2g1FlQw4Xp8HaT1wyW^?Q0Bx z2_+L97hKIq&$r3V7Z~pyI~oaAmtS2^NBAbHcpA^v_4=mHEce!ze_-!Es8-eycw3ia zEa!^?)0y-O-X_oMO1)TJPg7Lpao}iOe=FBaHn9{`%r(_ZS0G)WQ-J-IM$r2s{mI-z z2=q|_jT+(?63=P1UXX`JyV1IE=%cQ9ni;KyN0n;K?n5bkcvs@btYQvb%veOg2XTZ* zj}s%fxA9yk4M5mqSFGs9NxAsshe$l_OOG_lsD`ohHBHvzgvuy+p|+^?)c)3g-*3uRVs#wz3!}@2XZz;fF%O{ahq=CW#2T#?GY>!# zM8*AcNfvjou=JKsq*K0N$Yju5v!2W~g>9iN(6GUMDzV1w0%C;Yu(8UF(P5S!NqoVH zv8XX+xK-tZR@^^A7Vw#pM>tnc;;2fJGJ}pIi6!=8f5V$2J_!dFlPtikY*t*o8A0dL z;N|% zTFqf|urM3lP2#{_fP@=hs(n>?v)y%Or5`rSg%RW8Rr}h1NZ#ui^71;-rvm$t`msik z>*Eyn8wAlqj(vrUKwClCVE_b#O7}{0;KflAO(A!Dv$&Ijz^^;eokRkPVVJG$@_eh* zZe|?g`&G7i1m+SJI!L_U6{UVsU|1T5QyN^2EJ(LJ*thxbgFO-Y_}{|_f2_l+Cv^dj zu+mS0{*cfpVl$EUU|}GpchQBRs1{pLoi9m|ep3V~2GRb8)=+%p<<~ki_2I zak$4b|1>UcYqzA2vLk|a7)!~H^Yoy&if~1e<;`v7yc%z3r<>DUqlEM*j`;4BtoGHM zK`T>S%Z(&u7mV#1*K=!fl@Nu4=br z&vtgGx~}Bf!vZ~Sk{pnzOr*^**pVS9dRyKyq+ z#-uQYnr7XR9-50`-J>n|I5>i+(x;n z?574A|H31y0#ydpJDGOMJN-^1ey4&hv}}_Wf2ixDjg-(BO|Kv;N4g$|gmXLdXRi$# zOp3~w>hZVb5ruLDNop>Zn19t|{T%~u-i8t`Ok}wnGl<7GZXw;Jhl3C7@s_z+pJOe! zU0?*oZ#d06etIp3yhBwBGiD8xPZ(wU(|l9gn*gsUT6p!BO5K*wi1+D9az^5`nHwoq z>yn8{k>ZU`N>)bnNH0{8LmW^0**f2XmhmhBa3rCT-K(BTF56z|IXB^iI`R)Y42;X_ zY9M4P5VQV8x(3p~K!CfCRe=R|p~sZ`cs^~yJW}Cyh87vGx<~D!GKRLMs6P37Xd%Ia zG-N&ucs%^Qg7anXqtu(hw^U4P%bemPwHh2Qt)K`oulkHDI`u?S@2%*VhG!)Fm+7c` zo%rrT^~i;Bm&R-M^lr8a)j^_BA|$Wj;S^rHvD^n0bA7elQH1;uLl6fFoLzo>-FpMR zKyob5$_h0s`m7@cyxtGLr$4gGJ6#_^(WbOs!fj^N&Y=yev~}yX(W3m7<2m6S*{+~v zq8hPsEYDd8PubCPhUrMCW{b(|p zI93@4%GQIflDlpW^bd3R1Or^$XjeaAV;Rg~%MGIwh4sP4CgPTktrCa6)k5^ZLk(%Y z3!$ObZ{lppVwvw>OI7_rsu@Z~BX1H^(2>VB09rUThDXTHs&IP7oAH6>*Q?7>Ydy8w zC#^(}kz_gD&c73wZ9X~8k|Eciay5Om@lYUb??d-cQTP05SH83uP6|F5?mh^BVd zb_b|N1Yb$Ny0htj?yN*8Z;dCXj%D*za$e93-b}!%qW=cYHX*lI*%6=T!-gmZUm1W$ zw~y1DxYvU!&J1>g*E%wNWeBK97Aln{EQK*2l%(^FdoCGke4z;wt~(JTClC_t~XeX%XQ-$wu$ z_zPT7M3bbJ=~8Uyx*%}k{u^TTvxz18=333dnVYyUX9m-9Xaat)GuMOI(}H!h@wX=K z_D1dE`Ll=sduH7&S?pi_3nm5@@}l5i zv+v9q`*S^3;Hbd+ogzvC`8I zK?~chBKp>jg}rAgi~T*3Qddnpa@o+mM}-f+$rgtvvZ>GF1Y`@pljwfYmxDe@y z^O|aFfvCagJfJ*LHr_lY<7J-hOTMb_S*j>^s+-T8=La&b=`B497&zDN`9y%nwUFk^ z1^A*%f5}%%h;3!UUf)|>&?*6zdp7s6 zDZk?vg&e=$QjqDiu|GLqxJ~EmMa=}C?}13K%1vHBSqI3N&ZVyKQwh)gM^Z{b1<0&{ zi}O;i(~_6ez`0xt&!M%Th{>?Jg(w)}$W}%7j%Fx6#y_KnH&cL>P7gxAVmS?7$S1oz zG!FkQ-r^h$L~A^9<*ziSVfUH0Gt{{rfRomTczPnif)!dPwbkT@cFydW*C$wNn7Q8G*cYC6!UFE9*8R%70?Tt)yQ|qw@N%r0^;j9Fj z39l24u<(UEdzo;n>u)gX`&!f>+a*`yfxRT!d_;IMj5w)4&6iZB5h;~ zlA>W3Cqvnp#Z^o2R{|vDsIT5t+-2@BS?yQx)?v`qDDEL8Nk_;M*ERJvX={ygw7-2@ ziV?%P6_j#e|AZFbL}cH*Oc$yC$1A46 z)syGS3E0stvDJA4y2o=8d6f%COHp*)eR#NUr7>bo&GIrB)P2e2U2r_P zTIlat!v5I!KGKN9tk{D&$VdKJk3i%xGrIa?+7mrrQArGC^5d^SJ?Cd~UM=%ldHbr~ zf}O(FL7M&`(0600mU5Xub;r|FjGzO=pkM$t`zzdcv&YLCBO^&nRs8iQOF=ets%pc~ouLj^+O!`A0N3-%tF4ik}5;d$$t{gRY zIDA@7e+G0I?Ns0I$fcAX#tZQYqegyxkPDc5H@TJLHIoEx7p#tz2!BOK5}7(1d85b} z?Yj#j3S}qSgw}f>c(ClM3!!Oyn;4uXL&0m-OrdzJ!oyBw;_W2z8K_k@b{Sr(9^i#{ ztreW1arybOw-0uaV$AVY?3w-4mBERNCC(MXqKF3hN}c0aZvF{_cC4Ru)DG0BmRGX- zV&lI)rsCyG15k0L=JoX&deH0d^D;t!ZTJ?&Pxk=mji7fPkF1!hG>#Oeb-f?4Y)#pr~{PD=SK&*>3Pb>a34ae;(DXqr)@dGYh^sTYOmt|Jc-Za!}aXqIzQ@QwR1V8YwLom+5(>$?ey{wCxS1q3mdoCVOt581;( zC_W0^{^+$w(bX;3*AX(f9^eWKo?koJ2X`VL*7gC2=MZP<T!)jZMT_5TK4K%&1e^zu0z*gW`(wt3Yyxov2zC-bV2+F&CiD1CzK^BTXu!{l!gVeQ;_!m$hXriJ{`W2<`%w( zlTs^1YNDKeg~{MuEh60ek41=C&hhj1K6RI>pKksc;4C!G^5RI972Ww*6$ZUTqzRSI zAWu-c@<+|iZ}7$J@pjVi)VwF4U2SC_69W`Q*-1$w03Iuq3EVSp7`BQ7_(qPYg?#Ep4nEkQ z4{(FUS`FPe<)#ZUURin503Q2j%cM(uZTP?_2ScZ2mE#L#8}D)xTD1EQpQ^$rHEk1p zWwM8d-zTtY=U|h>-8xjA1?-95a^)d)_>oRb1;XQ$lMmu@W=|l~{rjPuawf8CQwo9H ze$v?{c^eQ12`%rWS5QBxNw?1!En%zGdkYe>_#B3X51E=SdY5vKM__Yb!A zq6Lcc)4R46%L`gt;qwj+>z%RgtHWnq8ty|D4s`qe1hSR-DekynY;HkD(N%_=ld} z=cRuX&aN(baq`7e0q36%Zq!^YkbTt(Ky^}K_%cP8Co^e3%sTRfC~ePBoMlLFv`NBE zvTVmzJ2#&NX80(%rRD{Xp2lLV2b5j<)L#$i%@e4-5k8E#E+Ip|ZV0X4h^|ApwG|MF z2NK;TgKtevvs9w;r&CC71pabtOfa8S=EitW zh8k6@JDIK<#=sl#(_fNNN#8rY${3nj@dd|XiXLEMLT;-YMxzN}`whcw=Z{I@=yk8w zyP44$WSxYTw31B*-_Cf#GWT+7?lJs~!`h`YSuO7~+S$KunSEJD zIPKF?viqBD;oq|{?}MUkXp3oJJdSum=aZ$R{V%HC29BoNwre`E==INH?E+-qa)gWBf)p_f}GB?TA9 z)Uc&Jk7N8KOT*0vaP{XG#k8w^Y@)SgkYk1hCp>dkXc(S)0{Nz-jAg;SGmn8F&sm z<$zoKhO)5Q{nA!f){uwzO2uwGq;}CVCbHnWT{C6mRgWS$IMr$?kV!N#o=Pa%yabT4 zJ~rs}T$3t2p0`K%>Lx-`1@N&?fx`Jm$lWI66dY4YXq^Y{BEKn;dlMVi(KEY6h> z$V&P-(vm;&yCb%^K_E2a^a)XPC>!jxD z0MBe`^cKw7H^0j3lOsfPyTsPjt>(ryXIks&tC?1VD}SkWK~~Mf=lo~#?Pi$bEqz`0 zQu)Jk*6XutqQ}~pP`is|oZhbo;TywJ>Pg1&+e%dmgDmyswgf6hWA-B<>C}`=#@SBJ zvtki~+Taj|P%9!g>>Y>O5#1PE2Cfp=a%;s9SP%h1vZoS^d5192{pE`V&`7tYzTCi0 z{H)vg7klKyig5>@)L3M+Ei4<#H_{M3rgo&^cf{U`3Nd@ZKM&oe>&=`zN9zVv8ylW< zD6KmY&$0Ara!1F}WP0IdKBPrFq?eOCL`WDx8-AAmF^Unmnn5%&Lr zmGXR6iXd%f;qzvE}+0-LY!s_X%*na$f4%iT>TSXC~7SU!0 z`&o+2tNnR@Flh`f^Q!uf>J2)sOL3MPcDsl!AVCIOYTDi?lV-WIXvZI5fj&Izo>Gr# z+}e|?KpwRFd}W-l4jqSM@3q`(`IFXK4A8aQcvf8y75HLn@h;wF-T@jxAv6x%INB~+ z5$XY*-;lrn0{2v9=JY1Q$2N*e9ZDcoW0keS#r(CD7T zP(Q%mwQRr!ZA5Npas0J*w^OGum9=;cOZ53i9K*FKvUU`7>snt5ew_RO01X*_2G8x; zBx)v>=#5XqK`u{EC-Ar@^aVU|;x;D%8~^|S00000000000000Q>5f5@P)C=4o1g#% z6+3RY-{*2~^SL+q+?)LFP5yT#|2va^oyot>G|&6xkaG`U)_AF zjU5QxQGVaO1Fr*PW8!m!fTw29?23v@v8MkwS;%Bm#s51dV|7F+q7!!j&rXz=xL&2E z`~ev+J;mw?ys|E;uGb4Tm|4R|>|a%Gc3FDEe<%qhH@bApq&68>EEgzCSWsLKGdC^;c?RBulX9>c`Db zmTI^&nQnnTq`~;opLO&+jf?POW@65Nta(E_p9NIxBH|Q7J1tX)H%aqOY)M;e!*|c;%&xbdfSk=e?6@vQQP~D zBr4A@1af`Ir_zNwnrWB*kNUu6o5X+qc4xVhgH(NX$HV5E=T5T0piATaRI|K1E(qY1 zeY8gtFslzfOR^^fDm~^*_sUO@4RoRr77Cbs{*uoPPoQO*#yZzXLp$6{RY@QMqHoRS zdNR_SXllDCGYJXWE;KsfnlSy}jpiH(ZRs&yxWh##sPsqdztl~Y3WLMFgTy&K#l+wm z6I?i>rn6R-o?pE8>Fh7GjR;1@w{OI3@A6B}_5^>Vafo@2+4|*qR^n_Sit-t6)Y(uS zu|;{}YnCfX>RCuXbjN$Zmy#^q7jI8_>dK;-p; z5-aYMksZAe|4|ho&)M@Cu=($~kYyfXUM}us{}g45helhAG5F_MJJJ{c?LFE)p>k@g z2&HZ0t#IyE`0g1D$?r+|+G>~Q3oYgVrW*Pfq%a1@f zlOGFDuO<&lLEdbAm;%eJQyN%V# zkCWlUj7EYChzQq@0&)c%aQFxT^L~4 z4yq`vHV4LP0RN*X_nEwAj4u8fAFVaaat@EPI4MnTKTuI|Zeu65y(y_ZiwE}Zw$lQ# zhn0OCD>Cee9Dt^2XG^wz*FatYSZ@k>#VH>Td^uUOUEC6UpE5@Jtc1%_k!rgnmqC_s z|0OWS{swd5G0$D0X?y+&Ya~UIo!ZM& zO@h9BzV)@0N2GL6j}F^ho|SB-W|w^|Xi*A1l*A_>Hs)ZAN437N6kBB0sBAiK`C<&H zS)RUAB6i;dDcv*eKMk>RaU+1?s&^{gY#($WLgXK=Cth}Lr+*YCO8B|&bTbjQbee2? zo-2}Wb{7XEk{t=8m$YEC)iV9nYE>G!lO#NBo`gDt<*c#zMa)meRg1X0f`oALM`>aY zwsTp$bG|vjSE;{2fI4m>zx3VYT{$v^~MC#_>hzRF8WaGEZ$ zJjr7whM&oh{ZJSG8DDs=xtQk5mpaRaTP*UFAjpf30rHdHyzqXZB6+DB)9atzc_cOn za~rF%_zJ!N$N%D^*Aw{dh4`avIW}{V3<7Ao+tSM2N1Tf16wMK700C;Hhyaw0yE&;v zRybOpNJCbu5_CiS;rRbq(3{S~7j-q=M|ME>ST<8lFXGp36r%<~K$luAFE$bio;gAs zfkj^?i4<|@14{wZlve8qFEH>U$UDe#Qm?L*Bqr}2)iX_{<(44v8Wmiv|T_#?9mo5%x(Fowd5NG8YscF;VfC93&=2=HF>b9He za2bA&hziVI_}|%7nT)Y_C!_UJTpJ?bkD7dtTM>&@fR}5SO%a>zxbPp_0bbEriI>zT zd3exiOINqU82gvnAZtEJ`;FtBdF8}m;a;J@OoVEpuLFi}#SgMjFMR_5lpq%7sDzUz zP1?Q(*(7upk+F7-@sSX^?XzY3Pp8M*HR8GX5KwarER=9h!UmBJ{2DF>;^_rV0>8go zRtn>byzF@TAIlTq-LBV8G!vpINP-uwqP=MZRMmzPh9jmRLaI)KdEBZ>=J@*1j!C!* zpiF&fG}c?LFEAS;f^4<)=gfPDu)E{0yib z>GVfx$D9LxB2qqO{C_iz1Mz^f2%wDl*gXqhEW5IqtgMIK_0F46H@!yzy9+%(B01J~>WcwmFA0B%1;qRb8qyf`rBt< z6+bTwerGQDJ0D%xl0ai@M|M&Md?bb3vKc~NY4T1SV~ftZ|I7ThCB%N32FQxgWD~|m zc*i-l`eu7BV|me}1vPQUDK8%r^QpQK;_To6000000000000004@*8QJ@T>4v?f@P` zSUWV|@msl^xG68`Rp}1Mlx%mv6}4>-@M0(EublMom01RkQ1w~~zubJ0EG1pF|)pUtx^MJ!`z?nN?Bxln3vX2>?aE%I5v zht{e}mc&^K3)0Wn89$ik{Q6mCcjC;QaaF5i%bA`f9fE9L%)8FSI1*l*Y>d1pq^hQn z2PMXecb@lO`NR|J0%c;co&$#zx!qUPk=_r^ft4n?Tfl?Fg*9eE0UyXJRepSt9WCNY z%sn=8G8NwI3&tO$pJVLHPl_a7fA4>NJwF;VJ7TemMIFRvZw9#+7%D;y{9jGfJTp@F zdWq&9EdO_8xRZF#QUekS4?@2eQo%tVsqk~zkt4{OQ4?n`KE9YuXS4OFN&_n`g@P=$ ziFLP%msKW8FGG(7x*HpMkZA154Vsej^z=%o>O3{(aJ-Hgu~yHBX+ciT1WIw=Hq&$?z-|D7bmHToenaG>MAafX8jrfD2(2o!3A%*a%>Cp9Dj@%NdMA|coN_P`j#`4k|$ zv6qDOND6k0-xj2mk;8000IZfy4Xf zB6Gp$6&YR{7M^nzxAkRy_+4ykYc6u2kM5lQd38tjSQ3xho`|O(nG=awXewwV2BCo( z9XX~Ngwz4b^@AY2<1ev3uD3|z=1fCnHNJSvzQKSAC3c(fTGCSWp|sLL>? zrJxRQBy7JQ4sWeRauMKRE z0!s%}qI_{j*wY>fm+7d2+AP7|Yxr)j!3IaHLV2B_Lfg0;K7XUt3>Wi{&ulhLUa4$K zimPR@#xsw-H7$QGa5SIu)U>kwHf<-}l^nrdjpU))c+3@7z;}QE00000EW!W@c3lj< zzeQQyMPQ~TW{h=aYybcN0000047$8t8QO;>HK`4}h?m9Iw zKxU>A5?Xdx0;%b3GdfU~oI7zkQ_>##G{AXf?;l;s+9{I(VUGHAQi-kKv)>ihUm-fO zz?Ru^<+tBA^Rgl{HS>iK3eBb*grNW+Z*0(MyMArL-#A!-f&tZ>58(aAGkMy{Ohv}a zWSgp376#%YYo*p2^A|38{%2q0P;YPq3A3|+QU&=g{rns(9eDyk7RleONb%NPAc?Ovru8@!=BGff@{IP)_Qf0~ zP(uQNvGR_}%R7Ito&L&Q7i{^t9r!3Lf8xFWsPRtjDkI_m0*lpYisAVa5tZfOclGAh zH^FY3b0~A`=Zzv6%w}Is;$cN)|4ze_mAkW|(GoRob#|xaCTw4w z=1nB&r_*!>7JxU6oThrfO4e1Q&+?%JOL==wWTSTCN>W-oAF!@yZO>Q3=SpGZCyy&& zCRWobO|{BpG{rJ3C$(l!anI%@C=KN3o%K$~hVwRkv+Tn9B+fw-;$f}&1!%6$7XrHL z3sPD{CLbN6L+ZsIEQHias_+({yle&%-GvSn3kguw*>RyZ9Xf-15P51m?7<}6(8-T3+u_m<88(KRRc{W;Eukw4ruef zwBAkv`eGL>ZIxobnarXk8^N{issJ)_&&%*Pxqnrzqpgg~+JOQLo9&%;NWP4J6SfG6 zy4v$V(*OnE#t~2WfrJQ-^ho7XlJET(jFiw@{~;t2rkXKRw#T}4AIUZ(_C5CR34@P` zNdrnzk?~XN@EV{LPY_~ofQj4<=Xch|vc}P;LbfU%eJG6%y0WVJf@o7HiAJAZ*^0hj zzFr?-o)$I;-1fg%hh$wKAW;8WB^3@zMttmp-N^JoT=WzO1tvBYtb=L1E)5x4d=>B(==U~L_sz<-khpNc+ z(!Q&rdJ?$e;e8PB5Jkt9OV$<#wz&yGc=%l-b&;&kT4FPcVzRAzIz7rNC#1eKmosJm zRP^<(j#tP%P1JA^e;ts29vigQIm-Ax6<6k(sMpMai?axc+4HRYmhHu?jc1I_7aC=fflnGB#UO-y4@8ir(FGh^!{ zZMaGV6>UBbrmaq_*nBq;mTWZ-sz=I|X?8bj(T-6dBlVDiu(Y237QK`saAFuLwio5C z!?e+e4RP&#-o!(6fdqHKT&JFl`%X~)EHJS_c6f2&B4>8*J|$8Dh9|4B>AmT%60~U_KchBChtn_)c*eH1OEQT^mX?gDqwcV~g7v`+a*lO?4=M?P z%3IuiJNwbII(>*6B40WWGZ+#r{tpEOPg=VqJUGJUt*9~69Kx~O76RSN14LB4Theiu{|Ez+1j5T~?{CE3@0>KiS4>8=w)0jcek4^+ z2TXN`n-kBK_~-UEa`i!T;j$5V{kUUlkNSKz69_Q_i>MaI?n}hS?Nn8QiOmwDaUsxH zREh>jMt~OQC?A^LPLNAow4ymo=UjSy^(@kqyvpKuZp4y-^ zD~;e+ju--y@vnw1p@*^ON+~w@6rZ^W@^it@2T9;T^3W31pY6n6%NwWyCUV86EDiKa z9S8o7Bce;I*FTU}k1!Y+y5x$Y_T`tw+ul-YfMn{3WZFKquzdf}F~>ri6bd7Z5a;7c ztyrERV#RcaH7m;C+v9cv1U0tC^p{-R-aRg!T{iR-N(ADt1f*1CM#g&rKE?K7=<7RH(M(PW zsO&H0xCM~mA3PEW^LvXMrKnsdBphb;lRG8Xsy)|hH%VJJ0n(M}{TT9FAnx|_iz-2S zr-2xrxSIbNEFI9!reb6++>l48`Y5CVt^*g7SDd{rHWyej5xnb})7Cup<&fpzJ4SnV z%;tAZcH@(bmbH!2uthD_ugNH!+Yr4aT@n>fJ3K_zN|5+~E07Jojgt#MWPLTqjN-+l z9m^i~EAaMabG;pu%gjW9)$WnNejg_~_)1&0SN)Tuud%w^#OUps(^#p7V&aEFGfQ`aq3jz$c#Tg;&zM ztp0WXe8P(J{MA~vav9+fcAS33hQEBt?5(*)kFZD(cre^jaE)h+R-RM#Tp^Q;ioxh` z6$`(he!5lbXM+MLcInsnx3E^a_Sug>^((;T-v1e87o#BZ6&p*x5#{~vXs!}J@iTWr zrreY39YR@P(evSK+oY-^@dHkHG|%?JpLcjsv@@WP@(Phk?2g&CIh%7wUs@*urVvO0 z`VI2?QUX4EHm$Ge^z*j^PAU7=sly-^4Q*~^tC{u$jBHGnl5@p-H2fSuZaz$cSk=`0 zEJNt?uVn%sgjHpFVa!zzjUexA586_A<0*^R|0Mb)(l}So-YuEWI1D|3;>VlYq!mnm z4Q&=gRb`-@OHM4LO#$@-C;$*HX_kqdDp+NG(`f!d*~}+6 z(fM#T+j0*KU&!YSe`!PMNX#DSi|f~hrb)zfsJjsKxM$XDT`pM}I5FKK=r<=;T4_2G z9BqUKFLo1k5WbY}dV`GttB^hJL@QHj0JDsKwXfE4z7e!|-ot4*pF(8clruXS`n*?e ze#Ql0S(m?cWWqxAlMPZ}EJSvKeq@Dl z?9nFqKzh>+sg1In0|tpgi6{hO|5sUQT>V(rrwW#>%Z}KV7%S24NWGnN0TO5kvn1qP zYTFJ(aGrWa(I6i&&%2T}d+<2Jk7zUweCsJEJ7FGPpfF{s?KGKl!JtgqPL~2KNnOaS zB~+<{C8;a zYU4|BaGc_^@phPT&zNqs;ab6sd0f$fVLxIFcHV{JB6pm>QYJaNf)kF%1dw+Hans}H zWrF1~PirVPWyv(kH;457>MAaAbP}+x6w65~zerX(DeUDKm$n^Py)taMm#^!gWqgyz zl+$B4+eXWyTBUQVJgtP@EC(SZ?9;e{0-z)1l^qi0lg+vxh4+Ortef?54>idlsV}us zlBu!@`c)HOS1~7z{4Y4h`lEzWV3AtxX5teIk8da=y(KS~`2}Q*gOGWDgU7>B{<(*e zR*6_dem=;;Vaiyf=!yAjLG~`ifQp`eI(B>&S(@4<@oky@qGgmp#2o60fYTB|Pg+dS-I-V}uUhEY=_xE=<9aKDUbl@tchRNf(V{@LfmaIn=>PV3rKxS{eN#eyv-;w4}Rm#KqQf8|Tx?p!Addw;J{GS$y#& zwSrdG6~yxaV~Y%qEh@k?aeDQNi0l)u5(H-&!sp`$3(iE;5@R$Oo=C6OOn_ErsT>hM zla&3`157*$fa=+Hp!p%~ImdVaT7()a$)1A%s&nJm#cUS_>~D|Bsmn$20+5-bWgQ$R z>fN~)f1L**hob0@Re@U*u5BvV zgE3OH$8ix=N5~%j6xMGXiay9Kr%wWuVv1NQe!%2kT^PFT?hube{^e?N4n(?tI4tnk zV9G&$DsgPt-U{h!%5rpI8v9ljpWB=$TA8q4&NCFx>zSZ$NuttLH0P`&li@Ue3qoyS z&YBHsRPD@i<~o?VVi+rFv<{~dv|QoBkEjB5bR!)O{y?mmAFf_K7a56SOiaj3o&PePc&v}$P;1sQ&@=E2 zT>8SixaT%``HfykI2?6p{<&`2`=9eJP`d`dy=pKb6N2u>v}`H{1eltHOcMlclW@ef z0Y12CM~}iDma7dCj5`%B0jp@-ww2Ax-^e0(TB`SPUipGh3Oe&rD-Krzg3f>4A8>34 zKHI3gR?^I{o4$&cg0&cXu@N`ulsE`{E{lRWarI~8Hcj5?7KBsKQZ#C*A!KtV4V)v( zNhI%3`2(Sx4T_*QrkOVqCnQAZT3Zvw_L_;>&8|N0(((9-|CzxzM+T!nLhD%c9@INd$GiqskR(?)1wa&6)v zpF;O>cQScL!jK3b7N0nVvZB(JT-lSrb}E!)+Fy%FbAT0M-@1t8*(~WeJf|6^?3i57 z&GGEq$PGQ}NUOj~5_qLx29uR1V5s{hehwFaf9z@8ttw)z9PChkA}tu<*()l|nWi$r;zEYu5i!kx%Yi5GYT~`PC z%7ln?fQ=RVtKQCPW-rIRj^Llv0MT@E_T(d7-;G!>7Har&6^+Xeuf;)`0ZxI!D?1c6 zAuzh#4YC?w$i*dGQ8DKL-fDt(ME%z9cndIIi%R*>vkk5RkPjA+9oq?0@_LrK)N-^_ z@mV$lfNg#O%W zD>iW+{&#r1R3ZO}k$gCa0v&R-eNPAP%3 z3e_8!<+9z28B=N0JB+~M;D-)qKWaHJy@vi#SY|_H53-l+an$qBj%IfhFQ0_HEWzMo zhTc($g38eKY;$KKYKb~J;ez6W>=oOaoII(W1@p$3Us=pthU65 z8_1k{a|~*wi1ovEhJLm-|Kgp2)xFw{yMA*M20bF+Olz}iJEyB4sQRbqV zb-yid%G!X}11)AwH z4Mrq2l*3Rj9b^})8!}HRWk2_^!A15~02V%C{Fp&gfv%IBu*u|WJ^S%xH%*sw+`q59 z;hd;ZuS0&2Upu|g`f?@1MKL7{LYsxO29e?z$D@a_g;sn(m(8WPLF__&E5figJ;kCs zckky_52+YCEgpI<3Z_qqahrA4H z0v*?`&hU?1icPY^IuLF9XH{5ufiK()E-C#1NRLef{Dt;G8MD1p6ri0W?qw=7{$z6u ztIz}K0yaCaafkY0aX8E8I|dptEaiK=4iHxB7x-g1(^uxCi*}seXk+EAKR%7&eMyRO7Ule#avND+-9{Y&QaHsh z@QHBny*OB}FMMhg(pMv z;9-S-VY0g{I0+Eaj5<^0P|D^tH>kM}DkN<@S-HgB%PP;2D>OEK;`NJ zwBY+{ASTD9EowBt8g5)+O)CMI--Ygo3H%fLu8Ff)JBp?1A71~7tP&K_QTjQq+Pl~v z2r4}?I<8R$T-dF&e?vBg0+|{3ev0G$WPrgq>w~tEXugDBciw)NY6S^;Vx<5>{j~L1+?_AsbG=J?Y#jFP4k)|78djdZB ziC_2W@~aQNruhlmQ>A}~$={ICj4l#LjBqY}=&4rb?-mp5 zhRHb!O798JD!??NiMOaNIog+TO&cK~!&KOji(eSG)_A5yTdCq&%fi{dR8#<}K@9NJ7R! zIZcgjRLd$M;N4o^(U=on zxsFvW(ch}WfLxh!dJsd?hW2}tcdL_iNN3{Bq>N?ns^Y7;t7yS|rmkfchVjD_N>m%b~hE-+_ z|7;FTqETx`7&KLG&?LqhtxX z7*C2d#jD>*TUh4bYT7NQID7~Zm{@#!b`@SoeQNrYE~gUJUarM)+WuF+D<&ef()g0=RxHOT zB=m`XnwF`H$%r9v0y>t!dqJS`l(SIs*lm)&M-Gl3yzr`Zjfl~>|Mfifo|3{!n&$+C zSHdi{nxg;kxH;@#_mG^r>}``20J%FRR>R6S$B=%NrQJpJB@`gG-*`f!oM^dQ_IN`btCX zXUep#r`P%hGoKkks-?veyFW2s5C*UY7%w-a@jz|r*n8w)Iy=SFnb5C<4DGOiImNC$ z7rA+hVbZ}L`~dGuG)!|wbCCDDqfo9=tzPEPIPqD(EJj~k_vtCNvx1Zh0j=c8>Beos zm%mFzmO@^o-qPBLsTO;Zp9>dPclGE{w5YSA&HHo+SeAzJ{RhmdcWP+(Ha5Z>ft?S( zF?SUPINw9{P7T8mJKIG>mDHoww1h+#g|RLEnXoc%A5z2M<10UZ0ya=)0eR)d+zit==Rr(pyrp~hbr2T16uf>w7&6~@*<(WU>*V zam=ItZ87V(I=&K6FvS|HrVTg1gEj-Kl|T-HVwl-?=^1txJ%D25|CydaT`Y~=p8lbJ zhql-?FE>8C;ug(`;Am7Zx+y#{FjdxZtXLYg3{XBFbwYEieozeCKLB~4gUa|-Q@>Gig7{F`LTZ*G2n+5Q! zUsGCr+g|qG$AzjgJfJ*soX1WyXZq#0MVshh4uy{TkWMu?@>I@jOY_Sz@#2wxes&(5 zRsmmA2y-M%WbbdSwg5^bl7(~{9z&T6$FnfXjQ7o-XGBP~+EH)be+9}l9mN-r$-W_n zqp#8!&lyAd^ZOb>qcZ60X`32Z))FF=E7B?j8uNQFIn5LwVF3bP5C*<*3L?Kzf@Q%ll2TX`_#&m(uvFUm{VrSbPFv}Y&^ z(*k;ICY|vNky^_W9PpQ9G%Qq(ZL8qg9R>0^jdCw}GDuwx7;;NBMAZm@-;(QhnDj3S zOObhoF?Ss|=^TGy1Ce@m`L?8;>A~cPK<*J#tOYW5j9c93$&_iRLbqOhov4|YUh1@S zB++;Il<#sb4S$C~s_1MD$hxS``d+SZ-5Ij4|Hh<-ws@_*!8xa`b^doMrNEvT@h9>A zIWwL+tTQ(!awgYjG91O-#=E46jTfnFNZaBCItvDZM&NoiAgs_~CI@LD_cxpE;SEYV zAZk{f=P$E6+?1;A<~&`n0Dc~E*+rM*#|V02Hoxi{EXCL^WMLs^UHC=s>>4LlJ^bg~ zsas74&M*kdq}A=rNB(-V@jE;UYTkF;PpV#7#x8A;a5pEQ0$|nXsptQW-znT{Dzt5v zTBk?BamelATSR}rb$(4@xP-8B)=b~KZD)dEfRG@rYxGkMs1IKX>vv;w$Wmo%$OsBD5=|z7=Nls%k6k5V;f;A* zS}0)4xD`jGSM@4?0c_q*yKn?HZr%iiJXt$jgy+3wRl^o^{-rI24lbBU96fap+KAJ5ZYvYtD{NYzThArs7lO zlbfj2hGX~D`e>u5AdY09V3Z;hmRW_bv+;x{T06?I><@85jd)c+c1yGEqt0yOXf_Mx z1(qat)@56eO|dV3s)MLRR0yY1AAPyk$h}ixP}u@gCfpa5Fu)zsG_MsC(|WODmUGuC%ppnKjprL{QxE<~nJ1@0ak>YgA$z!Hf% z4!!-XA&KRmrle?#`GAs}4p<#>AAG1_67K}ou^E()!ZbX8bChS~QU)el+tLk|0NfV;L8K(sq*Wj3_m5pb&AKmggoigT& zIgG(dX0WoNaSdct#y!3e$ee}lZ30H5mGclqdO)!}N@}w%f~^A5oJBlpiBFNN@fcaE znr=iN&B%*GQr=z!1R8|Prk`Hm{3gvxFB zKi|YU1UZ%GQ5Q{BP=Dl2`4EAFCh#%b>|Z6+o~}YF^PtA-u~^C*-x4Cth9dZ_zuf4o zgPnyQY`?bO$@WW*6%9>u^i+MiG8AGpOiF zHEq3+>2+_@Lm5Zol`~Z>qfHk-<$u6UlY|9|7QPKynw*{ybg5Xq&wC@>tzu=uhYset7ia;rCx~K1O zX+*zEK-k7+L0|w9*|=~Y`Beg)v4O(dkSXWoQ&VgR-plO2z?|Mkmu}U6?#)?ksVJzy zki`X%Q#F4Z_`h=gLy&dacp~jRzX@l}QRrrf2#d&2{`$r}bufG8uWrMPpZU%i=ugR0w7jbb}nE6gZyA`^U>-m#j(A1@#=-TBx-DYiqUU zphm7lknH5M9K@`z{Fi>3`#C15(*xAi%1xA&O|Tq77WFt2ndeelR2P-ewD!!6=$nsy zu(1XNJz17=7L~R@q?{{y1-TEvyvEltAgO*aUpolrJWq8_IHUAlTAhXhvgN$Mh=hmw z%$wT$5{iHj$igI%OjHkc(`dyAtE7)WShFV^QZK51<>LpG06##$zW`(}1x0~hw`&c` ziBMRe$=xd@s;bz^FjK|RBw+MK4WWFucS&zZF-Gj#|G;ox-*!}aH3ddn=d1X~)OIwc z>@`4bO=|V5B?G$nJ_5q;cmbn$UCPzEwFa6yv^;qmIto!v5uE^Y^gb`8N$Zj|!EO`h zH{HW9H2BUH3O2(7VWs?YGXJXqysKTuIwywJfuELSCE-T07&A))ekmu=gvr%+)j-^* zcie2a{`djN>j(N@ChqSjcZn=A9)?M%y%WCe%z&c~FVbU96ytV=aGk;^@p6XH4Jo;R zI~ZgQj4Eb+W3wZWr{Z(Yr$g@>ZjyOvzs0|@;C^5au(7X@?Pf?lZXZs~lk3r+-+DLK zrR?+{#_$l|urR_F^YEs3Ws@Hd<>sp}Mnq+)w$3OcAgV-@^dOM2l`jcmqx5b7hnnh1 zSAT4jaIa=Y#M7{t86kkwMa3Ak(v#&7#oHuIM7^#Kw#yETWK4;w>Ir$A#GA`D!808C zH(LLerfB0&t|5#gf3ETal5u@aor?9vZjUwPSvf$hXYQrA(<=M= zx#Z~gukK}@hAdkI!lW_J)vB0=ag^58Q1%dA=D)@l8Rk<3paT+p7#3d;ARduwF_S_w z?j=Z?tf+p;io4)yx`x4o&R9s6|Kc-25hC5%h$`&&*duf6SI{wz3(W83e;UYWCzRxJ z|MyuJ)eEUYqTA(tt@`6#h~m+#UI+L2c0y>P5?a=`X$rKk`m1LagnxX zCh_AlQyL%0&XMAzH8V&!qzH8_8j0jmxzVM9MMp=mUu>cX!J#z-W-I87L99_T@5N!4 z$aP6E%|1GkdTY|#!q~J~1$ewlKi-F<|EjXGXa}O09z^GvkX>jPYxud;r|l;0e@!B! zn#MncPQO+h(3}|8kJ=&AHaU9r5t#)|T$m6&^1d9##RgKW%7pId7ysY`%>RJ$Z}O(LT(?r8OID-i9Ml&VL6 z&uVpPF_`7oe&cSIfNaLII(}$~iT$vZvto-f1dV=fD3Bk|9wYy$cHfWtSl{aj64Zz!w09HGM z|IbPGDnwczePq7pkR~G5t2!XCy!ya9;kM`}r5w*z!z-bEf~!l>zfX7cJ2ocwr5Ufu zv>7`n<|om-SXaLOjG6FxBz=iE1Cjs#8WTa|F{0Y1^}2!~oLG9lA5NZ>V?u@>3~-*h zlk1Rr0P@qjPV3;EI#+aqDQ!`$M?m}Hz|%jmVdN9XG8P)60wj(izl-k~*jH;mfhopO zeabkKU*zPZ2ZeD}C0dM*rL(#A?#o)*R7QgsORVyx1xXKR`O2PQ;4!6y(Bz!}NFsE3 z&L(3)sNdFdH(tI$a)OkjE$$V#h(6AU>UfcO^7nx6g`O|&)Z!}OQOjIFA>#D~hElV; z0`@STLm0GxP%n0M5rf5gNz}cSdjm8DmRO`kl^s5*IHd75re*t7tQvIAY$rJSg9CA| zIbuh>58aK@tbMNb8cXKr8z2)scBC;m8MK*5WL!-IB3!KHJHQ> zE z6nla}4q674u~CGFcRMYDCTnJhH&6DGCA~Vp_MS|-)`tD@rD@<6K@JPFIx6*4$SXYn z{`F&X&83S`OislP_{bbju_x2Y7mX_rI=G4HqT=o#9HNyn7^U8p0DfI?TLkbb4TF^v zUQvSaU|Cf}qL$3R=RrBhn$90>?V9s96Mqi+Khyl?J}*iWC;xe7CQ{nsfn=%|wrGVC zxc`kLot6YOm*=3dT}gv+GgfA)l%mtj!&%3u9aLzH@zmxNEEt-ka34M6rq%9fAyV!l z*7dh$1pHMr#GANLUEU@Eo0`OxH^0nQr;lE{RfEO(tID=hb2vEz`%^cdADS7MO5pB{ zh_4e_X`|Mj{s6Vk7_21=KZU7fyUAqxdgj@q_qvmm1izt+&seOy&9MxSp>yAvZ`X~+ z^g{pS2zlfrdUVi6=df5^J!T99e%irnF)i&o!xpjbab~a{ri4n}P61I1ce20fqcC`< z-j_u3iCxOgn~Sd{9}CxhrT&s0g;1m3RZVS+Paq4gw6*b#NB;lvcFldcLyd67;Rr7j zx?S+56halmX)p$^Pw;u^ca+6G}G5UIw5WktDkp2q?zt-%wjJ_iluH8vd0RMiW zzPON+`W8oH5OctczJ# z7q6op;1RsmtMa$3iD9&xF*`L-k)<_XblzV008ex*E!)vM2!vkmys!S(8sVNSN*SCd zM2!^RHKy4I*IN@73|dqTbPNGA+CK+?Ed zS_JXw=s$kF{+^lPU=_e-cJUO-fr;0bfqiqTG7j!+5)n@1y0>ME5B}Ig9%3CG_Xp3S zc@aUhMii?4*Z6kh;p0PiL6iT)njZDJQh6}c7ebcBe^+j=TS=Md6LmEB71u@IBCl(1 zC;?^w%1IRtrV9KhEy%8-z5!E^(`%DT-nRNUwybImU0piZsA9r?{4lEz zM{o8#gO&u#*GBXTJ3E!v$S`NF66U9ON^wisMGFH=E&KpB9z7)K87JHt$L)n16B}Nj zV|F}{+B@r*_XcOtN8Gj(Nt}g`5Y`q9_DNEE9P zJ~i>ZvF024d-Dsi)yxC@K+tlvqjH^z`;L`Ce~A~a-tNTd%_=y&fQZnk*=zDE$nT8U z@`Rvw`rUCv*)>5sMAkYP1gseW)A8Dgwax}qycPX$w8si);TuQ>N#vt9@GL^`Q}|f$_9ysn z-|F>Zp^nhNtHt()o@M5@aj^C z7g7u*Z=ne;)>zzoPFS$A*myK5=wV)2ER%{T9FMRRmE4qEc~4{DGT?%_h)Z&ET{@(h z;~8?WR+bt)$}&YVW!BFje!-ABW7yp@?uos@#>smH@#}h~oAe8Pn|c!eA@i7(mfc*@ zXWyHqXlvmk$M+5@Z~XbY62~1;-X!Dzc%YJkt55@gt7{O36j5c}oDANN+=DFh`J0F7 znHNs)Iqe(0LrkV9lW<bNO;B`l}&)@ z$^pW62LBp$4NI;~AHis!*x=1J)hl=ot$M__J1{vceU0yf;e zROLK>e~I_qlUN( zoiaPiWcF8Hq}M$wt=j>2J*!Sld!kL;tYGGem;k=BxK8u2;ugIyMU-opm7wM^(MVZ0 z*xxno=#qUV&Z{h!OFK>cfiWf+PZKF0+{>1-Uldt;#m-D3+3pw*bIO3NHN2jrvZbb~1x~tpDpR^HhChK>qS4y@g$GFo z9^qay1;5=&rtEC`#D1v^FuwZ}=s;zrXIWAakO_|7!@U=xIiJG&OHG@%7bFmUfe zgrt=Fjz3Jl_7~?V<)1VXZD)hh^v%5sF%%!&mWiQdfK*JZtA9dryStx8Sm)A1W}Stg zuyo4>LbKPeecX=o(LUqhwwD^=$Y}Y-?doY@%!_a)*T`r3tjY z=^08oXPp(}#c&FXk&%Kpqp$_;$(0CZZiGyE3gFM4{-bu$N?1gTB+H_Af3_Fa@k|5h z_y&5bo*P?V+o+m4%46IqF&cV%gC<}R718jLdp--}1%_%$h4&*<>4d*u(vM)B0eL><=G5*~Mx4vd>nqa2Fk4*6-E0VLH-^W@3Q5jznWw zyWHP{cQIQJWM}`M!z!lbW`Au?Mx;^heIjEx+F8eI=!D+iHmB9TJF0IQHDEj@%+^+j_Usg^{-@zSr;qdVz;7J1z3Q2kb&FDue_17qn~-@w@Aa>4E6qvmM=jKi*0nXsr}uJ;>#rSK_Ix6 zv`E5i7e$_^Pi`^j5STi1-LX#z%})+xt&llt$9i(~b8;cv9kG=A(4{|g|0qnYK7%j= z_yXkC-*4&($ogN(?{aJ6g$8wa_jiEF#whR%`c(E6ws)hDzNE(UeE7WO_>Q!2bgN?) zO&jH=LIWk0s_|eV=qtqdPW$Fg^&P}j^E|RYwE_U-X`fxdBI3!5LFE)V)pRSbPTMQb za;^0iVn89RGnV>8I#t5FdCtu#>)<<#T;&}aF;s<8Z|(8E|7h6s&1x#l=d;vo zw?hyVcyQeunhheW6Ni+c8Mq;YTU31^4N|_2H{iRt7mLF5mmR*C2sEBA|CB47Wx2uc zV5~#%`c%2M*Pga;K2zSMCLjYV3L#pi!tLyQQl7h071rLMXKDMi#gY5WDT?{^u8)|D zLSMQz{1h#<)Xuf8VgZ)?k$P2AQTM_x`R8NL7!RLQ5@bde%dkA=ZZ;9p6)=KE)h zn>F|X7LsLZW&14$pI1aP+h`g$kKaL_u|Nx?LCmdw(dckJxyP6=*Iui1is^bP4<=os zA@)sOtSmTm-H!G6IEF0Cli`(GeIyquUrlxGo|K#!O4EGP+n8@9dO!)G3iV&!7qzYX z@>;MI&gbRjrLX~ddR?4uns`aT(0zDYko`NNgL9O`skU)|{NTljW-Cdd8Br+r5RV9C*==I`=@L-uOO06D*rpgubIF{W@>gO@ zI-dJd)V0AtDp#t}S~_!M-j(-{0idZ6N3!A99sdQUdd-mv3y7)qkGJ0u@XDny1jxyK zZW$v9g~74Y=UHgi?vm|Ax3(wb;gP zLtFEjuz}Cb`TUw*;=J)^W>35K9CRAliyT#xrIi^?hm&+G-$XPy>Y?B?22}N$MZ`> znM9L7UuAe7$aF?^`IO(A)SF>k5;`tyb|FvyFJvfd>QfC9`&cuK26c-t`M6+Nj zwy`FCE*zJg4DH&fY_xs~^LV^&QoHT@2cecU$7UHb>s`f%)H-2m1x>nPINBYT=i+CD zh)DAZ?Wemw*YmNfg9@Mqi|`Wg%N zCz0`Oml(qQS0hV~IPH+(i~&@t3A$?FYgVg)^1GFZnMgHB&=pMys`&aZC6g`iIyIU; z?}9KjrmTbrse&K?s(BXgzl-W=pYNys_hzH|kpU+~c`U6aXBR0l_wvtwz(iQ;&WO_4&=+ff-l(K>Vy)cVkoW_RS8M>(F48F_Uxu?+ zN`tq$+VMRG)FP4;gw)-`y7*IeKkzl%K4J4*5|&B$sR)I~`r_+R+;D?wcw5b4Yr(xe zR1dX(VL#lCfVzoJJ|T39u$I2Z_ov`ZO-E1uWrK4T;*%{EqjH2W=!zqxAspT$D~(Uz zFn#)E!Qs=K4jB^FkNX6^C9xCr%FJ%{E5r)EgtjRnRvdwuFT9d2tedlO!QsxTj3B2{ za+;=s$W(qJdv$Y~jj8EZKR}m%g|oenY~{@L$neOlnMs$=5Hy(F>>jPvS`Rg+;9_c9 zYE!)mJ6+$37xc|r zAWDAs26RHDHk!=xp?WvFeF~d5B0=lgaFmXd8i8AKXAR)xf8o6apie!86}sU55oczM z%p^pZ7d6x@l6c~m#)B`QX0C=0&JDD8o!nYtY%1?&o~L~w?oEu0ydSASBOS4ZY}4Pj zD6xHr8+=80l!@c_&X7F$(L=FK@lKu3U zPV{P>e+VxLgh8b94(y6VuY?iFhvW6np32&rKvv_W%|>*@otDJE46EYA{NuShy1*Ia z0h6xRj%KE!Pk#FG&w9@dBNAS=rL4y#!OsL+uXhql=DX+(_ZmY zP@qSUXV%vwUdo5;Fca?!hd&iK+mHTtz_%qvrz<-Qw1Aj>`y|QkP_cE^dG(FIAe;7D zVlS@HIvIl~w*e6N0m^r$Q(L%xK=Y#cTW2h)l(=KA+}!Ka?f5{Xyd?x(l-ulA28mNX zep&KITJpHc6tfsCxF1uca};@Llc2H-2vX+pxX+<5e2RI@zqXl~?ToQdmU|6*h;d*t ztX|_9N`)xE^vNYFsm%5&+Ny1FE9R6L2b_t3ACHkaOQo6bGO;Jc6vsX!B#aO|pq{Wq z{`9vvTn(XS^Cnd~vwgTk)}A5k<6LOW4upCM0CB`Ycz#Y3v`X%al=@7!FvSe z)eel?^WQ*$WsL)LK_mSrP2AZ|h#5;7-`n*zgItIiERQPZ0(D!grulx1i#jkL!cKi+ z1#$$}NY*iTy|9V>qX$kK^e=zn2!r2u#%h>?P*CVmcNMizH~qbr270^yNt?2wYy5@* zw;vjeNGYy_wr68r?rjg|X(-<5;uTI!Mgn-VKko56+vn3ksR2%T9bdCWD|FP&eno8b z?*?8Yz%RZaO#UU|(Ss=AN!C%V~7P;gq(3W&82-TphGXA zAMvG@zGx`#c{LHE^;yy9+(wge#Pkq}ZILA^b7M%F;Y3sIwH5i&M4SNEudKG(m4Lzl zXIY+OZu!lmJF8Im7!*<=bESid9`jJozwXoYe7C-)7JCH!52_nGa<37uuc)d$ygKr z`SIvLJ6UZ0z0dlmSo8Ggj{6I?@j$Vi+M6|oq8S&4a^7Jr$5f#asOedEx(N+cfexb^Kt>!EFYil-w z^ADG%v>M|C^i?t^^*fwNc1mW?yVLTTW^h-5@n&rpH&Y;FiiJfqnc~2xH!Q8R$;QXm zB#LjYJRQu`sG!vjWkIB&R>@at`%S*Y3K^tAjo$T#ZUlhG%Kl;kD_ zETQjUBk>sRb%%J&WTa)1`83-2m=GAXvW&C$ksn3t0C(zZ^ZD)wDtIV;Xn32Gy(2aZ z-jNsLGM^!sjI!X{vP42qVsj|g#(IV}1q1V*_KGWpeLm@v>{*yJ;SAUOBHSO`zN?%bjwB zlm{~mnk;4!{B)UT$??rYOpCBEsX_;u@P{&1ES9b9jh@#vAi)vL+FgM;&6DZti0k3i z6crrl@%O7&SW9kcD}kt$Vs!r!GHUWzTh@(P=r4sEwrfznhX)-!glVp_*11=scayc0 zL=G95Z!it{sV?3JB;_qq;-`K$f#5819=5dKG=R4|#=M-{*ugrbHR6hHv0+ZY(<(6I zVMVso;BrWi!*4aCf%Dc}s-1a?ENXP~!i7*~43LkQ`K8bX~cREV&t2njZG!hSNx z`aX`bQ!*N!Md6GG^l(5RU^n{Ru#s9$(QO})tMM?m4zujLzrh+@JT&)%P<_^2`reuo zY~T;Z>F}^d>^Zr z`TM8rj(VQ~JM$iym?_>#g1E4;&njQ|X0-KdP5e|=_-?}M$@0FU);G{sN(1exSi6op(X7(_$Z*{w5<$(O7;x0b>*pIC4F7Z}=^c1;(?(yVjGRPparo3%P$BMK_1rYk0d*Z+0H!Re`bU9lN8NuQ-;Z8hw;@@6B$!;K-N7q5%DivChM5}-xeoBmBC>!dT~zAtH#k> z)5bpoeAc=g0K!U7xdfe?h4QuCjK3-3CD&c{s{?T>wGUi@?80|WCiDtmUwZl4K~g`u zcLN07j;mO-!chQd^W|B4#lW949^CcKUF_x7YAbj##cz~>?@T>wVgmEX3)Y4ulThM) z%GRy#Cq+HbH)&VMg?n^3ozc3{ySjd1|(^% zj4}LZp#TUH^e00;?IN&814G-N*ymdscm_ciZ)GN@HAU(R*`bRzu*iJ zBz-3`)7Igxh_dV-%KPE*YrYvvf_ZGFW{{(QYn4ZWYUSSTGv3}}L@A=hFQLY1mG|Fdq zj!2NyX7&m18hWOqXIX$(>{1fCCbShW;~c5EnN}jS2@NXq!`C(+rM0+Va>y!0&O)3p zLcrAo)Rctcc51bG5axO9phtpgY(1yqyyH{Gb2Q?*#4nSMoj4UEub$p!JgB~%vl%s& zx_%Q!a@Nz4EC1*!CKrQu8M8^3P;mBi0?6CTSEO zMEc~n;!0EnuI@sGp=-OjB5Esqv%}QIC%J;C;3QEPq=%6PL!Eei&x18JYPuz-ja+Y3 zm)kPlq6;birS7$QnGEpI^MH7#=XHyN9d#G!b3oWCksf;Tb1SPFzUSaq1lLI0gr;b% zY1DDTp4%FnXV-%^SR&Ptj}$;1 z=Cwcpq~$UCW346kOXMeD8dba3ePD7-gf(6HLo%yknkV2#c> z3c4c}kQ*fP#_^!sg6U|N`-K6g5vZS5+p%T06Ri-XY0K3m-EY(xv9tH1>tvh?$t`*? z_p&1U3qjItLOcVMRdMG!RM%+77&myCUq9ny>ZpK=nL3*v^WlHNquF^^+BTsh$}S$q zSr0G(xfWBZ3R4Ks!~Rvs?R4m!|8=MgQIQS!vSfgvDS&b#YQfB7=zD}eh(!}|D_-20 zj_d84-NzlW8MS;Yly_{tAS5|ZK1om!&iwyvs`4U zGcACVke2$Y0vx&lTt_@xMDF23sRbH&Faw2)Z2{Vcl>^0&jU8ueZM~?3H1Qn0o=;~W z*ypyj&5QFChA$fz7a_M#VFD2$s;h-$NLDQ9!($_kyr0DWdhwV`8|IaJv<;$9o7LzJ zVFw`KQ|)F)Cb*_(gMVT{;BG=x{DqP>LsLjJ7|&ojC6nE!YmFI!;=T`d2BQ+yf}3P;WuJ_Ww!MZhV^_d^9vSzxY_B~W^VXR0ugz>!Oe4PD z_+z+%5f~7NFIRQFl3NqiK#Jl_n2m{A{YaLKBt*dg*QHGg*flvL8P=PlA-?Dff=2{$ zj54(qRsZPO+J@+zt0t!RaU=?65x=1L_Fe1N-XDSK{f+5SaUd_VF?lGwM z-8P#0u*9}gPiICCGm7Og?QcWPgb`H zg~CY^2xH>Vo%~u&j^u^;=w+2Zo17F;WINJ0+DPGqZ?lbnQB63qX#SRzg>qD5@5P3+ zW2Cw5RS5i*t0pq0g)L=W#=pyN-@}z#Wu!*4V%fvTxXWPS=Ge@{y)B_AV zHY=<{2EwnO^e$TaQ+Kl94T5)(8Gb4r2wg|xoVk1I>n_3J<(8oU>;tCisQVTKi4V2P zkkj94HJFvl@i&1Vn;6n;jcN*4Wnw_EtYwnj8PX?G$eFtme4ceGWd;!!JudI9U}KT? zF@rW|(G`4Q5iEwJ36I!7pXvI)DS+MxEpg8Z4xeG%d5e*4HMo7!bZrHlrJQ4SfpJd* zCJy68*^nq3{7dZaCm;tg=}AfTTxHbdgj&~mJVua+DQ+*N4zM2oh7tAeeOma5%y!iK zd2uqkJy=u~zfXYs9)Rv?Q1wO;Z|WuTSsQ2MEPYVKnL-!ojE0`smcDxVq_E2HEMQ*{Uo_U&C3fJGueVU*CtF$qM~LwZ3(YF=KYH5xw=)k&8bZ4Q);Zn`iytgdAwd*>W#N z+~;&Pm;d<%?Ko*#wOmOW8GiD*zep?jpb$3xbK|E$>BK31W!f_O zhQ+B8TqWbEjNpu`A)ih(rm@8>IqIOU%K}u!h$G3x^u5H5Q7G3{rby7gfQ6C+9CSBZ zvzqS%UqYElg|G9k1R9aJ%4Ba({y@Lu>2aO`A!XvIY39R4J@+gFfYY7Wn-E~&u)C`z znj`?VIJ_$Hy7=N#)q{F@q0OM~xEfOlrINvRKKBFI%4Sm_>h&tGYEbsy;#?5@iTzxT zZK+U)Wl045PHNdA_+ygGS&%^>i0A2dRe(fJMeH>TWCnaYG8-!7)3w2T%;l4X) z81o7sJnWM=(fLc#QEaeuf|lCVnnPyTF+w~N(;y;e(4K4LkSB?qC?%3lYoB=MScZ}* zQcr^R)+aljU|3;qJU1bw+&3tn{-UMG4@T43F4ttTg#WZ8gJ?7c1?vteqN>{0s+OB}dND{k+$|bMl=|R@GA! zqo|(LHR?9RB6FI3B=L})>EqsSi#dcxWVP|g9`&yIx|>*= zG{>B_V%N;1LW~+u;wh&$EI@?hZUE@1K)8p1T?U0WsOKEJ7LOLCX9x?P9X;XYJbv9# zrMIuAKHR>|5P@(3=BK zsv>d}Q*7K&0|C7ct$`HyF;el?pg*e38i|=Wu$@ z=0OSNy^`D)KT5iLJN1suY0HUOD#a2!^xzn9-XU{Uv_2YU78o{sS@C)GxR%!ZgZDx` z)b?nj@q-wm0m&1wgi0(x&Ygqr5qIkPvxvgK2pbck_j1$Ob`A!>6M0ffSe1Romtw(Y z;0t&Zc}mt|;PnD;)7S4z?zK*`_1@W6OM==M{`fbi6Lzv7eR4#<}JF{*UJ`4jr{Cs9^4x!oEsA=M<1i2L zaXXo*L^x~eD6{2AVarvHTkqSv+xFvG#Z1Z;-;}0{+UM%F%6#>Ycjy)o1?o7nBEeEW zclR%AZDT9-JoWSSxnym5d+C4Lt(NB;nGyz@!h0EKb9EIvrjHV^hnwAwK`Yz~abr$6W z8C*^D`jXxlra<0}F(=aWRY+Ab_OKJc%NQ#NV+OC0ztfvQtQ+B`Z;nIS9G&sS&i?*Y z?UJe-wxk|V7&(0FNi_KMvl)c=*W6oZIWkd9skMo;s-Fl&*-fRcZth-R62@Ok; z>a+!kBvSyTUGK7Xp119-ZNKuSmU@pM4voHIdPa>0zVCt#5On2tD~kF~7yS5aXo^O^ zX61ouvMyS2VEbQ^9)|1}XV0+mjk4!hoG2j{MW<@yBWsOROzM&aXOuXG359kx=a@XA z(qa@7#Gt6|7G}jPkTKjRWuI(IGEi7}ILszr-h#8>Q8D~5`gxGb@7>a2)1OPWn#ifh z3K*L*6hDgMKM&p$KKC!=XYheUI`!TX+2_-Z;@`69t#90d0_Ut=g<$qw?LfWaGL_uGLABmEKxB_*~u*&hbe78W)yHup17`m4e{)6$Xo0NIBb5Bh>_TgerMs zg$X=$4?6ZQ{xKyQoj9Y=2hu%K4`*H{z7&E*;Q3pFQeB#rcMT6RXAh--0ui<<#PJ;# zISbWGnnl<7%_4K=dHd_-!8&ViTXgIi9e_?k({be!-en0qSx8CEKo`7Mf;tdC(EnC^ zFE*aMF@<0X@c)9Is>}BEFesK@nauV2UvCnbZff7`f}c4)$rY3Rs9}ij_=g4tJNZ>Q zL%WeWEds>OeRG4r<=P|4pD44*E=Pss59XKf;s+P!V0E5qRFHmdhEHcyh;M;+;8s$C z`M|MqG~um82Vf1dJBE0AS7gu3!-X^8gfU&+-+2F!7249o!TqRS5sxCGSvyACcp;PzxXoP@dgb zXJiP#K;#-M#tDleSw9|aMg5~p%?IN`HTsUs6&Nh8Wu7g+?l!rJ*7LpMFxC(V?l9v(@pv8WOKa_nm7nL9{PD+?-x^S4gi2G!3`w;i@hJ>TVd-izNJrBYo*|TQ?(=tk{r4KxLc6+^(!shyf>MnYGZ? zmI!RcH0Qt(pqzoD-67}aJ+!~Y@Li@=vT2dN`kwsig$0R1*a$gRB)C@Yv=L4zp>2(D ztQtIl&V#2C{0p~`G7uPDNhOG=msg4m`;)x)JrJ)ZZkTbQlSQW>7b1>?5KExPwLcNV| z5Nko3puhqt9g#^IvRc>%gR#i7BxV(fdwol^JT@P;YFxpzD4(y@rZ9sN&u*!|qxBJ? zC{DVY?kq0vG$?n-hViASBD+#Va_Yv7fJ-&fLG;?~65iwlgp;B=?Y}0rK)^uQG`WS@ z$M7hf=eLA(vtK2ng?0(W=xWZt4*hm9bV0QlNBUATJoZ&*dV&w{DSg-?@ZtFD*K{h$ zV2a1r2=gj5P-7QrM4+-D^D!@0}N|2AZsMUzCe?I*F? z0^N#~lu1Ygiw>^!`O3DQNFvqn-w!R2U%6xK63l_V<%7 zrgMI{r^eYub`YL0MuRhI83pxiB?tmdD4znCXgye_5?rQwj`))E-MQhy>8~ijd+qm(6FkS5nTFT!46aJD4~hF zqK+CLBq>8VbB2%=Q&2yusgb>#RtLM8&P|Un(%d ze8OU^K+cyF8HAXWZ$;3-*g@QX zY6cI9nvku=vVM(Ti4LPkz$l77!zkFfiR@$RWLWq2@f0z&CyUhQQKzMeou$EB^DBMC z1Ito8jDZJz7AeBnk`5tw9ui$o`ms77I7 z(yH*}jrj^}_wav&+#QC*QPK#0*J&Qte_8^@$6ddmARjy{&kN?#3!HT9sj>*hgwudA z5_8T!O6s%#5qSl6r10sy@5K^#SRvVupPA87JJde}O}mj&r)>r|S5!({40GVy5tXzd zSGcw7$j`wq__KQwcU#HXIs8L#{b{bWcNhfa^j4PP3#TvX!l?N;g^0ns!+6nkH3p^x zMD}pBm}DUMbBv-na|}N{7xe9Fe;1Fsv1FWY=k1k{#qaUT@(b)5JQVGzoZ(=WiS36( zYj4m(X@pAv2C4wX7q4=d8$strwTCSUs@a1;Y9(s45y-xip(j}OV~^>kjBLiDqX=*8 z?o5k({UhP|iw)}KEkZrkWQ&07pNVvu zy~G%$%q%&QX=bd@FN|6dG;m!;T!M_nu84?!r!m^Z`Sa4WSuK2`Cs3+oNR~<$6TPL) zwb(20Z+r_UV09qw1WQNut>}QC;ieKYW9+19Gqv1>qfU6Dz3&P1@7sk2d=?~*z_|}w z&te}fwhBg9gcXwfDDF|f*6b;eF3KY6%1g!BYr;1Z*!|Ey(1jBiR9G!Z>Rb5o1@xN3 zRG06is#fjBKa=wc zoD)RXk9#$cU0sy%@NQIpZXgdv11y&#V0h@PVw+}INgnFFVXEUx=mIp>6)Ho)Lg*w#;Lh&*Ezyiz+2-<8hOMJ@LKUbQ z#P!fAGLjGc-1Me}D;oal#V%!B7a#AYgYM)3$<2&{KO+kVSi0^+cg`z7Fw4h%K4S1| z4f&9gMNZ6NGl=8UF zagPys2lO9YFTd9KqOE(T(bd)lxq_r>o#gT29V-WY&SZDVFy>U}>Fk#6hs0SgZw5#D zPt(hX)!07cjXtvrHPx2RyV`h0eG7hu85YpH znnr(I>ncV6O9Fl#saIhy%mCwCOGpuKUsygw8!K7nZIjXH;KDYd+M6RCRDIS=b6^H> zr{(-fIBUh%IEs|du{m1T#!1YtEDL8j=H*dM-3m%RPViY1(k?X0IY~|2Hx61i4h68F zF?J{r#_w&r>EikM07H!F%q=Ej5A+|IO|Iz4M61zwo1_x5AtS@2F?>=IZX;KsY0M2CbMQPh}iBCMbtJ8uXO66BCVlt4~Q`uJX09N;6QT zrHyKbw{0W2WQlCU0*8{VgI#hM6YKDci#J2LkI)PkZ+Jh41Yf?t{dh9Ny+i$2Fg3t}cN zhH<%*fzsWgxV^LGP?8wl>;fDB4hR^-+8**!c?jJ7RPY#%no-9c&YLBr&4s2Yff-sK zz}kE@2r{Qi>HIuLlc>CgY7hWH?)SAh|MfamY2vH;CziPr4HmSCl^r25mN&Ox*3E7} zTa7g)3Ua0)>T@F(N-Y>=?D6z$dcDydVh1|Sp8}1HbA1jlZe*jCO+|P@gJ$@!2!6|- zA1hZ!24;a#&BB%G0Jc7y@n(VXTCb&2Et4O5jUpEZzhv8({zf zpU)>+Dh??CL7I6aau?ls=iuC)gCXfKdZE8GZ@g_i4+a5@#S4rmIL$B~nGPuev>MUj zmDL7o(&QQu_?XD{4{y_2vd91EW*+T$G6_{^bPsjQ)uV)D9jFRpl7DJ7VtmGZe#SEA zBYGDK^YSltT@OF$JXZZLbXEgKX6K728e?14{C}l9Z+_UjcB#*zicA1d z{xts@)f->j(&i4p+w?LTiEsig3;Y&casP&iSFGdOwsNJsFDAKGY%PBk$PXg`Hgkh5 zo|6jPWGk@ehEpeED@^Fq`75vg6K4o^h<3dIcH;gPmOUyYw%IvSx5o2*KTjLED0}{JtvOR>9fszJ6aF8}YW&B9 zht+VXkITZaJbmeH&X3H&zm}?hF+Rw%glX$dAEaAr;xTcIi>6lGgn)h90M)9|^mwVH z$#$4aIc1W0CM3<$!{WI>XxguA8?5Zyl*$ImF33fz&O2(7y7lsAUm;Q5DbG*b_O7Q@ zZ&G{g%4Et!JGc9Ja)#I&X3|&bGwN=toU0Ux@1DZa_!$)1clNa)smZ|ZrRW4kh30Qt z2Rzf+vk-dosY)`O>hg*3$hc%vpW!&L-KO5p1}S{5VyLtYIt!?c%o(|Y*TuYm19tme zb1aQeoMurnApQq=sIDAdWhZz;_nk0PI7(N}t7#yj=L6+v`wll+;SAjrfdCQ4qRL`= zREuG_Aldr#dM)4V`bPpVq#&4VAGp0nSx^K>EkPta<77nA0K>wZ#_MVL#?(Uuo!VSL zyT-aHug*KDD=ay-s2?=9&qyr{S$pn&k)aQa-+=A z2@3q}+UTT@$r8TfCi9LY4>_*5Cb|#YM!eGB4|j#kpeMp)lMwa#7E+1C&Ri$KymoRF z4Y#OwTG?vR)cj-2iOvie9-WtPSF#cu>+qc+1G_Q3peDp~USP&T!dp8`sHS=OKulhun1&Tnvvxl|o@#M8H|OUMwhZWy_*r?5 zzPFkD*O7VcHi;>By`J}K57>uq#NaoE7}=`d`khX+3u~SdXNTLz)KKR;a!-FrqRBr8 zZU*tX2=IEButLdu867(Br79~|hpiw9ip0pFO0Uij9Vyz-)ZJrA&-sO3FCoRk%iY8k z7ea4_mGa76AQ#ASd&xBQPLTrfm#x$L9WTVyhi z0XW3O4WZ}CJ%(DEJ$%mv++9D9Ss5t^ZoK2yC@h1YWxCeBL6#8Y@v!FW*G8P%NWrQe z<*&(Vo|BHSIv0}n8#5sT-d%aEuWe^OT|D|b%bbW?2bARdaIEt|%EARKc zPHk@f@dKRGHE+SZz2=|g*b~Ogs%rP2V%##zGk0oFB3l@{FnM6g%NV8q_;QNZH z<02icd9w1zi#0}4uz9Nh4aC7%1HK{|K5dePdF@O4QnkE24m{6S*u<}L%eb}g!ksJ0 zi#VC+pQLxYU*f4zI~CH%m+|N)0tO@T3Pg9eh|$&sq}0!`40tJ8d32werESP}y1M_Y zvAn^KFp_8DXW-2{eQ|wANi#_1i&3xn$QF-K%?9IwwdybI z+Lio467|tCb@l3P@X%Jf9%w6RiQtNW+k|c;i|hR7FD;?!lf~|n{cDG&h zNzudyUjI~`r?RAYFqoX;BTW1=Qj*zKkTT708n;uzTIZdSI@q#m?H>psIGB#-r-$$%SeCM& z;mBPi4_T?54sv-v9fFWzONbA6%_wjbV-?jnV1z>Y-rS~>xBpCh_0sN75 zyxeAmO2JHN?8%}+*jh2IMI(HlKmSVH1aH{;FaxW- z;Q1%w!Z!tdj$Jd>3tgQd{gU@NX%AV*vKPU7WmgLQ#(Rp>=Pp1YaRlyPi{B7jT-Rt9F3E|=;buvu9M`_$E8^M)?v8RSGyaXbL?DOLB*0wsxRIH6EDJ!F7 zL>xgu49T0?CsLb)&T;HBhVt^X2_vmtTh~lWf;9-c@at}9zG$0Gx$7ISXYB)hD`>PF zQ#yIm%>;k2WMD`AgDu;BrQ(XzPeb%G^*5@}ednCk1nQnXX35HWohZ6zuIOi8k#&cE zBHj#SQuRRPbqo7m-FO(>yI)Vf5bhrVY-W3%aUW^Ua{Mh@n}r9>kajnGy@?Tg7epdw z+?4qst9ec%#reD@3zxz-v=_l7pkKbng|AqB;HWz=sBD~PP7MO>0)Ki~( z{iy95^uIhyguKD{dqMd8Fx+d|Z;x1FLaDel0=zb3{!Am2Fyf~C-}fynnbhKq@GnW+**jGM0AYVMt?BB%$ig{5awV%+_*O zccqhV>UmJQ5fMAx$6@t38VQ~?(n2^&x-TO_S}7BE>wf$BF%Gycc+oD# z+K|rQ=aj#h(tck8xfFqt7cpJ_ix~?xE`{JaTSWu1|E)+_VmC-h-B*;9KR9gO9;jIx zL#M1pRI@J7vYXBnkNFQ^0pN@4m_>QHV4r9EUQP(0 z^1qLSplr}k#I56UF!CqzPGyqK)zH*!K`@~v1LQ>_<|C?aU^BY%(EjyO5Ext2c%=v& z$9CP0NZDoqkgI=Vb!oi@h7vmXMxv#<9Q=Z)GObT7C$XK~?-6V7=fML)1mQdp#QGkO zoDqRzDj;63EuB7swNH?9BEYaVwFCD=#24fe2%(6 z&i=dzabsDQG}DLQ3UW{Z1h#6bEPI^TovW(yx>)_O1KZjof!*&jMfAKW+=T4I20ugtF} zXcz+6{i@{x&ZPZwD;bzm%J=9z8bKB`D&90t()rqRGibI}Mi<%kLPIh$R$nG0^R`}5 zk&$La?cu$?4tcIG@`r2Tqn9J>CBi3e@`@=n@Xj&JS%H;QfE|hvZlWl>L+>c4Fj8S< zvG&)Wye(B^+JKli!v*^|k_G;eY>?a@cwg$c;3D%g3UF$!e!Li?cPK)`5rR@dEjQnu zhoh2@=Ka`YC;$)Sf)RsJlshuW#U#ATgr7P7_0xmcWC=rW0dCbwu|&%FW~88p;6pun zD0ZJ={2g-VrF*RzM;pnkAfu-biC>+74F%7af`f~1!~(%qi;PBtg7TED1i83eAzYg+T@Bq#0vSc< z5?3#%cln4oW)I*`mtQqjx^u<6vK~pFtoZv78a7QgkxchC@wn&m!BMN-7l>X&O-{-@ z5UW5ac^}%KNp?M5%RJd9{d0qy2fFEPf1_1mb;&5lbBz1k+Z4SP@kIg}ti zsoma2@*|vZ4vHrCUgJNMtB$vS$-l$grx7thC4FUYgllBjfuq;f{>FOBOqVg)A&^C& zFQ$)4vEs+E!hF(jvk~pEZ)w42Pi|9?5aih(-H27hGbt|@TqoysVV6Numim$Y?wszD0{N9Er4k4HB<#qB;h>r{)}p#h z$pXo``DAOKE*2FjTy$HPnMZHGX0Vg%i(L7B{zQylVG7@sEz<#j|IsvROnXh&s6{-Z zG{fEdravCtlO%K;J7>bf7M!{$p>(T`_voI2X9?x;AA|X~YF{BfiM09@o0o-`MI$}_ zpB6OC*!G`!U5nXlWLE<*Tto_k8;LAe8PrxyZh*dIHUQ}PFU5@3#Y#(z^D5P-5Epq}?N8+P-^eGr( z<2-1D>rU{dE{&H}1P{iyFoS(pX*D{c(xStxfOI4moUuo+db)5XqjcS;7DrgtGL9&0 zJnp~qBU4>_>V>1x8Y=3&p_fY}yB|<814>&cO2oyYP9Sv^;e?caE2q^Qt^v>I=~p9z zF-2spWuN9@_$t2Vyql=+G|^sYt9JBS@ zJtl{(eD>Z<+PGUb8uu|mJzF9BrUmrNgg;O!|WN-)QVR11cPC* zjp~c}`kg$<5nrb#|JHAxe27(I>A>yTws^%3DLh!okKr3ys)^hbLg4Kc`VT;hs5Nks?6*K5%ubmNMyY$dvT2 z)@^DM(Zu^E2A&a-TnT?KQ4lND2A;lc4Yc+3$`&|k=()(vDK_LJsW6KgyrO%83*0LVFl>eRlp#D6}zI4h7 z$CM2LeMX`z0`vNInZgkKYk#+kWJ$CU?ux0x04{xy>h{o-kHqGnlS^ieFsI9%h5B8t zyRvHPG84c9<9&xbl}Ruhvkzc8Ss^Htl_7A7?0i9trM8^sA9b*&?wg)bcx-fVHyw#l z;gD6M-~}UKi4+_T^z+xjH)VjvztTj_X1J?2YzW_Tf`DQfljEV*NNp(aG~-ys?ri&B zSmw`ijuT|4d8|DF#9RWiC@6qt(^cLE)QOw2{U_0Vdk8uRuUIb9VLAORAim4KD`?oVRo3Sj+du6A#Fv?C} z8@soQVx={8uTDK}Qx01G;3;ldFpR$S=}kU!&SngC?*L3q8Bc-wj0B=VeLFBTY@5;u zzLTNPL1=bed@N%ZqajmU@;_$9nATQJv$Rw+?G9TcE-61?wa8b!5La5+aaKRa+DMDW zPQ@ggxVj;*HtqPkhsKChFx2HSi@Am2h@A&Ud8^C~+PzoI&aq!+| z)-_v>&`Gq~C|fC5olkE*8?~DIu9<7Hok%Q1XkZPrYSNg4U+xY4d-V0Zn#f_Yx^5Hh zYKWj%ewdd71CED;4>@7~T$A-6ur%Z-CsEsx4_Zu0aFKAU*LEIPu>D5x02jtoJ@|58 zXs~sDJ}nqWh~|-(%U}Ofs2niiK}VkdWe+Zl5}wz#&uK8RnAq)^3zKPhZxMTrB5uwo zN@3(En&i9vaH{a&61D*}6BG54zn>6y44`^|{RGrUy}cHij&6jHO7M;T(14I|CK8xA z;c@qhn{~qE=t2IpI|JMNEfzS#**g%{^ap|?o_2a@R$KEHI^B$qC+uzc~OG(f2 zn2_^?J|EEVFOJq-z#LoddRilC7wKK6zD94%Bx-LzsO0(k@FbJWqzrTY?90Tzu+I8< z4h2g1(^Ln0FFddk@JQ^^FK`TMG>Ki0)Gkc9g zA9eVWZ9W;2t>hVmO(cx+#eS_x@adGlOv8gb1O%3*w~BfOqw?!u;?CKBTh=I1_1rf2;zskF(1OaE>Ag!Hi%Yu!z3Fq%v<;=6UFen zN@#T0-5(6X(*$V_Y*@MI=+SnSG?5?SEv>4ex(O0aa_483hhRL6{(`#E9b4&TOf$XO z%2o~}W*3BiqwB6LeN=o~Fl#CBil*Y9TNTek0n2^>uq+Bf@W;%Y>@ED}iaz|_N8n%N z4}{Tpa79x&fwVjK?3~%h$@9u`|v;zOA4N%}pMS?4Wst1Bw7e$aIdF2H3tw2Q|f4T!Tf{so8rD&IZdSFEXm<@pz#F|v4p7zPf(FZA+Ci9f!XKsi%m&kfh4D>PL} zL!G6=SMTjsTxbW~B9n~k98sc4G~dE)%xf0MI{qL2`5Lb;xd(CEmp%O&!A(F421w}^ zYMfjEl31d}0AN)^&*BdbIz5a`l3V1u=4C=S5LuKW0nPFUG=t9GU*DeLI9k)~6r1w{ ze2Gvw5ZA7=)<|c^gtt_Sd@6uqbs+Ooi$1?{dgnc?j_Ar#mwe?O>A(lEfqgbFwK>>L zh`}H>{JiF;R4cnF1osnhc{F7=jxY5d5ga$`S#U?MVCBizpccAB2=cLF$j>D6%;AK( zeyCn}TXPZj2nYLHixQ;(PDHx}RV(x|Dtl)i1Uit%@+ER45@kDn#BGQ0V8_MZd5@>K zrNwGn)8vs17!A3F5S%KUf}aM_=|1{AHyT)!O!i-4(;q<;5x90e{>{XWaDCAW#O7l> zwJ}SqrZ0)LpEU$U|Jfs}eu*OYAb=cHCAz=fSL)Lo?@4R$AL%Cze};h^GmdRhkI_l335MAD*Y2loYrO<|q!--Md34CMWB-S#PgzRpP`uufPaiR|BcNT4>eyO^ZgG-+x;wOhc+UU0HydzJ z`bz8|5Ocfay=WqPfkmU?W;YWC*O+5X(h#ubGU@dY9|^sbv+kT!ASXYf))vX?0mh|O3hk7FVf!nm{v)(02FzD7k9}R zy_urv!MS+eS4_$PVq}VhV) z#DU=wqtP0C!8TKG;Qk+CrGg%h>Ylcd?gK6K;ysHfwfv?NY;22K;Y4<5)Oa&B9yweU zG>}j*DE(kR#|Qiop)5>VF$#m8ZI;351)0Y$+r<+f3Ju#Gcuu#hA^`vDJH1{e!8_uR!jUJS13gLpl5kSaiXABuQaA1dI#(E{$l>L z&EQgTKXpo^0?GZen>WpB>@;^TY3j_N$u5@G_*ctP?$cU?DT2OJhw3k9vinj-YzwDp zb2_T`ug={)L%L)cZv~?`8LJetCRUJetIBp`P171NX7Nk~y7&zNso~1|+3}L#%CQLF ziXjD1hHi*oN)>Q#s2N6Wbm8TIH*%KHI2E7KL$Gy~b~?Ot{TCr)sMCAHetq6-{nRAJ z?(1E{lqgXfP#YL_4gU*y?CyH?`v*XFe>kIgpo zGu{Cb=TCr`Nph6$Nj(22G8WYX?ZwJgPkZpAf9#)(KciHFZEW5$0$?BuZ_|3}~W=LDZx?c_HZM$q#pDr3rRI?79dfeqd?|S5?FBLXA=aZXat)fk5 zsu$hwXQ{PJtkH~>PU^T^RZkrJ42c}{!kNLP#0?b0`pW40%NC))8uKfAh^b^h=zq<_ zFPnk5czZj{7Ev_o#GP2GQ}_%;l?DjNxpexfg61Q6D-dvKV)4~!2`mM`saNJuJlFDA z+)slNn&4$q>_j-uiV{hj~4>?5I zj`S3-m{bvFg;sp9yL=dubV*4j^gMEks=UvR-A&>;SaziCm5A+~CRov((?Yy@coZ+q zh1#nPU$PvziOsC~@BmToqO3GnB0AsuVzAK*)s$xfeWugG@`Ku(9na)(B#62UFBXPX zn>N}{c!_l0x4G{==XYpNgcFz+jDlL_+t}5o%>HF|(o9@zXyW?@HORrDK5p8jXYjKm zr-WXxgF0X(RFJz?xZClUWhnG2*Ww~BE~F;9TAg|sEz!jDlNcAk8xnd7O&H%m$m~09 zC|-ysGWuxHa{vgfb>$M%H1;W@9k|Dmx)8S`^;XIn z4oe(5CKdGz?B;uE`6A5=KhS?AxU=Pvn`E`0OL-2mL^RY!G5e4 zlCUam=&!?$n}hgsHAT$YJQ0Ak>Zac0rm**7pbRFG64bvk0$6KP48H7|<1+yZqN!hR zxK*X6>coEYW_{8LpZd06g=*VLTzFy>mpZRWK=}$gAoRLT0Pc;3Z^VOc)?t!S$V>;O zoLVOoEdZ}e%$!+t6HVvO@2a=tS1toxN3GLOL+Xfdtb$Brv28H~cTp zIV6LHZtlm;EwINg9WfqaNWm3DZWvLczi-5lBQ3_Zc1YOE>8Lm4g)iW17ZBm7ZaS5D z8MOz-&J0TKWQG|Ck|Z%;#U{Q^F+8jMvn@=PPcBsTSs*${Om3Oc?}%oO7gwv~4mw=S zY$R#YRMsAi=FnB|HmAF?#>Ha`}$TuIBX&KcuiM3n#sqXEl< z3%Y@Sb@(f*OuGbv0v2642B03T51mh-?5v1Si zQ{$gVe)C9T(n3e_QBOJG_QW|+h-fD0scgjO(R97$d?_@2@Avn1e2*pS6!WTygl8g) z1+aPe#q=%>qG!Y~TN)^=bK-dItKg%hN6#mrm}`VTGnPjBbxmk|PP%6SA!h{;*mAuV z$mc8b_^-90GYLhcN^nPa+E*$7l~vi*Sy@-#@HfG-lD2xc13h>Sa$Gla#m(79DYOA0 z@;>LF5*?yPFtjy6#e!!EqVvUrc%=4tq+rdw_^6YQCWUbQ5@U94e~#6=nJf6+X7gRR zUDy6OSLDC&sL$qW+6OtayZL{I%(G$ThEJtZs56X#R(}V7OA;;#h%>R(Kq;%&G(h~U zKEXSR!HZj)`;=CSXrxUX+4bZ%!@~#6SB7nbXU_26ujhIPGrHAd_GfUy`~*yRXZkb zWn#su$l8nnKyC4nYLwCSl_KCn+ZyL3C7Z4T@?Wzw~w!jMtV`7?0Ym z+K9*d1xMX3xbZxvg*j@ADkQd>8E4`po0oO$u^V;HUX4VUX{$@nYBqGnZ>#Ej0Ww*cJqK-T3{Qkk4cPK(~R@I5h(i+}HwRrQ2h@C41r=!erW5)E7o zH2@XL`fDp37OoP5$!?oS%}S)6UN#Z~64A(xJe6N`7go!iQ9lqz{V@Q2k+*9-yNElH zpUq+Eom}U=grtcC%m{%*LO5WxcW(~N9!f0ocZiHmPr7?Y7fme6u65E@O_x|4JY4M` zg@{yG>*DrrGQ*T#Q@Y>?@x7>Iv*0pwQ_Fk%28d@y#>lR&kBJFc3org9=9Q81)|6r7 zC@boglr5+zj5$Usg#0#dOk+|cwkHoloE=@^t`F_rEZF;MU3$!xZ`Kf`M%+=zX^c%p ze`QkX%TaEbDFLzqv6S}*$I1K?i@FcvCk}q7rbzMeO>;{MR@4D^5crPxz4~dHD-u}l zx9!p_d-RDl3y7sD@d7i0=5e$dD8JRm^NLIKgJh46{&+4}B**xE1nOml&koOp)_b{? zBWVW|jx@v{K^eG~M%ae7`2}->q*LyqncEih_szJ-Hzn5rzjClAGE1eK!cWjJc zyx4O$+ID2`dwel6{uhiV>eYqmF9`ILpY&gGHMota{{L5QIblt2H>;3RlzsC&x$z!GU!6KqlDQM=iQid%sb z1ca-E_FUI)%r{`kuKkk%R^ zy>J{h`i46InEsbZ!zsql<#p9;Z_(mN+01k(*RDa~c%~j;#CZPR1=6-tZXyPQ zPMY-F)gm~ctW6=|5$Qihb0n)+h4rw>Xzh|V^h`|@o-a0)1L_A67jH%*BuUL4(enmL z6{SEaAhs&j;iW|)@NF*xj57V@XEC$8*l(hs7OqlT&^wTrogBPZsAK`8;5v&x?G6ealXEuGes>{>56)(tS|XgFcE? z?+6FEONz^a?E^Ek1e9kI6Zt3MOHC*!NQfwxlh9q z_J;nIZ&s3IZ245GcD37f2^f`;l<~Au40b)X2JZ2$oiF}@VEB#MY6QZy4H|g#l=}f3 zsNzOQ4%sCt$*e2hgvGdhpe&7Eb!E?bEl%oqko@RPwz->Dd-`SWn6)B9)i=5D(+uL= zh6$|THj4YqUY-wj6;=I*=l9r6Ck&qr7~@6X&YEcrj{{NGSK*E~%`x0k{+8N;vKa2B z$)vkjleX7?Ui}0|1NE3j?+JzXQ$!xGSFbfwJ&=RMk4?`DW7^efakcyfnO4KXzZQXV zFsEaE6h>Y!T69#ai+++-=kh-rDNs$PjjPO9>Y6w;c(UVoN;xT!?X@kvG_mvMYnzOV${I__g>b}0S1 z9(ggKCGjh3zfcjJT{!fI%@GWZcap;21mB;`jW+bw5%;IXYJEf3)+6SxcF$Pi>+)g( z#>KQ6coXu>gBSRsb@e8yLGT&Lde`oJ)qk})wAD$;@>A(JtbuKrk>G5cL(|0_alUp{ zn1iB}Ku*n}pur(iIr^I_*D(@ILy)VOmMLrIh5}0;UhE|#J<+^3zUlur#3rfj{!}07PyQpz^7%3Q>EC)z3`+z`|^rdQ=7dq+ed`q z_b^s4uo7P$`PFew<(MWlzjwINn@ws7?oCqU+j57&aD_~(U3h_^R1~?rnaDeTv}84R zx&nDbf8F*V6q}Gv`kK(r(^L6ns3@?u^kLA@^$HvtorjY44I#HrqLu%EVEYKzG?uE6 zL;Nqo9xD)3h~9-+KN{e+uzf4DCj6A?3<6(cjQUYRq@6{xphR=Vij>|ZyyOdA)a(V&)?`s=bi5S_?(wRH%RsRp;0qt z#45+=dBwaWZ4gg@_x9?&lIKzSAZqBBc1S=35pd>`&p{`6cliAC!tSP$)+5Xo6(c<( zWW7y&Ghe-2i_aJk@EllnRU-=ANBrNq^VEKYhbi^@AXX*Sm}wUeKco(+EN#}gjed(` z4*R*_z^2MrZ=5meE1~fMOMVDSn1AA`Faa+UC5E20)C8Dxf#IIkNOOPJyjMT7Qop5Z zkRbnGlB7jvi8PJg+e>#Mr`1En?~{4>k5;k{s2KB9Qu`mPH3QpKLfvw6{7{hGj0a`S z*2M^Kyr}R3LRL#+F9clpN>KjLg?vEr)`&~yf$knsn2!^skX`PD>7H}*uergmk z{s4XKM^)}^u7NjfxF6SbEk=G|5DhW1NvK*=m@bt4t196c08U&n=Y&6CE68vllA9O= z^Mk@@HAEFsw!AwoUVsK{5L=>&LyJ?+_1$K;Y9?8h8nTssMR4Ef{@dS!_B zyK*^)DEDKKrwUwMcDW@(Lh)bptFt4@5>fTo==b%P$mf-W;)U_Po0iOV*06jC)W8~S zYU1nCx$jMJzHsCOF=VJyC9origD4_gKsKbaVQ2qhT<-X)0ju8lS~YZHqo6>4RDZ57 zwB&5z5Npf(rJ=NnQlvk@s(L?xxJuNby^AJ*rws^L-60+Bqt12UZLqpbihSm-F;&0P zAMK8sMGb|`uo3BA%D-Jj&Nquhp0ZO(a{%rN_P@1J-?{i1;AY=4VDD2K5bGd$8kPXE zJo!8e#eX_XX{y<`m`&Ug(3qwD?Eb3&h!LY&acxnn3wJ)YTY!21{Oe6;QU2QR=?GAD zH%H3GBol8*3uo=tYKZ)lcK(1OoFxDaHYG7e80Gaz^D&CRK9!CZFbQTkH zSwVXD;Dv4X%cAvQ>%|Fjz7$1bJBxqDQ{8Y4*^leNqzbg+ z_#yuHef^65PR4b50m&C|r|a?bsl!WmjZq58U(m`g1NZirYnk3CzNa{7Gn3CzSYu3cDJy4!_eEnS=c23IP;tz-Sw{+S;X3%JjZmHlb;yZ~=SHdSA> zFpl$2)F9Pz%YPDqmnG?;Ce*jUXPW+!?~&nY{=~D!=GbC8)(us)k^Up2od+cq)R)Jy z9f!OYF=G8SzC+cckrptC?!XTwYlFAY8g9owV!KraGmMp#3dr2U+@%i;o2M8O<5pDC zkvOoGPAIHC!{Q=Z5<5YP|K_f6VKGMkrBPATCn?IHKAajG;_C>{0(L$55WFNl0kH)} z2~u?8AfJFbRX;HM1Ag%hTf5T#^iykihrTX-@qie?9U;Hl7+UEmo)b);Px`Rft@qvGfAXyY>Y_o3}JZr?vPZ{g%tjCrTu9l*H_ee_FZ` zhkU0ZiM>8-Y#lG-`=1(LeEHVR!5XCZc3Z-}OD~X+OqO}n%`y@u1I&MJ68BbMgYUTr z1fvdxBlXTK@*Zg*@OzOCcG_-j)pncxTA1b`IGoS;1;);%gREBeO^jK0X9|RJ7q8@J z5PTdeH6k+rI}o*-XPz`=SGY_Qi|Rv$Q2k`h1U*Z!31C)(X1I_Orh3}J2W?RyL3ufz zB@8hC!sO8mCUH4i4mxtBHGD|dz$?to7|`O;T6?^4Gj;#kg_%>yhTx7N z^1Ljnc}_rY>HQ#jp9Go8_w%Pg5D|OB$y6PXJ;9FvFIsaS+w(|SG|GS)>x(zYPF}Q+ zL!C5^C=a+aEyMJ}oCF|74Lfu;)jR#h$_k72q_}_6zYcuskX$^8W`tE8<3D8Zk{1yS zlSC*&G{m+enptHTOv(1>esNhg7JLImyK%TWdv!11%f3l+IMon41J7SP^J6g7*e=&@ z`_C1+)z&)MLaOpx@?n*bH1)Q?0A~ZOsT2xKlh3HlShK9(of4@&`wWHHZ3GCLdBO_s zLn;Zp@XeJ*1{H#)s4VeED+MALop?Zju^|#Lf16B<&_#IdZmTcEnt*YN%ljydl_f}@ zDR?5+1lIMBr8ex+L*y4>^f0MsoGdfG zy#uhgY`Lwg0o2Uy9_~K6>6xB+;k}&~RizWbIF_JJ)&%IXHE8KdtjLf6r3e?hGkrN! z0fvm;gFfMbwf`n9;s;d0;pGYQ^mJLMG9uEiMTp&%Flm4Zp-+XEJcGdrfZrmL1yx zgYyZ&RJ?n8UNXs0iponEl(J>H%Bjk0N(2QtE4vr~97cr_yD<6Q9j1(D3cpL+`kt!xDxkQ2?so@<( zfWDu}&)tgG{O7T)Ft~M+%%)xLO?cbl=HVjf_B0kjDIB+Hj=EaZ9Xe zpO{~6V?Lp_FWV$&`l(!k+UNGjMVo#HA|B=~KiFO)s2CQw?X>TS@ zkqpQ%`bc!K7gS0Vl50cZ`GV&dLwEdKWv}?UC z3TII>rSuLs)om$tq}mgd+y_8tlaCl-q61oti9orhd%0r+3M1){A9RT;NI^*tU!Y`p zNC#h7ltD7yorrz>E5B#oAekUy4eECVPGDo*9j6Zh2=I`+ferZ_T&|?D7In$QvV9J5 z!nDE%APZ{Bg%fJZCh@yj-4?OxEsKy_C#-^a$Y~}RT#oR1MFSs(edO#lt?;$7U<9+- z@wAjV;E>Se4iERd6jozJHGO?M1k3#2fc$s{!?%ThejWx0Q*-3Hw#~j?j`n;)Gby=v zr*^t(J7%(U3nXgl6=yMUu<3ylD8sH1!#Lt^CdxP}80)1SQq-A>T#a_e=J$!9$^7#B z<41yGA$@gV;^~zFt?wJM?u}it_Dk&OwhoVtEGtu5elq`` zaNRUkPbl8_!m*{IDt44iJNTBj8cGZW3bd4YQO1Ua;~b?`>}2=VK|YZi0xQYTeQ3-*$sBCDJ?!jVop(afdLxI*Cu$h1+W!M1^f&H(Qe|O5>q&KsWlCJ*(N#p z=%!&GnJAxFym|A}R;vFEf`wePEl#Rjoa5dliHeP#iF;1MD7Dp>_fDO$@>{iQF0hr& zcIp_JK%Mqc{#(o_ChXrc069R$zxJfJ_EnTi``gQGeJAO ziY>GiD~|XC)gOtGNIn#YMX|KFPBVz*LdSKsr_lVMMMu5FR73*wL|Z^*C@v6>jMt&r zvt3amM(nfQU#FJ{a7D6R_$jjcV;BIkSzUP8E{*FE5T#QZNeOn{da~g94{1tV@;JnPn*ub>lh@vLVTi^!7{dkS3ez zyQKiVfn&wxil+Np zp&;Hw9ba0chdGCtOAcS@n(uA~>G9u242edp*~NVFxVnnW*_#PxZSAva*z#Uk*GAad zFHv2!=&SDT(s^3p>hzSn6j^hh+A7IQ-_h3btSzAw7Km{#0Rwj7N~QB-_lH%@Yi9Rzkh6l|q7*+)qP@anh;QfpuUL?*#?GQ^eo5A-yH)OS&&S`~6 z{p{X`%D}U-PozPftIof?`S{4e99SR^v8@VbqAQ+9{Mte2rngmKV&_yRFIWtVtO2v% z9d7R5zGclnmnNUaeo^X;patdzyeJ;aI*t7r?MG`>X+~gjjFYqupNt}f5CldQ`=5BOAk&jUBlfr1+*r!88M!utq+gEmmvARlfE=i$;f2Wi8ftmrquGJ_idS9aSJi3{5VZ z$||sRd%W#<8Y=g|&XG^Wu|bm5e?7C+z@XqnBw;w4fkyNjTBDf@7=W9*NUT3Sf24_D8YDd}rd?zUXLG|&`KS@$A8 z$*f_g9^c1TMUR^bn*IHPP>PmL-5e7zlJ$Kb6Pwev<~WOZ$r3m#1~;zN8`CJaGkZvXTq#OI!S>>^K1vmdOme%bmdlrPQm8{mezA1bt7Y8 zvs#~H1M-=dFn?+nP}qTE$N8{wXLpjmbfIU zOoDKuyiYlXk=#nQm{iKX%&m%toj>0;%jX@0a^k3-w@lNRzDi-V(X*Gvl>v9S)&{cv zQFFnHPHU_)MAvtrjpqckb;dknSZU8OBj9Gr`p04}@HevS;Z8WM4xiV(0lziYOu{~I z(AStX&r{4rM-eSerU{4EZs~0iWaumDV^xyP!J3ZL^cL$LF%=ei7uxcmY%LtEw|XEs zGj#Wf-C&a+vD$zu12PuS!){`;7WZC(Y2X{R2y7fdML>uyv#YS!d}X%rNT>w=)tVmW zEJ)=bESZ^Rm?(q~dD$|ri(#O@gOLjcMm+!3s$^Yw%jBnOAzd###-qHaGNJF0D4D%& zvDmduji^02c2>r`COWyM(k8-~`17BxFlKDoz2qBhLUs?rqsQWtu(G*2s!q3Xg1oTq zF*|CE_S8ibySf!IijFyFk_m|9E{+jYM+t`I;yP4SE~m#gj0M;I!C`c0c!K_vf=?}y zc4Y?pWjH$*!l4adG6z$q6DPV??oA^UyATJHh_gid+@x+YUw4v2j77N1evD8i_K8vo z4u`JFlZNUdGiRa0o;NY(gS`iHH^$FG5hH-r{6mTQ>=EtNX@@t{Ud7v)I+QK$`p;hdA=R z(RXxg&Vxq?P1y?*EG6uOH>tlowKiqZ&7o4y8P>15R^kogK+QH9?o){7T_V2aULKX% zU}US7AYoX+X6ju{)<2Eb4dSih(?j&&j!iEro1r(4OQ>T-)^sEol;X2G=Aqd8hwyoB^`yR9 zdl6o)HZHFHy7i`-yzTnmU3|O8@=IasNMW7ec{Y7WQk&Q@cghxl?JE< zGqW#*-gjagXE*%{a5!L0m7`5t(4~&HZHlSkbsM2IafJFFtl8a=JI5P&o6TJ#$11hY z21wefXuJ-Q)2{DzIV9F#_YtW#EXkbKNg=;FacTI0#2qIn`N&;~$;tadN3|%z;SCOx zJihyxa?4eod+QZZehqGSy?_~Ped1;|&f*#A)1I>k%P(pMe)Z?kteMslV0@8Wu(_;s z3vFn(9&?p{7(5NVLqurAS)4eprC4ut+Y9Cdc_OVukBZy-pQyrp(6=B zOcHa2FbhP{#QZUKqqT`2m9u^Vbq?~21i*l1)T}o^!ygjYcOh@iBOW7q=hu^W5udm_ z=rCg)jhU56k`NXk1 zQt{F(Gs{1LVJj8CaoTK9miS#JFho;^a&=e&4kJnRi=~=6CW6`}f|yNlM~W3+UBETY zXx$H3A)3pCr{w$=9FLQiH_4vrfwm8bjG9|#};{3E-yW1PT zgVJ~9aI+M+f3EN44?+w9PL~+@4bSO z!*^OVfd^#wwBk;*&(*ZIxjkdoT)>8ixmz&n*&wwpLnYXpek8$fjsyXujv}rMB5O*w zN@#nwAZneU>zEVu*If<^Vn5JtH54Qx)o73l?g%P1DZX$&z3{F7zZzFDskXSLnkMAy zKT1Ltk$N|@`YH2YF8*p%WFanA!%s~7&R5AbQLIueEV7oUC02wO;Zi<1G2~3giH!H5 zV!kQ*8aDcHZ<#LX)gVjy!@IpI&{?ofdu)kee>7pK-n^dOAA zbygawKc3MWE(y~Als2?vRN>|RW$IO&SMI3p2rm_+Z z@#2GqS>AbSn-+G=B91=|t~N3)ESYksd!_?T<7`@FMa+M5Vmow$R#50BSN)+j3Nj0@O7vL|6MHD3<@>iZr zrG<~j>N5r@E;svUlcowyyUV6I9^26C+%j36Ow>Mv`_ciuas|?3El5Mo3YB!}Hk0P{ahDm|Ucn9Z+tevp8G0*R^Nhix&YKoO1vW z`1AI$mp3ntQfW7gzBMRU+dKap#=LP|8rUj&g<}o~g08W2L#zYT)a*sO#4;+EjI*G? z$-)}L=VWB;0_#hD=q*yl&~vL4>X@f@OINyAc^BU|3ZeWdaFrJU5M`(|UCjXbut#;L zXTI&yTJ>lTW*}v0UfAVG$igQ*+x{Zs>Lh=zF>o;>sIs9IhaoKM=+bsXk+Sph-i_6K z>!%rP-XiMl@i(}Lf>V=pLetRSPz3vraCZDeV7MS7x*EB5$yBKnb;Evu`RI1-0dGee ztuwg)3o5iD*w?Oz`@cBRzAgjyw_sAt>!OM} z7e=hmwbAgxohK4;oeYq@Gm_#bV`yjjY;J~uJ6fbOuAfxQQ8YZHTKPF>RO06+R?Aeg zwfQqlhP$8B2}v=JS@rFOJED^N_M-gxw5e?o%@FxhVfbug!pRBJ<*F^)V|WfkJ|g2g zw8d+G-uDwG-g-pxImg(8Lk=X1O))g{EF=fTCaC+@^EN1&dgT&SKt%P7`}$;_3oH~> znJ(pv7|?i8vq#8QCmAJZ{X^B#_q-he#=oCQDzf2JX#oxhr(@A#QMSGugES06b>5Gq zshvMHl~>Bf0vFgtjc8+LG6cQitT@ESMcbsvJ0 z$rBC*o3I4h(>uHCk3X!lDA)_fFo}zASeXoM_~ygmh1$zKg<}8i*H9wX42^B%`g_#) zEY8xu$o171%r1b$%&eS&Sbn7|c3h{8i>0@Cr-g%N6io6fAVOU5*|SpG_ad7(KFg7y zj{riXZ8VsPb$3(-l3GyWHGM0k6#DSDqOddVGVj4qr4=I3e3g;l9GPUY@ubb(#tOF#Z(Ny^#z7af`#M(F`a8V0H=(bWTsvqeS)=uVm%tS zx9b*-EJ}+q&6`{k$}r!Vb5KUo^*590z%~XfJ?)oD`hb05ZN3!f|Aen^u)%EbEWiQ% zIsL_jj$%%sSW7W^CJ-;RBo2JA*KS@90yg1i*kb)iPuz;($9$wSJgmH!61Rhs9qrz< zVr3MGFTh$M@RFZzEkIXpQJp`b=B|=Ntf!0PJazfRtVK0eyJ9ZdLIq~*2G|pbDONZm zTfUxMmpda(Vg-YEv0eIe_@0j@aoUOhKkDTMPK9bK7EOT zV0VU+8f9L>Au63P`)Ge+9&szz9Kr#%hH9%oO&{~2uyNC4NjuxmD=GI$9 z|9;#>1nNI2Ub_}a@SIp+b@9UAYLf2QLW?{pgy6tPDUE5Ymxn0C4X=E#f-;!~m=91u ztq&asjKffTT)MP)MtRNM8hjiZD8GiYdA$Z7I;sPec4z9QugbADl|?mJpVwODJ#iJ zIDMLR*HWM)j0^E*t7ak}w1OpqRUnF;Pq=Z5(GiQ1hQIv&3_?SEXLM%5POUV#5Cwkk z44iKki`Wd6y6B9`l5klO_Pof4VgGd1(eifC?>+waQ8@`|1A*Yg_AgfFPA$Fx`j6~i zn^pg;+`y(_AZL)4$7y$rl36ZN1W)If54j${y2s;TS=pHj<2~ zjaQ?hOcaq!wyLca)2ux~i|YfEW!;bzH}g}C40CpDjRy2^GN~o;@NNI5QeS6h1c=R= zsgDtx)Mmah`~qUt26R{-%b>`8ScH)&5}gLC*%u6$HmAt&VcD(+VC4bGLv>DoG$J6D)$Q?f8j|)xIXgfOy`*M&Dy-B zi#~4uQ@5Rgq8`%&$Z}lPEGs~J!g-qiH)Su_`Ts%s`cgNZ{mGCvfSPu&i=)L6-VC6W z?i{RU>eT6_ou7rv*tYZ-KT!eCya;3}d5B22BBIe)w7Zl~0RJ5*69Nrr50ZryiJQU=hBze94=mo$H!k8jmWEohPrjmMIAr_r=fbk3e8W zGr=X*Q`1n3YLPI!>dhrAavMU|wJ5<|ilcZlZ~fh9#j&qUq+Nm$b;zJ=R$P|tMjL8J z6UR1bu;Mm)Gw5+(&7N*S$V#L3D>{z99R>0t?IP?^!()6rT}sL(3h}5R&2TD!F(9)7 zgO}AzJ`7lP&wfNpqlF8!0Rbpx-YOv8yUy{n=E7AG^>N9m9jZI9=71Boq2LpbYHP2R zqE5S^dF&s3M}MeF2s-BYP;*7QO1>P^eze*Qy{cgb0CRtriludfI2?x5&({U7D$G8_ z_ktWY&m4X^6o8u=JK_u3kHvGbbLy>LUn?H{s>xd+*M{!1kg5Gayw?o0J%XdSnQJBx ze*h4&4)rT6yeRF$3P>;JY2B>1MsGWqAFgxW@yH#z$An0U@M51{QHY2?2hRAjeue1lLw`?9hJL?J z7P^yf@JwR&8iBk8 zp_>aL${nK>hZ6&%w)Av6&J4!hFKB~DeqN1={Nw+=%;>L)8=xgdLwnJ__ zL}y{o^{B3sy0!h^ZDJac5G-1p$lu?Y8N zy7qF5#kQyoisCOvuWZ!31M7xeUHtBg=ng zmJB`mJdQ>zsK392y7=#i)A|-yo!f%^$1E~3vuuk zVNJU^lQbKfR5;1PZ8~gGv|s+l+o#4nQUqf!GMkYxQtOl-d(zd2@wghj;erND`eY0$ z&a!1+%9GvvM$o3Zy5W@uE2(uG(v>TfyNk@GR-gry2Oi?(p`Yl@zT5O!Z*HKWhHvd> zs!%T9|AM4s$0!~0eisj&@1nUehSMNYXBbeSkKiuiuFYp>kc{BTX0D-~a>)jJIFJL; zu=DwQ;u8b-qY_$k$iw(~+24G<=$3yp{8hb|gwY{ja2nxiz)o0FZQC{iF>b+XeNH;! zj|S^mNY{E6C3q_u&G0I3^pG^;C#?ekKoXc;+h;NXODr{pHl;ph5gN?nVXId6@e)(s zaG%UjxYyXGF~d%D78+_)Ec?L8(-$ZO#?jq)nIkH-{qpIX{>=hJ83BgRHXBQ*^rM!a z`7>su#j>LiVDYafY9-GW`%9mD83%XeL8=f*DNY(zu2^A6&<=E9`KL@5{zZ%HHROoN zk7$SgXow7yQG<__<7`j&9Fhc4T*`9pFWXej?jQ9S^{O^o8>0DKiF(XYN3)dO8IUt) z#MxHj%OZt;nEJk~r`gy!k!AX^fLym1!HM+eW7=(FgfQx+${48%!#i&)fi3&F5Y3SA zY@qoL2Wd4Jphgjw|6470JF|L>4w}gEgr5w=g@iZynGYPjyv-}KRyCsk?!AL{g3ZXX z#M%>ZXCsIe0q80hS^a z+@Rg)*={)VG&p`6dG=d$^^7CETfM0Hc%0IUZ{WQ!faIVwAk=9ve^2r0*HECeomR)U zbwZ1yic}v-^q`@$iyI|4Mm6Vmnrw>e8cBhhMx(u(dEcW3bN+rYH$OL>i7r;!XA@Ku zPyUQ)(3>71z?2HtJ27*nhBSFMpZr2Leq|eSc$Jf!_8Avj0hl}$F9Kp>ZaO#hHO+@n zFPtxZ9dd488mteoUBurQ@V*k?#HB~s;oMx%nn&zm&?FE7tY+HCXH(5h1W#i-f$I`7 zv`DUdh}DGgjluwOq;>Rs64nBsQW2LhGA7Mi=R!Qa%_Y`pK3(TJEdDAPkx1jWK5N@% z1P4&ZG-S><3r)0{cYOxO&O7cLqD7*&d~u3h@0t@l=l-as%%1jU{MK7anJ&JFymDQZF?aAR#KQ;sQ z1`+xoG@m1q7lWk0`dYIsm5l|_xbSUqkFE!uIFeD-{Lh>7tdfa>Drd=c`Do5TlSW!^ z5R2z}MU@LZDcp9y-86(#l4*d>ms_bb>x_9*a! zGI>$%;yI%JOj~w5fe@?mE5t!qpeb=^_9SqK@`bwXlE=+AsR8azQ4st#<68L`@tG`6D~qc_8Sy&0Wzh9{fs1j9GFqhN*?g0sJ}oo~ zc-jZe)bi0Cx?Zc|#0pAK;;*Py&9ezQLlO3FYSyT-E3liOn*S72_2*h{(IVe!e8Eb@ zJ9zYvy@R^bt5~_AnW>n{U&xcdWh?b`!LYYwWtj#FcXL(+i0l=H%kMh(xNuJ(AMahC zjrKf0+#M@{d10QKw%K?|UpU0=kaHc5_;z?@_Di>R{-}VKKKbMN0}9a2op5PkR>7c4 z9wq`--pmnvUc~(qWSt*5%ycy=PUri>d@@0Bj`2STIC0UeD}0lbUr0yc)!84UUP|*w z$Lk*?N%Qpcj<{zRd>GxzMEqtqwno5%DEv-FhZxT-LFeiCvupfk9~r1J_NJySIIBO#rt1Tm+eCgot;iJm#b?k+SeD)>UKJS`T>)KD z)9!eP>h>Lsw)C!Y$-OWCO20rMrG?dzmt&if;jTV0r<;4>U2zP=CwS9ah`K@@1BPBv zj6R1|m1p@qUHC9&ZZQFK#0B9|7;@8^7^kajqa%?A^|q_C;Fon;iW!&JV*yd&31M9c z1IA^N2PTCV@Kly#Oq8N6)RsbwFgJ5Wz5WUKnQP0h(<7T|YsDs%n;B%^TY|?|f01wN zQO<~pZ*+i>1BhAW2v855{6Ee>F)ztqh%%tV|vSOlpN>TxxGr`?|!P?4ZG)MoK@1MA3wjN^>R< zU82Ck4m8dOrkFR>XaQest)r1n5^yadO$+aK)XVLxk;|4BPED~nq6rpz=AKOSpWEgk6~&7B0tXp>R50-PfcyV zp~UEMZ`XOYV}*&RWUK@N`&w53=5fk23b~cmU*_y_9VjB7i97L|y-1sRYH5tDi@_*! zhZNC*;zfEk`f^Q%sJ09Zncjoa4I94O>%J}!n|r^h)u4>bU6mU43d z4dM@H{N!-)wgtRx=mht3rf~)DG0l0f;abUM9zP(lC5H<=*s+=W^wt)$@~)Ga=cE3r zVyT!OeQSlw3OWn`_%JQAO4=Fmy;zgp`k5UXJYEbdpkg<>gOfM7NR2u|+H-I*3_7~8`^ zRWIWfXgqc|2$UDyx;$>fWIg7ieJBa%mffdj5vuR!ulbzpBbGb@*tR+I=JXn*W z6YEzAfXvRpkvFIPFhgj6{grn}m4p7hB52mdRl&NQclw*It*v(NzF_}@h3UoI^OP%K zt}0}WCrKjJp@iE(bkW*6uAg808bxSprKKzsn&J%MraiZyZsvYpuK1LM!2$mmx;HBWleUugzDqB=>mMdF%mKq_&HwC%G~p58c3P=3ZX_W7{>0SJwo4p8a9}h?^*V z=QzsLqg8O2FC3qvoyTg#1L4I#ELNGyqkObxG#f!S>qv$dT(qAO@(()De8AlG;hrEJ z5-LD|CE2|xhM&6c&1U_Etw*}ti_M8DyCp#kh-3wJIvhA--P~uzIia67u;SmTc&1X5 zQMH@in!uA>e@nOdgu;$t<-jOR2n#e3=nLN%Sl94MrDJrJP>AagvoF`7VMRRZ1Pw)J zX0FBAUnpbj0<5OaRFc8Pt~_qqMc`#IGh1gStO|EU$Jc%KAOZMhYEZaKLnAkweEd=N zdfKEQwl+^XH3`vJUw_05mvPyN5rSN=9C^>__Gx3~!4w?Atikdq$?afi)tuYjc!ari zHr!xg0b+%TD?cjV#Vfd%5i*luz=Z0rO8kv9WLk2B?UksISkPajsUiPP_45t^!Sn03 z|Jo-#@CQ&&MrUAGrKt9wASlOsV}Nm*t(RmUSeL_`3FU7+L)-j0f+@p!&?z8q*rA}- zSjeN|N+PX08Xek54&Rf*GVwJiaak+lox3Ksjw4a!aQgtbUMfGc!E-{}MeO!}rQ%Y5 z{(z9O{Ejx0cPFn^W$+7(4}H)Fjz3%gaVPReSw*!z=WV# zFPM(`_GOr2T}Fsta{887r=`=lw9do-54I_d`OG34Yvt6;GVor+@wKi>_Uo7LUffL@0ayUct0@T48A0w^QMf$d6eUg*QL` z5+$j9dewcKjoOJ!BDCbgEsPBHDybC;Q*(#GU8ybb5^Rp|^se)8vHst){I~7T=tod{ zaQ3$cYs4?fJh4JhsT|G0cb!{J6v&mRw+o=RJDF5~0-oXjz? z2m3xlp=0dRM`)K}aR?18qQkE&1%B=jUw1wHo8_zINp8Z2{O_3~?J)!tw!oh69p$G| z%MhBkNk(QS4LzID)jV9xItLKK*rg`#>796wiJ|>DaHm)){bf&O(f+Wnksp77m1cYi zBa?%~{ToXh16A{=W<846il&AbY0O?U8XEag;`B=7`rFn@f-H8Dc#Yb6AC}rWx-QMs z(-KF`ARkkDOei=Bnaj7_LbZT2_Y|nxr3F|7>J0dlrK!vw92cx_;%J^jc&kJ=FcLUGoK$Wr1Sy+0FAW!HphP??HGn$dPb4~Y}+)z%~mT7N*@@6Gp}Yh z4-s1!>~lOmZfZ-@tg|VY`%5gDEmY6quYseIY|@zlC62{rk*&!{HyM7m`IjHGJ%pV{G41V(2+4l1!?hMj zwk*NyW_+6I66z$E9u0%MoZpK+nMUgF{4%YH6eMxgl*)CpUZiw$TW7E5Gs&vgu;(=( z%xNe=Ib>W4SE$k826y5?(d|}5k}37*4nons6Z+OOTi&95to#;n$RAjh%|4g{8lFp} zr&J6t?ndHtECkX(0hswemju{3DrgU(Si?D%ZVcJ{w&0$y4yp^5^aZ7BWd_$#A370F zCrQg{<|8#npF5hxC$8&pmnEDNQf2i95%c2C4bexD#UNcg zmj!}48>2|*{i4V8if)qayj?e;iZcNwPfTPTp!8Z*_yWI6f!)|EWGj%Fgg? z6J-v!QN@OTg2?UiUGt5*qF2klA3+2QvlIM6YC_?;MKf?S55M@M$VmcrM~5D}+m?CV znM84_Cmv#sqbSYbHuikElpL2}Np{a4md7H#M>@BvEu>s7`4PM_f>NqRQmz#{4@5uT zE2@klNn+v_BRByZnR^N~AuSCJw>(lBCDe);vu^MV90Tji*Q1IB$U5{-fP|CdH?WwrIVd z-*(-x24%6Is5yDDe-a7d8)D>NsMx<#5|d4d-#DxLSq-hBi(wTNgi&BsZK0S(>rI!? zb0OvJ0L&d?zod*r9(M%tG(5=y(|58-b*|zjdSDx?Cdhlt#83hFDP1EDv zz&ir>{IO|$uCeI6#IV7ehnP!7D>}lD$a}Ibxj(loT~M3E>&9XDJRr`dZUUuQ-)azb zHX==47Nl0bl);G_w?NzZV`%XerDKz9Oy6(&p&@Pl&hs~;5YV`_o1$eo%rz!)=xh|* z1||`~>#_sq&$=GSimN5a@BcXOrr%q1?%vr{@`RTv8b^z&#(b;Q)T;pos+ekay)+Gd zv-(qFG9UPEZgh9x_%$iRaYcWr?U1wH#jzQk<@b!^nCC^M(NfmYii*b-F^3QhX!=m{6ecMi~1M!mWFlCR4o9o#R;>SoT z5XC=s=kl2E4#|2B!un&vn&F3Yz^d`mHXUODVXgK64W_d0GG^dK?vXsQH|YWhRFRd& zuN#l=dz?*()fij|n(#K-n(z|F(?)1C&nX<0tJ`ZKS;a%W_ws-Ni73zIDOQD2rSn7l z9^+3~3B3w;m^i{Mh(74`K=y^cjhJXbJhT|b^?Uga=%GeoY1Xs;Xuit|UqY}zcYv=g zBZPy`x(2aA@?vzxtmKjyFB1d{A4B&6r8*PI2S})VZ0|(8EK3a9vR#;5qdf`o^dNu< zCI42H;}>Zi=)MK|r-RII*7Mevl!)*`&o3Z+5Hl(WG-e<`k8l0%Qd0%dQzKY@4jbO{ z3bEQX`P=t7q=ML-gvGAEF^y|Vlv<$1!Y4pkBQEeVpiAQ8OvSYLm3nl#rHJ%Kb~Zp3 zg~;fWO+OhMG>Gau0ZPt6R22qH+<-Qhd0g7{sxY__HF*SwwFGf!@o{pkwz@0AJ;W;Pw&sahskU(0+o5avCQu5EBhla=Q*zlP}E%Hs#I z0DRLGNAfdM6}pA#jI?2N%((ZLJ16p9Ay`2bh-P$sEToN`xfy@t3xiM}#x2!$?eKbS z&QzkwELyNqd}BvD#X{`&%Wkn*8A=B-*0U8wmQkfkx~#85&j8JsOhSQvrb`>h4K@c$w$P@Vd-o*6lq5Yr;55rBRV9ow?e|yClXpaM@wF+Akd_h& z=QjtyT^nEblRjd1$bpoU3xhPy>*pRvr>?E#XUw?>PzItxTq$pH`7}vv{o8bN8@w?_ z&Oe*q?sJCEUv($kZpN(J_O|Ep5=~b<`;m$wCVRA2xALJFy82LzBHjOzxY7+IPXSRg z2tfYYx0W}d^M_m8WvIizw0l-G#EmVh7tb)}$?#$IQ;IR`7zApYP|icVm#T@*WXJlpb6m{)AmdlnYMC4n!A&=m+P>w9)@9tD2$>(1eBCuHEwSM9X{wE}X; zFh%a~qEs2!FXzxKc2y)i&RIn;klJf0XVjj_Bn*35aEm$k9TGvmw-hS}?$>FQ4$ZIV zog$>oWTYHNAv<%1MG%TEG<;eIa`1;htZk+wE+3$)QNmOpAIgB{vx~oA@4J~$S0a3*_kCP?Z8|%O1EmPf?bZ`((v*fDzeFD7aEWMml=f$R& zi%;)?^&+t+Uts|zM>LedK)*o;cl0$i7sO>gacTO*g7oQgIbwr)DsDeEsUfYL^;r`B z`lj}?;%li#?gUNLxFvEN?2L$gMRuKk_SX^a+8_+l7T>vuG@lIj)K(}gdGx-Y-$I3V zU{G*4Z_|W-%>v~u*#&EwYKNU(y-y+cPROUW7iC0gITg%Vu{7Gs`>AUw9!=gn+w(aa zmVl$;(rPKX(yQ&55P@)&5VYs75W>fQgHEk*nmz4#!6r)SizF2`btaIOuaNkIh7529Xl-Z>HLxp13ftUQ?rfqSaNzlq+{bxBgT}b18%w9YM1<=txB_1Tle z#NJ6P9D4=B6t@TRGcp@jPUw6CXb4K*zq(pOm+|Jv!IZ|qlK`g{XhJO~ht({#&s@+c zl)q>Zw6KztX{a8|R!>kul9j10dSd$>+Pb(_9Kviw zfVBxbvoYAR!bnXSa=m`MVA=FqF!S8yG-4j#rS@uB+`I}bv(Wr zZvT>}O{Y{b1}2e7@RkoJ}2GBPGXP%%80UOV*nR@eHTqk08QR6 zjJN?K|q9b@wz7JoE`D*j~nJ2OpUzModE_utHC$)>@0{{$#A zunN6eo~a5Zyk*1tHEdAB)V~nz^JStic=S0#iw0EgBYQjG{+=sjdHv;OhZpx# zkFmsQubu~D(EoaO?soc$kS`-p_E53gc;v^eo^dK_U@VYUjw$2`)_$j)8#=kPf!xY# z%faft)YsW;P%@OkDNd`Ify#f|nY&?#Y4PO$P8#AqgV^5F9IWKof>CPu4D?dbyoZsj z!lLJG5GxjNA?~5%c~@Ok6?ylRe7C{`jgg zKcHh21*}0l`xM+@FF8^>(x=egP(BQ~x6H;P3ubpL=Y{QAS_~Ady!Gor2wO&WYY z`B6o~!RWxfzqg6d_eAVsgS7Ba_m6I}-o_iKw7{&%l_a`c$iqySFu%XDN`CYHRAv@pYir zFOG(CV(-7Ou*|2A+wsV}wV@b80VPXK(WhmF;&R{IkGa4K98k^0`=3@LAQBOxeB+Dy zwQ&K8L>>5;@@>Ga_g&cbyQ*e|<1?$vcYi#qw7%~#7XMIcqE3AUSzq8foT#EIC09O0AP9+mV$m=r3!VuTY8g=n$01E3xPrIE6QX*RIyc^m3&uKlETKRU>7l!}xC;b0Qiy-H_oroxPkhY=(*e~v z>3%g_*@XDQo!y8NN1;2;*hFKbPWw1XS0Ow`MS^6;J5nNrrr5y%zDS11Ch_riU(wbm5{A?Rjnbq$xVY99l_mZN2NGoF*J@aUT#w&^a_ zXyS?vN5v9zksRkIjoKfHAY7a@-!cl{40q+NMC<7OPARy2lA?>Dl&es*D|G_Yuk~}s zPo?CvP#buV>K|SF8@vnx${rk^80PVR9>3Wy$;g*>IDbLg^1{TI|@NP5%DUzHZz0xIIJg%?AYN&uM+`H@kWW zxOY9f`eRfYL@&~^RU&Fb>L4R>-?(P1f0Nl=$MKVT>Wax$AXOL`EOt*f)3}kEl*+IK1hkMF-3hN5Ch`gh+roujPHdH=y_ED`Y1wHlj==bE zD2MnTr_Cp(=p#yb48{E9NKD#Ck>dvA12HWLl$^E#wY=syHUb6zO1R zP`Z97slMfYKo5fx8DCHpE3>n^PZ~6DYWq>o{MwUjOEfces=v~h@WA7Ho1j|14gll2 zLEAjKSZuxkz^BBH$I5$ADdtt^yhS{iYZKS2(JK#}Eu-+Krt-u&;6Mal!WAguOt6^> zsUJthfv2486Ah=R>Xm;YpCXFK`Bg|WPdI3J!>9RnGQf%U3KFS)Mn{}I*f*0_EGl|I z{regEyTE3sQLudM49lOK;wz8=E(t}`FbZ0H^xKf6W=={N3BZM(#W26#zQNtRQ!S7I z-u3w>+s(0%wZ>i5ey(Au-kv6#jfcw!s%-WeT+($6!LhsC;O}B!*~QtA>Z5F^NNAxe zOX{iuJ=V)cfyfQe(E){vin=iz7^&YfNXvuFDygR&Nkl?rVr-gx5dH(JbZq~~B#pgX z9{njp3IpKQ2k#PPe<{~mN^~XET_MtQKML;J9u;wIc@+c?nr_mFdSZ(O+-Bg{o2gQ< z<&iq{6C5v@5fC=4fXVq7w0`cH{OSUbxdB?YRmy`IXuMpk$_UuFf||#A08haTw0Yx^ z>UN3MYB`mG#ou?Dr0$;gY+b=FS@L)FU#m^EnC%ZM+Ib8G{^Ry#!}VOdjx^xkLI`Z2 zXk%!&1)@I>U(@cd{6orf8G=L9{~v60Slp>;K?j^idUB^! zb-E%3%nHpM0Xt@-%cR56n!>^IUidy$Cq&Es4i9y)h8Y9&H0c|qT^p3Kb|NN6Ln9nf^avYkCK=2i0RRVn$^+~kv#Lcfx|9F- zbr2|_TsJf$v>IYsL0PXh;td0}D%4G5{AMs!ZJ|Jtw79&G+&=j^a0_IjnmMkS09daC zuNJd~2`$2Yg#E46;bDt-g9>2=s*C2!F;3(L1yJV0mtLz*dEeuG0dEm2uppe8gJ=AK z8rEZFcFk-`z${q6G;!r)MF)*ad`~5Z^poz~{g`>N_C%AT^|gseF4^cInHdt+s(NP7 z@0RUc-5qvSZ~rX6-Jd(2?P9I=&#%*WCFL(c3BV-y ze$)URKyM8J&C^tu_tUlePsei{x4Qg^Y1m^GmO*Oi=`k$)Rswr~~5Cjp4Ud!v2WEa%Yj!XqyEt z-35J3s&LOJ7^^c?>@A3_%g=72M(tbH+qmXI=0gh^1yH_QW&QKX0eBSWC)0$vqASJw zN1MG8kuqaG9XmrNV`VtoF1o9=kZf`gX#~iLEGqH~-KO$DVD09kx)6pGymX5ZrJ1q%eXgW~2VCH)}qSj9U$QZy!T1o~DERxDU8sL!v%n z?iwX+b>U#5xdeQMR&=P6Q6dAV?TP{&n{F{ay?yh@Jt>%8yLG=najG%xHpi<2c!br@ zJ+OPXA%aQ&=YV6266%W)-=*DV-mll4O#GKw_>2HSK)%0deU%lusV9;4ZXov&MX1Pd zAq$uxD&Z$TpvWUay(z#H+#0en*;~<)t=NG)l5IHP$f@TYf!>#^&$sNiM#v;^niy z#U<$PdX)@Ql7_uD;LIv;fa}dWLorm4l87~iD-h`M#7Q>OQ7)CS&dBm)ljZ$igrnmQ zVRr#7^bi#HnTh@0uDmygVT*-?CtRx2#7}^ddh=h8dSi8$Scph(c$0wtE$~&+uQ5m8nFJ~YlsAZ>bVZLcS=70jr{H%VMVH~ss7}+#pL?` z+Iiy2r)>}|Z9EB4fckT>D{;>wS*@w8QX|4Qd{lk?UIUma;|j8@gOww`AawvNAyV{Kevlt09+_abToA&Cd-$gF!m$vS}3h`RBtQ(`3 zs2XNl$C{Ebv z7o}bUkeON^uh!rwlp~fx{s}sd0pmhQe^6nPTwu|gR>^f+S!HpL^)PvVFf)@J?n{)t zz_cCeJ7%GKu|XKu8zLqqzlbwbn}4lHZHBy(BCyyPRx4Xe3`ly*)Z#Iv*7}5M^M4el zqoVD#D|;L0n;Fg3gRT(Qftw#Jrn(yZK5jHx{Ja@wQDPWgKO=KJ`B5ofi4u4*aADmP zq2u`D^AyxW$%cN*)J)*bY5)KcY16eSiDKsgywW>p%@UWdf?7tXuhKo^0hCJHel96* zgu^vhS&K6FY<;FJ+}L%Ls?_6q=g^g&U1Km^cew_Kce0#-kS=CS0(O&D0THTGIU??p zS>B`Ao@PadB+<=dX~shQbIQ_?9(RW_aj1(?v6wgaD^bQ@^4XI+4ttZDc=YT=Wmq%OP9))VI9u|2W z4faJ!Qulqt%rqZE*kD;2JEl8}sI_>FpVLJu7&-KDSKM}4=YR?aNtS1^$#z-HX}0k&RU4L z`1_4ZSD*rHIq<+F2%~^f1&0}g00648^M8%UHS}9^rtCUx8st9ywD1JwG{U_!?J7`z zSIx)(OG-2-q$eHIT~~u42|Y}{8#3XA;A~v79gI+}258L5IOBM&8A5V%)Vo4<2|{J> zNQC6ft@%o`Jm1}%P86I)vIMvh!)M7r90pM6W{60bf}msrDm#;W-t#`o?L!^FX%7kf zqnl=;;RjN68;U%Mg6mD&3HgPttHwtBM=FhTz8YRr09_EhuM5(Hle-eXP|6E`pQ;taMPj32Cl5=^)S z31s3p07awzC|mkKiWBF*um*T0pB$N#hLKTWhj>cCe96SeKLd?3Lgh^w9h)Ru6`s&T zm9s>0KVr`?Yu0&-wM&}; z&(wUt2+{zzFaT9)3^)J)VFbH_i}i>X710Pd47z?}$25+Ffdb8KkZYx^IXJEGf|#FF zpTVcxc_O)MrYQ{D74aW<#2X)^_0^G<3-z2P$mhYdTdnoj>_JVGYQ|%ORsV!j$)7|8$j!D{vC0uy12AjFo$*@Osbc?8{9g|6 zENx1YN0BZ5$SRr9jvzoN9(X|bt<~WX+MZy-S1u*rxMJRZZJB^Vx5Dk8;Vd5%2&y)(63|5WsE~^JnH~Dva(cH zuZA}oZ@|;iG%c_MloW||=P{+Q@hl*Wa;KokCQ2o1-X)B{EoHWmz=HxqOr=UcK6~`o zPqE4B#2lW0)})6@j6VTAekkElSLW z(b5f21VxAlOAQS_Xz3ZPVQsm^8eK|)ZAAP^&;k?|cgC)x?sDsB6dY zeuVd!F4n{enuXw>`5tqC6qmVdM5F#gmaUM!9@?3AEB@-&Dq!q2IAWdtBYXsYKne3^ z(Uhhubj@)XsLveiGerl(vTPGz#wAO$HsOywm@XDeF^WI#@D+Rdcrk5;jOj!OX#nf~ zxk{?v=?u+k?4)dI@Gt^Q>Fwt?W@z02rYj-!-WL0u4&3Ol0DEnpwFE!sHj_;y0)DfS zuqR(@vW8)zR;3WkAOPH?pnPigb`{JKf8~HqdRnr000HB9fuih>N4ac4_y4hTAQq*; zbf(rv^57*?+f!odZEAK#OeYz(9Pu@nClp7xs$-{od}sbS?25gq#4iAH1{FU>8>prZ z7Ah{=g_4J4i*o?b4n?Va#fJCujC_D_`6UNPAW2;%8v-e+Q+Zw4>A)6mo7$IXynMSV zKklfZL$?iVbSqwqb}?8DfQ&yogflZn)UHPM4II^=c{FA0h(%tyUmil&@&P>u0e9ta z6}KtMx{k6`00G>7%#%I<6HkHSZA)+P+#+Xa)r8*80eM-yeHcT98BvBKSQ2)`e%FR+ zKad4Gt&iqG0$MHEH4Yqlph=9eov!5hU2|$Owq5t@wKeAIA}oh`%sp~?D~A?!R(|s# zytW_d>d%D^v4X~PzqF$+RMVw!a6GHDR4cto=iD%vxw7V^M?71ZKZdmNW`P#Jeh8aB zxeQQ{>*2+?)5+#nAu6O1<3Aid#JD?(n$`zg-q+y=jy1aYlc2Xlc*KanB`YlZVvW#@ zvmwCIr#dscCNGh{6ju|$@lua6_zr_S0V-zq7!-a{qQPAAo`X8B)`!*nAv8n=#uAdX-v1^tY`pBU_J~f?DqePjCUDq z*c21=DNGgj;tD3XWQBqgD<-1`)z4OITIE+_eX~5mNaguds)B>keTVBWCL?3CS8$;& zV8)?;*hsnSZQ;&M1Hx2Z;i{B%)&=vU+t~^x?ChnXA4{`@%Ah|w)^#iQ=yj}#+QHrIu5s~&$K`YBoCHEI zNWKe*K%BfE^1Ul*c3I%QWmN-m(xm@5k7wZk@^t9{s2hj#(hX!8r?HXIo zu?Pn*0J1XBehPL{J;sLOhBgrhG}Oe-rK>35M}eu#&kXU{_dM!@8cX{qTR8{59$CFH z)1ezZi;gQM2amfd)>~-1Emm-&NIW2APKME`FQW; zmy%CG{1CU#K@8=uO*{Ks&k_=Q^nFB8mrsjSW0cs(e_~a1LDqmQndhuQ6}*%OJU))-OPVH(DS;6OF>pZYsZjC@>SiOs?SOw8Uw4%8*aAZATO@r6fr zEk=y;#~ergQnN$sPpn_YWYS5Bd8nW?y|OheS<^v)-DJv?=xOW6B7MYb=B%rlguUiS zzq@#XK(7%Sq!mBh7FR9VNtfV`Ir{&6UB(85^|TB~!*u9#zXmB(pTs`&pObQF{|lW$5-x9vKhpBjiF-VL}wF@;df2G}maJB6}2mwqAyQ zf_*Q|K=~zv08V$)b0}R+MR`^hx&d{$Z-HtFCesZ#4+g5^pBSOX7&|ok-Q7F{m4+@Z zw~tv35Jr6)^0V1+jg-Lsye4X!!68qI!g?Du<`BYq&2ogvKl&@mQ~v~Ny+MqH=-^~Q znwf2n@ldpevnu$(2JV{rIG}f){j1n-*0|haqPYX9(EcKBZJ<~Nf3aapil)?ej{WnC z20twjnH0nwJ{~*+xj`QwIiJDm5(A}KZhWD2Q0pDs`O-!a0tTNCU%JdNJNO|=sDLjv z6rbnUs6<|)H;njUslH#1mb8q5D+;79>-U5vSzguzjUvG;Fj|hFEEzT#*nf|5k(@x_MyP-LX(xKlkMtr6FGH+Jjr_H2-W|Jvj-a6tI z5@6FsRXWT~_`tky00&ujQ~7>GAV>DF>l^cnO-@>@fwqiO)hWHKxQBQA?vZQ1GQ0@A zgLOV`xc_ndi@T@oiVv>)DH_h?I+x;gbw6>%j0?-N`{-bqt~UC8b@-MJJE8PBWa^t? z$C_Mnv?KV)Oi1}b-1$yB56^Sd9j&5VhVG0zkk22Tks~}*g8k!cH68zw#*?ZsY;h>l zELn+WJFhbZBH`Z*o2k%HO~M9lhh#CQ53F=EkeExLb7!;2-^P}{a~5sGSA8>uL#^;2Noa_wj{7u~ihW?Xx2M1C(qG{1EuM7Roa8@_t*xfWn{g zsTxC@=$m)D+3&Wc%IX6*Q3#8Zi=*E2z`+%w-Bqo7zL%DGoh+x=#K>jpp186qvDs^l zI&w0ImyxNQ7PMp4lpc&u)rXgir!H`LDrWduqVDr2;jkCw6VWlV6l2_r6Y5+IsIEhH z)AmkB?S(AIA%7}W72^g!$-B#7*;n!r`bqNvLpYWOi z6`K^4e~`@%jfc{STNVPI5=aZ3Sa}`6U7+6$4aTMm!{~OoG?=3$Ee^pL=f`O ziO&GsDy1M*$C|4xVC{vqg78!)7sdmTu(L7avPh>jt8Rx|={P)?*F?RY$defDi zlz1{Luc%C0_11eX?`2Mo@~j@=IG=xvb3YS%%_VE`$2)|OV{340HUJCojY>igex{9L zfpX4^=a(sXyZ9ef$6uXHrd||pPRx7aAE76A#gsAbqE*ifDjNJX?qcM741TgrkbJ9Z zx?s!8riu})PE5tc0s`v690WnZ7n>8DembmImRvlWt%3DDTq`KnFKU9sgZT8dyk`?)SwoWw-s41kC+bEq%n?GFc^P7mFHWL z1IxR>j$d8-#m}%_RIBbDfFVL`O$7*8>t$<^exT{vz`J`&g1iKwVGwu}<7p>dSjxV{ zHg589NFD3?;uiEaI95hp%BI#~|99_`=M(=vyZ=XDH^tzKNWT1YTG+(DnMGAOo3JNn z9CBT|-h^F1cPCg*>hXKOOBJ*ycVuAPi#(9TM)6!}#I>f`M~{~NE)D5nSiTD$>(;-y z+b1LX$X1+so}f0gZ$75UK4m>pz!+Kf0IX+Zm$EYSY|41OTHT5i5J7(n*7#jFoe=pG zC)B3Q z+OL{%W@5W@oIc8w7*<7Tf+$vJ8d5)qf?#&4=sskMJH+a0u_>#6Js6DPaf^D|Y96>$&LOtVfagJr`e};5PVV z=DY#%??Fm;h(n>xr(!d31>kJE_^;Kkrf|LF?p)?v4(v8_QKqBv_BD^(ve&8-Fb!|Z zK=O|Rn+r>a=JThMoc7-yHmTp3th~LBAAP@xGIt`^YSk}j(9V`3_-8Yyl+okC|K{A% zdvD`;cW;w^a2b!=q+%Q}BM3tD=)4XGDet_OlF@EMdp24o9M!ctP;Gb4oWqZ^8c3Kd z4xXX1*ZawsP(J&@VOV^xgkZ}W(gr+Rg!)YHhRkaJ_!h3$gPQ%0Yr{vjSn2Sge8e9) zyEY)Afbg#_Z=dr(3r$L_jM@Zn1zPsKU9jx9k9qu9o5+TXnE#l=Eq?GH&j1@jt2KM( zP@`Rnik5zfM(L%X3SJUe^Z~rhWY4&_3*_YiZF*C;Ach!%veTZF$e37I3#+pTO7H6l zVDl~(eb;^|2G|HA$UGTKG(cN2PLAB9o8GzRB*H<}QVHtd9$+8{iL6AYaYH@o`2pBy z6`X}99d{0>eqsJ+7GYc1>R|&6o(iq4ucV23D)D3AT}*lwoI38r>7b*OGx^Q$qcCznYghX+&v67G&~c7eHl&JtS6 zis`bQRFqww&3(V=JwXc`OCs85F<7xMqHLmFMIcUM3u^}iAot+j-6Hn|5knyzt5v?r zD}eP3F8Sd2Uj%N%ug}z!M>iv^@E#_Yro$u$Q@}KK1jKFBPFNY;_roo^OqL$T{U`i; z89z{)zcxR&HTanSia9p&sicPc*M@(t@F4&b4GJ((!gZeh+n_k@5)=h+D~&js zc}KRS?l&*;FE1M#EQedBA^4CI;6mI0`(ws^(buyheae*foh-49YK*QpB)WQ1=i6a) zA?ST2)EVH|)I8=x+V{Fvs7mSYJdRzjwcPtpUoAOQdkNF7a~to}lb~4ETiQyY>o^xV zRI(K#ykKm~iMR$zF8H#B@P)3UDhvSRDo<2pwpZ{!x`!?mcWvuZ(i8|j_u9}$AYGLg zyCla0relK^YP+Vs}Fh#5~X~iQ?Nss?}4=VlLWCSPt0@7jmLmER}ow3{8b? zhS{t4ZE(B&lNdld;B;W4zH@P8*D~GoN~42yn`uYhcH9p3QU4|HVqRctrr#RsVh!D~ zk~(6vt_);DpE0UmSRz-KaT43W{$b(~f}H%AfAZA?3RypK((n23`%$+j0{&l6sy$gQ7{3 zMvFAn!SBe-94`UZ6bfqH6R-Ew>xq z&lLDM{MotyaPZRXnmA8b@m(9(EtD?kUN(XtU^Dt1n4a!=VBY0Q|4~u$G}E+%oN$PL z_-DdGfxA*%?NK}05;;JO;xcgiO;2 zS7^8ptq%X`Q}6_q%o~na_i?UAq?p7`j`zej70U}^ug#HWU<|dI1E~02fdn&T%)7dc z+{0;GuYK)7|4PClIJ%tT76%7wjhF4WeGcd8?aY#80e2 zVGOHxfR(|g1Op^(tBJNH>K&e}Q{>^}2X&Q}x$$7u@GK_%2Bu(Z#70F_XYWFYcDPai z@n|t{paZ?ZwAOq2SS)3v;3jX*NY|*QLB*+xR|1p87&j*{AepO0)Z{*fk06|q!lJL5^9xDBQXmD)!henam||v?uNQWZ}LzB8nY81vbPhjZ~l7nTSCa7-_fVR4a=7>k}ss_!B|nN}Dmk z+N!8Ch=zZ*4;MaYK9Ar(Z~xeE8OWY$xsO_xV~>o>tC+h$7B7(^*V)1QH*YZnK0C3! z58&PfyBu|98M^=?;T`Gt$KBVkkdL?pA66BMCODu-#or&8-gb6&t0=clmRrYd^J(kZ5gSyzo5=5?+4N+hXqS*}( zRd+&BZ9wzTJ>Rg1I#;#JcnCoo7SPcA|4TeoXK2mZASJKrzxibFfot}yyKO}DQ z8GmuS%1zZn(M+`DnVo^Y;=dTPB1+45IV8q}y$}#jyPy!Jwk$T@XczEAsS8l9)ARWmAFhl;L2ecnyN;k0tI37i%}W5XmK z$^9aR*0#r^BW###A;TZzEdOJny&fK5DQS!f(L9^mfyOw0b$(K7+g`)*p{0nzG_%V4 zs#-+hMi}=PBv$jS>}t|DZ!=+{6B!eOpA!B5IP7I$iaMh3n0BobKpc`vshhmhvkvRK z;MlAD+ibt^D~hHwWaLFJ&Z@pY$k;x}gPfY0q1cw(qs&#+J%!Jx;OX7%Dg%Mc0~JlD zt=8+z3Tyxy!9oFzHiBw})MP6*?*beUa*8!fDA_aId_#0^ZHnhO4phGACP8>FD3Xw$ zzP7x9ti=;r7?gPBnGP2!2V7{Ver_-PZD!2x7-0bqu`{l8bbN4+T@GX+DSOM2>3D8v z-NR>~k)<5i*5~+LM*rC}DyJ~~oqA7QB^b|@?yx1P-*2YqCp1j{yaoVV`Gnul;L|zs zx59xJP-LJA;hIHBU8e^j3m_Mqn}p0Yhu^OaK6$6snl-z@65eBWxyi#|t>-s(9F}}q zAfK#=FG~GT*>>q0%D1NWal%~FsT;R)!;m54C0hyq0f0SwPy3&&Qh>F|xVkFsG|H!H zYlc=i0wCubh8Cntl=ty;?mwNNncAQk!L9{28ftOA?G-yC6KvF{?|_Bu;b@E#r3yd^ zF@N!S)Ma^*^vE4Kc}AKg&BeR=KXHr1Re(>%m-F}AXZnlVGQ`GPX>eYUz+3IFL?FT3 z`G6LMdK&{^huix;wW6?8wnGnV28U)b)7}z0%JlSqSq(*v^P5T;Q>r13YU<_c%)RhQUvP;|N1pa~wst<_LK-R0l ztYh6~gK@q72cHEomTfb`9hiX3%_?7ILlE&gb2lDi_Df&QSl0UtJ(hGbY$)_@{hLbqkSlqe@T6CYyeaITUg3)o)>kW(m)V60O zP=pl_8OJG^S(DUJH*Q0$TGDqzdKZ_i_{t$yA6xy_B?B?uz!6nRi1etfXqe-*Hq_k2 z&WK=?4`nBD5oXLK4tgU-i9(!E>L<6G0#$}|LAVMR&}T?Wvg3CUQuVs3NC079R4GCg zvPr=Dq~Dp(F#8rJGZqbFIWOYm;w2@*&&gFOJ3GdU28dH+qyfx{F0Sp->n+4TL0JBI z?r01vlpSh=#XfbLs?L0*5)vmy>#5YG$`aLZMs)OuxhwqA=DA|K;p2O>fw(SkPm_+Ew}WVKwnMWR?>6#oydT}@abTf3aHB$)d&zI~MspokI`q6-_1hKZC%#M~o7Q zPCZo!39{}@VtEujW@RM1l$-c&hJnXfPKMpb8Q0*jCI!dXyW#^{DpmHDjlXbba$$oX zA7qeiTy4O=@6-DVOAt*7S_>kdH%IG+BgiPh5wy#*OoGV7=cVtuAwVe@fJPUAYV^kHqunei*5R^G|(N|pQ$z6=v6L( z?b;%8!{N%p;r@tA?;8amA4E=a>sYeHy4O4MNT4Sdv&jp1dwKb({w_27$U zR)6on$#}+`wniTui4mCNj{n*&>s>&$sWme=Pi1y5r{%J+DtA{UmeTh>8vh%$P`g7c zgVb&P2&sdoh8^BNM(;F#&SECqN^V!f<-xeso#!paWCmayK%l!#63IRT_H^hX_Wt-a ziGt{K6f~PrWFIFW;dubQB(epOH}Ed3B)JWN_kW17-?J>I3zR><8g8GG@f*Xd#%X%O zwYuqSLJ~qQn$zho%)aQ?7+w=BG7Y?1AJ&LIiF_umxjmG`^>fsK1J+oHOn`w&V4n$? z=I09Ew9ok9MWufQ#qft6^HRH2mo$?qvdfq)u0Iqy?o;dk<$%AT}!XX$kEh5D?z zEB>b!%iIS(uBP}pdJ@|9n*dl9&<}%UYB@N3T4=O>-OS)6w)@KP!-RqQ>62O|Y1idR zdnMCwmG%#%aVrFcq#u=~tz*My8Xm`$U{=VP3r$FF*!mZT&)6*bW#P-tA2|y&6-bn7 zP%lW9o!8>%=h96s#Zn@9?W#1*m*21e%B1@<$`r%;Rp_HTRO53s@e5RmL@HY2jrS99 zQU{f{J+~$GM<4Pfg^I!azB>>JvkJY77fY!Yf@MdP&e2#yQoPo-xNLX0)Wvr5tKNP> zxcpve&Wt5IKXQkkP_LgLA5$8jLUWzoNJ_k>fCoN%{BO|>D*?A6PEEQ%O+gfC8XTe@ zvW)uIJLExsjO6>vLybIuwaM1Jvqzg@lueswYWi!Sc(itFmao(H2E?9s`Xvm&fAMc` z*EX~8tvmBEg5mv&I$0JFB=^my(I6)scF3?K zr~hVri+sh{ap+LRY_J?oRd5py508p-i0sj77kKHfi(z!(RY>8e*mf1pIl4uVckQYI@(R zmn5%u8}cJR-WX{Y#4&aI5KK|pvzMhhA!`0(1|CeDCd-nCXrXi~j!~JyLi4#9PW^QF zeX@gn!omn-UMiSH_w8f*=M{HFaURv-5|3kAtH*-Q0a|sHR;1(;KAym4PS4GzG+D!} z>cRLHq#;c^8`!mXbxqtSiG%0YADR4KbSWy(K#D|nNVpqdB#Yz^VHxB ztthKx@U2tD#n<3_cBMl}{MQD<6drZJY{%4+h3)aDPS%^-S2%EmfEs&RyC&q71JiLk zWou`mnkw#k(Vk`xb(U(I3V2^8S|JlqqH#2|%kSceswq6N2oYrrNo1s(&7_-$r-YCkZj*f#uk;RvqY?I zxG$6~K~Je44HVt92vyLa;DDOt=jC2|oFaRpb=JQUCtqsil8x8!UQ9j&<*#`sR(sa7 z7(g%~o<-G@`cdDyiO;u{>R{uX4Zc%zkn7kMfG4AYa@4yu_cu~j*e7C@0_aFs#3?_$ z-Jicy7ekJpgP zLkd!amhJj1(B+e@K(xP`31|!q{E6sBgzzK$SK1fn+22}+{A^vXhOMvTdcCt{BP;F> zgKAJSP{t!1H1DN>f&rwXD}X%CMtsL^Vb(i5jP+w0EJ-c^c8ubIXW>3@l|3YQ&?jsT zM_f{8I~#tSz+LeKH*;h%2o?f;NYJRW!wEm(yA8SD;%Dj>Zzl8&xx7J5siOrVpkyh2 zZ^qy}hxKId!EeC$yv@S6!Tn1^-xw93kW2gtb`RbMfc{ID{q{uW4bKH;+!CQ|FB3`4 zQGWIr=j%IoUs0<1hOAV`z0FF=(yts}PR9pE^dzLfJkb1~(!Gk$>w`+NAoW;=!45&uvGpG@yanei1*Vd@Hc828?6Tb%i;h9ma zXeK8`m>Io54t?X3G9~MGsHXEB${fg?$7>MnF3SX8EWEJ+CHQ-Q-DjbP#8qtibd)`8 zbY(ZnG<1^Nsj@UwUNemnJtG%jN$B0uxnEe=eAe*|A#u$%v#8MhV>y;CQHxa5ATXW zBB5=8HL5S#jihrTcm`zA^uPOiIPTfLo8dICc7keCU3VRtAai5iG8PS02we_f3B!+E^<&0f)m%?Hz$zDF42$(^| zyI(QHl_iPE?nRH4k18QilnZ;5kux~=DVa0K-%IH)yvY)(`R$!3+)*JPk(mu=_voeb zvyH{i6g9E6mKdW-$XZpH7j}>Xd7;%CwHO&N==n7;yJ)Xs(KYO#uF_2=GMG#lqSG#1@+Dz!}T*o`-&GXqp@SASgO@a369Pk zZ#s<-*1NiTDTOcv9K(baxa?D*$@jYCZ!W<^{k){rKX+qn~Vi!ry(6 zU3?@teb&$IhFZmC^8130BDZV8Bk`~q+8f~c^M7i_jStaxwgj(!Xb|x~zp^a%#q0db z&)=?#JaXDB6Mae)FVq}d40b+ScPd!_Za7Ou^?q%=TT&Z+5o|kuL&WMq=BiYH3>{v8 z%L6p>ppNmRr_TZ23ZI!%cUj{hWT>4EiU3dmTyOz=_#Yyo?O--mAr7xhs_w>LOw9$~ zd5iuKuRU@6me36XAf~oM2i)Ait587|@{rSs8euyFhX(r42Jr8@Y_sTXAhH&LlkWr2k|B2A!5T2figBSDzQqcKRzF8;^e)sJJ4 z7Z3Dx@N*lw;arI#*TcfN!cq@?tC~9^M0;hMU};4LizaIYVtP^&ec6h>2D8!%7o(O; z5vEt+|I?+%mYtO{9MdulEtgQFK?hp54HX;V$h*=hUFm!LeyI+1C5QT!9<4QW>mC=^ zV4|NH_~P+OMCC=cDNZgC@X81xM}|HaWvQJ>dXCY%^Pn4LgB0eYCicV6aog#uanWgM zNs|i+w)d;-NB>~a{fBWWwxRVK=I1!4s=8RQAEPH>nk*^P4^2hryVY_UsQkfOXEVq% zZA6c=|GXTpTzK{VNpBJ~j|&}%_2(IJuhS%K3s$_wN_yAp8K13O$zf%k)Izprfe3jB z({VL-yEdQ*h>oq55VCI%Q~LNCbiTFRwyulgotqg^NQ|@br}zw}^8|jo&w<~&DWq?X zaGwu)X;O&!yB8tdqEFFEOV35y+Byv6(oBLvzd{*J(pD&`Nn1LQ1qi5F**{(`oO4Gv z?&IvKEXOXzm*Dhu1NK8(M&BY`+gs)PErhl)^1}nhRJsVjh$LVb!i|IbHKr7 zwKh~l)zCYuUWIu%#SKTqowv!4lpz1~D3Sermo=LK<>;VN)vuw@ak_qp1G;OlCBql= zHui+JzohUXDB9jRSZ~^-klc%FGk0qF=dKv}E7rtA={9+i3cuQX1{bm9);Ie5tzrNy z@`L$%nr1}87%UBGCNHXfg}#t*)~FSHlTn&f+_VscP(#4iFtIGs4=(}43+fGM+%-M7 za@lXuV)rth=~aP)bACs-W*hvfbK^yi5vcvC1{B*f;=d1G@i|>D*0(a|HV1B`VK$?1 zmChj1eUaV}zb(SIw!0upUw8m@CE-k`gar~Y03@e88H5A; zebw?Jlj!e!2MTJ@-@P&QHS{pYHti)6mh2TUpQmnF;UUZcpRUesxLr_Qt0&6dqhCU%IQqivK{{BUN(?VEO^aA9Ak@lPm^ z2701<1Y3rW5v?&{tTkKZh9I&Yi%|3syXTa#JywDXMmoJc;jJ5%@)oE%s>oREu#z2- zzV#-ZqOzV@#EH51Qh{T={$D97cd>GTY&W4dTGEOevjaaxc)z4Rbo)k=-rVjw!<_)L zai2@yYxEwk$rSJu5M9JGcY0D{mYKyE!eCM)y|M4d|J;b>D)J#~MOod1apq14E8P1l zH)HVn($fghQ;_^><&oRM{GP_V$)@Sa6Zp5brxUR_Of-;Fb?+n0@eSW0{j3j}9}e?( zda0K$>soK%@=G5^$q?Cr4az9l8lqCBulqrkHAYx<=eE1@rLE9iLKaYVKz8|K%XixM znU-n04iXWmnz+(^*Y2spbEq}JVm5ThU-`u57eYd9bD{8_MQBB{t27CY;Su4$Un z(_jGT37cT=l9A;^v)Y)!SQ7h4I9CuhW`50Bh<*wb74~UlH-9UEL_?=pewYg>@zv8i zav=ry$P#a!Sa5cF83*1dUx0lbMH$5eU#YCS<@=0-6`DH*R-{XrMDCSpUkwZcJeuV< z;n|dOR+(H_Hrnz7Wjm?(_QRanmSLjB0s3}!WqEe1NdZ&8-f=QY-NQeGG+qd71g+t~ z>aA1a(YJ;MaXKP4qlN?hAaB?@NZ2MbG5@!Dx-iKHV4e?1j}1%D-f%?)h|~mob`s(0 z%qo|ZC)-Y^ORopeG3{+mosi=0Vm$EnsK89(#kvTPTKm$;d%>r+9f%~1vj)#aJqf2> zJz5CfvTzR23E2!NeSl*iSvYMwuO7Aw5zw+PiT-vvFcxn-@9E>1)BWZq z!$3m*e{h*Atr!PVDPZCr!hvGP^oq_6nB1aM=n9OE@<*_A*sBMvDHWZM{Ll)wH+Mi%Leeu3Ph9+X$K~K zo;WA-^iGNrcLPj}BV$u)oKC%jbyH-4is(YVtb*yk_6gh|ebaTFkoYrV%mYlGWa{#P z5ntQdnLXX%B+`!4#q^YnSVc1l`4lIfI*(dGiMRXHGE|_6T2J7j+^azS!OCQdH3D!Y^%Lr6U8jM&Y?~dmjtAKUFp=t01L}iq*2>br3qlmfYnczlz!MQ<=W$aT`j z@cIKYF>>h%x=QzbANhCdaAitT&u~gig4NM!n-NVr!--Exe<9U$e5`(w zhlAE4RLG1oO!Xo38Nt2HQd@Cz(bIP#m8s~f@*@-!5drsjVEhp2q zM>J6lkwUR$Tl5jE=Y@_RE1q`SO6iUNn=l>jKx|5cVDr}6<&kfYX! zb%o4*y!3)Mh8s3W8+cL<%oJpPZ$h2w{~FAH0~fXji_jh{lC4e`Cw+&95}yDKN&k9d zD1|_XlYa&A%pKFfTX})XWLn*!-$uj6fF?JBYN|5ql zIOd_Sl}M;htTHgam;S6|QoxZ@pC8wAAq!f|woh5Z5<(brrQ(4Nf>PgIjhDr+rBsb+ z{G#vV4k{=Mad_wQczv&dFDX)`a`>nv@QZU>$v)a>b6em@i;uL|eAuj^F>GB;&q`}X z_u(svS{}@zC)HNatY=u_xw`tXr!0K(QFWkyCqsIFe=qs6Y4?Ib2MQPQLi@=Zx<|@> zpcswqC8={5=+e_uZYD#;=gWtJFCaor!cm-LYK6r4Y@^TT6L*;gAklm>^p7_3{)b6b z1*&U{08AYLNZNveIB%wb*HPoN{*OfJ3jp3%Lm284c`^yHz#Tv!t~Ny|JxA3X35EG{ zNqAxgiedW zR7zr|H;vYY%1Zk54~%lM%SdZk6|Hn5{ydbkAT6mvcdMIPr1)$+!wQuoA6)lKp}vHW z=0D9tPuX{K0NG+gB6Axv3mA0``+vf-cB+5K0WUP+Ib#2o9rbeu%kh>->H=%xxDDkQ zx(??3K1!`lYg>CWNZq#TPh&PM$RCWs`To%IqQG^M@gQI(7@@MGP$f9}vv}}kzC%yx zGJ1qH9Yb$ZKp?x0x6DV%Q^Qy0_+n87#Nhy>cqmg&-UyH`z3BeiEZ#mg`?kjIV3^PO z@mFPYK#nqiGnD;bbqTN8tOH_^;WM)7Lr!Q=dIWqq;%~TbULVo_P=QjnA`O$oOl`Vq zo<1dRiQ;onZREs)3HNtN+O3f;kztuHI&0T6F|YXIOPa}JR@45{g&c~AiaR%s2xnZn zQqq5BqsoiL)*DwNSG?7_2|&81HY&}<4UepTVlVorqNUVEGi)a1$VPRH^07|GO8!Fc!8tUL&Z?k@#a4XE#4jeSqbqEgz&AAjEV=YY`Q8#VkgohOJ*?)I&1pO>q z9Y>2duzG!P)lzTeoh)Trb)YaxC0$|oT2o-P*m7*|;1gK6ldQ|>P1!-A#ie6iwt+=n zlE8(FC%5h6H%YYsO5wBAd7id>y?zE2JI%ja%s~>)>O{Z-ytF8Pl?5cm9{xaSbTrAs z8T4@Ct%sKl1+Z*=xFR)!wOQ0h3}&w;|C?YG!x1TqDQYAqB2V>FQFuQAmnRhhIUej~O ziW3k(H_q&0=PGdcC<{H~{2$B4@uNv>T*Q|Hg)?DDP%HN`_`vLaV9eC107 zdRF|ih1lZ_M=3+v;YDtw|XPZbzlm@YoA1@K6ZjR|G@ z5_!jml10S~xOVJ*Y54&{U~QQDwkw~cz8$_LL~aD8jg|Gg!>9Y*b_0kRbO4!;shTcD z04YG$zyDMI6ZTIcxz)E!ga3>z|1bweGLNVuKMCokW>h{*KUUr0;2Q(G+hvJ>YhdC! zY+!@wJZPlKSSrmH-GFKe?nX?i*cHk3@ZQZzYu+h;r%WMB5_l*P9(@>)EoEK$=$|nr z({JxO7NGbjibHwjsa+NfCh;G0@a+eXROx#)COq3wZrqW)nl8XYBlD98h4qrHi%h4r z6LRPXP%=@hI{9E5(hyWyS>`dzi|$`LS{q1){8Ui!MQ&snmD=H4P|+j)1c!>_^3^}H zl8~~EHCN|_qhO=I%B%=6R&?LqF#bYjaS)TwD>#$-L{>8V_8e;IiYF_s ziV1LsLN9Z|L&XgN?t74RUGQxLY4)Gk0Pt3E-PJ`W@oUqh!kOpUm@#NO{tIg$A_G2! zL!tfu+3LGj4=kqNMyX{JY_D&sXm&jNI(oYM0Bic4LQF-4NE}?HXk+cY zZB~-+FueT4D_tr7ag(KQ~EsX zyz~P-+&fj7N6RK4i|tv0z;J6)oHjLl6QCyP2j#RCH?kXN3#@+I$}5d&DQtDeC~WS| zgSG6%_cEjq0K#Qg0vV@@7KSq>q804!pXv5T%sW~($z$LG>TvByhC=A?iJqbI{TKV( zHv&d0bth`E$JMau3MH4b$3u0EWHg?-;&xDaf$y1>KWfJJgpXgG$qQGtp3!yh#M5;k z6(ksIP2UHw{>h;LAE*D}B}^<#St{zK60iscvhb?ZaOl^xxBj-%Yq3n%Hn>Zs8X|Rvqgc>Z9gubEQ#C!26KIoxV}KmyxK4PkB6Ct(A_W49o=Ac8WeSs zmU<;P#dE!Zdq4(Q%feV5AK@eF3={23_G^};WJCkAbJGqV;yQWkA8k6Km0N8R^(%R0 zaq(Bub_<}0U?l#?rNFITXxVNe?c~wsle&imc{4>-H9VU-_qUJO5RKw7YWJw~^IS@K zYC;06`&FQw9RIPds&M63w`&3I@NbtsrW$Qs(k;3sSaU7BEVv1zIhiAZoZJtfP;A1N zlF1bwnRjF8^P8*J6&jaS52_fi<8anSTN%zIq)?Kis5b;U{FCD9)LGU4B$I`KUdYnN z0A}e8$RzQENE{{u(QWrHE%90B_jLE$6fV7EisQNzk!wNtY?Luafq|2;$TG&~L*l=M z2kSkO52|93l&d=c{ozI5p-PvMvPH$<#!l0o3+L#=w8EzTzOCt1Sal2L=0ChjGKSZ4 zyV^I2xBGJo}zi#B105&Bhf;9mQ8SZrv4e{B%=+Ep$kbs|U8kV7P6h zY!u3jgxc-442*ZmZR7#ex#F-%JG>04w;Ej$|K*_)jdPDQxjvvW{MeL~^WHV^W%DZL z;si>S5+|xEIkU!%-dIpF1eL9=V!4^xy~hoc=L@MyDk#9iWk;NI_T`9G7C!aH$cChs zs#E5x`5aX}ORrEi5As1XV%T*Ds*sr>#Yj+w4UlwZjQ<}o-Yw!ek7Cm?ZZXY$RDE6T z)l3#HlQ&K=eIC$7HH_D&7Wo*^Ukp?vIjxzMYl6Om-Z_a4&=VqQ(@VqpZAqo*wlH~&U+p2=BZ`J= z>6s7-?m2=F^P=Qx;E_|-=H2_`#YGep!`1WIo173&l|u8ZX;b9KnTJu0hgmUNa=l`` zn^{d;)0-zMAc)ml)`R@b`irKX;5<<=_@+c+n!B|C;wY__vUYlox>deX3LI@MyUeo3 zofu(|Y!#SD-8OVE)5+Y9oOg%ty70?nhH@e{wty`Ox%1R`v}$Yk8+EEay~Q`oxua6T z#K*u2%_?)^ePj~R(sit)u7cjpFG_c6<{hx`Qm3}BFboVP%w6V~w-Ds2WPL5ey?b~9 zw$KYtPX$RUHLB|}d(IfBd5Z^=AlTdh&JkAijo{vD(OB?SdJptO)LKk0Kizs0`iK>f z;D{*hxYMlC1)j$bvSAU2@CFS@u{N2%}X~-w{o%(lemJ zqR45liW>iHZv|f$;7;oa5r=hcNUc`o9N9r-2e%1|CfnI0IBwi3>z>w!3Tb23i9GTv z)WHaCKbgi}&cZV1T>-9}Z#+^!TGyQ{IxKQ-S42W2^03Y_dk3FR0dWCo3(`k!2MWVA zVIm0^%D^^w>-&bjXTrc*$I>|ilhww$D~rw*0pJ3@d2)6YleVxsxIe;gf+t(F_R_=xD^V5k53kl;E>ygl;o#AD}Zmo&820Gt8agY_fribPu_N< z%Y(FR+ud=WR>^+X_ToEfhhmRDGjYN6DMs2B=Agjww?+KG4q59G7JiWpA)_BkVzU~ku`gUQm z>Fn-cp||b}Q)Mu4Mw>NiV`owW&8Ja_iU&7rpKz0*m-L*$ngby$>YQ@HyPbM->LLYQ z)@84QlCuaqMH!>|X$&u3*$53LWNnKwTn!qu5-L0J8w)a1`S_1i$x{z!GI3{L0MsZ6 zpD%v3E5v;tyMrWENFj#>1b4@iICbG@Os!IcgdxLf;A{e!#yDBCD@HVDF0-cZA!$S6 zBkgY$A2MC##$e{@PtF*OsNT(``jhm-=s*UTC6rJ% z{he37RN!S_!XRfcQv7B3DIqbW8>XWWKukSXO(^1p$kdk)YN6CsgV)_I^V*RCVf&S! z@AP2KtXWCIU%ku$!A#~w+Ql=42Vtjbt9|r(?xSfa$0L?btoPOG(96&HOGh+oEQu9r z|G#a@Fgjl9G12wf_wxjQemC+mE5p^sCefo<^{91$DBnw6m*BWhb!4{hFQZuR7G>FG zYn#KpY!toN>ni{#btl4DUBrw*WV1Rz+NK!}r9UbJ7uAigWx5e_lc&eW+-VmL<^4Dn zp*eo&LLmUEVA+kmthB0)W~AE8_Pw=3OoHq*m+%)x;FrWCj}sP+og{zEY<^a{zIxXJ zSx8oMhz9WfvZNLUC$pAG6=gH#mLA13efHzB4YdH4qGeJu*H-^7dB~*yn%s@l&U&!x zt-UZIxFUn?Ie_3OLWu}3#*UlHH^Ixq@{ME7~_zZ1Yjf{rAI7N zIUJ2$!2On;JKP0us31ghS;V+v-kOv>G&z}v_`czHUyBHa+OokAK3N$e@zYnxq9+4orDx^Y-34QpQ8W45>Tb zF^TkER9|4;s@zDp?@%gQ?X{VxLt{4bbo93hOV_{b&1fKxkC-rS2J#&JAHl52B=kD5 z2Grd_6QMm{h~O&SiGk|0DP$rn|89rj*5A8nj}FVnf>QN>_ zHb4$0mbf{X@3*#ys_}ZjDvkz@gu0dtVQz@H_BonwqCx(^pfo&t;$D2cfyjcmu1X+3 z60uIpLCZ@x%&W(d;RHG_I@&3ZosP3V+x0)fD=;>NXNiNmj^ezT?4)b#}l-2Nz-jo)Ya&!WbjM=r*Hcb(6dkLiwhoW z_VuDFieZO$qPB4@muLq%YgAbdXZ=NH$46UFph3Wp-s4Pj{Y&rDSzO^Q=m>RVF9D}x zxbT9nMcoDR+98#00kAxBq}&PcS{G$$ZOJ>Vr zONPPzP=@RLY44+NJR__-l9tB{MbBi#cA+4G>!mh9B6U_>vLq@bOEtAc*^cIpi6oX2 zCPR1$q8}?HK~RBly8rJ2lMp{Xm9IzwD9&o4?2yhxFVi4+oO?qk#_JQtsY_aBC@-?U z2u5Pm;+~s6Y>G5<)V%V3J;YCq&EVw?c|M-sO~nu5)i&#b<)PgZ9biQ0!8gen&ntI% z8?Ey9ZWQWL#!E-(WG9wt7zkpYqI}RmUQA?WZF$;3b|OYKKp}hhOvV==yf3krKGpl6 z2tia!|DK3l$vO%dG|qx?GxSB^okOtNR?1aJM~AAzs*;sXxHD6{ra+80kpIWZV`^2_ z?I&)`wp^~P3G0{9d%m9!MfBzgv>JoOmFm>g?_OLoZBdDd&AYRVLN99e6{mnky#Ot` zgf#u041cxQL;zH?YOi~h`Y2a5k>+qwY@b@Ll{H_iJ>(3N#%v{!JFvapK)H|%=3rbL zdIGHs#f`!rO?b+#(XBZ-zbrUL{FZPg93c0qxPxuem@@#lX7K-B0%`>^H8Xa6ZIXbc zjS&+hQtgxr^XAiz>1i*^sp;!sJw^~MJc$h8VV%#!f@rbF6LQJr`vfeowTup2mYKh_ z)Rp96Y>3IAePO%vhRao0vj>WS9LetKX^wp=If?7UAHd#oxW9gLkl@FjU!>e1HKsX) zIG!*=5&-O|$SbMSo!Glb_B< zF3RCN?Zp7B@htLb4?UlG=S_>`y$TV;zFe5)_T^8AA;JWJjwIH$arNI1a1cfOB+RLT zd9AU^U>#^^4%3+3;sGu8^mTj=8TZO$cuId3skBmXkZA<)B76vMmy<^n912<^Gu54d zQR3uY0b%CZqPqh1KO0fhgz9x`VbYphH2O5g(tVyr{U+?D32_sYE525hR-X37hKL#j_j&F(GclDz+>q9|-21qZtyic8fou)N{{p&1AtQ z7C$epQl4j!RtRNJB?!|mfvz$_%YbeSVS6L%F3LRlOdNUS#oSO1I3a7f8Mbc$VEjEQ zMTOIl@Dg#{)Ta;Qdp6jo*Ac6>UbcMI>Jze^NAyF4BQXRXb~_>g>G|fy-G`97>QSiH z9ginN7_-Y-%3AeamzQT-i4x~*s8uv*I~XK=pOR1EGVCK2P0{Y z!qI&i$swQo|3+38D6z@ve(nt!n&@YNd<})|$x@MTXLU73G^>_}9A9CL8yVpsf!4m$ z*^6#RUE}qagd(g1AQE+R)zdWwlncvF&en~7p?N?#^YHR2^Nnb9ywj7uFa#0SCZT(% zC5_>K08$|qc0i?9uvK;i99>}kXw8y&fpsZBh>VAHRQyU4Qj{+R-dt)~T>@!V?&;3E z%B#CARhN}pVEI_4Gc2l~`Vti3DAk9&R^<5o896eE%`&i zw57m2L1*W-U75vzSLO!@iKS(!=G_N%A7pl|-s+hVlK3d^K*-kM=Z0dU)R%j)b**t3 zSJ0S>SkS=3a1uV@?kT>g*kX+>_gyE~^9DFFHz)&2hBhx5TJi`|Qzy=`Rg&JK-?if5 zgo4`qk~Pjxf%W3AA+ph4Yv3-iOA~wz?6U<4Z1<6zO9}RKN=h697))V}3QSYya`434bt^6mHv)nV;_ow!9bgAX49+-N$Z#)tONUD8h_-0H38lucHEd&L7_SA0 zi7j%VUelnmXbc|p1pc^9wDRhT)61KvoXJsN4BUnzS@;Btq`X@Z!%cM(GN&7iCFY%c z#COrAJ%HqF^R|>wqp=S4&AKwRre;ngNtTvS@Y4W6~IX>mbU`3e?~7 zd@wk8q&4Z@MAWx26zUi_-1sijMOq$t$nDcHz%i7FypyhX-HSpW?~? znOzYE=m!Z(W{B5vj;3+4fn|dNV8ii%OLAUv5|XeZr4ims__=cFzvF@F8@Y^KD-qOd zycTQb*@YSRTMD_U!4>7s{t#NH9~0+gjo1(Q{ND@c`;#|dFbA&PUEitmLR$%GgFwha zhs6_qi4%<4E4E{FytY4wgefPdYruA-fX4GgS|p~`menKqT%O!r+Z5}N!1gvlFt&Tp z&UqzR_IthYzwijdxKOgpiOhZu8nU8QYZj(h_HDZu7TPscyHosSpQC**Y9ud{NFKQw z3JY8K6q%?pazanrH=#E`<7Q&1SqjD5%q96x~riTFCRA8NHS&oeN z-zyVTO&Lekz(lFFKVw|1^N4iF{2651I0nIb05~&NJq;fInw;_W1@`?$z;+Sjfvkyt zPmMsT!Ay_UzxJ+@=cDA#Xs}}8H<(%ZjquF=Zc?tm0ggInxPK}Zr?6C?NSNBN>GBxN zl81*qv6C*AR`O9VZpDqJ1Nzewvw6n>i!x>ed(5U7)I3f6>?c~ISl?M%aqv-VlQB&w ze|`z}PtDuh9PFYcwvjuGUt+5|ZE$<9@r8NsVtEId2hLZN0m8UqUqqu4N%U}BX-^H{3-Uln-mehkJxaiDHQ44kG|R%?&uN(Jx&|$qBj%d zI}95~Pr+#QLZ?Ls_9pmd86;Vy`OPLBayi%7!j!(HFI_!oLl4`y7ClLDc(F$n0G;Z6 z&)Ija3;{t%7I;xt`VSQb+&Q9SRdZ?GmbLA}F0EV$LWgayy}SJ_8Kach_=l)MdN<7z zGhtHQ*X=2}S;mD!tmpW}=t3tViSYICAYW??c|1UpUva@9*M}nlpRo~fuZZR}oMwZ1 z}y6@{b?Of0wS0vy@3r%Z~*NOqiCV{5HUT^Il`Bo$75E>51mu77%b zH!wv;L^_Y4i_-3hifL>11+47IxH=fLnNa3*Pi&{E|J#=r-dF-}^nQR4m(zmL-%o-0 z-L9-pn^lgLkdo$d&=@Q8W>9yW1B5P14rBL*8s|wMNVgSGZr`60&R6REX}+5}6X3=!H9U)%%m%iihE)!=EiaFy;iB@Nh3zaen9Odn zwmZoX#c#lr_q7tgU)GVYh>gCaN*nVsGyn+3&BzjzD#ks|AEX)sqRx8rtKZ;w(Z-)y z*jSCXB4+d*#x?ky7QQ8e1wSDrq!4voii#8DNN_W;A~J~SkX-i8i#EJ zU4a_O7vzFYP2*_gmZOEQAo#zua6*%`^>p`%ZcW_OBe^;St?omFcExKyvnV-Zz_tN% zc-;WZ=EJDC1cm;@?nfE~-}iXEGsiD(i!M`{Cx-0h#lC&#tI)iCOWWt7Vg|>MEFOLi zvE%K4QWt#7Ad2IJ&yw+nZmu8;N^B2JJPLhpq9`;H}qoqnFIuy=PMXsele;fdLdgpA=HT&8#9bjOQ-ea0C5Hz z_+akek$RI652iT(A7_UFi8M3V;71)AewmUm5RQ|}TU%F8LJucckA( z_|XjD4#LL zs;$n6nN*U(DB|nts@O{YTrx2#S*uTi70-*k!1ob;FQt{u%mAT4*EzI)mC5;JYm-X- zh|a63ixo~Qno zjHY<0zbz68eX)bFcAA8b@-io(PLyoy?G~zpS!9^8+={i?P&uq0OowNF?9%|;MxDZI zTa1`8qZ#{?4yrG_(TT;2MOOV+3U#CHcQ%o)(n!I9;J&>wftJ=GD%>qht9vh=3i^|C zZUn)53aAHvn;RaRZG2yYBL)&MOW!_T^b<(#rn|!%U5~3dHv6nFkwS9`=^7i?XV<20 ztt&-Ypc&I;O9i8U<%CYcn*f+8U!@h1d;`bq4bJ45U@_86QcRSb0$#9Rx(iBE_)Gsq zL=!_KA6?t-qi`7B)MD^88x<0YQG8}U(iI14Y+V=cjuc6O-}JS$pUeCV+Rl=eG2SRp zSohu$+dktr{j1}3v~W@ zqaU9E5rs25H9S-M$fD69e65-)aVMhKBU_FI6)iQfnE$SzNJBRd%MeuOr-X0apZyAqNdRku+fMeGq4?65Z49>4)UXHS5*yr0YXn-;Fz| zsw#j@HFIVh9}Q}h4?bvvMReuEks_ItTAmIE(7|MGQO?s5)6^t)c(7^-%S-S7XcVFpLX^Zko4uX|K3T8$WY6jjXiplPd2sI%4SA{X;hT0k9^qD{e%adGXtQ z|7<$CHz&`tc1G!!z!)>BPewP=cw=|k(bWj;ALkT`FsAj9cVTJsQapvb;wmWrMF=5miu0nQ!6BS z^m?r8sRMJ^7oAD*Di_=(7|Fq(CHlZk$KXOoRU}7)hfGsUP5hjdQli83AR+iBKj2+% z3oKo_HO~UBduc!q_CDjvbIm4^>?t>P0}EPPZ&$ir;#Fn&Rw2qaRAf&~I{)Y*wyU74 zXcz?!tEC|RMGcQr_uqG@Rs%C+`h$%p2!q6EH6y&XiJtDW6*zQx?!V;%IP~nE)Vr)= z{)0gqFCNf}jZ=!uMZ77ktHH|J|JQ+7bkRPNfxN6HQMOBSEX4Y%Ri0b`(Yxel3iR9# zhdT6eVc8ysO@84p9Gg@jgP4sjUSVZB=j@f*8?io&Q${YzP`_rY>nmanpPm3BxG9)n zvpkj4nz=G05j4>ZNZ3v7iSJqzmTiGMftrQwRdX^zy7j1|S+>gEOlE#4*eL|dg|;K< z)erf0eMK0f*{41bmGV7@%=1D+*A366gy}L z)>zR0+mZVdRz?243N`e!miRmaf4zb%h!{-*Rpu_O8k1lkL)t zLq?l)sDgWT3e<~YA~@=}F<%zo!c*9+-(Ip9B}XUWD~x{v!l=~npNhJ@@@^yzY!#!w z6P)aGm~^70ieozm{;IIT?Vx%s;I;{N@`*G>d2_Hq-^=7a2w79GqXN)#+k3OpZ$a$_ zh&J$ZteK4xD#CfPC|}?P_P)uS&lPiGg2I>{tZG=WD3gh1_2 zu{u4ydLYoycql9f%$X71#P!8}4i@Q`B&{##=)$%H65;x7PF;A6$Y<26HCxtBH@+HF&!=ixW7`oUXDymC` z*%B_@WxoGY=JW6XIkS>c9^B68{@_z*NW?Cm%#+@5P%05^SoAWkm1cFFMF$qfAlpco z>nPmCvr~TrM9gU5igcEx)*!ev6eHfex`kDytF5R&36dmh5x{c)PcIXUFL)$(*bTf3 z)JI3qBg|xu+h3=?evn;45>P8{+v-N`@STg#Lq)gTMSFWZM zk|Bjug&J>z)+QebIm{&OuwUB6m`cWbRTd^C*0BCu71eO8>g^?dlj$(OO1fVdF7Q^8 zyuhfgvB*5!?x^}O0M%u8yaI0V=2_r+P~%-XXOu;=5b16xgap7ZWZ$4 zrxY6eVAKVoAt)=cuxA6l4aw3xPhSIXF(5aViAirBMR_^+>D)pN9fg};xgFXP%2d7< zz=OjwIaDfZBtt=LFUkv5e`)EJeWR-?o}P%N%xZ{%L*7qb~7@Hh(6Ia|J~1KsA~ z#prR%U8o|~e7)Jue5ik=N>QfL(6`w4_q4ZfmUs^3lJA3*;sF7x6{V&(Eno&d)4j_J z@&fCr9?|XY9!YbdE=@L%?2cYHpf2}H-^TwQ56fC;F?Xzg z{5KM5OgQd9i;3;qqeb*Iah4VB1g{}~7tmC{O#P&WN~O{WTeW(#x;c^n@i2*CA3a;p z_O#`7HZ~~E#6kZ-GSGIDyDj92W*?xxOV?}KAT(b@SjRnPrZ!`?*L{eT`Sl(u^G+7$ zkF&LR{g^m|9%=^hs)OR#j^rFpFDRDDSxB@2y?T?)pNj9UL({f%3ZxT}Ur4Gv>e0Z+ zpKLD+oJ{Z9neN1H<@AZ9LeSRY47qcHyN^sr#tzA~1@2mX^iOY2;BjlVThJkpq#u6< zDukdZhbl6xN8moMG334GsdTg=uFLPjL1RoC^u`RbI&xeM+Mxla&?git1z|V-ZO?T) zMdrrKZ@D(}FIyJL4o z0dLoou0l4NvgWn*91)CIzP(P|!1z0J)j}DxMbl5=tUf(aV83lXBl$B{xO!jYzgZcH8U3dGYFJw+c09KF6mspIgo z_oMNLa*-&v0mBZVdlo=fe%|7b+gE#pn&J3LXUJ_+EZ*gftQRiS@n=TJJsOKD6n1o@ z%j$}ucY{5w$f?^C%VMTHic0|GLb)k8W|;KbU90tCVQy7vGoe5Tbjm=(6Upc>Yu0nL zviZE^7udQW$FT=~GQu`v#Sut(0qiKUgy}O_8CpH4*2$y8zjBQ63Ee+bM>P!V5Z#&? zmv15?&7Bw)FqWvK_F{OFH`S&wZ8+71mo|0xs!#Hu+ft`3Ca#fboJXf>I}DF1a_7$1 z&zp({{2)I;Aj5H$DD=jM=8j?-?K_x%j#;SicdE)X(~HOe8-yMl%z$IJ9u;CSe_(i0 z4>tB?{V{dZO-*=vP9G$!==mK1OWv_j1Mf(uX9R|T`>|*dr5K4=xzKeOQWSE3?R~7p zUR-URVHU#3F4M{4g^W)J1?#%Fw#v^#N{S#E4Vc%*t0NlIi?kINcx)_`HzOAApiaEW2D zc7|RXoDoG{)u!300!DX-L2skp_U@$atO(s65Uc@_ihpp0%{ho!wH_Rjq+zd9!44>e zmkC3)pPfFilKDW}IFf-j4)C)(8AJi595fJ51b6qPpXkS8z>xn5j|ZZMQ{qzh(1Oll zKE4!IXC)H|+CNEo3;&+igmn#zCAk2i&L3F}`6suyh0?Xh-Tb+RoFhR4A`XhOg*lW6b3- zox)}4{Mr<%ILaU>p4g2YnO<;BZGcpHv4yUpL0AhBm2OD{OK<^ks$v@69|dRcD=-uv5VUUTMuu<;8GN6wL1K@;Dj1pD}ZxbK~d1}Q#k#5 zt&eHs5O^@~1ksFuC7+9W(%QzOx#_ca&4d3P0YIRi%!*xzBj~{3!YYML>TJN~>X0zGj2mCge!5cxjS|69<4Zz0PTD{^>08cIyw=$Z&w0t{$ z$f?~RMLOl|?2G!PKv~AH7~YxaDy^RYD1_LxG65riHO`BaJx+s^7rro}T^#_2Ao?ik zD=**GG_XM8Vc}_GMpM>-_!rIV8E=ET%Rm@>*XCi?_aS32NWA)NpV2^#xnK;>I>8&; zmOLWI(_z9)N+)N`-$A63qPAy=ztIKSV=2Zc8u-?KmEXo6v4o>D))ulGv#4wZE+nqx zq)hxW&WJ5x!AP0Y>!cU6bV4JK38T#zmFcukE7X$9u%2f-6kg8cBG11oSVVrM-?_HB z?~K|s<-UQl9fEQ6N92RBQ#x3xL!~{ALW>>%!Skwc@oUxJ6xnG7xi-bU9Ykh+JEs33 zR1NiHtEi0erJn}l>i&&|G~VTGera{1idIN%L4vCVYp0pw=A|-yltp?dc-AsVgyInV ziHm;jx>$^78sjKNHsmc2af!8NacyuyH*4u$AQvRyGuVsvG`l#0Pxr5>C6g2mW^mpW zJR;djEg)bdgffV@@|np_V%=`hUc7HbhgM*{x5!>sbq)R4hCfneQ75ce$%m;L^_qJk zDE>D>w~71$PYy47fQrj=Onej48|N9>f=(Yebi))jzbcruOkEG7u7JkZeBZuWHElOm zr2}(SfQ!bZt_G6?@l&WcLzxC%@Ok0b6pUHnk{^I3kSYNs=NRD*g~)da96fCqGQuqb zx@1bR5rThkE}{5~ftK1l79u>=$+A9LbpXjQXlYoHlBMaQJ@>NO-@H1%>j2{u_z|@wCtSEF#p?t+nY7WSlL>`Rpkr~`g_FjM?$hoMIY(CFel&Gwfr{lPg+|NxB8DdY>&Mr zQEl7qO~y-ENlDyimc+k1X&EG+ENVnHu`@@KhIak@4jgMhNyy#dfn#r&n^N38jKk_^ zr3&_>gj^So^&7?vBWC`DkS$;+=_V_%)T^x40a012Zfm+h^AWVD;;}4O<HN1O4^D zi|~sqaA5Exet3COrTiNAS@Yv+r<>*NyzJDDRF68xc8`pV%4_)RNSU}bT=nFzgihuz zvnGY7=joWZ&U^JDZa}YM;;t4gKPy`@KPGh)mZSS$ZBH=sSBH6mLx!>1FDs~+L$zlF zM=6luz8s^N&a2^sjk``}J^xc?*|)7YqHhJp>tdr^9RoJK;k7*crKrp~#klxL89C4x zJl6E=s%GotJA1!&{HMHA2udW+fV4Fb_oLfmK8dkuxpeuHo+NsgTP3!3pjcm^N{rm4 zLS-{$sKKJb`%TJyeC-SA#;C0t9^IaQ-B8%>$Nws{Tx+j0 z23ju?R&!A;1<8-&FRJj_#$lipLI#}qvZ7+VEm(C@i#Jf7Xrf_*3-sef&VaqL*N&~% z4Bnc&v`=$}>=_MCGEtW(Gt&)>(^7Fd-T$6I2Za$&>ZoUjWHQMM+tpL-O*3=HlZdEf_mp{tEsS%?kuTy4}`fCSQKxjCVRoz(rY+>d42 zLtpS0zIqI=rRo_s{VT86x602F7foIQ+{<8-BjdG*Riw3`#e{L-@dL(5=$NLs_5Na_ zt>fVuEvllHs=e7PxVIf;Yn_fgvz|>bb<}35KLYe{&0Z)AQgHfe{gGWo{cKxEYFLhH z05J_W!`ih&G3zAsIdpV2ayowVlZ=p2K2CWo!tm(U)7oZ*Y{eh?YZ=R=THw84i0$9# z>q488Z2S_qK1d>%MAGZD}d;YWV|=q%h}jz_S7DBOCC>`%^f>D9MB9QupoRRb}L z7;I+gDT8f?mTq5+NI-D(^$LWmMX^NlOea{&7e%GzAoH*0n|l=;fgK|tn=5Fuie?mW zR`z*t_$P6@12gt$S`MmhTo zhMcYIsN4{~^yKZx9epS{eu+wZ@##qq$5C5l%gUG5R z?K7r5pCVM?yg@A>A^Bz%RQ8}kRff!=5Yhdjm-8B*rKg4u5Bod)1m@081~M9_CwVG zj)o14_ar}}JulOBKQxtq)sI5@c_gr`3=yT{Ck}MiVYd5v!xK^bdhBzGyFV`7A3*@Q}8|!5!Cg(~XSBPGk_^pNc<-JqH@l%9^rO`xAli{tBExbJTO|C@MFPQ1S!iS>yi}TI4kQsHq?!rY zn0)eWTf{;W0d|0tli@z|w!b8HjRVHD5G89i!5Wz&J9z}Yy{^t2dJMQz{Mc<-Y9C}E z{%pkVoel`HYsV?q49sJ#yUY98{V)1BaiHbO*^)QOe9TSMz2%#%)5_m`D$jSeW2#O= zzY*o+`YC%tMVI!~q|wTY=^nGp755oJks5seUHpJtpyPl*%syx-!Q>hz?M31&;5km&#mR zUcc#jGJNSxQySn7h-wrOZSD@HqIo$>Iil`=jMRiIpb1CGcNVU$!}FDtdD^#HNW2@q zROAfaupd)T&k&*<#bS*^x|-cRU<^UJcFidVGawd4?;$rP4fKS%y1)eFUTn^Dc;akh z!YS2|m!p54K;h(~dK=0QzFEGmsY*hUSH}=uuTTaq9Nr18)U&I-5h$4+trbTOp9N4w z(DO-@;r8_R;NFqOog9WjoWuYREH;UL>GyIE_N)Vg7JFs0D4~z}y)$Y~ts=9L5%aEZ z6Z_UIkSR&uza|YW%X+?le7$+gYFN#zV&5thLBNz7mj`lSA%E>vfD+0k_OA>fwcGIK zT%^!ZPPS2{9ky~bRkU~c6P4b@wov{1!$S&79T<&wtM5` z4CGzE69L)D@)I}^EsGB$@oXaE;6 zm&_tM=mA>r5(fX7HWGx6e=lXlYgd zG^eWFl^F%zfR%8YgaW??HW_oxj2WNSAMdeRM`*wWk9?nyuOVHhQqi#VM~0}_y6Hiu zH^%~Obh8QrXa$)SdF_CML$Ahnk#cSL<4zRb(MaSo*UF=`s6G_As(tZnZ|*VKT?94K z5ki>)ziGx=@3*3u4}Kyg07|?8#EQnT`#z^d5w(#^74S?+SHPEt$;6p174u4Bv!6)x z%vl7_eN(H(B=I6{!o-PWpd0eRQpwm5I>y1<+-Xob3v~30{qP0%IZh`Kc`A_O#g~|u zlCjS1s1?Ig4)@^~{rtEX5yA=k-l?wvI3lQ=0FVXLdrknLZg_UmZRb?rF6gu|NX`bA z17RVbmmFlZKLHL6FCh#%*J*5brp^M}da_&5nhaa-m~UnHFQp5p-7@hmVS<(syTGwV zAJZIs4%CK!4d#LIUUgdSOmc1=eT^7r&}K&m%hpsaRd504vw-$>HC?eX^O7~>4ulQW`GDLfvYX6!*zzWx zF#2iujq)1-{;6eVQ-Gp)a-!t3*#25Bvwn4I_GH|BE)~w>&t*&+`-KZ)iQ|u9wfaU+#*ewGMoEne;PLuOQOh8kjtx^|_*!a%bBUXD z)$xT6n9z;+=B>AH;p3P%*k(}S^4}-86)30J_N^KDzk-Q@>{dZ0WT=@Cftz;_)OjB% z%648SH$7~2z@vX&gaPp@gZZ0DFzXKncftu%9@q!pf##?a@a9sYC}@Py=!X+M4yKoKB@ zLReL$x<92yDrbztGxSc3(wu04G$X&X-j4RJ>cTVCa6duCA?l~B4hPW43b_vzTon%z zfPeepO5O|dA%4e;71-8lCATJ5sM%{eRx=aiQm&7G2)t85w76)0Y&dt>TGDB^&-B0j zDX15dZNg=OWE4?1$PT6P(}?%m%A_{@;o2Kj{$;Pvp$s<8vwTbPK0nPT+?Ce9`b^Bz zNAs3?-1U=i+9!gxm*vDh8>FdaCk$Mcz_=vD;$wNVH<`EBqNqH$+KJU)Sg7A3QbVr5 zR6m->ah(a%2K0v!BN0Zc(5oXod|=-2pMk)fTSkmO8 zvfcRvLYqP7fDml}2VB_1X1;~L$9v8GEdKS173|9bVv2TfDY;57R3R`*KeJOgCy#d+ zFxSUsJCkiJfH-l*UlFmT(`=e z)G)TcB&%qs7g4AlvX3aA4s5iR-|jL&Q=HpX1v(SE*LJL1qVA_#u@`pf4>*6@R}5=c z(B%Yo!^dMA7x-&fw+XgfnmSbzRY4_%0@GW8FUoj$`HKEy8t4#Tb>>SHRc}GHVE7da zI@0T|X$JJ8Jg0zY@v787-6DwT(izXsyPQmfgNHmp5IO_}7BM=R)e8p3W9EIUI583E z9_n^%d1u2Rv2L?>M-7!%=M^6m&Ug?F2$k!UOG_sy4`67lBlvmJ3L+?5-5Vv{&2*}; zh)*%LN@=n+AA@U0gMuU^F8z521$7Oi;OmmtG5U@i7J;`D7z~=r6+Fx2W5rMdzvNQ; zJ{l18iBkl4M%ItU`|OQBVyZFOV+dQ`3l9+&Wk&cWGQ2k3J3j*v<}pgb>G!rGChg_386V(qf;&?)vp1> zEj!Xc${b>I^WX>99QE2Z1AOj7+IR$6Z@h~7rcdY1_E|+-NE}J#3)v+>{0&@$VR=|t zMgty|M|=_3uKQ5i@0h;)RwtGC;&Br585x;?W5ccy%1CbSO8W}1*{gY0>L-W8@6hou zTBFf5czdzvr0Wx^C6qZ-!?i9DhlfIj_{7`=EV_d49Ec@NG(^O$X)S{}fil|6s<5pAU~SCqZ!yFHK+ifm`1y6@Nu`Ht*B-8DPU~XxYQq%I^cl zq|v%6CU~&l6Fj1%QKV6fDg?dbmM=jc;2XNjfBqVz$aM}9P%UtOJe{cQ25Y%SI>k7; z!GoBRzUwMD1pv5-mwSN5|Cj`TbE(hlG!u__+G^La(AW}zB9YaZZQd`{f=u1FXk6k9 zOe8)I@5?~A3#O;=*OlcIdy%O4eJPc`UX;3T#}W?o=qpf5I(T6c1U6^EtIg68f%t3` zH1Pe$S?*bx`NEt%dw1~P!^)_gCS>Taoi$8&5J_R%h8)`8el!d zmoufW+arj+L6rs=BA4Bb7PlI(70R1m5Agd%%q5_pZ>cPMpJ50IwE9*f7l z5Eq?Ig0rpdW;L?+M(c;Acf4UH@x(S`mlI2#0>aFuqbX9|vOx;B1t^CdNL6Qd4Ie*Q^3{OE)9r&kgUS+r?ue<$eSH@2(Tv zxi}bX`0S9J)Fw?m5pKy8yV_gUmQE;73Rqu_3%r%+GV#lJGMILOrS<|zzZggDM|nP{ zgyA-pn)=@eYRN{M+ELO(^u`FQuN-m$+DmLZ1!A@;gle_Dz9WV{Pu4GZ`4erfXkOcl z5NKhQqw^!`jO7YxXruDT0%)oNkb{;cQjbdA&LC_l*Ss^pRM}S z`UdxO>Ici^*%|~p5$?@9sdu{{&`>GKdUt^ zu_!6%f)=ttU6had+<7VMKloc|^R`bsgM4m0)&4mfT0^m}>Q}5CTceUad@ptbd+hPC z-%7nqqoBMUNPQd{LPGJnW-dC;BocX0^zUtB$Wnon6xiF%(l##AVgg*NRs%(gG17VuD6$pm#vb~1LuV~_w_zhJ%i_FjXcBulvZpcZEZm1vVG?23YJ<2J zkz2ba0Lh*UNXO;uGh?gC_a;?>4PO7usEjHgUcbgf=vPT9&T<|GDzfA6{0(|}Ca9el zyK9REdHt0Y3H^#=evckiOoQNq7yCoi#+ez;3>6b5-};snR0mKYKPaPlT}4#(ezNsj zn%dfNDKuWwl{1H=C1&NI>IQjR=~gl^!C5=85*{b8dt&KTl7(t7O4P|DlP0V&j(cPo z3eYg6S{4l6si+eKB78%#!t#PX$_Rqn#2Ps+;*fhVglUot`1iK~SQQ?f-MVc*0;A9< z0V2I=_=e|{n67l7wumbYkCMH;*_&xExlFD*K-$5<6{~!+OQ4nHx)} zy~&MK85~2#*2;I3l$O|@9YlJ#)a7}fmHXh*%fJ}5y`7_BAWt8%RCQ>&#o!0(fF ztP31DppJpCXN9%&&&RtkE5{wLcH4BveoN6{W7qjamuZSz^Oa|1m(zDvj)5rCRh)!Ty_syR7nn|)9BMf|{5xF1*ctp5j zOG@2(88FY7YN)8XY}(%)@b1@XQ?MB#l&9Jqw(^yL9~>Cm1Jy?=EojUCy z|FWh?p_Aw4gp=p*`@2L6B9A2uWe&fj!u38C@M(Gu?0GC1<}CE=+Z^=-4F?pp;Kd-{ zlS3a|APho_HLZ*B=pIaKz;S1C^^x;+V_vev$8%XEtrsxxgiX}mHJU2i2%K*r+nV?# zbDyQ9a+`jUDo0mQh0NFRKz9TSH#Qj(6<3#grk;Z-enPU)997`sEh4dFVgi`Zl0_v$ z4fzN!yETQ2_h7VNwda=jU6Gwc2idJ-A~b=N`X{mGS+~*Q{E62cb}COsJn~D}E`uHp zVlU~%R!5(Z*_j*DkaO(8&VwuXts$p}gaJ8hPE30bFyYG?h1RoqquoAjm`WDN0z?}j ze6H>@Q`H5LFnO~Is{3i)VAi}P@~?8lk5h|;0&XfQsd*`D1csK>$<(mx=%B4b9%uM4 zAms#UjQHtstHRsDlpmKNTO^Bo1ZR3)4S)t!w{|l}_60OJUkXCiZ_qLT$x!3-tJl0S zP;xol;O9FLU~JkosI4okX;4mnBdakK136w