From 01e0a609d253665eb205e11d7aed16d9925c2b25 Mon Sep 17 00:00:00 2001 From: pacnpal <183241239+pacnpal@users.noreply.github.com> Date: Mon, 4 Nov 2024 05:25:53 +0000 Subject: [PATCH] feat: Implement ride management views and utility functions - Added functions for checking user privileges, handling photo uploads, preparing form data, and managing form errors. - Created views for listing, creating, updating, and displaying rides, including category-specific views. - Integrated submission handling for ride changes and improved user feedback through messages. - Enhanced data handling with appropriate context and queryset management for better performance and usability. --- analytics/__init__.py | 1 + analytics/admin.py | 3 + analytics/apps.py | 5 + .../management/commands/update_trending.py | 34 + analytics/middleware.py | 39 ++ analytics/migrations/0001_initial.py | 53 ++ analytics/migrations/__init__.py | 0 analytics/models.py | 57 ++ analytics/tests.py | 3 + analytics/views.py | 3 + db.sqlite3 | 0 media/__pycache__/models.cpython-312.pyc | Bin 4681 -> 5100 bytes media/models.py | 37 +- .../big-thunder-mountain-railroad_2.png | Bin 0 -> 124464 bytes parks/__pycache__/models.cpython-312.pyc | Bin 10438 -> 10438 bytes rides/__pycache__/models.cpython-312.pyc | Bin 7906 -> 8781 bytes rides/__pycache__/views.cpython-312.pyc | Bin 21313 -> 24906 bytes rides/models.py | 40 +- rides/views.py | 590 +++++++++++------- static/css/tailwind.css | 533 ++++------------ static/js/photo-gallery.js | 91 +++ templates/home.html | 171 +++-- templates/media/partials/photo_display.html | 93 --- templates/parks/park_detail.html | 85 +-- templates/rides/ride_detail.html | 100 +-- .../__pycache__/settings.cpython-312.pyc | Bin 5657 -> 5767 bytes thrillwiki/__pycache__/views.cpython-312.pyc | Bin 4750 -> 6606 bytes thrillwiki/settings.py | 8 +- thrillwiki/views.py | 66 +- 29 files changed, 1087 insertions(+), 925 deletions(-) create mode 100644 analytics/__init__.py create mode 100644 analytics/admin.py create mode 100644 analytics/apps.py create mode 100644 analytics/management/commands/update_trending.py create mode 100644 analytics/middleware.py create mode 100644 analytics/migrations/0001_initial.py create mode 100644 analytics/migrations/__init__.py create mode 100644 analytics/models.py create mode 100644 analytics/tests.py create mode 100644 analytics/views.py create mode 100644 db.sqlite3 create mode 100644 media/park/walt-disney-world-magic-kingdom/big-thunder-mountain-railroad/big-thunder-mountain-railroad_2.png create mode 100644 static/js/photo-gallery.js diff --git a/analytics/__init__.py b/analytics/__init__.py new file mode 100644 index 00000000..df337401 --- /dev/null +++ b/analytics/__init__.py @@ -0,0 +1 @@ +default_app_config = 'analytics.apps.AnalyticsConfig' diff --git a/analytics/admin.py b/analytics/admin.py new file mode 100644 index 00000000..8c38f3f3 --- /dev/null +++ b/analytics/admin.py @@ -0,0 +1,3 @@ +from django.contrib import admin + +# Register your models here. diff --git a/analytics/apps.py b/analytics/apps.py new file mode 100644 index 00000000..50f32eb2 --- /dev/null +++ b/analytics/apps.py @@ -0,0 +1,5 @@ +from django.apps import AppConfig + +class AnalyticsConfig(AppConfig): + default_auto_field = 'django.db.models.BigAutoField' + name = 'analytics' diff --git a/analytics/management/commands/update_trending.py b/analytics/management/commands/update_trending.py new file mode 100644 index 00000000..522bdb24 --- /dev/null +++ b/analytics/management/commands/update_trending.py @@ -0,0 +1,34 @@ +from django.core.management.base import BaseCommand +from django.core.cache import cache +from parks.models import Park +from rides.models import Ride +from analytics.models import PageView + +class Command(BaseCommand): + help = 'Updates trending parks and rides cache based on views in the last 24 hours' + + def handle(self, *args, **kwargs): + """ + Updates the trending parks and rides in the cache. + + This command is designed to be run every hour via cron to keep the trending + items up to date. It looks at page views from the last 24 hours and caches + the top 10 most viewed parks and rides. + + The cached data is used by the home page to display trending items without + having to query the database on every request. + """ + # Get top 10 trending parks and rides from the last 24 hours + trending_parks = PageView.get_trending_items(Park, hours=24, limit=10) + trending_rides = PageView.get_trending_items(Ride, hours=24, limit=10) + + # Cache the results for 1 hour + cache.set('trending_parks', trending_parks, 3600) # 3600 seconds = 1 hour + cache.set('trending_rides', trending_rides, 3600) + + self.stdout.write( + self.style.SUCCESS( + 'Successfully updated trending parks and rides. ' + 'Cached 10 items each for parks and rides based on views in the last 24 hours.' + ) + ) diff --git a/analytics/middleware.py b/analytics/middleware.py new file mode 100644 index 00000000..bfaca3eb --- /dev/null +++ b/analytics/middleware.py @@ -0,0 +1,39 @@ +from django.utils.deprecation import MiddlewareMixin +from django.contrib.contenttypes.models import ContentType +from django.views.generic.detail import DetailView +from .models import PageView + +class PageViewMiddleware(MiddlewareMixin): + def process_view(self, request, view_func, view_args, view_kwargs): + # Only track GET requests + if request.method != 'GET': + return None + + # Get view class if it exists + view_class = getattr(view_func, 'view_class', None) + if not view_class or not issubclass(view_class, DetailView): + return None + + # Get the object if it's a detail view + try: + view_instance = view_class() + view_instance.request = request + view_instance.args = view_args + view_instance.kwargs = view_kwargs + obj = view_instance.get_object() + except (AttributeError, Exception): + return None + + # Record the page view + try: + PageView.objects.create( + content_type=ContentType.objects.get_for_model(obj.__class__), + object_id=obj.pk, + ip_address=request.META.get('REMOTE_ADDR', ''), + user_agent=request.META.get('HTTP_USER_AGENT', '')[:512] + ) + except Exception: + # Fail silently to not interrupt the request + pass + + return None diff --git a/analytics/migrations/0001_initial.py b/analytics/migrations/0001_initial.py new file mode 100644 index 00000000..89a5f5b6 --- /dev/null +++ b/analytics/migrations/0001_initial.py @@ -0,0 +1,53 @@ +# Generated by Django 5.1.2 on 2024-11-04 00:46 + +import django.db.models.deletion +from django.db import migrations, models + + +class Migration(migrations.Migration): + + initial = True + + dependencies = [ + ("contenttypes", "0002_remove_content_type_name"), + ] + + operations = [ + migrations.CreateModel( + name="PageView", + fields=[ + ( + "id", + models.BigAutoField( + auto_created=True, + primary_key=True, + serialize=False, + verbose_name="ID", + ), + ), + ("object_id", models.PositiveIntegerField()), + ("timestamp", models.DateTimeField(auto_now_add=True, db_index=True)), + ("ip_address", models.GenericIPAddressField()), + ("user_agent", models.CharField(blank=True, max_length=512)), + ( + "content_type", + models.ForeignKey( + on_delete=django.db.models.deletion.CASCADE, + related_name="page_views", + to="contenttypes.contenttype", + ), + ), + ], + options={ + "indexes": [ + models.Index( + fields=["timestamp"], name="analytics_p_timesta_835321_idx" + ), + models.Index( + fields=["content_type", "object_id"], + name="analytics_p_content_73920a_idx", + ), + ], + }, + ), + ] diff --git a/analytics/migrations/__init__.py b/analytics/migrations/__init__.py new file mode 100644 index 00000000..e69de29b diff --git a/analytics/models.py b/analytics/models.py new file mode 100644 index 00000000..2c097ef8 --- /dev/null +++ b/analytics/models.py @@ -0,0 +1,57 @@ +from django.db import models +from django.contrib.contenttypes.fields import GenericForeignKey +from django.contrib.contenttypes.models import ContentType +from django.utils import timezone +from django.db.models import Count +from django.conf import settings + +class PageView(models.Model): + content_type = models.ForeignKey(ContentType, on_delete=models.CASCADE, related_name='page_views') + object_id = models.PositiveIntegerField() + content_object = GenericForeignKey('content_type', 'object_id') + + timestamp = models.DateTimeField(auto_now_add=True, db_index=True) + ip_address = models.GenericIPAddressField() + user_agent = models.CharField(max_length=512, blank=True) + + class Meta: + indexes = [ + models.Index(fields=['timestamp']), + models.Index(fields=['content_type', 'object_id']), + ] + + @classmethod + def get_trending_items(cls, model_class, hours=24, limit=10): + """Get trending items of a specific model class based on views in last X hours. + + Args: + model_class: The model class to get trending items for (e.g., Park, Ride) + hours (int): Number of hours to look back for views (default: 24) + limit (int): Maximum number of items to return (default: 10) + + Returns: + QuerySet: The trending items ordered by view count + """ + content_type = ContentType.objects.get_for_model(model_class) + cutoff = timezone.now() - timezone.timedelta(hours=hours) + + # Query through the ContentType relationship + item_ids = cls.objects.filter( + content_type=content_type, + timestamp__gte=cutoff + ).values('object_id').annotate( + view_count=Count('id') + ).filter( + view_count__gt=0 + ).order_by('-view_count').values_list('object_id', flat=True)[:limit] + + # Get the actual items in the correct order + if item_ids: + # Convert the list to a string of comma-separated values + id_list = list(item_ids) + # Use Case/When to preserve the ordering + from django.db.models import Case, When + preserved = Case(*[When(pk=pk, then=pos) for pos, pk in enumerate(id_list)]) + return model_class.objects.filter(pk__in=id_list).order_by(preserved) + + return model_class.objects.none() diff --git a/analytics/tests.py b/analytics/tests.py new file mode 100644 index 00000000..7ce503c2 --- /dev/null +++ b/analytics/tests.py @@ -0,0 +1,3 @@ +from django.test import TestCase + +# Create your tests here. diff --git a/analytics/views.py b/analytics/views.py new file mode 100644 index 00000000..91ea44a2 --- /dev/null +++ b/analytics/views.py @@ -0,0 +1,3 @@ +from django.shortcuts import render + +# Create your views here. diff --git a/db.sqlite3 b/db.sqlite3 new file mode 100644 index 00000000..e69de29b diff --git a/media/__pycache__/models.cpython-312.pyc b/media/__pycache__/models.cpython-312.pyc index 9fe60ce24b349bcfd47fd4ff90f15bbd57493e49..f9ed7f9a2495c45bd5bbecc764fa7cbc28d86587 100644 GIT binary patch delta 2426 zcmZuzU2G#)6}~f`KaaIjE_1YwgH#NaGqb6L*j zv%DS125ccKaJbG}qAg`5Uk+HZtz;En7ObGHW>sGnt&pu{HD8vjupP-pxTkQlY(=wC zLotF@mmSN-dG5i$D;k`cWpWczvYRbq7A zBSs80Hhw%bF|Z=1y8ns~NC{rxT6x7&UaY#sN?Er&@s%qQ89bSUfP2zI6h{JuXRVNQSa)Yn) z?6Xi0Uy@jr>shPwC8e!>oHm5I&I+NrhM`Fq6Ew zI+CfBU9;>aD~lyF?hw<9 z3CN_*Kw z;mj!vmnWb}ik?q}CE>NO(JE0#c(%zK}>b_HJTJ z+119H*Z1Q6t@!Dk_~};s+)n&lb74=7w$u|l>WOCNQ(0|(>yt?T_Q0jx$n>@{4O_bh zw&Gib2gYvfT=V%oIkqhi>?Qg)Z*SaQR{`!D-n2LDR`29a@8n)$u$4Hw6HJ`l>+ai3 zZ=@L$=j2D~^oLJ3GwgG5OnP^AYy9msHYmN!tNbsk(qFhK^F)C+x}iWvjkuXKdfo97{dEM^-Q0{_bS_KD-D@oHV85-gi z*i7h|G;a0;oi0JR?%YLwGyk}-0mHaQ;XC{ltp1Q=SGa!Od5QfZ)EAz0MF9K(MGn;> zG@wiY>K*=nwGNrd*8`;xbh9+u;o}kdP4{sLm%99l!U|2W2U=XHlTt5xPa9=A-xDBE za4l^F3Jy9UQ^Jwx=+Vhx!7U^%JgP=l_NXC#nIZ8H{^H$9;>F62& zo>Z$Ex@&r(Q>&U3ysp1trbN1cn{Fa`5w)~@jZ&z`93J2WbGf{wJ5Da=phJ@|ntr6| zt1w+v{i2&fOSswj0LXuuy$;>wH_^dYdlA5242qddF}=M2 z#Dw0!DgG4r-tod6=jBby%H<%+-vG$Z^Q&zi`jJC2g+M>Y#=HK$c%X4&j@ybK666O` zL_D)Ken5b|ANSdZJ^#kpKao&$ke>mmK~Hj5s>SkB`vw967_)YJ3>qc9yi}Po7OBjp zV-uVLbZpJ87^da4Um5GD)ZC)wOu6Q=OYz@`7wW9%E9C;k-bcrgJdMP6wT2zpnd;c` zd#QHZRy&Es8+aBi;Wj@^@bEQ4pToKTiZn=`G6QC6mU)HNV2ai5yaMDPz;WE4$@yJ! zexD5QldJpW@;*7ePm+Hk!F@8ePeyE4%o_0V${B^)*9|aC^_Qfoh=FY6o Qy|eJv!oLWJ^diRUzfGe={Qv*} delta 2070 zcmZuyO>7%Q6rS<^um2J|&VO-IrEP3lCxFNygf^{Hmy}d3v=@9}yYa4#w`)6^-IOG( zl^_+AR)Q1_QY%%JQVCS5Mgj@M6(lZH9Ej<`VGn@d1fo*aA3);5%-W_>+L89n_ujmD zGyA>wcK_USYiRkqU{D5RyuNR!@J;}L->A|WToc^CNWdka0S%g<1hWuQ>@$5OCd+u3 zG1(HAQ@RKdGo4u1wa*`$vsYk}_l1_9eg)#m_%-EIY-%Gg57 z>M$B~7z~3Q$<{el*7oS3E(W1z`!K@z?O+Ul7>Mp9@!Pg91F+${*}RPr#XpI?d#jwo zY0MJwtnzk8YlG3*LXT#nhs2Jy!<(>S)0iFtj6NFXU{!Dg%crqqX0HH^bNDO35w3u% zY*lo88h>UO05om)x57Pkd3>Dd@-^OeXhUe7QI#~&k)FgnUKcxt$VrlSp5%z+EdC@Q z?)3bI&YlDb8MEvJKF#jjBa*Y1*px9>aG~O|sHo{TpzAAYOWd4_&WyNlBoRSD{3+YF zM=0pFYTF1!$R?LN@kYh2xI$&t&~vus^7*1^>j;JLLw5IGnh=*E8(fygK{PE1*%gar z%T~)d-4%(uURFyw34VafNHi@L-G$dUWj09wRje4{bp_nzK}UZ*I$Vnm*Q2RgG_^9b zB}eM=U`-xeNk8C0q~~(~&4RqT6zuk<`wnd^E?X>Y=gveq1RWJy1e)^a|0IWUqTtbUQuY`k07+ zR=_Xe=$doES!e45qdyFcZtX~XGE`5F*OKG)GloYo7X%%B(*X)2CTLHTimP4;rSX(|dy?o>tBFhZNHPa7l51s|K@|-?z@19Mqg2{M8uUeLoF97DQy-p_*!Hb zvP2FpmnxcWT8%5VH(loKqG_cl35Yh6>u=g~m2w`@UlHn~Vw4JrIt1v4(@HgC(N^(z zb-80SdZW4yQR|~d7bl4KycyH?BZI8aSF@fa;w}Rr#8;!;z4zFDIPzd31$VDz)@IJn KJOl)K5&i>Kh0k;V diff --git a/media/models.py b/media/models.py index 11ccb1f8..129e008e 100644 --- a/media/models.py +++ b/media/models.py @@ -1,3 +1,4 @@ +from typing import Any, Optional, Union, cast from django.db import models from django.contrib.contenttypes.fields import GenericForeignKey from django.contrib.contenttypes.models import ContentType @@ -6,32 +7,37 @@ from django.conf import settings import os from .storage import MediaStorage from rides.models import Ride +from django.utils import timezone -def photo_upload_path(instance, filename): +def photo_upload_path(instance: models.Model, filename: str) -> str: """Generate upload path for photos using normalized filenames""" # Get the content type and object - content_type = instance.content_type.model - obj = instance.content_object + photo = cast(Photo, instance) + content_type = photo.content_type.model + obj = photo.content_object + + if obj is None: + raise ValueError("Content object cannot be None") # Get object identifier (slug or id) - identifier = getattr(obj, 'slug', obj.id) + identifier = getattr(obj, 'slug', None) + if identifier is None: + identifier = obj.pk # Use pk instead of id as it's guaranteed to exist # Get the next available number for this object existing_photos = Photo.objects.filter( - content_type=instance.content_type, - object_id=instance.object_id + content_type=photo.content_type, + object_id=photo.object_id ).count() next_number = existing_photos + 1 # Create normalized filename - ext = os.path.splitext(filename)[1].lower() - if not ext: - ext = '.jpg' # Default to .jpg if no extension + ext = os.path.splitext(filename)[1].lower() or '.jpg' # Default to .jpg if no extension new_filename = f"{identifier}_{next_number}{ext}" # If it's a ride photo, store it under the park's directory if content_type == 'ride': - ride = Ride.objects.get(id=obj.id) + ride = cast(Ride, obj) return f"park/{ride.park.slug}/{identifier}/{new_filename}" # For park photos, store directly in park directory @@ -40,7 +46,7 @@ def photo_upload_path(instance, filename): class Photo(models.Model): """Generic photo model that can be attached to any model""" image = models.ImageField( - upload_to=photo_upload_path, + upload_to=photo_upload_path, # type: ignore[arg-type] max_length=255, storage=MediaStorage() ) @@ -67,13 +73,14 @@ class Photo(models.Model): models.Index(fields=['content_type', 'object_id']), ] - def __str__(self): + def __str__(self) -> str: return f"{self.content_type} - {self.content_object} - {self.caption or 'No caption'}" - def save(self, *args, **kwargs): + def save(self, *args: Any, **kwargs: Any) -> None: # Set default caption if not provided if not self.caption and self.uploaded_by: - self.caption = f"Uploaded by {self.uploaded_by.username} on {self.created_at.strftime('%B %d, %Y at %I:%M %p')}" + current_time = timezone.now() + self.caption = f"Uploaded by {self.uploaded_by.username} on {current_time.strftime('%B %d, %Y at %I:%M %p')}" # If this is marked as primary, unmark other primary photos if self.is_primary: @@ -81,6 +88,6 @@ class Photo(models.Model): content_type=self.content_type, object_id=self.object_id, is_primary=True - ).exclude(id=self.id).update(is_primary=False) + ).exclude(pk=self.pk).update(is_primary=False) # Use pk instead of id super().save(*args, **kwargs) diff --git a/media/park/walt-disney-world-magic-kingdom/big-thunder-mountain-railroad/big-thunder-mountain-railroad_2.png b/media/park/walt-disney-world-magic-kingdom/big-thunder-mountain-railroad/big-thunder-mountain-railroad_2.png new file mode 100644 index 0000000000000000000000000000000000000000..fbcebfae5b82d58f728eb81506bb4609a9e43756 GIT binary patch literal 124464 zcmY(pWmFwO(=Cj<>%raK-6e2vKUjc+ySux)ySuvt2=49{f)g}&&~Wp-a_{%etTny6 zYWJ?L{xfS;b+oGT7gQudBnSuyRCzgRbqEMZs(<(u0qWn^9HxWe-vH^V{zVd^VUGCh z-$d0MByXXl1i|jsQWZh} zFNS#i4{>m9%;}$quC*q}4Wy(fXzFOsYGURHHfQy+|L6Gk2zv?sgZAcbCgfiBb`GwB zULutL#Sr|5|6^vOB>yjpo2>{XNJ*7k%F)G~oR^iIm7P))iJY8V*u~63P+eN~f0qB7 ziBMX(xj6~4v3YuWvU+l{I=Wc0aR>+qu(5NpadNW!W3ae-JGhy6u{gL={kO>f>PVZr znz~p!xmi0pkpD;51nlVUCPGR1pFscj`R{$YSzG+SNDi+5lh(fk+5Y2U<6vcH`@h=% zmJ0vJDyZUOZT>IvfAmE;g#U~A|Fiv19AUQq1pohR=D#!jFYCWlMUjNr{_nAgA`yJu zhlhX=hme<+(DZ^V>x0ju(Q&8!x_`XhT}gLJ5MP#T!3~6g#DWUL0EFohp?D1%n-YaW zZtsmU|80J13G~%P;YH3e8yMRdi-v`!oPyzy6iB2!JtH>yzRsq-`uR53-C6V1GjZS> zPh;)1$V-8*LzRA~%})OM_Z8(;WAq62(NOf2gT%;-r zz}8AsEyBYuH!_ry>KCgE<5gKd>3K3iKkoeE*b(>YLyoJc(PJD0s)?P~+Op=L)LTq3 zMr;I=1Cup@vGNt+2&u_o3W~(z6o@FH6#6oW$K01@9Xzs0X5mUAyDTQ<8*#G5xF(Y_ zuRxnni&`8cgWWJvf@(Q+3Mvij4>;TQ3gZ;TLpE3^U*S29-L`-#USl9`ykkmM(-Lq_{;{>OF8PoP=b088Lo-z>G!hmqw(B zpldy8dZ7eML7RG{bn==o>vjt`X+>IT;o|bqGjl|8@}$$QTpXn89`m-Ga>IA2Y#ay= zeJto`O!|%`Ve{H@W+t1L$C9Yyu(Uz-gG77*5Occ*Qe-MGQ#er$z$R-1FP&yZo3N3o zo?=APek#-&R<{ z-2zrmuK zc;jS)X5H1q((8`-s}EQmsvU3(dF`~6e#G%smhrRcSRg*+3{}MbET^{*-cQ(!gPLaY zTbrM@{-#*G;GmIWz$}uCvFve=nfHo4)-`|HG=P_7!`E!)(F3OIk}2bcwh!Y_120ac zai=)2cWDK|5)G!{7HhXyh}-*%W50yz3T7-8v#Sz#DO+g?-fF9$oWZ@<2}E7v!3L2! zm&8gIGc@YmNdt$X(ooS9p12I-v7D_b?FnibM>baqBvQW`RA1u?s~H;R7q|0>b)ssm$`^L<;ydZwiflUcQ_-OZXXf?7!tUNBo2 z66(z4hMXwqj!NBSh?c($uyF(u2*HSw+Tf1fH1$JJ$up&lU=KcV$U%8Vm1SPz&@5Ny zb}ErrZQ{ZpLghMU6-$$vWLECBzqahEk=GUgs84Ebgd2R+=c!JF{nFAFf$kl0GtDz8 zc2oGKo?2`e5p|Y4P<)yO8-{6xsU35)N~$!*ix5tu;me)rkj+s5^oB6jqBq{uO=jB2 zP^-^?J$30w&jBNt>H)k)jpBacu}I=}8hG&)1EWniZjricV!dQ0bwe^dZVE@6G`?2o zF;V`|Z%kr?vied}&hhP);Jos(Bpo8#gruPJaDIS@>nvyol7VT>b14hP zds@+PQYHOCm9X4%d7>8HjFlGBPlb%C&W}|s z)v+)%ghOWeB)F5a{UKeT4Rzlk2rf@k=)Z;<+0qWuIMO0j9LpfcYDBZK?J7uLo?F&$cfo9Uv5M-wAogY|-lt0lnd+~O2RO6syH21|6R^pPXbE@ryU%+Q1h<_pIL zWkX~Mt2qSwjN;Z=iRs8u@6&SXWe3&>a-q^=^M0?J0;9_HigI*?PY!YzG*-*)Pz<_3 zsl$?&S{y%KdDfMZ<-~2Wj~pD-8G~PY6qE%+A2=lpf!wC%)9G}{#+3L0?B<5yuDGgt zzRaSiZCl{4P&oAdj(WL-l+A>xbck)3_I6M)$0?HyQ5f_WSF+Hpz@F;GgBApnL|DQ;LH98(tXx^h*t zZ!KM^cs-854gqLtnFPa%%H^hBT^@yfum&Tg=J5$!-l$6H5_gN&T|*n% z#y#C=_>_ghCb>?t;8GDKmtGOQjL2duRnFnC^f0}If$X8-BM&hkb5AHKt%maI5krJBFS$ENgThj7~_rd zsgz8XF4w8M^QeM>eT3NMi3y_!@f0h_sz1C@k=l6Y>09zyCNyd0P8L=;r7|Yl+j_?+ zm&7Yfll9OUxPL1UtTv}yLot+xtGU1%ldiaZHFgElVINjeQT5zUV2l(?e z37odFtDm=J3KF#&ArO(kUy93X-yZ zX-j)gPg4I}ZG}jw0Pc_Yw7w@za0njc$Zg0J7MbRRu}~-sbF;*$$Y8Vr2G^Q{m>P$a z1Rg?M73(o*aCJi#Q%!&aRfN&4T_RFRKyX(rgSK%D0U);(RBm`xHzEr_Pb+bNan-KITRL)r#NLjUVKUcCsc6S^$)G=#;oyQnWn%UEFrxUQDbV^_{%F<@(xd?38TddEFC3!8BO2K1pU;>Gh zcp3WkDVZFn;sXW>9Y$n19`0c<#}PdK8{rjaJpw9~BwGMPrG-0YGB!kTIfGoyk>;ow zer^p1%!Jhy%}Z>q35T`bM4~%Wfi9$4Eh-xAVRi{e45l*SL0%kMXpzpDJPu;88pDxI zQ%g0%AfcM%UmUt6#!Q26Br5d}x-M0kYT0mfFtp}vblkF$-DSTr)0xMpN3oLJlBX5r zW9X~Hq@*a+&=8B*U#QD_CbngOH$Wjs9F~zBsXIN17^wA{xQyb99)lc8trM5n718RL ztl5FMld_vMDdN%uUfYG~10vE7DEeTFEfRQAji&VC+zv`@h2kGy;z};tDmBnFG;7A>R2`V; zO(1m|zCf_##3(;iD8yl*xc`3^o5qi7G=$V(%)N^z2R^-|VfSO<`SYmb4^jh7tYmRn+v}1_++!G@Z;)Ma82gK+f5ro)Y zNiJdi#z~!_t|jqs2fA8=g9KvbGGWxJaU~%#q%prb#fOGo3Tv;VpxH`SL)S}7KCs91 zxHi8)@iL+!vT=v&*hXP8k>D#`p3oh)P^|%h3$@&uzmVo&l4=}Gfa&3v85k`|IKeOk zODPX@o#-dPZ0_txmEjAIglaglv@+act6{BGm z-pXkhSy&{?Rv`e}2*faRoX_Ms5GIpGF88+mPaF2-B{1!+A~TbHxLfg3bo8N=H>` z46k-TGXI6k?n#MvxiN5+Wd1p{^Oj1$1$4OSeH z37uA@d~^E8Yq4W3(j6?VDnPhm#>-phP2v0uX#qCB20c zZS0B=Jv+fea#5loU#7i6n`MC&0U4qey9Qo?%+aQQM8Ym3T8+VE)#jFC(E5}n9451p zpgEW<8a1CfpfTTYZbp!&r7K?(##IX`xE#$PUjPMX71@b>FiWz@TF^w3=3;_{e5v6g z4VJ8JD<#TNuCYpY3@vRjzR^iB(U?9KpGq}mwqec)9~KlDuggI*GSnm1>Bzwx8#d=BoNhnFk09tOS<+cTld$E8qyQn$Y%JOKA0 z4>~01^=Y3?KXD@v1$Ddi1dY(&+oV=&cRcc8s+a`!Vn)t$$O?Wc`q%-j_?ShAvLyzB zA<1HOXRvqI1BmKnjbBZ@z*!3!d{u%} zZZ@RW?6^}e3PxBGD&?9mj_A-i9-Dm>XO#~;VX3dIcxMM=y> z87qY8oTxVH0W^|0F&c{9lQi5FuhzPh62oN*Kp?rb4k`JO{Gf`Yes4rIEhwM z-7c3}yv{Z;MM3A9^W?L(ZY3i*?%avkBUpLCS`$BWEBLoX%qXc?=5OOQ$luQ20MX_6 z6|v#iq{iwkH*EuovGK7q<#ek_Z0RFT zPV$6f`W2eQOu9%#LyDtB%Fb}`zQo#a`N{M;^kEd3w!9woU1ibfegq12r3%H;J^Xlz zHSoN}<8D&(=%KCSiF`I1YL(%%AV(hByqSt0nc=Lj>T=0wDeItA9-JUn_c1*@)?@Z* zy2~xm5i&}BnkX);M1a7U38z6<*NE&_H5ukw!LgZjaO0mD>WQtOKw9HJRRb3ciKYqLu}$P4dlU1f~@Z z7>-|)y=3ed7^yL)!O4+<=iE{Y$9&0uG&$&Hu)Bds6q@xeH1!y(WieqXbQbl301Bm$ z8)+OXfKXcT2(PCJB?ZYF1@V>G4l|o#kk3dzIiLo%`f$ z$g8+8<#qE{RVF8GSyib@!urexs3_BsfD|HD^(;=r<|)p}*stm{+-fMerbpBfPz5RJ zoOCR0$aTF5VqGsS4N-Dj)YeigL2h~vV`g~6lGnA~c=q$-{u(^V- zr|0g_Bg!|sNjV|V_lF~FAHQ8ceKT9T^eZbKS9e`(OpHO{AyI%+I;|#bOI{1;R6e_& zq=wj%^em|jCWgamYpgKdb5gS4rQ9mpEIwOX>XV6S4yqGt78m52q)e@MorUSp9IPl7 zBdyvJxle)-0MmRr7*4Am7Xm>e>s3byIhySj(k6CM+~%UZvBXd|iqrw)7O-KGhN@p# z;KyvIyy0s0d5;d*klH3?p)fzUrsT$Hu#dtbQ-Xok_e3^-|_SS6>47r9fI<^VS2xJi{k7E14wU&PDzW4CR17LR|u zY_UoMHw0P8fH>%Y&Kjsp5`+j-m!tXii>sWk?cg{|MNaL75>vHC>qV@!bcM8(sFyM3 za%Fl;euQXwRoyhq$s_xj%-VX*$+jc8LQU?2TP}WKDOnGWq*@*Gxq==vyZjAfvtqhGxn@U>naSO$>!KEKl>>1rUZO0YO1v?mskp6 z29jSircFN05qjkJWx%bJBh<#5!#0DoEs3hTW+O|_pg;qHy*FA#>@b`J)ddt}baY%A z;Q@KJmcoG&W-?f0yb*}z2~L|Ro`)^~#n1{V@akXH8NW=3N`e_yJ$qoO-G{>h%5?N5 z2AUQevGG-JgoIE}^9W`mj7Dq7N1EyGgFdJ_f9>Gi?z2Y;vSynC^7xLr!&VfP8ZP{F z6vJjqJSv!B2(xfRcdT@(_Nf-b9m}uAK-(V-D?_MW3zFfI#m;LMXC2V^IwR{bRF}2d zAawBZeo z%nw7bj}~!D@?iI~bt(XV9x$fmWI__J@P_!u!|ssepi`Oo6(dr(9g(f1qqIXMNpOUJ zKb$SI;t_=^uT_qk$Xz7c$k;D9GcY05v@Sza5iJ}R?J~$QDpBXqH&5YK%9P?!w9!UM z_&`kn%!1A!*f~>&lHiVR;`1=^{1R-wlj7?7z+b zlE4C&#d5-KJpx873zx8UejPg4dAR9O`k*4}HQ<=CB#`kFk4c7zY$M?aKbK}6ObJr9 zg{E)I#$?DLh(C$CviQn{SFWSlfTnGQul%9>C)VW*(-=XBpbZx@gRT3u^`{J03k|6 zq5L;a#s9?(+7pp?E!8>qWLlS->*rz73cNVr#(z^3c;w!65wAwYBFX&qFL# zhqMY~?A|lw!LS05E2+8ZhUnO)v_5l9>Rsc6$v5NZs7=mjOda{>sIq2OfN|27#4nyZ z&x;Y9ljLZUpEDAq4xQOW%p?RHQDT)hmK#KDPxo9!-{%~6KNft&-d|i@O=5rW{-tQ3 z<_sO1`BmMWJvo@H)MvZa(=9Amws8DwTsLzfMEF6Q7;A#Qe3c%?K#>A>Bsz5veh>+> z$t9J$!Dh%g2w_E!I-L5{Ty-`^(i5lJHsdE+)^&(a;=JyTNX$_dM+e@O%imFZQaNQ57}p+REmfw9OJzVqmZ=k<-hzopwTLpq1;K+T_Da~(6yUp4QTSs+r? zszG$bwV}Dtr#KIwV7aKVLm~!u<)jY><3HFn59HLQAbGx)394h*m}Z2;FK1QKmun%* z4Qc(IrU}+SvXel>;28ne0aI0(NGZ@pCGA0~Vp%QoN{L_cc`>q@PV-M1TJGOJaw9r% z{)oPv>+~Ny!IOHMxw*kH(TG~SlTvBwz}z%_`)Zg~m<{7ttvUh`>O?5E5XLD0fOPOeQ!!CsO#q3yP^AgF8XQLgOM z%oYiBd0ihd#sU(bYV#JZj~vBBUp(Vv>X3jcv!Cwx#U}Tf#xGzug)Gm!(QdDJ8Ds<>$BKJ*lL{ zaJLczLEM(C(Lk4H5^o6nIU4-iw+*CvS?@i^R~Q{qxefqOgp-@MFPN?1`Q)G#jJ4O? zCj~iOo}G=WLut!7-NPl8XoTRkDFI;X+n^aC&pW!OMQP&aJ0?0@jJcd9DZnyLP*RK* zq58L`#U@P1k#XFdiUk#8^D}v(OL|#up@JT8NSO&!YIvTeq9+le7V)Av)E4ui1%A?A z8xw=MQao#y8#hhDOCWSVF#c{t*%n~Z`&R@p6zY~r)1K;O5?KUJufB1e6TkgTRlWkTjSvZc9YWca#@5DXYjjV*7*m|a%>J0l?!ZxB3!Faal= zPP65efPh4yCx6f|5T!*mDS?$vgNUS=RNe-Wj0Y`04qZ^*$U|l645PuoQKr0%P@D&@ zTFJ&rRtw|Yl0ji4pa{Lrs-?J;@a{a0*tDDbgO^BB6Y!hJ!G7glHt@~U$n|o;)6sXg zRYCVB^0s$B_FVo%lo&IDSqVFK$BC>8vG4PBdG@VA7>i*^Aq#;&3&K9#Oyh#GwWviM zXKh+Z9epK3C}66Mx^5GWz$gvLlJo%%{ZOr%qRd?vsxPX|?*YAd*+AIyXmKk%Rk?I5 zUHaxw86^x2@A|zrbknInkExM}kl_02H-lNM?hMIA|MHkcZ2JdvO_(B}Cln7xr9d>M z^3y6T>7X=saSkEF$sFCodSFj+dF3(0>`f=B3${P<5JdPIT?X>AJRPGA*HRb7P1RQP zmYZ}-*915Ww-gHaUq;6*pSS64$fF28i{Q5#1zg1Q?ReD_&AM&5&iC&Vf)e*pmUQ=& zYk9?()=EOEu(ygyJtlM&laY#SM_K^NOveiuX8RGz0EU{RjTki_0j6GL6C_dvN<>a( zTRuZdaRhE#xio!Hy2?JHS9sOx8tLeFO6jo1J+*WnIIJaS0PPvyX#7L?NTI>LhTCYD zj%oUR0gNi!wCMsH@wdY_o!{Mcu86NUPR3pr_@CEOKmYCy2R;{wiMn37*nxO5y&puRdY8RF>Yi5T~nb)o|?ir z>Uu#*+E5fw)PTsNqnTn9dm<_fdULl&!NKa`$da*MY~xX_sn|2{!canVLEN{%!-!L( zKW(;+n}IJpZ@#au1n1qxb~bi?E(g(6jp`KMMm5464A$j#1Tm zb0Xfq7FoXi0sGx_?L@l6TOIylRUuvl2PIjyCex0L!*_j2@ipt<_!w00;2`E!VnVKP zZAx!RM)@k^R~pPQrPjZ|;{A6c+O+;$am6|)NTe!M|Jurs;j^RjZ$)b2yX@-ZN^k$p zVTA zZf^zT;DJ`usn!Qo#}e(LqU|gsBVo#&Fhz%53Jz3i3;k zuG0i!~CT_B*gGbZyCDFL@x`H1X{#n#!k1q#Ikw zYPci2#_$^9Gr}zUp=C?9-P$~5@~z9n1ffM3kFh;P1)MqM&Hi@#Rc+jLOmY7NWQcXlq6@GjJJ zNmuHz(ZE__Yw#VnbAK%Np~NQ*HCtXAbm>@~$t}J#tg6HNgVkiwp3e{d(=B@(zLuAA$0w2$%OMZ_3tMvd2@yB(wd!|^<_p_R+N?hq!hl(Bx z{qnDR?|9xA}9f5V}&zQ(UKsx}b%d?pLQl?5No-CJ15v6gnP2{Ig9Af;| z0t)DW^^xOG$!Oo>_)BI0UA~-YR2}J4il6hGQj*jnz=#Dg_+!i&$n4 z2N(U#>%a3gx?NI$pMt&Qw_W2}R+2XCPx8c@hp8W6!7DBP>bXvH-C(c$+qhV>=VYvs z5AwH{(dR2)gYQ`T>D-K0UND@)w`+c-9W+UH#dIqt4z_U>SryG7Zgd+9-3^G=Y=dG| z=5*I?aEIy~zCwRte6J!oUkK2#;=$!277o5}FHRfT*`Nu1!Eq+Bz;6Y$R&6C@i5-E1 zf>~hyG50OtBc07{tF_=8Kso=GlcloddB^hF=udT^kz0vigj?kyT>JS$c=0}uLxZ9> zm^aQegf)#d)){(0gET_Vsvss$i_ssBUJc6zYcUELR{}9Ejvrq^gM3?5180Q#`4Ozk z+!%rH;v+|aaY}n0mJ0Yb43NAzG+~t^P~$a&wMCFCW5!{&C!^)4Nix;O(IC4^JCx0; zS+}4=-HN_bJKU=OVB>evJ>1FCKWnRLr;1d*>ahzIN^?fq#Nf(Mj@oW*zgYkAJac-v z-AUF7i$6A|F9D6d>lBG4E^|yUl4G|Q5pUu?lVG=v)NDoI&sCe z`7?ET9q*%?#qN$q{rW#x8%E%*d13+;#dr64Oc& zUc%W?pu0l@r;uTGb`8r+$3=UU*7&DZHZ;|4KyuOEwQ(P!S*QGMf9kzna4Wz2-wCP! zOH8J>B5~|dB<0EIHNipOpI+Nq>(@_jewODm4=Vj?*Yh4H^Oi2z^xJQTbgV1Rfpa|v z0~u@&M^hrI6s*`)h@^)aKCAC#te4fbAh zm|vqIN>EhBd zU(aH4^TgE9>wV>epU9!CGArU8aI$dLiZ06G`IM(`>)qb59L@gc>a1%N=zBZaniy~e zf7F!pexApT|c(}EbzN#g?n#;hk z`@gpdWb?euLdYz5S|_Gom-u?&OshLY2o+OrQ^g9hGln5hwL=+(rL>6aM|%Dczral6Z22CX~pCX(9?~z{+av z;W*j+Bbt5h0~VhKgwR5iw=zgvQfLvhg7#HWH|{MA!b`f=5N*#41Qm{#in2Hn4uw4k zk{p;tg6a&fCxfJI)wp+6Xf?%A5OH8dSr5xU#rHAlwk`Dasqi@(c^?8t)??f^5YzhR zdn}C1VbUeOb;oIhr9V#83+(P39TW@wt~cAUsqSs_@Va@uhz->*xvQYPj{A4tX#a*z zJFCev4R$z@3b1Uo+olE;6iRfN!Nq*=L~qQoQ|!PW8G3rtSf)u zB4%(-GME0^)yHU8An=s6UXudrU$)~_oNYg0{$!rpdHqutFwuQn=lb^{o9t(IGqIp4 zejaM*YW8jNv@2WxRRp%tD~Gm>+hCQJzTH}FfFl}_5uo5%K0WH=fD3PgbmTm_jM=RH zf>Bf5GEawjoI$cJ+YCrKv2SFGz?y1C-E;VZkUN@0uyK*C=j|2bE#47Lb~2YG?Hg?r6i9-_YlaQa9E zT3TP%ZjxY+`gfX53;B7HyST&$&3}vaf6?i?>)3YucI)fucX&wl@emrBu;l~=HDQQfL(lxI}MHU~E=yJ2J85W6*49}66?nxeyzSh(o=mbXLH=xxzJ$iM8) z_PxK$Lu%N4amyy(Vmj7l!wl0KS76+ZM5+1IWr*acnxnmaPQ02 zX7u7?pT8gD;G1QS{IDdJo2MV>6S@e~!iJglc@s-7mfzN&h*smJ26umhMSoU(DNLz0 zL)O*_qI8I6a6|Shg;~6Fj;w-$Gz|kytCC`90?%j=4&wzJq8QI)o(#)H0(D8e+SFC$ zM2Re*@|XT%;7LnAHaJy+$m9o7i;0EtAj98#^ovYGuBN$s2jYHPhX*I`^~Y`|2N%wZ zACiHU1QGQ)_$POx?+RaE?(lcKmg&UqH&s3!jSBOv+t{1BvQmxf2H&efiP9zalt_GA zw#2>#tRK%RBEE$brKbXTIedW3r$Oa#$N>7RsbqkV|Lp_1Ct#x?gn%#t8OEV9{zEes zByGFKsMdE~Z0P(O=Nj~kLC}Zzx$V?+s0On`cp!?cQB#or?P*89n#}LWsvU1eC>xf} z%6QMkPk41SWuhb$b7pYcFg8KwFeL*2^<^o?eVg@X-=CKJ3%NsX?FRGV~WVH}=*b zlm~e()9W=B5b`J`^!!5B4%KAfJQrIu9EK{}XRURS0>8nny; z1F~4Fh%$B46LnHm zuZy5>k_$o>n>h+YhatFLvE~`@T_d>S6k+} zb;f%ZW(wm-96B`w>^TOBnd&lU{t8#-24>UJ2?F8tEElA}K)VMflgeL5l$G$UBWMLk z2S3cjPAxe^A8{gI6{Mu3a@VfE`JEl;&x*TlW z-qX#`CM3cyV=H%s(T49QPvaDMa`c7K33cgD_iRFZpujoJa0qSu2>D`4foJ3J-Da7s z@A>uB)X3-??Zj*A^~mDl@1KSvm8dsR9%C0Pp-=CA9^2Y=?#Frx-yd4^NniGiLNf!t z7}OPZd<-Rpvl4Tm@Knmi(288mdT-SGi0`fy6-y*YjTGEnG$v=^GlE0{0-uWCX> zw$V{KHuP)p?MsJ|U{io8e5VUHoCaHh#FnHnE2GguI7;q(b1-@WOH-wXydZF^vfKX zh|B&>YAIb}Vtj#7Uj7(Sw-aGT=0do!fmG?T)?}O?A@^_T+>aR{qd(Kxn_T&uK*xTZ zcol8don&3B2a9rBNxmbW*>E795XJrGQ#Vzk&n?&P=is~v%J>n4E7pdXn9%n306M$n z?Jw9G>>riHz`>@JCAQKG3zRHM`Dw31lg1DY)$=-#6SVy@p1oPM>He2sWCo2XDt5uI zO?GT`Xi}50E|W0`sn6JTG?^&fael*0c0ehLkhqsR6o`i}P`uu}%rnGo)kLB&N(l-N zSIP^~oSPOxGadT+J~95-gJG#}<79dLK0k4XH{mKZ^L_9dlMAAwZbNHRt=rzuKU6NxJG(Oa9$#U6-Uvbr*Uj8 zE39lR2bQ&zG3~hs$H-&fN+I=jjWZqfJ!YjkYxaUjO^yCM646^ekRG6LBu|^6{9X5Y1Zh7AWD8A2 zvpUgpoE+6rK8~wZVpL3}cdsfVX~K>Xt43tn!cRmO1=Yx2i_H?Iv!f!;DXq~{7j?=h zy6b?nRd3M1hHxHGDw4)x&xWGNok5yy=YKI+tt0A4zMMDCLMjx-&S*@?9ndD=-0{Oz z$7G$0>zm`94=d_>`&QO_|3Plx?<=;??n2+`Z@a$ZgX0|glGcmdU71j=665vC1wx!c zef~d}cTlb;x)GpC_ay4&v%)R#R+&zf3t|XynJtR`m@k41H*!NFaQ4;kWKGD~HEglZ z;l1+fHkLa*emp67IDR*q@0j+e|IzMibzi|l<)s)Wu|0SIOIoL=}j+ZJvh`6GefFZ4*ZX5L>KkQ*#b8TLzCVBoeo+92bdMs-w`uFn&tLw(KPTuut1-PvGLg}%j5h|v?9N;i zavOU^*ZCICqqtezH(1Sgrbd2kOj40L$njeaxj^Pfp?ynjsT; zUTu6nT(EvWIVXXCdUPaZMlrs?mc)Zj*Fnvf#aPn=N$&4bb&(g&rx`Ym-vhm<4q?yhZq7rz(v&}0(?xn63M16VVZ9d}t;E!~DyaCCyW9=_t#z2a_Et_JkihNOhWxr6@U!sm zpGw2eOQX+t&l%4JbfKMz(FnNtLkji7cPjYx%YLxa;hGN-B&>84QByVc7t8Uv;_{-{ zaZz7Cr@>kDz2j34jjx-N7WrUD=Z^&cbwkfl_cu?&X5Y7h!8?eb^7cLstH_nZMOz-{ zvrXZr8i4%gEjP5EM$?ur*91AL5?d;%=6im)vv8fvfNQ5Qb!s?~I0caKs3oaaD!w%6 zSvMwx5I7@%A6^nVXt3sa0|(7*d^R{9i5Ke?7WbpHa^b$P01&bf-ugRwMcX2-`?lMy8)?yZ+u9l(IZ!RDMc;ujMn;`R?G# zKsG11iDnAtPbr4iPCCM#fbWZQl|c>De`j;zzWK+wZEgVx67RVdW;c+3|Vc#0oz zsPwz*_cQmuQsOFq*M4{q8s2B#8FnOlJMm^)saoS{-_7MDm4e3Uiy304VF1Mq^4}c$ z?KOL`ml0>W?F+kY=O4C4?)M6Xt>(7XL6~$G#^vuQqCFY0gs3}-dun(YZ0z^LWeaQ; zHyv^#YopGgyW>!NzZOfj>@?BVAB3(AW_9fZ+R1A?LVVy88*f1c|oM*?c6~b^w zJ*XDuS@1U}7_MKrIi9o)WJXhZ5?`uESeanc-jmRN*X@1n{w!|1$>KjfoDA&9`}20M z>^qn8yJ674!8GNFvb3MsZ;U^6Phv$|tChe8{hZCXBZ{>W(2qgSr zRl$>gHn|^5)pdNwdA0ut-54-w|AjQ*;knxxlt79*$k-ot<>2puM3uO1ohSUD+N2pw zye3XdR#Hl`QrSW>{Yt3H;=sOzrr%pe-%T9L0PItssz0FEoty)|=P7-+Y&Ju)v zI@g-u{T}AtF<55fbrG4BbZp&NX3Z2TSFZ%2#Eg1WZ!qA6fLTWp79?2**6iM6UWzmk zfTLBKL-P#jLoN&hjVsHHPb;y+h%SnP2^nc4me~F5PfMoIIYMCvTJY+o`1dWypTe`gFuCFCUr={Yt-3zSW0M zGkZ07vh#ujMAsB#H7Z1Q7&0WGfOFHGf9m6nndC&fwkht zvQMgx;xCRt;3n>(F0pdYq*>xO&Y_?siWTW{Z^RW3c!S;|W=8SGsCWp?(^NE2Ts0>+ zU;N^Ym z4**6$xxYSs_|UO)=-heFg}TMcIa;*m<7ljq`4Z?@fZ=d0+8y>iLxFStD!2M@4d7aHAs;EXoh z;}z%83FqO7;GyyMqhpPull3#x&B?h|r54mN0K)8S4&#+Pz30|mtVdvNh#QA7%4hJP zm`@rp2PPbnIi|6wOz`dw!ww<9;!JPKU_=_BR0;qwLG-g+5yT6p8T0}L>`udG(yUj? zxkU`VSdGbd{Cq9+&sW1!i_ytibfo5-sJmyI{<**#4ZLZ5#lUmtIVMLKj<9hKi#BjQ zmukYGH(z+#fjzH$#V_u>;;N%(7skizCM=Wy06+jqL_t(1&o!F|k4=rApIuY#UsD?J zp&L613b>(jhc|5h!k6!^VBE%#NsBYsM>mLXiF5ZRYn|g6t`adO;&@@?bsY#`g@Kp{ zdB~oMYe1C-{UmWhfrJ1V!}#$K{)?SRZ+T-Kv1D?o45c%&IP<08^k`=FU`#_xix0zr ze9|O&hl4}PLN;ZMDJ2o-loCWSzc>;%OAAxu0a}`r5RIecwO@4gmP^X5HXok$oE_(w z#(OoVlXZjMa_Q_`b)0)CGUMlFpMJ%*Vz5}?-3FqGkC>_zN@oawzfd}zUVa{x0Wf9TTR z{{0V}IWhLckG}8Z3R`b^>GoIr{DTemLeuk$rQuS3UD4_Boiau+jIkJ;aq=A8O`TqF z9vcfEKHGSFw0UZ}GhPkm+FmX4+juzz%W*kuz%B6Bt(3t`j%^9e4QGsjXk&8QgfyFq z{LqS$hD4W(ozl$UebPu{!Uce(8EU&_7HiEE!XvEFs zP#YR9v>AVF8U#rw*>Mht_$Or~UPvq@$$6N-OK?n?TznNuX(|>Y5CtdXT|hNX8-pSk zKs*?Z#=I_TSc+J_KY%gK=7f`M@B=SeHZ@+-JjG>U(sGg*f5{PRkj@Ib4Z_OQSkORC z8MYpmEp1P!)tSb(X!_4hwDE=(oQ^yHoEw%h`9;jTnk{Z$3Oh^Hndcn1yn`Wy895*1gb*>0UFT4bjp})PC~;x3dh&PyUj*nWJNX{J*muh<&z-n%^0CK{VK}3e z+$oFh)yI92hsR>LF^PI|BYWQYp8wTfTK}1k{iPGsz0JFy_M2}xmMzW}3SrLKHj>|n zN6ZKs*C}Idj+-*vg}`}Y(z)l<;-Sgb#1ihoa!oHAW^)*u@N^-|H!!_C=9XC`ALfggK2jiug~l zu9BuS96~N=3YPRm%fAt^z^8na7Fi)F1G__|Goeb@^ZZuRougI2D!p zu72IGE?u_goEv6(GwaLVo_@E~=;S+XD8_nUEpi_pbq*e`oSwsncrXpi@xcHJhCs&~ zU1(q#K9$DkA;!TWTm_{kG4n!ChOnm{^e4|e*n7Z#QtKcmig{@yOh_6afuq3aT{soP z_TC%^dKZI*{J$a;NSXNTA9gk3_7fRdyVaJ)Gk$DS^dHvvwY{l$3I{^8(@gC5gb>_4 zdoDgVR|(wldN9_A&MbDumi+TI=R(t&>_m7hJq!M_v;TS5UGs`JKXh{O!ijU0zXA;d%k8(k)?3JFt~4ZD!hw`bRI|5mX)lfO`P+%?O}O zF4yw2=a&|-Sl4jE@@IHC%|rTHa6|;5qQ|r&MbyIPL=S47@v`8 z&relOpDOkBIRnF(NgjCSGjsE^58VGa7S6H#AMuHO&QX-_+qmOxfAF3gUvR_UedZqz z-uZ1TL6)yLu2E{_Yo%4>)J3l%+e|Vx%aSE*r+884f zcY6GQ03Nxa2fz?3@rv0R{lU2AV+ssp806Uu*wQ#{<tAy2Lb!fAA_rmvTp}P>eqpj#%D>~J5k5=9D9p_x=Otzieh;#F+ZXVCA zJ@&x8lWq5&qvNyZE?l=`_e@m$m-|jP&>?Wv46%5!-_tX^zRi)CcEBDef*-^UvUJDbE=i9m8ue zIaD|HB*Edhe?i5Td;7<#_2~d_FQaNZSRs7&mAebIaXf#kRYI@b_Hnn3)dSA-F|vUf z?Nq#l{S~wz$|6{n=4a0x?ZLLKL3|3hdd;Tw17Y~^p_2`~dx;J`$Q9OX{{8p;@e6czkxc>4$|L zEQi9a@**_u^66uERTAQO0+_|qGfeOFGnE)m@s&NcF`+gLFdOB@A_>|Z(kKkdB!{VT zsT%?yki?J(IV>@Dsx{hf8x0IueNYWzX-kv@FW4W`m@cAw0YQKTT3O}CgH6nyF^9uq zVd!9p&v%@j(CKrWUe_tWNAPP0ZzA!T8(xNkjo2T96(Kydz*-{ygBd;8NGuM*Ne-4dIg+$U748IUQ&L&*4`@_5s|Y%95(uuuD!E>G zHq^YbP7K~Mnk923pZjuGToPtmgevU$hq>y zL8k{h?)XwA`)Vk_gIx&5f$3Tpl&~b;9-aOArwR}J&?)RFt-Tf>2Cd`8O>8Fgi@Eh% z-~M0z;I>yh|Mh8SRv&pQvFS(>Zi zz2#m^5HV5I-geyjldaD%#)4lD>4M4xC9`}NBs0Io^6OTz$1sYF?4BzxZA`? zIN7RAO%?IVTWMekkE=P?cZ#92G#S(v@u8%!)YsF$E{{DQcmS}7$ps9UUps_pZyo_ommJo{c8!3lDzjTVbi3$LoCDP0D); z{yz=%TB&yc+XZmfK+~l_yr9RCtZhx=0$U1DB}q~P0BRT~X&TAtw~W^WsjJAMY)U4y z$q6VZQBuPqATo(9Dn8~_WSj+ADs3$h7;l^rCvq4YQFzTO4>NJfiZK*IXJIUWrg_Gn zM3aEnL!;Czyi6I$he+ZbI3^@m1V+)|7BmXX=!hf`&5hr(aGQ-yxzg@@-&}KU&cV~` z&ZoX{=;~j&dcBKp0M|=7zgdsw56=v29dOoQaKpwryxs)~Mx|JUJ{;@P(GdP0fa8ZU z!$bEybkAS>)g5)baB)weIToDYBCZ|6_X;NgH%C|q&tZBv0$S!(wU zWw#Gy%KVO;f8WX0k(qWqTgELt8U*eW5tQ&3N`mnj zcE;!A<9PueY!8&3tFF85b+6xiMRBabCY@=A)v=k*{6bi3lyEy5;;S&(BHqx>7chTr zXM#zuJ=$_ky7@Id+t$DE_2b|9($d_yrB1~U@H`S70k%-G(%X%NGlw5uw`FI35Q~r) zVx_<+8^cM=m2irK3wRT00O=tR%}HAnsI)SQ&@u~*Gz>$L!7C3DuL&ks9BK-{j9_G_ zU5_|n46<;0O~jE4`nVqehZ-q$mylQ{b5$cHlTvA*fW*Cl*e^y&foP!gP{vYnAb_Bq z8*{i)hG0cAgbgSU5ZKEr9X48C3%fx4eZzxiM(36sui<2$Xtw_Rj)&j#(kq9;QG694 zk6lw?FnM&oG?(w$GVGM{4qj76JhM+j{Ht}Ci6K$QuG=v>;lA(Vcbs=JRd3MA48P>H zul=>R{VMKsKK7U2yYJ4&olY67-nLyEuH1Y7bS)~mYlg}_1*a1D$1enDs!^E3+s1S) z@4gt)+*8Z=mO#gAcJwA*KfpE-bnt=GvlQfNRrJoyp5k18VFvq@F!XXZ%_avyw2Q8z zSCNd*7@FV@(>|Dx|4R-2Vd#(xe$p`jPDKxfHt#k01O#JjK6C~`r`Sdd!vd)vVP_PU z<~;|W2;!Tqi_HT=g@6Ckza0CUe{iCu!JgdKP3t!8=sS4dJ!e1mCl|)5&e%*J9u@ld zpP1J64)?b@wF~3pWB+!?{Rbb|{Hj+xqjgI}`lb>;p9?I3~xdsL~Y-aSAyz-bo z*v^z&xLfX2{ni4$xtz^sqQYP?k7tB%ZGXnib*f|a&Jtc$zy~2ReAt1FmyM|lCk8sr z{ta6@n9t&w5ZsE2L#Y`IbdI?g4~d(IHGUIHaUFm-#HUP}pq8i>krH6W9E4hc}r zLam7zz`Jy(sf39qdss;}pIp@>n#j2iE&|{wHa{U=C6%HwoN`%4Y4pdl07Qu>5IEZz z|1&%8H>P?FJD6HxsNmLnPBJ;lvCY*MxAvCymC6fC^OJ6NK61Z%wz>V_`PbgCaljdO z{iRGk(;sDLCh9Yjqg(fGbO(AF>?jD;;Eb6ZgyEYVo5!Yl-uamyJQ?QZ+`g!H?aSZr zhIjqfx95w_KY#i3KmW`3{9HL`PCF(4l9#^tT+~_g8iitJc%8EpIu|AbL}0_ubC`m& zbbNq$s1`(l1VRg2mVCGDIRp4w&G`I@M-DlUKIxnpb?3&SP9?KxP48{D4%~X{ELQk2 z&d7L$!A~6`SFHm%qX&Xe4Ha<~0}uW}ap)_DB}W?m&P4?k!h7^SaGD*K8apeDGJ^9UlBa(GC9aeeZb1FT8N`<`Ewg z!A9pf&w9y)bH_In*L?b8AHHher5K@#{bjssu`u8M&i9`9?;rlm$&Y@l|I%%1GxI;W z^DBSyuD4x##pUY<2K!5e>P+)5KKR*h-F0|m*QU{_$!sV3gWrA2&dZ0l@7{?2xC8yt z_*^HmQ~vd zTtIJhN2!Gg%Cr?}WQGak8Un(pz7(H|Xkyu&t5ET=p<~#nHUfxA=~l}ur6ow`B`vL$ zm6Zqr-0$CdMMBz*qY^`$q*6fTfW1WO8{L-^RLS-^TsJ zetT*nt5cVW+{j68lP}g<2CI4{US$V{~S`He4?3*f^XE zu+5(XSRTRB4(Deo_>Q56JrQsbf9Nu?F%WCuBjdG^cYXFJ-=E8ldc$GwrdR*Q8~^CP zy}h^K-up=7kKgy%5O?vlMJK4bS6#XDg*P8xn8)Mu;r0DPYrL7oXmTNHMc8S{C_wYT z!kP4wG69lihI@Rs0BfDh$?+4P_}t7FzvTSnF8|Dlfu+iUO??}4!NRde7fv7FboDcW zzJB}>#02i6Fx(+6!#i*D1Ww`Xc~B%aZy89D7dd#lY@iWtsML@C z^S_<>#9uY<{Bh5bWBoHz>!RS2a;ZEs9iBS2^uYbczV)p~zkP6^UOM_O|A3b^|K{@_ zf7PpR85t>KFAY|ovYGrM3JHVD-t2Qwe}%)7Vm z+tk0Vuh5q%;L-M`HMvIS%isR?ZNK)q*S!80Fp+xj;JxSs;Wo4=p72TJR%2-G2Cj}s z5Q>xNkT_n&(>AmO(|w{Od#DJ_q0^GAj zgi%S8*=NcRW18^9X2uB-+^t!7RE4l5B>)CuIqFMqY-qquS1K8oy=gN?GbQKeM6vvU zqT>b`8(IO!q>mj3=X=uW@PCI`sx|t8^0fmSC+81#Hs0@_8>9t8-Mv(H(p!p<+r)K2iu*@u>RfxnfjhqSrCeXGQ*XB$d`a4GpSK*`Jep3Z~flyKRk1M z>-*nB<4|E(gv5fW?`^+oOV7sP`K7?gyVc4x-^nY>vw3uym|h3Y_O(O!Ld17|boZri zeZ||}{jO%E`L`ecl#fp=^Wg{ooSgbsE;JcE=jZL05zx;7Y3LB znMg+@>yDCuWxQG%QY$7Ar2?2|Tb01pGgysq5uj-!K%`I>m0F8cCaV<(5Q<|4M9Qv~ zSV)r7-~tP!nI9RMG)|JNNRbl}XlZi9_Tl4mc$_6`2mw~hF=rHh#IWphK!fA=bh$(x zHkuo}!X9s+M`o1G%+PtK{FmQ7dG~3*;;oImUfHkS>A}{kBA>S{jLrr#HK&U};SLTPePFI3< z;FWrM;1D#k23}~v0pB6$(bzELqW8cIml1?O+`(OF|AHMtb zPd~6_xUW@ksztB%g4=G~+B-1!=mXgnzUG^_OuZ)|OCVf;*(qj+_!!-qPPDNZZLPL9 zj4!M^Gdg_y#K?(L8!t?5nQ5-A1pQ5Xk_b1dVXhYToS*;k`#$JB{6u+r{14yuD_{EZ z$6xZFZWvjYFXw|oHt6Yd_FP(g%WuBuo^O5b4X?P_Z%$-_rDNC$diW4-CfRJI9GE^} zp(3Bh%QNU_aG!}+T=5VTJ)gX55eAu@^ODB8A_4?plEY{knve%QuKd3YJ3 z)aUn(teLGh@j_@7Uk#gHKymPFl+RKbPVSDao6BDQbI^=w5*CB27{k0KgkXh4sTNouLYa|} z)#f9zR2zF({SjzjBAHoART#1H+M{NuUIa@vWdM5tnXE7Yr2HXeCDACf2_q%G01Y6) zNMU$ljxe0);RaTSGx#tK_BlpawF8h^h{tk<`k(JP<6{I|7p^Vt?e7_%tKvPCI_|!* zLucE$kACx5{`O0+-_lo%nr?^{`VMZh@xmq7HLG||kel@f|LiLd-94R|@rUbf|Hzh2 zANs)iH>@vCx13LW{=vtOTqtJzMs3mwYff=s^L5W2t-E2lH_UW;hcY#MeSot!)H?31 za22~@AR9j#7>k87YXrWD-0HchOl90%n8|gT`Jn7!&nDsq1b9$bEZ^{)XMgeWQ(>c) zEA?X$l3e&n=K~$QiX12`MD1bxKZYmH9sTx?79V}gnVEL*RXKb$2VaB8<=w%x{a0VV z_NHe#JGWrReP6Bd*e5^joI90mE&lqi{rqpg`wdv)#|VwD%A%D(q-+%l@LwKo94UPC z1HZRnp!C6yeJ+>H+EiT8}K6{8%0gpr|u!Qp2KmOpqvh#vcws!otRrC0=U#4e>A|(>Y&O?F-a%rEQ1#GaICJu)( z7!WQBP4cOfpfo;Hgxah~Cf;KrreTJMnxSdQQY2NDCE@4SJKMLry5b2{r%s(Z)oqjB z48e(V2!mA2UtWc1J#!&w;OLsP{<|z3*r0(e0~|(Q>bYTzmn14F0g(|%$dqS#Rkjvt zZ;Iz;nzf74nL!Hy%Eo!ys*{hh!=^n&b`#$jt9S#05?LfB2@0H~z(M|MF)( z_WS?#cmLzFAO6iheEqdo*h`&nd}``1KU)0$k9XPD}Y|fQDe= z$rPqEmDR#ZrB)2I*m>~_zx?XKjhk@vq9Wl{z|n3NR+dC3MyCMP_@%1uMClS9Zj$|6zUjf8klQd&UL2e9V~glrvcB*2PqV*s6`W6!Y|BH^|V&+Lzvg=~TOM{RXY& zqV`j$N>b>3S)o!jeD@Pe zx9@isoK5A#CO4A%wO@bhD_(u=YP)m){?^Aoe+Pbdo0Vd_!l_HlNkaYSonHtCTI{Uy zTCr3JpM`j)lSx!pCy$(CU`D+qKGH6*Q!a>S|@9lQG5zwx$6 z)JSWT42f1cR>@x7Kkv?>=|SYBGJpp*Z2iMu{dqQ)oH;djd;;aIKrM6uZ7R(IeBFEK zr~7{OU4QcH@B8Tg`rFSoa0tuDrAaCRkj&&>@{$+N&o9i+Vq+}RQ`$#)3{9Iij&Qmb zM+kU<$o^-J$#;r?pvfhm42P`E!~Lbj#d5Wc85hn-Qe(MadH355iWzIzO@ zK)q(cq7&6k%-kb1{WXEgy!SJR5&0O30iyp8m&)+VIi1LV7iM}yNF3FH%P+GR_sqA` z#BOTo*Tatj`TDQDlxu%gdDB#%+|A3GmFjZVT6Wa88$k_5{xJG`lZjCt$Q+RR`u&tr z+0`0uGT5UZ;uxfG6njCGBKk}k_4Ed~;1P=E6{9|Aoq5jYNNhW*>kfv;I*wt%PCr%+ zeEN=~GnI^s(*tUnNIGt?Ukq}-9>P?v-u?!*N(|)Wq$moH(i7dJMz^z-=iGusg zGmv=8a%ZPz$x@nlIpN|b-OSEiTda;-pPj=S37KKS!CgJR0U#Mho7R?M^|6orP3Qi5 z|Mm~w_m_Y6f$^bqyxj_7YE^G>{${7vV&)TxTd#fd%m4igpR!8}5B=Mhot0I~EoZaw z*S_v1BZ*NVaVe_kZUbKR~AT@Rm$rAi{I{MpD21?zaW&jVB*@(zH%A zgb!v?QR!Br{n0=F`-dN!DAiNn{r>%j_fO);PnGmR;CMTBZevJ4dSs%-;6;uGxiHk| zNS3t%JgIbop^3>UE!B%2x_9=Xj|}uLPR*`1ym>3M5^@T*ck?Z848*Z=lZqINQBaM& zUbV>f0AFS>Bqa(GX_=d{G`R}Ee)d8~7m7YCRipu`3OBLVBKjd`+`BOWOfN@5Opz*a z{blG;H*n8QU|vhyt&2(FSJqUw+YE9sbFX!|`FWeRb=${BWw%ylH}7?2D0w%OPDMHR zP&uQuM39k^W>BU9hCu6h$whw_#@enG4m)A&7r>`lp-5)Tfb-NP(#tghfqKAUW*2L= z&PgP;pjY=QEe!UZ(7e-s?~?tMhoo6}E_L}Kzf>JTCLI@3-ZI9}W058Tz zsQehj7?HTkURdM@ouJ03&CXi+1ss9U|DTwcQVKOe(j|9HjW%o=iAE!}nW+e7#sY_c zCWO&uQnjpMxB2wH{BQSxyZ+$U-u_$fd0PZXHc(gK(k&3;tg?phahN4vb^GGHF4;`-gW}u~Np1w@2RUcC)|DhXZBB?RmpPy*$)jZG~{nmfd zGdcMDX6}AWvhkxDgelfK!d4Fa_e(a}nHym~BXr9!fr4M}@}rV(_wr@Ob#+p>+HUB> zl+lez5;N3l)G~4W+K6S$bej~2QIa0TN2WP^D_5H?UOi-=OVb*e1n23}*Gn6s5|mc* zJ7mB+4iedEj}a~Y-v%44^PPpb6dKhrUvbl3EEV9T4uDwnoreoaO zjW%we=$H`)@ygb!bvRE7cRrn3yHj=f;n+a#uWD?bQydGmxLc?AfDP$v=KRcKN0z<|YbOOHNW{K3~R-MRC_ANoDUWz2ZRqey5qyD?X^ zD;{14ScwKH@Hl&YZuzBaZoF_;?bJl1-M;Li^PqCU-q$dA*1~eJ8m3kAR&peI#rb;NPmJ46>U%rgyQ1MPQ+?N4?Q&jkklE7-r!-g zhp2z#(33~d_=rch%y%7L5!W57oiT`=)rehM*{58iGpKXx~fiKx;A z6#v&v>}Nsp?x$|1euitQ&&W(8h~XZ?9EOV&ot7DT?mqQ$;4dZm+_M(f^i=C&m`9Uc zucY3`wQBm+Ho>O3=3O=6!EaNKll^@BFogUNqzu<6zMrsADmU5Vfnz7mXKmGTX;yzV zq;b$JKmfU1^oP{hA61y-x1c06Vs2;H?d%RmM>zTwZ@ZpVv6EAF|K|?m|Ml_wUTgCg z9-TSjCGw%Z)q3e2@Bh^+UwnSS3Viq8(kK7@o^X7~s}xu__gs2amciQ2&T~2gBX!o5 z&{-$&7U$EIw%=nZ-@@fTV=q5fLxQ|mxw>odfe;vy8C{)|!I&fkSRf3AlLz)6YZl-k zQ4Wn|DhfuJrS9A~YRye`sul5yQHn@sKtu-WM*aBrz7nc0efWd#3nxQ5JBhV0QoEf) zk399Kzw<|j?tRj#Qbj{@qHWZW)?a`0PvUN!(_PNlu>-hv`5L&%l@Gp5u=q^i3*@%j z??cU1O;g6J>Xq;?G@9Llf`AM@Kr~RD3a6h31*Ft4Y{>us2z%U$&>hISf$Mr zX<9?HfHgcacJ$yxy@XUv%Y-Jr4-fa{QfaKe>{gO9GnQsoR96aQDrjbdgPCNgURgP{ zy7!qCCXZ#7>pbfP*Ittt+dwx!Osux#eT1_QmeFC-1yC`cRPptm= z|7z;o{n8Ec-=3S@y7axrGb2H}XH;XY2pK+#9Ad5nyQsm>=3pu|I?%h{+s!1%KuSMH=?-xejV;aT;&}gRdwI=mo>eiz|z#7LBq&qnbdV zc3Wp{7_kaV9Oi;v0hw5cgVC^prwf^wu=f3IQ!4eMn{N<6S;I#0f@MwH{`CL;!o!ao z{;l8q&@&Gogfq1fmeOIlj(z?MHeY?-o|I#48W|?5F3^MyFP2OyuAak_6EjmMW_5(U z8fowq@Lq7?IrS1=lsL*s@fl}PW-yXrFf!QB<_ON9fvbY0V!edLq`Eu50Oc`0GBk7I z)bz=D(E?55XM24E;n8dcN1TyPv{7#_ETS?2q?9KB@SM$2Q?IyE2*t9e3fid+bO(kK z=UsjUncy9a*r0(42(fQs-#{8v>{KV7{~y)b?8!+Iem zS~s?NUU&2J>3#Gmz57`NL;L-Iz3M6kS8w5@R|$ee0?N(jv0jcQvTj`6Fj2<(&-&n} z@{3t1ggw&tfj|92 ztWYX#=O6z0?ot8&;<0wC9zeHHWn%y*Kd|e*Z*cR@YJ(XVwhmS_Azg*4OJ~G1!~B>U ziPNAp07&->mlz%W+8C|wH<7U-2{eduQR+EU6CAzU#j=5lNPOeas8udBSBvZc(Kf9ZfE-Ld+e3M3opBp)j-iSqM#H6c5%7!z|Rhs+PTS9_sd`U4w9-_9xzA-BLVM? zuX{PJ{K9C)yHGcIT2_BwR@(>!M~rOT*|}9sA(2Jd+b6le+q`oNEt;EJfN3SUk&gc` zm!_1XoDii!4y*23y`0C1o&X|fh*>jMJnaEom*4@e_^|ItG z3L>=;#*~d=dHxEbs+M^)1i=#*VDTRmMc;Mrh4_E{khQ?xgC9(kUcmZPLcU5=$D}Ix zmyw)J2yyw^V>seHI};<$5$cDl+Wyt6ua7^4!@S~Oe(IRmH@IbQDx%iTc z+1J_wmsn$Vez{O*!)2;vW$yp!6Qxs}$|)!S2FVAGb>T(3Q9L$V__H)nr_QRsJ(BB> zYkc5Pfk?Auot&Jf){Jthli10Q52f(LJUcxP7zI=q+q4(p_YJXj3>cW(DKA_z8q|`u zJG8~)N&M~~*>_AXEG7AYQV;i$*S_##&slW>c`sZ!|MJ~xJ`kf@F;&a;WuuYs%)tZ2 z0te4E@$?Kq@#WI1u8d;J&Eh5fmk>@9+`{}Uy|TsuQI$zgY!RG!=IJ>X2_^WLa50#n zRlO;llCAype&*$WIy3C~-zdWrp%mt#j;7WoI-I6zsv@RTzijhKZPDe2n>_pgf#Gz# zwa=#~`NHh!_~<{9)_1L8sboNo-{!O@mxE-q-W-hfpLGr^M(D?2jBqqA#Q{IJgS|3BA;YN1PlGIf z1V27Qm#T|?(u`_ZjUV%{L{=jnEaZfzPtBV)3l0E5Kg-&(aSV90OGQ+a_blx7F~gidrSf(8_2|8=1(^p^4fAxy zjo|;=MSf>w`TX&f5$*J`xfTU5b=iuq2GL|DPFo8#QG1-`r&}w{kJf$dg{mQ@G3I7U z<MoFe39ExG6SY$(FGY(oK z>12-iIny=B$xKqvN-*`qA|lr5^mhWIA&!4-=};I3HjcAR54_`de;fM}dgjl3=61L2 z;GrMJAT92&ERMZwvXsZB$iCF*SOw=BD$EH+qnw;B_&^*)^{LkA3H_FJLqu%`Kqe}5 zDqaLKY-dDWucI+Sv(t+NOR>Y7C{!K8#=*X%=agp_*hNNxlmn;X8mfMLBEXWL6-pIE>Ve52%CK*qy%r66N!JjG$JDo%>luE={ zm=O0^ftktac11@tQBT#Kwg>H4ICAR9DNb%e{VUk$lX!K<)=li_L=VgXp`20@#~PAL zd7Dv&HOy+MXj#XPpISV!%1&&oWb_HgEd$QSKl?v_aNobb;hnFMg*TUO0uz?>{H_`6HXqURnJ0e}2|}aBp0pJnF5=`30B?0Eu4WUj8&h5lk`@r~68XMhr#w zGw3Ba{kNBu3KB-mlqKLp6<0_p#Zp@lL51yROD!a5i#!a|YvfAk~68`8|PZ~f-sLkH%?Tpstv#``&8 z5HTC|?(%9r&$e~sSfBf8T@xFv;PT>XEsq+O-c3Yo@aye9Yb=fOqFrDWBpPjJa>$`V zyAa9z((#T?o*>(W!pal(Jj9X0I!8xyS1D?<1F1|VYKBIC4&yVMdah_9Iy^eeTs?yD zX@^ebISCba399yGmtPT1GLRBk-H2kho2BJBTjxTGmh_2uz>&NEst^;dZ(O1)|LOVf z{`YmU3|$Ify=1+=O20m5|Fs*k7RfxQO8iu1QG{;(i%DaW^b(jp$FxF#l4#Dq49T)-;ETH%V~$5dWmF%pf_74ysm zr=jdysCMR;S&@xljN>*N>`=_6qR35toUB~em!vMMy!5SKa)8tRr zvKAZ;H|$j9)+rj~g;^vW~U#~y#i zv9on6{LsMzU;fu`6!*{D9DI;x2`}O_Vs<@jRYF!F;95>vdE_0*VFgELB5R)oXFtbMCc<(!Zg|T(l z8ot(j@uNH|;#!*1;ob7hmu|^^EK$L;FVVXw#}5|;`Es}3MNRzi^YGOxCb}P2#h7F~ z@YlpNZR^HgOQ;7$?nduDfIg825+Js`5~S!>IZc{lA}sIVsU^>eg~GDHZ+p!Y`xntd zBI-&1r&FIWLxvKV$Qc30uf8Z7RRUf)$^mcQt>y9VgR`Af|66|hcQRYkrH*~qkCzYc zor*XyI&uUra@VpLbB|^j`eS&Ek8SIOlhBXa4hL)KP<_Qkv_Z}EVPeAkM}-J#ie*C7 zdl}%6PXt8*$580RHW?_dU?d^7S)+$Gs`%~W8M`=FD-|Fg9hMX3#0jiRyiN!;YIt#B ziTqSe10MoJz1&xb&iP`}+r|im-;Uj%Ppm*#4D9yU=JI*nb>d5+fnxP1}U2MyFaT4{shw zY)D#ZvonIvYNX8r8(6Cq>o1{-pMM$RT>tgV=XJ#CCp-Pw&(y!44(;XloN!a9AJ4Ct zpS52{-376Akx+xF;=L|Gk3LNGu$IqS!M*bQzy7^fLN}5!c%uMJj*d>RS{H0E;vCwhT0DuNd2kUoFd`^vL|}_-C{;vRA?>2PznFZUBYzy8WsURCaR%hT4kzIr!W5ENPgEX-R{a7rJ59?j)k7iLJ&TET3)4cOH@;)=AOGP)fAx3&c2dZQJn|a%Mpll|v~rFl3wf=j`ki09?R9T{LnqA? zTAC5+%ehePawAZ)zy6i~s0Rl++41&LK8!~zxAWb{fA*8d_vTVVLxUr!bgUC<&M(gI zJF)j2?|S=-+cyb1>dx$D-K|v{Z2jdZ4mt&@J+V+;YNT6nNfH-ayl2yn?GyW+p^pGh zh_lk}R?D@*YHV`GsG7v$ha7f_HsuZ*g)p5lV`_r30XF5;98G(egvXobMjV z4a1Y-6%dV=ZJ8JI!AucF9j5Bsp0}B5Pw!GMMLzg@WKhk()0}@;Z`-S@oC^=zm}q>3 zrEP0?^Cr%H!N3dI*FiDbCV+z@3yVEnHgq5HkOf$S=1Tv(DJT->9wEx<{cbx z&w;k-u}zV_bf@Xsc##5s)YrAj750VOU;F&mFTMV9H55s&?FKjpAmqIEbuWJ54OeFH zP7q^nG}HhuU$=Ov}Rj>c?OD!G#;o-f`L4 zc1-;pXY1A*oK0AJ=*|a!@YBbvtygcl?D~n@Zp$|+o?DGtk)mbKmI{YT7-&g}k5wbS zcQ}GhV;ag{q!-ku458(QH<)10HGGZ9P`TtzE_xSl;wZ^ZI+wWQiYt%rI{++2glNTR ze9K*3noErg$@a~R1|m_>smM|w(#`xaU-b-XM8*audVkhs5(!KSH;GMNr(aA#=Bv3W z8u@kkTyM|5x|uvX*c9QHW@2>tN*R%{^5((+txwwhb~?!C!qe~mld?Rc;B^$qqbNLu zyFqd@Z}OWRn9jEsR%`5;NTk9j2wDh`nJ5-oSZ&nW9tOQ$)6F?fnu9=P)Grb=ojRxp ztpwUrR-+1=CF3{0`(3$BBbB;6vA_QC9Zw~!n6^TylY(W;k&ET(bZbpL2O znsn8DsQilK1e;RhdC#pfhU2*I0GEGDEky!hhr zO))%fVGA<4Wyp!+>R(IVlFC>eELh7kg^-ne=*~x;_}=3Iv>z2973!c+EVlzqdms^G zV<;LGneDUQ%;d4`eChMwJGIr(N}QGhQg9}r$zd`YtIZd`_0M0KdH8tk zaHVmiT|d;CdwlULpS<#o6w2bh60 zeW#;Ac~w|)n-yH@acR;ac&?{L|5;zV++!m2Ag`A*FOva51~KYT%|kcN+DC)9wU1pi z`jNT?_G-~fa%L%dQ*!^Sxg#wQqI!zKxO`^s#_ay#qrrq;yVsdauBs5D+rtPFCR;zQ z#zti=@eS7j$t5uuM5@^cL^aoO_fIX4?~G!S$Oypc(5R*|smN@;%5pF=650%=P$Tj5 z@e1lkwqI)*jTu@a9yn52z~d@&uH?m6-u&8E0BAs$zf~LPJDeYU=b?J36SLy<&~2TQ zr=qDFE_#tgI4`2w>7>RsG+8nNdHRn64@?q^0nRj))|fV^8K&yJ=J+l10p+*OaG?J= zU_~-X?PHeBWM_V6K@&|M=ddPBZ`&I;Y)aaZ^yE}&X7%X4C+a5-TT2Vgq$)u3!N4X#y~txinLcvie= zHU9q3{^{=r{w_V9a#A6VZ=`GnNDbw54lc*ohtNLK#D^b#>J$I+wYJSV2H%EP002M$ zNkl8MPU&Sg->~c4aZQp1Q$%EEd1;Bm zPX|WF=^_|k5ouVxIkmF9+K6ooX%c?%rI+LehnG&BfHq(%SP|6W52CQNkR9EGU1WC+ zfcy*|xEV}h`d1JXeq#b%qSW^Gok zN~2bG@SVT?`*^En+`9k4iDw=^8V_b+G6sAktL-qHLfZW`CJ9djc367$TQv7u&UV5Pu@RIzc^4 zd(-Bjk@mu4|L_iu%}!g9-5Z9^yK48g-Ipg)q3?hF*8Kj-hktVai(d26W|OV40hZ2~ zmC-|-bHVse@BjAH$)%k;$3;dgGRZ4)i){o?JownjrFpa|9I5@x{LF{`_+uaV;O~uY z9%ylJF6Yf@1}gPEHK*M;Z#*(F{eh4C)m+VW`o}$~V7*SGUR=$Str~)>D%u#aF1YT> z@7#Ci!xIM{o|wSR72DhKY}*bD7MNcSZ*>R5^Io-YQ{Qwlh~4lXzxM+ZhaOm1Sz1{s zw3=1Ah+VsOf8;~Ii=Zkt6C;Q&CXP)oK~HbqTw&lO5cAM*pjh!{3!QUuS>bjzZW`Nj z!Jd1jPYS{;!?0ul;dm`LEjKc5Ag^ANkA|1l(8IfrFMTvvGt{i-=eyPgt7;}e_fPND zkFqYJ9%;$5vRjL0m`zcL(MxqkWM1U6q5JXY)Xb#pCGQr+t0+-eBAqzHl)7isA;^t% zpq?jpXKvlY*$-B>v7D1kvxs0CLHEgEgQ7)^QA4^QS`R7nY;Jz5)gnK-pM`)ZfiB+P zS7I2}k+OIgDm5$ZV86&sqEeepk`CvLeeP3#F?oDy&)K`jH;yGo(!mraQ+)SsdCf~+ zbIC6}eE;M5W5v|wvC3gBWVd^?1y+lC5Z*O=I}qw9ehxideN3xm>m8Ce9j& z{N}r^ibSuXiTIC3eS(!08{8r(d^*T@SyaMcS8M&`o(J2hq2%@*(iJYIykKH`j5~NIe=}j4@U;IdCWNLy= z$5{W(^zXg8of*$WqZC;!W(S7mSLf+rrDd`L=(ta!k2^g3OBatPYo&NJ&}!8p!O(DD ze6djGOidPwLUzj`ZgCwE} zcarH6xvU(8GsFbLEAy+>g3CdPj3}CTNHve4zjOI3uDU|;2_kFcXjxYxPmgUKI{yV1 z9Q@hAJHK=LFTUsX9$F8Sq_W;%nUF1f+PZ~Qz)lzmg;<&eL-*W&_xB!rpzLIva4Lep z(5|tn@$mG)1OIgJf~`9*JNKeZqnqQgc%@lCu{8bUk*Dw3|KxltSPk_hu6?C5xYcUi zj*l^Fl3&#>HC0E#hnh3KYt)M3cPomGS<{MeC?RL^G*||YMsw%yYKE+lY~ti?cUlXR z%S8tto0+WLL8pTMMyyon%TN$&k15ha2xA;tK7ZiEkMDjYdC5)9OdKODL_xuXUN8`w z$=9l#XvVC%UGu`Lm|s-#9L5H60Gxqyvso*ZBe?{_nQ)@sK!1H1LvK8Gdq~r-n}9X$ zTkAU&tV?|`HS9)E8NFvcnTt$KaPOVJresqcQ{cKUryqYVn~{!jMOm(uYvAqY>ldYl zP_K36KDQu0buW&h`XOt7m4|7trebl{ox)*!&|$&L1PRhFdCu)mocM(ccSZu0!AyLi zPzyw(!@0=xe0d2Sq!+}70=VP(BOQw`d+veC>M2g2u~SyG@8-AsdbU4a&3jM$Z050t zkH&&Y7gxHP*t2K@c?(2zg=k#x8$vKsr(kvnZy_Qp0~x>$qftN52!k3V_*gK{&jWP9 z#|MaDVc@|HU3erz)1n>DuJS?)vxSw#%Al3hT*)X*v<*)a6q$FxV_N<)JF@(0P>aoH zo%8t5j{nQ&zP@Ga_KUB)P}7nKv&%LcR>8cemX$JoY@v$;W=_rg-bX&RfSxmwvx6zy zuCl$X$XOjMg4^zG6MKI$u^%^CoSH~0Q8l@NPMIAvcFY>scHzyhdh)JEI7ShUrL&uv znxj4ZTAZQ-rW`wwjU}=}MYf4q$wn~jMmsJFsbmD-ksB^P7fGUVbh>iie*{{2ddk|| z5^il7c{|~HI|^WBTc@=OTrDx0F;gzLKmRY^K2-_6;QCi$lgw0G7y$%8Ef}88uP)XD z87vH1-uB&RZ9jYGQxDuvFKm|PkvEV@+T~&)juH!8_?l$uC8jf=7r9Y;Ajg&8KS3k|K#{rq2v$23{c8at^Orj~<%$SOiE!BN*^E%DJe$u`e3YLV)na zz=V3L;W))e_=MLe!YZL?{KCtxdC?15E?b^${^&m*2%8=i(M_rl_zbayjnfb~hLtkn z7mDGfXs+Ks9S<>2GjE`4`d82>Y?;>Yi#+;Y_)zB@ANuG?@x;Ha%0d;johpajtGF z6h?|=<=(~Cj6ocG8PBe^zw^agKk=no+gmP*?zvz=OB|Ad0SZ4jX{G5LFL-Jt8{31< zrB_@AiwcI~L=Z%W)Txzm)ha45NTJ$*U-xb{QaJetGa*7ymlYM$bRt57`E`*-6cf$= zsGRiQFsVu0#lOkPBvA}gy59WK*6t=k_d8YZy{?alZcC|@%X6+?0@I-0S3mOUB)v$z z@2CHoJh}OV>HpQ#h~?*CZg|7|;-bf#1F+-!+76--|L!A4F57lpB3e%-Tjf04%Hm@K z>A9tPUIzAbw#?M5S|V~_VYbMgD<^Ix```T5U+HI?Z^ioltq+w~n-Q!BDS%Rh2@M(Q zS7pD)0Y zoa9*Tmb+ZT!q4(1rf0A9&gvRLs|2awq>z+#B6w%4!Hs1*fH(y`v7yzqv6%=(V|lmn zKmX-RU;p8~ue$z4*Isb`Fn$3-p>m~N3tA@^=YDYeZQuCew>g)1IW&;I`W5Hh@Y?%7 z{ZAYhUTt+^sLA8eT02^E>)Lx8hy>eO=c@;rHCYsgcD?@1=e=m>B(}X69y^S6T+ykC zx#m(WHUitT62j7=B;m}+*49vX_>#+7TeH^AvA~A$R@^!kvM^g-xa)4~(9@wB2NDLB z>#e{3#JB$NJ--sq#LR}6786UFBU|R6S6Ny5^d~?6sV{wd#)_Tu=C{nn0<|_vnk-+k z9}YN3sA<@-gNyA;hLJitaW8P$#aDjT`b4LL9HUMiBqGo>tECp_RR&oD(DopK+~5r2 zWe5h4{1qCMLRjaqCkQJlpl6Ka-o+iSCL-VXYFN%Z63kz)Dvsk%m$S_`Q-J^UoV$sx zq)Pd7E~9(=`JXAwr!T)HrWWMnhy9!^yTN{uYMn0L^g#VJiX_s5;Y7b%m^G7SIb8I_sqeQwLq-QI(pE-^!CBYsi(g1#lf$JHx3SFbJ={oHnp_6kk8A_ zP%z8-nzdoa3*P+3rC=!Y-`-I8$-V9~2i#II%$AuOWQc)+!VhkDT0p+x>Su zd30zpu1Apx@}h^nru|_k~0vM z0WG&y(=8XmX=Z>dgo9GJknvKYI1vz(xPt~^3oJ=CA(BG)8SDrHpva#km=B6>qUgJc zZu0WkPGzW5_Bm6z5g-(sUf6#(fhKo-JmbxOIr9#>l>W@X=Sk&PcwIam*AnvZ?5h_< z?M))nEUKy(pd5&12S*o6OHhD%B%G#NL9B$o^1w4gFT3RYOfFq%FSCo&tB*=AQkz|A z;r+Ckjz76LjhYN4pS9uam%Z^82D;gkjl1u7%+h9j)dx6BOoK7CUs1lLgcU4%YV{81 z8iKhS*fLeOCQ>Cyrqu@uAOj{`W3liUXzR6n@n%%opv!u})`# zt)z^WPd)m$S8UpG)*4s{guU=Kh1xD?6*z{yl0QCq;P}+RiP=-rizk*BPSmRhs^w;g z6FJ${ihsveFcMj9b+Dj0JT={!ng(h{*$`#u#K^M~ja>fgzp)Yz&BMjJw)KyV1P&cr zxc#o?vBS-U0;+u`b{NrMoMJ^B>-h#IsC** z$WGU=ZE3n3Z{WrQI8XHw!f_J^=WV49^(TEZvSf;i3-$KsDbKPvk+q-B*Ij*qf z#hq9p*Waubr8Y5rr9j_q&7V9Ph|RK_m|0*rjPDti?tG*(MWN zFhrjYR(#yh0M-lwbdJ!Qk7#H`!=vPWL##drzO-bnRK0XgD5dRH_wrB5oQ;E*Do9JK>dJ@Mx>TbOz1-b+3Nq z_HC@fc=!D1p~?!T<5&&hX#|;&QA5R29$TT9qtPzJ8BR~JU)BPEub%z84^@@3?!vGaUp#}`b}ZigkPzPqO&p(VOtnL!5o^^hO)frp zU}FE_QOoR#Xi4iJQhTDM#Mm(5UP#q1nA6{PL!qi zMICb&=M*D)5N8qHd^BIWL}Ku4y4y2wFIrQUs*=yaCgStmeCg4AQEWBK+}FqT1NF^Z z&yBD?^0S^zRaF1=gbQzVI5LOLvUDWFV8SRNN|- ziB5kanahR`72QV{W?4Y%*vaUQJvZL?A`X3>oX9`@=)qt+3cE^|rxTQVT^1q+^Lnks zO09qWc(bK8fdf|_G^g&_p+-<%ZrqAY82=OH#Ld|$aXJPBi zi`dWrCj&@WWkI54fAGVfId|)($%*6l?tSX;5)tUpUu)&7;BHOKxrE=*TiZV>l4wl%bU({h|6weSU9LzVcz#801`@LSHt zv%m}*!mSsb_lDP>N;@9giPZ7qjFx^3dDGf)^DjTM|5W?Pi5QL|IxRNWvSkj=LBm<+ zIfRasJ`l(=wnetz_|k1>ZJS+Q8t@twOpKXz*D)ceI4&Ll@k1931e1|OxLQb`sAd!O z#-^G8=NcGjLs3kNF^x00CRagNEvL&RX}1F=gsdo9i0*#(8A?GWkPpQ7FF&C7 zw#F*mujY?dY}X>J|L~ta|Cdsbv$9rgOng(4z{P$)h_W3>k8NFD;^@j*W44Wvxr3qY zOsDnTy%Sfy=GsJlDU+~j)iN`-++c2Hb#baubuFx{25q?GcylyG*a? zY#~yl5zU?iiy(rWK@!E%>$;6P)X(x77WaS?=!)j4nZU?u7S%M6SD1mHs_X;Oe=-sM z1d79Dx-um<&EvZ)H{3AC^)k<41C|txsn6eex75_CQp^qJIIjiPq6coGs%ORlNx~&T z_MZjX5KU%a{6#ODe(>H(ex_0{hKS4Tvh6x7Yr%>^JZ_JTUv}m2rB{|R>BBnT)^CIH z&4C&MzOuFFt!SDANa#+OF{-O+w^)$mu$mwuWydZzTJdBsdGUqi*~v2efsY|M6-KIL zfDOp!X&^QJ^4CQBu|alYUWj2oZUr;#Hhy-fPOus4-+p0!HXo`k1-%CQ=cpgM&tmxH z$3URN3Mdwon1DFxp;%+?@t=O;?nbp@)nRH}yK13Iqb2pJY}bxk_8N zBoWdJBA>GdhRrg5Hwb8;N4A-Yaai<;y(V?vyL}lg(7)cB z-#BGJpx7HEAPhOVsMQyBD=R3voe(lilzxRMkRBZ>#wr?XnWswaPbySBO{zfOTxAo@ zmW`R~uXHaxpYz=8(keUo>h+dalhfCDI+Gk63JvD!5&JOoXftNuScOhRl*IswTGcEb zV&4d@QV%wPp+oP4vBzj3BqCh1Q9RS58$39n z;6)eiyyWba>4jjv+H7{3m1-?NyRwRx)l#ie^~&X7VIk(u#_dvwlY7~2LmR1q=OtLY zV59*Om;}IGRW&GyU;QHX4sJ z^<%b+?TyNjGShG`wJ_a)Px*#S4Ay%bqcT)G6R5i>wENctuDf-mN1}9DxR=YiIL{Zf z{_}I64f~s5lkwV8|>XHoJ%vo*lmr6J4CR8MN z^#v#nYvL-1i<=n|{AjA9(B=OX|CrP!)CZ;-W&SIQxrk4Yq)5m}tA5N|nvq0&+t%jn ze3VWU-32CC$_Uyv?k*h^k&JOHptD5*;&R{u24viuwEO$Ezxt*LI{dy^WOz&1+uUrj z+@>W$N?~bW)n<=5JMGxkN|pg+ASNkjUZ4vk6Tl}~fwG_%sxMN5zTveN(;bych+G)Z zjSEn*gq0o3W-onVo<65)WO%%q07Z_=9T*5^oV!2wQEPtDT4`eRZB>enn~z%Xd^>46 zHrkE#hZ)V7zM+QTVqnxZScsdIhDe~DOtCi3UiNq*8cxJw_^v~fff-3C62|3YBphO1 z#g1}BJqTLz20ci#Rb`W6y-}xYbXyg-#o>odI7DN62jB7vtd{Y9T_+HdKz0C;hI*(0 z&Y2mO)q0w1*bJyhU}5C~+a3HVvBS94RCi3a_43ln0+UReiCrq2%Js!lnMfoq2-$eb z5H&y}CMP``DmYCRU83O2I$AMgVZM-V9cvP{o*X=1ursdpw=H z+E2Zp0OhRgIbYD*c-Gk`p1|P@Zr@}Oz&OrU&7+OR2fy~C-?{OcYsPjic&oQhKC*13 zI!-LS_b*!ELmXSD}W=oFz8bOel675F^LfIA-G|; z#Dfnz!v(wnQTj8nOt;BI@zX0n@y)CL>H>ypi^3#nsJRkQV3%OQYmHrf{n5wwvgt0y zk~vl&kdbtWod&zX$O~OR{!~&~J2w&?8jhz@;S{rpKximg9qfZGAY5c09Zi8sglvHb zT1}`4a=|Ez77Bjo6zRbkf8cap#c5Q7bCy^i2NbgRgzsfJjdBky1kA|v)S;VUQtMP} zh3SP82ltl`JYtup@g%`4E95qrzrt=!_8sk?OSh{yvSQP$C|7nJoEOdmnvPOR5U)hb70FE1{yt}M^Z&7GW_I(qEbiHVa7ON-@l z2|k27eXR*o3+C&n)@TZ-$MKADP^3~3WYyy~-Rg3s!uDaNcj0(E(@%S%DJ=ik=Bn;k zyh>jx@;J>uBv&P&1(AxOh;E|{T^MHPGpUHhm(%k!6HT|%G^U9E)$2?KUQ5->3<41- zRX3`|lOYf@O^L=vw(Xif^pt~Uz^v^;iRe-O}|i(9j4=6*P}-oOL8gL}nN_oHD`U%tqAv=tXo0L95ac7BIx`{^7ieP> zc0J-%Vpbz9#|sU1+GXP@G0@P!;KpIr=yF4Y2(f(w>3BNHaUSu$(O@baN@%s*Lb<}A zA$k*-fVe>l@9GKE3m8l=Zt)#2B1pGgnDMS?{KB zQ9~@_G)aRtjQpue8jVpA=MxL3g6yR1ABtxN!ih9%fNFs1g2b=NP(#q7^?8vWeVM_M znrSYdoJ=!#H;pr6n%ZK1roMiw{Y3tkZsKkVKd<%oGs#p9_Vef!BFG5|CR8``C_1I? zSj;-fk@3RvQezRnzlbtAPX+K**%xEkpT7TbHu2U`gkZ2Yw*Ar@Ud&$XeEOhte9Odn*7^=2m+!yVgn8}%z%WUkB>5c#J7g3$ea18EJ#5{k_Mydx=iDAHvlnj zYd|z_N=s^Rul!Yn##AbUu@8Mb7i%(aI!jkv^vX1xJjKmRW0B>JtdW7EoONf`<}3zl;aGC*bHs=#X?M6HVzGp zY}homd2@QhXmn&a*q65Zl1yySC`jGUCMJ%_z-=^e=GiB722fdZc88=c2qoAGJQ9Dq z7dXds1aPTAq6DG{w%kPy8k*N4i&VfBH_^Dkjv|9C0h{3oO_Q|z=DZuJ!~nMwNvAfX zc5m2m_KhUhzJeyU=qFB`JaXjl!9z#(J@w47BS#iyXBZC!b8Wvu9A`rV(^r6}T8JDd zv69c13oD_iSavWoFoymc&%nfFx($Dt?wdzL0`ezKhaxgiQ`Q>LBMyb({KB+Tr1E^1 zN$7ug{s_-W1R(spRIt999!iDy8HhMlQ3Vh}laQ{k#@ev!{0Y|9O04<_glJ2U1hLb> za-a4$y|@+6UHIBx%#Ehl)cELKdzmuec^sak%`{k@rC3YOTN%)ly-=pVxE`nJ6 z!HcU1K^5tK75Qpzqq_Pd2q}9NCbdST9{;T+G1;mOY7dvj9<#R_`NVOS5mI;T;Albm z@HT5mNFX3k8~q^&t=5W$L?hZtLt0UgYCv8La}J!h*KpWYDc111QCM8G7ALLclh*2zRVrDvLa4DAv-0S1vsP`ua)&K@<4|I>uYV+$ z?aL%H*-U>fGnkBKaYM5M{NW-uzg^*8(BFOn|#=37BfJ=t2@vs!t}Q10*z5 zP}N0)5&t+;AQWO1K?gbTiX6@z2kVkZ`DuJHWdbLG7@->%56O|?JtL!guDFscJGEME zdEv;@`yPJip+_Hkbl?6%bE`P4x7i)RmIJx>gOW67)Wlvmz^lYUxwbOP>EyZo(L}c2 ziQxtXMKJ|3>7|1fyQ!*%W=x^9oxjh%%&wU;0-rC|S_D3dLDnvxLd4!NMlHo<&7JVM4h}mIvB#dbzJFj{9&5-BvWbMe4 zN290&AW5i{sA{AHLd0w{A5g1RGlGOXo|&YZi*K!RVOJ_#7;`X7Y!+X z-AqhHHVMpk-FhF%+B|Yo9L+PC7*Th1lk&z)I3$M-f_VJQ2t{(SC7rq0TXi?6;(_Ea zrlb)q3`i~_jSApD!>%byIK{4)xoE|$FD#U%=4(^Oz4?=p2J`b4CwnyT;800;<(O5+ zy=Kg6rLE>bGO}wNf*aa3JUBku$FV+<2sV*SUl1-~6{r@w5muSw5&{uDS!Ux{dLZ8p zGbN)()={b0e$X*M*})i&)-_8MikZQ|GkA4r*(mYLHQX53EBQ{L+$z=DtIM6m`3Ckr z`7+*0+L+aWZuO;DiE@ee*kpklP9Z`a3fTcQX|Di~=op2GyiqcIqPu00B801HCmypo z!yy)PVv#^P8R*YCLjzV{&dO%2OjR7_|Ay2L`^011-`DphJVTgB>PWqD;Gkr^FN_2VBlp##zB zIzg$rX&*^GJ<$M~U=XKppQf1U{6AgFQn@_OWlAI56ryg3@(dlF5tmr1jvrYxrT~T% zmULs8!R+|z2X7AaG8w#$L^gk zCc0usexq!pVmbFRLWMz_N}^FFaW{XW8}2r+(jaFz&2-G*TXlg$0~}owWv@E>0I)N| z0=R~;#PssttkGdSm0R=|vUJe|o-SG9BACzRuDa=Em)~&hdw=V_M~)qP@cxH? z{KMN$o;+Ep)lgAVwhk5ni3pRl9Db{~ODBr?#krAsnxKtkN-Fp>2(o}i?e5qQgaS{y}V94OO8cfCbaaadUrN6^21s#tT&S)`PSQ%Pi51Ef3 z`vY|X`9h$EZU_J%!jwFM7L6C6Um}WDKOs|)gTNfOtyBP)5q1)vh72os{Bzw9&LCKj zb6u}e4lWkj)^T*aY_sWv!)_wsW;x$$FgiYzV3Yf{&GB<~1vYODrPJ~VA<-A{GdZ3} zjc+^a`fFeGf!}=Zqfb0_+ikbqb;s?;Cyvu)003kmFeZH+4P_)Q=cf+s9olksqJNBC z{dABF(q=psyBW#=s`@MF`ZOa>(;FG|u4ldWg3tJCvRexg)p42bTB!lm+PB_AuLKQr zy)gb70PCGVdbU8rYY&fanLqp#A5hIo%Aj$f_~>;vB*#-I@b10uP;Ipm$7vu7=%Eu6Y6|jmqY@geOzsRJVpe@H7@}tZ20AsH`DZ&yr@FMT za`NcvfqmA@F{`v>HOm3F5^+n(PBGglZU{8CXG7;~7~V2Av}I#%q(6~}IZR=g3!+Z0$sQgh#G6CW3=QfxZDdH(+SJ){tjC2)}K(rqV++v1|M)Y z4MtKq&g`<;bb}lAW~{@3rVWf%B27EhbUKA%?PT5!9i797C+gJ_;n?`l=()RxUa%*z zdzUpf!itL(&xl&E$IfIfd-2OIzV61~eg7Xk_2gq;{pQzizw@4jeIs-<%l?Xml@Lxx%5K())_+bgVw&TJ)Dl(d!m+xqDkh* z;toQeb(v4=gO!Z(#4{ps(82seLp%x$BtyD3Nfw#mi*LRumI;=Zt$hz4fLX^jSX>O|x$?k&-LeI1JKYM~HY%Vd8P(n1R=bhN4-ho>eTf5FDtt+Qn*N zcB(XS#5!`wT09x3%qQykbf=W^kPNGXR%b98I(y5&*&DW>yET!?JM1I|?95Ogl?|YycOn|KrdPdVN1F#v z77rX>K0Z}n&Z7^Ab)0C(VOh+zBDGLz(eakt&V0k2X*O4_CXRmC@q;63OjkL1MD7<* zm5X^8;-XYV&DHp(K8`?!FRY8jsv-|M6h4?op-dpx+)OAV6v+9g1kZ{L1{ENlRksNk zS<{ff(`ttsUbxZ54-^tGV;#;OV8Z^8wIvkY6OC_VwY^cn-=)VXbBw{|dUJ82{MeC$ z!SAM`^UcePi{JX%m;d#jKR$8t z1bc)KeO#%7sE1dYJ?b`Vo6g$Pq!uuMYDx{Msz`u~_qFTiN{@=_M?al_T*OH0(<^@i z5pE{BZYIJRv3fbJmFwrOB=law1vmJo-6|KCMcW3V5~iHwhU;%0-@O$p??X>66lbth z&_)>2Ni}a8Mw`Q7mI2HJ-J~U3Q@q9up-b5jt5-L0sSl=s$k{q%&uNxwUbP)aLI*;% zufOF9&QotE;PJ=uWu}%gOF(DU@z6VnESSwK zEiXlKx!3j4z>@YxBiVh4%N5%u$K0BDSy{OK>LX2CgxCfpn zKKgWN|B2P(Q|&T)VS*tRB*WogBwGl16ZPhN)19o9=d9L>CFkB86pvvWYnhmvHQ7<- zuyi47N%e{F7?2UT)Xk$HQpcuu^=&?a=#LEWM5`KV`O1HR%s>#SQn2G$-~x_%B*cJJ zPl7vq3y`HblCX&uj9BV$K^>Y57XKSqk_KDVjN2HkmbP2=X3N4ov&E!>`jJf!8X8iThd&zon%)6gKmw>?uzN=bwoRpC}$b&kg3~1NB>Xn(k5GNr` z?K|PrSs9iT1W*m(Yve;z!-`G(VJcz>UD=bLX}sSQdQvf)DoG6gLBoxBos^sfSY9Y5 zV*M`usMuwtnGC`DE^L#Lp2@-RV0W~n3<{^2CLaVV{nfZ?k}tEH2tjvm-sKY6HCnGUvAv+aD^Dktn_>Zw_QtrgXRPns@tr${Gg+K; zgc?|KcwUw9$KwpDICC(qZXwmMX-lFR1$WTa25R`uvLk_LGCVfcH@?{!7_k!l8a}b~ zC={)kyu0^kbKj9ukM5hFUglVeL@0#0JKGCN$>?;mJz1?ySMedz$ZNa`;J6kCBrPZ2N)Wu)XlKU#^9v!$&eTy1b6{ilmRcOgW;bpBd8dD)C>(J2M{E>dLh5Z zQas}OC^3)3Q^O2M0lpB(r9kt*jRG_|HWy$HG&_-o6Jb#0V1zlhv)_1yj=0UN%L+$( zb2zj!6x$lLhgxpht;So;s8=0gme(xTmk-ZAJ#p~!-wciqk6du>&Y|;Lz1=xOwJA)`YJCV|_`zD5w959EA}Pv2x>v=iX)wT4pq3un`jD@xe{Q z!H65Ig^SF{iKm&6q(>v>(ImD!qIza{BMXUc;s{d@gFhiuG=NYeU9X~pRufA1szi(q zbiM4Ss;`uznOGyxLJ4?T0_;J(iMtW(8=x-{gK;(u%pa9SfH+3 zM~jU^``o7v&p&lwWqPhusM24s2+gj7YB0RWiJ@+F+AYpl?FFlY-)|16W(Q}J$(R-6 zj(Y^m_t{__LDL_Ip?A`Vf?gin3lLiKhv&MiCp-dJg9MmSV1aE6ZuF$d7xksX011Xr zL;*lcQ4}PMfFuPVh6u3cv;Lam2=ddJJP9_LYhGu>cFM(MP0ss>g(KNUAXt(S76OkO zaq8@E+>5Z#Y;LnU+bjzwlB0p(#$a|Z;Ndl!?ID?#JydPGN9HO=XZGECM{_tidhHb( z-g=95*6u(id-e4%x%GRu|HeDs@skICM#n=PsUWt|^OMImCDS%Lj2XoxK~pQ;)YR^U znDKwPd{!czpGJ8LivGL)`dO|$nD~kW1ayDy<%gZFf&rQOL-T8)L1Ko?vwArm-5A($ zIURzX`&9-F6~N#kwVqmniZU9*TOh&W9JQVzP40?mUQB%n)tE*s=nVb>;~>+7LL};q zBJFT#a$z96(M#Y^M-w(a(}PnOpOuqomg=UG^-i%QCQ~Y48Vd=D%ZPw+IJ*Y0pAXTT ze7Q0+xp;hE<>=Gi^i-&lPr2ocS4~*;xK++t<-vCQ?9tp=<72zVGou^<5~K5A3JwzM zGJnBJ7<(X)MXfPEqXc#sYWARL1k+H|LPTKduP@XI9%$R4Mj*q|L$z%$ zw40B$u|6wj+l`TSV~f=}FBQ2U8X0Z1W36_g?WP-zeooyvxtgE;!6UcdH~R9IZ2XnC z26yi6-*oQZe(~1#{2$KV1I)7Is`I?hdy|e(ci9=nEC}I-kJ%j!1G}REMt~42gwY}al8|k+x7AhEY*Crf*XzG*Eq zBmq7}v-NVmpH42Uvjw{==AixXJYpjo?MD~OQKL#ezc&00~V8U%E%779m5*0k1$ zks*+1Zkw&qgz28M{KBQt6LYz07Ed2qUWK?!Y7|ouH)b}{sG%iFlCuav5Lg{h8$zL> zQza#{=}YI=E}r$TUv}1)lKstM*cyp?g;cv1ZjXnpnPT$9{?Xfx962#NK2c|1rOSc? zTVtcBhjlU3j(DYB1^+dXm(I!PE_6D0m*VKNRJl|=ysvuj7H9OJlf~Cv(%J0#Pn_*O z`Qq9mFLp1kB3aPxnfywwc;53b23_3IUU8fSws=b{%)6-qC*35II~CCv%-QZ+tf@wuHhyAB6NcA8Y49UW%qh1rp;v=1%0RUP6t9k08VY zSb~kAiQ<~myY9Bn1ieR^&AI0K?N0j6QsY>mRLgOmT~Kq~Vz*UWZr%L-|NG%DeE!r2 zKT!F>4|1~UZ~WFr-}R=~U%PsRxeU@3I<4l-g^|gbbh)mrHv&%W76Z=@*WWXysUj9< zcoQkb&&p!>ZBS>?;LERJ6n)wIHGU>LB^Z7{NMaU^4jREoG_4{C$mcmt0n^701_r*I z$AQ9l9S96l7xvYXkM;8cPi-ZLVrZ;oR1NZ@(RtG9C;tf`n&t|oGGxSuI>e8N89{30 z{FUO=cx8OVODA16=n!86rU5155ng}+>a&TNT2Gr|@N@5^%8{4c+E_n-W%-5YdzYSc z))%whR=K}X3|i%AyUM~>A$e$Kw>4jO^K-mX>1EK7d z*i?gR0}oeWa*IhU)3IExeBkip@e^!%!H>7oO9$7tTF*SvdE%M=nX3t$ue75aHY8qV z#SbrLQuByHLGPl&Q6V9R@@zVVcDm5dV2NMIamW_OQEM47&!BAD36LTrfC>??c#4X` zXxfirR7&+>cNW#>I&ToIN-M^(BymoZz)>?kN(=G(7BmQ=-%j9+C{BQi`zNMQ}ANtwD`}X}0ANtTw z|HO}L_csPKtg?HZ&eqCEg$|aiHQF0wR*sdr%W1$XxL$I_;43gr7S|@O`re2GsP_i# zeST%eDoBXYC8SV*)@{K-{9oudSWw<)Apurr=*fMTc{fxDRjc8IV~%9w+;r-tip80c zoh8-KXa$fx57snn3BWlpxl1rqr7VIB$VD353F0_z&PJSH>n^XSs>MR1qEohWEFma@ zNI@P4U;(!DqwYh`fd9s12?a{C-C4ML?aU*c7oK*OuczAU1%C@`L(F+6)8476(%na9 zZrML|XljJBbh0U&0(gYzuPjn2dz$cUp+mQeT zfm1Y&mdaWoMz9c$;7gsbpJ!#>hCpj!6{zNqFZHr|fs-v@n5V)7lLQ$#?@e zCFRSIoRyT1aYsq+@HucwtR)6i!8um6A{0k=JNq2B-qj?dpd`V*;t+^}~IT&Y>uObS~%2W;>DTGCJrmj-OlAKG1 zG^h~7hiVqZCcZU?Wv!$%hXzIh<46pzq_&uY0Hxz1l=wW_n|MylY0Vu+;F*HskT{|s zq)O7KiTyNwV`{tMWV%6aHELb#ZG64wzJGl7h`Yf#AUGkZxBVyn^eShcDhtzP!oxK#FcBvvz6Uxd~g7!;2^l&I?2Kqe-hOod@tLtA21#DqY2A?f zV)&GEutneSF$xcX$NU{_C(O*VHkUELR4SF3sbpi?$&E`5y1d?b^2PPXUT9srnOygZ zodjz=x$NY2Dz^|MFLXL*dK+h)-nox;(u!mQ&mjgXiHeIu zgiGPrxP@vmhzV+F0t~7A7=7@~kN{jjqrV#Gp*Z$r*(sSd z!Y~mHVRJn-E+5r>iqq7O>c4>^$YRQa`30M`60s?W7m*2Y42n}G{E1{$6GhS`fK^*d z!lOReM+1&QdzTKZ%Hn1sSjh}v3A(DpdNRAlSvM;eJ}|!jr0~czK**raR$0=y~vN_)<$qvK=&}HK_0gDMg2)k@hThq+X;6i z(d+4KCQk8`#0w0#FJ+ZN(-n?$VTpn|a>NuSu<2?oKYcLA1T0x`*mQjb20OF%@H6hk zg-R=`CDJu4my*SHs(dy|ys+7N&S{-RKJ7_rEtki}{tlcvuoIbGZ%7PDi4C{qN z3?g2`lu?t-rbMIQN5mfsR)YoyQqUj_nw)M%NVJB4=F_0n_@NF&vi#JjY66vDdGcdC zp!~&V!l7krsfMwcdSZk^4&pKOn+)#KC~LnFt)e0XikQKGSGP+$4NDS)1DLHmQH?ze zZt*)H5v;rZl%?JUlm7T800uy-mPT-FpV4N(WbRTo|92}lXB(3>yu0Ftq91HL{>b!O zUwhZ7Tj_%lyciBNP-Fb&vF0fRS>AvUgQh}v=V^PuQ?&+dq7=Fez`=tB{NryV9ps`a z?Os+%YZis^%|1#pj1i(DCEm!tyAdg?@>tK&^t1+U{jl7Mn@0()C565ip@UM?K$f*~ z(F^)AudnXVbY!Gs=4CNdVM`>6GZIr?)}pc@LJ?E&`kCfxck#S??fG!=N~*nDbT=@c zA9wmEs^RJB>Mi@{j_n)YH&!dLX)Edly)DE*4zNJfj4dezoVFCub|@Gy^Tj*_t25sj z8LJ$-CEb|Bd!oZponKwr{`!|%FI;z5TG?K*=tfm6jh(QWDz2t;SEJymPWu_Bd!1!j z$KOoikw5REmrUk4;0E{LR1+P&6u7qDKy6fC;n)5R>PZXpWE2cl34cb@dK$EY1wq70 zF6`Dp~< zqW}=ch91t+OgA&t^WNrsm@f6h@j|-6X~b8qIQ^hrtm3c%g}Eyrm6y6DT>>utv1|pB z^hE?&QF@ArOq~Y_cfZ&tW${g~I5nS?V9&J^J_sAM0a+`56=5YCTGX7vsnquaFogu* zgP({?$B#z}{G-v~(X*FpH4oqS*7P*ISWcPkEm2Kq`HOQz59Eth#p`FqbD}a0jcOPP zE(}>BHia@~@*T4veDE-%!2O1s-n`j5`?PcQjI((?-n7+P7?w4|qyaG?Ohq^a7;EHa_GfD2a{Ifu(f#xz-KQ_N z&#xvnGnIaNBE%Ro!tSY+Da>cnR|5a>-sZVrectg`oYWS+(=$nzZ6GP8u^fqnf|jk_ zco-G%TtWu@wCc=@)>6fHG1sZx4athepG8&-Vb8cvO{2tMgUfQWByomdPx#?`oRq;@ zcqX1YDJ9e=P5t5~P_Fi0SXUY$*-~hIP@f185Cae_Om&f<0p9c{@lv}-sf58J-)hR9 z{46ge-~AgFXL)i{6uWpJ)}B}1_%C5Y*=ney*HC{Vl8``!Nd!AygLNmp(Cr;TGV!{s zw&J&vulZWTmkUAo%p?>^KXIo+VFRq~fVDHGsdOR0eq&g``~U%afQupi7WbVhyyE+y z0W5-ABaW%;?a>~rspBDy^wx}g=Yf{gat_tdD~C484|tl*E~GZ95~RZgTy|N`GWy|0h;^B2w7AveeuLdkeFlYGs+;mU{f)Kli_f{2p3Q9C;8f{SxV}Hy zJXLk>oE%F?!eBkTGh|R* z=8LHNHHF0+4lCMJl@Wk5cC40$6+H??P_wnVh(X9ekP&%OdH!1ih-zsEVHXrb;Cz6j z4cnwOhGQ7B=y5W-BxR&5RD@FVYB{Ju^d?-yk(I5zYlKv^IG&Odb;x#l)<^!-V z(b6_#638egsS=saA}KdrmP?#ckSG`a$H2vTDpc?eEp@0L4&6m82L3 z5r_ClZ>hO45$NHNjx-2a z#zeFfR$Jw!U@M3!#08Qq#ABP?U{kk;;6{)*&xBKQMd`r=E`hPEk8`LX@AlmFrPV8s zJ9xI)TF&-w)|0J~OlPW+xNEBV>Y3?NjmmUA&6$d_HViq!1{_PgmrQ=-(I-j z^cNj}jbl?&DYC;!xEMh@``KCJbEq0Z3&Sq7u0GkSE7=WJ2Lcn1)jIHX%j%t5-TQEo|By@?kQGrJri5o*9&L7d#kCNH{Nc}Ae-YI=}vd8%esJ3%wZ zOI5V$+WRnEu-PRf7-V29PNK+?jwlifB(1TUku4|=N{&08E)}}kX^o}zp?f*qF8T1I zPf02S4gm=b$T-`^^+6GPe}-e4)lO)qOqFMF4IlOT|K}Q@m85aL%75?z3I;_8$hbs> zNL068&OoQuXu#v9(kCsh5?3-3fySLA(xu?RgXOE_LZ2ZIvQQtbC~#T_YK2@t3?;Dv zn*$IzHvz=vk}lhhZd`t%dHzXfZ7JJZuSRVweP>eL+r~1lIy`f7W@0jztKplNb(dCK zrdFf_Cg6d6p&5aN+(f>(U8HABp=`nDK*rz+RX1 zjdX4`o4epdXE0Xq)~`9+TN=KCW-^Uo2$u5V1av6S`43=<7AALKzcV2JN=$-HXN)C+%fj|(&rIhZc#sI6{3M5d5Ko4IiceRa%WAuqVJ#*-q0k~}8mc<$QbG2x z=QhY=PssnrN7YDFZg`Ii5;~NNZuVrwt8n4fL_|JVATu)7noWbR9H0r4D2Qg%MI4eS zA7P4L%h&EI$}&eB5~qnutcq?A(_GB~w3v@e;bZ~z9QxVr^1>6Jb><(*Y+N0Wnv;&x za1yiG?CGh=`wz|?ZIo(h){yZw!vF&m46~S+(kk(?gJu(gm}N5ggU@6Ng+i|4L=|V< zZ#{i|<@t;K#Vt0OWD|vYl=C?L&v9D0)OtSmV&K2f+rI3tE;{a-<2BRL1BBWE!0rSV zj@S{cr5Lm-R%!6UXwEzBsZ|?QN*7f%0My5G>622BFk_wa|Ea^c-QG3b}>hNF7 zaxmK{NP@ScCT=#eI63HVcek$GoWHVp^_*M=w3pNFO2b({>bNJJ=z;9S@tMZ#C`a3; z(_TBgz7mzwP!ua&kP%s8Gv#0mAR88}MDP|R>s|J+WU-QOxhyNUUc9#S^wrjCkI&Ui zwvuf``OKE~CMU4lU;=iozkRXqFFJkp;dgLl!Uh5knGs%?cfo3Sr?)wiW|Gu}kyrx( z=%T`s+{6;h+o`aK%g9LhQ3OawS`bJ^JZ5+odJNSuE9wK0ttCK_aAsfiEaI~tA<$Y) zNE8f8!h^AlsEc5Ubsu~nHKQq`99<Fc_B^{L0q=Fey{z^Y^lA0EkC)sS04RaXY;bt-_Azuva>PbG^d@!NvHJC*xVh}@~9tjwtdodvm9u_Iq~^% zj&(PR0Xk_soF*WM&{1YOJ@hR7J}&Dwnw_;~Zv)4$VcscJIFgYQ*>mY;G5um9xY}=D z^4izjHe0`LI?+1EQd0sxsTg7Xd@;$SlH%NGFcQv*ySO zQ>nm{;DAF>iDC#&H_1V1o(>Gf-9jy&uV>Ol20CK_lQ1>6F=kUTjeQ1>8eLENiwQvd zsY>i#akxsd;)yIFh_XdCV9}hK7^Mq9046hmPJ9)ktQ8Q~%iaK)cN^72JHW#*O>|I7 z-+;C1l(+Vd>h%6r7jG+T(~~ED?w>m|WB>7&|J~P~{EDa3wh$U@Z8VXrjEzICM#3uA zq;M4-gO6bH(kq5;Pv|SyEC!cUdm;_;*!eW5i?C!F4r^_Vw_CcBSsGQ=9!=MzU@$|y z8Pb@N&@HMrvj&B zPIuJtXPm@gCpwjE+&4Kp9;H}4$gg+tQR-n*pH6SDb-c^#XiPXj0YMJO9HBN^qT1DB z1F)b^;buUg4?$hQoUFmwEMBU3J)KyNylejUiyPb5obIXf6Kp+Yk z7OTJn&VLFO4p_vO7TL?{gq{dU157+8onrenADzM`Kn-&#wZ{z56WrS zB~i>Ej%PF>;>_*zTfhlURb~)H$_O;>k+B(8W z^v!gOC9p!6s-=saAid$Y(@sCrZC0bG9J*7<@NhP@6s9k_{iaUpMQ4l_Nat5DA`}A$ z$+e{QdvL^JI-d|R;UyF@F;lUi5L>0uHAy=T9&A_>IzhGGP3|&!7-CShu#Vjzsz;97=L!d#9`IZ>&6&&=WJg_X%L z%y-a4NED=>W+cO`L$2UhP7xx>hy`g*kHDFm!<>qunL;s?$(IJAx~zet%`jMxf<>o! z-Eo)v?i&70ouJKDGx^-tFpQGE5T)wOnj=OpPF=ux2~K8G?Bw*lZMu2P6Q?-zEtx!! zuND&RXS{9HT%|Bk!QDuhs3y{tD2d534o$I?v9T-0DKJY=j4$=ah7n_{L7;sV3EQOy zqEJ7iQ=ScHd=U-A5q4xwYc;xi1~F#2Si9glf%DlSV>!R&`1By~9!^zzQJ?Od9!EI$Bc$WR=L>3MBze5Qko*jS$@pas>SI4jY- z&{?mh@^lR$i{Eq?K(DysXod&-u8h@Kyr=++KTIf=(f2)>#1Rw_e;}oT3|%`}fE6g7 zBU-3ELXu5K;9v@k`yNYTnOfGoN`lbXZ~Q>kG&#t}uBU9r(m{umgLp$f-GXk)Rz@QP|}GUpCCMoawt;UVAO*tVdom@U|Vd z>CoRpb`G8c(3V1!st#~MKhT>dRH!Z`4Wj!;SCEYSiptRuwN1a*#jP0|1+ZA`^&4I1 zF1%UwLw3gCylUJ}6gdM;f}*xt$GDXoXP6t1kF}r)d+K})xl)8!^N=QPl^y)^o&UTt zaOl^RM?$NSCl8WC>{ZcXqKVNCap7gC%15LOIY8E6NR2q;z8OUvgtr#pFw5)U%)?2u z{vIWSNlC4m`(P{07}@juUca^N^p^64u|jbylPuwCGuAU1BLDy}A%Mlr$OvZ-6eg&w zTJ~)3qAXPy;t=&9P*Yv%r?(ha#IW>+7QGDcAgZ*=aig7Za>rJ7*sSEYXM>Hm7xQn* zq{p|{Go}1IZ1xMk5FR`5{U3bSqt84{X|@!=V9vmd=Ze(+qbKoS1Z*1LZQ+|9Mz|IJ z3|0`f1M@d~7{K)ReNq&`tIkUp8D^~~d!w4VUYV6Zi9?l~xR8kTORBiWa(&ch5-&im zM;_s$b&<^8l%bW!LtGGdcR=_En!4?CQW!gKjyz3>f|AtV z3ua9aG-Ch~3I=}KRh~J87h{949ky{hSN78Q)I}kw#eu*pai)8;ezmiS3+xJVY#5b; zM7}U_xz{U2nKGUkHBF~#nig^m?_?~B(m(reKYD|zA#P3ccrm`=$^HwaMy$G9R>}ah z1Be2Ynja0q)RFPgh}6WLK|6|XDG1M)6an?vN@axCHx@-Ozw8zYO%Bxdy%o2!5d~fP zDdL*{IWoYvkO6|EiB(;<)7k8{7mE2tr8bjHS0y-vn99+OO3@GlPg$Z4L8aOnbExSD zXdpx}_@ui&E4frQagYKA5frGYzG|q<5tx*w%+Yn9QJ)gWKE z(il1YOTXaXcFTwU=O6pbmp_X;Cz_IaLuAaQ@yXPfJC>_rb*x^VTmb_zHAn$Tm58su zpVO3V5K%w0!|tnq)tkUp8F5U74D)_T;+JKmXjb82eDGm7Lt`sY^$PLIn;%{WbMzgc zLR*{gajh~2d0Vcqr62>(bZAyxWy-E9S!@N_MEBaoNBqr;oK!?xVD4buC3_;mN1N+s zbk-{}ptiw-I-@Y@Zpi>rgO})=!67dGWXlM{sBormlqXLkkhIl8<4CNB!{CY#$PuhV zi&9%CTbW70<+uUCV6N#zOGvODr~YNe(zzPvhW0wlu#rDK9Pvb9!6)C`4Yt2VZdXLW zK2+$QA@k8m3`QmI>Vd4%eluDcku*Vrk? z>GJeu04wN_$aTJD+n8M}GC^e&>&VmqQGD)~XiwXj)Sa!(6(1AOgRxaY9BYa-Exg_V`a zmn`Cb4|w7rEpAhQ@sWCcI&`ob*H{yH0TL4`?PyAQ?rJxDanN#hWF}|jK)7%k{3f4M zjDdIyfojnxw4Cm?pBW2FrF^y93s$hbN;oxqT;d#?lWbYtM#CZ1foxEu_n8vNaV93sRE)=VVr!_MG&NUm9R^g@euP> zG(z+d+Ic{MGC)+{!6g$OD^yIRPF~YU2J2KmtS6G=sr;c-aV3nddi@1f4nwp@(w*2w z9UsZ^&c)v17Kq2_f|%V0G60B(EbPNS>n!DW;{z3`ilodXboY3q-u zI^TdV9^+Lf)m|5OLzU{QsTBZ^d0TVg;ydfbw~SXxH*WSanZ?G~-T(T-;ptPq`R_mc zk&pg5k}w)tTPxRc6J55GF73yyDrz?J7_52^A-3#efQ3s;VoMu#!O1c1a4L zXj)nVp)m;IP$yqhwi1%aP8cB&E>gIp7Q9%aT4bb3lpF-Ah~vnLm=voIMDh!9Nxta@ z>w&i!g)JxDl{zHB0@`xuXSIb*C$G%=ZX;DH;TSXs$FsRgBEUO75*QF!1IWTFegqOd zQFuHx0SNwc8v+_*7BU(DE+DNH6(Tgp2q(I#tHlF?w2(j~V*;%ZpxuYZ;~YSl{5?Xz zDd`ij+ZwDEGc>RmhnHNpbAdaUTq|1^{}(k99cx9;nslG zU5K+JaW_flVQkFN$RtbS3Cs1T{PvyB+WYp8pA6dh^`&+(wX&~q$It&#c<99c_L2YT z-~HZiMu}_>I4Fz79Wqn5m)U>IZJBb#)nZ4CSm4nxYwe&r1%p#Uxc)&-6O{2~DQH{E zLX8&xv+63(-DtZn!@xmtgAXwb`X*GxSNuSpMwbIH!4iWS>lVbsY@L0>2EFpPFt=YZoxyw!xSKBOrGR6Wo$6e1m?sTd&;-rgFSVGqH!#u(nKqAjkYv3X; zs7;tOG9z=1NUBDR8$}UdcF{Qe8lV8FN3~iUn=V875eh2N`GR<=LTY{`7~2<^2XsM_ z0g?sP289gEDNZv*697vw*s+Gf>D#mc+aa|eA<+TZ2+PQw` zyytGD(s!#ZneC0ud}4iW|LI@(we3RT zpZ)V6{KQ}VDa6-@h3LN3tczEP4rsufh?5L`(*fBzLn z9W;qjldazDA#PNA-N{AYUVgnIj9iCd@vop$?%)&tF$_|Izz$qaj0S%YEaD${qBvDz z5Jz(abz_9WKE^YFmrb;nuRY=3Jd=uA3@K^o7Nxw8*08HlB;lc7L~YOdnB`+dD+em4 zCNYp`T4^ANz`~lw02}?lwr0byG25t%b4r2$NNos+3>MW@-p)9e%CzGA886 zE*uJT>>knNJI$i-LyeWCqQ-yF$Dn~3s1x~4dnV|gaJp|At>0P*GHaLn*>E$L30`&2 z>7V&uZur|j@Z&%7)h8asd%Bi%MVDZW>;W-Vn>;Xa;0Ri4gGQ~O(gqhu9AJDWl!t$i z)0CQc`m?Om;A(wt3jRl2yU~m&1_^iIB41_31>6GC2DRa5`p|C23+Yv@6)dh)sUmpw zU?O0Vkw_xSAi5xTp=7-Jq<`btq|?R19$5z&L8s#Nw^KUvmR&4fDeO<_09lr`G=mb~ zXh4Kx8KX2^k+`a65l?X-wU5a~Hq-KbH190k0syHP^YGkL4BJOCh5M$b59aeFx07gZ z2-gO%_uV$mps zafooN)Z!{3mml)e25zjJsYdJ;uUL4#v;LgZ?y}q$g^j?gyTLd<%J9J&qfxFD(@svE zi@ZT2@cKb62-2?0>U`csYnjE@(X(!6KJv98NPVPf_0h60AJnEMnw=KYj7zTq+v;ap z2cs6i{5$mk9WVSRqv;Wv_c=-h>AlJ}M z-u7#yQq}-q1&Zqc{~yC?Y71R7jR55-&dCD*(YH8{_^w1TVCp0clX?}Qh|}Ui;(iE^ zvt5r$fl8!8z$S*#M4S`2rd`MdH>8-Ec8i(b{G})S<)>2|<*Y5p?CHq%dW>d033zt& zZYheUo#3^#Mm>>cra_0TW}`8rT&C68|3(?)uU;K_Xf2((?njHAPRn=O(hcAY7;rG* zY1YHu>-NpwT`gC7+o|?8^GUh3Lj9P_1)NEl(Y_i)DW3zrAR5nQ9gU*c1;>{7LNeNy z3aXrTQW<^fX7h>W_J)%~waSjqtA2NXxmxVI$VEDXPc_u2I%q&JLoQ}r6~oP&jYk9$ zO|vY_ZlOJOS};8P&V#C{E{b2`X+|M*lCwU-(c0ys4Q~u$(g|wB1_v~b%~z>~^>7K4 z_|LYtZZiLja`h-vbHWCD7DUMjH(TtdQtN)O?s}WOrnV(JsbV@`&F31WQazm+?Im!; zGRnM^UJ56c{r*De^dyW~)2b!a_OiZ9mV#tfq@cP2r;!J0ENd*I9_AF9S-}3l$QKQ} z1~IaxA{dnmem%*0fqsBaivyoVz2-@;^^VbzTf4o6AM~C64P31rpS|^;esA)YJO2G2 ze(cwN@1xDg%y{Vwke1%i5t;GyTeBzn6Lq1i@5$? zPP637!Y5;K1wj5HjRM&p=ka zB)iMzT12D9(W*Af)3t1S{`|w<&F7Pjw#GpAI820cup+{?fmt30rIj6zmcBdRIN;$I zn#qF9Js>t30(`3brw=7SbBGjN0+(+k5|`FD*OK{ug82#4KpHH_`t31i`>jU~pUh`V z+cyiCNx;fz-3uI|S!t$HH~ao}j}0AeE|o54a`jT7>@Wa&8Q)L!Sv7!B-E7aD$QMev z?Ck9L>{{uw9CZ$}InKP_X{AO+#3KyB_(k*cjI=bj`XVt9jZW2}EXWHb1mle+QJ}#% zjZd~m0}Sdv(XHXdX;f1vvoTJT02o4|uua!XxMp2G+6DaBA~OXZ$Wz0R2h0#gxx(cx zCu5LFax6;EglV=H)lxY>pS$iS=KI}cr`K{^JLy;q1OF%ePPWyow477L+KGIs-VWI; zS@ZluY+T4>+n%>#?Wx%v%+Dyz@D^pug@(?Wq8wUT;8GE2S`bRu#eF;o*Mafzh$t3S z&!H32i9rNdfizNGsrr0j1Pc6$*BuX9_m`9R7IG)LSPy6Xbn<#C9Q*bMPyO%*UTm-a z{J;L$&wb--*xAX-j6CUX$eKJ&E-6nOIC%254iu9nXW@ko%Rmwt6Y!GDkWLi)pn2Li ziSv>KypS2ObnQIEuYR{1D;l!PLC6I z5a_Jc!6`B0@dx`4md!Am@^Y!(wHLqEzxiA$*^^cz&15=_gpCOyVkE{JNP3m1JMOsm z!~XqTil&y6-!7 z?0CU1xT}>C1!Y5Ao75VYyUt_Rm!4i;UZ=N(;MEh7EGQ>av&G!0@y3a{tBOY!Ci$Sx({L>Q!23@@cGSr(3;$uF-<3Q^ z$JNc{Uc9-=UW0Kzc`Tcr2om@&SxrVSwwnu%&*>SQ2mmHwTlH8FBqJdw6X*!2@Y&94 zGE+X0&*Ac(gA$9bb1+|C3KMPqYvckL;AAkR*C-Zq4IMrZFC~aHR1=1A4Z3s!+Ny&M znko)IiRh^dn|i4S8HtKCn?S|~U1WlaEbaQEo_i|tURBN?3i>1MP9dGXnpM2zFzqz!%fkl$76{s765{*8Qi*pl)PL9nU?9vlJqGV2)fF-!>$q1OI z7+8M9D(V6Bk7~hbgNSkT;a!A2xYUa3@|EISTs9P*2VMLewbt` zgh~phtT#OGrqgHLd^(dGN#ofyb*bII?zCh;W4nH&z);5Ej=LHZ>mK9+mf~3>JmYoK zVeW7;S%q>FiE7}TC|8%ZwsBWxE2WB#)mpVOljbAC3T>!L(&`x7FvRxcFiRXI*~1DF zPxB~_5H>^~h{zhs)Wva%nwR(7s^8h?gm+bncPDa)7u^eH(G%6`vkJy9 zT^!~ebhC6}AQIB^5%p;cPV4C`UHFC+`e84V&Sx?x#+eg!_%D~J370{mn($|%@Sg1G zkzBFpvTcQhW634fMqrg)&M`{}B)TmII*u?(BL3k#r;R{|-cv&-Msd?l>xXVVbw`QG zNeexiTN~dj&3xwhE1!A(;*E$^vQaOU=lC*4O$>%%c%L0?+F;=&eXkX`>rs2*+Tu4B zufOe6mYQhS5#TzU5E<98|QzUI)(<@Jr5j=Sh@HzPQWHAIpBrrR4W;Li~3kp`w=~}+D6{at>TQ@j(jBSt+M&NSB!c+#>Fu#Sh&^|FFvpk{6A?JqrDYUE? zgI*(B;S`>H7@!fJaH5GMhxfW3dJ3uFVQ`&UnwBYbpSt4kp3^_1jZhUaOrr)O52;Nc zcxnqRND?9t2Be16o?bG5R`P*Y3*5O(@~)AQqsg$*>x^Kpu71I}?d|V8`CV^%Y-8cq zfAOb3_vqI-7aNxil0rz0ZW&Wsb*rpdWWxN&fs^;7OQTp zNP`^!!vvB63M9>dy?!y>zIpYL{_<0qs4Wc$o9#mca#v?ZaJms}=HRr$n{wRSbG3u1 zLawLY6AF+dXyS++2Sx+=$Q~SbPUA9ou&0_iJK_r(wH7vdbV+_x3WEu!`9rrIef3CK z_nV1I)g2!{v*rEHpMCypH?x(P^vmO8(}$1Va`Nc0;|C7Rj!$tgP|)wSUwHBA7r*lL ztC#2dOvH2ydiuJ*@kh@+cXRr{>yPd$CN}zAc3r!vzI(WydEM;D-^?$yo&J2cGg2%u zWV2PM>$yox{KaMB7d49pb#dJ8HALeuP{>wnE+vQ`6k;e=JHT&>VBAViL&oASQEMz9 zQJj<|^mlBaZu;I$w*|9~mnZym_UgvkI!H;m)yQi&*|Ai*Ud%HPVz1O@jo#+~(GWMl zZT8*JHKO*#A}7kM!fbB0o-g1f7V)&`_NUU(6&HtKIn6#*mW&nrpv^9h$l-J$4TqB2 zAqm!+VP^4|kvqegDT?Engjj>>L~bf{SuP)OqNAn4v3zAViuU!}l~z0D_n2esd+@bW zZ+qy8=8Yft7eDdH^%q$XOJOBU!y~>hE0*z#CJ&kg_aO%*BD8rsQkV(PT#Tn8J zqlVJG1PzdbumQe7Bmwc5rY9~Tcjw}ToQ6S)y7TF!54&mO81efc&d!T{dr1~1{V3Wn z10x{bnILIuW0j$SX>k5AdEgNT*vNwjhxAy;9xO!XlKth&kG5By&Ny2LeAx`!q_KwA z?u>+keCTDJZarcvT6kxAbS{-CGj+q&hvY`don~VSR&i^`l&O!q?rJ4lsiZ5VDnxX1 zxr^|EP(W5oDF&u@N3Z_i_r34T*-Kyj%Hv=7(r2$c`$Rj;`eElYON&=F zHoyDM(_@LPptV&=M@7H$;6!z!)qZlbdAYlBuu>jLItXyGXJ&AS(WbeinmtBRj6*fN zwUTj4j9B5;_=jIeL@Z?Os)pASe_~pr4Z}ZdrjY_>60;#Gp^{5&yPXVUZa%fvc48FtdfT{(fN7Yg3Thj&01WU!0R01WPur;h zHPC5%2G~@5u-(mls~Z z?S!8xGF)Rept%TLEPc2jFy#_lcIcM+ki^paLEhPVRvR4l}huQ8~ zn4FF>oWBZ%f>f!iGLBoRhkKz~T%t;ONRqJDDkLdOZwnvmB<} zTYTMA@%`U+WWrhL7wfIYvETXpxlcYlzm-2+ojm%$Yu|X^t6xU@Xu1 zx5+%bpJWx+IkG=JRy|%yXYar7jz`X1`2COnL2v0oub+6fx4HiCmwxoYZ!720{^m+U zXMhH;Jv_7c#3eSC-0XEKl^k>T$m=7}YQO;{x&}Y`joUkBLVF|3_=Ojt+~kOzM8;d9 zgP7eQRi41SNLW;BMM!jHG-1<_liuodj!#aziT(|*waq@%+Sp>V)uCf@I`@p$-!^yf zpx4U<>zI$QkQN(JBnlZuqJz2Y$@;M`EiQe1b9osx4_<90T|28B;O2Wr(gg{4jz5}Z zn;Ib7yiCO+X}9u;vNoUqyfhquI+%^B{)C#Gh@uoxC&Mw0q0iF!co>d{!J$HCE|nVZ zx5iuj5hsBKDPCu@_3_sD=)+#?FFyZ?$65<4n!6dy%FtlK%&3;AJ@uzIB4;=v!(qio zPTdn`(At3Xc)K|nNe==fu@s<(Jp?U08;Wb;}@ zQhqVxPEXawMhoc_1~+X^k3u`a7|Jb6=+Wfj7TuqKI#}Bs(Sk z%U?bB$4{;HMo&%5-ukY0zH|SrFKYaCTKl|o4H`u+#sew*#tdxG>K;s+N z7MHg-rb^Q&Cd}YTO{Lyf4Ma23*{Y@NL7!A_{lvdS74@jLx^am{2gISsLWF%IKP8Os z8tfS}MNJgMASFBIMm@K%-Q4PK$^wM7$@W&m>AwEdp;t{cDqE}Ra65;BlmP+2vUmq0 zH4|N*oordB{n|sN`qt#%TwcU|-5NV!Q|zWqUG_Wo<*T#@E-X{7-zXKYb-O5$nJ2Nw zJQ4JYEN6u{{GrDuw=@bCli$!ck~acmfQTrKqK5&#HlAr zO(n{O_DJP=A$6v?@YUy@I>V9F>;q&*K^{`#N;KfV*|P9t0qN}M{^Mi&4gs3REc*U< zEVV%|#`1t))JF|4sNY>Y$Ir%)79QW=G_FBg2-*5?0cyjYFE4o>#EvuAiK2$%OPpqS zSL^ArOb4B79LWOX*zw0W08JGuVHxzus-dVMYPGkSRxv3~vrkVaT>2SzbM5kVcl}%j z*W8YuPL*BfG?xwkek%VKh?N7ZOWIxU%gAPFRy{P>ND!o(=H zL4GpohAs+f+zG@EQB%I(V{Gw~sYRFZH7JMOAA9rZ+b2?4*9+@2U%l@B(IX4de4Q|kY7F5AzOb!G5!64QQe3qJBLPGpcsMHsJ_>DVoy%CCPSBp;is(pYc z3W=e`Jd6Q4t?5#+lrO9FEw;YIoTjH;HnX-MuboJPbn*K?REB+zBkfH`;$dH)!t^@K zU;U@P5?xaR1U0Nzp#@1YpuX>QS;IuTTdr5tj&7^9x!B*ll1+2;Ietf3`;pV(POpg< z7&xseE5tS@(%xC07{@ON8b}U}7N?2LIMo1WGWA+!W?v(pXBRLFptvcJFEha)0YXHV z3%#*idOeZY)M?1!cOJ>T`SeuD+wya@>;BlU{lRDZg%eI@!s|Bw_ER6z2GI;2azdCv zA{1leX8+v73+EpDyWjq;-+JeJzv~CS|NBneGG5I)B^>gX6I0X0`~2g}%gxiX)0yx2 z;XnJ-$NE>EIon$O+cPh|Xa88L)yak~D{OboO?~af>+OD<(-?EffUPwtw$?ad4-d(P zASs+huk^bx3nQ53p8VIEn6RtCPd%?u2uY}%w6mV9C zDcsI>kIx;&T;trfx5<`dZ*w+sfAr21w^m$#eL2UvSiaV)jCC?)q;O^3@1z*UU0fql zEZi3+dhSd*iz`I;;K=f&%e}CQ#|QS*Zei`6Dj@acy#79Xs5`hzp#78!oA5X^M>}A( zXvhfE&tYWe^-?Inf`~1r`%~GY<*|vt9dmnQTbo4(87Gyll$mF5Rtr~C{$r~Pk6v21 z)CcKFYCy1*idsZ! zgsM;WAiR;MD0z5S8M&jKvr&)MlburGV?vU>mOj^BMMb;jAi)J~GpDyFJ!c ziI{Q|uaDsPx`T-p%6pWUMk7haGb3R5 zJB9kJlFcr=y&&rBOZxxK>+h?3i>#k_Ye#?W;}4&0l}2ahw%uTD@kKV6CZIS`EeD`M z931$*o_h4TT6yaB!v|^B zH^2FPfBs+Bx|`l-&z}AE!>=!JKpX7sd8cL?%WI{zR?9CitM~Dbo5W>5MjYToeLtNp z{)HmEexaPi_KOt(JL*#!I+zW-Qg`8ga7nt;xS;){5gL}hCqobqK(T1*V`gZR6@;!- zmi0@fNg$26FGJdMt6NJfctq{}3HOI?pL$I_NVZmz)v8mSyc(3hzUn`7ZELmDDi?Bd zBb6iL`zPwI-&)IcI@tgsXYD;Ixa~W}tJm7&e|}@57ghRBW*ut-)?^qu{iu;njyu6k z^vnqE$Q!!m9m(9~GuN}s)K5y_w0;L{gszh;S1Kt?s zV!v_3VblS9FNrbCNO3Hm-Hdrv<M!qMDB45X&Gtfbg zh<1og2nz-ULK>#MrBY#aakbzCZ@Im3u;#I;v{#w>>+|z}_54D4^0ix?cGv3^ijYJ~ zUQyA<utuOxWe|q#&fAE%fyzW1J^cO4D+&}#%_g!9e z&R*C!b@F(jR#;!U{Pr8Q1_?K&8LO?Qp2#87Ie4l;NO+ zy?KjOzQv_-_I%otN+s*hzUo0wVn|g482K>)2QUYn?;s&&yFmZ|KmbWZK~%2Ji%S;M ziT2VBXLC6nwJ;2pu*UjKuYG8-`7A@hh#f5PF%a@%h;r%M0v zFaM^SnL%N~hQ?&L+3z+PKT=7Qj)w}x22F#e6voAAvQ`1ZKFrYWb*Cq0-u1pWeBTG& zed_ddzQAM?Ds$$hlBLqfljqyx;miXMz4iQ=XWQqRpF4NqEhi7`OK_4W_AT2dMrvDI z}@7Gg`@3tJyO9Y9iMrRUXi*$EI*PZ1ve14nQZ%y%NBsZ549~-@>^5 zBP|mG;i(sAmo!#Y*<`iET3?~r%QU@2$K~K|H(RYOv^(?b%ax$}z~Ri>j!joRw?Df7 zQx}^5*AwS2I@xV!Iw&tF?r~Y3Pr-`26aFE zbKl!q@#e2=f9Cf-j%{6p5tHotligkqYbzo`NkykW7Hr&;DczZ`jrN#*VcU^r-MS|# zVv|^Bv>46J)(eGHufL5oh~~s#G1PI6h+Y!hS+vCaZo=be2c zn0j=2+0jR?Zk=BZGoy{Ib~Eg*2R-yL7#`LR9k?r-8FRe^HkLUKgX-fWi>e?zwj1T} z7k>7q-}T-%RHySCPGf30P%ifX)ONg(nwu_d1<};p?5p1R#?M|mv(;%nc6D)XvYy($ zne_T2dH=+CdClEgPvCsYo61Mo$j@UelEtEvt#^Y-8ae|pScb_x;*yW4Q3mZN4k0*g z6PAisC^gv-9jPbNc+WN>_WrS(2w{y-7L8H6f^v5>U#~@l^_H{Uaie_x!t#x<-#%Rl z-g#oSf;XeF*-t!u?Khsdei`q0nFEEH)2DC0cXnzrm(RJW)K;&5;lkO=kA7ik`}`lC zyNtr}`|mlC+P+Z<{Yn~B(*CRFroK48wS+YW41wMwmknBeDHn~DGU;ZUO0YL4<#e&~ zoJ@NSB)n|F%cqtz;k?&5=^+L5^fb0anr-jWqh&oHh2KT zM0)urp_h&#PHZtO`cAZ+hhZ-I9rDs3>}5YdWFgjX?t$v1(RMPn+K{8_s@?=?r`y5I z5KXLhZD=HS(yfi|#*5p3_{;x$`Qz;+jL5Itlj*f&<3s$nY3qErjEig(~6SfGYvI&6|B&V1UXYBVyIV_DW)^KW?A zHk6%y=fqs8il5N^x4;O18#wC7yoUKmHq2I%m3p3y zi?WrF)uyzjnv59D7=qOf^fG8N(F&po!2g>F6q5Hs&WiIoiT*aTC7j|VFayBE7op(B z&4osy_vVw0nN-g$&V1(L*8lPN<;zYzEFP|(eD%?jujbtQb#^jz{9L(|D~#X$z_C+z zy!J2u@VC|$zw+6|wOV8GyH8A&Hr5h|f1x{*i|&~n{mQjfom)#MDc{ZENIE%*eTmk` z0NZOtTW6CCYhf$wZQt1H&-a@vQIGR?Z~??hItpQQDR7RaTi_DB(u5kB7|;y2P>)7< zaUOF`2FXOeKDGa7u|AT@=UB60(k3~Q6r@)QaKi;wH1zRB*I=rq9Bud^g2lBLi?Qcs zneZM{_V8^df|AlEyVni}><01l@^l(dUv??VD?@i8?R+BM&a*x3$y+sGuH-Tx_b;RjN=@%C1y)mqrzzQi;ET?6wUI@wI3{oU_> z`y1c>K$=3}2hBbQBrlu-y6Q+*7tPfZr{^a6o#Z{QdCS8KXU{b+U23|g(Q#lX8FX^> za;1tgk=d%}(|2oS31&bWgyD*p$_2Qy%U5$r42JMGf=?h(FoPSiuoi@@D>mwY=icIN~6%2c&DI#H?ho9&J5)n>QDX23$R@ctk9sXzMd&dnQ-{N6K{_Dwck zTOP}_*K-KKsm`|@9=UjJDT{cF?{(Qp`ZE*tNeucgEdU>z2iQ6Bsf&*TCk%r?iCn6! zVu*$6EkqJFbRndhr6cSli5-@}CRk#hEE8cO?Q_B9>Bz{~{_^N_kS(HgM*n0CCgKzA z@gpShquj*0{2yFW%EtC5gMh&&g%0CbE^#UwWcZ*r`yP*MJjVsSgwuA@$4`TFF;Kf7 zw7BlUEgzvkBQsT#c@tsDL2J>F8b5AfBv~EL>5zF& z(ZI`F$eJO;BoU;SROWDzjh%*CE6I?mCg8gXO%R&R-esP~xW*C-pXd_k6xgd%WUuSW zwL^{M-N&bKj<;T%{*6C>?241`IkWY{cfI<-*Jo>$a;?HZHZ@v0cH0~W#XWyv`OL*D zoo*}Pl>f<3{>&f$;!kaLJHPeU-#Gm4w-hs8(RVZb=Fw9Aje+S1ICSqI(C;TaM%R--cFllRtfCmGhnr(;KlxlDp0K*rr*y@OKavIvs7DH!n6dB$5-^I0jfhe1 zvB6CHr?JU`P}{EQD{vYW1gx8#PF7AP^CO{zMsmUS4z&~31H}w%R-PP#pSlPP>b;rU zVM59>4zn`wi!7JwjL)X>bssl=XuKspfZ7!2n_-B8ACL~pvpgn$B)k57GY%P_m`J&ig7uSYRV=K{R%36F@rlje(=cLVbgBP4qYM+g$i-1ECDv# zHU{7fw~RA0QAIvHbo=c~Upn)R3k&a`+gF2TQmFO)dKqW-iO~#;w)D$*%Z;*yU}Rq* zk=stB*`+P{$q;Y-y_iTXVTe|9*q=&NTgKObg7jihMPZ0wO2sf}bGB?Enkb}a3gOZH zleKKrFN}QV#jP)|;?-+%;=n!cdC&K-iHWty_2ny@eP_PqzTgDMZ=Ft*N)tsKs)nuZ z#_9X-TlwA(eDOd3+J+N->WTCJ?E@!Dt!*^3nNs+wW7D5oTcE>3$(c!o^~r2%h0%q@ zc*a{yz1bTrE*pXjj8sC+yF=xgS6N+5M%1{BE(D|1YGb@KHkrs*@y$p^=oRB=)JhN3 zjjAf6ID1vxbd;*R^;B`TD$x=UJSfQ`Sdj`L!jSQJwOIB|u}G)_bnPbkmSdX0iesy( z_GCr)&buP%+RfQsL6Cj1^agJn$v(ze#SrK&I#Bn)580TEr3r@5LW}0;k`U1|7MS5@ zlR=ApC&+E-AfMGpJfq{q|+IgDwI6#CFfF`wMmsMqlTj3)tQZA~WbVj92z zqauA4xT{fd8op~1AO#8NAqAREH_Vp`c#yAEHIMKL`Gv6f`DYjV&KNrpvGE@%Pt#{J zrN4Retk=JiVn}g%LN3FB007Zgm@pqg;8ErHqn>oVj1?9Kr07v_SpDe_4(}hEUt7HE z-g}oH`9^cz|=EY&p4+Kja50YBa>K4WPbPSPi{IR zQF`AS-t=zfhS%pWJ@&*SHcpvvSD)22NLTgpAI ze2f7Vp*RCJ5;#Ik9MwMR#ydClS8;ZFw(Aam~;y>M?bP&UUkwk%p8ApKkQFT;=)N12dr^s2E8?AXL0X%0M zOozLta^>4IrHOu&;kfS%$5TMaQqyDcKU&8eDw|GW9Lxxy^G8%qXdT^wG>s4vBC1=c zrJa(C3vUdZG|Fi(f^gYwg%gmJ8+pY#yMzZ6|y|RqP+eA<)beddM10%kvb-teU>aBvy@+`vy%&rA#wl=Ch?Sv<6@Na z-uAb*809?1IJc%EO`HV4j9#Q2F)Ef=#gqoW3SqrW@6>ZjlV3i&bU8?NoXTrn|F&E< z_4&_#=G+U2ksJm+jUh>mFG4je4GA|cSB1rF zJuFPIlxp}l2#*7lNdMH058_$GIPXE!A>0~sbqz}9Y4Al^f72`eu$%tnktmoT>n8Sm z+KKlZT?;J;bSkslrH?ee&>! zRK3tRRG3Le9Q2;i)^|iISPW0#$Q2r}tZqn;^#7tpBo}m;_}-^!;7~Py1|(@g7$^z_ zIUr$OI4U?!rT)ytb7&`7074oZt&P^$nbzyBtY5-kBOXeS6{!YOz{o@Mfiov2m^e%J z9)0w&+wVF|wu9CNCTWvx^c3-+mHB@edk-+nj_TfbpPc)g(>YB~PfwoFj5N|HAc>rW z1Q<+mAY7i~GoQiX8i(iShwW>B_kO;P7`O)Gi@||llEIiP1So+t8imp1neLg+;q=Kl zyx)KAb9!0=?7OFDpS^2WShZ@^s#U92tzz7UNHiOZ`J9nd#9JR6-Z^vi%IT|R6oGzL z5!rw0ck1almb*31m68_*Dj1Eh+5t3Dol-I3RU|4z3h#zh(UH}ZfNpsAli}9dLSzR> z)E*4c(@+FTTLa550~E9nECV>jPV`&nF6Ny?AUfTjOn>R$KEAei4yP;;zjx2B$GaD+}3jwB+9{!lpK_}PpKLYR<637EW)xE>;(NCQv8rxt1zHrl8AgeuoVyW}fqPv`)C;jJw_cv{AcEc& zpc1#gZ~wII`I(Vi2)L`dTt6xgzPfo^1QA9Lc>P*ScW^ww$wvcteKVtbl&M^4Y@QH!$U?Tf z56uh%#gXfeH@xxFtGNQ3BZDy!9TOM2oYp5a3&jy6eN((c4NK-C92LP|_fp_is6|th zt;;@bMdiT=k4_6d$eXPUto3WPg!M>vy0FvCe=5TfYJL0n9zOZ#gDY3h%9}yEo=isn z>H~i^aiAZ+w_;W%f}=o2-5LzEcaA!H$CJ%M`Sovjd&`%uII(X&HR~G~*V1vYJ{)iD znu;O93{0dPwhYD4@>@LsK@Aj0j_n@Yck9>0O6?0~5_ivf&T0 zl;O&dFbL|Z8X3y~fx@l&AgxIkbZL(Ef!d6xsLKdZF7CRt*p23*%Einxf=II+fnD4I zDk<#hfvzuG&9MDhADE45F7G|-G_Nj(j z6V|Z$296xNbH~&HHd$!9d#BoLuC-e09w+Y&aFXC=s$IM#Jv3IYC)jksL599Y9eZ-E zyVi6x5Zu%o4dJMw9Fe)T>vSrdfBSttcqCw+f^>%QL1wpO5 zG3K!}4W;M+3GNuEm`)Nr8-exuvGC5N1VZ@s*KVjj|KMc_xIu}SKH}sCF#z=q>y2oZ zFqsL(?w`$Ia^($AVUV+M^&)FAn5^I^?AL$emyh3hJwU*qwuTT2Fo84xNSr*gUS5U;v3d}!heM@3GbxmfqdWT9!^_fWPwcZAc!Rim8<;#C9^BcE4Ai`_ zYA47kst5ogdacC^H8Swf?3XwCo3TqcCxf$AtA%D=U2NDhH_|JJdoO|tR0XUzx?iq+ zQ!?d4oz!4I^wJ0A$EBa{qnl2J=x=MDMjlq)wrE?aEsO0pw_CU&maUt&^00gake=+) zH~l9&izcvOIy~!77%~A!eZE<#t}Ly!i`iB_8x2Nk*fXINAsT+*VdgFT-8YAw@|bU9 zFjhhFjcW(6jcOgS4WeK*D~IiCARNTWX(O6+LVbAuV8w_t4dhLoI&mcmCin-}@nSUxQSW@Q=UY)%Yyqa&r`rZUJ3|ANy$|?N%Yx=ihhm@cD;lH`?J7b1Mf9jIevJ?X3(= z_3v155@RVR6lSgk8==pz50t7hUP;HwUUOwi{Uy^&SeBsZf^DT4Bccxgu6U@Sg9vW5 zw(8k~(CWyGJ}VR6Ev6ftkZyo+M5~lyU5m2y=903TzkR0Ky`_NYH~D$F^BAA9_XH~hp~{`P;pclW^wv)eGF(d8?2v*ufW`FCfI9KP=8jO_>$hGS9B-~bkR zsmh%1DksxV#x=UgBwgzT4fb^Snk+FR`GQsPhHfjk`0X_Vb+mF6r*~QV^j^BHC1lti z$%Sq{Ya~L_Wb`DyOmbWEW4*a)< z1|5?lslvt*`mGnf^o38KxVKV^oV>XF=38#;tk1PtxKwS#(;iL!MvLp6r&g9FYKZ3M>is|fd0loXFFrQ z<5PVjcyx3!0be~#gAfTh5NjuPD|`F{gTAR|yj+cMZZ=mlg={guaiKUgnjRXA1u=w2 zsewc)I;0Bze6EgbW7(rH)&U+yN&3|C#69h3J)l#i<4(B0RNl~1j|vLLl+#dX=lg9|29lyX1g2|n=9!^duY&RgI1rZ>OkjWhdaSjpa8 z&VKXD_x;cJ{lnRX)rqBz-~OGqV;iOR;K&PqCzbH++c){hBb~);w$_QUQUFNo8pl!} z#)Ebsl#1fq#D)!0fzfAQJ&N0E6-6-gZ^h(Im;HceW5e(q#B63c)QZ8mB`>}uU*FeH zEp9sDf#Io4X3=41SzA+6s#+`+;dFkMVBDq^P7NIQM^xY>ki+XG7}KrKyY&O_?Z=Jk zV;2{y9ySI=I<*2OVKM5$F*|;L9^WHfkU*hS(JBQD)4;|WnXSSfwF*hosn%rg*8K-D z@T`y@@=B1h*}7DPYnQTi1B4plJ>#q58O6Kl_09cm-NL}LCq?V#!}o4a>*cgn_A?&b zvaGN4YNy<{KqWQtje6-JN~)O=W)v!kkyJ#1u%j-DVF$e@x3;!6f3Z{8q}i}MGzGg= z4FOSd6tinGK?s+2SDJlE=FN!H+&7qFE4#mq&5<^qArMM*<3KT5fhK_kt9{GSgnu9& zni@^!N}c6QeLbHkZmv%39E~NJ6VYo~FJ;W6Lz5FD7nEi4hk*$WJ>E+Hn14r^^JAG) z^i|4uzMw3oW5Eb^5P@JF#W#IQMpm72z4$jDeE)mi^Z$+vVWY%A(E68;eFEQz0L}<1 z!u3Ts-T4C_{QLKR_#Y-`_97}5Hwv`^^R1K<9AuG#p*hBQ2yc;1y(bk9?V6f;5ZMx| zGrBjS5Wl2k58Ilt;b*f8kh+U=pvf*IF1Nk;(tWar?awapbX)CO<5|-gr_r8&GG=i0 zTOlnU)|Ug{xpcPS8LbyHa%aw1+OC_Ojq~w;{`9Nvy89$CujCuJu$n^S>e@AKcc;_0B@5&%V?C!u(KXO)byfl8Xr?rPVOZe<^~#Q zwWQHyM{Y$#>{c*$@fPb8;Lw8g>4#h{cK)Ln+Y$-M+g`Ul{y;DR7F)oJfQSnqy-?oF z!gyN_+a9+SBO+5urRNeY_j-9Z$ZaROm)`9&CqHOW9#+lxMN&*JFvP3Z)~_z-mX@6o zXYjD8jByO2K`L>VK9o|u+C2BsWl6{+i2jCN4vpe~)0s)*b|TA;FWdk!U$+w`@P?oy z0!(cJZ2|&|ag7)n`EYPF8Ojv>3oE&`rKMUc(Vt?dQtzbyV~oC8l;J>y<({oS=LcF!2l@-q@)}MJjrrX4dBqeCQ(|{ML8xzx}p55AVP3-02ga z`s640!~%snwE+ev@cD3W;ai@ihlRtD@p!twfK$O*wjX!BC>5oS#51IF4Edem!C`it zR?*=Q644eQR-qhBfTF0g7RleeAthbZa3Cu}1B}2>!r1 zFUG>S|qb{(|n7(Zwm6g~F!wBhXK`QD2vAqgomB z1a1+o+L%Y>Z&fwWyRQ~v5LhL9sIaKLn;YL^x_P)C$hylaT-3O)3Iz*7i5tyL!i!?L zVG7cJd$k8eH3$KmlnNt&Cg!P|k3!sV`_>Cq#srg0^E^dxQyVl^rlNBhKHkiBOg*ok1hem(zDGd5D*t2+zFb5WU09fnDBpys~*cH5SR? z18Au=k?>r&c;?)>Q>2FW*>^3)yd+8HGwRktxmMDGjdmm&n;xGyNHw!77wBKZ@pz1m z#9+cmp(Sr|r~dvF>vB*u_R^9{>HG|OGJB}|kb%V)fJg7vN|a&afL_$NZY%QgBQCcA z-L_PXg?;;VS3!gV%-Yzx=nG!BTr8o`#j?AGv>uC#$9LcztS`<=DR}S}v0x5_njjeoI~w(J=1;x7zOrHH z2R1T;Farq8Vzcf%fommpzT@>hgScan8YfQJCUV+2qI&!a}LJ@ZbR$LvlZJK%|2S7H8ggc9XVp7U@3e8=N8wRPLx_QECYomPN)Mp#DkNNaUt!C zeC#8C|EjxR{+idkP#KA#SU->rXeVE7|N6Us_vtgI*aC-ml1O3fD`(#&6j5*@@nM`( zu%r;c_y5Y0dYb)dH1vg{Dh<1Es&5sd%21+!*Ntk~2VQ%>Th%7at))@9Qdkapa9=FM zy=?_p8Qx7CJIv))rBsfpAvbnmrxissPi+IbVn}J8N6=onIcD2|vG42hF4955F z8lBlSy>I{S9XrQHCWi(`2m1OLo~jTOQH8SIrEAdlFxq9$#Hhkw+ zN=S6s;614;=hO<2BKjk%pS18N4%6E zAdG?u*<^uap_IC*5>{!RR28eATSfcgzN=DpSv_@g<8HsZ5rhr(5JgeEZn~}HZZW;M zJ+vyeqNsT+@2&iMuqmK>bu}V-BYL-xtrKo2LsE1@%}sAC0gy-$5)aZD!Wy zFLeqVcpWwlEXot@FbVFo*rLz&%3UMz8}?0Kw|n}?k(q;scE%^ioJ10dQ0r9H)p~xu zwtl%?-3+wKGON;|kN9$AKx2o8$Xol^S@?u0>Q9@I*hR*JxYl*v4PJNI#mfco6#QlscnN1^@HbnbtB z-)g_D*6n__cl*8-O&QS7McN{4#XYy&aqH;Rc)3zqot^vYm%j1+$Id$5gvZ0y8s@0vha)2n z&p}4kf_NYluGWj8Xg^t(O6BDZ7kZcd(uKo}qV6anLKerd+H`-7l&#usRd^HuyO-+3 zlln~evG+xx*CHx=m!1{gjcU1UCDVgjaPKn-l({YeW<>7>xG{QQ^0^z2Xe6PhZ7+|= z%E5&Py0BLR+d?h83tab`B5z$v!J62{m5a5^s?)@&s01zW#Qcj6#^ef7aPN5H_9Hv_ zJ9c1bVl<|uevb8SKUKf_bPJ-b6mbgJZWc7fLdn*`6(>%FDFR`WPH3uNx2Lg75W>*b zDw+=>gB#)|iozIYnE7as>G;F#ND7x`I6MnQB9Y_6k()-GT+vz1^{>>{t`_t2*^Tu& z!b)P8BRI>RHbbWgF{nu~?xLVdB^tsqNnJSrYv&#f2pCX@;aK$A7gl{sHHv+YZnSCQ2!@dcA=c-?#l*V)tE-hSgr)LW!HfR&l(mMZ5Uoxtso4l5XDH zizk)_bT!qpF2z!t@M~ptBhWUMFZUi$ilM~x1!h`7zdxH@uVt3lM+iE_l2zjloNaG1 ze&>;$&p*EZmZN);LowE4ipBG}%mt@fz&8f|rN|MkEhit?+|Viv1L|N_phPk{0MOcl z(Y6c;=!EWEMH4D})d;7PV(1*|d+g-x=pYenhMW0T4JW)UZ-{;SqtW>IK>W}&&R;TT z7H08h>a9!;$AdV#V@suKPPg&4YfYzGO{G(bU~H8c28##?cW9q6NAf$r`y2n?6DJ<} z;#WQs;;=Cm4A|ACUZG}?oa16j=mW*T#!wX)ojB0;q64UwO6yKN_uLzf&rJ4VnBk%m zPS4B_E2w;K6N2M#Dx0LKS#cwTM>z5(hBbnlJ@`@n)&|`I6#$s_#hTBpjet;F8dQAb znHLR@2A@lpl87l1Y#~_$aKvAr(waW%R40w4fBL6?d1&_`zf=40hyN*`FX9IhO)P9w zgDgIiykX=$9{LhvL!)~Z*EVbQLM#-G$5A068p1Kve!+0C&2c3Z416@D-YrJ$8cFDdyaY7wRtHsVt8Vt>5~f?fZJ)?(>$;Yp8$@jK zRvKO1U-yT&y>J1pSKbAKoB1~ED&DiQwlVEmdiP10s0nzpGL=Tf^P)$w3agvq>679S zq)?E-00q`N>?M;%7*R@RRJSM7>7V(rSG?%(#Avt@+F0wGS_Go>XiHcSz zP%MZkGx?L(1t&DLd**1lT#AI7#moYh6F+|U-68ZfteC^RsTv5w3dHZ(*vRt2kxoGx zLgFYnvU}AgkR~KBNmG9Y0oyKNM+j8=t4XYV+}3iNj?nH$`wnPOtAfOt4FXB3$`pQq zR-#hZYBHwQl8X7{1n<4~Yj?ir1qb)-d*plHmw}wMhFd5gX{Fx5Io{~OBQK4`hqL7q z#X^Zi6g*%eX0WKiXF6CUjIf|ZIe##$kuDHEJ-0$Zz+%jm%}?#Z;>F_T`r!2bto7uweV7IPPVid9?hW8Mu|58%GH( zvE6#9tz-1kZU0rbu*<@gcsKv;1*p>Y4kFOmM$0VUiZhAtn0aq| zc75$HKJw4^jU-+$HE<|^OMpx)SR2|E3-3-l<7qtZOYrkqXOpktCf@j9u3}p>rYM&O zok*x|CRioJiLd#hP7wF+=}u(G(?9O?Pdc$7#~;;d5AkU@kvbO0rB1EXsb<^QC6w}B z&g0|^a$G*v@(8<5y%>lDrf!^ec28$dpPgIU80=5P*m{bhqE=<9=^H&bJ~P>#zk(?v z`!$$v3=HoW-?zKTSt(BI&`pPm@2_bv6qC@}wGjl=fHfsD6OLsVCt(f2TM8oZ6h z=*+J!%Kf%1R!|tjMiJ`xpmyPN%L&cwx_Q^k?Q|`#=L~Ej0>YwFV6m`q@`*VYJf_+J52HmiX;%wtS1-r=2Yk`EXh5|vc*SD?x|WNDKl}3!3;bbm-0tmW=GMfG)rCRe_O$$fX}Ri?C9?;$nd+s6;${s) zRrF1FWuX5&t8tjvz~j;b6Q$&6eQh3OLJ@qE2;_Jc+U?w8_R?bJaKL%)P-K7HpIOfM zAJ{-fN)7~)JL6FtzK!%btSqxq23$Dob=VYUy#>w(8PNCOxa5Xt=#6pa47;D5{uyWF z22bBa#~)?S4QdPMR=~-di(El_(Dw&1utMjK{*xJ21LttKxOM8AP9^7L*PQHnbA7c{ zD&r(Lb^Gn9a^cFO4{a=O4kn@;cIaF=AKP{Nfx}at?_Smb-NYYjbTBnKKfC$(6RXA5 zD-S<xc;S86r;M3tD99DdO>^4;^~WfdkLkC>D~*!0PhFR%`W*Kl#=X zrl}%sk&d{OovDi=JhQsWS)qf0V3^f@{G+5ItVQ7C3B`&eXw{DFNotqcfB=GM3ALDE zo$R1xbvAKxNhDk(>ZVdGYe2zCG;2t8D?Q1EAOCeG&ap*@Bn&nzsxvp$#JIc3$W}gW z2#4#b5cG>3Cpk8BFdQCdMPiFyf0!68>u>qcNd_Z@<;)G*K{60I>eYbD6a@~bfCAe7S!NspwgBpamw3T7pVyLNA1%*H$#Fx~e z6-{3-6hC(7tDCvi)yrp>uU>4_^77J+f(bV0a9onJ*6?0jY92{>ZyFjp5bzFR8@^Uq zySfJdWMGR9IO*v?O#HQF?@%{&DZbb>3aaJMpo$7te6g zgp1XSq-ZL@qjPfKY8ZEVW4cNPa*m@!LPcRS3Gr0@&742K+L=FF-dJ=78&kXXIA>3v z_}YD)b|`*zcE6`EKG83}?qNf>CmBR-J=EF={pPR!$s_lFBgpAZ+Bil}pkOEtIs`}t zA9gviV?U9I&fNX-pBNk3vr#UU>l~8iJo@AV9LM(hx4n+~0wZ-3xnuTHM^C_^(zV4a zixH1A5($R1?x3+8=v5c1kiGCE9%f-CcOdIj?>;oWi{4!OQ$tX< zjn%+-_|u$96pd$JiSvMHaSgYIXU0BtJDwTJRGy$08F<grOKc_A5S=*NVgxi_<6Tl8pTmgh%z??*tA zqzk~JTCoG`GHPq9gj*-WK(~TCE9$c^(4kQMH_X`gZX4LMVZ@&PPj1^{3kPbTtsow@ zUl5%OkHYO+_n`}q>g2|E;kK{tt@}tgFw4|jOxfeXkj=qnG#v6r*(V#p?+yE=CFgTG zg5*Mf!{f_!n#=jx6UFjwZ|8>o=)Od9BHd1~8>^0qe0A|;qjUO7a&LI(1qYnTcqfQR z5@-kFnAUojhA|(D5Bp>LoW!nHAkDE8n%P(l-8+0y-Cke;qM$US8mYl_MPGasyVWdR z%n|pUxapYm4DO9_=4ElEys;1&K62x+m#;qg#Q6(P?yanjq;*VUrCCLZnF#dZ3~J}_ zfqP#3mRcq}d*x!Wv}^({yM|HFNer`bHR5vyZn^2zx7_f2_Bo=_Xy!8gp6h;1bRGfksz zNNvalDy62-y}RNhb0+Z`u|Kzk-RkqKLCMAhcoKa?cOzoxyN!vBgha$T4sU9Ais~zf z2`HCfd5ks`Nwg}>EQwaK17$Ek!6lj;dK~aX!B9&RyCMtMt)?s+cg;+}&ha>xSzQV_ zjnTNTKNe(XpF{K@t1{uo9(kIdgr~_#ku0PvmRn_9h|8}r)Z}ZG3x$o1X#WVqE^Q?a z01|W=Ho&%x1QuYyqEojMZN+qnz`p+AO*kbpyZ5rb7Gl9a`sOCcd0eJlADY;6Vbq6G}w<5;#e@@ZzpQO_U6>k4M)9u zMjX6)1_#+D%77vDhK98m)>?p}{gGP91y1Np(5lOep8+&)gmwR*P-BOZl++C&Pa{%M z3p^8Na2$9NPI4pmVP5@S&TAmmjNS)&~0`cw}P(T)vczPRFWcW|e_kZ@pz^ z_YDgxnfvei`nfZYbMig2s!Fw3u2d3<)V^Iuj~zIkjEz;WKEmHU9)qjJbf4$zU;An# z8hY2S{35C~K`FR3*RSFvgp;eh!EcbY9f#}BjEg~u-r-DCm2VSN(E3#zhRJ71SNz;d9}q>sVNmc7DgZhTPEF<-DusnYpHvm|I=UPOeB7uaiI$8X14W3d`{yaH&s^b4W@099MU_185kj+ZZI_N zw9DQOI`pR-4ew?#g1m(k;=xIy6FoV1*QW2TpE(j8K~hh8{hSktT!JHhpawXJt%fFz zV3Z)Bt$y~#lcBVSN+xZpCDf@%{AbpK5Tp9Y8jCd4Re2BtMGH$n?8gs#r*3Fg&Nev= z00nz>?dsggJ(FWCU$xRK;`?K;KRh-%KGOfj2k+mxypq9HYb+X_m>5_7O&=DTO-!zI z>}Z`mK7DE5m%j4JO7ZHi|K`u$eEc9$L>|yEBas)&$@Bfm5$xa3J$1@kTpy3Ny`}70 zeiN7F{f$lpe*+T08OAW+Fa?1|Blr#nPQ)5cq*!dMuWc@_EMJ_jaCES=58xel8@9Yp z5}Hxn5mv{a*NKIkk)*S0+_!V0KZv0Qt=4R?3dTNkN&&f@POwl84UQf2j~u!3_&4BF z!|9P*kKK_9w9ov>BWQ0$;NVNUXko-Y&fP^Fw*SEKU_4#J`EYT))yRbsk(+P5j&hgh zuWT$|;Xs)gEWSB>9^afe-wH%GA9>_wU%V?i7I!*%UooGlR9-gieEgD=VNoAzR>oGE ztJ&;}#+mqWb{&nRmQrJ@r9obo7_1=`q`)qrccZwWhH970?e6w3wZIR#EOIaW885v+ zetSvv3ry}8w{UTS-sf%#`J-?j`O%ZTN%h1qg~yy~v0BB?d>NAk*kiLtIRT*qOBlUD;uW7su1EGZgmJ?{hF<0NS7FJr}_eYVa`v1V`^`$ z6w2&VV{>NRq2rYhw>BCNeBiV1`Os&7?@#~m4ZrY9xJQNMt6gt1G9`KqMrw-K~|VGRsG_l)b?tEFDt@ZwQj}hISSwh@mufyW%MR=1bR7r4AS9c=H@Nzsq+`m@^Fr( z)(7G4Ol72FfH6<*6Y=P%Enovr8CG3RwssleEdp~J`0!y|pE!8mSZ5#YVS zFuq5OZL;SD{4&hdOBl~DuW!uGU43#5uL}Ej^~=eE+K9Q2`ZH_Qg;IN9aQbcU_>KSi z3y(yCofD_deEqTSjHUdXCfs7N1kyqO&JXr28rb@dA9~4fYHx*}(a0_>qY^9Jdgm)A zcO+m4Pn~=WU;1&ca~O}Y9F`pkqHwO9e#$AXC6m79!UAh;o`x?`E5H4PdmmZ5^hgP_ z9L8sz*;CqBn>&3%+i1eLFpn_314IS{9jOCX1YEVUI4CcY+`HXSG$DfCV!wP=6uPN` zL>W+z;@HJ2mwUIzZ8uA`?Y;ZBJu-!L8M|ezTzffN?5?mt5~bpkx(M@8cwBMu@})|4 z)fEEujf`k$!7nlt_gA2FzZ&e6oEx9`k!=y)2bk56BFf6OzcrllTz_QeO$T>ezi)hI zdMuD00Np;r6HpWrra#MD6IhU4k6 zvHoP;SE{TOa_7q%9sXA5JP&zUg!Q5XiiT7EP8`>RKxUh-sW%5Xhq2zmuq2aR-B?|y zR#x8jx;MV}{eKW+972ak{#F>Z|L(UR^kN0r@Ljz;cj57qI|G%Qrv?wfhpO#Ju@q;M zH5>WBC2Ql7FZ}E=XArw|HTUG{4x`qAec@e)rp9)S;Z&FfEzOAKn1ediu-{<$o}+jq zXNa!!ha<`0Xgs~UZ|3&>PN`X)yD)d=RKo8`h7+_HN8~_?Om;ECzH(u9&uI8v@A##^ zdGCL#wF;m9(m(E>8E#-&0Ev(jOhWP;s{Wzdj{n&H$vbi8;&qCZN_GLSK0fEC-})wm zp<3H{?9uOqI`zqrv!9Wa*+U?M-(W2pfY0cfG=a%MLQdyvXX^l2BBSDOmUTTShLQM=j~ zJ}SOY!h`O;#J!}woO%hjel1^e;o43~O6L}O?bnSZ;l3B95Xyx^Ak6qGxm;y!(JQM( z&gPPk0NW61`ApShW(6?{Pz~qo9#KMR0QuoV(7`UGITr66-aB^m@c7L)?mTv6GB6T$ z))$>xuG2VG&$T^Fg|J!IV8-sVh%Y(mBu1S;pA$%if_;PjzQe)9-F{roRp+lRwI)Gg`e)#mD*KP!h{Q9PskHyxw)GX%^`+I!!oo5eO|xt4?k;BwtJ!>3hmgV6Wk-u4 zvVU zdxqIzx9RT>j`zoXVUW*}Fu;pMPwhN-)LP%Dg(BY9zHU!y$Dq^alVPT>s6T`=Jb|EW z0C+SE!iN2+r)hR4jR?DhnryMd0z_hZcqX}b_@>f@%WDgn6b4s_g6#&&6LAba**N@= z_NV{=KmbWZK~$D4zxAhH-YTyA-ADiQ+|ws7o&ZQdx4*`6l?fcS_OkM3U-i_;(c6x{ zVjy{dlYgp>0$W?>=ALd87OuPg@ayimqfu)tu9Qwc{&?J5J2n}aOb1(6FK5o5!O3)b zB&8kPs3uvRCo?1nUwA%Ky0BQTdoX-s+{WD)coXSCCoGzDT4hh6md$Ns1JPJ|nE6{M z(a-u4p3&5JLXNr~mrcv{U>8AMn&=XN-bvy{RTEkG)<+U;f9~e;tRG8!EoL`2<++u1 z>p?wD@vT&TAx#A!e^<*T4hNxunV+GH>}_GO#?O2sT_(gY#Na%+R3PI zC=r|4IdW)b^ytjME!T~u*<2f|dz#s1_ItI(O>d!~4HLKoh=$no!ck?CS0W?+f&Jd( zRHtuO$CqsDB+4)+p)i5RQs19UOdlPdK76!Q=FFf9`v-N%q`_>c<;jH_kOU8}dbfJH zbt6at7Ge(uH%~oorv`dP6w>wZCa#TiSqk=PW*GJOQp3r~-IG{?^!hR43lg-4Ss7<0 z=JNSWF2A~&-OTepmz9TwY^7Q$7AiP3IC=WMFMQ>nIVFd+bwu&q`=^J-`Y&C&gg3qK zKlIi7zU7C%^W{LJG~FLe#&Mnuzp4e$wKB{|9v9b#j_Q)(o0B{HqoYGwTI3XBRGxS< z@+P%vkB7>3q*V#k+8lW!qZ17~T8>5~3`3+FvhR$;H>-}H{#JC#IrX}LFScuE*oUj4 zP3Rk$mR3embMVZcEo|fhKlgKQO(dIt{ei#XoYQz95l@Vak8!fa#OUBO4#H~<3`$_V zb$_UMX7G%I<-4?4|f(XY|LFu1pSd@ti!on8ast- zTN`P0BGKiwMv=jZA>Jve$`THtFzzhRfdrzPcDGS3uFdB&tNy;hksULURFYY?q+Xj$ zKvNxxd!j7Vd@->QaEkdG>Al*RAyK15vjnRK#w{-9o#BWn-FsvFPw$ zQJidIAYHLSp&aEJFs&mZ)1e6&V_gPW1kcP4gP^am(2gn+ zKIq```UrYKu68l``qD8^Qme7>E%y>5)BkQ|-6!=C>Zcd|?_Sp)d-!F=N#ceQTWq^2 znr14NR`V|7EQ|#V>rzo-&}a*5#B!4<57IysQ8 zbQ_t%m4%h%wWUj!&z?N-@N9Llp3VQm|N7&}9s4&HHaH7z_l`*%Upw-9=fXlp+Fi;7 zm~GgdT0Iq~%QGoPnu@i&iEKSMzf@n^$SP}2@7C%;(`WPi!W^G z_QgWp;XeORzi(_bv2#3m?7H1M$Kx?)!||>A2E&O~(8w@|A`z{TB5gBL%ZRVZ(Rb^m&B-L{X-}!b0pwWI zfi}0nL9tJp&^cq6Gfk*_2UCP9=P53qUFjRzF)%jGc#c3tlWJho{Ko#NEoq}(Q>ZNn zk+^s*Of+Nd=(d#`NAb2_!Y7i6*uG`0bxn!`~N;!pKvoGlkM@k{4TXpP=7Cenhodssz zt#-A}_H`y7aAqyOQaYUkQIU-=#WMQHcA?lRR(;WNPdwwqFzT;J?vx!Va~yowggd^d z2hWWid2FXGG!JfwbAlB619nwO^;h-uWEX+TgJ(YIM@Y0PUyDTqOVGu)zPtTXA1n>O zQf~6Y3_+LZfxCT_+8h3=OjHy@4FSm3>X{_BI1;s$r>P4_tt|YWaKbl{=pUaRay&;J z=fz&<=b7=JJ9YZxBTszeEB9?yvq>yBQy~s$i$FM-m9=qR&l;o$V-abYmCP*kGxe%FrVo$AoZ&vFwLk+!ozm_kW^yZQ3+L~C`Sd6M{>=F^ zr~EArRgG+9@gCda@Zn%3MK9RJ_Tw~ZaNzXmv(fSK;hoco{&*mrav}-lT_`_ff9I*j+U+;r)wwI%+E{1X)%s#4 zKfAO#yRde3DRX7Hv|hoBd!)e$y-aXGrWT^48)LU|ZgFmNb#;)_bSEcSMuGywL#=6u zXzWTa);P3-wXhn=8j4>vyWIS`FVFl@IlT<62m(AiU;LJ9rHL#U zLZqD!vYmKiZT6{?NJV(1B`22gv3kHv?NvAI`MsZf-gGpNKjCJ~$>ryr>N2Nwq9G2- ztBel|BGV0_SCIl!bGIgXLJXtm*vxu#=B;!^U<)l|a=;mxaR#QG_>lIeX*CmbaP;iR zoqbLx+3Daj829i}Um~d^s?%d3IdzUMrT|(Uz}S@PY>0I0O1P@o!-Qh>p0|FlB~|MP zrD$~An3mAGvwDh_Ng)Vgs58652?C4BHj1R0O3YK429x!0+MHLd2dME#cGwqoj(r?|eD*^)ssv&X!iH z4l^_Sjn)E@#PImuy}OSex&F@Q+`RwL{(+&9L?2d@f>$NTh@KfYnqU@@o0W2DgYJF# z()S*H{Gmr4ed57~>V@opw|>K<=hfGb-hE(rIGkk`_rRR@=l*GV{H4GBM}P7ApZw_e zKKJ?0?w#7pE)A!JYmhQFZpCuGS}Qb~Wlfw4>!_#EZ{Z5}&;R;QpYz;1E}VJl^qCVM z`M`%47te$oTc>pycbV&`rnd9Cv^%i#*!Nl0nA~YCVZV@AAHK(NowA)|tGZ zk3>vH=iScd>!&ZTeDl%M_nx?XX_iN?KX_Sl_kw#7dcVE!?k~YcPj=h>?FRy^r@5iZOHYDAB(1G3 z>$4Y^E}h0CKmemBKu2Pt`*oUH9z=wNbaG%2Yx6;jWHim;1Z@-u>{bA0vEIq#4uV)|D@mlydZLxq<^B z16&}=QKHpHpRN1xY>AsIqgWkfJ%Ww`BRi>F2)a?w4}J%gwipPmQHGje>0fts3fY zJp8c81+w7+i~wY*9ZAUTxOrxnLs*mYic4z@8ym$3?z{ivAN%mV|MrDJU;ALBe)m4_ z3y%!sfY6@6KBsp#U9vtAy;jdsvKw7E;kw_+%|G-0G0Qm*uXnW z$1{C!cf3D=>p4%O-k%8V*|lSO$H0MoI|swQ=iInIGBi^0coCXlH=OGO1`r3;T}X-X zD3;&NlD}RK;*_aUZdD5%om|P94?Ev+#2^unjU@b#0YF3)FLg_gfWR(O_Yhpfzf zU__`!{GQmrj(vv$@uV5ZNt#rH8K%K8k1mZ1;jUETHjc@%VCw72%sL7hfGgqo1cYA)`j=AJ&0U72J04+#2$*gdQw*Y|qszjo&h z2fZ7S`tra~FfkGL4@MkTOmNtZLa7BMV536~09*9o_Cv)H97?BJL*&*!72>ATa3_de z7??&VwK$K48=;mj1PB6twT|NVm1~~weR2KEpUGZb{LaOVe|c)-Y&|mH<|H+lPQUDx zKmNA=@{63?xLzpM8r9Lk!9BZn4UL3Ctd&6eS~byl2Beq~+GGgEFV1J{b5@{M=upx# z2~?LmfBEvKKlYDb`NYTaa~C){ZFDShV%FKG7!NH-S(UEvO$srZN1P8l$hX>Qq5N^K6A7I#FgNB2}{}K!1vZn(OTd;)! z}Iin=X)D>H>zPwRdpvUPtoy-B+8C~UDk?Tb%6Tv%U5!AO1*pgj0dX(u|(9i8Tz z_m1D%ABdG#{oYz6>`8G@|Pwfk=kx&_`9dOaJ#y1S@Qm3Ywr067Rl8nOta(S;D+)Y+7c1&ZO20yfbt(lS&!A<->PC8^I?3}OpB z$`^3Jtm23Z4Y;Eyk?qwbJgr{xkHO#TEG$0$cOO0Z_~pO7|I9<1H8i$B$l5g%J1y*D zWa1C`gN*Z$aHJ25I8?*&p}w1Mz3pW$dFj~1aI00DoES`}6WGm%!#Kb1VEByx9WLZk zEwXDigkhQo=M4}waB0xv!0+PbpZwu_-uLH!#n}ai_U%6L$V2QbaPWwwO29zHJ*D$e z=cI37fUM!e@JkdMy|oF5uQrqm3*^m<{?XqJ144${OSsl>YlJ1F33*&B+kz`e>A0)5 zrhsu{MO)e^oqp)@BVQelVddue&<8*B@$Xe<>1>?&N;CpdEGhWOApE(5I< zgl^+yD$>2&aGu=)w}K5SdsEbBP}DPHx=FkFZDrfbM**r2bxZHMUZGt;_~l7|`Uk%e zKcU+G(UHk=sZy&{c#}?o8zQod5xfi4>e;pIGELt% zRvJ0hBG;OY3^?MXY9B`4-g>~Pu}z*M2E$G(hH3>LOo83c_3nP2Gkl{bHql|y9Ejp* z6txLFPr7~p@`VDNQWuGt-7Ne6u{5WDP!}Kt1L`DJ1-)3c)RL-Op5lT5w3 z2bPMHxW}(JhhD8aQX!_Y-b*LXKm7Q@6Kk!t8pMlbzocheld1?6X*Hs{bS*%2v92a@zgh(GFuIvO@(Y^5px(usK$sLxU4*lpQmR+>kA{Qe zGs8!Zbc%(-()^vrZaBVY_{@_RH)=TZgF3e|>lD}5SPbs#>oY2_o@`)ImSEOhk6V|U za_dzOZlq^Mb0b*fZVCYXk(V1!V_LV(l_~%9rydQRsiO2Knit(ru+?0;bSkra$&20@ zc}^K?K+#0l=|sKW(NN&n;J|I8{kwghfkrXhw4KhKR*l)Y#0bn0e10}FM||M~2WM## z%Ye_c7>gQoC#ag7M1N%0{=VIZeIsMe;D8g0NEI0jbB0%qiAGeXKT6VRF=0R}g@aL6 zV`x}AdR%yO>q}F)EYn417fF2UKJ`%I#_lCkU0mct6XL}*nLENLSp7^g65JA}8l2CI zPu4R2_p#SR)eQ7VIO>S>b?F(fLkqC{9>xQdU(Ws6@)*GUk1SNEEEx^ibVfl6)w#J{M3-N zi~&C#2*Y9A8bB$Gb{IX@Ji!*W-my?5*_WCci(j`Va^q3o$S5-x^k!05(+!&NFJOg! zBtzPzYO2*my>2C}HmbCOdvWw6ineN6u*iid+(a%yfF5ZSjYn)4uCVi^(88%Is)tge zUg19{?yBRVM*|Xk``Ca+0DVys8H@B}$lNIujz;_YgG2q{(LraR51Ehe#-^>GQH+&q zV7P?}EWqs&1j}BJo&Vim`u$elu8-XJpd5CyhRw0;(F7-QRO=X=z;Wv0Hmqbz?Py9S z@ki{OF~q?wyJz>Yqw#@3_FfLeQ#4#Dn`gOdV{IvuS*=$%DiP7oI={wg>15jMX7ENr zBV+fx;ss0RA3gEl7v?TJHq25R)~OO2T?M`RfRNThu2HR3#)fflsGKyiQyHP3z9Gb_ zmbPjtcBUM}!qg;gQ@9a$CQwo7+a|U!^$5vf1bhm{O{m5^SQaB|-pM^xd+OWH+UDoK zaQ~lt^vwB=Q}zX#xOwNOUf3>}8kn3oaHNTax<*%6nDQ~2aNAqua~bjQE4b_u*hJ-B z!1exLd+fy%Td_F305|!yH@ByC6DlX8M`J&#rAiSZz=Xn}5q5^*BYN(_nKql%vH38f zx8XqGpg|%8bD)^h>URPM22w|c(mVUuNbQT&nn9dtGTm-A*#F?e+{)VuVT9}TMc72> zLlO+Z`|E)~1vk`fU#W@FZWMk6-oJs`Pe&PpALzt>Z+hU@JNWb zpeu!l#cIf~i#Yo2p^~Uu^-~2^KSh;EtJo-M>-A2qP+wiIW^xUHp?N?i#~ZN-s-Cp0sB#oRfQIx)2_{3vt%TtE@QK_b)={@6#!v|W?0H;XP6@XQAXalG< zqv%nD2_P=qDzf7#*8lchzrUV~{o{8|p5I(+N}>kNNGd)^{^fe9(a2*=%x(#=2zfKW zvenJ-f{I@~PG*4|1|^iU83X!9{A+N&fc!7Rv-sL=dmB8Yncx_CMgz71glgGkzb7*{ zdvcVX#&m%wGyzp}@o7JXKfw*gjc%;x06a)g6@&<(m1()K4*OzkA*vyo082(JgF~Yx z^8`0g*&8Zg9j2xP>&)=wTUrcFbz!u_M`zwsS#~a-E}lI5z=?(b_R0GnUBfdneN4;T z@b^w2&CFNYcM=_!ogGsbuNDzPuvFhpBE~{bh<=U^?Rz^Su>9sFgPnJFL zwvB1Z+7Kla7|9Z#y7$IeeFkoN9mjQMR~FW1FSW}Bh8KF54Sa|fUZi*w!3fm!3C#JU zPCMmz$Jx0QPwr3kPel^xU;qa+jcTb{V~ZF2IDvv;&RgK zA^+&)==1KrJw80xfI5Tzft@>c961~s9<{Y!T0z}OFuL8&z*Wn3gFvLPCX8^?Wtikw zoiR@Um-oQI>0(4m158^EPC#Z(B%F<->43Ws;`NRr_kA+Atn zIk()=hP_(0T3gO$3l+8}`x4>4p+s`W;9#6BZ}C?8hJ%S)k2G=0>c<>L!Xb>=AaPp_ zxl9-l0SVbKn>KWH=2Kt(>_2|}QYrXP4}PcaO~9BLFXLghf=4C4;x)ffmQz@UCJ0Z` zB*GNqk0yU2XPeV8T8R--L1ilShk_YjWKkf6yvAcqy)@OqEj}urX1&~QZH}hH=Px`S zi)wM0E^49|Dd{;b0;MamD$uXHnAa*2jXpyZT0CU z(U1G?s$SjTt&b{O^`;3Z+TPS!nmtG`V!Dc;$7YhD(PVnCw6VUvFkj2BVT4B$!FOn8 zXp)70_za6{)sBb0xYF*N&2OginNi2TCz0CK*VoTZqiC{LEx}#cz`t6^ZMLc#t=cAA zHhli!p^@uuxapSLZasMPNNivz5cPIy?5*eo5;2F3Au)tampi(3w+aE9AnzhbPrxp0 z5@Nl|KJ(_*UG;Tw-OU5)Q?8zDK0m+U6e`%~;z%CNr}jayjhRI!_Wx$H8))ar+N(eR{S-Q6c1 zxHQ>QTxI5l@F3E+iwZDnCjx(BZAcFu4-=3L2ZN--qQ5#9-?$Rb&$qLS)hjE-Rfm&s za@dI`yz#-f2cPhszPIg9?F%0Kmj}*XfF+U@)GL?p#lQpZVY$HO7y*;aG8uzs?zG=f`3H2ZkRg*=Qj z5xn*uIq>S2J^!X#kMGzq8Q@SA2%oK^Py$Plfqv<@q6m$W4Y|`UUC=3N3sWjqa2py$ zM}iv=exRDFmD*dQ6*t68dRk+CB{#nip+J-gNPzSjokq(D?Wq*X8_O$+XtXbs2&K|< znfw>NeeY-Py>GFCK`yH|J|;Sh>=JS`@8Ml)?^rlIGcme%WaOvb_>-fa+Bd%Nseq?& zG@R6Ao`I5l0ncRzs)evDR8yT^4b%%UH<}v1>9!lLoV;?+O-KL!(G$2ZP>ncfr_Rx& zZGRB!X67VN4||_6H?7cp=m4xvnjFpeLuF|csw#aAMF6R!aA^n-hok-=JJaxLRon@~u`1QPtE! zs-&f{Al-DiX$%3q7F9mDOQ@6{fB4>oM;{7ptj3!8L4RR1;vMLZc*8rQ6GLps9vl7Q70hp2}j|_a8_gae3?7%EnDhxJ%5|o!T=I&Kne1U1EsKx9ZV)C z4_)6b73MFTsh4nYK)qDB7SHt14#+yW5otA0nb2{NvNKL0XZsrC%wN*+*WB~s=fCu& zQ+szg316<7FE`hjxzV%m>VkC^cxquB7fIm91t@7yw3yt>@NqiC8iaPOKN|U%u~apZVsu zE@U?=-e8?mQH+5D5;`KyzY)?}?a5T~&98gaD_(lXj>*1SwLCCB7VJyC=>_|PgCh<{ z2kUGZmmLWr)kv@kZK5oL62SC@8gL8w55M?%8<#%$x)(k7`)6mLC>C^noX!bF<5v)*E4~A=9|D2 zDpcG5C=dI#-A2R>=q4cpOYP>ZK zJVDb5Eou5ftbnI*AFL1~N9)K|%Pzd#ItxqzF0g57J*oW-{w`AZ)Sa`bDfNZ4;L2ND zT&Z4NlC=d21g1P%oW-kCYw^OBTCtW&53{!ZjMte&V)chdjah;CM2S3IqpY;lZ>gk;Ka{6{1o^763pc@FZ)gYgn%* zz=%wPt#|QVEVV;|F>7__+6p1G2lzdSk1_HS8YqqERDopnXvwXzs_U~aw<#=?=25Q| zI=FFxF!m5}Doq5F=8u2k6My^H?_0faJ_L+jZJyz~PEUo;Nl7AJOrZW41~hbo71t^a zbaT8-v=tqmK6XouG1>M6SiKBHQ39X}TD!=}edeKi@!ov_G(or(xfkQvzuoA*)QqiM zZ{_2Xu$$fXOw>gD>83k3z?RNR_(P6HP(-8%g}m9dC08#56eykD5hLnpA00{Gvv=36 zasTZ*$8H)Oymflw#ywL9rw5WqQuw?Y?nCF18bK0>hULgksG&b{TA@GD=TD|}%!??R zan#ySy~l-Qd(8}DZuZfQVV~9A^dNYJP|AGE9}s1WtZpH2@WPG?q*?%((L z$;YZP*pV`c{?$Z0Z#8sGBhntkDHAO9EV);*k=C$6M`i^w7{^UJ==4hx%IGT%X9h`o~XvPL`<^!B=ytG=M zTW-#;HrF!kVi`#rXAe?}i7=?BRmkNd-8&&}pjBO9@n7-mvSt!-Sz1GlveNKR_w9tj z-lIqNzwy;CoEb}9I(-7(P{Gj%2T-xoI~b|>gQ!!r=;86zyd0mv{zfpuoK{vNc#&+P z%Zv6;9z4*IB@^s$bgD(x3;cL+ z9P5i6oQ~|9_NCJp@-Z2MLACMZRw&Rv{E?_9nPx);`2mDR43`MOk;v7(3@_IJB<6nQ^;YciX z`;E7}@YpS{xZ{o&9=q|*8;?c2{-xzrrZ1A)Om1Sa@y31oZ=Bhg4x#gh;M<9zv^U*{ zT97ze)i!&5F%p;Y8?m{RWqiPT6~J~0l{|f&!4}9oLxu2 z6)xaHXfGt%apESkOY`-i%}-=R=TXkM4DdyR(SblH?F(>_BZ~o?jk{K_h(N$HGk?tVPUPb zvQb%GEoV0IKpo)ZilB}lp^pf)8U|Iou}8Ini|^hOZ~Se2)QjRXR`IA2OEW^POt6o( zS_uRKk@WE48=m*_yI;SWDO|WX2V?O2!c_)1baiqd2EOQ=Fd7oVZ{Qqku|d@vjg0Od zJ9xb(8keUCL$3-}c}50ZfOuEIg2VnR_?ef!7}4oF4|@MmmmAM{W>5Q}kwvQf*B{^Q zuEcHzVy8SwjL=sq+221{VPTj3OVFK`2*o&15R^Th=;U2zkmPH>kdBo^wVV=Ho|)mN!smlu6XB7$5TN@JuJ*y#e7}^U_8Z6 zYSS38&O>=XM{C2a3}8tzF3kF5K&yTb96f?lL=caty4M%%@9ST@c<$iLj_daCKYR8} zzEaUQt?A+x71mE%FxG}}a*INeI?0E=!+Hax7Y+u~{$LvA2RnPcxP&Zc+KnRXF-$Qb zXr`w4TnKsaRZ)58FTV91?|f@|IEK*{8(VPoB|TBon_J9(>$Csk-jxNG{JGs+087t5r3g#ocqX%qc50gb}r?zS97`5TzO-&l*!aGvzvv> zYlYJb*)tdDpSW`y9vBI*??UPbo&6`1@K^%Pk@WgDGmyqbje$sERW-PJ6$VT}=~iFp zvnF%Fw;m_JdlxaSUT)AM0X#G`5FSdisKB{vv2=Xr{+%-icl4)%t@3)LQ;T`< zjKVn|G91Cb%HcgTJ0~Z<{on&tX;GjDU%r?N`GR-cauX^`7JxgoW??ncDmS77tTm%x zhw9Wj1d24D!V`}m3t+pTi`*2APmGmJpYQ<$wE;0gdDI^$7Bbe zx_D5+9x>?GCIfsGQ9~&piPrUpXl2Ioy)MPGb zMyOy-z`D(*C%w487A7j+x88wU-0HC{22NF1_ie`=VbhLLdUcZp6=F&m6Ih1hu{y2w=n(&Tek>MFYpKJAfJF z#mkqa6i`QlBZ;&)%Z`RZS|v|h{CKeu3FDxHW28`t)brVeS|v+#%>*?PJDA#WCd}l3 z?>FD|w*Twr-=J-PX!dDX7A$P2M25sY@-5fj@cP%h=_}uT@S%&RH=No=qr8yIJ~ey! z{zo2NTFv#P(z~Xo8pTo*+k;9ao=kC=IO-WNO84&8Pwn86kYH2YLAe{GH#bBxGy78_ z*>pHnXZdV<_Jp^!j&_*sKC<8A3Iv^G-+|-Tzxtk+a5&A<>?MXaQ>l{=$b%ZW(=n-T zrj*Md(8ps8=~9$XH+Q5^Oi<0Gr*0?X(J0Cq!EGFs_aiQW`5#<(dQwmOA+fAbHzi+H z`RQ>V^x&_QLmrW-N_*NG()fP?qu^I04B1(|{<0Jh-s=c%*DBhs~b&4!V1WKATx zYIrD?9H_YhnRKb1Z6N7cY?E|n1q8f>)fUTkz2YacnHhU(fn7PD>m$Li zKN64PL@YhnAHdY{lUH6UOQ3j}7@@J9zc6;g^?SSGY;M4jgU}CPs#RWC41w(AjK>1Q zc=IaL7hdI1nTFSB<6KscB>cF7y4R}DF61YtEBO+3M*KONM7wWP$pE-+)$+mKuCr&( z^wVOu%>`&i+ z{{y%9!l-BXJrT`RPQAz zVd?ObxkEqkrcV26lSDMvRy}Xa74k&-`|iE}fos-nI&%pGtjU3?_iH-qnF=V~E`(kS@f zKIT>b{TgqeGN-ns*QsXyUxktLCb~dS2PNkWMM8zbVw*&@Xf+fw%eAn`YQ3_2sQdPv zTh}Lp#dPlA*(=1hf9CkvbC<`5M~3?c2HbuR3z2SYBoHpsrb@}Gmb^-(#bN+62jC!| zM&6`X8o9;+m-XH0Frx{C^)b!reDR|JH)oxj>Xt6?9G4AG1KS;fq|ciCaFf}lE;03r zgoJZs?u4ttujNePPxkfw?C8Pi>>_^Vh#xWzPb#4*f72beUt(UT7|G}&wBA3OLzk0+~A&K3u zyydpv``G)oU$@T93bsE;B0Rz%NCCrWhZO?eQLj+}ivwYdvX$~TA9(^@&BHih*<-gx z&_6P~EVr1sd|_tiAWOcc2*)H5u0j z#tLW{TIKZyvYJL0@^f=!s|>oxoQKb?X2DqSXrV@#LC^;fJ6Iuna9U!nJ7ePzl z^$Nl8i!7|UaBp*(V8G$%uY!_Bgf^M>sk08ojPKNMlo{TtMre3Vcd%!WOQc!#`mvw;ke;|lY0k!K zw%^~Vk`Y)kjLF+jZ{ONAqsLF2#_hR5e`T)3{n12L2Z)M*N8X<*W=7OWql>U7y4oAG z?!9&6$3FU=H@@wTo?(n~O&_8g-&8HT86QZDC7Si2t|E+aPA%BEQlo1B>vtX_c~ICJ z{-wL`y>xL5ch7;o!J&b{Cc%Zu<(=1GYa5bg#m<|Ii!(Am6|0sG4I8bq>dgl2sQH!vlq9Nci0U*+|xwD7M=Z}U5!o+WOg{(+Vc+Yja z)~{WeotvMYnl^*TjvHQz{5I19Ued71&9*ojG`*N1dYy<=BHDS`RQDD9^u6KgJCi}22o`5 zawog{@`Y@>UPb|do2m;W4s6>K+0=M;VaN5`_g=Sp!|K5v#+W1*1q=!=B9uWGnrz=eC^0wNxOCEAT@bmshCJ?k8Z(NY;_=D+iPzPajr z3zU3Nwe)h4oRHn?9UK}d<8fYNffeilY0>bde9e?f7iO-k->|YfodNZ{O5D! z%zQc?iFtwn?N?Du7wUu~x5}9;In`XmJxJy=J)gqM=>v(d26*&zQATykg7YHJUw>t^yDN2 zW)|1P$=Qy7=EBACsi~Xx?ny*~cCD&4cy=n{&8Y2beyYJ9ujp`)T)u2)i>?xhzw1^F zpISDXRxu=M*5u_G-irAGlqW6$&M2%fn<*JG9}bTm+G@muzFYR}K6By}Tdg5W7LMe7 zMW4|xpi}&|+O4S9-nM4NM?dtwkA3vFwq3Khz3INS1K~>gN-mW_+eSJAN{CL9R>l*|kRmwwY^RFV z;}_vd({7sNwAJautJ>e`hiSHvhdiMQ%>{9Fj?rqwWAXmMS`h5+ zBF14gS0>9JiKuaZ`qBP_O)oPO03pf1%OSkWS0-P6<-q#Y8_|@DWhP7P86xUO39AOW zAC?P}(|7|RR5Vazx7~fmc9MQC z8`!yJ{f@Px`24I}KDc@9ibO0zY~5&g!i6*o`+U7gW3o3xE}%QOA+%XSBr_x$7T(8Y zaTD+ZmIkAg4ClutrR0h$M~-%jOZnxe!XQJxEHuj9jMYP;n`erb&b2O`^cCmatOs}+ zzNlyGuJvzz?Q6ELNxIovIiF@1FVkFRFtTKWGE9@5ZC_MWuT=9SESW=QhKW8(>!f68 z^l4S+M~(dd`#6{-AgYAWV<_E*w0Hl&l$&#Q+IUSLHm@U_ij*WHq4lNs5f%9WS0W*}_tz2h1lZ%Bz zAuO|?Br`qutirOeQ>j_VWZRWWKoM|}cUTsbztxN)+>YkZAT^Npn+_Pg-??JCYg+#E z4w!3t#(a3tJgaY~?+*AnaKM_5F2dl0rX)Y9w-nH)5=U=qkK2v;mh8n@*Kjvgn)-AE|1 zW2Aq_is9Gn*!-ru@A%OB-*x|+?g>RbjdB|Glf(yXd6zPV#Ad7{KYj2JqAC%N!bQaY zTp@e%+_4?cYJ+X1Nqc1|U23>#*YIn#61qL1VQOxnHSo@JY# z`_2=-R3#qo*N}-35Z)ZGb?uWx)HAvFG6R{OvM0wp=?SY&o|-g!`c|)BcK4k(-L`A< zV8Rn~*WGnCAJ*7a#Ou*2F#7N!G$)Ax8#kwXVqgdkq!!W!T4GvE7fd_Ni8<2st7lga zu3lQY;z=OWu432K+j`c#;%Z$w=s-lpofn(8n-`h-I2DPGSAWN{ku<9y5iRUG4 zJAyrs^?15UZZ@?Zs=;c4S+>a1cea$v)eGfnzEI8Nnwdf^oo_5wYMDwsUzL+KF&Buh zf)*r?31YsgM-?C}>5Sv<%T`bwLoNotxWxI?UOK7AwzJ4^gc9nm4u*LKeGmHayXAA^jnN^)J z5Oj6ujDa{bO%Zz}ItzOh%H?Jy*MxZ34TM2I79U-|W#1D|O&mV9Jd!{xNhg(}%S;kZ z?1xhb6HzxwEIu<`8Nb+=xagXj^pxg2)w%v~hpZA=s}mHMlh6e?i8 z>3;gfmobeaWYPDK#1a;re1rI#8A`rczTxh!E)rt7 z8!f!g zBCGn`Nw2Rz8eGvA9$gk3UG7^xWG7?o0J?@&{)9GywP5COFrAwZ7ok4URR{c(k$ys2 z@p?MvMYh-K7+rm^l4=n{4pCgZiTLWxn@=1${n88POQ}4x<@d$d2+E#n0+ypD;I`#u zVFHFt%nT-GxpIY^AY!$u zP*;zcj|gcxZKKH?s^$D#J<%m|UFG<6ZaCd>E`h6#OjAiNUHx+kna9kR!75YF(t}IC z&MU4~YB1b+r1NqrcF02S0OMqCg_VcGQC52k`792tXbUtCKXHW+^SIAlzK~64R}K#L zBw{$uuyADdjM$}8xl)qhF+dDgkk`DFZ|Y+c8|n!efNP6sxE^U;wa1ZKrJ;g=tPwb5 z?ljbag}R_&Hvde2%$I4m!2{=%ZN>r|P_YZyVv8Uj` z`0?Yd0S@UYEnb;twecCX(RXQn{^_5-cxh@T9_#K-^oRUmL;{|LB;~<~C$CtPWM+cQ zBn)_r(NawS5mgZ%8bPI02S34`ie+LW^UDpZ=!<;n-@Z1Np8KU+_U>A}EE4cV`g;Q1 zUF>0HO_Er2gurT|c~;2Z3YQIz=`K$KO>eu}KK9cWPe1t+-(1F;PW!54uwr!`q0I`3?N0Qp zx$Z{hp2rTHn62t?wRL#bU0JWonu;-lq9#u5)0z(m8w; zN?h%wgPWZKqBPUbrDypy51Di48G|3Ho%cESoa>!OURB6>SQUtz1VgpaG)(8_3aBrK zbEe(lXwvTs6j;!}Spm)u@AryKS}yPS)a;eX>6NQicEy=bfPbn9Qmj@g8RllT9gD_& zq=ytC8Py+&A)c(j^r%~vOrEJdveB`FKxTS55)MO}kws3M)zGCbnO{!ntZA?5gz4ec zQ(fvj=oDOfmbz6fnp`AW$>w_ET?Y>zKQ}#tN3S-b@sMd`XNCf0$TdMBdx)PnHZ%Ry zi?6(RsjO=#6FDz|IkCRdIDLD)J*?amu3eVrh7OMm;$BA z^Oj!6ViSeZ|Nh&5JT`tQ9*n&Gj@x?G+NQTF?(OMmurh@@5hP9$A#-KwunTpoShvwg zv$aO1?5Z@pbzF%t_^4OPxE6?JUBQR{>#0wC>0i&zPeS=0eB*<^{F>|B?Q&%KP+KcgmUEF`{JOA+T zxtC8(96VPYn{qGI{p66%Hmnk{L)(4v6?VRnPhnf~kbih)p)r+e%;(+NVlbWcFXSTA z8UNUveSE^+ceeP$li9EQ?DD_-^vZXS&%JOZf2PoyZ(9`?fku#^J{f@^Gk+bl_ ziYC@9nVQvRA>S`F*lD@bCmoy4I6a~xhMt5qzd&iO6?eVIDWdvJ4OgFV>NCivr*+pn z-uYg-t@4gWwNwS|GEX_bJn4WMEe9H7AgBqx#XJm8t6FLP^6c1g60B+49&eDYL{i>1 zYT}w?{8#UP?G5WUgldfz&JY@Wc|E`~af2Eh8Hjd8we^tYA%)}+S%HIqg-I@1vM~;X zl5uZ0se_0`W%#RxAI07@jBco%&POnP)yGiRRd_gX(QS@|^}3)g^E_mu9y#0!r5xs%dQja`e9yo1?2bYm8C7+v{3YK@z3Tz;)q!t1$ablDxduDN#I zs;+=95e~4TiU<^4$k4HL2A%;XgZn*j59N+^ Z}a$$so-`@ZqSvy+7?xPR;R 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 literal 0 HcmV?d00001 diff --git a/parks/__pycache__/models.cpython-312.pyc b/parks/__pycache__/models.cpython-312.pyc index 3a56145729c8f701232662d866f1a4f06be977ba..be7cd022a8ae23d5dff570f2113b5a0f267fae30 100644 GIT binary patch delta 20 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 literal 21313 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 z str: return f"{self.name} at {self.park.name}" - def save(self, *args, **kwargs): + def save(self, *args: Any, **kwargs: Any) -> None: if not self.slug: self.slug = slugify(self.name) super().save(*args, **kwargs) @classmethod - def get_by_slug(cls, slug): - """Get ride by current or historical slug""" + def get_by_slug(cls, slug: str) -> Tuple['Ride', bool]: + """Get ride by current or historical slug. + + Args: + slug: The slug to look up + + Returns: + A tuple of (Ride object, bool indicating if it's a historical slug) + + Raises: + cls.DoesNotExist: If no ride is found with the given slug + """ try: return cls.objects.get(slug=slug), False - except cls.DoesNotExist: + except cls.DoesNotExist as e: # Check historical slugs - history = cls.history.filter(slug=slug).order_by('-history_date').first() - if history: - return cls.objects.get(id=history.id), True - raise cls.DoesNotExist("No ride found with this slug") + if history := cls.history.filter(slug=slug).order_by('-history_date').first(): # type: ignore[attr-defined] + try: + return cls.objects.get(pk=history.instance.pk), True + except cls.DoesNotExist as inner_e: + raise cls.DoesNotExist("No ride found with this slug") from inner_e + raise cls.DoesNotExist("No ride found with this slug") from e class RollerCoasterStats(models.Model): LAUNCH_CHOICES = [ @@ -198,11 +212,11 @@ class RollerCoasterStats(models.Model): trains_count = models.PositiveIntegerField(null=True, blank=True) cars_per_train = models.PositiveIntegerField(null=True, blank=True) seats_per_car = models.PositiveIntegerField(null=True, blank=True) - history = HistoricalRecords() + history: HistoricalRecords = HistoricalRecords() # type: ignore class Meta: verbose_name = 'Roller Coaster Statistics' verbose_name_plural = 'Roller Coaster Statistics' - def __str__(self): + def __str__(self) -> str: return f"Stats for {self.ride.name}" diff --git a/rides/views.py b/rides/views.py index 1734783a..ffba53bb 100644 --- a/rides/views.py +++ b/rides/views.py @@ -1,3 +1,4 @@ +from typing import Any, Dict, Optional, Tuple, Union, cast from django.views.generic import DetailView, ListView, CreateView, UpdateView from django.shortcuts import get_object_or_404 from django.core.serializers.json import DjangoJSONEncoder @@ -6,344 +7,464 @@ from django.db.models import Q from django.contrib.auth.mixins import LoginRequiredMixin from django.contrib.contenttypes.models import ContentType from django.contrib import messages -from django.http import JsonResponse, HttpResponseRedirect, Http404 +from django.http import ( + JsonResponse, + HttpResponseRedirect, + Http404, + HttpRequest, + HttpResponse, +) from django.db.models import Count +from django.core.files.uploadedfile import UploadedFile +from django.forms import ModelForm from .models import Ride, RollerCoasterStats from .forms import RideForm from parks.models import Park from core.views import SlugRedirectMixin from moderation.mixins import EditSubmissionMixin, PhotoSubmissionMixin, HistoryMixin +from moderation.models import EditSubmission from media.models import Photo +from accounts.models import User + + +def is_privileged_user(user: Any) -> bool: + """Check if the user has privileged access. + + Args: + user: The user to check + + Returns: + bool: True if user has privileged or higher privileges + """ + return isinstance(user, User) and user.role in ["MODERATOR", "ADMIN", "SUPERUSER"] + + +def handle_photo_uploads(request: HttpRequest, ride: Ride) -> int: + """Handle photo uploads for a ride. + + Args: + request: The HTTP request containing files + ride: The ride to attach photos to + + Returns: + int: Number of successfully uploaded photos + """ + uploaded_count = 0 + photos = request.FILES.getlist("photos") + for photo_file in photos: + try: + Photo.objects.create( + image=photo_file, + uploaded_by=request.user, + content_type=ContentType.objects.get_for_model(Ride), + object_id=ride.pk, + ) + uploaded_count += 1 + except Exception as e: + messages.error(request, f"Error uploading photo {photo_file.name}: {str(e)}") + return uploaded_count + + +def prepare_form_data(cleaned_data: Dict[str, Any], park: Park) -> Dict[str, Any]: + """Prepare form data for submission. + + Args: + cleaned_data: The form's cleaned data + park: The park instance + + Returns: + Dict[str, Any]: Processed form data ready for submission + """ + data = cleaned_data.copy() + data["park"] = park.pk + if data.get("park_area"): + data["park_area"] = data["park_area"].pk + if data.get("manufacturer"): + data["manufacturer"] = data["manufacturer"].pk + return data + + +def handle_form_errors(request: HttpRequest, form: ModelForm) -> None: + """Handle form validation errors by adding appropriate error messages. + + Args: + request: The HTTP request + form: The form containing validation errors + """ + messages.error( + request, + "Please correct the errors below. Required fields are marked with an asterisk (*).", + ) + for field, errors in form.errors.items(): + for error in errors: + messages.error(request, f"{field}: {error}") + + +def create_edit_submission( + request: HttpRequest, + submission_type: str, + changes: Dict[str, Any], + object_id: Optional[int] = None, +) -> EditSubmission: + """Create an EditSubmission object for ride changes. + + Args: + request: The HTTP request + submission_type: Type of submission (CREATE or EDIT) + changes: The changes to be submitted + object_id: Optional ID of the existing object for edits + + Returns: + EditSubmission: The created submission object + """ + submission_data = { + "user": request.user, + "content_type": ContentType.objects.get_for_model(Ride), + "submission_type": submission_type, + "changes": changes, + "reason": request.POST.get("reason", ""), + "source": request.POST.get("source", ""), + } + + if object_id is not None: + submission_data["object_id"] = object_id + + return EditSubmission.objects.create(**submission_data) + + +def handle_privileged_save( + request: HttpRequest, form: RideForm, submission: EditSubmission +) -> Tuple[bool, str]: + """Handle saving form and updating submission for privileged users. + + Args: + request: The HTTP request + form: The form to save + submission: The edit submission to update + + Returns: + Tuple[bool, str]: Success status and error message (empty string if successful) + """ + try: + ride = form.save() + if submission.submission_type == "CREATE": + submission.object_id = ride.pk + submission.status = "APPROVED" + submission.handled_by = request.user + submission.save() + return True, "" + except Exception as e: + error_msg = ( + f"Error {submission.submission_type.lower()}ing ride: {str(e)}. " + "Please check your input and try again." + ) + return False, error_msg + class SingleCategoryListView(ListView): model = Ride - template_name = 'rides/ride_category_list.html' - context_object_name = 'categories' + template_name = "rides/ride_category_list.html" + context_object_name = "categories" - def get_category_code(self): - category = self.kwargs.get('category') - if not category: - raise Http404("Category not found") - return category + def get_category_code(self) -> str: + if category := self.kwargs.get("category"): + return category + raise Http404("Category not found") def get_queryset(self): category_code = self.get_category_code() category_name = dict(Ride.CATEGORY_CHOICES)[category_code] - - rides = Ride.objects.filter(category=category_code).select_related( - 'park', 'manufacturer' - ).order_by('name') - + + rides = ( + Ride.objects.filter(category=category_code) + .select_related("park", "manufacturer") + .order_by("name") + ) + return {category_name: rides} if rides.exists() else {} - def get_context_data(self, **kwargs): + def get_context_data(self, **kwargs) -> Dict[str, Any]: context = super().get_context_data(**kwargs) category_code = self.get_category_code() category_name = dict(Ride.CATEGORY_CHOICES)[category_code] - context['title'] = f'All {category_name}s' - context['category_code'] = category_code + context["title"] = f"All {category_name}s" + context["category_code"] = category_code return context + class ParkSingleCategoryListView(ListView): model = Ride - template_name = 'rides/ride_category_list.html' - context_object_name = 'categories' + template_name = "rides/ride_category_list.html" + context_object_name = "categories" - def setup(self, request, *args, **kwargs): + def setup(self, request: HttpRequest, *args: Any, **kwargs: Any) -> None: super().setup(request, *args, **kwargs) - self.park = get_object_or_404(Park, slug=self.kwargs['park_slug']) + self.park = get_object_or_404(Park, slug=self.kwargs["park_slug"]) - def get_category_code(self): - category = self.kwargs.get('category') - if not category: - raise Http404("Category not found") - return category + def get_category_code(self) -> str: + if category := self.kwargs.get("category"): + return category + raise Http404("Category not found") def get_queryset(self): category_code = self.get_category_code() category_name = dict(Ride.CATEGORY_CHOICES)[category_code] - - rides = Ride.objects.filter( - park=self.park, - category=category_code - ).select_related('manufacturer').order_by('name') - + + rides = ( + Ride.objects.filter(park=self.park, category=category_code) + .select_related("manufacturer") + .order_by("name") + ) + return {category_name: rides} if rides.exists() else {} - def get_context_data(self, **kwargs): + def get_context_data(self, **kwargs) -> Dict[str, Any]: context = super().get_context_data(**kwargs) - context['park'] = self.park + context["park"] = self.park category_code = self.get_category_code() category_name = dict(Ride.CATEGORY_CHOICES)[category_code] - context['title'] = f'{category_name}s at {self.park.name}' - context['category_code'] = category_code + context["title"] = f"{category_name}s at {self.park.name}" + context["category_code"] = category_code return context + class RideCreateView(LoginRequiredMixin, CreateView): model = Ride form_class = RideForm - template_name = 'rides/ride_form.html' + template_name = "rides/ride_form.html" - def setup(self, request, *args, **kwargs): + def setup(self, request: HttpRequest, *args: Any, **kwargs: Any) -> None: super().setup(request, *args, **kwargs) - self.park = get_object_or_404(Park, slug=self.kwargs['park_slug']) + self.park = get_object_or_404(Park, slug=self.kwargs["park_slug"]) - def get_form_kwargs(self): + def get_form_kwargs(self) -> Dict[str, Any]: kwargs = super().get_form_kwargs() - kwargs['park'] = self.park + kwargs["park"] = self.park return kwargs - def form_valid(self, form): - form.instance.park = self.park - - cleaned_data = form.cleaned_data.copy() - cleaned_data['park'] = self.park.id - # Convert model instances to IDs for JSON serialization - if cleaned_data.get('park_area'): - cleaned_data['park_area'] = cleaned_data['park_area'].id - if cleaned_data.get('manufacturer'): - cleaned_data['manufacturer'] = cleaned_data['manufacturer'].id + def handle_submission( + self, form: RideForm, cleaned_data: Dict[str, Any] + ) -> HttpResponseRedirect: + """Handle the form submission. - # Create submission record - submission = EditSubmission.objects.create( - user=self.request.user, - content_type=ContentType.objects.get_for_model(Ride), - submission_type='CREATE', - changes=cleaned_data, - reason=self.request.POST.get('reason', ''), - source=self.request.POST.get('source', '') - ) - - # If user is moderator or above, auto-approve - if self.request.user.role in ['MODERATOR', 'ADMIN', 'SUPERUSER']: - try: - self.object = form.save() - submission.object_id = self.object.id - submission.status = 'APPROVED' - submission.handled_by = self.request.user - submission.save() + Args: + form: The form to process + cleaned_data: The cleaned form data - # Handle photo uploads - photos = self.request.FILES.getlist('photos') - uploaded_count = 0 - for photo_file in photos: - try: - Photo.objects.create( - image=photo_file, - uploaded_by=self.request.user, - content_type=ContentType.objects.get_for_model(Ride), - object_id=self.object.id - ) - uploaded_count += 1 - except Exception as e: - messages.error(self.request, f"Error uploading photo {photo_file.name}: {str(e)}") + Returns: + HttpResponseRedirect to appropriate URL + """ + submission = create_edit_submission(self.request, "CREATE", cleaned_data) + if is_privileged_user(self.request.user): + success, error_msg = handle_privileged_save(self.request, form, submission) + if success: + self.object = form.instance + uploaded_count = handle_photo_uploads(self.request, self.object) messages.success( self.request, f"Successfully created {self.object.name} at {self.park.name}. " - f"Added {uploaded_count} photo(s)." + f"Added {uploaded_count} photo(s).", ) return HttpResponseRedirect(self.get_success_url()) - except Exception as e: - messages.error( - self.request, - f"Error creating ride: {str(e)}. Please check your input and try again." - ) - return self.form_invalid(form) - + else: + if error_msg: # Only add error message if there is one + messages.error(self.request, error_msg) + return cast(HttpResponseRedirect, self.form_invalid(form)) + messages.success( self.request, "Your ride submission has been sent for review. " - "You will be notified when it is approved." + "You will be notified when it is approved.", + ) + return HttpResponseRedirect( + reverse("parks:rides:ride_list", kwargs={"park_slug": self.park.slug}) ) - return HttpResponseRedirect(reverse('parks:rides:ride_list', kwargs={'park_slug': self.park.slug})) - def form_invalid(self, form): - messages.error( - self.request, - "Please correct the errors below. Required fields are marked with an asterisk (*)." - ) - for field, errors in form.errors.items(): - for error in errors: - messages.error(self.request, f"{field}: {error}") + def form_valid(self, form: RideForm) -> HttpResponseRedirect: + form.instance.park = self.park + cleaned_data = prepare_form_data(form.cleaned_data, self.park) + return self.handle_submission(form, cleaned_data) + + def form_invalid(self, form: RideForm) -> Union[HttpResponse, HttpResponseRedirect]: + """Handle invalid form submission. + + Args: + form: The invalid form + + Returns: + Response with error messages + """ + handle_form_errors(self.request, form) return super().form_invalid(form) - def get_success_url(self): - return reverse('parks:rides:ride_detail', kwargs={ - 'park_slug': self.park.slug, - 'ride_slug': self.object.slug - }) + def get_success_url(self) -> str: + return reverse( + "parks:rides:ride_detail", + kwargs={"park_slug": self.park.slug, "ride_slug": self.object.slug}, + ) - def get_context_data(self, **kwargs): + def get_context_data(self, **kwargs) -> Dict[str, Any]: context = super().get_context_data(**kwargs) - context['park'] = self.park + context["park"] = self.park return context + class RideUpdateView(LoginRequiredMixin, UpdateView): model = Ride form_class = RideForm - template_name = 'rides/ride_form.html' - slug_url_kwarg = 'ride_slug' + template_name = "rides/ride_form.html" + slug_url_kwarg = "ride_slug" - def setup(self, request, *args, **kwargs): + def setup(self, request: HttpRequest, *args: Any, **kwargs: Any) -> None: super().setup(request, *args, **kwargs) - self.park = get_object_or_404(Park, slug=self.kwargs['park_slug']) + self.park = get_object_or_404(Park, slug=self.kwargs["park_slug"]) - def get_form_kwargs(self): + def get_form_kwargs(self) -> Dict[str, Any]: kwargs = super().get_form_kwargs() - kwargs['park'] = self.park + kwargs["park"] = self.park return kwargs - def get_context_data(self, **kwargs): + def get_context_data(self, **kwargs) -> Dict[str, Any]: context = super().get_context_data(**kwargs) - context['park'] = self.park - context['is_edit'] = True + context["park"] = self.park + context["is_edit"] = True return context - def form_valid(self, form): - cleaned_data = form.cleaned_data.copy() - cleaned_data['park'] = self.park.id - # Convert model instances to IDs for JSON serialization - if cleaned_data.get('park_area'): - cleaned_data['park_area'] = cleaned_data['park_area'].id - if cleaned_data.get('manufacturer'): - cleaned_data['manufacturer'] = cleaned_data['manufacturer'].id + def handle_submission( + self, form: RideForm, cleaned_data: Dict[str, Any] + ) -> HttpResponseRedirect: + """Handle the form submission. - # Create submission record - submission = EditSubmission.objects.create( - user=self.request.user, - content_type=ContentType.objects.get_for_model(Ride), - object_id=self.object.id, - submission_type='EDIT', - changes=cleaned_data, - reason=self.request.POST.get('reason', ''), - source=self.request.POST.get('source', '') + Args: + form: The form to process + cleaned_data: The cleaned form data + + Returns: + HttpResponseRedirect to appropriate URL + """ + submission = create_edit_submission( + self.request, "EDIT", cleaned_data, self.object.pk ) - # If user is moderator or above, auto-approve - if self.request.user.role in ['MODERATOR', 'ADMIN', 'SUPERUSER']: - try: - self.object = form.save() - submission.status = 'APPROVED' - submission.handled_by = self.request.user - submission.save() - - # Handle photo uploads - photos = self.request.FILES.getlist('photos') - uploaded_count = 0 - for photo_file in photos: - try: - Photo.objects.create( - image=photo_file, - uploaded_by=self.request.user, - content_type=ContentType.objects.get_for_model(Ride), - object_id=self.object.id - ) - uploaded_count += 1 - except Exception as e: - messages.error(self.request, f"Error uploading photo {photo_file.name}: {str(e)}") - + if is_privileged_user(self.request.user): + success, error_msg = handle_privileged_save(self.request, form, submission) + if success: + self.object = form.instance + uploaded_count = handle_photo_uploads(self.request, self.object) messages.success( self.request, f"Successfully updated {self.object.name}. " - f"Added {uploaded_count} new photo(s)." + f"Added {uploaded_count} new photo(s).", ) return HttpResponseRedirect(self.get_success_url()) - except Exception as e: - messages.error( - self.request, - f"Error updating ride: {str(e)}. Please check your input and try again." - ) - return self.form_invalid(form) - + else: + if error_msg: # Only add error message if there is one + messages.error(self.request, error_msg) + return cast(HttpResponseRedirect, self.form_invalid(form)) + messages.success( self.request, f"Your changes to {self.object.name} have been sent for review. " - "You will be notified when they are approved." + "You will be notified when they are approved.", + ) + return HttpResponseRedirect( + reverse( + "parks:rides:ride_detail", + kwargs={"park_slug": self.park.slug, "ride_slug": self.object.slug}, + ) ) - return HttpResponseRedirect(reverse('parks:rides:ride_detail', kwargs={ - 'park_slug': self.park.slug, - 'ride_slug': self.object.slug - })) - def form_invalid(self, form): - messages.error( - self.request, - "Please correct the errors below. Required fields are marked with an asterisk (*)." - ) - for field, errors in form.errors.items(): - for error in errors: - messages.error(self.request, f"{field}: {error}") + def form_valid(self, form: RideForm) -> HttpResponseRedirect: + cleaned_data = prepare_form_data(form.cleaned_data, self.park) + return self.handle_submission(form, cleaned_data) + + def form_invalid(self, form: RideForm) -> Union[HttpResponse, HttpResponseRedirect]: + """Handle invalid form submission. + + Args: + form: The invalid form + + Returns: + Response with error messages + """ + handle_form_errors(self.request, form) return super().form_invalid(form) - def get_success_url(self): - return reverse('parks:rides:ride_detail', kwargs={ - 'park_slug': self.park.slug, - 'ride_slug': self.object.slug - }) + def get_success_url(self) -> str: + return reverse( + "parks:rides:ride_detail", + kwargs={"park_slug": self.park.slug, "ride_slug": self.object.slug}, + ) -class RideDetailView(SlugRedirectMixin, EditSubmissionMixin, PhotoSubmissionMixin, HistoryMixin, DetailView): + +class RideDetailView( + SlugRedirectMixin, + EditSubmissionMixin, + PhotoSubmissionMixin, + HistoryMixin, + DetailView, +): model = Ride - template_name = 'rides/ride_detail.html' - context_object_name = 'ride' - slug_url_kwarg = 'ride_slug' + template_name = "rides/ride_detail.html" + context_object_name = "ride" + slug_url_kwarg = "ride_slug" def get_object(self, queryset=None): if queryset is None: queryset = self.get_queryset() - park_slug = self.kwargs.get('park_slug') - ride_slug = self.kwargs.get('ride_slug') - # Try to get by current or historical slug - obj, is_old_slug = self.model.get_by_slug(ride_slug) + park_slug = self.kwargs.get("park_slug") + ride_slug = self.kwargs.get("ride_slug") + obj, is_old_slug = self.model.get_by_slug(ride_slug) # type: ignore[attr-defined] if obj.park.slug != park_slug: raise self.model.DoesNotExist("Park slug doesn't match") return obj - def get_context_data(self, **kwargs): + def get_context_data(self, **kwargs) -> Dict[str, Any]: context = super().get_context_data(**kwargs) - if self.object.category == 'RC': - context['coaster_stats'] = RollerCoasterStats.objects.filter(ride=self.object).first() + if self.object.category == "RC": + context["coaster_stats"] = RollerCoasterStats.objects.filter( + ride=self.object + ).first() return context - def get_redirect_url_pattern(self): - return 'parks:rides:ride_detail' + def get_redirect_url_pattern(self) -> str: + return "parks:rides:ride_detail" + + def get_redirect_url_kwargs(self) -> Dict[str, Any]: + return {"park_slug": self.object.park.slug, "ride_slug": self.object.slug} - def get_redirect_url_kwargs(self): - return { - 'park_slug': self.object.park.slug, - 'ride_slug': self.object.slug - } class RideListView(ListView): model = Ride - template_name = 'rides/ride_list.html' - context_object_name = 'rides' + template_name = "rides/ride_list.html" + context_object_name = "rides" - def setup(self, request, *args, **kwargs): + def setup(self, request: HttpRequest, *args: Any, **kwargs: Any) -> None: super().setup(request, *args, **kwargs) self.park = None - if 'park_slug' in self.kwargs: - self.park = get_object_or_404(Park, slug=self.kwargs['park_slug']) + if "park_slug" in self.kwargs: + self.park = get_object_or_404(Park, slug=self.kwargs["park_slug"]) def get_queryset(self): - queryset = Ride.objects.select_related('park', 'coaster_stats', 'manufacturer').prefetch_related('photos') - - # Filter by park if viewing park-specific rides + queryset = Ride.objects.select_related( + "park", "coaster_stats", "manufacturer" + ).prefetch_related("photos") + if self.park: queryset = queryset.filter(park=self.park) - - search = self.request.GET.get('search', '').strip() or None - category = self.request.GET.get('category', '').strip() or None - status = self.request.GET.get('status', '').strip() or None - manufacturer = self.request.GET.get('manufacturer', '').strip() or None - + + search = self.request.GET.get("search", "").strip() or None + category = self.request.GET.get("category", "").strip() or None + status = self.request.GET.get("status", "").strip() or None + manufacturer = self.request.GET.get("manufacturer", "").strip() or None + if search: if self.park: queryset = queryset.filter(name__icontains=search) else: queryset = queryset.filter( - Q(name__icontains=search) | - Q(park__name__icontains=search) + Q(name__icontains=search) | Q(park__name__icontains=search) ) if category: queryset = queryset.filter(category=category) @@ -351,37 +472,34 @@ class RideListView(ListView): queryset = queryset.filter(status=status) if manufacturer: queryset = queryset.exclude(manufacturer__isnull=True) - + return queryset - def get_context_data(self, **kwargs): + def get_context_data(self, **kwargs) -> Dict[str, Any]: context = super().get_context_data(**kwargs) - context['park'] = self.park + context["park"] = self.park - # Get manufacturers for the filter dropdown manufacturer_query = Ride.objects if self.park: manufacturer_query = manufacturer_query.filter(park=self.park) - - context['manufacturers'] = list( + + context["manufacturers"] = list( manufacturer_query.exclude(manufacturer__isnull=True) - .values_list('manufacturer__name', flat=True) - .distinct().order_by('manufacturer__name') + .values_list("manufacturer__name", flat=True) + .distinct() + .order_by("manufacturer__name") ) - # Add current filter values to context - context['current_filters'] = { - 'search': self.request.GET.get('search', ''), - 'category': self.request.GET.get('category', ''), - 'status': self.request.GET.get('status', ''), - 'manufacturer': self.request.GET.get('manufacturer', '') + context["current_filters"] = { + "search": self.request.GET.get("search", ""), + "category": self.request.GET.get("category", ""), + "status": self.request.GET.get("status", ""), + "manufacturer": self.request.GET.get("manufacturer", ""), } - + return context - def get(self, request, *args, **kwargs): - # Check if this is an HTMX request - if request.htmx: - # If it is, return just the rides list partial - self.template_name = 'rides/partials/ride_list.html' + def get(self, request: HttpRequest, *args: Any, **kwargs: Any): + if getattr(request, "htmx", False): # type: ignore[attr-defined] + self.template_name = "rides/partials/ride_list.html" return super().get(request, *args, **kwargs) diff --git a/static/css/tailwind.css b/static/css/tailwind.css index 9dd3d5da..4f32e735 100644 --- a/static/css/tailwind.css +++ b/static/css/tailwind.css @@ -2225,6 +2225,14 @@ select { z-index: 60; } +.col-span-1 { + grid-column: span 1 / span 1; +} + +.col-span-12 { + grid-column: span 12 / span 12; +} + .col-span-2 { grid-column: span 2 / span 2; } @@ -2237,26 +2245,6 @@ select { grid-column: 1 / -1; } -.col-span-4 { - grid-column: span 4 / span 4; -} - -.col-span-8 { - grid-column: span 8 / span 8; -} - -.col-span-9 { - grid-column: span 9 / span 9; -} - -.col-span-1 { - grid-column: span 1 / span 1; -} - -.col-span-12 { - grid-column: span 12 / span 12; -} - .mx-1 { margin-left: 0.25rem; margin-right: 0.25rem; @@ -2285,6 +2273,10 @@ select { margin-bottom: 0.25rem; } +.mb-10 { + margin-bottom: 2.5rem; +} + .mb-12 { margin-bottom: 3rem; } @@ -2309,6 +2301,10 @@ select { margin-bottom: 2rem; } +.ml-0\.5 { + margin-left: 0.125rem; +} + .ml-1 { margin-left: 0.25rem; } @@ -2321,6 +2317,10 @@ select { margin-left: 1.5rem; } +.mr-0\.5 { + margin-right: 0.125rem; +} + .mr-1 { margin-right: 0.25rem; } @@ -2333,6 +2333,10 @@ select { margin-right: 0.75rem; } +.mt-0\.5 { + margin-top: 0.125rem; +} + .mt-1 { margin-top: 0.25rem; } @@ -2357,38 +2361,6 @@ select { margin-top: auto; } -.mt-0\.5 { - margin-top: 0.125rem; -} - -.mt-8 { - margin-top: 2rem; -} - -.mr-1\.5 { - margin-right: 0.375rem; -} - -.mb-0\.5 { - margin-bottom: 0.125rem; -} - -.ml-0\.5 { - margin-left: 0.125rem; -} - -.mr-0\.5 { - margin-right: 0.125rem; -} - -.mt-1\.5 { - margin-top: 0.375rem; -} - -.mb-10 { - margin-bottom: 2.5rem; -} - .block { display: block; } @@ -2453,18 +2425,14 @@ select { height: 300px; } -.h-full { - height: 100%; -} - -.h-\[340px\] { - height: 340px; -} - .h-auto { height: auto; } +.h-full { + height: 100%; +} + .max-h-60 { max-height: 15rem; } @@ -2473,10 +2441,6 @@ select { max-height: 90vh; } -.max-h-\[340px\] { - max-height: 340px; -} - .min-h-\[calc\(100vh-16rem\)\] { min-height: calc(100vh - 16rem); } @@ -2485,14 +2449,6 @@ select { min-height: 100vh; } -.min-h-0 { - min-height: 0px; -} - -.min-h-\[200px\] { - min-height: 200px; -} - .w-16 { width: 4rem; } @@ -2566,10 +2522,6 @@ select { flex: 1 1 0%; } -.flex-shrink-0 { - flex-shrink: 0; -} - .flex-grow { flex-grow: 1; } @@ -2619,36 +2571,24 @@ select { cursor: pointer; } -.resize { - resize: both; -} - -.auto-rows-fr { - grid-auto-rows: minmax(0, 1fr); -} - -.auto-rows-min { - grid-auto-rows: min-content; -} - .grid-cols-1 { grid-template-columns: repeat(1, minmax(0, 1fr)); } +.grid-cols-12 { + grid-template-columns: repeat(12, minmax(0, 1fr)); +} + .grid-cols-2 { grid-template-columns: repeat(2, minmax(0, 1fr)); } -.grid-cols-4 { - grid-template-columns: repeat(4, minmax(0, 1fr)); -} - .grid-cols-3 { grid-template-columns: repeat(3, minmax(0, 1fr)); } -.grid-cols-12 { - grid-template-columns: repeat(12, minmax(0, 1fr)); +.grid-cols-4 { + grid-template-columns: repeat(4, minmax(0, 1fr)); } .flex-col { @@ -2683,6 +2623,10 @@ select { justify-content: space-between; } +.gap-1 { + gap: 0.25rem; +} + .gap-2 { gap: 0.5rem; } @@ -2695,45 +2639,6 @@ select { gap: 1.5rem; } -.gap-3 { - gap: 0.75rem; -} - -.gap-8 { - gap: 2rem; -} - -.gap-1\.5 { - gap: 0.375rem; -} - -.gap-1 { - gap: 0.25rem; -} - -.gap-x-8 { - -moz-column-gap: 2rem; - column-gap: 2rem; -} - -.gap-y-6 { - row-gap: 1.5rem; -} - -.gap-x-6 { - -moz-column-gap: 1.5rem; - column-gap: 1.5rem; -} - -.gap-y-4 { - row-gap: 1rem; -} - -.gap-x-4 { - -moz-column-gap: 1rem; - column-gap: 1rem; -} - .space-x-2 > :not([hidden]) ~ :not([hidden]) { --tw-space-x-reverse: 0; margin-right: calc(0.5rem * var(--tw-space-x-reverse)); @@ -2784,10 +2689,6 @@ select { overflow: hidden; } -.overflow-y-auto { - overflow-y: auto; -} - .rounded { border-radius: 0.25rem; } @@ -2923,6 +2824,11 @@ select { background-color: rgb(37 99 235 / var(--tw-bg-opacity)); } +.bg-gray-100 { + --tw-bg-opacity: 1; + background-color: rgb(243 244 246 / var(--tw-bg-opacity)); +} + .bg-gray-200 { --tw-bg-opacity: 1; background-color: rgb(229 231 235 / var(--tw-bg-opacity)); @@ -2991,11 +2897,6 @@ select { background-color: rgb(202 138 4 / var(--tw-bg-opacity)); } -.bg-gray-100 { - --tw-bg-opacity: 1; - background-color: rgb(243 244 246 / var(--tw-bg-opacity)); -} - .bg-opacity-50 { --tw-bg-opacity: 0.5; } @@ -3047,6 +2948,14 @@ select { object-fit: cover; } +.p-0\.5 { + padding: 0.125rem; +} + +.p-1\.5 { + padding: 0.375rem; +} + .p-2 { padding: 0.5rem; } @@ -3067,18 +2976,6 @@ select { padding: 2rem; } -.p-2\.5 { - padding: 0.625rem; -} - -.p-0\.5 { - padding: 0.125rem; -} - -.p-1\.5 { - padding: 0.375rem; -} - .px-2 { padding-left: 0.5rem; padding-right: 0.5rem; @@ -3104,6 +3001,11 @@ select { padding-right: 2rem; } +.py-0\.5 { + padding-top: 0.125rem; + padding-bottom: 0.125rem; +} + .py-1 { padding-top: 0.25rem; padding-bottom: 0.25rem; @@ -3144,11 +3046,6 @@ select { padding-bottom: 2rem; } -.py-0\.5 { - padding-top: 0.125rem; - padding-bottom: 0.125rem; -} - .pb-4 { padding-bottom: 1rem; } @@ -3157,10 +3054,6 @@ select { text-align: center; } -.align-middle { - vertical-align: middle; -} - .text-2xl { font-size: 1.5rem; line-height: 2rem; @@ -3196,11 +3089,6 @@ select { line-height: 1rem; } -.text-base { - font-size: 1rem; - line-height: 1.5rem; -} - .font-bold { font-weight: 700; } @@ -3237,6 +3125,11 @@ select { color: rgb(30 64 175 / var(--tw-text-opacity)); } +.text-gray-200 { + --tw-text-opacity: 1; + color: rgb(229 231 235 / var(--tw-text-opacity)); +} + .text-gray-300 { --tw-text-opacity: 1; color: rgb(209 213 219 / var(--tw-text-opacity)); @@ -3267,6 +3160,11 @@ select { color: rgb(17 24 39 / var(--tw-text-opacity)); } +.text-green-600 { + --tw-text-opacity: 1; + color: rgb(22 163 74 / var(--tw-text-opacity)); +} + .text-green-800 { --tw-text-opacity: 1; color: rgb(22 101 52 / var(--tw-text-opacity)); @@ -3297,6 +3195,11 @@ select { color: rgb(153 27 27 / var(--tw-text-opacity)); } +.text-sky-900 { + --tw-text-opacity: 1; + color: rgb(12 74 110 / var(--tw-text-opacity)); +} + .text-transparent { color: transparent; } @@ -3326,21 +3229,6 @@ select { color: rgb(133 77 14 / var(--tw-text-opacity)); } -.text-green-600 { - --tw-text-opacity: 1; - color: rgb(22 163 74 / var(--tw-text-opacity)); -} - -.text-sky-400 { - --tw-text-opacity: 1; - color: rgb(56 189 248 / var(--tw-text-opacity)); -} - -.text-sky-900 { - --tw-text-opacity: 1; - color: rgb(12 74 110 / var(--tw-text-opacity)); -} - .opacity-0 { opacity: 0; } @@ -3430,14 +3318,14 @@ select { transition-duration: 150ms; } -.transition-transform { - transition-property: transform; +.transition-shadow { + transition-property: box-shadow; transition-timing-function: cubic-bezier(0.4, 0, 0.2, 1); transition-duration: 150ms; } -.transition-shadow { - transition-property: box-shadow; +.transition-transform { + transition-property: transform; transition-timing-function: cubic-bezier(0.4, 0, 0.2, 1); transition-duration: 150ms; } @@ -3496,11 +3384,6 @@ select { transform: translate(var(--tw-translate-x), var(--tw-translate-y)) rotate(var(--tw-rotate)) skewX(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y)); } -.hover\:translate-x-2:hover { - --tw-translate-x: 0.5rem; - transform: translate(var(--tw-translate-x), var(--tw-translate-y)) rotate(var(--tw-rotate)) skewX(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y)); -} - .hover\:scale-105:hover { --tw-scale-x: 1.05; --tw-scale-y: 1.05; @@ -3528,6 +3411,11 @@ select { background-color: rgb(243 244 246 / var(--tw-bg-opacity)); } +.hover\:bg-gray-200:hover { + --tw-bg-opacity: 1; + background-color: rgb(229 231 235 / var(--tw-bg-opacity)); +} + .hover\:bg-gray-300:hover { --tw-bg-opacity: 1; background-color: rgb(209 213 219 / var(--tw-bg-opacity)); @@ -3562,11 +3450,6 @@ select { background-color: rgb(202 138 4 / var(--tw-bg-opacity)); } -.hover\:bg-gray-200:hover { - --tw-bg-opacity: 1; - background-color: rgb(229 231 235 / var(--tw-bg-opacity)); -} - .hover\:text-blue-500:hover { --tw-text-opacity: 1; color: rgb(59 130 246 / var(--tw-text-opacity)); @@ -3606,31 +3489,11 @@ select { color: rgb(79 70 229 / 0.8); } -.hover\:text-sky-300:hover { - --tw-text-opacity: 1; - color: rgb(125 211 252 / var(--tw-text-opacity)); -} - -.hover\:text-sky-900:hover { - --tw-text-opacity: 1; - color: rgb(12 74 110 / var(--tw-text-opacity)); -} - -.hover\:text-sky-950:hover { - --tw-text-opacity: 1; - color: rgb(8 47 73 / var(--tw-text-opacity)); -} - .hover\:text-sky-800:hover { --tw-text-opacity: 1; color: rgb(7 89 133 / var(--tw-text-opacity)); } -.hover\:text-blue-800:hover { - --tw-text-opacity: 1; - color: rgb(30 64 175 / var(--tw-text-opacity)); -} - .hover\:underline:hover { text-decoration-line: underline; } @@ -3641,6 +3504,12 @@ select { box-shadow: var(--tw-ring-offset-shadow, 0 0 #0000), var(--tw-ring-shadow, 0 0 #0000), var(--tw-shadow); } +.hover\:shadow-xl:hover { + --tw-shadow: 0 20px 25px -5px rgb(0 0 0 / 0.1), 0 8px 10px -6px rgb(0 0 0 / 0.1); + --tw-shadow-colored: 0 20px 25px -5px var(--tw-shadow-color), 0 8px 10px -6px var(--tw-shadow-color); + box-shadow: var(--tw-ring-offset-shadow, 0 0 #0000), var(--tw-ring-shadow, 0 0 #0000), var(--tw-shadow); +} + .focus\:border-blue-500:focus { --tw-border-opacity: 1; border-color: rgb(59 130 246 / var(--tw-border-opacity)); @@ -3853,6 +3722,11 @@ select { color: rgb(187 247 208 / var(--tw-text-opacity)); } +.dark\:text-green-400:is(.dark *) { + --tw-text-opacity: 1; + color: rgb(74 222 128 / var(--tw-text-opacity)); +} + .dark\:text-green-900:is(.dark *) { --tw-text-opacity: 1; color: rgb(20 83 45 / var(--tw-text-opacity)); @@ -3878,6 +3752,11 @@ select { color: rgb(127 29 29 / var(--tw-text-opacity)); } +.dark\:text-sky-400:is(.dark *) { + --tw-text-opacity: 1; + color: rgb(56 189 248 / var(--tw-text-opacity)); +} + .dark\:text-white:is(.dark *) { --tw-text-opacity: 1; color: rgb(255 255 255 / var(--tw-text-opacity)); @@ -3903,16 +3782,6 @@ select { color: rgb(254 252 232 / var(--tw-text-opacity)); } -.dark\:text-green-400:is(.dark *) { - --tw-text-opacity: 1; - color: rgb(74 222 128 / var(--tw-text-opacity)); -} - -.dark\:text-sky-400:is(.dark *) { - --tw-text-opacity: 1; - color: rgb(56 189 248 / var(--tw-text-opacity)); -} - .dark\:ring-1:is(.dark *) { --tw-ring-offset-shadow: var(--tw-ring-inset) 0 0 0 var(--tw-ring-offset-width) var(--tw-ring-offset-color); --tw-ring-shadow: var(--tw-ring-inset) 0 0 0 calc(1px + var(--tw-ring-offset-width)) var(--tw-ring-color); @@ -3986,39 +3855,20 @@ select { color: rgb(79 70 229 / var(--tw-text-opacity)); } -.dark\:hover\:text-sky-400:hover:is(.dark *) { - --tw-text-opacity: 1; - color: rgb(56 189 248 / var(--tw-text-opacity)); -} - -.dark\:hover\:text-sky-600:hover:is(.dark *) { - --tw-text-opacity: 1; - color: rgb(2 132 199 / var(--tw-text-opacity)); -} - -.dark\:hover\:text-sky-200:hover:is(.dark *) { - --tw-text-opacity: 1; - color: rgb(186 230 253 / var(--tw-text-opacity)); -} - .dark\:hover\:text-sky-300:hover:is(.dark *) { --tw-text-opacity: 1; color: rgb(125 211 252 / var(--tw-text-opacity)); } @media (min-width: 640px) { - .sm\:col-span-2 { - grid-column: span 2 / span 2; + .sm\:col-span-3 { + grid-column: span 3 / span 3; } .sm\:col-span-4 { grid-column: span 4 / span 4; } - .sm\:col-span-3 { - grid-column: span 3 / span 3; - } - .sm\:col-span-8 { grid-column: span 8 / span 8; } @@ -4027,68 +3877,20 @@ select { grid-column: span 9 / span 9; } - .sm\:mb-8 { - margin-bottom: 2rem; - } - .sm\:mb-16 { margin-bottom: 4rem; } - .sm\:flex { - display: flex; - } - - .sm\:h-\[340px\] { - height: 340px; - } - - .sm\:h-\[300px\] { - height: 300px; - } - - .sm\:h-\[200px\] { - height: 200px; - } - - .sm\:h-\[160px\] { - height: 160px; - } - - .sm\:h-\[140px\] { - height: 140px; - } - - .sm\:h-auto { - height: auto; - } - - .sm\:grid-cols-2 { - grid-template-columns: repeat(2, minmax(0, 1fr)); - } - - .sm\:grid-cols-6 { - grid-template-columns: repeat(6, minmax(0, 1fr)); - } - - .sm\:grid-cols-12 { - grid-template-columns: repeat(12, minmax(0, 1fr)); - } - - .sm\:grid-cols-4 { - grid-template-columns: repeat(4, minmax(0, 1fr)); - } - .sm\:grid-cols-1 { grid-template-columns: repeat(1, minmax(0, 1fr)); } - .sm\:flex-col { - flex-direction: column; + .sm\:grid-cols-12 { + grid-template-columns: repeat(12, minmax(0, 1fr)); } - .sm\:gap-4 { - gap: 1rem; + .sm\:grid-cols-2 { + grid-template-columns: repeat(2, minmax(0, 1fr)); } .sm\:space-x-4 > :not([hidden]) ~ :not([hidden]) { @@ -4103,6 +3905,11 @@ select { margin-left: calc(1.5rem * calc(1 - var(--tw-space-x-reverse))); } + .sm\:text-2xl { + font-size: 1.5rem; + line-height: 2rem; + } + .sm\:text-3xl { font-size: 1.875rem; line-height: 2.25rem; @@ -4118,52 +3925,18 @@ select { line-height: 1.25rem; } - .sm\:text-4xl { - font-size: 2.25rem; - line-height: 2.5rem; - } - - .sm\:text-lg { - font-size: 1.125rem; - line-height: 1.75rem; - } - .sm\:text-xs { font-size: 0.75rem; line-height: 1rem; } - .sm\:text-2xl { - font-size: 1.5rem; - line-height: 2rem; + .sm\:text-xl { + font-size: 1.25rem; + line-height: 1.75rem; } } @media (min-width: 768px) { - .md\:col-span-2 { - grid-column: span 2 / span 2; - } - - .md\:col-span-3 { - grid-column: span 3 / span 3; - } - - .md\:col-span-9 { - grid-column: span 9 / span 9; - } - - .md\:col-span-4 { - grid-column: span 4 / span 4; - } - - .md\:col-span-8 { - grid-column: span 8 / span 8; - } - - .md\:mt-0 { - margin-top: 0px; - } - .md\:mb-8 { margin-bottom: 2rem; } @@ -4184,14 +3957,6 @@ select { grid-template-columns: repeat(4, minmax(0, 1fr)); } - .md\:grid-cols-8 { - grid-template-columns: repeat(8, minmax(0, 1fr)); - } - - .md\:grid-cols-12 { - grid-template-columns: repeat(12, minmax(0, 1fr)); - } - .md\:flex-row { flex-direction: row; } @@ -4200,10 +3965,6 @@ select { align-items: center; } - .md\:justify-between { - justify-content: space-between; - } - .md\:text-2xl { font-size: 1.5rem; line-height: 2rem; @@ -4224,38 +3985,6 @@ select { grid-column: span 2 / span 2; } - .lg\:col-span-4 { - grid-column: span 4 / span 4; - } - - .lg\:col-span-8 { - grid-column: span 8 / span 8; - } - - .lg\:col-span-3 { - grid-column: span 3 / span 3; - } - - .lg\:col-span-5 { - grid-column: span 5 / span 5; - } - - .lg\:mb-0 { - margin-bottom: 0px; - } - - .lg\:mr-6 { - margin-right: 1.5rem; - } - - .lg\:ml-8 { - margin-left: 2rem; - } - - .lg\:mt-0 { - margin-top: 0px; - } - .lg\:flex { display: flex; } @@ -4264,18 +3993,6 @@ select { display: none; } - .lg\:w-1\/3 { - width: 33.333333%; - } - - .lg\:w-1\/2 { - width: 50%; - } - - .lg\:flex-1 { - flex: 1 1 0%; - } - .lg\:grid-cols-3 { grid-template-columns: repeat(3, minmax(0, 1fr)); } @@ -4284,38 +4001,8 @@ select { grid-template-columns: repeat(4, minmax(0, 1fr)); } - .lg\:grid-cols-12 { - grid-template-columns: repeat(12, minmax(0, 1fr)); - } - - .lg\:grid-cols-5 { - grid-template-columns: repeat(5, minmax(0, 1fr)); - } - - .lg\:grid-cols-6 { - grid-template-columns: repeat(6, minmax(0, 1fr)); - } - - .lg\:flex-row { - flex-direction: row; - } - - .lg\:items-start { - align-items: flex-start; - } - - .lg\:justify-between { - justify-content: space-between; - } - .lg\:text-6xl { font-size: 3.75rem; line-height: 1; } } - -@media (min-width: 1280px) { - .xl\:grid-cols-4 { - grid-template-columns: repeat(4, minmax(0, 1fr)); - } -} diff --git a/static/js/photo-gallery.js b/static/js/photo-gallery.js new file mode 100644 index 00000000..2705dcab --- /dev/null +++ b/static/js/photo-gallery.js @@ -0,0 +1,91 @@ +document.addEventListener('alpine:init', () => { + Alpine.data('photoDisplay', ({ photos, contentType, objectId, csrfToken, uploadUrl }) => ({ + photos, + fullscreenPhoto: null, + uploading: false, + uploadProgress: 0, + error: null, + showSuccess: false, + + showFullscreen(photo) { + this.fullscreenPhoto = photo; + }, + + async handleFileSelect(event) { + const files = Array.from(event.target.files); + if (!files.length) { + return; + } + + this.uploading = true; + this.uploadProgress = 0; + this.error = null; + this.showSuccess = false; + + const totalFiles = files.length; + let completedFiles = 0; + + for (const file of files) { + const formData = new FormData(); + formData.append('image', file); + formData.append('app_label', contentType.split('.')[0]); + formData.append('model', contentType.split('.')[1]); + formData.append('object_id', objectId); + + try { + const response = await fetch(uploadUrl, { + method: 'POST', + headers: { + 'X-CSRFToken': csrfToken, + }, + body: formData + }); + + if (!response.ok) { + const data = await response.json(); + throw new Error(data.error || 'Upload failed'); + } + + const photo = await response.json(); + this.photos.push(photo); + completedFiles++; + this.uploadProgress = (completedFiles / totalFiles) * 100; + } catch (err) { + this.error = err.message || 'Failed to upload photo. Please try again.'; + console.error('Upload error:', err); + break; + } + } + + this.uploading = false; + event.target.value = ''; // Reset file input + + if (!this.error) { + this.showSuccess = true; + setTimeout(() => { + this.showSuccess = false; + }, 3000); + } + }, + + async sharePhoto(photo) { + if (navigator.share) { + try { + await navigator.share({ + title: photo.caption || 'Shared photo', + url: photo.url + }); + } catch (err) { + if (err.name !== 'AbortError') { + console.error('Error sharing:', err); + } + } + } else { + // Fallback: copy URL to clipboard + navigator.clipboard.writeText(photo.url) + .then(() => alert('Photo URL copied to clipboard!')) + .catch(err => console.error('Error copying to clipboard:', err)); + } + } + })); +}); diff --git a/templates/home.html b/templates/home.html index dbe3980f..07f668da 100644 --- a/templates/home.html +++ b/templates/home.html @@ -29,88 +29,167 @@ -
- +
+

