From e67263f3387dab4e44fb4df6c74d49c83890678c Mon Sep 17 00:00:00 2001 From: Lewis Carhart Date: Mon, 10 Feb 2025 15:19:23 +0000 Subject: [PATCH 1/3] feat: notifications wit novu --- apps/app/package.json | 2 + apps/app/src/components/header.tsx | 6 + .../src/components/notification-center.tsx | 234 +++++++++++++++++ apps/app/src/env.mjs | 2 + apps/app/src/hooks/use-notifications.ts | 164 ++++++++++++ .../tasks/organization/new-organization.ts | 6 +- bun.lockb | Bin 667072 -> 679136 bytes packages/notifications/package.json | 20 ++ packages/notifications/src/index.ts | 113 +++++++++ packages/notifications/tsconfig.json | 5 + turbo.json | 3 +- yarn.lock | 239 +++++++++++++++++- 12 files changed, 779 insertions(+), 15 deletions(-) create mode 100644 apps/app/src/components/notification-center.tsx create mode 100644 apps/app/src/hooks/use-notifications.ts create mode 100644 packages/notifications/package.json create mode 100644 packages/notifications/src/index.ts create mode 100644 packages/notifications/tsconfig.json diff --git a/apps/app/package.json b/apps/app/package.json index fc0b1a0b86..129ead548a 100644 --- a/apps/app/package.json +++ b/apps/app/package.json @@ -19,6 +19,7 @@ "@nangohq/frontend": "^0.48.4", "@nangohq/node": "^0.48.4", "@novu/headless": "^2.0.4", + "@novu/react": "^2.6.5", "@prisma/instrumentation": "^6.3.0", "@tanstack/react-query": "^5.66.0", "@tanstack/react-table": "^8.20.6", @@ -86,6 +87,7 @@ }, "devDependencies": { "@bubba/db": "workspace:*", + "@bubba/notifications": "workspace:*", "@trigger.dev/build": "3.3.13", "@types/node": "^22.13.0", "@types/react": "^19.0.8", diff --git a/apps/app/src/components/header.tsx b/apps/app/src/components/header.tsx index dba9fe73ee..66d085c55a 100644 --- a/apps/app/src/components/header.tsx +++ b/apps/app/src/components/header.tsx @@ -3,11 +3,14 @@ import { getI18n } from "@/locales/server"; import { Button } from "@bubba/ui/button"; import { Icons } from "@bubba/ui/icons"; import { Skeleton } from "@bubba/ui/skeleton"; +import { Inbox } from "@novu/react"; +import { useSession } from "next-auth/react"; import Link from "next/link"; import { Suspense } from "react"; import { AssistantButton } from "./assistant/button"; import { FeedbackForm } from "./feedback-form"; import { MobileMenu } from "./mobile-menu"; +import { NotificationCenter } from "./notification-center"; export async function Header() { const t = await getI18n(); @@ -38,6 +41,9 @@ export async function Header() { + + + }> diff --git a/apps/app/src/components/notification-center.tsx b/apps/app/src/components/notification-center.tsx new file mode 100644 index 0000000000..3b8dee4dc1 --- /dev/null +++ b/apps/app/src/components/notification-center.tsx @@ -0,0 +1,234 @@ +"use client"; + +import { useNotifications } from "@/hooks/use-notifications"; +import { Button } from "@bubba/ui/button"; +import { Icons } from "@bubba/ui/icons"; +import { Popover, PopoverContent, PopoverTrigger } from "@bubba/ui/popover"; +import { ScrollArea } from "@bubba/ui/scroll-area"; +import { Tabs, TabsContent, TabsList, TabsTrigger } from "@bubba/ui/tabs"; +import { formatDistanceToNow } from "date-fns"; +import Link from "next/link"; +import { useEffect, useState } from "react"; + +function EmptyState({ description }: { description: string }) { + return ( +
+
+ +
+

{description}

+
+ ); +} + +function NotificationItem({ + id, + setOpen, + description, + createdAt, + recordId, + from, + to, + markMessageAsRead, + type, +}: { + id: string; + setOpen: (open: boolean) => void; + description: string; + createdAt: string; + recordId: string; + from: string; + to: string; + markMessageAsRead: (id: string) => void; + type: string; +}) { + switch (type) { + case "inapp_task_reminder": + return ( +
+ setOpen(false)} + href={`/tasks/${recordId}`} + > +
+
+ +
+
+
+

{description}

+ + {formatDistanceToNow(new Date(createdAt))} ago + +
+ + {markMessageAsRead && ( +
+ +
+ )} +
+ ); + default: + return ( +
+

{description}

+ + {formatDistanceToNow(new Date(createdAt))} ago + +
+ ); + } +} + +export function NotificationCenter() { + const [isOpen, setOpen] = useState(false); + const { + hasUnseenNotifications, + notifications, + markMessageAsRead, + markAllMessagesAsSeen, + markAllMessagesAsRead, + } = useNotifications(); + + const unreadNotifications = notifications.filter( + (notification) => !notification.read, + ); + + const archivedNotifications = notifications.filter( + (notification) => notification.read, + ); + + useEffect(() => { + if (isOpen && hasUnseenNotifications) { + markAllMessagesAsSeen(); + } + }, [hasUnseenNotifications, isOpen]); + + console.log(notifications); + + return ( + + + + + + + + + Inbox + + + Archive + + + + + + + + + {!unreadNotifications.length && ( + + )} + + {unreadNotifications.length > 0 && ( + +
+ {unreadNotifications.map((notification) => { + return ( + + ); + })} +
+
+ )} + + {unreadNotifications.length > 0 && ( +
+ +
+ )} +
+ + + {!archivedNotifications.length && ( + + )} + + {archivedNotifications.length > 0 && ( + +
+ {archivedNotifications.map((notification) => { + return ( + + ); + })} +
+
+ )} +
+
+
+
+ ); +} diff --git a/apps/app/src/env.mjs b/apps/app/src/env.mjs index 4ff1d6de13..7273fdb6fb 100644 --- a/apps/app/src/env.mjs +++ b/apps/app/src/env.mjs @@ -26,6 +26,7 @@ export const env = createEnv({ NEXT_PUBLIC_POSTHOG_KEY: z.string().optional(), NEXT_PUBLIC_POSTHOG_HOST: z.string().optional(), NEXT_PUBLIC_VERCEL_URL: z.string().optional(), + NEXT_PUBLIC_NOVU_IDENTIFIER: z.string().optional(), }, runtimeEnv: { @@ -49,6 +50,7 @@ export const env = createEnv({ VERCEL_TEAM_ID: process.env.VERCEL_TEAM_ID, VERCEL_PROJECT_ID: process.env.VERCEL_PROJECT_ID, NEXT_PUBLIC_VERCEL_URL: process.env.NEXT_PUBLIC_VERCEL_URL, + NEXT_PUBLIC_NOVU_IDENTIFIER: process.env.NEXT_PUBLIC_NOVU_IDENTIFIER, }, skipValidation: !!process.env.CI || !!process.env.SKIP_ENV_VALIDATION, diff --git a/apps/app/src/hooks/use-notifications.ts b/apps/app/src/hooks/use-notifications.ts new file mode 100644 index 0000000000..b40ab78931 --- /dev/null +++ b/apps/app/src/hooks/use-notifications.ts @@ -0,0 +1,164 @@ +import { env } from "@/env.mjs"; +import { HeadlessService, type IMessage } from "@novu/headless"; +import { useSession } from "next-auth/react"; +import { useCallback, useEffect, useRef, useState } from "react"; + +interface Notification { + id: string; + read: boolean; + seen: boolean; + createdAt: string; + payload: { + description: string; + recordId: string; + type: string; + from: string; + to: string; + } +} + +export function useNotifications() { + const [isLoading, setLoading] = useState(true); + const [notifications, setNotifications] = useState([]); + const [subscriberId, setSubscriberId] = useState(); + const headlessServiceRef = useRef(null); + const { data: session } = useSession(); + + const markAllMessagesAsRead = () => { + const headlessService = headlessServiceRef.current; + + if (headlessService) { + setNotifications((prevNotifications) => + prevNotifications.map((notification) => { + return { + ...notification, + read: true, + }; + }), + ); + + headlessService.markAllMessagesAsRead({ + listener: () => { }, + onError: () => { }, + }); + } + }; + + const markMessageAsRead = (messageId: string) => { + const headlessService = headlessServiceRef.current; + + if (headlessService) { + setNotifications((prevNotifications) => + prevNotifications.map((notification) => { + if (notification.id === messageId) { + return { + ...notification, + read: true, + }; + } + + return notification; + }), + ); + + headlessService.markNotificationsAsRead({ + messageId: [messageId], + listener: (result) => { }, + onError: (error) => { }, + }); + } + }; + + const fetchNotifications = useCallback(() => { + const headlessService = headlessServiceRef.current; + + if (headlessService) { + headlessService.fetchNotifications({ + listener: () => { }, + onSuccess: (response) => { + setLoading(false); + setNotifications( + response.data.map((msg: IMessage) => ({ + id: msg._id, + read: msg.read, + seen: msg.seen, + createdAt: msg.createdAt, + payload: { + description: msg.payload.description as string, + recordId: msg.payload.recordId as string, + type: msg.payload.type as string, + from: msg.payload.from as string, + to: msg.payload.to as string, + } + })) + ); + }, + }); + } + }, []); + + const markAllMessagesAsSeen = () => { + const headlessService = headlessServiceRef.current; + + if (headlessService) { + setNotifications((prevNotifications) => + prevNotifications.map((notification) => ({ + ...notification, + seen: true, + })), + ); + headlessService.markAllMessagesAsSeen({ + listener: () => { }, + onError: () => { }, + }); + } + }; + + useEffect(() => { + if (session?.user) { + setSubscriberId(`${session.user.organizationId}_${session.user.id}`); + } + }, [session]); + + useEffect(() => { + const headlessService = headlessServiceRef.current; + + if (headlessService) { + headlessService.listenNotificationReceive({ + listener: () => { + fetchNotifications(); + } + }); + } + }, [headlessServiceRef.current]); + + useEffect(() => { + if (subscriberId && !headlessServiceRef.current) { + const headlessService = new HeadlessService({ + applicationIdentifier: env.NEXT_PUBLIC_NOVU_IDENTIFIER!, + subscriberId, + }); + + headlessService.initializeSession({ + listener: () => { }, + onSuccess: () => { + console.log('Novu session initialized successfully'); + headlessServiceRef.current = headlessService; + fetchNotifications(); + }, + onError: (error) => { + console.error('Failed to initialize Novu session:', error); + }, + }); + } + }, [fetchNotifications, subscriberId]); + + return { + isLoading, + markAllMessagesAsRead, + markMessageAsRead, + markAllMessagesAsSeen, + hasUnseenNotifications: notifications.some((notification) => !notification.seen), + notifications, + }; +} diff --git a/apps/app/src/jobs/tasks/organization/new-organization.ts b/apps/app/src/jobs/tasks/organization/new-organization.ts index 5886f5d94b..e52c79a7af 100644 --- a/apps/app/src/jobs/tasks/organization/new-organization.ts +++ b/apps/app/src/jobs/tasks/organization/new-organization.ts @@ -1,13 +1,11 @@ -import { soc2Seed } from "@/actions/soc2-seed"; import { logger, schemaTask } from "@trigger.dev/sdk/v3"; import { z } from "zod"; -import createDefaultPoliciesTask from "./create-default-policies"; export const newOrganizationTask = schemaTask({ id: "new-organization", schema: z.object({ - organizationId: z.string().uuid(), - userId: z.string().uuid(), + organizationId: z.string(), + userId: z.string() }), run: async ({ organizationId, userId }) => { logger.info("New organization task started", { diff --git a/bun.lockb b/bun.lockb index 17d59db2563e5358ef298c4affab8597d5fd130e..338ee6ab696677c61cd8337e41989432cf8fc80f 100755 GIT binary patch delta 122224 zcmb@P2YgjUxAylwaNz6!VnAsY!~zyjP~ZfEIe>@+M2Uz63nU>xAS59P)siUsN)a(` zWm~X-1r<=l-T`Y+)QDm)VDG)YsNesYnG>Sd@BQ8TeRuy%o_W@^HEY(anO%bG-rWDa z2M)O8-~--2dEpP$*KcdFa?{d>>bu_7YM(8SFZ%wLw>z#rciZ&x??>M@^0W+3*RLM?RLsFaobo$(X{DBl~vw@^xl?A zE5X*_Qim&=+eR;jtFy|=N##>e=BPu{IHtx$`aGy;Rw`0Plr>Brxx`XU*L6vOZoiD*`v0^od2NUyUhbtx8bx-FCD6%>$7iU$c`<)Z|h?YK`9A z;v~4#Ki%Odm;d*MZrQ_@Yp5S?ZPG2crgM6bnN2%qKD?Lhe0S%QOTvLoJ6B)S#g;h> z)X>X8sd&jg7Ap#k`MtLLTIVV*EjEG#T$-ItIc!^V@P5`rSA!kk{{nXf(@r`Eu6FCY z+Ww}@HqC_ZHqGo*BWeAqu(GnKk_r2{ zug$*!45(#d2b+ zYNmpiy1Hg82{kY&zp`v*sps99Z5wD~3)GYsPcZZQ2Mucht)oHBL3%Fkg=@~Lj5*$bK#>5ttGSOp4SVx(IT&*OJ zwYU*^J9s*5KN|W$`|9{et859o85Z>B9cKsgIC8c6fXip*imQr?D#w>ionBR3QaOim z%AW?Rm(d{OtGSC_WQ@|X@+!5LUrw_xO|X_J0hJ#yLfQ8mhZPPdfwJcv6K%P%VP1>&)lW{crT@3= zI+kAKHdD*0ipxqp?+E5iYv;Za+s|rHS`0&umThYaODbnE8gD-Y9mv?VPxxDlt_M6x zUDa#FB(()gLCrrwtjC0s{E0qXqs$6(TXqgUn`TSD9!_i7zWQP6N{7Np`6W|mdL>*Y zJ!ZN!`H`UV=agY%uEQN4g*&THHlLZ3@~gZ9k?#y2IMYsfFHn4ZQNeVK=yh@Yd)^YCd%?dv z+bXib7OXi7l-)h@cL!I(<-h&T%2Wv=`*6i~hA&(i>^ zy_%A;QW?p6w71oC>IJsK59eDee&FzBhwDLEXbmXKUFUEFxGVfZP>NQ8Dpvq%fJqeS z2DU*#;U4onuWKI?JCl&9e*t#^KLS-@HV5-c6zjFncCp|7MuC_%g^KogeqN}XVV?cRb z(S!*_g;k#S!ctqV-8I%*%i&V7a$50thUJ|Cmu&`vyMp_JQu&r^ZF|>(^7fImD;x+i z71cG~^>$20fy#JlnXPyysD}E0a*{`u+x+Q{Ujb?xc136=mO(FFtkr^a_@%_bFTh`<-^RO}qkXV2_D+CvhbSHGICy*g}IU_+L5<>oeO| zf49nZJ7cv~YXT@k9}UXcJ^)*RE$^_t?t@ZiVp;ikkL#D)?F4=bG66L?ln=mQjcs=w za@pxsP+Gk~zSJKLG7lLwm1U)+IJ?&;oYtm&_3*oFcUOT#qZ%KSi&j;XO`kZ4Jjcfu z%_u1=_q>AqVj0D|cdb?bT2RwbeXq63X`rIp0C0EkrF(2J>wUjfr#13k$nU<-)T^#( zhCupHdC)Gh&mOSW8wuA*s|zS|_jUOm*ag0savJA@p#13lM{I{1K;_@;_+n7yW;r|+ z+yj0)^;*h*rmeFIe21p;n@bsyEO5|O)^O2!J3-%o?U2uzSzJ|!WzO7S<-0s?Ezlg) z#7#op790ca1lCYb3Y_w!jVf876x0St)NEwDyVkWfl}m6>d9sQaP>a|=u`>r)$Wfga3 zQ)hWOj=v4cH4A#@t99>XxYo`Ew4?EsPq)v zQ%Z`aSJ1q@kLc$!x?*;ZRZin zOC5LrTU~QE0@-Dy!wJO`r(;(y9V1H0#^+bE7%FDzF{0-^gaVrQ(x2`4o&`0Y2SGWy z=C8c0qH26uRZ-~-&s#%zb=dw_n}0T_1yupIUZkC0 zWEQ%l$M8!N-z4w~?X5^JcC7i^{yeHrqQ$J89=9Yrfo)R#J+975P`X|V%Bm9+md}RE0;51}nv)!V5tLsI1vO2R%c}B= zX|HhV_$ku$@K(My(dwF0W46OXcJj^MvOgJZsPI0#3)lv(z=`7U95(=yISi#2$$wJff`Yt zcD`}si{WbEb}DK_uVHN|`py+L;?9Gs<4qlG2ls&L_$p9}WK&L&elJk`JmpuD_!tXl zB*h3YNlkMK2uHxx;GwR8c8+gv@0(rqJy7`@L5=9M$nM&AJAQ@Buctjt*+ZRuqrg&7 z5w9Ao-h;$rXs!-#1f|(jhsQhY1FBqSP#t}uP zY-UOE#7R|U$TiS;$YsGM{h16<2n(BU%i~*``+(^(Zc_D%qLWE$aA>Zr0?l z!8PZnA7B-G6s~i|eh1omr_-LM=2^Hpx*u!{p5Xeq@gQ4na(7H1jbH6{G&mQYda|UA+DpzoV5GU(PTZb184NLbdWz9u0?HM-mpfhO2)H6@vxwu9dUmONCEBv_2k~0HMK+=LuD@~ zH}AI4q;zIwemToN6Zu}0-`>ZrsqaBeIJc$TmzETLkZtAX^|!8>2Wnm>ft}>zDH78B z>LYAM7e=g5cTsp}=k~>0a_o}5DrNO9D&>__ap}bKk!u>;P+H^UbW=JV!;CK)&!bJx zizC;{*nY58C%`|%zk#dX2M+5%_4a(&Yp-tAuMD^OroxgIYe%fok{^ z$DbW;jnx;fWi#U#YnHAq{}@oi96rL%=KgNEd=A$z`y6Y{@iJWPwsZOM<5UlK_?C#G zk)=c5QP*3?{?{_=U+GZjA(tKhM6$(7%n=G?KYq-1H4PeTGuatDxY6q9c3gadHSK|B`Ca;COSQm>4kPd%q2sfQvs^NSWvDz3e-do z1hq`dimZpF&pl_rRemHW1@D+(T{`9D>BDvUIpATmvy=A5{geQA0oA~A&mQK|FSw>n zvKC06v6~lL{=1XE0au`zSynNAW<`E^z2o1JuPJ$Bvb97H+EqE;&R0$)bZ?l#-l&i< zy~LWlCn!_424#WW9j~CE6g&e|{t&POxKEkwcpRvX$|v^F1Gvie<+gk?Py_mve6{yE zsCLQg0kgv8`*y89`z%`wv3Yn6ns@F;oNWzOK)&=tUX)*1KMB_P?^YFdWw1Yw2+Y3JV;E8H+Nm0QCR)K+(545OykT9RCXSlkS1%YFn@xv!^N zzWEA!@O%@lDZTbeyErcZbs~Hcxys*mm6hKy9jB9E!qwJ!mQX+iYh1x1P!<~I@K8{S z>;_8V?NwIck3lK)lEeE!oq(?fwSk>@omHqBt}SaksCJK$Kn?ZF zCmoPkojw?)Uznv2M(G38hqqa!E8U%S0)wZw0LG^VYsIlzncu^%=4E+>U zPVJ$G6gwl=%5DbAct5Q&<*RG9lF;-#PVZbN-DwAN zA1G_~ad^U7Ywb>O)q4o8_HK80`CV4wpTNBpgWe<|s}6Au><4Nj)9$fW9S5p|OPwXs z(RR|kZq`6qV5GyNKy{pcHCf)HqNu83wr79ynOF}#ZDSB;-%k)!3|glIc%d8VWe-^Y zI}eoKod2NhXd5WSHiO#6E`P`_gxJG2KmEnlMab3OdgLm{b1w7b2ArxnsUcqqkENYz z75wE9>*!M-wF}}DP<}F-0vgHM_0|Ft$|~513MY+SXXV#DX8r564R*!dKsj}I-Q#vj zdp=;MYHxou7R|Ef{k6KZRQGIMn!d4OG6s@(NEb9)`H@vK5Z*L0?LW* za(ERTh!26wmkt3HBD#Qbx}8Dwvoqx+Z@$qEaMFXsAZ6U>MsyLV3Ug3E1&@ZyLWPd! zImMEoVoYaHAtVD-$3Cd??^91BehF0j4}%IZi=Vfg4~+CSyYh}|GUS~zT!G1;aVAg= z906)%-CVx!ZYS>z2+9Y5*t9#Ez|ACyy#nYI|E$@U^9o%(H z##USH*Z1tyehRApv_am2OaB)^Q{6orf5P$Qp!6x?N&T$?eM%KYtkD;dSgi6ZVaZd#&h6j*0no>8pl_l6h8cOYmZ)^hn;%vS^WZ3 z+3Ckh|63o@q(9$De^8VD6fXVIT2W=e^x~57)!q}|*(H5DsHJ#?!}A=LI6Mi|iaHWh z5In@;ZVsC}{Qg^;|E|Ml9p2~gMo@lTYmj~B94DCK@Dxyveze0r4)<}G>5$K8c!gM4 zlz!Bm{+^Iy2j2}=l&3eg_uT{x{kMH4^Dd}c^-W+K?KA1uIr?Sup(}UO78o zwPM9KFJ>A}e;Hom$Be5S0cweS|EZm#c}-#_XiWnZh0UEPuSQOVYwCu8>fpDgw!NwO z6;q0M7IG+ZP1&9fGaRDGI5QX0gpc?tevZWq|G?p9P$S;p@J@%ALni*YYQiz6m5e>E^S*m;*s}1t zgSItW`T6&Ez20W!SFeAzefDpuXO5k=`-M;Uc(=oMZ*B3<-)+mBo+r)j-F;L>+djE% z-=1*#t8bJo9qi9u{M6`|tJ)v*@r(_53%^|U@UXky8$Gn?T?58E(;`Uuo;MH+W`vpd zWHp5x7H+yFJK!khOteu#Qb!r+en3NNo-jvVGsN}0s{03OxXwkub|1h^W z6>Aj_7Zm6CBg4Allz&SYOiuY9hq;qe!KP-OcPzEyrm5YUhZ`s7`1xTlC6&0R`QOy~ z)d~DC^QNq@Zc57kBn(PYvHgQ^SV@jw7|t(A1y>U!2hdA?s3SfHO#J9ARfzdsC0)od=mdxi5$Q}GI-YyWUjadzzX7GVb6d==)F zr4rqV(SsVby!PBA@rPN5y`xS4^7|)9^`zq_ zVP09%KQNp>J>{Po*75toFqn}F9wqi@Rj~ zN`yGvG>hH+5nKMne}g+O4Ctx$)%0L|9+)(jJqz27yMJ76h-l z@@CRw?K_1TXXgYLan_N8G!64U$!ZE25RKU2_ixVWQ3^Lyz8rzd8M6kjHZYB+f<5ijB@8`<|=c3Lv%$rdMO1|1YQ=BfAi3Rr(lYy5puhnopL zaIdu6)y_)B$H00=iymi91anjVGhy!BR4maYTrf8$xTA~bjiF^55`w+M3|_Jv8|I#$ zil4VPa}kcH$`0-)<%WyeKfs)CPDlp*_elpq4QVM%rZ5AHzXj_aE}ESk@47FM$C$2) z)WK$8^>dQ(<*=NvRYi92o=R9nh-m$J--xNF5lu-QukulCdq1lwUsWCxZK~JuzA)uq z5(e{9{+nU$yj0M>8=aYkGtW*2N5bStL?--rHq6?uc1ki>2^&nFouRK`gJ8`I!^4eH zPGSlEH36ZGY5ximaJx38ID5zyso-q0(uIB2YZ zS+z5lW;KPFY4UTzx*Jl#9EPXH*qzt`?}jnOibSw)95Zn-=$>l>yWOB{*%&5$X4`;RXG&|Ut zq+|v=3-vIoikxRx+*YPVOCo6=Of${eLCyJ&HHq@Z6Y^oUo?Iz@eA;}qUuHFhoMbfk zHVjs$f{~-_%582eT?4a=UKQ_#SvQe?{sCh}$YgXsoWUwDFsG0UVA|(0qP%hJBd~rt z!w0{TQiNk)VCM2i+ZM1TC+KD2{5w+qw_)8Kso?Mvt-_SUYtDh$`DO)i!k@n;6?iA5 zLq*=aqz)l>rf}R`e%~CU~Ph|(6Y~wOfkF(Var!Z#nEbBU^ft{O`fS{Gj zdI`oT9oz5J#%vZ0v%0)G7<1`Zhtt?P(u~`h+`Cgj^%;CigUp)iBUoVr%N@(#!!@wm zVEpGw2ICsDNwCu!@}7jzu`9V3O<1PYeJ1SWaKzo&@y(=8FsW_@tO}EwO=_e`)itC# zqR_EMHnAaf52<5}%padljc7<+Not64gRe-*PtDO%_XZE7f-{P&j3|tQEQKjZG1=_& zZ-luIrh@$^*hylM%uU8;!Z^2`pY7ih1`nlJPPq@If-H=dO+Cs?OZt^z-9xFw$H>%M z`nDw4ZxVkwfWXWsOM3ppsh}2FZ)7H1$MsG1fN;c|{)yrSS9pjh4s)&myYesW8<_J2 z@{XF^F#E78{=zu(p>xE{;)9}jca zrQ-3aGQ@~=+5VAX-MUn;8s3wUnA2DAHVk)GoWziQ!ujh{{!3xq`c&YTd0r24h`dD5 zQ83jqD>A-VENa!4+ecD^klUSPuX4L0?N)gfY%qCj7gLgnbufjLsP<#~oZ%M)TJlj| zm!`TM39Z2xDBRq=!E?b41QG@W?P*TCK4Vu$J*CeJ8=z6x)=jS1B(10 zfkY-Hh!-alozMKM#eiO(o>N)%+CS_SmmC5*RurtCD z_5GVxbEBsM@d8ob}++3`;2@o2@Q zW{@IYA$yG!Cx1#G8qTjz#VY28!(PmZ)fosf&rcsHw``+miXWhV!?if|d(B?`Z1ddZkI9e+l8$ zRPa8s!;oc$^^1v93*E|z@?K^`g$)TeUCc?B)Idt@YBtoi7uhMtp$P!PVOn3-5zmHc zamIDy7_5fLi8(Dio7EI@qSOh_TV#(-?EV<{3)smNVjv7_@WnRBu_tpE@-R#dz{-=c zri;S`Z|DJD-5aU+lEpZSxeeS*s;?=;Nh=;)qHg35V@cWZKN$vZr4nAPT_h&ZMC*R_ zgK+*^DSvHP_f{$hF12?oYyiuW!5J_O*s%C@u-tIOBmMm_-1v5mKQRp6Nd-5Ab~@Uk zcUA(TRnk^BVe!tFp^>?%8coW{xp7(?=DwSXKZA@L*!9`*124ytrd$Cjxjx6s3zPBd zVBBzD-d}(0Xk#5m<{(&N8^cl@ACH8|@b*?|I!q;5J3K?U33jkyd38yDb6B_aXrIH~ zwuU>)34~{^zu#F_US&;b4txHy;rwl>;CE!&;n)f4d3JWSRkVePJF{T6AKlmA3>!>I z;}}H9y7yE5RblXfiG&}dg3i}i{q4E@6qszxnH?{<3Z~J}3y03k1|WRY0Uj774*H%E;O{R*NsKpN2yrL>%)wXbK=KcuRr!{^>Mbp zC7l0pD%N>3?27O~y=n%rO)0lN)09|0Rfo(+GSVIyJby(-w} z#zuiRmQX2Z29IFso;M25OQ~l>aX#$n%`m{f7tz?=6hl^ z5^m95z`qTaQfY;)_#ZHCbth-X``)S`rRP3Xq^z&8HzjU{$zBZ`^fm-1Ag~*B-`mo6 zMVaR(gLyEUSNlLRcnjt%gbVM#(w5}Tmz6sQ#tHJ1{s|J&zEzkf!>zK~+a2U2m^5eR z*iSBj^?_xYyQU{$I+@^KZ*b=T8(>Oi-k8;NwN9dnx8IT)YQ#F`_Y3R3P5I}9!FQ=( zw>#3YSGNQCu!guCzYf;ZM4J~#X+>jrZZ39R(@+O?D$M0=$VxzL|0?(j%uP7#pgSAP z0GkOjn}{M{;x5=QI%s&z@jC)7K)bZ_*4kym!yk?b8(~TE?4zKLciCy;F%6;gWSAVL zX_WUYP5>)Vv+kG`biCVIlGRG#<6-Iq_at!t3ntw;Mq`SnTpl)u{RZo4O7a{ae&9Va zEYB0;b4Z;WZn~m>(|ffKOY{+`Qj{niLJfL#h(kZv~E{Qn`3?B=EPgvtn7ftw7+O{)eWgvNEJxtC&RkmQ}H?L*j2TJ z601p#q@M<>|BgWZ+ce^lUsm(=ZY8BBWd(v-cMR?|&pTBl^k?;tfaTEtC$G`|_ehCXj^uQ&lrN(K>3Dsq>DialSj z5s67+^;W`0kk`uG&HMn9nH#2M(2KS|mKlZ5fgMLSk&?K-38vM{5NNh(eR?lZ$>U+# z6Y$CNld+jEg&927e(@z+#M41E*mHB*J+MGf0h0xoe}d@-G2`m{ylk~K5i>pkmaUy4 zSVrm?)45iBt5+;ziT# zZP-{CPw7@CgHzr}Yg*5(`b|-8Yo;slraiuOFjI03EYDQu5b1vv1v^tD=dJYqDVMK- z^;CamS{{cTX)5U1_knNQVVV;_ycE_q+%zXUxRF$EN^#EM#&WCVFgum)-${r5`XxLj zgQ+AFi*2uPd3K~P!Bo$@SPc^IT4q9F_61mf+w|0A&|<3_VwCp?CWR>=;0Es}g9R`(ZJZ@&yUlJn+|qON zdU_PJqv@Lv4xk8{F@_IeYT7(e47$8;8Cw$D_~|g&((Vt7TwZgNR|nHxZlBB^{()_i zJAYjK0+=jeH-Lv=QVHu$Ovd|u$iPf|IiFPja1*DHb);;0dBsnX+w#T9*r6Xq3p)Bd zlKsdIg&ugcejjY8>0K-2PnhaAGs|t{$JUQHEnJ_KfXI&AZu3-Y3k)Znn;q-t6)dL z(zofsw+O81xc3WseVLv<9ipbf4z*P=>vga(hUt9qD=Z7fX@|UCU)kfnc~FvA4$}gT z{Ey6Q`^0w$21}qXM#6R11=0L23}?pIc4F<$b2m)AaToeURsv!jR%^27H?}_O1Xcx; z%J>84jN4%5R2pn^a(e*l@NHT_h0u{OHI84x&VzL~U8%j>Ve&*QRG*Ch02{1VDM8kE zc0v-mEe_6wY2`A3?`I_-#^6!?CCn8}&SZD33$xhs4(a5VX+Z7$hy8RF> z=<4VACq{K$iGbJrz_`rI=~qbE6{Zls>yOcbZn)aWAFa9Ad3g7FF^pTmCH)gh*xtDr zi2anFZp~7Em`ugcSgIAUkuVeR{S8s>0ZhU#2zw%AU2qKF|7WY9U3qh0(t`^4)hjT~ z2{x=q#xj42795CHC;Vau7&ngw60km$**VIK`^jKEv|;H6`~PZ}AlfhqwJ>SJq|*3S zm`ZY=dqXnl{F{wQ)}qs4Drs2aNtjADoSd5c+iGCFBO9i9B7hNr%3L14!rkKvmuH)O z6DGs4ce5|xLQUso3>VZZ9V6U4-hG zEriJ4*YnNuU4k*kk#k`-PxHME<}6&9OdRU_f4zM;3xTvSJ51sk*rBlW-G%>KlzSLn zc|Z)gj^**5d=JKk&aF}jDY+F(m0Q;3uoGeSChr$m84R7DNd^<+zHxsdE6*ENM?oKU zu}`90AlSW`Z|u(lBIf2qSPu2r{Wt(!13MVTYAa6qKSa5GsrO|xABgu%_+Bzv)Ys1r zrjc|G$|T$gJHjgRZZh}^CP%Ppbq}n{=8iHba15KX8LWV*6(*0U_c1Kj)Pu!(W<(pa zaPz_p->h8RfSzuJxyi>xK7?i48f;K|wUC)w@fpHtq>gOR;5wMhO?bLBD*@5W+E{f+ zOW)mk=3$AMFog`flnwa~nB6$^{An9Z&f-Uzy||TW#RQu()2E~qSgg+u-zhyK^5A8# zK{gN7o3{47ai)d57%jktg_~~34wmoini5_TG`b)hCNc8 z1ati{n5$umyy(KmDeuFMhhaF5VL9!rdl?hQXTeU?VJ-eVDPC{zhP-9_XyZUXC!W{d z_m0-Hp!oY8d_LGvs((kHaG=zDQh6rz2C0)ws#ho9JKdx%CS_$GlCtIc?&f=iCihBG zqfF|HhE!_zbRSocvUR_1kPY3#=R*S#&Leq}<{-+54)f|J{sC-IxQTBzy7n;h z#usDxq+BFo8(9WR(z?BocnzkYn-OIW<;-!gjc#;=uOA1~w%gjovs#$5XiZk)5F6Lc zw+sHlDED|qw+^BD;pD~Y+oh+q8hWv&Mmk2wp3B>SD0dVUenOaMRG~ur=w2)s^YvYV zl!9zv&PW?zHY_TJ{{hpEV)x~oLv3(w9o1fkV~B;DKH@_>QoSgZq0Zwi4x_zj(cXOM zNJ`-%y&naO5Xj|dj+4#PFs*#U;;nlV{=yLz*@+5LnxBT->_-u3itHh?MIRd{@gf?@ zgK5K{5$^6ThDl!=KGwk$cRQ(MVqV|BHTyCGRoyAnBaNiZHLWI2hbcysgzy#-p z6U$~NpkK`2G0R$wd-wB`i6WRnVY+s32LjC%pU=JKXGQbJumyJSNAJ<1F>HawB;CF_ zFPT^YGrPE6!!6mwQ3HY9Omrg1JiK8^vC$j{)8v_tE&RDr?rF^Q{Rk%^G+{HbSGHXS zY1I=I2s8^uy|Cu7Ab~&~a2DVc^($;h)T$kdE$i=_r*SO31^6pW^J30^@!TV5Hf&X$ z9jqm#Sb)(n#Sbu*GPiocfE*j^x%*_YE`e!_qa*I!KZ@p$McY03U|mDtF!Xp<0@C0U z!Ah76Y1{e{ra-{4WL`2jc!0Gj`vyDySuoqOZqYZu?72aCKkZ=Cll~D=T|T{5541+$ zWfq_CJP_p;a60)hnh(U1gQ5imEcQzVrA=L1nvA~=ONN`uvxA+Fv@?W#c}g)TswheSO+`gTTy~NVl0m*4_RBj3)`Vp z)))>i={*0!X#RAZ@Pnuhh#hollre)7;-#mWNuNPjd!3~Gh5O6mWUHdnTzK_7PmjzF z;)zm3QdX`#Gj)dDITqexkK=Eh`jK1{bOrd03=Oy?@g zdgU|F1~wlyuz_uaY2~p}_(W!xf+*u!KPOgM5DgQqEr=F?!PfsF%`Q7!Sit#AA&QGUrA}# z<*3GPc2*G;V06WkkBu;SGt2tJWYA?oI&MjgDX_sNkANLK2-B8nj2!!ALNsg+1L!|7 zS|FS;G1>?Q_f2d#%y2IKUd)7+*dddm1!q#=BBr+;&0HSUpXsMxpr`*)?wa?{nCep? z#*eOflWc_NOOd(BRu98;mQ${An{dFdLCa!im9$WwI1NXrBNe+|X|mPjX+{x3RIzcl zuMuiKn;>k9S4x;TaI#w-?vJ#B0tCk9=B8>X%$*t@Oa`C96o+NjL!xzO`a2K2IYDb& z8iTI%-->yj`vjdTJ5%NF9|~MN#g3Cv@m+E~EGJrYw%@;7iSNy!d^6gTqUq}*B_C%s!?_RPZ5-}rvzI7c+%2HGGc54VTPyI>s9dA;$YN~GmMziI9s+`N1% zhS@x|wHjvrawYhbl%|+{{+Fyog>T;3*bj(j!t8)hHGU_I@08BY4mwoYxi+O@Csalm z=P`tZmC-OTxEGUU(%_b;_Phpn<1Z)8|LrI3ZdlD+pYeOAzZd48IxvOPbCxc=g~BZ; z{A!drx1r@W%zOsIbjxW+UOJ=k=(oc(diLh&+_=w7$Lo5Q*#|H!;(ep~TZm1w?1L&! zYQ(=kU@8081+#5zLe67>vllN%OZS!BH@qM|;6}F3&zaS`V{x zqT^KjOgr1mDy%g zo+oj3x)r^O8v=974mE2Wvu!>Ivpq=7Z(wTEKFjERj%8k0e=Xliz_cJRGbhv+VK(k@ z=n2|Xr|;!th_hiQNHbIK6PO0eeIXBb_p7nG>>Or(!JmV{2AKZx%94ruU0(X2AAE;E z5rQ-Bimb%B4TMu*DNHAtHs%rQ3YdE2K*p3EdY;`LiE})zdKhLKp^w;a=S2$^;mN1Y zwfYlon1X9yDntE`lCd}EM#C0q0P>hpOTedWLGlPgF64VA$iOR+milUt}jUT|PL+3Gh`On6HB!ZBKd4FXq@~ljBJCv&kz-j-4P`@;_K{KiCz9@|R&H%Waw$pI@sA{3yT@GGAias?Xxqha zJEWt+2FDojAXVg@D|Cj(TL$3+AdGm3YL(xH&wcaX}=_W+oqe| zN|+36AM>{;~SI5C*Ys+r`3)>D;P#}+1247)MZe~%%7sB+dSpNhGd*4^j-;!LJ zK5J^>JqVM>+4?(QmA(m7lpF`MI;rGSFjF$he1dRybvjQsh%;bXzE;D#VfI#1IyGHt zOX3PQB!gpNaz=Zbx%@BeCzu;2&zA;Yqq{9VmA-_Oy}{KZ-7jD+4AOevNbS`1m7h%H@iNqkw!TNW_8d*=v!b77Kncb>#ni?$uU-Q83*uS?yP?h=$$9v82N- z(E>2O=oaj&w?gsFr1*5Xjz1v3H5#^(2)*RiM)r+;e`~Z6X{_&UQN}8Nh<|OAx2oZ| z;ZeCIo&5c5f-{+aQ{wulmco14!)N**&Hek?I_Je!t%?>P3G!B_eOmPvuZ}YAKw6Jf-e*pSLC4$e z_Gw>co&wV?ACt6RwI<3~OT9bRq)%eHxB8q?NaIuPWX#c`wLAlP zhU5^N+-Yq?aso*{Xfg#z9&VCB?5^~loXJu+1*W@>=286|yk;3xhZsv^9qx`c-c48M z+|5FZHr-8ETS&UDcE5)q+xBZn4zkG&ByE8paj*43-M}P+=`cC2c}$nM4<=_%A4B5b zA>eZl{$jiPeO3t;@*Bzc1Q^aXH#>f#nmnKfZsczT~ z_Cr=v2qzuBO?#9Se`Ugraf?SAVi$kPbOG#Squkr1Mk;Q_dOQ|wd<5@#e0`MhDBiQv z20Km;m;{m`FwFT~c5pr^7p1F{iSJ;Fzs5Y~)A+>W=|O6rxEtoS7b0@MCmIbVsDxQ_ zsN@4M-E-Mp?pxT7y{q4o=~%0y*Ibw}NtD@zH3KvIOO&@aF$%^X%RkCwKcyFCiza0U zPmr>Et8S;JJe{77r%B0)&9jG~$ukWM2TwU>cdavFZWL&`3Fan_G3`@lSFoM9i7?)m z@>uasQYV@R0>N$@(_4ZzsVOkCaYVJ>qcAKd8nM*x?{AETJ&ED7o=rEe^ZLawJO8yy z_;N9wrAgoOIXA8-b1xc#oo43xDN@?sup~Rso}29BKJ>dVnV1Gsb7^-@tVGcG&=`D+ z!0u~u((LEcv#l@5u7@cPi(#YBV0Ol87i1+~u>Q+)2u}IqVa`b=B%9p-f*-ahIU@K4 zsrn*7^5i_{MQdTVUnX0}1^ZB~7W1^JK?Bg}l$`ZIZa9q}|wOO@MhoU-*>mf3CZB$%CXIqWr# zQIEj>K1>UjJ5iQVm$&UZ4Q}&s+T$E!3V3pN8%$4N{iwDT2KyCi&wRC19Q}^{T$k$YiBeE{}&sxcFxN@Fnh*Pp<& zLo;stZ_iKCj6bOlPJk(lGaY#GB``Z4O2*g0_?CNCcI*ef$9xa(@AWA+ZQ-W3vt#Fc z8f`=pd+gJQe+%%OV8CZK0x@Gmr<-6Jk$D^y{0x&e_$r@_4*xtFwvBOJ{<)RfbHf`j z=S!@gj4#qlUeA|vV6vp~%GiuAq6P1x%k4o#pWIRl@0EeE&B`m0j76AHt(pf?HaP|GT3mFmv;}}QaS@hwQKQ@-M&eGE1>mU z2$N>~gI|{r6<{{Z)jmhydHtJc*vAay&F}Pm$B2(P=pFdIZi-EE=8ohOJCd0{G!!_4 zY4w{|4E{F*KsOd#1XwZXM8?GM~Pv5md1Jo7KqWd3GLnP3;o{Vf{y z6?VHo(rCn2ywNEBx80lU5jy@m^bB)!4o=-}V`%!U4b>FzF$MwQO_&x2TPguA^LHNB zM2ng+4~s~Su?>7oQcKmH&b$2)ZTtrBo$`l`Nv_>{p$Z!2(PR7**Z^C7|39tj42ehM z<6t^W8BcDq>Q6sf*vvm7_Sv7&g70Xw8!t2z_RJm}l)whTSj4%rXZDCDeVWFi z;XnFEG$|pmP>H)qJWC>I5w|5VAnUvkCZ+i3oRdlvr}R%0dK2+rqh00<{w%W@EL!v< z^HfOE9uBml-3`;^W3B%cSUovgPYQFTkL(P4SH&$bKscCjGY=p!+zridVN&;o8Ph8-V?iL`}`ZX z_QjLO)yDnkB~DujxP(plX)nShjPcV^giEOMokX~V%HLgtOQ`%kM7Z>S>oWy98*2Vf zWv0MhaPH`}7nw`A3qJ!4`zxx!fle;e8zQDh{|cqvCY$znG-EEI6dGx%SDj7>)eu3^ zTtaaUl?F$F8aXcsO$TE@UH=Ky(P^fXMb#hYxWg#5-QUAlFP{u`Sl|i>W6{*@e*0>P zCpfWC11xs@{|BYdRM(DB{gm?4jGrogbb*>9D^P*y{Age^`O(!FC7*4i7FB)@Kf*Je zyfI1v+qy;7KbN28{LJG=*E}y;@VlQeP;JaNlK&niC|m2w3!6l*{O)&-w*T%Yx=6gl zwkjs75+HKT>k^C{x21FLlTpc4wY=e zuXbQZP~+ImZk}*)&z$WMYx2@ zpX}sQoLne*spF-_Q5y@=8Lr?oP?}ac`Tq;5Y8Ah<7H7Nm&UEcnE1~pRP9RjlbDjJ= zPzs#y@*AUkbe@w7m7MRmP$Rv_;bJEjs=Zo}eyY7CB$OBF*WXYbTbLASNe~4W?*D(w_`5uMyJ@Uj z)G{9H;Cs;?@mS|BYHq7*voXrL+~Mnp5NCnIJZ_zhjkz5*mr%t%b-XcZ=-gJC^4v6< zOQ<1mST@)H0PO<%rwZ~ij-zHh?c^F3s?XLAcXo22&o?V}r;$2vr-n#cAxA!NKO*ccURr#QJ#J(hqH zl{zd3rC}AQnV;$8vq2g9LQny3k;}gXRLH*qRK2A!cT6K;1lNP=Xc?$u`f5;@Q1aUy z|DT|$ta0`JE4mP_3~72VsF6Pc%C;Lo{_~#DFNf0n8Mw;5;N<@aWto>;xyGpauUC_y z0&lqjLUr(-<3f#mtK;iB$pDF1nD_@(M=MgE4G@cW(opHR&|;OajF zs+-3^RoTEV%c)$A;}?MHXd$R_A;^DT#4k?bReyytwI?Vc1#WX0 zcR0KoS~OV zzvJY>*6=S~`LCS(pHPs9dC>(mqM=Q2fA{DK&dedRQ?E;e;lYwsPcJ^{{vQ=22ODWPjv-_ zYVZtDdKWnPKcN&ZBwrmBIh+Wp{$yA0|Bhz9Z9#QZN(D7o=CB-8!xgR}q4Fyo7m8Oo zF4P3h0o#MMPTm+LTEZ{Yi>gVegDYLZ#;5{UIk`|_;s(e63DwR`iEN z)Fo7Y^(vQG?J|Ti-5Q5?x%|5wzt8deL0$iZT9i+_@*7?GXB|H0>IqRGYTY)rt8u~? zT}ES+hV@R~7$tuRxkmc3!!54de?m>oTa?pOzXz(Ft#P~Pl`w*BuA#=Lg6})IQ2YbO z8>2e-%;kR$s-v$R|HhSXj2ggqahyUXIoAx-ylg08M1p$h2#DW^*)zQ5x_>C^+1LOsD&;1Qt8<$yYd40Svg)Fo7Z zBOI?*LKTj60-?D6XYLwVo|6m3N4fkH9FBJKlN>)8)Fo8;F^&txPXi??;1>g^_9l`r z0RvQl635FNp9bn=I@ihn<>d1~Ez4RbzYNqRR69#R?I72H%DTbHZ*qJk*j#^LwU&fT zaxbV$D1{zy@<*IpsB-H;S!e^Oj-CK_jf&dEy6IV-_m0bc*Wr7v*fxhBIQfSTKaxCp zq#YZATKm$8zjFAs!*3jZ3u@TEfx3j!_IHOGv()e%#vC>Q)qdPzb5Qj%KwV(9sn`O6 z8ffVX?gYxy+PZ>5Rcz<-J2>nF@}Jj*Un<`fR6E@ybf|gCT{v>*Z z6JP1@DrIvuMwPqT$s42OOP#ziN`4J;b$^}1WuT`0W>EPnn(Gy}O_+IJ=?bm}bqQsT zJ3&>vSMsPwC-+$CepgJW_8xFtDE^@1jZyN4T>itL^m`Q4Y^-=P-wToV>3?{--YlupYa|+V@hi94F@AayHEja5&K6AW#8pIM^ndN;PA>2~bs^ z1nO#x(xw=>aI(WGuKZL`RxJm03Dr)8<3jN&P~~QV>b?fV4&H?c;+`@VAW#PjL0v-e zi$FDSvEz#!uLV`_GEi4z)HGe?@~;79^<|*ixxwL04p$`HL3jlMb$AP?3acEh0d)zL zf2YH>PA-)EF2{u$*@K`ueAvkwqsl*mT=;0UE4a=H*1HNqjqnMFPdnV`a1*FYs19Ft zyfMoEUU%|;LMd4NrYj&+L)$=g{2?eyeCqOr()csSg(~+YsD{3F{5w$PzIXg5P?u2c z|L(ZM>c0q7@efzvKcUL~>B^NL&nq2_EdsESh@mN=XW>iSQpdZn&h zV^q79$hA6VgPOXtK;!>PsN&h6E}?M_$Mt{V)+LnuT!(W()jJ=Qugr6NKB!Bm@(Udo zs{BO`7X|dM0*hS%p?EDQ4KH&AFL(Ju$**vz|4F49Tng&3*J>wU1FD_1pnTy$Cx67r z9|NWE<9hI-2A@KphMsl>>Oh(51yH7Y*~zy!d<|3sZ-Mga_d&Juk<0%CRG9xARJ(sT z{L`TvO>$rV+e{^54x2b^>M#y!B+VTLPM+bgg_E~(*xJc=cD#+_Z5{67a94-b?MR@M z*BR6Z_I9`*s0V?4Kw02$P^)4ns7t8w!yO(As@y2YPXtwe0;nk{1@+Wv4yc=@3qb}} z?ae2l&Hpkh@RoqOlfDVmB~-(=fgQoeK{fCqD23huHB}#g`l#z?P&;ctqpG(PC=0g+ zRd08Y|GaMeYA63cf&_KEqd{pn%Hdd0noo53(?B(F4yd_54^&5&fvR^ssPeaf>hM-j zS7Vf=*E+c{elmjloZvs9M)I&L*BB*V@8m*tya8+;wc3~6U3zYUYNlRv#Tuhr>m?Nj zUk5dw&p|c&jVmuyv)_U;^v|H${Wqxkzk`~H7BYfEm2cV7i$32sX1~q(KkU7Acos+7 z_n#{y7YQCTA;H}x1PBn^-QC@tVxzQ5!52Ycj`bM`yu%+Act%Isdd8=pvt39Qqzj9)iYt`mldn@*{$XKvf-}U2G!qBzAQds$yw*Fv>tU5aeXGl=S=-uqS+ziCto*xLT~-C{XZ8MAwZtGB zKPcQre2vuthS-RhRvF4qH64!Cg2q_?u~=m|0UM0nYvT{v_(NDtvdTZo&dVyl@M8qj zp-y3y(HU!hvksTAD!>(MuVR(aHLNCC73dGFHn2xnZHVu%TEHi)(mNzttMs1C6Cdv3 zBp@L+R*t^z2#@$!Wt;@7Nmd0+Zs%o{E(KOwNNPKu2CE8X#L7R5wb`*MP;RXJLtHxR zzc2wUxCmAWOJKF&a#$s(gjGgWtzH|e1=q29eQO(Gl}{5p-`v_(Smo2s&Udu7i>&%z zcLFL=Kddt7Z|A?kYLZp_NGzMP$7HMuFvZ5pYJRGnm(>DiTHRP(R{77i^Rlj;(0l?) zu-Hb(%5jOEk7?Bs%d9RdzZF;&V5QY%)q?A-zQO9U+L`}o=dteXFNQ$$-#PqkUJKeu zLKR>SRtwx~Gm=#We#UAQ9=7^_ws!lMV;U0P!7AgsHiQ4lYJm^&lj~dSFRS$L?EHVU z;Woj0o8Z4=)fZxE?_(`nm`6h9)k1z&msLR$TRo}O|Ivm^P{QQa;a^!bc>wWh+SFKO zoW}ags_Z$j$|pBgQN{SDf|jv*Ijq)w4Le^8%M|Wm11_tKYr7*{R+n`;+WG&DRlc2U zKC-GvcdYC8COrx0zQ`!+@c*e*|NDQjK-GA(tx!y>lQ)B|7MO>1^?wC4$tvM|J1^_n zFJQH9mteI{S7FsB)?$^>Cafk|>09l5Osn*fR+rUswk2TsTEI@5aF4Y=S%>{tO);&` z+|S$i3s_}*$@O0tl2rnoTx*h*zkWcbNmlVenqiVv z{NJ8@AguT_ph;HoX+isq@SOb9B%2gUf~JzL|8A=UrR=<{)^SYlcbo%kvIjo_C-d{Hy02)J3GL%WMaA z^)Jsm&B=N-O0@1W-%v`f%)4w_^&!2R;PgZpYp8`?t`{=Pi#@a1`jFV8#tcbn<#~rM&pUj1-r>vh4*#pi74&pl0xh<5%Xt0dcIvQ9ge>O@%1Pc^y(oA~Er`G?1?ckug7n;%u`(#DxE!|n#B@;6I6 ztbYE(Rl-WAUGTW^uOaseEj<@&-8YGXhE7e^c&!=w_4%{I!`BtrMbHe->Swpjx3f1v;z_$aMYk z<9O?CP4vs#E7OOr0sAU#djI0o@SsM|%q|r#&D;lnhDW}7Fre1uY}Xca2{G4_Un`#b z>bg1)!}d4y_pY~M&M%o>?foXn<)Tr!LYtioc|RcTPSftlcTMV4IP9}%S^pTts}!?% zQ9vpKRjSazfp1em~Iy+-qKxN6FnKVEqAgvqra&XH%`TO-^L$%q3foG zl`9qUNS&np*2T+C`PRzilX~2Ug1n@!u&7T#h~U8Hz}x7C?Gzu`}*b`O7%d-&bgc^a(@4@^IGSmK-S zVkc=8=Vkk~rLQK$Y?lCO} z9M6)dU7O`04}RRxvTE_JqYjog$5p&5{mMOx%3m#g!E9Ylhp!$tJ@LTNK7PZx+`aN+ z_aYg6caFJoq zuW2@+NP;BZ?R;;S>)kO^!B{8rCOVw7*t&ED*9@Dw_|kzAUwQAi8ZdFhiW4P$(swuC zW^qoRay{9l@28Ks|5Z@Zr)J0{ikEHCwy8c7;}v`V?J>`_xdMOK+T~=Xg1#B!6y5yb zRmHj9btlgW%@Nt9`Koh2e%$}cw_25t z(=Dy@V3To2&gQ-58|QLJ<3)ASzAv;Sw7@-&$8E>#D>g1sK+ggG-#L75<`|XbkEPpt zq&=I?r^xgZyT%n8Wv-}r^`iD2nfTlHzy5k-Qk`d4hh#pVZ_4SQke08a`juF?Xk3!8 zOH*49FE?*infIA1eVpIenl0SdQlHmE^&b5nXU$bROjSc-zlsoyyy4#t9=8xGCkYRD#%O|$9Tl=O<(S$9^ z6~Fy7*UIPXrY*{P%1pQt%ina1?^VUoz-*82)xcEzJytvul)$U1qmc_J%(83J7fZ%f-;fjP-Cfh}XZ4xG2L}+6! zNa%P2A?y-DJ2U1Ig8xl~hY~uN(8~x>66Rk<=w$9n7;p=r+7*N@X7&|?thW(9Na&`| zvNka15yCyk=3l=gMV-ZWcfT~*M|N!CIezoAP4!kL|0%)KQt#e;$a5;aXVs&n({!0w z;jdM*j{aCD&awMxg8w>Osc_hwA5u?=_cTUR>nC8*lh>`bK6ff**s!_D@iHcz-`oLp zy0&RC_t>PI^;4$yO5bAM!Y&`~mJ3NbKA?3}vgM|9^UFt_KMw94oTlY(Rg$Odx4lf` zv1Z60^n`g!*L7IsRibMLLQuHP?vE9P3> zxthuKC&k;f{9^Le#q!PeTbt?KhI)0sns9OXs|lmGU%K|~(oI2+ODr(AF1{SyIwJk@ z2KP>9n!EUNNaBp^7v(ED>p$s<=EgoV9oNS{?+!quC?*w zfng0+4f}8*fjcOeJY2NK~)oy0ERpMCD_{ZNlPrp2T?C1G6=iay%d1J0Uj1 zlXHK{xZAJhEVJPJ-WhemI<)RMsp7K=BLYUW>f~&a>2Q;@{o-vaGOJk08<(DrXt_Ca z>(VCdZmbk$-k-6mItH4>zq7HtzRT9*eU+_eu&H$wVZ}X!trCV9$2Ek8_YvA%LkKq; zCHOo*NOm1zsA+W_VVi^l5{4VU8wedABJ{g~Fw*Rk;Qt6A(@lg?rq@k`C<$jJj4|nM zAq;qoF!C0{ICDxu)+Y!dw-F|op|=svOSmmzlF9c6!sw?6GyXuBVy;Ul{0yPop9s_3 zdxAU9*onDnJHsu^dXC5UcknRg=^c_(e1TB!F2ZcH_%6b03EuY*=9*gf5LUcI*eYSZ zaok5}_!mOE`v?ooMhQNz5RyGWSZrE7K-ebXfP^K+?;%3R*9iR{B7AT5N$`Jzkm(V^ za?|S(LX?EF5>}dYj}ZpEMHu-QVYN9WA?rJYkS7S7aXvvfFX6U?^(Nm_gwgL2W;{jM zXs$~r`~jidGlb1%$}@yJ5?)H!YDzsvnDr6i`{xLe=Bb2=pAhQ3K-g{;zd(2`!TTk` z4pZx8tOheyc+ni1-(?(s;n2{5(C#mUJ!Yc>A5Vm2uMqZ`R<97YNjM;3zwvvG&@mQ5 zzt;!{%svVJUI>}qARIEi-XKItI4j|>N%t0EfH%U(w+KhgDG6Df2qEtfj+>$H5Y9`u zE#aie_a0$%Y=jx_5l)%w5(@hul>2~i+D!R?a7V&R31>~Ij|j7T5x)P3@SAxmp<*0_ zdY=$3n8lwEUL(x#<}i6_MlFt#E8;S{mDwxC;b6XDJp9`^5U!ey5`5w#B=bbLZd!RF zY?E+6!cF5B3!!5IgnqFQZkv4){1YN%@7Hd=X|P zMflzq;gxwRp<*(GdT|imn8k4rUQ6(fi}23Wii@x!Il@*6AB-a&Lcs9Ku8sUkj``pK-ebXxP%NQ zASFV_j0i(gB4jd$CHQAT$Q6i?#S9EYh>~zcLN=2v2w^~Ggb6_iIm`tKS+gL7r9#MM z#-u_xFX5qtJSH?X!sx6B^HU?_Gj}Bv&W2De4MMP)od)5KgbxxzOr^94v$7+sO^Z;- z)Jlg?F$eW;nvN65P_t6P>l}E*Pmf1Y(68ayn}p*M+L(a62px+c49Sbo&K#EDUlbu%K7 z30EX^GTHJY@QHHTBR@hHb3sDZFodvRgl=X`Fv58W4<+<4p#=~|7e|<10HK$;E1_@+ zglZuOea!3-ggX*GNa$xO6-1a-5@BsYg#PA@go>pQniWDAXjT?Ncr77*VT8e^QDKA? zr4e>X7-D=w5gL|3=oX3)ZnjJCDT|P*2*Oa)sR+V03CAT2HvvTvI+jBiQWRmNIV{1y zJVLHw2&2rvVhB+Zu1FYTvV|cGsDLmb3}KwPAR%i-gs|cW6U><62I4)s{2`G=y zu_nTh@(ACX!xH>!A>^unu-pu+fDk3&iiDLWTSbHcwGk#%L|APuNXS|TA*>R@S~I2+ z!g&b~C9F50l@UhQMVMb1VWYV#p>REfYE=+6o7q(m?nw9`VXLWB6=7C=gtb)>BF!5K z6&oNltA?=MtgMFcT0;El2s=!p>If?uBJ7f|%lOtnXxIp$TMdLgX1fHR#t5luBJ4Ar zY9efta9qNE6QBcl$0i6vY9Smjhb8zoMaWef;gA_v8zD-<6$yt;wmJv{njuW6gK*Sb zkdU=GLRejd<7P}miJ8fiS-w!YOlCLgAJO)#@XhHnZy^+>!7>!dX+P z0m7_S2x}W4{AS)rsMs2zSwn;iW@ST!*An74LbzlaH9}a?24R$9G2kU0U=j2gg?!|W(ZLdu1L6R zvNcB-&=FxmbAJxA&^=>2R9PShKAsSsicB!8?}Ir0jswu@}ma4k+GE zb3}@NZ526M=AE z!b1r)Oz2RA(c=*24@IbD?n)>;9--PWggR#SFsfA7Je8?uDh-bHbZ5)m)H$juMf%CVH7z-cNWXa2%6wqF0@%?Y&Iesb06dqjpzO3Pd4B$ZI=yfeMZdY4LXr5s4!U#H^@w`O0I zS1@ytw`O|vba?BNZwVsvP4imrm^sHQt>YJyZjRSD&y4xZx;b74JtIR*?ulM0&E&aW z1-$zgvc*$w=Ji~!uAH*;isc>1Y@FWh`t<1fRXdNMB9Rm4dFA%xL+fVu0 zZ=H=F+3TfOpIBOSu@zL;t&vZ-L)y+MUOvgo_i(*%kLpMa_4cc%Rb3U=XU6=fv&=LZPmR)zfRrTjWBD^d1dj8QHNx& z^E>oLw1_rcJLT?7Jyh2LhJ5>wRjNFB9D1doyM{Ki&V71x55cRknQ-3glDE6^trmK{ zbNIF&(6d$VKJ9vUkL-2HtA=O%PLytU_h@~!3f=u|@;REqwW?Gs*M{0Nj<=8ZQm3a!BDrO7L{f(HXQJzKU9*9n`k%vF zS?6>8)4XSzzXdyGaQXA^oGX33Byk-*o9kIHw%P7xVku`>_{UG~N!mo7EahUTi!T-h?SuOsldYzUrvzP-K6<6RG_O|~YMN>_l|WDQGKG6gv!a~zo;yv`(W0I7 zE=x`N2$mKgpNw=4O$%&V`DC)%LNpatFL2FnwZ+zt_3V+uYTvmuekP%pYMzxhlfJB_ zQp@L@)s|XKzi{}?YSB-g>fPQ)ZB?Sbx}{gJ=dm@>7r0bty@D{m5#PWwQgfRmUD^hQ@r57D$razkM>^*MbSl1k5%z-pm{FUNJi7S$u66^kJLZXFX@tti?xtNEd+Wr~4b)UGLs z^$R0>#cD~dRvc}p)sk7Q1X>-tN|HNS|0;D!FluOV z{$N@e!g0t%o1{LPrUI6QxXPGGA4*fO9Qax-oAoQN{--bbYRZAA=C1(ntd_?nu80;z zskM#kOKXa*1P9Qxjpw&oWx_w9X&WzKwJL=5NfvG51#Ny+3G4GNuKr)hiq#O;A!;gY zwd#cXS}oLSHPHOfw2c?BnqEJ8hCNDpY*927uog7dUWO^m`qd`f+-iIx&i%!&I*5;G z8g08JtYclmMRCl8Eon2XM>sLz%-GUat4~;cKw4R>b~Ftjkgz6w9!{;!*`7ygtJSw! zBh`P9x;K-)AE#0`hVfQwWF4EJ>FAh6@m6a}c)0azVzp*yBdwplGpGETLm#`Z(7{() z3)ly)_HStuw`4wzM5b0~O4ADdu+87r`n5*;(`xOk)&@;4)bfEm%`$t92y2+iG3VRFh6H#cJKGUuU$LR_kuHE@+di zrVs0>3|&?K$yV%X#cqnQn!daz$L>%EEjPBe)p`(~W1GJZnhMhsircjPtY0s*l2-c) zO-Xt~X_vo)*xlGVPI#_~M|!W=7(vW|n$=2=bO8B{9_hPhT7W3{i*&RcCPnp$B9oIukq zd%X4ghVWJEH^FLJcK9(XPPB<55L2*E*FJl))rJyIjHZ3|RI3dm{DxhtcG=M%JRDB= zC7O2GGwnh~5Dp@(cGUoHXUuG)%49s z6=nvEx7r%3%|x4srrqvZs~N)mtlv7T%|g?8f~N5GR-Da@PN6hyu-Y8Lm#ntYYID(k zM$_JJlhx)C)_I?%%~qRFIK9=jSZx7XW~*&=YvCRX5r2jj@Pl<+L^vI^gh;C`CY&8K zZA0_Ieg|13FzvK{O9)R@6EW$7nQH2#Fbz#RuszoAd%`oc{Yl(w#bt!`zIsjj(CCjI z%Y`lV&uGeU1(dgb2W{Gw^0QmhA*-!ITWGZ?tF16q2l6V^u%H66Fw2Eq%_)SpgRZ6jfw_h~w5weU^M9JU$$V#Up9 zAJo1~r>wSx@FuJMYPGFsKgx;ewAFqftX=LRIAgU)!rCcmI%~CUgxR5~ZVa^$)zsUe z8+->BtfLmtly$cZd(mn;2sgLdC9Ca3YiYI1R@;T9A(&R-6|3zgoSq$$rr)E_|MoC5 z*|x$}>$n%Ku5GSsR@;Xb0jkk;G!^hV!fF{+@(-&WD920= zTbe%+RfdD0uW4(#Yqdj!b*7`~zD-T70~!fy7UHlXHFQpFn$>oeNtKacCddrg zK!a9|Q8gybWp>qeR)}AcU@0gK<&0k)XP!=V2-byq&;S}jBWMhdSS^p?FL(_fz(H@l zg}n|p;19S8x8WvSgNtwlF2H5D1izcbb(}fEwR=bfsUZm@g=CN%mXh`Nund;Ne9$KX zH9ma;`cC0Z(Ae}9eeNJV;24~Rb8sBaz#)i&lb~-y9EP9ah(0LsD}i6&0GxuOumiTk zKo+R+Y#zu9`5-?8LjeeZf=~#GfX1{v==1t2ipH`UyK1bep=lFn0d1feXc*cuUJKr6 zM4%BgfND?!Dnb>g1R9%GfO4SmC*w`m@KVD`4Igj7O}GdeI$noc!1qi&_|Z}=XOeJz zMQlI(39uhhlzh#lK(s^=^o-k3Gj1e$`rR+j?&AplasU3&2YcnFW+F+72%@El&i zOLz@$;4QoZePnPdOa#6}=#haHHxm0TXrx;SDr-BgLZBK{hZ>L^$5;>_yg4*`%80wERXB`x}LE#KMoI0e7LVK@lKAqtLyzQ=nEj=;&B z{5u3Ez?V$ofIjbB18PDYs0;O=zM0>E?Xxw(HqaK@!(UYPCA+92@q|X59Asu+pXx`w2*x(Dg0uvt+K~jyZQxMQ7H~>;Y5TpW)f;H$J z3>xT80$qoi07GFIXka@6#z9~3hm;TqLGTl&0{h`-H~=2*AA<(@djgI?5YiI*)p*^&KmhgNt!=b!L9`~tV(2%L*who&WP6g2QW2^ZlH z_!Ta}8TbvZ!DY}`^g7&vvv3-&z;V!r|Js?SE!ijUW%ei72a8!d-$7lXlYu_VsIMdH zQ`cAEB5U|O=!?K-;T-%1NANoe$6zc>fbpPV>2MeUV_+ZMRbyz4yEM*XxD@XC3TRRG zxuu{CtfY_5gYRG>OoeGMi0;xIxRB@x30g2A@B{H!T&6rgVUgI zZg+qjgtI_a$Oh>kJ#=Rod&z$f=sWD|ApUy(>78vFCx2snn>q7@k0Yqz@C29)eV{LB z==&A)gkI1Mx8#(BoI-$vi7$0l(Ph_h!!Q;YH|2MWGnHrm^0F#^Zm2ZZPPE!fnvYJvAi12pWd# z&P8qVtOK<`cR_S(b$U9cB)-^ajgU`U?QBLjg zb7z|Hdj#*p12_x6!FhPW%J>Uj!E5M())jWaESL>*U@pvq`Oq8mOiEwSvmal99)SjYkR8MeSy_yHoJC-i{Mu%FF9BQ1?vvuTrn^pF`cKz7Ii zX(0##Kwsj11#jRjyo2{JNtXo1)4C&IDC}jAI0ZWuro-24l!@5GtU=dz+2+7pm<0=9 zDd=;m?eNV+H>-*5fu_p}4GFKK!I#4v3b7hn9=#fDWN)?wBDK5S23uh}YzAFdSOmJ3 z@ICmDAPV~y5))1WPY5T%4!{nEuVDy;Qe)MfsAI^8lD4Pzi8oPR@M7z~FIa0SQT;VNW?&FoILz*f+upLXg{ z*jX?T20@#1AU7PQFvsBpM8PqLhyI4mT$h?Y!b8ZR?LQ|0U29qj zZJ;f*hfXjVCc?Kc8vGy`WPqbI>oGVET|k$Kboofvu5_(RS8a6ZzXx=OKA>xoLqHea z2E*4{|MLmV16}sd1$iM9ia;^Q2PGf`ibG*o40^rYFj{9g{KTfX3(XMj1@oA1k8K7m zpcOQNHMGKyY>tazFrE02w$~QSw1h-(otl)z7KgNu3J&9Q6na2U=mmYj0iF;Gyuk^v z!3TUH4y1$hkQOpP8d$~FvKrPv_z6mV7Jh>Ylu#GO^u3ZD&>E&w%NZ~eX2B%*j*hhy zzK10+8>YixxJ4fMu;uA=wWzHwsx^SB&ylMZE1d2fz6bCQxhS=Z(zTkim z)_FlF451JP^*3HHN$T4*^faGQlyp%tn^2P)7A z8iTI(RfpaX3US~o@*4r8K(`87KyzpcbwO7H%R*Hs4^^N7R8rk56L?BtpTi4y13y!c zYAm=3nKy;$_L%;0Mk1_6$$3u7t zpWp;(x9MA-`hkOfyO0x_vw+HQl}z>1fM3b@KAAp)zu*N*@Bv?l1MwjNB!onu``XE9 zsUY}~JYK+QI0I+l9MpzK6im0LW6`2MkO2H3F@)=WbTUW|lWEp(K(~)a!YCLEeaJwc zJbA$aZ^JBVJAu|33r(Ogw1Ae-6q-RRXbyFu0n~vo2mpP8eKnn!+m+$24@3`RM)xF# zg1&4$0mi~a7!6}Uw+U~;VbCYo@3VSz_fL2G-VlBUx}z7w{AFr8ny_xtsjv%SIV^#d zumYCB0$wDyrL9fwT0Q#)B zlXS7PWxiwPJ?PHTOL)L4)oTAo8&g|K{6=cK0e)Z&M#3?;1*c#gRHg!LC|Dz?49}@Z zZEP)wWF_cs)Ldo?;a`A_Vl`@-}} z5LRz}SkHWK=t;N+P1z5t(^w5{HN+iGSVLQ_G37G}I}{=y90tN5&}o%c#}LBbz}GMs zm~X6qe-q@SX)M|VP-eqm1Z-ge!?ELG9LPtf!=pf_#v@@2OoS;g*_@i_Oc6enpgU9d ze+_h0*1YsKitoB;ulXS6b*VQc1b{C8rhw$oj3!KqO#+F*4-!E_NC5Fcr}l9{Co(!? z(`_)PPVKav>C{c<{Vzb5%O=2BD8T$*a2>8ebU!^tct0G5C^!fQ;AaZ_6Lt^mhF!1| zW`R+dcntwG6qw0;vsmVjNzTOKx+J|BG{o2d>tQxTH^4f=t6(*(fMxJKEQLkz9V~{0 zFduZSBl^0>0>biH0?R>ptOcb}o-4gLH;c}E4Z=qF5w!E!0?~y~Z`#g$q>YQ#HLuga zAF$iZzR6s#QPO>|7v#n^=ejPhHj}%wLs&m-bT&tsKVst)J_$d=aX0}=r+HajW>Imj z68;T-hjVZRE^EAYk-%BF0B7Jl{0hH7bf(JSl$}>tx~wu(TBTF`Y4}fRwD8Y9E!>Ht zGmM#e%#1%LaQk2SyG%Y8C^{ddb)_+3Q=NeU(Q^L6aeIM?@UAO~( z!XI!OZov&uAHNyHDlELoPejkh^!s;u4By6o%OqNSO{TBlTUK5!%Br6~D^3|lm%UgF zEoQh0y6(kjt9@sBO>?I3eoL~J=K6GJ3e$6jlg*!P_>obvz($ci_S#j#-@KOynmSdqwCm_G_HD*F1m~{)9YT8 z7O4AD%EwjS42fedQdOdiZ)Z4jCy%*!CDYKAvKF7|EX}i$LuWcGB#W85yDHJS&NR*- zywu>PfN`eP8xZOnXXgCT6>+x)Yr+;tg;Pb|*}_LRu3C|FN`KBcoBw0WQJU1IVaQk_uV#VJt^ib#&&Svw*EEGad6=u)4yN2GT-m<2T!xB~;P6 z_@ishk`*2E$fK;4ZF+QN8J%5P(`&XfNw@6CnII!XFD*K`l4e8C3RysxvE`$A`D;EW zZ~iOq{M`>AFKc^Hhs0NH7F+8R7_0U*jsbKs+$ zWewJQqG|A+8GjArby*`WX>{cx`YMJW^Gon6ik6UY5z}jqGca7yiju6_DGL#;yIgHt z39K%N6tVMFuqB}~#3JkI6z>eS67v<9rW1rt*v_DgbhrH$;mdFWlve4E!*lEu8`@TTyJZS(E_@Er+ah#(3CDZ97s zlMjTuGM2a%aSIFu6-XIw#%_X*pad#}ZV+x@emxjarn+&sj__KDUch|9DwqnZg0F!H zSPi3K74+5mpG#mW=q_Ylm_v9atbk?kJuHQ9VF`Q(i(wHggat4U#=~&Xm6n*5&?;7; z)KV(IFi_>jVS~d7j36);#=vM$vyTKhsRmlG!m7PWu5fgQs-5PQd9+o=YQg9QtAbkS z1gl5)1LYU4=8SH_i8v?|HLEh52{T|iOam=kEu}u8LQewKHoCt|Av_tBhw_vaT0P1y zx+2nSfy4hUGJ3tMgtI`kQLh z>R{0sDWMjq%oL}>2`wPH^wIOPO{qov9zl(yHKlH&Wy)189Nj&nspBizzY1?9PK(!~ zRp015w9zPyY|P@xClXXlx@&olea!5IJ)r&9PHaoq4%%-;@BDT%zYAPDKdkm&^4$SH znt;We$3_u63Wwom(7fCaVh_L}J0GnbvGd1b=%)xPTP^+6rzL3FI&u;<_` z$ma~4)&TKW0vABHUM^uT+OXzt621Xm9F?wMuS03{YuKysJA4G`f5CmwucV%1pTRoP z>3Xdvyl4IuDBWxL1n;y*dQ3o>KLjoGE%pHk-^ju}xC?hc3;q-SfZHH{Wu`ooxeB0K zM;GWN^U;NQN>~ej0)Ja(I5S$vBX|LFj?Pd8iY~EQA-bk&75Pb1rmERxh;AjNQw0iA zxDSMN@X%#150IwclIizjx{B?mlbJYHaGjZ$YD>6oFoPrEbkM!S+E5GjGf!5oQILLj zrr)1wl%#M;C;?A#(7i_e)ImRa$N=f!3A&c83*@@QrW>o#SI{R=1g#}qMAvWGxEbHZ z^@N}zbSGX{*7<>(t4~Ec>ax2ozsqN`_0y`?P+5IX7YLg`S~T5-*Cp39gmn&B1XA+~ zkfodzU+d!xG7(FiUg7D9eM0Jo@CUqr=b&G2gn}NBD+C201PVYfLIWuH}j8Gi(n=^j+5blwhbygFhA?vIG)F7-IM-`zmRD$XX6Q^5ir9f%Q zVuR7jU`sqz5B9LI-FM?Vt^`hE~uL znt^&^Q)mp0Km`y@VuYL9aElmPv|n2^6*2)xi)XEgSmw+dC+k6?nc`G2KQ41-rgc5c z)n(4%t-d3al#RQ5hfizTS8dugt#dp|a+E{ZgxK+(0ap*NOck8g`2z~qULvkzxlkUF zBz|*8i9Mry(>l+gaA`f_H8vi0=FK{_kF@`^E3NaMS-IR<)YHph{#fqJAC#C<@k6tS zg_$C9<`~(owT~ktccI+c-2^#IffdgDf%@5(vYM5-N%mwD`$u{@nit5OH#Zm0gU!$t z&JH0@ao~!0#K8@dCtv#Zkq-{}aNySVCt?y2(>ng)raQ}&+x9tTuJKFb6JQFibf)yo z5X;nF>8$Fg6S;7uGnvCN+H76r?7_>i_H1+pnBuFQ^E}yzF0Xd_2dZ1EqLXG<==dyf zRUS{rH~Di1tGIbh!Zpr-Ky5>+&JXn(rFb5ea2F1FbBC%dWzFIZ&ZN$Ka;{;T$ysYs zjT4mN`H7|Z>UX4gd2<((a|bg82S;DCT7EOo}OknpU?hbX} z=)JAqw5ZyP{A^8%n@RGUZcZJ>d}sD=a?W*ZGA%ZKSg9pc@{Q5`h z6@9jhvPp4xY-7F)K39F=_iqZ>RZ7eUGlZlzH?w*R7qu#xpQ?zG?Y!Y1w>DP~vh{oy zNw@B4b|D3RO&axv8NXeh+rQ1}q_&Fm>+$AkBzey?jkYNu5t9mBMXqs=Q?Q&;w_lOtu($wF(=bJdL!nju8ATwndamZ^VdD@Ty=mL)s=QEV2&$`G&zmuP7Vf3bGjSlc)V(78gG4^ z&C{XXSqO)VEvCj!D)$}-b;VJ!vn{B$WYcn6Iez0*(G1_odUTaNc^YaFH;;Rv7ZMgb z`O`J;<6h(yoVx&d1>`XgcG99*@zAPDe7E+>a$lQC??(9C%CO z4*BiJPiyN`!Of-joOss!v)?82SY>#D16xhRk8|4jSD4;;|7VAURFV!KQEyVoVe2a2 z$nZI4jS1UL-n*%+His#B8c)c)H7qnM8x!rx26fozO*Nlx4S2_HGX?3Qg@SM zFGU(;T4-*#8K}9LX07IynnTPbxoxXe`Sszh-jA2mO~jkm;_q|*=I*coyuff$@tDP^~qif&zgLMsD8Gd!$pIf<_=sE|X<>~G}vE;pG zu8ezg=Y@_ZnG3lJ0bdkNj#UsS4(%aT!_>qxK03PFy(CFB#_(6XK3}Wm4^@ zspAwfh4<4;k4=~T)NhGdxSuT^_0fLLRNMvgX7O1=&EzYwlX(&RXnOptl~lxx{n=SH zutgE~!k2XZs^7qmO;WK4R;|u1x|ydq^0KG62grJ(ITeTPwc!Dd?|sdL1J1c2XR^7w z#e#2llv(j10SDf1w0h}Hh4@XNYE(AihUI-H{4$mpZGY6LwP|*c-1eC%?C-S2uQ|vD zl!@(H=S%fkKKS%@a;v{wg~+R3Zd>Y}*^|mAxi?umN}8mHocTTDlr$9&QU1V^?nC#z zT5Sf`9GCSQlCnd{&4zr#tUtu+3+JGtv!dE#&aF$`u(Eb{IxnOp9-5nnoH=|8mU8b3 z-2NtS6kV;9sS-un#&lnmD~;!k=CvL@(ouwyG?lBe3CDrg<~>dB6A;v{w0k3674O`~ zPi4*)z)!uA`lcvjPDDBVd9~f2QS2)hlyRSeluUMYR*^kELvXZ*rRS!`VQ0BG-sN0R z^F*X6XBHf$Wr`|m+9p4aijbv8>= zxDKxY>?9WdMtKTUbZ=Fs8m{`K(u;++?Rg1JJI{nsp1^-TPDk(S-36xY$Kl7BiHh%7 zVfJ7`x>mB=(!qkY?^S;DfUt2d7QG3$atg%IopS zgkRtYRo|34MviVdRRNC{)!h5BsrP=VbUirdukI5}5_)VlljOPETuJQ{;5cH^W$?+7 z;TrCoeMAgm7o}z!>|gY4r%`p=Cvrr`6f%CtIV<=V=cDQjWL(d*I8GDvs^QL|?7983 zZ|(74Pmv2~_sA6_v+)EA9&OehcXsgfu4$5=V0+(gs+~mLZ$2r~8tZE3{@!J~2{_5t z=n}QB9IE7b&0LAa%*m6SQWiI`nG@737;wBbWi^ZM7=r|@x|Hz)ThtYMH&q)qozoI(F(cAa8DgUr4e z?A_D;%HF+2L-*3wt$04F_MDA}X>sjYXwZ&kXi}QGw<&dje7`YGFi8yVI+zDfZ8K=! z{6%b4W6kxXKIsCN5TV{UG~e02Npno&z#N@Vq)B+1Y8}Tx+rV$bl5g}qozv^H!!1)Q znU7ATS?GJ?caa@Dp`?vm4^Kp_4-dbS*!S_Q&;Gg06f&g#EpRpaPCHZa{>!V9dYQEs zF~dzdb`?qfxmPSOCC(7Pz%)AJEE+hose7l|@y*u}UM03xprO?%g1PE%*5enl2?y2b z(df~aeJb=C=H(zZSj9YOV}_pe%u;8#=aA1a7tIHf7JP(5GLruEI_K;4Q4hcS>=3J& zJErHd;@gG|zQ6EujDIsz^{mbs@kmbEx8q7>_~!KNexE(cn((ufs|gPNI0Oa08FxE4 z;knNaeTZQv9Pzl}l^F>tZ%y$zW`a3R(!iBC1mSRYQ^(1>=iV(&t5Ril1s(^C;~Z^s z!vtbHJ(`;b=NJX1Zf%T`O$Pb z?@Z@DSSK|L&pW*XvvT;-el^G0CB08|+0@jvuX3H!A255)v$3==@zwwTuWSvRW4N}4 z%{|Cvef3{eOcpZC-%Ph8+8G4y)dYSo8Fr&?sYnau> z?*%)fJC`}|?=-QlFjhHWx?FJ%IU?xx4@?AQzUa__$OB`*51Mb)WCKd-(EX4mgzc+dQXA8*#yoXL3AnX<;& zKJLxBPTX#b{v2PZrl;dDiuP)EvD$o=zuTK++{&Jd$W13OEH+kO_rdPsmhV^eFP@3Z zOs<}mKcC0n)icl!zs%(D!=gif92oJC!*t%_fUDX7F{|rHomxxvJ*yb^3Z8li~&^wdwks z--mHX$!EfE5LwFj4d;Ax(+$_znk)Rr4UQ&#&Bi1gAV!!PtTOBMck3}Y$ZL>2mQ^pm z{QjitI$N`2`1pg&gPZJFQgE84g4g_}>(0v?H?P5?5Cvx^+|i`DMH8hU3$2@@K6f)$ zu72bg4)#1QgN^yBLH<;H%kT&>I&`tN@|bQU<+wWP7S(aLfWLWkiwZn6el%O4p25+6 z@KdK1>6+ZSonI#!`AN-9byxES2H~I`-hvI&{c3Dk%e9wihhnDJZOYY)*&_|yWSi40>9KW*@R7bZ)XY(*?>?(iZHZ>Gh1R^Ts56i0Nfo zJ;GQ|8|M}SPYiRPR;M`I@M+2UhcuQf#3>`)&$|ELYOH_J)uOAAdANJy=>8`3b+yj5 z*-Nm)VnqA5GT8O;9~;5$rtNO&pWT0CLI0|6vp_ris%FyNr>R<-qL{$GBitwQfl*@z z=Y5-g7k=7m3-H?l(*uW)g*f=J5^lW+9sO~Z#1a;bH zb}8>OI3yzJ^25~&&G(qO*(Sx|mU*f&yfASeV0N2K4>&}08|iK%-yX#d-m5id2g4s) zNPBfxk&|nr?#?-SJ-b`M@n7_az(ix*rw#d=v|LtnSpSW#GH~ha9~%De^9W2uDjgjj zEF9Ni`iDnTV)Rm1NBhs&{>$$9hZ#&S4SY@RNy)wa%^?jlkDU@qnF{1Cpw4jGtbfGL z{)D;th(oPwq?p{BU2O7kCgL%d0n?9juif>XR-ZkVWOs5>YHe}!$VZH8HC?H7sMEt# z&0R6Bi{6FJ@y9f>`%13b(3Nd9UYK8l1Aa)O3GTv#O?ckzr)|3yx*CYFEVti?(W&vF zSLS`*!2`PyW3M^dPUzaclA5DWxEOxMbbHEi+v};bK*)@V?t|sIq8$sw?)6sr{nswP@`};27U_#SG95ySTbM4~acUkud zl&8-Olk)|q=YBIx`4{eN2g!1kXPtCx)C=bv`L%uNEStgCxR0{`cq=ihGdgCC+4$16 z%^a2auP!!*BqcNTiOF|IwXe3M)%WSO574znk4(hq!p2tvzu&jB`gdz>Okv#^ockAD zv=k1BRnMm5s~*hu$2%NYP1X8|!f$9R)td7VD-UPiiN3aaC* zG_^>|wZbl#z_a+NXJ#6^Ji)p;w~pgiSbK_s9{0>bEh6?T_n5Ro-U-uYRXX#FDvqMjl?lol?Z;E09SJ{k? zX6T)B&y+pKap3p+{w%Z8E=c&T(HQ4(9an z>=5Ys^Z*W1N`Jbyqv*xQIMA%RLKE{Mvu@+fc*ma1eXTig1KH}RRB}b`d~=^J%InHD zM7z8_=EFOddkP1wmI=#N{7@@%s;)SM=GKJ?j|Y58kn+7XRWLz*bKK`E`D&bheByqb z@%X9!h4>l8924=Lu~>+i{hrZEDdYG+vYI9k6WEw!>R4aTYCfvrzG?Mc%V(df{$4|V z?M$Z+q&jR)ec<$ZrAhOVJ16<(nz|pI`9reKb2rMWw%x`ppPqrcK6!H&;*UGi#Hb@K zIaVpEkXgxPz``gx3vTp(x_b|>s*dMx{N5YkTu`J40^W;&C>j+N5bV8ojnNo8Dk_Sg zh`ph)#n{`}yT)E)ZYT&#O_f8wK7L#R>m)ClwgQ|f+kDE|2Pj1$@Nmzk)keHV zP&r3`BgUr)7i1}L%HvF0xDL01NaJ_P?#k-wsB(yb|D2c7SVyfkZl=2E2&!L@tESb_ ziI?bw2LoxiG`k|67 z&P!#5O+QUt|El`UM3e)u^4~66W7fhg&sRz|T(ZAx`gHWQ0fG>LyDZJm3^`S!dRXCs zTRqeXkM>jx4@=Kga>R7srEO5c`POe0`4GSbGBUWz42RJhEqf+3MTJJ@H~t5xWGa&d zNY0Y+t_|0H>h?F@dX!whb7pJup zml>L-a470jG4hR`0F_R+DntPYE>d`soY0~ynnzIRdO7p9cT~9<^^}QJ&l^tF zy6Oos2hm`+6lzuB`p2KBfjdZ1xb&}r1Yc9pEmYSHa#jdZ<5^7`-9VLG`qQaZZ;~NPvz>Ciyl%}3`IG7%oMDq{Z*pa+N>(l7 z0LMLE@Ppyj%>j;?ZE#Dd1;eG11!iS`_@KqzL@utgMcvv}bQyGfsV!G(5v0evjxjY$ zsU`o}X;P4i#?-me`)KKwEY-0}!q@&wnv@!1GGbL%{7Egg7&k}@6ny=y>%06nlI#Jn zsxuo+$da^2%I&AN9WFcOOhg=%?w^aGr@nzUai*;n&1dHzD9`Dy=MZ@Q{%1#VfrS2}<8I1U*V zrv)MG=)!9|7XIbYEx2Aab2EhiK!Gr!l~AxQc@SMjDc#uN~4uJsgJ2JDtl^a zv>)Nh5W@SBAATLXJyDMkz#J`+{BlB!KLCK6jk9C>RrT(_WnZ(B(vQ>t0Jz1oGe3m3 zu%gV(2^CV-I`zjB2>@<;zPS-r>*kCP_12;2V?LL!-d6=Js zZ#*PN@xzxkeK=#vaOss0Zopq@LZDW_`6vL`H5q=Gehbv{#)tb+TAK^DS~gQt&{4XTOAEvOy52#^{yWv; z$3-&c22RylR2DiEq!mq_g!ykoZoo^eu$(Th+8o6GlZoxn(OVL~B zCydQ<^3NlfVmfqqtSoiOgVGMud`^5w+wrh|I4-BwGi&c(F=ka1`va9y`JAAqc{HDh z{3m2(EjxVK`wN_-WrHZIQtEA;^HYw~U&kN?Q8lb7Ur`wlZ0QI9o+moZ>lyc9){v(F zP$NUdksKOWcLFXO;2gAWp`VFtIx7af*_IA@3BCrlZr#saamInFf@#S!bRu z<%RT9DX``7DLG~S{$4A;}VVMa4cIQ+GTM@Kzhu16{0DMAUqNGhU01wO9vr>p5RVo+v zIp6rBzF5MgWjq}jN%^H&n)k$7&8qw;OFRN)ghF<@onP~EdUQdWn>zGG0WCbD^+oBb zIR8hTX1CuJgn44;6YAQ~8!60)YmNP_T`nb~JMV%oJU{=QIv3D77<e>7HK zY~=L~mNce1uD9q&k<=)2gaYLW(BcLb!@O4p_YLhoLeL`Gp(NT`=$0Io{Iof~0y}WXNkBgh3nGe zX0;t(Yz_fp6`5O>g2J^rCM-85gll1z>-QuD0Xf@cukqdFu?XG@Ly#vZ*hTAxq5?B^ zy-vC>%cwlTZ)g6})26C0DoA=3xfInpm>eHc&!U(zWq&BkXg;ZN(t}nl&UwNd1@!M9 z(6U&rhqSk-mOm&A5bWO>i6?99UJt)-FXufo5M)DKY;dNNdj!Zv2wv+5NO~>x!7Dn} zeGw4A0eTam4gNTc0pXSuiIh`xFcM8Q?V>7+8C7dQ_$UM1LBZ@9ny_@DBHgQT4JuVIm zW2saL&=pVuGY4nsVr@8898}Vu> z&x+AcFuCbO@Nr)Rw5ddai_N1T7!y>xe`!?k$I*NHX-#REDZfAIR%tCPVloC}Y&g!h z&ARftBW->XdM6@O_^>(_+AEh_8@hO&iKUq2kC`7I53h z!jFR#Q5GNNHXB^2JsTe*oL@@HpTc;RTIsBuC9 zJ!E`B?!Lys(zv`<*OGC531yk|PIkLf{>fE) z;_@l_G9v1*2E8Z`IgFzU6~Kk)77Ee#6|{z+?J_<^O!*)+FJ^dfwyzqmLIjCux1q%h z?w4iCU#&Lmo!YF&_ehD9i^658Kt;{h&tj0*&X!wp|7}>#xWAMX(5CVjj1*N-^Nz>> z1U&F%B>)@(0DI1p9h2kQ&DmcZm=MOo0C#CXFU>ns zn8Ex74XlJN$RDRVWC!T-g_Hu1C5|{z-9c34l>FvfMb+1E=(`&vwbl9-8#yV z^Z@`7ixj|*x3(?uZ*fnKL`0dpk>ZQ2|1@keZ(7!CC2U!%P@T%aZNDmF1Gqwi0f1VZ z$&X#Mv9eaj@@TrO`~0h$bi23Y!7G4s=ZC)S0r^z{+)FA}MXO`|B9oC%bxu0^^QySq zuQGoDIJ9L1Z5x6!(Yz{fNG_wt0F)knPpVf{^G+Gk&!zaPAkA1_w%?E9Ig3k`7)T4N zYOO4j9dSV~3Q6nmnoNGxv_Ok&{Z0v6kjZg==XJ#_BYt8p>#>8AXTE zZ}^~u!#_OX2@fjiDpNqH5r=k!III!)aa}R(~&W z2~#}d#_<|IPW>Qo2_t=sCUBl>w4ypJ;zwkBqWn|^b6jT!T*kp&kK^ECKh3;(9--`l z)Z*9~XHSa{t*oJ0KS7Wr0d8$D`tfhUChWfxh1Eo-KMg0%@$i54of$0`%{XpCk!+~Y zpj0N&LO$Y0%E>nsi*q0rUU!=v_k3H+mP;2Yx?wIv##F#6qode4D2ahFTAIJf!-XEzLJQ01Vicb3*TEhC>eja^PkneOhO$eNe{EEW&_Z9T7zqDq zLje1L(6s8Lr!=DqzaZ1^G@tXHrgbZ{0=c&%TcLEb=_!S?(y<0GA-_{#L#U(v+3xiw zxi1&UKLxa!Tm#-l%VTZ+fOWiX37)&0*5N@7z=Rs`vJAJD=2|Jy}7>!Q}V zwJY=A@~NXqsj83kAV@DOt@`LGb`>s(G5(jx#?rHfkk?|${55RKHY)cu8p#1q++_}3 zEHk{`{&mx8H&ObI2CK?G4S+}h)Sw?ZoBZk^zLNVzM<2Pkljd`P7`H@Zm-aU2^h?)z zZ}+-yYsq%l7t^neY}kdTMqt+j8uX|E-$Enhil#~LV5d>5p4j3LhV5@_c%}0J#m^V- z2WXW{xJK_d;VoUqd(JRJb{tB?{~ghfl*Aum zsN4d9RCdNFZ3rFy2JIqX8jW3`Wygn7WNd;`X3!o9xsg5q2NDibJx-8)E~w}Jlc{HB z{@dqALa>ubdRRXX+72os(y-Lv!b{DwC~APsj8SNH^ec!*msG)#)t&oa@{P>~6~u}! z8}!dZZykvN5$jCVso!4Qa%rUl7LCKOOW%gTa?M*pguGiB=27X$9UFvHSgPF;oqb6R zgt)VBaCKAWvss^4=f!7qrudVdNUJ>n&py!iaOaa+I4se6tMeFzuQRRj&{OgS%OR}) zY}2)(9zWgnH2UKU4}W?_#m2OWPc&S9+hA`@XWvtv=tbMM!q}=Jt!o9NP)ot3#a)YT zx6%SF;{d=Tiv)+xckY!R|I*g3r&C~St$@Qu0F{z?r$dcoD z_e5TBMpO#oLyEfPqeZRZtrdW!FmBuvh4J+{9DR@rMZBA~;lwZVN4*o9T}4L>`0`Ph zYf3j)0XZzEE8lD0 zRH?024B-&{kYZ_2P>%4*7jD$$n#&}1hpLHN3tGbfodCcythECM|5D`EsXitg0fC*k z(2CX6k4yTvKweW0Z3lr1fZ}S?L{y8u5rETW0R0ll&ciWpM_}-@|p@`GclgfuM+K1NtLKe zdoW$Hhs4-?>*($$eKZf`0LFei`V+HE&j3MZ z=uGK%`Dd{6v2tz|Fjteic|#5NsX|AHzaur{$4lzb5gyT(K$;DuR+-Rld!O#bcx9J| zl&}T8pG%f{-&;7@|NV<_q^OE+M3;fV(z>YB{}LNZwaDc%>J|Xh0tmLE#Gp=JM99WD z+GpC&jn3yhYy*H!w~j%NA@`qo@p%Pr0qg}rhF4AQHzGW?D}a?F`vk3u0l~_5=^jZp zVo(pEkyNA;#8x^|s(I``EgWJ7_hAO$7-c_GJsQvnWL5)!I}mp(*>Fb5oGW>@s>mEi z>i}SELI)YH1K@a||7hW&BD3qfU1%eq27Ty+s_seQoyE+4aAye4?@uY`-`AAg*6!=l z0qpL_Y#nNz*0a*6xKa2vd(wSmHRUQnIb)$hpHcAKSQw65rKD(n7~S&Fn_=%ZfwC}E zJak72!G|5XPhv6FFIQStN%gSeZ^oZ|@uh$iI@EvyyNJp!g@rHvnLvp`J1>VhBCsA|wW5>bIekCk`q+8is*o zeDJYDlM2DRBY~Ei7dTPpsfgV!XJ|~E*1?kYNDQbZ$i#VPh z=&hv>k;7zH;#GfI?9GFlu}?+Go!EFS_i{z#eJty9!Na}<5}UtZ|1&oPOgfJMnhk0H ztbUH$dL2E_H7#96ALVDKW%aIFZOhe4vO(?ZFm~D9zr4bEvzut=IN5(qSIsxlv9heq zHd(x@HT5WR!3JPK3R_N>O%1DeDOkX4O9`t?@4KRYYXX9&XJwXeX?tW}^^!J-HWb?#E^F3Y72Dh080U+Wu063uI-T6B%#xYl?+W?MMm)y>)_IvVx zflp2Lq|!wfiZC8k~avU{-?WflWkf65zBrM8^|gKyCtq8yA&(UIo+0 z9%F5FlDa539~*Xu$6I|(*|gI!tJ%W|njOxi_M~U0QH(he<1n00Q~pc}rC1eXdZ;Us zuux{afZvU0YHnY6DtaPL)sZ#Rwt1#8?Y7+FPET~UMGOy-!qPbCTio*UT%p_|056=Q z1S7}=VU`wq0Kr2ToH&NAA`a8!P>-7T&?-B5;5clqv!=AH2dvEsy4*vnQbym4oOa-% zrx@nRQJBl7lBZhw*DZqrgtINeAZ8OBzJj@g_ZJaxPl?$?gh9+E*cXGj1Sg2ugs&;P z554UPEepe(f_-f({ThZk?K~hmGmP3I(3xQ_;cJpJiR{R!<`NOovFD3ckC}uw;>+~8 zM1-76a4Bjw5dmifW)r?x!^K>J6U1zSe_%e*8wvk+#CK-T1Y@3Fi08kHsZ2f6&1k6q zpT4I*704*p=Rw;+Wr$47k+^!qEQupDK68!~^oco=nmzsBQPt^(@=~UxG*hwBn|@PIZ4YzxzR0XU*;UEOAVZE zGUmlGfn|}>jVcV$e2bKii|^T^aHsCIe1}axv!+>Do>_=33I=<#;b|;eCbSr}4nnSC zu*8O=z{Dmts=>usH!ch;C(KhM$C2kj*T;R0Pcze=OYi^eWTKg4*+?GLoT+J1SW2-O z)N2qrZ^Kn!;W5_LDSJv(zrW~_u#e&dgzoXNG3`P+b)Pn;__>BPyz2}6=q*AGPmzbm z0?q5MuMrheQ#bAyVoXKJY*SZ9Q`UE5P6P^zCKkx5w2;=;+i4Yz8~k@3q{Ly85Q@ob zLnJXH7ZBs5$uBvnEVG&YzMngMbP9nxYfpF*h}A zFV?eIEBC5%1Rjy{040dw=IbLx8l0XHVN0>kBk%$ju-OSyq#*V_%;4Ti@|eHX+#<^g zI$BM}LHgQJ#+fosNsI13WBUUna0T2Ox#moxHcmlzm?KdGp&yXMioBqWcd=3}!$iD4 z%b5bs;ml5Y$ zNpX~QE@&wsX!&pOQu5cDS3{A#ca&@l>zki?y6Aj^xBoMO1!8}JIAg8^P$>aq-=Kw# zph0DzJvP zZv~fO0m@$RQC)^aST;}8Y29hxwqA0_ho=`9QS&~VD&*iHkSfq`uvW-wy*;2T*V0Bl5x%oul~|MZ%{q6jg)XsNQc_85_8^~AnI zd0Z;bsEm)Mx8H$axr&Ts_QDv)T907il!^Uz>BD`M=O4m=cNZ|QD`HK1YBv-U5d9bx zIRPVuY@%0*}n?VlqzPgTbK*638CcY(WL8e?BJMDG;dkgGn=FP$-h zX-K>n+j%WUmiW5d{<__)Bld|Dv4td~4Z_rQg`<~0uX(~)KYb{NpXWVRJURd1E!;h_ z@1gQr9erb=c*lXCoh>cSUWlJn*$4npQ&5Axx8;=U)}w7Xk^|lyM+(oOfwWhALc3lG zQC%B4XN#zj?Q(mhuwe!t7Zf(jnZ8B7=~J{IVsN1LT<;>T(rZuzeqZP$O;OLE8~pHi z{*IcWNZ}#f2jyd{s~>u5+rwyoaw!f^Q*MH=&a(dhdEReT+qiF5=3)kf!c;{Hcab$* z4HN4Juj_^sDm+}%tSwcRp{@UHc{?Ic1QOI1sf5n-)o`fH&z)&FKT+?yMqsk)8cU`5 zX^o{P!|^N`>b)@N^$9!b~54X!PNMXCgI{m89MESnnA7C(@k4=CkfJY5^I`HXvB3);zvf>PcMFRW^urNa1;z8#~gA(Zo=k>rkEDvbhUajfx za;HX+E$>X^<=JJK>^DdIc;$0L3X2rwZb>BTXi#*2T`T6htjdREGWC>PRnxlU zZ&T9$xXO!Z;ZL-E4CeOs!7Bhz0f7X*B)plq)|VzJ&dYa$f1ih>B)z0t2jfh65k4muk4relDJYy$}H zcNVYhaB{fmPDMp2l&qUdx!3>BnOwAzoh{sg8g&Pm8S4iK!M7d?lZzO(SoQ&m2& z|Dp0`Y3+5v>Gb{Qww*fL`%o&nF|8Ro}soR{DC1+%6Fq!JgRTgQPN!Zurfj zX=|qM27cw0zBGs~O_BJ=P7#(Gr_}kH)MqU7{xt>e=QT-^@_S21xt=-W*wtj5i!a;& zWGVE`R4vs1&0wPeTA7YUh!n8~=$|yi$Tw`K10+%e5Ivo$nRS+}<-U`|R~a49q|n8i z1%zp>~&ZkJm--hfv6(=@ERq^+@*p%`gGaf^|0x|BUr>&%~d>?Nu9!LlQV?-+%|MHJ7R z>FB^kU`#d@90B()Fd&x4eKrioRaa@k&o1-7xwGhs*K#C*24WE5J=p>U%Z4mC9iRKn ziFu}OI$fi}H#V@6G;=NpLfB8-4DgBwmLhXdWI38YLzJ?eA0q508{Gp$P~nl%@TcWb zPf^q(aA*81Ex%K$&jnJy`ljYh5u=DONen)S^vF94E*~Ay|5C|9g8u@mqKfj*);#RF z5G<$REnRl3egtyjhg^c;?Owhz!b$SyAShxB z;o~S;jBxyU2FTWfaRFnr_vVL7Z@%{z;W9Ree+Yj*pJys!gTf8UpC2y$`QF9CGmH)j zH)Q1F50^fEZ#choFMqi7^7|T9yimA|7h(|U<@dpc6T}NKNy5j^A)z8(C|t%1al%M) zT?jFVh#}7T|AJfm@M3VJLWjZ)pY0a^UkM$ui++@0kER<_D0w4H+b6>x(d0N3)AVu* zUE2xZW|U#v<7Wi)sR+JQVT5J%Xuq^(Oi$T4RT_2QVNELeIkY@w>$^@)rSZ$8nHCYF zGKN!+-PA)RWyGNA-c%~M9KZ&m_v`TVA!?2H)X|%t!9_{{A_tzPgiPA7rHV&QkLAw@ zfj!!M>PmfR0ylr5A}VtAla+OH8a>@(lZIYt+;50*Q&oA2{{J#|RcV9@msO(HLupgh z>}RlPrJF)43 zz^e3=*kQX^*#ELj75S;FwyIXexYA5rfAz+^n<*0X8-?bN9k9Ciaxim z23-^MmYiaO{#`(I>MGaE((R$0a8#MrjGLXV4F9EGrZU$5+6sS0WPb)q@P8u0|KAw4 z6gAXqS;_Uk(7VrQMCr9Xf888q&x$5YW7nYcI{%;b5udbG|I0mOYDLmz^glDQvQ91bUUoTX!BkK>BzWd2 z_8I9yOI6$db&c4Wa;4N(`$Yjs4144B;?vWM&(JyL65D-1bI6uu;(7yS4TDGF)Z1@!(P+?ZVe!GQ%m`w!SNuXib)MPMBU#}pcR zA%*?c_YSr#fA){@92KYX4p~684`D<-egP#P)qJX@!Wo=ZOq=W& z$gpzKBgRyBA(cFWg)=4nkc^8W z$4wZW7ExJLfT{l?8h;Guu5~?%a4RJ!>k!DE9grsje=XSSRjK)qJt7dC8k;1DE z1HuaV|D5fMEV(4-EE^TN?0N$GfZvnX2`xM_Z3$m3lO?pmlh>0TmWqn{J*=*i5C<;y z3^#ONMgvcv4wIJAv=b1EyvmB>`RzGzGd=(oUSW7hA5LI_%YJ`KF0MDR_GBORA@4CO zhSeJtB@r1;GD2+l*K>?RU;jB(<&BIqj94y(@wDlr$t4n#dG!?A0oeaMaXHO8snxa~ zRuIF3@6?NaHwH4{Vj~dbqDKYSCO-ruTh0NH<$KKBY^7`I{GAmb?7WOvHr-xMv8NC( z8(dQ^A_V1&SzzfBaY6!yMRK6?Twub^0S-M@@y;Bb{DiX|tR-zg@y8{nx6nqoL#iN^ z>pGGGPiw6Zd_4HH7H)n4I&y#x3fSxDofFlXae1;JE+NYqsI_89e|~~cneme(?Ky+Z z4~ii{Anrjtjh!wpmQ&-iT3FDOmC|W`9Zz1aGPK{d_wo2{m%tWZ#D}gx+|-0Na~3)$ zPIt;q7td;bk$)qH8*;Q?(tq=@9k*v7hiK~I2FF#>zE@uyxB8sFqlOe-eS~_st)fEb zu+*6o5bQ7g{lVW?pO2o;JpeDx!NHh+6|Fr7)hxM+nqP*vs{)dn$@Z~*&cA-L-dmI+ zR>0HJ#aFC|ui>;neYh2xjkh0m1C4^BlXN6?DG3 zR#Kf~9X-7W8uP590DeZSqbs1*T6LYYSgYn&j*J>`Z5l^tAUX9wA14?t{;Ski~~HdiU%Hk{x8ZPcia+{*cGMI4i`i4GyJC7tDH zwLB>b3Abj9VpuP#dkxh(V2iYoORv7T`)te8P@&GEkmM~iY4UlZVT09z>`Oh+y5Je*v+(9r*VJsl6Uju@>x!u1kZMJ{? zg)4wS56cl)ZMM=pKty&0ga;scPM-T`B7}lBIv=Zom0Vnyj!xs*|_U z6UJV9n+y=}n4E3zgNb)s6a)r#t+r9p9h~b6;Evnq>0f-ruffn~8+H9d^K{^d5_wK- z2{iPfz`|VI39l2q`1YOCwsKA)g?l&mr&GtYDR1P}U=An%(i_`o*9}NQm4o9(_;!aI zsAil@o8=}_lD1RuO$PkYSk0WWT^g^(OE!)#;W&l2STQb8B@d%DnRd`6WK`$T zQr278|C;epy%%WRE0nfp2bF({(p0JHlwJL^C3&?xizd+J*@9P&erV--q2i!jvEC#F z;g3$|zuC!~(!N;mh@H;x0%H9WSGmw{OFz3CgkVjJcTQ;gP zK0H|-cx+vStlXgmdG4A$_v~>Fx>wHgHOZ8GABTzUP=o~ys`}-NM**G!0v)Kqa3Yzq zJ^%|hlWE{9JfA01-N$(1#?R*XZgt)xD{ATU-Xoe!58NzrqG1*>`0t_dfQT#x2p*OA z1m6w3GJZyofDp0s4Upo2l#>s7ox7Q%9$P3D2TEx*tfN)3NCM%mi4~+eaJAA=)aYOoANh=>>{-w7> zRNY%(v7Gx^Qop_Tg9hiSzAL9FKzmoZJoy(XTtkUJdoHNtw1CAh1{NL zUTmWr_sVL15VhK&OyUx0ql9X?B892Ve52HZT9YP78z@5N0`}6ON8l%86)CcJDyl>` z8hWv+rqpNHqrs06#VF73rX!Ehbt+!T@hzepQ(Gb(nF6t9%q2|cyeDiRlj+G5R9VIX ztM;30SB7Kt_r9xkQ`dfU5z_pkLlQRL$0QBBZbS96zhy%$&J7jzkXuXFu358RDINY^ z$s7V+k1|-L_E+A0bo02fh)YGK3o%N@tr^$>5TRI&blWFuqTfHyL-w>eRvN zdadd$RaLBAg{rUCj3ucz1iitlI#L-^s!BURNiV>uZtBp*9C-mrNE7Mh53yxzeiZW` zcN6vhgf8iJRoOmk2AYGJnA2K%#1ChNQGH zgH+X*rU*jnEN^vGeUjcufJAYEy`(``X3-oiwEQ1Q4n{e8xvFy2+4w$`|0SBLT?^4q zyMIZOUSj*}xFb?!*Ji%ZrT4H+>^fnUh2Es@@lCR}^xE-JMSY@!(9M4OwXcgtnH)>T zHLX-sDXdgq-DK#@>6)rimH6qzlN9Tuv#lVM&RNrKmtseDk-aqU4J4~%ukzX1y^pRv zuyjI4$g@PZ+J_pKPRRGYXyRhrp*WD3GJ=D|Q^8p?zz4Y4-IPU)5yTKTMHiLrV?9bm zw52{M<3Vhf89M?eMD6++l=1u(U7;+|Ht3KD?Hj7nPfS?rpQM)WArz&j7}-vIk4EQx zimu_a)!wOM;+=rP0%E>U_6xI*33HG_AE39G9aR6Iwdc9hTD(W5Gj~!0r;Kr`>6A6y z>6ADC##ZW-+GZb1%Tv;n7JQ70M74>#L=6cetTxr`nljxSj!TdELSo~`rv-@HiurIp z-hN=aLb9IG>>IiHjO>_w*9`YR-f(0KTYzjbQam8{dJ9W?Ub3FR&`5W|oj5~tjAoyR z+kglFM1g8!CtGVpJ_ALV9N`v}@QkraBCH+G%E80mHA*h6c(~MP8}fv+6kr0ona)Xw z8Gj`GGACjC24+`GN7YfXik*mzG5rh-%)qh@9$WSt&4vCHWzc50Uaj(err9byonf&vA#$`w%gb zFK~gHXM#4Byg;L&Rf-YX^@X{vDaS?1inPc)7p2l~e6jZF(8Wpfcnb0?#z&o!E*!9_CUn(Xbn>|Hpp+?8_;#O4(-gdKg2jse0% z*XWXS3MwDdf@|cK8KSC8@lIx6%PJt?aed?KPl~RpT4;)m;GxvnjBD(-0D!Gor)Gtl z?mU?(Hv?@1{e*YR%&4yncX#Zhn zF2@J>!j1IBeL3A~TK2cr#cRfO$^}Nyrl9AoXg-QFIX|EsuIAd<-_$A@7n=D$kP6tm zf0O>cqfTGVB`%-hdd>fU%DS1u(m>#PokG2lZZO<@K%?EDMer&vaYHk~A=H1mncL&g zxn}M{{yp4b#@o;`JWNj>&=q%ck}32dwf2A*d0`+F{^FpIN44gcrO?5-P0Kn)3062mQm(zRFATP6nCEe@k1+ciao3EFGw5!op zFUTsr>*>AHEK#`0#m_3fOT8AnuyopHX>l zG@+npvMY+&T6$?w$1ZpH;`mT(RSGpksFb@?6Q9p7_xE;NO0{P+mh*nAAR=oY+BARS zPkn6=osq)Uxk$wstu{NlnrtZppV1}cwN6kFBQve+*vh?RZyUs-XXNGs?3)4M2^{;i z`c(B^m!EAA2UUvC>(`-Q9f*v!rCfbREjjNC1#$7a_EkftUf5%U(4I@I`91Q58-KVt z-2Ea4ItPPHpfzA+sXTFo7x~^k&+!LUzI&p z!0PAzqb+5~b1LMEyweoKimEX!63XSBWrJ9)Qes;#_;6;zR@9YV6MLUie_!*&vO8Z( z`#%Mae6|+Zv)!qkZ)Ej7&<8m3dD(sSdI{lLsp>`7GLPBMs8SBRrrJ5c-8takF>A$o zjq24IGl|D)0-}iF?rTZ{gz4|s^weth3}AeYZ{#ed=Ee`#t~9^aNQVwHc)y_|fR0Re z#YkA%FOipb9Ddt((ayiTuB_JcMi{EUA*%)5FHXLyZvhVbS#3=H>q_J zHh(*i&2;WHHP4wM5TA(jg~2^@+Pz6&K#aLQK4nUgMP2>Sd)O70YN^T_$0cV>vt0A> ziA=UZbEnx1gt3C$^n>B-<(x2&Hw-4>2Mc`lP4~qu z2Yo;#aA%4xXePP)!`N(~0{oC~Uz9PLD9Ya)>X&3RiSBOtjoLS+L>`JjJ|3@N4WXXN zL~H!b-o;v)Ok$ievdz!Ox9)0WWNXd_%3z37DIqPF)comrxnU{=1C4>m{0^D@#sS0~ z%8~5!eU~zmexEBr;DIpA14w89@UK%K`&Q5EnaSMiTO0nLRm$R!QVSm68BouL|0FUG zLgt8D0AVAxtXQ?+N>Rl<6bK6VN2Rp8zLkulKh9T}!T2F#Azf5qbemjc1qr7BX`ywp4wJhs{k+Ne^{tDvv1 z8))_^)(jAAW-LSI2lh6sDr7_74Jq7}4f(72ymQ@GVgRcPbR-I%9ccbi);%8}bv+P0 zl+Xm<%=&>;uQQpbL@oicf1|L)w4n@o9UZpzur;5{pi@C zxcA6h4(IP)&tvuvY>Jv@^z=TwV(i*l9`?7nHl@H|v;Uyc<>UzQVxxYGzF86AOL%9b zgS{JN{oq;j%0j&JNdMOots0i=S@P`EuVnhPsS`)nOPsKA0p3|v;!DhlT~e_7lr4DY zIYgNTdD=Jq{?hti@y-hK*TVjvwzYv zb4)PanQGTo4ZQPBt9qhMk2q0x$%C&fJA9?osUiI-MQn>_vko2 z*ZjM>91|}%yU}gkN$WtD8WL>6#jP`}v%dHA!8_OF;}vF)Ze4D_DS&t8`R-Q-_I0}G z)N5&7)C~U0G@+9D%-aLw;uB-q$Fz+~jERryUcOC_Hf^E`r~0<}Q9kqism|i0riAFI zwu$6F)X97E!`vTfTj4Jc^0y z5Yi*2aJ%>}@)VzsKFSYWKu~;Kd>pMybn+V{4i3^kMFV4Mpy&{ufrSh7HYgx3Z+q*J z7!%vQyv)}%A*M@AVocBI?uEN1#CJ{Sb3%0ckG`69XsR>EsXzgVq*M14I>28jVz!Dh z0o~=1Ng-Whdvu72qdn`*)_~OCM84EeIh#5KyDKQhDpP6PNT=YUX-G~?h>GhD^5f$| zIwZvR=!y*XpD47hIk8@d+#$1%wxgnWE~OgGwoFjxL;n7oaJ>GoT?lsyo^V1x_+s{cV)XugETcs8S{r zHV5XF74cD90#urBAw{UcXs6s%ezQ{+TDaNi2wiq|cA_f7oT|VF>GZ?qp~IZUWy&U6 zZ(Mx4=r%ENh2`NrG`OZYC!L8hyW#G=>yMm*O30Jj7z!ov!`9BDddI|f4@rnlOz6`w zDz05@bQ^R5Z#H4>hR(mLj6%&fhSw}gw2%)Vd%oaLU!pV)UPIhwGJba7OgRaiK zo1iDf-?1jt_e`;{dE5iR3bZ*j2rmtE{{SJaz4ZV9 delta 116121 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 diff --git a/packages/notifications/package.json b/packages/notifications/package.json new file mode 100644 index 0000000000..909d7d8e3f --- /dev/null +++ b/packages/notifications/package.json @@ -0,0 +1,20 @@ +{ + "name": "@bubba/notifications", + "version": "1.0.0", + "private": true, + "main": "src/index.ts", + "type": "module", + "scripts": { + "clean": "rm -rf .turbo node_modules", + "lint": "biome check .", + "format": "biome format --write .", + "typecheck": "tsc --noEmit" + }, + "dependencies": { + "@novu/node": "^2.0.1", + "nanoid": "^5.0.7" + }, + "devDependencies": { + "typescript": "^5.6.3" + } +} diff --git a/packages/notifications/src/index.ts b/packages/notifications/src/index.ts new file mode 100644 index 0000000000..5a54b3c5c5 --- /dev/null +++ b/packages/notifications/src/index.ts @@ -0,0 +1,113 @@ +import { Novu } from "@novu/node"; +import ky from "ky"; +import { nanoid } from "nanoid"; + +const novu = new Novu(process.env.NOVU_API_KEY!); +const novu_api = "https://api.novu.co/v1"; + +export enum TriggerEvents { + TaskReminderInApp = "task-reminder-inapp", +} + +export enum NotificationTypes { + Task = "task", +} + +type TriggerUser = { + subscriberId: string; + email: string; + fullName: string; + image: string; + organizationId: string; +} + +type TriggerPayload = { + name: TriggerEvents; + payload: any; + user: TriggerUser; + replyTo?: string; + tenant?: string; // organization_id + user_id +} + +type GetSubscriberPreferencesParams = { + organizationId: string; + subscriberId: string; +} + +type UpdateSubscriberPreferencesParams = { + subscriberId: string; + organizationId: string; + templateId: string; + type: string; + enabled: boolean; +} + +export async function trigger(data: TriggerPayload) { + try { + const subscriberId = `${data.user.organizationId}_${data.user.subscriberId}`; + + await novu.trigger(data.name, { + to: { + ...data.user, + subscriberId + }, + payload: data.payload, + tenant: data.tenant, + overrides: { + email: { + replyTo: data.replyTo, + headers: { + "X-Entity-Ref-ID": nanoid(), + } + } + } + }); + } catch (error: any) { + console.error('Novu trigger error:', { + event: data.name, + error: error.response?.data || error.message, + status: error.response?.status + }); + + throw error; + } +} + +export async function getSubscriberPreferences({ organizationId, subscriberId }: GetSubscriberPreferencesParams) { + try { + const response = await ky.get(`${novu_api}/subscribers/${organizationId}_${subscriberId}/preferences?includeInactiveChannels=false`, { + method: "GET", + headers: { + Authorization: `ApiKey ${process.env.NOVU_API_KEY!}`, + }, + }) + + return response.json(); + } catch (error) { + console.log(error); + return null; + } +} + +export async function updateSubscriberPreferences({ subscriberId, organizationId, templateId, type, enabled }: UpdateSubscriberPreferencesParams) { + try { + const response = await ky.patch(`${novu_api}/subscribers/${organizationId}_${subscriberId}/preferences/${templateId}`, { + method: "PATCH", + headers: { + Authorization: `ApiKey ${process.env.NOVU_API_KEY!}`, + "Content-Type": "application/json", + }, + body: JSON.stringify({ + channel: { + type, + enabled, + }, + }), + }) + + return response.json(); + } catch (error) { + console.log(error); + return null; + } +} \ No newline at end of file diff --git a/packages/notifications/tsconfig.json b/packages/notifications/tsconfig.json new file mode 100644 index 0000000000..3a0a99d5c6 --- /dev/null +++ b/packages/notifications/tsconfig.json @@ -0,0 +1,5 @@ +{ + "extends": "@bubba/tsconfig/base.json", + "include": ["src"], + "exclude": ["node_modules"] +} diff --git a/turbo.json b/turbo.json index b22e7c5c43..8c0c5b8ba8 100644 --- a/turbo.json +++ b/turbo.json @@ -31,7 +31,8 @@ "VERCEL_AUTH_TOKEN", "VERCEL_TEAM_ID", "VERCEL_PROJECT_ID", - "NEXT_PUBLIC_VERCEL_URL" + "NEXT_PUBLIC_VERCEL_URL", + "NOVU_API_KEY" ], "inputs": [ "$TURBO_DEFAULT$", diff --git a/yarn.lock b/yarn.lock index 4b9479bf64..d92df5a4c4 100644 --- a/yarn.lock +++ b/yarn.lock @@ -1,6 +1,6 @@ # THIS IS AN AUTOGENERATED FILE. DO NOT EDIT THIS FILE DIRECTLY. # yarn lockfile v1 -# bun ./bun.lockb --hash: E61F2EF946E5A25E-7e221dd7b0c731c7-903B7615989286AD-79b4c36c31dd44c7 +# bun ./bun.lockb --hash: E3588BF47FA0E20B-abcd9cbbd126aa0d-23D6C38DF3A8DD19-ad81e27570f355aa "@ai-sdk/anthropic@^1.1.6": @@ -316,7 +316,7 @@ dependencies: "@babel/types" "^7.26.5" -"@babel/runtime@^7.13.10", "@babel/runtime@^7.20.13", "@babel/runtime@^7.26.0", "@babel/runtime@^7.5.5", "@babel/runtime@^7.8.7": +"@babel/runtime@^7.13.10", "@babel/runtime@^7.15.4", "@babel/runtime@^7.20.13", "@babel/runtime@^7.26.0", "@babel/runtime@^7.5.5", "@babel/runtime@^7.8.7": version "7.26.0" resolved "https://registry.npmjs.org/@babel/runtime/-/runtime-7.26.0.tgz" integrity sha512-FDSOghenHTiToteC/QRlv2q3DhPZ/oOXTBoirfWNx1Cx3TMVcGWQtMMmQcSvb/JjpNeGzx8Pq/b4fKEJuWm1sw== @@ -479,6 +479,15 @@ "@upstash/redis" "^1.34.2" server-only "^0.0.1" +"@bubba/notifications@packages/notifications", "@bubba/notifications@workspace:*": + version "workspace:packages/notifications" + resolved "workspace:packages/notifications" + devDependencies: + typescript "^5.6.3" + dependencies: + "@novu/node" "^2.0.1" + nanoid "^5.0.7" + "@bubba/tsconfig@packages/tsconfig", "@bubba/tsconfig@workspace:*": version "workspace:packages/tsconfig" resolved "workspace:packages/tsconfig" @@ -832,7 +841,7 @@ dependencies: "@floating-ui/utils" "^0.2.9" -"@floating-ui/dom@^1.0.0": +"@floating-ui/dom@^1.0.0", "@floating-ui/dom@^1.5", "@floating-ui/dom@^1.6.7": version "1.6.13" resolved "https://registry.npmjs.org/@floating-ui/dom/-/dom-1.6.13.tgz" integrity sha512-umqzocjDgNRGTuO7Q8CU32dkHkECqI8ZdMZ5Swb6QAM0t5rnlrN3lGo1hdpscRd3WS8T6DKYK4ephgIH9iRh3w== @@ -1153,6 +1162,59 @@ jju "^1.4.0" js-yaml "^4.1.0" +"@motionone/animation@^10.18.0": + version "10.18.0" + resolved "https://registry.npmjs.org/@motionone/animation/-/animation-10.18.0.tgz" + integrity sha512-9z2p5GFGCm0gBsZbi8rVMOAJCtw1WqBTIPw3ozk06gDvZInBPIsQcHgYogEJ4yuHJ+akuW8g1SEIOpTOvYs8hw== + dependencies: + "@motionone/easing" "^10.18.0" + "@motionone/types" "^10.17.1" + "@motionone/utils" "^10.18.0" + tslib "^2.3.1" + +"@motionone/dom@^10.17.0": + version "10.18.0" + resolved "https://registry.npmjs.org/@motionone/dom/-/dom-10.18.0.tgz" + integrity sha512-bKLP7E0eyO4B2UaHBBN55tnppwRnaE3KFfh3Ps9HhnAkar3Cb69kUCJY9as8LrccVYKgHA+JY5dOQqJLOPhF5A== + dependencies: + "@motionone/animation" "^10.18.0" + "@motionone/generators" "^10.18.0" + "@motionone/types" "^10.17.1" + "@motionone/utils" "^10.18.0" + hey-listen "^1.0.8" + tslib "^2.3.1" + +"@motionone/easing@^10.18.0": + version "10.18.0" + resolved "https://registry.npmjs.org/@motionone/easing/-/easing-10.18.0.tgz" + integrity sha512-VcjByo7XpdLS4o9T8t99JtgxkdMcNWD3yHU/n6CLEz3bkmKDRZyYQ/wmSf6daum8ZXqfUAgFeCZSpJZIMxaCzg== + dependencies: + "@motionone/utils" "^10.18.0" + tslib "^2.3.1" + +"@motionone/generators@^10.18.0": + version "10.18.0" + resolved "https://registry.npmjs.org/@motionone/generators/-/generators-10.18.0.tgz" + integrity sha512-+qfkC2DtkDj4tHPu+AFKVfR/C30O1vYdvsGYaR13W/1cczPrrcjdvYCj0VLFuRMN+lP1xvpNZHCRNM4fBzn1jg== + dependencies: + "@motionone/types" "^10.17.1" + "@motionone/utils" "^10.18.0" + tslib "^2.3.1" + +"@motionone/types@^10.17.1": + version "10.17.1" + resolved "https://registry.npmjs.org/@motionone/types/-/types-10.17.1.tgz" + integrity sha512-KaC4kgiODDz8hswCrS0btrVrzyU2CSQKO7Ps90ibBVSQmjkrt2teqta6/sOG59v7+dPnKMAg13jyqtMKV2yJ7A== + +"@motionone/utils@^10.17.0", "@motionone/utils@^10.18.0": + version "10.18.0" + resolved "https://registry.npmjs.org/@motionone/utils/-/utils-10.18.0.tgz" + integrity sha512-3XVF7sgyTSI2KWvTf6uLlBJ5iAgRgmvp3bpuOiQJvInd4nZ19ET8lX5unn30SlmRH7hXbBbH+Gxd0m0klJ3Xtw== + dependencies: + "@motionone/types" "^10.17.1" + hey-listen "^1.0.8" + tslib "^2.3.1" + "@mui/core-downloads-tracker@^6.4.0": version "6.4.0" resolved "https://registry.npmjs.org/@mui/core-downloads-tracker/-/core-downloads-tracker-6.4.0.tgz" @@ -1434,6 +1496,34 @@ socket.io-client "4.7.2" "@tanstack/query-core" "^4.15.1" +"@novu/js@2.6.5": + version "2.6.5" + resolved "https://registry.npmjs.org/@novu/js/-/js-2.6.5.tgz" + integrity sha512-lh9InJdzyU+nCX9c0P00iHR4Q/R85KhmOdBSW/JLkKdH8755Kc3KO8c9cpvOhGUYhUsVuJcok8wdzj0s/09rMw== + dependencies: + "@floating-ui/dom" "^1.6.7" + class-variance-authority "^0.7.0" + clsx "^2.1.1" + mitt "^3.0.1" + socket.io-client "4.7.2" + solid-floating-ui "^0.3.1" + solid-js "^1.8.11" + solid-motionone "^1.0.1" + tailwind-merge "^2.4.0" + +"@novu/node@^2.0.1": + version "2.6.5" + resolved "https://registry.npmjs.org/@novu/node/-/node-2.6.5.tgz" + integrity sha512-5GQI6EkjsLNbzUOXIRGbeFNsY1+bzI8sVhoeBCJfnJ9r/elFNRSMYsgVp5dCXtzLBrp7cjMfYNdLFhp1uUNaig== + dependencies: + axios "^1.6.8" + axios-retry "^3.8.0" + handlebars "^4.7.7" + lodash.get "^4.4.2" + lodash.merge "^4.6.2" + uuid "^9.0.1" + "@novu/shared" "2.6.5" + "@novu/ntfr-client@^0.0.4": version "0.0.4" resolved "https://registry.npmjs.org/@novu/ntfr-client/-/ntfr-client-0.0.4.tgz" @@ -1446,11 +1536,23 @@ partysocket "^0.0.17" proxy-agent "^6.3.0" +"@novu/react@^2.6.5": + version "2.6.5" + resolved "https://registry.npmjs.org/@novu/react/-/react-2.6.5.tgz" + integrity sha512-LJNeUnEAV6morGvVjv1iaQIov+Q32irESfBmHHI1SjDbVOHD+CPHCkZZ9R3Yb/9IRIUA6PTGb8vWOs2oPaHKSQ== + dependencies: + "@novu/js" "2.6.5" + "@novu/shared@2.1.5": version "2.1.5" resolved "https://registry.npmjs.org/@novu/shared/-/shared-2.1.5.tgz" integrity sha512-bAnZkvljegpf2GdjeYS9lbNp49K9a72OKfDXfYt3tSYB5DaTxj7RdGRaYW1IXDI7UTNEEg7G2XcbC3F7TadrmA== +"@novu/shared@2.6.5": + version "2.6.5" + resolved "https://registry.npmjs.org/@novu/shared/-/shared-2.6.5.tgz" + integrity sha512-nKSuZ6oIBGezvEP7ICsBT1jtwzL/Y1mzZxpYjmzLiZUXVV35GGk83NqNwjImNjDYAz1c4wVpDb8uV+nMy4e0Tw== + "@one-ini/wasm@0.1.1": version "0.1.1" resolved "https://registry.npmjs.org/@one-ini/wasm/-/wasm-0.1.1.tgz" @@ -2912,6 +3014,30 @@ resolved "https://registry.npmjs.org/@socket.io/component-emitter/-/component-emitter-3.1.2.tgz" integrity sha512-9BCxFwvbGg/RsZK9tjXd8s4UcwR0MWeFQ1XEKIQVVvAGJyINdrqKMcTRyLoK8Rse1GjzLV9cwjWV1olXRWEXVA== +"@solid-primitives/props@^3.1.11": + version "3.2.0" + resolved "https://registry.npmjs.org/@solid-primitives/props/-/props-3.2.0.tgz" + integrity sha512-vEg5yERdXftJz2+A6B0IMYTrPL9SE2DPmpURV/nZyqQ+PXziF02V4b4SDr6JX3jNJxBlY6c17LqwYEw+bIfGRg== + dependencies: + "@solid-primitives/utils" "^6.3.0" + +"@solid-primitives/refs@^1.0.8": + version "1.1.0" + resolved "https://registry.npmjs.org/@solid-primitives/refs/-/refs-1.1.0.tgz" + integrity sha512-QJ3bTSQOlPdHBP2m6llrT13FvVzAwZfx41lTN8lQrRwwcZoWb7kfCAjhaohPnwkAsQ6nJpLjtGfT5GOyuCA4tA== + dependencies: + "@solid-primitives/utils" "^6.3.0" + +"@solid-primitives/transition-group@^1.0.5": + version "1.1.0" + resolved "https://registry.npmjs.org/@solid-primitives/transition-group/-/transition-group-1.1.0.tgz" + integrity sha512-pL1sEPCHuC4V+Yh+SQsKSPuGDYrZbLJYSkk3AB4TZrWhptEJUS0IHoi7BAynYcMiULbvMMVKFbeFHqINZq0+ig== + +"@solid-primitives/utils@^6.3.0": + version "6.3.0" + resolved "https://registry.npmjs.org/@solid-primitives/utils/-/utils-6.3.0.tgz" + integrity sha512-e7hTlJ1Ywh2+g/Qug+n4L1mpfxsikoIS4/sHE2EK9WatQt8UJqop/vE6bsLnXlU1xuhb/jo94Ah5Y27rd4wP7A== + "@standard-schema/spec@1.0.0-beta.3": version "1.0.0-beta.3" resolved "https://registry.npmjs.org/@standard-schema/spec/-/spec-1.0.0-beta.3.tgz" @@ -4505,6 +4631,14 @@ axios@^1.6.8, axios@^1.7.4, axios@^1.7.8, axios@^1.7.9: proxy-from-env "^1.1.0" follow-redirects "^1.15.6" +axios-retry@^3.8.0: + version "3.9.1" + resolved "https://registry.npmjs.org/axios-retry/-/axios-retry-3.9.1.tgz" + integrity sha512-8PJDLJv7qTTMMwdnbMvrLYuvB47M81wRtxQmEdV5w4rgbTXTt+vtPkXwajOfOdSyv/wZICJOC+/UhXH4aQ/R+w== + dependencies: + "@babel/runtime" "^7.15.4" + is-retry-allowed "^2.2.0" + axobject-query@^4.1.0: version "4.1.0" resolved "https://registry.npmjs.org/axobject-query/-/axobject-query-4.1.0.tgz" @@ -4977,6 +5111,7 @@ commander@11.1.0: resolved "workspace:apps/app" devDependencies: "@bubba/db" "workspace:*" + "@bubba/notifications" "workspace:*" "@trigger.dev/build" "3.3.13" "@types/node" "^22.13.0" "@types/react" "^19.0.8" @@ -4994,6 +5129,7 @@ commander@11.1.0: "@nangohq/frontend" "^0.48.4" "@nangohq/node" "^0.48.4" "@novu/headless" "^2.0.4" + "@novu/react" "^2.6.5" "@prisma/instrumentation" "^6.3.0" "@tanstack/react-query" "^5.66.0" "@tanstack/react-table" "^8.20.6" @@ -5232,7 +5368,7 @@ cssstyle@^4.2.1: "@asamuzakjp/css-color" "^2.8.2" rrweb-cssom "^0.8.0" -csstype@^3.0.2, csstype@^3.1.3: +csstype@^3.0.2, csstype@^3.1.0, csstype@^3.1.3: version "3.1.3" resolved "https://registry.npmjs.org/csstype/-/csstype-3.1.3.tgz" integrity sha512-M1uQkMl8rQK/szD0LNhtqxIPLpimGm8sOBwU7lLnCpSbTyY3yeU1Vc7l4KT5zT4s/yOxHH5O7tIuuLOCnLADRw== @@ -6636,6 +6772,18 @@ gray-matter@^4.0.3: section-matter "^1.0.0" strip-bom-string "^1.0.0" +handlebars@^4.7.7: + version "4.7.8" + resolved "https://registry.npmjs.org/handlebars/-/handlebars-4.7.8.tgz" + integrity sha512-vafaFqs8MZkRrSX7sFVUdo3ap/eNiLnb4IakshzvP56X5Nr1iGKAIqdX6tMlm6HcNRIkr6AxO5jFEoJzzpT8aQ== + dependencies: + minimist "^1.2.5" + neo-async "^2.6.2" + source-map "^0.6.1" + wordwrap "^1.0.0" + optionalDependencies: + uglify-js "^3.1.4" + har-schema@^2.0.0: version "2.0.0" resolved "https://registry.npmjs.org/har-schema/-/har-schema-2.0.0.tgz" @@ -6725,6 +6873,11 @@ hast-util-whitespace@^3.0.0: dependencies: "@types/hast" "^3.0.0" +hey-listen@^1.0.8: + version "1.0.8" + resolved "https://registry.npmjs.org/hey-listen/-/hey-listen-1.0.8.tgz" + integrity sha512-COpmrF2NOg4TBWUJ5UVyaCU2A88wEMkUPK4hNqyCkqHbxT92BbvfjoSozkAIIm6XhicGlJHhFdullInrdhwU8Q== + highlight.js@^11, highlight.js@^11.11.1, highlight.js@~11.11.0: version "11.11.1" resolved "https://registry.npmjs.org/highlight.js/-/highlight.js-11.11.1.tgz" @@ -7180,6 +7333,11 @@ is-regex@^1.2.1: has-tostringtag "^1.0.2" hasown "^2.0.2" +is-retry-allowed@^2.2.0: + version "2.2.0" + resolved "https://registry.npmjs.org/is-retry-allowed/-/is-retry-allowed-2.2.0.tgz" + integrity sha512-XVm7LOeLpTW4jV19QSH38vkswxoLud8sQ57YwJVTPWdiaI9I8keEhGFpBlslyVsgdQy4Opg8QOLb8YRgsyZiQg== + is-set@^2.0.2, is-set@^2.0.3: version "2.0.3" resolved "https://registry.npmjs.org/is-set/-/is-set-2.0.3.tgz" @@ -7651,6 +7809,11 @@ lodash.camelcase@^4.3.0: resolved "https://registry.npmjs.org/lodash.camelcase/-/lodash.camelcase-4.3.0.tgz" integrity sha512-TwuEnCnxbc3rAvhf/LbG7tJUDzhqXyFnv3dtzLOPgCG/hODL7WFnsbwktkD7yUV0RrreP/l1PALq/YSg6VvjlA== +lodash.get@^4.4.2: + version "4.4.2" + resolved "https://registry.npmjs.org/lodash.get/-/lodash.get-4.4.2.tgz" + integrity sha512-z+Uw/vLuy6gQe8cfaFWD7p0wVv8fJl3mbzXh33RS+0oW2wvUqiRXiQ69gLWSLpgB5/6sU+r6BlQR0MBILadqTQ== + lodash.includes@^4.3.0: version "4.3.0" resolved "https://registry.npmjs.org/lodash.includes/-/lodash.includes-4.3.0.tgz" @@ -8354,7 +8517,7 @@ minimatch@^9.0.1, minimatch@^9.0.4: dependencies: brace-expansion "^2.0.1" -minimist@^1.2.0, minimist@^1.2.6: +minimist@^1.2.0, minimist@^1.2.5, minimist@^1.2.6: version "1.2.8" resolved "https://registry.npmjs.org/minimist/-/minimist-1.2.8.tgz" integrity sha512-2yyAR8qBkN3YuheJanUpWC5U3bb5osDywNB8RzDVlDwDHbocAJveqqj1u8+SVD7jkWT4yvsHCpWqqWqAxb0zCA== @@ -8450,6 +8613,11 @@ nanoid@^3.3.4, nanoid@^3.3.6, nanoid@^3.3.7, nanoid@^3.3.8: resolved "https://registry.npmjs.org/nanoid/-/nanoid-3.3.8.tgz" integrity sha512-WNLf5Sd8oZxOm+TzppcYk8gVOgP+l58xNy58D0nbUnOxOWRWvlcCV4kUF7ltmI6PsrLl/BgKEyS4mqsGChFN0w== +nanoid@^5.0.7: + version "5.0.9" + resolved "https://registry.npmjs.org/nanoid/-/nanoid-5.0.9.tgz" + integrity sha512-Aooyr6MXU6HpvvWXKoVoXwKMs/KyVakWwg7xQfv5/S/RIgJMy0Ifa45H9qqYy7pTCszrHzP21Uk4PZq2HpEM8Q== + negotiator@0.6.3: version "0.6.3" resolved "https://registry.npmjs.org/negotiator/-/negotiator-0.6.3.tgz" @@ -8460,6 +8628,11 @@ negotiator@^1.0.0: resolved "https://registry.npmjs.org/negotiator/-/negotiator-1.0.0.tgz" integrity sha512-8Ofs/AUQh8MaEcrlq5xOX0CQ9ypTF5dl78mjlMNfOK08fzpgTHQRQPBxcPlEtIw0yRpws+Zo/3r+5WRby7u3Gg== +neo-async@^2.6.2: + version "2.6.2" + resolved "https://registry.npmjs.org/neo-async/-/neo-async-2.6.2.tgz" + integrity sha512-Yd3UES5mWCSqR+qNT93S3UoYUkqAZ9lLg8a7g9rimsWmYGK8cVToA4/sF3RrshdyV3sAGMXVUmpMYOw+dLpOuw== + netmask@^2.0.2: version "2.0.2" resolved "https://registry.npmjs.org/netmask/-/netmask-2.0.2.tgz" @@ -9690,7 +9863,7 @@ react@18.2.0, react@18.x, "react@^16.8 || ^17.0 || ^18.0", react@^18.0.0, react@ dependencies: loose-envify "^1.1.0" -react@*, react@19.0.0, "react@>= 16.8 || 18.0.0", "react@>= 16.8.0 || 17.x.x || ^18.0.0-0 || ^19.0.0-0", "react@>= 18.0.0", "react@>= 18.2.0", react@>=16, react@>=16.6.0, react@>=16.8, "react@>=16.8.0 || ^17.0.0 || ^18", react@>=16.8.1, react@>=18, "react@>=18.2.0 || ^19.0.0-0", "react@^0.14 || ^15.0.0 || ^16.0.0 || ^17.0.0 || ^18.0.0 || ^19.0.0", "react@^16.0.0 || ^17.0.0 || ^18.0.0 || ^19.0.0", "react@^16.11.0 || ^17.0.0 || ^18.0.0 || ^19.0.0", "react@^16.14.0 || ^17.0.0 || ^18.0.0 || ^19.0.0 || ^19.0.0-rc", "react@^16.5.1 || ^17.0.0 || ^18.0.0 || ^19.0.0", "react@^16.5.1 || ^17.0.0 || ^18.0.0 || ^19.0.0-rc", "react@^16.8 || ^17 || ^18 || ^19 || ^19.0.0-rc", "react@^16.8.0 || ^17 || ^18 || ^19", "react@^16.8.0 || ^17.0.0 || ^18.0.0 || >=19.0.0-rc <19.0.0 || ^19.0.0", "react@^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0", "react@^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0 || ^19.0.0-rc", "react@^16.8.0 || ^17.0.1 || ^18.0.0 || ^19.0.0 || ^19.0.0-rc", "react@^16.x || ^17.x || ^18.x || ^19.0.0 || ^19.0.0-rc", "react@^17.0.0 || ^18.0.0 || ^19.0.0", "react@^17.0.2 || ^18.0.0 || ^19.0.0", "react@^18 || ^19", "react@^18 || ^19 || ^19.0.0-rc", "react@^18.0 || ^19.0", "react@^18.0 || ^19.0 || ^19.0.0-rc", "react@^18.2.0 || 19.0.0-rc-66855b96-20241106 || ^19.0.0", "react@^18.2.0 || 19.0.0-rc-de68d2f4-20241204 || ^19.0.0", "react@^18.2.0 || ^19.0.0-0", react@^19.0.0: +react@*, react@19.0.0, "react@>= 16.8 || 18.0.0", "react@>= 16.8.0 || 17.x.x || ^18.0.0-0 || ^19.0.0-0", "react@>= 18.0.0", "react@>= 18.2.0", react@>=16, react@>=16.6.0, react@>=16.8, "react@>=16.8.0 || ^17.0.0 || ^18", react@>=16.8.1, react@>=17, react@>=18, "react@>=18.2.0 || ^19.0.0-0", "react@^0.14 || ^15.0.0 || ^16.0.0 || ^17.0.0 || ^18.0.0 || ^19.0.0", "react@^16.0.0 || ^17.0.0 || ^18.0.0 || ^19.0.0", "react@^16.11.0 || ^17.0.0 || ^18.0.0 || ^19.0.0", "react@^16.14.0 || ^17.0.0 || ^18.0.0 || ^19.0.0 || ^19.0.0-rc", "react@^16.5.1 || ^17.0.0 || ^18.0.0 || ^19.0.0", "react@^16.5.1 || ^17.0.0 || ^18.0.0 || ^19.0.0-rc", "react@^16.8 || ^17 || ^18 || ^19 || ^19.0.0-rc", "react@^16.8.0 || ^17 || ^18 || ^19", "react@^16.8.0 || ^17.0.0 || ^18.0.0 || >=19.0.0-rc <19.0.0 || ^19.0.0", "react@^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0", "react@^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0 || ^19.0.0-rc", "react@^16.8.0 || ^17.0.1 || ^18.0.0 || ^19.0.0 || ^19.0.0-rc", "react@^16.x || ^17.x || ^18.x || ^19.0.0 || ^19.0.0-rc", "react@^17.0.0 || ^18.0.0 || ^19.0.0", "react@^17.0.2 || ^18.0.0 || ^19.0.0", "react@^18 || ^19", "react@^18 || ^19 || ^19.0.0-rc", "react@^18.0 || ^19.0", "react@^18.0 || ^19.0 || ^19.0.0-rc", "react@^18.2.0 || 19.0.0-rc-66855b96-20241106 || ^19.0.0", "react@^18.2.0 || 19.0.0-rc-de68d2f4-20241204 || ^19.0.0", "react@^18.2.0 || ^19.0.0-0", react@^19.0.0: version "19.0.0" resolved "https://registry.npmjs.org/react/-/react-19.0.0.tgz" integrity sha512-V8AVnmPIICiWpGfm6GLzCR/W5FXLchHop40W4nXBmdlEceh16rCN8O8LNWm5bh5XUX91fh7KpA+W0TgMKmgTpQ== @@ -10362,6 +10535,16 @@ send@0.19.0: on-finished "2.4.1" range-parser "~1.2.1" +seroval@^1.0, seroval@^1.1.0: + version "1.2.1" + resolved "https://registry.npmjs.org/seroval/-/seroval-1.2.1.tgz" + integrity sha512-yBxFFs3zmkvKNmR0pFSU//rIsYjuX418TnlDmc2weaq5XFDqDIV/NOMPBoLrbxjLH42p4UzRuXHryXh9dYcKcw== + +seroval-plugins@^1.1.0: + version "1.2.1" + resolved "https://registry.npmjs.org/seroval-plugins/-/seroval-plugins-1.2.1.tgz" + integrity sha512-H5vs53+39+x4Udwp4J5rNZfgFuA+Lt+uU+09w1gYBVWomtAl98B+E9w7yC05Xc81/HgLvJdlyqJbU0fJCKCmdw== + serve-static@1.16.2: version "1.16.2" resolved "https://registry.npmjs.org/serve-static/-/serve-static-1.16.2.tgz" @@ -10611,12 +10794,38 @@ socks-proxy-agent@^8.0.5: debug "^4.3.4" socks "^2.8.3" +solid-floating-ui@^0.3.1: + version "0.3.1" + resolved "https://registry.npmjs.org/solid-floating-ui/-/solid-floating-ui-0.3.1.tgz" + integrity sha512-o/QmGsWPS2Z3KidAxP0nDvN7alI7Kqy0kU+wd85Fz+au5SYcnYm7I6Fk3M60Za35azsPX0U+5fEtqfOuk6Ao0Q== + +solid-js@^1.6.12, solid-js@^1.8, solid-js@^1.8.11: + version "1.9.4" + resolved "https://registry.npmjs.org/solid-js/-/solid-js-1.9.4.tgz" + integrity sha512-ipQl8FJ31bFUoBNScDQTG3BjN6+9Rg+Q+f10bUbnO6EOTTf5NGerJeHc7wyu5I4RMHEl/WwZwUmy/PTRgxxZ8g== + dependencies: + csstype "^3.1.0" + seroval "^1.1.0" + seroval-plugins "^1.1.0" + +solid-motionone@^1.0.1: + version "1.0.3" + resolved "https://registry.npmjs.org/solid-motionone/-/solid-motionone-1.0.3.tgz" + integrity sha512-C1XGpbKz7klrYwYPI75X0TJdIIJWMslLPUIgnu9a0jXqN6TWA65+EByBkhVarZeBfNjVg3+uOrIRFewqZkjuFA== + dependencies: + "@motionone/dom" "^10.17.0" + "@motionone/utils" "^10.17.0" + "@solid-primitives/props" "^3.1.11" + "@solid-primitives/refs" "^1.0.8" + "@solid-primitives/transition-group" "^1.0.5" + csstype "^3.1.3" + sonner@^1.7.4: version "1.7.4" resolved "https://registry.npmjs.org/sonner/-/sonner-1.7.4.tgz" integrity sha512-DIS8z4PfJRbIyfVFDVnK9rO3eYDtse4Omcm6bt0oEr5/jtLgysmjuBl1frJ9E/EQZrFmKx2A8m/s5s9CRXIzhw== -source-map@~0.6.1: +source-map@^0.6.1: version "0.6.1" resolved "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz" integrity sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g== @@ -10941,7 +11150,7 @@ tailwind-merge@2.5.3: resolved "https://registry.npmjs.org/tailwind-merge/-/tailwind-merge-2.5.3.tgz" integrity sha512-d9ZolCAIzom1nf/5p4LdD5zvjmgSxY0BGgdSvmXIoMYAiPdAW/dSpP7joCDYFY7r/HkEa2qmPtkgsu0xjQeQtw== -tailwind-merge@^2.6.0: +tailwind-merge@^2.4.0, tailwind-merge@^2.6.0: version "2.6.0" resolved "https://registry.npmjs.org/tailwind-merge/-/tailwind-merge-2.6.0.tgz" integrity sha512-P+Vu1qXfzediirmHOC3xKGAYeZtPcV9g76X+xg2FD4tYgR71ewMA35Y3sCz3zhiN/dwefRpJX0yBcgwi1fXNQA== @@ -11193,7 +11402,7 @@ tsconfck@3.1.3: resolved "https://registry.npmjs.org/tsconfck/-/tsconfck-3.1.3.tgz" integrity sha512-ulNZP1SVpRDesxeMLON/LtWM8HIgAJEIVpVVhBM6gsmvQ8+Rh+ZG7FWGvHh7Ah3pRABwVJWklWCr/BTZSv0xnQ== -tslib@2, tslib@^2.0.0, tslib@^2.0.1, tslib@^2.1.0, tslib@^2.4.0, tslib@^2.4.1, tslib@^2.7.0, tslib@^2.8.0: +tslib@2, tslib@^2.0.0, tslib@^2.0.1, tslib@^2.1.0, tslib@^2.3.1, tslib@^2.4.0, tslib@^2.4.1, tslib@^2.7.0, tslib@^2.8.0: version "2.8.1" resolved "https://registry.npmjs.org/tslib/-/tslib-2.8.1.tgz" integrity sha512-oJFu94HQb+KVduSUQL7wnpmqnfmLsOA/nAh6b6EH0wCEoK0/mPeXU6c3wKDV83MkOuHPRHtSXKKU99IBazS/2w== @@ -11359,6 +11568,11 @@ ufo@^1.5.4: resolved "https://registry.npmjs.org/ufo/-/ufo-1.5.4.tgz" integrity sha512-UsUk3byDzKd04EyoZ7U4DOlxQaD14JUKQl6/P7wiX4FNvUfm3XL246n9W5AmqwW5RSFJ27NAuM0iLscAOYUiGQ== +uglify-js@^3.1.4: + version "3.19.3" + resolved "https://registry.npmjs.org/uglify-js/-/uglify-js-3.19.3.tgz" + integrity sha512-v3Xu+yuwBXisp6QYTcH4UbH+xYJXqnq2m/LtQVWKWzYc1iehYnLixoQDN9FH6/j9/oybfd6W9Ghwkl8+UMKTKQ== + ulid@^2.3.0: version "2.3.0" resolved "https://registry.npmjs.org/ulid/-/ulid-2.3.0.tgz" @@ -11556,7 +11770,7 @@ uuid@^3.3.2: resolved "https://registry.npmjs.org/uuid/-/uuid-3.4.0.tgz" integrity sha512-HjSDRw6gZE5JMggctHBcjVak08+KEVhSIiDzFnT9S9aegmp85S/bReBVTb4QTFaRNptJ9kuYaNhnbNEOkbKb/A== -uuid@^9.0.0: +uuid@^9.0.0, uuid@^9.0.1: version "9.0.1" resolved "https://registry.npmjs.org/uuid/-/uuid-9.0.1.tgz" integrity sha512-b+1eJOlsR9K8HJpow9Ok3fiWOWSIcIzXodvv0rQjVoOVNpWMpxf1wZNpt4y9h10odCNrqnYp1OBzRktckBe3sA== @@ -11829,6 +12043,11 @@ wide-align@^1.1.0: dependencies: string-width "^1.0.2 || 2 || 3 || 4" +wordwrap@^1.0.0: + version "1.0.0" + resolved "https://registry.npmjs.org/wordwrap/-/wordwrap-1.0.0.tgz" + integrity sha512-gvVzJFlPycKc5dZN4yPkP8w7Dc37BtP1yczEneOb4uq34pXZcvrtRTmWV8W+Ume+XCxKgbjM+nevkyFPMybd4Q== + wordwrapjs@^5.1.0: version "5.1.0" resolved "https://registry.npmjs.org/wordwrapjs/-/wordwrapjs-5.1.0.tgz" From 1a3b366e8b8d3ad524c99e5715ef223fa79617cd Mon Sep 17 00:00:00 2001 From: Lewis Carhart Date: Mon, 10 Feb 2025 15:26:52 +0000 Subject: [PATCH 2/3] chore: added translations to notification-center --- .../src/components/notification-center.tsx | 28 ++++++++----------- apps/app/src/locales/en.ts | 6 ++++ 2 files changed, 18 insertions(+), 16 deletions(-) diff --git a/apps/app/src/components/notification-center.tsx b/apps/app/src/components/notification-center.tsx index 3b8dee4dc1..2a264153c3 100644 --- a/apps/app/src/components/notification-center.tsx +++ b/apps/app/src/components/notification-center.tsx @@ -1,6 +1,7 @@ "use client"; import { useNotifications } from "@/hooks/use-notifications"; +import { useI18n } from "@/locales/client"; import { Button } from "@bubba/ui/button"; import { Icons } from "@bubba/ui/icons"; import { Popover, PopoverContent, PopoverTrigger } from "@bubba/ui/popover"; @@ -78,18 +79,13 @@ function NotificationItem({ ); default: - return ( -
-

{description}

- - {formatDistanceToNow(new Date(createdAt))} ago - -
- ); + return null; } } export function NotificationCenter() { + const t = useI18n(); + const [isOpen, setOpen] = useState(false); const { hasUnseenNotifications, @@ -113,8 +109,6 @@ export function NotificationCenter() { } }, [hasUnseenNotifications, isOpen]); - console.log(notifications); - return ( @@ -137,10 +131,10 @@ export function NotificationCenter() { - Inbox + {t("common.notifications.inbox")} - Archive + {t("common.notifications.archive")} @@ -151,10 +145,10 @@ export function NotificationCenter() { @@ -193,7 +187,7 @@ export function NotificationCenter() { className="bg-transparent" onClick={markAllMessagesAsRead} > - Archive all + {t("common.notifications.archive_all")} )} @@ -201,7 +195,9 @@ export function NotificationCenter() { {!archivedNotifications.length && ( - + )} {archivedNotifications.length > 0 && ( diff --git a/apps/app/src/locales/en.ts b/apps/app/src/locales/en.ts index 487862eae3..fc7ff06208 100644 --- a/apps/app/src/locales/en.ts +++ b/apps/app/src/locales/en.ts @@ -12,6 +12,12 @@ export default { pt: "Portuguese", }, common: { + notifications: { + inbox: "Inbox", + archive: "Archive", + archive_all: "Archive all", + no_notifications: "No new notifications", + }, actions: { save: "Save", edit: "Edit", From ec3182e691c26b6b244109c21dba1a6401d8024a Mon Sep 17 00:00:00 2001 From: Languine Bot Date: Mon, 10 Feb 2025 15:27:50 +0000 Subject: [PATCH 3/3] chore: (i18n) update translations using Languine.ai --- apps/app/languine.lock | 4 ++++ apps/app/src/locales/es.ts | 6 ++++++ apps/app/src/locales/fr.ts | 6 ++++++ apps/app/src/locales/no.ts | 6 ++++++ apps/app/src/locales/pt.ts | 6 ++++++ 5 files changed, 28 insertions(+) diff --git a/apps/app/languine.lock b/apps/app/languine.lock index 692e9e463e..5b9b66c732 100644 --- a/apps/app/languine.lock +++ b/apps/app/languine.lock @@ -9,6 +9,10 @@ files: languages.fr: ad225f707802ba118c22987186dd38e8 languages.no: da550ca06bcacbd30b7c6ed32c864c70 languages.pt: 30e32c7c4cf434e9c75e60c14c442541 + common.notifications.inbox: 3882d32c66e7e768145ecd8f104b0c08 + common.notifications.archive: e727b00944f81e1d0a95c12886ac4641 + common.notifications.archive_all: 449e2fbab2a05e2f9f3cc1717f58eee0 + common.notifications.no_notifications: bb76b111a28211312083c68b2efabae7 common.actions.save: c9cc8cce247e49bae79f15173ce97354 common.actions.edit: 7dce122004969d56ae2e0245cb754d35 common.actions.delete: f2a6c498fb90ee345d997f888fce3b18 diff --git a/apps/app/src/locales/es.ts b/apps/app/src/locales/es.ts index a52f3dca21..681a41230c 100644 --- a/apps/app/src/locales/es.ts +++ b/apps/app/src/locales/es.ts @@ -136,6 +136,12 @@ export default { uploading_files: "Subiendo {target}...", remove_file: "Eliminar archivo" } + }, + notifications: { + inbox: "Bandeja de entrada", + archive: "Archivo", + archive_all: "Archivar todo", + no_notifications: "No hay nuevas notificaciones" } }, header: { diff --git a/apps/app/src/locales/fr.ts b/apps/app/src/locales/fr.ts index 0b9ffbc967..41a6add479 100644 --- a/apps/app/src/locales/fr.ts +++ b/apps/app/src/locales/fr.ts @@ -136,6 +136,12 @@ export default { uploading_files: "Téléchargement de {target}...", remove_file: "Supprimer le fichier" } + }, + notifications: { + inbox: "Boîte de réception", + archive: "Archive", + archive_all: "Archiver tout", + no_notifications: "Aucune nouvelle notification" } }, header: { diff --git a/apps/app/src/locales/no.ts b/apps/app/src/locales/no.ts index 43f0677812..c781c98700 100644 --- a/apps/app/src/locales/no.ts +++ b/apps/app/src/locales/no.ts @@ -136,6 +136,12 @@ export default { uploading_files: "Laster opp {target}...", remove_file: "Fjern fil" } + }, + notifications: { + inbox: "Innboks", + archive: "Arkiv", + archive_all: "Arkiver alt", + no_notifications: "Ingen nye varsler" } }, header: { diff --git a/apps/app/src/locales/pt.ts b/apps/app/src/locales/pt.ts index ffc617ec94..a2bd0dcb51 100644 --- a/apps/app/src/locales/pt.ts +++ b/apps/app/src/locales/pt.ts @@ -136,6 +136,12 @@ export default { uploading_files: "Carregando {target}...", remove_file: "Remover arquivo" } + }, + notifications: { + inbox: "Caixa de entrada", + archive: "Arquivo", + archive_all: "Arquivar tudo", + no_notifications: "Sem novas notificações" } }, header: {