From 1f36b3f0bde8fc98724b90d0b09a16c26a6562d5 Mon Sep 17 00:00:00 2001 From: Flatlogic Bot Date: Fri, 23 Jan 2026 11:15:47 +0000 Subject: [PATCH] dem10 --- core/__pycache__/forms.cpython-311.pyc | Bin 7628 -> 7734 bytes core/__pycache__/models.cpython-311.pyc | Bin 10129 -> 10293 bytes core/__pycache__/urls.cpython-311.pyc | Bin 1706 -> 1811 bytes core/__pycache__/views.cpython-311.pyc | Bin 12741 -> 13932 bytes core/forms.py | 5 +- .../0005_truck_registration_expiry_date.py | 18 +++++++ ...k_registration_expiry_date.cpython-311.pyc | Bin 0 -> 924 bytes core/models.py | 3 +- core/templates/core/admin_dashboard.html | 9 +++- .../templates/core/truck_owner_dashboard.html | 11 +++- core/templates/core/truck_register.html | 49 +++++++++++++++--- core/urls.py | 1 + core/views.py | 19 +++++++ locale/ar/LC_MESSAGES/django.mo | Bin 14564 -> 15590 bytes locale/ar/LC_MESSAGES/django.po | 48 ++++++++++++----- 15 files changed, 140 insertions(+), 23 deletions(-) create mode 100644 core/migrations/0005_truck_registration_expiry_date.py create mode 100644 core/migrations/__pycache__/0005_truck_registration_expiry_date.cpython-311.pyc diff --git a/core/__pycache__/forms.cpython-311.pyc b/core/__pycache__/forms.cpython-311.pyc index 3413c54b969e0e1f1f2cbeb637cb13516676fce6..c52712437e0297263018df64204f0bb6b2a75381 100644 GIT binary patch delta 555 zcmX?Oz0HPiIWI340}xb%6lV$wZR9KA;T8h%f#7o*(`0!ujm=wm`We}oQaDmL=P*q! z2wkRGOUamS2>s=bKuRsL4P1F<-8vL{Vyb zW^qYTVo7FxUVLgrL1s~9d`eSTZZIl*$Od>0bZF4(1mkVeKujf^WA8IyShB_=lty0Xg)2y=a4 z5SV;cFkDZZ70ARSK7z!)U`T8Z5<1ApRTK_%MNtHhn5-sZs!|jU;>Lmq6%e5cBGf>H z5{O6w5;l`tMRv-?fw*W&5OxjKJW)Bqp#<;r|E{|ALS-nH(#d4*>GeiFp73 delta 463 zcmdmHbHe<(B%BZ7gAK3ob8rhl&j~PT9T;AH<^<^ck%@OT4p~@p2^ArHj}di z3>c?wo-LruI5|g9eDW_rS9V!`VXhAh{FB{;!u7;hflN%|BS`EEhQ#L6LI)XzZ?U8# zmZWMj74ZSxeT$`}vLJQxG!awYTbwRHanHPh(vqTx$?L==SYv?-tS7%0*(nzZWEH7^ z2vrcF1|p(igw^C@qF#*An+3&U8QGFSqA8P0#PzwuK+Fsf0WmHY$aLR)T3n8aF>mrK z$tjG*lk27Q7y~A+llsh+4N?ap+$OJt>WykK7j=grNed`YQ7V7Q|>gy)yDZAKX9ic+In6rit)vB_kB(*3 zMBkPzqh>n0?I${7Jatwebd=7O|Eg?b9mE7Li@JgVy0HDWYKMJoF&x+OB3UCB#-?0Y zV`X}{;ywCf@Rd5+^GR-)9A1(e=Fl9<9q3qW>|AQ>%=MkgMYNoZ7iGL8UO-{`p?XRl1o;F&FN3^O!|~WKCTUZFB)10b97u09T5ltI*fvN9|;iB zFUVz#xxew~61^_9szZz;@D-A7fCxYkU=#p8GIEE0l>#zhVcyoC92~?6Jw@uFk_1>I zn1&qSywO$HgizYJDL+E!Dy>mY?2kZk!|Duh=H}A=WI|_~i|eR){(Ddb(5azhY!C$z z$k)wNA6}79CapRz-j`uVISAelks`{1SRW-}qP_$_>P5ZoNv{RbR*#Cl*$`|=JMcbczWL^T^FsF3>DIVs(d~9} zEUIVfm5%>~=d;c7o7cbE8kWY8?2=te+uK%->#)-eDPZ9g{*u2}vuaTGw+Yj*(+xSW z;bd@w$>8Rbu;B0=T<;UwT)k$)u;~+l?~Yg_vJ`Dw*lz4}LyDT+;a<&NIK2K=DJI8e zI7v|AvM|H7nXuCnb5eq_@jf=m*hC*ID)ES%?4wh%c$UkhAnbe#c2~}BSZh~Q74oiS zvK!)CmdRdlx>w15{g2yA$YJno{plNH8_)uR$lz2i4coj;c=91=XOmn=S&cl&xj4VPi+ZoA|$Pca`ZWr#JTtWWV L|E9XIZwL7YIL6Cf diff --git a/core/__pycache__/urls.cpython-311.pyc b/core/__pycache__/urls.cpython-311.pyc index 7e0c4eb508cbf19349e33e88ab2b88ef1f5435c1..4be52ff58b77684253a4aafd16a480e478a9dd81 100644 GIT binary patch delta 196 zcmZ3*JDE>?IWI340}xCIDb5UIVPJR+;=q6ql<_%lqq-~8#0RXJ@~O;OA~5L`g*9x; zm>C#W12F`o^F@iKC9;MDoxJb%*QOj$S5{h zon;DBk?7dtBT)bkk5bFy;)di(j)XjI~Tww9O$l`s4#d|V0oBU)UwoZOo PetxC~ZV)Vz1F8oA47n>o delta 113 zcmbQtw~AMNIWI340}#yiEzaa*VPJR+;=q6)l=0bXqq-{-S2}N$NQ!(ggQmjdSxhrG wM>C5vGKx+vW|=aXht-!$9;lcRh>IsoPG)^EIhk!Czce2|Qv){$7Rdr-0HqKXGXMYp diff --git a/core/__pycache__/views.cpython-311.pyc b/core/__pycache__/views.cpython-311.pyc index fff309e40cfbe88df29ba6c87c178cb02b07aab6..aa0fd4f92da7599494d777dd14f1cb3742fd880b 100644 GIT binary patch delta 1233 zcmZ8gU1%It6rMXj+1>1HcG_m?Zjw!=b~l+xH`}O$lw#To&TBc8Le?-pu3| z0ww*T8QE2E94MsS8St(>&fgIpSxsmQH$uDqe@0f94v4he7T9Y4XqPFr`BLQl)Z;96 zSZ3cJIu`5yS8s;c%;7Y%^+?+ru(0AG;p*gh6F=;c>7R>H8 zZ$>|OBuzLs`30TdoBtW z2L=k%x@cR=mZ_FkRKr}d9o489wv(q>3_4M)TGUdPjfQGCszqsysx6GQor=0rYf-g{ ztFocq}eN5ylZl5EKMVm=+N<1f8w-CT$Vv zQ3SkDU8DmrY=(pFN>C~;8tl|Sr3#G>qM|$4H;~cSz;GUV<9C2nZc9#oXl;b=hVIFp zT=3;WM=q=un371Q@3y>n!H*X@@xq$;V>Ets>g}nwPQH6`n+rv3b}ErzGYM63{NY+> zxaQ0Cj$HTTI$KYqp1$B`DxFNlm#ZDQ>IL6cJb5GQ#Wg>!b>iBZxE0-ZZN%%J_*(R) zU-HToZ?X!XAGJGC+Y@c3jP|?Lk?DP>T_t&qkQw$#s!U2u>{F#Va4oxf--aMv0Q!deAWeB`0qAx2jCx-HaWu0+ z7TBAa=ZMAp%qdc4`?Dj!j|W)JYEm8KAGuevVIe#NROhM1KGw!T<7s)a#QxIqT@E>*?2DkaZlwrS)|MWNcup<)y delta 446 zcmW-dO(;ZB6vv&Jd3rOL@)6UF-n@LxJoPk#NtB{73!jOZG$Rc2Oa`GlG$>ivC<}Bn zDcLd`3tgp%ouy)9@fKE+g}sH1bKSbX`|q6px!wE!UVchBFU!gtMYK+bvzcAx*y)1J zYhMnEjhgWy&BgBkD_|Q(stOR}KUF1wLpD3#ad(2vv}6pt_ZX$7yv{aKOEVdRMX{+? zl_u%FI9@6J{G|2>U;-PJIf&!FqDs@$GWeBJuu8KeS9zk2S)??{J^tG8U?uaRe+$xR z*9IYpF|7xtFt7PYKmPMm^Gi!)Kj4+kvQ?fSsaaSO>-7M6qIwG~;Je3#XL@yUhMLs6 z)&0^6$qW9WKU=(Fgf$XOxi=h+j7B4UraTrIh=fTo178B&y0B}S8lf;BmASn5LZ7@o=3CSeO23a(nD6cHDp*@NDSpi~Q@J!q+zgTo{|F5z%KMu1yHRwCnZJ`xnuMibqyezSo*$kmcoAH zEEb(iVhU0gx1P+|2x?l8GRp6FI-T1nXGPFQK^mnDVOGN^#RLU-fP*j}o^DsCkPs&X z#j=N9mGc&(-7w2%$3=8!5V9d6IHz0hTTlNAEkCG2%j+W4R=Ms+IO%gODWZrs-%{qM z8AS<>Wze2YlSpJptG^0qL^j1~OjKnd#BC&qkRqbOZzA-jz>&t{k3>Piva z(@S=RoOf#d{wK%kV8{&7yfV_sUI;TfS)~E2=de_jMPu~1w1Kts(H@&uCzq~GF5a3r zE4w$w&dQg?@9PH}_`vahIR4o2%Z6szhd`JkX-d^_jL{>x*yZ`G&9=rZ(!)tNT_t{{ zMy0`wO-rU#xmSdDY_82Dy~~ya6u%0{wuLEG2%%sI+Xvw0`L{Hh&?v!qvulqpTtAe7 KqklxJxqkq5@BTRe literal 0 HcmV?d00001 diff --git a/core/models.py b/core/models.py index 303973b..94a9344 100644 --- a/core/models.py +++ b/core/models.py @@ -35,6 +35,7 @@ class Truck(models.Model): year = models.PositiveIntegerField(_('Year')) plate_no = models.CharField(_('Plate No'), max_length=50) + registration_expiry_date = models.DateField(_('Registration Expiry Date'), null=True, blank=True) # Pictures truck_picture = models.ImageField(_('Truck Picture'), upload_to='trucks/', blank=True, null=True) @@ -131,4 +132,4 @@ def save_user_profile(sender, instance, **kwargs): if hasattr(instance, 'profile'): instance.profile.save() else: - Profile.objects.create(user=instance) + Profile.objects.create(user=instance) \ No newline at end of file diff --git a/core/templates/core/admin_dashboard.html b/core/templates/core/admin_dashboard.html index 995f10a..7fcc93d 100644 --- a/core/templates/core/admin_dashboard.html +++ b/core/templates/core/admin_dashboard.html @@ -83,6 +83,7 @@ data-truck-capacity="{{ truck.display_load_capacity }}" data-truck-color="{{ truck.display_color }}" data-truck-owner="{{ truck.owner.username }}" + data-truck-expiry="{{ truck.registration_expiry_date }}" data-truck-picture="{% if truck.truck_picture %}{{ truck.truck_picture.url }}{% endif %}" data-reg-front="{% if truck.registration_front %}{{ truck.registration_front.url }}{% endif %}" data-reg-back="{% if truck.registration_back %}{{ truck.registration_back.url }}{% endif %}" @@ -140,6 +141,7 @@ data-truck-capacity="{{ truck.display_load_capacity }}" data-truck-color="{{ truck.display_color }}" data-truck-owner="{{ truck.owner.username }}" + data-truck-expiry="{{ truck.registration_expiry_date }}" data-truck-picture="{% if truck.truck_picture %}{{ truck.truck_picture.url }}{% endif %}" data-reg-front="{% if truck.registration_front %}{{ truck.registration_front.url }}{% endif %}" data-reg-back="{% if truck.registration_back %}{{ truck.registration_back.url }}{% endif %}" @@ -199,6 +201,10 @@ {% trans "Color" %}: + + {% trans "Expiry Date" %}: + + {% trans "Owner" %}: @@ -313,6 +319,7 @@ document.getElementById('modal-truck-capacity').textContent = data.truckCapacity; document.getElementById('modal-truck-color').textContent = data.truckColor; document.getElementById('modal-truck-owner').textContent = data.truckOwner; + document.getElementById('modal-truck-expiry').textContent = data.truckExpiry || '{% trans "N/A" %}'; // Populate images const imgFields = [ @@ -359,4 +366,4 @@ border-bottom: none; } -{% endblock %} \ No newline at end of file +{% endblock %} diff --git a/core/templates/core/truck_owner_dashboard.html b/core/templates/core/truck_owner_dashboard.html index 130904e..f51caf0 100644 --- a/core/templates/core/truck_owner_dashboard.html +++ b/core/templates/core/truck_owner_dashboard.html @@ -38,6 +38,12 @@