- Popular Parks + Trending Parks

- {% for park in popular_parks %} - -
- {{ park.name }} -
-
- {{ park.location }} -
- {% if park.average_rating %} -
- + {% endblock %} diff --git a/templates/media/partials/photo_display.html b/templates/media/partials/photo_display.html index c18d24c4..e7d18563 100644 --- a/templates/media/partials/photo_display.html +++ b/templates/media/partials/photo_display.html @@ -118,96 +118,3 @@
- - - diff --git a/templates/parks/park_detail.html b/templates/parks/park_detail.html index df15234c..9f7627f9 100644 --- a/templates/parks/park_detail.html +++ b/templates/parks/park_detail.html @@ -37,20 +37,20 @@ {% endif %} -
+
-
+

{{ park.name }}

{% if park.formatted_location %} -
+

{{ park.formatted_location }}

{% endif %} -
- + - + + {{ park.average_rating|floatformat:1 }}/10 {% endif %} @@ -67,36 +67,36 @@
-
+
-
+
{% if park.total_rides %} + class="flex flex-col items-center justify-center p-4 text-center transition-transform bg-white rounded-lg shadow-lg hover:scale-[1.02] dark:bg-gray-800">
Total Rides
-
{{ park.total_rides }}
+
{{ park.total_rides }}
{% endif %} {% if park.total_roller_coasters %} -
+
Roller Coasters
-
{{ park.total_roller_coasters }}
+
{{ park.total_roller_coasters }}
{% endif %}
-
+
{% if park.owner %} -
- -
Owner
+
+ +
Owner
+ class="text-xs text-blue-600 sm:text-sm hover:text-blue-700 dark:text-blue-400 dark:hover:text-blue-300"> {{ park.owner.name }}
@@ -104,23 +104,23 @@ {% endif %} {% if park.opening_date %} -
- -
Opened
-
{{ park.opening_date }}
+
+ +
Opened
+
{{ park.opening_date }}
{% endif %} {% if park.website %} -
- -
Website
+
+ +
Website
Visit - +
@@ -129,7 +129,7 @@
- + {% if park.photos.exists %}

