From f12ed7c2c189bd85485c786bc8206639b5ec4fc7 Mon Sep 17 00:00:00 2001 From: fzaninotto Date: Mon, 23 Jun 2025 19:21:12 +0200 Subject: [PATCH 01/28] [doc] Add Datatable video tutorial --- docs/DataTable.md | 2 ++ 1 file changed, 2 insertions(+) diff --git a/docs/DataTable.md b/docs/DataTable.md index a1cf42ef80c..94a80a282d9 100644 --- a/docs/DataTable.md +++ b/docs/DataTable.md @@ -7,6 +7,8 @@ title: "The DataTable Component" The `` component renders a list of records as a table. It supports sorting, row selection for bulk actions, a collapsible panel, hiding and reordering columns, dynamic row and cell styles, and more. + + ## Usage Use `` inside a `ListContext` (e.g., as a descendent of [``](./List.md#list) or [``](./ReferenceManyField.md)). Define the table columns with its children using `` components: From 42d81e4a948131ca892193fa5bcb6f92bc0a1aa1 Mon Sep 17 00:00:00 2001 From: Matthieu Hochlander Date: Tue, 24 Jun 2025 10:54:55 +0200 Subject: [PATCH 02/28] Add docs about hiddenColumns property of . --- docs/DataTable.md | 27 +++++++++++++++++++++++++++ 1 file changed, 27 insertions(+) diff --git a/docs/DataTable.md b/docs/DataTable.md index a1cf42ef80c..8763f77e349 100644 --- a/docs/DataTable.md +++ b/docs/DataTable.md @@ -691,6 +691,33 @@ const PostList = () => ( **Tip**: To handle sorting in your custom DataTable head component, check out the [Building a custom sort control](./ListTutorial.md#building-a-custom-sort-control) section. +## `hiddenColumns` + +By default, `` renders all `` children. Use the `hiddenColumns` property to set hidden columns by default. + +```tsx +import { ColumnsButton, TopToolbar, List, DataTable } from 'react-admin'; + +const PostListActions = () => ( + + + +) + +const PostList = () => ( + }> + + + + + + + +); +``` + +Using the `hiddenColumns` property instead of removing `` elements entirely allows hidden columns to be displayed again using a `ColumnsButton`, as explained in the [Hiding or Reordering Columns](#hiding-or-reordering-columns) section. + ## `hover` By default, when a user hovers over a row, the background color changes to indicate the row is active. Set the `hover` prop to `false` to disable this behavior. From a06587e74ea37f4891f96295b66658540c9feaa0 Mon Sep 17 00:00:00 2001 From: fzaninotto Date: Tue, 24 Jun 2025 15:43:52 +0200 Subject: [PATCH 03/28] [no ci] Fix writing style --- docs/DataTable.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/DataTable.md b/docs/DataTable.md index 05ed28ddd3e..56980aad5ed 100644 --- a/docs/DataTable.md +++ b/docs/DataTable.md @@ -718,7 +718,7 @@ const PostList = () => ( ); ``` -Using the `hiddenColumns` property instead of removing `` elements entirely allows hidden columns to be displayed again using a `ColumnsButton`, as explained in the [Hiding or Reordering Columns](#hiding-or-reordering-columns) section. +Using `hiddenColumns` instead of removing `` elements allows hidden columns to be displayed again using a ``, as explained in the [Hiding or Reordering Columns](#hiding-or-reordering-columns) section. ## `hover` From a7d73a1e0d67fafdf955451e4507acfad409675a Mon Sep 17 00:00:00 2001 From: Jean-Baptiste Kaiser Date: Wed, 25 Jun 2025 09:51:58 +0200 Subject: [PATCH 04/28] Fix `` does not allow to put a button in the column's header --- .../src/list/datatable/DataTable.stories.tsx | 15 +++++++++++++++ .../src/list/datatable/DataTableHeadCell.tsx | 12 +++++------- 2 files changed, 20 insertions(+), 7 deletions(-) diff --git a/packages/ra-ui-materialui/src/list/datatable/DataTable.stories.tsx b/packages/ra-ui-materialui/src/list/datatable/DataTable.stories.tsx index a29b24d00b4..b2912d9e0f5 100644 --- a/packages/ra-ui-materialui/src/list/datatable/DataTable.stories.tsx +++ b/packages/ra-ui-materialui/src/list/datatable/DataTable.stories.tsx @@ -37,6 +37,7 @@ import { import { BulkDeleteButton, BulkExportButton, + CreateButton, EditButton, SelectAllButton as RaSelectAllButton, } from '../../button'; @@ -896,3 +897,17 @@ export const NonPrimitiveData = () => ( ); + +export const HeaderButton = () => ( + defaultMessages, 'en')}> + + + + + + }> + + + + +); diff --git a/packages/ra-ui-materialui/src/list/datatable/DataTableHeadCell.tsx b/packages/ra-ui-materialui/src/list/datatable/DataTableHeadCell.tsx index 84be1933119..b026ca019fb 100644 --- a/packages/ra-ui-materialui/src/list/datatable/DataTableHeadCell.tsx +++ b/packages/ra-ui-materialui/src/list/datatable/DataTableHeadCell.tsx @@ -120,13 +120,11 @@ export const DataTableHeadCell = React.memo( ) : ( - - - + )} ); From 60a6d406ee492bbc909e432d6e1b6ca262f74b6a Mon Sep 17 00:00:00 2001 From: Gildas <1122076+djhi@users.noreply.github.com> Date: Wed, 25 Jun 2025 09:58:24 +0200 Subject: [PATCH 05/28] [chore] Avoid vercel deployment for `gh-pages` branch --- vercel.json | 7 +++++-- 1 file changed, 5 insertions(+), 2 deletions(-) diff --git a/vercel.json b/vercel.json index 0cae358a188..a3416e3c02b 100644 --- a/vercel.json +++ b/vercel.json @@ -1,5 +1,8 @@ { - "github": { - "silent": true + "$schema": "https://openapi.vercel.sh/vercel.json", + "git": { + "deploymentEnabled": { + "gh-pages": false + } } } From c3deb9dd5d7287191f73fe800191eb8deacd3a03 Mon Sep 17 00:00:00 2001 From: Jean-Baptiste Kaiser Date: Wed, 25 Jun 2025 10:41:07 +0200 Subject: [PATCH 06/28] apply DataTable codemod to stories --- .../src/button/BulkDeleteButton.stories.tsx | 16 ++-- .../src/button/BulkExportButton.stories.tsx | 16 ++-- .../src/button/BulkUpdateButton.stories.tsx | 16 ++-- .../src/button/CreateButton.stories.tsx | 17 ++-- .../src/button/DeleteButton.stories.tsx | 21 +++-- .../DeleteWithConfirmButton.stories.tsx | 28 +++--- .../button/DeleteWithUndoButton.stories.tsx | 17 ++-- .../src/button/EditButton.stories.tsx | 21 +++-- .../src/button/ListButton.stories.tsx | 17 ++-- .../src/button/LocalesMenuButton.stories.tsx | 16 ++-- .../src/button/SelectAllButton.stories.tsx | 16 ++-- .../src/button/ShowButton.stories.tsx | 18 ++-- .../src/button/ToggleThemeButton.stories.tsx | 16 ++-- .../src/button/UpdateButton.stories.tsx | 18 ++-- .../UpdateWithConfirmButton.stories.tsx | 28 +++--- .../src/field/ArrayField.stories.tsx | 12 +-- .../src/field/ReferenceArrayField.stories.tsx | 34 +++---- .../src/field/ReferenceField.stories.tsx | 54 ++++++------ .../src/field/ReferenceManyField.stories.tsx | 44 +++++----- .../src/field/ReferenceOneField.stories.tsx | 69 ++++++++------- .../src/input/InputErrors.stories.tsx | 12 ++- .../src/input/ReferenceInput.stories.tsx | 10 +-- .../src/input/SearchInput.stories.tsx | 40 ++++----- .../src/list/InfiniteList.stories.tsx | 46 +++++----- .../src/list/List.stories.tsx | 88 +++++++++---------- .../src/list/filter/FilterButton.stories.tsx | 13 ++- .../src/list/filter/FilterList.stories.tsx | 14 ++- .../list/filter/FilterLiveForm.stories.tsx | 28 +++--- .../list/filter/FilterLiveSearch.stories.tsx | 15 ++-- .../list/filter/SavedQueriesList.stories.tsx | 24 ++--- packages/react-admin/src/Resource.stories.tsx | 29 +++--- 31 files changed, 399 insertions(+), 414 deletions(-) diff --git a/packages/ra-ui-materialui/src/button/BulkDeleteButton.stories.tsx b/packages/ra-ui-materialui/src/button/BulkDeleteButton.stories.tsx index 14a963c3df1..955c4cb3a7e 100644 --- a/packages/ra-ui-materialui/src/button/BulkDeleteButton.stories.tsx +++ b/packages/ra-ui-materialui/src/button/BulkDeleteButton.stories.tsx @@ -5,12 +5,10 @@ import { Resource } from 'ra-core'; import polyglotI18nProvider from 'ra-i18n-polyglot'; import englishMessages from 'ra-language-english'; import fakeRestDataProvider from 'ra-data-fakerest'; - import { AdminContext } from '../AdminContext'; import { BulkDeleteButton } from './BulkDeleteButton'; import { defaultLightTheme } from '../theme'; -import { Datagrid, List } from '../list'; -import { NumberField, TextField } from '../field'; +import { DataTable, List } from '../list'; import { AdminUI } from '../AdminUI'; export default { title: 'ra-ui-materialui/button/BulkDeleteButton' }; @@ -104,12 +102,12 @@ const Wrapper = ({ children, ...props }) => { name="books" list={() => ( - - - - - - + + + + + + )} /> diff --git a/packages/ra-ui-materialui/src/button/BulkExportButton.stories.tsx b/packages/ra-ui-materialui/src/button/BulkExportButton.stories.tsx index ca636ed1fd5..c25fd131955 100644 --- a/packages/ra-ui-materialui/src/button/BulkExportButton.stories.tsx +++ b/packages/ra-ui-materialui/src/button/BulkExportButton.stories.tsx @@ -5,12 +5,10 @@ import { Resource } from 'ra-core'; import polyglotI18nProvider from 'ra-i18n-polyglot'; import englishMessages from 'ra-language-english'; import fakeRestDataProvider from 'ra-data-fakerest'; - import { AdminContext } from '../AdminContext'; import { BulkExportButton } from './BulkExportButton'; import { defaultLightTheme } from '../theme'; -import { Datagrid, List } from '../list'; -import { NumberField, TextField } from '../field'; +import { DataTable, List } from '../list'; import { AdminUI } from '../AdminUI'; export default { title: 'ra-ui-materialui/button/BulkExportButton' }; @@ -104,12 +102,12 @@ const Wrapper = ({ children, ...props }) => { name="books" list={() => ( - - - - - - + + + + + + )} /> diff --git a/packages/ra-ui-materialui/src/button/BulkUpdateButton.stories.tsx b/packages/ra-ui-materialui/src/button/BulkUpdateButton.stories.tsx index e7fe4ee1e36..29cc55251d5 100644 --- a/packages/ra-ui-materialui/src/button/BulkUpdateButton.stories.tsx +++ b/packages/ra-ui-materialui/src/button/BulkUpdateButton.stories.tsx @@ -3,12 +3,10 @@ import polyglotI18nProvider from 'ra-i18n-polyglot'; import englishMessages from 'ra-language-english'; import { Resource, TestMemoryRouter } from 'ra-core'; import fakeRestDataProvider from 'ra-data-fakerest'; - import { BulkUpdateButton } from './BulkUpdateButton'; import { AdminContext } from '../AdminContext'; import { AdminUI } from '../AdminUI'; -import { List, Datagrid } from '../list'; -import { TextField, NumberField } from '../field'; +import { List, DataTable } from '../list'; import { deepmerge } from '@mui/utils'; import { defaultLightTheme } from '../theme'; import { ThemeOptions } from '@mui/material'; @@ -104,12 +102,12 @@ const Wrapper = ({ bulkActionButtons, theme = undefined }) => ( name="books" list={() => ( - - - - - - + + + + + + )} /> diff --git a/packages/ra-ui-materialui/src/button/CreateButton.stories.tsx b/packages/ra-ui-materialui/src/button/CreateButton.stories.tsx index 6ef2c5a45e9..c548bbfc15f 100644 --- a/packages/ra-ui-materialui/src/button/CreateButton.stories.tsx +++ b/packages/ra-ui-materialui/src/button/CreateButton.stories.tsx @@ -2,6 +2,7 @@ import * as React from 'react'; import polyglotI18nProvider from 'ra-i18n-polyglot'; import englishMessages from 'ra-language-english'; import frenchMessages from 'ra-language-french'; + import { AuthProvider, I18nProvider, @@ -10,13 +11,13 @@ import { ResourceContextProvider, TestMemoryRouter, } from 'ra-core'; + import fakeRestDataProvider from 'ra-data-fakerest'; import { QueryClient } from '@tanstack/react-query'; import { AdminContext } from '../AdminContext'; import { AdminUI } from '../AdminUI'; import { List } from '../list/List'; -import { Datagrid } from '../list/datagrid/Datagrid'; -import { TextField } from '../field/TextField'; +import { DataTable } from '../list'; import { Create } from '../detail/Create'; import { SimpleForm } from '../form/SimpleForm'; import { TextInput } from '../input/TextInput'; @@ -202,12 +203,12 @@ const AccessControlLayout = ({ const BookList = () => { return ( - - - - - - + + + + + + ); }; diff --git a/packages/ra-ui-materialui/src/button/DeleteButton.stories.tsx b/packages/ra-ui-materialui/src/button/DeleteButton.stories.tsx index 2d584708e0b..08957bb9895 100644 --- a/packages/ra-ui-materialui/src/button/DeleteButton.stories.tsx +++ b/packages/ra-ui-materialui/src/button/DeleteButton.stories.tsx @@ -5,6 +5,7 @@ import englishMessages from 'ra-language-english'; import frenchMessages from 'ra-language-french'; import { QueryClient } from '@tanstack/react-query'; import fakeRestDataProvider from 'ra-data-fakerest'; + import { AuthProvider, I18nProvider, @@ -16,12 +17,12 @@ import { ResourceContextProvider, TestMemoryRouter, } from 'ra-core'; + import { deepmerge } from '@mui/utils'; import { AdminContext } from '../AdminContext'; import { DeleteButton } from './DeleteButton'; import { List } from '../list/List'; -import { Datagrid } from '../list/datagrid/Datagrid'; -import { TextField } from '../field/TextField'; +import { DataTable } from '../list'; import { AdminUI } from '../AdminUI'; import { Notification } from '../layout'; import { LocalesMenuButton } from './LocalesMenuButton'; @@ -397,13 +398,15 @@ const AccessControlLayout = ({ const BookList = ({ mutationMode = 'undoable' as const }) => ( - - - - - - - + + + + + + + + + ); diff --git a/packages/ra-ui-materialui/src/button/DeleteWithConfirmButton.stories.tsx b/packages/ra-ui-materialui/src/button/DeleteWithConfirmButton.stories.tsx index f5ef441ea49..69d6e05316b 100644 --- a/packages/ra-ui-materialui/src/button/DeleteWithConfirmButton.stories.tsx +++ b/packages/ra-ui-materialui/src/button/DeleteWithConfirmButton.stories.tsx @@ -5,12 +5,10 @@ import frenchMessages from 'ra-language-french'; import { Resource, TestMemoryRouter } from 'ra-core'; import fakeRestDataProvider from 'ra-data-fakerest'; import { Alert, createTheme, ThemeOptions } from '@mui/material'; - import { DeleteWithConfirmButton } from './DeleteWithConfirmButton'; import { AdminContext } from '../AdminContext'; import { AdminUI } from '../AdminUI'; -import { List, Datagrid } from '../list'; -import { TextField } from '../field'; +import { List, DataTable } from '../list'; import { deepmerge } from '@mui/utils'; export default { title: 'ra-ui-materialui/button/DeleteWithConfirmButton' }; @@ -172,13 +170,13 @@ const dataProvider = fakeRestDataProvider({ const BookList = ({ children }) => { return ( - - - - - - {children} - + + + + + + {children} + ); }; @@ -186,11 +184,11 @@ const BookList = ({ children }) => { const AuthorList = ({ children }) => { return ( - - - - {children} - + + + + {children} + ); }; diff --git a/packages/ra-ui-materialui/src/button/DeleteWithUndoButton.stories.tsx b/packages/ra-ui-materialui/src/button/DeleteWithUndoButton.stories.tsx index 48d2fbbf8ef..79e4af8d823 100644 --- a/packages/ra-ui-materialui/src/button/DeleteWithUndoButton.stories.tsx +++ b/packages/ra-ui-materialui/src/button/DeleteWithUndoButton.stories.tsx @@ -9,8 +9,7 @@ import polyglotI18nProvider from 'ra-i18n-polyglot'; import frenchMessages from 'ra-language-french'; import englishMessages from 'ra-language-english'; import fakeRestDataProvider from 'ra-data-fakerest'; -import { Datagrid, List } from '../list'; -import { TextField } from '../field'; +import { DataTable, List } from '../list'; export default { title: 'ra-ui-materialui/button/DeleteWithUndoButton' }; @@ -145,13 +144,13 @@ const dataProvider = fakeRestDataProvider({ const BookList = ({ children }) => { return ( - - - - - - {children} - + + + + + + {children} + ); }; diff --git a/packages/ra-ui-materialui/src/button/EditButton.stories.tsx b/packages/ra-ui-materialui/src/button/EditButton.stories.tsx index 51eca1d0622..ee26272eae9 100644 --- a/packages/ra-ui-materialui/src/button/EditButton.stories.tsx +++ b/packages/ra-ui-materialui/src/button/EditButton.stories.tsx @@ -2,6 +2,7 @@ import * as React from 'react'; import polyglotI18nProvider from 'ra-i18n-polyglot'; import englishMessages from 'ra-language-english'; import frenchMessages from 'ra-language-french'; + import { AuthProvider, I18nProvider, @@ -12,13 +13,13 @@ import { ResourceContextProvider, TestMemoryRouter, } from 'ra-core'; + import fakeRestDataProvider from 'ra-data-fakerest'; import { QueryClient } from '@tanstack/react-query'; import { AdminContext } from '../AdminContext'; import { AdminUI } from '../AdminUI'; import { List } from '../list/List'; -import { Datagrid } from '../list/datagrid/Datagrid'; -import { TextField } from '../field/TextField'; +import { DataTable } from '../list'; import { SimpleForm } from '../form/SimpleForm'; import { TextInput } from '../input/TextInput'; import { EditButton } from './EditButton'; @@ -238,13 +239,15 @@ const AccessControlLayout = ({ const BookList = () => { return ( - - - - - - - + + + + + + + + + ); }; diff --git a/packages/ra-ui-materialui/src/button/ListButton.stories.tsx b/packages/ra-ui-materialui/src/button/ListButton.stories.tsx index 5fb1248083b..6d6437c602b 100644 --- a/packages/ra-ui-materialui/src/button/ListButton.stories.tsx +++ b/packages/ra-ui-materialui/src/button/ListButton.stories.tsx @@ -2,6 +2,7 @@ import * as React from 'react'; import polyglotI18nProvider from 'ra-i18n-polyglot'; import englishMessages from 'ra-language-english'; import frenchMessages from 'ra-language-french'; + import { AuthProvider, I18nProvider, @@ -11,6 +12,7 @@ import { ResourceContextProvider, TestMemoryRouter, } from 'ra-core'; + import fakeRestDataProvider from 'ra-data-fakerest'; import { QueryClient } from '@tanstack/react-query'; import { deepmerge } from '@mui/utils'; @@ -18,8 +20,7 @@ import { ThemeOptions } from '@mui/material'; import { AdminContext } from '../AdminContext'; import { AdminUI } from '../AdminUI'; import { List } from '../list/List'; -import { Datagrid } from '../list/datagrid/Datagrid'; -import { TextField } from '../field/TextField'; +import { DataTable } from '../list'; import { SimpleForm } from '../form/SimpleForm'; import { TextInput } from '../input/TextInput'; import { ListButton } from './ListButton'; @@ -208,12 +209,12 @@ const AccessControlLayout = ({ const BookList = () => { return ( - - - - - - + + + + + + ); }; diff --git a/packages/ra-ui-materialui/src/button/LocalesMenuButton.stories.tsx b/packages/ra-ui-materialui/src/button/LocalesMenuButton.stories.tsx index 3d20ed85d1f..372d098ecbd 100644 --- a/packages/ra-ui-materialui/src/button/LocalesMenuButton.stories.tsx +++ b/packages/ra-ui-materialui/src/button/LocalesMenuButton.stories.tsx @@ -6,12 +6,10 @@ import { useTranslate, Resource, TestMemoryRouter } from 'ra-core'; import fakeRestDataProvider from 'ra-data-fakerest'; import { Typography } from '@mui/material'; import LanguageIcon from '@mui/icons-material/Language'; - import { LocalesMenuButton } from './LocalesMenuButton'; import { AdminContext } from '../AdminContext'; import { AdminUI } from '../AdminUI'; -import { List, Datagrid } from '../list'; -import { TextField } from '../field'; +import { List, DataTable } from '../list'; import { AppBar, Layout, TitlePortal } from '../layout'; export default { title: 'ra-ui-materialui/button/LocalesMenuButton' }; @@ -143,12 +141,12 @@ const dataProvider = fakeRestDataProvider({ const BookList = () => { return ( - - - - - - + + + + + + ); }; diff --git a/packages/ra-ui-materialui/src/button/SelectAllButton.stories.tsx b/packages/ra-ui-materialui/src/button/SelectAllButton.stories.tsx index 0adbda669fa..c2ebbbdaed6 100644 --- a/packages/ra-ui-materialui/src/button/SelectAllButton.stories.tsx +++ b/packages/ra-ui-materialui/src/button/SelectAllButton.stories.tsx @@ -3,12 +3,10 @@ import polyglotI18nProvider from 'ra-i18n-polyglot'; import englishMessages from 'ra-language-english'; import { Resource, TestMemoryRouter } from 'ra-core'; import fakeRestDataProvider from 'ra-data-fakerest'; - import { SelectAllButton } from './SelectAllButton'; import { AdminContext } from '../AdminContext'; import { AdminUI } from '../AdminUI'; -import { List, Datagrid, BulkActionsToolbar } from '../list'; -import { TextField, NumberField } from '../field'; +import { List, DataTable, BulkActionsToolbar } from '../list'; import { BulkDeleteButton } from './BulkDeleteButton'; export default { title: 'ra-ui-materialui/button/SelectAllButton' }; @@ -134,7 +132,7 @@ const Wrapper = ({ children }) => ( name="books" list={() => ( - ( } > - - - - - + + + + + )} /> diff --git a/packages/ra-ui-materialui/src/button/ShowButton.stories.tsx b/packages/ra-ui-materialui/src/button/ShowButton.stories.tsx index e65cdff41e4..bd54a01bba3 100644 --- a/packages/ra-ui-materialui/src/button/ShowButton.stories.tsx +++ b/packages/ra-ui-materialui/src/button/ShowButton.stories.tsx @@ -19,7 +19,7 @@ import { deepmerge } from '@mui/utils'; import { AdminContext } from '../AdminContext'; import { AdminUI } from '../AdminUI'; import { List } from '../list/List'; -import { Datagrid } from '../list/datagrid/Datagrid'; +import { DataTable } from '../list'; import { TextField } from '../field/TextField'; import ShowButton from './ShowButton'; import { Show } from '../detail/Show'; @@ -240,13 +240,15 @@ const AccessControlLayout = ({ const BookList = () => { return ( - - - - - - - + + + + + + + + + ); }; diff --git a/packages/ra-ui-materialui/src/button/ToggleThemeButton.stories.tsx b/packages/ra-ui-materialui/src/button/ToggleThemeButton.stories.tsx index 1c8714615a9..221e715d3db 100644 --- a/packages/ra-ui-materialui/src/button/ToggleThemeButton.stories.tsx +++ b/packages/ra-ui-materialui/src/button/ToggleThemeButton.stories.tsx @@ -2,9 +2,7 @@ import * as React from 'react'; import { Admin } from 'react-admin'; import { Resource, memoryStore, TestMemoryRouter } from 'ra-core'; import fakeRestDataProvider from 'ra-data-fakerest'; - -import { List, Datagrid } from '../list'; -import { TextField } from '../field'; +import { List, DataTable } from '../list'; export default { title: 'ra-ui-materialui/button/ToggleThemeButton' }; @@ -82,12 +80,12 @@ const dataProvider = fakeRestDataProvider({ const BookList = () => ( - - - - - - + + + + + + ); diff --git a/packages/ra-ui-materialui/src/button/UpdateButton.stories.tsx b/packages/ra-ui-materialui/src/button/UpdateButton.stories.tsx index 28a1d9ab47c..d9a8e8f3923 100644 --- a/packages/ra-ui-materialui/src/button/UpdateButton.stories.tsx +++ b/packages/ra-ui-materialui/src/button/UpdateButton.stories.tsx @@ -23,7 +23,7 @@ import { AdminUI } from '../AdminUI'; import { NumberField, TextField } from '../field'; import { Show, SimpleShowLayout } from '../detail'; import { TopToolbar } from '../layout'; -import { Datagrid, List } from '../list'; +import { DataTable, List } from '../list'; import { LocalesMenuButton } from './LocalesMenuButton'; import { defaultLightTheme } from '../theme'; @@ -133,13 +133,15 @@ const PostShow = () => ( const PostList = () => ( - - - - - - - + + + + + + + + + ); diff --git a/packages/ra-ui-materialui/src/button/UpdateWithConfirmButton.stories.tsx b/packages/ra-ui-materialui/src/button/UpdateWithConfirmButton.stories.tsx index 5cd20a67e7b..82d65486f56 100644 --- a/packages/ra-ui-materialui/src/button/UpdateWithConfirmButton.stories.tsx +++ b/packages/ra-ui-materialui/src/button/UpdateWithConfirmButton.stories.tsx @@ -5,12 +5,10 @@ import frenchMessages from 'ra-language-french'; import { Resource, TestMemoryRouter } from 'ra-core'; import fakeRestDataProvider from 'ra-data-fakerest'; import { Alert } from '@mui/material'; - import { UpdateWithConfirmButton } from './UpdateWithConfirmButton'; import { AdminContext } from '../AdminContext'; import { AdminUI } from '../AdminUI'; -import { List, Datagrid } from '../list'; -import { TextField } from '../field'; +import { List, DataTable } from '../list'; export default { title: 'ra-ui-materialui/button/UpdateWithConfirmButton' }; @@ -171,13 +169,13 @@ const dataProvider = fakeRestDataProvider({ const BookList = ({ children }) => { return ( - - - - - - {children} - + + + + + + {children} + ); }; @@ -185,11 +183,11 @@ const BookList = ({ children }) => { const AuthorList = ({ children }) => { return ( - - - - {children} - + + + + {children} + ); }; diff --git a/packages/ra-ui-materialui/src/field/ArrayField.stories.tsx b/packages/ra-ui-materialui/src/field/ArrayField.stories.tsx index ba559669e85..eadee099b77 100644 --- a/packages/ra-ui-materialui/src/field/ArrayField.stories.tsx +++ b/packages/ra-ui-materialui/src/field/ArrayField.stories.tsx @@ -13,7 +13,7 @@ import { Card, ThemeProvider, createTheme } from '@mui/material'; import { AdminContext } from '../AdminContext'; import { ArrayField } from './ArrayField'; -import { Datagrid, SingleFieldList } from '../list'; +import { DataTable, SingleFieldList } from '../list'; import { ChipField } from './ChipField'; import { SimpleShowLayout } from '../detail'; import { TextField } from './TextField'; @@ -169,11 +169,11 @@ export const InShowLayout = () => ( - - - - - + + + + + diff --git a/packages/ra-ui-materialui/src/field/ReferenceArrayField.stories.tsx b/packages/ra-ui-materialui/src/field/ReferenceArrayField.stories.tsx index 532fc1c7e03..80c346f2a28 100644 --- a/packages/ra-ui-materialui/src/field/ReferenceArrayField.stories.tsx +++ b/packages/ra-ui-materialui/src/field/ReferenceArrayField.stories.tsx @@ -6,7 +6,7 @@ import polyglotI18nProvider from 'ra-i18n-polyglot'; import englishMessages from 'ra-language-english'; import { AdminContext } from '../AdminContext'; -import { Datagrid, Pagination } from '../list'; +import { DataTable, Pagination } from '../list'; import { ReferenceArrayField } from './ReferenceArrayField'; import { TextField } from './TextField'; import { Show, SimpleShowLayout } from '../detail'; @@ -58,10 +58,10 @@ export const Children = () => ( - - - - + + + + @@ -96,10 +96,10 @@ export const DifferentIdTypes = () => ( source="members" reference="artists" > - - - - + + + + @@ -127,10 +127,10 @@ export const WithMeta = () => { meta: { foo: 'bar' }, }} > - - - - + + + + @@ -154,10 +154,10 @@ export const WithPagination = () => ( pagination={} perPage={5} > - - - - + + + + diff --git a/packages/ra-ui-materialui/src/field/ReferenceField.stories.tsx b/packages/ra-ui-materialui/src/field/ReferenceField.stories.tsx index 6da8201be34..28677317bca 100644 --- a/packages/ra-ui-materialui/src/field/ReferenceField.stories.tsx +++ b/packages/ra-ui-materialui/src/field/ReferenceField.stories.tsx @@ -26,10 +26,9 @@ import { ReferenceField } from './ReferenceField'; import { ReferenceManyCount } from './ReferenceManyCount'; import { ReferenceInput } from '../input/ReferenceInput'; import { SimpleShowLayout } from '../detail/SimpleShowLayout'; -import { Datagrid } from '../list/datagrid/Datagrid'; import { AdminUI, AdminContext } from '../'; import { defaultLightTheme, ThemeProvider, ThemesContext } from '../theme'; -import { List } from '../list'; +import { DataTable, List } from '../list'; import { EditGuesser, ShowGuesser } from '../detail'; export default { title: 'ra-ui-materialui/fields/ReferenceField' }; @@ -388,16 +387,14 @@ const ListWrapper = ({ children }) => ( export const InDatagrid = () => ( - - - - - - + + + + + + + + ); @@ -617,28 +614,27 @@ const bookListFilters = [ const BookList = () => ( - - - - - - + + + + + + + + ); const AuthorList = () => ( - - - - - - + + + + + + + + ); diff --git a/packages/ra-ui-materialui/src/field/ReferenceManyField.stories.tsx b/packages/ra-ui-materialui/src/field/ReferenceManyField.stories.tsx index af67b19b2dc..9894d8e7104 100644 --- a/packages/ra-ui-materialui/src/field/ReferenceManyField.stories.tsx +++ b/packages/ra-ui-materialui/src/field/ReferenceManyField.stories.tsx @@ -16,9 +16,9 @@ import englishMessages from 'ra-language-english'; import { TextField } from '../field'; import { ReferenceManyField } from './ReferenceManyField'; -import { Datagrid } from '../list/datagrid/Datagrid'; import { BulkActionsToolbar, + DataTable, FilterButton, Pagination, SingleFieldList, @@ -116,9 +116,9 @@ const Wrapper = ({ export const Basic = () => ( - - - + + + ); @@ -140,9 +140,9 @@ export const WithFilter = () => ( - - - + + + ); @@ -156,9 +156,9 @@ export const WithMeta = () => ( meta: { foo: 'bar' }, }} > - - - + + + ); @@ -173,9 +173,9 @@ export const StoreKey = () => ( meta: { foo: 'bar' }, }} > - - - + + + ( }} storeKey="custom" > - - - + + + @@ -211,15 +211,15 @@ export const WithPagination = ({ pagination={} perPage={5} > - } > - - + + ); @@ -248,9 +248,9 @@ const AuthorEdit = () => ( pagination={} perPage={5} > - - - + + + diff --git a/packages/ra-ui-materialui/src/field/ReferenceOneField.stories.tsx b/packages/ra-ui-materialui/src/field/ReferenceOneField.stories.tsx index eb24c8ed8b0..13d58954ee6 100644 --- a/packages/ra-ui-materialui/src/field/ReferenceOneField.stories.tsx +++ b/packages/ra-ui-materialui/src/field/ReferenceOneField.stories.tsx @@ -30,7 +30,7 @@ import { Show, SimpleShowLayout, SimpleForm, - Datagrid, + DataTable, TextField, TextInput, } from '..'; @@ -161,20 +161,21 @@ export const EmptyText = () => ( name="books" list={() => ( - - - - - - - - - + + + + + + + + + + + )} show={() => ( @@ -202,14 +203,16 @@ export const EmptyText = () => ( name="book_details" list={() => ( - - - - - + + + + + + + )} create={() => ( @@ -339,17 +342,15 @@ const ListWrapper = ({ children }) => ( export const InDatagrid = () => ( - - - - - - - + + + + + + + + + ); diff --git a/packages/ra-ui-materialui/src/input/InputErrors.stories.tsx b/packages/ra-ui-materialui/src/input/InputErrors.stories.tsx index e2d38a095b9..0b66876c1d6 100644 --- a/packages/ra-ui-materialui/src/input/InputErrors.stories.tsx +++ b/packages/ra-ui-materialui/src/input/InputErrors.stories.tsx @@ -1,14 +1,12 @@ import * as React from 'react'; import { required } from 'ra-core'; import { useFormContext } from 'react-hook-form'; - import { TextInput } from './TextInput'; import { AdminContext } from '../AdminContext'; import { Create, Edit } from '../detail'; import { SimpleForm, TabbedForm, Toolbar } from '../form'; import { SaveButton } from '../button'; -import { Datagrid, List } from '../list'; -import { TextField } from '../field'; +import { DataTable, List } from '../list'; export default { title: 'ra-ui-materialui/input/InputErrors' }; @@ -315,10 +313,10 @@ export const FilterForm = () => ( } > - - - - + + + + ); diff --git a/packages/ra-ui-materialui/src/input/ReferenceInput.stories.tsx b/packages/ra-ui-materialui/src/input/ReferenceInput.stories.tsx index fda31da9ad9..d2537c5ba42 100644 --- a/packages/ra-ui-materialui/src/input/ReferenceInput.stories.tsx +++ b/packages/ra-ui-materialui/src/input/ReferenceInput.stories.tsx @@ -1,5 +1,5 @@ import * as React from 'react'; -import { Admin, Datagrid, List, TextField } from 'react-admin'; +import { Admin, DataTable, List } from 'react-admin'; import { QueryClient } from '@tanstack/react-query'; import { Resource, @@ -505,10 +505,10 @@ export const ErrorRadioButtonGroupInput = () => ( const AuthorList = () => ( - - - - + + + + ); diff --git a/packages/ra-ui-materialui/src/input/SearchInput.stories.tsx b/packages/ra-ui-materialui/src/input/SearchInput.stories.tsx index fc45cde036f..06aabf5fbda 100644 --- a/packages/ra-ui-materialui/src/input/SearchInput.stories.tsx +++ b/packages/ra-ui-materialui/src/input/SearchInput.stories.tsx @@ -4,11 +4,9 @@ import fakeRestDataProvider from 'ra-data-fakerest'; import polyglotI18nProvider from 'ra-i18n-polyglot'; import englishMessages from 'ra-language-english'; import frenchMessages from 'ra-language-french'; - import { AdminContext } from '../AdminContext'; import { AdminUI } from '../AdminUI'; -import { List, Datagrid } from '../list'; -import { TextField } from '../field'; +import { List, DataTable } from '../list'; import { SearchInput } from './SearchInput'; export default { title: 'ra-ui-materialui/input/SearchInput' }; @@ -111,12 +109,12 @@ const postFilters = []; const BookList = () => { return ( - - - - - - + + + + + + ); }; @@ -179,12 +177,12 @@ const RaceConditionBookList = () => { return ( - - - - - - + + + + + + ); }; @@ -204,12 +202,12 @@ const postFiltersReadOnly = []; const BookListReadOnly = () => { return ( - - - - - - + + + + + + ); }; diff --git a/packages/ra-ui-materialui/src/list/InfiniteList.stories.tsx b/packages/ra-ui-materialui/src/list/InfiniteList.stories.tsx index cb56af6510f..4b638d80e0e 100644 --- a/packages/ra-ui-materialui/src/list/InfiniteList.stories.tsx +++ b/packages/ra-ui-materialui/src/list/InfiniteList.stories.tsx @@ -9,17 +9,15 @@ import { TestMemoryRouter, } from 'ra-core'; import { Box, Button, Card, ThemeOptions, Typography } from '@mui/material'; - import { InfiniteList } from './InfiniteList'; import { SimpleList } from './SimpleList'; -import { Datagrid, type DatagridProps } from './datagrid'; +import { DataTable, type DataTableProps } from './datatable'; import { InfinitePagination, Pagination as DefaultPagination, } from './pagination'; import { AdminUI } from '../AdminUI'; import { AdminContext } from '../AdminContext'; -import { TextField } from '../field'; import { SearchInput } from '../input'; import { BulkDeleteButton, SelectAllButton, SortButton } from '../button'; import { TopToolbar, Layout } from '../layout'; @@ -208,11 +206,11 @@ export const PaginationLoadMore = () => ( name="books" list={() => ( }> - - - - - + + + + + )} /> @@ -249,11 +247,11 @@ export const PaginationCustom = () => ( name="books" list={() => ( }> - - - - - + + + + + )} /> @@ -283,11 +281,11 @@ export const PerPageSmall = () => ( name="books" list={() => ( - - - - - + + + + + )} /> @@ -352,18 +350,18 @@ export const WithFooter = () => ( export const WithDatagrid = ({ bulkActionsToolbar, }: { - bulkActionsToolbar?: DatagridProps['bulkActionsToolbar']; + bulkActionsToolbar?: DataTableProps['bulkActionsToolbar']; }) => ( ( - - - - - + + + + + )} /> diff --git a/packages/ra-ui-materialui/src/list/List.stories.tsx b/packages/ra-ui-materialui/src/list/List.stories.tsx index 90189f61f78..9650ef9bf08 100644 --- a/packages/ra-ui-materialui/src/list/List.stories.tsx +++ b/packages/ra-ui-materialui/src/list/List.stories.tsx @@ -16,12 +16,10 @@ import { Link as MuiLink, ThemeOptions, } from '@mui/material'; - import { List } from './List'; import { SimpleList } from './SimpleList'; import { ListActions } from './ListActions'; -import { Datagrid } from './datagrid'; -import { TextField } from '../field'; +import { DataTable } from './datatable'; import { SearchInput, TextInput } from '../input'; import { Route } from 'react-router'; import { Link } from 'react-router-dom'; @@ -463,12 +461,12 @@ export const Meta = () => ( name="books" list={() => ( - - - - - - + + + + + + )} /> @@ -491,7 +489,7 @@ export const Default = ({ name="books" list={() => ( ]}> - } > - - - - - + + + + + {children} )} @@ -536,12 +534,12 @@ const NewerBooks = () => ( storeKey="newerBooks" sort={{ field: 'year', order: 'DESC' }} > - - - - - - + + + + + + ); @@ -551,12 +549,12 @@ const OlderBooks = () => ( storeKey="olderBooks" sort={{ field: 'year', order: 'ASC' }} > - - - - - - + + + + + + ); @@ -601,12 +599,12 @@ const BooksWithStoreEnabled = () => ( storeKey="booksStore" sort={{ field: 'year', order: 'DESC' }} > - - - - - - + + + + + + ); @@ -616,12 +614,12 @@ const BooksWithStoreDisabled = () => ( storeKey={false} sort={{ field: 'year', order: 'ASC' }} > - - - - - - + + + + + + ); @@ -675,12 +673,12 @@ const BooksWithLocationDisabled = () => ( disableSyncWithLocation sort={{ field: 'year', order: 'ASC' }} > - - - - - - + + + + + + ); diff --git a/packages/ra-ui-materialui/src/list/filter/FilterButton.stories.tsx b/packages/ra-ui-materialui/src/list/filter/FilterButton.stories.tsx index eadd0374dc0..d8ece2c19ca 100644 --- a/packages/ra-ui-materialui/src/list/filter/FilterButton.stories.tsx +++ b/packages/ra-ui-materialui/src/list/filter/FilterButton.stories.tsx @@ -5,11 +5,10 @@ import { Admin, Resource, CreateButton, - Datagrid, + DataTable, FilterButton, FilterForm, Pagination, - TextField, TextInput, TopToolbar, SearchInput, @@ -177,11 +176,11 @@ const PostList = (props: { args={props.args} buttonProps={props.buttonProps} /> - - - - - + + + + + ); diff --git a/packages/ra-ui-materialui/src/list/filter/FilterList.stories.tsx b/packages/ra-ui-materialui/src/list/filter/FilterList.stories.tsx index eb1cb5ab7ca..047d5e093a1 100644 --- a/packages/ra-ui-materialui/src/list/filter/FilterList.stories.tsx +++ b/packages/ra-ui-materialui/src/list/filter/FilterList.stories.tsx @@ -12,14 +12,12 @@ import BiotechIcon from '@mui/icons-material/Biotech'; import NewspaperIcon from '@mui/icons-material/Newspaper'; import LocalOfferIcon from '@mui/icons-material/LocalOffer'; import HelpCenterIcon from '@mui/icons-material/HelpCenter'; - import { FilterList } from './FilterList'; import { FilterListItem } from './FilterListItem'; import { AdminContext } from '../../AdminContext'; import { AdminUI } from '../../AdminUI'; import { List } from '../List'; -import { Datagrid } from '../datagrid/Datagrid'; -import { TextField } from '../../field'; +import { DataTable } from '../datatable/DataTable'; export default { title: 'ra-ui-materialui/list/filter/FilterList' }; @@ -317,11 +315,11 @@ const BookListAside = () => ( const BookList = () => ( }> - - - - - + + + + + ); diff --git a/packages/ra-ui-materialui/src/list/filter/FilterLiveForm.stories.tsx b/packages/ra-ui-materialui/src/list/filter/FilterLiveForm.stories.tsx index 374789df534..cfc1fb9d02d 100644 --- a/packages/ra-ui-materialui/src/list/filter/FilterLiveForm.stories.tsx +++ b/packages/ra-ui-materialui/src/list/filter/FilterLiveForm.stories.tsx @@ -21,11 +21,11 @@ import { FilterListSection } from '.'; import { AdminContext } from '../../AdminContext'; import { AdminUI } from '../../AdminUI'; import { ExportButton } from '../../button'; -import { ReferenceField, TextField } from '../../field'; +import { ReferenceField } from '../../field'; import { AutocompleteInput, ReferenceInput, TextInput } from '../../input'; import { TopToolbar } from '../../layout'; import { List } from '../List'; -import { Datagrid } from '../datagrid/Datagrid'; +import { DataTable } from '../datatable/DataTable'; import { FilterList } from './FilterList'; import { FilterListItem } from './FilterListItem'; @@ -443,11 +443,13 @@ const BookListAside = () => ( const BookList = () => ( }> - - - - - + + + + + + + ); @@ -491,11 +493,13 @@ const ListActions = () => ( const BookListWithActions = () => ( }> - - - - - + + + + + + + ); diff --git a/packages/ra-ui-materialui/src/list/filter/FilterLiveSearch.stories.tsx b/packages/ra-ui-materialui/src/list/filter/FilterLiveSearch.stories.tsx index 3c8e1e4a7a7..1e92b20f27f 100644 --- a/packages/ra-ui-materialui/src/list/filter/FilterLiveSearch.stories.tsx +++ b/packages/ra-ui-materialui/src/list/filter/FilterLiveSearch.stories.tsx @@ -28,9 +28,8 @@ import { FilterButton } from './FilterButton'; import { FilterForm } from './FilterForm'; import { FilterLiveSearch } from './FilterLiveSearch'; import { - Datagrid, + DataTable, ListGuesser, - TextField, List as RaList, FilterList, FilterListItem, @@ -248,12 +247,12 @@ const BookListAside = () => ( const BookList = () => ( }> - - - - - - + + + + + + ); diff --git a/packages/ra-ui-materialui/src/list/filter/SavedQueriesList.stories.tsx b/packages/ra-ui-materialui/src/list/filter/SavedQueriesList.stories.tsx index 7dbcb6bb060..1e176030406 100644 --- a/packages/ra-ui-materialui/src/list/filter/SavedQueriesList.stories.tsx +++ b/packages/ra-ui-materialui/src/list/filter/SavedQueriesList.stories.tsx @@ -4,10 +4,8 @@ import merge from 'lodash/merge'; import { Admin, Resource, - Datagrid, + DataTable, List, - TextField, - NumberField, DateField, FilterList, FilterListItem, @@ -137,15 +135,17 @@ const Aside = () => ( const SongList = () => ( }> - - - - - - - - - + + + + + + + + + + + ); diff --git a/packages/react-admin/src/Resource.stories.tsx b/packages/react-admin/src/Resource.stories.tsx index 42998444244..7d74076c7e2 100644 --- a/packages/react-admin/src/Resource.stories.tsx +++ b/packages/react-admin/src/Resource.stories.tsx @@ -3,9 +3,8 @@ import { Route, Link, useParams } from 'react-router-dom'; import { Admin, Resource, - Datagrid, + DataTable, List, - TextField, EditGuesser, EditButton, useRecordContext, @@ -132,13 +131,15 @@ const BooksButton = () => { const AuthorList = () => ( - - - - - - - + + + + + + + + + ); @@ -146,11 +147,11 @@ const BookList = () => { const { authorId } = useParams(); return ( - - - - - + + + + + ); }; From b8c3b07af2e90082ddc66654acabb575cb02a14b Mon Sep 17 00:00:00 2001 From: Jean-Baptiste Kaiser Date: Wed, 25 Jun 2025 11:04:07 +0200 Subject: [PATCH 07/28] [no ci] fix Resource nested story appearance --- packages/react-admin/src/Resource.stories.tsx | 2 ++ 1 file changed, 2 insertions(+) diff --git a/packages/react-admin/src/Resource.stories.tsx b/packages/react-admin/src/Resource.stories.tsx index 7d74076c7e2..68f4bc2f876 100644 --- a/packages/react-admin/src/Resource.stories.tsx +++ b/packages/react-admin/src/Resource.stories.tsx @@ -137,6 +137,8 @@ const AuthorList = () => ( + + From a1b411acef2ff08c4d8f5ae24dc59349a532dd7f Mon Sep 17 00:00:00 2001 From: Gildas <1122076+djhi@users.noreply.github.com> Date: Wed, 25 Jun 2025 15:09:21 +0200 Subject: [PATCH 08/28] [Doc] Add a page for `` --- docs/Reference.md | 1 + docs/Scheduler.md | 531 +++++++++++++++++++++++++++++++++++++++++++ docs/navigation.html | 1 + 3 files changed, 533 insertions(+) create mode 100644 docs/Scheduler.md diff --git a/docs/Reference.md b/docs/Reference.md index 257c9460c1f..59d181b9cd4 100644 --- a/docs/Reference.md +++ b/docs/Reference.md @@ -174,6 +174,7 @@ title: "Index" * [``](./SaveButton.md) * [``](./SavedQueriesList.md) +* [``](./Scheduler.md)React Admin Enterprise Edition icon * [``](./Search.md)React Admin Enterprise Edition icon * [``](./SearchInput.md) * [``](./SearchWithResult.md)React Admin Enterprise Edition icon diff --git a/docs/Scheduler.md b/docs/Scheduler.md new file mode 100644 index 00000000000..ae56a3e9bb5 --- /dev/null +++ b/docs/Scheduler.md @@ -0,0 +1,531 @@ +--- +layout: default +title: "The Scheduler Component" +--- + +# `` + +This [Enterprise Edition](https://react-admin-ee.marmelab.com)React Admin Enterprise Edition icon component, part of [`ra-scheduler`](https://react-admin-ee.marmelab.com/documentation/ra-search), is a full-featured scheduler for managing tasks, assignments, events, scheduling constraints and dependencies, completion, recurring events, property booking, skill matrix, nested events, etc. + + + +It supports drag and drop, infinite scroll, zoom, custom layout and styling, collapsible columns, localization, grouping and filtering and export to pdf. + +This packages integrates react-admin with [Bryntum Scheduler](https://bryntum.com/products/scheduler/), a modern and high-performance scheduling UI component. As it leverages react-admin's data provider, it is backend agnostic. + +Test it live in the [Enterprise Edition Storybook](https://react-admin.github.io/ra-enterprise/?path=/story/ra-scheduler). + +## Usage + +`` is an all-in one component. Use it as the `list` prop of a react-admin [``](https://marmelab.com/react-admin/Resource.html): + +{% raw %} +```tsx +// in ./src/App.tsx +import { Admin, Resource } from 'react-admin'; +import { dataProvider } from './dataProvider'; +import { EventList } from './events/EventList'; + +export const MyAdmin = () => ( + + + +); + +// in ./src/events/EventList.tsx +import { Scheduler } from '@react-admin/ra-scheduler'; +import '@bryntum/core-thin/core.material.css'; +import '@bryntum/grid-thin/grid.material.css'; +import '@bryntum/scheduler-thin/scheduler.material.css'; +import { endOfDay, startOfDay } from 'date-fns'; + +export const EventList = () => ( + +); +``` +{% endraw %} + +`` renders a [Bryntum Scheduler](https://bryntum.com/products/scheduler/) and integrates it with the `dataProvider` and [`@react-admin/ra-form-layout` dialogs](https://react-admin-ee.marmelab.com/documentation/ra-form-layout#createdialog-editdialog--showdialog). + +It uses all the available horizontal and vertical space in the layout's content section. + +## Props + +In addition to the props accepted by [Bryntum Scheduler](https://www.bryntum.com/products/scheduler/docs/guide/Scheduler/quick-start/react/), `` accepts the following props: + +| Prop | Required | Type | Default | Description | +| ------------------- | -------- | --------- | ----------- | ----------------------------------------------------------------------------------------------------------------------- | +| `actions` | Optional | ReactNode | | A component displayed on top of the scheduler, usually to display a toolbar with action buttons | +| `converters` | Optional | object | | An object containing converters from dataProvider records to Bryntum models and vice-versa | +| `CreateDialogProps` | Optional | object | | Props to pass to the `` used to create new events | +| `EditDialogProps` | Optional | object | | Props to pass to the `` used to edit existing events | +| `eventCreate` | Optional | ReactNode | | The form used to create new events | +| `eventEdit` | Optional | ReactNode | | The form used to edit existing events | +| `eventName` | Optional | string | | The name of the resource for _Events_ | +| `mutationOptions` | Optional | object | | The mutation options sent when updating _Events_ via drag/drop or resize and _Resources_ via the inline editor | +| `resourcesName` | Optional | string | 'resources' | The name of the resource for _Resources_ | +| `queryOptions` | Optional | object | | The query options sent when fetching _Events_ and _Resources_ | +| `sx` | Optional | object | | The sx prop passed down to the wrapping `
` element | +| `title` | Optional | object | | The title to display in the `` | + +## `actions` + +A component displayed on top of the scheduler, usually to display a toolbar with action buttons. By default, it renders a toolbar with navigation buttons to go to the previous or next day. +You can provide your own actions by passing a component to the `actions` prop, for instance to use the provided navigation buttons for week or month navigation: + +{% raw %} +```tsx +// in ./src/events/EventList.tsx +import { Scheduler, SchedulerWeeksNavigationButtons } from '@react-admin/ra-scheduler'; +import '@bryntum/core-thin/core.material.css'; +import '@bryntum/grid-thin/grid.material.css'; +import '@bryntum/scheduler-thin/scheduler.material.css'; +import { startOfWeek } from 'date-fns'; + +const EventListActions = () => ( + + + +); + +export const EventList = () => ( + } + /> +); +``` +{% endraw %} + +## `converters` + +An object that contains function converting dataProvider records to Bryntum models and vice-versa: + +{% raw %} +```tsx +// in ./src/events/EventList.tsx +import { Scheduler } from '@react-admin/ra-scheduler'; +import '@bryntum/core-thin/core.material.css'; +import '@bryntum/grid-thin/grid.material.css'; +import '@bryntum/scheduler-thin/scheduler.material.css'; +import { startOfDay } from 'date-fns'; + +export const EventList = () => ( + ({ + id: record.id, + name: record.name, + resourceId: record.resource_id, + eventColor: record.color, + startDate: new Date(record.start_at), + endDate: new Date(record.end_at), + }); + toBryntumResource?: (record: RaRecord) => ({ + id: record.id, + name: record.name, + }), + toEvent?: (model: EventModel) => ({ + id: model.id, + name: model.name, + resource_id: model.resourceId, + start_at: model.startDate, + end_at: model.endDate, + color: record.eventColor, + }), + toResource?: (model: ResourceModel) => ({ + id: model.id, + name: model.name, + }), + }} + /> +); +``` +{% endraw %} + +## `CreateDialogProps` + +The props to pass to the [``](https://react-admin-ee.marmelab.com/documentation/ra-form-layout#createdialog-editdialog--showdialog) used to create new events: + +{% raw %} +```tsx +// in ./src/events/EventList.tsx +import { Scheduler } from '@react-admin/ra-scheduler'; +import '@bryntum/core-thin/core.material.css'; +import '@bryntum/grid-thin/grid.material.css'; +import '@bryntum/scheduler-thin/scheduler.material.css'; +import { startOfDay } from 'date-fns'; + +export const EventList = () => { + return ( + + ); +}; +``` +{% endraw %} + +## `EditDialogProps` + +The props to pass to the [``](https://react-admin-ee.marmelab.com/documentation/ra-form-layout#createdialog-editdialog--showdialog) used to create new events: + +{% raw %} +```tsx +// in ./src/events/EventList.tsx +import { Scheduler } from '@react-admin/ra-scheduler'; +import '@bryntum/core-thin/core.material.css'; +import '@bryntum/grid-thin/grid.material.css'; +import '@bryntum/scheduler-thin/scheduler.material.css'; +import { startOfDay } from 'date-fns'; + +export const EventList = () => { + return ( + + }} + /> + ); +}; + +const EventEditTitle = () => { + const record = useRecordContext(); + return record ? Edit {record?.name} : null; +}; +``` +{% endraw %} + +## `eventCreate` + +`` includes a default form for events creation and edition with the basic fields. You can provide a custom form component to create new events with the `eventCreate` prop: + +{% raw %} +```tsx +// in ./src/events/EventList.tsx +import { Scheduler } from '@react-admin/ra-scheduler'; +import '@bryntum/core-thin/core.material.css'; +import '@bryntum/grid-thin/grid.material.css'; +import '@bryntum/scheduler-thin/scheduler.material.css'; +import { startOfDay } from 'date-fns'; +import { + AutocompleteInput, + DateTimeInput, + ReferenceInput, + required, + SelectInput, + SimpleForm, + TextInput +} from 'react-admin'; + +export const EventList = () => ( + } + /> +); + +const CustomEventForm = () => ( + + + + + + + + + +); + +const colors = ['red', 'blue', 'green', 'yellow', 'purple']; +``` +{% endraw %} + +## `eventEdit` + +`` includes a default form for events creation and edition with the basic fields. You can provide a custom form component to edit existing events with the `eventEdit` prop: + +{% raw %} +```tsx +// in ./src/events/EventList.tsx +import { Scheduler } from '@react-admin/ra-scheduler'; +import '@bryntum/core-thin/core.material.css'; +import '@bryntum/grid-thin/grid.material.css'; +import '@bryntum/scheduler-thin/scheduler.material.css'; +import { startOfDay } from 'date-fns'; +import { + AutocompleteInput, + DateTimeInput, + ReferenceInput, + required, + SelectInput, + SimpleForm, + TextInput +} from 'react-admin'; + +export const EventList = () => ( + } + /> +); + +const CustomEventForm = () => ( + + + + + + + + + +); + +const colors = ['red', 'blue', 'green', 'yellow', 'purple']; +``` +{% endraw %} + + +## `mutationOptions` + +[Bryntum Scheduler](https://bryntum.com/products/scheduler/) allows users to modify events by resizing or drag/dropping them and resources by double clicking them. If you need to pass additional data for those updates, use the `mutationOptions` prop: + +{% raw %} +```tsx +// in ./src/events/EventList.tsx +import { Scheduler } from '@react-admin/ra-scheduler'; +import '@bryntum/core-thin/core.material.css'; +import '@bryntum/grid-thin/grid.material.css'; +import '@bryntum/scheduler-thin/scheduler.material.css'; +import { startOfDay } from 'date-fns'; + +export const EventList = () => ( + +); +``` +{% endraw %} + +## `resources` + +By default, `` uses: +- the resource from the current `ResourceContext` or "events" if no `ResourceContext` is available (for instance in a dashboard) as the default resource name for the scheduler _Events_ +- "resources" as the default resource name for the scheduler _Resources_ + +If you want to use another name, set the `resources` prop: + +{% raw %} +```tsx +// in ./src/events/EventList.tsx +import { Scheduler } from '@react-admin/ra-scheduler'; +import '@bryntum/core-thin/core.material.css'; +import '@bryntum/grid-thin/grid.material.css'; +import '@bryntum/scheduler-thin/scheduler.material.css'; +import { startOfDay } from 'date-fns'; + +export const EventList = () => ( + +); +``` +{% endraw %} + +## `queryOptions` + +The query options when fetching _Events_ or _Resources_: + +{% raw %} +```tsx +// in ./src/events/EventList.tsx +import { Scheduler } from '@react-admin/ra-scheduler'; +import '@bryntum/core-thin/core.material.css'; +import '@bryntum/grid-thin/grid.material.css'; +import '@bryntum/scheduler-thin/scheduler.material.css'; +import { startOfDay } from 'date-fns'; + +export const EventList = () => ( + +); +``` +{% endraw %} + +## `sx` + +The `sx` prop passed down to the wrapping `
` element: + +{% raw %} +```tsx +// in ./src/events/EventList.tsx +import { Scheduler } from '@react-admin/ra-scheduler'; +import '@bryntum/core-thin/core.material.css'; +import '@bryntum/grid-thin/grid.material.css'; +import '@bryntum/scheduler-thin/scheduler.material.css'; +import { startOfDay } from 'date-fns'; + +export const EventList = () => ( + +); +``` +{% endraw %} + +## `title` + +The title to display in the ``: + +{% raw %} +```tsx +// in ./src/events/EventList.tsx +import { Scheduler } from '@react-admin/ra-scheduler'; +import '@bryntum/core-thin/core.material.css'; +import '@bryntum/grid-thin/grid.material.css'; +import '@bryntum/scheduler-thin/scheduler.material.css'; +import { startOfDay } from 'date-fns'; + +export const EventList = () => ( + +); +``` +{% endraw %} + +## `` + +A component that display navigation button to move through days in a `` that displays data day by day. + +{% raw %} +```tsx +// in ./src/events/EventList.tsx +import { Scheduler, SchedulerDaysNavigationButtons } from '@react-admin/ra-scheduler'; +import '@bryntum/core-thin/core.material.css'; +import '@bryntum/grid-thin/grid.material.css'; +import '@bryntum/scheduler-thin/scheduler.material.css'; +import { startOfDay } from 'date-fns'; + +const EventListActions = () => ( + + + +); + +export const EventList = () => ( + } + /> +); +``` +{% endraw %} + +## `` + +A component that display navigation button to move through weeks in a `` that displays data week by week. + +{% raw %} +```tsx +// in ./src/events/EventList.tsx +import { Scheduler, SchedulerWeeksNavigationButtons } from '@react-admin/ra-scheduler'; +import '@bryntum/core-thin/core.material.css'; +import '@bryntum/grid-thin/grid.material.css'; +import '@bryntum/scheduler-thin/scheduler.material.css'; +import { startOfWeek } from 'date-fns'; + +const EventListActions = () => ( + + + +); + +export const EventList = () => ( + } + /> +); +``` +{% endraw %} + +## `` + +A component that display navigation button to move through months in a `` that displays data month by month. + +{% raw %} +```tsx +// in ./src/events/EventList.tsx +import { Scheduler, SchedulerMonthsNavigationButtons } from '@react-admin/ra-scheduler'; +import '@bryntum/core-thin/core.material.css'; +import '@bryntum/grid-thin/grid.material.css'; +import '@bryntum/scheduler-thin/scheduler.material.css'; +import { startOfMonth } from 'date-fns'; + +const EventListActions = () => ( + + + +); + +export const EventList = () => ( + } + /> +); +``` +{% endraw %} diff --git a/docs/navigation.html b/docs/navigation.html index ef1c887f5d0..0bff2e6b209 100644 --- a/docs/navigation.html +++ b/docs/navigation.html @@ -96,6 +96,7 @@
  • <SingleFieldList>
  • <EditableDatagrid>
  • <Calendar>
  • +
  • <Scheduler>
  • <FilterButton>
  • <FilterList>
  • <FilterLiveForm>
  • From cc927dd3f6e0770694f49915b9f4396e0453a606 Mon Sep 17 00:00:00 2001 From: Gildas <1122076+djhi@users.noreply.github.com> Date: Wed, 25 Jun 2025 15:11:40 +0200 Subject: [PATCH 09/28] Revert documentation update for `` --- docs/Reference.md | 1 - docs/Scheduler.md | 531 ------------------------------------------- docs/navigation.html | 1 - 3 files changed, 533 deletions(-) delete mode 100644 docs/Scheduler.md diff --git a/docs/Reference.md b/docs/Reference.md index 59d181b9cd4..257c9460c1f 100644 --- a/docs/Reference.md +++ b/docs/Reference.md @@ -174,7 +174,6 @@ title: "Index" * [``](./SaveButton.md) * [``](./SavedQueriesList.md) -* [``](./Scheduler.md)React Admin Enterprise Edition icon * [``](./Search.md)React Admin Enterprise Edition icon * [``](./SearchInput.md) * [``](./SearchWithResult.md)React Admin Enterprise Edition icon diff --git a/docs/Scheduler.md b/docs/Scheduler.md deleted file mode 100644 index ae56a3e9bb5..00000000000 --- a/docs/Scheduler.md +++ /dev/null @@ -1,531 +0,0 @@ ---- -layout: default -title: "The Scheduler Component" ---- - -# `` - -This [Enterprise Edition](https://react-admin-ee.marmelab.com)React Admin Enterprise Edition icon component, part of [`ra-scheduler`](https://react-admin-ee.marmelab.com/documentation/ra-search), is a full-featured scheduler for managing tasks, assignments, events, scheduling constraints and dependencies, completion, recurring events, property booking, skill matrix, nested events, etc. - - - -It supports drag and drop, infinite scroll, zoom, custom layout and styling, collapsible columns, localization, grouping and filtering and export to pdf. - -This packages integrates react-admin with [Bryntum Scheduler](https://bryntum.com/products/scheduler/), a modern and high-performance scheduling UI component. As it leverages react-admin's data provider, it is backend agnostic. - -Test it live in the [Enterprise Edition Storybook](https://react-admin.github.io/ra-enterprise/?path=/story/ra-scheduler). - -## Usage - -`` is an all-in one component. Use it as the `list` prop of a react-admin [``](https://marmelab.com/react-admin/Resource.html): - -{% raw %} -```tsx -// in ./src/App.tsx -import { Admin, Resource } from 'react-admin'; -import { dataProvider } from './dataProvider'; -import { EventList } from './events/EventList'; - -export const MyAdmin = () => ( - - - -); - -// in ./src/events/EventList.tsx -import { Scheduler } from '@react-admin/ra-scheduler'; -import '@bryntum/core-thin/core.material.css'; -import '@bryntum/grid-thin/grid.material.css'; -import '@bryntum/scheduler-thin/scheduler.material.css'; -import { endOfDay, startOfDay } from 'date-fns'; - -export const EventList = () => ( - -); -``` -{% endraw %} - -`` renders a [Bryntum Scheduler](https://bryntum.com/products/scheduler/) and integrates it with the `dataProvider` and [`@react-admin/ra-form-layout` dialogs](https://react-admin-ee.marmelab.com/documentation/ra-form-layout#createdialog-editdialog--showdialog). - -It uses all the available horizontal and vertical space in the layout's content section. - -## Props - -In addition to the props accepted by [Bryntum Scheduler](https://www.bryntum.com/products/scheduler/docs/guide/Scheduler/quick-start/react/), `` accepts the following props: - -| Prop | Required | Type | Default | Description | -| ------------------- | -------- | --------- | ----------- | ----------------------------------------------------------------------------------------------------------------------- | -| `actions` | Optional | ReactNode | | A component displayed on top of the scheduler, usually to display a toolbar with action buttons | -| `converters` | Optional | object | | An object containing converters from dataProvider records to Bryntum models and vice-versa | -| `CreateDialogProps` | Optional | object | | Props to pass to the `` used to create new events | -| `EditDialogProps` | Optional | object | | Props to pass to the `` used to edit existing events | -| `eventCreate` | Optional | ReactNode | | The form used to create new events | -| `eventEdit` | Optional | ReactNode | | The form used to edit existing events | -| `eventName` | Optional | string | | The name of the resource for _Events_ | -| `mutationOptions` | Optional | object | | The mutation options sent when updating _Events_ via drag/drop or resize and _Resources_ via the inline editor | -| `resourcesName` | Optional | string | 'resources' | The name of the resource for _Resources_ | -| `queryOptions` | Optional | object | | The query options sent when fetching _Events_ and _Resources_ | -| `sx` | Optional | object | | The sx prop passed down to the wrapping `
    ` element | -| `title` | Optional | object | | The title to display in the `` | - -## `actions` - -A component displayed on top of the scheduler, usually to display a toolbar with action buttons. By default, it renders a toolbar with navigation buttons to go to the previous or next day. -You can provide your own actions by passing a component to the `actions` prop, for instance to use the provided navigation buttons for week or month navigation: - -{% raw %} -```tsx -// in ./src/events/EventList.tsx -import { Scheduler, SchedulerWeeksNavigationButtons } from '@react-admin/ra-scheduler'; -import '@bryntum/core-thin/core.material.css'; -import '@bryntum/grid-thin/grid.material.css'; -import '@bryntum/scheduler-thin/scheduler.material.css'; -import { startOfWeek } from 'date-fns'; - -const EventListActions = () => ( - - - -); - -export const EventList = () => ( - } - /> -); -``` -{% endraw %} - -## `converters` - -An object that contains function converting dataProvider records to Bryntum models and vice-versa: - -{% raw %} -```tsx -// in ./src/events/EventList.tsx -import { Scheduler } from '@react-admin/ra-scheduler'; -import '@bryntum/core-thin/core.material.css'; -import '@bryntum/grid-thin/grid.material.css'; -import '@bryntum/scheduler-thin/scheduler.material.css'; -import { startOfDay } from 'date-fns'; - -export const EventList = () => ( - ({ - id: record.id, - name: record.name, - resourceId: record.resource_id, - eventColor: record.color, - startDate: new Date(record.start_at), - endDate: new Date(record.end_at), - }); - toBryntumResource?: (record: RaRecord) => ({ - id: record.id, - name: record.name, - }), - toEvent?: (model: EventModel) => ({ - id: model.id, - name: model.name, - resource_id: model.resourceId, - start_at: model.startDate, - end_at: model.endDate, - color: record.eventColor, - }), - toResource?: (model: ResourceModel) => ({ - id: model.id, - name: model.name, - }), - }} - /> -); -``` -{% endraw %} - -## `CreateDialogProps` - -The props to pass to the [``](https://react-admin-ee.marmelab.com/documentation/ra-form-layout#createdialog-editdialog--showdialog) used to create new events: - -{% raw %} -```tsx -// in ./src/events/EventList.tsx -import { Scheduler } from '@react-admin/ra-scheduler'; -import '@bryntum/core-thin/core.material.css'; -import '@bryntum/grid-thin/grid.material.css'; -import '@bryntum/scheduler-thin/scheduler.material.css'; -import { startOfDay } from 'date-fns'; - -export const EventList = () => { - return ( - - ); -}; -``` -{% endraw %} - -## `EditDialogProps` - -The props to pass to the [``](https://react-admin-ee.marmelab.com/documentation/ra-form-layout#createdialog-editdialog--showdialog) used to create new events: - -{% raw %} -```tsx -// in ./src/events/EventList.tsx -import { Scheduler } from '@react-admin/ra-scheduler'; -import '@bryntum/core-thin/core.material.css'; -import '@bryntum/grid-thin/grid.material.css'; -import '@bryntum/scheduler-thin/scheduler.material.css'; -import { startOfDay } from 'date-fns'; - -export const EventList = () => { - return ( - - }} - /> - ); -}; - -const EventEditTitle = () => { - const record = useRecordContext(); - return record ? Edit {record?.name} : null; -}; -``` -{% endraw %} - -## `eventCreate` - -`` includes a default form for events creation and edition with the basic fields. You can provide a custom form component to create new events with the `eventCreate` prop: - -{% raw %} -```tsx -// in ./src/events/EventList.tsx -import { Scheduler } from '@react-admin/ra-scheduler'; -import '@bryntum/core-thin/core.material.css'; -import '@bryntum/grid-thin/grid.material.css'; -import '@bryntum/scheduler-thin/scheduler.material.css'; -import { startOfDay } from 'date-fns'; -import { - AutocompleteInput, - DateTimeInput, - ReferenceInput, - required, - SelectInput, - SimpleForm, - TextInput -} from 'react-admin'; - -export const EventList = () => ( - } - /> -); - -const CustomEventForm = () => ( - - - - - - - - - -); - -const colors = ['red', 'blue', 'green', 'yellow', 'purple']; -``` -{% endraw %} - -## `eventEdit` - -`` includes a default form for events creation and edition with the basic fields. You can provide a custom form component to edit existing events with the `eventEdit` prop: - -{% raw %} -```tsx -// in ./src/events/EventList.tsx -import { Scheduler } from '@react-admin/ra-scheduler'; -import '@bryntum/core-thin/core.material.css'; -import '@bryntum/grid-thin/grid.material.css'; -import '@bryntum/scheduler-thin/scheduler.material.css'; -import { startOfDay } from 'date-fns'; -import { - AutocompleteInput, - DateTimeInput, - ReferenceInput, - required, - SelectInput, - SimpleForm, - TextInput -} from 'react-admin'; - -export const EventList = () => ( - } - /> -); - -const CustomEventForm = () => ( - - - - - - - - - -); - -const colors = ['red', 'blue', 'green', 'yellow', 'purple']; -``` -{% endraw %} - - -## `mutationOptions` - -[Bryntum Scheduler](https://bryntum.com/products/scheduler/) allows users to modify events by resizing or drag/dropping them and resources by double clicking them. If you need to pass additional data for those updates, use the `mutationOptions` prop: - -{% raw %} -```tsx -// in ./src/events/EventList.tsx -import { Scheduler } from '@react-admin/ra-scheduler'; -import '@bryntum/core-thin/core.material.css'; -import '@bryntum/grid-thin/grid.material.css'; -import '@bryntum/scheduler-thin/scheduler.material.css'; -import { startOfDay } from 'date-fns'; - -export const EventList = () => ( - -); -``` -{% endraw %} - -## `resources` - -By default, `` uses: -- the resource from the current `ResourceContext` or "events" if no `ResourceContext` is available (for instance in a dashboard) as the default resource name for the scheduler _Events_ -- "resources" as the default resource name for the scheduler _Resources_ - -If you want to use another name, set the `resources` prop: - -{% raw %} -```tsx -// in ./src/events/EventList.tsx -import { Scheduler } from '@react-admin/ra-scheduler'; -import '@bryntum/core-thin/core.material.css'; -import '@bryntum/grid-thin/grid.material.css'; -import '@bryntum/scheduler-thin/scheduler.material.css'; -import { startOfDay } from 'date-fns'; - -export const EventList = () => ( - -); -``` -{% endraw %} - -## `queryOptions` - -The query options when fetching _Events_ or _Resources_: - -{% raw %} -```tsx -// in ./src/events/EventList.tsx -import { Scheduler } from '@react-admin/ra-scheduler'; -import '@bryntum/core-thin/core.material.css'; -import '@bryntum/grid-thin/grid.material.css'; -import '@bryntum/scheduler-thin/scheduler.material.css'; -import { startOfDay } from 'date-fns'; - -export const EventList = () => ( - -); -``` -{% endraw %} - -## `sx` - -The `sx` prop passed down to the wrapping `
    ` element: - -{% raw %} -```tsx -// in ./src/events/EventList.tsx -import { Scheduler } from '@react-admin/ra-scheduler'; -import '@bryntum/core-thin/core.material.css'; -import '@bryntum/grid-thin/grid.material.css'; -import '@bryntum/scheduler-thin/scheduler.material.css'; -import { startOfDay } from 'date-fns'; - -export const EventList = () => ( - -); -``` -{% endraw %} - -## `title` - -The title to display in the ``: - -{% raw %} -```tsx -// in ./src/events/EventList.tsx -import { Scheduler } from '@react-admin/ra-scheduler'; -import '@bryntum/core-thin/core.material.css'; -import '@bryntum/grid-thin/grid.material.css'; -import '@bryntum/scheduler-thin/scheduler.material.css'; -import { startOfDay } from 'date-fns'; - -export const EventList = () => ( - -); -``` -{% endraw %} - -## `` - -A component that display navigation button to move through days in a `` that displays data day by day. - -{% raw %} -```tsx -// in ./src/events/EventList.tsx -import { Scheduler, SchedulerDaysNavigationButtons } from '@react-admin/ra-scheduler'; -import '@bryntum/core-thin/core.material.css'; -import '@bryntum/grid-thin/grid.material.css'; -import '@bryntum/scheduler-thin/scheduler.material.css'; -import { startOfDay } from 'date-fns'; - -const EventListActions = () => ( - - - -); - -export const EventList = () => ( - } - /> -); -``` -{% endraw %} - -## `` - -A component that display navigation button to move through weeks in a `` that displays data week by week. - -{% raw %} -```tsx -// in ./src/events/EventList.tsx -import { Scheduler, SchedulerWeeksNavigationButtons } from '@react-admin/ra-scheduler'; -import '@bryntum/core-thin/core.material.css'; -import '@bryntum/grid-thin/grid.material.css'; -import '@bryntum/scheduler-thin/scheduler.material.css'; -import { startOfWeek } from 'date-fns'; - -const EventListActions = () => ( - - - -); - -export const EventList = () => ( - } - /> -); -``` -{% endraw %} - -## `` - -A component that display navigation button to move through months in a `` that displays data month by month. - -{% raw %} -```tsx -// in ./src/events/EventList.tsx -import { Scheduler, SchedulerMonthsNavigationButtons } from '@react-admin/ra-scheduler'; -import '@bryntum/core-thin/core.material.css'; -import '@bryntum/grid-thin/grid.material.css'; -import '@bryntum/scheduler-thin/scheduler.material.css'; -import { startOfMonth } from 'date-fns'; - -const EventListActions = () => ( - - - -); - -export const EventList = () => ( - } - /> -); -``` -{% endraw %} diff --git a/docs/navigation.html b/docs/navigation.html index 0bff2e6b209..ef1c887f5d0 100644 --- a/docs/navigation.html +++ b/docs/navigation.html @@ -96,7 +96,6 @@
  • <SingleFieldList>
  • <EditableDatagrid>
  • <Calendar>
  • -
  • <Scheduler>
  • <FilterButton>
  • <FilterList>
  • <FilterLiveForm>
  • From f32876126158ec56e828d0c488204e858da61421 Mon Sep 17 00:00:00 2001 From: Gildas <1122076+djhi@users.noreply.github.com> Date: Wed, 25 Jun 2025 15:12:39 +0200 Subject: [PATCH 10/28] [Doc] Add a page for `` --- docs/Reference.md | 1 + docs/Scheduler.md | 531 +++++++++++++++++++++++++++++++++++++++++++ docs/navigation.html | 1 + 3 files changed, 533 insertions(+) create mode 100644 docs/Scheduler.md diff --git a/docs/Reference.md b/docs/Reference.md index 257c9460c1f..59d181b9cd4 100644 --- a/docs/Reference.md +++ b/docs/Reference.md @@ -174,6 +174,7 @@ title: "Index" * [``](./SaveButton.md) * [``](./SavedQueriesList.md) +* [``](./Scheduler.md)React Admin Enterprise Edition icon * [``](./Search.md)React Admin Enterprise Edition icon * [``](./SearchInput.md) * [``](./SearchWithResult.md)React Admin Enterprise Edition icon diff --git a/docs/Scheduler.md b/docs/Scheduler.md new file mode 100644 index 00000000000..ae56a3e9bb5 --- /dev/null +++ b/docs/Scheduler.md @@ -0,0 +1,531 @@ +--- +layout: default +title: "The Scheduler Component" +--- + +# `` + +This [Enterprise Edition](https://react-admin-ee.marmelab.com)React Admin Enterprise Edition icon component, part of [`ra-scheduler`](https://react-admin-ee.marmelab.com/documentation/ra-search), is a full-featured scheduler for managing tasks, assignments, events, scheduling constraints and dependencies, completion, recurring events, property booking, skill matrix, nested events, etc. + + + +It supports drag and drop, infinite scroll, zoom, custom layout and styling, collapsible columns, localization, grouping and filtering and export to pdf. + +This packages integrates react-admin with [Bryntum Scheduler](https://bryntum.com/products/scheduler/), a modern and high-performance scheduling UI component. As it leverages react-admin's data provider, it is backend agnostic. + +Test it live in the [Enterprise Edition Storybook](https://react-admin.github.io/ra-enterprise/?path=/story/ra-scheduler). + +## Usage + +`` is an all-in one component. Use it as the `list` prop of a react-admin [``](https://marmelab.com/react-admin/Resource.html): + +{% raw %} +```tsx +// in ./src/App.tsx +import { Admin, Resource } from 'react-admin'; +import { dataProvider } from './dataProvider'; +import { EventList } from './events/EventList'; + +export const MyAdmin = () => ( + + + +); + +// in ./src/events/EventList.tsx +import { Scheduler } from '@react-admin/ra-scheduler'; +import '@bryntum/core-thin/core.material.css'; +import '@bryntum/grid-thin/grid.material.css'; +import '@bryntum/scheduler-thin/scheduler.material.css'; +import { endOfDay, startOfDay } from 'date-fns'; + +export const EventList = () => ( + +); +``` +{% endraw %} + +`` renders a [Bryntum Scheduler](https://bryntum.com/products/scheduler/) and integrates it with the `dataProvider` and [`@react-admin/ra-form-layout` dialogs](https://react-admin-ee.marmelab.com/documentation/ra-form-layout#createdialog-editdialog--showdialog). + +It uses all the available horizontal and vertical space in the layout's content section. + +## Props + +In addition to the props accepted by [Bryntum Scheduler](https://www.bryntum.com/products/scheduler/docs/guide/Scheduler/quick-start/react/), `` accepts the following props: + +| Prop | Required | Type | Default | Description | +| ------------------- | -------- | --------- | ----------- | ----------------------------------------------------------------------------------------------------------------------- | +| `actions` | Optional | ReactNode | | A component displayed on top of the scheduler, usually to display a toolbar with action buttons | +| `converters` | Optional | object | | An object containing converters from dataProvider records to Bryntum models and vice-versa | +| `CreateDialogProps` | Optional | object | | Props to pass to the `` used to create new events | +| `EditDialogProps` | Optional | object | | Props to pass to the `` used to edit existing events | +| `eventCreate` | Optional | ReactNode | | The form used to create new events | +| `eventEdit` | Optional | ReactNode | | The form used to edit existing events | +| `eventName` | Optional | string | | The name of the resource for _Events_ | +| `mutationOptions` | Optional | object | | The mutation options sent when updating _Events_ via drag/drop or resize and _Resources_ via the inline editor | +| `resourcesName` | Optional | string | 'resources' | The name of the resource for _Resources_ | +| `queryOptions` | Optional | object | | The query options sent when fetching _Events_ and _Resources_ | +| `sx` | Optional | object | | The sx prop passed down to the wrapping `
    ` element | +| `title` | Optional | object | | The title to display in the `` | + +## `actions` + +A component displayed on top of the scheduler, usually to display a toolbar with action buttons. By default, it renders a toolbar with navigation buttons to go to the previous or next day. +You can provide your own actions by passing a component to the `actions` prop, for instance to use the provided navigation buttons for week or month navigation: + +{% raw %} +```tsx +// in ./src/events/EventList.tsx +import { Scheduler, SchedulerWeeksNavigationButtons } from '@react-admin/ra-scheduler'; +import '@bryntum/core-thin/core.material.css'; +import '@bryntum/grid-thin/grid.material.css'; +import '@bryntum/scheduler-thin/scheduler.material.css'; +import { startOfWeek } from 'date-fns'; + +const EventListActions = () => ( + + + +); + +export const EventList = () => ( + } + /> +); +``` +{% endraw %} + +## `converters` + +An object that contains function converting dataProvider records to Bryntum models and vice-versa: + +{% raw %} +```tsx +// in ./src/events/EventList.tsx +import { Scheduler } from '@react-admin/ra-scheduler'; +import '@bryntum/core-thin/core.material.css'; +import '@bryntum/grid-thin/grid.material.css'; +import '@bryntum/scheduler-thin/scheduler.material.css'; +import { startOfDay } from 'date-fns'; + +export const EventList = () => ( + ({ + id: record.id, + name: record.name, + resourceId: record.resource_id, + eventColor: record.color, + startDate: new Date(record.start_at), + endDate: new Date(record.end_at), + }); + toBryntumResource?: (record: RaRecord) => ({ + id: record.id, + name: record.name, + }), + toEvent?: (model: EventModel) => ({ + id: model.id, + name: model.name, + resource_id: model.resourceId, + start_at: model.startDate, + end_at: model.endDate, + color: record.eventColor, + }), + toResource?: (model: ResourceModel) => ({ + id: model.id, + name: model.name, + }), + }} + /> +); +``` +{% endraw %} + +## `CreateDialogProps` + +The props to pass to the [``](https://react-admin-ee.marmelab.com/documentation/ra-form-layout#createdialog-editdialog--showdialog) used to create new events: + +{% raw %} +```tsx +// in ./src/events/EventList.tsx +import { Scheduler } from '@react-admin/ra-scheduler'; +import '@bryntum/core-thin/core.material.css'; +import '@bryntum/grid-thin/grid.material.css'; +import '@bryntum/scheduler-thin/scheduler.material.css'; +import { startOfDay } from 'date-fns'; + +export const EventList = () => { + return ( + + ); +}; +``` +{% endraw %} + +## `EditDialogProps` + +The props to pass to the [``](https://react-admin-ee.marmelab.com/documentation/ra-form-layout#createdialog-editdialog--showdialog) used to create new events: + +{% raw %} +```tsx +// in ./src/events/EventList.tsx +import { Scheduler } from '@react-admin/ra-scheduler'; +import '@bryntum/core-thin/core.material.css'; +import '@bryntum/grid-thin/grid.material.css'; +import '@bryntum/scheduler-thin/scheduler.material.css'; +import { startOfDay } from 'date-fns'; + +export const EventList = () => { + return ( + + }} + /> + ); +}; + +const EventEditTitle = () => { + const record = useRecordContext(); + return record ? Edit {record?.name} : null; +}; +``` +{% endraw %} + +## `eventCreate` + +`` includes a default form for events creation and edition with the basic fields. You can provide a custom form component to create new events with the `eventCreate` prop: + +{% raw %} +```tsx +// in ./src/events/EventList.tsx +import { Scheduler } from '@react-admin/ra-scheduler'; +import '@bryntum/core-thin/core.material.css'; +import '@bryntum/grid-thin/grid.material.css'; +import '@bryntum/scheduler-thin/scheduler.material.css'; +import { startOfDay } from 'date-fns'; +import { + AutocompleteInput, + DateTimeInput, + ReferenceInput, + required, + SelectInput, + SimpleForm, + TextInput +} from 'react-admin'; + +export const EventList = () => ( + } + /> +); + +const CustomEventForm = () => ( + + + + + + + + + +); + +const colors = ['red', 'blue', 'green', 'yellow', 'purple']; +``` +{% endraw %} + +## `eventEdit` + +`` includes a default form for events creation and edition with the basic fields. You can provide a custom form component to edit existing events with the `eventEdit` prop: + +{% raw %} +```tsx +// in ./src/events/EventList.tsx +import { Scheduler } from '@react-admin/ra-scheduler'; +import '@bryntum/core-thin/core.material.css'; +import '@bryntum/grid-thin/grid.material.css'; +import '@bryntum/scheduler-thin/scheduler.material.css'; +import { startOfDay } from 'date-fns'; +import { + AutocompleteInput, + DateTimeInput, + ReferenceInput, + required, + SelectInput, + SimpleForm, + TextInput +} from 'react-admin'; + +export const EventList = () => ( + } + /> +); + +const CustomEventForm = () => ( + + + + + + + + + +); + +const colors = ['red', 'blue', 'green', 'yellow', 'purple']; +``` +{% endraw %} + + +## `mutationOptions` + +[Bryntum Scheduler](https://bryntum.com/products/scheduler/) allows users to modify events by resizing or drag/dropping them and resources by double clicking them. If you need to pass additional data for those updates, use the `mutationOptions` prop: + +{% raw %} +```tsx +// in ./src/events/EventList.tsx +import { Scheduler } from '@react-admin/ra-scheduler'; +import '@bryntum/core-thin/core.material.css'; +import '@bryntum/grid-thin/grid.material.css'; +import '@bryntum/scheduler-thin/scheduler.material.css'; +import { startOfDay } from 'date-fns'; + +export const EventList = () => ( + +); +``` +{% endraw %} + +## `resources` + +By default, `` uses: +- the resource from the current `ResourceContext` or "events" if no `ResourceContext` is available (for instance in a dashboard) as the default resource name for the scheduler _Events_ +- "resources" as the default resource name for the scheduler _Resources_ + +If you want to use another name, set the `resources` prop: + +{% raw %} +```tsx +// in ./src/events/EventList.tsx +import { Scheduler } from '@react-admin/ra-scheduler'; +import '@bryntum/core-thin/core.material.css'; +import '@bryntum/grid-thin/grid.material.css'; +import '@bryntum/scheduler-thin/scheduler.material.css'; +import { startOfDay } from 'date-fns'; + +export const EventList = () => ( + +); +``` +{% endraw %} + +## `queryOptions` + +The query options when fetching _Events_ or _Resources_: + +{% raw %} +```tsx +// in ./src/events/EventList.tsx +import { Scheduler } from '@react-admin/ra-scheduler'; +import '@bryntum/core-thin/core.material.css'; +import '@bryntum/grid-thin/grid.material.css'; +import '@bryntum/scheduler-thin/scheduler.material.css'; +import { startOfDay } from 'date-fns'; + +export const EventList = () => ( + +); +``` +{% endraw %} + +## `sx` + +The `sx` prop passed down to the wrapping `
    ` element: + +{% raw %} +```tsx +// in ./src/events/EventList.tsx +import { Scheduler } from '@react-admin/ra-scheduler'; +import '@bryntum/core-thin/core.material.css'; +import '@bryntum/grid-thin/grid.material.css'; +import '@bryntum/scheduler-thin/scheduler.material.css'; +import { startOfDay } from 'date-fns'; + +export const EventList = () => ( + +); +``` +{% endraw %} + +## `title` + +The title to display in the ``: + +{% raw %} +```tsx +// in ./src/events/EventList.tsx +import { Scheduler } from '@react-admin/ra-scheduler'; +import '@bryntum/core-thin/core.material.css'; +import '@bryntum/grid-thin/grid.material.css'; +import '@bryntum/scheduler-thin/scheduler.material.css'; +import { startOfDay } from 'date-fns'; + +export const EventList = () => ( + +); +``` +{% endraw %} + +## `` + +A component that display navigation button to move through days in a `` that displays data day by day. + +{% raw %} +```tsx +// in ./src/events/EventList.tsx +import { Scheduler, SchedulerDaysNavigationButtons } from '@react-admin/ra-scheduler'; +import '@bryntum/core-thin/core.material.css'; +import '@bryntum/grid-thin/grid.material.css'; +import '@bryntum/scheduler-thin/scheduler.material.css'; +import { startOfDay } from 'date-fns'; + +const EventListActions = () => ( + + + +); + +export const EventList = () => ( + } + /> +); +``` +{% endraw %} + +## `` + +A component that display navigation button to move through weeks in a `` that displays data week by week. + +{% raw %} +```tsx +// in ./src/events/EventList.tsx +import { Scheduler, SchedulerWeeksNavigationButtons } from '@react-admin/ra-scheduler'; +import '@bryntum/core-thin/core.material.css'; +import '@bryntum/grid-thin/grid.material.css'; +import '@bryntum/scheduler-thin/scheduler.material.css'; +import { startOfWeek } from 'date-fns'; + +const EventListActions = () => ( + + + +); + +export const EventList = () => ( + } + /> +); +``` +{% endraw %} + +## `` + +A component that display navigation button to move through months in a `` that displays data month by month. + +{% raw %} +```tsx +// in ./src/events/EventList.tsx +import { Scheduler, SchedulerMonthsNavigationButtons } from '@react-admin/ra-scheduler'; +import '@bryntum/core-thin/core.material.css'; +import '@bryntum/grid-thin/grid.material.css'; +import '@bryntum/scheduler-thin/scheduler.material.css'; +import { startOfMonth } from 'date-fns'; + +const EventListActions = () => ( + + + +); + +export const EventList = () => ( + } + /> +); +``` +{% endraw %} diff --git a/docs/navigation.html b/docs/navigation.html index ef1c887f5d0..0bff2e6b209 100644 --- a/docs/navigation.html +++ b/docs/navigation.html @@ -96,6 +96,7 @@
  • <SingleFieldList>
  • <EditableDatagrid>
  • <Calendar>
  • +
  • <Scheduler>
  • <FilterButton>
  • <FilterList>
  • <FilterLiveForm>
  • From 7c102811d4f91928f256a54ab3b11c4752608ff2 Mon Sep 17 00:00:00 2001 From: Jean-Baptiste Kaiser Date: Wed, 25 Jun 2025 17:03:45 +0200 Subject: [PATCH 11/28] [no ci] [Doc] Fix `` default value and example --- docs/DataTable.md | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/docs/DataTable.md b/docs/DataTable.md index 56980aad5ed..5557da8066c 100644 --- a/docs/DataTable.md +++ b/docs/DataTable.md @@ -989,13 +989,13 @@ Additional props are passed to [the MUI ``](https://mui.com/material- ### `align` -Table cells are right-aligned by default. To left-align a column, set the `align` prop to `"left"`. This is useful for numeric columns: +Table cells are left-aligned by default. To right-align a column, set the `align` prop to `"right"`. This is useful for numeric columns: ```tsx ``` From 137a4586bb499534dd23a5f150614f1650b961ef Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?An=C3=ADbal=20Svarcas?= Date: Wed, 25 Jun 2025 12:40:49 -0300 Subject: [PATCH 12/28] fix docs anchors and code examples --- docs/DataTable.md | 16 ++++++++-------- docs/InPlaceEditor.md | 4 ++-- 2 files changed, 10 insertions(+), 10 deletions(-) diff --git a/docs/DataTable.md b/docs/DataTable.md index 5557da8066c..499124080d7 100644 --- a/docs/DataTable.md +++ b/docs/DataTable.md @@ -143,7 +143,7 @@ const PostList = () => ( ``` {% endraw %} -**Tip**: `` also lets you customize the table [header](#header) and [footer](#footer) components. +**Tip**: `` also lets you customize the table [header](#head) and [footer](#foot) components. ## `bulkActionButtons` @@ -743,7 +743,7 @@ Using the `isRowExpandable` prop, you can customize which rows can have a collap For instance, this code shows an expand button only for rows that have a detail to show: ```tsx -import { List, DataTable useRecordContext } from 'react-admin'; +import { List, DataTable, useRecordContext } from 'react-admin'; const PostPanel = () => { const record = useRecordContext(); @@ -1645,7 +1645,7 @@ An action column should not be sortable, so you don't need to specify a `source` ```tsx - + ``` @@ -1681,9 +1681,9 @@ const ProductList = () => ( - + - + @@ -1715,9 +1715,9 @@ As this is quite verbose, you may prefer using the `` component from t - Users must have the `'read'` permission on a resource column to see it in the export: ```jsx -{ action: "read", resource: `${resource}.${source}` }. +{ action: "read", resource: `${resource}.${source}` } // or -{ action: "read", resource: `${resource}.*` }. +{ action: "read", resource: `${resource}.*` } ``` - Users must have the `'delete'` permission on the resource to see the ``. @@ -1786,7 +1786,7 @@ const ProductList = () => ( **Tip**: Adding the 'read' permission for the resource itself doesn't grant the 'read' permission on the columns. If you want a user to see all possible columns, add the 'read' permission on columns using a wildcard: ```jsx -{ action: "read", resource: "products.*" }. +{ action: "read", resource: "products.*" } ``` ## Typescript diff --git a/docs/InPlaceEditor.md b/docs/InPlaceEditor.md index 64fe5a689f7..72fc857f5b4 100644 --- a/docs/InPlaceEditor.md +++ b/docs/InPlaceEditor.md @@ -158,7 +158,7 @@ For example, to render a `` in read mode, you can use the following The component to render in edit mode. By default, it's a `` using the `source` prop. -You can use any [input component](./Input.md) instead, as it renders in a `
    `. You will probably need to tweak the input variant, margin and style so that it matches the style of the read mode component. +You can use any [input component](./Inputs.md) instead, as it renders in a ``. You will probably need to tweak the input variant, margin and style so that it matches the style of the read mode component.
    +
    ## E-commerce @@ -414,6 +429,25 @@ The source shows how to implement the following features: - [InPlace Edition](https://github.com/djhi/atomic-pm/blob/main/src/ra/EditInPlaceInput.tsx) - [Drag & drop](https://github.com/djhi/atomic-pm/blob/main/src/boards/BoardShow.tsx) +## Team Wiki + +A Team Wiki board built with React-admin Enterprise edition. + +* Demo: [https://marmelab.com/team-wiki/](https://marmelab.com/team-wiki/) +* Source code: [https://github.com/marmelab/team-wiki](https://github.com/marmelab/team-wiki) + +It leverages the following Enterprise Edition features: +- [Navigation](https://react-admin-ee.marmelab.com/documentation/ra-navigation) +- [History](https://react-admin-ee.marmelab.com/documentation/ra-history) +- [Markdown](https://react-admin-ee.marmelab.com/documentation/ra-markdown) +- [Search](https://react-admin-ee.marmelab.com/documentation/ra-search) +- [Tree](https://react-admin-ee.marmelab.com/documentation/ra-tree) + +The source shows how to implement the following features: +- [AppBar with Custom Navigation and Search](https://github.com/marmelab/team-wiki/blob/main/src/layout/AppBar.tsx) +- [Customizing the Markdown Input](https://github.com/marmelab/team-wiki/blob/main/src/inputs/PageMarkdownInput.tsx) +- [Custom List](https://github.com/marmelab/team-wiki/blob/main/src/resources/pages/PageList.tsx) + ## Broadcom Layer 7 API Hub A framework built on top of react-admin for building developer portals. diff --git a/docs/img/team-wiki.jpg b/docs/img/team-wiki.jpg new file mode 100644 index 0000000000000000000000000000000000000000..544ee2349177bdf4d11fd9928826463f33fdb476 GIT binary patch literal 144889 zcmeFZby$_#vpBv@!5MJLaXz*NOc*bve0006a67tts02UIQ4;u*^j@Zxoll4LZ zCG_qEoTl*w)Ncq1+SK3R-vKvtT$C-O=ir!T5Bp zn)+cfjOFpI-k)UW-fo!JWvs~`T6f?v+$;S(@9)Y&YH?R$0U@p|9=tmJZ1y~9J@Ghp z#>`wH#eF-2H2z!R=12A1Bee=?>3r*>y6LCyJhhi^68|pzC*+1s;W81bZx=&j3@-nP z{PF(V^6Lz}Rsap37G9gygp?1=lN>2EM`YhW#BK0D$;{>Ov+f=LOVnh-)#&PQM}khk(e^=H35+2(0fz zM9lDuh=WJDzd-*wi9qSyM2};Sg(x*($5HOc==BDOXpY_k@&!}bl37OC9c4PWH?}M? zb<{~j|0NV@gfikU=-;QXq!Y`;`b}I38h~WNiSBvJ(v;0A9Yqo>QoEV?+Od4sMZ8~( ztiP}2tM>emN~@ z|2xr7==b*1{L<+^DK5N`WpRc-(zmjk4$XbYaPZ0X+Oq6bGb2jUn9>#Wa2U36q@eU! zwsoHvv-Ld4y1)%b{6}RHKM|^#-@VB{JU@FRVDYRa-yj%Ptq!pz;vdw|Pn(3rUse*O z)1mQSc(m9ngHf4$Gn=CWH^-|reMg@vJ@Z__a&*dJv|x>$))92yw*HIyV(M32xR`sP zto~)y2?P6;VKW`*w(FFhYlfAS$d`K_UR$p$Gu9g|BDeIv@Z<|?PhS-ECkBVkl$T|W ze+|ZeZxp=cFu=l&S~V(6McUH`ARr9*lk8{WcLhbjz5DUQ?Khq)8z&y0qz#SuQV%t? zMt$Z+h7&FK1TyTl&4iBS_dl(Snt6Ym0_uF29aR(hDe00oB3-z1Mf}l5bB4ZkubNIi zs1bjPVQ5g%?n9cZcT;+lAM56*32S1bs}8-H0Ksha)OVZwyC9LJH|>96aOkeeRHzvV zZGnVzYPNs^xmMQX*E~OMV;e(lT=`+`_N~JE>NQzVNL#O(Ar# z360e3dG5G$9f;#xX_%EDDVEh@TOuBVXVY-o_UH4Tl?Xt^3iv6a;}={11NXc6L8SYW z^e4+DZ;2RUXt692ofe>sU4@nlql;|-W<0HscL^!ry!>D%kX;i$hC6kdLRyK0fi_Jd z8#)f1oZuvsZ*U;)3CB?y5ckF7w5wLe1IO)`2?PM(lM3+#moTe7F}L|7zkH7^N;hY= zm(yj$=jQ`byz{`?cJK9k;hC1AGEnCGz9fFaAi6L-VXnNQ>PXN`d9#7w+^BEk{iA9t z@%z2E530))TRuZR%ig_AJOCgOEhxOPdfhC;ogquUBigt>2qgf3g~Kfo6HA4|eu3vw zyU5JJtMK}&tMLWuzYsWdVj?$hyD`e~4bHrE;uA2X_xJgM1$OLG1|o$obrbPxB;nkK5k%>XHp?AhvP7E<7r zYdEj|UIGB{&+2*JYF*Fl=~xFI@takX>$FBL+q`prj#8B4jl4b#)Set^EO1rjI<)wQ z;t=Tq`-EP@jW~*PkuJ=G9tlS>4O7CURycNBsyoHte%nxa732c{h0fc@9T?VLD8?Lb z+0G~$fceLb`U?#gm+|ny76hjkTGP5Uz5mhO1k*%-Hg0>pv)l%%nq>ux?Y4D>lJZk=!$BqF z12BG??pH9ks`AVN-ZDOrCx7^x0_%Z*iO*_K(!<%p3Z;*-fO@t;d4R-S{%;rtU(8xeC;~b}EDm?(e4VL+?%{ z3EVQ0OSv$W0RS2qO8M25=ao~G2^XsHSCua47&)$aWUh9Hze6G<$+EcGTX4K*Bxh6d z*p;Wb{;>&5u0?FPVmy2`ZRsk>Xo4lijyFL11}7nxxKsbds(zv5zbf^2DYV$X%lU@C zykG0WRf~-4w|PbiVIBi{TLmm2&7njxW?xv|FrS;7#Tb`mOWlVwyco#@}`tZKEX8<86* z)>N{GI>zljQ5toD#J=e^2FunMxV~8rI9L4(T|n+i{|uA<+kBlfzP&JT|nsa~eaKU)Czjg}i=y`pCa6>$>=TINZBehEEu!ZD19SO$q0#GtVS99%v8j$Gq5_B`yfk%=)WZQ-WHG+{Op?{0{T%Nv zAbjb6?f!&*v;z9p2Oow0Zz(UBim+dVTuh>WNBwgQ<3Caps*7d)g}I;@$f|PiA7_d( z3R(BbG_ibP2N|tJ;}`%T__CD|E(lqcVEtqy`7mXQMwWfD!LIj;T0t5M8F=HM)KR!` zidFla0;tC>(Y+VCGyi7zo_EBqmA>DGgH9THOV(fY_@25jK*m|qx7sQ=(;E}ZEKlDG z2qyB|?{DVLC4L1^Hf3-zgJ2FLwI3e47S3SQGtCLoR8_N*r2ro?Xn`_62)dmU{sV;1 zqN<9g?i*DZN=&x8O{&K`#RIN|&sd8raMum((`H9Xp*i#0d2Rj=$Yx+R`nEbr4n}N^ z)qcW+-ppC&C0;PC9ochHtlT|ARBVBk_PU9ds|Bjgr2V+ghIup40~?sLM5IotDi-_4 zX8lj+WqpU?P7eS9u5EvWgD{2&v+tfKJilW=LX~q*t2R-Km!!)fG>^~K%ID`Q0%9_9 zw7qw*TMsDFsTU#u@o#9$t6#c_{pM*&(SnPr*`56~71$DUg;L_Bc(fy6GesEmu~4x@ zpn&Z_1e=6n34?rTq0~{*H=pIN=lqOBf_s10r`CtWRaGqA6%Uv#2)6VxO!z+@LN|wu zL*rt190;{arwWut=bp|*scV$J-QUcc%Iv)@ExW#JrZ?~Nm*ihk2)JT=I~+6`*kETh zIheUzUs57|94FXWn>(bYus<3tnS&YmF*x8Cj!Rr%P8;{Ngvb;y8yjvIG;hdsh(sS5 zFOiqld@a5fbW3(vYA7WPx>hYR>v<$ckU%hl;c!O1^tG4@y1_z^Z4ygVY?~l}Z z9Y;X4BAQ$u=wQ$&^57$#-6*Zio{LOrOroRYK-vO*BhR!@#PlJThJccHxE4>DWiS`hHxO%}{oL?UTP_OzY11!08A~4{Ak2nGc z_PD!$6>~lXrqUpd)B7~?4J;Wb~4jeJt!E zr*<{1CTQ83GVM7J(Xo5Wq98|TycL_;VRyRfW$B2z%(tO z_2wS8L_T3YwuRwHnZm=OHP;G-mO+6GzOqs`*1*TxA8uo1{lfBR^88f2GHB7ZKD1Sy z+?@IO3)gye*_+KRSBt~mv?MWI0dSg5GwvRr5b3BM*(xKSe`K3q#Ll0hE+oGBXt>Vd z0d(f!`n6p<12Aoj$gB%g-w@{qkJ7r!RVycb_NZwTiL`XnRx8p~AnkoI%do6$m3B|V zY}zJivw-%|Y#MIBrSiTZ;n6fsOgW%@d@MgkL_%UhEHeipwPvzBd$2rCgbpA5)_Kkg z2K_w2MHnrXmVBE#hb}TsxgTx5jAp;9a|#CnLL0V|D!M8==%!z`?6I>-DU z`Um7TnQDfi!+-3BaOloS{RUppv`c8tqaj&M3&5Xy#$YE(dkuSmv*0ont@03;;l6j88cfTDCIQPp36DN41gi2$aF5DjdTx z+G4elakgBR#p~?Z+B9|y;{oSneFqV6C0%@9Bq@=(Z&5my9d2e@gtM?ylT_pGXci^s zSMcLDI_vR+2E!l&NhsZPxqQ4c=S}E^PGEwEXprlLrWQQj7u#*wI-&Pyxs8XjO(j8X zU3tn{ElXdy6c;hxG%c=H6EGb1D(@aCZSoK^gcZ1)7yYBcG%}<*Q+T(9(^eYqUe<&k zxJ#$h-4uD9AB#Mde6ZBu1&jTi^_w&B56^jpL6V<;BH(y0ooQSExT3rV_O|uY99@r-0KWK-6cpzL9no^`Q||K=8$G_-$1Hjj0ZcSX0( zB3!c?=D^S6#>c<*QlQ$ac~pyZ^{}VMO-Q9cBcJf0^*rzJ{DRa$`dlsRNVWM6bfhVC z{e9zQem{*&0qMtjc~6*2%p@M@1Tg!NAD}Vh{ zol8WV@1lz>y?}uq4<=<;pagZf9Hy8jAsjbY}hN&;oe6)0$NS+A!x?4$51msNE*?0HVv zxH+;`K?>qzOPz-KTx!+eJ_t4dot~JRhA+q%?zc%wW?g8&#RvsyewQ-~{l~g@Lb0n9 zc*-3WWCY#9sH%9HIx1s|UMa5TNv3=WmczsMUwJ3ZXu4}eD-3O$-JiSk@(4T<7NuaS z$6;g8Rj!>}yaUmftd(bb#S1kiQz;RiTdW-3Ld^E+1#mr0d@F> zXJz{<_t(^=*6de;i|PNSF}Wz<0_Oi<%MiampQI%q z+%w`XscWb6{QUC$y;|qzgQ=)nE86pd+w<>Cg$cbj9jhB!WOj81MjFU6HmTV_S)du{ zAA7qCt@?(5tF-o1;DYB-ravDPdN6)`Rn|vnWa_q4?M>zqx#dB@8OZ#rsJen@BLSE2 zUvMSw+xY0*FB^$E7+ITGJX~A;=svdjq{#9#(PcgSF>4HeD;^G< zU-jVz^Pe8v@0k+Ok=|XVIr^G1gapa59CH1!EF7$;@}yPO<`&&?`azxT=VhE9_w)Ie zz<;xWAAS>be#MkdC?3q)W@H%V+tTspi(E;{csKthgS$4$ zAwU0R?G*lpgT+Yjh8{8OsiFH!b>u|pTh~|mJ}wS+daiDs8Pn5=AsdlqkS54(uW0S^ zflEzke7zJ%?zU(_+DIX!YoXk?Res))S4#6UudAmg+is_tHiSX$D9yR4K4MswhXd$Z zTpOcU0DPnn;r6Yb2)GhT;rrX;OWT{DL>@>l-nLD_m6DOHRf$8D#bsdw5~4T@g>eEn znlfQw?~Uk!y1MJb4&=O}%xrNgZf=DtQmKbWsb=Sq|}mHr`oCo(p1ek<~|otgLN z9xu0Skcl3u!5 z_?6&W8j&tSnnYLWL9*0W+0 zn`!C`gh1mnrKzd$8_Gb8HAs#gomPF(>if2+YKtMB=25j4_v);F6!|Z^hzq;SbeRDQ zkC`7mK2;@Bq0!u&m?_CfXD-n>4R^Ut^&d?i;9qqyJW9p8rIJR=ehgyIgOHnA7~*No61{9eThY`Io%@?F^$7 z&pa5d_k5m|=TKv;J`T1}V`F9m=8dsIYJ=@2&CU2Fz0uE|shltEU(Pk-1C@dolW+V) zIYK=P)QLzW8j2%x9$MVgrPZyFOJb1ev5Rl!|3~lW+bQSy!Y_f5WsxFrdKDiT>Rs>} zFQJB`{$*bUT+V#~`_G}QpXC3l*S-<|7rW0tK36B z+iRWn>Od>R5tMYy|3&cqz2h@n(fPUE-4Fg(G~?K=cUro1lIVX0Op7j3FhDFbyvdh& z8%Be#TNtqDrc$F%S}CFBnqY4D2gq!(1XO(JIPNW-hs-AOQ4?D-nVO1wZ69r?Z_jGC zwv8-$E`r3iC$gY(k41cYgC15jJw3sZ?Cn)mey-T99{Tb`&vhwkL-Q%SM9q6AU%r;o ztdi>E>-Al=Ci*Yb!8DQbJ#TfQ!(x_3E)< z1ub*)3uOwWa;@ScfSD=EAA1C^g+QySGIMX zq3V?XMbMu~^i?i@#4L~X@c;k%KkWjt8>?Rdg;uv+r_TTUTb~P@MH!^YBQ^xuR+R2@ zOeI8a?c;g3FxgkoY|+~|-Qu3`X8j2B6)FMeH&0HRIHSI7)lVkEwpXZW*n3`q@$S)m z0|)_YcY+(Est&ZmT1SzML5m*`GmR;r^Q^5AE?CA&Qk|>Y?FQZPKLv^NMoE;je&a^2puBm^Tj5!lV$@udLjGy-(|LBx$ky z_9E`nyK=v$j3aCXr^S5aE5L9u?JK~te*G(8rtIT$gF92i|EHb*zc$0UP5JjCy<56H z%R3*~QWo?^jJ#AF)02${s8{mGeCRn{EWhcvin7~zJl3?83c5P$5TiQW^tP}}Y*-Jr zb4S%ZtxdwDA9hEc(FO)SC^B#lsFQ!b*EJ)YnsdYLQ0Qg~!F;ul8+SLm1jcBGJJB@l zOC7eN51~KB_Ma7Pnuc>dyJvG$$cyEs6H%S-0@-EJeV99_o?W0I%wPCnp}D|wT2hd- z$uI>UyX;1JxLf1HNOF-7znc$pW#?oaQil(>#AWZ?cO3q-e0-t;IXuhyqGk_{#29)G z9JAA|Ev_n2XD+exulNe+FZl|H&@2J3=s#PY#v+^+li8s+??LRgLj}uYv2^O)2_>rE zgMF`CXe*_jK2&=7P9bj^kKv=uyW6EXSCy3AD&(Jks`C;ysB=GTY61u=j$1A~6_?8u zYEEa&-g;ib=#v^1fj&`VFTCu2XsE&W%42A5l8>}zn^hX3S@RXpIXD+5EXG0orp!b$ zAz`5zVaZ{cMN*HYh7z$|aPLa#tM@{FXH4D;cWQ{SKBxIRP7&3=IC801+LRn*-v*_A z%8WF!$4%BMb1M*k`$doJ&e2sD%QT=~X&HCkW74*#pZq_)A$+#@cN61s+@=g9ZPz5M`BWEPCZX}z z+fUDOmA$V>g%9Aim21E5Qsrg9Q%3$K7sSh>0j47=BK* zJv{SXYnOM1o>y?)oOiF?U5a^ojoHc)*!$GU;W~+txgzGHvM6k@ z{5oP^hshqOi=t<2_Z#;B&8)3u#e=L`y=KXM9@^YriboblbPC#rsu z{T9Ybi47DBB&aW8<3j*vH2VI${F=>3T!Q<^-5c0JoZB2&D)QkQNl0Kj#r^6Sx*@qF z8mFA;czrMrLtu>2blQP`L+kTsqWa?@i7)a}i;mxQ;q0#A{8O0&oW`1lK`ib4%%TUx zL~pswobfWnHq#%;FVBtWFSH~nl35yu<>XSZMs@DIosL}?ZK+@X;_Tx~Gg-l7xIC|7 zOzq-4wN8ZNFkW2dsjeu%bZs)MB4cYSDW8Z?g@;3(n~gzdzI>50b7ak>ibm{hhyrMAisPYRe7v*?bERzB<>pLkg>+pJ}1-)kWC zk}u2`vZCf`VLb^;;!^LZQkBG*6SCx~IOUE_-((uSNnDludGNbJbRxGgj~U!HXH|aM zIgLtNgs#Atui#kjYP$b1Nr!zoho8UYkihkT`b-kLrgU_VbaI3ObYf7Pk8ZnXO5v>0 zkE$7Yo9FtJrd@U^)xc5eaPUVpkzD-*PmSW9tpu9}gqoc=6xBH+|C^2>b1?=M<@^jG z?F}t!ZDp8JU4(?G}dqho4ylJ>!l^h&w!Um)>mBJ@;j*`MQg9(d;a<(hc-{Yi4 zx=q_sNY^Cor7Zi4OwueTt@7ff6X1`Iep{xSYi%UCG{`@pM`6$GHgoIwvKkUz#l-5| zQT!89*o398$XCEuK-r0o&x5N!46wD@R{%#@Q+45~WTaufq&;bd;8jKKu`lAlVVxZB z1n|q<$W*PJ;v4!Rup~WQT}CA+)wafjL-o)baIH&QFa_g#Lei(+-Q)SWN?S&7TlHEf zL9A+did}8lk`-kR$f^k~p0U~y58UeI#eKF_Ge2LsHl-Ev2*q9E9WjTF@Y}23&Cr$2 zIwF^-AHt_0#cWfh~d5ar%0Of#}%Q^N^(a8!h7qUiqbJlp8Iw=RhjANfR$1dX zm@U;!Z@sj5SExloQ^J4U$3xrM@>R%&FoK?>qv_fFcLVYj032_|EGn2RGzw3u@5D}a z)b?;=Aj8nE$kP)exEjx3YRZ5LL2*H%#xL%1D{(0eLQ_U(l?$t5lCfyQUVB-}$BNNT zZ!NdZG8M?ODY9k6R2rzGC7bbuXM`WSu%k3k7lv`8Uf{c`-|BIWSRv`*iLfFb;Yv6A ze*#RC{tO>`_E$UiyQ)_3X34?t`-a4+dR!a5t|De0ZCE?M#R|n*t+)Ju)h;4K{i0Kj z%IDz|YiBiK%m%I}VMf*w9*;QIc4x^v9#M`h)1%z5|H~w9;hMtDGSajfr}CBRP)lQZ z3s&kr9cOH&kt^5<(F46_vK=0sGduuS3Q1xy8fSNW zRgipC<8m_7^|~MCl5re=#GgRVevf}#TVSjMb1;0(9=lslJbAmanYV(aoncnrz9xZ; zgW3*rFtK}fzp7dP(a6*m87P*lFd7J3Qp~E>)xSpiA+G|nb~qABH2>Ktjn*D{tW|%6 zg9GrE>Pn?h_$P1dgH#kRgg`e8s8Jb}R!JCS*L~UkvAy4PYa5{*OC_yV@%n>e8rpZe z-<5zkvV|G8X&SvYU3#rbhowr7Rn2rmsZdT>&TcL>f@)$bcG`GNyV-Eia#D*os!{CN zKB@7#??T}egeA!U!May`h54ayPPGfGz+ez1wH*mR!u9QPb{E`7*-z98$V2NDY@ZsZ zLNbI01p+6X%_mG~cFof4N?(UOPO!aG(UerrIL?=t#tv1bS0`gHyEB#igiRqZ^UY$D zKw=l}t57v8o|TN3^<3L;BLmaJKCCd@3#4OPmyF#E-1!Q?6h@XAC6V{2djTVIPzTRGb;6S0eOag$r4dC6l{og^5|T==Dox z2BwraBYK}_P`eSlS>J}v$HjLyuo#8HIW_f?(`yp%-}QThl}@~T=SK-AN{1!YhXKK~t6)bzub>dN&-Pd5L_t)Tg0KK-LMYMw2tS+J^#O_4IY_XyTx0fjh&s z4w4TUwOc?hn!8;cAKK3);MoZ`wKn*Wu17*zOts2t5?p$d^yeKmio$|wubuei4!}ep zV=xl0Tn2^BQ4!yu1N=zKON_Td1!1D`tf-2E5vQ74F2%RY`-}+*<|_lCDIy1bX9J3>`wk zDdS1T8u26XQ3*mxmINGf?s!a)9BVIr`u7EWT~Kpb)!5G5D`9F9EhQ*%5)d1Q+}uHt z>_q^ojmkEu zWN(>N%yAi}uiMEgZZZh;J?(X!9+_&aEfwk3d}W6CawO3+HH_lkyg!wT$LyG6x}&Z` zmC?xDh)<$mQM4*r&<;diPpEgHvR~`>zjp$Q*4?U*M-S ztu7mw4GX?Y9Nx&(hDH$&mOc8?(%RrZd`HCzb`tl>lFwyHs2=5}vWxv4^)2^ZvFUui zYl)eqck%6qA8O_wWw6E`vzG`j;(rC8ZLRgWQrJ)}IRXZEw+_s%&^K->$I`ulDvB4t|n6E)>Mss&8;LT%cEvdlL_9)#$66}@=Yx4L;}aLH)tD$Tu`qK~#s zevZs)OU`_Do7H3C{2T02qxlZ~cMO8GC2(r4=cpR3;AN`NapIf-QBLa<%^y(DZ(MgF^bKQ6Nilzi zsJElm>B%N4=3&Z6>^k}h96NB@;Fs}dorL0VNhG2LM2U6MT6Z9j2M`A$kiRC|qtrLM zb)ADN{R#~Y4S<$EA^_|=3OkH!$&&~LyViL=a=cyLkP_op^}RQi3dR(6fd&NxEV&_(GH>HbbiV@DkF-k5#iz`U zZf;h^PT1gIWeAwG7IgfgQlYay3$j^^q*bk2KU{=XeFd!Aj_B2tj}?3h-!8c$+l<^; z$YSvoz{$5o)VJ2!W-31&yoKFQ+ zRk;GIVqXOYT-o>hfW$2unb%7rY>$Jh?E}WGOX%wFaIx;%q3?&>S^aGGUBNnRR0m8k z2n<+KN`pj$kG$NDuDXGlf%4oCVyQ~wNH=gTi<`VeZ+ux-D4K7c|5epF+yuF%hh?&= zW&^p^d$GqSw%%+hH-UAGVx`Y~B~5uwXur#SaUp(nF{1T4yBDX87iD{P+P<} z8xAo?edC@yRax&yDF!~$*wl9#2~Ds1Th%m@8jf@q3{pp#uZk5-XXwUTbr)HdS#PN} zm&DdgKtYU*8oCt=PzBCmvEmH-mxi?za@WGP-1kvv(K3>UhFGU$tRI0Yj+mZbiN5`3l&6 z9N#y{h!Vk#WFyb}8F`L&IPJjhI!|mUw_Fu|@510*MC6o`5=0QcEQ%#0nNF=vP%JWp z&)ScC>`}FBajPWriO>2&Tb)Wn#Tm^aF+IH{(_O_$M#-9&HS&@m?n#x}9&7Cr`(h;# z=yvU_*N z!r~fU^X}OxUKjM4qh{mb3he_68Glwn9x^3YLtZ9-%Yn&pmxDujIgHZfL!Fqmr5T+| z+ec!XltBD&$?DjNwb|jk(vi-Hx3|I1xX-j5Vz_9rLid8xll@YDSOU??yuG~z5%B)Z zVjo?q{L!+1w(&ZBtoFNA6ne%1FO76?0K%#z3f*0`gtg|O>S63Y(FrW>C)&i5sxnHP?y4Jh{?ZZ!6gV4K9u^R zQj^b!E{rj;Ir)Yfkuxk}i=4ojR-Syo)I|+1gDW(djcQ)V4227ClFVJItB^UkN5;hm zDP4}nDxW8x(=6hTdVltPzW=7b428$Y<;~&#S3nO)VpK}On)yw?(jKzYjhm-UoH3_T z&xuJ-t@1tTTsx(f)^aNfPLAZ4x9=Kj282n?5S(;r%~F$@YleZPPV(IS_TWBrE%6lr zbx2OGojof`fZFHAh$N=30151&4s`Q)DT%Hwd3o6g^XMoXv?bywiFbc&Do&K1A#|Lu zmx}Bfx>DW_?9s-#{V*f22LtV183Q_4w!y@yJsA)8g;QrUDqS*?$clga3LeTg%gz=b z;%(js<-<0qINY{k{A744OoF*SLSw0eYH>S+20~Loj-u9=Hk@`Z#yBO0Z6h}(g6T>8 zr=GdjyLh6NqwiAg5{KQ58lq@2$Do%Se(+<9a}w5mLTkcgbdn62Cpw)w6%Rgkj7<|h!lnIsPq`|y zYH6GdBfy1_i#sbBAs{N@9SizM^a_+rtjkFXm71EQ-NnxdpE`q@gckR}ca5hZ> z@@k=_g}5M2jbH8e`SsZwF9UrfctgzfnV=h^kXCQD&RF^zMR@WLyo+*UideokUI5~a z;H3I?7*?oS`B2#G9kibtwqI-{<2Y-h2LT(x9f0@nv>nRwd>v1__7y>)Zem7T4O}JY z7S;NIZ{rrhUE5a`j_-a1Br%dEZO;52V1Eg*rv-KHc1>s~Se7N-&!`DWKak$wEm`n? z9>kuvdrH^ZFq%~0YEG3m5-P+}H>h6CEN(wXx^#0T4BAOC`}laU$rU!^ww9v zSx~cbXa&UmZV3~a&(UOw*{I*zA1fd zmSb;?`5yF)#*u=dUoZPa(8m`A9c#aDWxO0aI6M@BELDu`+vMGZSED5XC`Hc0h*eFD z*+w_RPQ0P*;r_&KO8(34kGkb6+v|ngiz_>2S>~)MjHGB{PK;3yH7w69n6^0Hge5r2 zWv^-#Z=N|`k*~Kn=G{i{;B}=CT~FSyAq~wiNd&#LwmrM|oTwtt7QFx@o$`#-eH{9- zKwB!mmH$Y-oB{omytNJS)k1Fskdo_mcHdL-$aI}q^7!{`MAB$XF>kMCXWzQ^(5})r zyK$ae`z;q%80G8bL=Utkq0dP4*?9BBSFU7a50K&-bObDDvm>@!lYjZ)uE4`xE)NQ2 z!}df)uA9hr+@%}_Z*;_(Ug<5Ylro{Px-}Ui~Lc|}-s zHER6`Up{~Jr=LKoPvjdJ0(zP_M!`}a)SvW0YVS?TZj{0MjH-HH`#GEd-=%Ar&uW^o zUkEOeVH!uwAhs!?{FejoRzvp=TCgw){)s$Aanx&?`)fn=8pVBaIcVI`~WQ$A{gFOT!a2Zlv5 z%h_+evNegFTNzpZTdO3(sj>3Y(LZn4#j2;F^vYI3N=0~*&E4i75juUF6ag^7yxfPceL=kZe zdq=2G;%PADnk#o{hj3jF+2W!3sE`q#q}835h#KA$V_TgJeXQdYIN-y=yYQq8%-Q=UqVS_~SDeI21dNKv`iZ-J9&TeC0Un=wBDFY4v zAN%yL0N=2o70s(S#Kd0#HfZT4-{TdZm;Q{84y6-%C7x0`VDXIJgiOW(Hy0KW_xlss zI%R56cAAIwb3ISZ?q7WZ0W~$ZTW(Y3vfooKFre;hKI5)wC>|_9BFnxt*A8)Al1s}* z66i!|3SL@3FgHSHA-vWl`H~#C)SrESLowH;4LBOSCY*jSdfaj|P-a1vs7oA>)%!MN z_muCuEm)@Ui)m93IBd!dAEJf;`(>=P;ayyw8%MHHlc`WfVvIqp z@gq&I8O;JKwpqUxnELfrBA`+Sbf=xL{EXf%#a=fdU8(>S&PP@{8o?VY6j_(7Uu`*3 zMDd|}qkyle+L%_YL3>xOGi77FMyhl#Qdq^l;7j-S*1`>lQ*Lx|>Xc-vOQhU{a?XjW zcdvr7C~sHi8E)oaP0)-l_w$5(1U@AN`P`+gRUy@cRF8xXjEVS`6FC!;d&V!vW2s$o zcEt`4Lmq_E_D5wlFuYXb$V?0(v?;cCQ&YA3qo5Vx$DDNCy@gJ-@6nckDr6k)3y_2E zIL}iJHnKi@k_=&c;tX++b(?gc?|@2iS$Tn7>G1Y~rk-zbg}!-F#hU`t!F-WTw`;j< z`diu8{K9~uv@_bJqKXNLgxY>jIMcdnRiUVZEpr4Wr11i@YOgHZU+~SawSEXXK0&{S z6)*9QEWW)f{%*wn6SSlEBteuagCD^6q{LDEx4v&v-*0EEV8mgF1RjJV%xN~`aVU8d z@d8OC)gm z`PEiU_Izt;6V(*zvhMN{Hdm$>G!WteOge96xZSKc3rq5Vw8Gqnq=ty0YzhvL|3N)mTm@W zxr*QrPxL-5PCwTTBr81rT{<7*W-p|;Sj&l5bsj@jc0C-5{r3l?~L}wkJrLtEBwgu zOj;gFKRi&|#Kt0C5}{%Y?VhGS#bBT}5l$wg^1#t~KPz=BI`8rHI2q@cYlzN9>@VB2 zuPfhJ#}Q_`)i)Ggw_2_?bo(CHnNi)32tHx~sa=+9jK+bnO`YD_>mydCM0}{jl6aJ2 zrZc5vpr}MrpoAEK#Os_uCwC^Q!g|P9&x;cqA74IFgW{8W$JVos@lTFrx{?;=&TU8G zC;xvK47dt8$93_37AR%l^X7R}IEhS|r%dB6 zkJR==VJ(7YT&J{R4U*<#BD=;CBB?Hs?I!qnzmj~0bLnWf+Jpgi)A4#IEPc3TT3FVHDFeb-xA++qzoj2;(x>XL05W()WMW=!4H5_I2J z%92$rHVjBImv4R0mXsF`RJmq^_(nh~6VdxDHYWLcvUP4! zi|FyS>&cY+%lRJiHFf&((`M_}bcYzRt(2X~jA!Ds}t` zLG8?6=6itg4|4DKQM1K{^(7~R!Cm6N=DxdUZAelT-K>KBVKv5KAPlgrYikL13lT{|XrF$z`GP@( z__d`@V&7MJKv{9;*x)&v=`xFT*1B!ty12t`xvoj`aMOM%Ap^ACWl{57tm!&ePeI?E zYSFoJx}fsbX#vXl34#3t;$=T!dr@vjTWM{j8W ztmyWLGHaHQHi(l89c=_@2?^)6cq|t!jNHVGSPqw2Sy3+3Qk^G;OnOeSs{h+H1R?1m zFTSIX)PZ7>7!-oojron7&ng*UsE}4|l?(tk{Bt!Q`3}m%Bt8Px@dLEOL5ia371%+V zPg%`}=wq-Sj^x{SL&`&~#2If@KfU+fR=2;}@CNuvEk_4?uCU>hvHqwE4+b2~4Tun-eGjMsdoLC5>lT)fCtlP00+kD{ND*kkkTKkj@c z5)~aYO#im)F_~^dHbxF6{Y!w*WH*KaKn?o|M~ogVJzKj<@DUG~X;5e`C=@H4SP(Xn zqUOoVnXleYkv2osZ~d%`nvpo6Px|xYxz`|6apoyY3HuvyN%h}OTC@!p;S&{pU5HQ4 z(JBxhtvdwhOWq-uVgW4E`~s5x3|p(pyg`t6Z4a3Eu50kyodD-WMy0feIT_V4MAH?S zk0h0NBeYGsl`LG6>cmyP0yfBWp`{klwX+~+EZ3awe3TS{JrFtFgm;q7+g+de^p~SP zQOx_FGV1O%4WfQXwowRusu;hpbt8=ETYWY@1OO_-6IQ5Mzy@v=h)r6wItUpo3oM!u z^nn}_=CT;{^9A#%>I53}I;j2z!U}Ff19)6~6FioMwchSH1(~Y#{F>sx!2$>AnC9v)aO4TjJC|qS~!Ylr-J3WSwRvWApsbfLF#?=~HVeuz!uDg`nV-bm= zW5d%52$^H6?1+6X8^RB5oTM=C7PNZJ;03*ACPI*{5wpl9RzT=?lJLj=-hHnVqWcO@ z-dnn-uSi+Api1nSD4}m4O6pSeP2jQwFaeM@0H%6GR7mK$1DFqKa3Lfd202C30V8)} zV$gTsyrm6@12lyCO@jgQ2ZG5}us-6|Qi72Va`8QvWB3J|MO02rT1yOxtlT&Jk*CNK z4}8(0?6-qyjNrFE;C;5bUfGY6v$CS!$~j=t`Z9W{-HJKW{H4drD>7Hgwl~uxeFdLF z$(b!UN6d9Nk|{^`sw*WT-Us{Y_J>Lzoq&Dd{*QywQQ_g?rYXGvxf0{2*PYb&O!DP$ z%kgOX%$bsSjD$YiE1XGZtOwj$WiY+$Xfy2lWI8dJh;cd%cAG43>OW2YephI}^LqmZ zF~858HL6q%!r2FS)tI-X#?6+a_BD>sQ{nNw$(Z@a7DdyxBW&8nTaNwEw_Z}V0$M^l zAFO8|_RpGZ5u%Dr^sHx{xV$QEu>-AO=}({NoiST$zS60@V)Mk?T^KK+R#*)k`nD3N zWv6vjZVsz_w$do{N2O5X^p%$S_gC_YQF&{fi_}?ywt{x2b4som#>dcY4ys7Shq-MQ z?MF;NJF65N3y0aUl5Avc1Z06%n{-J+@{5hUll2iMaL^1h5ud`n@}Bh8sXS`=u{RHG zD-`5<+-l@rC}~$O$!>ps0KX_M0{_xG{DbW%@Xya9A%DLp4nV*`q~^M3f`pArqe8`P z?7W93<`h`f5tIFL={+ZpGVNXQ09DgyC@e8U~k9g(h`8#8}DT00X+jqlugiVEsJ;q}M zRq6S7RX3K>MldR!$L_bPgj;Ai=X^>qxO21N-HG1^t7axjfAM!pFwp?|&oLaY>+DZ_7z_3qvRir!I55vn!g(;6C z)a6v5t~%Z)kI2dX248*K7QY|VWM*pl+N1)ChHh-ai`t_Yx#e<Q zcu_Vv=8Z9T1!XOTJUm`ntC8S$sFO~RHVw4k$pP>Cg3JW-G@e#uE8IScup1n=BUWDA z9~a%1yx$LTIth=HcfgOqr?v2l$7iZ$DoMQp)F7C|@1$XpnKs!c@=Ei4fMmn*M)I~V zg|rtQ`I)tEiwe{uzA0*6NwwtW)9H%Ev64prLXUiRR+X-%|Bt<|jB2a-`lT%tD{jS$ zThSuHi@Sv2QlLO_mp~~{9D=(BCn-=oxD|J|LXi@rc=6)Bd7l5f-n;I{cdh&3ezAsDD22!^})8nbE=} z=XT~kq~(KHQCEMmOo`LtHkL}yv1Jc~B zb(mhB9Ml|cdbFfwDgUuy6+hwQ<6FCHH;YpWi(35j4#RhD@5|%tPoB1z7l$U2kmHpsM~ALk6XlFU&_TrR7!<7%Rr?^!#qftPC=~R||A~LLL4K zHhu}{;u~{0T56D$*Tq!k`E!P#b9#?zrd0*ugsl33=v{xrOn^~c<9Q5PQ_ zaSqzz+NgeS$w*u3{q49wI)i|(wEJZ##`NvSvv6~w8bT*{X%+ERX;>I+_qHU zf-%h_{>kC%C7Qop9QkUVv$ChywRN^$OP+0hAMwXluG%2^p{ls)_3}8H1Uj)sQjvX= zye$K#6HE?#0b}iXllD}wk zW?quJCw)m983DK1FR#dIR)b;t)vfYz8vdehzgM12$NJ}A)Dw2nzn2)y9L%?*boHMP zS?7nXWLDl4M2_q441PSC3ZUM6=jTZ zyTOHLB~K0QZ9h5|5syuRwlJI)hA2h!yFvK$5x1mj_~CXajI;WcjOb* zSs|R;^ggOz_c^x(pdwBX zj-<@3I0PjAfFMv+SG->>-+iE%_EV@KwmUU7?fN)!hI zXF<$P>dQy3P*MI{mkEW)5s?Aq0oY(r52oK77z&n<3bLZn;s@AYaMY>6ez~uC)BXak zj9~ixMXQ=PDw3SDid3PK=ADD{W~tV(|MBKHu2eOh`Bf|#_}t2%3DjOW*KbmGTmR=C zqC5WrcJfEho=?Y;l|DM`7wuPyeji~zXk(%j% zd;?VK0+d@zOs85Qdkz}#`!qoQm%G;Z@m)&+1IG)wMoG-oFTU%AVZ*s(#_(w-%;z)X z7qra?&TS~BEr$N)R7JWMCt_D`g!j1N%SnLJhef%u2WA7=cE$JY4qO98I~zBU(=vcm zClPr4o|x-xB^AyHh9l|Hq-@%=!x<#9POYHDw21pzkI3c9S1!`CpIjFICK|w5#jv67 zO2K5T)hP60LRYRNC`e`Q8iwO*=6Q(2-tXs*xu5Y5mb^rIYrUcQh`)F9_IL{%loXS+ zR>fFlKUaQloc8WPwWYa%a|fyv$gO$<2LdYRSe|n?Wu|UUfg2OOrr>GtDcCSixJ0`c z>9SN%mO`_E%vQQN;rt^_=;Tuj_tozfRHPilnucdtQm7f{uPf53Hvquzu?>e+|~s)yUN}$!c&=rvf)rJe$IP{FbE{q zxyh`qQxwwi9)cZorwWRtD4}ENlNA`@GO={L4^OOH8O$7uufasdx^S9t)ws!jey3kE%Cis=VUr4e(cbYC;3@jO3bLe-r8Ip?-is^7$w=(6R426RY|Q&dkr&+3kRcLYnt}#i~8-j z>w!hn^z;NEu=L-v`vxW&)l7Ez_>!0)jcUg7avgY~n#U~ZtjJhti&tGV(q|0metrij zugx8y)$>%TuY-@l;0~>+dInss#MvvA3J>{7F`9fF-a;Cufbu+IhaOK`>in#JUG*KY z@*YoGJr2*$`<^avGP6}x>eirNWo}dR*<4*TAN1n1bS0?FRI46s)S{cpG)#{xl{YjP zRu{_>e!iY4HDZ}+;vIuinedfzt3K?Gl|Rnv_`zk~Pu7SQp5{R&+qYkBJ-XNr4=Zr;ra&dS&r*t!XnSo3o1P871E<}FIP^%@-%aV0e% zM`vsPd<>{_&Y9bwHtt)p(W&Ea9V8fEx=Wutf}h9NkaWZU}XK`u4F3mF?4DC$1M%j z1Az^Be&J!mE#0Jf!4)XxpL1cirPJnffAO&g0^8~-FJp|l*hyQz{KD?)DSy%a2TX;6 zEB(-=Wwu>6ZyRwQ>KGeLRGHkl7LOrIiUj`>k#(_;ktSl9>hAGs-p7WFcnF!=wcfx^o0C6gDK5tLw3SKG0qUq+6A}Rsp2wu;$U> zDhR#9NiAH(8ah}q%p$0%4Su%+YI&bnLubWDR`oi3Zng(9K8AEV+sI$3%J7}qxXn@H zOp$~AMU$?X6J0!Xs{Io01C*;9`@_hK;dQZVpf*})AdJg^!llwY#x7{N;b#D+)$zQ* z7sxJR;k0q4x&#V;F)_M{_{jR=!o%HNF%l0{oQAZIZX)l$SpUa$R0JPlbhx*RB5+b` zP8=({?t~I-mVcbbkJh3TxawAqlg$QG7Sq~ln;*0%BD9eW$-7SQTmIn4{*{h+~GeOwM}UXt#wu z4pZGaxF85CAkSx8#Nxh#$RQa%UMQ$HeOPXMW_@HTnV9S=PHzzs$CDKz9^i~|42r?sq3RcG@htsxafYlTM=<)X?U;be8 zZ=X0{i+``Sq1NPn&@2|aGPea9W3-v$Ntkd>4pTNtSdZ%hZPjdWS*7e3XE^^fpaMPk zgm(J||9q!2)MNSV)+NYJjA4`2b@ZrZ?Nh`#Sy|{>(%o8+d)#Wn88L)vYVd^i*XXfS zcEEVh3$0E{lIg7L2s&NbC(`h53l44Jr8sBHZ^%#_-vCPq`ZUAa~ z^4(Bn$1i?3zPILX9DnAuh1o9vt|*^ee*&(HL7ci9NzOg1f1Z1mJ|U!<>G<2jk!sag zcnU|o)|e{s)WBmOQDE2$A=@Aexwi}u&{4W$eucrDO8Ne@Mn znSzmvSM(oMtEC)w{bwYY<_M(u9|mrkWBK+K3h`DEppm_)Qdzb84%#i9=3D`1rtPeK z0|(>XksDjtHg`qE**0S%GC=W8L~_{;!EC_I-89B8A- z(P*Pe+e#a#h)EPG$P<)mWuosB-@=~rU$z-NeEam~>B;P2%V zMHK|UpH2Dr7YyQu1Bz`wTK_R0+K(?aEg@aa5pNaZI4%V5DNraUizX}j7oDh|bV!kl zPm~%!Rd$d}h5Fd2+v)uRBEKL1%hc@j(91ScAN26#*iK-~kx|{y7LPwayN?VS0t?t_ zQU&0M`g##>s}+i96>21#VX^L-VFvY}-=vwL7qUEhzXv7Okz>kOgObuOUWW%v@+a_L z(FNh#K7?L>EZ?-zEmh7lpPi5{O}#b>a-Yx8qLuJC78 zW6I{8sTb!&>g4q91Hqc5wDTL7UZC2aEufk`N5?jz9f<+dIFSE%Zm&(0W5|$_DpPi4 z>=SFQULRuvlL=OJ;}7Z$Z`1N;c1MNY1i-DjK)t8jr1QRns_6gRIx$lB-UAR4|lA+4rnjHIawblk-=QEBi`k)o*NX zurIe}Hg+f;Y}g1H|7vg~YE8+Q&ea>En_ZiN!TH8wrRi&qu4C?Ehy7}opoFOnnl|{x zA!#G&VdHpdhTnYZ_bsF9-r0!7fXv^(Q^Xt;pL&!8>@u2hX*E}+w^h{NOGRo)&lReL zQWtZ~jo-wNjo(08m$k|UeqN;kf*1AHikHPcD1j>I;D}F(6Xj)Ug{GaHiC1xk6%I4W z<@@c{?g(U2Ww9ZC%Y9s$!G_}SIPOCR*>w`43MH?6E7vgn7X91z#pAa&TGlj;V~{1#0Dgz9MmxjNMGqiuM#%Q^A;DJn@h@6Uqc^X4O<6@`gk&Hl#=HDOy?RttNZ0o2 zU0zN>U{;Gig+LBpF0XMSQkAN|>FRa__TzA;PJUBT4&RYVCq=V?%3u4_dG?ag4X zgZR+WpRZ02>%zc5iV9&DW2Zv!rzM4J6OJz2`P4S}j+1y7lg)Tf9R)ZFg%72fK*Wme z3MGlmy9y0>DUvzOwoB5a&Zh~|tqShe8LKX3k4p<;HI8qosdkZccTi#5p7rX!&tv-0UM&eUsh_MyENYu@mwN7lpC zx^kt2OV2~@@81os-R10a)G-2f_2WklQQ+U9gMG^<(n$U2J4x1`tOv%ixqkJ4TbnV61O{7>38vxUTx{nm1;&8gd#|7l11| zq2}>C{O4G!u8x4_m*0w|gF;E_8)3`D#UUd>L{eDu3mr=UWsMME5vgGjTW>dsK=>2f z2A={+q$PH2oef}FAn4+yC7@7OOt=ee0+)P%-OC1NC0x6_CkQQ5lU$wAvS2s&b>=#} z^<0;WILns>=SiV#*vD?+&$L>ptW)tQ3wYUl`s88DX0K8aJe(`0rg4!au}_I~YB2v! z)zg(o37lagS_Y*Tc6qjT->1z^IX9?2&4ycSk;G>G3GkLa1!PtsnV@0k*uk7cd@MwC zzt^WZ<}K{C_97U4Rb$Xu=P0<==GIJQ)CkiflaoutbSs~{TY4-|2p=n+cp3sGwTsRm$^Q0az9Y^=?})n;qqLrI{JFwz~EegU~tCBNm=bKfAOTQ(Iv$imatEl z|ILDt!`>+lR+)*gE_*dC;SIuKOm3_VH6v)wT;K_#xt=4n-Na|oS)!3tu zIzvMup9$jSa?~i}vindd*-ji9?64#PQMHE_a=Fg@*4zz$%r9!xW(R7bypTDIVNjjq za&277LD-m4Q~6|gRIGCoq2o?}(KhEr&N-4aD%#Q~8a2U{`S%}T7gRz(9y?LksZs9i zN80^|oVVj7Jf002dy4Y+J;Ue~J8a)}@U>ujLO0uehCi~+b zO(%S^Z6oY(&_le$Ozj^{yL@iV!LTiNGF9=uo z4A1#cogW17doWWJ7X2Om4uUcVT`mN2G4C^S;l7kDzl>#)w{N}R^60=>sb1kckQgT{ z3s;DB&7)i(`C?WyDKF(d_qvHJ_B@0-&W5VkY@ox;dE!{TG{LCQ)1Q2?2s$g-32FJc zU-hhMC+A!aE?Jfuy*MtABnHzNbRBovqvFo5Y4iod{3Y|5MPX#=abpEz9>Q_J7fSe35BR;~pkj zjAe3z^J!0lT4YNK5#7}3uUyZ%RME%C~^*jaJj|r}Dy(?=pQ76S^X(>;_po2D6QPXyfzJ<19Vq-H^u_0^z8C~=%mY+aW5?c@@Ef=3RyiUzqd zCSx{BN1;Zc^r`|P24#Wbr5VP1Ns-og%Xac(TD)XyAG6u=LNS%{Q%XnGH>jT&x(kk# z)f#9Q>rj(M`;9^7!^kbo#-}LxJHrvdHbHm#7MkZ3OPCczoNoI=r9XZfj*zwm>@GYk zR)U3dqEgi>$%)1XvvaD8Au z^^|N3M)EKo5~@$}RKH_y<_X6XjqCtnIcvNq8y2+Zi++@svnNlN4{;5qP`R^`16hkm zR3QjUe~ZiGn~Q`9Tw65=N2KRlZqp`~uGWE0rIN{#;^#PF>yL*fK$g|$OT-&3Vj6MM zaUiMN2av(wtz(I%Pa}BkPQHB%4qBopomNBPq%W^<>aEfo=U( zjxXDjvoPLc*%M8AW%Vn3xvd--DxSXM)UXY?^5s)??ozp8>7oE}^3CJ90)VAa3U(nG1eYb5R1V*AHUABzfeWre)#kg3AlnD+ za$AazuBtfBa<1oP=nzq>^YK-{Hj-kOOHLY%)jUKkBH zE1s_+LA5g^txED61ZW=!s|UyZ1z^b@X;VT&_o+sxpQOI6r+|DttpZr|TvEn(0LYQ< zOSn4M&+wog-7z0VsN55pi0FF}MgapY4-v}A-FRDo!6&P&1l1A25MAZ#E<;Ig=a$evy*hoQh#}$#$XYe)8l=pUkjufkSl+0H*sSOSXw&21^%ftOChz z&^V=0p=e#v7hd;;5+#oxhI943Ws5x3E93hn*cY}YxWr(mY>(Pv3^SAr+V~E4^$8K%k5>ok zTP_vrJT;Mou)0W9uk}=$mK76dUmVz6n$+<$73K9rWa4)TleSDh68}WnjtK3vZ#vc#*w$M!7;64LgygLI+YDm!~!;I7aR&y5fT>5fdEds zIcoF`!k?do*y2G+09NwLMh|7}`~_k1bpz1@dff#URc)dgrQT^2`_O(z5XXvq?uImE zp==&%)h*Q+Z|AQGxa$@CK*bvrDQA$6Q+U$|2}f@eJa<%Wx@& z&bOM3^)BQkL*(_Fdiq&>h41Wd$Mq&dip;EEeb7|ad&WMsWWrDWU>zM^H~hWqE0ZAb z0f^&}C&uOAyFp#apld(ZtBXT_!P80j9?(m&^pbU#-Bj}(Zml#jyb;fSo_b$1k-5rwZA#^lBLth;W z@5K8DYdesBa zF{q^NajchT2>+s;W4(k$AN|Ce)+oZ34Ye(by8fERk?lO-n)Z%o>p14KVwL+CYj%hm zcIwu}yFLf#P2uvFjY|(OX_JvAGU;m>GJlmL6;}Qy1dazRJYt{m*QW(-Qy*NLe!0Bo z(N@1bGyRfvxz%Ec;?$rxy8m+iAwE75d1^2%c6$^rp5$J&o*w*+S$3uC#7!fjYtLX` zH}4VGmj8IBRw#uL@F9ZP{46PspXyr8k@(z2dI+xO{dym_tM`KZS*AYLv~A0GI5KV*Zr;og z^3oGymm!1#AJ)AsqY+O;Q3=I;i}gGrp{N8Q>--{4f4H6m;^fxIYa&Me8Re@zmK3Xj zEWDvxq1c$z;;9u{)MwM@D&GuRoS$(@DL+30BZKj)RF3MI(T%6sYDMd=9hT*?Emrb4 zHz?R3%?d*Zly`8fr{^BdM@+-~h0~%iTy0Yl%WuTwbEY3-9coiKCT88M&UGEH<$U+S zT*?X3<=bB8w}p+6C%-ODzheCp7d*eMGOni!(i^o$@v8EIbcLtiN<3Di%}(w|%+x^} z5DpaoJ1636aYIgzxKSZ0!w7CMD#^ll@4pFKtb_|a(lXC)EBpuqj~Ysj8Y+6WZ3(2y z#qHbu9)LeIHYfL6j8JLgmmUAfjJlgvK-c0bA|`QJRA_eL7k_1Y1^%$n8^W(*@5v%* z$U;Nv_M(6k#q}1>WeO#_u*2b3q=p+I+>95(AExZ}HL>^yetxas$qbV>pQ|el7Y;Yw zaxwghQlz{`m*oO>SJ`J|`{D+W!1h94IgF1&MIxk!Ng}BqVYd*akfuJz5UX%;q5y*T zHp;JlR^m#I$PfXz8)+d5>F{)qe-zG;Ug;W2)EK|7QL7wSS31gqvycxoO3@LjU5W@DTmh zG{3IACx-m-^gFh|ws3tuguF~RC;$G>3TM_+&D?2|rje(9AqZ-CSR1oE8W<8ISC*q0 zt#yU4lY_5hc|PgK=X#TETQ9wm$@*lhaK@ga9VnW*#`Pvk_A6A?#&}^r+=NZ2eowl_ zuaG8{UBcqm+1pcsW%9{Kz*ym1@BN(#zgL-ZawwHGU0~Y4nL6q1iMZef8bE|E%}(-ihw#2y~z2E9cVl~@|E;g5{#ms*}F?7W<=$_ z@h}I3V%xah9m3ePEnwBmhSEkjJ-Gkf4;~Xu_E?gAd5b*j5nJ5&FQ72fFKBjp&!;p# zJF|}3hq!IvIe5RLfzg>|J3qm~#}pCt{ft2}Ku5w*0>g5SG!5$`b%pEvM|;G@cOg06 zt$@5_2*G--Er&OlDH2P#8pc>FV<8$}E~HpjD|KkQX2<>x))s@I|*0p9040VguEyw?MG%FhMfeQ~w7r zqs`C#a4B{j@jzuWvHSG=>hzJCBI(}3wma`I&K%w4RuTuy_hdTIShg7}`F&ympdo4m zqbE`gqSOF|`p+T1Vz6|2|dU&?tpU?Rve{ zD4@+3RKiG;0PVZT;rB@?<5RzsmCzIANUePxV5uWR+|?_y`nWSxN|4zs4@1N|v0H_{x!NhT$*^&_9kiF}W$H2I%f2E`#pLQX z4kcQ2SUl7BY?c8x?1;AwxeS5}fjDO*zEQFFBn}I~<&9ioNX;_N?_z{&Q~}N68@_DO^cASY1(FRFVw|Gby``NLX?> zBcEYtGAYqKuqBgqo+KW^E8F!_wzizCzMRad&~RS3up>&(XPc|30XOxPLz`#V)?+He z4DA7$zDm2nd)UQ3cj>bW%{@`NP{^`&i^9II^{)#dA z;;A`p1j1666;awXIU4KCb7h^0C>@F!5=T&SHx7F@)x8ZBTz7=@^i&r0&BICT6{0u+ z%9_ZAa<-^8AyOv6{bWy_qNKHWJJ2S3w7mnXigaa8k`n2`#OB9u@b}Ot#fL%S+<4BT zUUWj44-JPaymV&@l51lHd!Xh(e3EO!OT)zvOw6|u#l3Gr1iOUD;w-Ij?owKLm{<^e z$OOEyZ*aG<6{3<|=rprMeves^H?wuVCqiqF?hENm2pM}tA__Z@Lq`Rd^`cI&CHD8? zkNtLWwr+}$<1!*{JWV7Nh|KDHpip+Vy?8r6F>b|qfU=-Ny#W-|40G2+W;MgzpT5yV zK1b0|&{&4J(8HkM$09}5vdV;eTfc~8=!-oULB66!kZ;x7DaYne>>BH>aQPx%XY^eP z(>QdvvJ?ERcVZP^RaQ3@HZVaSLgwbMtPL&(JrOtycL8E|V9PeSkhQsg?P>df{Z{q4 zd?iuoKL5UdA0q4)5uD5x1tqbkO^lF?vC$bPpGdbw1L0*J0$NA;Nn*{otqr6G~85H(tW>FI65LM zMiXIM%ei4|+J{FOo2aV8v7YMBT&xdi?$&9;WFcsyCs@^ z++k5ecPw{vYO(EsE(E#wlGn=RqX_SiM~yzGMAEU5gEUAg2e0GdWgb0lxg7;n9^sS_ITCD+EC^6 zVm@7=bl6`EF4X8O^uGG~(^RFR4)n&VmWl$*pdDeCNnWEx6lj;_F7{>f+5B(=mcEz4 zoHgmVBC6n2wi!!BW!-_|{s1M&*miRiU-(O$O!VAG2vV0-uOnp#I9Th9mkoCt5`p6k z@`H(8cWZJBPK9Ceh9qC)t{1^ykjpRo$mXbBI!t)%0cxysgkh7E?nZ1c2Ue+ zp*;IPR6!U=^BhsOP@0`_ntelc_Sf*^9$Uk%@{1LhmYCL>od5mp<2^p_$tP!FJd7cjjn z_!o`d+rF_9brSLPWN8l%RcflN9ch3!sB7YOnu<-P%Y_8s%p5)& z8Yi&CaGo8<2Az z{5iaNz_MFV8OK2Bz@8bJtspvpU?r!|dgt?F0qqw+5>*dH^f)%G{zNvuq0m5kowzf( zsJ5iyaDY+oFBVbfW%dF}mqQd7Ls;|x{JIaT%jpS!{Wwn=f1%#G3{m>n?^8Bt zBpXAiSVYns#%LYdJl!z_!S5G>GN9mrD%m9XK0RtOM2QgX3Hm>_>F8L`FrPg`O^Bc- zL!J>4Gw`F6Fbbe%MBE9PERsmy%4+Kb7fxfmdc*hLBe}MFgIO-b?c|gU*B z$L7zapI&p>)GawRnsBF&{!fT?9Dsvy*qg`@DxrUL>|7 zHnkn>(;1dk6jI||`TIwf!ldaT;X~4w09Zy#3!i1P`lsZxbHV9wn1ZL60)Oy! zC+2sr;Wey9<#WX$(zrw}g-X9LBxmq-#vX56o#aG+oKNq#ILh~Q0OeQefQ+D%(w^F( zd4I#nK6^PDs}eBA+&JGjVA1-+x@b%d=fTE8IO*92ovAd!W_nVCR znsMJVMmePg=aWKsi>JU|Y3S~rMO?yJ!d7su#0yU*>XB8~VfPpQEL)?RGhfO26-YHL z64BOgOa+^VW8E#h)Z?xC-aIP|pAY;pB5?E$HWHz|c$PgwLqYQg^X_WafK{>m&14C(rN`p_;JP{O@5NmX=1L)ljos6{tXaf!9R@oNoQ@!&sQ-S5cla-{OG z8AO~%1wOm2N6o8!ud+T@5T(uBTzCjdO1Nj8+EJdOuTYU$a#{hMx{1b`D2oMGAu|~_ zj2AF>OwyJV+Tjj8qr4q|(O4ed#6M}3iqCW0V`=fTdEDnmXGjuEHc8tKv@c?J53l4N z8!9Q$LiYng7@pi|fyDP~z?tAe~{qr&WI`Kcjkbn5a;6e}PFdK;FCD+PG_Hz7Hm*WRYcmCRR}n9ny3BA#T4m>5cA~EF!)$tM!7>f89zd9H6 zrG=)43k}%S`V2Buukc=?Y`u>Rri+Poy)yXqc5}tworqTb0=Zw9nmlpU4N=UqplFQA z9iaKagr_E@u%;H3fwm~1PeZd&iC0M(|GI^8<{eMuN2HqRs_CG}n!aw{26Y_|W_484 z-Wnd<6YtXg3v2tq(hJM`Mw=99Ydv4>GpQ- zDH*gV(ozKfV=BR@&)R zeZSY71fmr<@(1|zN5w&HCg#k2AkRCA-dH5gI(ZAiGTgc!cwH#*bHrhTOdpr2uT{BdNApyjcWv-&WbP!u@Y}ZH?#o31@{fEvY@o*SPR4chBs> zZ`Ajl`-N&O`<@Sho%*8|jky2s1k3yIl{~g5Z8cMYWpzD=nL$}A8IkYp7SD`#6ltiv z=Quq5@Cb`E8G_P~7LO`+vq~DRp8#y2D7jam;rbZ_Q8Tpxc3-dU^gRj9ZKE>1SygMqz zqwXC9`Q<-1LcslFHFhvJjSPqsQ6cch_(uczsqz2~P{C`|&P0^XDuu`GV{ zS;xv+6P{T@GBV86DOpfallW@c;28<4TQWG&S`0e9Vb&*Qw@&27yFzxc4m+i6n0s#Q z(hMFtW|ShD4l%=o)c3_RnbGP7Nq3qbT%Mm|Uyb)l-VY3^w3bXz*~i4-)&2xJxFdaA z0H00bnYBy4KW6Yw%XI1mwMr=A_K8QPLIhuvJ)`aGn25W{0GPqtb0K4TE!r4^1L8FjakR4iRs|>x;>jj@;KSt?oBq5V!vhA1Th=ay!%CyySWy4 z6I8u8iRgYk(~?C#o2yk60I-GZ%#My9_d^Zu=WbnA)TEVHk|j zsG`4TQFuhF^*Y7$rAV;tNJ6aE;lN+l$`K>wKz&`>K~J?BU$Mh&Bea9 zm_VMRzbT^&QapcHH1CH0{B`^A>CP$>jJ#l=P2{?0xL0Jelk@tErqFkae{sXs6^|5E zzkGNacaKRlZX4KDXv%;3eq%FsI;}OIQzLcg(K9EJb~O6d)LKAzYn0Qzxy)RyTO{?& zO6*{blsV{X8tFIrsg=TJEgH$1f^};+y^?^xXyR0JQ(a8S7amFLbE%OLy!j@PwhpNL zxHkB+_mKGzDyU=XyfU-%_AqPnUC*vr;`5G53AxizXKaNNan?{1q9ZrQY&9=IpQ~XK zGuH%!1X0)+`sam$xS*r~HtQ#SsOHVT-BML-Oy9naY7a*t=FcG6;QhB1rgDmLfn`ZY zWA@U5*Im(lYKqWX_RV-qm81%cWuBLKp%l1W3Q<3*hxq_`p45i=2N1_iE9yAG_%m2! zO!MJy6Vic`g7hnyzi8fQCvhr|geaS4`a7n-XxkpV(5#;GjPl{cmg9T!ZTe|rBa+t7 z($DFw9&l`5j8^dxjG6^0^vFzj5lX3Wj|<%xZxm%jCnaXli5AY8nK%?cMAfW5O*WnL zb=_xRzsNP&jr>uR@)5O_O^Jq8%r?@jl;>GW!ka9Z2@ekC&UQwI%@DI)Y0jPw_GW(i zcaNzA1&Ph5?4^DS>I@BDZtCn%dJw-ejt4H&&U7H=Ucy3v_Xe($OqBNzJoK@4XbQw+byS zeD`w3+H_HlG*>-K64s^HJ8;Y?Lm_#%6S<&qX(}PDl9Ms%{|0}49H@4Ym8(QHTy(^* z88q{ZhIJ5AO}3rCv`5u9Iy%{t6600}sp!J9lccctCkG`;1KL}Dq(~6C;*ULb_>E_{{h3xLz(foZCtU8Ma;hf*o-ztufTB zE#vl{KFm%nF!r1L7+N6Bm)+b1tssbJi_>sV^q}|WkXNIveL4XHz4?xCL;@!(O2x;u z_Y@`a6d5J5qkL~Q^n-Qv)!D#~u(tz+Na}hb!1CB%u||N3>Hl4HJiBi9WEN{XnHh6{jl?2LL4EL6Mg*KaIKo!Rmc*_}%7m5?Z&4HYTYvt9WHp>s>21TfXg}-h&+PKKZ9|TQ5@!$VS z+aD&t6?m)I*17qQ=;~uzUa)FfHf;}_-zx81ef*NWdQ@T-XA%*k-+XDdT~sb6&HYEF zJ5sLJJM})?sDax35PBp?-UjdDCV9@L@l70N_#6DuxnU62YNqnNuG`tQZt%!TZ4?I> zvfSG_C*}hN{?O72RtGHnsVq2jbvMs`Ek2KCx z74h1m>-{cD$YOT(yrOgo-SK{EFC}m#9EG=kWEV=$M0H-nrc*Rhc04d#Zo1|u8Wh7# z=$9^mKQSsl#TuL8^D*L!qP0chL(aSfYl3uddPT;V?VFRe3VbKON16uHPAk#;h)V;m z1 z^I1J%ZpY;@yXfale{QbkA1bsK8&s~2rz%rS{B_(r_8d;Z0cn1h?+jE&8%DWP6b_yF zi(ec2FNeldwI^|V8x|Ld9j_Ru9jJ=&nElbKm^3af+6(a7tXpr!n3K66`!o8FSgG=+ z@q25&Q=RI0t8WH%&X(QN04{)lgUna4{-Ea@AaPr$x&-WioqJWTzooa1eDtt7mJqIPFF+zsDU zcac0XS}z)%w+$%wsF@eArjXxf=xF>w_s1s=v+m#N=w+DwbHk4Mdx^5h{k!>C>{-~~3h?l*W&eyZ- zY1c!9NTg-pT(A zja?Y|Rtd>}3MX6+NHBR4xAS5<(yrbKUdkh~pEpix&4ICxcsnqtG|6SqT~)^0iiF;V zsCiT(G%q;?47CCh$QUNA-s-s3VKIHwviF+`W8c>>_VlQSA@UZfOBZYAZFK22in7}= z#}#K+=DzXI9PsMBJY7FC6!a!ZlESfC&+ab%k{f-Zm1v>ld)M*UWiCyaZ!eIqCCG5s!t zf8WqC1S&*8;Z3`yUG?eU6U%E+)YD6?BS9^tXM&Fb`?m4qcD}K=(7gPjWbj`!!cU-w zDC1eR>mb5C`qW5b-nXA*e-_`WA5W^sG|)lVMeAPPm{7PDA-8Uwj<$*4HuNBG^9(Gr ze_GvI&j=kaj3hG^_?A4976em^~2U5AhETEiS=|%X2^s4j-bJSMv`k_}c zmBqR|Q@n}aObxhZ_)V?F@2e~pK#hxDf)&!SV^du2H^o1?t$E*HH2kdEmWReJ8#aP z(UP*}=@(M8MLH5l>|3p6s_@>)7rlGhkl|h>-qKTI z`QvQB-ihUvGUamLOvH2Y2R8octGb2@9_#E8=Jw8hrz{R68mlbLpxUjKvU|P?bkgxK z6XL39lj`VUdx9t}C72Ve=yU0KD7>tPKO^kXHzI?pt6*O(=-%?mW0oBSfb$Wrc z$s@u_VZ1B;nae%6@=zQw+?(I49a*BdnW-pUdMb3`0(L#(A&ao0?S`I<`UDu56Q74Y zxukA2HF)|L4W@d-?7s6R3pHe9m5$2AR6J7-ysg5^RU*AEe(lbSKgdV`u`2P;bK2hw zIJj=xoImno+Je6E{d^aO@`m@}-T|TW{B$CpeHl6E4Xj;%9F2|6mG67b|E*;?&VZ7} zQ}rj4W981MtM|a$35I)liN-cIaZcgpraX>QDYP|H%Q=GWwdTR$ew7!s5gXLzkWId% zTLG!Z@nhYe?r~MQE=~zIWvVlKDpuurhZX0)|MRC_vV8OG$4?-b0L!u6<&j)!%`Q53 zvOm5eE7UK|NWUVJF(K=^cHZL$HF{74LY<}&BrfI?K*1;fuY&gTeSEId#jzfdrD$9P z-=NFXD$X~ArCyvJVxxfm8sk%=nN<@w#F6%eP33p;IC2dux$>$M+vK;0DzC750|Pml z6{y{(KtAf$ih%6(`VoBW#F}L4HBgMRdEk( z{x9m@Iw;Pdi`RreAPFAaA!vdV+zG*gL+}AYkl-*3Ft`Ml!QI_;u)zWZ*92#9cX!X7 z*m~_Q z2Uy=0!m#%~%(>9a$A5v=ys%iGK$wEz{K~s;`WL6uS2$F?K1YJACW5`)>@t)b=p!d8 z#0y5TPn_TCuQ|!)%oJH7I*H(vw!Vv;DbeGae`3=%{DTDkx29X{9{gfPb&Js<&-T)= zd@QRF;Wym90uD5cvwhfwh#m~4j%$!+Y4n7l?o>mrj-{%K!klO$hZ2okQx*5F1Do(Z zvYL2hT)lZD;uea$x817-U0w*W(?(){2?yh9EN7tEfAK$4r`X4ystZ$&{*k&!X-g9| zAhLyOYpz%K9X}%j?HJKPdMvF1J6?7p-=iy;em!z#i_ca(qNjPecncsi>LHawiXO;(ze~@sR-ZQ1y zo?dDw@AN2QMRmZq2779tXY|$+dW25`Pv@TZ) z@0ehc2RmWC&d)7@8#1+&H}OP#P$xJ}|J#Lrw~=^6ZfJM}wlCI73ezzdRSn zASu|(KRHGWE2yp);d!PV7` zU4ka!4d%cuxn5I}b@!V<9PF=!eT;yGKs=W;{I9$CNu;b=kxEGk8Kh`5;gd&s4y!{( zvUeOvjoUeZyeMJ3T`TQmH}8#JG5{}w5RK5S>r4hav&np5gSN3M&uMz@5;whIm3Wh`da00qk|;m6&IJ@uTzzgL4n; zXwuGMc1}L57pxs7B;;2nE33+DRpV@+N852#I{C#$l|Wv!^A$Gz_46$FBDr-S#*`*5 zc!~n7?rbJ?sUrxtbV-q^70=CehxYE8PQ=WgOT!NvQ=|QLuwuMF3kQego^={hyZxOV z_ej&eNJrFgqE>XCYr+T{Yx0#bqd5%;l%W;60~)(jQ-YIs(a{3BVlO*vi)yjBWviVR zj_`X^npW`!MVY;X3Y$vv<1%dB&EPQHD=)7UR{WP0mJ7rKB&Ez zTpl%4CuUEY?)qKUO}iM#_mz+ zL(I1M`ruZq>3|83NUe5Gbyfhw81F1GO2yrqC+$Z8Z_>@Gpn>krqckQKR)n}0kYi2i zEp%lL{J$wwL+hcdrNiL!HBH9#=<(kp#-s&%EEojKwbS?U8F{`0f>ORL z-7$*BA-|Wj1eyo9)5Yh<;YId8stw$cH0gVnZl$FZAd!bCZ>j_+yO_cD&!y9k?;Iaa z`i#ixuD;DBr8TA|gPc5WA-f0hqox%MQ1lDv_vi)yU>DWD$Vz#jdl9bM?jIGspgW62-(4aF?6tN$%aLE0={o4pG;QsdR7{BkU*XP@@)y6 zIih`MV`FS9odFMja3pyd9F`Chy$l>~p5mj?Go-_2N?iA$H;QC;u*}=bgnyL9rM5+{ zbuTd}VihL3E##dg61!(}Nq9UATPaLSqyvSglEZdc{1VkjOcoR*7Mv1L9bV`HiT7~A zLO#%0N4T}HsjbP`zkg=kgkb#JW;l(XLO1Fwv5;qmKu&Ekr84yuhe3T?>{0i{bio+W zF?Qq@#b@2QAG&hHX?Rr|IC}@z_SwNNVbs;B|jeM6E3zLI9oIwA*I`; z+Ay8FNiRUJ*03xWvUqNic+3>liEH1Pe@NciUoDMUkO=JC>Hdw@2mpE{-^}CECa2C% zDeJu1{Q29$|C@BT{EP4x9_fe_1VeO<5R382*u?K|z-k?hj0h(%)eZcZo9*;joq9yB z$q5q~?eOE{XKWXoxSb>KkM3@HzwlZXK{90Cp9G3Faj%Fkz8Bi#3>8bK-%nNr$PSs> z#ubzErN6P*wQwd9gd4e}(ac5i?S4=oHOg8-pFNiDk{tr$u|hx<_+C;bOU@N|}h$KkK+NS9iQGJ_1?q{=f;T#_xuFgIm z>7IFd(783r`y5t>i2aav{3NHa+@JGN1VP)1b5(?V zQg+UD@f5Ug-l{FD6NjTcVs7l*R$Tj=!sp;DJ6npNiH#^R6zb-!#?k}k)uf>H;*j$vn-Y1CK5i(AE&fn=bIQ;}r+D%$!vM^g z^1EBCuIWJfk5V{KgJtT;f`T8>>KP!3*ks+k1n_>1!NXyn&Wyq+K;3xjlaw$UlSJNi zY+|pwj$C%02wcHL6pLO}k&S)V{MqCiWWk<-Cax9g(Fs>e6?pgfe(lk%^G4>(5Ubxv zU->mVMMPUiVI@g*Q%=Bqnw~`}IepF{5X^m7UVQruOax0$J&kVvJZiEu;Ge#-l_6dD z`MiE)g0-Gy=kjQu;FKQP4;W_aw!nk@oRcQll4phTG?D>lnLvywo5P!XGRq810AIOb zif8HiZ992q>QJIVR9_4nk}Sgul6}HrItMLo1y+C7NLi;rjzZ$EB5cm`tnuU1TP`ol zIilCPsOoF9rMqQJdaqw7F!At~_ZB!XT_`)m%AFG&;8=co?nj4$6RkC17M0Jl;vu&X zyRtWslp|Z5#$N?q+@Afg`b(Hy1F$rD1p^3#d7`FudC0H>htfu@J7!DVS|y#%1cXx{ znzp&=L*1M7uyp@-A?iPr88?B}{)m@4Lp@F7Tl6@6lDBWuzlrpI0Y4&Xp(D*d7`1sxE-*dTUey2>X&T{)|wT&y)dTmqZY;S z{lk9Wh2e3S$CqCzLnx0Evg1PJ`~sNb(oy3$V@>I!TB1*7Nr;N&?W3(e(xmtovP_(q zythSNnYyp-S~X~gL_GH5PnxBU>9^34;VdDsZl;-FO(O2n)+7Sg;I^C_-|N0m-i<6e z#x8+dy9U$z>qQuzUpM|d2v{|uFzqg@l9kGHjTe|n6Ts8Lq`G{lxZy6xiooHC_ z!I8Zh%e%e*hs2?R3dD=w$Y%y@C}W0f?PR)NIeKhFv~(g`wK}O{ zD(~Js`#x52OPf8WV=Z}Mp!6KWf_EdZzS)h|7Ogc&L-HX3FSidbDv*r~eWQV_;yWK& znM_n{e@4TrbmUj3#5+|)%aC_$1e(ZFN5OwxP_DgR{2`E<7DYo(jf@^3_a_eUo)$DQ<9>ThXmP&Iaq5{e|5`Xe;$eyyNo~>s z5|eADhJ9QIpkQVhsNXA(e%2c3UWWFQV4lIn{g|w7P1>aSz=n0t_sdWle|J1v{J7Qc z-5o~14{#+$Kbd4Mw92Q$e+EYs{^s~2^KB)8qXzN*>Dr>lGN4KOEhW4%tgN;=uaE)oKldVz6aDEQDKBri)PCIX-de0&WC7tm2a z`?_dQp?%WSln%T70^%CN-zi8w4Gwn=*_f8rB0TYwi=}9Pwz$ zcKmC*-`xV6?Xf|!a!R;f>8*y8nsBAgg1T|6Fg2u~FDw_>vS#UOKe37ZoQnFf%>}4n zZsc9Zmeb9%UszfkvFH;Um!BRKAF0T`i=@7H|0V$@qHX$BgRXnlxy-?} zvcEeg!mMh@r{%9LeF(~fKtPQ&cE#Z@l5-&ePekMFoV@^#Q$Xcs&#KPI@PvV=q#NKE zIv+__kZ(|F7$2vPllq{X38+;;Qm3r~xa!7XjXk&5js*AxD=G;i)Z^dMx!A6nwmX06f76^c?Z+6Rs&V zl;m9)O%hM!5iLNG4DCD@dLJUB{+){Sz+0u~juM};dvG|*+224W-Z3Qz=U}(_{l|km z%8R@;@~-NWU(R3Whj9pLwlSjWbH>E9hB?1kH^(HUbD=fxdxr}c#A)Ngz)LAS~PiL#Km-4Edqb?2V-HUX(YRZN5lP+tdy@8Gwzhb@7CRC^LS`0ox|$8 zeqrdD#lfy!3;EonOdZhTPfj_kNfsP7qpQRwPRVRbLEN=p z(`CcrDu2n;rT_MrLyxuK_Nq?ru-fR|A280$Suy)016yKp4smOglfHRNvYyD~bQF}h zMnc+}i!hx}e!sC2C)^Z!}A8p`yp|mVXHkb zXI7XDFN8wSM8!{oxc6$i>+JB%Y_dIANX}uSW(2G%IuyK`fs5C}|32fd+rbmi?&=z` z*E`)Fx=wxR?=WeVMxfLregepfGRfrR2evAbBc?~j2s9?AtpYp~CTQd)j7qtCC zYOq(7s!W=@hKZMS)y~T?&W*(z;^Cih8*}}4w)iCD?p(}3eVldQd$urLOQ*<&&Q$w2 z=>x}>^PhGX75A3re4LI7o$YPKo7o29oe#1WaSf;n@0qSO<2^Rv!VhD#r|{+Mr=7hK zr7M-AlFF!uqH9^=zV%u0=GK%pL{lnvRFT@akF)XE@{P(-pkS&k;*T$VPa5}ym$DO$ zl8@7YnUrz&<=jz}h#UB9MCs%Iq#+3sa@iGcwzdpv(@P6a`TF$hp}bOf8S3LS7Vjk# z8FybcDBOzZ{?UvQ|6Bgk-dW@^`@r&6gGr<=xL!N7y&dO@kk!`p>7-sl^{$YcNAL%# zUgx28+KTKF4#I?cQW6ck9v4kKY->)vns1P4X@hN64yk;xcbkWYhqhhS+wzIWbQWnH zAChD|CMrEQKzLHKYydUt;GIA$oNMLK%HK^hrN-VotL`jxpV}hBxF1}E=^z#y)+)U< zSkqIMPFx04&NbQ-kvb(W9YjBuDMI_Kl(EYO>oDx@n%|9hE9gz)XEPJ8m)T2`dJ9v= z^wtsA7p?0A?OTr6@l0D=6J7Iw@vRgsc(82sr3mKe4cB@+e%yb*Tg#$Va_Xg$(dPR@08m&EwN0RU|7@Iq5YT}&U zLWZ!Q=Ss$+$_#VDxVboP&m#Mr$tCG2ek>aPU}1`uBmbTfN3qcJ+VeB^mOxXV>Lmi?5`ep>{kcY61`>Ls2TtC?fmKc>79XV_gs9<9y(bb(>2%PoBYk-D&~Zv7TVpr-?SI zB8;U(KH1#G8L-tsoJ+`zh6Th~kcrY+AGU8=dw=f5p{Xxi{V|J;A0^AGpzsu8wla|w>o_F4!4y>NX_Z!rF#xk1v>Lb zf00PUCY(7!N3!UWWZTZ0sMOaxwKaEIFMZhl*^!NGdY?5d3Q}f_{V?|JZL|G!h_xTx zi0BCI>}ix)s+L+h5a@E0z7~6XEpd%K|@X?bcyVh`z)da(pOe zMSOCjvVjGDwOumKFU_|m6ljF?dMO2w>^`RB>7tPgU9#$4C|VOx_Uoe3W9loJdA%FW zhu2;Klws^M8sk2=%4GX%`EKZmd}3mqQue$Mi_+HX4?%Kgbpk>s*=IR>$f6Y6wp$~EfafoE3N|01Wb=xEK zn$6o8kxkR@o8`u)&Tw z6%8sNHmQ_jUj>qks%D_gLD7W#(D&fwo8^px9F_JH+_- z0!f_&WSGK}CqV3xlV<2CfWUq#!6_GvYdI{+xC_LU?G_IXqwZ`n>ZXlVH}m}+Z2<;w zkY5Y{)(x1>O^5ll^}-w*zkLf;{}57L|IiLkX2FSI zF;0H~fpViz#(ZN-rksxqB$1XQl|J2xYu!i!(PoLG<~Ui;b=Z_u zK6E^!tm#3VS#T<^^@u4fb?y*cl+J8w&zf_%MNATDR1M z)R+{b9tMd9gUszHmeM^Zu`)At+In#zD~u+XZ4IqV8xNb&^XYl9#Ai1l2)PpRn%GU(wxtum@H!ka#$p&m8JKQjlZlr${a-r zjrg$cbP6>w_2F8vI;Q@PQ`dNKO{gTQ{VCPGGLgU3TF+)vz9Mh3rcD*~lEo*=aq!~f z(%eC0%R9R%tI#QN_HA{v>j_h94d)uI^@h~v3A<3>xe~|14PE8WDLtXX=3N9h>o-Nl zf6GW&Zle`E;*|C8w2eSWEt@U-lTe(hyABtZQ~%KmR^b5m%Cj-9WETUl75DQorD`YV zB|XnL65Y@HElNCx91?q<$CME_9#_Vqtv7K}9u6cK_j*sWmLYX$7~I6yH{W(hDSo8K z7-e_ywhB}Dz`#tHR?C+2t6YVD$p?h#fO?dKyY5x`N)j?(Ss~1F);0~vao^9yqMZY8 z=3=py5?cC(6-KAo^x>`LARvkR`o9#};{Tr9viW<^;dRjR&4-aw4WI7Xz-jS`J+R)* zD_)K*p{E`#Qq@JtFaeP^4E^LKZ2c0c4o> z%Ids56FqlUm4f$k!drp)LMCkifz$s4ja1Rhwi1PMl*&lI>8E7t0RCSN@ z!deehyj!O9e~ih;Ub{Lz<|xELcI4qhT(gkhkz@hvrts$DLD+=T9B|nBM_AqAMk>$P zEsZjn(AlvfnN#!FL1tOrQX2esT&`%`R03hG?9FF)h_IpcL56%D)YRqukK^aj)|3U# zU?xiDaW`{O!?(+;Jv^?cSUhz$FO}K)%B?pbH>!%3n*RX|DFq@srK~3WP`(Kn|c9(nm0`8P9jo9?as8wz5?iR!}QvJkltp8 z+d%fAY{6F=VghctTF5X0HFTpphoSSSkK;=X)vwMKeRzAd+S7)1%Z{hyF^t&Yd6b<^x@^+-HM!7^rUQ`PF1L_dN&44>!_+#PS-%YpRHRfo#`;OQvv+nT7~I|x z#2YTBfcFZ{HU)hKL8XiX1VxD+=5|^AZ@DT>39}I2>v&+g zGnzbw+@lSG6|wrwNA*1(&_14C;4cG_pB_!Gzn`H4ny8K1aT?2{)(BIS+@22ws3NA_ zznJ?ak{l|ewJmwDx9tZuQAsxPig-g2l5AFW{fb}_tlY#zXBjQ*{^Eh+-#p#0Z2`fr z#BADj+N?*610s=vnpP}c^^tN7VVgP4t zGVsF0WHW$YzrBs^2P~B28E>UNl`w38-UTurkz!WbnL#QLAa6gM?%YlbtyA(vNaByf zIq%)PmnamLRdljUyw`c}ACkB;WjRu^k5oV=Nwj!AY#pB0Y5;Ch!-Z;F+jFUq$-a&B z1;g!U{yEv1cTf?oW&+;!+Ytn)m7^0#b<2PAVkT z&T`xsmG%9~s7vWyVo241I(`!Znt;EOGAykOP0f;9>um2!OH4ueAS5L4n=73KwFN@@ zbjc>&s)~cW_w{GPfYsk3ufkt!y2b7w*Slu-&2J3Mdqv~8uQn;g)QI+#jEwz^zIH@w zJ^_*m$}GCWhpEEl%tfC`Nm$^5T!bF?{u7HoBgUP$J*Zb+_0QWNHq_hHcB=ix)*R*f z61(cvvG(9<`uktWN8^5{Ccx(1K|X!kT97!4(lvk!i+{MXZr~$OA*7GgMac=vU+c@( z-fvM{>-1kcj&-MsG3l{SMr<9h=`_kXc?TNV(90H8c`8w&7h=yPF@`;pGotB0D>-a5 zUyrKzZrIs!My@lWXq!FCHFCI~tcVAQap>lTF$|U555gHcW7cIUpZTps<)edy?*AZN z;l(H4_DVAHPZT*S zW%uFHJyY>v3UURVk342qH!O>%-5Qkm*L413x3$XyvK0KlyHGUP3{>7zYo0=Ii}_gpVhYqHRWETKh9v0-vVGBoqW>jtLyQ7gTAwLVAr>L zGmUSa{8yH7CM#(gDU5JUd_MPzlUYktdtZw6-4QTSP_)aL09LsusrO*!K@JZ`bR{jn z374|N_&zXzGW#~2jUAM&Q%JcJ1u$}D@7Y8AbGD2nD~G19)Y=Y$V|SZ`3@XWF`S?!$ zAju=w&lz>C$D8&EP7@PjupOF0Y;<+YbQSQW^l7X!!hLD3!<9N~7NQ)C*?_xL;l7!! zLlk2SVJEMMhx?mA-*q9gmjK}{Qvu}}6Ufeo)n)8etw2T%{4?b!h}C`4TH{`r2;0dGI@53hBUs zXkmH|D1$BnJjV}StB6dvsSBCgwwOOr&14uqCmZKvubw{v@CyDxx>yN%vh=G;s5A*r zy=p1bBuMEuAXjjQEEb~}F>}W1tvFBdb8j^j&RvnwDiG^8wKc-#!=i%su_ERHII8cM zNEtoyT(q_gif@XHxV{H}kH%;Cp=>9yH?h&g{X;vVc3`yD$`bB2)V`$h_ed#oDg4HV z<6C>G1?>AH_fuNnfpB!_@R!D~qANq2E6HnvV?As40y&i2Lyjcpt%x1py){sBaes)@L*eoYn)Gcs$GDT=3`Z5)@4sQw87v$bcD-XO5O%_gq~@9`ek4#Ep<)=@m@#vK z6*`5?V}Hn~@`<${H|bk6r%YI6H;{GR;Edz#K>*fxJe1h&JNXDMpUAeS*GPqzz-|@=ldD6efOteMGtQA6(#)gwZJzNWEO zYV*46-+r%um_0Z3VzC<^i9gg{d&I|R@ueVawc@Ulp*xn5(2$Dx8?%Q*j$&16=leY9D+j)Aw!4Z5^Mj>L+ za)Jx`!K}{#@8ADWfX;g%5+mGf!hYj%scnBIyU%9~u?1%?dq!628Y~k`8HO4Z-Dl^^Y*7M;{Wotl- zPu^CF3kZ^$_z@o(sY=KGi-Psxx3P=RVkJZ8<)|I6LA+d|UwFKXc&Xp5k9@LivqyJw zaNiIeA&Ez`K3Fi2Q5>!D}=jnG>(JYV9e!t>^V^0r+$>we`vHISgz z%zo7+efO?gJ9w!IF&h!218b4B+OmQM+01;)E;iLS(+N0J%dD|b@83!S;`{VBbNW0^7m0NLkh;UF~>&Syk|k3wfOf2u106X3@t_@u|>DrWB}8d zzH3H|{JU%U8=Yx7zt2DwlaXPV>yVu8Z9P28iy;R#EaJHVgej9AHEY1gRqe5Dq>v$@ zof^`}=+sX!fBXtvfOm!j=oD+>)1)p$GF-mNdy_O}*S?#x<%FK*Y*!ORk>cy-V)#yr zs|F;6(W8*yUQEqmyY>2!ItLCoS;6$|ov0Aw?-~RK{=&wo#}i7I?d*fokS8V#BT}e? zf{da8oECFRUJ-5;M`fDunG~N=d*#+4rCo=jCrSbXar;i;{AsVB_i=1Rb>J77rK1-w zuIfeC;-tyEBhRGrr)5>=-v*#0B<^p8?Dvt8G)!EaOqOsPyGVU{d5a-Zjc?z{-Tqo& zJ1)=?dS+38&&4-UYQ_`nUvegWAuluzw&-^jrDqxlFXk(aJ1qDmyz_wp!e$1(d7S(A z1+j_#Hb10yikO+CGIU_+ha}uy`5|Ky(ipSl+_hZDL$RE-v)OFrCVuKnP{$yYN9+}U z?*qMgclawobiCtvFX;xXTSh7~*f;Y=b_rQAvHkd?@QI;Lk4hT8b-XmQ!`rGm%O;nO zF54lyOFF4Y>L>NHvcW2$2Lh}E7;9KDmNIpY-a zecL+V+i%KZK&%*Z<^~vn6g9>1rIb~DJd!%=^I|zp`irILTmvBvpfb6>16T^v+WF3I z4=h?6d*CK!lum!+bN;dRQ2m-V~CyMs6H$x zIMBpwDABzB2_qyfBpJs0Sk&^R38*|H-YGZ0gazV9C78*it3k13#`=LJ z)`#3iL-`<7kSo|a_7r|&t~Nt2EGiR*ezu@Mac^SUJ$4SDyA|N7a4~RGdq;&&B!K;{ zYwpC}2(^#ofZTT8o}?(h*CqBtT^ql z<)0q~fr8%^P~$dNvazDHPI})LFUoLrdl4rp9crd%dkTa^_;y#g zIT~U4x2-%cDaa#g3Fr{WyjKSasJIPvEvY0LX1>x8a4;^HTA(;izTf=oC|RQZgVc|J z{hzHa(OGy!mQFd)BP?FoJHj6EATUmkL(lY8{|g7zW}+`YdF;PGaf||OT+_ju=KSuP{C^1D?In8S5`(f4(7zoy-3*-3khMf-kmxxjBN`KOglWR;cYxG)s zi23hh)%MWWy|ElE13p+=K2oWUx0NV6I^Vni?Ku7_=jW)3uf18FuS{4Fx$Xjbg}&&% zPaULmf78yFm!tkJQ}wM<+*o|P`8)YUT{$mX-{-;fYi$aZg4@3I6pr@y-ypl4GxKJn zL44H*XYV!+_nWu)gYEQ>d?sesTwUhdG)zJ?$g2SZIo4TgSrkBI@_VJF89o6rDuOt! z1p16Tj}p2_A=8YUZ<-fC+>Iyv(!m#cGp@%cmRG&gCh#`RF!X1(d^_pvlMwJ~TM1ud zb^1i49@8wTCDip|<~43MhpAKzZ)GONr=_6KY^0ZMKl>D+RRcUc$jdb>wIz1`BW~&( z6G+x0a!O=p%2H~LSWPK`d{|BfFYJFna-NriSBt^5ownT7SQ^*U*KN%&yP8TVX@ zZSv0=x_OS7O&S5os%t|0cpO9N$;$ue@Uh5zo{P;JQExJH+?h{wc1#D~7luFEUQI0@S$ zTt0bFnQa1vUmFjR2HIywn!?6+li~T#)5{@fd%vtTi6xKrUN+C@YJ!z>C8oG?o`lA& z9V-sT`}d>^WB2<#-UKbtc_(x>%k&*n$W=k#I`vW= zDWr>d;rlP*jo;beZAb!~YR-mjVi&NtC16Fq%T6ogceIifbYT_ZKl8Wcs1X=mrWOB$ z?S$hWBo-a<#KlK=_3C{w9L4y{=C@+8x9NW5UcY1D`?u`YJA%Wt@5sGUoYc9L$+qxiX=RKGrptpC&J`wrsTxVd2e4ZEE z{wO~x81KH}yW{bhhGQBDZe;f1Kp8-rUWV4jeY2^?0?N3|Rxy#dZB`Tl{|H3eu#3C| zG&;^t%Aj?X^^I^NR5sZ9lfu>dNJ1-V;ifMq$<*r58l)0s(M2q*n|NeqXWewu=R7q4 zvrA?mZY(U`bM>}`qC~$u+kEP0uUwPj5p~oRBr7I6{o3%*!%yqJ+B5O-Gg(+HJAz0$ zD0;u^>1^wsRQs2fvoj(>$Hnw))>YN$-`BG6^BhcV=vxjg{;yQ~TTD!I%$)E>acEX> zWbIaxFb5U^mN_X!$tbZN^F|6h-EI<*>Nb@2WpTcs5;p>+uw}v)pYr{=*xQ-~?-L3+ zlVWeL-N=O7mLBOxakotC-}j;1@Ka^%a{roY0$s3to92$MKw@(* zq83_d&}rwKTS>lU#-Z<(jL_c=By`zeB*HJrMDxA4L_naigm}^aDNkRA?Y-f z_%0TbRfso={lxAewl3Kf4`IS`K2;a-A0nrw{*u#}+FPe-=#e93=3F}e%UOwlaD4v9 zwS?A^#VhzLa+_kCx|hu^E?4+V8trY(-4G()T*7s0I`D?2wGXfR(j3``)bYarjE z3PLGpq*5AI&Nel?^#rysW-X`ff%Dwtkn>T!<8#)a9;Pa8UNo0v+Dg_lPy~YX7ud`X zs-BI!8XlmJDz|-lB{h;niq)3LTy#G`GPAeUP+VRygSe7Ye$OcF(O{G#dI~%3L&p%I zW#!hVl?hwxNQl(yL(-v{&W{2vBjdx|CLOnPrewruYtBjn?I!_ynb|@3e!JG0gltXLhT6kRA^_C=KLR|K%K_gDElX( z02wEu88D)7hsNv{Ikw#@SLZK=fJ2)LX_=ngA4&S1ec)UzWSQR1Jf&{0c3@*QsPMNx00nrivh_nA zQJt^#n(5q#zF_3%g3BvqQ)p`&?6tLh?65q&UAesR0!yU)*WWxVVA+!1`zS}Ztxp|K z^LkE>iRCZJ{VG=~Vuz^ZEIY2^(&-a&77OckHeFVZzH#>f)mj&!`{#h{ZNaQ1MZx~7 z+UglfvOJLi1(O5L7)i&uZNc`XBej+kmL{*DxNI3d!BI*$WxN;G&V1DqkuQqrY}^yR zWyNm$eWrLU3fj&=i_b~M_&npihj)k$s=xcdAEcLsf&9k9^A}39K?fLDkHjo!nuxI= zJg^FVZGXpPf#kA+n0YVP(Jqf?5b%Zwsk1@*%?BxR)>ns!@V1E*xe`BOhyv!UohA?{ z=F0|UNFRC4W7E~d9OYgR5M4Vgr?Cfp4gb^1_6O!VLh31G$1lukJf$cCtaR&?UIQ*K6H2Pefo*?po%FT*wJgPWq(%i4P&ud-wS` zw2;{#_}#Ht2e%=+OKk|L=;o9DKT#$Rnk^BKe=!WJ9>C-CDKkrWKG{2;H8<7D^e1~0 zKSHtdaiW0Y^U5Pfg6^*T3HBQ+dxB|nvngqyojsxWqey3Yqfb@XnjT|J`z2nTMgvBu z|L*Iv`S;|*>{HpdmAv11HzCo({ zPWuPRSLqF(zBCr!%LQ1To&JQ?Z`L5bn0j7e5))FFlDyB$E~7CayR&QpuF_!#&xb%{ zCJ*!$H8ezraxy!~CgePgAN$u?Ar(hl!8oxd%%UTLrn2rMCm*+669WOo`>ZXZPw$4+ z7B}I?r^;x|qcV#V&GbE#ao>vCUOQZMMCa_e+G(hc&CspoI1; z?X%|;Z-w*s2B)S2?U=`bz2)^HYBYyapH%q9JHnjRE!p~TQ?W1dCbTl58R{oL4Utdo zB< zgPR{zUG(`0FkY~o>CqVKXCLWvI>i*ZTRa`TJBjcK6sRQwhgn8OCY0Ji+{ibof4l!5 zxwtbm*GsknzSFSX@svP)PgR$c#he8D7;PmsatxJn_vw|Q&+r!Q~n5ZQ=qh#@ms;KyQ+>=go0zg~}tZ}DO1{-leI z85h5JkOuhZ*h5|vfsSo3MX;+!8=Hw{(~Qy$nJ|rg&zAaw!c=?}=($8@8Hv@GD9o6I zev!4;80@^^GX=!+Cj#Wr8Fs8bwePhDLcuauO-X31PfI41?Y(H(3x zLYH+{UAUe=+;J`-s2%PAaou$~L}lj|sQ6t20qH1>y*=_&EF_9u=|eWSFKU7qquG7d zqfPwN%>6`4M@?(YKy&*V@JqBREw!a1WBwox3`KT6rovh5em@HkP%wY zs3^$D$p6Y?;?e#sj(LhGi;2L$B~-th&~%P*t~&fz_8D26_UScm5YyHBd(y{F=tAmG3Eu2NY^|IOEK2W_${)5_a^lq5K)vv3x_ zyxG1nPS(+5%{=F$x4rr-05-`2o^lNIWnRmFegD#EiWil1XD4)s&B8?0EfA7<^nQth zz<6`5#%4HvB>3ppar-keg%3x9I@#!yZFVn$%<}KvuW1_AASc&*amarWI{hjIJse`^ z`|K;oF!_!^=rK#X=y;lS!Y+?_%M^(?_b53aZFb6#Wv|1=`--+mazK@AG~aj3g;Mar zizQfAO|Rukie^2lOeO<)ZTPCvrw2WDj^}Gk3MBd%EdnKxAGCe#c{%oJ$+kDyL-9bOgVBy`1mv7;9aRa3sRkL9@(bt64L?X)9gMyA-0eek_B z$4vIw7d_OZO-M4r ztUf3it^eQOGB~DyYYKn-4aTJ}pYM^Ut6O%eoJpNv3ro?h2RlrorPO?un{NgnIvMm~ z8$|o_a5DUhhTwwmA~G1w8I?(P4U?xP2T4C7_t|s>tcm-6OgXmA_{!If(XTvN3V`T0 zT#OU~8{stA5bT?Q7ZBUF+;D@by*EyEi)ct{Y(rnoRXR%rmo#UXimT)W1oOYXzIi(5 z915nN6cpR|%JM0TWNz(|o(t@&qn@?-#QFr41K}-B(CY_cY<+vsmwu7wuf8V!{0m~J z(gDq611Uf7OYNy(Lv=C&$j4vFn*%ZczQZhjrf6P*cw>Htoq0v$fQOldp(`%ZK~4WY zTD2nhSE#q8aK(_4F`~cO$Vv|M;FHlplA0+ofme38!6cOgZ7uW#Dd8$yD&=yEk7UT@ z)AA1AuuNf2NB>YH1;qhmzFthFdPlKLfRnoDMG)6#v*5G4*T|nIb#6YMCS9)-qxzQb zK_TNkvGkdTiXtrOHwzJ34!_R%s7x5fk5U+inF`DecN$lc2`N~@+S{Qm*LCaUM}4%| zHbbkyKl9Jb+%V37n+?|2s0RMny=3Sj5o#EpYrj@QwcHd7Rin9!`a7KEuyTj*`DjyLc~F$-mU2x z=g&uv)ssrJcrGi*?bx%@ey?&}&S85L)I{prV>&|fCT$=#2dwGOFN(Fi<0jvFuNg{z z6V6$;OHT>Aw+VHF7a@4Apns$HKO;-&m^N}$-&?&PUERcyQ-p9ST9jwuqB0qxg%gAg! z(4lpgFP&+p_idketBjq`f7{ty`3s^$v>(>mgWd3VWW&oGc%qH21)Igbls7zN{185E zwl%aLvor87C-!hoD zhwaOhsZA5Bf=vU-gY zU6Uyw9u2+6Z)u&7i>95}w6DjPoS)#;9L_`}rpQ+Re1a;p2f=~^VY78`4h+9Q(uA{n7 zZ=Z(tU#S?jNN#)!jQE0H{;*AjFoa!5j$?KRe^VPKhNPrTKS5WlQLJ*_7!!;4>&7*~ ze!%Ut+{@s%7ALIEGbg0pkr@>)8{toX%l#Nf1$CH#brtY5*Nl{ber50x_$ox;B#U_8 zGz=VRT_Zi<_zvq~NB1NtwZh4`+pZ5pOOZ;>co?=}luzw&xQmVq8AEDKfeZ)m+M#NW z+=3}J4-T*R+t6kLSDYE0Z_|F%dCStR^?Ml@_I3QTcu$L76J+vjydNd1Uk1_wLj2fz zhDi|>z8FjRkD7c?;Fs#6kEk>yoBoVbXoU^T3VJ~mPIX5@ymahyj_rWtdbu=nhZkE< z+wb2pzLejL(qr~CTb!+b=uG7QTCPg`$v?e7MY0b(GDVPBW6=}wK~|k73^evxdA8P? zd(SW`<^JMl%Hr|C^z$bI33qibUU4clum*}LBB~>IpG6Q!S#M*&{iw?;ce{0%qd+PVGdT|-BaC`4N#zo!>u@af#0 z@nCD%J)9AT367&H4D@T@;^TGO_O=bmlv_(n~Z zcF=XAoH-_9wy%f83Cw$iCZ$R`W62YDr7cB{GA7B)Q*s=VXZezofa*_5^xiyhf`V; zIVLmA46kyc*qU6t36rJ%cj_ZJbCoaT|IX&Gf&!4+^H&^*i6kg@zLa?kvL~hCsFq_innI`8QU5lRODX2SOnN8cuNvKY=<8k)nUo; z&d3ks_{o`b(sEn~VF!juE;1TVEh5B{{CE;}x=NlU?yQv~sS_ zyr3te&ZA<`|&>((+z3?eO$@uA(hMEh@w6G>X+n1 zLGr;;vIT^2 zm8N%Vyr9z&hHq#zo)EPva4Ys|VwI+N&{Y)LJ$kGZwfB~v2zvC`Ta1O@cmKwEujun? z(m?JE=EV|UuAzz+^tLA*2}4`5mb&kO&?oBl@>HzOMhc^;pF0O_tBRXCnii4Jv(^{L zgT~>veO|<@_*OPd!xVBmqtxK2m!C~_be~aK?9mDSf~d6T2Rpp>_citxh>uM&N<=eR zxyqL?TcRxV|NxIBxLr)cDfy>Ej&!qsiVX{)D`4>6xZ|jYobVK z%1rJ|?a$uEXHunZ{NT2vw!)G^8;o9};C;%nrdzpi`cmXw7j6IhEE{^bwiJ9F)54bxHNHxg;Ga(8&3j$QomB#NbT z{qPqABrUyG2t-WfUl4797~y28O>3bR`G!gwNd9w`9zzerD}jGQoF}h8(5=vw5z^1t zzg(L$2>FmUm)hkYqa(Kl&Vdl=5g{ss)G!c_=p$K}7)=I- z%-2SbR4)h#$tLM(1|W29$`Zc#vvh;CQ6lvULW=PZjQ$09VNEB#K|~~meJ;Pr=gz<@ zTbEAfafyI|)RyO1Jm1*f*CZ%L{WxIWVLqqni`kp_XbJTOw}c%l29blr5>INch5o9( zY)Xn0+;m-Y-+8Gc(nxeYy=DIN7mim+xx1|jNJ-GS%X`s0W*+8ZOLW64R@ObW(V*PM zi`Nm7}3qC;zfktt>>1wFo0q+ zpWLU%-pjlq*nD;e;=3$`zaZ=j^I%Z5d5+^&G-7Zq_3SXdLWa*j4rQ?3DwExqw)POH zM9TPM2W)-}v)X8LHxQr@k?^FDlGaS{;~kkS`k}6HPmL&JQ{U~zbBJFQ zmwHimWw)q7eU5*2&M)%dJL?7a0k~IYwMJ@da0a z`A<6NTZ&#yWx;7Ee04t=x4fQaIN7f<$q1~jZn zv-N&u|GcP#t~H--Yi;u(|24jdcmOQ+{)0>VIpE6|7*}pe)qgFs_0KSM z{^Xud5UGW%stlUa!<5Hf(Tn%XzfIpxdSshIuRQKTAIMG%KjbW z0r!ZMr=*=sMM}G)`F+%agNH`6!+7LDg9Op{IAi*d7NY>LF)}HDSARCm?=~WD*w;kl zR72~g<@GITM4bYo=$7@88N!;|sl?%`Z3+sz=supUYi#=%=_rpl?c7vIAwp zHf-IW=Bw9IYpeQ-QEF7g*(dum5mT> zhD@xC1OKkwAA-jc6$ue|lFQLd&wR}se22D%kqTd$K()sS-SLG1d54$K)}`u*5r$?H zVG{(rA@*Gfpqgi7j+B|y+w00$P>a+TXQ=3GzOSq>F&k^tzKdfKPIqznnF%?XpYHh~ z0kiqU#^!W^yv|)OLC3FvIvN6M%8GEGu!F<)DU`R>()W~g5JKn4BYob}e9k~@as+HT zM44R!{&TPXPL3K;uw<{ex}aZh)+8KNlEwagSI!t6rT67uEj#Q#S3-}9cx3rHJROv=?k!S_~BDY zzOjU|i`TCY4ZY17+th13zRDpoo5uL>iH~EJUGpE&hATYSQSskL!r;y`CFDAqWW(_W z4A2q{h49snKg;TY>~?SVDZ(-fs+@^u3vEV%Xdig5h(&Fgvx^3c6(AkD32 z$m*Ft`DCOM_1;jxrcZTtbAD?=H}!D|m*k&zMmjuR)M}INilAUuBtyNzMXtVjR0_VQ z?4j2>{c746vw6d)VrBOv2Tr5bJ&_+2Q~t`oL%!hZ4B~KcM7IVVUottA`Sz~v;7vj; z@26PlNCkHP^6^U7sUm%Hs3|c7{rl9H$9rDj}3x#?MEojGL89vI zoEs{fuF%A$hjS5+9+kcP16`^@Xef@eU;oFm1I`}aeVFTzh92zO$8=o3ufPDT_6cQ` zA?LMrS}QNc`ZMLlt?+umBm!uU{ih=&cw? zz}Zqv`d|YAx0mw%chWzPA_qeM;@q}2z%bOD{O(eD4Neu>h%JhYj=peVC-*`IK_|l) zeepVakT`}3d_76%LWb&0`(UJmq#+2_oDaR0_WoAS*zIgz! zg@-uck=-JC6yGrtD;5J=64_@M#zenNPJ~8t$fYIkIz7msg%=Y=x|uOLFMr zllTqX8%UBIZSE3~YtD?zEqNqkq=#n18K;!C&It6Upn_Ah!X2rfMQ2#ya8P>T>WONq z;|kk@AOinGK!#KcU1nAM&~5c31_g0z%VYcY2}eAic%)jldhei;ri z`PId`bljO?rIub7fZp%<{I5 z2-1MnzXsV-QYkg-zJY5>>2tI#xrwrQbk!hkO*bR!_IAy6BP`4SCtZ1%z=4$C*ot&QBJcQA&zEe+eDWyDisC#CeXd zR3;UxqOe+~MUV0TBLznp#6#6)eJ!?aEs55$$( zBS6haoDYWn3g3o;x8s{Jh9ciX;D@%`_KIE(qoYPd!_l8ot-?fj9y<>$)0cmY;&-^~WrCtp=i`^LNqkwr&E|$>vd2kR%j>YA?1odC zr{rA9WzR0l$hJ+(^(Ol~V&|Ryslge$Z+ca0(YjT&wg`}(Rda5KSem)M*E@(x9gegq z+Q_Ql`0^=x!7AX*2-}sD*MAqgclgpNV^|?4;DY^z(d>KDnxTK7{lB>R9*iOv9_wxn zT87%@g?SjMjl1+#UkTTUhm5?T=JWanpzhF%Fx@Q?)oKk2$;5SVI+2ansPkW;(vb%O ziwQeBYP;J-kku77Yau5FhnLU5h$PEQR$#yJ3ql72;pT0UV8;vxi#*N0ZYI zc>G=bA>4lG?0AA=Xgtxzg9gG6A_AH18mGmncxl%sxWWil)kDG|4LJ7uPZ^wTQeZi1 z<0)X=;7ngqxkM*B%y8D#g=o<|@h=Ed6dzc8%Ol%s97Ar1+Hsf1E2cfs7*wZj8_^Bj z)s|rZfTFPhc*M8LkA{`gT>U+<_vkYRZjf2jbGSj0VfBc0!DQ?e8L8@|TCHgYiaaGG zH=6syDY%iLI05g97*mm8daXH3xJK;mL*l;~VZ%_~N^CuwLTNSw$4VCnv3_cc(o(zV zDH>U+O=n`I;1(sn?j+&VJ4=<)XvC*U?$!(LHYXQ2Py&SQyR{IC7mq*LwuZS7ivw zsvM=u7ng=90DWd@At`3*`fAq=Rk8WZpoItV@-glxb;)XQFqfBe@!??-=++6rF101a3*j5C(&}+t5b^F^$=&de^rnrkKBf~SOl9Qc+qb| zFEiv{ z1lQxnL}*9dvRX4{Jg*_XrP*m%NOB5;le*P({Ii=xmhTG%->i)B=fpZNH_rCK)a{jK z&mS+`U3~41>7{2sjn?EoAAx?n_-xb$`{*&cThj$N4h zBwf7fg>!OQ_?8q?6JMt2p<`(hm3sd$7F?+sCgr6~DSO|%zWnE%JSr0pxI>XFDflji zuM>-PAY@Bz3~o(e(O(b^JQf;-4#QIvI(H^<0>I+&pGcBe-Dh*=Th6#BdF~>;J zPmInr_ibHYE)HrRo1J0)c{IAYQkzWrI0;H+)KEx3u))pe?i1aI)XwE0)67$ zCHqgMpm=Cj3|1yR6>O&W-u&YO5ueBv;(}hp!bH6-Kq6d`E}9;7_goT?W)rZ_Q&gU$ zaHS*iRXho1&P4EqxS^0}0u(Y7+~6Le-Tq?9dhLx!y_^_@RE(ot!aj1RvkE%n8Unr#UeIDTR;$zlxay&jGHC{S)Iyp>TVp2G~h z>!mAJA#**GrDN?6y{+QNs9KHo95d7*xNkHRpQRciStL^I`3dx^{i;qYj}uCN&DWe8 zj%qu>jTe7Q`IMuHuE@FLCMt_A8uvWiECsFU;+sV`+qL3;#?P&WU(4bZX&eOLda&%z zwpG47BO5zpG&1~lix!KpHd9hAr?d42U&@xWT^xIQoYtju>YceZo3;?w{Z)>0lht=b zza+1ji0s;YQ*`{n?Y}9FvUyI+Jwp7u-Wzl1^6oZE9F&!xs#5`32G$?Pghx8EaJ}mn zCnGmCrd)?NYM|b3xFkfY3B}=q6+XGuh7_FIkI#E}Zdpug=r&O2yWH-|Mp-&x0*x#1 zHAn*w+%YT)pM==e2+~49^Ag>Vx^fW9E7? z{N1#tYCoDowBcu4*VWH*z}d+kzAtiDl9NFB(v_fr!I`%oJr8@!rm`SlL7z0L!;nVe zt|0tE)9}y*aeu814oG}&9d94Dx&_NZV$cG`k&n%W)^faX~= z%iX@|{1pfj^8&+YHxPWnk?Kd_m}#UVj;fuuvBC8Ny2IKEI?$)6m{TvLwB;zi&l6D_ zE|P=f^WYjsX-%ESk;=CQojRA-Dgo{M9pQFG9jj72@yL?xUFWF0EBw1=xf(9Uc~s+Oy-oP}=eu^sD+$9Mh1n(SpGF>Q=J z&f!$1H-4TIu307$)!99@)Oo3Tn8&<}3r%!C9kB#e+pX(R3CUa~Q*m{su(`Je4b`R| z300hM23TUD`AzvQ4{M;*RX#MB4G>+2d@W3ZgP;|X?&&&&e?oAO zJ-Jf3^O@aoLxtNt^|&4Likb2eA1~b)C~JEFc;XwOxn`$vr^kPCaz|>yLPj=kl9BSt zY@N#I@5PpG^2~N37${w`poNxySRsr9JN}k|hb{MuD(yD~8895+T7E z!-!iU5ILWj?c2;Ic#+N5n{f4OLY0F{YUAzFH-hV$X@{6Q%==bBi&p$b?I&k;U$b-m zT-3TDIe)fW;1bv_*5~Ta{xX=s}b&D{cYn6HKz>zbs zeNjm^Jk_N$+_j=I;3W2UMyz*Rzz-I>1qoA%I}(U?E`2(bBsq8@+Y^*+Pg)b)Ji6{- z3@K0OJ)tj8rr5l>&Ee`r66Q?Wmx6cC*7@8>$SO3|o{>rgnpKL;(gl5P39I9=Z`K*04 zSzk-<4a>}Fj0MLtrfc<=yEwbBNkne%+Z1Wfvc1>i*wVY#`N4OKGybB+riXWN%YO9LV7JY86E0u*JxB#R z4gn03JTVi_dEf=xL~_y14R0L%kM+-LF4pd!KA*6!OI|qXjOht^Nnm8q`5= zcNTX^s~zRc1-6@~>RMwIqPMO;ut1B7#S8ZhsbZtx=ZjP+gI(j+R6BN8g2=4pwY1oB zEp__ds(SUnrJf>5nJ#fs6RIQ~axlO^rtDG;0SU1X7g#+=b%3Yk_^aSSK+FZNU7dvE zMG^9{xrd^vMq3m~7 z3x2KU5uzu~;hnKztb@dJ&&r6~>93aE+N0og`Ct9TP+e#3EFSup9mi|JRkQ!$g(m?Q zCWMKIKum+@OU7u9QtTbu9#z^Ncgd@W)@IKW2$iD7WgIE_vVI~4!BvzXor!_XlDSCn znYAgqK%Ybsd&l(=#Tw^_uwZqKjWZB=1uWyx1|C#V?W18m06*OVupm{i+-lCV(8+W-0qaX<095cH|A z^SWG_15W+;i!cRb!8`W9Poe)%#s3i~VOmcgcbf)S49H${9J}3*L>qgq&WAAu2%vIU=m}K`9W6?_= zTfj~Ou>#Km$$v;N^iP~=jIB~XKs28#{r>O}7_OhTHP@p>E}p7BccJKrj^l6Nar*t2 z5E#;y&j_nF`xRy3I)IsglQa0`*(>Pc9TMrUte@X zVlJuP_c^t_y(UaQY?Egjf0?Z61@tn(pcshA=czr{HrPiCTK9WosXiY+91+6BsmPu! zE;>8dt;}+NTCBY=+UfmAAku=V!8lt@FS5qc#)`XWvS(;H$p~?Yjn)56qwexhBuX=) z!S#BCtbhcQw@tgnX#?>>sp&6>4^W|^D?i_{KTFSS4aYr4Vc5}|M2u5cr!RJ#)mkjN zcaD+5P&BBk(~Dj|=47R>*VZ_Jaz3Rb2)r!l3o@!%6qux)0zRQTQ>>?bn1EKRy6j6@0VO{$+8NGhD5 zzL<7)1{)EU?V+WU6oVmH+jyxeIwn&b9=7Eo>rW@rh-G^TmFJrL(YPG>l4Pyv1y~?zK$cyb@kjsgofSX{Y|kMkB+F&ho9ESh$GjG- zSaUw5-lOEG=IpKi55)?W(AnWH9_moF2eND`7P!CwJ#2vYVPTwLz{w~Zgj}X3M%>Pn zy0MT@Z*I!izzSlUnZ?{1D`&7<3A2EzA&x4?m9KqPKd-#;9sAf~$9;myuLO6sXiY>Q z_a^3!XX?9l7pm#~eRwipeHgK|K3WFmOrxx>bS_$x+{ZXM{32hmUNM$~Z7FO`KCm64 zMUEvsVDsNCb-Yk?5`y{!1bSu0Bl6f*7jbHTuWC%i0juAXJLNP~C01s9PUTV>+w+RE zA*-qm&A9NEn5zxqIrs(40*%!0uSl25zicm~22$koE^y(CmXb9dM{OxLe~(3in!_}( za)o&XV*^l>YzQj#5Z3+Ad!95o zb(Of|CZ_+RQZqXjqCBjTZEpY}qF-ZV~wX3*sEJT-AwwE{4_7T{Qke@h+O_sn{uHEIU+K-3bKX5!^EW~oR_;FT3OqNdo zz&8*#E~foc@M}M=r?$(0pFS{rvqEUK8{<|rqp}#@Q-=)jR>ny$h&^H6c7e@9>MNqu z#2n3LVhmha0vTbM4-RMn%d44=usAwR%`Vixh~w{xLV9@E*6|03do zp}$1~KzFrjy~WW&)s$z$QD+9b37-x~bze?+U2&>OIguFFXJk&6YAlyc$KSU9&cufV zC=szs+Dwtnr_KtNm^kw&AbX_%6!FJICQaqYzK3W&8cFN&_(B|x|dG+ zLl!MNyTdIgG43Dl_RxlzKG_^wSj$R3w4a_Me4bihUsbt_L1tbD@pHhJBAekTG@k5g zWfbC3b+l;?yDHWQtWke)N7@klFfR)lxr%mB803Fz`vXMw_PgXBqouK>nJR!*c1%`r z#PVMm7OrP-?YY~Oyn%i}=mCL?P5YpFD*qxz3V4#Jk>%4~{uwm&!0bTVdd6 zLOYx_@d7PUktrg@2@g{asOztmPU_Ym&7X2ssMC{(Z_q1_zR%mCq{(WR&hiZ@AqUeD z&$W#DarIZ0Utm8mYJmTe)QhCm>X%#-w8>9}o_lfc&$MSkn-}bmgG6aO+Cz+A3y$Ij z`Ypa)BrjbN$OA+tYT11RXzH(*;~#-~(D~fv+@whNQs5%!cdY z?r>k3oQ0Px1l)ne{t#GbwM2j+I*N(0hrSyCfBgr-28I|jy7N4H=-248>n`h}3>ggN z{45zb?>N4Ej90hKgE!qDRx_`*s4=p#Mo|(j9mx4nf)p!)EV)&PY3#5AYyx3+g}d); z<=YH);oS3R^$a&B;p*tL;xHRTD$cr`K#f~5@mW3{ga-HChdFi)fwrmAt9HQb8^i|) z_lx(8+Fz|*>@q8ZJ(tAHp%EgU&%y*4A61X%q;a)_beVZqOUm@;0nJvbvn4RCEvH#h z;v390;3i?_Um#4kc`L9rnGExGG1*X5AJLq?rI2cBbFVn=k7^Rb7fqK=g=h`=ULjX4 z6TyvY4P7I}u3j*zjeq$T%x7)cMK>{Ak-jMgKwoEooS>kp4a5%Bl>bb4F(XE)Rln-x z|5mKAa*plew(%j|*e~GhS}5|L1oSIZj5GJp1&f`3nLdAzF41Fq4ZCpW0qdnjVMmai z!;0q1Zu5ra0*tuF84_@6YVvN!V*e0d`v-1h&s2MwzQuTGzBMDddU67~7PfnM>-ug9 zH6Vfy`boXh(oz4Y(^8M4MGc-{YgTEZdI6Bw#e3ei^@K?SyK-4K@Tg57c+=D;vpDqX zPX3fC#k#yJO8UG>(V>2~Xk2Mrk7L~D`;a~nURi_c$mXg)F@$*NC$4JZwNuReR$8D= zFgM((0M(zV7Igz1b1z)|Fd-<1KDgDrvFQ07pq)-+K;nXPl(p7Cr>|l-Ro5+mWz^ir z#N{iIU4Vx=fe-3n5g!Q3YXU=a@o`h^8cXFS#KK@+lLN?F3l{IH>O4E(s7-F-D+=uKtZh3+a0hXJgs8hJ(YH-I>7c6y2_1esz zq>9Bvx_a56X?#^#Q*~dkF+bqS5wq`*3A1p;K<01#gC_qLd7_dc#q4S!hFiX$(e8 zyZ8bhad@_))4 z$K_{poOD0AV{<$3APe2mFj-AR{|my}V&QwjmK9Gb=6Aov9I!fBAd+X)@xzzm+3xz4 z$5hX>Ip|0qE9mZ1jjF5}ZjaI-u^nh6Ejz;=5=Yq4tVF%x$5cn?b&K;FlPJiA6FCQd zkMt-aj6TUz0%z79>c*F;w>{v64P2MVs_kL$n)q-r2mj zu{MlhM-)fkj}1*k;VOI!HaXd-yP}!J-!$Dbh)j1j zl~$vhoIWqJB`Y>v#&9%Ox2mJMx6ihGPTK6XHoLj05G z2e?>%obSp_%{}6L*6)ct73RnmZ5Ltfk$a56Wg#aLqarb@9uGe@48Vn88g?Iz{(vyB zQAO9A0Jws&UY6cNg-S#Z0|~x6Epa_YFmsW-@ zh&5_T9-`^g=!bxCmM>HBX`Frq>(<%P&Lr@G5XB4ZbS|BxlK^!U@p3Yd=xUuEdFMZ< z`fvZ<2dq$fdP@#e-=0H$kJ*pXWFEls@_C-7?d4F=`!7AGlF0xQcJ?x{#=v25`C?sn z6ESOGjP5Cl@FAD}5Iq)DkR9_E@vx+F_17s&3PirvS^*_@n>)Wu=z=KQ!>(81!HKA7 z>)ltG>I9~%4XyMh14GJ$k3@`K>=YjwFAo)o&i(H3`NQoOlPOm4MAZ_Qz7ASDIQSIn zx=d@9zd_jjvw;Ww*4b><1P-B%f+|2$pm#75Ap?o>&?eiZ+zs4_!&8`(qh+}EUil|W zcZHY-_RJV{3!ky;tKd5jFS$*;nrKDksz`i{L&%s&+djXpE{9wN)pv)EWqyWLTKSqd z7e}ziK1!L?kx{MztV7JzvOYzuT6n7%4&sdfdQ9K9gL}C_m=o~`{jz`_fR~M`7&cyv zZI_U0($0{u4$c#+70J5T@H)V4WBIUg;zf*TT_eZ)3C*w$YZm116KlOG6Enw_+cdg# z8uzBizLs94Y*29A5!4Qw-kb7?*o1zqk)Yfhrcdg>%-*?IlYxi-kM`L3DAKiEA7d8| z6=I$IZc{G*AfO%lW7dLc$ejn!*j+Cx(p2Ynt_XGJ_asTA>E<}Rt{q# z9AA;NMh{DOeM6Um38fvg2nTcInU_IhiX>bsM;BV}0?kRaUVwhB{aJ+kLvSjzbxO*@ zw~rJ!bfUdr;DBCJ&kftVFxoeyPIg1Qa}Ac&@4hL~FXZnE{%b1uzwmD30q_eF8|-}5 z9MC)MVQaRtM)FpR*1-^3>sstLFtTh0FMW=oKw3S_vyMs-eCaSD| z4}i1hpz3$xxhGtt{s3(ao>bF+4W;o*dTH3;0&3JeKxi%)t(kkRFJRvW>hv&;rIR6L zMmQC%V2g4C(QpG5u6Kj)>~C0J@(bWTn{k`;mZn*V6 z9$~N$Ms8BG9mZ$RN6&i+90lU~M39cP7NK#`>&sgaE9BZ7*{13ADGaPvNahfEbEB-O zn$q5Pbl84F&8iuwKwdZ&I}g@`YF{|RaIRD3KflYST;``1SwEpy?dMz3%NPjLYtk`^ z6NBk52R#Y-{D}vv&w1r{Js$&Fp;xAxs^rlvba`7aX7Ab=Rv>ZlyA@N~r5;&1iA;~G zh}}2gW+Y`>lfTjz%36M&7khd zssAqsj?)}UFd$acw}8AwCOxJVy52z(QR-$9^Bb*a}Vq$;agc%F8G4d$wMf zW{x|LguGiIj6^DwlY@nY!^~s@RxykvN(%%}pEc6eqy=KfnoFvIc)iyyTJ+4Tb=@LM z*2R}0Sa@75$Bc?4=J}1M=2>n!epAhlyQ%J_%XM9^++a~HJ3{UNxG=|;L51QR7eL|k z$JaLI%Hn{=AhrdjB(of0dtMzEsBgl|KB~(QwC#mh8R!hdL@GU2de(`okjkqcFzCPb zYGGI=r1%$c6~J~?71hAXKG##S|H$zExex!5tZ@gbs^gI;0=73|O`4~O%y=9r3A1;a z;=Yxn>PSajZ-=Y!t06nvQq4zaL2|n21Uv?lD|z*KBp#jch+aq}0T{-E$JON=<^hzOsgW()SGH(W)ucxSq>N82se`{77es~$BWx8I<5 z5#xxX>bda(x@@ZGd%6J?4GZn&YJT&Sot?5ZEK8A=O!h}^{C)rN?am}ZoMKnjgprJyc@z^0qzMmX1JyCKGcf~vW|q5ZU%xf zP|W!oDGDiO)?+F)hkSPcJ$)uL+<#pZ3k>DT;w40OOcv5oD*M}K8^u4)ltIc)0*=M= zO%r0}HdY3tAwmlv)^7@R<{E9RymUERNTjDQ(nV0TTKDKa(r#iv&d+jI7h*|VbKXOQ zYfhE1w73XW23q7%AwAWf%MJGVcX6ONHWQt6vWG9AP2)ylYA`oNQ;IXqF(b0mgHV9D zyFS5e=!f*t;m5%9tlerKnPQjCKz56+(wAvu6Qquoxg#Cj?~;W-B8D#dvZ|djYRg=* zQ_GvzV2wBq zWqT}y`QUua^3*TaVt}mh9B@rq+ROa3A|LEbuE0qVR4A&)ExFGKhiU?a))rRIg}HWt zm^cXGv1QmRSvDf&=AC7u@M2BXA0}*@b!&X5J93kdiz6#Df@r0WnH*bBSjbYo8}Ri- zQA4+ze3wD($RnM)(T5m?3*)1Y`4c1lX1FKT0gE&LeqHP{CbmW#ywq=QR93oV^JkRO|mgerCZ8hB5Yitl78h>(~dC z3E5-NVyP@G$Tr5B?7NUrh{#e3k)4Q2(k9tSM3j)N|J41|rMmZjzrT{6^L}3M?KNkf zbIx;~CH?vKCm!XOZ*Ilp+K$b`!NsMwUzBO#sO_SvB`EX{FWkc;am~R)H2K`*>Dob< zdJ_k+g}}&!&=PAYOv4RPQH{cZV}s8>wz&0Vy$>*u%qQ=m^%R%+K0g%eVw1tDeU*Nr z-88z0X{OmgCMSnS;cPtnB}*ZE*<>U9BZn%tf@Dm3%z-&Zu-J6mhr-Pcu=g{b%tn9f z(qQIztEXOtYQYESGEU2O81<=5XC+!GMH$$RDpaEmo%FR$`V!iUs(j;If8>?joV&fU zzrAc;=G)ox`(MnS>XLBpe+=U|b)S~GD|yB7R82s%b;=osr$ScMx*TTn)oyl%!lz{B zJM`b6DAV6v3|es3U(_(+t=s3WlubHYb++5AK@|rTdAZcjha(AdG&n66hbGealneL4 z%impmTP9f>E|r^wf{S%r=Xz5A7zv#MYNzTMYGgtLPSezXCZtVDo0_33+a+d1G&dq| zKCB?&Oz;o6Ab!P7*DSb;?k^nETz0qLfB52px%62#qvKZ~ew<6kSyzgmyU7%Rs5d$W z_fzAZO$0qi!#N0k8)9sy{N&=5;?C%Vd25kPk*S(zRGu285;xeNtLroq=%oCsU0=C zmyJ#aCeZfLY!RO1ZEaHx5XNq1>>CtyN?IXcAljQ(zt8FK38wlsYfJ*q(thGP)5zT* z6AoJu_&zxsZj%?!vrdC&F5R|y#O>nkZRBfwkCEI)o1sO!*9(NAfis7#2Ht##6FITH z=lkq<^6C`=mi=?m=V~Bwts2K0+OwAis)W@iyg3ickBdy$+|{Tzp(Kv7Fh1Ms%s8sZ z_E|q0@xk!cyIDo+(@K_T)S-hiTyQVndKoN7PkFTEG4~kCyRmy`of9o6DVL80ec__) znU*s~Eiu)~ze&6p8*U#edF2+YVxow%mmxjb`6PKlRJc03PgTMrz5@!+>ass)6nPF9 zfS-tEq!7655P=WC&1o#xE^P~ZkM`S&647|iLt%r875oZ`zU^Rf>mY%A4d{)9vr(c4 z*>&%RGd?_M)ntvLeEGCb6}74?)^%o}?a_6FhCoenZ^xOE(sX_elI;Gxfc_a2z4PFi z1f-j-qyKw`YuODtPet{wI+QOyOM^WweU3)5vvUODSu$rDqkJ+1CBW4X^G|rX8gryv zS=t9RIcm`ls4H)o2M*lA=dqG>1-SrR2*Vohw_EywTWR42aBn=JRKi_YCbot(R>u|< zTNP)p*Q3|q#@l+Hdjc`HxGvJjp+3b#4puvz$i4e0Uk>tOBUQ$UGbP~Rt<#wu`qW!j zZ73?)kTvcs-h;HCZuHp^doST`Q4YnP+u*u%Ibt~1fHCr;Fn{Lxa~@^)>2i-|B|Cys zqU8qX5Sokb*K&{M9k``>uE>Bzx*^jf{m_&2qZv+T_8M&zl> z?H5hET2e)Rm56(sub1%UhK}Rj+{x}xzI*mZ?)t~8i&o0|O!qTBo41dB@a%UaLs9~xOq2>sTr zXKe`+9ARh|zSE=w2AyoOv%mb#aeBO9p1N*770tScC`aLo#ftApW}1F;iby)VLaq^F zp1yBryoxrPp{Q$~h3S1%g++O{C#mm>$szt>j=1Xv&Apt$8RCbH*s+occtsOCx{J~I zq57yxJ$CweZmwqM|ND%xwT$m%6Q4YH7&?9Y2`jwLL6+4w`6jc@wWtCZfAc2?{Odz0 z9;Om{Xhh(?9?FViE_W%4x(KpCvtMefpCDx9hE93rc>SC)mNC=A7)P@Y*Y`n=yahXGms`6l{|Mc!i@Gzd0C{y+QoF;|3Rr!QWMD^aA60Tap915v=S8Rc z72KcHwTv{#^yQftMFHgHoRi1&Cnd7ofPP1%J2BJvk))gN9(lY!Ff$V?N*&OnE~2U= z-UfzTzdOJ!NBfY3exes45QL7(- zH;w;YQbL0wWC+UBgs9uVSa{oa7GqBC^L2xO`PAb_066`sP&W{bOQ( z_4^)82)7k1n{Y^zKmkcz7Facw(ZiM#$t?M4a~J%QA~>I!^U>;2d-BG_)pb`&E>#R^ zkynPKg^<^g1R&(~Baz8Qg8%eGAlL8y1O8|5KN)yAX>D@X{&e-hW{e} zez=n~C@?>a3gHj>H=8^0e<$@n%RA3BZ2`jh4u1YK!vA6o%a;z9B%hyu<^=w?{X}f~ z`e=#TC*eP(@B;=rfM|{8Bi$3)q4*QOi!@GnM3eOMb3YXS6e02KVLxQBF#Nmjh0R@DHPIZ zG-&o`%jiVY_h5Ltwd8LMkny`nLxYB!7A^?p=UWpRUH|0z8{QBOCBg-hF=*iT50otb z5ySsT(EitaVb6s7RDo?Eca;sjL-#Ku|7X&4%>Y^`1S5#-fc^~QM`0IfKZJir`&Yr!u+ zyGX+{)APJYg#C)ysX}zbQVliwK9ood4f*)1wO>j5w?cvMCLcK4C6IjEc^v}vueCc#K>bwt=K_)3Xu}1; zMtkzUd@JmZZ6^uP-BrIJ|2jlRdRtz%=|yDjWgfipLSQh6CcQSkeyo$~MHU8Lb1#6juKrl)oV zzgvYE=v3vU%XDrOG4s2}U8IF=gPzLP2b%s4`zb*u*6&pLDgR#BMcRLA)BYvwou6;w z?u`Dd1>YUaZk1i68L6jqO(u4KZ)JW5VKU(`na>HLn z65Doq`Cf+qElD(j>Kje!V4dT-CBU+O%Xb9;JK^PfCeMj$q4iUCx8Q~DU9erG!RZju z&E7m>XH12tVvg)G@*_^7lni$i`7vLO@f9?57fWQbyGTnm-Gj2xGM5?!s6@O(cRBrG z8J)61mP3<`$h{=M58)5wt}{(A>DrxIWj3aNyG0SY#WBis9gUZTgw0I;YHcTJSg1=< z3MhEN=0{S$g2{5Yya+ZDzz7DypulhE&o0u)!N(8)P~yjbwnjXl_XijM!|x{TpN;&m zuoM4-tDjoCN&BJl8|-hq&`t84236b2Psz>#{BOlXEHoJoO@=k>%>7sUFpl(_R0sEE z{wn`&bEhK8dF$MD;Mu@Mo}KP?mx+9}iS%mUZoGHPzaQ=-0eTTi<*|QHk(}+HkbkM8 zlR<)sFf;*1kb%Ga_=~~+GiiJ97{QeTN(o0?z7T#3Z%4q1*nhq0`wIzYL;VuZj>BD~ z?U4UdrbJIB@aA@4C3TuVH>)1C!sA-28K@JMg~) zcCm&bg2DUHv`+WP(|KN~#r_q{?%zA{zggSGTB5F=yAYx>zsw;(Fxw7_>;60JAByOx zvG%cM30}$sm)~2f-K_mk`Q6A52^O8(3Z*Abbo$;uw>#!EswPFrF=)V6zKct7r_`WZ73M;k5x7+_p^p;QYJN0Y(r`G!9O{$F7iYclwck3>>`yIkxvPCU@C^Kf_h z|4iC$_1&@k-%0y7Yr9C>?Pw=gKg;kV@iOYvn$lE!%BspsSIWs`riN%Vl} zENo^~_x>ruU8IFIt80%#-tX}Bn+h2ZB|nw^ua)@)xr;Qu@vp$zSZB^3bNHWKtPu4U z(^HkVsP4Q!^q;{0&gws13t(5t&%Zu^AW~}N_piZD)={AO(z zYyZpTPey)Jq0@Uk2;_}<2wHUXSAPh9WVeeojg+egoh<(=82YcZe>p`*c5Ozolgm5l{yUz(E&QoL z{=4?CAhCQp%l4f`YjM-pe|ucnW%JLc_Ai;jn*lb#NGuer_4ZdsyOF5fhkpbU$?x{@ zO4UdV7YZwwa$#3AyA`0j5C4cnU)EHcJAeX0ykZ~wZ)N-u^IiC#So?8dgF%zY+5U4f z|BW^1C$E>_vzw#A>i?by>Yp9`R3z#Ku!NxFWm>sc|2fBRcA!61{<(lox$*Bte$@Uq z(*D`e4?Euz{BNY~Qu!ClsQ*IRQH#i%+&$^B(CGT{f5Sun#nF!{^aUDqU69~J@M)Ei z(I3K}(SF+sQi=f}Zv+XZfP%r0?{D$}5CiaiD@gCqr2Iu>Rm&6nnAZ|o28SUee%}m| zykn#ml00d@Hy_rtn0O9KR|(_m7$u20wNm8rT{#?zqq97$RbrU!a+P?Y9Gj*8Dn$%Z zw=L%c&5U|?)bH^45m3gUtd4~46p+Y~G|Y^Xq8?wqBz8yDK@2Pr(vOsT6t6%V?r)<% zmcCFKW^tO2=rGm{V0!U4X*8J7nLs^kbcSJg56aYW0)3M&Nw0WRCZ9IaIPgw1J}CY1cmYgD9%V`ziU? z5)0zQd#t7I1d>VzuSMRR1YKRw9m9&P5C-Bjpo}DoMOH#Cj`3Ce16%-=*OZTpcusKw z-FcIB(Z>g5*m<~?C#r>#mO`>@oXt`&+NOohf;R%##BdGFwEGwfnwGpoYGG;nld4n~ z)Vj7-m9SZuFT-RfZ=<+~f8~x?7T3 z4$?ZhLw!@HKR>dB9f?vnP*Gh>?5Q;Auyhodr!KT4DudT67Hq{$ySc|^B#n=L=KdUt zyDe!~)HH1=wf`LWUN1FlD4}u=I1wg}!|)=TFPTq)K>Hzajwkf6kzt(|ya_Y{+z(~W zlwq`DL;3pv$?cpbU9*Q@fmbzGMKJ&@WO0+y0u1lM*lZhwTk(!U#K7H8U_dV@AcS`? zmHVJO`bEy-W21KAoAFQ^)CT?f`I@fDs|xll5~l#{Ce8u_xr+cz#A)xplcx$H}yL?mY^Up z>rW4wyCkRZI8omSB-FwdBp95^KQzTRFqIttG0Z4<1V;dD`{FI>jRpbss3$tqcaWG8 z>U`u$eWIl_6E9BBGgU7sODnGLrAz+yIOwzH$V;M8({QDpe%Ue)3?v(-c6CXOkFLZo zZWKL;3{%W}0-Pg+xk9Rim_ib;{PF^si`syDeR_aNI%w%RgJhKXmJUFnso4ucSv~4R z44GD@W|7pi8A*&|vHPz32So=nuBX;C8t{QXhoDAh$ivdg6q)C?^a|Wn*^Uaijf@60 zA302W#ajH4V-%9W7=(c)%Fejzd+W~j=mEx`OJHjw;tpQt!?$`fR;G(WR2c^jq_By?m z9%y?GGHtyS4dM){dOU5xUVzr2`3g8j`4Yh>Rt2)e@_NxFR^1!99A^fW%F z0!Jc8`G_UMYI-3QPM2Z)w8jiCPM2Pi*XD9lCNkWg!aJj)Mjpn*$&F@*R%C;P1V&rE z!dGOWF$_~))#186z_e**38A%!_qY{;V!+3Y@Vt(0Tm)f~xPV4OB5};jRlTzl#8wh% zE%+fKE`k~8v_*$PU^W*iO1Kz7L+CWyLycK@a*MMnznh())l|6>+DRdh(`~Lq;KJNa-z|-+ilE4N}X* z2N9ubuP-HErXK*&iN=R`O`h5st8lz>p_tI zR0vmb5uYQ<@xaG>Od1sp@%qoZaLl>0$9Q4UXtIYF)~;eA}_4Vnf%)(AZo z#IT6fUG@AcZ*Oqq$)}z2-F`D=N6y90D*Y%_&Q+OIE8e4bRPqVySl0v4rJJzPi^S@( zcY++=*C={i5o|)s`BM&+ec3c04ekYvL!@VFr)g0ww*rkkbF|$-lTg?^K$@5oifqC@ zKtunS(7mIB+f z_rXs21@&0Dx~^$1_VLh}QMa>d9MfAEt9u!!YuK`y3Td@wERcu3H^sW@f%;J`2v$EF z_)MDith1bwOdmtfg0=6p%MOQImJp?<-)6URS8vF$ZaP!+LZHQ9TYQ{Tu>r@%c@d9! zgs0rtjfv72Wl^T4>+#eSObTTR1>}F%mXhdz8(*BzAe9V-EwKZw_9x#C73fsdtN}(a zSiS=?QxS>O<+;7bdv3~meOsL>4X8OZ4>SIVi)BMb^6?uyQfhdf_JubnTu*yzcu9z~ zmDyV=_4qR|@T|Sh!eDb{0>(&4`wDnrb*|YV!f|}K{Z1D^VT)?I7K)Gd@52-NTpsm_ zdke-#1dk&^qN+j&eK8{;qdGdC(U?7Xi=b425)Sjebj;xy*zIT-r3T0b0AklIfJv?P zzR*{26$>=2Z#$(8c`+GpZ%g$_ende1Rx_k|E3cM7BesGwzT-AnwTc{qEhWr?ZgHGj zCtP6n%a49B%OLgkkqi+Mh(X!L)Xp!3G_^&8t=lPlKixq4pcPdRk`fe1P)mF{Dx9wz z+hW!Ni9A1z)0VN_b8=|keW5xgsE;1IUinrd-%BO<)V$cqU{YjNX=v6^u%FZ6QnWu4 zq@B{3CA!!{%27=P2uU&!?YTG!$MhVZE08VrD z4pEL=Be@z%4zvmqin<_uwt_=Pn2AE&h<-TfW}LkV^Y9TW%i{X-{&ri$=Ga;@pDQLk zgnb~gWSk@M09uf#LEAOTLgC1C4oR#JSLNTbf3(W^wHGl|5?S;lA$vHz{OSCs7qKvv zM)kANM~0qrDE#v14TV zKN6fj-~HScnc(VLLy)1g#HhsT67MWChd(=spbk^pw^yzyPUmbysINlW!L0nOgK7_H z^D<;96@?)3f) zBdF(3K88VPz1|koTnBh6PTrnE%!f$3boO09Xs<~lBFrCuNE9=(A^R5LkFlnR zMPuB_F??~{?h|m0{t7sdM=4vD!=0%qsi%xrW~vE>jD6sMX3V1sUu+wTpdpGn0=U~i z>CxF#3o5n>b;Qle+|S=g1r8aeicx_)ecU>FAtI5*Z%vu{Jh~L-t#uepMlEL}3(wrZnKoULY7=!?5vGPvFweUrzFFfP}Yod1rxoIp3Z*-QK6L4}L>H9@Ju zB?;=R6^_BRz)aMNlP5Tw#^q&C~`PuO#S-o`?X zo=`D>ric2NYavm}Q8$AZX)Y#~J1i0orEJ%v->8p*B8oKj2MDdg(NTF9H=<8S^iJRTd?WLPzTOO19RwRp*qq?xV`~BpM8jN^kJanv&?=vY=}262KbFg*uxpt08u0enqT66m>5pHk#b7Bf02mw`%yp31?o$tJ<5Y#-iSGbemNLU-uw`mrl`qNkV1W9+jun>e$E^0gjNnS)pF2qEw$!2T{vQT=!pn>fxt!GaX~`m$D39B;Ull&2HJ}p z#bakoB7n7USc)^Co~)67N_o?ZXT>@$`Ng#0n%63x5qOfzPJ|)_VV0)UkFClMVf}5u7I`| zsD4@pXQ7Pmrd&8KRgF7p>H))%Lw*B6EzGa1&J;qGKuwp` zjA{D;#>a2TcQa;T;~e4FX6UWKC4lLOhAbS-=ha@wfnF(N{-l_B`*FCLeah>|>+A@q z$_e`3_Hw(Rk_7v;eJ}B6pSnuZEJxY*N#4Uprq<2~#q%juUTY{ndj_eAXQ6X&_Qvli zC{I5{QVCR~)3RGhl{unHw^Gp5W<@w&El+I6O!AHk9lX`Jwi0|GCn~BV0V1|LZ4xRH6qLekA2N7`J0A<+g z1VtulI|g-;ioEf;Hq)h=!Xm3R4)aalWl*YcIK=>ln=m?yW zkdnc_$G5y(38QjZlIctw^7@j-Lw_N0@SK)evL$`)QD_Y>vai`jO!(s+)z0SJU|KNA z1O7-_ni<-FxONKxn))CbScJ%Pd&!G>HprpLD@XWpdT}Lk+hN@L9BM0U9QT;sEoIZH z0WC?P;hPm4Srb{atk6{S@u}2Fgy*~JL8tT7w$yf;777kUHJdWUotpV@Nh}6Q=R{)x z3p;%>y;7j~UcDuGgQxWfoU$0(b7zZwfJ&EqHOPmfPFlU$yqv_!6})|w(ik}geY^*Y zq^s1M2BU75egHXTRo7mx4hJQ)v3#6qaRwd`>e3|T?lFh69OKxhWiKmdNV-9)DB`;1 z_k|$WcSt;QhVB*}haK|CJVHfRCu(eZGDx2fl#2bsKy%cK9gEk0FJyL1JdpwFc<9;rl z&a47VkT-3bt3Cp_BhD9N8!*sSvbjx%&DWWb7puixT}Nti!Q-LO}|$lOlXSK3w7#>>Ff$v!rJ6{LLy zCvyyhp}!p1lMZbu`EuF-`nYCny08Ld87?;=!Hs^BDP0L)MMt$} zpd9qg0IEBjQdxXGi_6aVm<*)6eld+6t$L{yMhS8piJ^u$r}!%X22^JY1UW-!i*;6s zH=F^%IN>750!c8UPVfwoO*63laBRe~>`y9*^w* z@@`76KrP9vHyXhC6)JmnGQfwbhgs-cEhmN(2~X1HwQw0MoB*B8oVq<4YUW;)9x8C? zKxz?MM#F}lKowR-C4hCs>oB0J3|Mj;-SiV9BC@#MfIV1l3EeS@V`rGFD(ppOP$VC- zLR+5hMZZW!4lT&`VvK6rF_i0>?2g4^Ij3d^>Jl0CoH7BM$#9$}XC+lT=5;;Hlg4$X zr%d|-2B#r_M}#6SN?)7Bw=yYwa)mn)EBw!r4lK_D(7qbk1B=n^N{_V*$lbLMEWp6+YJKyxK2m%ImDkKgbR12v|sklIl=!%^q$}}o-aTC)RRO6$cuU%6Avz=vni`| zr^1(f77>c!W!vWlRc@RWIGPc3XA?Uwen;y4DLfxECd0+gp8+-;353#GF7Fuzxbo_$Z&HPnlhB7VvL(An-CSuHZo^6oInz3 zh<~5aK+V7;_%izwTNd!Ts=*u-!|LLkN$v@FOGR!r{W^3aOyi zk1t@xL_BzlPfaZ$IA1pyef*$6EX1%OjMM2V)Aw)lyXqX>Yhw&!LgWvKUz6|(Cz--r zzxbwV6wsBOZh_qt#9~AeK_NoGae0di%zpAo&_~}J-A8GKj$5X)(L&DF%Agd$MM11iJ$e< zmLm39Q(1)qX5i;ajVhyUIL?m6I5a=hi1mg9mz;;fd*c+}?2i_P*wHwy1-V8c=%pli z5j(r(26R7f8`(Qs*%XgTM|xLtYNGq? zPoHbJAEPQ-Xtl?Y`KsZqx$IUDr9|8anYslSNkrnz2{#45_}0lJl#OY|6xXxaU`&w_-Do{wM$KwZ2WliNP1w4Ns25 z@fU}Cts6u$^n$;b0rdyKt6j3?tn>xYHrUi>C!bF>h_?)|idB;N7>`040~1CD{R5{!VqgP>rAE3xdw9rFCm zN2X{A1S0{69}0$}5!Rw9j@G%s2a}ySg?w{=ngjK8!KTfyJwVq$Y0anCQ#KdhaM>qa ziKoBUE1hesP-)GJ7iBvTG%A5+vZn(cL|LuEiKA){*k1;;SnUx3-*12#CN#(^VnooM zYnepi)TPFO@NNwU#{%W+vGrE5blN2+ah2|k)8%5+W4ZYk`eX1@#*{0Xm7!?rCNTJ1 z+fWNz9~YGRnN`V!g1)FzA6yR}bD7a8R-qeD6cc8qk%FY6;nWoSlLv2?foX(>awGgK ztB|s<{UY-Z5+qYg?+IKHP~CHPQwD7x52I$g-1pq0=}KhPNZ<3t7ti+9WiT^Qu)fQn z03**kJ_X!nz?;}8UB!FQ!DU8|zWo*2?2tz+*$zZ&FsJ#TN9csj?HS=0B(mV-dH9dw zValO=(IcwlV{|IbVl!3(gU#Ez1SBJo*8LomLGIu>`u^q|m}}3q7Xy7)LokA|XPl3* zv0>nBK^4r{K1kP~z_YcfkJ~}L3C!zX0S@%kEG#OT=EgRYC4FJ`a%lDC8oMv6YsdZ2 zSKOsqsoUW_y{(3{eeXsy6fQlR-Nu`Z)m&sr%Yb}xzDbA!SuJu4ncrYLet8LYeVZb| zPo4$yDVBmZR3Kpv!hjKvJSRQvTg*sqQIx_1@R(2*g{EGc#omv6nQyF=ufeb?X0+N=REwlT zdfQ*-5ZY8q!(eT`(-ix(b=sLEw0(M+W!qA<8E&jb7G`%^t1y79-9y{Iy-2tg?S7fB z)IWdh+Qc0b>5Af`!^|7ulr}NF*=uX5_7~rs>g!U9kqDO*Vd>R}t?J3$@L{g?s$m5M5*MO2&ri_l2{M<8NHOnl9egzu2EhT}(5_Y!T8i zrrO$Ef9XMSZ(nb5?sTMSPt<)IJFx4K%{Hq}fn&59qm?HDqP=geMSgHS{eYv}9PD~qW8+hzr>?Rl3-mB#DNcPIA4+#}6ujTVp7a)1AZsNuG4M?Db$r=v+ zmnKXkCJhn!Pcq~?PM*Gg4vlN46h@yIT+ULQu!sCgVlBbd{mVJxf(1Qe zUz?fVrV03L4SQ&{<=85RfL@s`Mq3w05{V55@fD~*gf`nO6|`!ljKZX4?A5i;KS-+? zr))h&UTgdEafhHnT`v`4uMphQ(bs{^6v=T`AVrYjqX1+dtFNi6EnmtlbO%UxBbL(D zeOe16go)&)2AxZ*yzYw$)INTH3La`g1qwbsNMT~ZeK9_T0T}?C-6qwkZi$4)^@QGC zjYulkC_OXCoQoRWV5P!Q;qSy#-#cil>XM$(PDLaC*0EM6O7GU?XU`E7)HEu*$bm}T zYVk;GFWq^{!b2HFhkaM0o2@R~S|IuEsTNASf?m}E`Bqa~RxNNA2z!Ufe%Oe7iy?R7 z)O-bkySZ^XdXL|-()6LwfZf(h+jX$M9zYYqYK>jCsJ@ygrW!fJ*xd7h_0?A(@RlU` z^z!?ltgIoqD&4?zPV0?w2j*-+%Vgmt2kIz6RR&X)wmniOo91F7Am&A`c@2fs$yP4I zxk?##MBazo^(I_EI39g#jiqb439wRps(GVQdt~}#6QZ_wAFZZ*?F2Qma5PUL-7!>n zj?^UR1Nd6RaQ_uCki>hFdxfF$Lc{&}iSGl^KJm8ed30gGKlys{xv5jbrC8 z9*#1Hr?8*mv)-77EWFoqLcHdZ*PK|Dv^C6kXA;+I++SW7u3~b+F34z#sSLa@rkJq4 zHA=X9D>ej&2tY+~G};=2yg<(tv7il~7dCk5bL$mDr6pz;nJF2rz)b-0)Ay~LuM|Ui z1Y(g!c-%w^9CAd{D#itLx9|X4L~k*htUH78*h^ru2T&5a+1$7oZ6E$N-nNzgAP;Zt zC%GQ)6>&I_SPbvo(y>-BtXp+fk%ykL6}Uli)gEvhpgj2eMnc!2$T+>r(a3;=3Gxd@ z$xF2m38hEKW*>m}p=t6XW~T8kTlwK~z_PzrH-V?QGE- z-XY;)cY`fHA=4LBWh_VRMrPSWO6ik4a`5Sp;l8{?C4qGraJN@|CvXBO+JF}vq71Pu zh7~4LS&6b3PiD{DZG%~heeu6HhO`Sayz8aIqBN^M4DZWXq#xvz*YJSbNA~!B1@1L~TI?{6Ya{(5v+~y_C@cK4uoQA{&rS(5 ziv(s29C@<72KW%bEO3XZk599}+53!-eyn`}*E1yXqHY}T<3)YzYW-ZO{HU;>w7HL3 zW=|4TA)f?g<3#E#W-i^M=tYDDrQ>5Pt>WAZBQF|4!|=^~*UO(jNJTUs)~ZF%JJ!M+ zten?dp|8UBc1xwEU0_vO`M8)|WVnC2H6w?>b?st6ke=TFPI~oWkSWs{96z|#-W8@s z+#Z#Tj+<+m1%Z{$>dny9XJc5ms{F4pih}AwP1z#Mo;~&)2fFBL&{|V!@{4)27d*b!M z$eJ`=yNCA>?ji9Aw5YL22kWvtTKD@{frq3Ug>zDF6nI(^i}C%UkNqv{m#A1MMkUEz zH&|DT>WNNof*fTft7BU`U;{Sk=Bmr`@RA+4;O0$VM^kOAnE(Fn)0|t%rx)3s+9Q{P z(B@*KMZINtnNSt!sJ+T0-oPHG(<`M9mkHI~?_*@ZG?xRH&o`qxr(Tnv{i&L@T=9iE zTWx|-+G~VLm>`>gj?e9C^3Vqz|1S>?y>%n65BWH?*gLT8+r5Fnpv4#M)UJyIXJx{T zUyREyvr;JY*U;DYIf;%A86 zM*jhgmxHI+bRD_n^0G>$@C|wu3Yi#8odr!%OFa9u*b^_Tc*UL%;J%L+>bIw<@fqbG zV)d1dxc|CBwRM8-M4dT<>_#Tbo>$UC&=-Ls5@m+39A`lw-ge`HE9LN>t)l#pC0CF{ zW=C52Hu+K>d*a3IDLF3!Mus&gaDu{y{KnDSugf0J6_Xt{4U5ELDW_Jpv~e`q7~m6( zFiK+CTN+fo)nYL$;1~y;gYr3Tq~3>Zn6XQhtjcXaYpg^pB55&##>^*AzEvg<#nG07 zBHJxEg^4aD;czxA%e~Dx3f-(xg2*-xfBY>pT4NiE<|>^MyXrNBq!Kp-_b|2q8ihi< zS1oe-GAD;9Wse<}W%CQrqsLKv_KD)7OP4M?Sk5k;&`aV%skeX+SxeqBI$MSMBI;ZJ zGTu80gJfm~aGrc0A14F#hwDGVN0*C3V z(AkmuLj_i6=HEJY&{Y_m1i&LRczF$f0IdV@U0%aT$r>zz364Fx2C*@x_1?DPZ=f%Nen_p}JO%y|;4Ce2LRU zLg6xv!+mcv{9IKwbq#x(B9Rxy@dF=TFIW;r9uKKNc!!GPd3|DZbHm%788T^)|TpI@u%%bV$HVp?|`!Arh)vW<-O$ToDIC4TgOU_BIIBHL;|9!D59TwK4>}A+Na?Q!4m#nB(0AvRBHIKt2QV9hoG%|AirC)buSQcC(oNu zrxA;PlHld^X0cuJJa4G1oNh6%T)TU19QoS|bEnb~AHG>+-`Jrew00oYI9h*ijMQfW z1@66D_8=3hyD(wmbTGd%v$NmH;H@hd`)ctUhJIXk!(U$XZellmkIEsTpW;5Per6-2 zxjY>gIILR$$Zq+6f|ra^X1JZ5e^y%fVs!u-o3S*r;D8Q8Q_h^Q1Q`6Sha+M zbbxuwD36C;e4o$E`{kEM&3HVb12Iht9Z}%g>}LW^UVgF47$ftZ<^!zQzU$rP@kI76 z>>2E8nz+s37oARr`a%VdNc&s7;>Kut2^tE{K-oABH``r46HDkz+*TeJLFWh`VS`Cw zR=q?nO+AE{A_L`z6@eG}Xjh`ejX$Q8itkuDhVG!$~ZR!7cQz5M-TjMKZT* zjlg_rRTC7A;ZXRH?R*8WI2({hnVebqP~EZ4o*G}a!m5r27?KUVZ;#^P(1j~gdQw{_ zQMBOVxU&SXjB(X!jfl=w=6gorU=)<@kjA?QoRBl`O>ftB0BzWm!J&PyOK7S%E>85! zXS>=ZG2%VP<)bfws5g#DbS5Cd&x)~d^RMK&KL7Bf&stha425Y(zaz*mgM#^zqTU4U zyDT+=OE*%HzJ$Z2q}Vw79Dg(>?V^kXT+Vel#cN6Z}Hskh2V2uP#o{JT#}(jUy* z{i9z3%-j6NC}J$d(A$ zAM9|&rshBAN#q;I%Oo^o=I0Rx@6;>y`oXjxOcJ4<+(2L0ldT7FhOqw7+f6yw_$zXQ zCk#}ibEw=Yzr0vriF?bFmU)~S79ih*@ybD0-e%5EC)}`HevxV z1qg3LEsC-AC$PcYPy5}}r#9uIbCaWE*Nd!RY&@1;EgvJa2S% z-_mr|S`0;3f%rpKT*HBIsn0-ixFA4>pprI2p~5DjU#uh8&#bQxJ(2!4m~->wFbrLE zWvCclcbo!Tik=bSE7ox&IC%gDD|8k-?qj!~2r}I4ha>PlpiZj1&`zOpX;<$DFl!$fqDXqeOV7NCHTE(^c&F0x&=k+Mr{BKdoNGbqL~!u_zXELp(}4&p{=3j5l8%>iMqdlbC&I z88f+ykP%BNcBYO*7dwN$0x=!aIr{{uPE!EN8B|f=m1L4%U~5pJV7%ruL}Wj@Kq1i4 z-+Wx7P;Y4sH*h+#a3P@0_QMjQd)TeLlQ94B=&|N6sY^mdUjY;W>2e`V-O-;&9v!rK zzxrzFf)iY6BWh|1^k^Cpc#IKPBJge6r1G(DlZOYqJ-0*m1^D6e+3zYVQAeNiBXXK!DV#BVZ0T{I& zMmvNPg+NB?1ES>dy?h8 z5?8ha8M?rQC{4)wl?A+iVU30#Un5)qg$krsHRuk?3|j$P&~q|sw)Qlc)b7%L$*j5q zwv4u^$Si8G-bXPx?e6Gt8Gp;fL^w4e=kWm8R8$ywgMiU6Pfcb4)W@h?YO4j}LC;aG z9yry`Zb0jl?cAm_b#aD%=-uACOK!jo5BQY@oP^bguUm;m{D*M)zkw%}`lolufe z9|@Kj$k3XF3Xueoh%(j@U`o7{CfG~6@hZ&MMjm%64g%uC*q-gDV>`JESuQ>`J;Kv*V5cvm(9Gv2K&uqiwe(+-E6u#W=m|bQUMOKaDDX&x-Ec3%eTC|S0f*Y{ z1s^@hDm%cy<2@WX+wHl`<(9nECW|2sTszFGAfQsK-zeJVRukmbI0|)hKYbvLq86*V zSLbpeuejCWSEFyO>IvixVB~}^oq;%;r55xxpMfehaYSdYU;ZqsdTUg5JUa5~^p%s| z3|xEX%x=}v9Zawrp#DJKjoZks*i^Z2U&2?Q?-0>ewEIlX=?PmZUiP?kGlseZnV_eL zca>_d%LiU^znt5DHD1-+dE-8D=)=nLpz_A?+x(EGvDUqKl{*F8{F*$y&syd*nN~_& ziZ5qxb=ai1y=#(EsHt8aN&ElUd+VS$qPJZTm*DR179iN*7Th&3xC9v>IDx?(26q_T zA%nY1un>a7kN`o0hXBDfJHPLKck6D|{;_}E+S=OcsqU_x(`R~4_c?vu=Y5{{#Tt$) z%Ky77S5fTvG>%$tE)LW1(=)}`P^%j1S#+RIfI=spy5ysG%lb?55PIord#cd2aGO=#dEW@eu*F+&3K5Ls~@ z__2FOuFhysBu!R{t%`hj(0Za2F?p=E)9x1uxAo~;hOKTdXU=lH)HHPr>-dvbVia z3}zM&h8Vw}i=TaGFnIsv9EH|l7DA=lmxEVS*;%OrRQo}(??mMLOlmDzpawXr(=VjR zWd9fgq8po02@$Owyidavh816(Kandk{9f{vCDdGi@&7{_xqGz`Bkv~shvDyQ42E+w zpnlj#_N460rozyJ7gS&XtCreeSf8V8N67@cWb7cMS&UC;{HCEs(S<8y(>6?o)qa5me!5rdZEq`fk#>#n1CHfw3w3pDpr3SQ;Dq9BI=E zmK!IU*)7UKWaia@e7sHcfK88rpXN+Wr%5$DFU|R7oXNh&9R!rPQbQf)qI5;4bv8R1 z5s}_=rJO2}N@SD7ss%FxgbtVLdZGj*?bpxs95rEqK;*v3-!Miyz3uI~hBSLnGBoHrr3iO2M*UFB^q?0wE^^?~!TuH@=-%Ez6uD_tyT z#%<&I7Wc3@n>v&469pzV2md!fW(kGWq!;DWmY^WK9dUzDwm+-AnBoy!7>{%xJ-2)P zdD#>+?HF8%DZ-EPorM{|XMb?97-sJgfcph%;cjQz1&#IIlO)yOORP_%cX!hL;?Lhv zF%KmB9-qjvSM+%A+dQ_L41>8i7&gz($gawSNF`neaeWTb+?kSw;bq^A?FoLVZFVZK z{rljiXH@24O8JA?d22)L(jWFSJ!B+T^cbFvmNfIQkJ@ z;Z6y9)J&S1Ikbkh{FkBJ4xPB?W)gCzgHRnSgF0NJ+Tx;3kI*DX)JnbUG~1^;CMpZE zQbnz=-SW~gW)2%J{5U@U4*$~`6G;C_ra(NDOd+9?3lAO15T4de9W{-`Sb|eq&DP`O zRG~kIp{}o-NhqXj(BrJiOXk2=AzrbqAv=<)>THzbbkxZmu`c*Izhzo1evyo~p`JW$ zkyhMIDc2$4jqzAbn{w{<6exlYPlKfc;8nxo0A6Y)o78ilD*FnBtHMjd)@a4`MolH3 z3|o8YM9b!>?P9s#BssOQXCvx}vwHzGX}x7qxGT-i>ZE>+;H;Bck(Hd8dDi3HTzf|! zyRnHvQl+X&1l8Ez7>#maN2)J4k1jgx-nov6qOT@7DkQw1=xzja4j`8PuWKn=>|~$I zs`7PSwP@7})OW!%{vojuvuRe=PfLHAvHA&&rC6xbcG=;c+g3`((Vc*51oQ*HngOMZ zwX<^f_6unX9rA1Yz)G4Qf{c#D%25aZWENpgi{)Tl)vH8-^_=(4jEROW6y#j}>!xSH zU!V)?0kc++H@<)MyLy6@Y=07fT2pUeER9g!tDrH{pL=BsHDUNNAzV|Gc4JN{1nSB^ zLj*N>W}MA>j&7@=w!?@?gb3Plw)4U7!eb_U!6SWCK(TEa_Qa3cX4=}JC0mi3dOD|J zi40|%Ri|zdNx0g4Ni6!O@A;1l=+y=)t7WXar+UsW!ry?UTtkuY`tgdtwM-Jlc3`!4 z+F7XLk~gJHgTMclB)>`fnou&0P3FQ6T5mUxDK&v7Myl^~eid%8O)OVWw~gEjH9N1r zGcJW`p!7IKE50sE7wj1x&y^DciDz0wB&6H6y6}3hv}46E!L1S&(ErHKsFl@-ru}R@ zxg+|ZGe}pH(f6R6hIg=#?ZlUKFltQ1*`~rE33>I@*;jL(%Pm@#Dru^b>CMCv+T)b=!a13 zQ7^}VIKCzR?YN1nqos%F1`@EPt!LC@7h-B|!DuPGaylW+{e1VGI~-!_UH&MR@6JRr z{BqD~=mM6H_^<-L226oF{czS)17`AmR$yyJ`Q%AVu0q1iAs59BS#}juaIgy0gN2K> z48`9tvS-4aqW_Jz-jVTPik-ZRuFB}qOjTuJt{hvTeq)gaZP`Dh9;G^Y8b|eZS6`GM z{rdYizqxqLQ(ClkqV(RQc_WU}2@Cldp=P5$1!3PwP{Y1i5eTQV6 z`Sv7q=)GF(_b07sty-qo^OBgGlA2I*qVVLw(Jc;sQY`TrxjT3!4bj70gKpaPy%Uze z$atV3a>n(AJ_}MZc#)FYs@1)B2~bP8bpdf$i`{5{bCPp;sVYu#tBjZ8dt0)G-WN!B zC}-|wz$mxM&GgWH@dV(aipl)OH6bpzbL5`M?Y=5H)JqmmK5jHQ7EL7xqVv;X&m2KgOYY)?0asP=EUBXf; zM7@z|dmdRlORD^neU_n-)J8c8-mrvAYd$|eSNbZLIMGjv4ZFwy9wrtx(%}pDR{V-u z#&=uB=7ihDd{8Jh85MY0L2B^^plO%cCils-5QBhJO@rJGO|<*>_B68vljPDs`&>=V(|+xjMJn!mVSqS z^m}~YA83UgsdxWF$}{KxK2dMZy{&Zd4zJNbt2%bOsi8P#nF7L3ci4Ac5ibnGQ9@D@ zZ8h_(S|TqJexoJi1aBEOaDEy@NE&k0`QD=0(eZfe{QThj2t!(Jp-^1q0s7)8j$xyk zT*2U?De7iL45Zd{{fC{_uy-HwVAl-7tTC1L)M>hw+y>k&;*ZAF6qBSt+7Qm>;m7;3 zS>d_)jRM+(X>ye$kmn5~PNmRRVlncrST^zl8z&7*>zU=!xIM=izVO?ln?KyImmFii zmtxCI^J+23()o;`#1LrRdyb)GsOttl&t(cF_j+%u2BaO)xhEDnH%T_HeDL{RB)H-( zyb5Su0l8XWePkE^hh$nc^k>4Nd(jPYm;8Kj!`0jpg_EbEb|c+tJfSBoa{y{eWWJ$j zTmFZHdoSa?2<((K??g<*GvXE0x@8A2C0s{tJcF#%r(2-AIhK;XWoCfKByrt7rwNN{ zQn8LqaBy;0)o5?*JCb%$o0slWcp1s$hhDu5JNjY(A{zVx1{YOmW9(n8s4(fqcQ0kv zgEpeOk_#-R$YUww)dI^bRm=|;B_dz&1z494s6=`zyUm0a($=u{ZT1rj(CEg~OPx3V zIG!Gwcjhf@!&NIm3;G)ifX$FgrO2BY!BGfR^jVUZ?+$o1Y$73*NC9W) z3ae_EX1X=57`|NM9lBz1G%SI9+$s4mw?h^KAw+pEcG3pOn9V zv#>#CX@3%H|Ih<|9kGhviCKTdfrrWZu2n*xH9>BB>HEU>Dx`g)-_MZY-^m#tlkS%H zYHwi46+FMBSf+Z?3GaWO1j~}^$NKu{?o9a@BntJ=QQT+ z9_GE-RmLO^K5JzlrOwfCFey>vSu^H=}#=?_3c%6SyLqsib zJ;pVf#nE(BNz?Z&G>{B*DzvQw%KZ?&JDhjWP6%->>bk9DY--+@c4nk|mMaz}6_Y}- zT1N8Cr~VfHP?_P5>~AW#*e|FZCw_87cS7VnXSd*(@@g5V>P`B4;-dU-hOhYinTepgq0|f3-FWB#@V_*7KITvk9WOH2H?R`ei z=(r~>sGcPYKMl1p-V|AIk3>rdUMTR-)BY~H+QKPGak)6v-1oTKQ?p3)PEEWJ0;y#v z6?Oap)>pBCrJ1YVe@k(&UIi}~44=vhTX$gu&4RqNwliR2WfQLV?=~tJCoyq#q;$i= zv!4Y5oEUSEZk3K2`$c0E@OM|2cuC&$DCm%RmwEPCRRD9RubFlOii@sZnc`eNBl$Ee ze(!|*A(=Tj1Li}tFG+K#H6zjZzx+coe>G=IwC`B3(bPjopBwOV0icKOZX5V*QK2Pj zD}(k@-*P2n?Zh~|OA|cO&Hrk7Q>E>Uj_2F;>@*sNenDQ^p9NI=dzLZH5&gfN(8V*I ze@GI%r1q{lRMAD=q)38wUhID!+_YGLR~*;-6(^L>zRi`F!kghsy;s#tH8=7bQD!wC ztsn9Oa3`f_mms$%pb@R6R{Pb4=z6}>MbPz;aT6rUC|AHUO2?LP7_P?V<| z-{3nlmJg#JJJ*k2dcA%5j(}4#W7M~Vl~!(Fw1{wYf60!w{(%%6sc(t?m;PE{iGWsc zEeS1ZRP24+bw44CX+Yfbax$Fq<5B_9RoU??vLqGa*^}4cXBIfYMv_X`$T(4 z8{63lXgy}Lq5rJTAbR-1YW7-n*yADRBTQ~N$TC$Ri@`B#R=9**>wv90FvA2BLq{8b zYPCQw?h=1ZH*F8o3!I6swxBRs;Ky;ei+5?tfmtu*ib2^fD0p!2RKICr0FfysC}zA1vxYMYOgMjn>&1;_(2C+28SmM^lgHTc3B1_b)sET~mAH{n;R31v@wms)^6>&JF$iuz*EA(>r16Gfuf5i6{_3`f)lkm>PQZ$hYdkt z!EZ&aGVPt!UK`E8uJYg4F#Kbl`sOuZMoF?AP4M4J=98k=PxnSKrA150;>96QbS6o= zD$ZuSQ#!s23wXk*J7ng=s18n$QP?r24FT}Ifd@d)*7x|s95W@$P>|87s!z1)@m!iq z!(c;}_=)OaFhrm$Heh40H_?6XtMFQ*3jp9Pz_W`@n*Wd7ZZmj_g=<;By z;~WFe!gH%-b1(7q2%uaPg(9{Z;{A?SM;R1Y<8PRJ_1=N@RD98#6w7G*qWb4845JFX zwv)#O6Rdc+ujKlX5qYa=9R3ffoWHAjUQ(nC^DR-IVO4`&k<*ruG_Vz>h|k#=lohj_ z(Kl^6g1xAu)RQpn(#H?x!qD}dl^~|!ZU36F-=O{w@NQ`)(6|eQVBN3=Dg`3rI zWsetJ)czr5?Kkkj-gs4Sv>omtfWgtawfOx`K+!dELTIJ^!Krb<#&xA{qwJrg_$65Q zaM=OJ=5dZ~9bQT&ENbqyCPMU<%i2Jl(R&PZQ9C(a`pO+B1^RVz^lo(ieJ{Oj(@yXz z{|CXHglm~BZyKS+M=3b{Ko;1uxQ~ZkHoE~66W%7fmvq$M_HyF+AU+5r?}dz+Wr_)JZ(>KfLIB-Q;h@n#|J~^>&G)a369$j;J+1=E&^^IgX>0z z!qb3yiXSDpy$ZB-4$WHC;8(GC?>~{X^NjJ5sF78`-GN$4S~=<(V-#h-LwsY}D1h5q zty-;ja2`SGNBvdORY&wsuah$!IQyaeB(=hp)8;r&Qn#|7C_gcVuU_6}nb|kZW^9xh zyvd%M*vM3~B>?rBiUxag#rSeUOPovJgdCiK!hl1+IVQNOSWh%*`bF+eG$`FVf1c^8 z+6-oFEPMApig-4C^V8+YD@uRqHE>d!(CM#T7i8F#Tx7>fJ7jF;V^*Q9WhNeIZI*TDfOnDDiu#$xXDgE{1TNq2m z39x{r-t@;cr>*v~y$P_{oLMyWL?>CTf z-yoyrj=_L`NCdo!q#4jm7WFU^@NlL<#F5#>EWIzU61jcFn_9J91Qry7cWg?h=~2N8 z`mYT+uv^S%vZpexLGjKhiFtC&QkFH}@E_6>hOx?>Dm&l3-Ydtaw~V_PFDOd5AquX# za}=wsX$WeELSpd{X%a>xdaVq58<2HR+xv5`==RK2J}~~5+CpZeKmDV}Wxu^pQD%n| z)I5F-EnN#af&3EE#ODUjSE1I$zs9FhiLc=5K=Z8{5=rUxt#vp3d3OS8FO@^ZmzX-0 zmvhm?sPhluo*)THRH?^U7_-u@DC>#(*&n2<6LO&=SU|gqQZ0IHkASM1;VqOCz)VC= zIdm=vQZwO6otg0XT!!CG31h@xFZLKxr-7wrF)7>X3^V_ukSk>eHac4f8N}8+Q@%{o zw`?y=Fz|j@FM>ncs6Y`%1@B-r#wOl3qH0`Dh@Sw89<*}s0BI8>8o1hL@w-h}pyVR@ z=wCvNtPI<5TRSHdLyq4}G#CTL=V6J}sRVQ9aw1#=su5n8>kx`mxws=w1~K za4I5;dziwwoKH39tV$GhBj$ys^J$jnt=Ud0Yob)tJ@bl1mT_q0G6UifKe;E{lfLri zW_RK)Z9JQZW;jDrmt20-ehd}Oen-y}<9qkfd(K4BvCj||yk?Ke3MxR_>Q{6^H`m;< zy7IV52re5Yarj%j`V9Jpw!UhwG%w%}t_nb6?tw4wC$Uzqbn6MBDQ^Q0_tAx@p?dtJ&dwAj-pq^h7&0awD1_-5SP% zL>VN)*o3a~UfE@|%9;)_s=9IWH)u5zwz3iOLh7BN_sqNPV(+JUf4*?J;|w68ep1OY z>oR0eamiVPa(*@YlUFfyE+7!XsMH->{}wBB=-hN-{{!U{b69pI!;mS=%$9#`KVCaa z6rW#xatP`wOqfi6Eio5ik_*e57!Lt$kB3~q8dh#qYLDkMRTxNx=z@%wZG@W&<6)Dv z&$@Pk-Eh+IL*Y3$6?cTdoH=?l)au z!BRJx@dx>MXr+&MWk=9roft?-sM$mZEI=3(?6walpOcC0cP>RC>-HKh-H+5uQ8-W* zjQJxd5`I0$Od;n_EZo(5-x^Buyo8g+S4C8Xk6K#_U6!Mkpx#Z$A@Y?r1 zO9a$P`zcAs6G-w68Piyw52FO}bA9u#D@yf-N1ShK6->}418u`M>Z@4S3YmYgPsWRu zCC4X|%3(5dQ2Ol2jUc73x9|S8jfdfd;-7ZdzYJUT1pgE!yp3AL?j1+dRtV zKQ|NIxFFL8t#HeW8h93hc6yffHpi zRerRaG^+C^ktdVcBkG_I#pO(77KI`y(AZuvh0z}Jp@>3RSZF*;HOoFi(FpOc2%|*D z4i%Ba=W$hBw^h-Yv0Bo;zT0UacJ{qdFCujlC}$?wh;vmc`wE`c(RECy63D_rp>=9@ z5TAde`D>n9F*x%Y+W+Mu(3F!EBVeA;h9l)G)Yf!o?Tde<*6_TQy_7*s;9Q)1vM_V1 zrH@2x&|I8?wlLc8nZkO`{s0V-BR1)+cxk8ARnC~>GZlM_mX_%3ZnO(o-Md$+FYE%m zL%ZIEW_f-Udj=hCY@>fmh&lK4-;%41xp1xWYgpUHX#^y=!DEmyA}WeV!?^F-6^GfO zueA5@Id#k4(`VK&zu&%b<}y5`sPJHVAuj=HlBd$ZUrhtW1NF+if{g9zDPm*$jH|IP z$#S)-+O^bu=(z9vW!iHC9>(4u29&?Uz9cQdtNDvr$>_?(8Uy`9&^X4qn&K6OI(9d z#~0=rK_oU(4TX%~+>Zgb^crT^A#4s`)!oR0bhFyhzBa0LLYy(E9B1*{1UmD!<#3jd zimu`oe&$6MQ==17StYMdwkxqJ#_#T{50c#Yt~QypItOa5^_!@>^-W-}+yS+`J{4%m z8?i45nt42Fk&h{JIV9LN-$NI8SoOd5E~w!-ic}!*Q=e@Er9tY3e@M~!gQGF8-!c4b zknJ@O_3L^$MMnLQu_-cf>(rw*c6MTh`)kbed3E=(ed5+7<-ASM;q+^^xmGu$7Jc^6Qo zh*rq3=$6FuYL#bqvnTMJWa=+p#HXnqSN^6YIlrfp{rs3ZyR#g!JVucFbnbXQi+5G4 zzD|40tXX-|$!7;f*?-fs>L%q|r=gUu%HXc;6R-W*ZPyr@$3zwTt~U!cSZb3=O=7sQe1u^jKCXHS zH7K88J$dfRY9fn90m9}>{?V5yf5Uen7pZF4My@gldl!TjbYJS3;>NAI$luS&_63~9 zB+4oBfhYcITaF~_UKd~k^~{xdMfknq)pADW0<@0DDJ3u2a1EPI=3yz)EBu4SnHt4- z&mt9;Z1np73VbSkFS{$-%Gc6LW?gh$v<13q$mby-QDywg?FOQRe@HoB|8Ia$&Z{7!)ZRejs);r|r(bk1N}dqMm@2Xz z>8b=B%G)~RjYQN5_!3ZDrrm8-ClBGs%8ro?oMsy|1swtCvxKC1uLX^VTOS)Sr+~UZ zdRg@kK9H8)<-PUWx)J?sv(V!Eh>3qlJPeo75g?a#*Q&NbikyQ*hMpb(9ADTnVS;*< zhp&4+0&rKyT1`4T2rnRN=f!Cj{xOh6wQbOlx$3B{YE!GO>nF@A%-Mp!xC7dqrr=0{ z{Kw5vg!fwcLWf|70{2Dmdy!(YU#~JvW`a^i> zg61ZiE`?11I@t}(F;rV0u}Z=KN)#Al_o43*hE}I>nUZZi-X=&N%3IHv3^A()iut90 zNC!&kmw3@7*mJ9~Ty*d_!~7AEO8BIuk63FvRKs`3JB5No+-_pO*{0zV(<$)HnkG4^ zt|~}b6WxH_)YpF$SzDPY!60e0wqym8hOf+9%X2nwjVo6|*#3O%H?5SsAIx8Xgrg01 z+aH3DG(0`dzXrI^B!2rUS>1UAF{2^)DXeKOwW-{W?WhvpJO1SK>!)KRz3NrJxEMce z(fPEkXr7iw^m8or!eFk>Th5AGp$f0{y>?-;sTrtQ#ePpj5bT|bQ{V6F3f7L1V5VdS z+bBA}Utu@WK#R>i1&Y3C0NTgBs}3VEAtEJ( zvtNUEKWBxf1q$Bo=d-1&q*dY#J>N;{Hhp(gb$%tvGj{9OV3TJX1kqehO zg039qT<>rf)`5V#-OZI0qF8tA-01w%+@0-o4B;6ZVD@w=q zn-pZMzT2ovjysM?lNgp76h?N65Xb2SlQO;z`voml*DH*5s52fJPAoXTT5aeyG)uG^ z^W^2gR<&FWC_^9pNJt+Jhr}4(y^_A@CA+HB5EZH$y3MQ1{gTswy3vhutfXkn z3%*_hwSNJ)3GH*w{Jw#;3_E3iG~7+qLCuo?%<79xuO*jlD$&7-1=xjwQZ>aXa~ljJ zUA4GsF%_#fMc&ZbjQO#Qapr~Xd}BivWxNVLu&C+U@;13p*JOK5?dPVC{;iPmM4qq> za&^y*woZ?fcB-~S{EHyiS>Cl4pV{9Yg2RXO$5cx8Qt^GgNiqTHWJKCR43%iBok;Z} z?Tm;kB|AXN`D%D_qitnqubnWdPsyURj1#>XszpMy2(tM+YqwuTd>Fryg@h3E$$Vh5I=WT!@ z(^<*&d3FOqY4c7Qn|nPr!PiJ%;jG{GO@?h?k=6-?GIE3Q`cyG#;zN=hZaAvd1V zAO<(*Jm>SNwErT$LcnLD{X}}CYm?;5)kq$0tjCoYz&s&uGJr=bFO8*hrLb#(w*jy} zyuX}+<~1;@&iL2FuQluPLJj)|J_X$G@^g4|W2w++4fdAJMba04uhN1DdWJ_Aikc^n zTF6Izm0hxw&tpf-3IC94x;ZW)=1$dE4Pv%OO3|L#+gBp!-kyPH`}6+#8J%eDO|7;2 z(E9d2a!I+o3#MP}^MSSY&%;BUI+h?!IReiJkiAVslB1szQyyQ9?kJiH8?{v z(TT&)p)LVKHmFBedHL*fp4ybm#ZSxj4abZ#P|kx!z0megl4~8E)(RobO0S!v>oOb& zEzQSaHC=m^=&q0>EG=oQ22P1P-UwLoqS@853+m5=YBuQ#vIj7ElYu;bn%}B zs3kh>LKXpZ(?E$Ql6Vn;@SEDUx)1wt`g%fCBb6@O=DnN-#2_<>kGTG-wqe?nbnREV zBjh1zFb!EAM5RP%zojEWQt4@K>yqs=zjWhHy!EQ3$!*zb8h?fN>@-hSqvXSp93TGk zs}{k@IfM(@lt`NWCvhZCH0>#yaA3a1jMzAzCd3-tbq|laF5QcqM&s&}8vMkle0G6L ztpxdcSD~hk&B;n9a}ATZTP~EDcK-EXl)}+&?R)(n0L|E90^Y{?1Bye)1C;VmeY{Srko_<~(c>!V5SD^le#|^h- z$6d$PKh6`_pJDc6FW-#4spNEye1|E0dJE#;d9Ru%T=J&sjm~kZnmj7y<7&R}AStop zT_91W%iDe0@3&5L#M+f6_{+m&C(vdgr&#gqR%-h0ejocwPhE{X0-S^WWaV2YmpYiA zdbftC`$#(=fs-ZOG1{#pR&Id%J6we_%K~?2mG#MJc!cVRp@*?)Z%Q%Q8Ib;nwisEH zLgOM?FJWwUtmED#JS+~m ztRxH4T<~*xylQ-V#f{d!()n$vySgvb*S42Z=Y&+d_vGza%{fEPwLy2>pyT!KU1i*V z_@51-bA*%7*^9Xdui%@qOQR0O9cfPGa&9*DS|{X0*}?35eJv;wlWJv&x{Fq9M8+%P zM6v68XKWLhM`P(s#@O?xrIz3HSvL6e4)w9Bw-ueN*L6gLt;)!K2+@@MV6&d!OtzfM zTj|{a&OYCgoQiwMYaI+QaDYI)MKRW)q<6I;9$s&Ld~#8)EqX~-;7)%FgIf`BQ!Vh<@x>nH^mwKJV%- z(%OEK#2Vkv+p5&h*_6L>GUlQ%+>)U33W52S&5u0R*#(qFISKC?1c+JQ)V*~#i6+Nd z=z#D+cri9FX+ccWcs+=~Z38^Ahr7W46=y&YG&spK&?_*mBU+77AAlUvQ#=q{5F>Xq-c@`v=XI%TY%-F&$eF`dJP&`viR{ezD33zv!} zCwyl@wX{EFCFn>S{cG6aY&CZjUNVFuvhXlV(Kerg)Y}&9+>iCioN~?CZ-q<{K|aCZ zz1AMJ&4uDgOOvM3MAEg)Na$ghrDuP)4R-5jf8RdS6ta=$3|J-k^*9q}8Wt3MT~f!` z$2$2~L%8#BynwcKCDVUQH>bVkTy>CwFkerXPtJ9PAIHu%9rL{v}m zUd*{|OiB%_M=N(45-Iu-*LzzSYuzcPOMxXqC z?o*C*oHl;n*F_z*3lW#I$GQSFlY#Tcy2;}pCLx5tIGVlNNSnRnQwE5#zAJ=1!M2>V zRjJwJY1)}Ao$I{?Leiq7RF>beSp5phceniU2?5|TSyPX!J=PO&WNbtrIjIQ!nb#!; zvQ%-YK^Y$h`c9BLe_yxr0I(NSM&&;@?WB;@#$IV3k&GP45j$ zou!ow!2?-17c3Pi?d}OG5_tug@!Pkrfq z(9Qr|8tzo0VF(ta&uIa=OEgKOD5t9yeE=3?Ls41jDZ=^qT8m@37b^JG!K37@7`s-n z*))=+0XZ-M<%dE}nou+`8Qyuhh`KUqYL@@+lC%Iv_m2q1)Xsl{XXqxJCLxBe=Xh!y z8-Jm-f5Z`lS7f|IViFf>zIeDlX6 z5<&su#!@M2Q;{J1x0%_%JM{{*{mZ|aTODz^9gX`t3 zMJoH-JvC6r)a=B{xyB3rAx+0u6(W7l{02-{7JEu_D99H;F7xw`KD~*D$u4H>1-U+*7J=0F`Y2kn&mUmpBUa zt5p6W?Mf1*)>t>01xSO;#c5oGR+ll9O4x>3r%ipU+|$30zi=urvmR~az9w2E<@kd= zSagN(lKr?EKv<$}c-=?iO+s%1wbbx!&SccXUt>!=@9KKFd zsJXQIbH{7NK)oOGJZ7&o$Nqex56{6 zxgx+V0)6q*(E@obrQQ}@M+h@+e{G{J^4>_VKl5d*OT2zq0(k$t(BS&OJDy>-$GZt8 z{PQ=+ps-npT1%<2TgFL_4|gs2P_^B`7wXDwb|wv45G?yREz#i)q0^99=+Lz<^av|qMwlj=F#EVMEkx!v;oI9Pk|22uLyb$3K+{P$aWL70nwEjqF*SHCe#TGHEk);qB#=GxQmYKIS3?JK+4L0+U1r+egp0bQh;VL6Ft zgSeO~XigZ^*&zmV3Ksp;IWrji5W0p&7;b@oCj|2xYRG?g9d_HCi9v^9da&Jg$MwUd zzF#E4unA|RplgR!AyAR4==DdrCbPlcPq%j#E0cx8KJu++=!)n@PGWs;)+ z=1Ler1L<5WVWP|Dq_YMQJGCpXI|(%z&L`3vxqnFOXbzTmXlt;kV1ybzEVb?9hh7_d z8Iwr&4B*x2xd(e#XP1_Y`xMFYG^tJRe4vgv=(bK4@NV(7`befi8Vh~_fO@ARH%x?| zg2!i)cl7r{RH3&@nE5hw`O!ZlhDpD>f-?-w3Y;|R{Yy`r0;2JV^hoz$Yi^~|hSK>U zeDNhzH&W2)G6Q8sFvhh%eP&k_&BtXWzpf3pKh}ZrWd`YB^de}_cFC{~`phzGFI zjpdrU@?|t03ctWOEbk$BvHK#dgJ1gfN^yqu)o8fe!P$gs9cv~Nvk%YFCOQ)h+%2+Z ztBq~fLJmuUMI?q_D8ygTAp>|SNV@Pf6T7lEc184z?k^{yF@aDON=1=eDtoS?rDuW? zwLbpm2p7ggWtKrP%kbS7+4R#Vp2L4g?&~25x1ka4vX=MpiAKJkys?TmFpiX+wH#+( zHYfdF$n0mni2v{GDn~}X|LH0nfd>m=oF4@-C{b{l9 z<~=Hk4d~8(9z@*wtll3vWRw=U#rve#{i20Q9E7gd9zeZ(fu!!JM)0`J9 zJ0=!ALI$&qgkib%G=GSh)pVpheD?)~E;R%t?bEYtZt3OpyxS{59DC=1YCyw|0%uQ- zujiX^RqZrpqCHP8A)Co4)j2gmv;yzSZO$d#Nf{Ugtt;(M5_Z1#`^e2m2A_0dG54w` z+S3N`)D}aLmnq+-qC`Ah@YDh!WbZGauX9M}N{j&*mfbS;dE@9Kg+60EM(wAnGTnf~ z_mcYjRg8wnfYA!GH8go5y7&Ty?Bd3!6ok1GD^NpJ8TS6C+4+YeJT`VkqgHX!xQ?`Q8*gNO#NdGkK~)2OIb3O zXk1dEnZCcolw;IH(il+*NoiOIGyRtu_FV=*oX`AN+r2 z02&T?#q4>`0lA^*$YqveG-#Liq!Zdf(0NvzE(QO^;JuAxbS{(xF(}wC> zETw|ihRzI_7>)D8S4wsu76l?`{vF>=@c#NqQN%iM#wubE_=Wb$ zh6`(?oJUvQf%vs~$HQx95=`;YjtW^QmeFj}PJ?xIhOEZ@_NQsT%T#T%5ta#SZdb** zS5lg$sN4)yAyULmaWZM<0X7e8T#9x@S_M%43{HhoH zUmzWquKW&v-e#;PiQ>5V)`Vf#yjizH_zLsOqs|G}U`Di7iQxQ<KZ!367zpD?LjNIUh%i+I=q>ol zdLu^Xlb6ApyGz&G;p*j3|5hBSgq5RfyA~94sp6xn;dSF#z&|8A;&3j(o^;*oUz*1M zkX~yiy)rF9M0)^`nIR$frCk|)TnWdV#VBCUEkiEH*S9++ih_PEBzd$G#rlDSQYhgw zF23$V9BbVlXnle5l<-311JOWeJS-XGXjVFd_zY3btW|0TUYmb2s+w*;_;%X3U2OFj zB#Za6h%6)Lw#hp?CV#LX*h|o4-r>p2V8*Sjnj9j^x9h*;%JSI&DT^Gu^VYty+u#6E zr{*3ih(c|tC^yC!nvnHpZ48cW&8dl+_Nq%jvI!S{FUEnkG~JHQm)IKS`tce3x(JH^JJ$SToI{U3ZFVW(Xd+mU0Xdl4)Z)Ev64 zF!hY&4rM3xEuF4zp9__Utshx`zaB@xb?@|B42XS0A56%?~agRDNaTDv$eQAY*GaDqXDbz@n{2`lov}jCuy^s%{ z-<1r0e;WAUqbp|ELiF{3Nn9?1ls?w{_?n=E&oOM`=65x;eI0D~<}@zF>-=7TMJfJZ zIhYa&2@6x_zuF$RsSLv5%1DNKsPAR=fq_Vf4`PjS?dZOrWA?<@LhC%?d^Dy9Z-@55EiTC7#Ww{))zI4mXej z^!RKxu#Z*1a)|yOP<_EmryY_w-{Hx`7t7WvCP983wjxFH56Klnd_-@t>e-W7fG?P< zzFRDACtBMhEx`AA_OJA2BVwFfyC+zA*+hXOoAZ)r=pRW*{~E1b4@uS7+0o_BWSUkB zvUNre!wFZCt+TE+%sdvP%8XuZ{!4tQsFep793`kCu^@5-c-k#<2R{nv9(O!q9_0N&OYLQx$X{x9!ckjYun(X0Ot^4>Bk zuC?hFZJGuex5lk;4XzC#XmE!h0fL3#?h@SH-Q6`f1b5fqjazU?fRMb0z0bGzx$pgX zf1NSz&t9v$*BX!1Q#I$TDjWJ5H}H|TYwSh}doZN)>Jx#hiEI>et9LI+{we}nX^VE^ zPNg2OPjboIIaHT_$hnmEEK5T67KIwuM_=@SvjEFNVRwJFkX1^CI>E;|YF--bre+@z zQL~H%=z{nt`j%J+ktx?WmVruefC}F*Yx(W!ne3@c^RNIWOkh4jq_EH2!DvK82ISUQ z5vmPH<#slGVgXkEUiGFcnCXzBX~|Rj=wn6t1-7R@BmZ@-23#4%0wPoDUj$L^+^_aL z$J6>oX5N%OTpD_tPmdz>#+A*GM#|3mmQQzSQ?0_=j@|dq8M7Vnarq4;rMk`Etg9fc zzSH>fxO<}r40jvP;j#coY;`O8I)S zO>dUAg(j$$KEA2e@frNCFs$ws!l&c5e2yxH=x#Sa&r#S;+w+dIT{Op8B zK;Wr6f1m}3#z6~y-0f4OPM*qb>o9u<1tCuv5xg>-cZS`kk5JV2`D0~#)h3^}vk}sJ z$qqQ|%y?;W|NVMo2B&;3UPijLj7o%6ppUfUc9m;giMC40?2lZn=;Yg$8$Z-3HdH#B@BjgiU~gq9GEb z8eXDP+T(n?fK9DJ+*0gI<_0$P8hafF&2AUm)*1I=M@4HUeJN9OJY+}rA&#vLrYB> zyiOcaA6$H%Aw43(NoY2d8xY=&&IvADhD|@B(Hg72t~IRXW>rJ=(W<*Yi%D3fjs{=q zoPk*tnfY3u`iQ|Buw2q7xH?Nr9<}!9@V=fC=^Vw^$GEpUfdwlv@(=wD`Q?Jwp!31s zNB_L@j)d57NE(N~38?w9sG51PITgm07UMo1MCB5ok0~(f>d(ABN>6Fz+1tO7!-y&O zJ@hK!T`iyl^2!@{FhbomuIt5T=c|=;%=c)*iD5>TLiZ?iL~Y+$u_AOEi38<}Vy3{R z$R@{Ee@(hwgw#Agvh(FneL_7$3cj_Jodnnag${uZYXawGC zWW{XF=z1%R!5Kkw8BI+=(0SeTHI)YykIqTD^JH5zb7UD))UzHh^KHP*TPV{b7Iyr6 zyiniUS>bvnVd`P6yb53o-kjXrua|D8f3_hrUWj2I@G^QgMuhiP{1h?q2E_u{dOT(f znO?oHk3%Nnm-9WooM>3RBT7{>K9;SXoNi<`xemRFys6FTDV3C+)7fWeCdb(EM?zLU z*E7QY`19Mw**+d=6DbQ{g=X?(`VD=qqfm_2p!_nQ9lkr!@34(IG!Y7Pcz3~Xzkv~( zWG`V$z~sf7yBBc+Kve7V*RDS@o%b)X?MutR1+kh`FG5-_y>khX}(Do zv1W4fpT=}$Iz|W0V@jkn`b)-b|K)kr?iGm2Qe2r^tjSC$maJ!Agq=m9T?Y+4o;k&ypm8SZfNmMc!a9C+;QRJJE(E^F5I zUj9KpKb!ZogfW%LJ#+l!od;S1Mc*RoBoE) zjoZr3JSHXS)onFBec%c+vj!ry_wCz6?4^;z>3EpC7MLQu*Nj=2ld_@j)Q0-VSD{2; zz<&S+j`E2M2}%eHe1}6gr`yp9-=j1AW%8Q)cr6D)R3AI~Ek2c0#?`H$I;;Z45!3y& zk)nLWvT}(>NDiM{ zDkWFN9X z9*yEmtGWgDf};QD+ksxqL`7j5!*7~_Q6prBkG%t`v&boYNj(Y$5MgxD3p$g+z?~)& zLGEDxZI(|HC=7_2SS*#33`-sKp5d{yYVvA}xa63XAO{Kzxt3zrV?@BF#3F4-d6~;# zmX(a5Klkb@3OYgYgnd8z|MC6*NWN^})}d?Lag=rspPitOKyB`fXV!m=@vfHz%}V1U zvfcZ*BuW*BGSq#Ior3b5H#JE~8L6k9LZ4_byEP~!CG5A>av1qbzru4kpAoIP8|i+5 z9=nLKiZHTG(!WQdEZ*m8;|XhC!U(g?6afWo0TX zfWok-%@8zIK-favW!flaH(W!E*XsEcN8i((6B1kLATE~hv134Q33>Ix4@JEM<8Z(n z>3a=lglp8d41FEvnP{I?amc|#$Ab;XbMN6FGP=)D@gSRv$hL5p4$U893!nretB)VX zUw%0JnJz3-<1Dh6h*5L*8@80Vk_WEHJ1DcaL?tpwkm;BI0qj1dXM{eF36#1c7)W*MWK0JV^{g0%n&Lrk5pz z!SAsgDJ1y6P|)O}dTr3fM_oV(2o75-X4ANEH`kN_hKfi-sG)g% z--NrEkiX?oEtUGaa9|xt6)}B5X~*t@$&F+uqs#LlWn*v(`iN7vBa8c>AbGe4U)uO4 z0%V>QlZ56`4TvqZaS|V<8DhOb&bD|FYG7A8m7$Q94`3>^>svm!S~X~G;*q!VxmlKY zEGT}8omu}2s(Trb7Xar}qfRf}>vZi$qF-5h&NOX?G;f^9c)=UqrFYH^Q*#a~t~B4|X&c%+6(oC}i<{nIzFb z2rBsbTHaQyA}4~6Yrjx#so0zRDeG&+o0}=oH!B#7V*#2GgV%*4lF_9Yyj+XDKSUqy z(J05Evt40=x0}hI{pnkBembaf8>?w$+fHo#n!Y0Qbk;pIyhrpCkwwN3oWqms-t!Ui zszL4pQF19_9b=Jd_brRu6ZP%@--vKEB3uulsgP_6Z5WeMcI|lcmqQfu`N$);+#l@pw4|#NWy407Rw=YX|KAidP4PipAfEFb~-_y3!hV82A+#zUg>6GRfL5dW_NmuX35v+*=%7ibCLpmkU@z z5@*JGZw_ten-$~7%sTgI*D73g={b3ZX|x6fel>Xo>A~%G9gjfX2lekT6eu4*CxeFe zOfE}XL%N7TM1fI0isZ@NALRM3IX$jPL}jo3Z2nh>7hEz{Tqg+-!^b2&@i5c}0T|Gm zTb?_NcyZF%=htseVl3eLI>I+@Nz=5c_1`E$T74Tb)N{8M!T02G$Up+D9pRZXLRb4D zwn>LkI-B~l?jHlZZBgc*z0V_tc0vf=<6O%yg1l`g+I^kY#>ymK1Z?dWNac|tnJ1x| zyQu-iRJ04sx_x?5B3_e?FT9M!a)7|m0t0>UeSHTS6??K)6LhDkfne^9in{_wJBWYngbBlvhPi#K6W zYA%=Kh|13bC5H{zK}jA<5j3~3EP9=?2d>Jbog=bOxjsN`#9BE}Ye$GFFAYGcbnKUX zG2&;uSna*9D+dZE5Znn}ho-vx38Cn&av@p7rQe`z!r}n}co`j!dh+b(_%a79;r4+I zjp;@fDE;{c@!JZas^3;0q!s5lNLORP*>qq;OOmj2TqrL!C8*=ZTX;Ek>f&#xdD) zHUKggd{DmZRAB}s{ASoB`e4OmMLBLbN4Z{Puf^nXWLA+(8ctI75Z&9%>a%AD+p{Hfap9g-uX9(t9IX z#%Wx~c>NvcaC+no9QLJ1GHDRgu`>8_PAOod)G)~-R6{~rDT(OJ9%rd7y-40m)1f`4 z+L3zPQgN3Y-2O^o4FU&#tk@fjm8ROZnAry{28+$LH0Jmw!z;!F%Fa* zQ|XfVHTfJ0bp&e*=6e-ICNH7Zs4~Xb+R+$Ta`?xIN*add0+e_spzT*#x)ad{{D6Lq zCBfvQS~Wr8i<0Ip^!zRG=98z5^Nn>L3AG4ZX(~3bUU7S5|oC&7dkUX%?vmgT~w{+ii{2xm$-=uKEf$l40Q=Vtgu+dVp@|W z;5+!jh=n)#=4=kr1&_JvijR)T4p}D|Xe}@Db*Km<%E78R-7+@&AZmmQeCV6Mmit&8>U$uN&q! znE|9x@96vV2Ajh z3E$q11Ojp-oIQ5WbhNIONA152;EpSr%jHgyO}2&Arw71D`KHc>vCWR_QBvC%f>vQ{ z2nV$;`{|Ol)FjJsc@v`Eu<58+bL1K{Nz-@-tJ7-c9`O~Mj@TfHW|t48&!0rU^9jI& z^%cZ`NRi2m$gOA5jNt~GU#ppnT1u&Sm=Ku}EWEZHUHGvAJ#n_9rMUTMP?>njWGH7H zWpFDzvT_86xN*1N0&mE-4vEHe?A1{WHyaiNjUtTFTKXro-Np znqN?fuSA#nEtBc_BN?rF?J9mLLKA;0jx5+lcv*O;0G5$mn8=w%F3cn|suA4t=nJVR zm(?uIp!OVrBBHAa#Vg_N9<~b4TOLT4!cO{I5z(jeube3g1j4Knfwa_vC#=Ji&L+f_ zq;~WILD=Ur6@8F4+#_B7XWrd#kS(m)!j5XN#u>5xObRK7{S~q4&G_tVIbn7R{7yn5 zCSl_R6kx%9p-jp0`LfwNg3$fkV*~t>DI_N-6IjxACCB1RPGV-DjSUSxD?R`g!pk2r zD`ZSfh8%SEtL()%;v)GwV!?v=RMK}8`w((=u}^oFjCy9217=?UC)EEr*Io!CgCX-p zqB4WIBj(=xzSzvMAz}9}XZ3tVw1AQm1Je&lkriR8?>oL9+zj1z)KU_sa{ z`o+5gsL(>TRr{)9Uk`_dG(yUD3dMuCw2+!A3zaNvQ9%m!A3*hIhzT#E&T7T&m^VGZ zNz?F77@4b>*E+V^zcANCU&mCnV|K}V>Pa7--Ng`>CVe}M;m_94QqAkY=k5=wj%4Ot zTYJEGtw!Ib8a8@F7#&*~K-gmKI(hr|lns3SCt~=E@_iQmcfXP3Tjj^n#wcomF zF+wGJ5oRwAK3fR}fHN@}6;Ww_(rFlZa>P2a58eW@`d@`^o<$dsyPseRi)=m&+^OW} zGvt!t{opG5Wd)Y*ceoJVCT_2EtJV@~6j(?H`8#EJFjF{2ZW{x0gAd8@OBn%-7UEfy zG|15&tS+-S=;2~AJ;J`9*N{y-#o~Mlv3$cxB7_1&4gzun09aW|E5dt_jpIXbk;I01d%JPMP0jRdl@zmvIx)p1YdI$SIxJmv zb=8E)wrmWbPqb(`0Rncm=XO!(+-0hqTrpfw!KOlg3Vl>{F-53IiNHGO%vU|c$`WXB zJb>!KmJDevc_L1z@`C4QVPR1aOU-b$P*ACHm?9OVqG9Psh&dcj^oRgtgJXt8bDUmR zFD3y1q%qkUJ}g-hMPf*y8_kk3)Y@6EIH#OU>qUui`jYlZvy`%sEO8ov#&YE`t*E zT7^n`NQbU8sI=Wviaq7^{WKKK#~k{}e8kG7v$7ZM#1zst^ykQmW;E?yg!{8w6|TdM z4L!Z3(#q6l34=%ZFSP_t_<|&m?)oKVEU)RtB{OA@p?)b{<%edyg4BA$ZPm1iFcXXKqf*^%CD1YB*A29^G+ zl5-TBy^;80Ec}dR_cj=6-T2Lg@S%UWNI)7nTh`0LbOUSf-QBQyxQt2VE&gZNN2N?N znL>oo7jr*e;{{3vw}!0bt-twaPaN2%C@vSzvd^NlXdje{@v7!y_1f(l1t0}d&`{dz zw<%9RW90G=mD4=g$GlYKMLMqch?JPzmAx9t3@~?9%lXJaGdXqd{SzDGE49>g5Vpzt zDu046Y%x1~smk|NXK58mJe`z+*oU|I^li$T*#KzLW6BR|FA$T3CbQJ>oXS7%jEEkM8LNmq{MLvkV`tPd-eLES=^cX^?MB5Zu2Y@-d<>nER$mTmtdzgIicO zX(;M%AQTVVsaas!dJYJI*od1&*x0sM*?X->dP$YPY`^F1N<)TPVr zq2H)O)9S}ty(eQB3B)jP7Bf3-SZqhiF-6wy(&Npo9YZVPaJPfz2eI;2posO-jDl${ z9wkw>Nj8cQ;dyO}Dx}JLIKSUT>GFgyq@0*fb1h6={9b!{=oC zAsVPy}l_A=?BnsFh+S9A%MvkL$&R-6>|~b zUW;!_3|ogC>y2j6rGFki43b%qI(D^g=8XTc#UFWSU&h<>xuA;5?!1w{b6fpsTnamk zHAm6YULgj-3*%9fvbMK>eElzM8iM4()j~e|f!A-uI%3ePq|1l7Hy%bNI?Ze2%Z#E@ z_l$QlPv>pP5tY>>r^P(;Obz>y^bPT6ipJnjRISHNg}rGx^}-N<;VU2O z7Yqu4ut1}rTD7~uHkgBSV~^bf>FMY_Ul$#I3Q2wn2=}fpg-oYg`AWnKtRlJOv-c=X zrB)`XT;-m)R6=}$ zFS(BAK^}B7s`w@IU*m=G-BJ51!?*#@&|g&WI?>2%o8LJgq!1^kcu22VQ@d$_ z^;j*1qWKe2c>XRnM#83TOFb4-6E8CvWH8MWr?Bh^9E>mZjwjha^|07lN z=YQxxiH)ZnVp0GWcf{a?DnjMe*Yz|FREfnq}FvL%Dpu2o4s~7-pY2&ie?OzEBYc%WB5bsHF|&SPt)%tuSc!31)7T~b$g7I zBhZj^pWgN19eozt+%3#i^!tQod{fv>&QjAGbjvxW%=S`_!3bJ$45%u@_c0Oi6~^iC zI^x^Cx2a#Ay^b9wV}H>0cCRDptyZ9Bc@Cn|-8gD%D#*DBlrbq#8V-H!c%L)r9R(xV zWIJBr6b;Ygp@$===a_fF&iGDTSL=S5{Lfb3)|t3M}sT zr^sU1FDkt>cr|>iAzf@{*~C{UC|+n@6Ssqs9{GzX_tA~hU-%45-}>lzt6@5L?^NCD zx)I)YV#p_YscAN!P^Fv%=G5EFA{JD1+f&^2`QI$97)TyfzpE-!8Yq(+xypMnQiO~; zKQ+f{WgnqecTYK-FlltcvI3JQqk9uF`OXs}@z97##}y}f>Qe?x5piHIQO-qjuf`F@ zC&|TbC3{dIB3=Lh>9rlSgCR=!5&GKlFGZwfw$iN^SlRWnzvjv)S4Ol2_AKrgRImh&WMO1rb=W7}JUQJa{u7#_ zV9Aq5GIs6I<6qEf=seE6C;{woq; zVzj}{h$CE_o!y3wUP&UXQZV?EjOfgII%nwu=x?wn$pB`E%CFz=p*v*y!)YX2_*e4J zM$!EXSrwMQv`+mY_?vlLS3_7FzE+OS;qj!!!hYS??K^o^4;7~TF!ihoPIk#K3sk55 z!X`r1_m9@KNAxAtgJ+ZK(7Wh)#>Fq=BJTF}+@DV!Zzg}rJm&uY^`4^2hQLc#vA;Qq z2lxNyLG(53AEWFy2B0a%QF_r&K=ucvu^}hdYGe?;)$cE5SLA4_n&n<7%8(U!c6i#r zvv*a?QT1v0b^7_#Kv0f?uj~XDR(&LLlBQCZeg%J=@uX3XWo>)^p-Q|zd`BX=mawD# zKY$C&-f&|UHm3lg6GvrDqNGLSO}?IV5K<-)WbKaOYKpgCd=%J4o$@g|L`>Y}#t8A; z)}2?dj)=DFL~_n9T{fhxx15749lbdQufvX8B-J{dI}b4&(UW=jkAX)&&5ghH^1yq{ zf+K_tCmI;G;e)>UB5ODW>Wsb{32Lb{5Picq^i;JYKSTi0BN_yPqP2vtb-_a??5OjR zb2T{N$5+UC{8S>M1Wkpht|-p6s?`UPNTUS&s4;=8nLGY!$Ek2)Ir;fyaW5Xf)_(@t zN9`JlmFwV9BL;u4X-L4uljK6H8ku!@H=EOCN}Q_qk%G)vpqf759U2CJnWVNYzIdL1 z2C7U{3hwte^tw5#weSr2sFcIB3b+vLH?;u~$yR%I?OEDXw@M}EB9@Xnwj*HmCU-Z* zcl01J0Vc@%S2QLC6+-wgnPN89d1hsvoM_(2(e+X-$>v}B- zQMRfDP8nr8BnOIWEbdCH{VKl*oQU#LZsC?pCwU%74~--H6!-$52k5C&8vvBpf3DLI z4ACLVD_a#F!rvl_LBkF8PNJ9A!hxVrn*Lih+SI+Vh43n7#Y~v-sq@jVdVt zB_nczO{E2S6hDRRB5b`WVZ-6)j|F;jU?TF1%NV!Y{{Y50BwFs8ss~|;#gT&)q0b-B z;WcYa_d;8QsO1sdU`c^>^s6YN5D1gV^|H~>U`)O>hsIf|F&Qx^U26%}-cFYcg~SNE zN5mWe0B_p_6=fW88jrUr%r28S@eBB*ii~ishlSWTUQ$SOUg~@4kKqAGYeM9ngQA5$GVl?^Bh@0z)|`gw8HK|6ri*SBl0YXu409$ z2`Q%mIfET!Rdrbke*L?dpDn6sU%Ga1DW+~Yb?ewL`4?$P)z-ER2FQD23K(}T8>&@V z_Ls;gozWyB-auP&t^-MVl`;8q&WGfYaFi+A?nhMdZQ}voVS*V%VkN4lnmtv)ZA$W} z$8(7quSDK(-YD|3a`!FCebDDehg4{LB;1*P+_w}y545>HV*l0d*}o4VIISRn^8~A= z;6zj6ml6Bq1M0M7>ktA-dsR{KI}I)bkaR|yqblGNK6&O21`TY<`n!s<#h8Xufa@d1 z6nHkHxO8jxIS}-9>a~#=T*$Wr-vdTrfv*-XX9TUUG96rl`#~d29 zHh%4(l)MpXvb6f!C>IR+pjuN_Hba{dQ?Dwa?PPxS7HHd7``dwwCiqC?&UGU2mxUH9 z_{_jPWWq85j(J(+G3`}e-%*GE;Xci&tJy^>k2wZ;b|4H%yZ6sEne6vlQw?ox6m>=8 zLIPh51t%op&drxw1eoXnCKVk)|&tbaj%OgnkJ* zj-ke3BSBRfU>DR%0MJAS3Fv2T*S`LajBdpLcpli%EtN}VAC!%IH6&RVklj)nqE^x& zQ%CZ~3;D`3$dJpUTyc#+SYRMb%o{TtVskdw>%$w5sGV@)uPin5kUSDF?iwj9@V?AJx~gVS<;uEIx;l(z!y?6_`*tyRSlM z1y9{#z(T_6{C3S%uC5wQO#5Zi%ZQp$TnmOxP9X}iZJ#tCAlo_C7l%p85cHg% z+3`_*6PxqvGESV*eqZg5cb45|IV*|APs|f7wTn}DV(89O&O>Hb+eISRGreXx*EMA- z>8*%Wl=j5MS-CAON5S0J)9$6onp(;xaP&$5LmoM>e&as?PC8k{7x54Leuz6lBDq*a zt$l&CA%n9f-NNQ^7c|GsYK})H>LJ0|KT0nAqWJPqQU%6uE0>Yj&JRPZQ1X{JYfpk_ zD?4+1KJu{I!oexjuEPxk?zm8roegyFy2CCOFDynC}N7z^q zPF;6R{gXsW9ZHvWT?anFi*vND>x7lFKU`)xrX0%){ppqiuP3@JtX~r2UA^wojhI9I zCFZshKPukF$_Z?fP6kJBb{Tr4wKNH?`@97Xvf#BtQ7>#<8Q>Aaq>ENJ9`9nu%f!_9Wly04J(eiU$xB zd4Ytn&q*LO<9wWE_x%i1_AuIzR5j&` z0v5yTebVHD(6(jvsr~uyJh6OHvDv_f()Rnd4$;Xv6y?`E9%_gYy)FXNn9yo)ZlTFB zD&!;C(8*BxmzDCt?&@nt6IYB=1UV7fB-Ru=s_E^ff81xkK_*nXG6n#*hx7B#5iJOl z=;a4wD-n=+BT1F^3LLgW^OIYA411V+uApS>R5R4-y>E_`vm z{bIB1)ufFX))6iXxSkPp+%%ELpavj{-wzgu#{ISve(Bb|FTB-O>R%St*IjdD+eVv0 z9$#Mh9y&_=Mz_jXVCGMvBZo3~qL}JWcHNkHrdRbqcTsm{+{a>;!RaS!6ygB6GSU?s zl#h+M0k5Te;NJ<|r@z;Cff_RI`+mQxo0f`bvZO}O%M z9E}aR;I$`j3jPDg<5Wiz)rapFNf0Qje0UPPN3AOt9DZ}fcbfeP8D~_o|HpvB$Amwt zv*Uw#t1-Xe2*;P%`%Z5XJo}!gF}?KfgoeEI*(}wh{*S2SS{2UnFsP$1E()27l9hVS zWk=JdM?)CDEPW;BgtC=k5M~m_)i4F)O2H;=Lt^Q_2-(KH4v^4i^=lplTga*Pr<%mu z$%Uyp?+rV+OdIC!;bNQW{7|3Vub_EtyX@pJhOM~=k;Sp}R-a@gr-giXg5OEtF?zI5 zQ}Gz3#{G7VP#1~tYo40(FnVJAJFWy)hUTc}X^?|9t=!gru4lDOPm`Uy_jG-N+K`>9 z-ObdQkfBN7B2XhgPDOlyP)HF{=mv4P*VOM$9IQmYUZ$UA-Vn{4P|vt>G!cI^He7k9 z#C-hf@uO5OfF*vesy0KcS@I)hrLe(mnnFjs+i1`Gpi}vLh;&us*+Jr#a%7MM*3a5> zuw6Tuf3jqDOi{T~#7IU?)w6#R3Wb0JbSemdRd7@@&=pujvCH8qi9FDz>u6^VKWX0ojZqh>W+`+bnObhu@(BER_S__f2&Hoz##}51s{-OFGYkxM6-{5x0`0kq zQ9^9Fut9Ezr0~1m*2{Xvjx3)IHMHdlR4uJfJ|Mt(tLC>UJNer0R%IcM)%;1F{9KRG z0@ewYxkPAlVh&XQ1|5DwIN?(A44+?$>t#IV{rPn0_n4RQAHX4xNhGNZncFS7?o_XnXar=hnKY+>SnU~o5zpk+1FhSu88YNsQEP-Vy z=70Z5&1oU)_J{tLbjpW#cHF*xLn^_p`CkiS4|kBL6MM8U5=Q zEcMAhFt)s$z7^$*#3}Bgo$*dFG+ z#5#1@7mO-kKAykM7F$Dvo)8`6ZB$$QS`(qRo6d4nXBep9D1VS-Q$U~eP%n^r))D%u zNW*sJdta}SA`l@PlL!N*EZ!IH=^P_6REndjBYa>!ko!B?Vqu-Kw7K}FKRa(<0c!$; z@*Da)FN(r+5hiu%!YB@99&g**p-1+sc~7*x;hNZ&M0@Xl#(Y-s2Rj#_uYVUKHHvJf zuZyr@P*KXHW2p?qVBhN4h5%Ynu}pF0t;x`j4RtvQT@{2PFD%t6{OXiZV=jK{1usGh z>j_gYfOW>|-|b~VDOxTo@22v+QtY0HYM)Np_;%Ro+)k-oelV!QG-E7+*2bo`4()#I zwwDJ^zjL}WU48pjyrA1F6f@ZlEKJiC9_qru9IR=?dbW0$#g#@%ASu{p~+9Z zGoF`GXVI65TGpcWD4~OJp{0Q{KUrBPK7PR$Wj4{eJgb@$>KJ+q*VYZYihBWB86h&| z5mXo~CoTF6i(AQXMAGX*86F#n%^e`|&_3^?8@5eAMNwL1Y z^X!XM6LA?A^*Bku*elLOiZ`5`4z0nbe@o`aIh6Vo z#-7~EJMCe)-)@ge4MU0qalH025zo94Uo6c{qu}qq1%^ES3z+}!!U6vu)UO<}V$|q8 z-)Nj^&2P?~S(>EAr;lA^7S+CkkNcixY+&^qM)A=AGiGrdhciQ`D^vh# z$J}+RfL>|6E72Xb1G*=s5>Cn1L#X0dqQt0m_k9xt(bpoMLWGAx{e$`}^o$IyWls5x0@$YUqzU_G(D7q z?z}!na}%pV+`e}H1Mc}z|80MGfS_Tev-XZm|>L@HINSZ+-l|N}s|gP{wV({~WHIy_G!{h;9I041E@MJ))aTo;0|S zTb?YSqdP@xzaNNvbQ9lSU9M%jr9hY)aJKEOGrkqoi5Naodj#F=$b#hn@5Min@ZXAN!rf(dLc>n!IU^XJ^F$`GSBM^E4RcsbHPe~t z5{EPx^qv<5Sy5>?uL=ZQI~_>@q%L05cl8cZ14PKf{lp_MWXlGDv|xXY{S=CT zVObIY)3A~aeJPJ=QLttq(6Ua=+{J+;6-2} zo%-ZSE7f)#h0E-5mZbb_Ep+?>3oRt(a0U!e^kcTl+Lw&FA!^Es+cLDehVrg%di-xe zb~esXTfNc3;_utPlk14cdVqcxG%?!{+F6%8A7*@lrkwWTdkIPL{)U^a_m%JYy!54; z=_|W|D`ommr>k?0lOr*K*8EMe?pet!@5*eg3@<6TE}a4g4M~s8onu?*hT~8@6!jFZ z#lS$9kyKAs8s3!^fgIWN$F3gZV7z%k5OU`W;4bB#oepEq$th)-%qK0Xn5}Dpj7mJ< zVXi1SPBTCe%;rWE-Eb|XB4h;&_|8JV`o5cG-81K;2@x#dqzs$Hq{!hCGxipfFOwYL zR&xF-*LwK7L33Q~tdEZVuodWRL8KQPCi0T2{>82G*!w{6X*QtXQ2C)@ZadQ8M zDYJP(^-b_?^s=7#D=o>V->v^d8h@~`Qs*XlNYpf6gx1x5O7CDbM&Y=jS4H{gMP%i% z?bpd8awK}fw*E&z6!aYoR^$9vl=|8N$P#G+YYWr$%n3T$t_V6ZYW}9g_nbkF zbmhdZh;P{PZ*V{$MY_4{yOI4OU_5G|63$U62Oco?xUgIGMRhdrhy!4P-XaY~&kF^F zo4Ph0UZ~%bLRctJyr;e=rRp~>jiY%w0Ff?2a^j$Jv9vX@u>pfM){3(4_no$ZY$QVxR%sAmbLhN)>hc7J^_+eJ;OurX~J zY`8ci)`~n*B1#~BF{ceZ(Uu{)B7A5{KSC-nhx+_)#0O{71jnyUpR$SZ$LDWVkVdsi zAwNvNf8?CM5#J=-ixY@&$-6(;=8!o#^rp)U<6!k#{0Gpf`kON7?Q1Fg1-PP#NKV2+ zmZ_@74dD0Bzn1I2PW;vKF$w0+j|G(9jw}`;q6YHGjUVt4B976**%z4Jd5LUnAChOb zEvioe<$>~Z^jV>7cm%y}xb;Nxwr#QsnJFqXOe7^!xLd1L048UxSvapAMBbkvf`4uy zD2}IpHqmi47^X}1VKXVE6CmR zq8;>Y2y{^NserZ7Rxtt^)Ajkl0lxa3rL5~NDlVy11oJKPoJj;)M6+h{GWMWa!>rO8 z@ji5Eet!EGCP0q0ohdwuu**a-mAQAbmnraki1VgPwU!<_)?KQl6ar3wcXS9;rQ$v8 zR`rTm3Um!FwJ>7qo>6RyneppAxoMeKHINbQu%=X|y z?YfZeFu%K8EX>c>zCc)D7Pu#ZsBhS|Tr{L!Bt~dgFswDc3dHqCJ*7;4RrnG3w%VrT zFvEOj&W@9M>1+>L{-e2|b#UU>w5B z;UZ67x7b@oBTbH-CtkGU0^`IYZH7g+^2<3 zoGsM*Il$8e-K$NIQzbMp%Mj?chf;xg&QAtX4-$$cDd0A+nQtu`bPxs=HnhYmmDtB} zuSy?O;HYMCmDBrE-u6YQhk`pXjnF4&(u9lbJ2 z&=4hkZyvUfZQCIDHp@tN(QUZ19%`+=PTHj~F$FPH_Ak?j-mDw(vw>n(hHWPA##ud~ zz!dLnvq6P!BQ@NOLYJv}17nN(8Oh45@ycvHwYefg4g(WSUOM`4Oz_%8*k7~rS4Eq6 zDnaCNBOdzY~q z*i2TyFttsb<2}%s*0+t1HC|f4LGzkNQ!_9@?>(5{B-F%J+W#APU|Nv;jyLPh8&RiR zEQ>FK$)SG<{NHfRG+aJDhmp8fmFd(YoKLqHTf;->>N0D-ylUDDnV5?c%F6LHleA**o;n zG4b36+?9e)Qr=~QXbZwn;ZubIdPTj|IP4up^$gujkgkhA2mgfy1d7I4PRhk)7G{0P zXJ60}-~kj;L?R9Lg;*qU7I|-OyH{S7E)fmnXzOhKH%f zFWU1GeLOIs*qas)P2fw!EW|Z>3>!b=B&Gq$y=u|kg=rj9o|`T`Q6@KP=imsN?0OwS z1MxGO;yeSNNK{IYm;j5{vcF*&&y`J~96fBdHl zXJ&Q^e`tNix`@K+Ky3i%7>5r!d05}CY1p8ux*HQP`49K&Z-efUl3U8pSL-KE zzEC}+QnFGVwvAi)6WfG+Jt!BTKLsmZ$utSfp3Fi|nXOGROuwMDU7xV7spd0zq^Hm3 zG{;X1WI`B1=}M*csv>0+qHkKs#YhK5@>IzoNLlq&1Ja&T(b-W8K;5<++Z)w1$#UfV zn`zbupIM!wkp@h=4W_erY>28)?#4TX&yfB`dWiLR2X7rfllH{p21%I?=?OK~fJP;D zTRK7SPR`|w*)`dFEtf5qxDukCdZmqLp0FbIw&;A@KMVg!c z^vHQ%Gv6T@C|^&vQ*H5pII)k?c2ky+t0W7e4|m&~SZ7yS5mIZ@dM@908h%e#lIYBi zxQ8A1F{yX0GvVv4e`x7{Ni~jKvwVn>Z6etaQGjn$<51!p;;@?2w*5YccG9GP)&%iY zB_|w2ncLQoekU~{-8&S?B0{Rfaj=(w5_-qbCOr3_Y!QV8%S$ zI1)%X?|$505T*QK1*+&ubL*ybNly`Ly;VjBeR866W;F{ngycLhV94hoD$uWaV(wd@ z7~4_i4LX<6fFYsQNFkmE2v3wAOMcpLD0YmaaGJ|i z=TwY+^hmKQuYbqr-dO{)qSFh2T~iq%r}0O)-Bgwf*FczQe}h&^ECYewWn1IF`;L`B ziMCL#X#K-1J`>ppws0R;yJ|lgv`dwy57ArF4@sQiSk+C@RHf6NsJBwrlmuStjppaC z!gq;@tVG^%*)*y_ie5%ey*r#k#nWj$W>3f{LxWiR?bXvdgO{T|s8tq$Q)*X_5)Hir z7*jcSw6j)ixeOsx?lATK39uA7>T?!5QFj-kc6TAg%%9ujscrY4=lX&KT0LhlrInNt zxsx$(H`6o)3qA*a>}?q?6D zn1f33uxG@gh8>$VD6Y}NC1LBbG(0ZI;#L`Dq#vdk(taTR9tpxpx#(eI z!d=^;f)zsf@PtVe@51~;PFd)EL`qXoB$U<87)n~92Ly8U*$qi|>r~D!Fs0r_5vle1 zX*fwnPmHHRuW~P!HPj6)_({fNiOFxI1yUDKV1o+ik-Iu6x|ZQ*iPCq8Z6UOCTY zJP^F~r2bM&fq2k(lK$>n=(PEnuic@`1OZHYDw=9LNz`UJWu_iAS*vhvy~pl*d>RR&9) z++OB+t3SDh^@O54MimmB1t3fxMfNDQ7iPGuj4PYJ!J@7bNNyS=`oLR4gT8kh3G$RP zaU?aLq?627<*TiRTcmN^AVsf!;kXs`^!nqUvQbr84gL*ihG>=Wonq32MAkc1^LoYD zDZPIK9{FAr1!O+B)%t%zO#e?B-`@ZfRm|uzetAx$3^G`{-XRcw$k)eeLw^)?y3HmJ zs@W;Ww#V5?rKf(K@LLgcy0=!XH86BG#egz=rrmR)-zaLSM3%O0X)w;WpUaaIEl?dx z@yvQS{-F4#zXEC>5EaoDG_pO2beE~fW?TkQFi@jf?nsSU_nO~UFEO72O9IOzLXAo; zR- zpAP|4>)Vr6^gQuI<=h?wbX?q`9B5DW;=3`=aBT>x#GUCeGpa1!j8zNl`CLUBla7tnUFz-c8)U~NhHN>|fLoD&2~m`n?g-`#-E+9$ zed!sg4#Xl`*s{yw^oZW~QhGgL3OZddjzFHNip+yZ_V>~5qSGnde=O%f&V4s})G}WM zbCc=$tx(=ZD%M3typ>No>#{J^*5XfrFEFqW*L1_BpKL*H0MxZInOWBh>11c0>Id{r zka0w}7ZX$^H}s%_#-qLxH;xSvCE2;3nu@V3(_e8ylJ}v&PAo{jzu7Mhj%I+Y8fy6v zBp_6P&H4^#!GA5&R!(nxREaq6V2ehWZVK65+H;zyzu4$f>8fzm$FA>V>V>JH7hkTO z8RTXdK5+p|ZKeYw_LEC>xu+9e#p--M#uV>}E24c&1#Eu-ANzzHU9tWJ zsQ&sM33=*Vaeg?fw$|%UOX}Aax+oPgTK8Qb5Iy|zI@$o|b9wL&@Ut@AOC&k=QRyoD z$_}0B<5i{eDQ{3~BX#b2j;7=`}S#4zSqiiqunj#(7Gy;Rbii zQ~xo^8I4zX9g<6DgN|5*@eO=2se1c|yTMn6k!9jr)yxgdlG^&=n=VL!*n>vksU+>` zj^k<+JCUFp0jd31UzwHlAeGR9A_(Z|r-#lP>ObF1=wgmO*{@gPDpjRw!Z z+I6`_S~gY++h>>*vc6u`hwJ`)Kcr9H$5Us)6S%s(TSDu2-&Zz1iRc~|g8HJd%Qni@ zfzp)qAng8h=)Ju6%ATH7``=VQdr^#TCV@dq%@+I4YK@a`K~W}pMNCz1WR6=!JT z^U4a{tSVz4?mI?nlE=CEz-U+5v4;#IBb2Je8JTZJTs0(IW;i#?91{05l+e|oG9a-YXS zTnT4Zx3wA_zLxM|1bDNKj_M$Z8B50!4ru`34N{eQ=?+e(B`&JllHygGw`Ixr)$BLJ zT}r0b{!2;ymq1Jy`kCzlxKi@-7R`Q6V9EiGlk{nH&mY+C2>)JuQ^8f#RdBlw^1?eT zISyhXuN<OMqpx}K z5+2zi8pyWXBFZ3Dl;3sn>Jc!|;WLtI9=!K}?sZ{L}j&ZmU)sn}J@u&25z zug`YX?R3;Qc{ms3-^=8M72!Ke#U1z0>e$SK8;_zIyBfiYQRC*1jZ|R5I=6&{zHIlu zRR(_)E=p+w8?s1a$B_)tuDP|^F0Ec$eul6a#sSZ#w~ay3wZ7KDRhIpuXpHLo**K7L zirbSW+B>NROZHywg1Qhx5&)7CHK-*gO?e13ZvSLgQiZF zRO>@0yrY+N?;k=107a(}xTN9CgNGf;hQ>R*d|w3KHX>jIj{k7$aR;_iJbU*iFcnce z{|bS1Hkml@T3+y_2|d^26|(5;I_n$LD?v>Rz0}Xa_K8x{II#kQEhSg7bten9##QHI z4Sr>C>)OMR3rw3pv_Q+FKlt^Cax7b_oBYNwT}siFpa&Y#EDQ2LNFS)WO}2Y0LRAKz zq{AtkxVmN#K*1A6;?;Q4gWLx0=u@{mmo5ZmseLM^H^(zSqasBWjWHGdyg!1br!7wJ zseV=?vpn;Ts3G*lq)bcc8qT_z^YbkHYEDRda&R2O>D zVURlR6>I;xXbtPkRik&miUc>dp_gaG-S_;g5)U=wTWoGmRhXR&pX@?|M^?UUyS|35SVMJx zq9zg0y`Yj0cPF<>EcAD2D?Jp%+KBjbT-VPAXZFTIUES5Tf?OErl1P?o1k|{n4JCWK z>KtGhhgf+EQ1p(VjDCW9wAGJ8&6{${#3@u&nKU0R!-yb(@M? z>+#s(Qcb9I0iy4tgF**f+1}h`Hee?zhm)ps%t?NZwG=?amrZhkEnIcZNFP{TN5IOe zfe%Y19QO&Ln8+tXl#iVDXUKwU2lf5!wkdyA2f1o~N@j{@Z>j6|Lo*Hu4g5J;+iKZu zvud;DcG5S~El$i9&08J(u#>3LaFy8TVc0xmCbZZ_pvP^!E;YumStyKfxXU-8X-xED zD;^fMGF7yA?C>SBzl0MrxhbCg+L4?RWGqkW5C7Ws9YY1C@!F6r&7E=r-nsK z@QQzaY~R8M#X;kXTU))3+j2}ceew9C@HR865^;>Lvw+0AlD2_FH5ftoWK^ROTP?{ z%v|RY`b7G8wcANgHbE?fDK`?(x%`?7BGwy3KTUPj@Hjz2LwD9D8_U-7jB$XoL`JFw zk)@4S+B_x)TvQ3pk$pmnS!(Au)^KC&61r?-B_;25Xfsiz{(&AJ3~tzv%-FO{A$;rtccAkcm@ccW#Mq7-0@$3gs0oC(9Q*Di6Co*23c7#T@F;^Xio;d*$GIssSr- zUFS?9zm9(`!A||DL{2M$TpNZZ%yzxxp~mu=f9-6ZZ%yu2b%RalZLQ))Bv?%|R*2Op z7-e4u`3~}wMn%iW)@3je$F^1a(j}j5d{6lI1b=6?)1)()<{Kow`6sdbld}P43X18# ztS3`GTLw14VdmZZD)I3fnHaRXBScD!Ye-3iI;Nj5Av1UbP^MW(s(xRdlX>S;29=R? z7t7dUl^RQyB#9G!7lG!n?fwXKh?`4UGC$BuhXrJTu%+!acRlU2rU)U4?}a`mygv2+ z4bTeNi&@e=)ftS>jD?dtA`Q)8pK}Y+I$?1236S^=ppl6qj&up(rvN}l(m93R{4jCb z7Wvw{`5CjDd)=xMC3!;(a;B0itLoWzNJwecHnS4rqDqS3R&CoQB|WX}>GQUk5@0BAv9510NjJCx;Qg;1fkzE5}leO0;_ z0NLm4ySkk#5FD?A%ak_8v?# z#suPxPzj58OLBQjznQh&c}Wm$e3(LzJT=yV*(ari7tN8a3()o_77tUsj1qZ}?2#jW zlFj0gooKh#dooPhN0K0_Xp79`|BLAN_cTe9-ek5Pi8Ybm!-FD5-)(MC-d`RpSPHVg za|p}}0B)UjNHoHy4UgiyihRu_^k}@~_*)`umIH0KUz*53f4)Yu-d7}Z_E~0}K1PMx z#8;0amWr5uRi)1zGL2OiPa(Nts{u=GLWI;*e03qz`}v+RDgMajgtQ-o)(}!@@BqN6 zlLPE2Of}LAxcOBt9>&HwQL7I%uCCES65X2vt?uSJt-&vLa2JjsPwmeiwi2o&$Zct^ zS?A)7W-GVpxaF5Fl)m1g!^WE}aAr=aQ@3{HZ^RB@Dj9BH+WZf8tK;EFD7%ToW zPe<$^f~$7E|s zA@Afyu6b75nm-Pdf)5|aeWpNQw*19{L%C9CX!AVGL%wA2OcYcoHZNU9vw=3(Qml_i zcwC>MY~!}XbKa4Rx3XIUZ$8gunj@RrDh_u`!pP8zaKoJ&~HWHxupm z)*^#LI(}Q9^T}uWwOOY749>^w)Q`S2OdPwAzuj6xX>v9U(M-(ft0E z7{cIM=am(uzU`wY-u5a`gy zdQmlS(B>iqrr?8WIOfW{{rP4%^$VXxOED{K}nZ`utm`)o{ z9cm{yO@L-hU8WFRzn0#g*V+})xGfog;Ysv(l3v@>Brj<|!$c0IR0HB(PB+AyUVZ7~ z=P&5MS>;AIj7a04hf39M^ClbQk#Q@qgFP`lKL*~}6p Y{AOM Date: Tue, 1 Jul 2025 14:02:56 +0200 Subject: [PATCH 17/28] Fix links to react-admin-ee.marmelab.com in features --- docs/assets/features.md_ignore | 36 +++++++++++++++++----------------- docs/assets/tips.md_ignore | 4 ++-- 2 files changed, 20 insertions(+), 20 deletions(-) diff --git a/docs/assets/features.md_ignore b/docs/assets/features.md_ignore index 5cdcb571a6f..900c0d21d57 100644 --- a/docs/assets/features.md_ignore +++ b/docs/assets/features.md_ignore @@ -24,7 +24,7 @@ The `` component lets users switch from light to dark mode, a If you need horizontal space, switch the classic menu for an ``. It renders a reduced menu bar with a sliding panel for second-level menu items. This menu saves a lot of screen real estate, and allows for sub menus of any level of complexity. #UI https://marmelab.com/react-admin/IconMenu.html -![IconMenu](https://marmelab.com/ra-enterprise/modules/assets/ra-multilevelmenu-categories.gif) +![IconMenu](https://react-admin-ee.marmelab.com/assets/ra-multilevelmenu-categories.gif) --- @@ -54,7 +54,7 @@ When a form becomes too complex, organize the inputs in different sections with To provide users visibility on their progression through a complex form, use the ``. #form https://marmelab.com/react-admin/WizardForm.html -![WizardForm](https://marmelab.com/ra-enterprise/modules/assets/ra-wizard-form-overview.gif) +![WizardForm](https://react-admin-ee.marmelab.com/assets/ra-wizard-form-overview.gif) --- @@ -118,7 +118,7 @@ With your admin getting bigger, or if you have to manage many resources and/or s
    + ## E-commerce @@ -433,6 +447,8 @@ The source shows how to implement the following features: A Team Wiki board built with React-admin Enterprise edition. +[![Team wiki](./img/team-wiki.jpg)](https://marmelab.com/team-wiki/) + * Demo: [https://marmelab.com/team-wiki/](https://marmelab.com/team-wiki/) * Source code: [https://github.com/marmelab/team-wiki](https://github.com/marmelab/team-wiki) @@ -452,7 +468,7 @@ The source shows how to implement the following features: A framework built on top of react-admin for building developer portals. -
    +[![Broadcom API Hub](https://marmelab.com/static/bcb26e245e6e50e8f13631a156727d2e/46097/API_Hub.png)](https://github.com/CAAPIM/APIHub) * Source code: [https://github.com/CAAPIM/APIHub](https://github.com/CAAPIM/APIHub) From 6b0bdf86aa5fd2478bb78b7cc4224facee510ea6 Mon Sep 17 00:00:00 2001 From: Gildas <1122076+djhi@users.noreply.github.com> Date: Thu, 3 Jul 2025 15:50:01 +0200 Subject: [PATCH 26/28] [Doc] Mention the codemod in `` documentation --- docs/Datagrid.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/Datagrid.md b/docs/Datagrid.md index 69efc6f8d9c..d7f45abfff7 100644 --- a/docs/Datagrid.md +++ b/docs/Datagrid.md @@ -6,7 +6,7 @@ storybook_path: ra-ui-materialui-list-datagrid--basic # `` -> **Note:** React-admin v5.8.0 introduced a successor to `` called [``](./DataTable.md). It offers a better developer experience by removing child inspection, and avoids 'polluting' the field components with props only serving in datagrid columns (e.g. sortBy, label, etc). Hence, we recommend using `` instead of `` for new projects. `` is of course still available for backward compatibility. +> **Note:** React-admin v5.8.0 introduced a successor to `` called [``](./DataTable.md). It offers a better developer experience by removing child inspection, and avoids 'polluting' the field components with props only serving in datagrid columns (e.g. sortBy, label, etc). Hence, we recommend using `` instead of `` for new projects. `` is of course still available for backward compatibility. If you want to migrate to ``, we offer a [codemod](./DataTable.md#migrating-from-datagrid-to-datatable) that makes it easier. The `` component renders a list of records as a table. It supports sorting, row selection for bulk actions, and an expand panel. It is usually used as a descendant of the [``](./List.md#list) and [``](./ReferenceManyField.md) components. Outside these components, it must be used inside a `ListContext`. From 67c78e54fd1f704bea14048f131a1e3f1ec13044 Mon Sep 17 00:00:00 2001 From: Gildas <1122076+djhi@users.noreply.github.com> Date: Thu, 3 Jul 2025 17:27:14 +0200 Subject: [PATCH 27/28] [Doc] Fix storybook detection and handling on client-side navigation --- docs/js/ra-navigation.js | 30 ++++++++++++++++++++++++------ 1 file changed, 24 insertions(+), 6 deletions(-) diff --git a/docs/js/ra-navigation.js b/docs/js/ra-navigation.js index edd36cf86c2..feb50b68b2d 100644 --- a/docs/js/ra-navigation.js +++ b/docs/js/ra-navigation.js @@ -60,9 +60,15 @@ function buildPageToC() { hasInnerContainers: true, }); - const storybookPathMetaContent = document.querySelector( + const storybookPathMetaElement = document.querySelector( STORYBOOK_PATH_META_SELECTOR - ).content; + ); + let storybookPathMetaContent; + if (storybookPathMetaElement) { + storybookPathMetaContent = document.querySelector( + STORYBOOK_PATH_META_SELECTOR + ).content; + } const tocList = document.querySelector('.toc-list'); if (!tocList || !storybookPathMetaContent) { return; @@ -113,12 +119,24 @@ function replaceContent(text) { ); const newStorybookPathContent = newStorybookPathMeta?.content ?? ''; - document - .querySelector(STORYBOOK_PATH_META_SELECTOR) - .setAttribute('content', newStorybookPathContent); + const storybookPathMetaElement = document.querySelector( + STORYBOOK_PATH_META_SELECTOR + ); + if (storybookPathMetaElement && newStorybookPathContent) { + document + .querySelector(STORYBOOK_PATH_META_SELECTOR) + .setAttribute('content', newStorybookPathContent); + } else if (newStorybookPathContent) { + const metaElement = document.createElement('meta'); + metaElement.setAttribute('name', 'storybook_path'); + metaElement.setAttribute('content', newStorybookPathContent); + document.head.appendChild(metaElement); + } else { + // Remove the meta element if it doesn't exist in the new content + storybookPathMetaElement?.remove(); + } window.scrollTo(0, 0); - buildPageToC(); navigationFitScroll(); From a7480c3bbff553832e4617a377c747057b7a13bf Mon Sep 17 00:00:00 2001 From: Gildas <1122076+djhi@users.noreply.github.com> Date: Fri, 4 Jul 2025 09:28:57 +0200 Subject: [PATCH 28/28] Fix tests after rebase --- .../src/field/ReferenceManyField.stories.tsx | 6 +-- .../src/field/ReferenceOneField.stories.tsx | 47 ++++++++++--------- 2 files changed, 28 insertions(+), 25 deletions(-) diff --git a/packages/ra-ui-materialui/src/field/ReferenceManyField.stories.tsx b/packages/ra-ui-materialui/src/field/ReferenceManyField.stories.tsx index 77770c0358e..9b45707ea22 100644 --- a/packages/ra-ui-materialui/src/field/ReferenceManyField.stories.tsx +++ b/packages/ra-ui-materialui/src/field/ReferenceManyField.stories.tsx @@ -135,9 +135,9 @@ export const Empty = () => ( target="author_id" empty="no books" > - - - + + + ); diff --git a/packages/ra-ui-materialui/src/field/ReferenceOneField.stories.tsx b/packages/ra-ui-materialui/src/field/ReferenceOneField.stories.tsx index d65d5499d52..0db123a2b9b 100644 --- a/packages/ra-ui-materialui/src/field/ReferenceOneField.stories.tsx +++ b/packages/ra-ui-materialui/src/field/ReferenceOneField.stories.tsx @@ -255,20 +255,21 @@ export const Empty = () => ( name="books" list={() => ( - - - - - - - - - + + + + + + + + + + + )} show={() => ( @@ -296,14 +297,16 @@ export const Empty = () => ( name="book_details" list={() => ( - - - - - + + + + + + + )} create={() => (