From 736f1a20158e16095f60594ea549849733a2d86a Mon Sep 17 00:00:00 2001 From: Gildas Garcia <1122076+djhi@users.noreply.github.com> Date: Wed, 28 Jun 2023 15:54:57 +0200 Subject: [PATCH 01/20] Introduce CheckForApplicationUpdate --- .../src/util/CheckForApplicationUpdate.tsx | 33 ++++++++++ packages/ra-core/src/util/index.ts | 2 + .../src/util/useCheckForApplicationUpdate.ts | 65 +++++++++++++++++++ packages/ra-language-english/src/index.ts | 2 + packages/ra-language-french/src/index.ts | 2 + .../layout/ApplicationUpdatedNotification.tsx | 45 +++++++++++++ .../ra-ui-materialui/src/layout/Layout.tsx | 6 +- packages/ra-ui-materialui/src/layout/index.ts | 1 + 8 files changed, 155 insertions(+), 1 deletion(-) create mode 100644 packages/ra-core/src/util/CheckForApplicationUpdate.tsx create mode 100644 packages/ra-core/src/util/useCheckForApplicationUpdate.ts create mode 100644 packages/ra-ui-materialui/src/layout/ApplicationUpdatedNotification.tsx diff --git a/packages/ra-core/src/util/CheckForApplicationUpdate.tsx b/packages/ra-core/src/util/CheckForApplicationUpdate.tsx new file mode 100644 index 00000000000..6a9865faa66 --- /dev/null +++ b/packages/ra-core/src/util/CheckForApplicationUpdate.tsx @@ -0,0 +1,33 @@ +import { ReactElement } from 'react'; +import { useNotify } from '../notification'; +import { + UseCheckForApplicationUpdateOptions, + useCheckForApplicationUpdate, +} from './useCheckForApplicationUpdate'; + +export const CheckForApplicationUpdate = ( + props: CheckForApplicationUpdateProps +) => { + const { updateMode, notification, ...rest } = props; + const notify = useNotify(); + + const onNewVersionAvailable = () => { + if (updateMode === 'immediate') { + window.location.reload(); + } else { + notify(notification, { + type: 'info', + autoHideDuration: 0, + }); + } + }; + + useCheckForApplicationUpdate({ onNewVersionAvailable, ...rest }); + return null; +}; + +export interface CheckForApplicationUpdateProps + extends Partial { + notification?: string | ReactElement; + updateMode: 'immediate' | 'manual'; +} diff --git a/packages/ra-core/src/util/index.ts b/packages/ra-core/src/util/index.ts index 782e9ec1ff6..f9a9231a962 100644 --- a/packages/ra-core/src/util/index.ts +++ b/packages/ra-core/src/util/index.ts @@ -31,3 +31,5 @@ export * from './shallowEqual'; export * from './LabelPrefixContext'; export * from './LabelPrefixContextProvider'; export * from './useLabelPrefix'; +export * from './CheckForApplicationUpdate'; +export * from './useCheckForApplicationUpdate'; diff --git a/packages/ra-core/src/util/useCheckForApplicationUpdate.ts b/packages/ra-core/src/util/useCheckForApplicationUpdate.ts new file mode 100644 index 00000000000..92ec9ab7f71 --- /dev/null +++ b/packages/ra-core/src/util/useCheckForApplicationUpdate.ts @@ -0,0 +1,65 @@ +import { useEffect, useRef } from 'react'; +import { useEvent } from './useEvent'; + +/** + * A hook that checks if the application code has changed and call the provided onNewVersionAvailable function when needed. + * It checks for code update by downloading the provided URL (default to the HTML page) and + * comparing the hash of the response with the hash of the current page. + * + * @param {UseCheckForApplicationUpdateOptions} options The options + * @param {string} options.onNewVersionAvailable The function to call when a new version of the application is available. + * @param {string} options.url Optional. The URL to download to check for code update. Defaults to the HTML page. + * @param {number} options.checkInterval Optional. The interval in milliseconds between two checks. Defaults to 3600000 (1 hour). + */ +export const useCheckForApplicationUpdate = ( + options: UseCheckForApplicationUpdateOptions +) => { + const { + url = window.location.href, + checkInterval = ONE_HOUR, + onNewVersionAvailable, + } = options; + const currentHash = useRef(); + const onCodeHasChanged = useEvent(onNewVersionAvailable); + + useEffect(() => { + getHashForUrl(url).then(hash => { + currentHash.current = hash; + }); + }, [url]); + + useEffect(() => { + const interval = setInterval(() => { + getHashForUrl(url).then(hash => { + if (currentHash.current !== hash) { + onCodeHasChanged(); + } + }); + }, checkInterval); + return () => clearInterval(interval); + }, [checkInterval, onCodeHasChanged, url]); +}; + +const getHashForUrl = async (url: string) => { + const response = await fetch(url); + const text = await response.text(); + return hash(text); +}; + +const hash = (value: string) => { + return value + .split('') + .reduce(function (a, b) { + a = (a << 5) - a + b.charCodeAt(0); + return a & a; + }, 0) + .toString(); +}; + +const ONE_HOUR = 1000 * 60 * 60; + +export interface UseCheckForApplicationUpdateOptions { + onNewVersionAvailable: () => void; + checkInterval?: number; + url?: string; +} diff --git a/packages/ra-language-english/src/index.ts b/packages/ra-language-english/src/index.ts index 94d2199b2d5..27b2d2e47fb 100644 --- a/packages/ra-language-english/src/index.ts +++ b/packages/ra-language-english/src/index.ts @@ -40,6 +40,7 @@ const englishMessages: TranslationMessages = { open: 'Open', toggle_theme: 'Toggle Theme', select_columns: 'Columns', + update_application: 'Update Application', }, boolean: { true: 'Yes', @@ -158,6 +159,7 @@ const englishMessages: TranslationMessages = { canceled: 'Action cancelled', logged_out: 'Your session has ended, please reconnect.', not_authorized: "You're not authorized to access this resource.", + application_update_available: 'A new version is available.', }, validation: { required: 'Required', diff --git a/packages/ra-language-french/src/index.ts b/packages/ra-language-french/src/index.ts index 5704fafcfce..fb21c7c7185 100644 --- a/packages/ra-language-french/src/index.ts +++ b/packages/ra-language-french/src/index.ts @@ -41,6 +41,7 @@ const frenchMessages: TranslationMessages = { open: 'Ouvrir', toggle_theme: 'Thème clair/sombre', select_columns: 'Colonnes', + update_application: "Mettre à jour l'application", }, boolean: { true: 'Oui', @@ -165,6 +166,7 @@ const frenchMessages: TranslationMessages = { logged_out: 'Votre session a pris fin, veuillez vous reconnecter.', not_authorized: "Vous n'êtes pas autorisé(e) à accéder à cette ressource.", + application_update_available: 'Une mise à jour est disponible.', }, validation: { required: 'Ce champ est requis', diff --git a/packages/ra-ui-materialui/src/layout/ApplicationUpdatedNotification.tsx b/packages/ra-ui-materialui/src/layout/ApplicationUpdatedNotification.tsx new file mode 100644 index 00000000000..f91cb50ad18 --- /dev/null +++ b/packages/ra-ui-materialui/src/layout/ApplicationUpdatedNotification.tsx @@ -0,0 +1,45 @@ +import * as React from 'react'; +import { Alert, AlertProps, Button, ButtonProps } from '@mui/material'; +import { useTranslate } from 'ra-core'; + +export const ApplicationUpdatedNotification = React.forwardRef< + HTMLDivElement, + ApplicationUpdatedNotificationProps +>((props, ref) => { + const { + ButtonProps, + updateText = 'ra.action.update_application', + notificationText = 'ra.notification.application_update_available', + ...alertProps + } = props; + const translate = useTranslate(); + + const handleButtonClick = () => { + window.location.reload(); + }; + return ( + + {translate(updateText, { _: updateText })} + + } + {...alertProps} + > + {translate(notificationText, { _: notificationText })} + + ); +}); + +export interface ApplicationUpdatedNotificationProps extends AlertProps { + ButtonProps?: ButtonProps; + notificationText?: string; + updateText?: string; +} diff --git a/packages/ra-ui-materialui/src/layout/Layout.tsx b/packages/ra-ui-materialui/src/layout/Layout.tsx index 59a5495359c..51bedc72bb4 100644 --- a/packages/ra-ui-materialui/src/layout/Layout.tsx +++ b/packages/ra-ui-materialui/src/layout/Layout.tsx @@ -7,7 +7,7 @@ import React, { import { ErrorBoundary } from 'react-error-boundary'; import clsx from 'clsx'; import { styled, SxProps } from '@mui/material/styles'; -import { CoreLayoutProps } from 'ra-core'; +import { CoreLayoutProps, CheckForApplicationUpdate } from 'ra-core'; import { AppBar as DefaultAppBar, AppBarProps } from './AppBar'; import { Sidebar as DefaultSidebar, SidebarProps } from './Sidebar'; @@ -16,6 +16,7 @@ import { Error, ErrorProps } from './Error'; import { SkipNavigationButton } from '../button'; import { useSidebarState } from './useSidebarState'; import { Inspector } from '../preferences'; +import { ApplicationUpdatedNotification } from '..'; export const Layout = (props: LayoutProps) => { const { @@ -65,6 +66,9 @@ export const Layout = (props: LayoutProps) => { + } + /> ); diff --git a/packages/ra-ui-materialui/src/layout/index.ts b/packages/ra-ui-materialui/src/layout/index.ts index 14daa147cca..0f68c3c2e25 100644 --- a/packages/ra-ui-materialui/src/layout/index.ts +++ b/packages/ra-ui-materialui/src/layout/index.ts @@ -1,4 +1,5 @@ export * from './AppBar'; +export * from './ApplicationUpdatedNotification'; export * from './CardContentInner'; export * from './Confirm'; export * from './DashboardMenuItem'; From d9a95cda05584fc69d13fdac2f1731ba2e083737 Mon Sep 17 00:00:00 2001 From: Gildas Garcia <1122076+djhi@users.noreply.github.com> Date: Wed, 28 Jun 2023 15:59:48 +0200 Subject: [PATCH 02/20] Fix build --- packages/ra-core/src/util/CheckForApplicationUpdate.tsx | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/packages/ra-core/src/util/CheckForApplicationUpdate.tsx b/packages/ra-core/src/util/CheckForApplicationUpdate.tsx index 6a9865faa66..f7ee464a04b 100644 --- a/packages/ra-core/src/util/CheckForApplicationUpdate.tsx +++ b/packages/ra-core/src/util/CheckForApplicationUpdate.tsx @@ -8,7 +8,7 @@ import { export const CheckForApplicationUpdate = ( props: CheckForApplicationUpdateProps ) => { - const { updateMode, notification, ...rest } = props; + const { updateMode = 'manual', notification, ...rest } = props; const notify = useNotify(); const onNewVersionAvailable = () => { @@ -29,5 +29,5 @@ export const CheckForApplicationUpdate = ( export interface CheckForApplicationUpdateProps extends Partial { notification?: string | ReactElement; - updateMode: 'immediate' | 'manual'; + updateMode?: 'immediate' | 'manual'; } From 568c4f180056e7c4d634004035431602f369f7db Mon Sep 17 00:00:00 2001 From: Gildas Garcia <1122076+djhi@users.noreply.github.com> Date: Fri, 30 Jun 2023 18:06:59 +0200 Subject: [PATCH 03/20] Introduce updateMode prop on Admin --- packages/ra-core/src/core/CoreAdminRoutes.tsx | 11 +++++++++-- packages/ra-core/src/core/CoreAdminUI.tsx | 5 ++++- packages/ra-core/src/types.ts | 2 ++ .../ra-core/src/util/CheckForApplicationUpdate.tsx | 1 - .../src/util/useCheckForApplicationUpdate.ts | 14 ++++++++++++-- packages/ra-ui-materialui/src/layout/Layout.tsx | 4 +++- 6 files changed, 30 insertions(+), 7 deletions(-) diff --git a/packages/ra-core/src/core/CoreAdminRoutes.tsx b/packages/ra-core/src/core/CoreAdminRoutes.tsx index b81b9b6dbe0..f874b86c15c 100644 --- a/packages/ra-core/src/core/CoreAdminRoutes.tsx +++ b/packages/ra-core/src/core/CoreAdminRoutes.tsx @@ -3,7 +3,7 @@ import { useState, useEffect, Children, ComponentType } from 'react'; import { Navigate, Route, Routes } from 'react-router-dom'; import { WithPermissions, useCheckAuth } from '../auth'; -import { useTimeout } from '../util'; +import { ApplicationUpdateMode, useTimeout } from '../util'; import { useScrollToTop, useCreatePath } from '../routing'; import { AdminChildren, @@ -35,6 +35,7 @@ export const CoreAdminRoutes = (props: CoreAdminRoutesProps) => { requireAuth, ready: Ready, title, + updateMode, } = props; const [canRender, setCanRender] = useState(!requireAuth); @@ -77,7 +78,12 @@ export const CoreAdminRoutes = (props: CoreAdminRoutesProps) => { path="/*" element={
- + {customRoutesWithLayout} {Children.map(resources, resource => ( @@ -126,6 +132,7 @@ export interface CoreAdminRoutesProps extends CoreLayoutProps { loading: LoadingComponent; requireAuth?: boolean; ready?: ComponentType; + updateMode?: ApplicationUpdateMode; } const defaultAuthParams = { params: { route: 'dashboard' } }; diff --git a/packages/ra-core/src/core/CoreAdminUI.tsx b/packages/ra-core/src/core/CoreAdminUI.tsx index 8462cf9162f..c91298787bf 100644 --- a/packages/ra-core/src/core/CoreAdminUI.tsx +++ b/packages/ra-core/src/core/CoreAdminUI.tsx @@ -3,7 +3,7 @@ import { ComponentType, useEffect, isValidElement, createElement } from 'react'; import { Routes, Route } from 'react-router-dom'; import { CoreAdminRoutes } from './CoreAdminRoutes'; -import { Ready } from '../util'; +import { ApplicationUpdateMode, Ready } from '../util'; import { TitleComponent, LoginComponent, @@ -35,6 +35,7 @@ export interface CoreAdminUIProps { requireAuth?: boolean; ready?: ComponentType; title?: TitleComponent; + updateMode?: ApplicationUpdateMode; } export const CoreAdminUI = (props: CoreAdminUIProps) => { @@ -51,6 +52,7 @@ export const CoreAdminUI = (props: CoreAdminUIProps) => { ready = Ready, title = 'React Admin', requireAuth = false, + updateMode, } = props; useEffect(() => { @@ -92,6 +94,7 @@ export const CoreAdminUI = (props: CoreAdminUIProps) => { requireAuth={requireAuth} ready={ready} title={title} + updateMode={updateMode} > {children} diff --git a/packages/ra-core/src/types.ts b/packages/ra-core/src/types.ts index ba366c09641..4217a76b4ab 100644 --- a/packages/ra-core/src/types.ts +++ b/packages/ra-core/src/types.ts @@ -1,6 +1,7 @@ import { ComponentType, ReactElement, ReactNode } from 'react'; import { WithPermissionsChildrenParams } from './auth/WithPermissions'; import { AuthActionType } from './auth/types'; +import { ApplicationUpdateMode } from './util'; /** * data types @@ -322,6 +323,7 @@ export interface CoreLayoutProps { hasDashboard?: boolean; }>; title?: TitleComponent; + updateMode?: ApplicationUpdateMode; } export type LayoutComponent = ComponentType; diff --git a/packages/ra-core/src/util/CheckForApplicationUpdate.tsx b/packages/ra-core/src/util/CheckForApplicationUpdate.tsx index f7ee464a04b..5f3f5001b92 100644 --- a/packages/ra-core/src/util/CheckForApplicationUpdate.tsx +++ b/packages/ra-core/src/util/CheckForApplicationUpdate.tsx @@ -29,5 +29,4 @@ export const CheckForApplicationUpdate = ( export interface CheckForApplicationUpdateProps extends Partial { notification?: string | ReactElement; - updateMode?: 'immediate' | 'manual'; } diff --git a/packages/ra-core/src/util/useCheckForApplicationUpdate.ts b/packages/ra-core/src/util/useCheckForApplicationUpdate.ts index 92ec9ab7f71..5999569dd9f 100644 --- a/packages/ra-core/src/util/useCheckForApplicationUpdate.ts +++ b/packages/ra-core/src/util/useCheckForApplicationUpdate.ts @@ -18,17 +18,24 @@ export const useCheckForApplicationUpdate = ( url = window.location.href, checkInterval = ONE_HOUR, onNewVersionAvailable, + updateMode = process.env.NODE_ENV === 'production' + ? 'manual' + : 'disabled', } = options; const currentHash = useRef(); const onCodeHasChanged = useEvent(onNewVersionAvailable); useEffect(() => { + if (updateMode === 'disabled') return; + getHashForUrl(url).then(hash => { currentHash.current = hash; }); - }, [url]); + }, [updateMode, url]); useEffect(() => { + if (updateMode === 'disabled') return; + const interval = setInterval(() => { getHashForUrl(url).then(hash => { if (currentHash.current !== hash) { @@ -37,7 +44,7 @@ export const useCheckForApplicationUpdate = ( }); }, checkInterval); return () => clearInterval(interval); - }, [checkInterval, onCodeHasChanged, url]); + }, [checkInterval, onCodeHasChanged, updateMode, url]); }; const getHashForUrl = async (url: string) => { @@ -62,4 +69,7 @@ export interface UseCheckForApplicationUpdateOptions { onNewVersionAvailable: () => void; checkInterval?: number; url?: string; + updateMode?: ApplicationUpdateMode; } + +export type ApplicationUpdateMode = 'disabled' | 'immediate' | 'manual'; diff --git a/packages/ra-ui-materialui/src/layout/Layout.tsx b/packages/ra-ui-materialui/src/layout/Layout.tsx index 51bedc72bb4..a5660036576 100644 --- a/packages/ra-ui-materialui/src/layout/Layout.tsx +++ b/packages/ra-ui-materialui/src/layout/Layout.tsx @@ -16,7 +16,7 @@ import { Error, ErrorProps } from './Error'; import { SkipNavigationButton } from '../button'; import { useSidebarState } from './useSidebarState'; import { Inspector } from '../preferences'; -import { ApplicationUpdatedNotification } from '..'; +import { ApplicationUpdatedNotification } from './ApplicationUpdatedNotification'; export const Layout = (props: LayoutProps) => { const { @@ -29,6 +29,7 @@ export const Layout = (props: LayoutProps) => { menu: Menu = DefaultMenu, sidebar: Sidebar = DefaultSidebar, title, + updateMode, ...rest } = props; @@ -67,6 +68,7 @@ export const Layout = (props: LayoutProps) => { } />
From 9b25ceead9ab1071e54c44bc8226c9543bce4210 Mon Sep 17 00:00:00 2001 From: Gildas Garcia <1122076+djhi@users.noreply.github.com> Date: Mon, 3 Jul 2023 15:30:57 +0200 Subject: [PATCH 04/20] Disable update check on localhost --- .../ra-core/src/util/useCheckForApplicationUpdate.ts | 10 +++++++--- 1 file changed, 7 insertions(+), 3 deletions(-) diff --git a/packages/ra-core/src/util/useCheckForApplicationUpdate.ts b/packages/ra-core/src/util/useCheckForApplicationUpdate.ts index 5999569dd9f..500dfe323f3 100644 --- a/packages/ra-core/src/util/useCheckForApplicationUpdate.ts +++ b/packages/ra-core/src/util/useCheckForApplicationUpdate.ts @@ -14,13 +14,17 @@ import { useEvent } from './useEvent'; export const useCheckForApplicationUpdate = ( options: UseCheckForApplicationUpdateOptions ) => { + const shouldDisable = + process.env.NODE_ENV !== 'production' || + // Some automation tools may trigger security warnings when the app tries to download itself + // so we disable the feature when running on localhost to still allow production builds to be tested locally + window.location.hostname === 'localhost'; + const { url = window.location.href, checkInterval = ONE_HOUR, onNewVersionAvailable, - updateMode = process.env.NODE_ENV === 'production' - ? 'manual' - : 'disabled', + updateMode = shouldDisable ? 'disabled' : 'manual', } = options; const currentHash = useRef(); const onCodeHasChanged = useEvent(onNewVersionAvailable); From f8dcee5402dd90c280e98f57c56f29a5f1e5c2b5 Mon Sep 17 00:00:00 2001 From: Gildas Garcia <1122076+djhi@users.noreply.github.com> Date: Tue, 4 Jul 2023 15:46:44 +0200 Subject: [PATCH 05/20] Refactor for opt in usage and simplify API --- packages/ra-core/src/core/CoreAdminRoutes.tsx | 11 +- packages/ra-core/src/core/CoreAdminUI.tsx | 5 +- packages/ra-core/src/types.ts | 2 - .../src/util/CheckForApplicationUpdate.tsx | 32 ------ packages/ra-core/src/util/index.ts | 1 - .../src/util/useCheckForApplicationUpdate.ts | 21 ++-- .../src/layout/CheckForApplicationUpdate.tsx | 100 ++++++++++++++++++ .../ra-ui-materialui/src/layout/Layout.tsx | 8 +- packages/ra-ui-materialui/src/layout/index.ts | 1 + 9 files changed, 112 insertions(+), 69 deletions(-) delete mode 100644 packages/ra-core/src/util/CheckForApplicationUpdate.tsx create mode 100644 packages/ra-ui-materialui/src/layout/CheckForApplicationUpdate.tsx diff --git a/packages/ra-core/src/core/CoreAdminRoutes.tsx b/packages/ra-core/src/core/CoreAdminRoutes.tsx index f874b86c15c..b81b9b6dbe0 100644 --- a/packages/ra-core/src/core/CoreAdminRoutes.tsx +++ b/packages/ra-core/src/core/CoreAdminRoutes.tsx @@ -3,7 +3,7 @@ import { useState, useEffect, Children, ComponentType } from 'react'; import { Navigate, Route, Routes } from 'react-router-dom'; import { WithPermissions, useCheckAuth } from '../auth'; -import { ApplicationUpdateMode, useTimeout } from '../util'; +import { useTimeout } from '../util'; import { useScrollToTop, useCreatePath } from '../routing'; import { AdminChildren, @@ -35,7 +35,6 @@ export const CoreAdminRoutes = (props: CoreAdminRoutesProps) => { requireAuth, ready: Ready, title, - updateMode, } = props; const [canRender, setCanRender] = useState(!requireAuth); @@ -78,12 +77,7 @@ export const CoreAdminRoutes = (props: CoreAdminRoutesProps) => { path="/*" element={
- + {customRoutesWithLayout} {Children.map(resources, resource => ( @@ -132,7 +126,6 @@ export interface CoreAdminRoutesProps extends CoreLayoutProps { loading: LoadingComponent; requireAuth?: boolean; ready?: ComponentType; - updateMode?: ApplicationUpdateMode; } const defaultAuthParams = { params: { route: 'dashboard' } }; diff --git a/packages/ra-core/src/core/CoreAdminUI.tsx b/packages/ra-core/src/core/CoreAdminUI.tsx index c91298787bf..8462cf9162f 100644 --- a/packages/ra-core/src/core/CoreAdminUI.tsx +++ b/packages/ra-core/src/core/CoreAdminUI.tsx @@ -3,7 +3,7 @@ import { ComponentType, useEffect, isValidElement, createElement } from 'react'; import { Routes, Route } from 'react-router-dom'; import { CoreAdminRoutes } from './CoreAdminRoutes'; -import { ApplicationUpdateMode, Ready } from '../util'; +import { Ready } from '../util'; import { TitleComponent, LoginComponent, @@ -35,7 +35,6 @@ export interface CoreAdminUIProps { requireAuth?: boolean; ready?: ComponentType; title?: TitleComponent; - updateMode?: ApplicationUpdateMode; } export const CoreAdminUI = (props: CoreAdminUIProps) => { @@ -52,7 +51,6 @@ export const CoreAdminUI = (props: CoreAdminUIProps) => { ready = Ready, title = 'React Admin', requireAuth = false, - updateMode, } = props; useEffect(() => { @@ -94,7 +92,6 @@ export const CoreAdminUI = (props: CoreAdminUIProps) => { requireAuth={requireAuth} ready={ready} title={title} - updateMode={updateMode} > {children} diff --git a/packages/ra-core/src/types.ts b/packages/ra-core/src/types.ts index 4217a76b4ab..ba366c09641 100644 --- a/packages/ra-core/src/types.ts +++ b/packages/ra-core/src/types.ts @@ -1,7 +1,6 @@ import { ComponentType, ReactElement, ReactNode } from 'react'; import { WithPermissionsChildrenParams } from './auth/WithPermissions'; import { AuthActionType } from './auth/types'; -import { ApplicationUpdateMode } from './util'; /** * data types @@ -323,7 +322,6 @@ export interface CoreLayoutProps { hasDashboard?: boolean; }>; title?: TitleComponent; - updateMode?: ApplicationUpdateMode; } export type LayoutComponent = ComponentType; diff --git a/packages/ra-core/src/util/CheckForApplicationUpdate.tsx b/packages/ra-core/src/util/CheckForApplicationUpdate.tsx deleted file mode 100644 index 5f3f5001b92..00000000000 --- a/packages/ra-core/src/util/CheckForApplicationUpdate.tsx +++ /dev/null @@ -1,32 +0,0 @@ -import { ReactElement } from 'react'; -import { useNotify } from '../notification'; -import { - UseCheckForApplicationUpdateOptions, - useCheckForApplicationUpdate, -} from './useCheckForApplicationUpdate'; - -export const CheckForApplicationUpdate = ( - props: CheckForApplicationUpdateProps -) => { - const { updateMode = 'manual', notification, ...rest } = props; - const notify = useNotify(); - - const onNewVersionAvailable = () => { - if (updateMode === 'immediate') { - window.location.reload(); - } else { - notify(notification, { - type: 'info', - autoHideDuration: 0, - }); - } - }; - - useCheckForApplicationUpdate({ onNewVersionAvailable, ...rest }); - return null; -}; - -export interface CheckForApplicationUpdateProps - extends Partial { - notification?: string | ReactElement; -} diff --git a/packages/ra-core/src/util/index.ts b/packages/ra-core/src/util/index.ts index f9a9231a962..c3aa327aeec 100644 --- a/packages/ra-core/src/util/index.ts +++ b/packages/ra-core/src/util/index.ts @@ -31,5 +31,4 @@ export * from './shallowEqual'; export * from './LabelPrefixContext'; export * from './LabelPrefixContextProvider'; export * from './useLabelPrefix'; -export * from './CheckForApplicationUpdate'; export * from './useCheckForApplicationUpdate'; diff --git a/packages/ra-core/src/util/useCheckForApplicationUpdate.ts b/packages/ra-core/src/util/useCheckForApplicationUpdate.ts index 500dfe323f3..036648bad27 100644 --- a/packages/ra-core/src/util/useCheckForApplicationUpdate.ts +++ b/packages/ra-core/src/util/useCheckForApplicationUpdate.ts @@ -10,35 +10,30 @@ import { useEvent } from './useEvent'; * @param {string} options.onNewVersionAvailable The function to call when a new version of the application is available. * @param {string} options.url Optional. The URL to download to check for code update. Defaults to the HTML page. * @param {number} options.checkInterval Optional. The interval in milliseconds between two checks. Defaults to 3600000 (1 hour). + * @param {boolean} options.disabled Optional. Whether the check should be disabled. Defaults to false. */ export const useCheckForApplicationUpdate = ( options: UseCheckForApplicationUpdateOptions ) => { - const shouldDisable = - process.env.NODE_ENV !== 'production' || - // Some automation tools may trigger security warnings when the app tries to download itself - // so we disable the feature when running on localhost to still allow production builds to be tested locally - window.location.hostname === 'localhost'; - const { url = window.location.href, checkInterval = ONE_HOUR, onNewVersionAvailable, - updateMode = shouldDisable ? 'disabled' : 'manual', + disabled, } = options; const currentHash = useRef(); const onCodeHasChanged = useEvent(onNewVersionAvailable); useEffect(() => { - if (updateMode === 'disabled') return; + if (disabled) return; getHashForUrl(url).then(hash => { currentHash.current = hash; }); - }, [updateMode, url]); + }, [disabled, url]); useEffect(() => { - if (updateMode === 'disabled') return; + if (disabled) return; const interval = setInterval(() => { getHashForUrl(url).then(hash => { @@ -48,7 +43,7 @@ export const useCheckForApplicationUpdate = ( }); }, checkInterval); return () => clearInterval(interval); - }, [checkInterval, onCodeHasChanged, updateMode, url]); + }, [checkInterval, onCodeHasChanged, disabled, url]); }; const getHashForUrl = async (url: string) => { @@ -73,7 +68,5 @@ export interface UseCheckForApplicationUpdateOptions { onNewVersionAvailable: () => void; checkInterval?: number; url?: string; - updateMode?: ApplicationUpdateMode; + disabled?: boolean; } - -export type ApplicationUpdateMode = 'disabled' | 'immediate' | 'manual'; diff --git a/packages/ra-ui-materialui/src/layout/CheckForApplicationUpdate.tsx b/packages/ra-ui-materialui/src/layout/CheckForApplicationUpdate.tsx new file mode 100644 index 00000000000..6b00ea07fb8 --- /dev/null +++ b/packages/ra-ui-materialui/src/layout/CheckForApplicationUpdate.tsx @@ -0,0 +1,100 @@ +import * as React from 'react'; +import { ReactElement } from 'react'; +import { + useNotify, + UseCheckForApplicationUpdateOptions, + useCheckForApplicationUpdate, +} from 'ra-core'; +import { ApplicationUpdatedNotification } from '..'; + +/** + * A component which checks for a new version of the application and can display a notification asking users to reload the page. + * + * @param {CheckForApplicationUpdateProps} props + * @param {boolean} options.disabled Optional. Whether the check should be disabled. Defaults to false. + * @param {string|ReactElement} props.notification The notification to display to the user. Displayed only if `updateMode` is manual. Defaults to ``. + * @param {string} options.url Optional. The URL to download to check for code update. Defaults to the current URL. + * @param {number} options.checkInterval Optional. The interval in milliseconds between two checks. Defaults to 3600000 (1 hour). + * + * @example Basic usage + * import { Admin, Resource, Layout, CheckForApplicationUpdate, ListGuesser } from 'react-admin'; + * + * const MyLayout = ({ children, ...props }) => ( + * + * {children} + * + * + * ); + * + * const App = () => ( + * + * + * + * ); + * + * @example Custom notification + * import { forwardRef } from 'react'; + * import { Admin, Resource, Layout, CheckForApplicationUpdate, ListGuesser } from 'react-admin'; + * + * const CustomAppUpdatedNotification = forwardRef((props, ref) => ( + * window.location.reload()} + * > + * Update + * + * } + * > + * A new version of the application is available. Please update. + * + * )); + * + * const MyLayout = ({ children, ...props }) => ( + * + * {children} + * } /> + * + * ); + * + * const App = () => ( + * + * + * + * ); + */ +export const CheckForApplicationUpdate = ( + props: CheckForApplicationUpdateProps +) => { + const { + updateMode = 'manual', + notification = DEFAULT_NOTIFICATION, + ...rest + } = props; + const notify = useNotify(); + + const onNewVersionAvailable = () => { + if (updateMode === 'immediate') { + window.location.reload(); + } else { + notify(notification, { + type: 'info', + autoHideDuration: 0, + }); + } + }; + + useCheckForApplicationUpdate({ onNewVersionAvailable, ...rest }); + return null; +}; + +export interface CheckForApplicationUpdateProps + extends Omit { + notification?: ReactElement; +} + +const DEFAULT_NOTIFICATION = ; diff --git a/packages/ra-ui-materialui/src/layout/Layout.tsx b/packages/ra-ui-materialui/src/layout/Layout.tsx index a5660036576..59a5495359c 100644 --- a/packages/ra-ui-materialui/src/layout/Layout.tsx +++ b/packages/ra-ui-materialui/src/layout/Layout.tsx @@ -7,7 +7,7 @@ import React, { import { ErrorBoundary } from 'react-error-boundary'; import clsx from 'clsx'; import { styled, SxProps } from '@mui/material/styles'; -import { CoreLayoutProps, CheckForApplicationUpdate } from 'ra-core'; +import { CoreLayoutProps } from 'ra-core'; import { AppBar as DefaultAppBar, AppBarProps } from './AppBar'; import { Sidebar as DefaultSidebar, SidebarProps } from './Sidebar'; @@ -16,7 +16,6 @@ import { Error, ErrorProps } from './Error'; import { SkipNavigationButton } from '../button'; import { useSidebarState } from './useSidebarState'; import { Inspector } from '../preferences'; -import { ApplicationUpdatedNotification } from './ApplicationUpdatedNotification'; export const Layout = (props: LayoutProps) => { const { @@ -29,7 +28,6 @@ export const Layout = (props: LayoutProps) => { menu: Menu = DefaultMenu, sidebar: Sidebar = DefaultSidebar, title, - updateMode, ...rest } = props; @@ -67,10 +65,6 @@ export const Layout = (props: LayoutProps) => {
- } - /> ); diff --git a/packages/ra-ui-materialui/src/layout/index.ts b/packages/ra-ui-materialui/src/layout/index.ts index 0f68c3c2e25..69559f9f5ad 100644 --- a/packages/ra-ui-materialui/src/layout/index.ts +++ b/packages/ra-ui-materialui/src/layout/index.ts @@ -1,6 +1,7 @@ export * from './AppBar'; export * from './ApplicationUpdatedNotification'; export * from './CardContentInner'; +export * from './CheckForApplicationUpdate'; export * from './Confirm'; export * from './DashboardMenuItem'; export * from './DeviceTestWrapper'; From 4e9cc04c8e19c03631e2db5d52331576320324fc Mon Sep 17 00:00:00 2001 From: Gildas Garcia <1122076+djhi@users.noreply.github.com> Date: Tue, 4 Jul 2023 15:46:50 +0200 Subject: [PATCH 06/20] Documentation --- docs/CheckForApplicationUpdate.md | 142 +++++++++++++++++++++++++ docs/img/CheckForApplicationUpdate.png | Bin 0 -> 124517 bytes docs/useCheckForApplicationUpdate.md | 122 +++++++++++++++++++++ 3 files changed, 264 insertions(+) create mode 100644 docs/CheckForApplicationUpdate.md create mode 100644 docs/img/CheckForApplicationUpdate.png create mode 100644 docs/useCheckForApplicationUpdate.md diff --git a/docs/CheckForApplicationUpdate.md b/docs/CheckForApplicationUpdate.md new file mode 100644 index 00000000000..1ad53220e7c --- /dev/null +++ b/docs/CheckForApplicationUpdate.md @@ -0,0 +1,142 @@ +--- +layout: default +title: "The CheckForApplicationUpdate component" +--- + +# `CheckForApplicationUpdate` + +This component regularly checks whether the application source code has changed and prompt users to reload the page when an update is available. To detect updates, it fetches the current URL at regular intervals and compares a hash of the response content. + +It leverages the [`useCheckForApplicationUpdate`](./useCheckForApplicationUpdate.md) hook. + +![CheckForApplicationUpdate](./img/CheckForApplicationUpdate.png) + +## Usage + +Include this component in a custom layout: + +```tsx +// in src/MyLayout.tsx +import { CheckForApplicationUpdate, Layout, LayoutProps } from 'react-admin'; + +export const MyLayout = ({ children, ...props }: LayoutProps) => ( + + + +); + +// in src/App.tsx +import { Admin, ListGuesser, Resource } from 'react-admin'; +import { MyLayout } from './MyLayout'; + +export const App = () => ( + + + +); +``` + +## Props + +`` accepts the following props: + +| Prop | Required | Type | Default | Description | +| --------------- | -------- | -------- | ------------------ |-------------------------------------------------------------------- | +| `checkInterval` | Optional | number | `3600000` (1 hour) | The interval in milliseconds between two checks | +| `disabled` | Optional | boolean | `true` | Whether the automatic check is enabled | +| `notification` | Optional | string | | The notification to display to the user when an update is available | +| `url` | Optional | string | current URL | The URL to download to check for code update | + +## `checkInterval` + +You can customize the interval of time between each application update check by providing the `checkInterval` prop. It accepts a number of milliseconds and is set to `3600000` (1 hour) by default. + +```tsx +// in src/MyLayout.tsx +import { CheckForApplicationUpdate, Layout, LayoutProps } from 'react-admin'; + +const HALF_HOUR = 1800000; + +export const MyLayout = ({ children, ...props }: LayoutProps) => ( + + + +); +``` + +## `disabled` + +You can dynamically disable the automatic application update detection by providing the `disabled` prop. + +```tsx +// in src/MyLayout.tsx +import { CheckForApplicationUpdate, Layout, LayoutProps } from 'react-admin'; + +export const MyLayout = ({ children, ...props }: LayoutProps) => ( + + + +); +``` + +## `notification` + +You can customize the notification shown to users when an update is available by passing your own element to the `notification` prop. +Note that you must wrap your component with `forwardRef`. + +```tsx +// in src/MyLayout.tsx +import { forwardRef } from 'react'; +import { Layout, CheckForApplicationUpdate } from 'react-admin'; + +const CustomAppUpdatedNotification = forwardRef((props, ref) => ( + window.location.reload()} + > + Update + + } + > + A new version of the application is available. Please update. + +)); + +const MyLayout = ({ children, ...props }) => ( + + {children} + }/> + +); +``` + +If you just want to customize the notification texts, including the button, check out the [Internationalization section](#internationalization). + +## `url` + +You can customize the URL fetched to detect updates by providing the `url` prop. + +```tsx +// in src/MyLayout.tsx +import { CheckForApplicationUpdate, Layout, LayoutProps } from 'react-admin'; + +const MY_APP_ROOT_URL = 'http://admin.mycompany.com'; + +export const MyLayout = ({ children, ...props }: LayoutProps) => ( + + + +); +``` + +## Internationalization + +You can customize the texts of the default notification by overriding the following keys: + +* `ra.notification.application_update_available`: the notification text +* `ra.action.update_application`: the reload button text \ No newline at end of file diff --git a/docs/img/CheckForApplicationUpdate.png b/docs/img/CheckForApplicationUpdate.png new file mode 100644 index 0000000000000000000000000000000000000000..6528e84ead893df28890c0a9b980647076133bab GIT binary patch literal 124517 zcmaI71yq$=*EYNf>5_KSjYvu(4boCl(jd|ZQqmy;(p@6b-QB5_bazR2cm0cVp7Xq( z_y4|c42DBCcdRwnoY%bOHRldcl$S(DfucYl5OirNab*Yu9tHw|^+tjPpX7Se6ha{6 z5NUA{6(^XTB!6`x$@BAL>zjV(g$3u4WR+~54*|>bzp)7{m!UW>>BHUOKR!U;`Q|70CB%L=ZhD|2|6E|+0Xl%POF+p zv9Tbq!Vn|~3^@ee3j%&Y^>5Ka&CVTE{^x^#{yKj);e+61hV}2yOG=Qu5HvJy(c1|A zcnG-13ju=upGW@l1blp$K?rJov&bpze_!|4-v%KmFn_)LpDVpu+9)AVeS=f(9NmAv z4+4d7JS_9SS39H<{FDXh*%a*+BuPS)IJPux`;BB|_02%$>K!a}@mBcOU!*GQ9M-bY ztO-plUMA{0>oX;WZZzYpVcbDc51fDo+U_YLu(^;TqJWLR4B4}>KWOWq~Zghj4xgX2w6^BpkaQ$nw z<*_YwJYpZ3*@}W1PH-_TDU_ClP+ANhZ}x?4A!pn2*G~}sAXgWkF`s@^h2`KQHclj(U=X?7WgZ&rB!6LEA@EMifFDz7IE@#Jazsa-YM5J$>Nv$3H`OO24*V(0i-eKmu% z>DE*YgeTJy#wF549T}~CLuk*7f;ht0&i#m9I4Y$#RjR_dJ@ylKh{XPBDZ4chU!)qm zP;akliXQ%pL(}3+*Xzy^uc)JU!ixE)%U)N~AXg*>x7C;G(^wK`<{dbg|9YqXJPwjM z&0Xb{USsypUeB0ivdJ~*iI$*aHIytSjjvmzkvBE5K`UfmhGc^MsqxAb1w@}M%UJ_(>G@0N3z;V}2Y z^r089&x4fH+a!mErbeJAQ9uLx zERFT`wh+?jzRb(}A_`cot{18ou?7KE%>4&75&B)PP)5IXJpbO?xgmJXgK-a5#aDCx8SP8}~)+&8A-r7YOYrr>=bO5`p-b zaY%r`iu%%h=)wq8_WN2+2f$ZrK6BaWB#Fml=STK_1e`4|V6GZB=|#Vi zabp8NO8WI7q17!LB|BZZD0a!Mu)Ey*%6t=tI!0Oz1MN26@`8bQDlXLVnVbS&4pyv! z82x(YdtWn26g+|3(B?aFQU-3tyO(|x+>hQeIwV&f@k!G%T-%VuyTg*|$87+-QQI|=r|pZ76gFs+k^RTft`|J< zyzRSR1zfVr|L-$2blHO2Sn{+l|EuYRCh^;lgZvPSjV{r_hfur zi`z&mLL$o-u#L;bLSJ90mPuRI-QeDHeEzBh7NcO{wIOfofL6wbF!j|ahnTReoxs$+ z!9ZBHGE{eFEeUd4ODUJaE|5oOd6EGQI0xv|+Sg3*TK*N)NV{@_1kWh7$9Jf>SQSf$ zSln@F*f8*QRi4OEu{4QtCTZ`l`zi{Iq$xGYb=6!ngjIAzcZ}^<99e4JgKO{%&(p&# zjJjT_Ar@fzoJ=twQCJhakBqhW z-4xu20(J(3B?EgRYz)Z$$b84&Th>!YxUMTo^`nguY3i^V6B%%c6)fQp1u|c0o3V1H&}1 z3`1k{K__;?HPHp;S3QlTQieW8T9EGO=rbBC&GNEOj8iV zJ{shQ?RpoKq<~{U-lymLT69;AVx01cId)>(bhq8h$qpw5<8RE)(Fhlm!I3xuD6jEn zoT{Nh(E*{s7^S6E;pl%F&#&do$ozBSIK;bfrAzgN5W0vtqJJ+wDw~n?9z~oa#lD

QvK^}nXO0qd(aQ5S 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


hS7$0^kEr^olp0h~LQ& zM4y_X5k6HhycVnRq{bK|<%!Y{#gSkVHAVmIFzYfa8VSX_KWD&;sbA3@@OZgB%S0beZpYMbA-lI?G{VBf(A3dsz5}+Si^j;l4{l25tb z2zlBUnEAd}q6nj1Isv~La}zZ$9K5<*BaJ=0e~R*9SkU;(gQQsUehItkLFemeesX~V zxZ5TbtF2DT>Upk%ch%+Dum#LzjC4@pHf$|>{^Y%84%POLSjC`AVw7b;M%;Vc{@bBq z^^_KSgtmH>vT+{=CY_CFTJ7U6cq$YxKa>R)-p=48|xL0pt|zpnLqjbWShD0NzaGGx#$B z2Hg79AT=SwN9tV?Y7U~;yRa*=aeFbC8Xp|)F$ThvU_V8=`dnf7*=k)#p^|m)Di*tR z9Wgu}fr7j?v7WmEF!fc~R7FpdIx;8WeU6kH)$5x1pxYd&0#Y^xFfvkskJng(KPdWo|E2K;YdL$nJ^Is|SGWd$@XnD-AE>CxLKQFWRZ#gb`{rKF6g{x@cPkj+bjgS;3DU=n!5F#;fW9S1W^d4 z0c~;V6ftE0n~9?kv7xwm$OsLgJ0!lLU8bsQRrxM7DyI82W{SQ#uW&Rbwpx+X^%6$Y zr5J}6N!x$xr8}GazF@BP*@YVrSOfUKj(ySGuBe1=#w4@qsUE|`1^8vCwr~J-2w)iv zH^^6pA>P$ix}ZbH7Li@k%H0H31nNqoLU;GQt2s(Qqi1O8hvWSZ(GR+v$C)aik}6}T zo$y7yWE_OB>(8~(SU!l>6!%ynGu|zUG%Zo-kH?-D8%nb)g#9*xQ(sr53@C_@9_0yq z{hopJ$boI7LV{;#V6e6Y4K%X!gPc*EjlDpC5!~an zJpQ}IpkewT>xVyT7<^wqFoO!!M<~#$`ONgdNG_b({=Dd~yg)1uDidvbOX0;3Y$Q}v zAeL&F3Y`r8ca}FDG)W#h2e=Uu|^$X?i@|;yoqS zqJ~Z$A$5F=+V`+1~zU z#IJ8?=y2(WBqP4-_tsBq5STyj@OBn%p?#=*czJob2=DKWYwgzM#l)7yVGIb1{;K0Z zQL0_k!s?brBYgKp-ius{nC{6ST4B7T z4`d_Mv8^?XO`I+-aj7^}K(n?!2=$l!W3&{oJ4$q*FSt58xBvVJD*lqG#_sN?n56vr z<*p_%y!k45?-!Z`0-lDx84FA(MiUADQO=hEM7Wm!bbkIe?tuhyFFv|gnud~6X?8YU zvXHP=4rRo};c_QXC{H@~_Pzs2vZkgcFVDPEQ!G*fsB#Gjs;`e3nV1B)xPXSIo2!C{ zj}J5|@GnCQ1E`wd+Zq}gfKqxjTUF&)su39%M?gfRuB>eCu9G8?URYEV5E9bU)wQ#~ z9+9DxKlbk3yN`~~f!z(?E;BsKS7G2xoFjrl&#w2Ih1@Pma&w>ju)%Hr)zh=QybQzu z&}JyN8aG_Cx>eVC+=&d&hK7#bI8;x2tSTzf(oY(`T0u%B}A*w6t^87HdT(6 zO8Tw3dNoipR8&-yl_TrxU5$-nb;FQ+eL%}3+uz^B#l^+OrX(urwW6XT5UZ7yhv(`) z+S%HE__ndN*!c7G$lnxSIr}Dapt+5^IH`nv) z7Yb&W)4?K){|^eJBUQ%(QNd7y8nt{lbVxJbKhf~e>_mq*4nk1O9lg7|%gxPYf&Su= zcXD=qDJi*q`lVGrCpWj&{hBLT2(*{x8=T9tvO4sI9r$iRkL%|4)`73FRbT4WtK)-% zpR5h}`PX}M^*~=jfXh>}VAiPNw#Rqt>RhJBn?LUB8XITHXUECBGc(&PEVSa0 zZq|$p*4RTU=k8a?vF}H zxCEMRB!`;1dVNiein==cUu`xaq5H{6o?Ml+t*xt_H%!t{zhRy~ zf3Bl*-w)b2dwa3nE94N&utzDrR0sM}epW%r(I4TwI27YicwoBSMEE z6ck|3^nt1>DnJ!>adP_X>w9{B+(KX)4M};4YwGpps6~wPk47_V&~F$;+-E?zKiPOp z5-A%g0ZwLlSxZ+J=%qYQ4Z_~R4Oi@@SsaP=~&76O_ohrQLS43ef zF?spDW)?`f!G1r;>(}w|arsWT;FCw7s4*3ZjErQ6`DM@7n4N86 zZ!c$UZTLj0ubr@7f#fDbHReclqcvVQ9} z^7ZqZYj7T!n&M?-{MK$bLV5;Hi-zVDEE}lB;IF4=wl?3ulDwATqqTPkyuK_XlNq(_Jl$Nw_Z z1Z0%o3n-<)?&9JrlTSe-uCUM@`}^TZVum8Fm=fBLg9w^M9=0u>#_3>AOuwb^aBV*J z-GI=vcuvefLzcDF@}Z#HuwGVMvQFe}h>%WA<+mlxR4VqcGOs17e+&R-DD*j?i1$ztY-1hX}|G&{&#zjda-V!ao^XsouLjNKQ`kAiKg<{EVcj) zmGlTQm;{Ii2MfzX+@HX10uW!b$zD>it|Dr=XyRsj2Dh)oD>tQF(UWU#VO-%Bv7c&cZS`B3ow=6I&sIxa3QJ2Uh4VmT~ZJ}C`-N@+c`5C)8) zI686#wYz+P8Z4Q5ffaCbacMH*4?@!4lL9`nhVx*CRxd}#=LPeZs8ip3s}w$g7hIl1 z!2o%+JPH!ld408A{PykJ&8^Gp>*6=%S>@&IbaZr_oT|myx@1oX2{n|JMJ>Dl0>C36 z2)dl)WM%o0BW?48-ZALBS(%$ZPmse7pyubFotp!>RgE%Y5V{DA0{|Xm6wo)xSa41o zG6i-c<#)ou#ihm$V8jn<)dyW#w}V9yaq-VdNprJb5jC3JE(!G9K(E>?eF${$3bd;C zPBuqUQ&UMvNkPwmTDrgg1&leEg!Kx6w;YC4pqn^+N&bw7l+9=a&eYNkNyjn^%HHye9A?KzEwJbq?F(A8NI6U#6#}oq^UX zc$R?cnRbm0Oy}Y7@G$6HE`e@5=tk&Pm=4VjL!PM>)O=X(D0|l zd$!iD-f?#t(6E-4mW&su^6)^c;le7BhGR6k#+$yodf=&kk|bLY_%&`A(y;S(0zD^J zSG(F-&>Xi~Xu3UE`e9glp$c8xnJPE0{MvuH(v6cOF9{%N6aqR!4R-6HGMNnY^ion% zgPZnX3s;xx$u!uYHFdf*mTzZgSF63}4Tnf7;PP|*I4CG6j!8>RQ*&!)XJ>J7aBPew zLJBx9-#Ujd$OGL`beP0Ein_Y*Ll8BaY0jIe28GEFI*<>X8a^(#pZBmd-|W@zs}*WGTpSqS2W5_#>t(`h#Or$tAIw-c z3%FeFZ?3PNBO2H2UeB`y@%xO|F;`+aa&*#5@G#a4bXK8tRHxf3{2 zEjhVf5SM_iRBG;O2P5m28oso$VoK}-|9Mz7x79QU1FZ&a)b2v_JxIpZ4I`!CZng=&Ai_A02oZPk{9n3z<^qd|C3iyl}QVbAPdnnW=21 zL(r86Q&(3v4mNhMB!(Z z83Y74fFS?^v>0Q(y}f~}Ik~t@53_`W5wCw{lFaB>2{^r4^%X;_Ta~BE&px6vR6&q~ z0})e@vEUDZqkum6%IYc&Ev?7(ZnYYE34l7#=|4C)03;CL3I)=0894fwUwR&wG}P1? z<>kl2nX=dC`*Bj#Eas31Df^?9Zg5LXY;0^?oRG_j6kyv|S9>$n#eijJWf`yjim_9I z0|V)xDGZ+2e0w%ifuPaoQrXz(Zf0hts5l5(w7~oE7p)LpA;2C701z^(_FBK9zuTVh z>^JiQxpZ-Hv2)o9j4%LNiS(&ATMyn86)Qd+UN;Y>*VyjWtB}UVThQhAxILZVv>4am zYyk)yN-9uiHbP5BmklgK@b(k(CnO}KNf5oQVBm#>FFHQnl$B6-6hbYnrlLYD;9`G$ zwhKlsKn%ac$^b1@fH2@!fT)_y9=F6}fY2ZyB6^+-NrKe_FK=?cCMG84dOz!Qx~1wX z$|h-zm%{~ogyXNuE-R@8L^n^UtE+3Wfb00XhKC^rZtMA-t*uXb57pW{4-9c9U>7U4 zmpNY-dFB@u7KVmeS8d-gg3YE3nSwzMI5;>t+Vb-9*9qQ^x6 zFP!{A6xKMT+#`p&vhf^z;-8 zY6pQI-EBl0wdueNzYYuY5V;_V9Z@e%JBQX?ka30~66uG1cNRmN_5c^{934A4W&(qP zSoE5-)z!Iu!%Dl208*x};hSoS7f&dVC8VZOgh;Uex<(ek`b1u#xtl|f^|jBqQuEcd zmV&`dDm}1J0X(obU}1@giG`B->wVZ*0ph^(wZNQMlY70te<$O~qp|H%^U7(NZc`3( z4k+%+5D6-h@9%HTV|NHcI+X71qh)9U)5lpp$8cYqJtLHZd`OrGwWnpmrtL zSSY?A@mZRhmXLZUaZ5pdl#FC6SWj1U|M;;ylr9Od-`3I5hUFGvVJ9}X54jDK~Bp#7lNN>P94UJDB^pP^eQ6 z82s~NvvIG`<>xXZx`bMA@HZcLoB&b~!OWexJ3QQ(BJ3C8ANPu$E z|3^0|ev7Bl7y9P)O%tTbro0^?qF)A8}{)nPYWk z#hXkRb8~Y5#l-mdXWPZi@_?tr$Z2Ryt|xoGPg(=i5(Wmw$Hxb-itUNwg*pcdTiY@) zNYD@0wR&`NV$Z@-3<}<9oM}zm9iX1DD#1cS{2VWdasdLd`xz`!u_?vBju+zNa{+)S zARu6$0PCFsMq08*#zseZczB5U?7RB=_dr6ry}gBotleB5gRI35h6q6_@Vq(f3?g8; zJL+KpN8o5{3td&`_2sP4U<4}y%V~Dlj%_zgm9+A>+N6t-p}|D~-~h0N2_H3iAnePR zgTuq8OiUme+}+&;1qD%jMYBiV85@s}j)Fh{z&tppm?Te!9~2c81(t?`jh$tUKW$hF z_^(+{EE5MY7#RHZtD&(Ga9NOgOvMdLdAPX7CnmU`Jp(d8UVZ(HVX3`?1E7J|7Z=en zF(I}oNtz|cH5`BBNdr-6i(x5nB``Fmu08=`Z1dR5bL_Q%D+k1tJ`FyycaNf0|V1V?qpWpCVpA>q^$R_X+u-bJQu{Avb5Qq~6Z@|7@L@!pPUo`{syK( zEV*U?I(K(Vrz*~ZDOZ3F*a1I#dbR=ot$sf@4F>uaJnseEqmI?kSvfeO6BFwJbpt*? z`ogidwKcW5ne62dA|`2pZsQeTgCO7P)!M#OQyT|_5I_a6qXXcUpbP;+F?|h{td(=; z5;8zlf$C2q%c+2TE#v8V4@wcU+gi7=V=h;YmLL9@V6LHm`7mB?4X~p56oie94S+}> z!_~Q60$1lIL_6UJ74$7QC&1f$MGeHoe*&w6l$77n_Ti!Ep!HgI0@H{fjXU#ySA_%4 zm6Afv&CM;CEOfScuzT|O;QU;#+_;baBa}JL0!$&TuS;U;C-XUM0Rhgo_69gTz={+4 zYd{S_bEoS;vfZs+0#5Q{#Rzy4anD|G$vVz|n$S0A^naSah|uw0hQ$ zLD35w%K+XS`xX|Mmuaz9F!28BG&vmTRVpCbA|fJKiVnF0u3fRSdr8r4z({Sf$5pps zX|J$c3En8Z9=Qu?3UJ`eLkQ5)0DZh#OSEpf-m3@cV`gUNp)3pfL;}o9E7M}h)!Eqz zz$d?=Vsvh8<@sM$H2G)B?55v$nW2q4BG?K(kQQX zu`DKv1Z-ENfWoLq|E-D8G#?=)ZlTfrx(ZZoU^=e}j8@0T$ET&G0a{j3S^0($fKlw} z_Jqm1cVN^M%({Z?)iE^0#?3vk)qF*X!}A>BAO7^2L)g&J5V&AP9ckzx{~*FS;~Rnv zP?3YE0KfV?AfnaY2s|GgDRL%wSrXZBH zG&MJ9-h(36OfQ9v!%L2Kdu!{f;Qc8u7OWMdh@G$egs+0+goBVJx!K*s#e^TF_H$1)#baQhTk z{Os&3CMITXZmt4>o`q$h#NY>*Y24rq0p%q~sZVhO`}_N6XSD&j1-L5cd}MT`9kVvo z$6v-x19N=-Bb`ep0pfbWZNrZ*Z4F?bCnK$;5_|BW02mtaEi zz=?oKxPQYMxic6K@CzFmtpF=on45#efkb;_%;_bQ37QD}jyoD!T8V1;neN`8C2N}N!X`Dz^mzgZYd{S^x-+r1 zZuY#t1Gzh@TSZ65-N^}*FblvJe;Jm7Z<8|OKjY>;pV0Gs_dH?bCo4PqF(5U!;A;?| z5Z#p3;1t%?od;DT0TentJRBJvt)i(Z6PY2Cd9@OyP-VR^4^TZmz6LlxAS{4NFvqz9 zd8MmM3O~r-2(`Qj*bpa1z@q~$;Qx0civOWP0MG$)X-DLwt$EMvJ*fRcJ}h`0{N#0 z2X3lIr>9mxB@Aa{z{QY2xBmY9`+9#8Dmr=y7zS2QSUYFJ$ ze}RsM7f%L{i}Hvhm$&d)cQ2+I`v?l!kFD)(@GTIaO9G_X^Z>;{VIdRXcHk>dXQy;X zX`t?`s*0tSE>r_FTQ>2UpOl4(=~em==m*5b#^$NyndNbXbv|%zkaP-zEH(ei$tNc_ zOa5eMzyTH)!=s|at_Sz0D|=d7Me@fS9UQEtD<0I4tn8mZ+S)Kk`7c1Z4k~ORN=m~k zgz1O5j&9((FJ8QGb-e~(@?d;ZMh(D=x*O>3Ae<&=X2^JLS3t8Qn?TdS-oB!`8gxw# zK)G&VVX-8g@RQ_SK7wLC=g`oQr*h(3Cns?OgQbJJo_ii%-k4ayq;R%CgBqDkwcOFM zu`wXttsY-8#Av1u84?Pn+L9kLQbV9EXLM22-GHDpH3_<`D3D`uaB$cI9gGl-D^UQB zO@T5Zr>SY)lw;UIjUlG5ug|4%-jWOSaa;;5h&vO%e%)ZBfES6EGX`V}Y~kcqy_|%6 z1s;|Pd31bS7i8&Bzq}~w+Lk`3x3CQmfpXmmuDfR5>h9sd1G>{;SXyw;V$Y`o81U_N zfm;5|^fWl61i37S#Rl*NlXk;|K4aoea9oAUx0;2qt@@)A6YPX&jk-eaH9W-fT3ST6 zdYB^Nz?(WcB$(r7W@qI(4KOh7@EdJwr(BnK4D6wHh7&Qy~Ld3*~GU)LzgHxH+B?c0DCmU&DP5<*B4GG!)75|Si|rDRr=WXc#)N|H=T$P}WaD4`SyAsI7n znUat(<9DuldfxpU-}lG2kLP&X@20ix`?{~|H=O7BJMUz<=NRk}KrACy9sFmfr>9?@ z8)VRa{joiNg9RO3#K8)C+0@ESnry&t>}4}DGR|}rKYsCor5cur+@y$|M0YrNyxui`&1qhvX_^|?p(%KG3E-}d9+I#I5;rr^z^Aa zD{I55AK!kS=H^|PQZO|&wLEcRd}zpHWs$kaT!@XXyL&=ZLy^!J{9h#DPOl6!vs;$l(Ko~`WvJ2NxG@4wvC+*}Cx zHexo43ec&D7V!4Qgl;r%E}e{>dY|4qX=R)#X~-@hNrjothTl^GH<;4Wapo+_4y4mF`7 zLX&t}<`@cdlw8Kf#_a4s9e9zwogLPFCCmJnC^4HodV{vW{BD|TfL2OfT^$oEtD(L= z6C>kA505j>&g|E=;+S%KL}s)WmEl`}^A=>>jQN(>9el-Xu5=7#Ms+h5y>Rp-K`+N_F)xU`DjPBGK8o zxi~Vi;^K}#R#4v97M6gB$1cOp*3{HQam>TRb4xFMW0(T!!xl#}T8Ik6oJv?&7~KXI z6Hn%LZ0vCf&VBo;adc{IWbiL&NP0`oSGTmxB5#yKyx{GX&W_{QlMBH3e*Qd%D(O_30GT4l7nJ%UM`jnp!uEk({H@LBIg%20(kTF=5(^-C8T3Hjd3eTw*y!+QhjZTVHbXHZ3L*|NoH zRo!Qz|Fh|niKW%eOWnsO${sF#YxTICfWfI{kpa{RaRhaDqMT$gT$YqUxV!G|}^O$KEkD1wbo#1G3oc*>sYnOLs_Ib0? zMV83wJ{@9}2Ifj!{Okcl7B(qUDginrH3QGp zRyh=$IKAc5eC>T=4bv#bDq2 z)ckz)EnC*jtRiK;J6SXL4Coh_Cu1>_=DL8R@lk}&1X{<<%XIV_l(wP-1J=9u?%mN9 zMqV_ciqr7Cc=0*rLlCHBd0ft(%|}-U9x5fJAN>yIy*`b);}i`yB>RH^skSGCYvUCC z)7Mu}R`$p^yWRPjnS`1SmHWkuPO=GY$grMML9a<{beGWsU|2KWNW+s}m_X0Pt_UGn zLc$p*r?XB@qU@sYzaHuHpICeJ=*PujxVBN%&24JSmX!7D zqbFL|O6gfx99&$+e*Cx*9!}31iBTjbnq9kh|3a;&Er`^pq^4#mq1KV}p{{)@WWP1> zK8;lFxkgspZl)#)Rr|G_WvB)*slK*4vG!whw4}UTT}5Si{CTgpk56T~kd91pLc)`x zA`lD+DC*0Tl|a+bk|7M^0HI8jv?}{PF|m_99Je|$yNC`Lzr(7?E4gFGI2I01Y@&q# zVLXD}c~@7k-VOIuU%HQe`f`-xv>h7Gvdqlt_w29jZxV!EIVeuaRfv9JEqI{^XbN!N zecEi(a@FwC2M?ZRWqI1$7r$J3_km%5PWO=RFp{T75@7)GR9uP~P`^XsD8C2EV zx93#QYnd5xcuVXhI0mFWz2TnSeRC}(1E@2jh27Lu5-*|vTAVKELQ z2e69x8?rn*BqW?|Y_v0*>py;^p`m${n;UR?FG3y856|_C=g-^lyTE>5yf9BUzJB9| zx0jcj;$8erY;H8}1$^14BD=d+(B?CQq&|A|5#L@}nfB@x(1z9dOUk5CfxyFCU58`? zqE<{8LS)p-1=yTrxFT-d`n0&{P1L+z%Bi#T7Ef8RMTu!W`KEOVI7s-T?*TEQg`k)2 zNFv=YF2*d^gXi;upFg|1xz!x<$J8_UyUfle3rovwes&l&(?oH%sKi{V{M}?%NO+VO~l6Uq^Q=fdSEqRo%=Cj5~Ok@c8^mH{f>L@fZN=c8A z9iM3ZGfnMSRP~t0P~efnJ3f^W>=V4XNs0W{NBd1M?l$zW?(J zF*vOmyp}UBN0a;$f;5<2A70=RVZmO;<{^;(sMt@h!Ay{=$X*}7)Ayi-z3P8fzyv>Z z{ifPyxU1Fg&iO!|K9eyiecnII^Lv#7quB#^$d@LH&)A={HG+Ij{`=Y4_+j5?p9(v# z%d5@pH29WQ>o~;o_lbPEm6D7d&r? zT4qLOdS3|&vx{nX1WNhX7oHOJAAyGTUOK${y3Vvi_T8qg`!wVWpeHa3cn`l#PLD1< zpM1K>I%P{>q#$&DYTvv)rG-f=#M~TC-E`yiH_y7bG}+63tKN-g0jj8_<$|va`XOie z2BR(XAigG3aPQ-@w0hswrSHQO!T5^qzqwY23%TKYIWf&{D7tfOc5ams>qir;n@aLTlv z6zy{kDxwRT{N+2hML|UcB{zBpBk;)>=-#~flGq1z>c-I-TndUWe+Jcmg3Tm!*uG}j z4LFA;R?IDscgMdTb;bADxdn5Vg*@s)d0DE(Efmdk8q6dfg~}X~5J|VP@$3$p+;;{Q ztwg86bGu_}RU41mNpWEU95f)t!kK7-H3XKC-q4V6Fr?qV-&b{g)5RZMsIM@94#F)Z z<#kWbDsay;XU@QJb;pjq+S7}^jx4xavO6))Df;980 zhtDd9xx9$f8fvSdE==OV-q#zvhn#)+p6Fl79qZkH-8UoX(z-!SBXzkhKAe)e%e-?lR`e^(E z5~He$<_^mw7WhEkK`CE4!>MEq4ApM}f(riz(6n`R`oMhS)m%#$CYmge8X{Qv(tdUGh`<>i5@AfRdXCK+TNH8nNR*N2`AY;#ZrDC*yH=Bd~= z>FHbbsi2%hjj{r$0?!(B4yYzvJFP6FEWy(RBdWXJtP9N%MahE}NS!GMWtUSHxyq>v zSGfxNi*6DGaDb}S>9K9ErWD~#UFFkCS0?odI0~rkj(J#iK2bBa8CS*5- zPo8LLX@SAW$jm(3Q~C?|c5ACCD{EwbzqNSGw}FB6JUlN-OTqe@TUh9)HC0ttgSFvi zs-j>fv{9yrG5ifNg!P?o)BK(q@SJ&_Yv?GBV8ttf%dr*_We&Vvap-OC?~S9FNE-K< zCl+>m$HQoEZzp$cD0@3PN{WhN>TNM`d*#X%z*ERenHd?zVrWqBMn&~w-+cS#y|#ME zRo;HzzA*fQ-V36zOP5rmYgF!2T-Msswcht6*-``YQuK==qM1g`h8M311!6CJJ2~3ZwT7{Ih-9tr**{sDNowP5oh_tcPC+jgWd^e@ZGz;Qg<3o zK8DQEu6Ot3vz-7^(~XCFO7MU|pn&*hssiqhSb<&uEnENFt?V_2SgYch$vgh^?s%H^ zjwaJ1M}Dn!U-0mNem7qK-tF7OH$g!`L&F_UuN;!qSquf6tZcgPVG} zRV`5lzj&b+A0L0h(sEt+Ta8opvdWaNhu*w_RSGI zgHy9{_ChD(=9@REMq;u(d|b^D#9RX^U14^HkS7aUo|l%^4NOIN)m(9KN$o!yQ{%^I z>++<2QcIU0gftfV#)cJ(uVwe2#h1n6ucISowv8(2$5-~74G0Ge%E2!|@8H2o@8$IL zbgh2Q;MYtH3~wmEd{M4bW-Ta8yEN-4rmUQaqrY?K#INb9yd6=dFKcbjL&r>pN~Rg{ zRP3KJ6E$DHcma(%BO^Z!t00|{v^05w7t-YD=xK;a^qG>J#X5Rr`XBzf;EaLX? zuNYYmd9x#4-_pXu*vhJ5n6b6Z0UKDDy+i8o$eJuM_W-#QLUcmA-_KeCqB1wkaBQbde1=i$s zHi}o*r2V9*NEeO=KBiqb)qXOZ%iAEA!pJ?b#s&g=S49h=rlu&U^5)S9SXtE{Ord8C zeA?N4N|yXk4Gd7fr!~oQFboc57^Q3B5P-5mej(8}j*OT=W~Ubdau?M%8sVF^$2y|# z-tCInz#ep;^0i3&+hqr(GO3Lb0T&zsfQ6!17#Xpz^!{nNRvWu>%5xczhEKU1lggo2 zN3u<9WOf7p26ri8W|D1!7R%4i4@ApOF|nI^>7n8L6AEf$`0ke%Csu!6467ah_jSXt z>uMQbaFhkV8=y?*xc(ru!-Vk8{M&p9P2L6 z(tB%HMepRO^#trne6zpC?4iI=(P06$2N@Y~73ythID77#ak?=CS&tt}^YbSoEP`}` z>jlSNh^~O!rtOOaN&@E4*0=nZP#&(HJ^bsdY^9-Op z`c@PU9rY|%&jcT=fUHq6c6*FCM>oxO|7XuzCf;y}Z#em;Nn=7*W46$4t$lr6zw2Yw z*A|i!qsVZ8yCE#)U`bgO(;237V?k_QuprGZ%a>CXo zF0LJ%8Az)2OqEJc8c)dtu6H22gP=p|+rRQYQuLwxofZN*cxB}!fIt4r1N_Nqm&9Xh z4{;>jy9WRsecI+to6w<&NlMD|U70!!VVtYGJGt!g9)?H@w8|8B(o`IP8#gyM%D}$w z?IlQ3qoco25LSvb**^s~UfG{){eHh(fQ6+0)IT9;lb}YM@>GF{@Q{f}^y7~2=#{}$ z=0AFLl4~9Dn58Ak7Lh23zi=1_p{*Sr4))G8&eo_N0juKX>dLigQ{@Xy2yB4lquoOZ z1?48>G=S)-McGruJ`7JoYJh8$v@Asj{m?j@O(|iq?XMPq7^N#L%$|+#qo&5k1(zzc zv~G%B=&fFrmf|!@Ro0D3m!T>e9kI28 z`XbY^2?wV;xj8w9#>Z8aln@aXq4|LU94cTtI|MDD=r(81CPzm@X8hviOH`=1SoD1P z7A25y{?w!t2s)O#mrYwF8iJOoU%o%q-Kgy6ovK$4@>1y;8p<$}0BvB}y`&&?oMZ0> z@ylh|&dD3N(V>+vYwJ zb-X2!Lje{X$^m>-e*Vr33ILH9A*iSdMz-9zaih?ef7ZKf`8F~#`SYh>bdA|RS}8ZR z1;gK+}(wA7b0 zzX6hzC|%&GM9M%s7SGaOzr66XvN9H9Dleob{jm2oGB|4jY@i_?KlT-g-u>&NG#69j zZg3vJc0}0d;<(L@Nihcq&;`FHY{ajkS~C)RZ}SsZg4jDWBoZWGA|9hF{IR}1FcR=R z1btp!@frd^A)y3-uL+a@JlE%X+Vnq-&Y;3D5)+Skh_;Ccha&2gLos@Ik;HZm25IJk z7cUqxETAWg(K{{0Wg&Ud+L}U>O+N9})2EkDGhf{nTMLmC?1Apxqj?@sJBWY_@SyJF z$CGHKvZa4zBYHVCnQnrdL89pE@ya8YUE&)mxuU~dy%yjQw z>Z@fZguear4{|Dysm+y{Zca{PkhpKyfGG)KQPFC&HYie2dsLX?Go75iw6*O^H%2l* z%kjDp2R1Y`6v!8}Kd?k`RqR5Qh4K-cfMuyC1c+o|s3+V{EUc`0tyX_-gesAPp|-Y` zA7Cmp$N@809~YOr%*3P7^zz@fwP~E$_1_pkhZenXs$sEI}LssWyi8Zjp zctq(^OIJd&6()@kXIt$(9_A#g!pQ7Yuq4Ns9Z>6k{1~``^9DmVgzBAEbM(YSI87jd zfkCkS-udQ1gs`h1vxZ>QAA!lJ`->8ritvZmPs}*6 z3gG-BV`G*5u3!o+EiHjdg`PTvz5%o`s0koz-smdz^sbhdm!m+!nnF&+5Mr3DHj7Gb zZq9FJ%goh{-bY@}Uj^ zpFe-j$`boc%bJ;)Au!{Eam#2{FgoTj&Lc%esL>3HT`lulQIe8s#HPhmf{@Uu^XChT zie{lDfs_ZZXdE|P5WW=%I)xraKV(cK(3K!h9XfOfTqafmBR=;H`v8+8>mZ}vz72pd zkQuj$CBpq;xsWcfrS6}F0U}xE^X}cdyu3WXw~*-W+_{sNMFChu{8ZFEq;<|~IGIO| z9fK8@jSM$mB-r=8hi(If=s4?7i9^ghj%muPSFfIg#cek5y{LNIUMS6wivwuM+70=P|ld^(42SN8itCOtMb z22ByFKAkiiIObeFj%)Aa69>6|9J;>c@t5ZI89pKUFeCpTr5_5Oh_ckfy z+_E}gKXWjI8+mm<@~ZTm?HpIJHu+_XA1W(PfsT)h%eZt}Quz?a5%CyYB`L${^ zyT&F%x2KhIU+k&?j+ueIeU@={S9?3&Ss}pYR2K2LH=>m%y4!BU@IVJ8#iWbUAgktq zwWIAn!{jPH-tcg9+lHW8(Cc4;daeMicZyN-r&Tw{#)0a+7LpC`&!n2Z+|GHx{P-6f zuwK5I!$#N&iVE`{rTm(WKYnZk42paQizT?ZP5z?H^T4sb9iv(Uf2H5?+IQM^CV)nx zY5Zt@D3~I2$PA3&xh;g*oO#Z&MmR`PB4d&~$_fg|a)hB<6sW}PjHm+MF@YlmJOo{z z_XNYwv`)=|+McE+H!uk|Z{9>~iilu>DBhA8&BWN?U=a#ZD3Q)2t2%%%hdPLF^JXL! zY!i&%nuyN=X-CZgVg|IPq9PYlAe9i3B>oec7|x9w$)OhPBZ@aXA+%2{%*?39Amjk2 zJ^5=H$TlyFXlyM8P_TbS-4{`1>gdqK)?(}t#)v{ux=_)Sl$2nu2VxJ1FdQ7hYiz1u z$(E6ERa=mWF@pl<-&K(}T$^%d^v>Eo)fb0)c zdj;?q(!7n#FNjnSU($@ku#rF$qf)4NQlWy~1X(?*7k8!ZhKBrt0#_#|#-(+txfGV= zewS7jFJzl2$;pLO51;`7LzO}C$f_JtuI)(8APxae5;YM!fJ&l0L|*yPTMp5N`SIiE zeeeM;#qIks0QvPR8y%4)Y(4hI&6@!SvB?td-TU$Fn_gzKgRD7r0tPs>1?lk*P$DZU zP$B0oT)4ElT%s%d0^^+y4%@E16Nkz-FAtItY`D*#Z$E#2(a?}JvHoLC%@l|gd*27c z+B~Fl=RP5XIXB1ZrGsHWT&loe2gu!)o}L>WLL3Z;zPQMOn|M56Y^|pc>7}#luV-dr zx_tSv{=tKRv-H?5cmlqwU-rt7Moh#wU`B_M4ytj4%YFOy1$du3_Y;ip8(Y#9?SC*D z^QPZbqnzRR-NsL!*txhCELFoh=A`-13~}te7WOM;hs3>wJes)F{bxDy4tt$FD!eM$ z9sZtoFO+cr>wVW&<`J5N*+;YN`PZM}RA%K8;9x)$L)2&9*o(lW1a-36eJFm(x@fQ* zyt@5ak(t)xhrBMG>F2L8g-v$m^8muap2kmW+%IOV!Nh-OqkBu0v`WQ~vH>!IN?Wl1 z=L+&sA8+IM7QPq-;7Kb58nqpglIIk8oqZk~XPci$udA=m%e{H|%?>t}9@c`VPgN8Y zV8|9Kkfl>tIrvjvex!Xl7{7S@INS&^TK~_~f~X9Qj{HV)1H`cx<4FkMm{|V)J@;4! zrGbgd#|)aAwS$PbSWW0woKBren_^D>-R~45>LFzU0R&iwa?nSPFyfo}-~kg86C_ak zg>Q9snq!ttYUJbKxuZvqqU2tk$yDF1tUTbV2=xPIq~NZ0N`50JCnzLFVh|!YD$2{3 ziLS8|z2(4avrNSC_YWUF3@i=MpV!iyONoW$v170xO^%9^R#JNL`0b^zow&7;_<08GhTJ1P~cGT)^eb8r#mW*{`y zVkQs&K*fzNMJ)$~Gw~f)$`9;`&BO3&JHREnsmOh26|Xhv0*S zva+;Pla_vc^6_P@eqf$=!u@7jj)EUkuHT*2KUX96HaNsmiH5RQwZWA|O0L7`pAfQK}SHl&z~Ui0SMoCn4PK(`h?ydSzc3c|*d)8hJ@!++eD{#7&h^UfVkwguHdov;>#aKsq+j?&9-7-HDD*L|<4V_#Ehd|S#+lIdFd*hxPTM;e`rJ^7k-PF_+ z!cD099sa|WhQGHz;e0Vr3#iZ$U**bzPy2RY#79L%1^wgKiMx8~-uW~@UJ#qng`)PB4w2B?OV4f7mLKMA~rxBXC!tT zBUr#tanK-eY47NO1Qn}{3xYKQDpFw)5hRavW2oH$t>OYObZ2L0*VfiH(N)si*oec9 zPds;FzfB0~;hJa!&1#ETwFf0bWT?H~wU4f{Jearq8Y~gV2TZxHC zQ;dA?GBQLE$?KS$y*5aZFp~%9%=IL3Zxdi2%t!2DTv}WN6eKGn6Ex0luz$bT+;{Ff zx%witA3w6NvSu2I3G^Z+$SEjLF%Jz4P;m+cMxu(w>I-a>3Y(l6J$&)vd`rub%5SGI zIlWw^Kq+?hPWd{by!0`xtwE`Kgs1Y@c@ERHQNDV`N*9FD$fHM&1fDvtk%;DCWo5n> zL9X)EkZp-mX!zX`79Pt5OZ6ZD#4Z6#`H@i&GIV; z9-4$U^UB*PYp2>-9$i_xty@LZIH?e}-PF&FD&W!Z#~X9O{(WM6mG-S)Tte<7Mq&3> z;I!)NWA1(D-1eoZmR0SRp;yfW;+I^5nKXCgj0 z<%xm0rF6|hGoH*+GBW>+j~^6ZtH_W=K$TBCapZ`cv^0zYQ21bMV3)LX6Six6JI3Vj zC&rl2>!Rs(gZ?oPFn&oqAP^p&#U8H!AbJZ6o=wUd(X*^ye<};+1*oX4&{2S*&=p4h zimtH%e1i&?FpF$yB90GaUUEel1OX>ToV8N{@FAVxY7wNM6$saUf(;IxEcXvuKv19z75IGZ5Q{Z#O7H5zytgVrn$jV6LY~yT>@BV|Xiiq1NKhfRk zrITYcibM=(AW|bu$izof59HXC7S&5fBTXD$;XcFot1pdFkSiYqk~JPL>MK+_ z7;)oMA>{nhRD$-Y-PTGnc5GroU0&YSKG;NjWi&Gx9GK>PUEzm0Ip^KnC{9zHs3mlKV{N9C?r3FP$Ib9T-8n)-;f<7qm3u7Sf-*SqDA&m_DZJ%(^WMN_b8;e& zw&NMw%O-G7wDmtQuo>>JWxX7*V>?>hz6jbFJ!7DlnUx@4ef z?4Jl5kF%Wrbl0#c%@uMdScXmQj|*rjKmGjHI;VT51|5fD=f%IK3I zyN8Ak#BXT6YgH>{px=3*Ejl`(!NHYp-x6bMnHd-;rwRAhR!}se9mjY{$mPozvEt3A z0D45OTb%9LuG|F-1+o_WC`d_GW@g~==rxcrRQ#3|0gb4y4yd!(qq-x{?4S^nn!gYM z6J{F}Zm3KVgmAN%$2fpz;RB~Jv8RQFj1b&@_&}MH$h7wmqfgNuT8AIDlP`ph`|xx zOP2sbLv~qVe-Ysjz*=-o#Iij%BGOJD0(%0Jv?BNfvrr? z>0Iho<0=JiWNIwG!uMPuIvG_}9Gt|Mn3nGD6R>&VV1SJV0xnKAfQE2wL9R7hDJ}$B zAUTMxqyjJCKo1{^LvUAI9H%d`iA4a3A|S*P(rvsW1AFIwb{?4vP5>CFEhvr5prEj^ zPMj`8tKg90mM#6jPW!kx(~S{);!srGyVuj!MjKZO3`tI|2rx4GT!`KZtkhIgm_E9o zmqS9sAqBvSpPVbP5N0oW_KZDTn-r>*0=Si|jIF6bDgil<>bspY2&Zy&)z9_2E#9^O z5DU2l<5A3+d67oRIzj{Ayu&yxd+c6Vd z^y<98W}`YZ^&l)Ut_1=I-}yZUyYcqz+rWE`JX{}cGlJ25%>BgLephjEarAnCXmLtj zFZ#fC9WN|Ee|z;RgIY2xOS%8_5OZ{mgt&NW^C;$siIlG=_e%|lwtAAmdLRq66`+in zV^>jHl$NR#SW)IiP}&Lc@L<@7iba`n_}A?_cXT!tqaMMLKoa|o;ox{o;Y#RfX;FI0 z?9-(ZB4g^;sCF+~km@--ca1BWD^dLIKrYxN-C5 z?oXed6c^ibvGem|GQ{$g_h~LOBO`+2V&G>M|7A}na1Ppn9Y~2gX{Fknf?qEY7ktZ% z#E8dJST^}r?a@DVT=wl+^151oI`hSHA=6uyt_%Jf39ftuh5$p&K5d>pS;xNchxNxA z3AUGAQ=cSC_cn-I7k~uXPDlSshCU0Z>-&}u%{jYWUvW`2*a6dM4Ry^%(vN*(`&|z?%+cni){~2c~ zRao`F<`y>vA4Sjd`fxqFj`tal2d~`5K)CF|7r)N123W8AkAluDmPUi^E95vR#)?^Y zBLPA@SxGG#dZf1TtobWB{ns{-_{ev_LEA`}oqIRQ`Sq1zSzGWu?2m5HQMX613g4~x@S(4M zamQHRRF#>O)4=u1(pv)4pht7%;2x;77INj-?zH994iCzY8OJa|r2dLP_z9eyx6pes zE38_uKjX1#mC66e#}22n`ksEB%W6icu0<)r7QjBzh>Q<1`44g!T6~7Zc?vX#+_7e>4{r38WoC z0={beW4EbTgJ07@CqDP(EWSj8?z#>t#wEU2lscf$qE6{wW}ff&wXkc@SR2 z#B6|<0-OR6X&ygr>gs~TIkI{HbOp1|T1CU~blyJ^0+8{|P6oT;%3jg>W`us-agymX z!8ZSSb(>@5*&T63DcsOm$3ZzuXfEcqq~1iahbPqU&lNrsG20%c%fe5Cky?BmJPOAL z2BsHhozP+&K71bTAlQ>&)qZ1Cv-!{;*4qX@cQF#>O$oY~I?J<>`7NQnSjRoP z?(?%tUB}{Pxa}%skf#ilWm;*~sxtphbUs*MD#2NPldlPF@?cS_5kP*ed`nF3h<$ZyxWf9-nmis|Dx_s2;#eE?%n; z0yVAxr9XI(nlTLWLwpR26G4%c;8S_CBAa}4F3V44@#jT{9+w)6PGA_=Lm5Vv4ae2& z-$TL{lm71(+a9CG%Fl!c2v?KexG*q!m{W+dhig#bY>|Cs@DR}8p{D^6gnvPHK>h|U z4_55hv17=ruae;&luS4eBbaq#ZjMcLk0gVpXRLn5buCtM8B#fvJtyX|T7gK)F^?)tRd&>Wa5Rb3Vy);ovA;nx_BLn`k zY;AQ3jy=q=IdL4gTX4%7h~HVon|5*!>~fBfiaZPiI@s_=vCh;73L>N^|o znv~zGJ&|x&9T!FX@Vb@ zmUe+a{qzadD}I96N3y+yEVdH(`yZ%6Fl3XIq$)tb^gbToA=a9B28HY6(tH1?vpM-g zpBGd3w-E$OEFN8E`K|6wqZgn9x)X7OMM#UXirwhd`KqdC7AjEW3E7y3YzWt8V%*Jn z4F*+GOASw|WuH~wru$FCX~gJ)AX<3`dQlFB9Z}=zKf5|RpWJ2^aN6R2GvET*U*^t3 z<+ZE|(;vZv$QOZs&duGuf=!1iB3Z2}10leN?yt-=pxIfO_bii1WpgR_L;DA z?1f>Lo!WAw>h|BF+4g_PI~MyPw@j1u|3va!do=u&KE~y$M=Kgpku};7PcG=2uQ${G zdr<`T0#1l0p}YO>M>sjK+)w&@1q9*Ac%0M!?7<4VPYD$#|GNq|1B&o7vP%EYK4{IN zzq0l2sn6#TzbD(M+X)tNPU$&)GPn@odo*3 zm;QZK6)$8#aRLkkyStVD97-B=y=W)w%J1!Agk=8rJOTNS3c8WmrN7^EfJ%(xD&jXd zf!uq%gWP<4EDQ_@adC>`K@R=iulO|C#A99*6;bz)QrpHLQe9qF3Dm%=U66P((wAT7 ze0H2&TvUQ)BtCu}LrC@8jdVo7qSe{~R`D8m6Bm>oMdmJViYD20D=diG54#;ilwLeC z@BQ?BbY@6z?qc%Co}PQqEjkw2l|1;3@s&%vGSQs!_qWPyuCb9piwZ@`3K~cZWBp8m zy2P%;s8PO|&Pbu~*2BH$@G!h5JYaI!BrpkCN23`jRaY$Delb-=lCD`U5 zYx48*ejge_l(oHci%(ZO&lHv^15=*AY3+Oz|43j|ZUvEh_Uyq7DWYsf~b>AY0sWYJPnVFpB?4UaPrClTY~}yh#ep=JDVdZ9No2-wz}t8 zd$kt2UC2Ggd9{O8wR$}sRCq*$Y~Bz4^XD69*V)tPe|SRlxUhI3CBwy%=Fg$T1Axz99;S(c>d8uw zAOT1)piEi@qKHQjNW;a=JvB3PHzDDct}rqUZkhIlkgdZ(bfZ9X@x4`GuuM(=@DGP( zR#XWk79WSFnWrIAf#1Y4bhS(>s^wD?p6Y5tQ@shc{#bDfi@Wq~_e`j=Odg`=!=p+2 z35v9!sA$8rcl-7(tc2|1iog#*AKtxt7t%>|=Q%Cku%Q23l!X4bzcLIBHWUfapkNc& z*gPmGKy?j{69*3@8kClJmrnC2Y6l=OkXa(^Gi~3T+yL3y-FWgaBK)$qOGxPJ>4AIY zYh(pOfxLR;Uxew!kQ)rY0NnuM%B1nl8i~ z-!V3u;CT4)rZ4XzzxTb)CY<_Fi=L1?G;LL`wrkfZecuD`;7TTTRdAx~&6^-NZ^rB2 z(M!kZAC5VUzNmO?0i}aL`3;F&K=llr2wYF@JmDU4vZQ>ev_d%MwYIHrWR?@dKs{8? z7NknwF)K#V;3T64KyQ2J76s&(IA@R}NN{2YP{K)j3{M2=^oki>n6d$=wZ8aPBCir4 zASlY@Wd6u%s%bp1O0?H_#`rpneL!J|4*_TaObO;DNUo5DP$f)@(b6G3_2mtB;?;T6adoWt!;u;wo zgv%)=;l@##Y}f$#E$jPG95&!@sL)aV5+Os<13)?7a?~n4BjeTX!Sq&>ID>pakkq1~B>}FIFP+0(|2>8iPcNrNN!RRdLObi2q z&fj~;{mdCjNPb|b^XwT+8lf#j!Q{Wv=8xKwn(;Z{L5N7PQNer(s6b9sJ%Dgv1?>NJ zPi5A*u#NYk{Ngji4ljm zJ2cPFQ8VOOma7*(EM2?3W$&7k>DwUFq^aB*n6TVY`d+{Tz zwpw!eix@5F5F9*{UVtFY|>A*pc;BsDM?AVX+fA=$+KMdHE?{~z)? zym|noJrn-{Sh>RQ^oXe`Tm-#*e4w2~&xI}w_!I+?G9pq#pxAwsJ+Z#0ql2D-!O`9x zP&vj`aUih}*qHG4P)cHHCXi)()6-OS&7VF2NNjN|!jeFp2Vv;`{WVyQ1z$CE?3fmc zjD(M;ui6@90ssv$7(rI;!0oYi5K#-@0t#uK>%a(!UAMn|bA;*>lsaGJML10$_~7|r zN2AiOBW<6>1RscY%w4^*EH5k^7$5I$Z@&_=H`}D@-8&%5ftCrD`Tnr*#RdHM@d$ON zy{t_9chGn3=5!eCGR;AXW(fn-Zl(l09|4+!VK17%4rkP~ZDV$}w#as)?n+R)f+xK8 zuCupy*j2IDZz&H`B%|)wqR#S5uwy3uk~3N&J=i0_2BAYzlv``&z(4N|_(tY;x<2#Y zk$&FB&O1=q!%8i1-`YoR+Xro9`-N}eOu%0l%}PX#U!|g5b9qS#H#_^!pMwYLY?YF3 zki{p^w*c^bikc%Iqry}3^XiGzfu`Js8kxPK&H}xsAFVv^OIIiEz#m)x)e}JPNmx{c zju3QJLUM9-g6Kf<&&UWbB!96cqytE;k*f?&`5-4z)`}LyG;%P!gI@wlpDO!+m6c1* zJ8l|eq88mQCWedyXcs91Nk?073NEboBXRx*V8NDc0zn;6Py>S-I%$uKiZ=7}V@h;* z%F|N?GufHg`QQutD4@ajne4;+`H(V-;in&$tNYv5AN>?2H(>5sT+Fpz3hM}FgET-4 zt8}|~5dwcu704E3cL!_%>~42=S+l?uOJ+7+UUYYuGT+I0tsL(aMy-PlguBA-uAJ9` zM?K!<039?sXehYB)g#7KIt6-Myog@|O^*LJHn#2CH}NQ4n9@)j$Q*HB#F2P=a%zgF z0#lJWIgCtOpl1l$dcNKK{`j~H3PF+--U{gH=?ShYNTA(ZAjtr)c#eSwQMxhYI0)mQ z=^&DWE)?e9utvkafg6}es@fCwV_(m~L`PnpOsFr8>81aK<`WIP*(^*cBCcNT?C7A_ zg8NkDWzl4->%>WditD6d6AA+$>`2fyHo_j@2p|`vYM{9TdG?Kni0|0u-Q5uXvVsk> zLj8j?O?#jm0R^wysPMgJCUN81HBd@#9`bSa3f}uE?PgQ$?+~!{$1@lDq#eI@p5%Ny z{N3hZ^C-d^1}C1KazQ!e==cFnkZ}MjidAX+M?EUEmrn49;cX87c$lAEdEc+V(@?h0z82E=-ol+ z2lCe%9?pk`3J%bau7K+$lNqly^GqRE!aP0cgkXUx)NVf?@DMa_0w+h7Z=Fr@S(xnq z&44dJ6&^4MW&t(Exe{I`IY=?M90?&>>!5Z50S_qz4-bPR-X)4M0^)l_R_sF3mF~8- zc^p)MjleEYpMQT2!=sm|{KDU2Tc99;pEv|2fpLgyHZrgW5eKT5Vubz!;1v>k0Em0d2D^{(P(&&~St&+%c`sf` zOw`M4aRjAQURvt>fTq2-cYbOr8`jEQtTWVj_$WIvNlLEutQR>l`r3809) z-HJ5sJiKLFbMa^<|B0iQqVy;z`>ay;Mk zaZ{E2X9DI((3>DY3S^)+wwDd%fpVw^g99pCp!6Z_xEaL*#{@3tR8SXS<+4q_xxYY% zQ|S`~K@*M}#;P%B4cZAi94=RZAMkE*xLqJC#nIp;BxD8LKqGP!X$PA;YXR~G^r_GR z?O{d}4HaNbzbn!r$hkloGYbo%PY`k!-pzvYJQU1ZV#DxZvD?_;5RPH*!(QWVREqt8 zQ;xMhQ4_+Af+Mpalg;umhL6QzW@Qat09b(Xrd@=MEvs$pb&pl0EZ%qkG1D_WJpneL zxCpH$W1)&biGUZmSYO%(EqGMaI;mhXFcI!S)P$)khAIeO5v4#&;tV*u+_Em?oKa}_ zK$%ct5pSB=J7IoH`G|B3PZIU`ZslWRv)(kp{bOT35apv{?dUirKmh4=p{jvOwa)dz zg%&);h+CvyzTZAFz&V@+$fE)mFDh`Z_s+dmaqq`?&prP0t!t4N4+N|x+Z(%Y^gldh z`eo0b@o#ia_GivKyH6kl^WV9oPEbs1bX5<~5cq@Ro-XXbYqHaglS0|y_5?Tv;2|0$ ztgIV)n&ky)v#vFG#Y2vUp&44*uryh+_yvxaD)4E7Q?`l8*O3uj*bJFCUbsN+?RCh; zL9QiuanCbUDv)yRim!vQ-`xCs^XLrL2-qnElvxzG!&!VVAV87mV<%3iDky~I@$ULe zkcpQ-ZKa~(3zYNpX=+{%n=FdZurOQ@JEJe&a(uc$%sdM6|n_yUVWBLP4YWH?Z=Xrq1y1JY3aY}*C{K#1IM1~L4Hsw3T) ze$Ir{J%i;3yj5VszspdJV-;R7IDd>@%519!zCkTksFnemp<~r>gbO#40}c%~8A{Dp zuT55M01@gtg;v**t@bCHXtWy~9r zy`L{F;=MH}X$!WJJt(j{`abX7gDLzRj9y{n$-&8K)B5#$Py^q%okC91SjhVph%Z1w zNQP3+ICaH1(7JwUZ%5zKTkHl~hR>eN5LiMnK)lldhNr%vA^7}VtQja2m-h5l$0Gby z07!lMkWX|&b^z-vTu7g5F&-NpyFMUI1`^=v`6T6w0W@%fdjzup@En+fLJYf_iYJaf zLw#-eJoXnfQ7DOu44lEb(p+$c%sV=2r} z1LJQ(VgS_X{tjpW3PN(-_s$xgRVFffhVg@{C*Ih}PVwe_2$=+^Q(&K7mYs};`0x$de^ z7iu1x)fd5g(Wek2polhApdy&y?P7MPP6@S=f&}?m36S)|j6weH(xM&LWb_5LEa59_ zM>$5x^D9E`yR%{#O&2MeQ~sE~+|{KrE7gM%3IPa0!uqf-RAUaMqFik4KrBOJQ6O)i z!Hcu+ePU%*q(cYw)3X#)9GDqxJdO8@A#+_CmgQkqbf-S<%gWR`Hj89Q7ZhN5TPN*M z*?DwA-mm;FUfg)RtEjM$>V`2z*keK+0w9zr4==K8@9yd03le~%D<&#t$P)||#oOMS zj4E(vwuO+DKMNHi) zIO%e|UZ-kCwyg7%-|{Q+ZHs@n2zAjpxtD7unJF}ivwQ{b!uofdArHj^u0zN{{`tUK zf(KeqP(byCA@9)z#Sf%-eHxZU74abMO6GZDqI5^^G2?c>fZk&zB)9(8u+S$PlE4z>QK(H!kRltUum+?!M*g$p2wNPXCKI zxjV?i=o0*Iqp5*EHcO;ytd+;RK-{a9rM}_#YZ^tSM5KhkK>v0Hf=9;Vsy7e*{lf*% zf72{rc_Q<(q^SS$DSd^407@??b@%L3oV<0DidM8#v4Seb)c|TUhMAc_JGTcG8rA z0c-Su^|sK2T(rS}4<&-98l;-wXl)dFDe zNhwnl^Ytla&cA;0ck=}{Tmhp8+bZ{e$}|K(@8Go?GgDJYQwTa3tbG9|TD+6s%NLmK zVKy9=@Q@wQo)3dI8MqJ(Ir#bE1M%$nb6Ce=p3u?B3Dz@Zb)ZQtxB{%XAP>PQ z>tV(z1M3;ldD33|FEi?Tmk5=Iu5jmYMq!6DW#A-4ysmdE`vJ2fj>6CwB@0^Yo|hLJ zU{it0($7x~`0ciB*)S+X1&FB%6p?_(@e&W%k3%Ve>5ZW&&!wM7#W-A_8<7tjZW_v^ zLg|pxntxg2?jmmS2Xr%lJ2B-4lFrUf6oVAdECOY($qt7v!sRyUtqtf9_YRI)`!k^4~yFMxb;oTI}MI{)~^G048K*MgFFO0=%LEPBaj6z+N;m(s18C+SuA|G?ph$ zfY4i#4KR}k1szQ&1nE3M79Sw0r8Qml`Y$PMMWDE@bKZ!Gju-?RNVLhopq~SQ!`sXh z6j0dX1rTiEZ&8Ee62Por&Io-l5N{MCnC((fc#ecG8B2cA6OJKRIFMl{PSg*cn|B~6 zZlrreA4=J$2pQD>>vn?sy~w~T%I73FZB3TlOh`bFArf7)nsq3+`u}M8J}GiuFq7zMv-bb$j~1tx zolw3R&#jy4StxF7eKoKKoCVE)iqT}-sIH*cRlFetNHn0 z=B3AGm`wsCuB+$eB!W5#>L)mG0>Vc9?Kyh(;PQ>&b0v_Hp%g0LXL2?G zoWKzL(t0N#D_{zGly@D;GkyO2IjRi##O|gh@HAj9U_+`cxLa61j)`57De(W{>bwJT z-uwT5wM$b%LWNXzD9UIMk|d#$q|A(?B7{=OO0tqlQ6z+v9VsOVp|UEYF0vvGt7!cm zR}Sa?{>~rweeQD~U00vad%RxH^%@X#X`OSEmy>~wehrtZHCZknbTF1dJ>(UPp- zvuC|MJ(b5zO(;ss$e0bbMLG$Xrh&T6QocSS+?|Ijx{aHf?69woW(~R}p1D(2dQ}PyvQ=dP4fP-zskO9e&wP_q_3NvPOR8gtD ze7%_isYNz)=zVLlT|tiw40hY-5;Uf#ukQgiX_)=0f-s3*y~ZXKb!*vcW=#iK`Tjkl zOq(aj{pjx4H-dH*ETwU0MZh_y)3il>)Y>)OK5j`3ijbfwEiPE(|161Oa{={ zjEf`BP<_kdi_g#v!aAX?|MBgc&=E+8e?XhlguD^h(;ZBXh>cx&IlE>V+}QK6=EB)t zUF*-SOB)_HxX~d%N;W6bG9I5lr!2}WPIMEKndIT*zHSRm`oOA#z=lsKcGL}*l9UwL z@LBO@9+|S+k3c6f;cnHb!YSQ402P2vCp2EV=eTsz+iSO;Akd`J_`Q>477GsAE=sBw z+t)Ar4(u;j!TS5^>gvWTL`EaD?z~PC^GIV=GR$IK@;ed%!Zq^#-Mg}-C3(HM>FU3J z1yu>R(pffaBwYm~p89tRuv||2ps$u$oHW|zf!0ZCjj0$A=FO|nT98Rz3kPe$uhBF@ z_zgQOC7wqqVd9SQy&6s^o)J@#G-;VK8vx+f&!5fhUGp`EYlLwiVJU*yZpGecuB)=7-~zRsU66x%on)_7o0ARjz98+1SIuYt*`L zvXK`NZ_FP;VB6yP^KTXxi!vni!Y69Uwu!P?$xcG@#BNk zRq$cXm{_MTk?%c(S*yc_(K&M{VCl=w4zfKCYQmP{4i_8jMcMEImRAEusb}WTcPF0N zjC#Mua>w`t+vCv2o-Yl)_1YK6V+ESdXzB3$BtlS3b8?h!#_lxTjtr7?CePOf8_ z@|vca2*e=UkBm4-BgkRpA`vJ(RX2Qgnpd`s2Fdv%Subs_&$hYh!$yuI>I{a3PKk*N z2vGg;v$5tV)`%QqOc0Pi!%T`l5qA#)13ts|Wu=fk3DOB` zO%}vf`S&4b{+d6-; zDj*gJGJ$jTR#wh2VCJWh(Ku}t5gxyPKNmpBvej^^*v**IhhZ5eDQtYjn>RW^=F}^! zgyG9yAPVNbV{Fz_l$b&0#sMw-`|mP0fNhHH#Z?4oby%OFERP7MiLm|-i;hZCUETLb z)yyH$9C$(;i%XZznlnc^^YBW1P!}&6xkxPY^kn=MD3rGB!^e*ai(*T4>ew;jz=69J zbxaJx3t=(H7ny*%!|N4SI9XUNpw94<-#U}t3W5z4@VvB?ah58#;TTOQ2Y8mf_4KID za3l#C3-mKG;AbQU+rUV9*C{x=Vq?2$XsqKK;7B(dHtfK{^|2`ic=skvTDo{~(WmbK zc>4M$$a?tap8-94ZX9!1TlUKu|MH= zID0(|pYZ~q=(3{5Qe^r2XE3qCI+0(UXPkHE>?Wj>i{nn}_E8BqS8hD;ml!%=8!>yR`(K8;U@&L+bK zfSH)=UA(=pFm@G&O)>1m2Skde)M@r?YcMyz#BO@$#iV+{*Rq zapu|xt6sl@v&1{kF+u}^agV&Vn$Mp(DPhe~alpC(y+{WS#x>hU(2|019py3Jigue< zfa@{gD(U+501uB3u&77{8a|va^1v!L$;!&jKpp*GNSm?%+LSsK^oQuFJ9iedclZ-5 z^DFF3elHIE(9nETAaMnkv6;EL-ZElVTpIaH{6)+IKswXb_)rwam@l{H@Pc~ou~Odx zYN{GC-PQF>kq3f1)eapheMC@vkh$QD-~_<`+4JYScJF?WSR6$~E+7N~^h1778kG8s zx95p7AH7X%l9KI~)!l!Ol^TC_?TWRDr0)l@CMz4R%rdU+6%rUCDb%AOL5g%R+f6-e zd|~VHN0l5+6+}8-qm1Aj1N-wW8l_poyewXa`j#HD45b)g;F;%PNQyn0i?H#*+F;{W zZ3CIbA4OUmhN0qigcQZV2=<%h&U$Am@U0%u5_~y{&zoYlyQ@c7Ljoac%pP#o?M-Er zL1sj6haT!%rv7;BIO)>ro1HXcE^3F3?Zm3cl6*i3+x?4bs2*1|zZo%Z`f324FVnn( z^WOr`a~whhiANuZjI2kZ_5J&*P!B<9uU`aG?a+@%T)p9L!&a-i0ec-qAZ1n+sg$De zZnUC^13C6zXpMg0ST}!(;G(nQx)I)$NHe%=piKxb>Vofnp$R&JMf2waASc>)>Cj=C ztE-Zs;KMJ(Tcp4F`l=TTD7fMWb@F>~Fn8{&%MaZQT*!W5zE67kNK?}d>=cMQvz zS@^g-S-~|=1*jdU9H`9YuC<9cBl|d<{mV9ba(BmOm6074OW02Bz%Xw^$lC4eQC{r z#Xlr&`1xf4)61ALHNEfXRUcWbuB>II@Lg}L9{FhSc2t#QiE>2@Bl>3ZX3UwyH^W^c z8l#yccbZGOi^7)Rl|dqDlO<=f)P4}n3h$=XT8kttcEik3&Knp6Mlt}Fdl+oJuA>nr zs*dU%pW5RHO7Gl}vzdT8cI5gW{e9<3iCZB1ATh4UpG}OB+Bm$1{CMbmufyApU$%O4=Y+wTTuX^jn>2)@>)koF zG3O9uG;DTb-JzxZ{WUCh1GPX;Gy z==;5!;I96zx>`v$5p@`M2wNm$tON%b)v`qM4|Ge!O*t^9=zMF_do%dKjeUu}5nk?^ zlgf91Btco4c>Fj+87L9)wi+2p?Z3^aXUhMCB66zmi_EaMU$M>ce*cL~szS~~=R zUbw0X#V;ue;?Kvnm)%6EtdL`;Cdz#mhFZXg{F>aIa3*rLq?2Kf1(gLFwqziT+nnmpz$&SSl#f&GxOam6P9FR}Ye#9e^lJ&()$(ePS+s^=ToEA#v{I?@iWa+f z?o{G%p$I4vd7JU+kRs42^diZ*Z{JFdxKy`(@aWP0)WFE^*dPiyheoa4xJ!bng4!Z# zrvx1?dC|ek9ks`yDB*aFNkU7a@pmRGLKoI16=ii$`c zS*anUo#H7q-V)r~zphYWX6J@Br#`}g#ba}T!9 zb-g$7THi}EMkGX(ESx!%)lLyh?g;!~_T)EpzB~+0Xcl5znnkU*16kyWnR3T+0^{FM@Zz0W>0 zOjigd7@vS5E9K(Fh@4k0S5}ZmziQ>m4m&hq6mXolURkj@+fC@2Vx`lLsqackuFlRU zQ&L(H5ip3}IuUZ3D{jGACv@H`uJ{3J`3zCt`Rhbaj(KDm96fCDHdmC|IPOg%GF)BD zII6SV1Yq|vsO9QE=UyQcnJk^)J>3*?_yw8#(y^TsB^$b2PfuJ`6eEBj@$;C)+_7`# zaI2#rkQuJZD{dK7@q*|tNYmq-?9oH4^#Xqm&z!WztW!?__&BlYpv9+6&MlcL_A|}z zME{G=hmJ2j>JgIcz2Rd<@6o;ed#0p*#9nx8i9(IOpzfdZqY zqroE?k%@^cG}mp#0o1FEA+WU-MPN2~1oGR+dy}7FdvJu*Q#=0`W2I8g83!%6^v=5O zomo>&A9KyO_g0;Gx^3>ic%s%(F0Mc3g85CBtaE%4%{v-jvSwWkQTMziYqMKmqbPrBCR%#bB(T$f51Y^ zUPtQ$NWNs=ybj&F6Lf^i=lilXO%8>L@qBqiRQ$ zF1r*LS3bq88R?eny0zFY_8dGIHiz)cejG~I(vX7&KAYj_*viZnnwTk8Rt8T-QTy|Q zNJSsN5;bzh>hgHW<+ti4*r|1OaZDSvplSD{{Hj-d4ZT!^M3Ef%Kq@y?7DSmd740{7NFQ1F z`p~a2uWq&0EfmWN*md}qMYfMY*m za+djx4m24Ou=G&lQ_1T_Vc)wQwbSQ}JSM-g_4cq@3+ecBicS#b%$3zzv&A3xY7hp0 z_xXH1$JzH|FIfaYQ>GLEMMzv}Y;Te^scf=f+|=M~baGk6g}nn*kc4T)u5EN@k|-l0 zG{Pz`Ev&ipCf~Sm{`7``yn)RjRzJ0LmUz4zIP2H*c3QtV#31E|f=&T%w+ZU0Fe2vVN;^IY6og>Lw6FIt5r83b*yX8PN8@TD)m1^Dqeqg zv7t5JskQ#iljnneq^Zo7}ZrnP_>&ly~<{|UzMzd`}C5dw|w9H zhiuxpKd{IHD^s4fAaDhV$CwZ{6_f^7wDGyWyA9D#FzpjzJ+4OHZNg^%{Np<>P2P0n zFVU(OL@IuHaY_Md&oW7}(iWcoDe_ZrGLnS&Jo1Y$Zj|P(g7;dZGHYZT#@v{g)%bM8 zn14au)f&R&ly;*;L+buzGv8_Bl>4#vJ+Z9>B9*r`mj^Vw+DcJFB@HS<|4L>!56(ZN zzF96aU6f-`(~xaODcDkKy7F=U-LIRdPc>7GzTKSlRQiP2>1!PW-~Iiv`+Ei+A*=G` z`*?zb(5H|#HZU?Bt>o0H-dwYNBgoh0fTHO;aNq!^HvM$W{XJFrYthdlK;e?6<1Kh#5(^*tcgU=THDxg_KU_W*Ov!qwVB4i zo-oUBbcI;HMz3Yu?Lp?on{(g0HW&QS0-UYXb2%ORr09SQ>tM87{*UZgV=GzHpC`$$ z{HtooR2O$n{*kO9f~n0~8s;I?WO_L#5S=*$8^a+#a2y!hdiZUAxARAgjPn@=v5fDCJ<hNY~CzOaEvsgc*`8RuX~V1*5`AP39xNR+SFb z+%+635YC+spzq)WB&Ze7D!v!eg|Tu_9nz3dDYE*|)2HS#>3JGCqmKm*-GkaVat5;r z0?OSa|IolFI^?QipAbzkK-_NDN}xDfs;SVl8_TXGgj`^(r;|$i984 z*X55Qxsa8U>!Pj>P9lPF&_pmI)p*kJN6|LAk@-?0S3MB;i>MAAgDM1etx=*B6TOp@ zgChQ}d8H|W@~->tF9cML9?|?Rl>f%TgySZ{`c+x{!Znfuo_AE7bXi->g#nA}9;=Gw z7)(-YoE074r|EOeyd5*IRp&W5Iz8@eB{0p3+c2$1&gCH&+|D;StS|Gf{dzT6Yf-Xu zGC4g||4Z}K@%!(}n|A6+O`zwDJ6N_&cJdzAkN%0;r_ZQCW>2%WN+8Iux zoL9mC%|)An(1P{6%$o~m-ikC zl2!?^t=^ZOqa1Q$-`_Pqu@{G2n#;h0wt0H3FxwCctzXSr+f=p?3N#rIr;m)XeeVYE zDJ?CfpQoq`K5ny%YY*wqqe@$if39WzTZlHe#CJ%qlK%hKp74_x892n7cs;?B5$^y<6Vzn4ujM4xPpwo;Q-w9$ww8}5Z90$ts z*NeOrQ_r3y#kOry1-+$Qxjhq zHY;A1_@pd3$uW%W%G`*g4dI`5@b##h|1J(Y3BSRgrB2KK(Xvp;5Vc^TnDxqQZ@J{O zNC?I-%bvI@kQ&e&Gl3pCFef0ep60I0=g)WO)XBl#o=bpfT$q7xxfyWyf`;69|CJOH z+#CP|i?@geq4YladZhZ$1EJMmod_S+5FgWD<80VvG-kFNP#tY7$2RoKpZ^seCUgPA= zvMyWgA^qo0mApQcd+#WJygRiI-{QyiBBQgorUN zx}-$iiYRM!O-)lW6H%BN$c4OpZ~lv!`zqLKAX!^Puo z28dg4Njo*>tH@-0tuW~sVLestqN-ZnGHH>7v+Z=uYjVhW{XeR_K<8vr&0PU=`sl44 zEZE}yTcxx2fv^05I+G>j=icy}gP199s=WN(lP`s;!^yHdKzH1k~lW{I7V0@9W^MuG;B0#h)_O#}#nSMz=A3QrRBH z4@cga-&2+-_j{9f;e0GzhEJA5rJ~Lzne0Id|AZnAbUawo`%W&nVXRZTTzpKT`|=4! znMp6yJla>t9n@=HZW&iI6TsHQWbwm?yGZQ_HbvULndTH(NqQ~<4s8|SxP&6#Q8Unm zlQbhVJv;&LzlfFT0rnG;{VC3qHV_Og6t5|brmli!nHeh?$jR}u9o-<>a7+$S@q?w`Hr%o%dfUj|eQ~$j-zB3Wo`A3XXHx z)zr|C*%;;PK6)r`w>*Nz9Y`M9o@ zL5X{zn*pZ+C;l{XQ`CuB^R2@L8r9715XNVNDLGJ>^@Ntp!S-Y)t^4e zYfjx`g)I*AYW>#&Gp+YOe#&mtkFY*JusuVptrH*Kt$93nltSqGCI1&d#I3QYbonH# z_KEgj8V9h}dwQaNq2|UZ3u)@rfTNM3ap$!<1T5&|fMy>*c1d3iL|~Qp(CnAb5r9%$ zZ-Xz`<;9C3(%M=3Ua^?$_$Wq&NFL$1=MEB0Nm@#{V9C_Rc;*Bfg1)lka$dz6DyAYz zcXp=c^puHf;`LGTTXR1imDwfdh|7;=uZR4?_TvmuSlf z_Fy>jnKQObQ&Avw8&NR*`0LliQd|va-9Y>U-l0NeI6UD=Fc?5bP^c$MfXe7z@Q&2A zY^IW>Vx>KTL?_gPw^v{GZJw3E)x))GGe@VL5#Ii`=2?k%a(`nrFRLnAHJC59?p7Pm zJ@eT*?2vMJjm>;FNFPG8fgczMJuor`z(bSokZi%Z@gUrzDVZr z8Ic98W2a8i@Ak8Saq;=j-aDb>G@)6{zmf1zE}Y~%bLK>CmFlvLNfOW|KoKzSW>ZfQ8N@oTR5$<4b{}6FnrbR9AKYUR@Kr4NPUmq(36vVAZ z+bGG(^7lkyfc!BDE62blrFe~x4~P4BOH1gHst%qgBikH8{YQ*g$LCN2FtQG7@WPi7U@yKZ6yf^^I^DSWmDu&$`I{UlJC75*|v=Wy>y1Pnb7T zQQ+J&Z2VXqRd2<@(ozDjn58jTfq60f+@a+zE2oJffC7gDSfb!Xokk-C*hk2qg@ssL zL3wFu$j+Ua0j({#QpqGIF2?qFFVzreIW9JMloq5ubo{JNGH=nmcr6ZcFClY-SDo!f zl^`kZK7anEg7<7wv$bDn?n-$R41LsBtB#S!rNuZ14j`B~HY{5uae80SEU;P5`@ssQ zF!R>ePndcEJcNDW>&pzWn@G>Org3LtrsEjN$atBTcbuf4oK#@tT|0I}wFppsfiIIG zy!(#GyX9vpx5XXVdvWpb(W5giUmlL#R8Mb0vI8Z3GqF$z_s=9JlO{NE^5ls8w^aO; z)aqNX;ZaD#X2TlMWr_qj3wp>t#F?e8UP63|t82AT2sI>nV}5>g3zPLu0<<0+v5M;V zBx&Hp_ybj{Zz1d?NNL&cNp6LOBBKF?9E%Nc0E!CsSqEdKHj@q78ds)ink#DVBIZRQ zhr7YtJnO~{@h$F*4&XNK+!^O@LeYsL4;~%(?im#lcD2klC=9s+R!rtWm}-PIk?}IW zh#cAIEgE8n=ZQ}sqY(gEH$23h)ltSfBj~Qk1Ll(V!a@K?xnZEtUjxOU{&vu7{86Y< zn@UsNj{4ZB7vB}%(0b#{uO)Y$9(q&UCB)!ba2B~{h=Smp78^c$|9Sy`23aI%O9F{R z>RIZYH)_+`p-#-|hj`V~LNPE#tk;Bbg51<%n{Ij$sfSCX_73ZzIa+08dfN}LKWhoLm_Fr+$< z@f0=p+~ZEY$+81x{Nj>*YLz54IUWB6p&){!R| zJ*^uyo`*=*3jzUg&93p&snVH)x9$TlDtm#Z4evM%zJ_pM+hB%m$nLq#q*%NC^-Srqpe-!Zjm2x(pwR?D6vZm3^j;0X67{@ z{=}yOVG%OxfS+G_r!D24<(Q|9M(~dHf!JRKAuT=kK$MaR&sLPA5$CF{(!>TZUp6W6 zA#xby#M@Lq}aK0aakGcY+M`FY*7RhP9j&%oU?R?qA^dOUVAA9Uqa%4* zA4M(e!R@N}8RkK+g+4~W#^n?oEK%zT#flOSda`ZkLe?z%Q%^)OHc37fqRDTRP23%C zcuT0}diQ=yhE@H#4(MjMqLr5fvhCPy+FQ$##Ynb5`UdyJLB%KFheZi9Zk(unT(aaN zExNg`j8PT?H1=32C@af!Uw>?vgr25N&m$s9R{MKCH`a&NeHWNZp!7uHVPK{{4o>#z zwr#Q~45}Zak%9(i7g|IxCqd+opP->Vbm%l(lew=su~VNR>1tR<)mi!R<1cRE4rj!e zroio7{o-Ch0kg;fo7r`UelR*IS8Y^n-+nOr_19CRh7}1i9KA+`inyIfcFv1Zs;ru4Hn2hiY}1rpS?}f~u^EF&}&P?VIl6vco;< z`gOCYyJo0lG&C5o!@&kgY6eJKY0gt&&@DK`xFS*FOCV|avX{0|%g7WtG!9~Xj#{J3wd)wn2C`{)0t^ICj zFpioUd|61F#iit?+y$o+y5Yft_ki=DGI~gBf*ghPg!uS)+G8$$bpw+Mb_3D z=wpedvf>gIlY#YRRnSpTn?G7R=a}wHotC){D;jgl4q19yo{dzCUf*Tf8IxoFJqFm9 z=X6FwMc;R(ZIUnhV8{3h=y3`H+Ck)|N#%YGqXtAU7tV;mdvh{(9Qi;*r~1?v!)>LE z0u!r?_C$`nlGtPtr!-#B;#g(h5IQHa`M1sSk2xcd!x6>)AvS+mC-J~RGmC#(CJ9h;dL>d?}$+E75ReQs^?Ax!$V${{aw(%Q$7(pOfH~F1IQO;<&;!E z!!FV0SkJ+9SYFOt7U+7$Xc5~5Ek7I41%!{ccl&!~?gr{Qs(qN0aq0;b4pCIe1>Sw|KIEX>}$dr7LqrnX_g z@*PsWQlk47tXTMUqtB!h@~2CCtnq%;Sv>1ABtC-%jEx(J=YY_L_9no9N5CsP=6Oo0 z=4Fr2Vd@I3PCDm?U8iZ@t*n?Ci|>B_bvfUm5Uf3toY$T!Qp`;}5*DznX;r(z*6p*m zdz3tH|H)46Uw{v35YMdi@#9VP5t^;*7i`ubUXQ2w^4i+3jOt*=FMJtOK3yVSAGaB! z=J_J&>10j}s68bT&>&PG?*y<6SsU0ox2fp15Y0zi>8q$6nGfb8l4O)zbvVTVyvoOi zIK3rw>(nFJ-WZIEOG_)?yz${K<@Qgx-r`KcnB@^hHBi){W#^ouu0|^eNe^d55(_07 zun%%JPzV>7D*h}4KGF+v4Uc@VP%M1%1VnueKd()WG2Ea@{LolFhBzixuBRt?R;Hsz zhlxmL>nT&#czMaTYlpm+aHRc}2ZR&`?C{@79C&-meJ*RIe(T+*&mE>2oC>p=RnaH_DcL8c})+v_4hRnYLPs*6|b>I6| z|Ke#^a1OUx%2L<436}=YNLM{K$irS85C-*JMI6K$=jorCbnSq+lm-AI_Ndq;H`hniCqYxyO{i-$|y?UtD< z>eb`Yj8s~boIfcJPM)uY$?fT1jr@oZjenjT_q2MDYeofB$EUgtHspTbhFagm(`M&Nt zL)8^>6~w=I~~yBbp!M&>g&>*HjBas);x>qMb;gS$a;=i6EqU;@&8 zPuS^u9akCDeZG8Od8Lg57BDBb#80C{q9HI1@ZUP|*l;x$fP*qguTJBb*bN3@6L8tf zTG-!;*;ZMbBqOXh&*>ML-zFgx?8ho}#U(SPUHpeZ-veqB;PQ2$$%W4@AJ}x{1V`XM zj@iz=nt~+LM+GmnSikhC*1_QMNA%m3O*re+f7EtBfAjDbld_axKhtlw&wIaW?Qp$G zujkv=?T4kGR&C!W+w$GhSm}>*tf6pg6edw*&gmO*Ap2+QfJxMqonHBg-Bg+>bxe9s!Ey?2yO*N8Icp)?w< z8Nvv_ec@XkTq6&}%n^F5eD{bq@^aySHSU}+HKaGEFHCCSlC!B zk~wQM=KawED3|>9{a`!>`z6BQv%mYwmD76eiM=p&+@p6AxBeK2gQn;Sp6-ag|G7Nw ztd-8jdAGeL8??c$4hZ7a(xLFH@Lj+1&!-=8N z)Wl^uirY{qEPV0e-rTbwdff4Vm|2(5q%nRH)Rjc>t5@&7Vs?!fgUA+x)k5uMtyxyG z>{5~fT9#umy`nW%uJ~gBCg(d=TI#9VAA-I?8z#g;M>TrH2Y%xHg_LhYqOV=K0)~&0 z3}+DvSws(Ns;VLb3vag#&gB0Bh5?}G7)HnDJIWQgMuQhZrOkLL%9$($v`>%bKMqfR z2h*6&zscZ#?el(iOJzHZ{X+)oZ4GodHTnddH`zlIDF32u&JE$t*D6Y4zs{4VA4@)eeqzQ<KZK^ggMwUCq==V4 z-e;@PUk=H18_d&&PcmZ2MgZbSWJCxqD|v(3Gb<|)ZCF#&HFNC~DJg4Kts*>ASzey+ zK_WZX9nC0sBn`^si4!S}#Dj$0H3Zck#qz}NeQI&Ord+0>KuUeE^Vlf$KhN3NM6&Fp z=%e89+MHUN2W=Va%5ZdpCju%mN!IwmRRdLG?vpf|4uKkB&Amdt;CQlBMbBQoGn5{Pc*^YbA6OZsgBiiPFE;ktxpQ9_ z70K<)m!GC+U}8df4uGw+yr1NI@&9qhq3O^|w%GcgMoMX-z(VD$lb=^+3k5%F8!F}% z+&N5aAZEe9!0YYZj_A&*EC6}MFK-|ms(0^PCU9tL3v4>zKO<%|`@sXHl3q|o1%zQS zgl$fHcGh2FaO*M|_aT2dQb|=nrN(aGF1IWm(fLENoKgT8QXjwn>agwEg}cA|@nvvz z`;-g=t#q*GIjjG-E6Jeg5pSmt^Iz6D1}8Wn^1RhX24(O@?M^+>)s4NW|L^CDpb@M7 zohJ2fk378h_U2?8(%<@Y?LVX1Gh*vtD`5v&r`nf4B~K-PvKOVGY_KZdbotP^lME%E z4yqF|v1Zu2gz{3Z`mp-Vs1&I3nS7PGsm7$h%>Xbdz2Dq_7TvGA`P;AEb^uA3D#brp z(*FN^--giybr9}+<()F4D-YYLD{Lu`3{Y(qje`(zyPw2tj+bW}|9SfYxo$dm>d=<4xz? z9siHah?EMo|3W#kyj9Jos#&O@No*|<=r(iJerUe_{noz;G=y3_U8Ah|H#LMem}M{d zTRBi_>bq3G`x3#VjIvahKi@=Q6l?}O#8v#bt6+Hb@gckq%uacni zKVQyowT2s6>kQB-Y8=y6NUObAaPL4@V~?)?J=bdy{1FjTo%KFZ4F4%)34>psHI6~H z#G(fcDf_h~JNVD@6!0gV28br^{CVQ7*9?&YBJw54WKrfIBusFq++PX)8OZ;`^`;=U zqTk#Zup74zX`A$O{w|56nKL4Vb0u$fOQmDju3eBEe(Ox*_KJK=2W?yTbvymjnL3(~ zURqPwwOO;6FjTf=K!i22CB}|>j+R$;9x5i8>tJ$VZ+o#hO7BNFe+~QP`<%=)C;%|> z@d<up#>T{u|Nmyi70=O2*Lf{lw!=m@M)U06 zG$uTrJ$u+bi4bBa-+(u7MFh~+t>;UtDu#Ep*iF?-xB7Y7T;LUkfD*nvtl5f#arxrK z?8j^o<;yrM-h(h%g=qtK?-Jq-aK<1D!B6@f- z7Hps!!kB3ty~XX5F5qY67cyhp&=tZ4fEUpV*H(1eQMG+lpYE~wS%FaV;U%iF4I|V3g&s=7*7Br>A$EXqZvGcldRY zJTxWraGQQcadh4Oi?4zW&9T5|WswK9e_b9fWj^)H?DSznhhj72^u}kfD?AwN0*lAC zZP<2ODo}lbximB}@%t=#sOMlbDLa8=x)rfxJ@DXCM?<+u$zo1J#hQja_JWJzkDi!8Y0K_%`Qj~%IvU(;>#FAfuG#qY7w2|QHf zar04v{t^RqG~^^GqD7gULE@zRLy2jW<+jI9aqq5PeM??^hO}JSeVNl9u#oY`+-Cjr zXp)L#c8z$Ncl>Lirn~x9!Giro5neHq+A0*AHwNLUXKgEwWpNa0JQ;}eLUn4XH zPoIir+27inI6mRZnwmpQ4uIeW%Tby`XbTz}@(S9(h>}~k-c^;JXYFVQjZdKFyaMmk z7U}P{VM8Vj%J8||ZH%O}#ZY;9y{|7wDt|NQst=RLtWt`h7Kd;hqRqN==|_4^CKZ)+ zBKU(STl%=|L3&x4-E$yzRa8j%G^M(G_wGm0jjjRRcj}CJzj)5Qi3=~!n6sxC0hjhs z!Z-+Oiu=+O-)*O!Hzhh8Hr_bakT(Iu9`xA^8kp1ii-47rPnN`uUJo9Msfz#&JZw|~ zbx|^t1`iig%Ux}GHGNR&G=<*(9&UKwsW`Y4fx`Xg?R&SOUv1NXQ=%!Y$Sbn#`iI|X z!WeVGdBF0RE4`?2^YfQ3SdjbR!E&O4FBqepsi=TqhyR9iP417=H`Jmy6eAv*u(#i&KDau1e;TTcIi)1!5DeHDYu|tN}Fem z%}v`a(%vzg&BG9d0CF@+7P@^REo!Fe5{OQgIZw~nn8C-=7P~=3L6O>sM>u>%X^F`E zu$?WfrRxh)jQ5TzZ>%Z#T2;2P;QadP7?bpsQ|f=%OljQXY=7DL%-h|YI+jfr+uU!5 z*Nt{64#q($<9%y%M(s_#(ecp6BiHK792c4%?^y6A^>)k+tM-G8Cpyf(Imk4+%g@Fw zVT9seaO%&V<9KA)J&;a`Ng0a}&*YG3Kd577SpfNSKmm>v-Z_uf6a%nsIRC6m=gwPF8{a?QZk{S>_fV}Gs zuR}ZN*;XwxC2s_DeZo}sB*K7%q@+rgvRP}>SJ60&aT6xUZyw{-%T5j3HS|4<7f}jJ z{`qIz)ag2^Z{NQM9{Gt&9rLeqvO`;{gN&3E-w;9y14?pQS_3K6kanLcE3*xj&7FHA zH&@E|F0KpD#fx#Hh=$i9SqZ;msY06cNK$q9VRS(laxa)F$A3mD6pE$-EwL-yb96Lw zYhIXC%Qq+OoghR$Qh24ij%E zQJPd$)PZN6s$RVc+SQwv4LxjLg-Qacw8UE0K5Wv}^z{1+S2{VBfJ$z0pL@21paVZY z7ot%mB|&N2)Q?T?8_-lYVOR{~f1nE_#j_zbAT|NvZI2VHFPO5&Ioa0Qng{Um=dI5* zXK!uuJE&xoHS&dIkh$=~2j8ZKI_Q8kY0Kh{@YD=ms}+N=_8U0x3|pSFgD)F@N7^tU z%H|kmBJLaiA)OXB4wlo_ztm^Q702@}Mk{^}THMu6qU5DSS^2Pr;N6WQ7qeT25vvp) zj=Xu}<*WYph6^Vz{+uE$Xco9dy#sS2eRe?jowE5~CNySn#Ovxx?+C!C{Je4isYGmL z0vgoDG1r$1ol75uqP2CqgSJ}TyNhg^G=-mx%!zT~`NEZ-b%Imi%9h=TzKH9eNfM`? zh|qaryWfAMx&X;vYN(Nymxm1q6$26^9${9LqMciCw(#9MT9~|7UMR0Pir%jHxztb) zn)?eOEAj|vy@!t;QQp^zlcI&L3q{Ak$mfNH{IOf_zoNFKW2E3lt6^!miBiehnvo(5 zZs6qMG;$d@+{~=?Ui47fApl=cO*f%TA<`pb!thd4ceiEc8IKsT#P9%&BfTDf>|lM> zIHt&2O_;Ei6>)!IP8gI8i;Yf^g9N1uz9t-RV5R&xL@m4@WR`4PT3#z1a_xz6;Vcax zeThHCSosqtK7gp2OSq(Y9ZpILxig;-q3$DBpN2>C_wSwslMO}>mMg-ND=IkEkJ#yR zR#RjQ8nnyyxZ{i&BBp=P69IU&;~5tM=TMLA2nms68o+u*K^9M(lPtIbQk`p`Gn502 zfcb0DPdyCD39J5A;yX&jn+F< z`7OwlJbQL9^0h)K+FqHl-w50v5K{}Owpz+=k(m)+IwynQDt6bD?Df@P=5e*xc|U`t7p#!jWn;ROS@j)yYUp$ z24*wO5;GYtiD;V^o>IMyY*2PQj1yjKq%+7A`gf{OAis>i$YwCt_VV_I<3k8r`~5pX zcjDe?wrgId*RNBwv$x;7d$-^Z)bOkNM=S)X%lj=wCDn}?l1zPzrMcJ#EHzR$G()$t!8aacLHo^ zWYp0xLQFCB+O;a75VV!E3Sm)m{q@#^)`|Q%WKA2Z#bZB*ied#Awu}{Yl+qS=woy*b zJTEVm9Xe~jeP|z?y)7h!qQq3+igt$gXReJ$LF~aP%br)5fCIbxA;W}G>V*OwRRW{s zb5gPNV^K9Yq=!lrfr-A_I$vMmA#aWdBz2TFc6Nm*$hWxLC#hXf%PdhQwkm_H$wDVl zOunk>xj`D{$qsYUS2G(_ArN0gI*Cwt?dYs`?NT;3xzybSa>ldC-fzsB}XCHSO#q)sXqeMf@2m zZhG2BkMMfbBxD{&*Jw8!Gb(96$~#7;Xbr53^$&JoKrAW`Xt zH1JU+JOx^8k{Rb?`DO2FTg=fWbOqg$q zrPim?emtWk&nG2K?77Epn?yl~wMzHoVuFjCe+I2Juz!C+o$&K##cD$IC>k1MwbaH>k@Wu=3Rm&jQEn0@ZC5|hkNTyja7+x*FFo#4#Nc>}!_+e`>+#A}X< zVUb6-04bX(D@Yx7+w_dQIrCr&BF zy=28>N1b}20hKy?_CIHxHjQydLr3#Y6H0yRoV;*IG~0xJ$yX~M>YQO+pd4A<=FrV8 ze99|15Q*}Cv7Tz>#t{V8{)YL0$Klm3~bx*H(zJ{CaXhkbXOo zC|vBk*#nrN3B`Y%Wkw{?z|XGNY6XW%6UAtgp``iNlr_7$nb^;m0sF?ui4M);r9DIZ znC2vq7oWUtlK7a5xu>>#zkZ~pwTHRmUG-3xV8v|gnCUXtuK!aj)1!XPLqW#^iIxce z{P&H$#y>CLATXHe#k?{Tlb@9A@n?VZ+Fw0m;_pOyEI6UL8;|HSi1N^=IufKzR&*a% zL@JTr_a~0DEK>O`ob6;JDJd#O?Au4xWTCJ2T9iph>O$|KLpxkJ4wJyNNOWiXdNlTz z@J5bYt#Hqvy0Vg%fJr{2BapGc0tEoa4Ac5Eu9X80_5pDUzaHojpDni~A<#ZvUxUMg zSW+^pu=kVYxp|D3h$vc9Q}+GK7Y)V&;9v^rpvPxIm#|~7y;I$HQ&aP4ZSlW0dP=eb z2PR_yp$QN^_uM0U>?qQG(Jw=-==Np}eLj#e`T7)~1UK!0n~2pK>!7f7u7nz`elt>eH{^$Q5s73kB4Mp{kO~=4X=d>obga3hkNY%zdl#9d*Tpql%crOPQI6n1p@uCnIe-+?&XR z9qMoKuVUCEAQgN@yrh1iZQ_v(eBU^u;7#Mf%caZQmJpiF;6^YeN_AQ+ge*bki0IhN zlrbZZFPNu(iN^HJ?e>1D#9^IBj~2DAJ>j9IrX;B~H85^r2u=U1NcSgW}&!&J8WtY7~;FYi4E zlqk7+#T68!@Yc+z{vbBpd(cHKvn!J%0*y-T)EGBPZ#c`<^%8!Vj0`L|d{y2HrC0jZ z&2>kG+1YwoGn_}AoZ0%rMbI?s&Guu6m7|{e+)3Kr5q3J`QA@L)Pl$GCZ8WBi^N&BY< zrZglQU0|F+}z7|-MWo2El8vBG{XHMu&naCg&cD0e^kx$$tvnT{%c>o1+99^zl*x2?^@!5K~j$e ztLp=m$4qK!c~)zShuX0IlUun_)`pHR%6=ZOId*VfP}RZiHd?BfneQ+3OLixB7W}O> zG;eJkyc`L9BSLL-r=j|K-v6Q0_&u*;=3R^GKMGqLtt~k-oVr@}VqPUb$2OKnWMz1l z2E1q(E8#L=(P_Dsya$ER`rkRo&}eGKiH&DLAThY%*ScI zl`vd~7_l`!4s6)FVAJMb^JP!B+Yu3d?%d$YtF-~L0^?4%tE+2ThGl8(exV#GZLV_k z@L}A}yUWztf`p{ir`6q=-swj_*^SyHGtW8razmHweSfHT81*noH#5OLvDJEBX@-K5 zcsJU>caz<{y)oltPu=TzdV!nde;kjo2XqmanxDBwMSanZvB$-fp3Q3a`M(%(eqaTb za44g6nG_qfKUx6XlERA23kF92{ir}m)7@}CyoUO-Vl9F56^*iFG81c8{GWegVB2Vm zR8i8tY4s%eX@4^Wpss`xOvZ3qqudZ^c&jF%3#L=ytagL8{`DO86DK7GIz<8h@9}1J zi4>!HZ9lfQUQzRJ4#e)PQ?l{;OuQyq!)0LPXyu2yI-74~t`1<$ zvP+JowLfFGYGhSw)|!eQ_vypZ4Ss#qob3O6Wnr_dwk(qZDOB=SHqMFOi^4=BjPTF6 zq_|r%{(b3uPmKtv{!)K9FgHDM{p}yWuZy<%VSTxIUMteDuv;%@y?>VEBQta+?R~YF z*6v#k{)Q4Bf@qsF3{7op5A(QTeq+HXBeW2usdIj|oUg5wRc#Q6Hxm0F_(bNDy_4Lv zZyQd;ZH;X4iMQ44G}7CH$c1K2lRZ{9=MSk|-xa9LvS)UfnNX%i=7-VdHr_M6LzWR5 z`6B=QsMbllFF5xhwQx5SW}%s~);`H=>Z-n7f^xoibmzz2s;SSw_ufruYxBUM+_@Q( zzB%4{`}HRT$mLdTEkB@+cd#)Gqe|T=>Vxo*YXB|~;ZRF1vv0zWQ>8J^K#sphv z-@EDs0Wdv;Yh7+VKjQbQ6a5ZPmPlQcXp;Xg-(xq`3RXU~?Xwe_H;-}0cPm06fObN# zAzKsILis`b4cMG6qlFwCvU8 zhgXs`J?{Mwi#CAKR6DG$(F6Z&>i)lLQ9CG7)gb2npfgfBYVF7Gtp1`NRUL5SPu zr^&PWcUl^$07}~_^ljoL|7Ut_v~o2Ywc$d)_D&=IuFecO;zT<~N{DM{^H=}=Rj+ck zk|Ix4)D|y)-CBaUGirDea?uoU|HA|jhm0mP@#IM+mk>$|go&h-CU~}nIj+3>@9HnL z*1F0X1-=|D^j{Werag14qL*(!Sr3!H%i9sb%d12UZR}fgvjB87>D)4eiqz1)Dk}O% zNaGl5CnrZ-Z3=x2HBGYs=!Xvx^`Hl(DgLqcj#G5Q?csbYI2zYK4_XxbAoKO@R)@d3 zq()oejAp@|g0V>H;gGp)Y0Oc$!V@rn7}3h`azEVHwP($JMl?gBa${3QTK231z9%}C zNL`}>x(>Jv97{e4Sus)XD8c>N`QJ@a|q-xo7b2yQ!3#g;{t&kI*ND9vj| z4_jZRhRup9!?Ym8GVbAJnf+3~r9J%S*L+rKug@1;acNmwtsq!F{P!niy&^~{G!g1q zTRW?9a&}&x9_2m{y8M)_he$WjcFKF5kmHDcR9W@;TaC>eDvz*RV--J3g#A9&HHTl- z%BoU|6m=f}ZY0VYUh9MHkp`T&h5+HDv`;Hy?jLhFMG#+EjqCFBrHmtn@Xmira}w#^ za6SIf5AA#LgyS|k1eK9HyT+Z+*cb zS?*{5_YYv`J^OdEg zP?4l+ez0iRT^jT8)WhPKwxFBTkwLVX3(v1r?t8#7LsflC(vy!&yy1i?zA0t~U%0_X z5!W71m2p8Amlk7bVfc5s$F02WZWo>D(dZYE8NGh@Za>-pwRUq37zbxJKq)dIYEr<< z{BX)a0D|?=6%Vd4C>W-m@&%(kseu>=9?U8K?v(66%qh+3wNIP1`ei;@Lb}AW36sB{ zZO4FP#2gD3ErJC9@OFZVrH(4E8B7wO@?fYaM$9x$SuG`Z?yIjq>3C8$GVP5$3tY)b zdq&1pUkzKYP?QCW+XHB2_c_FKp}9yLsC7riwF}L~+C)f=I zyDa1*IYd8w*D6_Zez<;BWN6tA!+U*yS5AVi@9ImA@}6jtz*$s8iBUQLoJW&+WC4w z2R@E#>i8pn4N>H2x6$i-j&I%WUUGP;4v&d03UUUZ7HSS2aa<9CZDiFV>ENpPUKhh$V~5msWa~sqgBr zVL6Y%j@R#>VG|ww`2Vr>-T^)D|KI<+p+O5tk_t&?p@`BTSxK@wRvD2*nU!|gD^3V$ zkZdX=v!#Nd*Nf{`5KIOOr{{n=}j*ujlLsuEVRu~TYEVjV8LmU1{ zy)VtxuwiS1)`(%qqo>kAc*ybDN2iHbdou$UP6)L6Vj`cFPkHRI;q(~dJ|%45-#Q>nZIb**p;cFSeD z=HCD|EL0hE-@14XgWKVF9`j4F3|J4z13>}U5{#rNiX@*3V8m1s3^IDX{GQonfGA9m3Ri0>>X|`5=RhK z$K)|H)&b&uSRsdkBgE1ACX`W+6JzJ2{sNoWdFrTE##5!j<)k9f{nn-hyBwzdUAJyb8C zLsVD%18~p8o2}({feQ(&h8MTt4pif@1ngYOU8cP9<^tXolv}n6&<{fFDVhM|LX1mA z1qCdX(6fw;uAR3F?=zp4VI8JZ)F*t(fmSD}pF|rlPBMUNmSRsX7IHTZ&he)84~L#8 z?@@BaDDiPXWPa-0n+pd_Uwb2=_F|T%=$_Mxoy$JuUV>Tx`By9&c^e;}`UTQj<*5n_ z5TQh}Y@g*0y|IAeV0hby>bs$svqDecbh!5{)mMIyh(>jL|1IAemW}(>$lZS4iie+- zis_|XXxSe=e!L1gy;mmRPUt|$WD6jOGm3hWEnny;xL)AJ^X2zuqV!20U#hYVN2Zmb zs!o6SP*;Yr0gPQxjtBbaolax>!wQ5W#;Rpb`P>mOek$4wOcpR)*loUG@#3^0)2M+< zODAdt^E3gJc@#@xAnV}m1DZ@h(OFiOz!kJX>}a5zQ4kDu&BeYAnBhwsUVuICzyl|f5Tnf!VcwoM}TlVEkLSo{9-dW{!s7-MU$b9@5 zVJC2Vt`niq9K3u0rhTAwTn*ZLz@9M>=QI=evSE{w+F^U~y31?b!4HMRtEp2ftE)+B z;0{pi+-b@oekGb{Jonpwym4VV1@_L^)SdF2$MQ6E41{V%$?LMz)F}y=VG-@oUuxOt z(5ad>ix-F4T)>S`(o?|eW57}J;ygMa42}17W^#ruk2o9ps^lt;JFG`)L_dOjq0KHa z#YF=np`}YxR$hnZ87R^XwNddBP?~$UZ*yGPE5mNW>`^jO8d6nIIu2NRx9vE}JUou4 zm!8sw!iOIrinJffdDE|7I(ay4%eS&|Lv}3fqMBMZQo_!`WA&4)x-(B#avZ_Use%Yj znbR?NDzRhQ__Nla(e~fu4g^{>Pf&9f3{{G@@hE*LBqPA6fFrXw>=HOUkJf!)eu|F9 zjT(J%@xjww`!|>@o6nrT3E=AAuC8#ZSO=j7mJ;t1eSV>PvZ39v)?5Lo>5Lg+fZK?e zTIgo+^1GKax}^{BHw%LGxj67|ypf=#Kw|snpKVW9a!$K$*@9Oo!dwrJ0()Io169V4 zuU_p4eYz};Ng|*7^1MsaqQ~*cs1-o9#6(3gk)bw&t&cStT{!pFbz9lWvG#4(uGq4*otTf~Dm?M7L7noWZJclZS_>kKG`?uM?%JXyUcB zWgbT)cJ14z*m=7|U<$qzqem<4+ue)r(8ltvcz0>n|2y- zWEyK9l8vmyL?oLBmw>dp^>WEn=E{R0Xb~k+P;z7;XT^jGqCP%4yAzJ(CDfYe`Auk_ z{HA?mmTTPMltZb5MA`$p2WaqJObA<`J!Wp+{w*X)I1DYYZE9co*t2yM?8&k+*mZau zH=~MoS+@>a5C;w=9TpBS2uY5XnVC-qvURI4zim}CsKOhGAXebmVFz}l zEqiVxACo6wYL(0j(}b3U7cu>jiAfRp&`haV|3z%`TF>-laU5Zc^jtFmLpfvlQ20qY zdZ5E(Qq4g{-A)!Dut(3Hh;0J9=F+9Z*}L!E!tbw_J@~c+*5zu%B@BxZhD|1jbEbni zdtZ>Cykve&IRlA+RbZG@#LK2C-PiMh?i1cDQS$p+1&t@|$!lWTqqO(?Y2nw9@pKoV zCrV#W&wG|yh;G;?_8JDp1C{rU0S+0@Y6lMjBcPNvy+?7f^7>dzX*un+f~RT)r~UH} z#bL>|l-oUZXTG-A^=fZzKpp^nWY{p-ealN+4OpGj@l;OS6r3m=+03e(Zhk!}j|8+w zM}iT~9LFzcVW?1=s%e8`nnic=ZhDl)SFGs%gggu7F+%XHNv4O z&g<4m%-sX&dEdUb4o(o;Q3guDYar%MO{N;V96A#UQ|&!g2yIcws~hb&tsR&GF^Ahp ztO@T&rm2DEG!4KZ>qV3E(s%BQ(!OY|4XYa#k^Hl*);+pk>+M@F_Vbj8(w!ZdZoP~K zR7oaRmzc-{$+Z!q(cY5O?uj|Aa$ZALkzB^1TqjvMx#2^GylD!H&Z#W&Z6B{J^g!XF zfvvs8H9Tu#zz>ZRgYy1*H~6pQmiD|yN9?-9-}*=Ezw*8#MKTU^fQVbS(sgp$oCL-Z zz6_8#xP+wZ+#r*-UGgVx4UrT#`$e2iuGpwseDCsQOU-Wlh%aC^$~&l)xz4_*bV0Qx zDzt+o=N2oT;e!Sd(S^KZs1ib}Bnz?IL`}uVQ;KsR1b(y~9s)6s?>gkjw6tZl6c6*} zz2bbKrJ`^()gU2n(4axE zbXUd-49DLb!n>Q=S;%UIRG=dTIo}`2X zQsnV29I{mnmK{ZnP#B+=XBQ1WhjPBy>IIx=|MPe#QEQmiijJbMq;5`@=_PK4AdtRFm~VWjz;MRvkkW@^Cz%hK z8F?*I`&H7}^>?ytREoX)-rbrIlLzwUTlaJfRNm_}LE9%3jICYmRwees1pm-)YLlLG z140-8Lq+$iu`I<+(o5>eO7e`BQQjL{eH&|EBX?=6>h|OL$xV5Wprf?SfBCq2K)px2 znpuf)iV{pH&$ksm2ssA|$vd+bEVw)7K=t&ZkKEnN#2fblCvfKF$1PtL*GL*veK19; zxag^~XDu|l&ARZClF08=6Ep?t)NZ@apvD6$43Vg*uXkR(`cP&W^%I?i{hcQi)TsKg z=Rz)qrts|?rM+bLv1sW3;WMKpr^C5>|2}IN+9=#rB6w>iLzZCsb`nj25aw@6lNS~m zx_AHnGFJnbmi_vnJb&vvI%&Uz>8yIrCw>j;RW8MM@5YZB1pvmYrdsC(G2!Ph_3F2+ zz?qYPnyb97iTaZ^g@{b7WNBrrrcMRrq5WvAExo6g3@%GafPEkl4yM-&7_L*VFlDDJ zWlj(EVp2aYujjZ!_vk!{ksI+4+b5LZQ^61yd%xfe_M3?7@I|+U=1apv7A{)k1(%TJ z(ePCg)fOo&$Y`9Mf4QX*t|q61YT(;4_6m5TfhMGAOk%!sNDsj54N0EM=&yE3Y4?SQ`!IP*U*A0x>AM2&w z4zDY0bOCN~cD`(?L3+*}Tbhs`D&>4&?S+lY<&u*oU0I|ZJ#)mS`0~*4$v%Jhs>cT28l&@Y`o;n~ zS$jPQBfTLLfdyg8VjEc2vHA&)25DkufRVC+fdSc}jT7mHU=nllbLsOh_w@X*T%deg zvEmG|7%aD3r?8VJ>+9;o_Ub~q^z*opynq3|f&Zh;WIsh513rME96o zm;LIMgpxxL2NB(=j0~P9P$K!fG&~wA+;I`nx1N&-gCSaQ#tPO74hAGyIILU=DS`MT z_-UM;=45mAFWk5DbOpp>NSY|%r%h|7&w)^*Anx(Akzftj0XQ0(V7)zDwkCJJ9XC0= z5Ly73r=d^dA*q(5wy0J|s__1w-Ec^8OM3ZId}OD(^=n7JVc3K{pS1K;OUq4|0S_94 zLY?lP*TWOSFU(W}_XOWv5`x)#c#_ONs6V&}trf$L9V3d<&x0GoTH9PfbKJPsIXQI{ zc!v52fl;?y#SV_1n*1$pv!W$p_*HedO^zmd!P**Cjgq>0`$g}8#x;lHZHIE%Avb_L zOVlgQafuYWgm}g+Pk$CZp8E{zaL}iaqeqc^QPOXjdWh%98Y`Jt4eX4XN6>6hv2n*AlT?LV#Z^qz&27ZYqEz-gIG$!V>7jio&%v$_ zsE(aLy1>oIOJBsKy$)y2m3R|2YxiXR%odS1F$bS@E>uU7MhXRfB}>G9iq;JD}zi7ML4gU_n;eal~JLwv6_0% z8zE)a7F@xp@>~ur%=ew0_FIU>+kp~CoKtf=Is0e%)9=2!ZQFbwWuEJDD`Ld=cwcSL zUnAV)9Zlm$S3=Y__FboQDKyLjsR4m%=W;mN0b^<77r*KDn#oh6+XLr{m2 zy>=|^$T5ZISu&>QZ`=^C!o<@;sLY|l za<#J^s-(OC2S!wCg;4=Zm2G>fTRK3uWIix0`hDtE8BS+dSSkQc04wt>;-IDVdDpPp_=y1dAHir}d9#}IVP*;Xigyru38eUDYw4#(a zG&^i_It9npjwITQS$6osge6Flw=5aLu<}@oPh|F+qwYI;ojovURN%u0-eW5Llm+qo z8qtfPa;qsx8SQMLG%z;lLItRdmF1*Px3HW^nRDi%^!jH<;OD}TJ|msca- z-X3(g!$9?`H~_@`^t#sdI^bT+Xo(oI^_?v+Y%>BQC{=OYWy7-kr(8T~e}N(YcgD{^ z1<5Cp22w{&dl&8yD37fUqPSYvLt#@Pyi>06)EDOuyMl%xy-hjALsK}X&W|fEJ~C_ zs02t%4CrgMhxvn^a^7V9^|4_0U`r+8#L<7TID-2HR|?Cny(zW3vuK^3O3}5x_92HN z@{@kkc&x;|D5pDxT+`OcsF_Xpx*D~?Y9ul z@xw{m)y3-z8+B}ZRS}sAC0EBn zVu(h;1?!#tV563x zLE?fsnWOyuBYTtYaCwEq2Ke+;xsj2{^z_&~fy@FbHoxDi13u1G;^u%Gv~k_>l>fmK zy1f*5+C@K5{mpLjpJ)arHqoFLsS$uMu=44m-Dtf#Y)G*DByWjf4#^C7=mKMKw{g2O zIe%VRPtYl2aQ*~15%M*r!|GFZ1EgHTl}jM zhd{}4H}B`MU&saEQ|7h5Db-qa?45|FKtH)~{srC1zu5rA)(Y-%>VhisB~X*8>(AwI z8X(UOKXN1&=Ld>mf(Btmla5Z%JB1v#8$}1o$ize+ngnJZ%$#oDzD;98=YVIph64RM z?ZVZof_!;Fx~Q4-3O7-f%AN(vD$>7~O4WFg>jnF=B+&vvmLlsThM(y(e!u_+?uHE; z=;=o2>)(uuDn-wMZBy9s<8-ss{uIiXtdZ}zz}EKs<;zA?M7SAJ@*=DRbcEw=XBR;v z4Omu~6_G=R9b2GPu*FS8-ab=LZ?z7@uh@pUgP(N$wZRA|QWRGZ7x^r@I}N}XwH{t% zkQb zMg9`PJaS4SdJZVj-1!k%=?<*uaf)75t2C=5{klE+D(;7TqsPkYo%}_9|31QlqmMWm zY-?@Cg1uv8f$XVQsb6CDf4{5Fm_PKX5-z6OA1rHn>)oy6D5!SW+miC6O9#t~>2V8b zUQd6qys}bF+KW=7ymeaCj`mpjUAkL-x?6ehDd}E`_4Cw}hVD$WQstiZ4yrz2bAf;t zJM_N3YtN$_+VW)q{nDD{2_=&|ZzmsTfYRReq4H_|Z-ps z**Z=s4wQoWC4X0KiH!996Uj?G?#k^A^Q&+9>(ZRTpv^#V@7JWFuU)#d1fnR4Px|B@ zZrBP^=VASs*VMBemh!adZ@EDaMOw>R^ApeN{@S9)*4BBh?r~DyJ}JdZ*Wu6FjqMKE z0+TNiTfR!szR-$L6qst9IV-HgzBbkl*a`Z;O~bm?XVPLK}%V_zd@C=#5pEk+h>Ipw2(eud#UT`9lt zoWYwR!*VF_54A6Q934R>B0!qV^K(A&GihG=pA^U#QFLw=3CCP6^NC!H`X~KCCme_)Nl~WvTzCkbiAyJPKGKbA8 zx;w?r)PvNh(CYB*@#4WVZUU>pHHf&(Doc{u`8&cD`0x8`d^>oP?UFxBVwiN5N*D2y zo4GLXK_U_FXAzPJyfM|)eQB5%iLF?<66147)F7}WD)z`2Q&LK}kqWXV;`A71RTM1( zsgMQO_*IzLQHBg+C`MShXeS{{j-u@@8_x7Co9#mdEKb+yH+ ztnd-ax-wyB*`IY(_%~v=Y0(=(g76R`GTqAR8NC=%*!eKdQ9;4j0=a-e1Dx5)&xK~- zWgL-O!k^FtBgAF;ot~C9wL^PK#xR-%(pG5+-_Q21T_husy6{AU^yFWhDzkN`ih93+ z2e@sGg00@4$14U8(BiFOkq3RDc~+q9(1%%c46fZ8s@yD6mnSOA&NPF5c;%J+ji&Cm zRsWTkX0H~An~`eUI0Lr#gBcda{?inc{yp#PeWmYT93p6VZSvk9Na*u-*Np-Lb>Utr z)VrZxvj|ofly#o$BhT5|Lx-XlVx--&aPxz=e{Skjt7On6gCWKJ@3y(yFj2iKB_6KC z-Q(c*PFi)iko?Cq09>eZAt-A%+HKG}dC#X^zWgCs{s`g8T10hqR^He0S-sU%$X_;X z+)rQ%gk2GrGeu%`f0$j&aa}G`4{T-b!YZxJt4x(g7xM9Te{Mm<2R`oCT!J4!zGt+& zGZnCkCY!!&!l}0jp7S*n?msP4A97%d=EcjGvE}qUCr(cQgMlG;QRT()yO^N;0E)U^ z;9PwlQ4DODqCq_|JUn<1%1L46VCAOZfx4+LciwbeJos3T;E{oyT0dmA^is0c3g+FT z9IX7lRVbW$!!Llb1kSOz731Kc`((vPM$VY^;&B54mv9Ofy8>t2m|T9gB~BKn=XmaD zFE8*JGGM`we_3%ILihNj%+0^KU@Lx(_sC75%AK4i7<|O3QhlkH*H6T0E8=WpMi!Tb z`~GZ1NvnHg8g7|wmFFVrx3*#!Nj?I$IJbKx80+6$(E1^x`|yyxOKtgN$mlM;AELMi z!)GQlGO3Pwufa)0{wg;c4lB%+;hDWM)cFMFkC4v`%0*IRnSeq&t84lhvVrjp8fgYI z$~!7I2~o+Jm!}FzA|#5r@9h zjd&tL>kFK<_fSs(Vq+e}g?k{qv}8(GahyVw`}ARA#x4dThVn3T>Qo?8QtgG35hV&d zei#FDzoqH(F3r_Y&>KA(gT3BomR~R6S4B|EM5T9+9yb#b_Mb}%lGKaKC>Jqwu{FAV z>Wh}7iYclgk{=T$+02Lrq6#FpWJR{I<}8GaMiohw$5?efc2m?yB+ z!vmX~`i6!GLpOfoby+eN3Q)7D3<~OM)V{Voo6aq`XgK;7rM;b=i6pz6?qPQ6+=q^< zv@meT53%qx!_|H?F{`q|znI+{)TUK64xUA9&M}@MfJxY@s;xg&gz!D~<&XM2Ic%X| zt`!^?z7q|+zbWgG7eyxLqT%UtRRc7z*wG3;rQP`e2^>3?((hVCakTnJ?6c^P|3Ixf zGV&|)>fDVwOtZM;n4H0MN?XPW$n1Fe^1#fp6P8+6<{6F}Rd*|?buAu0{M94Vj3Zob zF6b(b1r3E3)DJY07i(`W_<|eYk!dK8lDnEKY|AWL=j;qqD!bpho4A|~-kFN0Ek~rM zXJ~pUKViQ`YS{)eRUm?u*E_O42$ut^ShQ>;-T_akTybg`udh$pfg7cHzZ8GL4i+{r z2(XW0XT?cm0%O%DYtNwel(oQQ!)Fh;M~~__AUurJfKxwzPxj-f$n6xW3Z)PIB{RC+D2XO*{i{@38bzk-4PI z5wduDk%od_uv9=zlNbJd*yOzbds;O2?OPST`MgVL$N_^>!ft-<-m>gH{o;LnAOTCQ zI;4+)23o;`1`gcGLE6!Upn5{i=z3*I42Z1{2Z7B68CWbC86~yuG(}9^D85td7v0@- z;npoT#`w9pHvvDE#n~(GI9-9-9FgJ9R47{CzJFiLVMUcdiGZe&fsU{u~U1dJeTDtSgdB_$%yl5Ee9H_o|pUS{>jYh^3N(@vBh zUZOuVs#C%8-g2wAK&2wNWm>eFYYQYw%Tv}c7lm{@y<~nBX0PX`@(0wxGqi;DH5?oF zS|KrrjJU)_QUM?^;3Hl|_IQQN`+QYCrLgA*)3RNW%G1|9>vQyS&Hspd8TA9HaCn=! zeJD&CD`^gJ>4ao}GI4zW8WmYx1A_{pjECNVe#Q{F!(}%Cr{+zYZqT^WUNAFe`mn^6curUge3}D!8+PwLQrB-|8Oke0n(bn4REGkDz-tDABlZSH>D5&|Y&DfTP*1!hFr z1BQr&@1)!HH?3hVQ&*m~(LfbuO?kPb)(MbWA~4A5<9UniWDMJqM4l1N0Aqi3V=w&3 z`2|@@{H0+^(;2v7G6IK==02&tt%dson@b}jRdD#~YVzUV!2rR>QB*XM|H@BdR;jDJ zPu-`{>|74_6oVgVsm$Y9cOyplFSRB50SgO2ezf)6O*NqmJGe9$`{QNBc?XuQu6Yvt`|@=fYd4za`5-DV?qty-~rglhlKE!9ph}F zQ~71VU>k2_#J6}@TFd-XF!9c!HniOYJ;Eum*M$oUK`6Px7@pX|g@*e25UUPPb08h1 zwWXoq@7zn@E}r;1eN#>JYm=ihydJ)^8?;I)*H>FzdC5#u&2CUkDGK|{=^7JszdDHm z4R4JS6|`agTgG(cPM^S<|MdB^Wg?;w@Vf2(hv(=$rngE>iMWE|8^utsHDlWix0Z!? zsr*vEx%Y2XI|f^i?*KO(Kp10O*iGI7$RqhgUmjG%mGeg{X6>zbY^i8E%^s&hp5 zqViA?m>q;Z#`Hw!IenK81H;-<3zj6d(>N0obqp0nEGT{AEc||OK*u0^@ZL0(qXbar zOS?KcK0-yge*K};5~yDD=gs3cVwwUW6WUH*UO6(%Q`ST>b30JV3=hfV7e&O4S(xC& zC%cOx*sR{b)_smJzC1;br&|w0r>@CMaT4SreqZk26noqya0FlvV|PFa&h#1Y5*VaM zrXiXs=83c#aZ*s8tkye`)b>4w;%(&deHKw3?(R2k-lR(BXyC5{r2#%1J-XwxV@H3k zjDgcEetP1qTl2Mo;f^BCfYJ|>R7vSoZtnKe+E+y|reW{1qi9e(JnoRVV5ueM`ISY= zb$M{g8J=CjlIrqu3SpdSAQEt@a~kjRx{8BGj)a==Vp*J~mKM|vsMDcOnYN>O=VH$a zGnCwe1pq0Akg9T>NQ;EP#*o5P*DqWo>}&h->hbqp+rCJs&Ki-mTj%TMn9UC^C;T|$ z`SD5os-U`uz1|eB4Yqvt*Mwas_e=L%9w5~(^rYo8t@3^1yEG18x0ZXC_4;bBKC%xB zM3>G_hz*^0;nPJsx0_debLZyTblZLS*s(|DbsR^e(52LT;v9lB`rS~9JXtEOkn~dj z3~}$bQ!xAY^B8%!aB-LQhkL%V?D^=1_MYK=9#xmmYUpHP_w?JkV9WN|WC^C1azl;f ztX}aVOK-o)X%SPmipt8}d-qC<`T&aM+|C(0* zEx|Wkr@iyN`XN=okJe(!VabzM3lt}nZSY|6Q(ALuXPC^KVTO`u50iQ1It^-8#n0>F zREhzW*dxihya#TB(?oJ!r41z@y3l@H7>Xfi73`go%1XQ_xGY`X-Y#K2sG#85^5YA~ z7UMr5m%bnn03lMuT9JWK!;c>l{@t0(LoK#{ox*q)YKi-Oj@Uputptf=a_?Onk#Bp0u}e5ziT{U`LKpMR_?F*wL^se7`8~*#Ti;eezc_ z-{x|Vq14hn2C0F;!9Kp+&`oaJKH|B!gGU^uq@)h6iDb`zRhonHRU03;`^=^#JHY>%Uiche16_$@=VCp z!-rbLEG)`q-Em*qU%^3uz_S4C!i5QEIR0Fj$6q$+*KZk@m9a4dH&sg=m=~NBSS^2E zsCi@>@wXTUP)$%-!W0uVY7C)G zFxBv#I~Q^)NpD5*#GNknepRfkv%S4WaSs12F>&~zDNG+EU#)W6yqW90&+Z#z=ZTra z(9%B3)R#S6v+`+w6|P^za~6{(i3~_x76)&d=nf(C4MeJOoX~e@#R^0iix8 zV&qD8^51`kT8n^A-27?2!%5|6w>jn~ic9U%Mf+-xOB~jE$93m0 z|CrgWy>+1~t}ytCeo8{7dK|AO{xd=i5edFk>7+tu|+H$`Z_8uaa!t*4kpAN?w(9)N{mm zx9{D<=Lyzd*#?f5R3uixV=)&Fr|?*Nrtb2h&UWh;C~D?|8I$ zJ~`^)Dtj)6#<;(0W!gDxw;>HMiBt4s>tv{trD(m`* zv#%a}G4t)qX^fPE_MGS?(f79<^%l^?9Y0=xWkt!#+3F9PHr1&<7s|H4=MnB-nU~~V z`vBvp;URFlId+IFop*_A4|PT5Yne6eD@4bMzxz0tnxK79MMz_Wuk;ch%eQ|mAFLq0 zy-r}!;5WnTV4L`p7Hwe(yollDdsXA61MMeu!kdkf8QLND$PfFnQRQ1)k@rra2pE2w zmVy+rVwBl9?5IbJP=i9Vsb4;w8O8J;wt8!h*f;H{L>|Gg1(IIgTC`Mi!Qq<{;(DspP7} z!v^a(o+y?!VOID(raK8@6ZU}-U`eAEl(ey2E?dCb%6R$||3yabpuy0{qHS6cH*yIh zlAbbDVb5t67ORfC8xah@GV7dINf5FBoNfZT#r#KtjUdBWYoVL)A-Uso?Roj zxghM|K?d2(Js9kv#xd{rJWC9G726}uKdKPQD%{)n_d9sP96!#@59rVTR93!y^Ja9O z0QrVcrK)unUI>&J($8=Yz91}ih7ad%VRKPRfRP$ez1=+Fl78ShvS3)`bm9N$FJRsW z62*}Xn21J^2g6}CbfZa0rugW?V!fjhnsoA~{(M?jZ4j0BY2e#~IadxmnP)sSvTfAY zo+35XjSiA83dhxj%r}k1s^3*Dxl!DBniwS9K(pI9pGKXH6d_Z<%&2+l1hh+ZNA@}t zsw>di#>LIDv&$;mkh1JCpBu3pXDfk1L}VKoU6%hr`T!Cx(b}jELEiUWWvqP^dc~Rn z8fjM^n==8wD`WTyhc7uw@ zA8B>El-I;VYw_$x$0+>&aZh6<)Dxf z-^ReF)5-a#tQ#SvAx|+D>KcVVDmWOC4=4t16HYe)U2*>6V?)U0+u6_YT(f2fC?b(_ zF!T=6kZ*1J7X5AWCoZz;YRQSGct@a2$Z+lNJmW@}^2XYk^$qp~zNOg>XcK&#BA&jV zOTpEjI8y9t59vYF#td48w)$7&~5DExaEK})H1vH6GVN%`>LR-aqi{tk$4xeJ%HZpq&z)t-M@u65I z%*yvi)$z7_{G!c;r?PzaNM4ee4I8Io&192Boxz|gD?OM30tm4Ja3Q>| zFD6hy0)wr0F6>Rc!N&yRL(W1XO__RUkufn&@Kb@<(Po6lHpr}$gHC4qxA@s=<8r&* z<{RAIwSzMbPb)iAwB7f1vR$cq+VcDDz2mywWdyD`p5i8M?;{HJ|1m_Ax zW-b;xIZnhed1rUWHEVKWq}ys-Qcj+mf>jDEGc^w}>0N(~JnS@i=$uQrbZI*>ryp36 z-7Z~NXMg|TK<`O4#W$pwlVYubW%&j4kV8BB<-Gsl|NYaZad#HUEm2t6criw2GZS6V z>j|d}HeMg2E>-i?`Jegs+q*aKm2kb1U-Us+c2u%$WUy<%OpU^ahc6i{6oyCPf+-;( zG5Wp^GeUG9txHOGw02hW?Jsoxuo$lAtfgr`#cx`4fSaLm__p+jnV58O;(lxTsZ&;) zbVar1W3h|5L{*nLt-b&Ls-F?s@^gYLSw_#LPY#n6C>`7CWBRS8hF)>}yGPMkz8@cS zGv4VpXE2CW(Ifeca=(D0?c#|eMPu`PYrAmcz{|w9Ewr@FA&YK#OwoY$wB8QyJ3%$t zB%gnHa>dMt@zCT6Nsam1oh3$tthlkY*a;q zghBURiMJ1Rke@b*u9_w0RU0nRXi(=Djb$KZ$dJrWZ|A$Y~C@v}$ zuq*9-|F&_#8T)qay1l+sLM=#W6joEi480Nl38vzh_aoar^JIDZ;VGH}?|*(iP-Ena z`5ja33SNS)P4)J)Ka8MNVGy~zH}=ux8**ap-n|qrB8e#2)NFfdDR(36)eYE_Mn+yf zKH-^VY-4H{!b~-djeWLmWxj$#aBEik&mb~?Xdc;lGiJy(Zi0L;qZcB&#GCIXd>-;5n)Ve%9;2ZvDyV}}Gj#%gOF96H?(jY&*Y3rfdiV07qW z!gDJtA)}MrO+Mj`*w}1*0{|Uxs2Y4^!TkBH)RVK&KKE+QgAd(D|oCCNs^s-ONB3}vX&UaNB^TkFqb_%K5@(l?@E z;FywqK3$yzQJ%>IN4;A2_$JXl77=pU&cA2i$@$`hxx}ex0J4o6cf#Qy>!a4)YyJ8W zd(%{q&AFBchriTz?iu6vTL6yX?hjSe2f`Yz_#in!K{F|%fH1BX{8A22))NG!ql0+3 zE^75rd3^|B76aK$tGD<#_W1n*TtA5;?O8fhfeDwcGQU5w3QDSl5*RTLhJQR}j2mDY zM}&@VQzkzjrWybeC_{e!v70wHBQpUT+P;0#^ywIX+Q8YKGv_7D3R()}vk)z)X6Ue& zNGIEBM0xt3HJT>7cGPIBv#eUByU0RG66yH(mccAUwqf!hdVIKMOy+o|jd{DB4>D7s z9Hp|$SV7cq1J4%P+^+;|M(-$lC@;>PJxdcvA3!`fyRI3<_GcSLgP{bhGLR) zewK!Uyw7rVXvz#bZZ7Z^mDPKS zPY1M=3Rqpm8$7CJPg9jEKkU@D5JRwr8_ot-w$AKnaJltTU)Md}<(HO9sf(sBnfC1S zrmD$Wo4c7`4LwXk5rCrigJFmdxm(iU+6CQ zER4#cW~F455?QctVXD2ZFu8y=P*dZM&K~3Mk`u*l=ADTj=MrZCnb1FrzwB5==A4xj}wWuS>5O(7#)g13WoVisyJ6VMqnA4 znfKW3IP21)9yv0%1C|P54`PJ`s|^Gl?HJ?$%63*e9TiQ_iK9oMG=SSJTeT{L7|-tA zmpeFsSIW!DVM$ohB2w%bu>Y&niEpO*H=dps^3%Q#9I7V_Q|j1)x-&$v4u0AoK1z8X zO#(cDukbJKdo_K-+#=a933v)t5XUq zDF7cnZy)tZFly*eO9gDIUPi=b3;rCldeWSgGhYdKOWZm3XMB+bK!P}X76rk($B&&* z;JCQxu#@rcq@0S0;V@!L)4_Wgt3MPq>m`s@-pg5fwkd!6e@gvEWunF?JJhGNZ)=zo3q3zi} z+WLAg^8a5ih;5^xpxj(mT;>-Q6I{|n+sjFf9o_H{up9bWQ>koV9tvubf>5nLG8r*q z76a8&))*skMbJ0`{MSdQ90h3s1zP?0i1@j#b{gk>_rVDhEO%ROYy9V0*upy*IWg(y zKL?V^(g3`F6;1h3RcGzmj^_xyk+g#Q_?U9{N(G#Jmp=T4>hGmwu$emL{@5O_qSH*Z z6@4;Ie&r5QDoq#Dka|&61h@HQQ3xkAeT1oo!S{0m|67L!IpP=zN@rre50?B)??#rM zTF0Gv*2K!ixl7hjp({BX5KT#RwIx?C4G4l;qI_DOSV<+x{oY<)r5xhK5%oJ%A-<#C z!wBz^=9PBxmy>e-JxQM(6*|Q;K4lFwTYZZU1koF+WH@3(ZM;l`7gGaz73@&?6=x3r zusmr>hlU9GbA9(HCQ@>8sI^f$9h$ zK1~2bpdyt&p3Ke@6b~B+rq2Gx>Ta$4V;!GFqH8IW1}aE3Piyi@M9JaXR_^}+aK59b8<8eEm>KJ{0^oE;sH9Y5Y=DO>#E1D5wgf-^ujxUj7ik*~2Px9V7u_}gI| ze=I!wS&1u#KAd^XpP84laTt!o4d4Vurc7t(lkyoR3~(T+9-a^0^)fq1GY;Jd2VPF% zPjfeML{o%Re14gq4~tZ!v(nz&f`X~%a&Q>|EMjjHXIxb^^mYK@y8NS|K|aAZccY10 z`9k_xr<+?hY#50WcyHR#BS&aW7{V+S=%Sn9>02K>AgbF zx0q(Z0x zYq zEcGEnJ`?i}eJv)&}ZfRznq!1do>^xt&kZ0(L}NGiclE z*YMY}WBZ=lylCuzm5eYc@$y=1jE#N?p$CPW^8m{(a~kt1#mH8u4dfMK?Ix2Kvizf zX-arlVYI+(6)d>PL1Qyhq%62Xf*rup3!X53ky^oc$HQlBfH=+Wn(WkbZyKB^{EhhG z)2B{leNBsgk(%1y$ms2h7vGo%fw+OEV*9Q?Y81cYM4{C%{w8@@S=D5K13WQ9*51P` z8BYCkN0<-XJ6G+Ju&u`4Eb^A>q**r?EJotIZk-P-au6C0vW^i1T2%~dwx!tPKKSi@ zS{JpTp5438o;B;x$&)|t6}7Tc67gKpS518V?j6-3Ngz3>!TE$`8^+>D@YKbp4(Ou2+A-iML4wS;;dwHs9ejkZ!W8ykI@gMMKOipehIejBtzTRsKpjU{p4X|H z-UrkGKoGtqOd|jKfYtiueSU!lp1(=YND`eWKqO!r&m2NosyD+DSlM}3R z_ii%<^GmsG90*-vU5V1>&Vo5ZcZ3ZJmLvfh^dU_6pg#>&V$jbr>|&+>cu1m~gPYs@ zeuvNjbC%H~Qb8(C0(s`V;Zc!sZaWmvoBFHCM%DP7YP7_x^S-^jtepQ9B9SbwXzS_GmeZ|bSL1nBa0uI_I?YnO)hj6#o3(B zju`{HXMZ|)e0)LJ+b`|%_v(F9=XW?3RS02ZzYAWX{@Jfz4_4Z1(qz&8K_~pGg#Gmb zRtWPD@M>NgKWX6T9@!n{-P=-2AQK_fC3Hhty03y1FAXh?MO0H`BaGRYt5?Z6*iN*p z_F*11VidKYJo2t8D$YN5Adf*XjpUNsuKpP-UO3+1OW^0>WcK;< zr3RIhG(5#Pu5kflm&C`#k@;EdYQPKU2{Xiia*W%D?_V6dfq@hG=r$KnTZ6!g`X^&C zI%LQikmATl4HBZP&H>QCM@D;r!xQxjcMAq7NO}3amE~rwx%rx=ilY|g8F_8|%ZKuE zs%$noe+{;;on3orkO>F<)hk!#&YQO+$%iF}95(d$ad1w|wMai?=1U-hf&v#EhL@~u zkPzB!p^3`-_w`4kw8w!Tp}1hGiDx?v11s^)A}h^q{?|#I@~nI@AX0=Lg4+;JG5Tn< zLZ?RI35a=3Y3+)UcjDq|q0q3AZ7%3>XQOyCxJTE|tD>wzdIQS`dx8sdP{{MqC{;K* zP#Dvl@-aHRmU0<@78m=ScI4a#-C`d4?b|gd67}^r3Vr-d83!?jA(I090J0+^M}JdL z#!eo>!ANK*>ow~1Y35fl-vbjB`uAZP&cvGwBG6BjcZui(;;@nuopnffI3EkX@cG3U zKc%JlKX2vL0-#6RNQ)1%Hs>Jgt*k8ANVVxtIl={dDYt`IF3u&dA(h|9_QD(%9;M(l z+sn*oIMIwFf=-i%O+4jk9Z6OH9)JycZtat`fCa6?hPdRFutJ_?**!kp3rqjx8 zCOvI-j#)Z1d#A3Urw7L}tOc0zxI7|SzkXdTD1@^H_4_I9X{W3)xuS^zO<{dHj%z3{ zSiW|o(q{z%%YSG@G=o0J#7=MDw-6E1Z`|T1__OvN?l^u;9wXnYd!66+u=-8dl=&JU7hVUQQ|dGBuLI9313>Nu7rd=CTjEVgYVekWT0XT$Z2a~|$Y)`5~ z+G}WPm79<>kZ7*%k3gFhNBy;{J7t>d=FN;cI2_3?* zMkbzpCC+%p=cOF|m?|N|mXR2xs~g)qu2;Ms5FNnt)PJ!z)_RO3tQE^@ z-7zI3U>*H9FdLhQtz^Gh+z%%d$SYUo48F4n=Z{q=A+64d^&1S_Fg(P>y+(t4Quq$U zL}Gjf@kc5kyRx2}lzHYSo%0h;Reb)u_rL)LmEyB!0-_Y>pkswz=KTyfgAF=y);5ht z08nZ{F4Pz&BeQ+W=E!|;()2u7Iw!v2*zN14Ek%POXOEDW=OiP#;K~*+ueYf9-Q8`O zx`I#45C(nloS9rR_h)QZ6yJB-h$n##D!Y@7X0&NkyNDLsxn^29c>Y%-D~O-6*5-+D zz(_I#vVttN49AXT(PM)O zCT;B7Zi+mDS)sLBwZWx_T9Q7ZvsMRTi_5I2GRAOcEZ11_+l~ z&z`k4mIg8Yj@$-kL@W6Cp+jBC137(u(QqORCFRENYDiud*KDV6J!|peKH9!3S7L+2 zATyn@dUW)pb2(qCs_b=-F&$J$TMrurAdrza4oF(T7oIy}971rdj~b3jkf6{e_UySc zZP~rMcV&igsB0aXQv3vj?A*D5Ov-R}(pH}|D^{)eozPnx!rTFiDE|#e+d%<~E{T}_ z^Zd|L-@=yy``+3x)|Hfwo;>NSyq&2tZH&L^`Kwpi0L(IU;cU$rOo_}jU@HC&;uMP5 zl80hM+AU+kE15K^K1kH$n z!LIaDiZ@HApb6rW90vDUeExuU#y?}8m%K9F5!Nuoz(SaH+IwdzJa&cloT4IJcVx9L z^N{fqq0pqLCZLqKqf4_uQkv{IuCR=SBFr{5jYArg41^ zO))wx0xphNTQMe>RPl}xAV()+53_@u+5PJT5VccML;_QY+2w5DONBgPd|ppkgZf;U zLy+)y6}D9;Nl6pmHq|F$v_YafQ(;0R&+B)Hfi^#tOHOw>w7Umo8%+KZLm~)N`|jOh zmHnt7>p7cJ_bRuK^B=_)1FJzdmYO;-Y56{s*M~g(U`+L2695*$*=ct80J@q@o5V*A ztPYn{kP_#J;HZ!Mfo%b~aOPru<3*@D2~G#nQqbJmg079|M~+#lUo@n1<{Y-v%6#-F zJIfhJFygUMG5`k#11XOuiJJji0-joG^@e-*?p>#GbdLju4V!UcPQawekwQ3^dl@_7nBAef| zuQ9;88MZA#uAHRe4d9S3UTko2k)QOu;|5(r*gNB%o;@W$tYaVV>h@FRb^DC?rD4&H zcU;RO0(_)JntQ&z=2_OJH2K0rYoT^kcbsrO%wz&o#C~tW?8=MhdUrW9?-JBbSc||I zzif>o)%Ep8%O(gBu%!0ZY7Wiq6G}pI1vr<30syuE%_RA>-ldRV8ue@JMe8V`bpe7S z7ba7%c@5(h6JQ;b-uvU^SvL^S?o{_-G-Nu9f%A@S+pv}6isYQ+k@4UXaOk=b6O;Ae z0nPL(dwcv7;_lyHRDG+j)Qf_G%Hm>S3^x1)a)#hH0#alMPZNgoCf>~`RrCi8NaF;{ z{>Ea$=LjSSqt~(H#!>G@+Z1GHlMi!`uM?7`$8&dTcB{lS2-J4RgGMe}N@z|5t}==* z_O*Mp5mR!A0h~Ml2SNn_)lgiVDHjNsEsZLzCcDLck*XdmN0^NaZHIb*mW$04^_<{U zHj#{s40*dhYlD0-jo^@?<$#XQN_*}6s3cQudh`oWDSqhsJ8y}<^7oP4^H=cU)TuUWhHLR(uhQ*o4*bUJhTwCLV6=vtVeb5C~v z{IS}hZNp#Av+w7`4-GF089(UV)2eodg7KDi-TgTVA#+iszy7SLAjRYkFDrC2aP`B& z7E{y&Xt0j}JW;f81fjYZ+vM$^yh0^E_e))S>xrwy>G2MwHwBHW-hLC7jw<)7Y~pTZ z&hHx&J-%ZIynp=Tb`rWZF<62bNO?)exoe-~s7JsD9n7jIIzO1zmoL+qcF^lME4`r@wzhFklQLgxLHANjBXNL*Szpg!e>mAVlITrZ6QX zwse;$m${hEV;p#>v6!vL#ONTTOD{#6K^aujTl(mAdN6F1jMPZeCen^u?trb_=+iuc z3)r#y&*i5xy<|mmQZSX^Q*`)>st=t&y9&U8T7T<1(fIqkF9>hf857~eWOWX5CJ?s$ z@_vews4JlPru6oOE+x`=w>eB{2Sx}k5#fukV zMb%4y^5Guvw$XEIO|i&9Nyb9>Gn0w71Q5*UpT6vd>Q+uU-t4^x11?jI#wQJ8NGGWq4^6>D*T=J{zrN2q-)?rbZ8Iw# z3)i~R{i=C)vW_~|f7vd~nu_Y)s4W|rq(Ad>@k{;W)%vQhx=4F<5{Kl&9dgKSYfWNb z4FlFDhq6r1j{);fL*LUldSJUC{(^peWzbWJGYDZBlkRB#vG#b02jeS)2}r15%Jxqf zXe(?oFS=ZDnP(;4X7}Ks@8m0Y=2VR^cbZt-!JQx7x_;~Oh3@fsewJF(EiM1C*S%6b zor2Lobsc$yv6EAl{~m`4y1^@<4;`xH`!TuwUQxd%<#j>#2Y%>YWwg-lRP2$>*B@M5 zEwZ>#UQ{rtgS1t*DQ5sx7>LsuKZegqQdw5kN+fCr| z+3GlxVW%V-CDbcoGky<>lXogW zG1pd9t9?FJ^%-Pdq9n3R+MQYcN=l5sf<81IGzkd_p=^bHQ1nFRoai5(P2<6x8czrV z6YcnBUV-AMfdOg)25es zd2a6Rjk^SZk`qoTI0;Ideb1UqlO3ifWRV>3{*)5@`+W&CT`vonJkFy%xmDM#J7C^V zcrhZlq~bvT-oaqvkjGTEf>sae4nQ?~3_I_!V>v6ajtBoj4m3QZMNSsRv+!*Sy6Fl7 z--`RI{r5Bv3~+TGs(>(OSsaTJst@7th<7b4fO44Z&a|=`dHe}|KgwT7%Y1Sw0HwW@ zEkBA=Kz>9f%HlQq5sI$)gF_dXeTeG&t#3719yB8L+l&Y%%jw47i>Lm#LEYb+D9+Ef zh4J2P_nbwGoY617c!6Zl9v#!)e@_5i9X5>12b3QpV?GiUDHt5>M@owSDGAl=Cq$EEn)L zN<$nZ8II`a=t#DRQX{g4As9o)@@t*QN@ecE8j@0g@J5A?MX&y4MqViiW*xM)|C3On z|9=xo0*?{!TP@vvN3Qo3ajUp$uPalQ-V=xveqPb6=WbLO+OqP*wE|K9;_g0f zuu5QwGpJX9fBhq^8Y`lGUqyO*9)4G!nU^ILkM*(q zZGMFu%Z=O8F~(FQDS?!URBJKGbmtP@T62+|p#2cywl4 z$qfS9cAJBtGO4k}~Et`?@Cko!|LYfFxfx|3f_qqJzK#P4HFIS`gsuA|PyLbCM7$J^(qpBodu-CFGAyoMeBAA4^amgD-q z{Wl3orcg=9l%&W^lMIniBvUGcghG*_QE1U3Nh(Dpgrq`JnhZ%Q6%rXjN>YmE`T5+f zWv%u5ZU5)p|K;=D+P=$Ly6^kCuj@RI^Emcn-}j^LAMzphbB79BOHj24wsPfx|K1`U zk?^^KQ}jUUV}*@V+kWL-5On?@G$3!@wYqHphw0z3m4Bpuh2_zCtbHxQAx4kQxz9I z@ArKaaAmYS_@14D$~Vt3`~QL=9Odd~2T&0laNW|@lip~BcTKLmXW?#nZgImMN%Pi3 za2zTAm|bs-p)KeujbCy&41{Izeoz} z{V=Gyam~<>*@m$LjJEWNlxiAK*kZJu>8H3@W!qfJw?;#$*MIl1fcth2tKGbSjt?&j z%PZ?Cn&XoH-Eyy4u&_eV77@p*;{UmYpbV&`KvI`gtXLm24f~iWQ|gnZP|3(F5k%0q^KOAa6*L_SjFjFCA9K@zRs%cguIY_WP9)+q&+#GqX3u;)K_p()hOnX#?!;I_cAb+8-OnP002EUS)2v!k|GD zl5zM8W`>D%>GB>&6-UR;mg4&tFE+qKWr{I=T2yqM1I;XriV&AWGVjHG9sq<}(HPBgT&9n!b&&3pHHSo55C1RSpT zXF_pdAQZ)z=7>?0~h80(hv3zA*0nI=k|pjnj#}E2C)WuE+~7!jwA=LA?nN4x zUwq^7LN%fXqx0tGN|jDUG?EU0MN}HcF33xbW@P;B+rUrDlumDO>GDBE{`>?dv|DS} zDJia&89a9Vf1*sQQqS>#_84=}0=;UyU)kx~OTlE*EqKBlJqn1tc;CLJqqE8?Dya5S z_SKA%nLe-g#Y>mco<1$-!f+kb>wRc(I0XZ~7eK@G=werE*3EGH8O=fjHf1galX}-5 z!e}k<>{(JOv?cSxm~=m~?@>XWJ7v(`O|%b@;lOkQ3*KSav$d7a>UZ=JLwe9Ckdl;@ z?Ja(MoM|JoJMJRN0`b7cj3t19^c+QIzQwG>TVd_Wl`BD5ADaRa(#WGhe@h*b3$4Wd>k}^9!`e>Vgz-#lm|Q<-;*bW5(mJ? z9OXkypb2WA zBRxa%IOHf)&UN+mAXuBo{6~$VQw%hd>%`z!8c2*WytL2{;hmv0onUq&vL#FPrjH*} zb8^%e#wwlqDqCVgUDvLH20}A=I@H9sofh;n{wJR{;4Yz+j%y?VC5@UWm@k10(~H@8^Aa|FTc_H}}mQR;Iqz zX3fnO+s2Zb49kCkNZ3>euSbq7xxGnr@mf(-5Xg(!RkZDbqQ$FgYG^)!Nr;}eN2Uki zf@%c%kxj*?F}bCfYV#%z_VzN?u2e-( z$3X@Nfi%ll9hkI$ztZ0}G^ARgZ)hZqYf%lB1AqL1cO19n!TK1bV*{k6AEl?mzt261 z3{842=`b)nv)$p2@kJ$FMx{S~JYGgHr<~3uZD>w_`uaO$yREH^;$%hBSp<`&>~m>+ zID}-rXSfKhV5HzHR<6X)hN=)ak`@i*D=CkKutfCrckS6jP6uR3>yE3SjDbB>R0JS4 zqjMfFK9EP!i#eI5ju>$fkQ7S)h!J9Q^H?r?`}p|j5VIbBqG7{Z&V245Gtbe9Nz@3TtU@SCEHl)W@aYyvbC9B*(8p!N{B zFi#oiP#ZX^+Tr8()4;(&L5X+ol4`)bb9aA;@EZpd+Uk2{@U@1j&$7edjJ>!lC}^ti zCiA1+yB)NNK0PJvUdIXZ_Wpamt$021KQ%>%Qcu?lg4Sqx`LRF#AfQfb@_quNOaBtU z7xY8KaP)kGqs6I&k<0O|S^8L;yWc1GqKgih=BhD|7%F81Loa{*B8=6_=|q~)rlaG? zIVkSlhXre9hNB~2$<-&j_$SmaTH}=Fu;`>bfDiClBK{yyV*`K6^;ZO}-E^PeOxqo9C06y@yFtF@r|0P%|6LOszpaAUYmz&XAO z03dJ#s{kGvY2vX9`+H)j`GxkAPX;G1`_wDzP+8!H&t1D6+zZZGTy|1`jUp13lfze4 z*mR#(a1|1zTerfDm3K}vMYB}8n=nTcTnpaXyLYWv7{ZKUopX|4g|~8xAytI2vDiVS zRMBHOUq_D|DHyXk^VR$JgT+i>gMCQcw=AXAg3dPwZptoWTN&^9xZ+HeM)K$1cWJyLugfF5`b#_Hg5mUV?^w|3l)Q#qwc%(6N5v7a5M6MOf zm!Es;_4%8%E9n|>6P)8?2thdbb=ksBc2)=9{P>`$oSy*7<7KkYtU<>l-mi}2faBQb z$!I(L2;%vf0kyVz4pb}myF@EZ%cAX{U?{n-9aPJcSf^g~}t{%td&D^6YB=Bx2FAxQ$P!EtFFhBsv&|Gb8 zE=Vb@X`;)*X4BDjjj7)7RTzy!)VS_Kr+#w*AVk8Ar2n**kA}cVp40517MT4E67QWm zOz3{qOB={P7Z7UN9?ew#1V3_?5h<^Lb}8V+eeXqFk1hB{K4*vF22v40cxIB<&$fMD5Uc2lw21B>y{XE-eGUnnQyy?bYB zSVsURv#i^M(>sg@xf|m+u!#il)h^!}de2HaOSJWZ@PIA5JRQr0O$S_0Ipm@Z@&KYK z=sI^)duW@cIOEmU`o$xn-6m77!xkH3)Ho&)An(}BVN>ptf$k^g$rBlQdHY?vaD$m; zMAe0iA^Pkkh#62pC9`)sPC6ac)}z}&^|bQ9H)}eiYcs1mQa+w>QGNHOIN~o{qf^ra zlNPSh{3S~u?P>KFhW*Z>CB#G0)YyB@xhAm4^zM#O@NCQTi)oE>27<^^2oRFkrnJ6! zlsbZB2EYh2847A8P9} z^&lxfFj=QlP(Cg&8)rDucqSWWSfc78)0o{8T_iz}Qh*6ytYgj<#%W{LrL*@&Cuf&x z|K(O!{+`2cN5uR~OSOWd@~z#(g?uK`yq|;M zwA_rXt*^&$;aigR_{q|}d*?D#Mj7TU?jf*2gj|yM*FDY2>7_ChyJLD@oaGeXoPrj@ zIwT!`NYVL)o)sn8N9;{uA(RgBi9#W_q5Sc#7nBIo@c1wvyT1=!o{Y>&BcsrwnY6hW zrZQ4hRq9FKla((!BF_&Hn=C&*&01{Mfr62*(q>vL{`j)z#KEEzCx{P%+iSx+f|FXL ztjAW?%<1?Vnb7erdifd$>#ru2SrtiD&ni9yIBYKZ@oi5-V&xvMnXhd;Y~EV93;XzV zSKK^)df+xuaY-5B$0J1V933@URCms>VW$u8diKqvB_Qw0{p}m#x;$wH<z6#{y6<^SHv`x&P@$Z*H5*W)Mror3grwXq1NT^j)tE9zlH;1P} z+)M=gtqm>Jy)K4jlXaYGuytqtEeD=dnGif2#s@k&2F(lO z9>(K~F;Ot)`@{(*03-7zmw-sY=yW*CLBe>85a&s`P{0w^33E&gsQx$$6{VpP79f!F zVB}1(#Xx-vd`+rPh99LD6Jr<_IeWG{L9sl4yTXfiQfU194H~pCEU(c~tGw%jO}7BG zM+ZAXQR4_9Ne9etbaZxf)F|)ql67G1JV$YYk`nd~OBB61nc=HSh#h1L^Fc3{({O-F z!@?)7iMzX{7el-7Y*wQ)sf7q4=PNyfB4z}7JcM{>o6@!iw~d?Yr!umvxpoW2g`al7 zoq*kjYL9gcd5=C|H!YYS<`t@uqg- z7AV|!~E!YC|osXv%tC`+KIv4rkTUMnIXCl?0 zZYcA(A7^J*LYvuSy=LFKNpd(7;KM7An5rh?VI7 z;Dt`wX5SZP>)Zl;x>hh+$$(gEMn-+EJ^EhPOi@4%kAkAs%4m+jdXQ;%$Z>ETqWNGK zy9L;QIZb?eSzZN~%GzkCDk9}7T|6sYcwdlG&A$1Ahd-URbnUKQW0O6vdaOA(ZpxoJ zLzR@3XY4LF-nen3wbB|hv-;}lX%0W+6XY!>{FvYbM_~vvn!;ZIZQv$H4a@Aqj~_oq zGp&2iE&w2(j7ba$A2I~SoLb+bhHA5FCVOv4SZ{c}sQ2s7SKcca8V(FeIku+mO8AXi z%dJeG2$@6)uW3-DK zTcq%mg>Z$>&Debmg?&W@MPyOJ?y;JhZKxoWL>Y1kqXxbnoDZ^((6=A?b!5#K%zGkx zz^cj0Q%3R#0RS&8s$7;K$LV0tvUhth!R;_Jq=X*h5N+ID@YMj>l(YF&P_{10+FDA4X5;frIEiZHki77amg> zzTp{6vO6%%*>o5`?EXv$R}u~Bx(bpW--u!#BNI5{xHPlTnFmTH@=OT80fZ7}F2@-8 z)}6geqD@uxrY`?(Kg0e0cm$seVaB<~DK8!rSj5o*c5h& zmq9hEs;D3p$2zB~it(jI^gKhhWUl*Ei1Gdm;-%}q6C;AV*q^tb@7T7 zei@dZf9?fLhuKk<4T&=|Aa(1YzE=KyTDL!!D;N2)T5r|nwyi?0dxW|Pc?_#wEc@|^ zS47zMuF;&deVi18G=QAMVm$V>tZQPQqBjrlO2PL9 zBThAyt`Kp9_Mtvu0;z~()DaZC#>KRyXPlGjlvN?7wwoqzKgON}ZtvdL8b?bC85ISi zjO+&(sCL96`wdvvT;G`TmQPjowN?+XRF~a9|H^%f-V%oyH$ehfrfPOrH?-jU80n{! zQ(z&pW(hwPQcB=P(`Mi+-%jonCT<5?fPLfOQ1EMjh)Q=(`(v?O-ZZ_zSiV`ULiD=k!sMjok?dOPE6Hl)&)t z{@PWI6c7eKjZ4CL$oJF#jn{T56KX^kEWjlsU zjHm2u+@iK)Of`Omh0LXX;W#m(cej9~=YUeS$Q^4O3M$Mh*-fJUL1$Fk69t<{YrH>XzotQ3YB>s*7kL zQ*Kyb_Pn@jVYcSLowtHsIbQVt>T*bJ+S2!83#LS?uG)OnzPeH<zlc45p7vU1 z^kYeN$HLZf^EscROuXZ!r8G;KSaqHDr+)R%6l2@`zJ(?N6Dt^6WWNt>2jylvQeUTk zv+%f?I5*W%J9W+DmXIN9KJ;t-F!4^}=*FbYBK;Vp5wmhzzzFZ7W>GGcfl6KFB*j(z z4y0P2yl)Ym)+pBUc$V0Q+?`uH+U-utKA1MtV!N=SUfW)ym%o&EB^iT(Za5pG9kIwkx>Xh@mW;Ww^A-TwYb z_2@&MRVO$8wy2JH=NkqR4wFpBJ4VWa--0 zRUuLI_ZNxQW8ReYBsuuHy}RulV#6*aOZ&C8v_Yjn%jNJtR~nt;)8qQ&zb{AL6yOPz zkskFY<&KoI(1^7@PHh{Um^DRn)bB4~@#1SYC5^vdv2qO`gEe`t15F((x_`{aCwqQa z-pT`Ow{2`cDSX{b^vE8e)5498ZsbUV({SnaS|8JqY(O{Hc;mEdCG9OwACB$aI9TNK ziicJH!Uhr|cg9)Rd88ibNZKHXF#B3kMUT!YocIH=4Z<13hvyp_T2Zjj7##Owz>wBn zGyb})@tcLN8efjiWL!vL$^M7>?w!x&wO?vWTN0BUZaY0BTFjlBhPJP^GOmcz7c;1p zCs4+XbHT0OQhhq?hEbz7<+QZ8Ky~!ZsJN}WK7OXIc=Z0BGKIn+Y9}Kn_0XL@>#vpY zvAPSME$5wQa=K!O1|R{{1v*Jg2a3dk-@##EXIRB+YMZSs=O9}B&Ouh>X@oZ@jQcbc zFpv%mL>B~AgD-nvlWOm7fUuvUN_VbN{C%@`ypuYh)a&=-=_j0ImeQeR!5mRACu8G7 z*Q(Gn12N4}1b4$JlzM@Tfqf61Ma1o-xA!N8jrQ-qoAwU<230>ie3>>+lT4x0+!@=) zhDX?xN-gQ}?~0f<>gy^c@!uagRrvV4TOB4AqkO)VmcDxaeElki@H{IH22c}5&`|C{ zfF@kux`o(fhrK=aLx_WET9AB#jsm04IET%~kUo84Zr$22eTae=4$-JVcZN;-^6Q_y zSn*PB#Ma%SXg~9KVn&p=h-v)nAn0~c1r>sd}KrX4*pmYRg<5aZR zz#z!q|1S0!q^Tt8ARz*f_2DO#uMa!ztjwa~`YVq0?WgXVzcn>iN=P_4oV`}80l7UM|4O0I}Qo5I%t-3JUGdK z!l55QgeKwA-1qAuEaB&u7E%-hF`-OK3RWs>hVKa;!8OubRaM35lD^kB#5Z)s`B2Za z&aYKI*}|$T!Q@iSsQ-MukFgD+A)8w$l=&o{3jhwqP4Q1W=eYJK5$h~1nE^l>iY|&^ z9KoD9V0Z=j`8YNzdSfupKv+M2|7p{w$B!0DZ4JEE(IBzskRTM9)KxP}hqM)*Dp9KWVBFbnr?>?UA~c|?9r*=GaC8T>=c zCdID*Kf$bM-{}Wm{=R9|eR?nmtj(*dlbvRJgCm80NFNgOS$}WNZK|T6yeb3M{JIm$ z+%LS}V6{B@x^d;?zdvi5m~iasq>gVoDd888{lK`~tJu3REJ^L5Co2!1_6)!EZafvJ?md?=EHKST3L_E|i zCY>Fjujw6TvgNo(iv7w9v0cz~D0rDS$IVh15NI$86LoKzSf5$&*M#nPOC4|6t#gD8tzgM}%8d)5B=;@3aIWneb3Y>a!b132dy~2w+7>fcd zBPcl-5b@##s8LHpPK~P_^kRyA3VRSRuskX$(mgzJ?%Xj^^{Wa#df$Sn#H&FHB6}zs zD^FHZvO<(Kv^NzbF0E}7n<5O0TiIJRR|U--NO-m&n>3uL+t^xL{?J#0i&@gI$%x{pJM}fC1W~Du&x9&I>V#fI1@OF)@d?qFKvkgfl!(+4pRb_Je_aeVy$W zo@x5CP3`cSIjZ*l&K`@X#$CQ!HcHvWv|n-5>bRAo1-x#*Z!-P@c;Q0Gz)*r(oQH6s zpO&vanr9@|k`fY(7<3Hp*LWc6P@WY8AFfZXrwCRvgTGa+P4wFKVC_*Ub&`gN9*N7u zr~R_KGDlG${9L&3!1p{Ys+#)~@yEvU6c3QnUGek|ff#1&U0WU5#ra{kd0{cQ7eJxJ ztL@<@0p>PyCavM_hjj;d))lI=@bK#5-Jp;aP7f4dI>UQ+tGd0B+i$4kSh=ksWsF~@ ztmKi&g~E8qRK-uRb(~zGR=ss11I1=XU_E;>I2c>ih9!-K4zvqFtDt&ro%&+y=zTST zK$GZx!F9942InkcP#js&DSD~C}7DchIHg+sIFv4Cc z7%CCCnlvpS-H5xhv(*WEQ>PZtSjP_Y-I>^X_mDeGgD3(nb^0{ZJWu-j6ZGk2T921O zuVP!2OlCc}PoJGNrHiOc@~rrD!Zf{Bz>mD=3q~xZ6y<<{o`BwgQg!Fhkrmf&1y^p; z+R)Kfx%-Jw)$O^t3j*hlNPc1Lp{-6YftfWJSrz9aTZ7@`-nAEo?TlsWBI1^31=9;G zjJE_A191kh^D|il-IC6NSp!GOjT`dY}!A03`uS(4WyuED8(%RXdA*izksDdaPSc8uE0V} zKbjZDQ4Z~4IC2~s?HulGdgiuJ{vl4&&`3o7knhd`2i=tt%j2Pdk5BIx21J57YFR3D zUQB9(nwnAxArsT@-0x#?&63?}Wd*Sg`6)U(_{|XExldOP;e3E57#a^kQaZqEztde8 z9Hb{s{6Mp8+6OY&>(|pXG*tXDaUbOtP`ANI0|v<&>uH9!08|Ao2N-W<=d5fxd0_dF zXMoLQk3U9;!#BOe?8fZuZ*|QH2{SnNSb2MFE`-;? zgU&f)yLMrdMf}Dkk$IYT?(8Xf z>Wk-kfB_wiGd@1`vyvAzE# z%Juz8W*D^^E7LmITSW4X1ToU2<$j=DuVuyVYFh)t7k}TNZSF1^LVntbVZ&(yf849l z?p{^fHRw~`CZQxVTW71Em~aRL%_}R4v*|h0K^bsZ-g#QiY?!L`fPC1DCq| z6`XLyOoqD9tq}3mhng^J#q#WeMw|%Hg2VWy8_aXe37S4pLj(5F;$W?$d-pOo-2&%e zq2szs^G-0QD!||s_fM_kmm2YkB|x_VClBUkDJqK8&AN8w3M+qabL|))#YKzqtz+4p z9IZq+pe#ZU`wrtF#xwA~yLSEZS)zqcXxjQ1+KqU@>GD<#gv4Z%UK?Yo=FUCLDNQ>D zumW}od+pD8#W=4J)R=JPSW}u!`nKlC4YnG+DUfP;c}I{ck6uHFe2loAmXN=r#f!smzH0ZF;RsD4r&E%>j%Hy{N^P&j+` z!wKKct&f+mb!NN{k%4b9JXLDF3L>NqOs2=q7 zC9ZuIDCgAGX{gcRM{fp}%ZlyOCl5%p9-o&w5Ikc|p!+$?7-@nq7@D_;8hA&m{9pkNYi@BjHN9WM;16PY}Wws?YD^ywq1r4RKGqaXlQWmv@7K&69 zd{&zt{Q=cKnEkisYFHr?;-Qcmu zYVdY(ort3e{Yc~SELSKz7Iv8Sx}Z^*p1yhAx>->LYc>I5w?)XE7dx&3~fK%9S#{`mn?Sr>R9JZ5Cq6B&V{e zDaxV+BWOjQ)D2Y{Gluwx+w7H&BjhMqLYtoj<$bT?bO)>knQyfQpJmUGQu8;f)~=m< z&Yac|8iPwqzcDHfQ_#7Jc_2QlqY|^t&xB|jz$X%SCr1|SYD`iR*Fqy!@M1=m{R~Z- z3Xo1i4H@7outJj*@0?Op0A1N8oeD^FK8j5;N7>tjG5Su*zbzkNs|abavbw#MK%$o1QXfD z4MNhwP`GyXBd2fK<<-4+yTAl96l(poPYWh(i8MQK8S3IiuL-nYr3b_$J|X!Y(+d+dQXj1 z1S2Q52gtKYL}Wz7>@C@yT@8U}bz%f$dAJoJSr*Pn2jLqs=rvt^6uhk>FuaUKCC(LGBxgr?%8Nz(m?Lb>JAqOyg^ zNJwE|kkL_g)E2VtN_9guK6PH+Zlh zAsNy4_`G5o-mfD<6BFfQ2d>)WI>e>5Pyd@RP_e?Ow|BboGH%Dj&@f3!Ox&g(aM#oZ8Yg+1&QNXz zMuhMY5gB051;W4pRR#@Sx)iWxzTvLL3l}my#wwl!koen8gBBSsV2Lq!@4)5A>dIhQ z#~N2Xeez#C9wcjBI3#r2mL zhqG@Yn1H)_bpjK4&MlrAV8G_%{wjInkf;@m8{?OXig$&D``ctv@uqjozR>w7@);T z(D$$|0hEjgM2@aqL_WV#gFNL*OIN77agHHhMUtkAg5$&MM~HVn!VNo_rdAA&Nb6s& zoONI_<~f|0v@DO$bMKs@dTry)Hx=3)O*v&%GYV; zsI~sB?e@6AI;wu~vrtA}@XdxG^W=%eco~W}3UxqhWnVgz*!!2)HIsv!ZJA2;0RF^; zvA&yVrAv8iwXu=v-hGzCCOEir=Fa7S;lS+EXI=8T?sc;P-oE|#F=fSPyfqG;uY!?? z)iWND>$DybGD&#;ymQVh3Y%dN4S|69T}kc}y>>N#@Iacq*n?7-*>2k=gZw%VAMd{X z`Yky(0}R>b&Br?~g&XRgJ%8Re;TZKh?R_qtY>H=05kaPbnFb)-97Vwqw89Ri|Eg61 zO`jjctRAS8b-&9Mk>gdfN-sDJIPwWZ9RUU=Yu7qe zeb6L-C(FYxSu5BjRg!X*#F>Rh#zHEI0+oA1fe-lu3m$w_di5fxPd2|y(%&^hh}u;f zuNgj$mLFF`g+7BVD(r-k$y$RNw>COt_Q-*iTS z-15To!WW-A8x(|RBK=>`bz|jN&NWZ9WP;&{zGI*?Ys%L*3^DYW!g4=DGU@Ak$s_`) z1YI_=Tu6u1=X42kBc;K-;T>znb$xGmVt)lqbNb7u?*Kw;uS8HWpjVAF$^5i~?3K-b zap@M?Uhq%~-{K_$*@+{qvGMM_uvxykJ{h%GXace;`95V?v%~{ZN)PG`g?bX&)t$17 zWQ`+$N;}@v=6rqb^$!U{p9r-aMWTZV5VSCEKgU(>a4&Q;t5&bxU+v*v8C>}(aezyiqMe;H>tPSlDVPBJDQn%Hejuys<8Q zj&@{PwZ^u5nR`~(7WU6y9gGiSLWFz@sIEwQZ6&?qvMGwqS0?ENZFl#rVWI` zhAab~ovz=>UMm}mCd&C_%-P%l9T!8)Ns}idESYL46qd&v)SZ=uv4R^nUY-%T<7NKx zYG-qD>f3%u+!7#+{}>!XDih)Wj1)nkR4a34>TOZZ$SmqAVm#&Z`_t1kH3v&e6PhbJ zZTuq(zW4GM&JAl|u|}Dv{P^@K@8wHI)RC}5MlavSoIM_?ibJBiCF!Mn|NiiH2~2Ps zjKcfanGf~Jc(myjKsh%LY5<(b^shBV?*>|7p~UoAlFz6DmN|5nVKLN4%t76B%g7D( zi8lrF3^g`PJ1H1?SAfHnD)mHm`V3@M2NWuxdY1C=Dk?Z958xQdxFuW%^YcrHoj-oC zwoa&nE<#>QAv=fU`)TT5IX=~diCtXZQVeVQ;0M7`Mu^g?I3MTYXpHgGV2eO5=F$t<~W-U1M0MBi06uIE{?@U~51P-Z}t zDuo5##_DJ{;mBv_i@Q1f9Nmmh73RjY@*h*)kfhON)O4K9DD^knCVF4W*y$W;62U13 z?-+?p;k|Whx#$!8oz0lVV2)lqa7tRP3WZZAK!z{e13bSqOw7%fXn7`Z$tYEqk_joPhtM~?{Kw%6HrcbZhkE!e6g6f|~ZWQ=j? z@Iilf^8TX7oada?OKvt9Czu+UlLPVgM`a~RCg)FV`DcsLp|tlcdb$yJ$a}VC$(Azo z8GkiHr7x@OD6UAUbC#d->fdqy_QxvQsE$Rgp1dPqw9{ZFi1Di2RoC@ zxSl`*q(x7F}x1y`NATdwIt_r9~oylt!~T`uwu&ey8Ao@_Ak<}*2K-`LsTj}lye z=TFx@x!>!MAny=yovsja!@uj84|>z3{%RLTM@mvT!xonE2y}ise&$TljdAx{olk%5 zwsOqhy|CzOLJ12$ofO4Cu($?XSn+zo!F0RQ-@W?4Ori9em4}zQ{l#lY)fIKhDhD7&=I_Vwu9f-CeCEs?o3hzH8Mcoqh9JI;bI? z-p+&I=cdDyR(eCE7x2TdUBwQjgTTipQSE|JAU5>X2f0duO2&x|2*K`oy{(=h=WH)d zZzx?+NpfUkAT=AsdAId3ueI*g{YAEg9b&5~`k>q2pKlQ?0-C-=Zz!T9byqlGD1sq} z@=2WabREIgY&W{%PIKDNFU)p1gQ#RZ(`M}a{D>-&X2tyZPr%c_+jtp?%6UoG2m=64yca;3h?{Gn zpmyO4p;{6qoe(%$y51g&z#9T zX9hJPyf4@!RI6D#WXGj#>rH;I$R|QmcB;DS9{hVje(KR`Vm|b=Ff+oC9Ki|}OzXLQ z`;fYjPeyBLpe-jQ8j)`$CBCOl-HeSTL1?V~wu}Lv5GGcyCU`CmnufBo5TIX1hE7vb zaxy(SEs&z{!9vX-jaW47h%~NO39<%9HR#~a((k_soM!Kho* z>UnucOFW5D2L^~Wh^>kE)zvR`7M~I-nfkRRc6H>UAg_>u+sbw>7My6&ZG=$O>c zH-vTKo9YNtB4UhWm3@=C3!|4_fNDg(EBL=6*_H|r_0 zS~N>U?)ZTJyx78v+TB}!Bl{$?gf7VYUQ=+=hBetwg4qbBk*_LN-5A_1AuFW**9!f6 zolfYhvqbuIW`Fg7)>!SOS1V$xQa&xR|5W5Sy|0;$__TQkG%8N~`>Y7EO$L-&rmcGzF%-^>7>n&AM_&eGP-Y#`m zHv!S+_X+aXr`C^zzma^WVb~-6m16(>Uwfsq@|5C81?;RrrpW3Et6J*FQiSu7d2^*Bkt6N z&4NU~b&OlIFFVZN|MjbS|D1vTMJ^9LF&=#R^7f4zHknTIt{O8dZ~2O%@E5XHtKD?) zGCs%A=HnwO`?1WcY3ep3s42gxNQ=dud>Kq%+PH@P=?ADqBuY$goW9@$YcrO}DK#SwHrrMtS`svRd4L_0?{O#0MSHKrJaOR4k zQq}ti!9a6}$`KJ&VM~@P$D+O0)zwAFMmO4_q2HyYv6~-grqF~#69;~sos+_+mc4kt zcCoc}`QaV|lUsjfmTXKki9iEAZd|0BTgncA7{L+rpJ%P7rZcJvqB95!F*DxO2r^G` zvF9~16Vsu+CB(4gc2l;auMw7aEnn{FoMRu1ufEg`oga~Z)!5p5e%99>k3O3}j=8R; ze@WeYzKZlQ$b1H)^n$G?t;Xy6YmY;^eXh;UEP*pPLK@CS%)VU#2C4%V<_3-Idv)Jx z-tY2qrPEfH#(mvB`iUU!k6rElbX&Z{l`poD@6Y<($g_ev5dFHeuy6)vf&Ds~?T0<| z;KGjey>@Q!(>J%ia^7b9$omXzs4A#!=*6T;NK=(#P8lmlMA`bEJ&Q68OtkDp$;Q^W zB4-Nt{t_kc?=^fb?pHsli;}dyn~v27^hnlQx;M~!ML`r`U}J_9%Z6svw{J;%DrZQ= zUC%G~H!$Joz=3z^RgmVB!YA7Or`nF&`_HDch!ar~1%eyq_UxG|T7av@^DaH74R@ne z-89KA{10drwYAt?cRQ@8?8}t#ND9o@)ie)xHT~*;)%exhw_iVf`dO3X2QK)kV5*8H zukX8A; z;2fX`HQQlbawh!+3z{N-OgOXgLrp?lgWqmFS&N-J$4rt2FAvKvf3*H6^7PcykLQ2J zt{!~t*Hg=1n%bqgH(gHkYI*iUb@Z@dJ6*(e77`T!NlGQL%HLP~xMyvj!rX23H{vxM zlS8gwe|P`Bz~vasceD?at@h%WuHE{n7kdzNsdPe~C&KGNQ%w!UbFFUgiWk{#sOs1C zf5sB|B-f2_>E_~TO)G>+O3~Ge@fA?;3JwT>M`XLr5n{ipd9p#Mq2HMuMUFL#tgYqz zGQrNXGBSqwIFN_zu5*$&d=@Imja3)q)>&Jhy?3wcVO_j|u?m3-F+gH&Q&X2X+i;uh zeQ54csOOaYie6cf=IMtq8ii2&NO&i|&|{1p8zC(*nchDlBh?kRV>RL8g}#s_EhYr? z=;66Oh6=hz!;j_I9U`@*Fvk&@;UtiXrfYZf^;olK$Bw-}*Bg)M3kCegk6raIR~0o! zY!vqoc9E4kwy$Z|tcZNNWPwxPqcv&Bal3B;k#x6%c1-KO=33cu!`m*cz1p84Y$0RA zX~p=6o7*h@nb{&QH)x0e7G6Lnk5NOs2YFOfa`UmAfgz&?X8u}3N~LvJmp%kO$A=_$ z)TSqvTs~OvPh74aLwI0x4uBXv7nq3gckdc3T9jvH@6zG==tV z{1Yw}5%AUfHo&~eBTMRksej1N-;S4ah9#bBbj2@YwYg7riQ@J(>tQ@GN$G+En`G%S z=DG^4EN8OP_neeB^wz=o4JEXP2Dl9J;CjMl7~I(hQ;>0cf8Zx0YQtLq}caBU|rw%TuKo%ik)6Yn=* z&>$G1*r63|iBH-5MN>B9Udw{DYv22f*1Y1Ab6zqxFYg=Of&m3@-wy2E+u}!$5#IAz z07(B2*}UD`o~W&&@~6)0{j^+c2EO?)YPR^a<_+x)70btu`<;)ZrVkSwUR}Dx#%i9) z>@Oze!z`KqVeL9ckqgAz`vRixfJ6ZM64qB$6)sk?lBKDs z40YTP^P2m6{=C_lX|l2b5D%3WKYILl~L9UWKS@&3`Y^tZ;&7~tsyL{}>mRPfADb%ln@2MkDZaZB#owyUN#v~A@k zA$u2*azC%;Rh1c#i`7!v>en2d17wb0B(5@9JLiVwA+UncolznYyShf%b#AUzt>`A9 z0iF!Ap_`Xk$!HxZ_0&(5!X9@b?jQUod)~G<^_Mg3J;^#&0sO^FU@)b%2Hn5 z0_Vhq0EVospkU_AA}iafy|q^=n|F^6HLP7D`;qqn&)i~Lb=Ud*w@(iNu~o;65zIQg zcaMP49B7-o5BbWxu)3O>UOm$|MG=z&hn`)$`Qr}AD(0%=##L4gss8ortiQkIEeBrH zV88sPO1W*)oh;1QZZo@tjEg#%atcOC=}dp~nRrHGYhE@%KWgxOecK-yLI=*=9F3nJ zr(hJ@EH=)8W)@J(>JRrcIB(0!UPDfKRgZW+38(zXSMuXU;o9=Qj~`FAx4Y535g;r> z_0KuR3keMsS}=Bf=#p#uhjCnjnf=oZL)74b$^%r z?OCq|OaQK!Hf_YPVR;!Duy>W|Yku;EaG|Z8!n>C2>f);(apkUOdQ`>L-YInjjFLKa zs&7q_#3Z?-ix*#JW3ggFA3kv2C$hxiV*{;tg8d@qdnhrln`$Eioe{;xIP+asUHNcaEu2I{2h z|KF?0?U$6g-|F&j-Pk*N7=YDD;eUcf=cgs}X|D_F?}YA^nEO9|`BbNr>7RQj_=ANx zpH{K;z?w1o54QcSk?AZPnR5I;OFnKKmQADgsY>AbGde}DP^-RA#3lmB;{|6Py& zKd)vt_a0WaXT;ANZSwtaHHtZl7LmTOW>?)(p0Su;^#?^+TjaiCy@de^!iE7Sx75n} zx?P$y{u2=@wZ6+rebFVCR?L#j)y10Sx)NdK*xjnNp>Ew-%TlT#ugb-&HD9*#FIwut zM^{I=>5m7<$^X4~qqhrRnwP$ORu3V7ne#J%wAx4l zK+I-=Xa7OzuEyy0HA#hNs$E%N(a(aD0&KJ*>NuSMmTW?SjO0 ziy8!X@&EgN!UK}gf7s(h``7LzM`xv-TQqL@&xo@&Y6~5l4eC~89WmLA{s-0#ij2Bp3y#_T^fIwk#3*8t0-W8~jl^ci{9&)!+> zL~Y>$lRYDIO!nM4q@THDr;1U*=K;k9Z}WDE?cE;6BRcUmW5ClI@Bci0F6PyU{aL4) zznr}3{MCGG)AznkJr>Q(elhX1_>t%1ALp9~7@w0}E)~7|Pf_z8!S6N&pNO~9ytm1B z`1EJXRpl3+Znuiwe6&&FaD~~s2gY%o*L2azd3al1s@#gz?`Hl4(A+wDOMqF@-j*M) z2fX<8B4MCsaF@-`OVVfTUo}9+Y=|MZT+gKVQ2unmQrmW~-tJxfX!MNo$pV7vk>|PD zxlURkPd?;s%WRMBVzFaIL**Yg85nqA_qc$|<25dSZ`ZhJV4AmWflI!A^^t^y#WFwU z%zxD(Ie*ab_G?F)k1V*})@SX{v-g6oF0Jf4dwy@F4;#L%5lK@y+@jD=!Sd9i^N!xb zE@tdbA1!*_Ze!dJt@8VATg{Zq6c%p(7M^iC_F<1_(_{I$(Ny>IxYO`J`^(RBC!~B^ z`_6uN+_R|bO+RV^mY;Z;_-f+Jpg+z&d;D|bG2?r~^G??;zL1fZV$-Frp?R}jod3G~ z!KDqwa{JAmH-yGzgvE zRv-04?7h>=xWsJ3GV|w6XAavxyV~={wn2pd4*H%oj6lxwP{>(sKe1Qb5h!0p|zIku$NePd+hI{f7=@POG0yPo|wJ} z8od0(u8y{wKhM0Z4vJjUxBa=4>$TxxSBF{6a&k6^AL_Vh@_rZJ!y}B-@*5ic;(`_^ zjX5wQt#NnBy@7fO=hxcZYie@XId_<^m)|PI%g=Q_j+IDAe>UQ@SKm!IC= ztu{dIvT>_@i|X0Lu6hzT94nR`Y@1%Gu>7)<#=TD`SG75r?raX5bwoEs=WF_uT6@*r z{`wE)^yKWLD$OtS(DYO|VKYHSqAg1*eb}w$J$4 zXJDB`Tkeefr07rf_UkO>elLtD-<4TwZ8|&W>5WH0!rdI_8s#(w96Dv!{Su49;8N(u z{dMV&)Ki|9x*S!lRkEJ5GxMF4j^Fo$0o@92{s>;AGOj$}^{xK(wy|-^HK!hTq(mL| zt6g+qLe#|-PJ_KuhUXnJ)@oO~F~ND`>)i7CWky{Fp2|%Blp>+k?L!2M9KNL6g_J(pRa1ZzT23k+lw1_Wx0>$MI8^9#5pdE?tUDfnTT;O zB3$muI%u{y^OqBPotLgN@c-Uy^=My#G3}?A!#!n#|k^+Y1s8emLyy zKe=s5$IH7%&X05Z?9upH`)>N&S9`jAaH`$6&3i&f*`<;D}dQ-l+ zNX*Z)8L~;aXVSFiE)DvL{!9B9e%PfrA~T|F*tOgjmI;lIlRN6JM;%!A@Px7ZW>34B zdg~Q5nmQa$wHJ<@QF`B}B7OF#bt<>Zl7o>KQm zN{waE)k(%uS#6g#yw+|m8kJn0?)zaz^%jfAWl?YKvbs!6;qY2fXSDLoLs}eyW9(tk z28*LZcf1pW9JOshUBM{dMPUcyt#5XuWl4Qq z{i^NS{rKCjoISFXuNiEe{_Nq;l8zl?x-H8$nmoQ??)+EhMsKi;Nx17ExGzU0m~L~* z85sIztNa$@?JFAF79Y{AGJo}Jh?<9ry4dVNlfr{m*W@odW_;jYQ@r`A8u2A}GJHBx zY+}^9{n<5a;a8u`Dy`u7x7syxt@fy$csVV(wMe6%``EV$1LMqk%M4tqy!34F)Dxey z;(blD6DGxH?|G7FKJ%u|in77#*P<>ipR(v<(y<|C3!+x9m++Ws)zNZTDC+ZNVzjy5 z7rlJV7*p??n_r9`{wqNLVN&~>i9bh9eyCNISt;b6SI5%3F6_HNWL|{P6v<_T9_zNA3lgd<$B(@Z(rR@sNz& zIV&7gFB)6k={fn&aZY{xKd2{JtLC>P?VT;&IO>{3&?Cj8#)8HA)!R^Wl9zhwj3x7= zm8&#lJ8TuY53UJRdJ_Ldv(d$LL&vk>pE4A^LvxpHTzzxS+LsgC3#MK;GSzBk-=51a z&y@|?DX%vmB4hpJx!2zKtXmzvqGOCwaY{nE%fK~MhQ>JfsF}aXQW31k+x!AMc)<8>&%1=0Ew$GVzsuWgS~|`XpSub6r|% z!#AzU6{R*-D(Xt%~;$YJ9<#cw`O>^{;cc5RNy6U}L#&8O?tjk7Hv>SbOFDBR>SaD~0`}bt$idWinWHsze3v`TM(*0Gq*jxAEyVbU@T@dx>*0SyL z=Is+=wjE2%G?qIb^`q6_*ra`1^T^{JmOHmv`q(@Z3S0AMM}>6!lg3NUT1!gWCXV|0 z^W9_K(xvhJ`JplX`m?PUcI0en$nqp&D2e8NNl1K_H};$Fk~4o~Zu|N0=f+HhQGpsw z%QW`w^{L->*il_k?fcL1Zc*Lt74vib?Qy+$bD)^`vMpui@0+xe?;hCMW25W#m>I=+ zAKx5${v$1N^H@u-3-jVy_h&vxN&i08(shZ*i>kVu^`loL9#e20aQdg^U#~cJb&}+D zqxLaM!^52pDdtPvFzWEAsyyW3RFpoTi^=UDiG@AQ)-7&3zHriod5h!;x_*Vvi<(a5 zCe05D|E1C+ah!=>!ETo!D^9;E>~LAzeeme^n{I~UJJhyW1(=Od=@xr1ar|iFKDZU4HBwb*{e7I&OR1!c4`SUENz0kKH+V%vI#6qUX>xx4Mbk z3{$*v*LBjtaS~5PdAc6F&|7*0aL_vMlTPN%i$)F{9(mg;%vhvD`Ix@$t{>A=4kVp- z`7!NOWa?;#!r&q;prnArOEW@1N?KY3QAUp#A_&qkx_clgBIh(8~-(V$(6+uDv%##?LT}+NC~xL}|>r{O=QVqx$`rQ2bg) zX*`edH#5D~p4-~2Da(-3%=7L`<@ND>H;09=W}M*BUQ6+=6h6z2Gw&d_8hXmaz8 zy|+lR{+Rp}+K08^s1|vG$E~`T6s0Y!MYI&EVa^gm@jtc~BJ&Uoj7_)Z2lHkeS1dIo zI+yqk!#R2@A_fQQ-41os>NH%ROPZzDJ=xjRdi6>0 z58kt{e7>a@6M+UovOd!%S(pl0|H?yCz)Z~Xb2pG2tv^0SYl%w{;Z|T~$ouzd^AdU! zJ85UkUb58Idh`gqUq>9O_?q>WWv~+6ISd!2RG+3zD1)ICM$h=&Mjvpo&pLW_5A8iX zWZvr=8SLi}Z0l~4(;(DzB-hyM=P5(>TBwPnwhLXf|A>A%OA$6Zx)Dl(mB{!?0?au^ zwNUKLxCbeiVZ0SF{&MSRQ+0`iF{PV`w|%D{WkNZUBxwBwh-hnK0l!`zPt)WS?G9eF zZd~DRIDFj$()eOHMZH`1+K#!O`=eo25H?#OEL;=lwbvtMlsww9KS4aV2!W;7q>7AR zG#i}4)|r>^vi|38AWO}=#>Ls8!cU}j$7*87Lld2m`ET<4Pxc#@B{T0&Et?#M_iaKG z`PeG4Wcli_Yx~}$p8bm{WcjzzGhTxHKES_!@hSz~^`u+x*XL^dLPN2P%y-4j>y3e&QyZGZ!c?-KrzNAIIg4LrU)&6q*2@XA0K2>cCdlA=XIEcU$=mA>y5m3n{ z_q?@YAJ*)iNVEJ2Jfp1H+5L7yn8;@cw^I&c4(^a_sW&e)9>qC$$+lp9)Cs?0FsXD? z=&E{)kAbAJ=&^UMV!1nAmO&Sx_HpIxp4bDyFy<;R*X&R0Dpz6%-sQTakXB;}RxGBePiZpyDF*EVg4rv}XtGk7ZWtR+W-3{M_;%T65GVk9-h$=DT*RD4V z{D7_n>PSFoqQ04=@XKBc8*}affn!`cKTg2nzR=J;Teec7(>si$OyOR)L4Ha^Dj{v@ zOMj}J#iefvG(NrUh*>-ol(i9a!>kRzE7rFp?b~^FHM2=sRN9IPniVAIlB#aL=Haul zIplop?Da8d>)bko5ZJYium|{L@E3Mjz=b;)&Klw|dZ-DVfi-B>6ZM)3ZRA$D*~L0E z>s{5>v-ivHlM_ObM^I&)(oN$=$!fF1h&#g=Zz-aEjSxc0GGj$+gSZvIk*7lMfrNib z=rz%qdf6~`>3|f75U6|GZ-!VtiYOzuNyIlluD^ohxYAe&g*9HQ0jJVc= zr5E2}3G98mbRGxV>AxHi(%*>72C#p%DcBLiQC0bKDzF0mee^?PB#_@>{Kd9!^?Ye^ z+U?5Dv9+kMfheFX=&vrzoiX@hGWGMcl5 zVjNOB z=zCQ<*?KcKd`%-6h!+#d7J&ol1S}DTq&qPHcIrHq*AQqfNSu}%))Zx#7H>m07SKB^ zd8YAS?H4#4G6GUHD|KOcV6xf(;zf`fTwSA=n8KIqDn z=DfcPr(-q2DNQqG9;QDuNqlbEb-79IqQQNer&S@*I>gehAGC1KkKx%@ehCj>t<~ho z$PbN!_>6l^u>xAhyBP4@`*QPr^J;4s11GZ#r@7Gt)0n1UG5OhMN*1CU9$QPzFbEff zP>BC^EC(ATyUIwW~1r;*e5=H46XCA)j3xzio{3>g8?n z^nhpkk#ef#)Q0y+xF6$t-eQG7XaVQ^$i@O%KRngX^oKt7Pe^vyH!)L_+7}V$?dlag zKa9QyN5^%fh>x5i9(Dy45OD6dM*#2?K!R-*hwRlD><6TkM18}pKxOMHweaw*dVI#P zsJ8g^VDS^M>^ssb)`bOzQ#L+1%?#)D97;OpI0C~-J>MkBxItfl<;KT}p-)#&>L7X$KCQRBb=WKB7z^pICaViNXfMWw{kBP$yGkr-Y`0gG3 zpNI~ik3MtSxe*nezy{E#Hka*+>zdxR8taDDMUgwHIisAUS%oGvDYp770dD>aRI=N9L zn?1r)$rlz^v_QmRhnX7ALbN_ejR)SQS}2BjW;_dzKAaSW!_KH@q>0Y@7SAu6`A}Rk z8@7G>;2|;AgF)_NNAnKBy7CC+k+8`g+A`PqVb_w7^-U^iZLgV;{29+q+{l3DaWlA$ zwxsxT^+scbaUbpzPSb4N+QH!dm>tM+H`K{>b7?cC2c+atsTjnN1dN3Wf{0lxaD>2! zp`nh(O1Xnmx+@}gpTk&@%3;~^s(g+qgS}RsSDPNvtyiXjJ(8pErx?T&;r~*l=mzzL zEi223v-y*^dL7Z=T3w;ry423Ls?|}L2T-(t-G};`yN}-GP!`a?e)6_D$_^)Nn#Gb} z%6ZWX;l}ugqdD2&8D=4yMgeb+c(obTatbI5rOSNpXaPth9N>Pf=z!8HG^Hz%#w(ch zE5EHwGvQ?LvKj06n_)e(gA?DF6*&^LKrSV1$6GN4ib*344zVnb+ zS`jn4kk3J-$Rb3yy;05#Q&pz_Xnr)=(y1b_G0NURD}8)o<*L_d_ld-^`^cynN5V0- zP&!9ASVa;4nY2a{81M^e{pwb-yew8&k`bQ8QCuuweWW-*<`y*MTICXYz4G>?YU4?^ z^kjvDgz?58_1U7^-1+Mdez_e)!78fp>Swkg@f|JWFyu*Y2)`CY3b~j?kleJ`JWSvlbTvcX$p4_5l0h*Hyv8p zchjsA1spSYV!>G(a-kw5y7&U6l^I@kGFZ=}6S^Q*n?aP|c8rf+scWZ`s$tZJRIyX8 zEG&}GlY|iBX%5t+J%5Q#dIt1AKKExKf*ejX3YAIV*y|i)Q%0Yio|imhzj-sC->H&P znB8}>_&-}E@_{Zapa2hQSyDsYb8TVw3zGi{By_0^t|cdsr#Z5MqL#z7UZ*TBtzM}u zPRhPxg<0*c_Mr4De12sb3=D>`5LkocCBNlJQ>p{qSty7Qa`$;agEi{-mFABzqvk4izMHiY6&xe<3X{zsHHE5Hb0`Gy-YvLXNTstL#wS-_NDjYBf_N zz)6z%aR&h#O|(mSqp9<92;pFhH082Bzn()PYV z?OXvwk1-iQmxv3V0bG>$Sq%0T975%S0%W_8no0u^au$nVmYAOBVmQe)cWaAt{S0?T z)H&v==$muZikEpsH#W9r@5a6-3$6ZId`^Z;36=kNvQhB^Q~g6b*ItN+f`I&v3PF$# zd-rt!kk1I0&jorO2{YQ*|I#2^D=pdgxS-QLC^@$axAQ|n(iz#;+>-YQnim+5ckY+> zPWbCIQ63lN+RI08%mn34KrfkCJj`F5 zk|t6ix+zPX#F7n9PGaZgR9LC=^zQ51BFLbxVJKyy| z(EsWDNfN99XbptHF`@QAI&x{Q(j~3AxwS^RW|E`7lSeo$-tSd>hQjW37N$u@H>(KK zpoTrB%#g^Ow=Ds{5oAy82jqSKC)Hm91{e?n8%B4e0_!2s;x3rHUbmp1h(~XHglNq!YG&LF4_SZd_7@d`c3RIzq*^?Bzy?V_H`|N0 z9Q{N*tdl01O3NpkKNTa=r8+w@Y*yPu-CU z40AgORh5AqJaP{%J@wryWm-#@GCdPF2_O&!>%IC{b6eUZb|Nlxam5mDz5kP%^26KR z_%ojpZI;;Z@Rx%O-_f&c3oh5Z0)Hv1~b)Pm9#YZzyv- zf~d;fPI!&0Xd7 zK#8NrUYJdU(wF|GjOR@N53ND}umLiJKj4zgRaFyjJmh~40)DEBnhIrd7O(ybx(}Tg literal 0 HcmV?d00001 diff --git a/docs/useCheckForApplicationUpdate.md b/docs/useCheckForApplicationUpdate.md new file mode 100644 index 00000000000..443f1ead48b --- /dev/null +++ b/docs/useCheckForApplicationUpdate.md @@ -0,0 +1,122 @@ +--- +layout: default +title: "useCheckForApplicationUpdate" +--- + +# `useCheckForApplicationUpdate` + +This hook regularly checks whether the application source code has changed and calls the provided function when an update is available. To detect updates, it fetches the current URL at regular intervals and compares a hash of the response content. + +![CheckForApplicationUpdate](./img/CheckForApplicationUpdate.png) + +## Usage + +Include this component in a custom layout: + +```tsx +// in src/MyLayout.tsx +import { useCheckForApplicationUpdate, Layout, LayoutProps } from 'react-admin'; + +export const MyLayout = (props: LayoutProps) => { + useCheckForApplicationUpdate({ + onNewVersionAvailable: () => { + alert('A new version of the application is available! Please reload the page'); + } + }); + + return ( + + ); +} + +// in src/App.tsx +import { Admin, ListGuesser, Resource } from 'react-admin'; +import { MyLayout } from './MyLayout'; + +export const App = () => ( + + + +); +``` + +## Options + +`useCheckForApplicationUpdate` accepts the following options: + +| Prop | Required | Type | Default | Description | +| ------------------------ | -------- | -------- | ------------------ | ---------------------------------------------------------- | +| `checkInterval` | Optional | number | `3600000` (1 hour) | The interval in milliseconds between two checks | +| `disabled` | Optional | boolean | `true` | Whether the automatic check is enabled | +| `onNewVersionAvailable` | Required | Function | | A function to call when an update is available | +| `url` | Optional | string | current URL | The URL to download to check for code update | + +## `checkInterval` + +You can customize the interval of time between each application update check by providing the `checkInterval` option. It accepts a number of milliseconds and is set to `3600000` (1 hour) by default. + +```tsx +// in src/MyLayout.tsx +import { useCheckForApplicationUpdate, Layout, LayoutProps } from 'react-admin'; + +const HALF_HOUR = 1800000; + +export const MyLayout = (props: LayoutProps) => { + useCheckForApplicationUpdate({ + checkInterval: HALF_HOUR, + onNewVersionAvailable: () => { + alert('A new version of the application is available! Please reload the page'); + }, + }); + + return ( + + ); +} +``` + +## `disabled` + +You can dynamically disable the automatic application update detection by providing the `disabled` prop. + +```tsx +// in src/MyLayout.tsx +import { useCheckForApplicationUpdate, Layout, LayoutProps } from 'react-admin'; + +export const MyLayout = (props: LayoutProps) => { + useCheckForApplicationUpdate({ + disabled: process.env.NODE_ENV !== 'production', + onNewVersionAvailable: () => { + alert('A new version of the application is available! Please reload the page'); + }, + }); + + return ( + + ); +} +``` + +## `url` + +You can customize the URL fetched to detect updates by providing the `url` prop. + +```tsx +// in src/MyLayout.tsx +import { useCheckForApplicationUpdate, Layout, LayoutProps } from 'react-admin'; + +const MY_APP_ROOT_URL = 'http://admin.mycompany.com'; + +export const MyLayout = (props: LayoutProps) => { + useCheckForApplicationUpdate({ + onNewVersionAvailable: () => { + alert('A new version of the application is available! Please reload the page'); + }, + url: MY_APP_ROOT_URL, + }); + + return ( + + ); +} +``` From 2a4e3aaf1816cb7bf6e90ec62068bc536e56a47d Mon Sep 17 00:00:00 2001 From: Gildas Garcia <1122076+djhi@users.noreply.github.com> Date: Tue, 4 Jul 2023 15:56:26 +0200 Subject: [PATCH 07/20] Fix CheckForApplicationUpdate --- .../src/layout/CheckForApplicationUpdate.tsx | 18 +++++------------- 1 file changed, 5 insertions(+), 13 deletions(-) diff --git a/packages/ra-ui-materialui/src/layout/CheckForApplicationUpdate.tsx b/packages/ra-ui-materialui/src/layout/CheckForApplicationUpdate.tsx index 6b00ea07fb8..d70637bfaef 100644 --- a/packages/ra-ui-materialui/src/layout/CheckForApplicationUpdate.tsx +++ b/packages/ra-ui-materialui/src/layout/CheckForApplicationUpdate.tsx @@ -70,22 +70,14 @@ import { ApplicationUpdatedNotification } from '..'; export const CheckForApplicationUpdate = ( props: CheckForApplicationUpdateProps ) => { - const { - updateMode = 'manual', - notification = DEFAULT_NOTIFICATION, - ...rest - } = props; + const { notification = DEFAULT_NOTIFICATION, ...rest } = props; const notify = useNotify(); const onNewVersionAvailable = () => { - if (updateMode === 'immediate') { - window.location.reload(); - } else { - notify(notification, { - type: 'info', - autoHideDuration: 0, - }); - } + notify(notification, { + type: 'info', + autoHideDuration: 0, + }); }; useCheckForApplicationUpdate({ onNewVersionAvailable, ...rest }); From f1e97115e5390180db43bdcb98b1d00ecbb38eca Mon Sep 17 00:00:00 2001 From: Gildas Garcia <1122076+djhi@users.noreply.github.com> Date: Tue, 4 Jul 2023 16:07:06 +0200 Subject: [PATCH 08/20] Fix import that break tests --- .../ra-ui-materialui/src/layout/CheckForApplicationUpdate.tsx | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/packages/ra-ui-materialui/src/layout/CheckForApplicationUpdate.tsx b/packages/ra-ui-materialui/src/layout/CheckForApplicationUpdate.tsx index d70637bfaef..8591124876a 100644 --- a/packages/ra-ui-materialui/src/layout/CheckForApplicationUpdate.tsx +++ b/packages/ra-ui-materialui/src/layout/CheckForApplicationUpdate.tsx @@ -5,7 +5,7 @@ import { UseCheckForApplicationUpdateOptions, useCheckForApplicationUpdate, } from 'ra-core'; -import { ApplicationUpdatedNotification } from '..'; +import { ApplicationUpdatedNotification } from './ApplicationUpdatedNotification'; /** * A component which checks for a new version of the application and can display a notification asking users to reload the page. From 492f1a3adb0a97ee5c51da8955fff0f29f4dc454 Mon Sep 17 00:00:00 2001 From: Gildas Garcia <1122076+djhi@users.noreply.github.com> Date: Wed, 5 Jul 2023 15:04:35 +0200 Subject: [PATCH 09/20] Fix documentation --- docs/CheckForApplicationUpdate.md | 2 +- packages/ra-core/src/util/useCheckForApplicationUpdate.ts | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/docs/CheckForApplicationUpdate.md b/docs/CheckForApplicationUpdate.md index 1ad53220e7c..67c4e407f05 100644 --- a/docs/CheckForApplicationUpdate.md +++ b/docs/CheckForApplicationUpdate.md @@ -44,7 +44,7 @@ export const App = () => ( | --------------- | -------- | -------- | ------------------ |-------------------------------------------------------------------- | | `checkInterval` | Optional | number | `3600000` (1 hour) | The interval in milliseconds between two checks | | `disabled` | Optional | boolean | `true` | Whether the automatic check is enabled | -| `notification` | Optional | string | | The notification to display to the user when an update is available | +| `notification` | Optional | ReactElement | | The notification to display to the user when an update is available | | `url` | Optional | string | current URL | The URL to download to check for code update | ## `checkInterval` diff --git a/packages/ra-core/src/util/useCheckForApplicationUpdate.ts b/packages/ra-core/src/util/useCheckForApplicationUpdate.ts index 036648bad27..069f0e54dd3 100644 --- a/packages/ra-core/src/util/useCheckForApplicationUpdate.ts +++ b/packages/ra-core/src/util/useCheckForApplicationUpdate.ts @@ -8,7 +8,7 @@ import { useEvent } from './useEvent'; * * @param {UseCheckForApplicationUpdateOptions} options The options * @param {string} options.onNewVersionAvailable The function to call when a new version of the application is available. - * @param {string} options.url Optional. The URL to download to check for code update. Defaults to the HTML page. + * @param {string} options.url Optional. The URL to download to check for code update. Defaults to the current URL. * @param {number} options.checkInterval Optional. The interval in milliseconds between two checks. Defaults to 3600000 (1 hour). * @param {boolean} options.disabled Optional. Whether the check should be disabled. Defaults to false. */ From ffe8342ad3bd44715246ca897a0da00709be16dd Mon Sep 17 00:00:00 2001 From: Gildas Garcia <1122076+djhi@users.noreply.github.com> Date: Wed, 5 Jul 2023 15:12:12 +0200 Subject: [PATCH 10/20] Update hash description --- docs/CheckForApplicationUpdate.md | 2 +- docs/useCheckForApplicationUpdate.md | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/docs/CheckForApplicationUpdate.md b/docs/CheckForApplicationUpdate.md index 67c4e407f05..4cf9fef6c54 100644 --- a/docs/CheckForApplicationUpdate.md +++ b/docs/CheckForApplicationUpdate.md @@ -5,7 +5,7 @@ title: "The CheckForApplicationUpdate component" # `CheckForApplicationUpdate` -This component regularly checks whether the application source code has changed and prompt users to reload the page when an update is available. To detect updates, it fetches the current URL at regular intervals and compares a hash of the response content. +This component regularly checks whether the application source code has changed and prompt users to reload the page when an update is available. To detect updates, it fetches the current URL at regular intervals and compares a hash of the response content (usually the HTML source). This should be enough in most cases as bundlers usually update the links to the application bundles after an update. It leverages the [`useCheckForApplicationUpdate`](./useCheckForApplicationUpdate.md) hook. diff --git a/docs/useCheckForApplicationUpdate.md b/docs/useCheckForApplicationUpdate.md index 443f1ead48b..cbf2c354659 100644 --- a/docs/useCheckForApplicationUpdate.md +++ b/docs/useCheckForApplicationUpdate.md @@ -5,7 +5,7 @@ title: "useCheckForApplicationUpdate" # `useCheckForApplicationUpdate` -This hook regularly checks whether the application source code has changed and calls the provided function when an update is available. To detect updates, it fetches the current URL at regular intervals and compares a hash of the response content. +This hook regularly checks whether the application source code has changed and calls the provided function when an update is available. To detect updates, it fetches the current URL at regular intervals and compares a hash of the response content (usually the HTML source). This should be enough in most cases as bundlers usually update the links to the application bundles after an update. ![CheckForApplicationUpdate](./img/CheckForApplicationUpdate.png) From d1988f0ba5233be0ac49084e28539424dcd96c92 Mon Sep 17 00:00:00 2001 From: Gildas Garcia <1122076+djhi@users.noreply.github.com> Date: Wed, 5 Jul 2023 15:26:40 +0200 Subject: [PATCH 11/20] Apply review --- docs/CheckForApplicationUpdate.md | 8 ++++++-- docs/useCheckForApplicationUpdate.md | 4 ++-- packages/ra-core/src/util/useCheckForApplicationUpdate.ts | 2 +- 3 files changed, 9 insertions(+), 5 deletions(-) diff --git a/docs/CheckForApplicationUpdate.md b/docs/CheckForApplicationUpdate.md index 4cf9fef6c54..d1c94a181e8 100644 --- a/docs/CheckForApplicationUpdate.md +++ b/docs/CheckForApplicationUpdate.md @@ -5,7 +5,7 @@ title: "The CheckForApplicationUpdate component" # `CheckForApplicationUpdate` -This component regularly checks whether the application source code has changed and prompt users to reload the page when an update is available. To detect updates, it fetches the current URL at regular intervals and compares a hash of the response content (usually the HTML source). This should be enough in most cases as bundlers usually update the links to the application bundles after an update. +This component regularly checks whether the application source code has changed and prompts users to reload the page when an update is available. To detect updates, it fetches the current URL at regular intervals and compares the hash of the response content (usually the HTML source). This should be enough in most cases as bundlers usually update the links to the application bundles after an update. It leverages the [`useCheckForApplicationUpdate`](./useCheckForApplicationUpdate.md) hook. @@ -21,6 +21,7 @@ import { CheckForApplicationUpdate, Layout, LayoutProps } from 'react-admin'; export const MyLayout = ({ children, ...props }: LayoutProps) => ( + {children} ); @@ -43,7 +44,7 @@ export const App = () => ( | Prop | Required | Type | Default | Description | | --------------- | -------- | -------- | ------------------ |-------------------------------------------------------------------- | | `checkInterval` | Optional | number | `3600000` (1 hour) | The interval in milliseconds between two checks | -| `disabled` | Optional | boolean | `true` | Whether the automatic check is enabled | +| `disabled` | Optional | boolean | `false` | Whether the automatic check is disabled | | `notification` | Optional | ReactElement | | The notification to display to the user when an update is available | | `url` | Optional | string | current URL | The URL to download to check for code update | @@ -59,6 +60,7 @@ const HALF_HOUR = 1800000; export const MyLayout = ({ children, ...props }: LayoutProps) => ( + {children} ); @@ -74,6 +76,7 @@ import { CheckForApplicationUpdate, Layout, LayoutProps } from 'react-admin'; export const MyLayout = ({ children, ...props }: LayoutProps) => ( + {children} ); @@ -129,6 +132,7 @@ const MY_APP_ROOT_URL = 'http://admin.mycompany.com'; export const MyLayout = ({ children, ...props }: LayoutProps) => ( + {children} ); diff --git a/docs/useCheckForApplicationUpdate.md b/docs/useCheckForApplicationUpdate.md index cbf2c354659..d98ea5b8b6f 100644 --- a/docs/useCheckForApplicationUpdate.md +++ b/docs/useCheckForApplicationUpdate.md @@ -5,13 +5,13 @@ title: "useCheckForApplicationUpdate" # `useCheckForApplicationUpdate` -This hook regularly checks whether the application source code has changed and calls the provided function when an update is available. To detect updates, it fetches the current URL at regular intervals and compares a hash of the response content (usually the HTML source). This should be enough in most cases as bundlers usually update the links to the application bundles after an update. +This hook regularly checks whether the application source code has changed and calls the provided function when an update is available. To detect updates, it fetches the current URL at regular intervals and compares the hash of the response content (usually the HTML source). This should be enough in most cases as bundlers usually update the links to the application bundles after an update. ![CheckForApplicationUpdate](./img/CheckForApplicationUpdate.png) ## Usage -Include this component in a custom layout: +Call this hook in a custom layout: ```tsx // in src/MyLayout.tsx diff --git a/packages/ra-core/src/util/useCheckForApplicationUpdate.ts b/packages/ra-core/src/util/useCheckForApplicationUpdate.ts index 069f0e54dd3..feecbc4f6dc 100644 --- a/packages/ra-core/src/util/useCheckForApplicationUpdate.ts +++ b/packages/ra-core/src/util/useCheckForApplicationUpdate.ts @@ -7,7 +7,7 @@ import { useEvent } from './useEvent'; * comparing the hash of the response with the hash of the current page. * * @param {UseCheckForApplicationUpdateOptions} options The options - * @param {string} options.onNewVersionAvailable The function to call when a new version of the application is available. + * @param {Function} options.onNewVersionAvailable The function to call when a new version of the application is available. * @param {string} options.url Optional. The URL to download to check for code update. Defaults to the current URL. * @param {number} options.checkInterval Optional. The interval in milliseconds between two checks. Defaults to 3600000 (1 hour). * @param {boolean} options.disabled Optional. Whether the check should be disabled. Defaults to false. From e824062550a8356162d27b5c7a7ea7de65607a36 Mon Sep 17 00:00:00 2001 From: Gildas Garcia <1122076+djhi@users.noreply.github.com> Date: Thu, 6 Jul 2023 10:07:34 +0200 Subject: [PATCH 12/20] Update documentation --- docs/CheckForApplicationUpdate.md | 10 ++++++---- docs/img/CheckForApplicationUpdate.png | Bin 124517 -> 11844 bytes docs/navigation.html | 2 ++ docs/useCheckForApplicationUpdate.md | 8 +++++--- 4 files changed, 13 insertions(+), 7 deletions(-) diff --git a/docs/CheckForApplicationUpdate.md b/docs/CheckForApplicationUpdate.md index d1c94a181e8..ff8b5ed3e46 100644 --- a/docs/CheckForApplicationUpdate.md +++ b/docs/CheckForApplicationUpdate.md @@ -5,6 +5,8 @@ title: "The CheckForApplicationUpdate component" # `CheckForApplicationUpdate` +When your admin application is a Single Page Application, users who keep a browser tab open at all times might not use the most recent version of the application unless you tell them to refresh the page. + This component regularly checks whether the application source code has changed and prompts users to reload the page when an update is available. To detect updates, it fetches the current URL at regular intervals and compares the hash of the response content (usually the HTML source). This should be enough in most cases as bundlers usually update the links to the application bundles after an update. It leverages the [`useCheckForApplicationUpdate`](./useCheckForApplicationUpdate.md) hook. @@ -44,7 +46,7 @@ export const App = () => ( | Prop | Required | Type | Default | Description | | --------------- | -------- | -------- | ------------------ |-------------------------------------------------------------------- | | `checkInterval` | Optional | number | `3600000` (1 hour) | The interval in milliseconds between two checks | -| `disabled` | Optional | boolean | `false` | Whether the automatic check is disabled | +| `disabled` | Optional | boolean | `false` in `production` mode | Whether the automatic check is disabled | | `notification` | Optional | ReactElement | | The notification to display to the user when an update is available | | `url` | Optional | string | current URL | The URL to download to check for code update | @@ -56,7 +58,7 @@ You can customize the interval of time between each application update check by // in src/MyLayout.tsx import { CheckForApplicationUpdate, Layout, LayoutProps } from 'react-admin'; -const HALF_HOUR = 1800000; +const HALF_HOUR = 30 * 60 * 1000; export const MyLayout = ({ children, ...props }: LayoutProps) => ( @@ -68,7 +70,7 @@ export const MyLayout = ({ children, ...props }: LayoutProps) => ( ## `disabled` -You can dynamically disable the automatic application update detection by providing the `disabled` prop. +You can dynamically disable the automatic application update detection by providing the `disabled` prop. By default, it's only enabled in `production` mode. ```tsx // in src/MyLayout.tsx @@ -122,7 +124,7 @@ If you just want to customize the notification texts, including the button, chec ## `url` -You can customize the URL fetched to detect updates by providing the `url` prop. +You can customize the URL fetched to detect updates by providing the `url` prop. By default it's the current URL. ```tsx // in src/MyLayout.tsx diff --git a/docs/img/CheckForApplicationUpdate.png b/docs/img/CheckForApplicationUpdate.png index 6528e84ead893df28890c0a9b980647076133bab..98993ff4f84aaf9049725959e6e0d26bb7ab9c47 100644 GIT binary patch literal 11844 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 O0m|~~awU+*f&U9)aP0~J literal 124517 zcmaI71yq$=*EYNf>5_KSjYvu(4boCl(jd|ZQqmy;(p@6b-QB5_bazR2cm0cVp7Xq( z_y4|c42DBCcdRwnoY%bOHRldcl$S(DfucYl5OirNab*Yu9tHw|^+tjPpX7Se6ha{6 z5NUA{6(^XTB!6`x$@BAL>zjV(g$3u4WR+~54*|>bzp)7{m!UW>>BHUOKR!U;`Q|70CB%L=ZhD|2|6E|+0Xl%POF+p zv9Tbq!Vn|~3^@ee3j%&Y^>5Ka&CVTE{^x^#{yKj);e+61hV}2yOG=Qu5HvJy(c1|A zcnG-13ju=upGW@l1blp$K?rJov&bpze_!|4-v%KmFn_)LpDVpu+9)AVeS=f(9NmAv z4+4d7JS_9SS39H<{FDXh*%a*+BuPS)IJPux`;BB|_02%$>K!a}@mBcOU!*GQ9M-bY ztO-plUMA{0>oX;WZZzYpVcbDc51fDo+U_YLu(^;TqJWLR4B4}>KWOWq~Zghj4xgX2w6^BpkaQ$nw z<*_YwJYpZ3*@}W1PH-_TDU_ClP+ANhZ}x?4A!pn2*G~}sAXgWkF`s@^h2`KQHclj(U=X?7WgZ&rB!6LEA@EMifFDz7IE@#Jazsa-YM5J$>Nv$3H`OO24*V(0i-eKmu% z>DE*YgeTJy#wF549T}~CLuk*7f;ht0&i#m9I4Y$#RjR_dJ@ylKh{XPBDZ4chU!)qm zP;akliXQ%pL(}3+*Xzy^uc)JU!ixE)%U)N~AXg*>x7C;G(^wK`<{dbg|9YqXJPwjM z&0Xb{USsypUeB0ivdJ~*iI$*aHIytSjjvmzkvBE5K`UfmhGc^MsqxAb1w@}M%UJ_(>G@0N3z;V}2Y z^r089&x4fH+a!mErbeJAQ9uLx zERFT`wh+?jzRb(}A_`cot{18ou?7KE%>4&75&B)PP)5IXJpbO?xgmJXgK-a5#aDCx8SP8}~)+&8A-r7YOYrr>=bO5`p-b zaY%r`iu%%h=)wq8_WN2+2f$ZrK6BaWB#Fml=STK_1e`4|V6GZB=|#Vi zabp8NO8WI7q17!LB|BZZD0a!Mu)Ey*%6t=tI!0Oz1MN26@`8bQDlXLVnVbS&4pyv! z82x(YdtWn26g+|3(B?aFQU-3tyO(|x+>hQeIwV&f@k!G%T-%VuyTg*|$87+-QQI|=r|pZ76gFs+k^RTft`|J< zyzRSR1zfVr|L-$2blHO2Sn{+l|EuYRCh^;lgZvPSjV{r_hfur zi`z&mLL$o-u#L;bLSJ90mPuRI-QeDHeEzBh7NcO{wIOfofL6wbF!j|ahnTReoxs$+ z!9ZBHGE{eFEeUd4ODUJaE|5oOd6EGQI0xv|+Sg3*TK*N)NV{@_1kWh7$9Jf>SQSf$ zSln@F*f8*QRi4OEu{4QtCTZ`l`zi{Iq$xGYb=6!ngjIAzcZ}^<99e4JgKO{%&(p&# zjJjT_Ar@fzoJ=twQCJhakBqhW z-4xu20(J(3B?EgRYz)Z$$b84&Th>!YxUMTo^`nguY3i^V6B%%c6)fQp1u|c0o3V1H&}1 z3`1k{K__;?HPHp;S3QlTQieW8T9EGO=rbBC&GNEOj8iV zJ{shQ?RpoKq<~{U-lymLT69;AVx01cId)>(bhq8h$qpw5<8RE)(Fhlm!I3xuD6jEn zoT{Nh(E*{s7^S6E;pl%F&#&do$ozBSIK;bfrAzgN5W0vtqJJ+wDw~n?9z~oa#lD

QvK^}nXO0qd(aQ5S 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


hS7$0^kEr^olp0h~LQ& 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
ehrtZHCZknbTF1dJ>(UPp- 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 diff --git a/docs/navigation.html b/docs/navigation.html index aaf57a00f91..374c6ad68a9 100644 --- a/docs/navigation.html +++ b/docs/navigation.html @@ -242,6 +242,8 @@
  • <Search>
  • <Confirm>
  • Buttons
  • +
  • <CheckForApplicationUpdate>
  • +
  • useCheckForApplicationUpdate
    • Realtime
      diff --git a/docs/useCheckForApplicationUpdate.md b/docs/useCheckForApplicationUpdate.md index d98ea5b8b6f..87ca15ad91e 100644 --- a/docs/useCheckForApplicationUpdate.md +++ b/docs/useCheckForApplicationUpdate.md @@ -5,6 +5,8 @@ title: "useCheckForApplicationUpdate" # `useCheckForApplicationUpdate` +When your admin application is a Single Page Application, users who keep a browser tab open at all times might not use the most recent version of the application unless you tell them to refresh the page. + This hook regularly checks whether the application source code has changed and calls the provided function when an update is available. To detect updates, it fetches the current URL at regular intervals and compares the hash of the response content (usually the HTML source). This should be enough in most cases as bundlers usually update the links to the application bundles after an update. ![CheckForApplicationUpdate](./img/CheckForApplicationUpdate.png) @@ -47,7 +49,7 @@ export const App = () => ( | Prop | Required | Type | Default | Description | | ------------------------ | -------- | -------- | ------------------ | ---------------------------------------------------------- | | `checkInterval` | Optional | number | `3600000` (1 hour) | The interval in milliseconds between two checks | -| `disabled` | Optional | boolean | `true` | Whether the automatic check is enabled | +| `disabled` | Optional | boolean | `true` in `production` mode | Whether the automatic check is disabled | | `onNewVersionAvailable` | Required | Function | | A function to call when an update is available | | `url` | Optional | string | current URL | The URL to download to check for code update | @@ -77,7 +79,7 @@ export const MyLayout = (props: LayoutProps) => { ## `disabled` -You can dynamically disable the automatic application update detection by providing the `disabled` prop. +You can dynamically disable the automatic application update detection by providing the `disabled` prop. By default, it's only enabled in `production` mode. ```tsx // in src/MyLayout.tsx @@ -99,7 +101,7 @@ export const MyLayout = (props: LayoutProps) => { ## `url` -You can customize the URL fetched to detect updates by providing the `url` prop. +You can customize the URL fetched to detect updates by providing the `url` prop. By default it's the current URL. ```tsx // in src/MyLayout.tsx From e6dc05f46ac5a883b9a08241c708268537a82e85 Mon Sep 17 00:00:00 2001 From: Gildas Garcia <1122076+djhi@users.noreply.github.com> Date: Thu, 6 Jul 2023 10:07:58 +0200 Subject: [PATCH 13/20] Fix Notification does not allow valid values for autoHideDuration --- packages/ra-ui-materialui/src/layout/Notification.tsx | 8 +++++++- 1 file changed, 7 insertions(+), 1 deletion(-) diff --git a/packages/ra-ui-materialui/src/layout/Notification.tsx b/packages/ra-ui-materialui/src/layout/Notification.tsx index 72225a3de19..2b51a4707c3 100644 --- a/packages/ra-ui-materialui/src/layout/Notification.tsx +++ b/packages/ra-ui-materialui/src/layout/Notification.tsx @@ -91,7 +91,13 @@ export const Notification = (props: NotificationProps) => { typeof message === 'string' && translate(message, messageArgs) } - autoHideDuration={autoHideDurationFromMessage || autoHideDuration} + autoHideDuration={ + // Only apply the default autoHideDuration when autoHideDurationFromMessage is undefined + // as 0 and null are valid values + autoHideDurationFromMessage === undefined + ? autoHideDuration + : autoHideDurationFromMessage + } disableWindowBlurListener={undoable} TransitionProps={{ onExited: handleExited }} onClose={handleRequestClose} From 1cc6022f3b209ea81696d5a835968408b9806850 Mon Sep 17 00:00:00 2001 From: Gildas Garcia <1122076+djhi@users.noreply.github.com> Date: Thu, 6 Jul 2023 10:08:13 +0200 Subject: [PATCH 14/20] Apply review --- .../src/util/useCheckForApplicationUpdate.ts | 25 ++++++++++++------- .../src/layout/CheckForApplicationUpdate.tsx | 2 +- 2 files changed, 17 insertions(+), 10 deletions(-) diff --git a/packages/ra-core/src/util/useCheckForApplicationUpdate.ts b/packages/ra-core/src/util/useCheckForApplicationUpdate.ts index feecbc4f6dc..e2d6a33c9ee 100644 --- a/packages/ra-core/src/util/useCheckForApplicationUpdate.ts +++ b/packages/ra-core/src/util/useCheckForApplicationUpdate.ts @@ -18,11 +18,11 @@ export const useCheckForApplicationUpdate = ( const { url = window.location.href, checkInterval = ONE_HOUR, - onNewVersionAvailable, - disabled, + onNewVersionAvailable: onNewVersionAvailableProp, + disabled = process.env.NODE_ENV !== 'production', } = options; const currentHash = useRef(); - const onCodeHasChanged = useEvent(onNewVersionAvailable); + const onNewVersionAvailable = useEvent(onNewVersionAvailableProp); useEffect(() => { if (disabled) return; @@ -36,14 +36,21 @@ export const useCheckForApplicationUpdate = ( if (disabled) return; const interval = setInterval(() => { - getHashForUrl(url).then(hash => { - if (currentHash.current !== hash) { - onCodeHasChanged(); - } - }); + getHashForUrl(url) + .then(hash => { + if (hash != null && currentHash.current !== hash) { + // Store the latest hash to avoid calling the onNewVersionAvailable function multiple times + // or when users have closed the notification + currentHash.current = hash; + onNewVersionAvailable(); + } + }) + .catch(() => { + // Ignore errors to avoid issues when connectivity is lost + }); }, checkInterval); return () => clearInterval(interval); - }, [checkInterval, onCodeHasChanged, disabled, url]); + }, [checkInterval, onNewVersionAvailable, disabled, url]); }; const getHashForUrl = async (url: string) => { diff --git a/packages/ra-ui-materialui/src/layout/CheckForApplicationUpdate.tsx b/packages/ra-ui-materialui/src/layout/CheckForApplicationUpdate.tsx index 8591124876a..4eab934aa46 100644 --- a/packages/ra-ui-materialui/src/layout/CheckForApplicationUpdate.tsx +++ b/packages/ra-ui-materialui/src/layout/CheckForApplicationUpdate.tsx @@ -76,7 +76,7 @@ export const CheckForApplicationUpdate = ( const onNewVersionAvailable = () => { notify(notification, { type: 'info', - autoHideDuration: 0, + autoHideDuration: null, }); }; From feee1ed815ede43caf334560e619243845ba1a48 Mon Sep 17 00:00:00 2001 From: Gildas Garcia <1122076+djhi@users.noreply.github.com> Date: Thu, 6 Jul 2023 17:20:12 +0200 Subject: [PATCH 15/20] Update reference doc page --- docs/Reference.md | 2 ++ 1 file changed, 2 insertions(+) diff --git a/docs/Reference.md b/docs/Reference.md index 2df31771fd8..89e49dd5be4 100644 --- a/docs/Reference.md +++ b/docs/Reference.md @@ -32,6 +32,7 @@ title: "Index" **- C -** * [``](./Calendar.md) * [``](./CheckboxGroupInput.md) +* [``](./CheckForApplicationUpdate.md) * [``](./ChipField.md) * [``](./CloneButton.md) * [``](https://marmelab.com/ra-enterprise/modules/ra-calendar#completecalendar) @@ -216,6 +217,7 @@ title: "Index" **- C -** * [`useCanAccess`](./useCanAccess.md) +* [`useCheckForApplicationUpdate`](./useCheckForApplicationUpdate.md) * [`useChoicesContext`](./useChoicesContext.md) * [`useCreate`](./useCreate.md) * [`useCreateContext`](./useCreateContext.md) From 10764ed816c8ccd816afc6432f219c6e7f63fda7 Mon Sep 17 00:00:00 2001 From: Gildas Garcia <1122076+djhi@users.noreply.github.com> Date: Thu, 6 Jul 2023 17:30:20 +0200 Subject: [PATCH 16/20] Update SPA tools documentation --- docs/CreateReactApp.md | 40 ++++++++++++++++++++++++++++++++++++++++ docs/Vite.md | 40 ++++++++++++++++++++++++++++++++++++++++ 2 files changed, 80 insertions(+) diff --git a/docs/CreateReactApp.md b/docs/CreateReactApp.md index 3a5ce3eabfd..e8ba51170a6 100644 --- a/docs/CreateReactApp.md +++ b/docs/CreateReactApp.md @@ -66,3 +66,43 @@ Now, start the server with `yarn start`, browse to `http://localhost:3000/`, and ![Working Page](./img/nextjs-react-admin.webp) Your app is now up and running, you can start tweaking it. + +## Ensure Users Have The Latest Version + +If your users might keep the application open for a long time, it's a good idea to add the [``](./CheckForApplicationUpdate.md) component. It will check whether a more recent version of your application is available and prompt users to reload their browser tab. + +To determine whether your application has been updated, it fetches the current page at a regular interval, builds an hash of the response content (usually the HTML) and compares it with the previous hash. + +To enable it, start by creating a custom layout: + +```tsx +// in src/admin/MyLayout.tsx +import { CheckForApplicationUpdate, Layout, LayoutProps } from 'react-admin'; + +export const MyLayout = ({ children, ...props }: LayoutProps) => ( + + {children} + + +); +``` + +Then use this layout in your app: + +```diff +import { Admin, Resource, ListGuesser } from "react-admin"; +import jsonServerProvider from "ra-data-json-server"; ++import { MyLayout } from './MyLayout'; + +const dataProvider = jsonServerProvider("https://jsonplaceholder.typicode.com"); + +const App = () => ( +- ++ + + + +); + +export default App; +``` \ No newline at end of file diff --git a/docs/Vite.md b/docs/Vite.md index cdb117c23f1..4aef4bbacdc 100644 --- a/docs/Vite.md +++ b/docs/Vite.md @@ -100,6 +100,46 @@ Now, start the server with `yarn dev`, browse to `http://localhost:5173/`, and y Your app is now up and running, you can start tweaking it. +## Ensure Users Have The Latest Version + +If your users might keep the application open for a long time, it's a good idea to add the [``](./CheckForApplicationUpdate.md) component. It will check whether a more recent version of your application is available and prompt users to reload their browser tab. + +To determine whether your application has been updated, it fetches the current page at a regular interval, builds an hash of the response content (usually the HTML) and compares it with the previous hash. + +To enable it, start by creating a custom layout: + +```tsx +// in src/admin/MyLayout.tsx +import { CheckForApplicationUpdate, Layout, LayoutProps } from 'react-admin'; + +export const MyLayout = ({ children, ...props }: LayoutProps) => ( + + {children} + + +); +``` + +Then use this layout in your app: + +```diff +import { Admin, Resource, ListGuesser } from "react-admin"; +import jsonServerProvider from "ra-data-json-server"; ++import { MyLayout } from './MyLayout'; + +const dataProvider = jsonServerProvider("https://jsonplaceholder.typicode.com"); + +const App = () => ( +- ++ + + + +); + +export default App; +``` + ## Troubleshooting ### Error about `global` Being `undefined` From 1d1f85c30af7ae5ea223f8cd57db03dfaa6a6e1d Mon Sep 17 00:00:00 2001 From: Gildas Garcia <1122076+djhi@users.noreply.github.com> Date: Mon, 10 Jul 2023 14:28:49 +0200 Subject: [PATCH 17/20] Update and comment hash function --- .../src/util/useCheckForApplicationUpdate.ts | 25 ++++++++++++------- 1 file changed, 16 insertions(+), 9 deletions(-) diff --git a/packages/ra-core/src/util/useCheckForApplicationUpdate.ts b/packages/ra-core/src/util/useCheckForApplicationUpdate.ts index e2d6a33c9ee..a1017f49176 100644 --- a/packages/ra-core/src/util/useCheckForApplicationUpdate.ts +++ b/packages/ra-core/src/util/useCheckForApplicationUpdate.ts @@ -21,7 +21,7 @@ export const useCheckForApplicationUpdate = ( onNewVersionAvailable: onNewVersionAvailableProp, disabled = process.env.NODE_ENV !== 'production', } = options; - const currentHash = useRef(); + const currentHash = useRef(); const onNewVersionAvailable = useEvent(onNewVersionAvailableProp); useEffect(() => { @@ -59,14 +59,21 @@ const getHashForUrl = async (url: string) => { return hash(text); }; -const hash = (value: string) => { - return value - .split('') - .reduce(function (a, b) { - a = (a << 5) - a + b.charCodeAt(0); - return a & a; - }, 0) - .toString(); +// Simple hash function, taken from https://stackoverflow.com/a/52171480/3723993, suggested by Copilot +const hash = (value: string, seed = 0) => { + let h1 = 0xdeadbeef ^ seed, + h2 = 0x41c6ce57 ^ seed; + for (let i = 0, ch; i < value.length; i++) { + ch = value.charCodeAt(i); + h1 = Math.imul(h1 ^ ch, 2654435761); + h2 = Math.imul(h2 ^ ch, 1597334677); + } + h1 = Math.imul(h1 ^ (h1 >>> 16), 2246822507); + h1 ^= Math.imul(h2 ^ (h2 >>> 13), 3266489909); + h2 = Math.imul(h2 ^ (h2 >>> 16), 2246822507); + h2 ^= Math.imul(h1 ^ (h1 >>> 13), 3266489909); + + return 4294967296 * (2097151 & h2) + (h1 >>> 0); }; const ONE_HOUR = 1000 * 60 * 60; From b138f1600c8701ad9adc4fd0b968b9a68708bd9e Mon Sep 17 00:00:00 2001 From: Francois Zaninotto Date: Thu, 10 Aug 2023 15:03:35 +0200 Subject: [PATCH 18/20] Misc adjustments --- docs/CheckForApplicationUpdate.md | 4 +- docs/CreateReactApp.md | 2 +- docs/Reference.md | 1 - docs/Vite.md | 2 +- docs/navigation.html | 1 - docs/useCheckForApplicationUpdate.md | 124 ------------------ .../src/util/useCheckForApplicationUpdate.ts | 3 +- packages/ra-language-english/src/index.ts | 2 +- packages/ra-language-french/src/index.ts | 2 +- .../src/layout/CheckForApplicationUpdate.tsx | 2 +- 10 files changed, 8 insertions(+), 135 deletions(-) delete mode 100644 docs/useCheckForApplicationUpdate.md diff --git a/docs/CheckForApplicationUpdate.md b/docs/CheckForApplicationUpdate.md index ff8b5ed3e46..119e5b18d44 100644 --- a/docs/CheckForApplicationUpdate.md +++ b/docs/CheckForApplicationUpdate.md @@ -7,9 +7,7 @@ title: "The CheckForApplicationUpdate component" When your admin application is a Single Page Application, users who keep a browser tab open at all times might not use the most recent version of the application unless you tell them to refresh the page. -This component regularly checks whether the application source code has changed and prompts users to reload the page when an update is available. To detect updates, it fetches the current URL at regular intervals and compares the hash of the response content (usually the HTML source). This should be enough in most cases as bundlers usually update the links to the application bundles after an update. - -It leverages the [`useCheckForApplicationUpdate`](./useCheckForApplicationUpdate.md) hook. +This component regularly checks whether the application source code has changed and prompts users to reload the page when an update is available. To detect updates, it fetches the current URL at regular intervals and compares the hash of the response content (usually the HTML source). This should be enough in most cases as bundlers usually update the links to the application bundles after an update. ![CheckForApplicationUpdate](./img/CheckForApplicationUpdate.png) diff --git a/docs/CreateReactApp.md b/docs/CreateReactApp.md index e8ba51170a6..c2b1455736a 100644 --- a/docs/CreateReactApp.md +++ b/docs/CreateReactApp.md @@ -67,7 +67,7 @@ Now, start the server with `yarn start`, browse to `http://localhost:3000/`, and Your app is now up and running, you can start tweaking it. -## Ensure Users Have The Latest Version +## Ensuring Users Have The Latest Version If your users might keep the application open for a long time, it's a good idea to add the [``](./CheckForApplicationUpdate.md) component. It will check whether a more recent version of your application is available and prompt users to reload their browser tab. diff --git a/docs/Reference.md b/docs/Reference.md index 89e49dd5be4..9d1a79a7665 100644 --- a/docs/Reference.md +++ b/docs/Reference.md @@ -217,7 +217,6 @@ title: "Index" **- C -** * [`useCanAccess`](./useCanAccess.md) -* [`useCheckForApplicationUpdate`](./useCheckForApplicationUpdate.md) * [`useChoicesContext`](./useChoicesContext.md) * [`useCreate`](./useCreate.md) * [`useCreateContext`](./useCreateContext.md) diff --git a/docs/Vite.md b/docs/Vite.md index 4aef4bbacdc..2eec4ae9ed6 100644 --- a/docs/Vite.md +++ b/docs/Vite.md @@ -100,7 +100,7 @@ Now, start the server with `yarn dev`, browse to `http://localhost:5173/`, and y Your app is now up and running, you can start tweaking it. -## Ensure Users Have The Latest Version +## Ensuring Users Have The Latest Version If your users might keep the application open for a long time, it's a good idea to add the [``](./CheckForApplicationUpdate.md) component. It will check whether a more recent version of your application is available and prompt users to reload their browser tab. diff --git a/docs/navigation.html b/docs/navigation.html index 374c6ad68a9..901f1689978 100644 --- a/docs/navigation.html +++ b/docs/navigation.html @@ -243,7 +243,6 @@
    • <Confirm>
    • Buttons
    • <CheckForApplicationUpdate>
    • -
    • useCheckForApplicationUpdate
      Realtime
      diff --git a/docs/useCheckForApplicationUpdate.md b/docs/useCheckForApplicationUpdate.md deleted file mode 100644 index 87ca15ad91e..00000000000 --- a/docs/useCheckForApplicationUpdate.md +++ /dev/null @@ -1,124 +0,0 @@ ---- -layout: default -title: "useCheckForApplicationUpdate" ---- - -# `useCheckForApplicationUpdate` - -When your admin application is a Single Page Application, users who keep a browser tab open at all times might not use the most recent version of the application unless you tell them to refresh the page. - -This hook regularly checks whether the application source code has changed and calls the provided function when an update is available. To detect updates, it fetches the current URL at regular intervals and compares the hash of the response content (usually the HTML source). This should be enough in most cases as bundlers usually update the links to the application bundles after an update. - -![CheckForApplicationUpdate](./img/CheckForApplicationUpdate.png) - -## Usage - -Call this hook in a custom layout: - -```tsx -// in src/MyLayout.tsx -import { useCheckForApplicationUpdate, Layout, LayoutProps } from 'react-admin'; - -export const MyLayout = (props: LayoutProps) => { - useCheckForApplicationUpdate({ - onNewVersionAvailable: () => { - alert('A new version of the application is available! Please reload the page'); - } - }); - - return ( - - ); -} - -// in src/App.tsx -import { Admin, ListGuesser, Resource } from 'react-admin'; -import { MyLayout } from './MyLayout'; - -export const App = () => ( - - - -); -``` - -## Options - -`useCheckForApplicationUpdate` accepts the following options: - -| Prop | Required | Type | Default | Description | -| ------------------------ | -------- | -------- | ------------------ | ---------------------------------------------------------- | -| `checkInterval` | Optional | number | `3600000` (1 hour) | The interval in milliseconds between two checks | -| `disabled` | Optional | boolean | `true` in `production` mode | Whether the automatic check is disabled | -| `onNewVersionAvailable` | Required | Function | | A function to call when an update is available | -| `url` | Optional | string | current URL | The URL to download to check for code update | - -## `checkInterval` - -You can customize the interval of time between each application update check by providing the `checkInterval` option. It accepts a number of milliseconds and is set to `3600000` (1 hour) by default. - -```tsx -// in src/MyLayout.tsx -import { useCheckForApplicationUpdate, Layout, LayoutProps } from 'react-admin'; - -const HALF_HOUR = 1800000; - -export const MyLayout = (props: LayoutProps) => { - useCheckForApplicationUpdate({ - checkInterval: HALF_HOUR, - onNewVersionAvailable: () => { - alert('A new version of the application is available! Please reload the page'); - }, - }); - - return ( - - ); -} -``` - -## `disabled` - -You can dynamically disable the automatic application update detection by providing the `disabled` prop. By default, it's only enabled in `production` mode. - -```tsx -// in src/MyLayout.tsx -import { useCheckForApplicationUpdate, Layout, LayoutProps } from 'react-admin'; - -export const MyLayout = (props: LayoutProps) => { - useCheckForApplicationUpdate({ - disabled: process.env.NODE_ENV !== 'production', - onNewVersionAvailable: () => { - alert('A new version of the application is available! Please reload the page'); - }, - }); - - return ( - - ); -} -``` - -## `url` - -You can customize the URL fetched to detect updates by providing the `url` prop. By default it's the current URL. - -```tsx -// in src/MyLayout.tsx -import { useCheckForApplicationUpdate, Layout, LayoutProps } from 'react-admin'; - -const MY_APP_ROOT_URL = 'http://admin.mycompany.com'; - -export const MyLayout = (props: LayoutProps) => { - useCheckForApplicationUpdate({ - onNewVersionAvailable: () => { - alert('A new version of the application is available! Please reload the page'); - }, - url: MY_APP_ROOT_URL, - }); - - return ( - - ); -} -``` diff --git a/packages/ra-core/src/util/useCheckForApplicationUpdate.ts b/packages/ra-core/src/util/useCheckForApplicationUpdate.ts index a1017f49176..599f79cf3c1 100644 --- a/packages/ra-core/src/util/useCheckForApplicationUpdate.ts +++ b/packages/ra-core/src/util/useCheckForApplicationUpdate.ts @@ -2,7 +2,8 @@ import { useEffect, useRef } from 'react'; import { useEvent } from './useEvent'; /** - * A hook that checks if the application code has changed and call the provided onNewVersionAvailable function when needed. + * Checks if the application code has changed and calls the provided onNewVersionAvailable function when needed. + * * It checks for code update by downloading the provided URL (default to the HTML page) and * comparing the hash of the response with the hash of the current page. * diff --git a/packages/ra-language-english/src/index.ts b/packages/ra-language-english/src/index.ts index 27b2d2e47fb..da7fcd97502 100644 --- a/packages/ra-language-english/src/index.ts +++ b/packages/ra-language-english/src/index.ts @@ -40,7 +40,7 @@ const englishMessages: TranslationMessages = { open: 'Open', toggle_theme: 'Toggle Theme', select_columns: 'Columns', - update_application: 'Update Application', + update_application: 'Reload Application', }, boolean: { true: 'Yes', diff --git a/packages/ra-language-french/src/index.ts b/packages/ra-language-french/src/index.ts index fb21c7c7185..8f21a1938ae 100644 --- a/packages/ra-language-french/src/index.ts +++ b/packages/ra-language-french/src/index.ts @@ -41,7 +41,7 @@ const frenchMessages: TranslationMessages = { open: 'Ouvrir', toggle_theme: 'Thème clair/sombre', select_columns: 'Colonnes', - update_application: "Mettre à jour l'application", + update_application: "Recharger l'application", }, boolean: { true: 'Oui', diff --git a/packages/ra-ui-materialui/src/layout/CheckForApplicationUpdate.tsx b/packages/ra-ui-materialui/src/layout/CheckForApplicationUpdate.tsx index 4eab934aa46..40f9c52e102 100644 --- a/packages/ra-ui-materialui/src/layout/CheckForApplicationUpdate.tsx +++ b/packages/ra-ui-materialui/src/layout/CheckForApplicationUpdate.tsx @@ -8,7 +8,7 @@ import { import { ApplicationUpdatedNotification } from './ApplicationUpdatedNotification'; /** - * A component which checks for a new version of the application and can display a notification asking users to reload the page. + * Display a notification asking users to reload the page when the application code has changed. * * @param {CheckForApplicationUpdateProps} props * @param {boolean} options.disabled Optional. Whether the check should be disabled. Defaults to false. From 6beef9fc71f860ee11e8f256ae3b7148bef2eff7 Mon Sep 17 00:00:00 2001 From: fzaninotto Date: Thu, 10 Aug 2023 15:59:52 +0200 Subject: [PATCH 19/20] Do not show notification on network errors --- docs/CheckForApplicationUpdate.md | 8 +++--- .../src/util/useCheckForApplicationUpdate.ts | 27 ++++++++++++------- 2 files changed, 21 insertions(+), 14 deletions(-) diff --git a/docs/CheckForApplicationUpdate.md b/docs/CheckForApplicationUpdate.md index 119e5b18d44..c4942d2bada 100644 --- a/docs/CheckForApplicationUpdate.md +++ b/docs/CheckForApplicationUpdate.md @@ -43,14 +43,14 @@ export const App = () => ( | Prop | Required | Type | Default | Description | | --------------- | -------- | -------- | ------------------ |-------------------------------------------------------------------- | -| `checkInterval` | Optional | number | `3600000` (1 hour) | The interval in milliseconds between two checks | +| `interval` | Optional | number | `3600000` (1 hour) | The interval in milliseconds between two checks | | `disabled` | Optional | boolean | `false` in `production` mode | Whether the automatic check is disabled | | `notification` | Optional | ReactElement | | The notification to display to the user when an update is available | | `url` | Optional | string | current URL | The URL to download to check for code update | -## `checkInterval` +## `interval` -You can customize the interval of time between each application update check by providing the `checkInterval` prop. It accepts a number of milliseconds and is set to `3600000` (1 hour) by default. +You can customize the interval between each check by providing the `interval` prop. It accepts a number of milliseconds and is set to `3600000` (1 hour) by default. ```tsx // in src/MyLayout.tsx @@ -61,7 +61,7 @@ const HALF_HOUR = 30 * 60 * 1000; export const MyLayout = ({ children, ...props }: LayoutProps) => ( {children} - + ); ``` diff --git a/packages/ra-core/src/util/useCheckForApplicationUpdate.ts b/packages/ra-core/src/util/useCheckForApplicationUpdate.ts index 599f79cf3c1..02b7f6a531d 100644 --- a/packages/ra-core/src/util/useCheckForApplicationUpdate.ts +++ b/packages/ra-core/src/util/useCheckForApplicationUpdate.ts @@ -3,14 +3,14 @@ import { useEvent } from './useEvent'; /** * Checks if the application code has changed and calls the provided onNewVersionAvailable function when needed. - * + * * It checks for code update by downloading the provided URL (default to the HTML page) and * comparing the hash of the response with the hash of the current page. * * @param {UseCheckForApplicationUpdateOptions} options The options * @param {Function} options.onNewVersionAvailable The function to call when a new version of the application is available. * @param {string} options.url Optional. The URL to download to check for code update. Defaults to the current URL. - * @param {number} options.checkInterval Optional. The interval in milliseconds between two checks. Defaults to 3600000 (1 hour). + * @param {number} options.interval Optional. The interval in milliseconds between two checks. Defaults to 3600000 (1 hour). * @param {boolean} options.disabled Optional. Whether the check should be disabled. Defaults to false. */ export const useCheckForApplicationUpdate = ( @@ -18,7 +18,7 @@ export const useCheckForApplicationUpdate = ( ) => { const { url = window.location.href, - checkInterval = ONE_HOUR, + interval: delay = ONE_HOUR, onNewVersionAvailable: onNewVersionAvailableProp, disabled = process.env.NODE_ENV !== 'production', } = options; @@ -29,7 +29,9 @@ export const useCheckForApplicationUpdate = ( if (disabled) return; getHashForUrl(url).then(hash => { - currentHash.current = hash; + if (hash != null) { + currentHash.current = hash; + } }); }, [disabled, url]); @@ -49,15 +51,20 @@ export const useCheckForApplicationUpdate = ( .catch(() => { // Ignore errors to avoid issues when connectivity is lost }); - }, checkInterval); + }, delay); return () => clearInterval(interval); - }, [checkInterval, onNewVersionAvailable, disabled, url]); + }, [delay, onNewVersionAvailable, disabled, url]); }; const getHashForUrl = async (url: string) => { - const response = await fetch(url); - const text = await response.text(); - return hash(text); + try { + const response = await fetch(url); + if (!response.ok) return null; + const text = await response.text(); + return hash(text); + } catch (e) { + return null; + } }; // Simple hash function, taken from https://stackoverflow.com/a/52171480/3723993, suggested by Copilot @@ -81,7 +88,7 @@ const ONE_HOUR = 1000 * 60 * 60; export interface UseCheckForApplicationUpdateOptions { onNewVersionAvailable: () => void; - checkInterval?: number; + interval?: number; url?: string; disabled?: boolean; } From b2e5c6ed280f005c88e9df0d74d9d0fc749d9b4d Mon Sep 17 00:00:00 2001 From: fzaninotto Date: Thu, 10 Aug 2023 16:00:05 +0200 Subject: [PATCH 20/20] Use in CRM demo --- examples/crm/src/Layout.tsx | 3 ++- .../ra-ui-materialui/src/layout/CheckForApplicationUpdate.tsx | 2 +- 2 files changed, 3 insertions(+), 2 deletions(-) diff --git a/examples/crm/src/Layout.tsx b/examples/crm/src/Layout.tsx index 1e564f22eec..99f68c1f70a 100644 --- a/examples/crm/src/Layout.tsx +++ b/examples/crm/src/Layout.tsx @@ -1,6 +1,6 @@ import React, { HtmlHTMLAttributes } from 'react'; import { CssBaseline, Container } from '@mui/material'; -import { CoreLayoutProps } from 'react-admin'; +import { CoreLayoutProps, CheckForApplicationUpdate } from 'react-admin'; import { ErrorBoundary } from 'react-error-boundary'; import { Error } from 'react-admin'; @@ -18,6 +18,7 @@ const Layout = ({ children }: LayoutProps) => ( + ); diff --git a/packages/ra-ui-materialui/src/layout/CheckForApplicationUpdate.tsx b/packages/ra-ui-materialui/src/layout/CheckForApplicationUpdate.tsx index 40f9c52e102..64ba87d3e8c 100644 --- a/packages/ra-ui-materialui/src/layout/CheckForApplicationUpdate.tsx +++ b/packages/ra-ui-materialui/src/layout/CheckForApplicationUpdate.tsx @@ -14,7 +14,7 @@ import { ApplicationUpdatedNotification } from './ApplicationUpdatedNotification * @param {boolean} options.disabled Optional. Whether the check should be disabled. Defaults to false. * @param {string|ReactElement} props.notification The notification to display to the user. Displayed only if `updateMode` is manual. Defaults to ``. * @param {string} options.url Optional. The URL to download to check for code update. Defaults to the current URL. - * @param {number} options.checkInterval Optional. The interval in milliseconds between two checks. Defaults to 3600000 (1 hour). + * @param {number} options.interval Optional. The interval in milliseconds between two checks. Defaults to 3600000 (1 hour). * * @example Basic usage * import { Admin, Resource, Layout, CheckForApplicationUpdate, ListGuesser } from 'react-admin';