{% trans "Plate No:" %} {{ truck.plate_no }}

{% trans "Model:" %} {{ truck.display_model }} ({{ truck.year }})

{% trans "Capacity:" %} {{ truck.display_load_capacity }}

+ {% if truck.registration_expiry_date %} +

{% trans "Expiry Date:" %} {{ truck.registration_expiry_date }}

+ {% endif %} + + {% trans "Edit Details" %} + -{% endblock %} \ No newline at end of file +{% endblock %} diff --git a/core/templates/core/truck_register.html b/core/templates/core/truck_register.html index 13077cd..f8a3560 100644 --- a/core/templates/core/truck_register.html +++ b/core/templates/core/truck_register.html @@ -7,7 +7,13 @@
-

{% trans "Register a Truck" %}

+

+ {% if edit_mode %} + {% trans "Update Truck Data" %} + {% else %} + {% trans "Register a Truck" %} + {% endif %} +

{% if form.errors %}
@@ -45,7 +51,7 @@
-
{% trans "Arabic Details" %}
+
{% trans "التفاصيل باللغة العربية" %}
{{ form.truck_type_ar }} @@ -72,16 +78,21 @@
{% trans "General Information" %}
-
+
{{ form.year }} {{ form.year.errors }}
-
+
{{ form.plate_no }} {{ form.plate_no.errors }}
+
+ + {{ form.registration_expiry_date }} + {{ form.registration_expiry_date.errors }} +

