From 94eeb1d8174915a6c6376397b775889a69582a07 Mon Sep 17 00:00:00 2001 From: luciano Date: Wed, 29 Apr 2026 12:15:25 +0200 Subject: [PATCH] feat(web): scaffold Next.js 14 app with Tailwind and next-intl - App Router under src/app/[locale] with locale 'it' as default - next-intl middleware and getRequestConfig with setRequestLocale - Tailwind CSS with shared font variable and content from packages/ui - ESLint via @ketopath/eslint-config/nextjs, tsconfig via @ketopath/tsconfig/nextjs - Inter font, base layout, home page with translated copy and disclaimer Tweaks to shared eslint-config: - Disable consistent-type-imports for .cjs files (next parser is not @typescript-eslint) - Configure import resolver to discover tsconfig in apps/* and packages/* - Drop *.config.* ignore patterns (overrides handle them with env.node) Co-Authored-By: Claude Opus 4.7 (1M context) --- apps/web/.env.example | 9 +++++ apps/web/.eslintrc.cjs | 5 +++ apps/web/.gitignore | 5 +++ apps/web/.gitkeep | 0 apps/web/messages/it.json | 13 ++++++ apps/web/next-env.d.ts | 5 +++ apps/web/next.config.mjs | 14 +++++++ apps/web/package.json | 31 ++++++++++++++ apps/web/postcss.config.mjs | 9 +++++ apps/web/src/app/[locale]/layout.tsx | 58 +++++++++++++++++++++++++++ apps/web/src/app/[locale]/page.tsx | 29 ++++++++++++++ apps/web/src/i18n.ts | 18 +++++++++ apps/web/src/middleware.ts | 13 ++++++ apps/web/src/styles/globals.css | 9 +++++ apps/web/tailwind.config.ts | 15 +++++++ apps/web/tsconfig.json | 13 ++++++ packages/eslint-config/index.cjs | 14 ++----- pnpm-lock.yaml | Bin 85991 -> 138215 bytes 18 files changed, 249 insertions(+), 11 deletions(-) create mode 100644 apps/web/.env.example create mode 100644 apps/web/.eslintrc.cjs create mode 100644 apps/web/.gitignore delete mode 100644 apps/web/.gitkeep create mode 100644 apps/web/messages/it.json create mode 100644 apps/web/next-env.d.ts create mode 100644 apps/web/next.config.mjs create mode 100644 apps/web/package.json create mode 100644 apps/web/postcss.config.mjs create mode 100644 apps/web/src/app/[locale]/layout.tsx create mode 100644 apps/web/src/app/[locale]/page.tsx create mode 100644 apps/web/src/i18n.ts create mode 100644 apps/web/src/middleware.ts create mode 100644 apps/web/src/styles/globals.css create mode 100644 apps/web/tailwind.config.ts create mode 100644 apps/web/tsconfig.json diff --git a/apps/web/.env.example b/apps/web/.env.example new file mode 100644 index 0000000..c26be16 --- /dev/null +++ b/apps/web/.env.example @@ -0,0 +1,9 @@ +# Next.js +NEXT_PUBLIC_APP_URL=http://localhost:3000 + +# Clerk (verrà configurato in uno step dedicato) +# NEXT_PUBLIC_CLERK_PUBLISHABLE_KEY= +# CLERK_SECRET_KEY= + +# Sentry (verrà configurato in uno step dedicato) +# NEXT_PUBLIC_SENTRY_DSN= diff --git a/apps/web/.eslintrc.cjs b/apps/web/.eslintrc.cjs new file mode 100644 index 0000000..959b74c --- /dev/null +++ b/apps/web/.eslintrc.cjs @@ -0,0 +1,5 @@ +/** @type {import('eslint').Linter.Config} */ +module.exports = { + root: true, + extends: ['@ketopath/eslint-config/nextjs.cjs'], +}; diff --git a/apps/web/.gitignore b/apps/web/.gitignore new file mode 100644 index 0000000..2472ac6 --- /dev/null +++ b/apps/web/.gitignore @@ -0,0 +1,5 @@ +.next/ +out/ +next-env.d.ts.bak +.vercel/ +*.tsbuildinfo diff --git a/apps/web/.gitkeep b/apps/web/.gitkeep deleted file mode 100644 index e69de29..0000000 diff --git a/apps/web/messages/it.json b/apps/web/messages/it.json new file mode 100644 index 0000000..7705cb3 --- /dev/null +++ b/apps/web/messages/it.json @@ -0,0 +1,13 @@ +{ + "Home": { + "title": "KetoPath", + "tagline": "Il tuo percorso personalizzato verso uno stile di vita chetogenico sostenibile.", + "ctaPrimary": "Inizia gratis", + "ctaSecondary": "Scopri come funziona", + "disclaimer": "Le informazioni fornite da questa app non sostituiscono il parere di un medico." + }, + "Metadata": { + "title": "KetoPath — Chetogenica e digiuno intermittente personalizzati", + "description": "Web app italiana per la gestione strutturata di chetogenica e digiuno intermittente, con piani adattivi, tracking e lista della spesa automatica." + } +} diff --git a/apps/web/next-env.d.ts b/apps/web/next-env.d.ts new file mode 100644 index 0000000..40c3d68 --- /dev/null +++ b/apps/web/next-env.d.ts @@ -0,0 +1,5 @@ +/// +/// + +// NOTE: This file should not be edited +// see https://nextjs.org/docs/app/building-your-application/configuring/typescript for more information. diff --git a/apps/web/next.config.mjs b/apps/web/next.config.mjs new file mode 100644 index 0000000..779ade9 --- /dev/null +++ b/apps/web/next.config.mjs @@ -0,0 +1,14 @@ +import createNextIntlPlugin from 'next-intl/plugin'; + +const withNextIntl = createNextIntlPlugin('./src/i18n.ts'); + +/** @type {import('next').NextConfig} */ +const nextConfig = { + reactStrictMode: true, + transpilePackages: ['@ketopath/shared', '@ketopath/ui'], + experimental: { + typedRoutes: true, + }, +}; + +export default withNextIntl(nextConfig); diff --git a/apps/web/package.json b/apps/web/package.json new file mode 100644 index 0000000..d336931 --- /dev/null +++ b/apps/web/package.json @@ -0,0 +1,31 @@ +{ + "name": "@ketopath/web", + "version": "0.0.0", + "private": true, + "scripts": { + "dev": "next dev --port 3000", + "build": "next build", + "start": "next start --port 3000", + "typecheck": "tsc --noEmit", + "lint": "next lint --max-warnings=0" + }, + "dependencies": { + "@ketopath/shared": "workspace:*", + "@ketopath/ui": "workspace:*", + "next": "^14.2.5", + "next-intl": "^3.17.2", + "react": "^18.3.1", + "react-dom": "^18.3.1" + }, + "devDependencies": { + "@ketopath/eslint-config": "workspace:*", + "@ketopath/tsconfig": "workspace:*", + "@types/node": "^20.12.7", + "@types/react": "^18.3.3", + "@types/react-dom": "^18.3.0", + "autoprefixer": "^10.4.19", + "eslint-config-next": "^14.2.5", + "postcss": "^8.4.39", + "tailwindcss": "^3.4.4" + } +} diff --git a/apps/web/postcss.config.mjs b/apps/web/postcss.config.mjs new file mode 100644 index 0000000..2ef30fc --- /dev/null +++ b/apps/web/postcss.config.mjs @@ -0,0 +1,9 @@ +/** @type {import('postcss-load-config').Config} */ +const config = { + plugins: { + tailwindcss: {}, + autoprefixer: {}, + }, +}; + +export default config; diff --git a/apps/web/src/app/[locale]/layout.tsx b/apps/web/src/app/[locale]/layout.tsx new file mode 100644 index 0000000..b053649 --- /dev/null +++ b/apps/web/src/app/[locale]/layout.tsx @@ -0,0 +1,58 @@ +import type { Metadata } from 'next'; +import { Inter } from 'next/font/google'; +import { notFound } from 'next/navigation'; +import { NextIntlClientProvider } from 'next-intl'; +import { getMessages, getTranslations, setRequestLocale } from 'next-intl/server'; +import type { ReactNode } from 'react'; + +import { locales, type Locale } from '@/i18n'; + +import '@/styles/globals.css'; + +const inter = Inter({ + subsets: ['latin'], + variable: '--font-sans', + display: 'swap', +}); + +export function generateStaticParams() { + return locales.map((locale) => ({ locale })); +} + +export async function generateMetadata({ + params: { locale }, +}: { + params: { locale: string }; +}): Promise { + const t = await getTranslations({ locale, namespace: 'Metadata' }); + return { + title: t('title'), + description: t('description'), + }; +} + +export default async function LocaleLayout({ + children, + params: { locale }, +}: { + children: ReactNode; + params: { locale: string }; +}) { + if (!locales.includes(locale as Locale)) { + notFound(); + } + + setRequestLocale(locale); + + const messages = await getMessages(); + + return ( + + + + {children} + + + + ); +} diff --git a/apps/web/src/app/[locale]/page.tsx b/apps/web/src/app/[locale]/page.tsx new file mode 100644 index 0000000..969901d --- /dev/null +++ b/apps/web/src/app/[locale]/page.tsx @@ -0,0 +1,29 @@ +import { useTranslations } from 'next-intl'; +import { setRequestLocale } from 'next-intl/server'; + +export default function HomePage({ params: { locale } }: { params: { locale: string } }) { + setRequestLocale(locale); + const t = useTranslations('Home'); + + return ( +
+

