From e78074992b79996bd3289c8460bb442516e738e9 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Torkel=20=C3=96degaard?= Date: Mon, 6 Jan 2020 16:56:34 +0100 Subject: [PATCH] AddDatasourcePage: Refactoring & more Phantom plugins (#21261) * WIP: New types and state refactoring * Added buildCategories & tests * Added phantom plugins * fixed tests * Minor changes, force enterprise plugins to enterprise category * Fixed tests --- .../datasources/NewDataSourcePage.tsx | 137 ++++---------- .../DataSourceSettingsPage.test.tsx.snap | 2 + .../app/features/datasources/state/actions.ts | 45 ++--- .../datasources/state/buildCategories.test.ts | 56 ++++++ .../datasources/state/buildCategories.ts | 175 ++++++++++++++++++ .../datasources/state/reducers.test.ts | 14 +- .../features/datasources/state/reducers.ts | 16 +- .../features/datasources/state/selectors.ts | 4 +- .../features/plugins/__mocks__/pluginMocks.ts | 13 +- .../plugin.json | 2 +- .../plugins/datasource/graphite/plugin.json | 2 +- .../plugins/datasource/prometheus/plugin.json | 2 +- public/app/types/datasources.ts | 9 +- public/img/plugins/appdynamics.svg | 17 ++ public/img/plugins/datadog.png | Bin 0 -> 8009 bytes public/img/plugins/dynatrace.png | Bin 0 -> 2328 bytes public/img/plugins/oracle.png | Bin 0 -> 74402 bytes public/img/plugins/servicenow.svg | 22 +++ public/img/plugins/splunk_logo_128.png | Bin 0 -> 4019 bytes 19 files changed, 358 insertions(+), 158 deletions(-) create mode 100644 public/app/features/datasources/state/buildCategories.test.ts create mode 100644 public/app/features/datasources/state/buildCategories.ts create mode 100644 public/img/plugins/appdynamics.svg create mode 100644 public/img/plugins/datadog.png create mode 100644 public/img/plugins/dynatrace.png create mode 100644 public/img/plugins/oracle.png create mode 100644 public/img/plugins/servicenow.svg create mode 100644 public/img/plugins/splunk_logo_128.png diff --git a/public/app/features/datasources/NewDataSourcePage.tsx b/public/app/features/datasources/NewDataSourcePage.tsx index a9b6588a35c..90786496e68 100644 --- a/public/app/features/datasources/NewDataSourcePage.tsx +++ b/public/app/features/datasources/NewDataSourcePage.tsx @@ -1,56 +1,33 @@ import React, { FC, PureComponent } from 'react'; +import classNames from 'classnames'; import { connect } from 'react-redux'; import { hot } from 'react-hot-loader'; -import { DataSourcePluginMeta, NavModel, PluginType } from '@grafana/data'; +import { DataSourcePluginMeta, NavModel } from '@grafana/data'; import { List } from '@grafana/ui'; import { e2e } from '@grafana/e2e'; import Page from 'app/core/components/Page/Page'; -import { StoreState } from 'app/types'; -import { addDataSource, loadDataSourceTypes, setDataSourceTypeSearchQuery } from './state/actions'; -import { getDataSourceTypes } from './state/selectors'; +import { StoreState, DataSourcePluginCategory } from 'app/types'; +import { addDataSource, loadDataSourcePlugins, setDataSourceTypeSearchQuery } from './state/actions'; +import { getDataSourcePlugins } from './state/selectors'; import { FilterInput } from 'app/core/components/FilterInput/FilterInput'; export interface Props { navModel: NavModel; - dataSourceTypes: DataSourcePluginMeta[]; + plugins: DataSourcePluginMeta[]; + categories: DataSourcePluginCategory[]; isLoading: boolean; addDataSource: typeof addDataSource; - loadDataSourceTypes: typeof loadDataSourceTypes; + loadDataSourcePlugins: typeof loadDataSourcePlugins; searchQuery: string; setDataSourceTypeSearchQuery: typeof setDataSourceTypeSearchQuery; } -interface DataSourceCategories { - [key: string]: DataSourcePluginMeta[]; -} - -interface DataSourceCategoryInfo { - id: string; - title: string; -} - class NewDataSourcePage extends PureComponent { searchInput: HTMLElement; - categoryInfoList: DataSourceCategoryInfo[] = [ - { id: 'tsdb', title: 'Time series databases' }, - { id: 'logging', title: 'Logging & document databases' }, - { id: 'sql', title: 'SQL' }, - { id: 'cloud', title: 'Cloud' }, - { id: 'other', title: 'Others' }, - ]; - - sortingRules: { [id: string]: number } = { - prometheus: 100, - graphite: 95, - loki: 90, - mysql: 80, - postgres: 79, - gcloud: -1, - }; componentDidMount() { - this.props.loadDataSourceTypes(); + this.props.loadDataSourcePlugins(); this.searchInput.focus(); } @@ -62,28 +39,14 @@ class NewDataSourcePage extends PureComponent { this.props.setDataSourceTypeSearchQuery(value); }; - renderTypes(types: DataSourcePluginMeta[]) { - if (!types) { + renderPlugins(plugins: DataSourcePluginMeta[]) { + if (!plugins || !plugins.length) { return null; } - // apply custom sort ranking - types.sort((a, b) => { - const aSort = this.sortingRules[a.id] || 0; - const bSort = this.sortingRules[b.id] || 0; - if (aSort > bSort) { - return -1; - } - if (aSort < bSort) { - return 1; - } - - return a.name > b.name ? -1 : 1; - }); - return ( item.id.toString()} renderItem={item => ( { evt.stopPropagation(); }; - renderGroupedList() { - const { dataSourceTypes } = this.props; - - if (dataSourceTypes.length === 0) { - return null; - } - - const categories = dataSourceTypes.reduce((accumulator, item) => { - const category = item.category || 'other'; - const list = accumulator[category] || []; - list.push(item); - accumulator[category] = list; - return accumulator; - }, {} as DataSourceCategories); - - categories['cloud'].push(getGrafanaCloudPhantomPlugin()); + renderCategories() { + const { categories } = this.props; return ( <> - {this.categoryInfoList.map(category => ( + {categories.map(category => (
{category.title}
- {this.renderTypes(categories[category.id])} + {this.renderPlugins(category.plugins)}
))}
- {searchQuery && this.renderTypes(dataSourceTypes)} - {!searchQuery && this.renderGroupedList()} + {searchQuery && this.renderPlugins(plugins)} + {!searchQuery && this.renderCategories()}
@@ -179,15 +128,18 @@ interface DataSourceTypeCardProps { const DataSourceTypeCard: FC = props => { const { plugin, onLearnMoreClick } = props; - const canSelect = plugin.id !== 'gcloud'; - const onClick = canSelect ? props.onClick : () => {}; + const isPhantom = plugin.module === 'phantom'; + const onClick = !isPhantom ? props.onClick : () => {}; // find first plugin info link - const learnMoreLink = plugin.info.links && plugin.info.links.length > 0 ? plugin.info.links[0].url : null; + const learnMoreLink = plugin.info.links && plugin.info.links.length > 0 ? plugin.info.links[0] : null; + const mainClassName = classNames('add-data-source-item', { + 'add-data-source-item--phantom': isPhantom, + }); return (
@@ -200,44 +152,20 @@ const DataSourceTypeCard: FC = props => { {learnMoreLink && ( - Learn more + {learnMoreLink.name} )} - {canSelect && } + {!isPhantom && }
); }; -function getGrafanaCloudPhantomPlugin(): DataSourcePluginMeta { - return { - id: 'gcloud', - name: 'Grafana Cloud', - type: PluginType.datasource, - module: '', - baseUrl: '', - info: { - description: 'Hosted Graphite, Prometheus and Loki', - logos: { small: 'public/img/grafana_icon.svg', large: 'asd' }, - author: { name: 'Grafana Labs' }, - links: [ - { - url: 'https://grafana.com/products/cloud/', - name: 'Learn more', - }, - ], - screenshots: [], - updated: '2019-05-10', - version: '1.0.0', - }, - }; -} - export function getNavModel(): NavModel { const main = { icon: 'gicon gicon-add-datasources', @@ -256,15 +184,16 @@ export function getNavModel(): NavModel { function mapStateToProps(state: StoreState) { return { navModel: getNavModel(), - dataSourceTypes: getDataSourceTypes(state.dataSources), + plugins: getDataSourcePlugins(state.dataSources), searchQuery: state.dataSources.dataSourceTypeSearchQuery, + categories: state.dataSources.categories, isLoading: state.dataSources.isLoadingDataSources, }; } const mapDispatchToProps = { addDataSource, - loadDataSourceTypes, + loadDataSourcePlugins, setDataSourceTypeSearchQuery, }; diff --git a/public/app/features/datasources/settings/__snapshots__/DataSourceSettingsPage.test.tsx.snap b/public/app/features/datasources/settings/__snapshots__/DataSourceSettingsPage.test.tsx.snap index 063ebf8418d..057e0daf935 100644 --- a/public/app/features/datasources/settings/__snapshots__/DataSourceSettingsPage.test.tsx.snap +++ b/public/app/features/datasources/settings/__snapshots__/DataSourceSettingsPage.test.tsx.snap @@ -83,6 +83,7 @@ exports[`Render should render alpha info text 1`] = ` }, "screenshots": Array [ Object { + "name": "test", "path": "screenshot", }, ], @@ -272,6 +273,7 @@ exports[`Render should render is ready only message 1`] = ` }, "screenshots": Array [ Object { + "name": "test", "path": "screenshot", }, ], diff --git a/public/app/features/datasources/state/actions.ts b/public/app/features/datasources/state/actions.ts index 4ca15f1c2db..35ed973da95 100644 --- a/public/app/features/datasources/state/actions.ts +++ b/public/app/features/datasources/state/actions.ts @@ -1,47 +1,33 @@ -import { ThunkAction } from 'redux-thunk'; import config from '../../../core/config'; import { getBackendSrv } from '@grafana/runtime'; import { getDatasourceSrv } from 'app/features/plugins/datasource_srv'; import { LayoutMode } from 'app/core/components/LayoutSelector/LayoutSelector'; -import { updateLocation, updateNavIndex, UpdateNavIndexAction } from 'app/core/actions'; +import { updateLocation, updateNavIndex } from 'app/core/actions'; import { buildNavModel } from './navModel'; import { DataSourceSettings, DataSourcePluginMeta } from '@grafana/data'; -import { StoreState } from 'app/types'; -import { LocationUpdate } from '@grafana/runtime'; +import { ThunkResult, DataSourcePluginCategory } from 'app/types'; import { actionCreatorFactory } from 'app/core/redux'; -import { ActionOf } from 'app/core/redux/actionCreatorFactory'; import { getPluginSettings } from 'app/features/plugins/PluginSettingsCache'; import { importDataSourcePlugin } from 'app/features/plugins/plugin_loader'; +import { buildCategories } from './buildCategories'; export const dataSourceLoaded = actionCreatorFactory('LOAD_DATA_SOURCE').create(); - export const dataSourcesLoaded = actionCreatorFactory('LOAD_DATA_SOURCES').create(); - export const dataSourceMetaLoaded = actionCreatorFactory('LOAD_DATA_SOURCE_META').create(); - -export const dataSourceTypesLoad = actionCreatorFactory('LOAD_DATA_SOURCE_TYPES').create(); - -export const dataSourceTypesLoaded = actionCreatorFactory('LOADED_DATA_SOURCE_TYPES').create(); - +export const dataSourcePluginsLoad = actionCreatorFactory('LOAD_DATA_SOURCE_PLUGINS').create(); +export const dataSourcePluginsLoaded = actionCreatorFactory( + 'LOADED_DATA_SOURCE_PLUGINS' +).create(); export const setDataSourcesSearchQuery = actionCreatorFactory('SET_DATA_SOURCES_SEARCH_QUERY').create(); - export const setDataSourcesLayoutMode = actionCreatorFactory('SET_DATA_SOURCES_LAYOUT_MODE').create(); - export const setDataSourceTypeSearchQuery = actionCreatorFactory('SET_DATA_SOURCE_TYPE_SEARCH_QUERY').create(); - export const setDataSourceName = actionCreatorFactory('SET_DATA_SOURCE_NAME').create(); - export const setIsDefault = actionCreatorFactory('SET_IS_DEFAULT').create(); -export type Action = - | UpdateNavIndexAction - | ActionOf - | ActionOf - | ActionOf - | ActionOf - | ActionOf; - -type ThunkResult = ThunkAction; +export interface DataSourceTypesLoadedPayload { + plugins: DataSourcePluginMeta[]; + categories: DataSourcePluginCategory[]; +} export function loadDataSources(): ThunkResult { return async dispatch => { @@ -84,11 +70,12 @@ export function addDataSource(plugin: DataSourcePluginMeta): ThunkResult { }; } -export function loadDataSourceTypes(): ThunkResult { +export function loadDataSourcePlugins(): ThunkResult { return async dispatch => { - dispatch(dataSourceTypesLoad()); - const result = await getBackendSrv().get('/api/plugins', { enabled: 1, type: 'datasource' }); - dispatch(dataSourceTypesLoaded(result as DataSourcePluginMeta[])); + dispatch(dataSourcePluginsLoad()); + const plugins = await getBackendSrv().get('/api/plugins', { enabled: 1, type: 'datasource' }); + const categories = buildCategories(plugins); + dispatch(dataSourcePluginsLoaded({ plugins, categories })); }; } diff --git a/public/app/features/datasources/state/buildCategories.test.ts b/public/app/features/datasources/state/buildCategories.test.ts new file mode 100644 index 00000000000..f445fd53085 --- /dev/null +++ b/public/app/features/datasources/state/buildCategories.test.ts @@ -0,0 +1,56 @@ +import { buildCategories } from './buildCategories'; +import { getMockPlugin } from '../../plugins/__mocks__/pluginMocks'; +import { DataSourcePluginMeta } from '@grafana/data'; + +const plugins: DataSourcePluginMeta[] = [ + { + ...getMockPlugin({ id: 'graphite' }), + category: 'tsdb', + }, + { + ...getMockPlugin({ id: 'prometheus' }), + category: 'tsdb', + }, + { + ...getMockPlugin({ id: 'elasticsearch' }), + category: 'logging', + }, + { + ...getMockPlugin({ id: 'loki' }), + category: 'logging', + }, + { + ...getMockPlugin({ id: 'azure' }), + category: 'cloud', + }, +]; + +describe('buildCategories', () => { + const categories = buildCategories(plugins); + + it('should group plugins into categories', () => { + expect(categories.length).toBe(6); + expect(categories[0].title).toBe('Time series databases'); + expect(categories[0].plugins.length).toBe(2); + expect(categories[1].title).toBe('Logging & document databases'); + }); + + it('should sort plugins according to hard coded sorting rules', () => { + expect(categories[1].plugins[0].id).toBe('loki'); + }); + + it('should add phantom plugin for Grafana cloud', () => { + expect(categories[3].title).toBe('Cloud'); + expect(categories[3].plugins.length).toBe(2); + expect(categories[3].plugins[1].id).toBe('gcloud'); + }); + + it('should set module to phantom on phantom plugins', () => { + expect(categories[4].plugins[0].module).toBe('phantom'); + }); + + it('should add enterprise phantom plugins', () => { + expect(categories[4].title).toBe('Enterprise plugins'); + expect(categories[4].plugins.length).toBe(5); + }); +}); diff --git a/public/app/features/datasources/state/buildCategories.ts b/public/app/features/datasources/state/buildCategories.ts new file mode 100644 index 00000000000..9ff5341e405 --- /dev/null +++ b/public/app/features/datasources/state/buildCategories.ts @@ -0,0 +1,175 @@ +import { DataSourcePluginMeta, PluginType } from '@grafana/data'; +import { DataSourcePluginCategory } from 'app/types'; + +export function buildCategories(plugins: DataSourcePluginMeta[]): DataSourcePluginCategory[] { + const categories: DataSourcePluginCategory[] = [ + { id: 'tsdb', title: 'Time series databases', plugins: [] }, + { id: 'logging', title: 'Logging & document databases', plugins: [] }, + { id: 'sql', title: 'SQL', plugins: [] }, + { id: 'cloud', title: 'Cloud', plugins: [] }, + { id: 'enterprise', title: 'Enterprise plugins', plugins: [] }, + { id: 'other', title: 'Others', plugins: [] }, + ]; + + const categoryIndex: Record = {}; + const pluginIndex: Record = {}; + const enterprisePlugins = getEnterprisePhantomPlugins(); + + // build indices + for (const category of categories) { + categoryIndex[category.id] = category; + } + + for (const plugin of plugins) { + // Force category for enterprise plugins + if (enterprisePlugins.find(item => item.id === plugin.id)) { + plugin.category = 'enterprise'; + } + + // Fix link name + if (plugin.info.links) { + for (const link of plugin.info.links) { + link.name = 'Learn more'; + } + } + + const category = categories.find(item => item.id === plugin.category) || categoryIndex['other']; + category.plugins.push(plugin); + // add to plugin index + pluginIndex[plugin.id] = plugin; + } + + for (const category of categories) { + // add phantom plugin + if (category.id === 'cloud') { + category.plugins.push(getGrafanaCloudPhantomPlugin()); + } + + // add phantom plugins + if (category.id === 'enterprise') { + for (const plugin of enterprisePlugins) { + if (!pluginIndex[plugin.id]) { + category.plugins.push(plugin); + } + } + } + + sortPlugins(category.plugins); + } + + return categories; +} + +function sortPlugins(plugins: DataSourcePluginMeta[]) { + const sortingRules: { [id: string]: number } = { + prometheus: 100, + graphite: 95, + loki: 90, + mysql: 80, + postgres: 79, + gcloud: -1, + }; + + plugins.sort((a, b) => { + const aSort = sortingRules[a.id] || 0; + const bSort = sortingRules[b.id] || 0; + if (aSort > bSort) { + return -1; + } + if (aSort < bSort) { + return 1; + } + + return a.name > b.name ? -1 : 1; + }); +} + +function getEnterprisePhantomPlugins(): DataSourcePluginMeta[] { + return [ + getPhantomPlugin({ + id: 'grafana-splunk-datasource', + name: 'Splunk', + description: 'Visualize & explore Splunk logs', + imgUrl: 'public/img/plugins/splunk_logo_128.png', + }), + getPhantomPlugin({ + id: 'grafana-oracle-datasource', + name: 'Oracle', + description: 'Visualize & explore Oracle SQL', + imgUrl: 'public/img/plugins/oracle.png', + }), + getPhantomPlugin({ + id: 'grafana-dynatrace-datasource', + name: 'Dynatrace', + description: 'Visualize & explore Dynatrace data', + imgUrl: 'public/img/plugins/dynatrace.png', + }), + getPhantomPlugin({ + id: 'grafana-servicenow-datasource', + description: 'ServiceNow integration & data source', + name: 'ServiceNow', + imgUrl: 'public/img/plugins/servicenow.svg', + }), + getPhantomPlugin({ + id: 'grafana-datadog-datasource', + description: 'DataDog integration & data source', + name: 'DataDog', + imgUrl: 'public/img/plugins/datadog.png', + }), + ]; +} + +function getGrafanaCloudPhantomPlugin(): DataSourcePluginMeta { + return { + id: 'gcloud', + name: 'Grafana Cloud', + type: PluginType.datasource, + module: 'phantom', + baseUrl: '', + info: { + description: 'Hosted Graphite, Prometheus and Loki', + logos: { small: 'public/img/grafana_icon.svg', large: 'asd' }, + author: { name: 'Grafana Labs' }, + links: [ + { + url: 'https://grafana.com/products/cloud/', + name: 'Learn more', + }, + ], + screenshots: [], + updated: '2019-05-10', + version: '1.0.0', + }, + }; +} + +interface GetPhantomPluginOptions { + id: string; + name: string; + description: string; + imgUrl: string; +} + +function getPhantomPlugin(options: GetPhantomPluginOptions): DataSourcePluginMeta { + return { + id: options.id, + name: options.name, + type: PluginType.datasource, + module: 'phantom', + baseUrl: '', + info: { + description: options.description, + logos: { small: options.imgUrl, large: options.imgUrl }, + author: { name: 'Grafana Labs' }, + links: [ + { + url: 'https://grafana.com/grafana/plugins/' + options.id, + name: 'Install now', + }, + ], + screenshots: [], + updated: '2019-05-10', + version: '1.0.0', + }, + }; +} diff --git a/public/app/features/datasources/state/reducers.test.ts b/public/app/features/datasources/state/reducers.test.ts index 63495ba0f0a..61e79c94de9 100644 --- a/public/app/features/datasources/state/reducers.test.ts +++ b/public/app/features/datasources/state/reducers.test.ts @@ -5,8 +5,8 @@ import { dataSourceLoaded, setDataSourcesSearchQuery, setDataSourcesLayoutMode, - dataSourceTypesLoad, - dataSourceTypesLoaded, + dataSourcePluginsLoad, + dataSourcePluginsLoaded, setDataSourceTypeSearchQuery, dataSourceMetaLoaded, setDataSourceName, @@ -76,12 +76,12 @@ describe('dataSourcesReducer', () => { describe('when dataSourceTypesLoad is dispatched', () => { it('then state should be correct', () => { - const state: DataSourcesState = { ...initialState, dataSourceTypes: [mockPlugin()] }; + const state: DataSourcesState = { ...initialState, plugins: [mockPlugin()] }; reducerTester() .givenReducer(dataSourcesReducer, state) - .whenActionIsDispatched(dataSourceTypesLoad()) - .thenStateShouldEqual({ ...initialState, dataSourceTypes: [], isLoadingDataSources: true }); + .whenActionIsDispatched(dataSourcePluginsLoad()) + .thenStateShouldEqual({ ...initialState, isLoadingDataSources: true }); }); }); @@ -92,8 +92,8 @@ describe('dataSourcesReducer', () => { reducerTester() .givenReducer(dataSourcesReducer, state) - .whenActionIsDispatched(dataSourceTypesLoaded(dataSourceTypes)) - .thenStateShouldEqual({ ...initialState, dataSourceTypes, isLoadingDataSources: false }); + .whenActionIsDispatched(dataSourcePluginsLoaded({ plugins: dataSourceTypes, categories: [] })) + .thenStateShouldEqual({ ...initialState, plugins: dataSourceTypes, isLoadingDataSources: false }); }); }); diff --git a/public/app/features/datasources/state/reducers.ts b/public/app/features/datasources/state/reducers.ts index 4871f4f9be2..52361c1823a 100644 --- a/public/app/features/datasources/state/reducers.ts +++ b/public/app/features/datasources/state/reducers.ts @@ -5,8 +5,8 @@ import { dataSourcesLoaded, setDataSourcesSearchQuery, setDataSourcesLayoutMode, - dataSourceTypesLoad, - dataSourceTypesLoaded, + dataSourcePluginsLoad, + dataSourcePluginsLoaded, setDataSourceTypeSearchQuery, dataSourceMetaLoaded, setDataSourceName, @@ -17,11 +17,12 @@ import { reducerFactory } from 'app/core/redux'; export const initialState: DataSourcesState = { dataSources: [], + plugins: [], + categories: [], dataSource: {} as DataSourceSettings, layoutMode: LayoutModes.List, searchQuery: '', dataSourcesCount: 0, - dataSourceTypes: [], dataSourceTypeSearchQuery: '', hasFetched: false, isLoadingDataSources: false, @@ -51,14 +52,15 @@ export const dataSourcesReducer = reducerFactory(initialState) mapper: (state, action) => ({ ...state, layoutMode: action.payload }), }) .addMapper({ - filter: dataSourceTypesLoad, - mapper: state => ({ ...state, dataSourceTypes: [], isLoadingDataSources: true }), + filter: dataSourcePluginsLoad, + mapper: state => ({ ...state, plugins: [], isLoadingDataSources: true }), }) .addMapper({ - filter: dataSourceTypesLoaded, + filter: dataSourcePluginsLoaded, mapper: (state, action) => ({ ...state, - dataSourceTypes: action.payload, + plugins: action.payload.plugins, + categories: action.payload.categories, isLoadingDataSources: false, }), }) diff --git a/public/app/features/datasources/state/selectors.ts b/public/app/features/datasources/state/selectors.ts index d9b939e272f..9a0a6a0ef42 100644 --- a/public/app/features/datasources/state/selectors.ts +++ b/public/app/features/datasources/state/selectors.ts @@ -10,10 +10,10 @@ export const getDataSources = (state: DataSourcesState) => { }); }; -export const getDataSourceTypes = (state: DataSourcesState) => { +export const getDataSourcePlugins = (state: DataSourcesState) => { const regex = new RegExp(state.dataSourceTypeSearchQuery, 'i'); - return state.dataSourceTypes.filter((type: DataSourcePluginMeta) => { + return state.plugins.filter((type: DataSourcePluginMeta) => { return regex.test(type.name); }); }; diff --git a/public/app/features/plugins/__mocks__/pluginMocks.ts b/public/app/features/plugins/__mocks__/pluginMocks.ts index a0517eec91b..d45c5a1dfae 100644 --- a/public/app/features/plugins/__mocks__/pluginMocks.ts +++ b/public/app/features/plugins/__mocks__/pluginMocks.ts @@ -1,3 +1,4 @@ +import { defaultsDeep } from 'lodash'; import { PanelPluginMeta, PluginMeta, PluginType, PanelPlugin, PanelProps } from '@grafana/data'; import { ComponentType } from 'enzyme'; @@ -67,8 +68,8 @@ export const getPanelPlugin = ( return plugin; }; -export const getMockPlugin = () => { - return { +export function getMockPlugin(overrides?: Partial): PluginMeta { + const defaults: PluginMeta = { defaultNavUrl: 'some/url', enabled: false, hasUpdate: false, @@ -81,7 +82,7 @@ export const getMockPlugin = () => { description: 'pretty decent plugin', links: [{ name: 'project', url: 'one link' }], logos: { small: 'small/logo', large: 'large/logo' }, - screenshots: [{ path: `screenshot` }], + screenshots: [{ path: `screenshot`, name: 'test' }], updated: '2018-09-26', version: '1', }, @@ -91,5 +92,7 @@ export const getMockPlugin = () => { pinned: false, type: PluginType.panel, module: 'path/to/module', - } as PluginMeta; -}; + }; + + return defaultsDeep(overrides || {}, defaults) as PluginMeta; +} diff --git a/public/app/plugins/datasource/grafana-azure-monitor-datasource/plugin.json b/public/app/plugins/datasource/grafana-azure-monitor-datasource/plugin.json index b625a5bb272..ed2808a8dae 100644 --- a/public/app/plugins/datasource/grafana-azure-monitor-datasource/plugin.json +++ b/public/app/plugins/datasource/grafana-azure-monitor-datasource/plugin.json @@ -16,7 +16,7 @@ "large": "img/logo.jpg" }, "links": [ - { "name": "Project site", "url": "https://github.com/grafana/azure-monitor-datasource" }, + { "name": "Learn more", "url": "https://github.com/grafana/azure-monitor-datasource" }, { "name": "Apache License", "url": "https://github.com/grafana/azure-monitor-datasource/blob/master/LICENSE" } ], "screenshots": [ diff --git a/public/app/plugins/datasource/graphite/plugin.json b/public/app/plugins/datasource/graphite/plugin.json index 5671bcd1939..d9a34fc199f 100644 --- a/public/app/plugins/datasource/graphite/plugin.json +++ b/public/app/plugins/datasource/graphite/plugin.json @@ -29,7 +29,7 @@ "large": "img/graphite_logo.png" }, "links": [ - { "name": "Graphite", "url": "https://graphiteapp.org/" }, + { "name": "Learn more", "url": "https://graphiteapp.org/" }, { "name": "Graphite 1.1 Release", "url": "https://grafana.com/blog/2018/01/11/graphite-1.1-teaching-an-old-dog-new-tricks/" diff --git a/public/app/plugins/datasource/prometheus/plugin.json b/public/app/plugins/datasource/prometheus/plugin.json index ba114454948..dcbeb2f98e1 100644 --- a/public/app/plugins/datasource/prometheus/plugin.json +++ b/public/app/plugins/datasource/prometheus/plugin.json @@ -39,7 +39,7 @@ }, "links": [ { - "name": "Prometheus", + "name": "Learn more", "url": "https://prometheus.io/" } ] diff --git a/public/app/types/datasources.ts b/public/app/types/datasources.ts index e036a0104dc..2db8bd2626a 100644 --- a/public/app/types/datasources.ts +++ b/public/app/types/datasources.ts @@ -7,9 +7,16 @@ export interface DataSourcesState { dataSourceTypeSearchQuery: string; layoutMode: LayoutMode; dataSourcesCount: number; - dataSourceTypes: DataSourcePluginMeta[]; dataSource: DataSourceSettings; dataSourceMeta: DataSourcePluginMeta; hasFetched: boolean; isLoadingDataSources: boolean; + plugins: DataSourcePluginMeta[]; + categories: DataSourcePluginCategory[]; +} + +export interface DataSourcePluginCategory { + id: string; + title: string; + plugins: DataSourcePluginMeta[]; } diff --git a/public/img/plugins/appdynamics.svg b/public/img/plugins/appdynamics.svg new file mode 100644 index 00000000000..36525b44890 --- /dev/null +++ b/public/img/plugins/appdynamics.svg @@ -0,0 +1,17 @@ + + + + + + + image/svg+xml + + + + + + + + + + diff --git a/public/img/plugins/datadog.png b/public/img/plugins/datadog.png new file mode 100644 index 0000000000000000000000000000000000000000..723d71649777ba6b999900a4aa600b2dbd20aaea GIT binary patch literal 8009 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 literal 0 HcmV?d00001 diff --git a/public/img/plugins/oracle.png b/public/img/plugins/oracle.png new file mode 100644 index 0000000000000000000000000000000000000000..0c432d21b5a3ecf739e20d0913ce937c9796959b GIT binary patch literal 74402 zcmeFacUV);_UIjoAOfPOD4^5;(rbXwi$Frv(7OnscS7%?SU`bLqI5NYp-b-|NUzd+ zP$>e^#n5@U zB9p7Ti?y92902ecPtmr~(O#sH#!Y`$Peon?OgJnYTmrycvB{NFeX*Wl*6k4i^m7IL>z zihD^L&Qc^mgztbtC@=~P7iYp+KeT+B<&z6N2XqBoI9qJR>~Y9S0N4qVlHz7*Agu!s z_zaMr1vF?RH3(dPbWF9R@X~}J!JU6$feTOS zWsy`R5Udnxe3sXZR9~Nu;bsr?D)(hk3qp%TIle~Um$X8mB2+V5T>wCO%oTiVw+?-J z&gb{^h(0enZ_c|^Pjbw1@7|ZAx!xRCIRM}jBIx504}URTh$Kmf)6r|TRbpE+@^nvJ zgmn>>Tqz)Zaa@1P^(PypSJ9PYV{@~!qpBYij4e9!1CMMP%^UO&9e0DI4shEub)SKu zLZ+cA#5*&MUEkF+uJ++X7)NapjB}Q%uWw1O^ zKyo&-^&eY(#`5eF$zVZ%LVFnk{}|r4rj|rM)Hp5}AR0d70D#SEm-mA=&k}{$hJEVw zK3gPQ+u2JN%;S#LP%csO(JaS?JJ#&peQ4S zyjNwgf;*4iUJ~(41b2tgK-DtxUdIp6*GyXos(eL#CHn47 zK^cA}to5Yuq}Oa{y{{F#P|u_th@frN5fBqxezEY9>ZOaW0aqDUz?GPebMdP2 z?D6zm{5qKI%nRZ~lvaYc97Yx~8LXK{B%I#%sdTkqwY zWYIx}hfhcho79`M6w!Cm-}_RsG`dMsXm|U6Nl^sRDwYc zBXKlB({KHSJrwuy;L>|4`@9X)kMAg~EWOm;y*LLD6$fsu|?wB6Wkm zbz!p_XDrm>{4nh4XV z%;e0JRF_n5?e6M+-97vglq4-UBD9dSkTjBnEx&8zW5iSTwyXjUEt)mTG+ZsKaein7 zHq0>4H8L$$&P&N-8?Mf)&bpXYsTr%8lR9kERJc*rUWO^BEu0%AnaD45Dhsr*xp&p3 zyg9#VHMTZ3uqyD`p)@Jwqp|ZjH;irsd6c+cme7-!PV7lul?`nEp0LPoW6*n{cU1UG z*`-d-4|XZqNdqc2S8Xai!nPhqJW;#f$%m5ROQLU?YO9@9MQpp7e)8+zPDv_GYFv3c zQLrkyYPb4mGObG_jWg9y*rTthO>ySV+(%jRw0HprY;KU2qE@I)=>jXiC4Y>5-bi72 zhIcm3V(qHT4;lBgFEU@G#HNL&4b8j68p_+sJGGizQq3P?6@yuit&aVUKLWBs*a&Qh zo`lMW8WZmC_ysW6KbMu5fd42OTak}Uuav(cA9X+P{@nXKX4|%J(Rs|cg%>?BJ$C0G z-VXXY+(&9LZxPWHM8Wa!(L?=k+2^j04d^}!qCnmsClx)gxAtx&+?r0Z5!3<~@T!8i zWU~3}rN+goM5<(4_^b`Ph73{+ppI(S!F*i#qRx(W*n^d=N1szZlYjBQ`hvgB)YbP@ zPviH8Su_|vY95IMIrYby;&JQp7r5TiM6zvO@@9K}&bRSKqYVrHN70XuM-@%D7&JE_ zTpE7JZ!t9>UtqIv2G3mO0}f1djXI_JRFXt0O`;c*laRDTtzZ~3CfZFQn^_~a%x1}E z-rB1(7yhv5sM$H9oSz|{wB4aNI`@nr@3}IC%&$5|H%GWgi)`Tf*7e;_I=~4zsodQw zUBw*}(PGJKX~!$njntozWf|dW`n)#`=4*59!9`MTz7yxZTsgxXu1At9Rq?cp%V|g} zXGI^CA5_ckr{NH4_P*o(`%(gjWpdqfa}NWTCr4IHwG8+Tv85J!;VJYoSDrl0zdUgj zbtQQ8=A_RY{Ueu-`j?Y&C77HKl~%ph{nm@~)4Zw1=M%C~^QiOAlw;#1lvurzmF*u& z6a1*|n-kSxWr~$=>ZK}b;92cG-IB68Xr1pmdpe@4{ZpkDBRkF?SLyw0eu#VmgC)tZT3Hwf_d74gcE3HKRM2DoT=gUSa2ZwI-OY6X* zhPjtj&bKnw9i^;!^HPdZ>OMYmZXki2eewN zldBW+D@`0KSN&>B{jG6}^r>P!Q{QWSH)xKBhf=}PQ?*-uF1TjgHkM{8$erV`r?Yy@ zn`1SvMytmByWEQWnBvrKTRD=KL<;&6^pFQIVm3rya6XT!h*@i$a_);VQw;@9pi)=Pk_V z;%8diXjcEPQyKJy?G?@~53!a1Tp&J6D9Ai!;+tyB7CcJQ30? zEI$kS>*tSlIl2B-kh8}h?C=!%eJou01^EQ{|C5rHuRkk41YRl)Uf={y_RK#r~=3q2ucc z=ZC>PTs++^;Ywckrm+5})+6k!|L&ZBvGh~&U+WI{vHLG-KPA7b{WcVS?;$CCTO}0T z;T8xNcO4fON15M8+28vo{Pqbysz7`orkffTmUhlRw^f`{{3q4^?(@Gb!f#n1;4(kQ zB(I38!7(3GyierUn5IG(Z$il9bYZDjIb2{ zf6D%kTKK){?ccYmG9EA$1tzGHqNpHPRFqeUPw<~+{&C$u?EE%rC2qM`dj50|=q;Jw zBZ-xZrJa?;-*pfd5XB=Ax8$|50>OC&1;xO;;^G#30R7XSc;4B!a>%eydoeWao&4ykT93^vIn`td~JA4eaaQt7k1tew(hFgn+{wHnu4@Up3V2GUu-Vc2L;U9P}`7LH@ z!`=Qh_fLVN-EXna)xzBa{?oIiS^jkGzk=movGAwPZxKSm!t!U-l(GEjcyKEz{(s5+ zyIOx~{-I{~@5}|Qh3*ObL;x0tTl0#*1q6BTSqtCe6%eR?my)xbq)U)y8o1) z)cspk*VzssBlJgcC$j&c^>dc~efrSGFDT(M_{N>gI(hYNJ0G~C!7V#{*!TDuRfO;j z`$Oxb=s&6&{;ewZubTgm{Gs`KU;Sg{_nRaBo{L{s;+M4if30c%%}4(VXa6U^{N1Gg zlU7gIIxXY`kY6WHas8Ul3F#@W6F`2QJjL~EJ}0E7xK051b@CL~ulbyip5i(IjaQrCr@$xn$HR8DXtShew{qU^=m#Sq^Gz}0Qq(D6xXl$oRFU4IsxR@ z$x~dv=5s=Nit7ZBUnfs-{hH4S=_#%gKz^M(#r11GC#0viP5}9J@)Xyv`J9lR;yMB3 z*U3{{zvgp7dW!1=kY6WHas8Ul3F#@W6F`2QJjL~EJ}0E7xK051b@CL~ulbyip5i(I z>lGk7XbiI0RUj> zF8T!G5|2;4!tF><1_y4Z~yT^x>)9>aG-#u&^)$ z355RnTiTwElKV4(&nN*Oy;PN}=~bXDLvRa0(b{EV*#`!QOD%z}zSAP_#4a+`F>|q>iLs zgpwiM4a#>lcCmVdogHbW6cq9P9mE3XBMC-A@61TKmPu&>R6^211{&rz7dS$o=7dn3 z#S9-q`H^pO>)R-G)Y^EvZz3s0eChpH=VWYzO-EcheB*%KIq%bG2f!_{TWOKd%(kiy z#Fi|Dzf*S5N0qOR9hC7&R=8ef=kt;xV*TsAC2Q@x3sw?6pQNEuPY%3O*E#~o>BQ|RQ`?T7cjT@& zH$Un!x(g-~5n+D3>i>~AMXo76U$*+Xfzgq1L`U%Qbuy3%muxKubPwcgI#B5;oi%p5 zcA_v$Cv3iUiU)yZl5gUk!)*zc*|tz9O4sQLn6`+bIzb|ROi&M(ucBY7jaz-oS3iQV zfvXdkAA-~BzG+$s@7kM%^x7F+(XbRH`0d))%L}l(WGS)A5!FHUZzq9CV(P*cWjCJC zEQJrLt5#q7+-%HvJhz*y8CaK#(eW#mSn~;u@)h=+b245l`i>Jbq#kGfk%Tt-kNL25Nda zLdoYO%Xaf?1*wh?ry95$n&1?I)0Sz)tAzvN7$HxjZvZmS8 zvQ`NmDK@x0B{m6K^$5rs7YR+7XPT%K5(VFG@ejE|=jYT=SFvm@>YijSCe|2VE>*=* zujcH_Q#IEzN=z4CGiwx*q=#$KExrSq+U{-XAkNvh@qS?urzv#ozPm6|>3b=6f5ful zPF@maEOJ1LAXug2PFT|GeuYK8Fp25y7hm^MZR;-a#kW4pPkS?0eK&Wx4tps5**ioB zb&=X&RBl{Vicre9ZiEpi-#m8KnJT(DE2DfDo7f$?7Fs*Ewn6C{_uvMf#T*C5e4)C& zB(u0;QX4-i?C_p+-y8QnepRk1Pgf#oBTgsc)h2Dlxd6kKy+<$VFXhmOphB_8yH@<9 zbk1=OK4jvL@q7I}Q26453stRN-Ih?=a*$=UF5*6AImx%`RzHpOSCuYNt{!dgH&X1A zxIw-Tg&Ts3!i9X6A8D+VC-cUr z@|EPb;lr=zYcyOv`trbFX=NI)O6TD*&!S6k_JNdX9eMIuRnLG&vT}qJy-0y3n!DVE zm0hU$CKh);k1KW#8$7PpcB<4nr~oPfmFT*n7r6_LOrI7(RvI?EV&%<-J=pw35!vby zS3EM>Z&g&H%MxYDx4W^ph_-vU5x7Zk_^$DQq24eV14q*B+KPn1N%}-pZ3nj-2FRdi zx`^>>UTYH|fA5^H#M()MrrvYkR|BgjO6iuJSw-8r{e59h;q4M@pdvm0qDXD$JtF%@ z%+7qg1HkV|NuTF8M@KHH1ik#GRm2j`xo; zpDKEbH$KZh>eu;TXhxEN^uzh5+tGSdP9AFkTA|<_%efJbPVWW~^#j|+3zy84F&sQB zs&CMTayQ%?MN5S46%t!jyq;d1Gdjtn#d-4SUBL zyB#FxJC4ipCtDNx#&i%GDto?{tZpnw_B($T*(!GyzLn*;b33YlmLf)@?BW_2`Mo%i zi+t+JwSk@6BLf0=M~$#dv)iI!z`s1pYz3v-XjfRY%^L37Vhgi-|14h>$I3S zlb;zoYv1vaXU&hN>BoisJd!Gs>l$3{mpGw550i{_5IB>1InmOdII<0B(XJeFgc$f!5WFI+kMR_8AtR!wsbr`q!barS#y@;2$(q|FP;!@O zo@>$&E};YIbuL3k`(=_QSbvYb*!u04$GrT(*f*0f)jP1|h4}8o9(#8tIEP{9n6?a7 z5>jYEnPQ)qzX-wMtL?f+HAC(Ut`yT+KBEn=HLfnXBo{TwoW{9NUtN+AljO>Cw6 zX3pLnKS3#w*!;E|Uf7>JEUm^Rmi%VGqqbV7GRu4Ukh*l}u@0^x_hpIb98r?ssIz;= zzDP>KWsSC#3uH17BZH*Qh3^_O+ndWy(n2Jr=cE)w#gn-1xx^x$>Id3o=oxFzKb>-r znBv&3>ZB-W{^8m0Sbe8uHVw(8(puSluYCDTAWjOn7)0UyY$Z{#C8^T4ARm)CT@oEF zQmq_X07?H8vAI7HWB~FOYm5;JHC4V(QQgk@`cbE)N+q*sAaxSVoP-wru=qjp>Vyt^ zi-u8PTuGXES9g|oRBU0>HSl}M&_yrkk`fWZk3j~ux`67eJ)RIsKZ=ZdB&$T|WI4T+ z;R}M$pv;Jas18CO(9&$rY>k?(iY0XfxMfaS;%Bgxz6T6fW0?Ati$)L6rhrmX=2A=I zl14lnO*y*jUJCIYKhUuiH){Ee1WrX*2aJ?tPb+YJmDXwT_HV13O59wi!mZ>sFm=~K zi+anVu7BSd^SVbuH{aqeF=y-L>XDX`ne|yu-2>|6S)Ka0vz=vlcylc1^`uF!>lWEG zE7~uN-UKI<57r-~U3t95LZ77qdHZR9Q~W-!J$hFFB6`Uja75rk%WkK)Q&<9RFAZAhAK9oW{KBEfP=2_j_w*hi$IJGCFxpj zxP>61GtJ>B7riTJ+A_gNuofft4hZ$`H+6Fm#x$W ze~B!AdM88n8}YZJJSJ#F5gZdqN!Q+( zigsc zGJpd#{gZ@if}>-gG7Y+(Z$;cW|_Q@0HwPrtWYM zylz{P+S;e2A3V%5!%3ZbgNQF-?wfILr(9=(NH+654KAxuka>|l1DJ18KB*XbFMgO%# z5&hWl;0rz>#PnVE!z}%Cunmx_d4~uKlORjVbWe-PB2>#*)@Jkh%pL^bGcafgvVaie3dgQ z7O+<&go;Wj`o?LJZbKZG3+F<<_FUvD&bQ7c$+qIDgCb zWg65ziyjC((C;628dPI}aw$X3Y&*@mwuepDxRf`l0ZaQSz~8H*i0Oh@NWrU5L&MGM zL^X<*+1$rh3EVfGf6g)Amsh#{I|65Eo%2W6FSy z68bRikdu+9A&JLO6B^lqHIT+N$##h@F4%@9OwyFy-y)dhQGNbY=kb_a6V^x#X(|b& zYRshrl6vE}8s+$7nzP@_)SPcZzaF7)@P*~QmkUGKbV959QqXiwmXnia3b1MoqN{Ct zZLMh4Fl;aq-EDOkz(1DbUnRxRSY`p^e*yG2)5v)ei`(ND=vyxrYvu^mhxi>c7riJu z&n*N=3?#C8<-|sI`vzOaWm%pm#`Vhu!0jp}xO!!{&i=S!HYmV=WE1IJ7W2J4IF(0l zdy6co8?B%;;P;uLEH5Ug{oKrx%}U=VJYHfB5)8Lv{F-iJtacgJDP2F}`!6uhP&PPK zb11JC9#BqW@Qn>=y9(lwg9Am%trH=Jvx(oo*8TC^T5~mgZ_c zN0NzgRnRe*GtcMTKD!!>-`J!jaT)s9>B<;lH?AbTkfU&r_Ua0u8OIg6VR3!9%F8!F zW-Sj|1=hJd>4EZZHPFGE9#-%6$2O<9G3Cju9Jpy_CkZy_p&fXvd_tbf8N|!Z(Av}r zE2xyepS^}$GOoA3QGz9+)S&JC$p=~#Qbu;Q7r(>2Sah}=nLK|;xARu24k#TC#776{ z%f|)m8Pwh}b#9~~Ic5w`DAA5zT_B^AM_FXPQgR9m3!#F!t1O-qPz4HpyeAU@fvW^p zFgO!}I*vT{AC{gZ&?SBDw(<5(cqHzcq2kyB3lhxL6ecJ3X?9Yd;P@a)5uP_5bbGW# z;@?@w#CSGq+3W~-S=t9~SiNzutTcBbu4Bsx@AZEP#ALO;qC##yc4!MMU=7V-O@em`U#3{`4SG1w!(P_Qamfxs7Xl?rOF6$(k=-(Oy+U z?sak%ksP_cJU+H<*QskVfDqY82L`DVq<*FG*HIdT?gveJ3+C&;~@7U8kTx5fw`moKzzM z>!mv*!_fVmdK05&W3Y&0oXqpKF27d^6XxnOQnY>?XlO=UN z9&MIZSitpV(*kyXPuxv%;#$YQ31d!&&IdUpUa;3xOE#6_Oxx_RY@4Wc6Zn&7Qn) znQwwlukjk&uAy-|3-%1`72dJ;nlG$h0O#R^$cSX*&cCJb^F^n6Ju68ZRXOjR{J|cM z9ONI41JC3D-|k&AWHkJe5#u+_Hp4X5v=@23tCqi%l#V7=qd^5yv`l67%CR`s3@U94 zCbL;N;}!2ew&`9VDX+Q%LHhN|RhIMfTMiPqkAL@{sY0n-q35zp)Q67kJnI<<`bbTE zgHjk{nNrUK4&R%a1AAWjFjbt-H#I^uvOS`VND3&5Bcy!0px=Yoc}HvGRRs zOhf6o8mq2FWUgJ1x{*fm%e;1rJet_%)P>FuxZTZt$~qKKSKzCEiNkvN8}%ccAURYF z+JArSmZ%qskULbC0DJGQ#jQdQ-Jm=qIvE~U~(v|Em@OqG}!$@35obP9+^T}YI z0Om9Ub|m%TACBps@@Vj#;YnD~lO_p)qbJw78?fe_}7 z)26aV_|vy5kE%3y8)TXw{f3r=Qg84@+2szVS4Bn(G;yQZW<>ehr42Q+Jx#fA;f&Bi z`Rw=X{c5|O?)Ga?YU^w3{SaO7nSir3LxTq0h3ayLqA*CypK*9eK>YRHF&|+KuMGRm}oI?$7bqD6y>D2onaB}d$m}Nndo_M#t9|zloPUnP%hYGa^lI;Y?$~9@aJVk!Tl0cVJKyyKr z?E2>p~R^NJIOjuxI_4Caq(;(guWXUn67y%7@EF(`* zWkw-F5xd@))4&Kt9$&-?BM}q(b0n~72RB+BK8}pw=l;I% ztI`5YYF}JlXn&Go!QYu{sL5q!!u~2eO`sv$Yr=5;W-!%3YVKl1AMel#k72~lW1UMv zT})69K)+NC2EaA0dAYw-jipamm_;go;`1@Gde}x<-Rb#3Xt7_-+CIj4LMSsSDsZtR%@`VP6Tk+Rj84 z&P$?~kaqkqVhTST7;Z+K8Nsh|9r&LZ*-Mk@*2#^t@N6Nw7Hf9xirf%1;-n_qMQ_=> zVjr#slbDf|-FqRwM2hMV-`0jneS4*`}qyjxddzE8z~AXd(yzdwH7QKT`o(qWt-*8UE1}^a^sR1V{D`F5p{&yfF4j4*ai9~B zN-f8LAmYp#5#*roFlu8%5SH;taV8F>#9I{WXjb=Rg>a#hh1x7Ifrm#ux*OP}X>_&; zJwA_(wNL7`l!ar`k~!jOk8T;EpZP+8m~+ce+e5|4b!H^mq)7E9 zuHj=fm+(O-uqL&|9fTA?C8|+C5vCp&Q4|Rme+eNknPQZ9tGtMuO z1pMta#+s`2GFlz-W-LQ==*lv54K7GabG0_|iV-?USe2$4%l@7uM@|)X!=na;kA~P- zfu?Ab(h~i^Y{Q3Yv_jMF?h$zjZ(m`8=8I2J4VSK2N27NOQyrx8{Gv;4Mg~{a+z%0*20M+B8sDp zWWZvLJh7?w*sLgZK*!ouLuE;}HAD-4G-3%4l*iAs!|}UQveD_^iAu`jYtfZ%S9Z!G zH|p*ZWDEDbrtjsN`RJ~AK>D-S6~-V6lmiV+>uFX5_yfNnwf4`A9#&sAJ@Ctw-O}1f z)*zy9o9-ozOF|<-&v~Rocj=k{Qco_O)N0vI&Z)K0&US(7O2rR$qs4XWFEizF#3DQ zLGEEdFS6{?)liQLH_UF*h_nJBrIzJ#gQ%feHZy)4lIw>oo6&S5neTGj32#Ns1(r>B zvTUbt&T#Zke|;lF6OU&O$KOoE#{5{PB8aHvfnh5lTrRa5+3z*^2F_! z?ukph)G%qn>-e#l;K=q!`{-qfG=9?A&dMD6K+r$kHXM(~o)AlOzn*oui3$ZyLmvr| zT_=>`wX8WK{kwH@$H>65CR;_{<1m|vrp&eZEggY@ z4Qg)^?50sorctjZ0;oh}A9WfuY&2l$2t{LWH)%JFG>D;ZC5z~bBA<0#?Y!PAgkC95 zAl7^iFpq!unBI(L>XE!V)11;w8pJb!*DL{igL}$ZI?K0f@)L7+M&{5h5BJ`+tI#D= zRv^WpF}1Bgmq5AmjR6hsXSmEt-?j73)5S^54$_xQ>(kai*!g;J8#aFdgTp4ZhT=kd zA=`QF4-d$BtGM73EDUy(>M?*8KEtB#lw=WwZv(Toc&i@x+} zzD4}2#yg2}=i8Lthd~t-i3tSUPz8jNuSmVwGx7xwi?gHTHHI`dGa+U4+xPA^(vrQSU>lwV3g@TlJ>xZUX6H4YD!EdZ@iam-~Slq&IPw(qXWQ>_lzX}6Tb$z5pTsy*0yz|dLPMz z969njy$F*!ygwlG*PaKZ$?*~}ut|4E5pawP?B0&ItXM&N;#Zbu?Y48hCge5y&2M@% zr_})WuF%A&${j<75fs9c^>#;I8VeGJW^%4vD#2}weWYqaY8dq>%R9I>-s=4(HQ4E6@*d+>|Mw5+Z)kyx ztxI%EPHLT&a9;%W%SbH4v~k<~5?_(sNUvpAj5}p2Gg}BQ-ak|%Ni^1dE1cG^Ria4T z7pb}YBnR(1VOP*xoem8ykR4zA_My%svp8X(Hq#?j)901pK;`iEmg-1>i|J?r5L$KB z0SYR|#@uewn@q1`6o&J7KTT@FbXVl>`o`c7)t2EV-nGkaL}3_efn)p>aeZ;E%?{ft z(B)cyzh7wevLcl^N#_yNxBShV+v`cDg3ars`X|HQmI@fv1rx-?^mKl zuS!#rX~ypa)rMM#o>AUIbX6iBNHXwX!%+A&_gL{YA9N&TD(9M5DHcM@EeqvxNM>eh%$s># zEqJ?5KZv~MPM!I6%ju+fpub1eDvx0&Sb5kzF^!{*aL0DHxZJqYPSMu_{}9~19)VWe z#uT@e6MVGOU8~AC*p%~2g(aHutJa)bjYEL<8wV-x>RL%fihkbttxORE_Ud}xsMf-T z!`dnn_R{VTWxKvK;u=}1O|;0*DEt1YOG^vM%n`C0;LUCHjb;*R#Hb0wL|e;f%ZY`+@|2%~%#)f66`#;gu_9O%T36bw1(sS&A`&0a*Ris_^G3#gDd^{X zQXhGgJzQ83fUPxIomyyv0v3aE-*_}0%jfp=MTo}jH;xJQNA z?6%co8O#2_H&v%%AHUHGICGtAYnUGYK#g!{)+P|ze=sUPtbSxL@2!WeDxOd822tzn zFzj64DLUA@Y?zdot{v#txSN0op6Bi>OpVL+tyK>Y^Iu%Ejnf=^&t4lGr|FycW|Y)$ zFGIfBz*nTFk8|bwB{EVc?yxc^^!=uuO@}Z_S(gWnCI_iH_7!IX@SC|oYGK6qXA_>- zwk@kSs~j_&Gk2&R4L)*=SiKDxk=AD)Ny9IMaW>J(tH-?S3NM$(T5`PCD0}1fo7#nN z-;dHKXxWE?jv&LHUNh~rl9lpVY_?mw_6)KKZta}>u|TMioN+tzEH-u~+ag?2Qsc)} z&4jepHkoNEV6Injl8&u_$Bqgvjkj}GdzEK=C7g(-2EUmqHt-ca_GR!%;%R}FkDE<%1OtZ* z9Vc*|d@-ODtfu!uE5?|kdjpl zIX))d@gng58Yhbg!1$LYXrBFkXNfYTC;H)Af+Z@)TvmekE%>xA;nh!w;=DP@t!JCN zVmpEUsE&Y5Vlt9I{QaXkt}P8B3M3H2n}8|}MRkh1aOh1{r*IYp^?#eV!DCtD(peB? zktAR@-L?I>t4ioo;4>a%?l$uH*%No+gK!QIcf~onVV<&Rw7g8}n2wi?l&UATu0RDcGx88D-$>p|7_2pn(DR2L zwNMz=?_w~f)Pdwpll-u`oM*p1&PC$)Opy z|A7kKIKP0u0dtK(Jq8F}DM6N;56J0S)ANBkyT=gM1ao;b^5YK;nDjXCxBg8?=)B^S zJ~OrvzLVfXwXga&s94?E<>3qtXzyg@t#B)n502qcT>)}jG-uVN|8dv7^xgfEuRhOu z+83J4XrR(F*Ty0%bXIXL@%{%Ls%dK%$mXSCEsJW<7m8K%o$cYcEp+da@)94^FHt9T zuW<6xG*2&1aEY?anI$xw+_cyH(4nF$)Ql7R%pX&(+Fs!HjF?E4c$y<(ilbv;fdzjm z2!%<4?(PG_-&Y4SF^&PeNo@G(M!ODx6E_TDGD3`7WJf1ObK(? z0yV_kL3T;WX>!%VRy{iR5B7N2bm{VA8iuLnQaPZtGYYhCG-A6SySW>^8W#K}QS|s- z3b91~4o%;UT;4SNw)$CjqSm?zTZ924N)X$=8Gws%&y9**3JZ&uIi8!_t(6-uxWN?R zza%@+xj!QY?6c~ujl3$uA)gh9-!X1%n%cj>zdl$xrCQ{Id$c*A=ttXhcuOIh5jjl# zs8gy>bqUtl)qHQzx~Lr|#A!UX))W1#wio*1leGKi=4MMwd1O36_no2!|EE0mDQt7q zV*S|n;hEbXBG9j!OWgy3n5!mSmZhOWGG-dJp{336nj^VgnQF~!ZAf`>T=IBujE?2F z!R}VAoG2HTBf>x!Z9j4mX0gUxbfKd1vqRx?9@kXnD|C~&E3(E=|CgCVX7&1$j@d#1 zQ2f1O;}!~=fE)-C&5$^ z;ZMSpkS*pWErnqXO;@Hz9)&tJSOP=5Xu`^>YMZS-E;kF6Pw3%WAV1C%psqkU75|+t zMy^TuuJqVf-D9O~cDt;D!wh1=S+3-jKW_kRG>F%5;?U7LDT9uaL0y$>%2ptf? zdG^J@@3*DNJWRG&@6=u_YB;1eT%R6q9r-MQ(cGj3zr$U1hrkERp8%mtf}NeCN8Lr| z3oEn=nkWpnz((_d!6egsTPaX1J8Zw(I^9BY-LFz`b@hvbgepz=u@QS6Y1?PiA|FOG z3(9tX%W9(QXu|u0 zZKStGt874)KFOwIq0X?cD#c+gSW=EKmlfUoSuSJ5N{x0PmB(YU_rO5M=|vnv5VcP@ zv3J7v#nKl{P72s8ZKtgZzeS@pTAr;V8)(vw(;#g}9X$v1_Wq#|Za?9{IHfQ|TEs4e zGNPSiI0sHR8O1iz3IR73;QavGNx6x15ytr0KpM9kE2&I)aSx=e!s@ZPoY*re9n$Mk zdUnx+l9>>>l~|!Ma}7<-g6ywgK4yA-`a-d)qhUabQo#abCu6=t`-@dE{{NeYEuhA^ zP1xyE))F>)=$0tYJc|P#CBfB4B9|#J!x(>!1&g~%jAmhrn+(SZ$)o%HMVTIrxLQ2< zJM@dhdbsb42gf9sq5~)`_OP^TF;|Xb`^DH<5uP(%F)~R}uo1GdYLKQTORzdk`Hy&L zA^yxPSUp;%$r6zbs!nXyAh!ltR%w$sx>WMl4*lfeAy*&RBzjMOx3 zuSsd+{J;3llq0w<4%$b?T|dl~dOrE7xUXwJfk?8A^M}S2^E66$>amIMG&XJ{WvMvf z!3(pjU~cDBrmXEFSWu8kwkZB3gzeWE_{Yqa;p*5Zi*TqrU{@NZad?T^S`2@rla8-* zE=SgIDhEd`$=)|QGma!rjr+$$MK?uPCe)TB2dtP6C^#)W<9VLSsx_L01tNGwV~E$a z(dx?}>OK4&W4C7|7mZcM&#o}((%Dy{_}PazL}R+g?ns4ZKQQ(}(ij!Q?V5J;MPC|a zj1~>G^xilI>#tJocNo}!w)O0;@!%fYbZl3u(h#RC4_k&jNcfR3vioi`b(JHwVZ)tq zC(X*Kb+ZY-J{oEDp>Iny9k73mHDTNLIwm_Xeu+y#@Ud>^tA#?)Bd|jPWa-U7^P{0~i&k{TJdLW8`P7yrx)g&TJ)R zOzh4CL~d7tq&JyBfeM|@~IoOPt`4(u&?mD zlEwcYN!J|+_5c5EiA(W8MubCFBr~gs?#w!SQ}#$m_7=%LE1Npw?2$c7S(lN$M;swe zXPoW#>ihe*KlHxWc#g;O@p!!GdAG=;gDLy?hib8I-y0%O>>lkJ;ZkYUxaRjcvzz#~ z&jlJg5b^y6J?k%9~vft;9l}7bm!40znimp_}niZ11KJ@7O#eAfY-ndnQCBxZ})|_()`x0 z8{G_u5(*BA07Uw>bv5R#az4IEj)EM^85V@kbM^F9iv#SAlL<^_WHO{YMR9URpPsU* zK~$NLwL2b;KWKOl3y^% zB<@M1&L!_-0`Cx_SW#sg|D8YUX0B7j_Y`(9f4wj7RUfwL*&k*Jf zsc7hzkfk);|1>(9f%q1ml6#Jqe^uaLbeWztcY1yDHK^2XQNTR=?BH)BGz0eMM3Rr^ zFQIzlLEi+D5qg0xc~{OoUg8LMkM z^~9J=4TP8GM+m(D5u?a?_@%C$v`Pu?oC5&Qw`H<~&|Dpopex?j3kXf7=hz5y@=VvY zJz}b{Jh(+@IO0KHvhneS@b-NK!$;8rk=xf27F;TmiPvP18Gr)g{&qih@d*i$)5f^~ zM7=o&!)5WSy^bD`a8sNOCl!iLoBiWDxR)bN&3-@7QYxLrH10&buUteR+_uu)Z&fA; zFx2P#mfz|_w=r$xCixj)P7f8~-v~@k-$e?xMF_&|KRL*|rRq99b)7ctUeiuHeYoA-2XDJ1yU4|xz5G`@j!S9< zmHgO#v)|{TKnnOquHeJ{7AX*IJD!O)37ICEWt(A6ue0}6T>8iT;{lg~u>Rk!fji3^ z&n6~Z-pppeT<<@)8B1PP1O9u)BY{Mj+|fRgpKOH zbFsgWJNXfbcV_swU9IQRfta>`!;eIZ!nk^IMLQ`_SMXgt{A#{=%L$fu@)K`7VV-Z- z+N!+>0xvCWiwcfJWjKRbuwCz$nwePSdy`9&Gg&kU$j=GQmJ*NEknOObWOxUeKYYY2 zhzm<4AHcN{sF^hC%#l+M!%8nKiv?6GI|}pe;De_3rQS!Ys|zz*&ETfhg#huU$a$ygj^fB zv%!4%!bsdu=S!Q91M|9w2sLTRA|0Kmf33gBq^XZ(kDAZ}63h<+r!W zh7$T6B%EfhTtsQ99Nb$ZK?F6{0Ox3&B0GPmp)c z4G@sRH9DixenM~8m|3h6qAlZLmsO37*!ap&5qh|)e(sZt?6Zzrovy)Y@bR_`iE-v@ z$v*SX=r7B(A#ipI~%-3h#gq}0x@)h|wn*U}aR{)$x1@gfo$wcv< z?qFQ6>WE~G^x1WpdnTEjHB)W$Q>14P`!lsqBooHCdHav59J245eep0hZ4c8=b!+Ei z+pI(VSU0C+=No5ne1mj$l(dRC_I9=4WJy*~mErN}gpW6ibl;a5# z=1UEz^KX)hj^&>-$eh`ET=*O%G-ukt1y6SWmS&EG>N&mx^)XQkZ2Y@%Hu+&9<6n#9 zMfJ`5UbU7ohA$&z;r*o(3eh?!>wy+*_YtXwMVv0O*^G;7v=Gsyy18xFp18k#Q7xx2 zuC~cAy1Kufj<1afoa0`F_R!Vb`S`#E&~KP}Lno2%bGOJ|h3d|oz9UOm^Lyz-b5vzY zI2gONWcsK?oQ->&e-Nq0a6j;m@rwXvKSk9xrw2(Wv)>AI*BfYnw4r2rM6A*;flQxL zFd&B>fCwU;JvOcDa>|>^Ud?@wgxI=y?3$qm^722b`)7))(0>ti&m}{s9mj`#Mo1d% zkT8CtW~Qj56$3|zFmq$CRX%<4Ho~f=sqH2yq>hDuu_cJe{Nv83tmfPBbL?Mk>QRzq zAyBbAVO%N{42pNTgR4#}_8Vr=8)mhd#M&YD$o;^WSydNU@y-YG?H8xqw^Ju%hojjO3d5;Ki=iWcmC#fp!;E4JxMG=Qb|OcAl7JX$ZgZw79Gy)D35XvWz#yQ-n~VwlcIuzIRP@rgj0-1s89M$T2nmPq=4E@0qhIGcdrHulZNq*#5rtm(xA> zpc7;`o8$e5p)|C5a!0AUl@9J)uag%of*U|=kyvKsRn)mi+cqE5N?j;MU<_ffRKMmj10rn1#6liFTX&@ji zm0fIM3cqw>k1=5>*AidsflBLyuq$;x&!JZ zv4etV2FRpOv?NXeeLM$KP(P&e$2h`~hl7Cll>5iKr7*pS^^hmQ5-CCKL&)KWtYLX+ z@M0^D1O0`~`UqWn@33(FCuh=k-x1T@@rij*ny;DUnH6Bu{(36S6qK1Eb)BEAg*{c? z4&f*qI1eSMD$MtI(#RA$EM*=WYy1I(Xcj+<9G(D;OErW!a!i$}&!L^vM%1gRX1(FF z|Ky*7omfWrK|1G`S~uSgrLNmDO|E(Q>|NH0TMeDmD1`EWY6uSQ6glLu&cCgL!cWYO znfR2R=8SyK@h*%xNIj{}@)~F!?7|)t^BamOmsGtTN~$>lxclXYPn22RD-@ND#>M}k+`K$pbYhIs`Fm@O+7vgSVu1`@~H5mTp=X1uyXP*74Z}Az|5gXPd-5$p ztY=m=fT8g&5G)2F>W+{i4XEy+?9R<=;?9K?Nybtz{;xxDD#A*m8-Ug;l26Ai`ZhkX zrpR{?ySu-pq>>cE^Q4U_6Do}*-`TR!8+_t_bRx$u(b0@w_e&2SyQE=5&7bSFF#T@N zZ|^s0FxDo4xF)1h>IbJQs>2ej1ks`TCa>1$cA3%Mc=MWjl_OGpp8pVBXaSI(_Qe5 z*A@Cuadcp$QSz)6Hlyv_B_O(YaQ?Z_^z_!4m%D4T|C__K9%itO$T7Ybt&rCxa}$!? zEgGRTIHa0sg(j@IZ-|^hKjC{sVXKd(R+2l4L*{SFm~vt83lyTu00mLeByCASna+@o zOX^t7~&+j#!%H}&Dx@E*k<*JZV4H2qck6V3O8Z=)kk`KT8;5=P%i=zTCE{==omGI4}Z-z3(| zvvND0#uWB@0X@=!q*7>z2+7d1%kIBEbcjpAUGD9d5^h`T+c(jzo_RmCoi69fd4-=Y zaJdLao;41lIW6g_kj|ef-n^XbRU!ZtPZvt00e}Xiq$uP`7og0z&AMi;Ljf?+ssWxs=N{_JbU-*s z)s6p-$}p3dwgV4$;|Qku`~PC{`h>-gZDX)n&>k&?_DDeH(@73k*^ zv0do2v(%WVSBCpHzy3P*ir-D32l32J(D4Ul)cJFH^vjm8=0nh5Js>>szG5^Y(kL-3 zO5!X+zvwwOzKAD5|JWtpFcE;a*=7h$1?fUMCX^STzG_su zGHRx&gj1Cb50_4W#>50VC2Dx={rhqHB$xzPv^DhVYJES zn3bswCu6Bk%zLFt2-E3oz`FIN8H4Z^^+hajL32Wj$zXr(ZmQ4ENI*P>p8tuhn*AlV zF|Q(-?D!zxGXiy_NP72lM1AvF5^8^f0Cb=^zLL2S@RlgZSi_M3TA>S+b#3eaGZTmqrz|qP4t_;faL<}Y!y9JBY7#$Z`;MHY0cyAjDAxq;shso#YRzbk z>Bc$v9ABF;qSyela#HNY=cxVg%6$1jGW3N`Avatrg+|WNe0L^l*cUetlMe87=8zTOK;Rup4wk;O>sQ{%>zep7-^A|nt<;% zjzP+|4E;Xu_d~9ISrSfK)PruIzdEk)k8q~Ju+ z3i=M7btLrb^{qbvisgcY2xDKtp=4ZP5-RpL|7PWLF7Rh>-qt&=Pr3@}VvujZfVsUO zop~C{V(gZ&;iHi=Cs-ej9U7&=n)QCQ#vUaC{Kx* z>AH{oOC;k{csiQQy`Uu@65;0l9QXgziA!easpo9}QB$hVB8?H|B0pxY;soqrChK!T ztlJA4YASlvz_)z-D7i6QBAvG=rJX#^z&)Ooi#0qGHmrr5u|>^&dXq>`C!s6R@<{8k zse9|(eUC<$&eBeG>y;W?DcFZ)dOBT2?HTbg=?YnzR^|Q*^RhF~TfCeT>%j&vmw}Mm=NkkyGcn;R9XQjn+?1udZ0gvoY*7B#%)2ZPjw_M+aq2xAHH)U`5 zq38ai)d`x`0@7e48B6%_nHpDGqUuY4AG_TXOw^yUj zxeX6wvf~;5O(IkM`on%&`4>^D$#ULIankl5NMmaiBaNwNee#ZlLU&9B7P;^8ex6lZ zq5=)Bm8BkbF=?_-X|e^?uvyn{u}DRyf6g{V$(DaHs+I|pURSXcIr!X>j;k1Gd(yv<3U^M2xs%xm#LO;J&!clv!4aE`VIDrH$C7idSB5 zU)g{(P-$<%9V3Y?No5|j#`^aA#DgO?S^YqHcHN~E?ipbK$3)qrD6Ze{j0An`OR4E6 zl>}x$`A8t!=MxBO2cv@!sgR=LQplQrfTD2GXpKu1Qf82c&iVmd$?H%bQ1;Gk`O)ol zfKcT-PlN7%^^T0??kSymvq=NB_*j*wB#`wlCXnAwIzu{2YWc>U!x+z;4EJC961k#s z^a1%E1i0nH|70}fO#AklX<{Cjzib=Fwh_2??--4hOq0F3?w#rU$Kp@zB+zN^De^H0 z#38(3LBXH#KIGnU;oTJHQ;T(9+_k43%Wv~mq!G@ogj9sU@$!mkD2%~5%KVYg5_ok^ z#EIs+{b5%`f9@7^x_3_dD~;m8#!btznC%4~&LKS;Q{7S< zKwtGheeWeVU2Qc{Hd|R^7`s8?pmu|!oAKj6fJ-7W!HKGDFhSxStF?u@=CK`V`xwHL z0%OagZa=MY?tt*Pk8CM^~FoRU;^yjCMPJ;A8O^uQ?;su z>T8lSpVutATNqjdPF%NdR0`GX!BqY$4EuuXbpcJxz!L*9GrrL{`NfCMw$y~GKSLP3&D_)X`O@MUmT!kP% zKb=T;LrasTwUl*5Z21xsKrUFpE;q-4GFB=KT0Em`U(7iy`cR<8 zg;URm55qQm6@oA$RB+ZTGFVp!6%bW$1Gns^w-+Ou7otaW@2)Gi-0%x>!e-wwruSm*C>I(y*S zhT3^Zify~NO@%k*%8#RNhkzY6+BG+*Fsl@~DmA{YmFSsG^}m!5xzfS_)al3vB#^Mq zU-$&w+z|W+-mTckkg!^rG!9;e;_;L@SRt5t-T{a0Aor&`ZRweiYdW`5*zqPAoOr+jRwaf&=L}@Yzb3GIgGllYX zh`e}Jrb*FjyHg6)sI8-IryL?W4Q>c=&F(pm-4N?Ir#MQ^a&Oc>_AuA{$|^zjQQ@KE z?9uQKYnn@FF@w_SW3lD=Cz5|Ej~N@w9o+ku<(If?mQ89y@C!kq06+*mnXNc8?y_lZ z{TRCLo*iDRoo1m9KJ3#Y_ul6`^}kZaWVMKJBtg6>jC>!ylj?>+zjuI|G`g@CUaNyG zimpYT45YZz$|>LCF=k2$ITf=ohVR)kfVr6;oui?}^d75VQp{+lp2g0@^ffu^Rww`7<$;yb}b9N88RiO@5w(?_`e zSh+@$3lPPF?v17oXA`>lR>&-|7I7xv0^r-}SwrL<^+1w5Bd1dkeHvbZdUKOge)f`b z_eo8@X(n2%`skXp65W_%WI^XBO02hbY|-&~O!!R&p3J?X^zVpphD_qP#Cm#;1pOBh ztVEJT@gyQd@lT&Py`8RkSGF1*qDK6>re#2^V!^+wl|4A3J8~~_M z_Mes6G6ly2k-No<56k9eeB;9Ui6vrw@Zx;iE!f)#>P`acK((Xc2lH*}c?_Cwc-Soe z3l3nzW0j04f3vrFp>@+x2M51kHhq~NY&&oXRu%P)bNX8=HoyEJvzo9?ixudcXZiz4 zN(#(U0F|dM9db;ew3inTT($UkE)5J$Op7qy$Ixk-*K>2%xI4o-Sv%>m@h`np>KoqIyy?B)HJebzq!E^YYr^ugxzDW}b|LZo ze)gme28fnhpzwE~i#yJbx43-d?(XU^DczJdFpM64MfCyC{STBILu{fudC*!(sO;@r z5UbBjFDWB2v2OQd{tlNG-UHs0!&Kg}2yIN%4LZl0-4DZ1(=83oP#4|{*o=l8d0E++ zk5s`-{B!hSy`iRYR_oJ+_&Ni-MhbrwU%`u|(^vY8*8}fFQ^q4p$eqxq&`I|Z+Z8q$ zV)qys1@aL*t|mhu9g;kWM>H8oucd)H(Ef_xxSC^w8{*tk5q#zcpQ$w5-DgvnX!cQP z@34kHL>#th2UN595#Q%cm>e~E)iWTnAq~No)JK=Y999u-OVZOC3ZblhE>+2&KO70~ z(s&wBIkwR8N7Sa(C|v9&)MPFs7v~o;y^b8 z+_ICpm3bb9SR8bG{XZ%(f0{E`NyJdovb%@r+zOLxvxa|VB18_$yl$yC(OFXi9&_!$~kmQJ6nBJq;Z0QmD|VYla*C`Gb@nzSFwL70n@$x?pyAiMLEc zNwQL2BM#zmlKZrGz)`_JEDD#z@&4N^&0?#Jg_rzeS#qT|`T8SYry+7r)J_$(`_FJY zpHBM=#Fmd(q(Ncxw*IPjaVuZ$$BRvxPvGEKz>B*@yZ$sI80qwrPiNRSD<9Odd%x91 zNyD|??av0d4|CO+}TTmD~^CFRNJ#Mj0L1pRlDFJICcP+-gC983)?Mi`b8yc z(-(&5$mEO;N!kz0%Qq^%g||t0O-liDpDzfBVWp ze25&yYLjIC-aZWS5;I%y!lm`_FOqnO?a1meGAQtblt0-x52Nm|en%!{&c&I|(SHgI zO}d;|`J}8UXp8@aA;~d`_J3pu&AUj?NbO+PzGbw}ebbjQZ3@TPoR1=+@S{{!s6Z*R zohbVK!{>(&Cke@v?PyKq?@*dZJkTgv_r zRi5GWSC^dWuwuvDILxO<74)zpqW&)T_h>0Y+4i3|4Fx%;y(&I?eM=W%q5*USmjWI*kG*pyd)~ITz!%P1TqZeBksoD;pJE;^JZeSd-hcen zM6AHJeovur0(`?l@_C0&4p;u>7=v{JFjvL@iDTNe#XemPQlK%?WrmdI2eryxL{ba^kLg8 zA5H?J^v`KZpy;SxdzJPt$%`tN-1AovP`Yb~9moLq>gwb7;Gg@ImZaM_?1==$_kV4T zeGWzL*pV!rIrHw##}^i@3eZ_kX_klrAJV_|3D>(``RteS*Hjba(Sw%g%eQrLx->qw zrc}<$c{3b|aUgwFstmNTb|$(HaFByjZ9OoN?030`4fKk=KvN(_sTBTYFX;T7yAqOd zMj9CIT-)WLZmieAaJkak+e_lIh}1W|<{4ND1#gnE+S*@k)rLFYDZ6v&Ort%uvC!i& zuo}>~bq}#%fq_Xxq(FPCC=Aur4qc%|^9?DvT4#Imul_p21GM+z0+K*+2X;EUVF zzv;OnE?yviDXyDXnwtU0S-A5AA7}y?APY|wOo{+Nv!ZY_QapN|d;fyJotH-T?UoGK zx*&-Z$IP(aibyqM`?UYvxG?L1phq-1J)t-nqcVGTFHmN*n}it4>u2cu-{Wx=Vv3LhE3+Re|6`hVcf92zJz(^>Fk>xyWW zZP2&B$*Lt+qQ~ewZ4BGhG%d6ZDRQ- zCTUYBmqa`D^mljvI_4iDx)oIkPbgj6ynX+5C=ta6(1t?cwKm9b<^`Uut3`%O5*JpR zQ`YuKr|7Ex;-Qa<$jS+i2Oa%Zg5OE(Rl2Jt&p;QTPQq46 z3XmS_vXS+f&ki3@1ZBwlB4N-Bgzb*amt8g~DsbuzHo*6?1Cpv;p)aDI`vx3KYf1iK z^C+s%n%5>DGynDnmHY(h(6gXiZ?sD{W__1*#QhgC&H77B^6By@Hn1`B1QU_NPrpEb zVMx1Zs7t9nw30gWEN9G+LZUHy{z;!@j}yu7M$7a#I*wXa+JmWY%rc+o@NI`>Q+|&P z?cnpzDEzW$ws=q_B}+u_$9#HAc)xtWvnG+l<_)oTgx5i*7Dd#nx;s2euaD1h!J6jm z4hvbFz+&re60LBSCu;v3(`jz$fF1IBuS*7|-fqX&hQG>cm(@J{_a z2W%M1(bZ~QKZN7WB_Hy|xUl|%#40o1Jl7ecH%=Kd>F)dTF23&(n*KA?QcnjH1v>tJ zjbclF#p!cRQlGk6vW=9$^l+96q1zbqDR+Ey;^F)jOo_5vYnr3Y`@;2Y^aB(15RV(D5<{`y~A$HsV; zDm(t17d}qLlA$tVo3G#Y;;OWkq)}#dx5Uy7%eu5D8J=l<8%JL76pB-qyIConNzfm= zcdA

$Blg3!H5XA}5UY1=QGsX_c>%PQ@Ju-+aM1pKrwXmm_oZ*z-cCEYmLe#fM>_ zpYXbGV`_jo(n8=qK%I_Hd#%u2*xb5q(P{geq^bM6Z$Sks#1%rp*NHrtzn-n~g@po7 zk1e7CPT+CS2O>$D6+yQH$_;!RP)6CW&xl$L*!jTbY!bT*oatG5aL6s*M^*l!>}(jT zvocNMwLc=Kk}M-WeCj1z%sFy` zegl7#G>2I7BwKjC!ENdKZs2j&t-A!xfsRLX6TWQT0Ss8jb)RM92r5evA$4ibP2`ovhXtn}a}CL9vTJ=(5-ImM6jC>< zB~X}k2RFS3U@+S(Q%oq~X?lkcx6^~TQ-JC!I!-+5xkU@lpiHuo~sKEL%IYzx*(~Qxx0i|-^S$pQ25;lph33S7=#h3rpiqG1@ z1k*%-B!zx+8nvZo(p$JeJ!TPNOVRk0w-uK{Rk=9YwoHNE#Pd54*QEd-50K{7VScge zAR}caC)s38Z>_9m2#5m+P!Kc38ff}&0F<%GvdCz!8y3G{w&0Pi*^6> zXZ&_25qhwy{tTGlqb(pv`j4f>g2S(FCG|-hx3}gn!J6=s!A}HyhSc`3T+<&;1*bpA zY2jQ44{8`t54tj~le}%PLj<~ANL8*bg$&N?wKg-iu+jpzRRj~d0|8txWU%Gz|G^x_~=oEk!eRYy}9XK^dm98?pS1ojHMg?tJJ`c;aWmJ z4KRr2OGX8XgPklb{&eZ=Qt+B#K(+rs?7|+oPK&tY%@b!W4Cc0}`OE(5^Vxmj7#{4! zf!wZm6&k-TtFz$2kx(LQ_bR`fDVtn@L^44QzI9^B-bM^O-63bNP)M8Uv}N;GH+O*i zX@*uN1?v7=EXTt?rj#k-28F+M7tTI>wrgEj>)3sDOl@9j`LXex^Dp5ZfQz0?(pf@` z$jUf}hXe3G5EBP7s&sj2m=(>Xbo@oi{vP2wJLCd8L)L!15Nmd`}6lgBj#_eThysr zzxbodoMy^(-sb z>Yxn(7DM{*3)5;9i1`AU>0zvj?N!b5iuVjfVT%P@ulL>Ht-_je(Oqo($mAxy#Ra3Uu+kaUxE$$eO*-#zM@F`ta>{Df_5y>heoNJc6} zPb=|zCOuSRI+`%%_5cu)CKMg1?Euhs&Z5avfw2y7o>J#>NHyhgdY_w|yY7n>Ss-Ik zMRN~}!jNZM@RW#WiSGB(s5EE0SP zIb-ENcKu*wCCpDKTuj`gDFxXt$$FGPmhZdZPzpRr&u#Yb(I|r@Tg?ilsO z`gP`hjnGln3t9Bw?o|ibdryx&6jZ*_P{L-ToZ2BJ{;`U8S9)#6IPCMvSX-5hwX=%6 zNFgtv|M`9jowPRcp?!&pdj)v9BbE0wCzPIG=A2YGe#r0)lrz`ZU64D-9?Qtr*N^^N zyHD1?uLExn?o1y(^e22cbiOl6lE&1+l+yHrw+FCF(D4!>5g3~+Db2%nZ~|F)QW6#U_ZB_c z4#^_=zJBM~oI2v*eH4+6UBB|LzKU0|zTtZxtv|ZeH(!lExAu&<@C;4vY<|qRK?xh$ zvN2~l2!St|EG>ov5g#t2k0cGvca&X;;|X8R?IV(Jp9Lp#%l$FQGhRWRbQb}|!9T9e z9=wW^jwF!HyS;U?tzBs#o5_^P5LMs-f^O<5Y(d^ z7i^>poLkXFet)TGM)}JPmET5u5&Jv;Eb!VXd&(Fe1?-(w!144}kxEhD*FSH?g1tCv z6$gf8?x``C#*hpp6Pk5PORaUb6~P2@Nc6{WDsCng%f2r_^=z`WSlo=a$s+l5_YqC> z5we&yRRMIu_94(;gP%2k=QOBy5D+Qe*Bkzy6G9yE(dl}-_|}- zrSnr~CNPVw*ItOvMUq`U>xe$>hB^r2?>T%2j~rM`o|(x$%~{a_`6C|dRuE}k`xBqu zro3}HnGB~l7-(&NAZfpgi&aOFe=qHP z>3qLn!7G*Q<^|KPE9$>2tBAuXl2)2CKuD&|!7+eyOuw|}KBRYflPBfsVH)AoWB-XB zO1Lw+6Hb?NRv+2@Bn?C8y^}rqvdx(X-P#oUnTYw|1)v6=z((H_ggo`^8&yj#&lhbf zd}7IrCSi#$9Z*moV&Qd&xmN@8Y|>!!JEy1t4+Tt-oavgQ92Pr}0`;kY zY4yw?Z<*xf?+sh2US7;Y<^(fxbJ9bk8V{l}or`!bpffi_G0_p4WS%jhK{QDcPb`u^ zzXf`U!57xt1X7UkmS*!rvbm#UGW)DT0)bkRCJLQc=T8 zem-sT!WC3JRNiZ|eoHYwxGdJxqPxKDnxJ`wscqbe(9F@-{kH@0=(ypkFrQV#BTPdIkQ7EedmFOHH%RN@BcMXHT<@^?!O?;U2aOgP#;()@hw`S-%G(OF_ zl$q%m_AT(Y6?r;I)h=w4Q(N!v^-uVg#A;o>C0CXCXMJ3>dzMsgSYja+CF@86k?Q5z z+z`95<4O8j?Zr#Jg6D1b)JlH3kC?n+mANPN6fh+8De9PtKRH*dP59JIi#_@(nqVuyVU~gqRg2<g|K0}X6)j9CfKkCwdd!26J^F04qk>kai@v@ zN)qdgGS^#tdR?ibr{g2~2?_hksPSblz!lm7UGZuzlz~O-+2qGfwUH-&vab@HUum4y zsF(CIjtqHAc_v?GbAD;|z^B1GaDd$D4J3RnDz&Zwpg zc03%53Rb`M3U=0_#(V~Nf9qb8A!7ToNz*)i)9CTMwq&Y7QW$BS37mwj2nJiyZDMq} z5VGJ3L2X%oX^EisrzMUj%KhKV&F6^XcL|VzY>c7v`STOLq@<`077B~~R8b85+C&E|q z!hp1;{{?r1KF|Eyoxbf@v5mIJY77&IW`BC4n6r>9NionIQjps0Hl$=Flw$XP-vlGd zyo%uLwMppot44D$85+O1F5|*Ka1g5Op>znIOZrY(6%!<4sI2y*L%-eP$-nBf(`xA! zz+gYR5}${zpm_Ss-R&*4Is8@if#D=mFLBgQ_juP&4s;)6wFF3AJ`zYFUC_t1VQl(F zh&AeZdH_e9TSjD>XpJHI-W13DJxrDPZsRN~v~ia=a$dDhX)9gKs%#m$!s{-u$LcON zNbiPp9NuT0HQDi~Yg8qHJgHU++gX%x7Yi)YAi9imhTU`=HhrMhUlXL%|AGUWZ`_l& zEd|qh*Q!PW$poLPgHl>F=q&2wqzT$ei%n7^&n4DIzUMVTcaV%cpnLtmyt{}a&FQCP zlFc8F@Ik6}7J3LdBIaKv zXZBQ!IaFGG2_onJenGS$5mctJueqi`4oB@s12{)bXZd*yqJvAlK zAl_{vePoH11nV6__$0h|`4w}eR>L3MG||f44^YKu_f#d+3WNu%6bL zxaC+K{%2ZVv&4kmarwv?5lyqWwl<|P?3Jil6LK|YorTWPJ6uQ(90Bo6;Qgq?sAoaK zUXa81DB*kG3sg@lt6+w(6bPx}GDbdB-po^L1wVzP;r$6gCJS~JNsu(BM50OET}mODd#-4N(y!J0SjA#ZLaf8gai3gn7j zpl2|GiZjI<&xsk2)nVfKXNHB zbIfoZ)(nD3i>OgIk`m*$ zaa#uM-x!lSWyn$~VM&(`f|@HZ zPteBZP~VAaU?I1wv%1vlX7Li<;Nb+63>v=i$ZwO-gDhiHO=B%NRYsFID{Xdon@t`K zJ_m$$#|MudC`*!PCurK@hB7dO882&PoG<+;gwJ(V7cX z+Nt+yGuzr6AZYJ>IvIwVkF+~LX5`-_i?pGqv&OO-$!-TXEcvRU9vDX<)|BE?j)(PX@Vz&g5FJBx1SHUKo6=+_|s-RicJ(- zD*dkafFZOj?^Bbcrj~BtLp2o(u7Wj=q6@@cbHnL~8{KnhlWL>XM1X?r$_OS5A67w?_3vUYqcHN2;NXC5A# z2fPPb!A}7a7!-3Er*Lr(M)&M`j(KN6_$L1qJNV*nBru*+Nk|&Wa4;7({cv9|nVm*2)bFFQXTga`3QSR4K;VDJ7+|3fh zXSpWCFi|u@W$tEV%yn}gX7>9$-`_vL-k;?2~+n-rIn7p+e-q?7ey+MxHai&scOJ(@A z6J4ZtTiKv{m#Hbzkkd`>njZhuI3}TY+XjDUE=J{?icj9Te!-p$_G?`PJ8MqbQT`I1 z|0<2vR)?vThorM-<)baYET^;kb*HNm#f>IY7-6fD{`$wfznMPg%AMaB>U4&ncp~&2 z9}4?bQAA;b6Kz)P!2(07?>%r3vC8>_{d#8GWf#DfGL6TYJO6AyglecfTPVcuD&WKy zGdfQ`_|nxEsMzHb(PSB0k&21WpeXhdG!0A~Sw_X3?^>R(E<93m>%SwE0-~N20Sj>C z#^AU1nV5;I;VJYb=B&a&ohz2DX*zeFV`9oCSF^&ZqcU;{#{E%6-%OV&tDz(JhQqur z9MsM|fA&kkbRHP=5Y*aGA`%R_Q-0=$@ZKR8noWDS> zt&jOB%k}X0shWmhn2{~(Y=+r`$@|+I7aqTu3_3L^cV4F9L>FG3Ib$xCK%B45_3eS& zY<(j0trc2UMDe00Dtr%UjJm`6`tTTX=!P``a(i0`%eo$F(Zzmf7y0h}G?%4*P{FU{ z!4C04J3&*VGS|$6ViB^5tJVxV3%tTA$WN zK$d_Dq51gd_j3w668GP^z_?!^AXEkGu_jKc-?#BDN_nR46X|v zmPqZ3Z5Y0L>QbKa;KSHwt|D1DE9^eQvU5cZa(&Jar7oX-#Qg^jiB77JoK7(&GAQ!*zN@d5A|=0xf3W59R-;xPJxSlj(fCiN*^?%&F%zZ zozdmn{FI-`R*EVw(>xdXM#p^bflJG_^_MR$|DDCQgMH-r$94!0WL2==;QA?vlcqcTo>GZWxyvmACiZ7u$BMPxDK(oo6s4x_Bbn1 zPSxE38qKoa7k~Q$g)d}qp)s$aGf7qPkVFMWIPtwlpcQ6BJ#194(JUg$zdY;+$Rw9< zeRzMp2s+Pm|FF-*O1BHYUpFFrZ&U!+siD;6y?uFDz!|~vtiBE8A5_qW6n`=(`LX|E zA-+1-ch=ZOm#n)EA~CDh8(g#LEbhYvZEI5tc`!k!9IZ=Rr|Z6sA$vo^X2r;=SGDcj zmpZ!W{?49*(IfA3zE+UVT@XMI2=N&mFwLiR~uf*En0c~cQE`xW)!;w!gi>OsXG4tyKn>;ePm zKgRdwbcQT+m0}bQ9l805eB2Tf1i2$%v(G<0l1&uFPifnOOK0Q?nir8(w?CZK|67-; z6ni4JjM|^PFqm90kbxhZMVN01S_l%2)AyykVfWuGAqRigHjr(W55vE?k5^HOwfXjL z_&md7{TTiJF`*z+aj;cjNzzNnG6+%xMx}qYjf@ejI33&Z)8|BN^UnLha~4qljbK5% z2Q-=7xR2gbhRV&u1VwIh`hJ33QH*o3}WlThr4?@n)TAFtCiXNtM0tUVlJ7H zlBe!Tt5lx-rMGtqw(;QRG=BIL?83AU_|}t$#l>~wI6TiiZ5ZomTXVmHKyBK}=kO2d zkKYQTiw_$5<%gu6f%z>Mp7+o|zgrlQUtRhOY(fu7UK};P+x}LEHR^XJzaP8HA13wc zl89Q)RGW*;*k|9)RBH6-S}*-Tg^n~uhT_4ARY5&0SCZ`Kla`w8?FTHSpnr8JLv5LD zT@7IhEly4TELmasjsdFqQ}1U!SsGApmTQ2>1 z4-(J0?~Q!7=7D^)L@V7ziMrO7T3KoCSz*{kAtu%f_-~GFGU+nHTF4B_I1>M7Rw`eJ)lLPRf_Jauj+u);1k%Hgo5h zoHjsIrS8VteFtRVw$jbR^v{E&3ev9*hh{9XF+3FQUHqsu(oWgQ;JXX%1@g8)%erAI zSQ+jDl;8DvInV3AQVW%5d$=U$#h&`OnV7-pRUs$>{tJKqPPeps-dZSitgcAWAf@;i zO6i^D*?_6BJYwf^1pxhlgYP=vZC3lJPrBktcNN&K*N_;_p=dvsY0kDKQe#^!T6R^3 zq?oJ(&f|h{l0r6_-UHo)Ct{J2XTrx8LVS+7JZAIfcsA0-o*=37bNqp)A>&{`Hc^cb`Qos|a@9uSoJm>^2b#(4y8% zFfBSCA(BYGp0BR)vhJC!)*~w2Q0?sAcIr<9$H*V`fJlFDC|?xyYy)^ZF-Y=9cZfC4 zz=89Md6r9GOd@2#*3FDp5{b3`6)Ccf{{EN>f}*2@_w+SFG0Zc9kNNM`ia1+1BX~dS zaIv8H;H5EPfl7>Oq3%dyUUor*nypTtG&gJ%8`bPGb?f=URb^j^@Bem{{iw`z2yn>B z7Hd?~u{VCDTck+WD-MC_M+klz4=L^u;xZK=v$`P;7J4pbX@5j2PhzAqq zZ1#$!>FWiqR&{q7bjM`Ta%pUQfWC45w)ATm^>zxVNwMJtj-P>x?kUCzK;Y*_ z?T_A#V8HqBIuFAX#b-A6c^~##;+pRmeu=EbQ#c!(;J_lSXZ5vQ_ds5@O_2Q1Gra(n z#S~HTmQTKx@eeucpM2NeH1~+pIvnY|c}@df1U!Yay5szT-`mtD-%>q=zB~-_LH=I5 zh4k*L6c7n0^P7)bhA3>`L)KBX)ehv&dQ*~kP8wC;kQ@}cymvhoc^0dDNoo^$i?@N0 z%yx5QKHuBJ2S$Ff*5y=hMDhX`z|zv>T!kexRg@j#$`+7ykhQ>uqhoZ)*Bb)3vV zE9Id8edV}T%TK>BGsW2~)JLT(si8JQdG7g$%aSEwg=G4umW-{&#A9Dp%w8(>wvWHpu^6X= z9q^96u?)r~U@E*wC-$Q%b}Dg(n}?s{{9Uq7AX93M))7_3HE@|<8Tz=nGEhjoy?aJ- zMjyxc`G-ymmGnzgJSn=&Ce5bND2;``6PWeJZ2YyTZsQ40(YW`%ktE(O3d6@{dyrK6 z$T=%b2+st(0w{{|14PB0UVWvuj#nXCCY_LH(f)5-UB)X$Qb$fTT$J=ROkc6}aSI;F zWpqLJ3~YI`<)^~B6S>1X1qvzN(>+I=XT5vMsf=H$@;Afi>D1pl`3nA=##VDWZa|LOBAF(MZ81v&BpXHpk+z1@g&uBv5_LJHILX z0>vM*t83d6LpTk^jYfo~;5G{tf5y&>jAds-!V9t7@&&Lojnl4C>!)UPKO4lJ=OyX$@NtAnJAwtw&Wa^`x92bP{yyE=#rKpI#1y{~7< z25II^7t{8#XTE;Y0ic}8D??hm*wDTe@Bf!aJm^V(s8d5gTwQi7BD zQqNe{Tt(+&gW3z*4#>%H$N5jOptCJt(&WlpX5><$v}*dodO?SF-dHMJTT=RTSM|mQ z_2@~x4gHmS@-}9g2X)aZwpEK?o9_@!TYe&J(?+pZen5(8>6S!))ex7(6-3KFgaZPu zHAXp%eg(8y87*2vhp)X9!trtLRJg_e=h;Ws`KVu4+u~7w$}hyRaans;ufdFzO$MLR zYJg{aEcEcsU;E_U0+FVC5_Iou@b@pqTB{=&u%rgHphSmw9x?wMo5qo^yU;w>UFQVV;! z6bM0Cd+f@!3jTxnsBvb)wdnSnPfls$l_$f`)eME6rPRUlf9RlWW?Wv-(6942@1-n!y5JBH`!x`l;N($F=e*=?&0v#FYMY!bGbCn% zD$29BE+U@eozReC^3YqcSikeu&? z&4xSRM_&6?i&;Lef$TE)^sk8FbXmYTL2u(~fRy6QAVHB?yXkXpG2v%@Zwo;dP*d3E zD)4g|3$%OXxctavF!o!mzNhvSA3D!pLzzAHA^W?0o43)xLzkMl7A}cVDt6!Fsqem0 zVqDT;pT8~DH^k0S*P)Sbo8Gf23C%aX#Z9*V$bq|M$}4PlP^*sj-NQ|WVTwWj7J$4R zxz$;}uWgb6jfM;}5HN4O-R~OY)q$01>>QZQcYg?&r(QxL7LUjRJekKhxtv^3y zU%iI8ynZ#xNAJ(bhWyO5=l|k>_zD%^>vK2&4V|XO`9Yg8qMExF#E*;JS!J}Lo7i1V z3VK~&o2tB}bx1p)31^1uk2;4HekOYqdD0j9p>DLx5BM722DK*XM8z6u9@L7uSY1`U zwXFa#U#+Gdjb+~0VV+h5;Z(9xqgJ)#?6Z^)CXz_~;oeULG_|`25Aj|);~C}O2cCsC zRFI3&<#Qayt?zRJ@+kCv>DWi4*Od0xMzH(@d(ljPOJO^ImdUs&QFG*=y!c&Ox$X~j z?bl3L5|`rz8_={U8Svwt)!GJOnv^7HOfKWZ zsln}W`Ri}v7W_))gG%Z6Ls`$RrFm4e%(f$@D`d0Y#O2wjBs;jeR$jEN<+)&^lqf1$ zEaA1U)OSpO?5-Wrye%^{>$2yuu@S7OvR~4&l$h?O7CUNwtF!KdX4?03SpHNnaFA`( z0MWd(uds$j9~$QEZA9D56qx?G{CV@{+kGd=hj_B|G!GYK96Eg_cYvcGLmj>R-ytK(tQ>gKu|rvx5dzijs+1;ZGoC?*-L#6*t(IIj zS7vNJ#<&zGXNRFAgQbL}Ki#$_NU0w#mQvO$R;0#DcQ(j{jsFs26IhP2&)3R;+6Xk5 zNVPu2FOl`SlZzFz(OHaq)TrIl{9N7)qQosDMXeEn8p;#ZJq=xTfH3d0E<4FeZHC(X zEx%>%2L+Rd1#Un&Jp*n+Y`O5?f$kd9SKRu(V z{6-)}=29?Mu!izsHJ7i7Y6le1@ol`dD2{AxAyMahy)oOawE-CYRYNN_OcSMQk~WKo zn!9j}h?YzeqvFDLxQm*{#{OcpbxyGJ{LpiIF>+g?J-wHQ1(04hKRmv9S!J_E!y_tb~np35qlcpVMx{B@303T}Ky}E?=7=axMdn z*;S|!sLnQZ78D7J0O02}1r52Tccx|>4xZIB;O&PYsfmHe5`;gHXej`%2O3^Z%|71-9iX+} zk0Bbm+`gKHsYMP^GFZhbTSKjuqyJsh#$EGx&%xpueShmR=k9mifC1eZFsOS4Y;)aW zC}YQ7j@5u$VO@4NfRBUC)Z_*otqA|Rjr}c4ythL?j_>c8jhm~~lf1Xpp}@~(L_%3z zi)kze7DD;UGFBmFvn8zN=mS^6<)V-qa`Vlt@hpq6(;YTq1I*vT32sb|MxB?}SUN+7 zx5$g|nkspofxYrZRQpO!Kk3@m;sy7wq>p~f&97+8D|w8o%0rc~B=fbdJxjd}tx!|~ zJp=rmxM<@Zqe0%``~#WJ|GOpCwx2i)z@UhvnUmlDIT>V0Mzw%}fDhb>mVceQuD1O+ zYOXx_kt9N{Zv0etLC3954@(`q^^0lx=JKg#4-Y*dlx97 zu<0MgO^BH+1skR93I&@&^Pd$1k29}5@F^#^fmsySAVQEBJ&MWpHAy9oe1y?C`5zef z(RS<}-`+W2^Y~LJYhf$BjcV_5?ine*>*iw0RiVnAT=VX%F{=BVY!)qiQ3u!_cZA0! zfOp2vPYFHyeqqZa^VFc>kJoa$d2?~&&NTJ!AL?VSF0vB8;s9E_1t5FUFsU-a(1@eB z9YQ?UMlO6J#_`q-`8Ou_JTwN+=zz*m=4l!#KUz-a&a$aLV_Z+1Ho}~JIV@xCNK>Ke5*`=caUr7+TlS9kqh~$yr zheRDo5FNboL;rKAoyBjA%wo2eZu0$bJ&HRtCY=Ewems=EyjcUTc&zK*(m$F$O6}$L z(a=VjX$IwwOJY7Yb7doUvNzcC>4^Rpq@5Vw`N)s8cxckm(r5OS5JB;ldD$eDjo!(U zbrr1`n}I@8@leiIP^9vDRXI1*rvY6zJ0*099kE~fm&7WwRbX9Wxwu9h?4 zvp5e_&hE$sp@Mx>=k3Iw?@TtI?(JMePVa0-5e{u_Ex&mNSm+y(qgQ&mPT$maO)mx9i5Q4Ts$;M;j#ElOtiC(RRwSkL(m>PMv7*Z)WIz?rgXhm*6JQ_?lt>)O|e#Jnc4~ zZ7ODWZ=z1?Z5lh|m`5MfYY|5s=W@f~$j=NPXmiHM(VZp*mzOkXhG9BmMS-suO#L!x zy9a)vlR5F!!`*FwxpfXVu-@Kry}1mK<&wC~--}J(t=;A!YaIJ}8EmC(j)F_iI{OR= z@RmRy$v0muzPNiDzf|=*An1E#->H&qtef5tg=*SoF8eS*(^dl+h_>@jKFI#O0}4y7 zN%mMUgJ#~{7qTqi9ep5hhr@{}DQ_<87}fi_`^(i)`G-2fcW8u1+Mw0R3@m-u`7HV= z4_rfQyk$K2>UTHoOljb#n)H4)Yay8`I8WmZ`t0m=ldJ-+l|l(>kKx4rYA$ct^$no4wzG&R$qDVS#>=XK9oM=2vWwX+^6<16)lO zBKza*>EC-D>cxSML=2rqD=)L@W|l|`_j&$@82gt@6>SM2>vt{t8k!ZdBKA01GCTsYtD&? zq38n3Nf*aHj;Fug%ewWeTg?bjUmHG~$&C@T8$4To-Zp%40ot5nn8EeOUdd!s1C)(? z#9wIRS>xA?I^gk;O|Vj!^dH*lAxb-j+1W?vBY1f9d(F$riZ^az4yZo&^;E0r_C zMj27~SVQD}j@T6}-NN?DPOkzQe9ZGWHha3<@`;&a)cPckIb0MofVZ^uw+F&w#{1x?6QvISo!Bxl|JdM>q9y~ZfFjmpyYk}W zq0(p{;{CSbh6=rB(Y@`B$DQo-?%$-xD^vuzhj}CO_mVVL_HMIgx$CaTmANzpwIJr| zwt^a=r_W>**Bcm(&loe@y5!SPCZn9UxR~5g4EHRB4B}oJX z`d>#uJ?a8*lS`1Zn$XUUl>b zJOGBzJ~3m*6ou{Rl;d@(3rYKQ9`3wiMS?~Ya0eC2{~43avJy@SDI}g-`Men-&j_UT zG-YM?g_pCZE&&DqBq+m}JH-aF0uwhP3@E+eOC6J6`z`O~j1*dx?b?~G2%@uw<$B5E z(VKx?JE6)6tvb8M#{alhGHGXAGCC$?WHNLsIUpK&pIwC5ZslSc`=3tMr8~1jgd)s@ z4xSiJ&$etZz^>YZ-?{;{KxZ%Vohh4Lfr^wQK)nrgQ{pYJYW@Q?{X&IP08!j!J|y`= z4I8Ry9~Q1@Tl3|~=TA#EtGGOcPbz)#UY{x#hj$P}SX*h-jow1R(NXyEYg~BJr>j7zqa8UCArd|xCc=tA!Nb|QWAq>lx1^^R>?N?ksCxD2SAjzY3#(x_2AE||vj z?EPpxojGGXC8}rj(1Zi$tCaiG)89W#0k_)J;DPgwu)z7K#wFuq8b13xBwO?>`Db)v z2HYo11ok-rF8_;sJS4U&pa6U4CJbxac6hGht95HvjV@O9h|x|y$X9l>j~bthsbH^6 z?uCCu=PfP->1BI=cuY{9bQl`Kz3&EOKaIi;ogrm7x7FXd=9w_MV^mFB;(j??7?QH5 zZF|EabKjluENUuZ&U^PcqGWR1jH-tAifRyfo&(FT?SLg|Dvjmc9v(TqPogM9fqn%n zS%o3bF3cf-&Ni*BX0;-z2l&~l?s973ky|KmZlc^Md0>j4mc4#ul$VS%J}{b=Jvup6 zHfKUklu%!E*W9BmHi!15H`PFE!_D zLh7`1(5)RZ#K#2o=#p`HQw4X)Ka|d*vHE0PHUmFd7Y?vyXx3Y^YNM|Cox1Hk^ zzk{_s=4@6^6|o?GW@*bNa|171N2p&YdT^4Re@+~8(-axX@`oRKCgQ!t0}C7$dyU*j zBrZub!`-Tg^m`;7@r`*4!gjG(T6VbTUrel7GFSQL|LVtZduBH*)gbq9lQysNTAY6zi&xrKO8?42_NPA?3KI&={{hr1#y^Pu@NVq3JF+S^t;Qhu%NGtds+^907^+#LzkLgh_KwzTj|9vmBT4K~i)SCU z0 zRMur_fhiOR109+$o7Z1`THkQ1%@o7L?%HsS^@?>9mMP-}7K2MD=gk<|W`?w`66n?v zUpTFG?Syr4!;{~;-r2cm0n{`fg3j0>E76yOH+NVp{ceJy>V@WV+!F9?sVwW6WP;Dh zF;$PpVqb?n#TmDj+|FVvpH@rP=ZW_nxqq_tkW4zS`JzsJbq(4jBk7t%8{dD6Dc)FK zwyi+6Sd|ByvHlGg)Ez7U=N#{dGeMUrkYaO=e^BIjot`9eC=GfYpIH5Y zk70^k>CM12W)qz_VaT}01J1MD@~p8BkJ!;r6TI>$dhO3T`AE2}?_qD) z_TvjpnUrVX&JPzIDN>Pck+~GRJF$08%+@eNUd_-lLM^I=-}_9j?}4h0e2_^^{sI9Z zS?hlE!Ir*H#Fh1$n7q7BkG7-gtPp=y9f=r43cdjnprZR$)>78E$^`4KgbM7c0BE$C z@jU3Q$zR>=%$+9Vn$i@#Qo0KJ(Ba7gnKyj2fUALjQGTXnpK+K^p03Wid>3VdQ*r+_ zKhiu2g0)Yasl^MgnA;Z8)a%&ePKhC|v$16qMk8=GSADlxqt*J-bXe#MbgIK*yD-vrJW zmir`!C%c`|$(Vx(h1T4)#Ch`QK&M!%SY<1j~9Od&3eP!YFc4}+a0JW!( z293#9t}1CFJqiK;1H{bMcl5t7V5WR^?LGCdw_8GzxY4bFx#O!x6Ex-X>~<@A=v1BJkrwWE-pHQU+&Z7)4^j0uAsRD^680-R&0bfo&X*N5h;0McwKtK_5m7 z^xz%8OL~@95`Ivd5nD7b-Mhw1<4#Dwr7-1h!IuYhzir&W;5X16ygrDsa-y z^y>e9W{lGBw%XrqFD&7nn z@@*<~988c-FPf*pc5l!BC6J%6V046@!AJrt1jO_zzfPC6cm#2GnA*DFa-Va?=@L7b z9E?U{zc4kMI_yyvtAv;$kn^lLdZl9A$~Hkd`NkF(Q6m;BGx>^|#ZD=HQqU^a^3f<) zbloH`d(9vmw`ZhAm`Tit5aXA9zhQgbbsA?aTeIas#B9Y?i7hipkD?SLAKb-`JgV%7 zJP^>9yYxKvW<&K((4Cl$69F4N>jI(8{2kNzt>>hv+=c1QAbwyp=XzbC6psG<{9omX zVCmdU7%KN|omJEvq`v8dp(})+Z50bpQ7JU7CtKT|8^O<&|EjzsIkM%Te0syFoc_<| z^j-6%4Gh7wG5%YEpchL)Q}$is!$MX0a6eQIeD82L;G2iem2}KLFkc( zq&ja8!^kkMjp82I<;=iI1%sh3ffs8|eQ`P#(3HyxVNOyF`>PaA47^&F083RKtLfC9 zrxjm@uLum1+;_Z?9kVHL?+CJNQmDG0YN6t8&pL-|isrL>eHW9-P9Q#X%Yl*1^#~!k z&3S1wo}tPN?C(@J?-ik}y#hrk_}O>Nh%=i}DUq>03%*E=g)9ZU4UQAJ@F#iv6;F(h zQZ`dh0HL}kY{gGiXQkz0LqjNI8uu0)t~Pj2(;+8Ivoj z(3!oViOGpStCHCBV;hdE24MXIY-nts(v*61ea+pQq*%Hyr$z+AkZmJrz|3-_Mw~{ z*PMugwByF*`!c<5!gJyhU+=y`ajXfge=anjIlTbVEvHeZMQ1&NsM%JKg%GgR9DlZ} zez3~RUTAw7F-NZ%w~6)n?F;!c2FJJw#HZ_>`z}yDfkS-YN4cy)n@cLvEVvXd{Lr!t zyuWRLv%mGI-?UOlAgCXZszc?Z4(_5L?(z$4xqxWdS@!52wWrFcXluB(dGwbE{Opq{ zK=aEbKNHF9JjcyOC#<2OdqK)y0clb&TSdJ2YS?KBk?#q5a2b_6>&Fk`_r#Q7H+P+8 zW5!3QH{x;Qaud?}SW#c&+-!8yU!{;444Mf`la`9O6=RsT)zB9y8qhBVCs5>|t5|9w zJ4bP!>x|)ZG8=!BMBdm?2qo#97zT-mNMs$`3V7ZpgzA$Px!zDcd=W0G} zg`w%m+b3IsLmSAUy&;a(29iTLIll%;#uPia8>tT7KhPdf+FcLk8&Sx6Oaz8aP;A;~ z0uWFOd1k`W_m)BqxMs`Rl%??+xSuZBZ?OLXQ^5O3_f@{RpTp3!pI~`wlyc#Yud;sd z#4nTape2riH3^cX0AgACd#PhDa^&^KAae|U8LX``F3xC z`VVnlSKi-+GfAfNw(OTfh{t}l0m8-;?FM*oA(^FW z-ju9X3=(CSidk;~e9LD<|9iT}u}r~CuZs1|$0g-PQip(F%ND@IJVkDeKBFR3{-d6n z@C;w9OPAYzi+(^;j?^fQI1*JZ@|E*-J4qm80THT=&Ss!tqz_9{!WigpK0?Bj2?us; zE)4(PZ1jhNA_irhMTY^2=!;W-v5jwlHiyJRS8-Iq0Z=_eJ7gTQ9ZdW^_DEj%)8x3t z(tU0aMlEzyt2<3jPbvJ2s98pHtjU#6qhQTh3HX}!6xHQ2`~$~QTd#>uBj;%WQ~&J!8a(T-k)d%{ zZpYyeu)M(f}#_HG8C>{M(rFMsb+ zmv2EfmI6`7DhQn#d++4M&^2{bItB%XgT|!g{Dh30|M!(1N!&1dB~8gB zExXbjIk>T+AW_u%L?9#C>M#MEv{F2y?fXNZh?a%o#AJ==Ke{iun{@&nw|BDv9jZ;C z7ZJ5loOD6?3D>$uDMbTSJ<(K1BTAC|!wvR3NN?5~8+G1x$Bv@rI-s(CZ9)&aM>4|7 zb8iXUoe2w7w)syr25J^0&p1zkRuYJud|*Q?{oPJgeWBN&l4lzTWi3Xo^@E~Y+8go= z0Rc36!_rdk^=yUyY`J_gIc__8{v|y+YcGC{gpJbE0d~#FdxWFSYUHlMbJThT7dEFo z_prKt&d3Hghq}FTlXlFtQ>923dL@f!xfXH9uAi)@Y0$autDL*CO+EVO3?}w-KH?j1 z4&+>OR#NY*75;{iTfE^$A~uQ!xg)$_@;-I-wsC0M{I(x5arU@<{TjFhcF7WXf*Mb4 zT?D9ERh(1*-t)MIiR7C2nG5^MTUj;B;eSRx{x86ps&hPd+Qgv3<@iNrg}Ttot|&;a z+}!3vM`CBs$B{SLC&JZrpg|3zB~?}lYU`go%ekjT;4-$X1tq07=(_8PU32)o#UkdDLYs)D`#K!0c zr~jymnZ%o0sS166@f9V4H&0XGUPu1keC8MAZa)?Ch$)>E4Ns=1H84%__tUXTwZ${d>$W+{2 zY*>5=L}nhGp9*vfS&0wEk|6?KeYbFv6vXum&KP(FIJ5XqFg*J8lU(9G(9RNJ zNtyWMV57`ncHt98@_h5Sr|t3FbZu%BlCv_5XyyNdD6FC?+KRKr6Gb7GPK5te=}j97yskwZo>Md zP4I>v%wmsu_105QcNEZ2WbDdmoYo1qOA{lY9xb0vAnr9~t;n7VAy{A7hW|%7DN~or z5CI#y{s!N32`G^~3*kF_>ePDIht0&kU@hy7tGuP=gEBCtw13ivZ=g~?&78fbKtU7C z=bA@w*UP^rAday9r?IbKS|X2b{HL*(3KSp7se>O959G-XAD!E=@Pn$nSz4m^7Kh~a zm=Y2k!7s9BBDwhK;emT=`7ww2S9Io3oHH*6hY=gO&e2PYLXrv%~vBpv5+GE%2T&p`mkODyHQEf12^-Wssp&Ao8LIZ8ogPudt{WC%`n7f_Zj4h zcGB>S5P7%EgT)QKyJ5&=&bM#v*O*)fc9~##YBk{g6b(|d#wMN>Y}2~w4)~#L@AQq8 z&0@h%E$c?<3=R-nYS-ZR$+z!LzFRnRH4G`zI!ZfwZ&17dyd`b@4D(9fISN0A;SJ48 z(IQo(i;4$?&qOY7qmY{ZaHPnzZr#l9<`53V-&*CbvhKp~zkmPPJRS|*Q>BoLrFv_> zw?sxM1UJv|tyU4`ZxM2p?|LhzXg6qBMvo<*#qS2<>)-(HQOAuvrn9-QBHg-s;q-#{ z>;Mb@en6m)c7yyzG>>;qGQbe>4noI4o3lss>xM^#oz7P%Z9l^BEoD4J5UNd<9IT;8XX;XuN^Mu1sh+DoVu(*Cpo8cXQk_YNzHgj!kgN(984_+?CaOT2N!pCPJ zTo~D(6#dd|eqa4C;aOl>xhjqp)>*4_1xtqkhx~7B-9$1XN-t7ZN`H> zqT7;K>Tl+kKEx>42cO0%Ky1n$@>KDa4RZ~r>g|hnBGhyqU9oILo7k33O3B`G{gQAH ztd-cFlCxPl5N*(B|KapqXY1nDJIu(dhECk`S0aEMnC)fVqL4JyV)CxhDZ0nfv~-U* z-*i4|ldCDiJctLgjToGHmfBWW8!_o4A3fPdU`}X3ITDl#5OJz+dg%7-3b*@I zjTV8j{XG0^98b&mo5;xmP_K|{qq3E^K;~ze^}8S~Fug^JR|gAQ5h=wX?{H4nE8MM+ zN0&!I;wqbpi(mUrU-Vw<1KzG1$UnTBmfp}EeX&N1#iBl&)3(VjXNPdX4ul^|!EKY#G@7=h5{p2uX9rlU`x}swqQKxq;Jm@A}0RP1lIrS4P(M0K< zu_6Y@nsq;yp9ALvygDBF?%at|-43{qLyAJUj-7q9&w#SF(}=xEw!`VD8kx@Hz(0KJ zSLZ9AjL#lk;wx<5*4ye`7#lyLtliRYgfs7xhgz+cvEzzq7HGel^Cw?40dH4^S&J3v zQ-?wnw?`HDd5nduSHgwIc}{y|s9cxrn@*t{Q@+Z#8VzbFZuFPy;cDwzTvtfsog9KE z@6{kIDgP$ya|3Qiwh{>%TT-|-B?XQhFTT0U#B~)Oqc!o4Pnb7lQ5xB7xXiV`uBB~+ zf*gf4XHbtYa|^+E((k4bj95Suh$-Z>_hQ=LBMwef1Jy?NtW?$;QyEQ&W1yU%^UkMz zpN=L7w}1sKf*dqn8kE!K36v@(!byWR8!b^*Ai91cegJ>m2gaY|>xA!mg1Y=lplWO$&7m>z9;e6^OXJ@XdPw9UvK z*Y70-U(>%9%c+U6x~T~qsj0?SwCKy)sLb$mZ8ezGZ~Vr#qBuKvpuT|J{fjyxyHRzK zYyZF{)$H&jiZBXWJQDFHO)~;Y1Qc0r`gG~ zjZF-L3 zj_+SjO$MI73Wl<5Y`wP<74W_5B7{WPw`;`G)UfCKXRK!&F#s_LQIaO5>E=h>|FzJkq|54(w>yvUeX)Ude*$ja+8L)m{T(x z3bxYSn!mDrg5*5e)-ib#zGe=V5!g+r#KafkfvDpzdm;gG5(L^^;EX*oYslF+$6nuH zD)bV5x%}4~SyNe~q6`8*wk5J^{#Koi4Z+-wubOtR+Dy>W!jV%f_YprAw-bsP%bUCR z*N(!b>VgkyX>TUmvhz|hC0W76a+QZjOR%4n!LwFAw*k=NYLgG@w&@XLd<3MR)_X(5 z5z;e*NP7!ncJX3vR&}=Q(!w^vb$2?(ioM}OqxIgElyRMQo@FmoXCaEORGa6WD2B=W zzQ@9cemQLv5PtYV_!WvjY>k|RqI4MIMK!^4xJ!hFBuXEYsC4bH9M8KRaNq7}#*8#_ z!^$TQSV&5n44Eo#1b>vjTru-Ih#w+rJE45qLgmG-Va=gQZ;)V@Z@5;ZMS2WIFdu*Y zsfdyUkX3zv#(ti0vCkkP9^Oi=Z@X8<-iC>B266seM3g1y!1987VAF}%FJT#JkotFO`f+-u2UnJ8FKFmS zz1=I!aZW)P3qBJB8o&G$`QR35Turf@aJFFLJH+u1Hqcd;lXRM2-&*B+rDN6=Nyi4C z0?u>Pd9AIUTeNH#4|gSXZtD(T3;61%_mP@<4^^&`oYDARr%nTKdJz)evter;OZW#G zsL!a{t^Y=8lG;Es97N=2w|j1ul4>uw{>2B=Kzn4xMI%FAg8U1|SMd6S;Ic-Rr1;m} zm0kk%9GyG*c$Yx5jMw|SZ3{M`<@lHm+IyN>P@eSL!Sk*^x;cE}%wBtIPC01xgVsD^ z)%yPMMqA7YiK@9&Cb6&D@x=j%o0NEb)yjpdTx$_;`5b6iR@H7r3u8z99Q?Ix4?H>5 zOB!!(8WLHjX!$$svPR*xnctw91-7ztRhGS!$>`5g2lKCymX#rJjeJK$xhC?{^UqM` zMa+5EA?3u2+L4C_1qf6Xfu$-9M{Flg!Vep8%hPV#Df=m?a}9jNYvPc<;Lmr|JS}Vn z-(^`kl{rX%bS#ecy!i+lwgMWmT{A&-?(!4ZN;Krs#zn|=HJ6sCeE0uM(W$`oX0zRf zR&;7U2XLCbu9a~-+V-nA8or$4qSr%R(+r?w*f5M85grhQE_s&Y?a6-fD&@d*jgyD4 z4Vq3rs;g2h3467=*i~@rzCpO1TuO+B*Gvx_a<*` z-GC7{|Kp(DdYT;Z%mC|n8U075Zzki(ly!WSU^)@AUM842A})WiLvd`d)8uo~anY)D z01v9M>FNRPven)?c_D&=A>tFe%}j|m4wGLgJS$8htldLn|CaSTe5_o>zeY7K#n&cn z_uC7Sdnd?rP9Bg#9DmRH6$O7gU*Y}+hua^byiQgD9}pKE9+(`j9k|I_Pqz-fzT$%v^H`bzyMzU#mDnRcTgnd@NN;08D`q0)A! zM{y*{cdH4?LU$nzH3^bg5A(7*b{*b&Gn%+Y-;ke0C(l0T+umrXbplgi;V{=+n_Op0 z_Ag8A8L|K{K5)sxD@pT#bxA>@6tUlQQ`42dr{51`GD_x>-DhG7!eA?(lJvSC`|xZn zQbw2S*tcPA^M=A0GgEO=nLuRXv__mSz_`9fF>*eUdbXNR&C(e3r$F4Z zCAhz5>Fi=h;Z(9bv}*t7Fkmp?N`#**K@Dd=>ED3LZJ4&@IoS0QUu7 zAcZ2SS*LTAf+E|u2?yGX{1(hab(PUEK$=t6<0(1$n1@!Pzby`Pw(q8noUOQwe*VYm zgG8GWH=UnFiDF4Iy`ILF>_rUp;|*hk)KhMWV7PP-K@TL(&+v#Q@<5&#ltpaC35kxj zT$?=5ZgvP%{HO3)Wa%#v9xyCLT787@D&~D#%VwD9aWGyyhAW%D{aUfv$wMvnzcIP% zOMoP>juZt%tV{z{gXZP-)na`K9F5_yXu*#_Q>ia_IqwX*19X@UMClwmt8&V(sN4l& z_GIC=l>mrbbk`+QE|az&-5n8Ordxx#576jPc_%@CcSL+A$xB9zYTjfsl?YiUo8_>q zi|4}Oj@qHv1j9xfa$$f$*7h++xC%zUZk3RL1hE1-8ibi|UZox)IHi zJIv3K!hS^a7Eg?@%U}H76Y9%rnCk^D-VO=~=XKg<4L*7!D1)Fna;KhHxreqs%LqB} zQyt^c0jPCu0jCp_?2(-M$C97J(aWssl0{E8>AfOzoz9h8j&K zUS|Tr(Zt2uKoP|^Waa>sI8>`J0~v`A+kOoT`;OqfgG|yT1xVqHo1|q3z>wNMEMCX4>pXt*#tzlR0%R zq7+(AGNQm*{gq1Iw_$t_URchw8p8urtnIyfWRN;1iD%*y#QG)6+_&UsM?E5C6nWJ2 z4hGu3q(z>?UY1wpLRz#2y+XQEC&QlP5+V{&pMCRlo4gk(OWBloAHoyAj55f&aPftCIB zGtHa)G{RAl!k2Fk2no9BOVUFi4QrCsmwh-i;<$q)phmqbiU8R zrujs)7q19IMbe9>&QT1>ubPj>xV$(fe;_NH5ZcL;k06&ynj&)N=(H>2LGpc8i@ICO z>_-T&B0}N?+l+6uKvW6&;`seSbjG7#dLnW_N<#9vpD*N(a2dG;Jk}WXZ6GY9EE*yeoIU7;u=5o!EXF>&xya2IO=73_sm704{?m2 zdte83G(1;l8m*HGafI;dTwr zLJp8E_{87!&6&YhxzQj3w!Z^?zxQn2avT+9yYFBtu$gjK$cV8DbZC?aIcb$O_(ca| zyvgbK`Oe~k>@K6hZ`4c$y@1w#pHyxZ)bS9MRhBprk2JuTV#~>V>ZLA9IMT3qlAbqs z_3O^qH*O&Xpl#$VVFEvPY3fj9J5uJ$>`pZH@L#S5{JYJnpGRB1TV{R}YSSr4t4HDJ zq8V>=)2j-X2|m_niNh>#dK`mP$gKfMb{a+(VPlhI3WguD+L9f~Kb@-SNa;%VUlD`h zTk$+*r+7`^@Q&aJk(1*t-EMDyzRbJ4BYdU!P2 zam5>FtX^)fDp;f521;+w@puKpSBa~m2C>$l`LbM_tf;Xk!nvBGIA6kH)9tNnu7nhN z-t~c+@*-ZoN(E+kIqrXeEj{aqB706zc1yKs<|_J~uXXqXJd#Ou1G??ZhZipk=oV{ZFawYCbnmnpC^|a36 zA3g6YgLNr(InJXN%+{>oPSV|1eZ=IuiycrC@HOJ%0~Jr1380t7BHL$wNQ~v`VL5Br zdXFZg)=0gYKYG;=yShy%unA>i!bYMR;zx*^ebx2jHhxQ2kIC*|3a#2TodDd+O3OQS zQyZ~c3#&&b*EIND9*y{lzhGY4+a2_^E%9Qg-3Yq=4LePOnp}CR3p1poK0T6Np*N!@ zMwSfq1>SAS^BZX{r(IpPC)9Z++!Kw-+iWIDDxQU_z<<&l?s0>FlpGneK>e9b%nyB2 zAcZQjrexanR=A&L7zy#kIjh~EYeOc!hHl(91J_5WNYzE}W#K2a9k($G=X?Qw3(~pL zS?B(`aFMr=>}R#tE6nja2Z8)>ksP4#i{5H2k536Lq||zMIMzrwHc#XJ}L-`Gv6D2>VTQH`gl7Q z)re`qU()VgfA!b#JmHd=|2r=~4%X!4ec-1UH*w4%^ZKebyWZC0sK%XSy{xi{&$3*X zbfV@Eo##Dar#6|}WoD?Y6h7K#P_O!Eb5IB9q)eCQ`|Uq#F;?^^C;yHnOo%*41#f|? zR7gV=vOTi)dLAjz!1Qfo2ehKPlM~z8txV*++T{s0LN~e9Kt!)Lv-?CGaz5AJLAx1y z2^r4USeH#)jm({spcMS;{E+?Ui!=yl6SgPb(O`OZ6#M)+W!guIS=d&>D_IKCeW`x} zl;6fch}tn3F}HA$92jRh`f;*;I6Thu?ne!7FJn|o@Uw2i8~mDiyi3)J$Ln)CybaNy z3*>Lk~cx5&))5&8(4pI5DTiZ$5&6ND@A+?}J*zDXZ4ZCLG?UK~!ruW*5^gbw#D z;f5VThclYr$2uuS+jW9&Seg>nU})uW)!JyAmS<&)s!IPG#)i&dw*G(PDHy@{cRWb9 zQ~q~q48DN;@3d#($5a3R#rKcDS3~Lh+EDubrzm}gg6~l99SW4bLxIwFC{XHISXU@3 ZS-D)_pS-5-_pMuUItM#jXCH9u{{RsU)fNB% literal 0 HcmV?d00001 diff --git a/public/img/plugins/servicenow.svg b/public/img/plugins/servicenow.svg new file mode 100644 index 00000000000..555b6edbc9d --- /dev/null +++ b/public/img/plugins/servicenow.svg @@ -0,0 +1,22 @@ + + + + + + + + + + diff --git a/public/img/plugins/splunk_logo_128.png b/public/img/plugins/splunk_logo_128.png new file mode 100644 index 0000000000000000000000000000000000000000..069fc38014fc8618b7376aed8c1b5ed6b06b6751 GIT binary patch literal 4019 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