@@ -90,11 +101,21 @@
+ {% if truck.truck_picture %} +
+ +
+ {% endif %} {{ form.truck_picture }} {{ form.truck_picture.errors }}
+ {% if truck.driver_license %} +
+ +
+ {% endif %} {{ form.driver_license }} {{ form.driver_license.errors }}
@@ -102,21 +123,37 @@
+ {% if truck.registration_front %} +
+ +
+ {% endif %} {{ form.registration_front }} {{ form.registration_front.errors }}
+ {% if truck.registration_back %} +
+ +
+ {% endif %} {{ form.registration_back }} {{ form.registration_back.errors }}
- +
-{% endblock %} \ No newline at end of file +{% endblock %} diff --git a/core/urls.py b/core/urls.py index f04db88..4a39602 100644 --- a/core/urls.py +++ b/core/urls.py @@ -9,6 +9,7 @@ urlpatterns = [ path("logout/", auth_views.LogoutView.as_view(), name="logout"), path("dashboard/", views.dashboard, name="dashboard"), path("truck/register/", views.truck_register, name="truck_register"), + path("truck//edit/", views.edit_truck, name="edit_truck"), path("truck//approve/", views.approve_truck, name="approve_truck"), path("truck//suspend/", views.suspend_truck, name="suspend_truck"), path("shipment/post/", views.post_shipment, name="post_shipment"), diff --git a/core/views.py b/core/views.py index f30c2dc..e95fd1a 100644 --- a/core/views.py +++ b/core/views.py @@ -86,6 +86,25 @@ def truck_register(request): return render(request, 'core/truck_register.html', {'form': form}) +@login_required +def edit_truck(request, truck_id): + truck = get_object_or_404(Truck, id=truck_id, owner=request.user) + + if request.method == 'POST': + form = TruckForm(request.POST, request.FILES, instance=truck) + if form.is_valid(): + truck = form.save(commit=False) + truck.is_approved = False # Reset approval status on update + truck.save() + messages.success(request, _("Truck data updated successfully! It will be reviewed by admin again.")) + return redirect('dashboard') + else: + messages.error(request, _("There was an error updating your truck. Please check the form.")) + else: + form = TruckForm(instance=truck) + + return render(request, 'core/truck_register.html', {'form': form, 'edit_mode': True, 'truck': truck}) + @login_required def approve_truck(request, truck_id): if not (request.user.profile.role == 'ADMIN' or request.user.is_superuser): diff --git a/locale/ar/LC_MESSAGES/django.mo b/locale/ar/LC_MESSAGES/django.mo index 637a85b666513a3ba77ed9af588b5bcc711ca174..014effb6cc5be286577801db502f615898190a83 100644 GIT binary patch delta 5037 zcmZ{m32>Fw8HP_FECKMSq&}9z5mhcEngePtP$FK$ME3h^E z6t;t3!5G*q)|gH(9%@}bD0>-@bwTqGm1H_5LpfMzCltZ9w2Pq(u7`c$4k$zK!Dx6D z-T^rE1f3*n@uoPQyBtfXfc%I5-0;}p(bvFa!>~q`Dv&CE?PD~_F}$)njd>7#|V2u*&7eF(T5>Z zOg1DlL9?8S&ZZpdEVo0Y@&wevb9VgCP&@k!>h~gw{3|nEp$w)%1(X4`ZW`45r=T`c z0CglKQ1;ir$otqlxllV^0GVQn zp?1E*j_-!rX)V;ex1f&b98@M6U{Dc$PDMv>1IloF$C!bz0~`Uz*>(`hP#tUvPeM63 z1Mh|(K#kvoOZXcS%LPzCt4N!k1zWcR)G#Bb4DV#JBl7RAyTB@dW$;Ve z|E*;!egx#8GbC9i750G-Ld_3A?eKZqu7PQ^4?$hp1}Hz#M4{J|5Tv5Z&u6Y@}uAIe@aoCRNjI_m#HJ|-AX_?cAh zgM;8IsD;O%E};u`X}+>-%U>F`d&32AG?c^rP-p)Rl;Mw|HrAxCx8p>p{yw(-2qfU3 zd74Tc1Iyq^*sq_r@N?LTc2n{x!)@Vo=s+1Rgi7H$%Sx!g4?_j?q2*_gk7-J}l!-K` zj7@-p@Nec)k)!QU2CFTPL7mkFs7v%$D8o0Q40Iac9nCN}kah;t4)YU+Q%XgSH$yqt1KYsUmKUIQe94Yqw`|SL8b*H)7y}=N%2W=Ny=72m zy$<5r?1Y;CA=F)IO;kZm>_tT#>5z+Vrb4B%2r6ZppaR$rmCCb_i)^mLBACR*(d~X2 zDwA)*Sa=*NbLXM_d;ueOVz8H)#KGjBdu4{x!9_Mc$TcwKkhvxVWv~Hi-oM}o*!f;B zLsOs}`Jm=6g3917JN`D5!}lOR1?CFW2Ad7>GS+tp`PW$ur$dp>vIE6Xw|pIpht*I= zatwBW??PqfGF0aN0~Kfj|K8xkbcLEX1-=RA!m%)!{AWTRd;-=5sVLQLhI_wQePCPK z6QKHMK<%gi>T<1x3iy!izYGZ zqa(06ykOfOL8a_VsN0)xpJ(6!s2yfPt($H8m%$0N%V0KqAC7_}e&QWfA(Z_!FhTEs z0~JMFWhY#OQM6UG<6Wp7qC0X&fH|cv$~q)tzecYjJ*&pTBZ(Ac;Xzv$3Q-=~qlVu9 zbTA)nLl2=1NQJ*e=3#UMEki0zJw*Ntt2zbkKugg+r1CnNfp{Ed9=ab*LXG8DR7z1_ zl#YKh2dV7$U>3ppqwcH64(eG_rxC6CDtI;b+B^v1^bVF5W zGy0{@e?66HNVheBIwF;cXcRh%%1}=<0Nq+<(-?*(pdM&4T7iCtUO-PFmAxn?Qj1)< zNUfaj!T66ns|={0)W$N1%Cold8%sU29JB=`qwR<%6e*RK8(|!3iS9(3kV z4`U6Ld^A-(lwWv=e4pXF0JT61&}gKx6^%!Ct6@t#d?s|JT|(22SvmPmhCknzGjEX@ zr^b{(!R%)%K8mYN9Je$tCs62Q`11YcmU?=qBz{iw*0=P8K1r%?k}}61@HroZJBwk0$2~lo`Jln4wSlC2mc)*sXF8g;$459Jg9sbRKngJCV_P_kdd+UR`m1c!$t;cTH=4k6Z87d2@fX z*tj)696N~Fec`guq?DAXVKp=kgjc(@p4qB!8ID)d`I^?T59ybeQuq*$8l@j!)~SHR=Rs|gcAoR3=sf>HZTHM5pwTc5f%J?gq^Z$ zt*G&=H%=uR)%5RWWM4PO4Kc4KTF22gMx~)3C^;5;szFquduuDLj7|M#|fe) zQBua3XZU?ECyw(KjS0XD7>Jj#D&DZ|53wxue^9shRWgR6DUao`7Diwr)P2dQ{stlU zIc6AzS~R4i2FS7(EXNAeSED-IfpK^g)zKaF#}W)ezsjz`*n)aEvKG@7%VBqGf7Cd` zF^uuecna!pE~=w7sF~-ZR#u4B@fe2THB^Vc+4>{YeSx9wghEmGN1!rN&)OW-Uk6OW zPFRic%>oL1%tlUCun@KK3#bc=Q8!j)bY&tMW3d@3BLh&^FTfC7flB#iY==e2$2{Vs z2?cuG@jU1-dDDP`o=GA`V@FhnLy)me22RI$I3NE-b>xJ*E|4-GAHq zH}bShAgk1)saA#jYv3pv_?Y^fbU_EyO1fih9EcilHmc*r)?C#6n~*t~?Wl>LKn;8m z)z2+dM(&|9QJM;KF%c2uUm1v}p&llo_QD9%+b|pTEZ3qs+G*>DQ3HRCTFFIJ2EIi- zs+*{V+(tg;FHX8Xn9eo9P}KD?4h3zVIE=rgY_kLu{G{r(y% zLwB$m{)x&!5S5Nt6V=aP)WGSe`<8PzdBRB(39aGYSQmAD zJZc5WsMPjG4bUI8kddere}H-PaweqXT z<1}|sD}8~QNC2ZN#U9jsvDg%wU?Qg3`YKdE=dm>2MD>3QeeeH03N!qS`42UbY0>U$ zHX9pL&qAg8FlrB+L9L`1`Iv{Clz}idMgxpRnoKX$K$EQw##3L4dX108kbiZ2h6X<7 zDktV(9%E+==eg)@7=-F*9%_QiP$^!G&2cBH!|!bSUF&01{{eOQjlpnihzY3c)9R3a zt#FKO$irsTHzQd#S5O1pM{O!o*IlUx)o~mu6N#t}Q&AI5Lv6BjOvOyp$}giP@*K6f zBOQKq^!g;?Q0#?zrUy}}ynreA09#-Z>Cj%7Y+Yi_$BDF`MD-WX&3fjYQ2q4dq(|hS z7L;q-ovpUv5^6?2;68kcr*Q}Q(v4&Ji=!3JL3O+Y-^KN)?;oQw6cXnejl5W<6>35~ zt)o#HpMzx1F?%Q|CFf8p{1wY#^+s+-^{k1gnWv!k$Y4~*nW+0$pi+Mjo8oC?4dwwd zH&cyKbzL%Q&kVzOz5lrsUZvqH)XGZnptKSXYJi3qf*q|Xs1*;e-)C4CVH?^vVR-K5-&5414QawFiZPtpFuv(YL8)Jax^RoFA3^qsxq?dN6Vzr4V|kiDJThmKjBF2+ zfgfNVYV%fRCo7XpQ4?v0%3L?pIO(WA;l`n$)a0UGk3+~)Ft<>TB#3;eqxPupyI>+_ zpfXc{mGKDb`U|Mcm7u=&(5P`@kQd3cK`m@x3-Yg2&7nchC>u4yqp0@lsNMbxYR1n| z9fr1aJB&hQBmtGd9;k_q#a1{CHE;nI;wenVDSVlNM_Q48rM66h`vVk%6{shp+Iyo` zG6A)j7NRD)*R~g<2EK0%ZtXsj`lyVi;&7aTnpiQazdIO!&m7xOik+jBR7duSNkZK) z9>Z}aMqsvW--d5dKY*jK1e0)hTlZ1qqXsyP+H@yv`xW$~o=NC%yqtCs-H9^94B~yF z9ih~YAwDK_EOhbxB&)cO$R%D=g<~ucNOUH45NsdA+h?MQm&XDMB;9l)c%5KTBVwJcuRq!7J`+JtucGD630!k^%UFkcW+#9<+lsbz8>SKch(*Lqf?rbKF^O|~qM}>%{pDM0%h`B<&`Rr7;%I+O6X`pg!@XyykixkYP8yTLOmz#Ca(SE-!9$kRC$qK0}mM>Y5JzK9+j;9cJ!+RyvA;ka_%td