{t('title')}

+

{t('tagline')}

+
+ + +
+

{t('disclaimer')}

+
+ ); +} diff --git a/apps/web/src/i18n.ts b/apps/web/src/i18n.ts new file mode 100644 index 0000000..ca7d5f9 --- /dev/null +++ b/apps/web/src/i18n.ts @@ -0,0 +1,18 @@ +import { notFound } from 'next/navigation'; +import { getRequestConfig } from 'next-intl/server'; + +export const locales = ['it'] as const; +export const defaultLocale = 'it' as const; + +export type Locale = (typeof locales)[number]; + +export default getRequestConfig(async ({ locale }) => { + if (!locales.includes(locale as Locale)) { + notFound(); + } + + return { + locale: locale as Locale, + messages: (await import(`../messages/${locale}.json`)).default, + }; +}); diff --git a/apps/web/src/middleware.ts b/apps/web/src/middleware.ts new file mode 100644 index 0000000..5d51b4c --- /dev/null +++ b/apps/web/src/middleware.ts @@ -0,0 +1,13 @@ +import createMiddleware from 'next-intl/middleware'; + +import { defaultLocale, locales } from './i18n'; + +export default createMiddleware({ + locales, + defaultLocale, + localePrefix: 'as-needed', +}); + +export const config = { + matcher: ['/((?!api|_next|_vercel|.*\\..*).*)'], +}; diff --git a/apps/web/src/styles/globals.css b/apps/web/src/styles/globals.css new file mode 100644 index 0000000..2857b71 --- /dev/null +++ b/apps/web/src/styles/globals.css @@ -0,0 +1,9 @@ +@tailwind base; +@tailwind components; +@tailwind utilities; + +@layer base { + html { + -webkit-text-size-adjust: 100%; + } +} diff --git a/apps/web/tailwind.config.ts b/apps/web/tailwind.config.ts new file mode 100644 index 0000000..68d0c5a --- /dev/null +++ b/apps/web/tailwind.config.ts @@ -0,0 +1,15 @@ +import type { Config } from 'tailwindcss'; + +const config: Config = { + content: ['./src/**/*.{ts,tsx}', '../../packages/ui/src/**/*.{ts,tsx}'], + theme: { + extend: { + fontFamily: { + sans: ['var(--font-sans)', 'system-ui', 'sans-serif'], + }, + }, + }, + plugins: [], +}; + +export default config; diff --git a/apps/web/tsconfig.json b/apps/web/tsconfig.json new file mode 100644 index 0000000..7bef14d --- /dev/null +++ b/apps/web/tsconfig.json @@ -0,0 +1,13 @@ +{ + "extends": "@ketopath/tsconfig/nextjs.json", + "compilerOptions": { + "baseUrl": ".", + "paths": { + "@/*": ["./src/*"] + }, + "incremental": true, + "plugins": [{ "name": "next" }] + }, + "include": ["next-env.d.ts", "src/**/*.ts", "src/**/*.tsx", ".next/types/**/*.ts"], + "exclude": ["node_modules", ".next"] +} diff --git a/packages/eslint-config/index.cjs b/packages/eslint-config/index.cjs index e6c0688..1c85694 100644 --- a/packages/eslint-config/index.cjs +++ b/packages/eslint-config/index.cjs @@ -18,6 +18,7 @@ module.exports = { 'import/resolver': { typescript: { alwaysTryTypes: true, + project: ['tsconfig.json', 'apps/*/tsconfig.json', 'packages/*/tsconfig.json'], }, node: true, }, @@ -48,18 +49,9 @@ module.exports = { env: { node: true }, rules: { '@typescript-eslint/no-var-requires': 'off', + '@typescript-eslint/consistent-type-imports': 'off', }, }, ], - ignorePatterns: [ - 'node_modules/', - 'dist/', - 'build/', - '.next/', - 'out/', - 'coverage/', - '*.config.js', - '*.config.cjs', - '*.config.mjs', - ], + ignorePatterns: ['node_modules/', 'dist/', 'build/', '.next/', 'out/', 'coverage/'], }; diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 885d59733c66e002e91adb5c2845132710a2656e..3c085e367474da83a98980330b44153279e8765a 100644 GIT binary patch delta 36384 zcmbTe3#=q(b{>Y|dr9stxy$9gNDe8=9CB;#)cdv4O4HS^s;;W8s_v@pt`@vjRdqeP z-mmUzSQu+<7_be?z)je{^$U-_wF&RPEp?CQSDyO(Qz&u%-qWv-QQ|gs8zh-(ekLcUj{a?NPcI%c^n5AEP z8^4WFx5@Xxxb>a?pwT{l@QcA;dpKNme&eZ^p1ZdF{HsrY_H&n~xc}>i57!&|$eTX< zF^_t_`F!>?n7Q*`c=q-4k3DO=_UJ6um6N4j=zr^vn$N+PPX!bG`t#qojEncodL%|gl&|Q0e7(DMi;noxjD3UWxy+1 z->$vH_Gg~GKZIO!3YV;Z+$kfYYeLuYc2kWZBR`hcRMaeS=tSz3D4pN=_78vN)*UxV ztvrOCtaR_7;5hXI-t7uX+0Tfa!G;4*jgf{;G}qR6QJw8gdR+?59z#e+H&fGv_Slv& zxd25crM;NKJQW6ESvZ!X_%X%_3X^rRCb^r#*T4Q#FM`Q5JIU1s=1?B)H)0mLp)oWo4GI91UX%yDm6f4 z2(GBK8#eP%;gYM|G8uw9ZKj8neV7cMwBcY?;Z+@gy|$~s^JBNs`*xh^cW;_to&{Pl zClD-y4Jnt7pqM$?DfLp8xb;%VBsF*ZLzriwXvZP7$1$vSvPpH!1mUQTiZy~Rwdug$ zXTbUO42XMJ&$fwNE>Z9d&Xo6=|^;O~~S$J~6@YrqodNR(`yKmn$EjtO>blG-_ zT*gaxI$e)Ko-RGyqATH$$99{+yZFSeheC7`w1L;53)v%<$OiAGG)AQ4G-$ACGLFgl zOjuD0TWz(6>+#Tt&}o1TRRx^&^=ntTRaWk^C9nuRzxv__cj^6tW}HQ-&N;%1rjxCY zFOrC~tbi%Ch!xdSBUOpBOo=d;Hd;GGh`rl6x`0mT{mdL4giWnu5G{65$LuDC)FZcJMkGw>D)0!p0>-JI0j=m+jJe*uDso3!+;~I@E>7MMh?3jN@FHM z1=L>3xf3;Np&60wRVgMUwLaM;<5ASw7P5|TTb3Df&6e7VL_l^seNJssS0}VpKBAo+ zII#E5Fa7zaJ{wk+gxwjx+=sEH>*cr+cYNtmlK` z)PysUj$?utB*&@P!ZS=JbTv9gCVon}q1SSo$*FM?v_9;*NoP-r@%g8dH{M6FTlf7{ zRE9g>J-BfU`)+!b0H_hBK3D`0zVYid!1ntZrqggn$^KY9P7vGNX_Q-UtpVg|?Z}Zt zXCHKECuqva%EXA{qGd$kuqCY`bBq_kq9%8(3^hjQ4SmWGhn)S9w|c~a-a*E#d)1U- zkAJ{C0LOVI-u)rNUI44psgJ8LH z9dInj+vN33IHtzpDB_pJv2oXS46Pf%5UkL!MovVpm4ftE!8nfQD}UiBMqsjDhn@7+ z%ZhcCx^}=UV;Wg4orx_B+gU1!9HRIS{lp_i^ls99Y&CH7+J@6eAzc|b@`R+S+x2v_`cn6ah!<`z|+AJm*bP`Q6T*R;u zRZNgkGvO%{PVIDzqEnM>{AP6A%F~UiF>4J$F-G2KBU(>Az7vUToe8s#PGt`bVK;3b zz{C4t>#{qVI?T>@-hKV7iMZx`7y4lAY1BCIn|VSTTTSa7vP9-Hr*Bm&G+FPKOg1I-IrN zc#}sF;3N7>!pWPjz5NrH!T;dpg{%TUU)%HtuTjrs#U8Qr_=ugoA2%3&%DICvS#I#? zB(@Wh#W%V>@p1p?8iWTK>$Eyp)JzRd)`EggcC3()7sd5#Eo>daGOW1Jow%K2TCERp zS~|AdL2st`gqdLE-`7Zhgq!2_Y+m_k^KeElmd-XZx3{QxK2HjJ-#U72ZJ238+8s+0 zwB77^tyMG0WmgOCi2D5DY5sO#csPp zmR>>%N#O7O0)zH(hfri`%IQ!!>Rg+&6BFe`@BFQwcysn2ZYx-T$0zl7-+fO{Cn>b$ z{AwlJ(@~`t8FQ-A#i`r1)pW(QUbsFO87hsKiJqwXZUtrabh#ECLYlb_k}ciiBpsS7 zg$Oo`$`qPtE#ux!;R!n*U;Q62qrH{iKc6^3)|If9Pua%O(w(7?TD0i$(IRy1$#H5P z+1%U*!0!bd0H0FL7*k-nShADllCLmwHxWE$TL=?N-F2iKN4w0r9Ht+WOorHrAzFLf->(^)#HOj{jkhonh}>3n1AZl(*nDv`V0 zQkgzw-!yV+t513SO!`I47L_eH7gCBVtM|>;!Wv^8GUk>Ud(!OmtNZ%TEO7% zH#K)yDWA^8V212ATCgQGIWdp*U~xDkYbkd#XOgU@`{z`Nysg|Z981W%uxd`*jD<=1 z*i2RuKeI*=>B7fy*UWNuxWZt*^p5(1$2_}}Tu5X!oj})|WbBA=v%wd1#O27?=y&P6 zPt57#yY$-5d(fw#r@owKap#2qi-i?HA0(vj8G$pgsE;6;;7;fYB zv^hF66BhI1eyvr+$g$;NB4$z4mF8$Xn0Ca_McMhBXi0h3Se|~E#kT0MtTABBV7V#^ zwo|t~BK#o~1NnUK@h@3yzV|`ec1cdG(yssEY2zt8@wS63XfIrSZ{_f}Rx)`@0;%c_vFJf^E7eih>uv=?+bP#!E>}bEX zYm1{Tx#iv2%5<4Z;g}J(-K*HB7MA>Uxo_BNC{jA*q$V<~H>EQCDD?L>1a6!I((IBD zksoJ+2s~0NC>zIdm4Q9p6LtviR?=8xPfWE%8jiz-n6%L{@P_d+cQ#1pEfhpd^nJ0w z9FVhh$wA^EjNEqeNf`RDlfWMV^SZOU`#=z&uDIU>;NM4voWJ(&8wOkJmO7J`p&M<* zBg7?{Pc+NMuH8a!C*`U%7KeSphes|$rbOkAkdtxDL0*K8P6jtSN*X>_51Vo-j>1)R zIKrb`t?vEKD?fJQH8?M`{OUrO-9gFQ^lcQta1c%IQuY||ODi@Kr-KPMPGT)}tA#pM zv|@=t#vw$;2}&N_R5|jNhXpMqG3IcU;-$J%XG%Ep)Nq(e!lG*rE31%AToyh;z)vuA z*ZkXkw&1b{&Oh?*mkoLB;)a`z=jLj%0r6tI2L2@XscjpVlXmZXeT*hdH!qEJ3l8p|CMWg@YdJf?wLX4HgbI^ zA2I9!DR?;##)(~R@*yp+!9uUYJglSn&L3J$CQA#D4oF%x7_XqMTL~wwfHNaL?vVr^ zrRt`Y~X%kR$kd*x&!&)m6h(w zEZp_+>B_b2us@&R-}U*-b7^7t{K}dx*2WQ8AV!T)a+I+?XK{NUZ((L|Y^tdgR6hEuJ4^JO4 zI36DNtJ)?GIod+wY!2~}Fl8M@m0;-SU025Mm!hw_-gk3rK%OuhoV;m1$&_wa ztI5OxDFRB{SeR{Ue<+L7a3~#T1g}*TmYt}nx43xAk0$u>sQQSpx9)uK@w4ldE=Y}c zSC3j-Xz$%E>Zxz-@zaJF4LM4k@NW;2Z}){7Mt?V14;PM_Gmj~jd6ko&L-{dj91rUE^@?$2D{JvPS;ivi-x zG3%U_7h>K?_d4f?Tu;v=JbwEZzwJHp(`OzcEUt6}N!d%;QCh|Vfq zsS|3o(oxDLGi|pdY&Wzw*wW+NIqefh_kN>1N`z9Ll=W&=DGp0PE8Hq{L5ooZ(<6U;ToGf@Uzi9xn6a_D z&Bs17*t20{L)5Mw;&J#Q1{?H$5HTHWs>QS5Mh7GEiAjDus62WCoAfImhvGi6 z_WL$PxkAik)&(M#Zi#kW9duYb6sJPl97us00^Zq_l?|d7T)Yml$nY4IC6ZR4(`Kf- z)^NYyRk$`Lpwp5OGiVAN$+mvt0R8}b-~U*@+>_FPW9SQ;kA^;jY>36)JI)el?$g5B z-=9LfC?`rQwVIi#ToNT)je)9@E`q`p>S@C?cIPoV^~W`x3e|QYc%&)?>On`=GE@-c z5jM`nKfWmf@ckGIdTqh|K>hJ18w_Hy7!%n}cz{ZU{@ zZd2hIGd44;uB+L6S8WK>Fc>ye_N$ckkrlsO94F06-pPc9M&n!%cBl}932Z#E4W5i1 zj}RfZe-FQQZSx}p&Lbv|hGT)M$q=0~t2|E80Ft zc*jnB5h4$8Zr0QjuHo^m`_T+rPIm9xU%vb7i)nWS($^%c-1B#S913Xz6rHSiy{OTH zA4%w;0RD!v0)XC zkhcre#vY{VR@z;Pr+v-r=N7jNQC_$cqeM8OhDMOW?V|-QnnjyAIkvHuCxs*phocf- zlXtjiJ7XwW>s`BA(Ifa&?Z);z1*HOKYc%yfYBCWe1cZ`1zfiw~V2(Q1aButQ;L<69hq) z6jo9L3TgOln#66E1YW0OqgZ!J6IDu1Ofe(i=^`Z$`j9=z?Fbo|v{UWW<@_M35WNmH z@Ko=e-+uSG^9%p-Gv}M%d-?ny|2H@9{q8&e>c+Fc!C<$~uYU7AW4LN})P(oZEv_m# zCmj`POr1)oT#93jm8f#d4=j_8B`*-GwP|pi(#RF!vKdBXSsqb5O~Y-UbrvCq^~s zkP%9*15kE#4tSDI=k_)a@jP*7yJNksA}ktP0%1~FhHpaNJ2gvRJ%|oM$Y2+XemjJF zM*4c}Prmo-pQ^7JmMbsL4tJ3A;AcND6&}XMjC|Vl1R%EAEgb{BCLQ1AWQp+T7|mFI|(PgWdKg{`|N9cnYTvki|U-Olhxo))~= zx$4n8mZ(dv8Dpm>oJLpk+8VGjW{+`fXC05Kw1lH93PgoJYP7UIsF4>QJlG4Y+4>X% z+VhR`@9@uj7O;!fF|#8VDDJNJJaPW5-~PZTgb10khpjD7=TamkKC0?eizQ=rz+2@J&>bCh4YygKlt#j^4EVxb6zzCTc7NXBCxQT5BlW8eSqEvs@t z{CBVHGCNdm`LNgwO1+@odw%DSy=Ms6e7{wcGQu{XfZMJCU8$@Bc51cNJlaMgi!h4< zPXw@~NoYD^T6IGnu=Vb^D!~3Y9`R+lorS}2J82+TIgy}}V=jBT8C2b0IKTepYo7yr zl2vwBpt9;dTJ~Yx=Q#?F~kqCI3^H2ZCo9AzT<@tNR`Tjq-@#_5t z2Q}WR1}lv*7dJyN$7LCAP1A>%Vv}0z{!m21>eOh*5E9LGjzJ`-MWv>w>LntzBZi$7 zdrT?G%s-xxxgmQ(6a-i-7#mpXHY`VE0$A!V;@_Yy+mOC|WiDUY%hw0{6TSZF!8XNj z)93%kZLylg7i8Hfx zA6Gy}cz*RKAVX7@t=k4*sv_S!ERNKorBC8co-nb!NRCjWO^+A^d=exIu*;=Y$L_bk)(}SXg@?_B5_3^jopz9KG>9}%qr#S%&`|CrV$IvFm3T@ z4yr9vtrKf$!J|q_cAP7qy+1mC=U=~m?~hzd6YVAYaoCzObF5IJKwKs(~cN_X;_O89~NmtzL$OH9VH3<28)H zlyVOh&i~-wym?PWvZr2362LwJ*9+X+`FE>Z##|8-<{0cxgXq-98>}Uj0k1<1nJ+X4 zGlmwnD%i-BU>wb`L&zpaZa_=Iq{6Eexmpeh_C)35z_VpTYL|f+Vbr=`-W$}tzky9} zJO}oXTRG?N-h~WUx8a!+i71Mu^QAM*Y*L=rRa(zw)Edr>QJ8Zu@L1bP(2dG+Owdc^ z2&2qlg4uTDJNWiAT#7*5L#8!3wkO%(1h4M9(ihJEI z%nmyan88%@4rPj{gAP(TdIL{El4Y!BYqk)(l)#T`3-V(!-6RG9DpvC1v|dS*AtN@G zv0-!=*$=_q%?H=`75MEPI4Y&pT*Yn+99RJKhbf5N$Zh6f$>==)**7*7(CbV%8j54j za5NsACmiCK@nR7nibWh)RawgdoHx_D@o0b29j3|Nl7{0rZFZg>irW=5Z}~z(LhrOI z1!j@a<0V+rd;b>SJo8B>Osx2J1Vo<5_5L-@+}A=uU*ogQG_6lNBk7CG>D`CbaR7bqBVdPfx`z&=MOVDUp`(V|D7_q~n&*;p zA8ii(6#lEPeg3IW19d1!Dy{So?&<&>#BZ%WxGOM#1>LS4b`zTXLL*?@AKlw#7I-q}{V%txE8#dP$_P+2n>Ii>}LY}|(|9<}b*4MxJ za*{B9$+yo}6~vz{vh#61l7{DjEI+?=!rpX#CxolkKPth3@o5yWbk z!3)(-OB9|?fw0KI!BBhNs}D;NiSbYH@L( z4su*_7=HA|$7HfTPKstAtcS@VlPaZ~vy@0!q-ZCKM-FOsYbf}1YrFN}-r&x&Pd^=7 zyYtVizG|$E2rJ^FrPT`IQy>^P7(3OS^>ozjn6Q?ZlOBh;KOUa&nOhCQP!Y3w$IJ{W zt2ta94E-r}+|P_|71)`)gaAB*qYHNWUi|!-8~(;ikLc0*JY@yQqYAKhMp*GEi?2H! zM&q0>3NoC*O6i^00G=yKJV6y4Png!YYv zfBqHf?elLw`}`|!e*?60;J2@_G$>1+|MY9Gzwl#U$9tvdt@C$Z_}uxG>C5L&eDS?A z%s+qc#^|SSeE8ozf8&)i=w^AQ&rHw1_^tPi0b25=jZh~5q6f#FwA{}zZ=-UDW@%|i zsE{%o?7Af~h$3{wS&JO0)DgZ*(MceWaR;7(LpQMx%VReLlBT6yYtn!RkoJqOd;{oX z`f6#9p#a9G&OiCuSI(!&s~_Ha;l?Ll{My^MzH;kQ#sBcF7jC@%)Yb8c#V?{_5v0KlH!2``I@xkMPa$k3RF+``W*#0)jCV?d|{(!udO2dEclU4o^?S zI+@aBzG5KUT>!7nZ{zvW2qyCar;lmwFZRRXSTgX9+-?R(X^*j(hiZUL#+tF7Tg5d}aS|UJ#JJ_1GoWb)o>jXQAZubGl*bv-TDZquzjo$ zE@$d@_{%2$;NNq~Z_^*%dHKd0_kL6OPhNa(7nWdK^f|0i3pSvV?8Z?lgj-At&{I+c zGsE0T&~n7nyOqrNQ3s6|Ildkkku;vn#t?$-0fWQWhiI*&hf*}T@GwYZBq#RLY>;kx zdCb!oIB;NJd^QiA>_YZ{y!HO>cyRVU@$h&37XI)zU%T#1!5w< z1frH5h&Exo0|yfCp`Y#xn@B9`NwXgNr^#YA06h+xyPQeeQRL4IMIOqhW8F>)7^i`< zNJhEIwDF2+*dZlREVaaxs;w!z-J&=NYefd@13vhTH_w0iJ1>0N>zh45R@Y;b3yt&D zTPC_e=XxE^@}TTexRJCIeh6w4loW6e2m{A>23QoN)*&M*(KX2e2IZJ!we4_Xvh!n|U@n zoZ`UqwDWg9@g*2wd5|()Hg%7@9{Qdh03tti@ivc2W$%5`gr9rG1%%7}uCX3}6Mep6 zc0iHGj5epyVtn#jGYP1Q1@U~j8uIQCnc}KI+T+cf*(~0Jo1gmd|N7#MFQ30+-n>`*A?(I;z|7tg|JKd-49_AcsBY20 z9x+rA)s+s;x24e8^Lb71!KSjD#al z=AX}p&S*tutgEM-G=upHU~WXEaod3=9+58Lauz|RwWI{_WQv5WGS1vUF}f~ed{5y4 zES5Z!0(If0&*|>{ue)!)^u@lb zB%07d1wUfE&6--%h1U!Z8=^E>X}*Xy<-VWi_p8k_=l}igSBz7aBqY>8)v#KwyAfN= zEjL=>qe&YKMJE<_;mNdSM#B#nd?7_Poi3Ycy4wx;X^RAVz^TxjJcz5cD-wq5Q{xr2 z(Jl!cc&HEm&JW#q>-_vL{_wrOav(nS`3HdRHsIFl?2_ey^x!%;@W^ft`XDUa#()|} z)Hvlh$pdIMu$@xdjcIX+82jRoOG%53hlEO?+D3)SB4ZC`wi^t?DG9G-vSPE*AlD71 z0S=i3^3C@?9RW3BmAlsdx^M0L-QYbP?}kfw?)pI1m+c*9I@rmK;Ur!qhRY@6gn8hO z;52McC5<3pe^#<`oJCsN9u#L`uA0ey$0LWS(XO$zy_qKEc4~u)(_5du=0l>e?n_)4 zdj8vg>DCGk6LCHz#`bz%uA*!{gi%0uveQWi)kQSr_@T9|=8%dlQniQx#nDp62p>m~ z7%?fgwibg!x2N|axiuU}8C!L#FYv+nTcgjt1iVyKfh1(_rsse6?XPYYyP4s|4!~N* zNetxz2snogLQT|$HFm;GL2MVOj01j7>?tevXLaZ~*|64G+c_$^$<_G?+Ye=GX`g%o zXwa%Ptcqa2eE8j4fL#5z)y;da{PF+usn1;S6zIt7g@sigjIP&kyUh+P&j}=;*i|1y zA;V@;Y%coAYONoDTw;2dG_zQaT4_?m(w2hXbJz`wfKP6^vY!8_b zN0`&2s#hP1TS2>A3;Yn-)9dG3f8rZ&TB+ZFhP-`B>w*Q%fPX$Yai?$EScO7dzmSYd@q@Vtf$U*h*4kxEHy? za>d2Uwe^DH2FK+--}E7?M{e7+l1X_B%3@5h*dIb))pZeV^k`Riy=Mo6@NRjMd`>3hXkVofO6h?8t9Pk z-Tf2RjnBAMuiyh5cibd^a|Ii%pNwlr)yQgF~}F@>1i_%4kM%M_VO#goABKX9`3CgMCA?polp<(z~$Xb;b0S91yWk zNpk+xyKkP4=g*&S{+U1VTyg>~iS8jpcw*4$T%ps{l*d6i4Oq$T0B#~6vqaV@DLcHd zl||A4#qSuJk2VNX4Y$7GurMX_X~+ueW+Ek^#>MNyO@p0SZ%#ezluWG@s68*|^b)>} zIkU_?)kuvTwM9sk%{5aj*SnZCpu=Il76?r|D(0wTXM-}s*YbwWF~waiCTt7g1P#*7 z{oHNUB;%6wmRPN}g@wgTaNVmuj6|~J@yoAX0!tUq>pMtn_^Y#1OdCvn}u3Z4@1FlxM zZ~&S@HrqWe$=wG;iyZvyzG8sJh1MqtRyw~dl@{|X!ew6Zo)coPAm!$84 zjeA8s$PfC@qQFf7_ZOc2=&j(j>sP_Lv;Fs1rStYXKYIQB^>CM$dpG(78DfZmxx@IV zh7}Y>t?g=q?}mrzMn<(nSrP7B#thwZMA8rQ(N3Mi8PAI_k*%g34cfhAPn9b}H^#{{ zt~z9FqULn44|{m~3_$(#`PDaHKmXF`jk~w*WI4z+0GpS%AZWm#d-5XNzEl)@saby~ zKptD&p$z??hHJN~uirobr~BkIFaRDSkG|Mnz|qgoqra$tgXv!b;R(5)`hDuv@3Z3k zjbDEEQ;&}eUV8hP{;w|#$B+N~fAv|=-wNU#kYxgP9yk(kfGz-ej~6=30Bk(5d00FW z)hX9BfWzVpF4IcEui4UkGlsJmFKT z2*;FrY5>2CV&mnh-WUgiqd@P5Xlr{DQ&SsGM#S38A~2S7kot&s{`QZ&c>dQv|64DD zrw;wJPq;1xk8iY2(%aol^j2iJQU(|73 zEz`mrqMJ>&c3CcJNC-pm1S3%YU!ihkPJRnZC-ZOs#M?RngGlCRAYv)1K4 zUJv?e(o@u}dw=T}e&&-eRZdd^$O5qN<@xlDMa&N!0II=niQ~{jrs3}a)bAKTC$;P*eweHkwxJA!@B5tR;57=N;zyC7NaT|A4n>8ahgi>?S8z0qp=Myj`K<9 z`tv5H-FX!cH!3?BMX=;F$c7Qeo$R;8%8_mwI1}5a`Y1`6!fwrupT^!bP z8yWB+hZLN`uy|*FN2UqmX|s{TjT$5M@s(nT)s9|5r=qnLJ)CZM@38f&TW`esgF;h(IT|UtO3sWr{yp_r{ocamRDq;l}gT0qU zWX9pK3)6`(U!&5{1AyXB^f z)@34dOK`!!1{AwlysNjXIfE_A*n|(Nv0?;wbexnYA=)U?1O+9RaU!ac-PolhD6 zlH;Zt0@cPA8j9e0kQ3bZ1wIA%i0|?@=Y6sV2x<`JfF+W-1HOM6{B8f*GyPxmap08)D*;-l zdf^e(m%a>Mvug}gJ>wxcn4PAOv#ld`--;ZI4=2N&)Mh@qo=6@#f{uyYs?(UO>V2+{ zx1LBsgE<>`v&`wZ$#5PP-I8GJ+&_Wz_RSkuzay?5J{r*807i&-bozlT1(e1>(dN>A z2&mQb+a@^pK)46mwziPYD=@w-l~O^R*-Z3ub7=XsZ0tASt^qIcjp(rPsS~{BT%`m4 zPvtmus4v6O3aW_ZL7O&AH>pB-AvC+oSp*84FFvv(TPtq*&;;&f0R{4YHX;;oR29`U zrMF+%?q*6Xnb|~VYm`k0QW&P8$DG#Ej?C2MmPE7^KqwL7@u&rP$&QE)FwNCPX)O51KhOKQ)7m@L>R%&LW@o63dTBrg}YL2l70Y^BTrhv&*AO3zN)FlP|$OLfn z%K1B>BCw{g8eY0oIY0&{eB=!!WKhfwn?^ivuIW>$VhR39g^pW#PJ&ey=#d$sMMZVK zVd_)~I=ZQv-BY9?OS2)Q^4oj__=eAY`ISfEJ=pNXz0dz=+ZR6dSfd})hiDMS8G7h% zg&}BwHL@V{SAzvTh~goFW3)lI;JOvc9kfa@beo+#S{cY(59Zbive}VG>^A;VMg5Je zr|K^7To@}xJn39Y*zsTEZ@m2I?PmRWD>5NcP0XQkyRZ>JbnzrRl?m>s2P{USa0eP^ z1v_^^IxszYGYFgpij(#dw-KVK%5C3H1#Vt|#1XF-slL{cDm8>dUp@N>=3d`H1~%Ju zfhGi*H>f9FhRycgHSgo~v2#@%a zWn@EAY?L|7g^n|_hC_YJHHzbHD;n7^82iB{yNq{f8oa=t!x9Px{%jd65HT3HDoE12 zMqSNOh(DnSNc=VdS$@SoSYH^_j#5*&6dJgI3RQv3uCkz+d_ZBeOQ4CV{ZJrFjQmlGT)AT;SH zc@1tanaL^`R^<}3eG&13q)fK6pn)D_dOjNJ$6=B$9u$=O!9W2f2f5F+bSF^2@nN%+ zS?ro(X9ulDZgF~mjF+G}=tLDjf$e#fY=H77IcfA=u}mP^4rUlT1HH5rHyV#Ywo8rx z;Z@^$2CjLCNt* z>fn)9adMarcPa~SV?e%_qrw3!4A`Uh;Qu;#@#V|CJN=vjRB)dE&yZnk*0LB#KtnFt zG{y)z?QNCx#V>Z zKQ?qCOUrybHIT8wHjdR*%Ptl{{bDhi%t0TR3wIbzhH4^gi4)FRYiU^Wss%IMryfw#44((De!*C0LOs`@EO#P<-Y1(%NUn^+HOVH+1Nf|EiHgZhHcC)!uJJFVe(_@NR zULudFI4DP@YiIjHwsL4=yK5$8b#Q^eNGWzxkt`em&vax82Bi)|dMt;lqCbo0U;YO# zfB1I>H(opcxz)`x_jmu~3t{TS&Cb1+D`qt0u=bid<%8Xf*Xt&7T~!$kf<3r@a5pFc z0Pt4gVE`Sb2ZlY&h^cN846)W5M`i;FFeFN@v;t)D>8VJEWX$Kp;{49vx^+JO#w(w? zlwW(osb@8=Pa`!PvQ5WH5KJ&TGdwLknx|I-b0`miM$?sP<_NEJ!)5Ks*gA4eZUfp3+N zbFn4dORbQ<_oaLP=M0@z(YRB#@&otzn~A(`q8g1QSAbp0jz((Ac0FqkGGH4 zp#MT3T>-V_wL0ZfFMc#mPlkNBuEIt4HKYs1Qua9qhso%`^{^EcCV>e#0z>QU)(;g@pfek%r@!g+$&%iS;ha`y^ zL%9gg8dXw#0Ez@_3~s^_PDC+xJUktsn-t4n+Oz2j*3Fy`4pVT8&DOxxJr_5|%9=20 zH{_j!U>s3e_gzjmfDGi#FP{I|KRmw}xB$&|S73Kv^u~+%QRCr4VBi|B1JFBsaKKeo z3UP9aj3OWdh_0)7e-RP^MpZVDvSl+B3TNqjQsnWZw6LwQa>e1&!m`ym#C4)sCEx(x zeD%7_RbP+SPjo-e>0-5A3M*2Wq6ojo-88Gqpgkcv>n4=b@c?k~usPT^VzFa_#a;}S z-f${7Dkd5x;Cqkh?lhQl$vlovYxQ95Avr6?*H#Umt^-@E?Bb=Dol2KYZiH7kZ-BExrDBHxOT){Uy8t z-li`!nI>$NtqmZ12}EH-F=mIvel_=WZ<%0lGS11#^7Q|=cCE2-9oHE{iQ-BWC0gS9 zxzvlIDDHB1xg?iTRj&9FNl|<=dZa=4lt_syN~A=ZLA=S205woJs;})S(4vh~0|wHd zu}l+qL_hnLGE+-MvdnZ6*ED-FZLGoO9-U z--O%dPY*^8Nj>+5c>p6!aYg@ZG_y^-3!Sl{4yX!vqyY^Z;+_AH$~ zM%pWX+ZclU54(s^`rdC)KDKl$tJSjj&e zC|~)>E4wy50vsP)jDpsW7$&8EDn2$ivk;k^8ErcnI{_npJaTz>8d17e!x!rOLmkVl zv!@nA1LtDryE+z*pTqTa)E~aoHPf&ZnmEzgGO*%uwQP5SAjf^jWW$0|{(#6`zp6T|EHqiPl zFDzG2)B!GWx#I$?_@U~dx=!FY`sx5D2%T7*yHY~vLIGcgJ7;c*PFaqWB6XWIH&!J zgOI7&i}fewPtRNg{&;Y4K34naI8=by@w&O{{$OA{yxe!?bYKqGT~kXV6H9#y z6UVO3o*3!vuRl3>s-rGCyzuCPzkRx)6`}yX3FEPmjLgN$&_73kML{$yg>1}EH}rq5 zvwnHF=TaEFGlT6{;cb{*?wRQ5UAVY3g@};JQU8zeHP<5JN@E8aYjb#?%=pDYvLh}VNv0gVsBi*HoVLTgSOtxKrY>aW<2Yf#Qobt4*$yU0j4&(=tpKbkTv z`S%18GbDh`hJQjP9PBry2d6{kQOd2JD2mC zy3w-P6l5}wFI65lk~Nv-;5u2vo|ViKGDA(O3@%h-GDkR74r|BL=5!Kg$(;4;=cMiG zmNl?$RwWbk&ZV3ytEtGP6UoSSu2WeO|C7uWTDyrRpODV7BlFcgSiXmDW)cgLtS;q3 zOpvYmIHn|3wDTl4FD2uiWTeqKap=%2b30Up#DR$r6tXVmbS6u2z4a-lGfATBxl;By zQM&7yR;u5BneDNeRG_RN=1EC2o%Mvz6|s_tGqQ+8jjbtI*ch@fAj(LR2__Sy2^zop zwRf9NIN}SgeD>>avW;Z&@QNB%!o5u_-+bhbsM*D z6`8;IR-U@k$adNh>OMv4@k|peSXo5Ak@11o_|XR+^5x)Qn?s-Db4=x`ENudGB3pwr|9LdSa1hlWc8_&}G2ooJbr*2TSi zT?qA5kV(D0jzBWu%C)TuID zi6r1(?)}Ys$wUwQ_7PSRA4^d*tq`2FLG`+k&Q0Jtif&k5N+`g*=2XP=SUakrwjI%S z=8x_kD=GqOb-zBrWXoWFt7!R3UI>1xhIw;g(O9=ia>g+5#@yXP5+HoQ7$w7<2U~SF` zh53mwg=y7W#Paypx3EoBYi(9_sY?ac^Zrb>d;63L>XO?xWE{Nrr#U)xg6a=Q4z6Ws z{02~%`tCo`4)p^B1kFMsSlzaH0_?Sz8qkl$y7JonSJ_VGXQ0S(n2S{0%C|n+!*(cG zJjM{d1p03L)5p=R62mU5FgAX2`%nVdoOX$7liN~4aS|3z1>X9kyh_7RiyICrv-U%T zny`}o-{0Tlih`ycuuB(R`NnrXEj1qhFqdZ>X1k2Z&*H}Y&q@kR0JSa6TNR9dz1Zd$+f;+_YKgA&j$d$uXOZ<7}_)f!Kx?aMMfsRE4}rbJEROO1fplJvx3 zlM-he-Y>gMud+cWH=g~)=lMTm;7GaEp5Za2Kn*YVuv|hQM{g8UGcydti`_dTmS?TY^_hj-8VB>J${y0F}lZIp--TezfMn zMJmzQLR&C1<6$#JTUaH(wT0zm+a@(i3i}#)a1-0jCw(Z0#wS|^1kjv8f&_Vg z8Y_UjpqqQD8w0WmxcD_sv4n~XO-|vsaiRmDRMo_z8LT2(Q&YwF)ql=mf56<(+x$*9 zE9KAcUO>J^Y1^IH;lS$Y61I6m0lA~y0KR;*mKFc+eDL~R0Awe2kgvhq zU7AlnmH%JlK(k3{%qEpscW$o&7d*$d*mz(g`x9?blFBNFi8SU*-E1fScP|@G0QBA~ z-#R&qmsDx+8hmxDRTb<-#zOo*cCkIiR~9#|-rU8~)2$QVKDL_!yu1dh|B1s`-sk-= zTi&i`LH-v72uV6{H;dnDVB3>$uCOlhDw}m5JbFnQN01il?xqA+8h*s;$8sm-)B>>j z8kBmXaHa_P=C4(<_a1RS{2AH~DBWzP_`cUNK6r^$YtTVk8=WOs4t9weLW%d|*Eh0~OxVAQVwAsd zgyjxPjEg)t)D|=YEGVFZ_7&7snj9U@XITMmcshvGzp7#TVj8B6q?u|CDQ?^=JiNt%Xg#^q4x zR-PQB1ZTimGU6mr11%yfyg=L>M$PQUs#T-lHZtOygssWZke!!);(!`c5VVg*hU{Y>%dzxY^W(-s>7 z$18GKX{9AW(CqGs7nF9>n`<=J6Yk!1nU(8@Yq8D?c=CP>T{ zgmVhag)|NPaF_-5Bx0>lV6y-2tM`lJG9ewT*a^yWx0XXqZf9&XGs<3WW+e$t&5b@% zu()t^s?rE;mDmnE`5Ua_H@&O`?^Ro@pGwu2b!ppQw2{Wj?4Jgf0tpfs*xJcomFTcE z-v#H_!>pXYSp_W{_FKv4B>)Ny4p=HzVwJKX66Yk|6&Dj`HbP;SAhTS@cwo&jP5>MU zlV3WBRVNct5D6GLP)g4TuM!;sSit7`a)wFCxp7Q_?jyx?XwDzAItc~h(QZ~eAWv#j ztyXf^UZ+$%{+dC%PO z(}&pG=>Z*iK^57$_~I25-Wnm@op6K zd%{gAR;f|3R0wre-!XPH4sAV%5L&bJ(MA)<{Z?`iNOg^;Q_Q2a@e*7hL7sgOzJkAr zvfqc{CBXsBL4Gp_Z89%&LPqfAoP=C zHn4(1DVFA^0i+*4HyVpg3N;(!U<6*y_1MAt_sWde#~H>aw-2Ju0^`R&$XflvQT9e! zk);U1XvY9*dXQM+^>`Fq@dHzLX>=_4PuvNnT1q3P1+9xU3&lx`)X{>HaLki&6Htm1 zPB=*j?6e)A@;GfCDN@w6$m}w$b3{Oy4KmL_Y3-2Z9HEA$bQCVkljYzHg{F345JEiC z#^wtWgWx0j>4DBAL{6etVUnh1b8xvQowDjk9XBsBXz`I9B!_WgT6yhd?^NoE3s>ob z?V%9v0U7Q?{xhCk!aO_Z{}gbCDUxe9Xy0&b)lW74vns5+>;tSIzShNursFvGNGg%< zeoU%!O9H*o4_aI1$ruNwK&l!_8CR((ZZ1hZAnia+aPpCFZrBGo^AV01qLSh??y5?8 za8oHRCwD@%35PIcf~YbRC22i!cFjE@&QFX1B{ufn*qaR$w3)HSOF9LAzKxY?;0JN3 zR%#m0BDa)E8eW0lsbr=5Y#W?b3#1y!E_=;GWQiMv0wqQ%sR zw;st#5FR?S*{LEfw0zPITQ5_bB)%Sv^Pn|3&As)ip<1+f9J>;+G%3KzeH<(k(2mHl z^UC$MepWK{WJpeO-W20+)hmN?lJl+8Tr(!d5mN01whcEk0+x=EdO=7O$(i8T$`Zmv}SW3aVVM zK4*1H^{w(TB|957xO-><(Q#n_Atot7O)2KI7^vqCybF2^S+11w#dFi+=W50-E=}^k z?P8g$z^QlyKIL8+|3)**GVb5aGXC;j)Z=5 N+d*jf4ZZAz{{h!fC-ndT delta 1189 zcmX}re@xV690%~dpYPpy-hpx)oOt{=Pt*JX2bgB&k8b&6TI>Y2Y;1rWqMJZLx`^6e?1)p0m}z&-UK)eBRINGboLN zb^1>iYZSc|Mvw{VWt=#me0tt84hv$Ndx20%&8IcUGpF| z$L}03DptLt=a*I=5Vn-387*$n&98)$e>3LbaqCODIfH1%K7{k; zw;Uon^9X3}dzdD=Uuk6Gvs@2o;{k;7m=g{G&uoyb8ex>~Ru|uUJ(!0`4G(Oific)AFTYy8iyDuxduMYTO)dQ_A#-%>?-5u zcApYmA@k2{23F)#)pN0w0|60>DDa-&<{o&r5Priq}4;1Lg@iGDi?%c zjZsELVj1L7Ct?^SjHuy0$al!J>6mJe=4j-aX#Ww|=;8vjP|QM=e_;_i$jg{TMlVH` zo(5LJNGA=W(}q0Q`FvLh?aW6i_bv>S z7q%eKEK_#jECLI1w`3I*=D6p&;#~2vrwsLwiq0HH(4Nc)Tc- z+>8i0)&>IgH(;XdYsX*U+qgxxccREB6(j`$CC0m+qWA&K_>Wou{dNOhzqb`qIZH5@ii)@7xaX<1<7nU(oManP4Jc$Y zN%;z**gM!k&bydLikMS=IgE>t%9&e}y$^6h|39w)I(FgT?!qYM5$u%p2-B$eZ|ssv z+c2X}1Ix4KY%hu_%F2Et#~tTVU;ONp(jD}`#18wJm6OsHN(+Y(DoX;`P0jDjLSOjQ V;hs