Photos

@@ -225,6 +225,7 @@
+
{% if perms.media.add_photo %} @@ -252,16 +253,20 @@
{% endif %} -{% if park.latitude and park.longitude %} - {% block extra_js %} - - - - {% endblock %} -{% endif %} - +{% endblock %} + +{% block extra_js %} + + + + +{% if park.latitude and park.longitude %} + + + +{% endif %} {% endblock %} diff --git a/templates/rides/ride_detail.html b/templates/rides/ride_detail.html index 47741f94..7392df59 100644 --- a/templates/rides/ride_detail.html +++ b/templates/rides/ride_detail.html @@ -22,12 +22,12 @@ {% endif %} -
+
-
+

{{ ride.name }}

-
+
at {{ ride.park.name }} @@ -36,20 +36,20 @@ {% endif %}
-
- + {{ ride.get_status_display }} - + {{ ride.get_category_display }} {% if ride.average_rating %} - - + + {{ ride.average_rating|floatformat:1 }}/10 {% endif %} @@ -57,46 +57,46 @@
-
+
-
+
{% if coaster_stats %} {% if coaster_stats.height_ft %} -
+
Height
-
{{ coaster_stats.height_ft }} ft
+
{{ coaster_stats.height_ft }} ft
{% endif %} {% if coaster_stats.speed_mph %} -
+
Speed
-
{{ coaster_stats.speed_mph }} mph
+
{{ coaster_stats.speed_mph }} mph
{% endif %} {% if coaster_stats.inversions %} -
+
Inversions
-
{{ coaster_stats.inversions }}
+
{{ coaster_stats.inversions }}
{% endif %} {% if coaster_stats.length_ft %} -
+
Length
-
{{ coaster_stats.length_ft }} ft
+
{{ coaster_stats.length_ft }} ft
{% endif %} {% endif %}
-
+
{% if ride.manufacturer %} -
- -
Manufacturer
+
+ +
Manufacturer
+ class="text-xs text-blue-600 sm:text-sm hover:text-blue-700 dark:text-blue-400 dark:hover:text-blue-300"> {{ ride.manufacturer.name }}
@@ -104,12 +104,12 @@ {% endif %} {% if ride.designer %} -
- -
Designer
+
+ +
Designer
+ class="text-xs text-blue-600 sm:text-sm hover:text-blue-700 dark:text-blue-400 dark:hover:text-blue-300"> {{ ride.designer.name }}
@@ -117,49 +117,49 @@ {% endif %} {% if coaster_stats.roller_coaster_type %} -
- -
Coaster Type
-
{{ coaster_stats.get_roller_coaster_type_display }}
+
+ +
Coaster Type
+
{{ coaster_stats.get_roller_coaster_type_display }}
{% endif %} {% if coaster_stats.track_material %} -
- -
Track Material
-
{{ coaster_stats.get_track_material_display }}
+
+ +
Track Material
+
{{ coaster_stats.get_track_material_display }}
{% endif %} {% if ride.opening_date %} -
- -
Opened
-
{{ ride.opening_date }}
+
+ +
Opened
+
{{ ride.opening_date }}
{% endif %} {% if ride.capacity_per_hour %} -
- -
Capacity
-
{{ ride.capacity_per_hour }}/hr
+
+ +
Capacity
+
{{ ride.capacity_per_hour }}/hr
{% endif %} {% if coaster_stats.launch_type %} -
- -
Launch Type
-
{{ coaster_stats.get_launch_type_display }}
+
+ +
Launch Type
+
{{ coaster_stats.get_launch_type_display }}
{% endif %}
- + {% if ride.photos.exists %}

Photos

@@ -486,3 +486,7 @@
{% endif %} {% endblock %} + +{% block extra_js %} + +{% endblock %} diff --git a/thrillwiki/__pycache__/settings.cpython-312.pyc b/thrillwiki/__pycache__/settings.cpython-312.pyc index d24daa643eefd756e2bdf93c9940ae115898e055..67b8dc4fb253cf0b7bfe25bbf25d2c5c1798c6f9 100644 GIT binary patch delta 1074 zcmb7DIZPWt6y2F!-(GXrfX!iyIn812GZ%Lt2OtGf{Km3)n`Iq?Bij-JDYCnCQILx$ zl9hs%(p{>Qk)f2?Lc^uHN!eN|PvB)(6+9=+Oo zx}HM2z2NYtjCO;!rO#bVJ8O9svpUJmFCCa5Bn>zEk~Re42} zs6jQ=q6W2a!y~K?^=QbO4MuLkdf`JOn$RrHx8xPUdf=xzxTzkk2ne8D8?|3iM)(SOz9lcm=ROn5&OHi_a}1yDq_L| z!OrG6^^1%Hn4_@pgP5nx5Ef_{i!^epzLzR(kKRhRT+xk{b(w!J#m(0Q4=ciPtk48j zX%dfU>Oc-XJ`C9xW6?c55lCt2w6UkB0xuHDKzb)>#N+$MOC#_qnTToI>9GC0R4v4c z%0@K3vvxR&SZ+ps#{7l1vWu%lTXZiPKS&$fsgSGi(R9H5-4!OhYXEU=Kbq9S8&O?* zZfN@jr!~%dd?IJj`ec1!ZgX{gt!UX?eY&*1wV7-d{CVlEC4&MES90I1o?OP^DSWZ_ z$>!-&V5aa(U1s*_q9qbRVmlHk%vRMazS2)A2~!2}G%jSu*bmN`^3$4&xw{6=)cLIa v!YtX;tm(UV{Ip@>RPvnFc;1<^>ZQ50mSV delta 967 zcmb7DOHUI~6u$S)bZ84R&=)O_7D}PC(DHuz0z}XnwVM*ni5ruznY6(TuE3af=T^hQ zm~_P!H)huU0yiuPZrr*fB<_syOnC&O3%JQS=brDJ@67ooGjH=BbJkbW^b091$TK8Fodu$0EZ9K``lNAZ8 zq4R?}&`tq#Ab=o3Y+*#u*)S@Sf;EPth@lJJ=wU){LuWXIIE4|U2omUHG=cu6Pd5EP zMcO)bB1KUQQjGORO~G=Wu`yw=+HcqHL diff --git a/thrillwiki/__pycache__/views.cpython-312.pyc b/thrillwiki/__pycache__/views.cpython-312.pyc index a666c36caea3e4122e4666bf65df37b5610030aa..d80cadf1222a2597cf00a49f31bedf21764f481d 100644 GIT binary patch delta 2839 zcmcH*S#KLfc*c7=K4T|w?B;TlxHW0gBu*2RmeRC@Qf}0$P`6-hyz6+=wH;>Hv_+0w zq&~C~N5TpLPc2fVQo%!{{sDw|;E<4`fLfMB@W7$IS=16$5fU?FJ9R3hf(J(0Z@&5N z@7tMg=I#D(WA1NUt|owo71}=YRqLX=9a@Xq28tOWE@Z^G2!RY_Rsfc2(Au0e}O zN>)}-6k5)sN@h-z4CR=roQ|>VrJn!1n2|q><2`maxE1qs!tgI<$*YGgv zzyu%uP>_I-dD)ii7clC;-|aaLfcN10z#z(WToeo7EfxUTXKrVHb$IIZS+5zk`vcr3 zHOYC#*vRXco@WcpIb;V035^be1V+bfTOGSM8`w>C$bu|>YOk01o{Iv5+8f-olMwt| zfsvc)vJhlP4c5#uop1}`x*VT6>-w{ugi>_X*Z4n+Au!Jr*#8tI-JB%OO`>EA?8Yc- zN!2EEr=9l}*o`5Z8q>X5z@7I8%r+GCfvI*hYPv(9p7=b6Etr>>$Yw4#)TmLBFK`9^ zb)3n(V1(;=&2Ft@_vV67cLqU$DcEGsUd$}881qt0s8%1Zo9Wti1oQ%#GHgq=?!b7%8GuA9LQT_k3?-2m(JypZgHBLQ4Q7W2EZKQ24Rbt;KD`Al~!lc zif$wjZU^!;5cOG{o}W{Y<(*NCL^78(lru&`mJA6wu|Z47P0uPx0~<_|rh#09$fs1z zP!J;L*J7}u#cHZRYS?>7NcVsK`EX|YI#|)#2mt%DKUN4vQM2!DszUK z%i?~88%8c;33@u8N@+^eZn3(er7Zr`X$j5fmQafhMX(#Rjrj6!NT*hv`-rqeR#2=%w1J_R$@5(TDXsp2%^cuU#ZdR9;D^CdZ)_zvcEP}p(=dEg9{9O1If<%+F_`>&*LL?)LblV9|GIbC`w{$1q6O8Df0`v-q`wI%re;l;zH zuAwFOXYBVaQxzUW9=dw+qmwuKcQ5zvzPU42W}k8;zEgPt zf|kxd0PBkV67Ij+@lnT(@UG?XuA2ipaiO-3<5;%(e)knai`z?EcC7dYKTdv3qTCuY z-DM7I{Z;AtHwHGXss{1`$9n%NC5>IS+2Obf0_XPj(V=fifTvg{T<5B@bL* z7PhfA6gBTU=0`^`IqE^9gc~D(Sh1KxQ%BJR!8m*Z)j4`>(HP;6o7bEJd&!AKxD5bA zF3Tu~_7i-PfCCs<+^cy7okcWOd==AUuzm!*t{(Wx^%2)~I7Op6MAV+apfRoI2$6sj zgh4KPnpTvg6((6>P)+K&>ru~B@UdnrVhJj4Jf!moxM4_!fe^WiqbyAerKkvQ8wPHB zXa=uz!X`(w`o1uGyg^6eHThH5q+wdkHGyOfDMR$RQ|)R_+G%S_)mG@Foup23ncp_I71!%(d8MqR zoi)^?UYDTV(6Memn?fXSw2uIl0Mc9N+lcN7T0xo%B7eGCF#41d_u|;|nz9d(Ymn?G z{Y4DQ3_K3u8t7dEgFk_Z6)=Gjy6jv7oj-xmHPF8XdVU11AA$W39>N#}75*^@0~ZPv YK<3KRwmukG=%@fZ-F_N2L4kVy2Wl{}W&i*H delta 1168 zcmZuw-)kII6ux(N=jYDuPP3a#Vzo|4VmgT%V~UnS6j4LK;*Z$s!wMZXJCnF|b~iaQ z3kgJ;hdjiGYRg4@5zLcNB0iYEq6k7oMMgq=5fL8@?Sg&uoVy_waoGLtnRD(v=X~e8 z^WBAyCyL(|3MRv6`SY>W7p&XGVgBXq$>|%M1uV!#T1&6#(pDm)W!6k-t5LpX)vQ*b zR*>&nRBV-MC28xCU9$sYhtPF*V<>w}U8z z=VoWYL5JL1K?4TGwc^WSF*`b;;An%rR_S+|2$a_SAE{ zB$m{&qI{+9bMcn_m~ib8@qPCH{N=nkk6E@dSD0ss-}TF4-KcU!d|`}Uy~8{sRpRbi z2&ugqCVr#SPQs1E59&!BbUc=7o#pFcBZ*U`LEOP0r@GRN56}ds-)}_qIQIP*8)vTTZp%@?r1;Z3rxEw~CnoItN@o1L_}Ut)Ebpx!E1B`B zUF}xsp6>Qc)(@QhPvBT*wzFG=K};cjEIhw7NgWkV>NUbB^8Gs;W~l;A@TGp;5j26| z3_>|ZvPtVhsfUYu-rk(;-vS$dMK}ePLZU~$GE=hSD(7zKpD!aV; zP33?u5J`BJ;3C4Kd@hlbV2T2#d_3YaN_-Idd@db49K6h5wQygmHBoF*Tf^S#NdiFX zcsa=m-j-Y9FiD#2Rk%WlPsBU9$KtP{5wYi}%6k}lQ|vq2d`LV!{Ki;nt<~X!c&60} z!YJFhDxT3kb(q&iNr5J7m=(HgU+Fz~2#@J7n%J%($;kbAI8ziqKOX?(A;$ X7%siJaqirDyvJ~P@ESL{ChPnI&ruMZ diff --git a/thrillwiki/settings.py b/thrillwiki/settings.py index fb256be9..07963d12 100644 --- a/thrillwiki/settings.py +++ b/thrillwiki/settings.py @@ -1,12 +1,12 @@ -# Django settings for thrillwiki project. +""" +Django settings for thrillwiki project. +""" from pathlib import Path import os # Build paths inside the project like this: BASE_DIR / 'subdir'. BASE_DIR = Path(__file__).resolve().parent.parent - -# SECURITY WARNING: keep the secret key used in production secret! SECRET_KEY = "django-insecure-=0)^0#h#k$0@$8$ys=^$0#h#k$0@$8$ys=^" # SECURITY WARNING: don't run with debug turned on in production! @@ -46,6 +46,7 @@ INSTALLED_APPS = [ "moderation", "history_tracking", "designers", + "analytics", ] MIDDLEWARE = [ @@ -62,6 +63,7 @@ MIDDLEWARE = [ "django.middleware.cache.FetchFromCacheMiddleware", "simple_history.middleware.HistoryRequestMiddleware", "django_htmx.middleware.HtmxMiddleware", + "analytics.middleware.PageViewMiddleware", # Add our page view tracking ] ROOT_URLCONF = "thrillwiki.urls" diff --git a/thrillwiki/views.py b/thrillwiki/views.py index 1a431453..514ee2e2 100644 --- a/thrillwiki/views.py +++ b/thrillwiki/views.py @@ -1,10 +1,14 @@ from django.shortcuts import render from django.views.generic import TemplateView -from django.db.models import Count, Q +from django.db.models import Count, Q, Value, CharField +from django.db.models.functions import Concat +from django.core.cache import cache from parks.models import Park from rides.models import Ride from companies.models import Company, Manufacturer +from analytics.models import PageView from django.conf import settings +import random import os @@ -27,15 +31,60 @@ class HomeView(TemplateView): 'total_roller_coasters': Ride.objects.filter(category='RC').count(), } - # Get popular parks (based on average rating) - context['popular_parks'] = Park.objects.exclude( + # Try to get trending items from cache first + trending_parks = cache.get('trending_parks') + trending_rides = cache.get('trending_rides') + + # If not in cache, get them directly and cache them + if trending_parks is None: + try: + trending_parks = list(PageView.get_trending_items(Park, hours=24, limit=10)) + if trending_parks: + cache.set('trending_parks', trending_parks, 3600) # Cache for 1 hour + else: + # Fallback to highest rated parks if no trending data + trending_parks = Park.objects.exclude( + average_rating__isnull=True + ).order_by('-average_rating')[:10] + except Exception: + # Fallback to highest rated parks if trending calculation fails + trending_parks = Park.objects.exclude( + average_rating__isnull=True + ).order_by('-average_rating')[:10] + + if trending_rides is None: + try: + trending_rides = list(PageView.get_trending_items(Ride, hours=24, limit=10)) + if trending_rides: + cache.set('trending_rides', trending_rides, 3600) # Cache for 1 hour + else: + # Fallback to highest rated rides if no trending data + trending_rides = Ride.objects.exclude( + average_rating__isnull=True + ).order_by('-average_rating')[:10] + except Exception: + # Fallback to highest rated rides if trending calculation fails + trending_rides = Ride.objects.exclude( + average_rating__isnull=True + ).order_by('-average_rating')[:10] + + # Get highest rated items (mix of parks and rides) + highest_rated_parks = list(Park.objects.exclude( average_rating__isnull=True - ).order_by('-average_rating')[:5] + ).order_by('-average_rating')[:20]) # Get more items to randomly select from - # Get popular rides (based on average rating) - context['popular_rides'] = Ride.objects.exclude( + highest_rated_rides = list(Ride.objects.exclude( average_rating__isnull=True - ).order_by('-average_rating')[:5] + ).order_by('-average_rating')[:20]) # Get more items to randomly select from + + # Combine and shuffle highest rated items + all_highest_rated = highest_rated_parks + highest_rated_rides + random.shuffle(all_highest_rated) + + # Keep the same context variable names for template compatibility + context['popular_parks'] = trending_parks + context['popular_rides'] = trending_rides + context['highest_rated'] = all_highest_rated[:10] # Take first 10 after shuffling return context @@ -76,6 +125,7 @@ class SearchView(TemplateView): ).prefetch_related('rides')[:10] return context + def environment_and_settings_view(request): # Get all environment variables env_vars = dict(os***REMOVED***iron) @@ -86,4 +136,4 @@ def environment_and_settings_view(request): return render(request, 'environment_and_settings.html', { 'env_vars': env_vars, 'settings_vars': settings_vars - }) \ No newline at end of file + })